sliftutils 1.7.50 → 1.7.51

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.
@@ -511,6 +511,7 @@ class ArchivesBackblaze {
511
511
  }
512
512
  // NOTE: Deletion SEEMS to work. This DOES break if we delete a file which keeps being recreated, ex, the heartbeat. let existsChecks = 10; while (existsChecks > 0) { let exists = await this.getInfo(fileName); if (!exists) break; await delay(1000); existsChecks--; } if (existsChecks === 0) { let exists = await this.getInfo(fileName); devDebugbreak(); console.warn(`File ${fileName} was deleted, but was still found afterwards`); exists = await this.getInfo(fileName); }
513
513
  }
514
+ // lastModified is accepted but cannot be honored - b2 stamps its own uploadTimestamp, which is what our getInfo/findInfo report as the write time
514
515
  async setLargeFile(config) {
515
516
  let onError = [];
516
517
  let time = Date.now();
@@ -817,5 +818,5 @@ exports.getArchivesBackblazePublic = (0, caching_1.cache)((domain) => {
817
818
  allowedOrigins: [`https://${domain}`, `https://127-0-0-1.${domain}:7007`],
818
819
  });
819
820
  });
820
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQXVKO0FBQ3ZKLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILCtLQUErSztBQUMvSyxTQUFTLHdCQUF3QixDQUFDLFFBQTJCO0lBQ3pELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUs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LE1BQU0sR0FBRyxvQkFBb0I7UUFDekMsU0FBUyxFQUFFLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDVSxRQUFBLG1DQUFtQyxHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDeEUsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQ3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsbUJBQW1CO1FBQ3hDLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLElBQUk7UUFDZixjQUFjLEVBQUUsQ0FBQyxXQUFXLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixNQUFNLE9BQU8sQ0FBQztLQUM1RSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQztBQUVILDJRQUEyUTtBQUM5UCxRQUFBLDBCQUEwQixHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDL0QsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQ3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUztRQUM5QixNQUFNLEVBQUUsSUFBSTtRQUNaLFNBQVMsRUFBRSxtQkFBWTtRQUN2QixjQUFjLEVBQUUsQ0FBQyxXQUFXLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixNQUFNLE9BQU8sQ0FBQztLQUM1RSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhY2hlLCBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgaXNOb2RlLCBzb3J0LCB0aW1lSW5Ib3VyLCB0aW1lSW5NaW51dGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgYmx1ZSwgZ3JlZW4sIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCBkbnMgZnJvbSBcImRuc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0IH0gZnJvbSBcIi4uL21pc2MvZ2V0U2VjcmV0XCI7XG5pbXBvcnQgeyBodHRwc1JlcXVlc3QsIEh0dHBzUmVzcG9uc2VJbmZvIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvaHR0cHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZXNDb25maWcsIENoYW5nZXNBZnRlckNvbmZpZywgQXJjaGl2ZUZpbGVJbmZvLCBTZXRDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbnR5cGUgQmFja2JsYXplQ3JlZHMgPSB7XG4gICAgYXBwbGljYXRpb25LZXlJZDogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uS2V5OiBzdHJpbmc7XG59O1xuXG5sZXQgYmFja2JsYXplQ3JlZHMgPSBsYXp5KGFzeW5jICgpOiBQcm9taXNlPEJhY2tibGF6ZUNyZWRzPiA9PiB7XG4gICAgbGV0IGtleUlkID0gYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICBsZXQga2V5ID0gYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXBwbGljYXRpb25LZXlJZDoga2V5SWQsXG4gICAgICAgIGFwcGxpY2F0aW9uS2V5OiBrZXksXG4gICAgfTtcbn0pO1xuLy8gQSBCMiBkb3dubG9hZC9IRUFEIHJlc3BvbnNlJ3MgaGVhZGVycyBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhLiBjb250ZW50LXJhbmdlJ3MgdG90YWwgd2lucyBvdmVyIGNvbnRlbnQtbGVuZ3RoIGZvciByYW5nZWQgcmVzcG9uc2VzICh3aGljaCBvbmx5IHJlcG9ydCB0aGUgc2xpY2UncyBsZW5ndGgpLlxuZnVuY3Rpb24gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyk6IHsgc2l6ZTogbnVtYmVyOyB1cGxvYWRUaW1lc3RhbXA6IG51bWJlciB9IHtcbiAgICBsZXQgc2l6ZSA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gfHwgMCk7XG4gICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgIGxldCB0b3RhbCA9IGNvbnRlbnRSYW5nZSAmJiBOdW1iZXIoY29udGVudFJhbmdlLnNwbGl0KFwiL1wiKVsxXSk7XG4gICAgaWYgKHRvdGFsICYmIE51bWJlci5pc0Zpbml0ZSh0b3RhbCkpIHtcbiAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgIH1cbiAgICByZXR1cm4geyBzaXplLCB1cGxvYWRUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wieC1iei11cGxvYWQtdGltZXN0YW1wXCJdIHx8IDApIH07XG59XG5cbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXQgc2VlbXMgdG8gd29yayB0aG91Z2guXG4gICAgICAgIHdoaWxlIChwYXRoLmluY2x1ZGVzKFwiLy9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoXCIvL1wiLCBcIi8lMkZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRGaWxlQnlOYW1lKGNvbmZpZzoge1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfTtcbiAgICAgICAgLy8gQ2FwdHVyZXMgdGhlIHJlc3BvbnNlIGhlYWRlcnMsIHdoaWNoIGNhcnJ5IHRoZSBmaWxlJ3MgbWV0YWRhdGEgKHgtYnotdXBsb2FkLXRpbWVzdGFtcCwgY29udGVudC1sZW5ndGggLyBjb250ZW50LXJhbmdlKSAtIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGl0IGRvbid0IHBheSBhIHNlY29uZCBBUEkgY2FsbFxuICAgICAgICBvdXRSZXNwb25zZT86IEh0dHBzUmVzcG9uc2VJbmZvO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIH0pKSwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFJhbmdlOiBjb25maWcucmFuZ2UgPyBgYnl0ZXM9JHtjb25maWcucmFuZ2Uuc3RhcnR9LSR7Y29uZmlnLnJhbmdlLmVuZCAtIDF9YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHhbMV0gIT09IHVuZGVmaW5lZCkpLFxuICAgICAgICAgICAgb3V0UmVzcG9uc2U6IGNvbmZpZy5vdXRSZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSdzIG1ldGFkYXRhIGJ5IG5hbWUsIHdpdGhvdXQgdGhlIGJvZHk6IEhFQUQgb24gdGhlIGRvd25sb2FkIFVSTCwgd2hpY2ggaXMgYSBjbGFzcyBCIChkb3dubG9hZC1wcmljZWQpIHRyYW5zYWN0aW9uIC0gYjJfbGlzdF9maWxlX25hbWVzIGlzIGNsYXNzIEMgYXQgMTB4IHRoZSBwcmljZSwgYW5kIGIyX2dldF9maWxlX2luZm8gbmVlZHMgYSBmaWxlSWQgd2UgZG9uJ3QgaGF2ZS4gUmV0dXJucyB1bmRlZmluZWQgZm9yIG1pc3NpbmcgKG9yIGhpZGRlbikgZmlsZXMuICovXG4gICAgYXN5bmMgZnVuY3Rpb24gaGVhZEZpbGVCeU5hbWUoY29uZmlnOiB7IGJ1Y2tldE5hbWU6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTx7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZmlsZU5hbWUgPSBlbmNvZGVQYXRoKGNvbmZpZy5maWxlTmFtZSk7XG4gICAgICAgIGxldCByZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8gPSB7IGhlYWRlcnM6IHt9IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCB1bmRlZmluZWQsIFwiSEVBRFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuIH0sXG4gICAgICAgICAgICAgICAgb3V0UmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBIRUFEIHJlc3BvbnNlcyBoYXZlIG5vIGJvZHksIHNvIHRoZSBleHBpcmVkX2F1dGhfdG9rZW4gbWFya2VyIGFwaVJldHJ5TG9naWMgbWF0Y2hlcyBvbiBuZXZlciBhcHBlYXJzIC0gcmUtYWRkIGl0IHNvIGFuIGV4cGlyZWQgdG9rZW4gc3RpbGwgcmVmcmVzaGVzIGFuZCByZXRyaWVzXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImV4cGlyZWRfYXV0aF90b2tlblwiIEhFQUQgJHtjb25maWcuYnVja2V0TmFtZX0vJHtjb25maWcuZmlsZU5hbWV9IGdvdCBhIDQwMTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gT2guLi4gYXBwYXJlbnRseSwgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/IEh1aC4uLlxuICAgIGNvbnN0IGdldFVwbG9hZFVSTCA9IChhc3luYyAoYnVja2V0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IGdldFVwbG9hZFVSTC5jbGVhcihidWNrZXRJZCksIHRpbWVJbkhvdXIgKiAxKTtcbiAgICAgICAgbGV0IGdldFVwbG9hZFVybFJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL2IyX2dldF91cGxvYWRfdXJsP2J1Y2tldElkPVwiICsgYnVja2V0SWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFVwbG9hZFVybFJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB9KSB7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmwgPSBhd2FpdCBnZXRVcGxvYWRVUkwoY29uZmlnLmJ1Y2tldElkKTtcblxuICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoZ2V0VXBsb2FkVXJsLnVwbG9hZFVybCwgY29uZmlnLmRhdGEsIFwiUE9TVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBnZXRVcGxvYWRVcmwuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1GaWxlLU5hbWVcIjogZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBcImRvX25vdF92ZXJpZnlcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGVGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfaGlkZV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgZ2V0RmlsZUluZm8gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX2dldF9maWxlX2luZm9cIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBsaXN0RmlsZU5hbWVzID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgICAgICBzdGFydEZpbGVOYW1lPzogc3RyaW5nO1xuICAgICAgICBtYXhGaWxlQ291bnQ/OiBudW1iZXI7XG4gICAgICAgIGRlbGltaXRlcj86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVJbmZvOiB7XG4gICAgICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgICAgICBuZXh0RmlsZU5hbWU6IHN0cmluZztcbiAgICB9PihcImIyX2xpc3RfZmlsZV9uYW1lc1wiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNvcHlGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIHNvdXJjZUZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY29weV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfc3RhcnRfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIC8vIEFwcGFyZW50bHkgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/XG4gICAgY29uc3QgZ2V0VXBsb2FkUGFydFVSTCA9IChhc3luYyAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnRSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3BhcnRfdXJsP2ZpbGVJZD1cIiArIGZpbGVJZCwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHVwbG9hZFBhcnRSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgICAgICB1cGxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFBhcnQoY29uZmlnOiB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICAgICAgc2hhMTogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnROdW1iZXI6IG51bWJlcjtcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnQgPSBhd2FpdCBnZXRVcGxvYWRQYXJ0VVJMKGNvbmZpZy5maWxlSWQpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXBsb2FkUGFydC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogdXBsb2FkUGFydC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgXCJYLUJ6LVBhcnQtTnVtYmVyXCI6IGNvbmZpZy5wYXJ0TnVtYmVyICsgXCJcIixcbiAgICAgICAgICAgICAgICBcIlgtQnotQ29udGVudC1TaGExXCI6IGNvbmZpZy5zaGExLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogY29uZmlnLmRhdGEubGVuZ3RoICsgXCJcIixcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydFNoYTFBcnJheTogc3RyaW5nW107XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IGFueTtcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9maW5pc2hfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNhbmNlbExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7fT4oXCJiMl9jYW5jZWxfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldERvd25sb2FkQXV0aG9yaXphdGlvbiA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PihcImIyX2dldF9kb3dubG9hZF9hdXRob3JpemF0aW9uXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0RG93bmxvYWRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aC5kb3dubG9hZFVybCArIHBhdGg7XG4gICAgfVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGVCdWNrZXQsXG4gICAgICAgIHVwZGF0ZUJ1Y2tldCxcbiAgICAgICAgbGlzdEJ1Y2tldHMsXG4gICAgICAgIGRvd25sb2FkRmlsZUJ5TmFtZSxcbiAgICAgICAgaGVhZEZpbGVCeU5hbWUsXG4gICAgICAgIHVwbG9hZEZpbGUsXG4gICAgICAgIGhpZGVGaWxlLFxuICAgICAgICBnZXRGaWxlSW5mbyxcbiAgICAgICAgbGlzdEZpbGVOYW1lcyxcbiAgICAgICAgY29weUZpbGUsXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlLFxuICAgICAgICB1cGxvYWRQYXJ0LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGUsXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZSxcbiAgICAgICAgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uLFxuICAgICAgICBnZXREb3dubG9hZFVSTCxcbiAgICAgICAgYXBpVXJsOiBhdXRoLmFwaVVybCxcbiAgICAgICAgYWxsb3dlZDogYXV0aC5hbGxvd2VkLFxuICAgIH07XG59KTtcblxudHlwZSBCMkFwaSA9ICh0eXBlb2YgZ2V0QVBJKSBleHRlbmRzICgpID0+IFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQmFja2JsYXplIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgICAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgICAgICBjYWNoZVRpbWU/OiBudW1iZXI7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gICAgfSkge1xuICAgICAgICAvLyBHZXQgdGhlIGFwaSwgdG8gc2V0dXAgY29yc1xuICAgICAgICB2b2lkIHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWNrZXROYW1lID0gdGhpcy5jb25maWcuYnVja2V0TmFtZS5yZXBsYWNlQWxsKC9bXlxcd1xcZF0vZywgXCItXCIpO1xuICAgIHByaXZhdGUgYnVja2V0SWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKSB7XG4gICAgICAgIHRoaXMubG9nZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgbG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2luZykgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJiYWNrYmxhemUgXCIgKyB0aGlzLmNvbmZpZy5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnVja2V0QVBJID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhcGkgPSBhd2FpdCBnZXRBUEkoKTtcblxuICAgICAgICBsZXQgY2FjaGVUaW1lID0gdGhpcy5jb25maWcuY2FjaGVUaW1lID8/IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGNhY2hlVGltZSA9IElNTVVUQUJMRV9DQUNIRV9USU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUxXQVlTIHNldCBhY2Nlc3MgY29udHJvbCwgYXMgd2UgY2FuIG1ha2UgdXJscyBmb3IgcHJpdmF0ZSBidWNrZXRzIHdpdGggZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uXG4gICAgICAgIGxldCBkZXNpcmVkQ29yc1J1bGVzID0gW3tcbiAgICAgICAgICAgIGNvcnNSdWxlTmFtZTogXCJhbGxvd0FsbFwiLFxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHRoaXMuY29uZmlnLmFsbG93ZWRPcmlnaW5zID8/IFtcImh0dHBzXCJdLFxuICAgICAgICAgICAgYWxsb3dlZE9wZXJhdGlvbnM6IFtcImIyX2Rvd25sb2FkX2ZpbGVfYnlfaWRcIiwgXCJiMl9kb3dubG9hZF9maWxlX2J5X25hbWVcIl0sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyczogW1wicmFuZ2VcIl0sXG4gICAgICAgICAgICBleHBvc2VIZWFkZXJzOiBbXCJ4LWJ6LWNvbnRlbnQtc2hhMVwiXSxcbiAgICAgICAgICAgIC8vIDYwIGlzIHRoZSBhYnNvbHV0ZSBtaW5pbXVtLiBJZiB3ZSB0cnkgdG8gc2V0IGEgdmFsdWUgbG93ZXIgdGhhbiB0aGlzLCBpdCdsbCBiZSB1cGRhdGVkIHRvIGJlIDYwLiBcbiAgICAgICAgICAgIG1heEFnZVNlY29uZHM6IE1hdGgubWF4KDYwLCBjYWNoZVRpbWUgLyAxMDAwKSxcbiAgICAgICAgfV07XG4gICAgICAgIGxldCBidWNrZXRJbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBpZiAoY2FjaGVUaW1lKSB7XG4gICAgICAgICAgICBidWNrZXRJbmZvW1wiY2FjaGUtY29udHJvbFwiXSA9IGBtYXgtYWdlPSR7Y2FjaGVUaW1lIC8gMTAwMH1gO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgZXhpc3RzID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVzID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNyZWF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogdGhpcy5jb25maWcucHVibGljID8gXCJhbGxQdWJsaWNcIiA6IFwiYWxsUHJpdmF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF5c0Zyb21VcGxvYWRpbmdUb0hpZGluZ1wiOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCBmaWxlcyBmb3IgNyBkYXlzLCB3aGljaCBzaG91bGQgYmUgZW5vdWdoIHRpbWUgdG8gcmVjb3ZlciBhY2NpZGVudGFsIGhpZGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF5c0Zyb21IaWRpbmdUb0RlbGV0aW5nXCI6IDcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpbGVOYW1lUHJlZml4XCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mb1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlLnN0YWNrLmluY2x1ZGVzKGBcImR1cGxpY2F0ZV9idWNrZXRfbmFtZVwiYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPCAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrYmxhemUgY3JlYXRlIGJ1Y2tldCBmYWlsZWQsIHJldHJ5aW5nIGluIDVzOiAke2Uuc3RhY2t9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSg1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidWNrZXRMaXN0ID0gYXdhaXQgYXBpLmxpc3RCdWNrZXRzKHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChidWNrZXRMaXN0LmJ1Y2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCBuYW1lIFwiJHt0aGlzLmJ1Y2tldE5hbWV9XCIgaXMgYmVpbmcgdXNlZCBieSBzb21lb25lIGVsc2UuIEJ1Y2tldCBuYW1lcyBoYXZlIHRvIGJlIGdsb2JhbGx5IHVuaXF1ZS4gVHJ5IGEgZGlmZmVyZW50IG5hbWUgdW50aWwgeW91IGZpbmQgYSBmcmVlIG9uZS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Y2tldElkID0gYnVja2V0TGlzdC5idWNrZXRzWzBdLmJ1Y2tldElkO1xuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgIGxldCBidWNrZXQgPSBidWNrZXRMaXN0LmJ1Y2tldHNbMF07XG4gICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIGxldCBrdnBzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICAgICAgICAgICAgICBzb3J0KGt2cHMsIHggPT4geFswXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhrdnBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbChsaHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShsaHMpKSA9PT0gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKHJocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb3JkZXJJbmRlcGVuZGVudEVxdWFsQXJyYXkobGhzOiB1bmtub3duW10sIHJoczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxocy5sZW5ndGggIT09IHJocy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVySW5kZXBlbmRlbnRFcXVhbChsaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJoc1tpXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIW9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGJ1Y2tldC5jb3JzUnVsZXMsIGRlc2lyZWRDb3JzUnVsZXMpXG4gICAgICAgICAgICAgICAgfHwgIW9yZGVySW5kZXBlbmRlbnRFcXVhbChidWNrZXQuYnVja2V0SW5mbywgYnVja2V0SW5mbylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYFVwZGF0aW5nIENPUlMgcnVsZXMgZm9yICR7dGhpcy5idWNrZXROYW1lfWApLCBidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkudXBkYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiBidWNrZXQuYWNjb3VudElkLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogYnVja2V0LmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRUeXBlOiBidWNrZXQuYnVja2V0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGJ1Y2tldC5saWZlY3ljbGVSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgY29yc1J1bGVzOiBkZXNpcmVkQ29yc1J1bGVzLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmZvOiBidWNrZXRJbmZvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRSZXNldDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hlbiB3ZSBsYXN0IHJlc2V0IGJlY2F1c2Ugb2YgYSA1MDNcbiAgICBwcml2YXRlIGxhc3Q1MDNSZXNldCA9IDA7XG4gICAgLy8gSU1QT1JUQU5UISBXZSBtdXN0IGFsd2F5cyBDQVRDSCBBUk9VTkQgdGhlIGFwaVJldHJ5TG9naWMsIE5FVkVSIGluc2lkZSBvZiBmbmMuIE90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlY3JlYXRlIHRoZSBhdXRoIHRva2VuLiBgY29udGV4dGAgaXMgYSBzaG9ydCBsYWJlbCAodmVyYiArIGZpbGUgcGF0aCkgaW5jbHVkZWQgaW4gZXZlcnkgcmV0cnkvZXJyb3IgbG9nIHNvIGEgc3R1Y2sgc2lsZW50LXJldHJ5IGxvb3AgaXMgaWRlbnRpZmlhYmxlIGZyb20gdGhlIGxvZ3MuXG4gICAgcHJpdmF0ZSBhc3luYyBhcGlSZXRyeUxvZ2ljPFQ+KFxuICAgICAgICBjb250ZXh0OiBzdHJpbmcsXG4gICAgICAgIGZuYzogKGFwaTogQjJBcGkpID0+IFByb21pc2U8VD4sXG4gICAgICAgIHJldHJpZXMgPSAzXG4gICAgKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBhcGk6IEIyQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXBpID0gYXdhaXQgdGhpcy5nZXRCdWNrZXRBUEkoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoYXBpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXRyaWVzIDw9IDApIHRocm93IGVycjtcblxuICAgICAgICAgICAgLy8gSWYgaXQncyBhIDUwMyBhbmQgaXQncyBiZWVuIGEgbWludXRlIHNpbmNlIHdlIGxhc3QgcmVzZXQsIHRoZW4gV2FpdCBhbmQgcmVzZXQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyci5zdGFjay5pbmNsdWRlcyhgXCJzdGF0dXNcIjogNTAzYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcInNlcnZpY2VfdW5hdmFpbGFibGVcImApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgXCJpbnRlcm5hbF9lcnJvclwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFTk9CVUZTYClcbiAgICAgICAgICAgICAgICApICYmIERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBpcyBzbyBmbGFreSB0aGF0IHdlJ3JlIGp1c3QgZ29pbmcgdG8gd2FybiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7Y29udGV4dH1dIEJhY2tibGF6ZSBlcnJvciwgd2FpdGluZyBhbmQgcmVzZXR0aW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVzZXQgPSB0aGlzLmN1cnJlbnRSZXNldCB8fCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBjaGVjayBhZ2FpbiBpbiBjYXNlLCBhbmQgaW4gdGhlIHZlcnkgbGlrZWx5IGNhc2UgdGhhdCB0aGlzIGlzIGJlaW5nIHJ1biBpbiBwYXJhbGxlbCwgd2Ugb25seSB3YW50IHRvIHJlc2V0IG9uY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0NTAzUmVzZXQgPiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gUmVzZXR0aW5nIGdldEFQSSBhbmQgZ2V0QnVja2V0QVBJOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0NTAzUmVzZXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEJ1Y2tldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkoKS5maW5hbGx5KCgpID0+IHRoaXMuY3VycmVudFJlc2V0ID0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRSZXNldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiB0b2tlbiBpcyBpbnZhbGlkLCByZXNldCBnZXRCdWNrZXRBUEkgYW5kIGdldEFQSSBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYnVja2V0IGlzbid0IGZvdW5kLCByZXNldCBnZXRCdWNrZXRBUElcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYFwiZXhwaXJlZF9hdXRoX3Rva2VuXCJgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQXV0aG9yaXphdGlvbiB0b2tlbiBleHBpcmVkYCk7XG4gICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyLnN0YWNrLmluY2x1ZGVzKGBubyB0b21lcyBhdmFpbGFibGVgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRVRJTUVET1VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYHNvY2tldCBoYW5nIHVwYClcbiAgICAgICAgICAgICAgICAvLyBFaC4uLiB0aGlzIG1pZ2h0IGJlIGJhZCwgYnV0Li4uIEkgdGhpbmsgd2UganVzdCBnZXQgcmFuZG9tIDQwMCBlcnJvcnMuIElmIHRoaXMgc3BhbXMgZXJyb3JzLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgbGluZS5cbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYDQwMCBCYWQgUmVxdWVzdGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRVNFVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFRlVTRURgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBSZXRyeWluZyBpbiA1czogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dICR7ZXJyLm1lc3NhZ2V9IHJldHJ5aW5nIGluIDVzYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxPYmogPSBuZXcgVVJMKGFwaS5hcGlVcmwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdG5hbWUgPSB1cmxPYmouaG9zdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29rdXBBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5sb29rdXAoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5yZXNvbHZlNChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbJHtjb250ZXh0fV0gZ2V0YWRkcmluZm8gRU5PVEZPVU5EICR7aG9zdG5hbWV9YCwgeyBsb29rdXBBZGRyZXNzZXMsIHJlc29sdmVBZGRyZXNzZXMsIGFwaVVybDogYXBpLmFwaVVybCwgZnVsbEVycm9yOiBlcnIuc3RhY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9OyByZXRyeUNvdW50PzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRQb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZG93bmxvYWRpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGRvd25sb2FkIGluIHByb2dyZXNzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldCAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0+ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2xhbXAgbmVlZHMgdGhlIGZpbGUncyBzaXplIChhbmQgZ2l2ZXMgdXMgaXRzIG1ldGFkYXRhIGZvciBmcmVlKVxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVJbmZvKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZUVuZCA9IE1hdGgubWluKHJhbmdlLmVuZCwgZmlsZUluZm8uc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEkgdGhpbmsgaWYgd2UgcmVxdWVzdCBub3RoaW5nLCBpdCBjb25mdXNlcyBCYWNrYmxhemUgYW5kIGVuZHMgdXAgZ2l2aW5nIHVzIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlRW5kIDw9IHJhbmdlU3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBmaWxlSW5mby53cml0ZVRpbWUsIHNpemU6IGZpbGVJbmZvLnNpemUgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IHJhbmdlU3RhcnQsIGVuZDogcmFuZ2VFbmQgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gcmFuZ2VFbmQgLSByYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrYmxhemUgcmFuZ2UgZG93bmxvYWQgcmV0dXJuZWQgdGhlIHdyb25nIG51bWJlciBvZiBieXRlcy4gVHJpZWQgdG8gZ2V0ICR7cmFuZ2VTdGFydH0tJHtyYW5nZUVuZH0sIGJ1dCByZWNlaXZlZCAke3JhbmdlU3RhcnR9LSR7cmFuZ2VTdGFydCArIGRhdGEubGVuZ3RofS4gRm9yIGZpbGU6ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBmaWxlSW5mby53cml0ZVRpbWUsIHNpemU6IGZpbGVJbmZvLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRvd25sb2FkJ3Mgb3duIHJlc3BvbnNlIGhlYWRlcnMgY2FycnkgdGhlIG1ldGFkYXRhLCBzbyBhIGZ1bGwgcmVhZCBpcyBhIHNpbmdsZSBBUEkgY2FsbFxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8gPSB7IGhlYWRlcnM6IHt9IH07XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0UmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBtZXRhID0gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IG1ldGEudXBsb2FkVGltZXN0YW1wLCBzaXplOiBkYXRhLmxlbmd0aCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIocmVzdWx0LmRhdGEubGVuZ3RoIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZG93bmxvYWQgKCR7Zm9ybWF0TnVtYmVyKHJlc3VsdC5kYXRhLmxlbmd0aCl9QiR7Y29uZmlnPy5yYW5nZSAmJiBgLCAke2Zvcm1hdE51bWJlcihjb25maWcucmFuZ2Uuc3RhcnQpfSAtICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5lbmQpfWAgfHwgXCJcIn0pIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0sICR7ZmlsZU5hbWV9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBmaWxlIGRvZXMgbm90IGV4aXN0ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG4gICAgICAgICAgICAvLyBCMiB2MiBkb2N1bWVudHMgYWxsb3dlZCBhcyBhIHNpbmdsZSBvYmplY3Q7IG91ciB0eXBlIHNheXMgYSBsaXN0IC0gaGFuZGxlIGJvdGhcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUmF3ID0gYXBpLmFsbG93ZWQgYXMgdW5rbm93bjtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkTGlzdCA9IChBcnJheS5pc0FycmF5KGFsbG93ZWRSYXcpICYmIGFsbG93ZWRSYXcgfHwgW2FsbG93ZWRSYXddKSBhcyB0eXBlb2YgYXBpLmFsbG93ZWQ7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZExpc3Quc29tZShhbGxvd2VkID0+XG4gICAgICAgICAgICAgICAgYWxsb3dlZC5jYXBhYmlsaXRpZXMuaW5jbHVkZXMoXCJ3cml0ZUZpbGVzXCIpXG4gICAgICAgICAgICAgICAgJiYgKCFhbGxvd2VkLmJ1Y2tldE5hbWUgfHwgYWxsb3dlZC5idWNrZXROYW1lID09PSB0aGlzLmJ1Y2tldE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBObyAvIGludmFsaWQgY3JlZGVudGlhbHNcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgaGFzV3JpdGVBY2Nlc3MgY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSAmJiAhY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtmaWxlTmFtZX0gdG8gJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5ub0NoZWNrcykge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93biB1cGxvYWQgdGltZSwgc28gdGhlIGV4YWN0IGxhc3RNb2RpZmllZCBpcyBub3QgcHJlc2VydmVkIG9uIHRoZSBzdG9yZWQgZmlsZS5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLndyaXRlVGltZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhIHN5bmNocm9uaXphdGlvbiBwdXNoIG5ldmVyIG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgcGF0aCBvbiBhbiBpbW11dGFibGUgYnVja2V0IChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUgJiYgdGhpcy5jb25maWcuaW1tdXRhYmxlKSByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSB1cGxvYWQgKCR7Zm9ybWF0TnVtYmVyKGRhdGEubGVuZ3RoKX1CKSAke2ZpbGVOYW1lfWApO1xuICAgICAgICBsZXQgZiA9IGZpbGVOYW1lO1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZEZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZSwgZGF0YTogZGF0YSwgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNvbmZpZz8ubm9DaGVja3MpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHNDaGVja3MgPSAzMDtcbiAgICAgICAgICAgIHdoaWxlIChleGlzdHNDaGVja3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgICAgICAgICAgICAgZXhpc3RzQ2hlY2tzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhpc3RzQ2hlY2tzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9LyR7Zn0gd2FzIHVwbG9hZGVkLCBidXQgY291bGQgbm90IGJlIGZvdW5kIGFmdGVyd2FyZHMuIEhvcGVmdWxseSBpdCB3YXMganVzdCBkZWxldGVkLCB2ZXJ5IHF1aWNrbHk/IElmIGJhY2tibGF6ZSBpcyB0YWtpbmcgdG9vIGxvbmcgZm9yIGZpbGVzIHRvIHByb3BhZ2F0ZSwgdGhlbiB3ZSBtaWdodCBydW4gaW50byBpc3N1ZXMgd2l0aCB0aGUgZGF0YWJhc2UgYXRvbWljaXR5LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZGVsZXRlICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGhpZGVGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5oaWRlRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZTogZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGVycm9yIGluIGhpZGUsIHBvc3NpYmx5IGFscmVhZHkgaGlkZGVuICR7ZmlsZU5hbWV9XFxuJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRGVsZXRpb24gU0VFTVMgdG8gd29yay4gVGhpcyBET0VTIGJyZWFrIGlmIHdlIGRlbGV0ZSBhIGZpbGUgd2hpY2gga2VlcHMgYmVpbmcgcmVjcmVhdGVkLCBleCwgdGhlIGhlYXJ0YmVhdC4gbGV0IGV4aXN0c0NoZWNrcyA9IDEwOyB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgaWYgKCFleGlzdHMpIGJyZWFrOyBhd2FpdCBkZWxheSgxMDAwKTsgZXhpc3RzQ2hlY2tzLS07IH0gaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgZGV2RGVidWdicmVhaygpOyBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0gd2FzIGRlbGV0ZWQsIGJ1dCB3YXMgc3RpbGwgZm91bmQgYWZ0ZXJ3YXJkc2ApOyBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpOyB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD47IH0pOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgICAgICBsZXQgb25FcnJvcjogKCgpID0+IFByb21pc2U8dm9pZD4pW10gPSBbXTtcbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHsgcGF0aCB9ID0gY29uZmlnO1xuICAgICAgICAgICAgLy8gQmFja2JsYXplIHJlcXVpcmVzIDVNQiBjaHVua3MuIEJ1dCwgbGFyZ2VyIGlzIG1vcmUgZWZmaWNpZW50IGZvciB1cy5cbiAgICAgICAgICAgIGNvbnN0IE1JTl9DSFVOS19TSVpFID0gMzIgKiAxMDI0ICogMTAyNDtcbiAgICAgICAgICAgIGxldCBkYXRhUXVldWU6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhUXVldWUubGVuZ3RoKSByZXR1cm4gZGF0YVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGJ1ZmZlcnMgdW50aWwgd2UgZ2V0IDVNQiwgT1IsIGVuZC4gQmFja2JsYXplIHJlcXVpcmVzIHRoaXMgZm9yIGxhcmdlIGZpbGVzLlxuICAgICAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyczogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodG90YWxCeXRlcyA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFidWZmZXJzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gcGF0aDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgIGlmICghZGF0YT8ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIG92ZXJseSBzbWFsbCBmaWxlc1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQmFja2JsYXplIGRpc2FsbG93cyBsZXNzIHRoYW4gMiBjaHVua3NcbiAgICAgICAgICAgIGxldCBzZWNvbmREYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgIGlmICghc2Vjb25kRGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFMU08sIGlmIHRoZXJlIGFyZSB0d28gY2h1bmtzLCBidXQgb25lIGlzIHRvbyBzbWFsbCwgY29tYmluZSBpdC4gVGhpcyBoZWxwcyBhbGxvdyB1cyBuZXZlciBzZW5kIHNtYWxsIGNodW5rcy5cbiAgICAgICAgICAgIGlmIChzZWNvbmREYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIEJ1ZmZlci5jb25jYXQoW2RhdGEsIHNlY29uZERhdGFdKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICBkYXRhUXVldWUudW5zaGlmdChkYXRhLCBzZWNvbmREYXRhKTtcblxuXG4gICAgICAgICAgICBsZXQgdXBsb2FkSW5mbyA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgc3RhcnRMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5zdGFydExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mbzoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uRXJyb3IucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBjYW5jZWxMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jYW5jZWxMYXJnZUZpbGUoeyBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IExPR19JTlRFUlZBTCA9IHRpbWVJbk1pbnV0ZTtcbiAgICAgICAgICAgIGxldCBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG5cbiAgICAgICAgICAgIGxldCBwYXJ0TnVtYmVyID0gMTtcbiAgICAgICAgICAgIGxldCBwYXJ0U2hhMUFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vIFNvLi4uIGlmIHRoZSBuZXh0IGNodW5rIGlzIHRoZSBsYXN0IG9uZSwgY29tYmluZSBpdCB3aXRoIHRoZSBjdXJyZW50IG9uZS4gVGhpcyBwcmV2ZW50cyBBTlkgdXBsb2FkcyBmcm9tIGJlaW5nIDwgdGhlIHRocmVzaG9sZCwgYXMgYXBwYXJlbnRseSB0aGUgXCJsYXN0IHBhcnRcIiBjaGVjayBpbiBiYWNrYmxhemUgZmFpbHMgd2hlbiB3ZSBoYXZlIHRvIHJldHJ5IGFuIHVwbG9hZCAoZHVlIHRvIFwibm8gdG9tZXMgYXZhaWxhYmxlXCIpLiBXZWxsIGl0IGNhbid0IGZhaWwgaWYgZXZlbiB0aGUgbGFzdCBwYXJ0IGlzID4gNU1CLCBub3cgY2FuIGl0ISBCVVQsIG9ubHkgaWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgY2h1bmssIG90aGVyd2lzZSB3ZSBtaWdodCB0cnkgdG8gc2VuZCBhIHNpbmdsZSBjaHVuaywgd2hpY2ggd2UgY2FuJ3QgZG8uXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRTaGExQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF5YmVMYXN0RGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIGxhc3Qgb25lLCBzbyBjb25zdW1lIGl0IG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBtYXliZUxhc3REYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHRoZSBsYXN0IG9uZS4gUHV0IGl0IGJhY2ssIGluIGNhc2UgdGhlIG9uZSBBRlRFUiBpcyB0aGUgbGFzdCBvbmUsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBtZXJnZSBtYXliZUxhc3REYXRhIHdpdGggdGhlIG5leHQgbmV4dCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KG1heWJlTGFzdERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaGExID0gcmVxdWlyZShcImNyeXB0b1wiKS5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICAgICAgICAgICAgICBzaGExLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hhMUhleCA9IHNoYTEuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXkucHVzaChzaGExSGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZFBhcnQjJHtwYXJ0TnVtYmVyfSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlLCBkYXRhIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlIHBhcnQgJHtwYXJ0TnVtYmVyfSwgdXBsb2FkZWQgJHtibHVlKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSArIFwiQlwiKX0gaW4gJHtibHVlKHRpbWVTdHIpfSAoJHtibHVlKHJhdGVTdHIpfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZFBhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhMTogc2hhMUhleCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFydE51bWJlcisrO1xuXG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBuZXh0TG9nVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RpbGwgdXBsb2FkaW5nIGxhcmdlIGZpbGUgYXQgJHtEYXRlLm5vdygpfS4gVXBsb2FkZWQgJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgRmluaXNoZWQgdXBsb2FkaW5nIGxhcmdlIGZpbGUgdXBsb2FkZWQgJHtncmVlbihmb3JtYXROdW1iZXIodG90YWxCeXRlcykpfUJgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5pc2hMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmZpbmlzaExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXk6IHBhcnRTaGExQXJyYXksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIG9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBkdXJpbmcgZXJyb3IgY2xlYW4uIElnbm9yaW5nLCB3ZSB3aWxsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBwYXRoICR7Y29uZmlnLnBhdGh9YCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIHNldExhcmdlRmlsZSBmb3IgJHtjb25maWcucGF0aH06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRJbmZvICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGF3YWl0IGFwaS5oZWFkRmlsZUJ5TmFtZSh7IGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnN0YWNrLmluY2x1ZGVzKGBmaWxlX25vdF9mb3VuZGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZvciBleGFtcGxlIGZpbmRGaWxlTmFtZXMoXCJpcHMvXCIpXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgLy8gTm8gbmF0aXZlIGNoYW5nZSBmZWVkIChiMiBzdXBwb3J0cyBuZWl0aGVyIHRpbWUgbm9yIHJvdXRlIGZpbHRlcmluZykgLSBhIGZ1bGwgbGlzdGluZyBmaWx0ZXJlZCBpbiBtZW1vcnlcbiAgICAgICAgcmV0dXJuIGZpbHRlckNoYW5nZXMoYXdhaXQgdGhpcy5maW5kSW5mbyhcIlwiKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfVtdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmRJbmZvICR7cHJlZml4fWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5zaGFsbG93ICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZvbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeyBwYXRoLCBjcmVhdGVUaW1lLCBzaXplIH0gb2YgYWxsRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IHBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xkZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhbGxGb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lLCBzaXplIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxGb2xkZXJzLnZhbHVlcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH0+KCk7XG4gICAgICAgICAgICBsZXQgc3RhcnRGaWxlTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWF4RmlsZUNvdW50OiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IGNvbmZpZz8uc2hhbGxvdyA/IFwiL1wiIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgcmVzdWx0LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJ1cGxvYWRcIiAmJiBjb25maWc/LnR5cGUgIT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZmlsZS5maWxlTmFtZSwgeyBwYXRoOiBmaWxlLmZpbGVOYW1lLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuYWN0aW9uID09PSBcImZvbGRlclwiICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBmaWxlLmZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIgPSBmb2xkZXIuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lID0gcmVzdWx0Lm5leHRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0RmlsZU5hbWUpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZmlsZXMudmFsdWVzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYXNzZXJ0UGF0aFZhbGlkKHBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgYnl0ZXMgPSBCdWZmZXIuZnJvbShwYXRoLCBcInV0ZjhcIik7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggdG9vIGxvbmc6ICR7cGF0aC5sZW5ndGh9IGNoYXJhY3RlcnMgPiAxMDAwIGNoYXJhY3RlcnMuIFBhdGg6ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgICAgIGNvcHlJbnN0ZWFkPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICAgIGxldCB7IHBhdGgsIHRhcmdldCwgdGFyZ2V0UGF0aCB9ID0gY29uZmlnO1xuICAgICAgICAvLyBBIHNlbGYgbW92ZSBzaG91bGQgTk9PUCAoYW5kIGRlZmluaXRlbHkgbm90IGNvcHksIGFuZCB0aGVuIGRlbGV0ZSBpdHNlbGYhKVxuICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlzICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgbW92ZSBwYXRoIHRvIGl0c2VsZi4gU2tpcHBpbmcgbW92ZSwgYXMgdGhlcmUgaXMgbm8gd29yayB0byBkby4gJHtwYXRofWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkge1xuICAgICAgICAgICAgbGV0IHRhcmdldEJ1Y2tldElkID0gdGFyZ2V0LmJ1Y2tldElkO1xuICAgICAgICAgICAgaWYgKHRhcmdldEJ1Y2tldElkID09PSB0aGlzLmJ1Y2tldElkICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHJldHVybjtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgbW92ZSAke3BhdGh9IC0+ICR7dGFyZ2V0UGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVWdoLi4uIGxpc3RpbmcgdGhlIGZpbGUgbmFtZSBzdWNrcywgYnV0Li4uIEkgZ3Vlc3MgaXQncyBzdGlsbCBiZXR0ZXIgdGhhbiBkb3dubG9hZGluZyBhbmQgcmUtdXBsb2FkaW5nIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIHByZWZpeDogcGF0aCwgbWF4RmlsZUNvdW50OiAxMCB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGluZm8uZmlsZXMuZmluZCh4ID0+IHguZmlsZU5hbWUgPT09IHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNvcHlGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUlkOiBmaWxlLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRhcmdldFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0SWQ6IHRhcmdldEJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRhcmdldC5zZXQodGFyZ2V0UGF0aCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZy5jb3B5SW5zdGVhZCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyh0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmlsZSBub3QgZm91bmQgYWZ0ZXIgbW92ZS4gTGVhdmluZyBCT1RIIGZpbGVzLiAke3RhcmdldFBhdGh9IHdhcyBub3QgZm91bmQuIEJlaW5nIG1vdmVkIGZyb20gJHtwYXRofWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb3B5KGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlKHsgLi4uY29uZmlnLCBjb3B5SW5zdGVhZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRVUkwgJHtwYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkVVJMKFwiZmlsZS9cIiArIHRoaXMuYnVja2V0TmFtZSArIFwiL1wiICsgcGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREb3dubG9hZEF1dGhvcml6YXRpb24oY29uZmlnOiB7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4Pzogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldERvd25sb2FkQXV0aG9yaXphdGlvbiAke2NvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwifWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKHtcbiAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICBmaWxlTmFtZVByZWZpeDogY29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLypcbk5hbWVzIHNob3VsZCBiZSBhIFVURi04IHN0cmluZyB1cCB0byAxMDI0IGJ5dGVzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOlxuICAgIENoYXJhY3RlciBjb2RlcyBiZWxvdyAzMiBhcmUgbm90IGFsbG93ZWQuXG4gICAgREVMIGNoYXJhY3RlcnMgKDEyNykgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEJhY2tzbGFzaGVzIGFyZSBub3QgYWxsb3dlZC5cbiAgICBGaWxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIC8sIGVuZCB3aXRoIC8sIG9yIGNvbnRhaW4gLy8uXG4qL1xuXG5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBkb21haW4gfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVByaXZhdGVJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHJpdmF0ZS1pbW11dGFibGVcIixcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlXG4gICAgfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpY0ltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWMtaW1tdXRhYmxlXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlLFxuICAgICAgICBhbGxvd2VkT3JpZ2luczogW2BodHRwczovLyR7ZG9tYWlufWAsIGBodHRwczovLzEyNy0wLTAtMS4ke2RvbWFpbn06NzAwN2BdLFxuICAgIH0pO1xufSk7XG5cbi8vIE5PVEU6IENhY2hlIGJ5IGEgbWludXRlLiBUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWEsIGJ1dC4uLiB1c3VhbGx5IHdob2xlIHJlYXNvbiBmb3IgcHVibGljIGlzIGZvciBjbG91ZGZsYXJlIGNhY2hpbmcgKGFzIG90aGVyd2lzZSB3ZSBjYW4ganVzdCBhY2Nlc3MgaXQgdGhyb3VnaCBhIHNlcnZlciksIG9yIGZvciBsYXJnZSBmaWxlcyAod2hpY2ggc2hvdWxkIGJlIGNhY2hlZCBhbnl3YXlzLCBhbmQgcHJvYmFibHkgZXZlbiB1c2UgaW1tdXRhYmxlIGNhY2hpbmcpLlxuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHVibGljID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXB1YmxpY1wiLFxuICAgICAgICBwdWJsaWM6IHRydWUsXG4gICAgICAgIGNhY2hlVGltZTogdGltZUluTWludXRlLFxuICAgICAgICBhbGxvd2VkT3JpZ2luczogW2BodHRwczovLyR7ZG9tYWlufWAsIGBodHRwczovLzEyNy0wLTAtMS4ke2RvbWFpbn06NzAwN2BdLFxuICAgIH0pO1xufSk7Il19
821
- /* _JS_SOURCE_HASH = "9c3ba577ef258c7b776416e8c2f17fabd61a6fd15c59d678cb1c0d1125c60a17"; */
821
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQXVKO0FBQ3ZKLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILCtLQUErSztBQUMvSyxTQUFTLHdCQUF3QixDQUFDLFFBQTJCO0lBQ3pELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUs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Q3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsb0JBQW9CO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2xCLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1UsUUFBQSxtQ0FBbUMsR0FBRyxJQUFBLGVBQUssRUFBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ3hFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztRQUN6QixVQUFVLEVBQUUsTUFBTSxHQUFHLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsSUFBSTtRQUNaLFNBQVMsRUFBRSxJQUFJO1FBQ2YsY0FBYyxFQUFFLENBQUMsV0FBVyxNQUFNLEVBQUUsRUFBRSxxQkFBcUIsTUFBTSxPQUFPLENBQUM7S0FDNUUsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUM7QUFFSCwyUUFBMlE7QUFDOVAsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLGVBQUssRUFBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQy9ELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztRQUN6QixVQUFVLEVBQUUsTUFBTSxHQUFHLFNBQVM7UUFDOUIsTUFBTSxFQUFFLElBQUk7UUFDWixTQUFTLEVBQUUsbUJBQVk7UUFDdkIsY0FBYyxFQUFFLENBQUMsV0FBVyxNQUFNLEVBQUUsRUFBRSxxQkFBcUIsTUFBTSxPQUFPLENBQUM7S0FDNUUsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYWNoZSwgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGlzTm9kZSwgc29ydCwgdGltZUluSG91ciwgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJsdWUsIGdyZWVuLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCBkZWJ1Z2JyZWFrIGZyb20gXCJkZWJ1Z2JyZWFrXCI7XG5pbXBvcnQgZG5zIGZyb20gXCJkbnNcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgaHR0cHNSZXF1ZXN0LCBIdHRwc1Jlc3BvbnNlSW5mbyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2h0dHBzXCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEFyY2hpdmVzQ29uZmlnLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEFyY2hpdmVGaWxlSW5mbywgU2V0Q29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCwgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGZpbHRlckNoYW5nZXMgfSBmcm9tIFwiLi9yZW1vdGVTdG9yYWdlL3JlbW90ZUNvbmZpZ1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbi8vIEEgQjIgZG93bmxvYWQvSEVBRCByZXNwb25zZSdzIGhlYWRlcnMgY2FycnkgdGhlIGZpbGUncyBtZXRhZGF0YS4gY29udGVudC1yYW5nZSdzIHRvdGFsIHdpbnMgb3ZlciBjb250ZW50LWxlbmd0aCBmb3IgcmFuZ2VkIHJlc3BvbnNlcyAod2hpY2ggb25seSByZXBvcnQgdGhlIHNsaWNlJ3MgbGVuZ3RoKS5cbmZ1bmN0aW9uIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8pOiB7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB7XG4gICAgbGV0IHNpemUgPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVyc1tcImNvbnRlbnQtbGVuZ3RoXCJdIHx8IDApO1xuICAgIGxldCBjb250ZW50UmFuZ2UgPSByZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1yYW5nZVwiXTtcbiAgICBsZXQgdG90YWwgPSBjb250ZW50UmFuZ2UgJiYgTnVtYmVyKGNvbnRlbnRSYW5nZS5zcGxpdChcIi9cIilbMV0pO1xuICAgIGlmICh0b3RhbCAmJiBOdW1iZXIuaXNGaW5pdGUodG90YWwpKSB7XG4gICAgICAgIHNpemUgPSB0b3RhbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2l6ZSwgdXBsb2FkVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVyc1tcIngtYnotdXBsb2FkLXRpbWVzdGFtcFwiXSB8fCAwKSB9O1xufVxuXG5jb25zdCBnZXRBUEkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgY3JlZHMgPSBhd2FpdCBiYWNrYmxhemVDcmVkcygpO1xuXG4gICAgLy8gTk9URTogT24gZXJyb3JzLCBvdXIgcmV0cnkgY29kZSByZXNldHMgdGhpcyBsYXp5LCBzbyB3ZSBETyBnZXQgbmV3IGF1dGhvcml6ZSB3aGVuIG5lZWRlZC5cbiAgICAvLyBUT0RPOiBNYXliZSB3ZSBzaG91bGQgZ2V0IG5ldyBhdXRob3JpemF0aW9uIHBlcmlvZGljYWxseSBhdCB3ZWxsP1xuICAgIGxldCBhdXRob3JpemVSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoXCJodHRwczovL2FwaS5iYWNrYmxhemViMi5jb20vYjJhcGkvdjIvYjJfYXV0aG9yaXplX2FjY291bnRcIiwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogXCJCYXNpYyBcIiArIEJ1ZmZlci5mcm9tKGNyZWRzLmFwcGxpY2F0aW9uS2V5SWQgKyBcIjpcIiArIGNyZWRzLmFwcGxpY2F0aW9uS2V5KS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGF1dGggPSBKU09OLnBhcnNlKGF1dGhvcml6ZVJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgYXBpVXJsOiBzdHJpbmc7XG4gICAgICAgIGRvd25sb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgIGFsbG93ZWQ6IHtcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgbmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB9W107XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUIyRnVuY3Rpb248QXJnLCBSZXN1bHQ+KG5hbWU6IHN0cmluZywgdHlwZTogXCJQT1NUXCIgfCBcIkdFVFwiLCBub0FjY291bnRJZD86IFwibm9BY2NvdW50SWRcIik6IChhcmc6IEFyZykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChhcmc6IEFyZykgPT4ge1xuICAgICAgICAgICAgaWYgKCFub0FjY291bnRJZCkge1xuICAgICAgICAgICAgICAgIGFyZyA9IHsgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCwgLi4uYXJnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL1wiICsgbmFtZTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVybCwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoYXJnKSksIHR5cGUsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gJHtuYW1lfSwgYXJnICR7SlNPTi5zdHJpbmdpZnkoYXJnKS5zbGljZSgwLCAxMDAwKX06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVCdWNrZXQgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzPzogYW55W107XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgfSwge1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICByZXZpc2lvbjogbnVtYmVyO1xuICAgIH0+KFwiYjJfY3JlYXRlX2J1Y2tldFwiLCBcIlBPU1RcIik7XG5cbiAgICBjb25zdCB1cGRhdGVCdWNrZXQgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU/OiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzPzogYW55W107XG4gICAgICAgIGJ1Y2tldEluZm8/OiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM/OiB1bmtub3duW107XG4gICAgfSwge1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICByZXZpc2lvbjogbnVtYmVyO1xuICAgIH0+KFwiYjJfdXBkYXRlX2J1Y2tldFwiLCBcIlBPU1RcIik7XG5cbiAgICAvLyBodHRwczovL3d3dy5iYWNrYmxhemUuY29tL2FwaWRvY3MvYjItdXBkYXRlLWJ1Y2tldFxuICAgIC8vICBUT0RPOiBiMl91cGRhdGVfYnVja2V0LCBzbyB3ZSBjYW4gdXBkYXRlIENPUlMsIGV0Y1xuXG4gICAgY29uc3QgbGlzdEJ1Y2tldHMgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZT86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGJ1Y2tldHM6IHtcbiAgICAgICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICB9PihcImIyX2xpc3RfYnVja2V0c1wiLCBcIlBPU1RcIik7XG5cbiAgICBmdW5jdGlvbiBlbmNvZGVQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICAvLyBQcmVzZXJ2ZSBzbGFzaGVzLCBidXQgZW5jb2RlIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBwYXRoID0gcGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIlMkZcIiArIHBhdGguc2xpY2UoMSk7XG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKFwiL1wiKSkgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpICsgXCIlMkZcIjtcbiAgICAgICAgLy8gTk9URTogRm9yIHNvbWUgcmVhc29uLCB0aGlzIHdvbid0IHJlbmRlciBpbiB0aGUgd2ViIFVJIGNvcnJlY3RseS4gQlVULCBpdCdsbFxuICAgICAgICAvLyAgd29yayBnZXQgZ2V0L3NldCBhbmQgZmluZFxuICAgICAgICAvLyAgLSBBTFNPLCBpdCBzZWVtcyB0byBhZGQgZHVwbGljYXRlIGZpbGVzPyBUaGlzIG1pZ2h0IGFsc28gYmUgYSB3ZWIgVUkgdGhpbmcuIEl0IHNlZW1zIHRvIHdvcmsgdGhvdWdoLlxuICAgICAgICB3aGlsZSAocGF0aC5pbmNsdWRlcyhcIi8vXCIpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlQWxsKFwiLy9cIiwgXCIvJTJGXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkRmlsZUJ5TmFtZShjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IH07XG4gICAgICAgIC8vIENhcHR1cmVzIHRoZSByZXNwb25zZSBoZWFkZXJzLCB3aGljaCBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhICh4LWJ6LXVwbG9hZC10aW1lc3RhbXAsIGNvbnRlbnQtbGVuZ3RoIC8gY29udGVudC1yYW5nZSkgLSBzbyBjYWxsZXJzIHRoYXQgbmVlZCBpdCBkb24ndCBwYXkgYSBzZWNvbmQgQVBJIGNhbGxcbiAgICAgICAgb3V0UmVzcG9uc2U/OiBIdHRwc1Jlc3BvbnNlSW5mbztcbiAgICB9KSB7XG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICB9KSksIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBSYW5nZTogY29uZmlnLnJhbmdlID8gYGJ5dGVzPSR7Y29uZmlnLnJhbmdlLnN0YXJ0fS0ke2NvbmZpZy5yYW5nZS5lbmQgLSAxfWAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4WzFdICE9PSB1bmRlZmluZWQpKSxcbiAgICAgICAgICAgIG91dFJlc3BvbnNlOiBjb25maWcub3V0UmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKiBBIGZpbGUncyBtZXRhZGF0YSBieSBuYW1lLCB3aXRob3V0IHRoZSBib2R5OiBIRUFEIG9uIHRoZSBkb3dubG9hZCBVUkwsIHdoaWNoIGlzIGEgY2xhc3MgQiAoZG93bmxvYWQtcHJpY2VkKSB0cmFuc2FjdGlvbiAtIGIyX2xpc3RfZmlsZV9uYW1lcyBpcyBjbGFzcyBDIGF0IDEweCB0aGUgcHJpY2UsIGFuZCBiMl9nZXRfZmlsZV9pbmZvIG5lZWRzIGEgZmlsZUlkIHdlIGRvbid0IGhhdmUuIFJldHVybnMgdW5kZWZpbmVkIGZvciBtaXNzaW5nIChvciBoaWRkZW4pIGZpbGVzLiAqL1xuICAgIGFzeW5jIGZ1bmN0aW9uIGhlYWRGaWxlQnlOYW1lKGNvbmZpZzogeyBidWNrZXROYW1lOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8eyBzaXplOiBudW1iZXI7IHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgdW5kZWZpbmVkLCBcIkhFQURcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbiB9LFxuICAgICAgICAgICAgICAgIG91dFJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gSEVBRCByZXNwb25zZXMgaGF2ZSBubyBib2R5LCBzbyB0aGUgZXhwaXJlZF9hdXRoX3Rva2VuIG1hcmtlciBhcGlSZXRyeUxvZ2ljIG1hdGNoZXMgb24gbmV2ZXIgYXBwZWFycyAtIHJlLWFkZCBpdCBzbyBhbiBleHBpcmVkIHRva2VuIHN0aWxsIHJlZnJlc2hlcyBhbmQgcmV0cmllc1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJleHBpcmVkX2F1dGhfdG9rZW5cIiBIRUFEICR7Y29uZmlnLmJ1Y2tldE5hbWV9LyR7Y29uZmlnLmZpbGVOYW1lfSBnb3QgYSA0MDE6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZUZpbGVNZXRhZGF0YUhlYWRlcnMocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIE9oLi4uIGFwcGFyZW50bHksIHdlIGNhbid0IHJldXNlIHRoZXNlPyBIdWguLi5cbiAgICBjb25zdCBnZXRVcGxvYWRVUkwgPSAoYXN5bmMgKGJ1Y2tldElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiBnZXRVcGxvYWRVUkwuY2xlYXIoYnVja2V0SWQpLCB0aW1lSW5Ib3VyICogMSk7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmxSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3VybD9idWNrZXRJZD1cIiArIGJ1Y2tldElkLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShnZXRVcGxvYWRVcmxSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHVwbG9hZFVybDogc3RyaW5nO1xuICAgICAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRGaWxlKGNvbmZpZzoge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgfSkge1xuICAgICAgICBsZXQgZ2V0VXBsb2FkVXJsID0gYXdhaXQgZ2V0VXBsb2FkVVJMKGNvbmZpZy5idWNrZXRJZCk7XG5cbiAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGdldFVwbG9hZFVybC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogZ2V0VXBsb2FkVXJsLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIlgtQnotRmlsZS1OYW1lXCI6IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1Db250ZW50LVNoYTFcIjogXCJkb19ub3RfdmVyaWZ5XCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb25maWcuZGF0YS5sZW5ndGggKyBcIlwiLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2hpZGVfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldEZpbGVJbmZvID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHtcbiAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9nZXRfZmlsZV9pbmZvXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgbGlzdEZpbGVOYW1lcyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBwcmVmaXg6IHN0cmluZztcbiAgICAgICAgc3RhcnRGaWxlTmFtZT86IHN0cmluZztcbiAgICAgICAgbWF4RmlsZUNvdW50PzogbnVtYmVyO1xuICAgICAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICAgICAgbmV4dEZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9saXN0X2ZpbGVfbmFtZXNcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjb3B5RmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBzb3VyY2VGaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2NvcHlfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IHN0YXJ0TGFyZ2VGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzogYW55O1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX3N0YXJ0X2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICAvLyBBcHBhcmVudGx5IHdlIGNhbid0IHJldXNlIHRoZXNlP1xuICAgIGNvbnN0IGdldFVwbG9hZFBhcnRVUkwgPSAoYXN5bmMgKGZpbGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0UmF3ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvYjJfZ2V0X3VwbG9hZF9wYXJ0X3VybD9maWxlSWQ9XCIgKyBmaWxlSWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh1cGxvYWRQYXJ0UmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0KGNvbmZpZzoge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgICAgIHNoYTE6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0ID0gYXdhaXQgZ2V0VXBsb2FkUGFydFVSTChjb25maWcuZmlsZUlkKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVwbG9hZFBhcnQudXBsb2FkVXJsLCBjb25maWcuZGF0YSwgXCJQT1NUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IHVwbG9hZFBhcnQuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1QYXJ0LU51bWJlclwiOiBjb25maWcucGFydE51bWJlciArIFwiXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBjb25maWcuc2hhMSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdO1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRTaGExOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfZmluaXNoX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjYW5jZWxMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY2FuY2VsX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9nZXRfZG93bmxvYWRfYXV0aG9yaXphdGlvblwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldERvd25sb2FkVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBcIi9cIiArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGguZG93bmxvYWRVcmwgKyBwYXRoO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlQnVja2V0LFxuICAgICAgICB1cGRhdGVCdWNrZXQsXG4gICAgICAgIGxpc3RCdWNrZXRzLFxuICAgICAgICBkb3dubG9hZEZpbGVCeU5hbWUsXG4gICAgICAgIGhlYWRGaWxlQnlOYW1lLFxuICAgICAgICB1cGxvYWRGaWxlLFxuICAgICAgICBoaWRlRmlsZSxcbiAgICAgICAgZ2V0RmlsZUluZm8sXG4gICAgICAgIGxpc3RGaWxlTmFtZXMsXG4gICAgICAgIGNvcHlGaWxlLFxuICAgICAgICBzdGFydExhcmdlRmlsZSxcbiAgICAgICAgdXBsb2FkUGFydCxcbiAgICAgICAgZmluaXNoTGFyZ2VGaWxlLFxuICAgICAgICBjYW5jZWxMYXJnZUZpbGUsXG4gICAgICAgIGdldERvd25sb2FkQXV0aG9yaXphdGlvbixcbiAgICAgICAgZ2V0RG93bmxvYWRVUkwsXG4gICAgICAgIGFwaVVybDogYXV0aC5hcGlVcmwsXG4gICAgICAgIGFsbG93ZWQ6IGF1dGguYWxsb3dlZCxcbiAgICB9O1xufSk7XG5cbnR5cGUgQjJBcGkgPSAodHlwZW9mIGdldEFQSSkgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGluZmVyIFQ+ID8gVCA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0JhY2tibGF6ZSBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAgICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICAgICAgY2FjaGVUaW1lPzogbnVtYmVyO1xuICAgICAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuICAgIH0pIHtcbiAgICAgICAgLy8gR2V0IHRoZSBhcGksIHRvIHNldHVwIGNvcnNcbiAgICAgICAgdm9pZCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVja2V0TmFtZSA9IHRoaXMuY29uZmlnLmJ1Y2tldE5hbWUucmVwbGFjZUFsbCgvW15cXHdcXGRdL2csIFwiLVwiKTtcbiAgICBwcml2YXRlIGJ1Y2tldElkID0gXCJcIjtcblxuICAgIHByaXZhdGUgbG9nZ2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVMb2dnaW5nKCkge1xuICAgICAgICB0aGlzLmxvZ2dpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBwcml2YXRlIGxvZyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2dpbmcpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYmFja2JsYXplIFwiICsgdGhpcy5jb25maWcuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJ1Y2tldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG5cbiAgICAgICAgbGV0IGNhY2hlVGltZSA9IHRoaXMuY29uZmlnLmNhY2hlVGltZSA/PyAwO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBjYWNoZVRpbWUgPSBJTU1VVEFCTEVfQ0FDSEVfVElNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFMV0FZUyBzZXQgYWNjZXNzIGNvbnRyb2wsIGFzIHdlIGNhbiBtYWtlIHVybHMgZm9yIHByaXZhdGUgYnVja2V0cyB3aXRoIGdldERvd25sb2FkQXV0aG9yaXphdGlvblxuICAgICAgICBsZXQgZGVzaXJlZENvcnNSdWxlcyA9IFt7XG4gICAgICAgICAgICBjb3JzUnVsZU5hbWU6IFwiYWxsb3dBbGxcIixcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zOiB0aGlzLmNvbmZpZy5hbGxvd2VkT3JpZ2lucyA/PyBbXCJodHRwc1wiXSxcbiAgICAgICAgICAgIGFsbG93ZWRPcGVyYXRpb25zOiBbXCJiMl9kb3dubG9hZF9maWxlX2J5X2lkXCIsIFwiYjJfZG93bmxvYWRfZmlsZV9ieV9uYW1lXCJdLFxuICAgICAgICAgICAgYWxsb3dlZEhlYWRlcnM6IFtcInJhbmdlXCJdLFxuICAgICAgICAgICAgZXhwb3NlSGVhZGVyczogW1wieC1iei1jb250ZW50LXNoYTFcIl0sXG4gICAgICAgICAgICAvLyA2MCBpcyB0aGUgYWJzb2x1dGUgbWluaW11bS4gSWYgd2UgdHJ5IHRvIHNldCBhIHZhbHVlIGxvd2VyIHRoYW4gdGhpcywgaXQnbGwgYmUgdXBkYXRlZCB0byBiZSA2MC4gXG4gICAgICAgICAgICBtYXhBZ2VTZWNvbmRzOiBNYXRoLm1heCg2MCwgY2FjaGVUaW1lIC8gMTAwMCksXG4gICAgICAgIH1dO1xuICAgICAgICBsZXQgYnVja2V0SW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgaWYgKGNhY2hlVGltZSkge1xuICAgICAgICAgICAgYnVja2V0SW5mb1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke2NhY2hlVGltZSAvIDEwMDB9YDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IHRoaXMuY29uZmlnLnB1YmxpYyA/IFwiYWxsUHVibGljXCIgOiBcImFsbFByaXZhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tVXBsb2FkaW5nVG9IaWRpbmdcIjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZmlsZXMgZm9yIDcgZGF5cywgd2hpY2ggc2hvdWxkIGJlIGVub3VnaCB0aW1lIHRvIHJlY292ZXIgYWNjaWRlbnRhbCBoaWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tSGlkaW5nVG9EZWxldGluZ1wiOiA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWxlTmFtZVByZWZpeFwiOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmICghZS5zdGFjay5pbmNsdWRlcyhgXCJkdXBsaWNhdGVfYnVja2V0X25hbWVcImApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzIDwgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIGNyZWF0ZSBidWNrZXQgZmFpbGVkLCByZXRyeWluZyBpbiA1czogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVja2V0TGlzdCA9IGF3YWl0IGFwaS5saXN0QnVja2V0cyh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYnVja2V0TGlzdC5idWNrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgbmFtZSBcIiR7dGhpcy5idWNrZXROYW1lfVwiIGlzIGJlaW5nIHVzZWQgYnkgc29tZW9uZSBlbHNlLiBCdWNrZXQgbmFtZXMgaGF2ZSB0byBiZSBnbG9iYWxseSB1bmlxdWUuIFRyeSBhIGRpZmZlcmVudCBuYW1lIHVudGlsIHlvdSBmaW5kIGEgZnJlZSBvbmUuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXS5idWNrZXRJZDtcblxuICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgYnVja2V0ID0gYnVja2V0TGlzdC5idWNrZXRzWzBdO1xuICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICBsZXQga3ZwcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgICAgICAgICAgICAgc29ydChrdnBzLCB4ID0+IHhbMF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa3Zwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWwobGhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShub3JtYWxpemUobGhzKSkgPT09IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGxoczogdW5rbm93bltdLCByaHM6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgIGlmIChsaHMubGVuZ3RoICE9PSByaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckluZGVwZW5kZW50RXF1YWwobGhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFvcmRlckluZGVwZW5kZW50RXF1YWxBcnJheShidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKVxuICAgICAgICAgICAgICAgIHx8ICFvcmRlckluZGVwZW5kZW50RXF1YWwoYnVja2V0LmJ1Y2tldEluZm8sIGJ1Y2tldEluZm8pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBVcGRhdGluZyBDT1JTIHJ1bGVzIGZvciAke3RoaXMuYnVja2V0TmFtZX1gKSwgYnVja2V0LmNvcnNSdWxlcywgZGVzaXJlZENvcnNSdWxlcyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwZGF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRJZDogYnVja2V0LmFjY291bnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IGJ1Y2tldC5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogYnVja2V0LmJ1Y2tldFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBidWNrZXQubGlmZWN5Y2xlUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mbzogYnVja2V0SW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVzZXQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbGFzdCByZXNldCBiZWNhdXNlIG9mIGEgNTAzXG4gICAgcHJpdmF0ZSBsYXN0NTAzUmVzZXQgPSAwO1xuICAgIC8vIElNUE9SVEFOVCEgV2UgbXVzdCBhbHdheXMgQ0FUQ0ggQVJPVU5EIHRoZSBhcGlSZXRyeUxvZ2ljLCBORVZFUiBpbnNpZGUgb2YgZm5jLiBPdGhlcndpc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byByZWNyZWF0ZSB0aGUgYXV0aCB0b2tlbi4gYGNvbnRleHRgIGlzIGEgc2hvcnQgbGFiZWwgKHZlcmIgKyBmaWxlIHBhdGgpIGluY2x1ZGVkIGluIGV2ZXJ5IHJldHJ5L2Vycm9yIGxvZyBzbyBhIHN0dWNrIHNpbGVudC1yZXRyeSBsb29wIGlzIGlkZW50aWZpYWJsZSBmcm9tIHRoZSBsb2dzLlxuICAgIHByaXZhdGUgYXN5bmMgYXBpUmV0cnlMb2dpYzxUPihcbiAgICAgICAgY29udGV4dDogc3RyaW5nLFxuICAgICAgICBmbmM6IChhcGk6IEIyQXBpKSA9PiBQcm9taXNlPFQ+LFxuICAgICAgICByZXRyaWVzID0gM1xuICAgICk6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgYXBpOiBCMkFwaSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFwaSA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKGFwaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBpZiAocmV0cmllcyA8PSAwKSB0aHJvdyBlcnI7XG5cbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSA1MDMgYW5kIGl0J3MgYmVlbiBhIG1pbnV0ZSBzaW5jZSB3ZSBsYXN0IHJlc2V0LCB0aGVuIFdhaXQgYW5kIHJlc2V0LlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChlcnIuc3RhY2suaW5jbHVkZXMoYFwic3RhdHVzXCI6IDUwM2ApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgXCJzZXJ2aWNlX3VuYXZhaWxhYmxlXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwiaW50ZXJuYWxfZXJyb3JcImApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICAgICAgKSAmJiBEYXRlLm5vdygpIC0gdGhpcy5sYXN0NTAzUmVzZXQgPiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrYmxhemUgaXMgc28gZmxha3kgdGhhdCB3ZSdyZSBqdXN0IGdvaW5nIHRvIHdhcm4gaGVyZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIEJhY2tibGF6ZSBlcnJvciwgd2FpdGluZyBhbmQgcmVzZXR0aW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlc2V0ID0gdGhpcy5jdXJyZW50UmVzZXQgfHwgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2hlY2sgYWdhaW4gaW4gY2FzZSwgYW5kIGluIHRoZSB2ZXJ5IGxpa2VseSBjYXNlIHRoYXQgdGhpcyBpcyBiZWluZyBydW4gaW4gcGFyYWxsZWwsIHdlIG9ubHkgd2FudCB0byByZXNldCBvbmNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIFJlc2V0dGluZyBnZXRBUEkgYW5kIGdldEJ1Y2tldEFQSTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdDUwM1Jlc2V0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCkuZmluYWxseSgoKSA9PiB0aGlzLmN1cnJlbnRSZXNldCA9IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jdXJyZW50UmVzZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gdG9rZW4gaXMgaW52YWxpZCwgcmVzZXQgZ2V0QnVja2V0QVBJIGFuZCBnZXRBUEkgSWYgdGhlIGVycm9yIGlzIHRoYXQgdGhlIGJ1Y2tldCBpc24ndCBmb3VuZCwgcmVzZXQgZ2V0QnVja2V0QVBJXG4gICAgICAgICAgICBpZiAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcImV4cGlyZWRfYXV0aF90b2tlblwiYCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIEF1dGhvcml6YXRpb24gdG9rZW4gZXhwaXJlZGApO1xuICAgICAgICAgICAgICAgIGdldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVyci5zdGFjay5pbmNsdWRlcyhgbm8gdG9tZXMgYXZhaWxhYmxlYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVUSU1FRE9VVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBzb2NrZXQgaGFuZyB1cGApXG4gICAgICAgICAgICAgICAgLy8gRWguLi4gdGhpcyBtaWdodCBiZSBiYWQsIGJ1dC4uLiBJIHRoaW5rIHdlIGp1c3QgZ2V0IHJhbmRvbSA0MDAgZXJyb3JzLiBJZiB0aGlzIHNwYW1zIGVycm9ycywgd2UgY2FuIHJlbW92ZSB0aGlzIGxpbmUuXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGA0MDAgQmFkIFJlcXVlc3RgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVDT05OUkVTRVRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRUZVU0VEYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gUmV0cnlpbmcgaW4gNXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSAke2Vyci5tZXNzYWdlfSByZXRyeWluZyBpbiA1c2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDUwMDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYGdldGFkZHJpbmZvIEVOT1RGT1VORGApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwaSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsT2JqID0gbmV3IFVSTChhcGkuYXBpVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3RuYW1lID0gdXJsT2JqLmhvc3RuYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9va3VwQWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbnMubG9va3VwKGhvc3RuYW1lLCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHJlc3Nlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNvbHZlQWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbnMucmVzb2x2ZTQoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgWyR7Y29udGV4dH1dIGdldGFkZHJpbmZvIEVOT1RGT1VORCAke2hvc3RuYW1lfWAsIHsgbG9va3VwQWRkcmVzc2VzLCByZXNvbHZlQWRkcmVzc2VzLCBhcGlVcmw6IGFwaS5hcGlVcmwsIGZ1bGxFcnJvcjogZXJyLnN0YWNrIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfTsgcmV0cnlDb3VudD86IG51bWJlciB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRvd25sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkUG9sbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRvd25sb2FkaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBkb3dubG9hZCBpbiBwcm9ncmVzcyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGRvd25sb2FkUG9sbCwgNTAwMCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXQgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNsYW1wIG5lZWRzIHRoZSBmaWxlJ3Mgc2l6ZSAoYW5kIGdpdmVzIHVzIGl0cyBtZXRhZGF0YSBmb3IgZnJlZSlcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVJbmZvID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlSW5mbykgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7ZmlsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VTdGFydCA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VFbmQgPSBNYXRoLm1pbihyYW5nZS5lbmQsIGZpbGVJbmZvLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBJIHRoaW5rIGlmIHdlIHJlcXVlc3Qgbm90aGluZywgaXQgY29uZnVzZXMgQmFja2JsYXplIGFuZCBlbmRzIHVwIGdpdmluZyB1cyB0aGUgZW50aXJlIGZpbGUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUVuZCA8PSByYW5nZVN0YXJ0KSByZXR1cm4geyBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIHdyaXRlVGltZTogZmlsZUluZm8ud3JpdGVUaW1lLCBzaXplOiBmaWxlSW5mby5zaXplIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgYXBpLmRvd25sb2FkRmlsZUJ5TmFtZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiByYW5nZVN0YXJ0LCBlbmQ6IHJhbmdlRW5kIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT09IHJhbmdlRW5kIC0gcmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIHJhbmdlIGRvd25sb2FkIHJldHVybmVkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMuIFRyaWVkIHRvIGdldCAke3JhbmdlU3RhcnR9LSR7cmFuZ2VFbmR9LCBidXQgcmVjZWl2ZWQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlU3RhcnQgKyBkYXRhLmxlbmd0aH0uIEZvciBmaWxlOiAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogZmlsZUluZm8ud3JpdGVUaW1lLCBzaXplOiBmaWxlSW5mby5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBkb3dubG9hZCdzIG93biByZXNwb25zZSBoZWFkZXJzIGNhcnJ5IHRoZSBtZXRhZGF0YSwgc28gYSBmdWxsIHJlYWQgaXMgYSBzaW5nbGUgQVBJIGNhbGxcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgYXBpLmRvd25sb2FkRmlsZUJ5TmFtZSh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG91dFJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgbWV0YSA9IHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBtZXRhLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZGF0YS5sZW5ndGggfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHJlc3VsdC5kYXRhLmxlbmd0aCAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRvd25sb2FkICgke2Zvcm1hdE51bWJlcihyZXN1bHQuZGF0YS5sZW5ndGgpfUIke2NvbmZpZz8ucmFuZ2UgJiYgYCwgJHtmb3JtYXROdW1iZXIoY29uZmlnLnJhbmdlLnN0YXJ0KX0gLSAke2Zvcm1hdE51bWJlcihjb25maWcucmFuZ2UuZW5kKX1gIHx8IFwiXCJ9KSBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9LCAke2ZpbGVOYW1lfSlgKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZmlsZSBkb2VzIG5vdCBleGlzdCAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFwaSA9IGF3YWl0IGdldEFQSSgpO1xuICAgICAgICAgICAgLy8gQjIgdjIgZG9jdW1lbnRzIGFsbG93ZWQgYXMgYSBzaW5nbGUgb2JqZWN0OyBvdXIgdHlwZSBzYXlzIGEgbGlzdCAtIGhhbmRsZSBib3RoXG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJhdyA9IGFwaS5hbGxvd2VkIGFzIHVua25vd247XG4gICAgICAgICAgICBsZXQgYWxsb3dlZExpc3QgPSAoQXJyYXkuaXNBcnJheShhbGxvd2VkUmF3KSAmJiBhbGxvd2VkUmF3IHx8IFthbGxvd2VkUmF3XSkgYXMgdHlwZW9mIGFwaS5hbGxvd2VkO1xuICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRMaXN0LnNvbWUoYWxsb3dlZCA9PlxuICAgICAgICAgICAgICAgIGFsbG93ZWQuY2FwYWJpbGl0aWVzLmluY2x1ZGVzKFwid3JpdGVGaWxlc1wiKVxuICAgICAgICAgICAgICAgICYmICghYWxsb3dlZC5idWNrZXROYW1lIHx8IGFsbG93ZWQuYnVja2V0TmFtZSA9PT0gdGhpcy5idWNrZXROYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gTm8gLyBpbnZhbGlkIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGhhc1dyaXRlQWNjZXNzIGNoZWNrIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKGNvbmZpZz8uZm9yY2VTZXRJbW11dGFibGUgJiYgIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7ZmlsZU5hbWV9IHRvICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnPy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgaWYgKCFjb25maWcubm9DaGVja3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KS4gQjIgc3RhbXBzIGl0cyBvd24gdXBsb2FkIHRpbWUsIHNvIHRoZSBleGFjdCBsYXN0TW9kaWZpZWQgaXMgbm90IHByZXNlcnZlZCBvbiB0aGUgc3RvcmVkIGZpbGUuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBleGlzdGluZy53cml0ZVRpbWUpIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYSBzeW5jaHJvbml6YXRpb24gcHVzaCBuZXZlciBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIHBhdGggb24gYW4gaW1tdXRhYmxlIGJ1Y2tldCAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlICYmIHRoaXMuY29uZmlnLmltbXV0YWJsZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgdXBsb2FkICgke2Zvcm1hdE51bWJlcihkYXRhLmxlbmd0aCl9QikgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgbGV0IGYgPSBmaWxlTmFtZTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGB1cGxvYWRGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZEZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWUsIGRhdGE6IGRhdGEsIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjb25maWc/Lm5vQ2hlY2tzKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzQ2hlY2tzID0gMzA7XG4gICAgICAgICAgICB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgICAgICAgICAgIGV4aXN0c0NoZWNrcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmlsZSAke2ZpbGVOYW1lfS8ke2Z9IHdhcyB1cGxvYWRlZCwgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCBhZnRlcndhcmRzLiBIb3BlZnVsbHkgaXQgd2FzIGp1c3QgZGVsZXRlZCwgdmVyeSBxdWlja2x5PyBJZiBiYWNrYmxhemUgaXMgdGFraW5nIHRvbyBsb25nIGZvciBmaWxlcyB0byBwcm9wYWdhdGUsIHRoZW4gd2UgbWlnaHQgcnVuIGludG8gaXNzdWVzIHdpdGggdGhlIGRhdGFiYXNlIGF0b21pY2l0eS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRlbGV0ZSAke2ZpbGVOYW1lfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBoaWRlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuaGlkZUZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWU6IGZpbGVOYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBlcnJvciBpbiBoaWRlLCBwb3NzaWJseSBhbHJlYWR5IGhpZGRlbiAke2ZpbGVOYW1lfVxcbiR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IERlbGV0aW9uIFNFRU1TIHRvIHdvcmsuIFRoaXMgRE9FUyBicmVhayBpZiB3ZSBkZWxldGUgYSBmaWxlIHdoaWNoIGtlZXBzIGJlaW5nIHJlY3JlYXRlZCwgZXgsIHRoZSBoZWFydGJlYXQuIGxldCBleGlzdHNDaGVja3MgPSAxMDsgd2hpbGUgKGV4aXN0c0NoZWNrcyA+IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGlmICghZXhpc3RzKSBicmVhazsgYXdhaXQgZGVsYXkoMTAwMCk7IGV4aXN0c0NoZWNrcy0tOyB9IGlmIChleGlzdHNDaGVja3MgPT09IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGRldkRlYnVnYnJlYWsoKTsgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IHdhcyBkZWxldGVkLCBidXQgd2FzIHN0aWxsIGZvdW5kIGFmdGVyd2FyZHNgKTsgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgfVxuICAgIH1cblxuICAgIC8vIGxhc3RNb2RpZmllZCBpcyBhY2NlcHRlZCBidXQgY2Fubm90IGJlIGhvbm9yZWQgLSBiMiBzdGFtcHMgaXRzIG93biB1cGxvYWRUaW1lc3RhbXAsIHdoaWNoIGlzIHdoYXQgb3VyIGdldEluZm8vZmluZEluZm8gcmVwb3J0IGFzIHRoZSB3cml0ZSB0aW1lXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIGxldCBvbkVycm9yOiAoKCkgPT4gUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBwYXRoIH0gPSBjb25maWc7XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgcmVxdWlyZXMgNU1CIGNodW5rcy4gQnV0LCBsYXJnZXIgaXMgbW9yZSBlZmZpY2llbnQgZm9yIHVzLlxuICAgICAgICAgICAgY29uc3QgTUlOX0NIVU5LX1NJWkUgPSAzMiAqIDEwMjQgKiAxMDI0O1xuICAgICAgICAgICAgbGV0IGRhdGFRdWV1ZTogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFRdWV1ZS5sZW5ndGgpIHJldHVybiBkYXRhUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgYnVmZmVycyB1bnRpbCB3ZSBnZXQgNU1CLCBPUiwgZW5kLiBCYWNrYmxhemUgcmVxdWlyZXMgdGhpcyBmb3IgbGFyZ2UgZmlsZXMuXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcnMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBwYXRoO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3Mgb3Zlcmx5IHNtYWxsIGZpbGVzXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIGxlc3MgdGhhbiAyIGNodW5rc1xuICAgICAgICAgICAgbGV0IHNlY29uZERhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFzZWNvbmREYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQUxTTywgaWYgdGhlcmUgYXJlIHR3byBjaHVua3MsIGJ1dCBvbmUgaXMgdG9vIHNtYWxsLCBjb21iaW5lIGl0LiBUaGlzIGhlbHBzIGFsbG93IHVzIG5ldmVyIHNlbmQgc21hbGwgY2h1bmtzLlxuICAgICAgICAgICAgaWYgKHNlY29uZERhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgQnVmZmVyLmNvbmNhdChbZGF0YSwgc2Vjb25kRGF0YV0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgVXBsb2FkaW5nIGxhcmdlIGZpbGUgJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KGRhdGEsIHNlY29uZERhdGEpO1xuXG5cbiAgICAgICAgICAgIGxldCB1cGxvYWRJbmZvID0gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBzdGFydExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLnN0YXJ0TGFyZ2VGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJbmZvOiB7fSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25FcnJvci5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGNhbmNlbExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNhbmNlbExhcmdlRmlsZSh7IGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgTE9HX0lOVEVSVkFMID0gdGltZUluTWludXRlO1xuICAgICAgICAgICAgbGV0IG5leHRMb2dUaW1lID0gRGF0ZS5ub3coKSArIExPR19JTlRFUlZBTDtcblxuICAgICAgICAgICAgbGV0IHBhcnROdW1iZXIgPSAxO1xuICAgICAgICAgICAgbGV0IHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gU28uLi4gaWYgdGhlIG5leHQgY2h1bmsgaXMgdGhlIGxhc3Qgb25lLCBjb21iaW5lIGl0IHdpdGggdGhlIGN1cnJlbnQgb25lLiBUaGlzIHByZXZlbnRzIEFOWSB1cGxvYWRzIGZyb20gYmVpbmcgPCB0aGUgdGhyZXNob2xkLCBhcyBhcHBhcmVudGx5IHRoZSBcImxhc3QgcGFydFwiIGNoZWNrIGluIGJhY2tibGF6ZSBmYWlscyB3aGVuIHdlIGhhdmUgdG8gcmV0cnkgYW4gdXBsb2FkIChkdWUgdG8gXCJubyB0b21lcyBhdmFpbGFibGVcIikuIFdlbGwgaXQgY2FuJ3QgZmFpbCBpZiBldmVuIHRoZSBsYXN0IHBhcnQgaXMgPiA1TUIsIG5vdyBjYW4gaXQhIEJVVCwgb25seSBpZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBjaHVuaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IHRyeSB0byBzZW5kIGEgc2luZ2xlIGNodW5rLCB3aGljaCB3ZSBjYW4ndCBkby5cbiAgICAgICAgICAgICAgICBpZiAocGFydFNoYTFBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXliZUxhc3REYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlTGFzdERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyB0aGUgbGFzdCBvbmUsIHNvIGNvbnN1bWUgaXQgbm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIG1heWJlTGFzdERhdGFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBub3QgdGhlIGxhc3Qgb25lLiBQdXQgaXQgYmFjaywgaW4gY2FzZSB0aGUgb25lIEFGVEVSIGlzIHRoZSBsYXN0IG9uZSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIG1lcmdlIG1heWJlTGFzdERhdGEgd2l0aCB0aGUgbmV4dCBuZXh0IGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQobWF5YmVMYXN0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNoYTEgPSByZXF1aXJlKFwiY3J5cHRvXCIpLmNyZWF0ZUhhc2goXCJzaGExXCIpO1xuICAgICAgICAgICAgICAgIHNoYTEudXBkYXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGxldCBzaGExSGV4ID0gc2hhMS5kaWdlc3QoXCJoZXhcIik7XG4gICAgICAgICAgICAgICAgcGFydFNoYTFBcnJheS5wdXNoKHNoYTFIZXgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgdXBsb2FkUGFydCMke3BhcnROdW1iZXJ9ICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihcIkltcG9zc2libGUsIGRhdGEgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgVXBsb2FkaW5nIGxhcmdlIGZpbGUgcGFydCAke3BhcnROdW1iZXJ9LCB1cGxvYWRlZCAke2JsdWUoZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpICsgXCJCXCIpfSBpbiAke2JsdWUodGltZVN0cil9ICgke2JsdWUocmF0ZVN0cil9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkUGFydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcjogcGFydE51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGExOiBzaGExSGV4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyKys7XG5cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IG5leHRMb2dUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRMb2dUaW1lID0gRGF0ZS5ub3coKSArIExPR19JTlRFUlZBTDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIodG90YWxCeXRlcyAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdGlsbCB1cGxvYWRpbmcgbGFyZ2UgZmlsZSBhdCAke0RhdGUubm93KCl9LiBVcGxvYWRlZCAke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0pLiAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBGaW5pc2hlZCB1cGxvYWRpbmcgbGFyZ2UgZmlsZSB1cGxvYWRlZCAke2dyZWVuKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSl9QmApO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmlzaExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuZmluaXNoTGFyZ2VGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgcGFydFNoYTFBcnJheTogcGFydFNoYTFBcnJheSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2Ygb25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGMoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBlcnJvciBjbGVhbi4gSWdub3JpbmcsIHdlIHdpbGwgcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IsIHBhdGggJHtjb25maWcucGF0aH1gLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gc2V0TGFyZ2VGaWxlIGZvciAke2NvbmZpZy5wYXRofTogJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldEluZm8gJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gYXdhaXQgYXBpLmhlYWRGaWxlQnlOYW1lKHsgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIG5vdCBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuc3RhY2suaW5jbHVkZXMoYGZpbGVfbm90X2ZvdW5kYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIG5vdCBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGV4YW1wbGUgZmluZEZpbGVOYW1lcyhcImlwcy9cIilcbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICAvLyBObyBuYXRpdmUgY2hhbmdlIGZlZWQgKGIyIHN1cHBvcnRzIG5laXRoZXIgdGltZSBub3Igcm91dGUgZmlsdGVyaW5nKSAtIGEgZnVsbCBsaXN0aW5nIGZpbHRlcmVkIGluIG1lbW9yeVxuICAgICAgICByZXR1cm4gZmlsdGVyQ2hhbmdlcyhhd2FpdCB0aGlzLmZpbmRJbmZvKFwiXCIpLCBjb25maWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8eyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9W10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZmluZEluZm8gJHtwcmVmaXh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb25maWc/LnNoYWxsb3cgJiYgY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgIGxldCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4KTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfT4oKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB7IHBhdGgsIGNyZWF0ZVRpbWUsIHNpemUgfSBvZiBhbGxGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGFsbEZvbGRlcnMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWUsIHNpemUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGFsbEZvbGRlcnMudmFsdWVzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfT4oKTtcbiAgICAgICAgICAgIGxldCBzdGFydEZpbGVOYW1lID0gXCJcIjtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtYXhGaWxlQ291bnQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogY29uZmlnPy5zaGFsbG93ID8gXCIvXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiByZXN1bHQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuYWN0aW9uID09PSBcInVwbG9hZFwiICYmIGNvbmZpZz8udHlwZSAhPT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNldChmaWxlLmZpbGVOYW1lLCB7IHBhdGg6IGZpbGUuZmlsZU5hbWUsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5hY3Rpb24gPT09IFwiZm9sZGVyXCIgJiYgY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IGZpbGUuZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlciA9IGZvbGRlci5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGZpbGUuY29udGVudExlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXJ0RmlsZU5hbWUgPSByZXN1bHQubmV4dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIGlmICghc3RhcnRGaWxlTmFtZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlcy52YWx1ZXMoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhc3NlcnRQYXRoVmFsaWQocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBieXRlcyA9IEJ1ZmZlci5mcm9tKHBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCB0b28gbG9uZzogJHtwYXRoLmxlbmd0aH0gY2hhcmFjdGVycyA+IDEwMDAgY2hhcmFjdGVycy4gUGF0aDogJHtwYXRofWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiB7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0OiBJQXJjaGl2ZXM7XG4gICAgICAgIHRhcmdldFBhdGg6IHN0cmluZztcbiAgICAgICAgY29weUluc3RlYWQ/OiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IHsgcGF0aCwgdGFyZ2V0LCB0YXJnZXRQYXRoIH0gPSBjb25maWc7XG4gICAgICAgIC8vIEEgc2VsZiBtb3ZlIHNob3VsZCBOT09QIChhbmQgZGVmaW5pdGVseSBub3QgY29weSwgYW5kIHRoZW4gZGVsZXRlIGl0c2VsZiEpXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMgJiYgcGF0aCA9PT0gdGFyZ2V0UGF0aCkge1xuICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBtb3ZlIHBhdGggdG8gaXRzZWxmLiBTa2lwcGluZyBtb3ZlLCBhcyB0aGVyZSBpcyBubyB3b3JrIHRvIGRvLiAke3BhdGh9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEFyY2hpdmVzQmFja2JsYXplKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0QnVja2V0SWQgPSB0YXJnZXQuYnVja2V0SWQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0QnVja2V0SWQgPT09IHRoaXMuYnVja2V0SWQgJiYgcGF0aCA9PT0gdGFyZ2V0UGF0aCkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBtb3ZlICR7cGF0aH0gLT4gJHt0YXJnZXRQYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBVZ2guLi4gbGlzdGluZyB0aGUgZmlsZSBuYW1lIHN1Y2tzLCBidXQuLi4gSSBndWVzcyBpdCdzIHN0aWxsIGJldHRlciB0aGFuIGRvd25sb2FkaW5nIGFuZCByZS11cGxvYWRpbmcgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgYXBpLmxpc3RGaWxlTmFtZXMoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgcHJlZml4OiBwYXRoLCBtYXhGaWxlQ291bnQ6IDEwIH0pO1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gaW5mby5maWxlcy5maW5kKHggPT4geC5maWxlTmFtZSA9PT0gcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY29weUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlSWQ6IGZpbGUuZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdGFyZ2V0UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogdGFyZ2V0QnVja2V0SWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5nZXQocGF0aCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgdG8gbW92ZTogJHtwYXRofWApO1xuICAgICAgICAgICAgYXdhaXQgdGFyZ2V0LnNldCh0YXJnZXRQYXRoLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uZmlnLmNvcHlJbnN0ZWFkKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKHRhcmdldFBhdGgpO1xuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGaWxlIG5vdCBmb3VuZCBhZnRlciBtb3ZlLiBMZWF2aW5nIEJPVEggZmlsZXMuICR7dGFyZ2V0UGF0aH0gd2FzIG5vdCBmb3VuZC4gQmVpbmcgbW92ZWQgZnJvbSAke3BhdGh9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvcHkoY29uZmlnOiB7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0OiBJQXJjaGl2ZXM7XG4gICAgICAgIHRhcmdldFBhdGg6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmUoeyAuLi5jb25maWcsIGNvcHlJbnN0ZWFkOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldFVSTCAke3BhdGh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRVUkwoXCJmaWxlL1wiICsgdGhpcy5idWNrZXROYW1lICsgXCIvXCIgKyBwYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERvd25sb2FkQXV0aG9yaXphdGlvbihjb25maWc6IHtcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgIHZhbGlkRHVyYXRpb25JblNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgYjJDb250ZW50RGlzcG9zaXRpb24/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudExhbmd1YWdlPzogc3RyaW5nO1xuICAgICAgICBiMkV4cGlyZXM/OiBzdHJpbmc7XG4gICAgICAgIGIyQ2FjaGVDb250cm9sPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRFbmNvZGluZz86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50VHlwZT86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uICR7Y29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCJ9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5nZXREb3dubG9hZEF1dGhvcml6YXRpb24oe1xuICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4OiBjb25maWcuZmlsZU5hbWVQcmVmaXggPz8gXCJcIixcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKlxuTmFtZXMgc2hvdWxkIGJlIGEgVVRGLTggc3RyaW5nIHVwIHRvIDEwMjQgYnl0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6XG4gICAgQ2hhcmFjdGVyIGNvZGVzIGJlbG93IDMyIGFyZSBub3QgYWxsb3dlZC5cbiAgICBERUwgY2hhcmFjdGVycyAoMTI3KSBhcmUgbm90IGFsbG93ZWQuXG4gICAgQmFja3NsYXNoZXMgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEZpbGUgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggLywgZW5kIHdpdGggLywgb3IgY29udGFpbiAvLy5cbiovXG5cblxuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IGRvbWFpbiB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHJpdmF0ZUltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wcml2YXRlLWltbXV0YWJsZVwiLFxuICAgICAgICBpbW11dGFibGU6IHRydWVcbiAgICB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHVibGljSW1tdXRhYmxlID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXB1YmxpYy1pbW11dGFibGVcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBpbW11dGFibGU6IHRydWUsXG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbYGh0dHBzOi8vJHtkb21haW59YCwgYGh0dHBzOi8vMTI3LTAtMC0xLiR7ZG9tYWlufTo3MDA3YF0sXG4gICAgfSk7XG59KTtcblxuLy8gTk9URTogQ2FjaGUgYnkgYSBtaW51dGUuIFRoaXMgbWlnaHQgYmUgYSBiYWQgaWRlYSwgYnV0Li4uIHVzdWFsbHkgd2hvbGUgcmVhc29uIGZvciBwdWJsaWMgaXMgZm9yIGNsb3VkZmxhcmUgY2FjaGluZyAoYXMgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IGFjY2VzcyBpdCB0aHJvdWdoIGEgc2VydmVyKSwgb3IgZm9yIGxhcmdlIGZpbGVzICh3aGljaCBzaG91bGQgYmUgY2FjaGVkIGFueXdheXMsIGFuZCBwcm9iYWJseSBldmVuIHVzZSBpbW11dGFibGUgY2FjaGluZykuXG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQdWJsaWMgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHVibGljXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgY2FjaGVUaW1lOiB0aW1lSW5NaW51dGUsXG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbYGh0dHBzOi8vJHtkb21haW59YCwgYGh0dHBzOi8vMTI3LTAtMC0xLiR7ZG9tYWlufTo3MDA3YF0sXG4gICAgfSk7XG59KTsiXX0=
822
+ /* _JS_SOURCE_HASH = "0b6ee356930999d6e31948dba2322ab150d1f1e29d867616aa98f743fd092548"; */
@@ -2,11 +2,12 @@ type DeployTakeover = {
2
2
  releaseTime: number;
3
3
  overlapTime: number;
4
4
  altPort?: number;
5
+ intermediateStart?: number;
5
6
  };
6
7
  /** Called when the main port is already in use, which on a healthy machine only happens while our predecessor is still running a deploy overlap. Confirms that against the deploy timeline; if no deploy is in progress we are in a bad state (someone else holds our port) and the process must not keep running. */
7
8
  export declare function detectDeployTakeover(): Promise<DeployTakeover>;
8
9
  export declare function setAltPort(port: number): void;
9
- /** The window in which writes belong to our alternate port: from the release until our predecessor is killed and we take the main port. */
10
+ /** The window in which writes belong to our alternate port: from partway through the overlap (giving the predecessor notice to flush) until safely past its kill (giving us time to actually take the main port). */
10
11
  export declare function getTakeoverIntermediate(): {
11
12
  start: number;
12
13
  end: number;
@@ -6,8 +6,9 @@ const PARAMETERS_TIMELINE_FILE_REGEX = /^(\d+)-parameters\.json$/;
6
6
  const DEPLOY_DETECT_RETRY_DELAY = 5 * 1000;
7
7
  const DEPLOY_DETECT_TIMEOUT = 30 * 1000;
8
8
  const EXIT_LOG_FLUSH_DELAY = 5 * 1000;
9
- const DEPLOY_RELEASE_MATCH_WINDOW = 5 * 60 * 1000;
10
9
  const ALT_PORT_LINGER = 30 * 60 * 1000;
10
+ // The end time needs to be enough after the kill time that we are certain we will have the main port by then. Scaled up with the overlap, so unusually long overlaps get an equally generous buffer.
11
+ const INTERMEDIATE_END_MIN_BUFFER = 5 * 60 * 1000;
11
12
  const ACQUIRE_SLOW_DELAY = 30 * 1000;
12
13
  const ACQUIRE_FAST_DELAY = 1000;
13
14
  const ACQUIRE_FAST_WINDOW = 60 * 1000;
@@ -20,6 +21,8 @@ type DeployTakeover = {
20
21
  releaseTime: number;
21
22
  overlapTime: number;
22
23
  altPort?: number;
24
+ // Frozen when the alt port is taken (a moving start would make every maintenance pass write a new config)
25
+ intermediateStart?: number;
23
26
  };
24
27
 
25
28
  let takeover: DeployTakeover | undefined;
@@ -57,14 +60,13 @@ async function readTimelineEntries(): Promise<TimelineEntry[]> {
57
60
  return entries;
58
61
  }
59
62
 
60
- function findOurRelease(entries: TimelineEntry[], now: number): DeployTakeover | undefined {
63
+ // The newest release in the timeline is the one we are part of - the timeline is append-only history, so whatever process starts up during a takeover belongs to its latest entry
64
+ function findOurRelease(entries: TimelineEntry[]): DeployTakeover | undefined {
61
65
  let best: DeployTakeover | undefined;
62
66
  for (let entry of entries) {
63
67
  let releaseTime = entry.parameters.releaseTime;
64
68
  if (releaseTime === undefined) continue;
65
69
  let overlapTime = entry.parameters.overlapTime || 0;
66
- if (releaseTime > now + DEPLOY_RELEASE_MATCH_WINDOW) continue;
67
- if (now > releaseTime + overlapTime + DEPLOY_RELEASE_MATCH_WINDOW) continue;
68
70
  if (best && best.releaseTime >= releaseTime) continue;
69
71
  best = { releaseTime, overlapTime };
70
72
  }
@@ -79,7 +81,7 @@ export async function detectDeployTakeover(): Promise<DeployTakeover> {
79
81
  while (true) {
80
82
  attempt++;
81
83
  let entries = await readTimelineEntries();
82
- let found = findOurRelease(entries, Date.now());
84
+ let found = findOurRelease(entries);
83
85
  if (found) {
84
86
  takeover = found;
85
87
  console.warn(`${logPrefix()} Deploy takeover confirmed on attempt ${attempt}: release at ${iso(found.releaseTime)}, overlap ${found.overlapTime}ms, so our predecessor holds the main port until ${iso(found.releaseTime + found.overlapTime)}. We are the successor.`);
@@ -102,21 +104,29 @@ export function setAltPort(port: number): void {
102
104
  throw new Error(`An alternate port (${port}) was taken without a detected deploy takeover - detectDeployTakeover must run first`);
103
105
  }
104
106
  takeover.altPort = port;
105
- console.warn(`${logPrefix()} Listening on alternate port ${port}: writes route here until ${iso(getIntermediateEnd())}, and we keep listening until ${iso(getAltPortListenEnd())}`);
107
+ // Needs to be enough after our startup time that the previous node has time to see it's going to be shut down and flush (and so we have time to start up), and enough before the kill time that nodes have time to notice we exist and prepare to connect to us - halfway between now and the kill time satisfies both
108
+ takeover.intermediateStart = Math.round((Date.now() + getKillTime()) / 2);
109
+ console.warn(`${logPrefix()} Listening on alternate port ${port}: writes route here from ${iso(takeover.intermediateStart)} until ${iso(getIntermediateEnd())}, and we keep listening until ${iso(getAltPortListenEnd())}`);
106
110
  startIntermediateMaintenance();
107
111
  }
108
112
 
109
- /** The window in which writes belong to our alternate port: from the release until our predecessor is killed and we take the main port. */
113
+ /** The window in which writes belong to our alternate port: from partway through the overlap (giving the predecessor notice to flush) until safely past its kill (giving us time to actually take the main port). */
110
114
  export function getTakeoverIntermediate(): { start: number; end: number; altPort: number } | undefined {
111
- if (!takeover?.altPort) return undefined;
112
- return { start: takeover.releaseTime, end: getIntermediateEnd(), altPort: takeover.altPort };
115
+ if (!takeover?.altPort || takeover.intermediateStart === undefined) return undefined;
116
+ return { start: takeover.intermediateStart, end: getIntermediateEnd(), altPort: takeover.altPort };
113
117
  }
114
118
 
115
- function getIntermediateEnd(): number {
119
+ /** When our predecessor is killed and the main port frees. Port acquisition polls against this on its own - it is entirely independent of the intermediate window. */
120
+ function getKillTime(): number {
116
121
  if (!takeover) return 0;
117
122
  return takeover.releaseTime + takeover.overlapTime;
118
123
  }
119
124
 
125
+ function getIntermediateEnd(): number {
126
+ if (!takeover) return 0;
127
+ return getKillTime() + Math.max(INTERMEDIATE_END_MIN_BUFFER, takeover.overlapTime);
128
+ }
129
+
120
130
  /** We never stop listening on the alternate port while its window is still valid, and hold it well past that for clients that have not caught up yet. */
121
131
  export function getAltPortListenEnd(): number {
122
132
  if (!takeover) return 0;
@@ -126,8 +136,7 @@ export function getAltPortListenEnd(): number {
126
136
  /** How long to wait between main-port acquisition attempts: tight around our predecessor's scheduled death (when the port actually frees), relaxed otherwise. */
127
137
  export function getMainPortAcquireDelay(): number {
128
138
  if (!takeover) return ACQUIRE_SLOW_DELAY;
129
- let predecessorEnd = takeover.releaseTime + takeover.overlapTime;
130
- if (Date.now() >= predecessorEnd - ACQUIRE_FAST_WINDOW) {
139
+ if (Date.now() >= getKillTime() - ACQUIRE_FAST_WINDOW) {
131
140
  return ACQUIRE_FAST_DELAY;
132
141
  }
133
142
  return ACQUIRE_SLOW_DELAY;