f_000009 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. import { decodeNormMsg, encodeNormMsg } from "/src/comm/controllers/entity/message.ts";
  2. import { Controller } from "/src/comm/core/controller.ts";
  3. import __vite__cjsImport2_fileSaver from "/node_modules/.vite/deps/file-saver.js?v=fe35e769"; const saveAs = __vite__cjsImport2_fileSaver["saveAs"];
  4. import { Base64 } from "/node_modules/.vite/deps/js-base64.js?v=f0a3e95a";
  5. export class DeviceController extends Controller {
  6. ipc;
  7. constructor() {
  8. super();
  9. if (window.ipc) {
  10. this.ipc = window.ipc;
  11. } else {
  12. this.ipc = {
  13. emit(name, ...args) {
  14. console.error("emit msg=>", name, args);
  15. },
  16. on(name) {
  17. console.error("on message", name);
  18. }
  19. };
  20. }
  21. this.initEvent();
  22. }
  23. _conn;
  24. initEvent() {
  25. const scope = this;
  26. this.ipc.on("OnDragEnter", function(files) {
  27. scope.emit("onDragEnter", files);
  28. });
  29. this.ipc.on("downloadsucc", (fpath, size) => {
  30. scope.emit("downloadsucc", fpath, size);
  31. });
  32. this.ipc.emit("GetSocketUri", [], (uri) => {
  33. let conn = new WebSocket(uri);
  34. conn.onopen = (e) => {
  35. console.log("bus socket connected!!!");
  36. };
  37. conn.onclose = (evt) => {
  38. console.log("app bus socket conn closed", evt);
  39. setTimeout(() => {
  40. this._conn = new WebSocket(uri);
  41. }, 1e3);
  42. };
  43. conn.onmessage = function(evt) {
  44. if (!evt.data || evt.data == "")
  45. return;
  46. try {
  47. const blob = evt.data;
  48. blob.arrayBuffer().then((buff) => {
  49. const msg = decodeNormMsg(new Uint8Array(buff));
  50. scope.emit("on" + msg.sub, msg);
  51. });
  52. } catch (error) {
  53. console.error(evt.data, typeof evt.data, error);
  54. }
  55. };
  56. this._conn = conn;
  57. });
  58. }
  59. async onReady() {
  60. this.profile = await this.getLocalAppProfile();
  61. }
  62. profile = {
  63. wsPort: "",
  64. version: "",
  65. dataDir: "",
  66. exeDir: "",
  67. exeName: "",
  68. exePath: ""
  69. };
  70. getLocalAppProfile() {
  71. return new Promise((r) => {
  72. const ipc = this.ipc;
  73. ipc.emit("LocalAppProfile", [], function(config) {
  74. r(config);
  75. });
  76. });
  77. }
  78. //选择磁盘文件夹
  79. SelectDir() {
  80. const sid = Date.now();
  81. const cbname = "c" + sid;
  82. return new Promise((r) => {
  83. const ipc = this.ipc;
  84. ipc.emit("SelectDir", [sid], function(ok) {
  85. console.log("call=>", ok);
  86. if (!ok) {
  87. r("");
  88. }
  89. ipc.on(cbname, function(dir) {
  90. r(dir);
  91. });
  92. });
  93. });
  94. }
  95. IsDirEmpty(dir) {
  96. return new Promise((r) => {
  97. const ipc = this.ipc;
  98. ipc.emit("IsDirEmpty", [dir], function(ok) {
  99. r(ok);
  100. });
  101. });
  102. }
  103. IsFileExit(fpath) {
  104. return new Promise((r) => {
  105. const ipc = this.ipc;
  106. ipc.emit("IsFileExit", [fpath], function(ok) {
  107. r(ok);
  108. });
  109. });
  110. }
  111. WriteFileText(dir, content) {
  112. return new Promise((r) => {
  113. const ipc = this.ipc;
  114. ipc.emit("WriteFileText", [dir, content], function(ok) {
  115. r(ok);
  116. });
  117. });
  118. }
  119. ReadFileText(dir) {
  120. return new Promise((r) => {
  121. const ipc = this.ipc;
  122. ipc.emit("ReadFileText", [dir], function(data) {
  123. r(data);
  124. });
  125. });
  126. }
  127. //拷贝文件
  128. CopyFile(srcFile, targetFile) {
  129. const sid = Date.now();
  130. const cbname = "copy" + sid;
  131. return new Promise((r) => {
  132. const ipc = this.ipc;
  133. ipc.on(cbname, function(ok) {
  134. r(ok);
  135. });
  136. ipc.emit("CopyFile", [cbname, srcFile, targetFile]);
  137. });
  138. }
  139. //保存应用级的配置
  140. SaveSysConfigItem(key, value) {
  141. return new Promise((r) => {
  142. const ipc = this.ipc;
  143. ipc.emit("SaveAppConfigItem", [key, value], function(data) {
  144. r(data);
  145. });
  146. });
  147. }
  148. GetSysConfigItem(key) {
  149. return new Promise((r) => {
  150. const ipc = this.ipc;
  151. ipc.emit("GetAppConfigItem", [key], function(data) {
  152. r(data);
  153. });
  154. });
  155. }
  156. RemoveSysConfigItem(key) {
  157. return new Promise((r) => {
  158. const ipc = this.ipc;
  159. ipc.emit("RemoveSysConfigItem", [key], function(data) {
  160. r(data);
  161. });
  162. });
  163. }
  164. //获取应用的baseUrl
  165. GetSysDataBaseUrl() {
  166. return new Promise((r) => {
  167. const ipc = this.ipc;
  168. ipc.emit("GetAppDataBaseUrl", [], function(data) {
  169. r(data);
  170. });
  171. });
  172. }
  173. //获取应用的baseUrl
  174. CopyFileToAppData(src, targetRelativePath) {
  175. return new Promise((r) => {
  176. const ipc = this.ipc;
  177. ipc.emit(
  178. "CopyFileToAppData",
  179. [src, targetRelativePath],
  180. function(data) {
  181. r(data);
  182. }
  183. );
  184. });
  185. }
  186. RemoveAppData(targetRelativePath) {
  187. return new Promise((r) => {
  188. const ipc = this.ipc;
  189. ipc.emit("RemoveAppData", [targetRelativePath], function(data) {
  190. r(data);
  191. });
  192. });
  193. }
  194. //打开文件所在的目录
  195. OpenDir(dir) {
  196. return new Promise((r) => {
  197. const ipc = this.ipc;
  198. ipc.emit("OpenDir", [dir], function(data) {
  199. r(data);
  200. });
  201. });
  202. }
  203. SelectOneFilePath(title, filters) {
  204. const sid = Date.now();
  205. return new Promise((r) => {
  206. const ipc = this.ipc;
  207. const cbname = "c" + sid;
  208. ipc.emit(
  209. "SelectOneFilePath",
  210. [sid, title, filters],
  211. function(ok) {
  212. if (!ok) {
  213. r("");
  214. }
  215. ipc.on(cbname, function(dir) {
  216. r(dir);
  217. });
  218. }
  219. );
  220. });
  221. }
  222. //开启projects 的httpserver
  223. StartHttpServer(prjFile) {
  224. const sid = Date.now();
  225. return new Promise((r) => {
  226. const ipc = this.ipc;
  227. ipc.emit("StartProjectHttpServer", [prjFile], function(data) {
  228. r(data);
  229. });
  230. });
  231. }
  232. //下在线文件 默认超时时间20分钟
  233. DownloadFile(url, fpath, timeoutSecend = 60 * 20, cb) {
  234. const sid = "d" + Date.now();
  235. return new Promise((r) => {
  236. console.log(url, "==>", fpath);
  237. const cancel = this.OnMsg(sid, (data) => {
  238. cb && cb(data.type, data);
  239. if (data.type == "succ") {
  240. r(true);
  241. cancel.unbind();
  242. return;
  243. }
  244. if (data.type == "error") {
  245. r(false);
  246. cancel.unbind();
  247. }
  248. });
  249. const ipc = this.ipc;
  250. ipc.emit(
  251. "DownloadFile",
  252. [sid, fpath, url, timeoutSecend],
  253. function(err) {
  254. console.log("DownloadFile callback");
  255. if (err) {
  256. console.error(err);
  257. r(false);
  258. }
  259. }
  260. );
  261. });
  262. }
  263. Unzip(fpath, distDir, cb) {
  264. const sid = "unzip" + Date.now();
  265. return new Promise((r) => {
  266. const cancel = this.OnMsg(sid, (data) => {
  267. cb && cb(data.type, data);
  268. if (data.type == "succ") {
  269. r(true);
  270. cancel.unbind();
  271. return;
  272. }
  273. if (data.type == "error") {
  274. r(false);
  275. cancel.unbind();
  276. }
  277. });
  278. const ipc = this.ipc;
  279. ipc.emit("Unzip", [sid, fpath, distDir]);
  280. });
  281. }
  282. //获取文件夹的大小
  283. //文件目录不要太大,不然会卡死程序
  284. GetDirSize(dir) {
  285. return new Promise((r) => {
  286. const ipc = this.ipc;
  287. ipc.emit("GetDirSize", [dir], function(size) {
  288. r(size);
  289. });
  290. });
  291. }
  292. //获取系统数据目录
  293. GetAppDataDir() {
  294. return new Promise((r) => {
  295. const ipc = this.ipc;
  296. ipc.emit("GetAppDataDir", [], function(dir) {
  297. r(dir);
  298. });
  299. });
  300. }
  301. OpenAssetWindow(projectPath) {
  302. return new Promise((r) => {
  303. const ipc = this.ipc;
  304. ipc.emit(
  305. "openAssetsWindow",
  306. [
  307. `${location.host}/library.html?path=${projectPath}`,
  308. "资源管理库",
  309. 1280,
  310. 960
  311. ],
  312. function(ok) {
  313. r(ok);
  314. }
  315. );
  316. });
  317. }
  318. SendMsg(subject, msg) {
  319. const conn = this._conn;
  320. if (!conn) {
  321. console.error("应用socket异常");
  322. return;
  323. }
  324. conn.send(encodeNormMsg({ sub: subject, msg }));
  325. }
  326. OnMsg(subject, cb) {
  327. return this.on("on" + subject, cb);
  328. }
  329. //同步阻塞当前进程
  330. UploadSync(files) {
  331. return new Promise((r) => {
  332. const ipc = this.ipc;
  333. ipc.emit("UploadSync", [files], function(ret) {
  334. r(ret);
  335. });
  336. });
  337. }
  338. //异步上传不会阻塞当前进程
  339. UploadASync(files) {
  340. const sid = "u" + Date.now();
  341. return new Promise((r) => {
  342. const ipc = this.ipc;
  343. ipc.emit("UploadASync", [sid, files], function(ok) {
  344. if (!ok) {
  345. r([]);
  346. return;
  347. }
  348. ipc.on(sid, (items) => {
  349. r(items);
  350. });
  351. });
  352. });
  353. }
  354. //异步上传不会阻塞当前进程
  355. UploadDir(dir, targetDir) {
  356. const sid = "u" + Date.now();
  357. return new Promise((r) => {
  358. const ipc = this.ipc;
  359. ipc.emit("UploadDir", [sid, dir, targetDir], function(ok) {
  360. if (!ok) {
  361. r([]);
  362. return;
  363. }
  364. ipc.on(sid, (items) => {
  365. r(items);
  366. });
  367. });
  368. });
  369. }
  370. GetFilesInDir(dir, filter) {
  371. return new Promise((r) => {
  372. const ipc = this.ipc;
  373. ipc.emit("GetFilesInDir", [dir, filter], function(ret) {
  374. r(ret);
  375. });
  376. });
  377. }
  378. GetRunningApp() {
  379. return new Promise((r) => {
  380. const ipc = this.ipc;
  381. ipc.emit(
  382. "GetRunningApp",
  383. [],
  384. function(apps) {
  385. r(apps);
  386. }
  387. );
  388. });
  389. }
  390. GetSubDirNames(dir) {
  391. return new Promise((r) => {
  392. const ipc = this.ipc;
  393. ipc.emit("GetSubDirNames", [dir], function(ret) {
  394. r(ret);
  395. });
  396. });
  397. }
  398. RemoveFile(fpath) {
  399. return new Promise((r) => {
  400. const ipc = this.ipc;
  401. ipc.emit("RemoveFile", [fpath], function(ok) {
  402. r(ok);
  403. });
  404. });
  405. }
  406. RemoveDir(fpath) {
  407. return new Promise((r) => {
  408. const ipc = this.ipc;
  409. ipc.emit("RemoveDir", [fpath], function(ok) {
  410. r(ok);
  411. });
  412. });
  413. }
  414. GetSaveFile(title, filter = "图片(*.png;*.jpg)") {
  415. const sid = "sf" + Date.now();
  416. return new Promise((r) => {
  417. const ipc = this.ipc;
  418. ipc.emit("GetSaveFile", [sid, title, filter], function(ok) {
  419. if (ok) {
  420. ipc.on(sid, (ret) => {
  421. r(ret);
  422. });
  423. return;
  424. }
  425. r("");
  426. });
  427. });
  428. }
  429. OpenOneFile(title, filter = "图片(*.png;*.jpg)") {
  430. const sid = "sf" + Date.now();
  431. return new Promise((r) => {
  432. const ipc = this.ipc;
  433. ipc.emit("OpenOneFile", [sid, title, filter], function(file) {
  434. setTimeout(() => {
  435. r(file);
  436. }, 0);
  437. });
  438. });
  439. }
  440. GetImageMeta(fpath) {
  441. return new Promise((r) => {
  442. const img = new Image();
  443. img.onload = () => {
  444. r({ Width: img.width, Height: img.height, Size: 0 });
  445. };
  446. img.src = fpath;
  447. });
  448. }
  449. SetMainTitle(title) {
  450. return new Promise((r) => {
  451. const ipc = this.ipc;
  452. ipc.emit("SetMainTitle", [title], function(ok) {
  453. r(ok);
  454. });
  455. });
  456. }
  457. SaveFile(fpath, buff) {
  458. return new Promise((r) => {
  459. const ipc = this.ipc;
  460. ipc.emit("SaveFile", [fpath, Array.from(buff)], function(err) {
  461. r(err);
  462. });
  463. });
  464. }
  465. OpenQueen5(url, title) {
  466. return new Promise((r) => {
  467. const ipc = this.ipc;
  468. ipc.emit("OpenQueen5", [url, title], function(err) {
  469. r(err);
  470. });
  471. });
  472. }
  473. OpenQueen5Play(url, title) {
  474. return new Promise((r) => {
  475. const ipc = this.ipc;
  476. ipc.emit("OpenQueen5Play", [url, title], function(err) {
  477. r(err);
  478. });
  479. });
  480. }
  481. SaveBlobFile(url, fbase64path) {
  482. console.log("save blob to ", fbase64path);
  483. return new Promise((r) => {
  484. const cancel = this.on("downloadsucc", (dpath) => {
  485. console.log("fpath=>", dpath);
  486. if (fbase64path == Base64.encode(dpath)) {
  487. cancel.unbind();
  488. r(true);
  489. }
  490. });
  491. saveAs(url, fbase64path);
  492. });
  493. }
  494. SaveClipboard(blob) {
  495. return navigator.clipboard.write([
  496. new ClipboardItem({
  497. "image/png": blob
  498. })
  499. ]);
  500. }
  501. GetNatsProfile() {
  502. return new Promise((r) => {
  503. const ipc = this.ipc;
  504. ipc.emit("NatsProfile", [], function(data) {
  505. r(data);
  506. });
  507. });
  508. }
  509. OpenWeb(url, title, width = 1280, height = 720) {
  510. return new Promise((r) => {
  511. const ipc = this.ipc;
  512. ipc.emit("OpenWeb", [url, title, width, height], function(data) {
  513. r(data);
  514. });
  515. });
  516. }
  517. RunNativeApp(guid, entry, params, title, key) {
  518. return new Promise((r) => {
  519. const ipc = this.ipc;
  520. ipc.emit(
  521. "RunNativeApp",
  522. [guid, entry, params, title, key],
  523. function(err) {
  524. console.log("xxxx", err);
  525. r(err);
  526. }
  527. );
  528. });
  529. }
  530. RunCmdSvcApp(guid, webUrl, entry, params, title, key) {
  531. return new Promise((r) => {
  532. const ipc = this.ipc;
  533. ipc.emit(
  534. "RunCmdSvcApp",
  535. [guid, webUrl, entry, params, title, key],
  536. function(err) {
  537. console.log("xxxx", err);
  538. r(err);
  539. }
  540. );
  541. });
  542. }
  543. StopNativeApp(guid) {
  544. return new Promise((r) => {
  545. const ipc = this.ipc;
  546. ipc.emit("StopNativeApp", [guid], function(ok) {
  547. r(ok);
  548. });
  549. });
  550. }
  551. LancherUpgrade(updateUrl, lancherUrl) {
  552. return new Promise((r) => {
  553. const ipc = this.ipc;
  554. ipc.emit("Upgrade", [updateUrl, lancherUrl], function(ok) {
  555. r(ok);
  556. });
  557. });
  558. }
  559. CreateShortcut(appName, lancherPath, icoPath) {
  560. return new Promise((r) => {
  561. const ipc = this.ipc;
  562. ipc.emit(
  563. "CreateShortcut",
  564. [appName, lancherPath, icoPath],
  565. function(ok) {
  566. r(ok);
  567. }
  568. );
  569. });
  570. }
  571. DeleteShortcut(appName) {
  572. return new Promise((r) => {
  573. const ipc = this.ipc;
  574. ipc.emit("DeleteShortcut", [appName], function(ok) {
  575. r(ok);
  576. });
  577. });
  578. }
  579. ResumeMainWnd() {
  580. return new Promise((r) => {
  581. const ipc = this.ipc;
  582. ipc.emit("ResumeMainWnd", [], function(ok) {
  583. r(ok);
  584. });
  585. });
  586. }
  587. HideMainWnd() {
  588. return new Promise((r) => {
  589. const ipc = this.ipc;
  590. ipc.emit("HideMainWnd", [], function(ok) {
  591. r(ok);
  592. });
  593. });
  594. }
  595. QuitLancher() {
  596. return new Promise((r) => {
  597. const ipc = this.ipc;
  598. ipc.emit("QuitLancher", [], function(ok) {
  599. r(ok);
  600. });
  601. });
  602. }
  603. MaxWindow(isMax) {
  604. return new Promise((r) => {
  605. const ipc = this.ipc;
  606. ipc.emit("MaxWindow", [isMax], function(ok) {
  607. r(ok);
  608. });
  609. });
  610. }
  611. FoldWindow(isFold) {
  612. return new Promise((r) => {
  613. const ipc = this.ipc;
  614. ipc.emit("FoldWindow", [isFold], function(ok) {
  615. r(ok);
  616. });
  617. });
  618. }
  619. TrayNotice(notice) {
  620. return new Promise((r) => {
  621. const ipc = this.ipc;
  622. ipc.emit(
  623. "TrayNotice",
  624. [notice.title || "提示", notice.context, notice.timeout || 2e3],
  625. function(ok) {
  626. r(ok);
  627. }
  628. );
  629. });
  630. }
  631. UpdateConfig(version) {
  632. return new Promise((r) => {
  633. const ipc = this.ipc;
  634. ipc.emit("UpdateConfig", [version], function(ok) {
  635. r(ok);
  636. });
  637. });
  638. }
  639. }
  640. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRldmljZUN0cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSBcInF1ZWVuanNcIjtcclxuaW1wb3J0IHsgTm9ybU1zZywgZGVjb2RlTm9ybU1zZywgZW5jb2RlTm9ybU1zZyB9IGZyb20gXCIuL2VudGl0eS9tZXNzYWdlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29yZS9jb250cm9sbGVyXCI7XHJcblxyXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tIFwiZmlsZS1zYXZlclwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZTY0IH0gZnJvbSBcImpzLWJhc2U2NFwiO1xyXG50eXBlIFVwbG9hZEl0ZW0gPSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBmcGF0aDogc3RyaW5nO1xyXG4gIGRpcjogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG4gIHNpemU/OiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBGaWxlSW5mbyA9IHtcclxuICBGcGF0aDogc3RyaW5nO1xyXG4gIFNpemU6IG51bWJlcjtcclxuICBDcmVhdGVBdDogbnVtYmVyOyAvL2luZm8uTW9kVGltZSgpLlVuaXgoKVxyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIERldmljZUNvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuICBpcGM6IGFueTtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBpZiAod2luZG93LmlwYykge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgdGhpcy5pcGMgPSB3aW5kb3cuaXBjO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pcGMgPSB7XHJcbiAgICAgICAgZW1pdChuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZW1pdCBtc2c9PlwiLCBuYW1lLCBhcmdzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIm9uIG1lc3NhZ2VcIiwgbmFtZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgfVxyXG4gIF9jb25uPzogV2ViU29ja2V0O1xyXG5cclxuICBpbml0RXZlbnQoKSB7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXM7XHJcbiAgICB0aGlzLmlwYy5vbihcIk9uRHJhZ0VudGVyXCIsIGZ1bmN0aW9uIChmaWxlczogc3RyaW5nW10pIHtcclxuICAgICAgc2NvcGUuZW1pdChcIm9uRHJhZ0VudGVyXCIsIGZpbGVzKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pcGMub24oXCJkb3dubG9hZHN1Y2NcIiwgKGZwYXRoOiBzdHJpbmcsIHNpemU6IG51bWJlcikgPT4ge1xyXG4gICAgICBzY29wZS5lbWl0KFwiZG93bmxvYWRzdWNjXCIsIGZwYXRoLCBzaXplKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXBjLmVtaXQoXCJHZXRTb2NrZXRVcmlcIiwgW10sICh1cmk6IHN0cmluZykgPT4ge1xyXG4gICAgICBsZXQgY29ubiA9IG5ldyBXZWJTb2NrZXQodXJpKTtcclxuICAgICAgY29ubi5vbm9wZW4gPSAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYnVzIHNvY2tldCBjb25uZWN0ZWQhISFcIik7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbm4ub25jbG9zZSA9IChldnQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImFwcCBidXMgc29ja2V0IGNvbm4gY2xvc2VkXCIsIGV2dCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY29ubiA9IG5ldyBXZWJTb2NrZXQodXJpKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgfTtcclxuICAgICAgY29ubi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgaWYgKCFldnQuZGF0YSB8fCBldnQuZGF0YSA9PSBcIlwiKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBibG9iID0gZXZ0LmRhdGEgYXMgQmxvYjtcclxuICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGRlY29kZU5vcm1Nc2cobmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xyXG4gICAgICAgICAgICBzY29wZS5lbWl0KFwib25cIiArIG1zZy5zdWIsIG1zZyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihldnQuZGF0YSwgdHlwZW9mIGV2dC5kYXRhLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLl9jb25uID0gY29ubjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25SZWFkeSgpIHtcclxuICAgIHRoaXMucHJvZmlsZSA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxBcHBQcm9maWxlKCk7XHJcbiAgfVxyXG5cclxuICBwcm9maWxlID0ge1xyXG4gICAgd3NQb3J0OiBcIlwiLFxyXG4gICAgdmVyc2lvbjogXCJcIixcclxuICAgIGRhdGFEaXI6IFwiXCIsXHJcbiAgICBleGVEaXI6IFwiXCIsXHJcbiAgICBleGVOYW1lOiBcIlwiLFxyXG4gICAgZXhlUGF0aDogXCJcIixcclxuICB9O1xyXG5cclxuICBnZXRMb2NhbEFwcFByb2ZpbGUoKTogUHJvbWlzZTx0eXBlb2YgdGhpcy5wcm9maWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiTG9jYWxBcHBQcm9maWxlXCIsIFtdLCBmdW5jdGlvbiAoY29uZmlnOiBhbnkpIHtcclxuICAgICAgICByKGNvbmZpZyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8v6YCJ5oup56OB55uY5paH5Lu25aS5XHJcbiAgU2VsZWN0RGlyKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBzaWQgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgY2JuYW1lID0gXCJjXCIgKyBzaWQ7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU2VsZWN0RGlyXCIsIFtzaWRdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNhbGw9PlwiLCBvayk7XHJcbiAgICAgICAgaWYgKCFvaykge1xyXG4gICAgICAgICAgcihcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXBjLm9uKGNibmFtZSwgZnVuY3Rpb24gKGRpcjogc3RyaW5nKSB7XHJcbiAgICAgICAgICByKGRpcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIElzRGlyRW1wdHkoZGlyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJJc0RpckVtcHR5XCIsIFtkaXJdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgSXNGaWxlRXhpdChmcGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiSXNGaWxlRXhpdFwiLCBbZnBhdGhdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFdyaXRlRmlsZVRleHQoZGlyOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIldyaXRlRmlsZVRleHRcIiwgW2RpciwgY29udGVudF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUmVhZEZpbGVUZXh0KGRpcjogc3RyaW5nKTogUHJvbWlzZTx7IGVycm9yOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiUmVhZEZpbGVUZXh0XCIsIFtkaXJdLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5ou36LSd5paH5Lu2XHJcbiAgQ29weUZpbGUoc3JjRmlsZTogc3RyaW5nLCB0YXJnZXRGaWxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHNpZCA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBjYm5hbWUgPSBcImNvcHlcIiArIHNpZDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLm9uKGNibmFtZSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpcGMuZW1pdChcIkNvcHlGaWxlXCIsIFtjYm5hbWUsIHNyY0ZpbGUsIHRhcmdldEZpbGVdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/kv53lrZjlupTnlKjnuqfnmoTphY3nva5cclxuICBTYXZlU3lzQ29uZmlnSXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlNhdmVBcHBDb25maWdJdGVtXCIsIFtrZXksIHZhbHVlXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIEdldFN5c0NvbmZpZ0l0ZW0oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgZXJyb3I6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJHZXRBcHBDb25maWdJdGVtXCIsIFtrZXldLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgUmVtb3ZlU3lzQ29uZmlnSXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8eyBlcnJvcjogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlbW92ZVN5c0NvbmZpZ0l0ZW1cIiwgW2tleV0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/ojrflj5blupTnlKjnmoRiYXNlVXJsXHJcbiAgR2V0U3lzRGF0YUJhc2VVcmwoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0QXBwRGF0YUJhc2VVcmxcIiwgW10sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/ojrflj5blupTnlKjnmoRiYXNlVXJsXHJcbiAgQ29weUZpbGVUb0FwcERhdGEoc3JjOiBzdHJpbmcsIHRhcmdldFJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXHJcbiAgICAgICAgXCJDb3B5RmlsZVRvQXBwRGF0YVwiLFxyXG4gICAgICAgIFtzcmMsIHRhcmdldFJlbGF0aXZlUGF0aF0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgICAgcihkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFJlbW92ZUFwcERhdGEodGFyZ2V0UmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJSZW1vdmVBcHBEYXRhXCIsIFt0YXJnZXRSZWxhdGl2ZVBhdGhdLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5omT5byA5paH5Lu25omA5Zyo55qE55uu5b2VXHJcbiAgT3BlbkRpcihkaXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIk9wZW5EaXJcIiwgW2Rpcl0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgU2VsZWN0T25lRmlsZVBhdGgodGl0bGU6IHN0cmluZywgZmlsdGVyczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHNpZCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBjb25zdCBjYm5hbWUgPSBcImNcIiArIHNpZDtcclxuICAgICAgaXBjLmVtaXQoXHJcbiAgICAgICAgXCJTZWxlY3RPbmVGaWxlUGF0aFwiLFxyXG4gICAgICAgIFtzaWQsIHRpdGxlLCBmaWx0ZXJzXSxcclxuICAgICAgICBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgICAgcihcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlwYy5vbihjYm5hbWUsIGZ1bmN0aW9uIChkaXI6IHN0cmluZykge1xyXG4gICAgICAgICAgICByKGRpcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5byA5ZCvcHJvamVjdHMg55qEaHR0cHNlcnZlclxyXG4gIFN0YXJ0SHR0cFNlcnZlcihwcmpGaWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgc2lkID0gRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJTdGFydFByb2plY3RIdHRwU2VydmVyXCIsIFtwcmpGaWxlXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+S4i+WcqOe6v+aWh+S7tiDpu5jorqTotoXml7bml7bpl7QyMOWIhumSn1xyXG4gIERvd25sb2FkRmlsZShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgZnBhdGg6IHN0cmluZyxcclxuICAgIHRpbWVvdXRTZWNlbmQ6IG51bWJlciA9IDYwICogMjAsXHJcbiAgICBjYj86IChldmVudDogXCJzdGFydFwiIHwgXCJwcm9ncmVzc1wiIHwgXCJlcnJvclwiIHwgXCJzdWNjXCIsIHAxOiBOb3JtTXNnKSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBzaWQgPSBcImRcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2codXJsLCBcIj09PlwiLCBmcGF0aCk7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuT25Nc2coc2lkLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKGRhdGEudHlwZSBhcyBhbnksIGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJzdWNjXCIpIHtcclxuICAgICAgICAgIHIodHJ1ZSk7XHJcbiAgICAgICAgICBjYW5jZWwudW5iaW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIGNhbmNlbC51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiRG93bmxvYWRGaWxlXCIsXHJcbiAgICAgICAgW3NpZCwgZnBhdGgsIHVybCwgdGltZW91dFNlY2VuZF0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRvd25sb2FkRmlsZSBjYWxsYmFja1wiKTtcclxuICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFVuemlwKFxyXG4gICAgZnBhdGg6IHN0cmluZyxcclxuICAgIGRpc3REaXI6IHN0cmluZyxcclxuICAgIGNiPzogKGV2ZW50OiBcInByb2dyZXNzXCIgfCBcImVycm9yXCIgfCBcInN1Y2NcIiwgcDE6IE5vcm1Nc2cpID0+IHZvaWRcclxuICApIHtcclxuICAgIGNvbnN0IHNpZCA9IFwidW56aXBcIiArIERhdGUubm93KCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuT25Nc2coc2lkLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKGRhdGEudHlwZSBhcyBhbnksIGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJzdWNjXCIpIHtcclxuICAgICAgICAgIHIodHJ1ZSk7XHJcbiAgICAgICAgICBjYW5jZWwudW5iaW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIGNhbmNlbC51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVbnppcFwiLCBbc2lkLCBmcGF0aCwgZGlzdERpcl0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluaWh+S7tuWkueeahOWkp+Wwj1xyXG4gIC8v5paH5Lu255uu5b2V5LiN6KaB5aSq5aSn77yM5LiN54S25Lya5Y2h5q2756iL5bqPXHJcbiAgR2V0RGlyU2l6ZShkaXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0RGlyU2l6ZVwiLCBbZGlyXSwgZnVuY3Rpb24gKHNpemU6IG51bWJlcikge1xyXG4gICAgICAgIHIoc2l6ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluezu+e7n+aVsOaNruebruW9lVxyXG4gIEdldEFwcERhdGFEaXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJHZXRBcHBEYXRhRGlyXCIsIFtdLCBmdW5jdGlvbiAoZGlyOiBzdHJpbmcpIHtcclxuICAgICAgICByKGRpcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPcGVuQXNzZXRXaW5kb3cocHJvamVjdFBhdGg6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIm9wZW5Bc3NldHNXaW5kb3dcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBgJHtsb2NhdGlvbi5ob3N0fS9saWJyYXJ5Lmh0bWw/cGF0aD0ke3Byb2plY3RQYXRofWAsXHJcbiAgICAgICAgICBcIui1hOa6kOeuoeeQhuW6k1wiLFxyXG4gICAgICAgICAgMTI4MCxcclxuICAgICAgICAgIDk2MCxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgICAgcihvayk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTZW5kTXNnKHN1YmplY3Q6IHN0cmluZywgbXNnOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbm4gPSB0aGlzLl9jb25uO1xyXG4gICAgaWYgKCFjb25uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLlupTnlKhzb2NrZXTlvILluLhcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbm4uc2VuZChlbmNvZGVOb3JtTXNnKHsgc3ViOiBzdWJqZWN0LCBtc2c6IG1zZyB9KSk7XHJcbiAgfVxyXG5cclxuICBPbk1zZyhzdWJqZWN0OiBzdHJpbmcsIGNiOiAobXNnOiBOb3JtTXNnKSA9PiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLm9uKFwib25cIiArIHN1YmplY3QsIGNiKTtcclxuICB9XHJcblxyXG4gIC8v5ZCM5q2l6Zi75aGe5b2T5YmN6L+b56iLXHJcbiAgVXBsb2FkU3luYyhmaWxlczogVXBsb2FkSXRlbVtdKTogUHJvbWlzZTxVcGxvYWRJdGVtW10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGxvYWRTeW5jXCIsIFtmaWxlc10sIGZ1bmN0aW9uIChyZXQ6IGFueSkge1xyXG4gICAgICAgIHIocmV0KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5byC5q2l5LiK5Lyg5LiN5Lya6Zi75aGe5b2T5YmN6L+b56iLXHJcbiAgVXBsb2FkQVN5bmMoZmlsZXM6IFVwbG9hZEl0ZW1bXSk6IFByb21pc2U8VXBsb2FkSXRlbVtdPiB7XHJcbiAgICBjb25zdCBzaWQgPSBcInVcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiVXBsb2FkQVN5bmNcIiwgW3NpZCwgZmlsZXNdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIW9rKSB7XHJcbiAgICAgICAgICByKFtdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXBjLm9uKHNpZCwgKGl0ZW1zOiBhbnkpID0+IHtcclxuICAgICAgICAgIHIoaXRlbXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/lvILmraXkuIrkvKDkuI3kvJrpmLvloZ7lvZPliY3ov5vnqItcclxuICBVcGxvYWREaXIoZGlyOiBzdHJpbmcsIHRhcmdldERpcjogc3RyaW5nKTogUHJvbWlzZTxVcGxvYWRJdGVtW10+IHtcclxuICAgIGNvbnN0IHNpZCA9IFwidVwiICsgRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGxvYWREaXJcIiwgW3NpZCwgZGlyLCB0YXJnZXREaXJdLCBmdW5jdGlvbiAob2s6IGFueSkge1xyXG4gICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgIHIoW10pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpcGMub24oc2lkLCAoaXRlbXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcihpdGVtcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBHZXRGaWxlc0luRGlyKGRpcjogc3RyaW5nLCBmaWx0ZXI6IHN0cmluZyk6IFByb21pc2U8RmlsZUluZm9bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkdldEZpbGVzSW5EaXJcIiwgW2RpciwgZmlsdGVyXSwgZnVuY3Rpb24gKHJldDogYW55KSB7XHJcbiAgICAgICAgcihyZXQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBHZXRSdW5uaW5nQXBwKCk6IFByb21pc2U8eyBHdWlkOiBzdHJpbmc7IFRpdGxlOiBzdHJpbmc7IEtleTogc3RyaW5nIH1bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIkdldFJ1bm5pbmdBcHBcIixcclxuICAgICAgICBbXSxcclxuICAgICAgICBmdW5jdGlvbiAoYXBwczogeyBHdWlkOiBzdHJpbmc7IFRpdGxlOiBzdHJpbmc7IEtleTogc3RyaW5nIH1bXSkge1xyXG4gICAgICAgICAgcihhcHBzKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldFN1YkRpck5hbWVzKGRpcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkdldFN1YkRpck5hbWVzXCIsIFtkaXJdLCBmdW5jdGlvbiAocmV0OiBhbnkpIHtcclxuICAgICAgICByKHJldCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBSZW1vdmVGaWxlKGZwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJSZW1vdmVGaWxlXCIsIFtmcGF0aF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBSZW1vdmVEaXIoZnBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlbW92ZURpclwiLCBbZnBhdGhdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldFNhdmVGaWxlKHRpdGxlOiBzdHJpbmcsIGZpbHRlciA9IFwi5Zu+54mHKCoucG5nOyouanBnKVwiKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHNpZCA9IFwic2ZcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0U2F2ZUZpbGVcIiwgW3NpZCwgdGl0bGUsIGZpbHRlcl0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChvaykge1xyXG4gICAgICAgICAgaXBjLm9uKHNpZCwgKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHIocmV0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByKFwiXCIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgT3Blbk9uZUZpbGUodGl0bGU6IHN0cmluZywgZmlsdGVyID0gXCLlm77niYcoKi5wbmc7Ki5qcGcpXCIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgc2lkID0gXCJzZlwiICsgRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJPcGVuT25lRmlsZVwiLCBbc2lkLCB0aXRsZSwgZmlsdGVyXSwgZnVuY3Rpb24gKGZpbGU6IGFueSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgcihmaWxlKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldEltYWdlTWV0YShcclxuICAgIGZwYXRoOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHsgV2lkdGg6IG51bWJlcjsgSGVpZ2h0OiBudW1iZXI7IFNpemU6IG51bWJlciB9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgcih7IFdpZHRoOiBpbWcud2lkdGgsIEhlaWdodDogaW1nLmhlaWdodCwgU2l6ZTogMCB9KTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLnNyYyA9IGZwYXRoO1xyXG5cclxuICAgICAgLy8gY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIC8vIGlwYy5lbWl0KFwiR2V0SW1hZ2VNZXRhXCIsIFtmcGF0aF0sIGZ1bmN0aW9uIChtZXRhKSB7XHJcbiAgICAgIC8vICAgICByKG1ldGEpO1xyXG4gICAgICAvLyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgU2V0TWFpblRpdGxlKHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJTZXRNYWluVGl0bGVcIiwgW3RpdGxlXSwgZnVuY3Rpb24gKG9rOiBhbnkpIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNhdmVGaWxlKGZwYXRoOiBzdHJpbmcsIGJ1ZmY6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU2F2ZUZpbGVcIiwgW2ZwYXRoLCBBcnJheS5mcm9tKGJ1ZmYpXSwgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgcihlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgT3BlblF1ZWVuNSh1cmw6IHN0cmluZywgdGl0bGU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIk9wZW5RdWVlbjVcIiwgW3VybCwgdGl0bGVdLCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcclxuICAgICAgICByKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIE9wZW5RdWVlbjVQbGF5KHVybDogc3RyaW5nLCB0aXRsZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiT3BlblF1ZWVuNVBsYXlcIiwgW3VybCwgdGl0bGVdLCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcclxuICAgICAgICByKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTYXZlQmxvYkZpbGUodXJsOiBzdHJpbmcsIGZiYXNlNjRwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKFwic2F2ZSBibG9iIHRvIFwiLCBmYmFzZTY0cGF0aCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMub24oXCJkb3dubG9hZHN1Y2NcIiwgKGRwYXRoOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImZwYXRoPT5cIiwgZHBhdGgpO1xyXG4gICAgICAgIGlmIChmYmFzZTY0cGF0aCA9PSBCYXNlNjQuZW5jb2RlKGRwYXRoKSkge1xyXG4gICAgICAgICAgY2FuY2VsLnVuYmluZCgpO1xyXG4gICAgICAgICAgcih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBzYXZlQXModXJsLCBmYmFzZTY0cGF0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNhdmVDbGlwYm9hcmQoYmxvYjogQmxvYikge1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW1xyXG4gICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7XHJcbiAgICAgICAgXCJpbWFnZS9wbmdcIjogYmxvYixcclxuICAgICAgfSksXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIEdldE5hdHNQcm9maWxlKCk6IFByb21pc2U8eyBhcGlQb3J0OiBzdHJpbmc7IHdzUG9ydDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJOYXRzUHJvZmlsZVwiLCBbXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPcGVuV2ViKFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAgd2lkdGggPSAxMjgwLFxyXG4gICAgaGVpZ2h0ID0gNzIwXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiT3BlbldlYlwiLCBbdXJsLCB0aXRsZSwgd2lkdGgsIGhlaWdodF0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUnVuTmF0aXZlQXBwKFxyXG4gICAgZ3VpZDogc3RyaW5nLFxyXG4gICAgZW50cnk6IHN0cmluZyxcclxuICAgIHBhcmFtczogc3RyaW5nW10sXHJcbiAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAga2V5OiBzdHJpbmdcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIlJ1bk5hdGl2ZUFwcFwiLFxyXG4gICAgICAgIFtndWlkLCBlbnRyeSwgcGFyYW1zLCB0aXRsZSwga2V5XSxcclxuICAgICAgICBmdW5jdGlvbiAoZXJyOiBzdHJpbmcpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwieHh4eFwiLCBlcnIpO1xyXG4gICAgICAgICAgcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUnVuQ21kU3ZjQXBwKFxyXG4gICAgZ3VpZDogc3RyaW5nLFxyXG4gICAgd2ViVXJsOiBzdHJpbmcsXHJcbiAgICBlbnRyeTogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBzdHJpbmdbXSxcclxuICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICBrZXk6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiUnVuQ21kU3ZjQXBwXCIsXHJcbiAgICAgICAgW2d1aWQsIHdlYlVybCwgZW50cnksIHBhcmFtcywgdGl0bGUsIGtleV0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInh4eHhcIiwgZXJyKTtcclxuICAgICAgICAgIHIoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFN0b3BOYXRpdmVBcHAoZ3VpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU3RvcE5hdGl2ZUFwcFwiLCBbZ3VpZF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBMYW5jaGVyVXBncmFkZSh1cGRhdGVVcmw6IHN0cmluZywgbGFuY2hlclVybDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiVXBncmFkZVwiLCBbdXBkYXRlVXJsLCBsYW5jaGVyVXJsXSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIENyZWF0ZVNob3J0Y3V0KFxyXG4gICAgYXBwTmFtZTogc3RyaW5nLFxyXG4gICAgbGFuY2hlclBhdGg6IHN0cmluZyxcclxuICAgIGljb1BhdGg6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIkNyZWF0ZVNob3J0Y3V0XCIsXHJcbiAgICAgICAgW2FwcE5hbWUsIGxhbmNoZXJQYXRoLCBpY29QYXRoXSxcclxuICAgICAgICBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICAgIHIob2spO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBEZWxldGVTaG9ydGN1dChhcHBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJEZWxldGVTaG9ydGN1dFwiLCBbYXBwTmFtZV0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBSZXN1bWVNYWluV25kKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlc3VtZU1haW5XbmRcIiwgW10sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBIaWRlTWFpblduZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJIaWRlTWFpblduZFwiLCBbXSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFF1aXRMYW5jaGVyKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlF1aXRMYW5jaGVyXCIsIFtdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgTWF4V2luZG93KGlzTWF4OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiTWF4V2luZG93XCIsIFtpc01heF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBGb2xkV2luZG93KGlzRm9sZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkZvbGRXaW5kb3dcIiwgW2lzRm9sZF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgVHJheU5vdGljZShub3RpY2U6IHtcclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG4gICAgY29udGV4dDogc3RyaW5nO1xyXG4gICAgdGltZW91dD86IG51bWJlcjtcclxuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiVHJheU5vdGljZVwiLFxyXG4gICAgICAgIFtub3RpY2UudGl0bGUgfHwgXCLmj5DnpLpcIiwgbm90aWNlLmNvbnRleHQsIG5vdGljZS50aW1lb3V0IHx8IDIwMDBdLFxyXG4gICAgICAgIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgICAgcihvayk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFVwZGF0ZUNvbmZpZyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGRhdGVDb25maWdcIiwgW3ZlcnNpb25dLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtc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