@cartanova/qgrid-cli 2.4.4 → 2.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,8 +3,10 @@ import { CODEX_IMAGE_GENERATION_MODEL, resolveImageGenerationOptions } from "../
3
3
  import { createTtftTracker } from "../common/ttft.js";
4
4
  import { CodexRpcClient } from "./codex-rpc.js";
5
5
  import { getLogger } from "@logtape/logtape";
6
+ import { join } from "node:path";
6
7
  import { spawn } from "node:child_process";
7
8
  import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
9
+ import { tmpdir } from "node:os";
8
10
  //#region src/utils/providers/openai/codex-worker.ts
9
11
  const logger = getLogger(["qgrid", "codex-worker"]);
10
12
  const MAX_RESTART_ATTEMPTS = 3;
@@ -75,7 +77,7 @@ var CodexAppServerWorker = class CodexAppServerWorker {
75
77
  constructor(config) {
76
78
  this.config = config;
77
79
  const suffix = config.workerIndex !== void 0 ? `-${config.workerIndex}` : "";
78
- this.codexHome = `/tmp/qgrid-codex/${config.tokenId}${suffix}`;
80
+ this.codexHome = join(tmpdir(), "qgrid-codex", `${config.tokenId}${suffix}`);
79
81
  }
80
82
  async spawnAndInit() {
81
83
  this.epochCounter++;
@@ -593,4 +595,4 @@ var CodexAppServerWorker = class CodexAppServerWorker {
593
595
  //#endregion
594
596
  export { CODEX_CONFIG_TOML, CodexAppServerWorker };
595
597
 
596
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHtcbiAgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCxcbiAgcmVzb2x2ZUltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyB0eXBlIEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvTW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgTW9kZWxMaXN0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvTW9kZWxMaXN0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgTW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZEluamVjdEl0ZW1zUGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFRocmVhZFN0YXJ0UGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFRocmVhZFN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkU3RhcnRSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblVzYWdlQnJlYWtkb3duIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1Rva2VuVXNhZ2VCcmVha2Rvd25cIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1R1cm5TdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUdXJuU3RhcnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBTdHJlYW1DYWxsYmFja3MgYXMgQ29tbW9uU3RyZWFtQ2FsbGJhY2tzIH0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVUdGZ0VHJhY2tlciB9IGZyb20gXCIuLi9jb21tb24vdHRmdFwiO1xuaW1wb3J0IHsgQ29kZXhScGNDbGllbnQgfSBmcm9tIFwiLi9jb2RleC1ycGNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiY29kZXgtd29ya2VyXCJdKTtcblxuY29uc3QgTUFYX1JFU1RBUlRfQVRURU1QVFMgPSAzO1xuY29uc3QgUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgPSAxXzAwMDtcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckNvbmZpZyB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBwbGFuVHlwZT86IHN0cmluZztcbiAgd29ya2VySW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlcXVlc3Qge1xuICBpbnB1dDogVHVyblN0YXJ0UGFyYW1zW1wiaW5wdXRcIl07XG4gIG91dHB1dFNjaGVtYT86IFR1cm5TdGFydFBhcmFtc1tcIm91dHB1dFNjaGVtYVwiXTtcbiAgZWZmb3J0Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zPzogc3RyaW5nO1xuICBoaXN0b3J5PzogVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNbXCJpdGVtc1wiXTtcbiAgdmVyYm9zaXR5Pzogc3RyaW5nO1xuICByZWFzb25pbmdTdW1tYXJ5Pzogc3RyaW5nO1xuICBzZXJ2aWNlVGllcj86IHN0cmluZztcbiAgLy8g7J20IHR1cm4g7JeQ7IScIGNvZGV4IOuCtOyepSBpbWFnZV9nZW5lcmF0aW9uIHRvb2wg7J2EIOy8oOuLpC5cbiAgLy8gdGhyZWFkIOuLqOychOuhnOunjCDtmZzshLHtmZTrkJjrqbAo7KCE7JetIGNvbmZpZyDripQgaW1hZ2VfZ2VuZXJhdGlvbj1mYWxzZSDsnKDsp4ApLFxuICAvLyDtlIzrnpjqt7gg7JeG64qUIOyalOyyreydgCB0b29sIOq1rOyEseydtCDtmITtlonqs7wg64+Z7J287ZWY64ukLlxuICBpbWFnZUdlbmVyYXRpb24/OiBib29sZWFuO1xuICBpbWFnZUdlbmVyYXRpb25PcHRpb25zPzogSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucztcbn1cblxuLy8g7ZWcIHR1cm4g7JeQ7IScIOyDneyEseuQnCDsnbTrr7jsp4Ag7ZWY64KYLiBjb2RleCBpbWFnZUdlbmVyYXRpb24gaXRlbSDsl5DshJwg7YyM7IOdLlxuZXhwb3J0IGludGVyZmFjZSBUdXJuSW1hZ2Uge1xuICBkYXRhOiBzdHJpbmc7IC8vIGJhc2U2NCBpbWFnZSBwYXlsb2FkIChpdGVtLnJlc3VsdClcbiAgcmV2aXNlZFByb21wdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVzdWx0IHtcbiAgdGV4dDogc3RyaW5nO1xuICB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93bjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICB0dGZ0TXM6IG51bWJlciB8IG51bGw7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIC8vIOydtOuvuOyngCB0dXJuIOyXkOyEnOunjCDssYTsm4zsp5AuIOyZhOyEsSDsnbTrr7jsp4DqsIAg7JeG7Jy866m0IOu5iCDrsLDsl7QvdW5kZWZpbmVkLlxuICBpbWFnZXM/OiBUdXJuSW1hZ2VbXTtcbiAgLy8g7J2066+47KeAIHRvb2wg7Zi47Lac7J20IOq0gOy4oeuQkOuKlOyngChpdGVtL3N0YXJ0ZWQg65iQ64qUIGhhc1Jlc3VsdCDsnojripQgY29tcGxldGVkKS5cbiAgLy8g7J2066+47KeAIDDqsJzsnbwg65WMIOyerOyLnOuPhCDqsIDriqUg7Iuk7YyoKFwi7Iuc64+EIO2bhCDrr7jsmYTshLFcIinsmYAg7J6s7Iuc64+EIOustOydtShcInRvb2wg66+47Zi47LacXCIp7J2EIOq1rOu2hC5cbiAgaW1hZ2VBdHRlbXB0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1DYWxsYmFja3MgPSBDb21tb25TdHJlYW1DYWxsYmFja3M8VHVyblJlc3VsdD47XG5cbnR5cGUgUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyA9IFBpY2s8V29ya2VyQ29uZmlnLCBcImFjY2Vzc1Rva2VuXCIgfCBcImFjY291bnRJZFwiIHwgXCJwbGFuVHlwZVwiPjtcbnR5cGUgQWN0aXZlVHVybkFib3J0ID0gKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblxuLy8gdGhyZWFkL3N0YXJ0IOqzte2GtSDsmLXshZhcbmNvbnN0IFRIUkVBRF9ERUZBVUxUUyA9IHtcbiAgc2FuZGJveDogXCJyZWFkLW9ubHlcIixcbiAgYXBwcm92YWxQb2xpY3k6IFwibmV2ZXJcIixcbiAgY29uZmlnOiB7XG4gICAgYXBwczogeyBfZGVmYXVsdDogeyBlbmFibGVkOiBmYWxzZSwgZGVzdHJ1Y3RpdmVfZW5hYmxlZDogZmFsc2UsIG9wZW5fd29ybGRfZW5hYmxlZDogZmFsc2UgfSB9LFxuICB9LFxufSBzYXRpc2ZpZXMgUGFydGlhbDxUaHJlYWRTdGFydFBhcmFtcz47XG5cbmNvbnN0IEJBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIERvIG5vdCB1c2UgYW55IHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC4gUmVzcG9uZCB3aXRoIHRleHQgb25seS5cIjtcblxuLy8g7J2066+47KeAIOyDneyEsSB0aHJlYWQg7KCE7JqpIGluc3RydWN0aW9uLiDquLDrs7ggQkFTRV9JTlNUUlVDVElPTlMg7J2YIFwidGV4dCBvbmx5XCIg7KeA7Iuc6rCAXG4vLyDsi6Tsp4gg7Ja17KCc6riw7J2066+A66GcKGNvZGV4IGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDripQgZGVmYXVsdC1vbiksIOydtOuvuOyngCDrqqjrk5zsl5DshJzripRcbi8vIGltYWdlX2dlbmVyYXRpb24gdG9vbCDsgqzsmqnsnYQg66qF7Iuc7KCB7Jy866GcIO2XiOyaqe2VnOuLpC4gc2hlbGwvd2ViIOuTsSDrgpjrqLjsp4AgdG9vbCDsnYAg7Jes7KCE7Z6IIOq4iOyngC5cbmNvbnN0IElNQUdFX0JBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIFdoZW4gYXNrZWQgdG8gY3JlYXRlIGFuIGltYWdlLCB1c2UgdGhlIGltYWdlX2dlbmVyYXRpb24gdG9vbCB0byBwcm9kdWNlIGl0LiBEbyBub3QgdXNlIGFueSBvdGhlciB0b29scyBzdWNoIGFzIHNoZWxsLCBmaWxlIG9wZXJhdGlvbnMsIG9yIHdlYiBzZWFyY2guXCI7XG5cbmZ1bmN0aW9uIGltYWdlQmFzZUluc3RydWN0aW9ucyhvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIGAke0lNQUdFX0JBU0VfSU5TVFJVQ1RJT05TfSBSZXF1ZXN0ZWQgaW1hZ2Ugb3V0cHV0OiBtb2RlbCAke0NPREVYX0lNQUdFX0dFTkVSQVRJT05fTU9ERUx9LCBxdWFsaXR5ICR7cmVzb2x2ZWQucXVhbGl0eX0sIHNpemUgJHtyZXNvbHZlZC5zaXplfSwgZm9ybWF0IHBuZy5gO1xufVxuXG4vLyDsi6TsuKHsg4Eg7JmE66OMIGl0ZW0g7J2YIHN0YXR1cyDripQgXCJnZW5lcmF0aW5nXCIg7Jy866GcIOyZgOuPhCByZXN1bHQg7JeQIOyZhOyEsSBiYXNlNjQg6rCAIOyLpOumsOuLpC5cbi8vIOuUsOudvOyEnCDsmYTshLEg7YyQ7KCV7J2AIHN0YXR1cyDrrLjsnpDsl7TsnbQg7JWE64uI6528IHJlc3VsdCDsnZgg7Jyg7Zqo7ISxKOu5hOyWtOyeiOyngCDslYrqs6Ag7ZGc7KSAIGJhc2U2NCDsnbjsp4Ap7Jy866GcIO2VnOuLpC5cbmZ1bmN0aW9uIGlzQ29tcGxldGVkSW1hZ2VSZXN1bHQocmVzdWx0OiB1bmtub3duKTogcmVzdWx0IGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRyaW1tZWQgPSByZXN1bHQudHJpbSgpO1xuICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDAgfHwgdHJpbW1lZC5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiBmYWxzZTtcbiAgaWYgKCEvXltBLVphLXowLTkrL10rPXswLDJ9JC8udGVzdCh0cmltbWVkKSB8fCB0cmltbWVkLmxlbmd0aCAlIDQgIT09IDApIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGNvZGV46rCAIOunpCDsmpTssq3sl5Ag7J6Q64+ZIOyjvOyehe2VmOuKlCDrgrTsnqUgdG9vbChzaGVsbC93ZWJfc2VhcmNoL3NwYXduX2FnZW50IOuTsSAxNOqwnCnqs7xcbi8vIGluc3RydWN0aW9uIOu4lOuhnShwZXJtaXNzaW9ucy9lbnZpcm9ubWVudF9jb250ZXh0L3NraWxscywgfjEwS0Ip7J2EIOu5hO2ZnOyEse2ZlFxuLy8gJENPREVYX0hPTUUvY29uZmlnLnRvbWwg66GcIOyNqOuEo+ycvOuptCBjb2RleCDrtoDtjIUg7IucIHNjYW5cbi8vIO2GteygnOu2iOqwgDogdXBkYXRlX3BsYW4vcmVxdWVzdF91c2VyX2lucHV0XG5leHBvcnQgY29uc3QgQ09ERVhfQ09ORklHX1RPTUwgPSBgd2ViX3NlYXJjaCA9IFwiZGlzYWJsZWRcIlxuaW5jbHVkZV9wZXJtaXNzaW9uc19pbnN0cnVjdGlvbnMgPSBmYWxzZVxuaW5jbHVkZV9hcHBzX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2Vudmlyb25tZW50X2NvbnRleHQgPSBmYWxzZVxuXG5bZmVhdHVyZXNdXG5zaGVsbF90b29sID0gZmFsc2VcbnRvb2xfc2VhcmNoID0gZmFsc2VcbnRvb2xfc3VnZ2VzdCA9IGZhbHNlXG5tdWx0aV9hZ2VudCA9IGZhbHNlXG5pbWFnZV9nZW5lcmF0aW9uID0gZmFsc2VcbmFwcHMgPSBmYWxzZVxucGx1Z2lucyA9IGZhbHNlXG5cblt0b29sc11cbnZpZXdfaW1hZ2UgPSBmYWxzZVxuXG5bc2tpbGxzXVxuaW5jbHVkZV9pbnN0cnVjdGlvbnMgPSBmYWxzZVxuXG5bc2tpbGxzLmJ1bmRsZWRdXG5lbmFibGVkID0gZmFsc2VcbmA7XG5cbi8vIOKUgOKUgCBXb3JrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBDb2RleEFwcFNlcnZlcldvcmtlciB7XG4gIHByaXZhdGUgcHJvYzogQ2hpbGRQcm9jZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnBjOiBDb2RleFJwY0NsaWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvZGV4SG9tZTogc3RyaW5nO1xuICBwcml2YXRlIHJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgcmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidXN5ID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aXZlVHVybkFib3J0PzogQWN0aXZlVHVybkFib3J0O1xuICBhY3RpdmUgPSB0cnVlO1xuICBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgLy8gcmVzdGFydCDsi5wgcnBjIOqwneyytOqwgCDsg4jroZwg7IOd7ISx65CY66+A66GcLCDtlbjrk6Trn6zrpbwg67O06rSA7ZaI64uk6rCAIOunpCBzcGF3buuniOuLpCDsnqzrsJTsnbjrlKntlZzri6QuXG4gIHNlcnZlclJlcXVlc3RIYW5kbGVyPzogKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUpOiB3b3JrZXIg6rCAIOyDneyEse2VnCB0aHJlYWQg65Ok7J2YIOuplO2DgC5cbiAgLy8gZXBoZW1lcmFsIHRocmVhZCDripQg7J20IO2UhOuhnOyEuOyKpCDrqZTrqqjrpqzsl5Drp4wg7KG07J6s7ZWY66+A66GcIHJlc3RhcnQg7IucIOyghOu2gCDrrLTtmqguXG4gIHByaXZhdGUgdGhyZWFkTWV0YSA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3RVc2VkQXQ6IG51bWJlciB9PigpO1xuICAvLyBzcGF3biDsubTsmrTthLAuIHJlc3RhcnQg66eI64ukIOymneqwgCDihpIgY29udiDtlbjrk6TsnZggZXBvY2gg7JmAIOuMgOyhsO2VtCBzdGFsZSB0aHJlYWQg6rCQ7KeALlxuICBwcml2YXRlIGVwb2NoQ291bnRlciA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRIUkVBRF9JRExFX1RUTF9NUyA9IDEwICogNjBfMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfVEhSRUFEU19QRVJfV09SS0VSID0gMTY7XG4gIC8vIOydtOuvuOyngCDqsozsnbTtirgg6rKA7Kad7JqpIOy6kOyLnC4gc3Bhd24g64uo7JyE66GcIOustO2aqO2ZlChyZXN0YXJ0IOyLnCBjbGVhcikuXG4gIC8vIGNhcGFiaWxpdHkg64qUIHByb3ZpZGVyIOuLqOychCBib29sZWFuLCDrqqjrjbgg66mA7Yuw66qo64usIOyXrOu2gOuKlCBtb2RlbC9saXN0IOuhnCDtmZXsnbguXG4gIHByaXZhdGUgY2FjaGVkQ2FwYWJpbGl0aWVzPzogTW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZTtcbiAgcHJpdmF0ZSBjYWNoZWRNb2RlbHM/OiBNYXA8c3RyaW5nLCBNb2RlbD47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IFdvcmtlckNvbmZpZykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGNvbmZpZy53b3JrZXJJbmRleCAhPT0gdW5kZWZpbmVkID8gYC0ke2NvbmZpZy53b3JrZXJJbmRleH1gIDogXCJcIjtcbiAgICB0aGlzLmNvZGV4SG9tZSA9IGAvdG1wL3FncmlkLWNvZGV4LyR7Y29uZmlnLnRva2VuSWR9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIC8vIOyDiCDtlITroZzshLjsiqQg4oaSIGNhcGFiaWxpdHkvbW9kZWwg7LqQ7IucIOustO2aqCjroZzqt7jsnbgg6rOE7KCVL+uyhOyghOydtCDrsJTrgIzsl4jsnYQg7IiYIOyeiOydjCkuXG4gICAgdGhpcy5jYWNoZWRDYXBhYmlsaXRpZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYWNoZWRNb2RlbHMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gY29kZXgg64K07J6lIHRvb2wvd2ViX3NlYXJjaC9pbnN0cnVjdGlvbiDruJTroZ0g67mE7Zmc7ISx7ZmUXG4gICAgd3JpdGVGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vY29uZmlnLnRvbWxgLCBDT0RFWF9DT05GSUdfVE9NTCk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSxcbiAgICAgICAgLy8gZW52aXJvbm1lbnQg67mE7Zmc7ISx7ZmUIOKGkiBoYXNfZW52aXJvbm1lbnQ9ZmFsc2Ug4oaSIHNoZWxsL2FwcGx5X3BhdGNoL3ZpZXdfaW1hZ2Ug7KCc6rGwXG4gICAgICAgIENPREVYX0VYRUNfU0VSVkVSX1VSTDogXCJub25lXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKFxuICAgICAgICBuZXcgRXJyb3IoYGNvZGV4IHdvcmtlciBleGl0ZWQgd2hpbGUgdHVybiB3YXMgcnVubmluZyAoY29kZT0ke2NvZGUgPz8gXCJ1bmtub3duXCJ9KWApLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucnBjID0gbnVsbDtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ycGMgPSBuZXcgQ29kZXhScGNDbGllbnQodGhpcy5wcm9jKTtcbiAgICAvLyByZXN0YXJ0IO2bhOyXkOuPhCByZWZyZXNoIHNlcnZlci1yZXF1ZXN0IO2VuOuTpOufrOulvCDsnKDsp4AgKOyXhuycvOuptCBjb2RleCDthqDtgbAg7ZqM7KCEIOyLpO2MqCDihpIgc2Vzc2lvbiBleHBpcmVkKVxuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3Q8eyBhdXRoVXJsOiBzdHJpbmcgfT4oXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdFwiLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gc3RhcnRlZGApO1xuICAgIHJldHVybiByZXN1bHQuYXV0aFVybDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIGNvbXBsZXRlZGApO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1hbmFnZWRDcmVkZW50aWFscygpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9hdXRoLmpzb25gLCBcInV0Zi04XCIpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByYXcudG9rZW5zPy5hY2Nlc3NfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByYXcudG9rZW5zPy5yZWZyZXNoX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIGlkVG9rZW46IHJhdy50b2tlbnM/LmlkX3Rva2VuLFxuICAgICAgICBhY2NvdW50SWQ6IHJhdy50b2tlbnM/LmFjY291bnRfaWQgPz8gXCJcIixcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsQWN0aXZlVHVybihuZXcgRXJyb3IoXCJjb2RleCB3b3JrZXIgc3RvcHBlZFwiKSk7XG4gICAgdGhpcy5ycGM/LmRlc3Ryb3koKTtcblxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jPy5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDNfMDAwKTtcbiAgICAgICAgdGhpcy5wcm9jIS5vbihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBybVN5bmModGhpcy5jb2RleEhvbWUsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSAmJiAhdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgdG9rZW5JZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbklkO1xuICB9XG4gIGdldCB3b3JrZXJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwO1xuICB9XG4gIGdldCB0b2tlbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lO1xuICB9XG5cbiAgY2FuUmV1c2VGb3JUb2tlbihfdG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmFjY291bnRJZCA9PT0gY3JlZGVudGlhbHMuYWNjb3VudElkICYmXG4gICAgICAodGhpcy5jb25maWcucGxhblR5cGUgPz8gdW5kZWZpbmVkKSA9PT0gKGNyZWRlbnRpYWxzLnBsYW5UeXBlID8/IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVG9rZW5TdGF0ZSh0b2tlbk5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPSBjcmVkZW50aWFscy5hY2NvdW50SWQ7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnBsYW5UeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wbGFuVHlwZSA9IGNyZWRlbnRpYWxzLnBsYW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcucGxhblR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHMoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICByZXR1cm4gdGhpcy5ycGMucmVxdWVzdChcImFjY291bnQvcmF0ZUxpbWl0cy9yZWFkXCIsIHt9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbWFnZSBnZW5lcmF0aW9uIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIOydtOuvuOyngCB0b29sIOydgCBjb2RleCDsl5DshJwgKEF1dGhNb2RlOjpDaGF0Z3B0KSBBTkQgKGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSlcbiAgLy8gQU5EICjrqqjrjbgg66mA7Yuw66qo64usKSAz7KSRIOqyjOydtO2KuOuLpC4gcWdyaWQg64qUIE9BdXRoIOyghOyaqeydtOqzoCBmZWF0dXJlIOuKlCB0aHJlYWQg7JeQ7IScXG4gIC8vIOy8nOuvgOuhnCwgZGlzcGF0Y2hlciDqsIAg7IKs7KCEIOqygOymne2VoCDrgqjsnYAg7KGw6rG07J2AIGNhcGFiaWxpdHkocHJvdmlkZXIpICsg66qo6424IOupgO2LsOuqqOuLrOydtOuLpC5cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICBpZiAoIXRoaXMuY2FjaGVkQ2FwYWJpbGl0aWVzKSB7XG4gICAgICB0aGlzLmNhY2hlZENhcGFiaWxpdGllcyA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8TW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZT4oXG4gICAgICAgIFwibW9kZWxQcm92aWRlci9jYXBhYmlsaXRpZXMvcmVhZFwiLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZENhcGFiaWxpdGllcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1vZGVsPj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgaWYgKCF0aGlzLmNhY2hlZE1vZGVscykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxNb2RlbExpc3RSZXNwb25zZT4oXCJtb2RlbC9saXN0XCIsIHt9KTtcbiAgICAgIHRoaXMuY2FjaGVkTW9kZWxzID0gbmV3IE1hcChyZXMuZGF0YS5tYXAoKG0pID0+IFttLm1vZGVsLCBtXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRNb2RlbHM7XG4gIH1cblxuICAvLyDso7zslrTsp4Qg66qo6424KOuvuOyngOygleydtOuptCB0aHJlYWQg6riw67O4IOuqqOuNuCnroZwg7J2066+47KeAIOyDneyEseydtCDqsIDriqXtlZzsp4Ag6rKA7KadLlxuICAvLyDrtojqsIAg7IKs7Jyg66W8IOusuOyekOyXtOuhnCDrsJjtmZjtlZjqs6AsIOqwgOuKpe2VmOuptCBudWxsIOydhCDrsJjtmZjtlZzri6QuXG4gIGFzeW5jIGNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChtb2RlbD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybiBcIndvcmtlciBub3QgcmVhZHlcIjtcbiAgICBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2FkQ2FwYWJpbGl0aWVzKCk7XG4gICAgaWYgKCFjYXBzLmltYWdlR2VuZXJhdGlvbikgcmV0dXJuIFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBnZW5lcmF0aW9uXCI7XG4gICAgLy8g66qo6424IOupgO2LsOuqqOuLrCDqsoDspp0uIG1vZGVsIOuvuOyngOygleydtOuptCBwcm92aWRlciBjYXBhYmlsaXR5IOunjOycvOuhnCDthrXqs7zsi5ztgqTqs6AsXG4gICAgLy8g7Iuk7KCcIOyggeyaqSDrqqjrjbjsnZgg66mA7Yuw66qo64usIOyXrOu2gOuKlCB0dXJuIOyLpO2WiSDqsrDqs7wo7J2066+47KeAIDDqsJwg4oaSIFUzIOyLpO2MqCDrtoTrpZgp6rCAIOyeoeuKlOuLpC5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMubG9hZE1vZGVscygpO1xuICAgICAgY29uc3QgaW5mbyA9IG1vZGVscy5nZXQobW9kZWwpO1xuICAgICAgaWYgKGluZm8gJiYgIWluZm8uaW5wdXRNb2RhbGl0aWVzLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgcmV0dXJuIGBtb2RlbCAke21vZGVsfSBpcyBub3QgbXVsdGltb2RhbCAobm8gaW1hZ2UgaW5wdXQgbW9kYWxpdHkpYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAvLyDsnbTrr7jsp4Ag66qo65OcOiB0aHJlYWQg64uo7JyE66Gc66eMIGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDrpbwg7Lyg64ukLlxuICAgICAgLy8g7KCE7JetIGNvbmZpZy50b21sIOydgCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCjthY3siqTtirggdGhyZWFkIOydtOykkSDssKjri6gpLFxuICAgICAgLy8gZG90dGVkIENMSS3siqTtg4Dsnbwgb3ZlcnJpZGUg7YKk66GcIOydtCB0aHJlYWQg7JeQ7ISc66eMIO2ZnOyEse2ZlCjsi6TsuKEg7ZmV7J24KS5cbiAgICAgIC4uLihyZXEuaW1hZ2VHZW5lcmF0aW9uID8geyBcImZlYXR1cmVzLmltYWdlX2dlbmVyYXRpb25cIjogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgeyB0aHJlYWQsIG1vZGVsOiB0aHJlYWRNb2RlbCB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUaHJlYWRTdGFydFJlc3BvbnNlPihcbiAgICAgIFwidGhyZWFkL3N0YXJ0XCIsXG4gICAgICB7XG4gICAgICAgIGVwaGVtZXJhbDogdHJ1ZSxcbiAgICAgICAgY3dkOiBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYCxcbiAgICAgICAgYmFzZUluc3RydWN0aW9uczogcmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgICAgID8gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zKVxuICAgICAgICAgIDogQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLmRldmVsb3Blckluc3RydWN0aW9ucyA/PyBcIlwiLFxuICAgICAgICBzYW5kYm94OiBUSFJFQURfREVGQVVMVFMuc2FuZGJveCxcbiAgICAgICAgYXBwcm92YWxQb2xpY3k6IFRIUkVBRF9ERUZBVUxUUy5hcHByb3ZhbFBvbGljeSxcbiAgICAgICAgY29uZmlnOiB0aHJlYWRDb25maWcsXG4gICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPixcbiAgICApO1xuXG4gICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWQuaWQ7XG4gICAgaWYgKHJlcS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0aHJlYWQvaW5qZWN0X2l0ZW1zXCIsIHtcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIGl0ZW1zOiByZXEuaGlzdG9yeSxcbiAgICAgIH0gc2F0aXNmaWVzIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zKTtcbiAgICB9XG4gICAgLy8g7J2066+47KeAIHR1cm4g7J2AIOyerOyCrOyaqeyXkOyEnCDsoJzsmbgoUjgpOiBiYXNlNjQg6rCAIHRocmVhZCDrqZTrqqjrpqzCt+y6kOyLnCBwcmVmaXgg7JeQXG4gICAgLy8g7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nqs6AsIOydtOuvuOyngCB0aHJlYWQg66W8IDEg7ZqM7Jqp7Jy866GcIOuRlOuLpC4gdGhyZWFkTWV0YSDrr7jrk7HroZ0g4oaSXG4gICAgLy8g7ZuE7IaNIHJldXNlIOyhsO2ajOyXkOyEnCDsnbQgdGhyZWFkIOuKlCDtm4Trs7TqsIAg65CY7KeAIOyViuuKlOuLpC5cbiAgICBpZiAoIXJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMudGhyZWFkTWV0YS5zZXQodGhyZWFkSWQsIHsgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgcmV0dXJuIHsgLi4ucmVzdWx0LCB0aHJlYWRJZCB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm5TdHJlYW0oXG4gICAgcmVxOiBUdXJuUmVxdWVzdCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIGV4aXN0aW5nVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICBjb25zdCB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCk7XG4gICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYiwgdHRmdFRyYWNrZXIpO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICAoeyB0dXJuSWQgfSA9IGF3YWl0IHRoaXMuc3RhcnRUdXJuT25UaHJlYWQodGhyZWFkSWQsIHJlcSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNiLm9uVHVybklkPy4odHVybklkKTtcbiAgICBhd2FpdCByZXN1bHRQcm9taXNlO1xuICAgIHJldHVybiB7IHRocmVhZElkIH07XG4gIH1cblxuICAvLyDilIDilIAgdGhyZWFkIOyerOyCrOyaqSDsp4Dsm5Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IGVwb2NoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXBvY2hDb3VudGVyO1xuICB9XG5cbiAgaGFzVGhyZWFkKHRocmVhZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aHJlYWRNZXRhLmhhcyh0aHJlYWRJZCk7XG4gIH1cblxuICAvLyBpZGxlIFRUTCDstIjqs7wgLyDqsJzsiJgg7IOB7ZWcIOy0iOqzvCB0aHJlYWQg66W8IOygleumrC4gY3JlYXRlVGhyZWFkIOyngeyghCBsYXp5IO2YuOy2nC5cbiAgLy8gY29kZXggZXBoZW1lcmFsIHRocmVhZCDripQg66qF7Iuc7KCBIGNsb3NlIFJQQyDsl4bsnbQg66e17JeQ7IScIOygnOqxsCDihpIg642UIOydtOyDgSB0dXJuIOyViCDrs7Trg4QuXG4gIHN3ZWVwSWRsZVRocmVhZHMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbWV0YV0gb2YgdGhpcy50aHJlYWRNZXRhKSB7XG4gICAgICBpZiAobm93IC0gbWV0YS5sYXN0VXNlZEF0ID4gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuVEhSRUFEX0lETEVfVFRMX01TKSB7XG4gICAgICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjcmVhdGVUaHJlYWQg7KeB7KCEIO2YuOy2nCDihpIg7IOIIHRocmVhZCAxIOqwnOqwgCDqs6cg7LaU6rCA65Cc64ukLiDstpTqsIAg7ZuE7JeQ64+EIE1BWCDrpbwg64SY7KeAIOyViuuPhOuhnVxuICAgIC8vIE1BWC0xIOydtO2VmOuhnCDspITsl6wg65GU64ukKOq3uOuemOyVvCDsg53shLEg7KeB7ZuEIOygle2Zle2eiCBNQVgpLiBMUlU6IGxhc3RVc2VkQXQg7Jik66aE7LCo7Iic7Jy866GcIOygnOqxsC5cbiAgICBjb25zdCBsaW1pdCA9IENvZGV4QXBwU2VydmVyV29ya2VyLk1BWF9USFJFQURTX1BFUl9XT1JLRVIgLSAxO1xuICAgIGlmICh0aGlzLnRocmVhZE1ldGEuc2l6ZSA+IGxpbWl0KSB7XG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy50aHJlYWRNZXRhLmVudHJpZXMoKV0udG9Tb3J0ZWQoXG4gICAgICAgIChhLCBiKSA9PiBhWzFdLmxhc3RVc2VkQXQgLSBiWzFdLmxhc3RVc2VkQXQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3ZlciA9IHRoaXMudGhyZWFkTWV0YS5zaXplIC0gbGltaXQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG92ZXI7IGkrKykgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShzb3J0ZWRbaV0hWzBdKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwidHVybi9pbnRlcnJ1cHRcIiwgeyB0aHJlYWRJZCwgdHVybklkIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgZmFpbEFjdGl2ZVR1cm4oZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnQgPSB0aGlzLmFjdGl2ZVR1cm5BYm9ydDtcbiAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICBhYm9ydD8uKGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cEdlbmVyYXRlZEltYWdlcygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgcm1TeW5jKGAke3RoaXMuY29kZXhIb21lfS9nZW5lcmF0ZWRfaW1hZ2VzYCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVR1cm5Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCksXG4gICk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcbiAgICAgIGNvbnN0IGltYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBUdXJuSW1hZ2U+KCk7IC8vIGl0ZW0uaWQg4oaSIOydtOuvuOyngCAoZGVkdXApXG4gICAgICBsZXQgaW1hZ2VBdHRlbXB0ZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vc3RhcnRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhSZXN1bHQgPSAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGlmIChyZXN1bHQuaW1hZ2VBdHRlbXB0ZWQpIHRoaXMuY2xlYW51cEdlbmVyYXRlZEltYWdlcygpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIC8vIOydtOuvuOyngCB0b29sIO2YuOy2nCDqtIDsuKEo7J6s7Iuc64+EIO2MkOygleyaqSkuIHN0YXJ0ZWQg64qUIHJlc3VsdCDsl4bsnbQg7Jik66+A66GcXG4gICAgICAvLyBhdHRlbXB0ZWQg7Iug7Zi466Gc66eMIOyTsOqzoCwg7JmE7ISxIOydtOuvuOyngOuKlCBjb21wbGV0ZWQg7JeQ7IScIHJlc3VsdCDsnKDtmqjshLHsnLzroZwg7YyQ7KCV7ZWc64ukLlxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9zdGFydGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB7XG4gICAgICAgICAgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZEltYWdlUmVzdWx0KHAuaXRlbS5yZXN1bHQpKSB7XG4gICAgICAgICAgICBpbWFnZXMuc2V0KHAuaXRlbS5pZCwgeyBkYXRhOiBwLml0ZW0ucmVzdWx0LCByZXZpc2VkUHJvbXB0OiBwLml0ZW0ucmV2aXNlZFByb21wdCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgLy8gdGhyZWFkIOyerOyCrOyaqSDsi5wgLnRvdGFsIOydgCDrjIDtmZQg7KCE7LK0IOuIhOyggeydtOudvCwgY29sZCDsmIDrjZgg7J207KCEIHR1cm4g6rmM7KeAIOyEnuyXrFxuICAgICAgICAvLyDsnbQg7JqU7LKtIOyekOyytOydmCBjYWNoZSDsoIHspJHrpaDsnbQg7Z2s7ISd65Cc64ukKOyYiDogdHVybjEgY29sZCAwJSArIHR1cm4yIDkwJSDihpIgNDglIOuhnCDquLDroZ0pLlxuICAgICAgICAvLyAubGFzdCDripQg7J2067KIIHR1cm4g66eM7J2YIHVzYWdlIOudvCByZXF1ZXN0X2xvZyDqsIAg6re4IOyalOyyreydmCDsi6TsoJwg7Yag7YGw7J2EIOygle2Zle2eiCDrsJjsmIHtlZzri6QuXG4gICAgICAgIHVzYWdlID0gcC50b2tlblVzYWdlLmxhc3Q7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidHVybi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGR1cmF0aW9uTXMgPSBwLnR1cm4uZHVyYXRpb25NcyA/PyAwO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhSZXN1bHQoe1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMuc2l6ZSA+IDAgPyBbLi4uaW1hZ2VzLnZhbHVlcygpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGltYWdlQXR0ZW1wdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHR1cm4g7Iuk7YyoL+ykkeuLqCDsi5wg67aA67aEIOydtOuvuOyngOuKlCDtj5DquLAo7ISx6rO17Jy866GcIOyKueqyqe2VmOyngCDslYrsnYwpLlxuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBtb2RlbDogc3RyaW5nLFxuICAgIGNiOiBTdHJlYW1DYWxsYmFja3MsXG4gICAgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbWFnZXMgPSBuZXcgTWFwPHN0cmluZywgVHVybkltYWdlPigpOyAvLyBpdGVtLmlkIOKGkiDsnbTrr7jsp4AgKGRlZHVwKVxuICAgICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL3N0YXJ0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGNiLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aENvbXBsZXRlID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAocmVzdWx0LmltYWdlQXR0ZW1wdGVkKSB0aGlzLmNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTtcbiAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0dGZ0VHJhY2tlci5yZWNvcmRGaXJzdERlbHRhKCk7XG4gICAgICAgIHRleHQgKz0gcC5kZWx0YTtcbiAgICAgICAgY2Iub25EZWx0YShwLmRlbHRhKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL3N0YXJ0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJpbWFnZUdlbmVyYXRpb25cIikgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHtcbiAgICAgICAgICB0ZXh0ID0gcC5pdGVtLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIHtcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzQ29tcGxldGVkSW1hZ2VSZXN1bHQocC5pdGVtLnJlc3VsdCkpIHtcbiAgICAgICAgICAgIGltYWdlcy5zZXQocC5pdGVtLmlkLCB7IGRhdGE6IHAuaXRlbS5yZXN1bHQsIHJldmlzZWRQcm9tcHQ6IHAuaXRlbS5yZXZpc2VkUHJvbXB0IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgICBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLFxuICAgICAgICAgICAgdHRmdE1zOiB0dGZ0VHJhY2tlci52YWx1ZSgpLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBpbWFnZXM6IGltYWdlcy5zaXplID4gMCA/IFsuLi5pbWFnZXMudmFsdWVzKCldIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgdHVybiAke3AudHVybi5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXN0YXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZXN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCB0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgaWYgKHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IG1heCByZXN0YXJ0IGF0dGVtcHRzIHJlYWNoZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cysrO1xuICAgIGNvbnN0IGJhc2VEZWxheSA9IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TICogMiAqKiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgLSAxKTtcbiAgICBjb25zdCBzdGFnZ2VyID0gKHRoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDApICogMl8wMDA7XG4gICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKyBzdGFnZ2VyO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX1bJHt0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwfV0gcmVzdGFydGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5yZXN0YXJ0QXR0ZW1wdHN9KWAsXG4gICAgKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRpYWxpemUoKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm9uUmVhZHk/LigpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZXN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUF1QkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGVBQWUsQ0FBQztBQUVuRCxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLDBCQUEwQjtBQXVEaEMsTUFBTSxrQkFBa0I7Q0FDdEIsU0FBUztDQUNULGdCQUFnQjtDQUNoQixRQUFRLEVBQ04sTUFBTSxFQUFFLFVBQVU7RUFBRSxTQUFTO0VBQU8scUJBQXFCO0VBQU8sb0JBQW9CO0VBQU8sRUFBRSxFQUM5RjtDQUNGO0FBRUQsTUFBTSxvQkFDSjtBQUtGLE1BQU0sMEJBQ0o7QUFFRixTQUFTLHNCQUFzQixTQUFxRDtDQUNsRixNQUFNLFdBQVcsOEJBQThCLFFBQVE7QUFDdkQsUUFBTyxHQUFHLHdC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
598
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQge1xuICBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbExpc3RSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbExpc3RSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL01vZGVsUHJvdmlkZXJDYXBhYmlsaXRpZXNSZWFkUmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVG9rZW5Vc2FnZUJyZWFrZG93blwiO1xuaW1wb3J0IHsgdHlwZSBUdXJuU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1R1cm5TdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFN0cmVhbUNhbGxiYWNrcyBhcyBDb21tb25TdHJlYW1DYWxsYmFja3MgfSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQgeyBDb2RleFJwY0NsaWVudCB9IGZyb20gXCIuL2NvZGV4LXJwY1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJjb2RleC13b3JrZXJcIl0pO1xuXG5jb25zdCBNQVhfUkVTVEFSVF9BVFRFTVBUUyA9IDM7XG5jb25zdCBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyA9IDFfMDAwO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29uZmlnIHtcbiAgdG9rZW5JZDogbnVtYmVyO1xuICB0b2tlbk5hbWU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xuICB3b3JrZXJJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVxdWVzdCB7XG4gIGlucHV0OiBUdXJuU3RhcnRQYXJhbXNbXCJpbnB1dFwiXTtcbiAgb3V0cHV0U2NoZW1hPzogVHVyblN0YXJ0UGFyYW1zW1wib3V0cHV0U2NoZW1hXCJdO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBkZXZlbG9wZXJJbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk/OiBUaHJlYWRJbmplY3RJdGVtc1BhcmFtc1tcIml0ZW1zXCJdO1xuICB2ZXJib3NpdHk/OiBzdHJpbmc7XG4gIHJlYXNvbmluZ1N1bW1hcnk/OiBzdHJpbmc7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICAvLyDsnbQgdHVybiDsl5DshJwgY29kZXgg64K07J6lIGltYWdlX2dlbmVyYXRpb24gdG9vbCDsnYQg7Lyg64ukLlxuICAvLyB0aHJlYWQg64uo7JyE66Gc66eMIO2ZnOyEse2ZlOuQmOupsCjsoITsl60gY29uZmlnIOuKlCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCksXG4gIC8vIO2UjOuemOq3uCDsl4bripQg7JqU7LKt7J2AIHRvb2wg6rWs7ISx7J20IO2YhO2WieqzvCDrj5nsnbztlZjri6QuXG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW47XG4gIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM/OiBJbWFnZUdlbmVyYXRpb25PcHRpb25zO1xufVxuXG4vLyDtlZwgdHVybiDsl5DshJwg7IOd7ISx65CcIOydtOuvuOyngCDtlZjrgpguIGNvZGV4IGltYWdlR2VuZXJhdGlvbiBpdGVtIOyXkOyEnCDtjIzsg50uXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5JbWFnZSB7XG4gIGRhdGE6IHN0cmluZzsgLy8gYmFzZTY0IGltYWdlIHBheWxvYWQgKGl0ZW0ucmVzdWx0KVxuICByZXZpc2VkUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHR0ZnRNczogbnVtYmVyIHwgbnVsbDtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7J2066+47KeAIHR1cm4g7JeQ7ISc66eMIOyxhOybjOynkC4g7JmE7ISxIOydtOuvuOyngOqwgCDsl4bsnLzrqbQg67mIIOuwsOyXtC91bmRlZmluZWQuXG4gIGltYWdlcz86IFR1cm5JbWFnZVtdO1xuICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpzsnbQg6rSA7Lih65CQ64qU7KeAKGl0ZW0vc3RhcnRlZCDrmJDripQgaGFzUmVzdWx0IOyeiOuKlCBjb21wbGV0ZWQpLlxuICAvLyDsnbTrr7jsp4AgMOqwnOydvCDrlYwg7J6s7Iuc64+EIOqwgOuKpSDsi6TtjKgoXCLsi5zrj4Qg7ZuEIOuvuOyZhOyEsVwiKeyZgCDsnqzsi5zrj4Qg66y07J21KFwidG9vbCDrr7jtmLjstpxcIinsnYQg6rWs67aELlxuICBpbWFnZUF0dGVtcHRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUNhbGxiYWNrcyA9IENvbW1vblN0cmVhbUNhbGxiYWNrczxUdXJuUmVzdWx0PjtcblxudHlwZSBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzID0gUGljazxXb3JrZXJDb25maWcsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCIgfCBcInBsYW5UeXBlXCI+O1xudHlwZSBBY3RpdmVUdXJuQWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuXG4vLyB0aHJlYWQvc3RhcnQg6rO17Ya1IOyYteyFmFxuY29uc3QgVEhSRUFEX0RFRkFVTFRTID0ge1xuICBzYW5kYm94OiBcInJlYWQtb25seVwiLFxuICBhcHByb3ZhbFBvbGljeTogXCJuZXZlclwiLFxuICBjb25maWc6IHtcbiAgICBhcHBzOiB7IF9kZWZhdWx0OiB7IGVuYWJsZWQ6IGZhbHNlLCBkZXN0cnVjdGl2ZV9lbmFibGVkOiBmYWxzZSwgb3Blbl93b3JsZF9lbmFibGVkOiBmYWxzZSB9IH0sXG4gIH0sXG59IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPjtcblxuY29uc3QgQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gRG8gbm90IHVzZSBhbnkgdG9vbHMgc3VjaCBhcyBzaGVsbCwgZmlsZSBvcGVyYXRpb25zLCBvciB3ZWIgc2VhcmNoLiBSZXNwb25kIHdpdGggdGV4dCBvbmx5LlwiO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIHRocmVhZCDsoITsmqkgaW5zdHJ1Y3Rpb24uIOq4sOuzuCBCQVNFX0lOU1RSVUNUSU9OUyDsnZggXCJ0ZXh0IG9ubHlcIiDsp4Dsi5zqsIBcbi8vIOyLpOyniCDslrXsoJzquLDsnbTrr4DroZwoY29kZXggaW1hZ2VfZ2VuZXJhdGlvbiBmZWF0dXJlIOuKlCBkZWZhdWx0LW9uKSwg7J2066+47KeAIOuqqOuTnOyXkOyEnOuKlFxuLy8gaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIOyCrOyaqeydhCDrqoXsi5zsoIHsnLzroZwg7ZeI7Jqp7ZWc64ukLiBzaGVsbC93ZWIg65OxIOuCmOuouOyngCB0b29sIOydgCDsl6zsoITtnogg6riI7KeALlxuY29uc3QgSU1BR0VfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gV2hlbiBhc2tlZCB0byBjcmVhdGUgYW4gaW1hZ2UsIHVzZSB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIHRvIHByb2R1Y2UgaXQuIERvIG5vdCB1c2UgYW55IG90aGVyIHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC5cIjtcblxuZnVuY3Rpb24gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYCR7SU1BR0VfQkFTRV9JTlNUUlVDVElPTlN9IFJlcXVlc3RlZCBpbWFnZSBvdXRwdXQ6IG1vZGVsICR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH0sIHF1YWxpdHkgJHtyZXNvbHZlZC5xdWFsaXR5fSwgc2l6ZSAke3Jlc29sdmVkLnNpemV9LCBmb3JtYXQgcG5nLmA7XG59XG5cbi8vIOyLpOy4oeyDgSDsmYTro4wgaXRlbSDsnZggc3RhdHVzIOuKlCBcImdlbmVyYXRpbmdcIiDsnLzroZwg7JmA64+EIHJlc3VsdCDsl5Ag7JmE7ISxIGJhc2U2NCDqsIAg7Iuk66aw64ukLlxuLy8g65Sw65287IScIOyZhOyEsSDtjJDsoJXsnYAgc3RhdHVzIOusuOyekOyXtOydtCDslYTri4jrnbwgcmVzdWx0IOydmCDsnKDtmqjshLEo67mE7Ja07J6I7KeAIOyViuqzoCDtkZzspIAgYmFzZTY0IOyduOyngCnsnLzroZwg7ZWc64ukLlxuZnVuY3Rpb24gaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChyZXN1bHQ6IHVua25vd24pOiByZXN1bHQgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdHJpbW1lZCA9IHJlc3VsdC50cmltKCk7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIS9eW0EtWmEtejAtOSsvXSs9ezAsMn0kLy50ZXN0KHRyaW1tZWQpIHx8IHRyaW1tZWQubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmV4cG9ydCBjb25zdCBDT0RFWF9DT05GSUdfVE9NTCA9IGB3ZWJfc2VhcmNoID0gXCJkaXNhYmxlZFwiXG5pbmNsdWRlX3Blcm1pc3Npb25zX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2FwcHNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfZW52aXJvbm1lbnRfY29udGV4dCA9IGZhbHNlXG5cbltmZWF0dXJlc11cbnNoZWxsX3Rvb2wgPSBmYWxzZVxudG9vbF9zZWFyY2ggPSBmYWxzZVxudG9vbF9zdWdnZXN0ID0gZmFsc2Vcbm11bHRpX2FnZW50ID0gZmFsc2VcbmltYWdlX2dlbmVyYXRpb24gPSBmYWxzZVxuYXBwcyA9IGZhbHNlXG5wbHVnaW5zID0gZmFsc2VcblxuW3Rvb2xzXVxudmlld19pbWFnZSA9IGZhbHNlXG5cbltza2lsbHNdXG5pbmNsdWRlX2luc3RydWN0aW9ucyA9IGZhbHNlXG5cbltza2lsbHMuYnVuZGxlZF1cbmVuYWJsZWQgPSBmYWxzZVxuYDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVUdXJuQWJvcnQ/OiBBY3RpdmVUdXJuQWJvcnQ7XG4gIGFjdGl2ZSA9IHRydWU7XG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkO1xuICAvLyByZXN0YXJ0IOyLnCBycGMg6rCd7LK06rCAIOyDiOuhnCDsg53shLHrkJjrr4DroZwsIO2VuOuTpOufrOulvCDrs7TqtIDtlojri6TqsIAg66ekIHNwYXdu66eI64ukIOyerOuwlOyduOuUqe2VnOuLpC5cbiAgc2VydmVyUmVxdWVzdEhhbmRsZXI/OiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvLyB0aHJlYWQg7J6s7IKs7JqpKHByb21wdCBjYWNoZSk6IHdvcmtlciDqsIAg7IOd7ISx7ZWcIHRocmVhZCDrk6TsnZgg66mU7YOALlxuICAvLyBlcGhlbWVyYWwgdGhyZWFkIOuKlCDsnbQg7ZSE66Gc7IS47IqkIOuplOuqqOumrOyXkOunjCDsobTsnqztlZjrr4DroZwgcmVzdGFydCDsi5wg7KCE67aAIOustO2aqC5cbiAgcHJpdmF0ZSB0aHJlYWRNZXRhID0gbmV3IE1hcDxzdHJpbmcsIHsgbGFzdFVzZWRBdDogbnVtYmVyIH0+KCk7XG4gIC8vIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDrp4jri6Qg7Kad6rCAIOKGkiBjb252IO2VuOuTpOydmCBlcG9jaCDsmYAg64yA7KGw7ZW0IHN0YWxlIHRocmVhZCDqsJDsp4AuXG4gIHByaXZhdGUgZXBvY2hDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEhSRUFEX0lETEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9USFJFQURTX1BFUl9XT1JLRVIgPSAxNjtcbiAgLy8g7J2066+47KeAIOqyjOydtO2KuCDqsoDspp3smqkg7LqQ7IucLiBzcGF3biDri6jsnITroZwg66y07Zqo7ZmUKHJlc3RhcnQg7IucIGNsZWFyKS5cbiAgLy8gY2FwYWJpbGl0eSDripQgcHJvdmlkZXIg64uo7JyEIGJvb2xlYW4sIOuqqOuNuCDrqYDti7Drqqjri6wg7Jes67aA64qUIG1vZGVsL2xpc3Qg66GcIO2ZleyduC5cbiAgcHJpdmF0ZSBjYWNoZWRDYXBhYmlsaXRpZXM/OiBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlO1xuICBwcml2YXRlIGNhY2hlZE1vZGVscz86IE1hcDxzdHJpbmcsIE1vZGVsPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gY29uZmlnLndvcmtlckluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7Y29uZmlnLndvcmtlckluZGV4fWAgOiBcIlwiO1xuICAgIHRoaXMuY29kZXhIb21lID0gam9pbih0bXBkaXIoKSwgXCJxZ3JpZC1jb2RleFwiLCBgJHtjb25maWcudG9rZW5JZH0ke3N1ZmZpeH1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIC8vIOyDiCDtlITroZzshLjsiqQg4oaSIGNhcGFiaWxpdHkvbW9kZWwg7LqQ7IucIOustO2aqCjroZzqt7jsnbgg6rOE7KCVL+uyhOyghOydtCDrsJTrgIzsl4jsnYQg7IiYIOyeiOydjCkuXG4gICAgdGhpcy5jYWNoZWRDYXBhYmlsaXRpZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYWNoZWRNb2RlbHMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gY29kZXgg64K07J6lIHRvb2wvd2ViX3NlYXJjaC9pbnN0cnVjdGlvbiDruJTroZ0g67mE7Zmc7ISx7ZmUXG4gICAgd3JpdGVGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vY29uZmlnLnRvbWxgLCBDT0RFWF9DT05GSUdfVE9NTCk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSxcbiAgICAgICAgLy8gZW52aXJvbm1lbnQg67mE7Zmc7ISx7ZmUIOKGkiBoYXNfZW52aXJvbm1lbnQ9ZmFsc2Ug4oaSIHNoZWxsL2FwcGx5X3BhdGNoL3ZpZXdfaW1hZ2Ug7KCc6rGwXG4gICAgICAgIENPREVYX0VYRUNfU0VSVkVSX1VSTDogXCJub25lXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKFxuICAgICAgICBuZXcgRXJyb3IoYGNvZGV4IHdvcmtlciBleGl0ZWQgd2hpbGUgdHVybiB3YXMgcnVubmluZyAoY29kZT0ke2NvZGUgPz8gXCJ1bmtub3duXCJ9KWApLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucnBjID0gbnVsbDtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ycGMgPSBuZXcgQ29kZXhScGNDbGllbnQodGhpcy5wcm9jKTtcbiAgICAvLyByZXN0YXJ0IO2bhOyXkOuPhCByZWZyZXNoIHNlcnZlci1yZXF1ZXN0IO2VuOuTpOufrOulvCDsnKDsp4AgKOyXhuycvOuptCBjb2RleCDthqDtgbAg7ZqM7KCEIOyLpO2MqCDihpIgc2Vzc2lvbiBleHBpcmVkKVxuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3Q8eyBhdXRoVXJsOiBzdHJpbmcgfT4oXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdFwiLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gc3RhcnRlZGApO1xuICAgIHJldHVybiByZXN1bHQuYXV0aFVybDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIGNvbXBsZXRlZGApO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1hbmFnZWRDcmVkZW50aWFscygpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9hdXRoLmpzb25gLCBcInV0Zi04XCIpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByYXcudG9rZW5zPy5hY2Nlc3NfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByYXcudG9rZW5zPy5yZWZyZXNoX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIGlkVG9rZW46IHJhdy50b2tlbnM/LmlkX3Rva2VuLFxuICAgICAgICBhY2NvdW50SWQ6IHJhdy50b2tlbnM/LmFjY291bnRfaWQgPz8gXCJcIixcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsQWN0aXZlVHVybihuZXcgRXJyb3IoXCJjb2RleCB3b3JrZXIgc3RvcHBlZFwiKSk7XG4gICAgdGhpcy5ycGM/LmRlc3Ryb3koKTtcblxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jPy5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDNfMDAwKTtcbiAgICAgICAgdGhpcy5wcm9jIS5vbihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBybVN5bmModGhpcy5jb2RleEhvbWUsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSAmJiAhdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgdG9rZW5JZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbklkO1xuICB9XG4gIGdldCB3b3JrZXJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwO1xuICB9XG4gIGdldCB0b2tlbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lO1xuICB9XG5cbiAgY2FuUmV1c2VGb3JUb2tlbihfdG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmFjY291bnRJZCA9PT0gY3JlZGVudGlhbHMuYWNjb3VudElkICYmXG4gICAgICAodGhpcy5jb25maWcucGxhblR5cGUgPz8gdW5kZWZpbmVkKSA9PT0gKGNyZWRlbnRpYWxzLnBsYW5UeXBlID8/IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVG9rZW5TdGF0ZSh0b2tlbk5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPSBjcmVkZW50aWFscy5hY2NvdW50SWQ7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnBsYW5UeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wbGFuVHlwZSA9IGNyZWRlbnRpYWxzLnBsYW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcucGxhblR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHMoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICByZXR1cm4gdGhpcy5ycGMucmVxdWVzdChcImFjY291bnQvcmF0ZUxpbWl0cy9yZWFkXCIsIHt9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbWFnZSBnZW5lcmF0aW9uIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIOydtOuvuOyngCB0b29sIOydgCBjb2RleCDsl5DshJwgKEF1dGhNb2RlOjpDaGF0Z3B0KSBBTkQgKGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSlcbiAgLy8gQU5EICjrqqjrjbgg66mA7Yuw66qo64usKSAz7KSRIOqyjOydtO2KuOuLpC4gcWdyaWQg64qUIE9BdXRoIOyghOyaqeydtOqzoCBmZWF0dXJlIOuKlCB0aHJlYWQg7JeQ7IScXG4gIC8vIOy8nOuvgOuhnCwgZGlzcGF0Y2hlciDqsIAg7IKs7KCEIOqygOymne2VoCDrgqjsnYAg7KGw6rG07J2AIGNhcGFiaWxpdHkocHJvdmlkZXIpICsg66qo6424IOupgO2LsOuqqOuLrOydtOuLpC5cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICBpZiAoIXRoaXMuY2FjaGVkQ2FwYWJpbGl0aWVzKSB7XG4gICAgICB0aGlzLmNhY2hlZENhcGFiaWxpdGllcyA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8TW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZT4oXG4gICAgICAgIFwibW9kZWxQcm92aWRlci9jYXBhYmlsaXRpZXMvcmVhZFwiLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZENhcGFiaWxpdGllcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1vZGVsPj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgaWYgKCF0aGlzLmNhY2hlZE1vZGVscykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxNb2RlbExpc3RSZXNwb25zZT4oXCJtb2RlbC9saXN0XCIsIHt9KTtcbiAgICAgIHRoaXMuY2FjaGVkTW9kZWxzID0gbmV3IE1hcChyZXMuZGF0YS5tYXAoKG0pID0+IFttLm1vZGVsLCBtXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRNb2RlbHM7XG4gIH1cblxuICAvLyDso7zslrTsp4Qg66qo6424KOuvuOyngOygleydtOuptCB0aHJlYWQg6riw67O4IOuqqOuNuCnroZwg7J2066+47KeAIOyDneyEseydtCDqsIDriqXtlZzsp4Ag6rKA7KadLlxuICAvLyDrtojqsIAg7IKs7Jyg66W8IOusuOyekOyXtOuhnCDrsJjtmZjtlZjqs6AsIOqwgOuKpe2VmOuptCBudWxsIOydhCDrsJjtmZjtlZzri6QuXG4gIGFzeW5jIGNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChtb2RlbD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybiBcIndvcmtlciBub3QgcmVhZHlcIjtcbiAgICBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2FkQ2FwYWJpbGl0aWVzKCk7XG4gICAgaWYgKCFjYXBzLmltYWdlR2VuZXJhdGlvbikgcmV0dXJuIFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBnZW5lcmF0aW9uXCI7XG4gICAgLy8g66qo6424IOupgO2LsOuqqOuLrCDqsoDspp0uIG1vZGVsIOuvuOyngOygleydtOuptCBwcm92aWRlciBjYXBhYmlsaXR5IOunjOycvOuhnCDthrXqs7zsi5ztgqTqs6AsXG4gICAgLy8g7Iuk7KCcIOyggeyaqSDrqqjrjbjsnZgg66mA7Yuw66qo64usIOyXrOu2gOuKlCB0dXJuIOyLpO2WiSDqsrDqs7wo7J2066+47KeAIDDqsJwg4oaSIFUzIOyLpO2MqCDrtoTrpZgp6rCAIOyeoeuKlOuLpC5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMubG9hZE1vZGVscygpO1xuICAgICAgY29uc3QgaW5mbyA9IG1vZGVscy5nZXQobW9kZWwpO1xuICAgICAgaWYgKGluZm8gJiYgIWluZm8uaW5wdXRNb2RhbGl0aWVzLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgcmV0dXJuIGBtb2RlbCAke21vZGVsfSBpcyBub3QgbXVsdGltb2RhbCAobm8gaW1hZ2UgaW5wdXQgbW9kYWxpdHkpYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAvLyDsnbTrr7jsp4Ag66qo65OcOiB0aHJlYWQg64uo7JyE66Gc66eMIGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDrpbwg7Lyg64ukLlxuICAgICAgLy8g7KCE7JetIGNvbmZpZy50b21sIOydgCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCjthY3siqTtirggdGhyZWFkIOydtOykkSDssKjri6gpLFxuICAgICAgLy8gZG90dGVkIENMSS3siqTtg4Dsnbwgb3ZlcnJpZGUg7YKk66GcIOydtCB0aHJlYWQg7JeQ7ISc66eMIO2ZnOyEse2ZlCjsi6TsuKEg7ZmV7J24KS5cbiAgICAgIC4uLihyZXEuaW1hZ2VHZW5lcmF0aW9uID8geyBcImZlYXR1cmVzLmltYWdlX2dlbmVyYXRpb25cIjogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgeyB0aHJlYWQsIG1vZGVsOiB0aHJlYWRNb2RlbCB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUaHJlYWRTdGFydFJlc3BvbnNlPihcbiAgICAgIFwidGhyZWFkL3N0YXJ0XCIsXG4gICAgICB7XG4gICAgICAgIGVwaGVtZXJhbDogdHJ1ZSxcbiAgICAgICAgY3dkOiBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYCxcbiAgICAgICAgYmFzZUluc3RydWN0aW9uczogcmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgICAgID8gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zKVxuICAgICAgICAgIDogQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLmRldmVsb3Blckluc3RydWN0aW9ucyA/PyBcIlwiLFxuICAgICAgICBzYW5kYm94OiBUSFJFQURfREVGQVVMVFMuc2FuZGJveCxcbiAgICAgICAgYXBwcm92YWxQb2xpY3k6IFRIUkVBRF9ERUZBVUxUUy5hcHByb3ZhbFBvbGljeSxcbiAgICAgICAgY29uZmlnOiB0aHJlYWRDb25maWcsXG4gICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPixcbiAgICApO1xuXG4gICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWQuaWQ7XG4gICAgaWYgKHJlcS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0aHJlYWQvaW5qZWN0X2l0ZW1zXCIsIHtcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIGl0ZW1zOiByZXEuaGlzdG9yeSxcbiAgICAgIH0gc2F0aXNmaWVzIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zKTtcbiAgICB9XG4gICAgLy8g7J2066+47KeAIHR1cm4g7J2AIOyerOyCrOyaqeyXkOyEnCDsoJzsmbgoUjgpOiBiYXNlNjQg6rCAIHRocmVhZCDrqZTrqqjrpqzCt+y6kOyLnCBwcmVmaXgg7JeQXG4gICAgLy8g7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nqs6AsIOydtOuvuOyngCB0aHJlYWQg66W8IDEg7ZqM7Jqp7Jy866GcIOuRlOuLpC4gdGhyZWFkTWV0YSDrr7jrk7HroZ0g4oaSXG4gICAgLy8g7ZuE7IaNIHJldXNlIOyhsO2ajOyXkOyEnCDsnbQgdGhyZWFkIOuKlCDtm4Trs7TqsIAg65CY7KeAIOyViuuKlOuLpC5cbiAgICBpZiAoIXJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMudGhyZWFkTWV0YS5zZXQodGhyZWFkSWQsIHsgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgcmV0dXJuIHsgLi4ucmVzdWx0LCB0aHJlYWRJZCB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm5TdHJlYW0oXG4gICAgcmVxOiBUdXJuUmVxdWVzdCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIGV4aXN0aW5nVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICBjb25zdCB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCk7XG4gICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYiwgdHRmdFRyYWNrZXIpO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICAoeyB0dXJuSWQgfSA9IGF3YWl0IHRoaXMuc3RhcnRUdXJuT25UaHJlYWQodGhyZWFkSWQsIHJlcSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNiLm9uVHVybklkPy4odHVybklkKTtcbiAgICBhd2FpdCByZXN1bHRQcm9taXNlO1xuICAgIHJldHVybiB7IHRocmVhZElkIH07XG4gIH1cblxuICAvLyDilIDilIAgdGhyZWFkIOyerOyCrOyaqSDsp4Dsm5Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IGVwb2NoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXBvY2hDb3VudGVyO1xuICB9XG5cbiAgaGFzVGhyZWFkKHRocmVhZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aHJlYWRNZXRhLmhhcyh0aHJlYWRJZCk7XG4gIH1cblxuICAvLyBpZGxlIFRUTCDstIjqs7wgLyDqsJzsiJgg7IOB7ZWcIOy0iOqzvCB0aHJlYWQg66W8IOygleumrC4gY3JlYXRlVGhyZWFkIOyngeyghCBsYXp5IO2YuOy2nC5cbiAgLy8gY29kZXggZXBoZW1lcmFsIHRocmVhZCDripQg66qF7Iuc7KCBIGNsb3NlIFJQQyDsl4bsnbQg66e17JeQ7IScIOygnOqxsCDihpIg642UIOydtOyDgSB0dXJuIOyViCDrs7Trg4QuXG4gIHN3ZWVwSWRsZVRocmVhZHMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbWV0YV0gb2YgdGhpcy50aHJlYWRNZXRhKSB7XG4gICAgICBpZiAobm93IC0gbWV0YS5sYXN0VXNlZEF0ID4gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuVEhSRUFEX0lETEVfVFRMX01TKSB7XG4gICAgICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjcmVhdGVUaHJlYWQg7KeB7KCEIO2YuOy2nCDihpIg7IOIIHRocmVhZCAxIOqwnOqwgCDqs6cg7LaU6rCA65Cc64ukLiDstpTqsIAg7ZuE7JeQ64+EIE1BWCDrpbwg64SY7KeAIOyViuuPhOuhnVxuICAgIC8vIE1BWC0xIOydtO2VmOuhnCDspITsl6wg65GU64ukKOq3uOuemOyVvCDsg53shLEg7KeB7ZuEIOygle2Zle2eiCBNQVgpLiBMUlU6IGxhc3RVc2VkQXQg7Jik66aE7LCo7Iic7Jy866GcIOygnOqxsC5cbiAgICBjb25zdCBsaW1pdCA9IENvZGV4QXBwU2VydmVyV29ya2VyLk1BWF9USFJFQURTX1BFUl9XT1JLRVIgLSAxO1xuICAgIGlmICh0aGlzLnRocmVhZE1ldGEuc2l6ZSA+IGxpbWl0KSB7XG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy50aHJlYWRNZXRhLmVudHJpZXMoKV0udG9Tb3J0ZWQoXG4gICAgICAgIChhLCBiKSA9PiBhWzFdLmxhc3RVc2VkQXQgLSBiWzFdLmxhc3RVc2VkQXQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3ZlciA9IHRoaXMudGhyZWFkTWV0YS5zaXplIC0gbGltaXQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG92ZXI7IGkrKykgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShzb3J0ZWRbaV0hWzBdKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwidHVybi9pbnRlcnJ1cHRcIiwgeyB0aHJlYWRJZCwgdHVybklkIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgZmFpbEFjdGl2ZVR1cm4oZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnQgPSB0aGlzLmFjdGl2ZVR1cm5BYm9ydDtcbiAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICBhYm9ydD8uKGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cEdlbmVyYXRlZEltYWdlcygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgcm1TeW5jKGAke3RoaXMuY29kZXhIb21lfS9nZW5lcmF0ZWRfaW1hZ2VzYCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVR1cm5Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCksXG4gICk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcbiAgICAgIGNvbnN0IGltYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBUdXJuSW1hZ2U+KCk7IC8vIGl0ZW0uaWQg4oaSIOydtOuvuOyngCAoZGVkdXApXG4gICAgICBsZXQgaW1hZ2VBdHRlbXB0ZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vc3RhcnRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhSZXN1bHQgPSAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGlmIChyZXN1bHQuaW1hZ2VBdHRlbXB0ZWQpIHRoaXMuY2xlYW51cEdlbmVyYXRlZEltYWdlcygpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIC8vIOydtOuvuOyngCB0b29sIO2YuOy2nCDqtIDsuKEo7J6s7Iuc64+EIO2MkOygleyaqSkuIHN0YXJ0ZWQg64qUIHJlc3VsdCDsl4bsnbQg7Jik66+A66GcXG4gICAgICAvLyBhdHRlbXB0ZWQg7Iug7Zi466Gc66eMIOyTsOqzoCwg7JmE7ISxIOydtOuvuOyngOuKlCBjb21wbGV0ZWQg7JeQ7IScIHJlc3VsdCDsnKDtmqjshLHsnLzroZwg7YyQ7KCV7ZWc64ukLlxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9zdGFydGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB7XG4gICAgICAgICAgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZEltYWdlUmVzdWx0KHAuaXRlbS5yZXN1bHQpKSB7XG4gICAgICAgICAgICBpbWFnZXMuc2V0KHAuaXRlbS5pZCwgeyBkYXRhOiBwLml0ZW0ucmVzdWx0LCByZXZpc2VkUHJvbXB0OiBwLml0ZW0ucmV2aXNlZFByb21wdCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgLy8gdGhyZWFkIOyerOyCrOyaqSDsi5wgLnRvdGFsIOydgCDrjIDtmZQg7KCE7LK0IOuIhOyggeydtOudvCwgY29sZCDsmIDrjZgg7J207KCEIHR1cm4g6rmM7KeAIOyEnuyXrFxuICAgICAgICAvLyDsnbQg7JqU7LKtIOyekOyytOydmCBjYWNoZSDsoIHspJHrpaDsnbQg7Z2s7ISd65Cc64ukKOyYiDogdHVybjEgY29sZCAwJSArIHR1cm4yIDkwJSDihpIgNDglIOuhnCDquLDroZ0pLlxuICAgICAgICAvLyAubGFzdCDripQg7J2067KIIHR1cm4g66eM7J2YIHVzYWdlIOudvCByZXF1ZXN0X2xvZyDqsIAg6re4IOyalOyyreydmCDsi6TsoJwg7Yag7YGw7J2EIOygle2Zle2eiCDrsJjsmIHtlZzri6QuXG4gICAgICAgIHVzYWdlID0gcC50b2tlblVzYWdlLmxhc3Q7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidHVybi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGR1cmF0aW9uTXMgPSBwLnR1cm4uZHVyYXRpb25NcyA/PyAwO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhSZXN1bHQoe1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMuc2l6ZSA+IDAgPyBbLi4uaW1hZ2VzLnZhbHVlcygpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGltYWdlQXR0ZW1wdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHR1cm4g7Iuk7YyoL+ykkeuLqCDsi5wg67aA67aEIOydtOuvuOyngOuKlCDtj5DquLAo7ISx6rO17Jy866GcIOyKueqyqe2VmOyngCDslYrsnYwpLlxuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBtb2RlbDogc3RyaW5nLFxuICAgIGNiOiBTdHJlYW1DYWxsYmFja3MsXG4gICAgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbWFnZXMgPSBuZXcgTWFwPHN0cmluZywgVHVybkltYWdlPigpOyAvLyBpdGVtLmlkIOKGkiDsnbTrr7jsp4AgKGRlZHVwKVxuICAgICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL3N0YXJ0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGNiLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aENvbXBsZXRlID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAocmVzdWx0LmltYWdlQXR0ZW1wdGVkKSB0aGlzLmNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTtcbiAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0dGZ0VHJhY2tlci5yZWNvcmRGaXJzdERlbHRhKCk7XG4gICAgICAgIHRleHQgKz0gcC5kZWx0YTtcbiAgICAgICAgY2Iub25EZWx0YShwLmRlbHRhKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL3N0YXJ0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJpbWFnZUdlbmVyYXRpb25cIikgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHtcbiAgICAgICAgICB0ZXh0ID0gcC5pdGVtLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIHtcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzQ29tcGxldGVkSW1hZ2VSZXN1bHQocC5pdGVtLnJlc3VsdCkpIHtcbiAgICAgICAgICAgIGltYWdlcy5zZXQocC5pdGVtLmlkLCB7IGRhdGE6IHAuaXRlbS5yZXN1bHQsIHJldmlzZWRQcm9tcHQ6IHAuaXRlbS5yZXZpc2VkUHJvbXB0IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgICBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLFxuICAgICAgICAgICAgdHRmdE1zOiB0dGZ0VHJhY2tlci52YWx1ZSgpLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBpbWFnZXM6IGltYWdlcy5zaXplID4gMCA/IFsuLi5pbWFnZXMudmFsdWVzKCldIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgdHVybiAke3AudHVybi5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXN0YXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZXN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCB0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgaWYgKHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IG1heCByZXN0YXJ0IGF0dGVtcHRzIHJlYWNoZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cysrO1xuICAgIGNvbnN0IGJhc2VEZWxheSA9IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TICogMiAqKiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgLSAxKTtcbiAgICBjb25zdCBzdGFnZ2VyID0gKHRoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDApICogMl8wMDA7XG4gICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKyBzdGFnZ2VyO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX1bJHt0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwfV0gcmVzdGFydGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5yZXN0YXJ0QXR0ZW1wdHN9KWAsXG4gICAgKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRpYWxpemUoKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm9uUmVhZHk/LigpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZXN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBRW5ELE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sMEJBQTBCO0FBdURoQyxNQUFNLGtCQUFrQjtDQUN0QixTQUFTO0NBQ1QsZ0JBQWdCO0NBQ2hCLFFBQVEsRUFDTixNQUFNLEVBQUUsVUFBVTtFQUFFLFNBQVM7RUFBTyxxQkFBcUI7RUFBTyxvQkFBb0I7RUFBTyxFQUFFLEVBQzlGO0NBQ0Y7QUFFRCxNQUFN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