@decaf-ts/for-fabric 0.13.31-experimental.1 → 0.13.31-experimental.3

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.
@@ -2476,20 +2476,20 @@
2476
2476
  return await promises.readFile(keyPath);
2477
2477
  };
2478
2478
  const privateKeyPem = await contentOfLoadFile(keyDirectoryPath, signerFileReader);
2479
- const privateKey = await extractPrivateKey(privateKeyPem);
2480
- const keys = Object.getOwnPropertySymbols(privateKey);
2481
- const k = privateKey[keys[0]];
2479
+ let k;
2480
+ if (logging.isBrowser()) {
2481
+ const privateKey = await extractPrivateKey(privateKeyPem);
2482
+ const keys = Object.getOwnPropertySymbols(privateKey);
2483
+ k = privateKey[keys[0]];
2484
+ } else {
2485
+ const {createPrivateKey: createPrivateKey} = await import("crypto");
2486
+ k = createPrivateKey(privateKeyPem);
2487
+ }
2482
2488
  return fabricGateway.signers.newPrivateKeySigner(k);
2483
2489
  }
2484
2490
  async function extractPrivateKey(pem) {
2485
- const libName = "node:crypto";
2486
2491
  let subtle;
2487
- if (logging.isBrowser()) {
2488
- subtle = globalThis.crypto.subtle;
2489
- } else {
2490
- const lib = await core.normalizeImport(import(libName));
2491
- subtle = lib.subtle || lib.webcrypto.subtle;
2492
- }
2492
+ subtle = globalThis.crypto.subtle;
2493
2493
  if (!subtle) throw new Error("Could not load SubtleCrypto module");
2494
2494
  function str2ab(str) {
2495
2495
  const buf = new ArrayBuffer(str.length);
@@ -3898,9 +3898,9 @@
3898
3898
  }
3899
3899
  }
3900
3900
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3901
- const VERSION = "0.13.31-experimental.0";
3901
+ const VERSION = "0.13.31-experimental.2";
3902
3902
  const COMMIT = "b1b62a8";
3903
- const FULL_VERSION = "0.13.31-experimental.0-b1b62a8";
3903
+ const FULL_VERSION = "0.13.31-experimental.2-b1b62a8";
3904
3904
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3905
3905
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3906
3906
  exports.AllowanceError = AllowanceError;
@@ -3998,4 +3998,4 @@
3998
3998
  exports.writeDesignDocs = writeDesignDocs;
3999
3999
  exports.writeIndexes = writeIndexes;
4000
4000
  });
4001
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRDb250ZXh0LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4ID0gQ3JlYXRlSW5kZXhSZXF1ZXN0O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJpbWFyeUtleUZpZWxkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBsb2c6IExvZ2dlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKE1vZGVsLnBrKG0pKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBTa2lwcGluZyAke20ubmFtZX0gd2hpbGUgZXh0cmFjdGluZyBpbmRleGVzOiBubyBwcmltYXJ5IGtleSBpcyBkZWZpbmVkYDtcbiAgICBsb2cudmVyYm9zZShtZXNzYWdlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHBrRmllbGQ6IHN0cmluZ1xuKTogSW5kZXhbXSB7XG4gIGlmICghcGtGaWVsZCkge1xuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXMubWFwKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IChpbmRleCBhcyBhbnkpPy5pbmRleD8uZmllbGRzO1xuICAgIGlmIChcbiAgICAgICFpbmRleD8ubmFtZSB8fFxuICAgICAgdHlwZW9mIGluZGV4Lm5hbWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFpbmRleC5uYW1lLmluY2x1ZGVzKFwiZGVmYXVsdFF1ZXJ5XCIpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShmaWVsZHMpIHx8XG4gICAgICBmaWVsZHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZDogYW55KSA9PiB0eXBlb2YgZmllbGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZmllbGQpXG4gICAgKTtcbiAgICBpZiAoc29ydGVkRmllbGRzLmxlbmd0aCAhPT0gZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BrID0gZmllbGRzLnNvbWUoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIHBrRmllbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGhhc1BrKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGxhc3REaXJlY3Rpb24gPSBTdHJpbmcoXG4gICAgICBPYmplY3QudmFsdWVzKGxhc3RGaWVsZCB8fCB7fSlbMF0gfHwgXCJhc2NcIlxuICAgICkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBsYXN0RGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmRleCwge1xuICAgICAgaW5kZXg6IE9iamVjdC5hc3NpZ24oe30sIChpbmRleCBhcyBhbnkpLmluZGV4LCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbcGtGaWVsZF06IGRpcmVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbEluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGxvZzogTG9nZ2VyXG4pOiBJbmRleFtdIHtcbiAgY29uc3QgaW5kZXhlcyA9IGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xuICBjb25zdCBwa0ZpZWxkID0gcmVzb2x2ZVByaW1hcnlLZXlGaWVsZChtLCBsb2cpO1xuICByZXR1cm4gd2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlcihpbmRleGVzLCBwa0ZpZWxkIHx8IFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSk7XG4gIGNvbnN0IGV4cG9ydHMgPSByZXF1aXJlKGZpbGVQYXRoKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZGVsRm9sZGVycyhcbiAgLi4uZm9sZGVyczogc3RyaW5nW11cbik6IFByb21pc2U8TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10+IHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHJlc29sdmVkRm9sZGVyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmOiBhbnkpID0+IGYuaXNGaWxlKCkgJiYgZi5uYW1lLmVuZHNXaXRoKFwianNcIikpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUluZGV4ZXMoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9aW5kZXhlcy8ke2luZGV4Lm5hbWV9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShpbmRleCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNpZ25Eb2NzKFxuICBkZXNpZ25Eb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRlc2lnbkRvY3MubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZGVzaWduRG9jcy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQucmVwbGFjZSgvXl9kZXNpZ25cXC8vLCBcIlwiKTtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9ZGVzaWduX2RvY3MvJHtkb2NJZH0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBjb25zdCBwYXlsb2FkID0geyAuLi5kb2MgfTtcbiAgICBkZWxldGUgcGF5bG9hZC5fcmV2O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJEZXNpZ25Eb2MgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvbHZlciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IHdyaXRlRGVzaWduRG9jcyB9IGZyb20gXCIuLi9pbmRleGVzL2dlbmVyYXRpb25cIjtcblxuLy9cbi8vIGV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4vLyAgIG5hbWU6IFwiY29sbGVjdGlvbk1hcmJsZXNcIjtcbi8vICAgcG9saWN5OiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIHJlcXVpcmVkUGVlckNvdW50OiAwO1xuLy8gICBtYXhQZWVyQ291bnQ6IDM7XG4vLyAgIGJsb2NrVG9MaXZlOiAwO1xuLy8gICBtZW1iZXJPbmx5UmVhZDogdHJ1ZTtcbi8vICAgbWVtYmVyT25seVdyaXRlOiB0cnVlO1xuLy8gICBlbmRvcnNlbWVudFBvbGljeToge1xuLy8gICAgIGlkZW50aXRpZXM6IFtcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcxTVNQXCIgfSB9LFxuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzJNU1BcIiB9IH0sXG4vLyAgICAgXTtcbi8vICAgICBydWxlOiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIH07XG4vLyB9O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNQb2xpY3lJZGVudGl0eSA9IHtcbiAgcm9sZToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtc3BJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5OiB7XG4gICAgaWRlbnRpdGllczogRmFicmljUG9saWN5SWRlbnRpdHlbXTtcbiAgICBydWxlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcml2YXRlQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5Pzoge1xuICAgIHNpZ25hdHVyZVBvbGljeTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3Rpb25Gb3IoXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHBvbGljeTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlcixcbiAgYmxvY2tUb0xpdmU6IG51bWJlcixcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4sXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhblxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHBvbGljeTogcG9saWN5LFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IGAke21zcElkfVByaXZhdGVgLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUignJHttc3BJZH0ubWVtYmVyJylgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcblxuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYE9SKCcke21zcElkfS5wZWVyJylgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gIG1zcElkczogc3RyaW5nW10sXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAxLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219Lm1lbWJlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgQU5EKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219LnBlZXInYCkuam9pbihcIixcIil9KWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBvdmVycmlkZXM6IHtcbiAgICBwcml2YXRlQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICAgIHNoYXJlZENvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgfSA9IHt9LFxuICBtaXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGxldCB7IHByaXZhdGVDb2xzLCBzaGFyZWRDb2xzIH0gPSBNb2RlbC5jb2xsZWN0aW9uc0ZvcihtKTtcblxuICBmdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihhcmc6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgICAgcmV0dXJuIGFyZyhtLCBtc3BJZHNbMF0pIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlQ29scyA9IHByaXZhdGVDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG4gIHNoYXJlZENvbHMgPSBzaGFyZWRDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG5cbiAgY29uc3QgcHJpdmF0ZURlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMCxcbiAgICAgIG1heFBlZXJDb3VudDogMCxcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnByaXZhdGVDb2xzIHx8IHt9XG4gICk7XG4gIGNvbnN0IHNoYXJlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMSxcbiAgICAgIG1heFBlZXJDb3VudDogMixcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnNoYXJlZENvbHMgfHwge31cbiAgKTtcblxuICBjb25zdCBtaXJyb3JNZXRhID0gbWlycm9yID8gTW9kZWwubWlycm9yZWRBdChtKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBwcml2YXRlcyA9IG1zcElkc1xuICAgIC5tYXAoKG1zcElkKSA9PlxuICAgICAgKHByaXZhdGVDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgICByZXR1cm4gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbXNwSWQsXG4gICAgICAgICAgcCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKVxuICAgIC5mbGF0KCk7XG5cbiAgaWYgKG1pcnJvck1ldGEgJiYgbWlycm9yTWV0YS5tc3BJZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgIHR5cGVvZiBtaXJyb3JNZXRhLnJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWlycm9yTWV0YS5yZXNvbHZlclxuICAgICAgICA6IG1pcnJvck1ldGEucmVzb2x2ZXIobSwgbWlycm9yTWV0YS5tc3BJZCk7XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZWQgJiZcbiAgICAgICFwcml2YXRlcy5zb21lKFxuICAgICAgICAocCkgPT4gcC5uYW1lID09PSByZXNvbHZlZCAmJiBwLnBvbGljeS5pbmNsdWRlcyhtaXJyb3JNZXRhLm1zcElkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgIHByaXZhdGVzLnB1c2goXG4gICAgICAgIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1pcnJvck1ldGEubXNwSWQsXG4gICAgICAgICAgcmVzb2x2ZWQsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2hhcmVkID0gKHNoYXJlZENvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgICB9ID0gc2hhcmVkRGVmYXVsdHM7XG4gICAgcmV0dXJuIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gICAgICBtc3BJZHMsXG4gICAgICBwLFxuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlcyxcbiAgICBzaGFyZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25zKFxuICBjb2xzOiBQcml2YXRlQ29sbGVjdGlvbltdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBmaWxlTmFtZSA9IFwiY29sbGVjdGlvbnNfY29uZmlnXCJcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4ocCwgYC4vTUVUQS1JTkYvJHtmaWxlTmFtZX0uanNvbmApKTtcbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGNvbHMsIHVuZGVmaW5lZCwgMikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhcbiAgZG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkb2NzPy5sZW5ndGgpIHJldHVybjtcbiAgd3JpdGVEZXNpZ25Eb2NzKGRvY3MsIHAsIGNvbGxlY3Rpb24pO1xufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBTZXJpYWxpemVkUGFnZSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGlzU2VyaWFsaXplZFBhZ2Uob2JqOiBTZXJpYWxpemVkUGFnZTxhbnk+IHwgYW55KSB7XG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciBleHRlbmRzIFRyYW5zYWN0aW9uTGltaXRzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvci5uYW1lLCA1OTMpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjbGllbnQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgZ2VuZXJpYyBSZXBvc2l0b3J5IHRvIHByZXBhcmUgY29udGV4dCBhbmQgYXJndW1lbnRzIGZvciBDUlVEIG9wZXJhdGlvbnMgZXhlY3V0ZWQgdmlhIGEgRmFicmljIGNsaWVudCBBZGFwdGVyLCB3aXJpbmcgUmVwb3NpdG9yeUZsYWdzIGFuZCBGYWJyaWMtc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+fSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIHVzZWQgdG8gZXhlY3V0ZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgbW9kZWwgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgcmVwb3NpdG9yeVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuICogaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWZhYnJpY1wiO1xuICpcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBNb2RlbCB7IGlkITogc3RyaW5nOyBuYW1lITogc3RyaW5nOyB9XG4gKiBjb25zdCByZXBvID0gbmV3IEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8VXNlcj4oKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlcG8ucmVhZChcIjFcIik7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+UmVwbzogY3JlYXRlUHJlZml4KG1vZGVsLCAuLi5hcmdzKVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIGZsYWdzKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHJlc3VsdFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQSBleHRlbmRzIEZhYnJpY0NsaWVudEFkYXB0ZXIgPSBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgQT4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX292ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN1cGVyW1wiX292ZXJyaWRlc1wiXSwge1xuICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgYWxsb3dSYXdTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzOiB0cnVlLFxuICAgIGZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzOiB0cnVlLFxuICAgIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiBmYWxzZSxcbiAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenosIGZvcmNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBvcmRlcixcbiAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgKSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBsaXN0QnkgcmVzdWx0IHNldCB0b28gbGFyZ2UgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBrZXk9JHtTdHJpbmcoa2V5KX0gb3JkZXI9JHtvcmRlcn0uIFJldHVybmluZyBlbXB0eSBsaXN0LiBVc2UgcGFnaW5hdGVCeSBmb3IgbGFyZ2UgZGF0YXNldHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW10gYXMgTVtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG4gIENPTlRSQUNUID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY29udHJhY3RgLFxuICBDSEFJTkNPREUgPSBgJHtGYWJyaWNNb2RlbEtleXMuRkFCUklDfS5jaGFpbmNvZGVgLFxuICBDSEFOTkVMID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY2hhbm5lbGAsXG4gIE9WRVJSSURFUyA9IGBfX292ZXJyaWRlc2AsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgRmFicmljQ0FTZXJ2aWNlcyBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL21vZGVsL0lkZW50aXR5XCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSHlwZXJsZWRnZXIgRmFicmljIENBIGlkZW50aXR5IHR5cGVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIHJlY29nbml6ZWQgYnkgRmFicmljIENBIGZvciByZWdpc3RyYXRpb24gYW5kIGlkZW50aXR5IG1hbmFnZW1lbnQuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eVR5cGUge1xuICBQRUVSID0gXCJwZWVyXCIsXG4gIE9SREVSRVIgPSBcIm9yZGVyZXJcIixcbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbiAgVVNFUiA9IFwidXNlclwiLFxuICBBRE1JTiA9IFwiYWRtaW5cIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleS92YWx1ZSBhdHRyaWJ1dGUgdXNlZCBkdXJpbmcgQ0EgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZW50cnkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBGYWJyaWMgQ0EgaWRlbnRpdHkgZHVyaW5nIHJlZ2lzdHJhdGlvbiwgb3B0aW9uYWxseSBtYXJraW5nIGl0IGZvciBpbmNsdXNpb24gaW4gZWNlcnQuXG4gKiBAaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlY2VydF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIChFQ2VydCkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlY2VydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIEZhYnJpYyBDQSBpZGVudGl0eSBhdHRyaWJ1dGUga2V5cy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgd2VsbC1rbm93biBGYWJyaWMgQ0EgYXR0cmlidXRlIGtleXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyBmb3IgZGVsZWdhdGlvbnMgYW5kIHBlcm1pc3Npb25zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIHtcbiAgSEZSRUdJU1RSQVJST0xFUyA9IFwiaGYuUmVnaXN0cmFyLlJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSREVMRUdBVEVST0xFUyA9IFwiaGYuUmVnaXN0cmFyLkRlbGVnYXRlUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJBVFRSSUJVVEVTID0gXCJoZi5SZWdpc3RyYXIuQXR0cmlidXRlc1wiLFxuICBIRklOVEVSTUVESUFURUNBID0gXCJoZi5JbnRlcm1lZGlhdGVDQVwiLFxuICBIRlJFVk9LRVIgPSBcImhmLlJldm9rZXJcIixcbiAgSEZBRkZJTElBVElPTk1HUiA9IFwiaGYuQWZmaWxpYXRpb25NZ3JcIixcbiAgSEZHRU5DUkwgPSBcImhmLkdlbkNSTFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIHdyYXBwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0EuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBoaWdoLWxldmVsIG9wZXJhdGlvbnMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYWdhaW5zdCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIGluY2x1ZGluZyByZWdpc3RyYXRpb24sIGVucm9sbG1lbnQsIHJldm9jYXRpb24sIGFuZCBhZG1pbmlzdHJhdGl2ZSBxdWVyaWVzLiBFbmNhcHN1bGF0ZXMgbG93ZXItbGV2ZWwgRmFicmljIENBIGNsaWVudCBjYWxscyB3aXRoIGNvbnNpc3RlbnQgbG9nZ2luZyBhbmQgZXJyb3IgbWFwcGluZy5cbiAqIEBwYXJhbSB7Q0FDb25maWd9IGNhQ29uZmlnIC0gQ29ubmVjdGlvbiBhbmQgVExTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXQgQ0EuXG4gKiBAY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHN2YyA9IG5ldyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vbG9jYWxob3N0OjcwNTQnLFxuICogICBjYU5hbWU6ICdPcmcxQ0EnLFxuICogICB0bHM6IHsgdHJ1c3RlZFJvb3RzOiBbJy9wYXRoL3RvL2NhLnBlbSddLCB2ZXJpZnk6IGZhbHNlIH0sXG4gKiAgIGNhQ2VydDogJy9wYXRoL3RvL2FkbWluL2NlcnREaXInLFxuICogICBjYUtleTogJy9wYXRoL3RvL2FkbWluL2tleURpcidcbiAqIH0pO1xuICogYXdhaXQgc3ZjLnJlZ2lzdGVyKHsgdXNlck5hbWU6ICdhbGljZScsIHBhc3N3b3JkOiAnczNjcjN0JyB9LCBmYWxzZSwgJ29yZzEuZGVwYXJ0bWVudDEnLCBDQV9ST0xFLlVTRVIpO1xuICogY29uc3QgaWQgPSBhd2FpdCBzdmMuZW5yb2xsKCdhbGljZScsICdzM2NyM3QnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgYXV0b251bWJlclxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU3ZjIGFzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiAgIHBhcnRpY2lwYW50IENBIGFzIEZhYnJpYyBDQVxuICogICBBcHAtPj5TdmM6IHJlZ2lzdGVyKGNyZWRlbnRpYWxzLCAuLi4pXG4gKiAgIFN2Yy0+PkNBOiByZWdpc3RlcihyZXF1ZXN0LCBhZG1pblVzZXIpXG4gKiAgIENBLS0+PlN2YzogZW5yb2xsbWVudFNlY3JldFxuICogICBTdmMtLT4+QXBwOiBzZWNyZXRcbiAqICAgQXBwLT4+U3ZjOiBlbnJvbGwoZW5yb2xsbWVudElkLCBzZWNyZXQpXG4gKiAgIFN2Yy0+PkNBOiBlbnJvbGwoe2Vucm9sbG1lbnRJRCwgc2VjcmV0fSlcbiAqICAgQ0EtLT4+U3ZjOiBjZXJ0aWZpY2F0ZXNcbiAqICAgU3ZjLS0+PkFwcDogSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIGNhPzogRmFicmljQ0FTZXJ2aWNlcztcblxuICBwcml2YXRlIGNlcnRpZmljYXRlU2VydmljZT86IGFueTtcblxuICBwcml2YXRlIGFmZmlsaWF0aW9uU2VydmljZT86IEFmZmlsaWF0aW9uU2VydmljZTtcblxuICBwcml2YXRlIGlkZW50aXR5U2VydmljZT86IElkZW50aXR5U2VydmljZTtcblxuICBwcml2YXRlIGNsaWVudD86IGFueTtcblxuICBwcml2YXRlIHVzZXI/OiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FDb25maWc6IENBQ29uZmlnKSB7XG4gICAgQ29yZVV0aWxzLmdldENyeXB0b1N1aXRlKFxuICAgICAgY2FDb25maWcuaHNtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc29mdHdhcmU6IGZhbHNlLFxuICAgICAgICAgICAgbGliOiBjYUNvbmZpZy5oc20ubGlicmFyeSxcbiAgICAgICAgICAgIHNsb3Q6IGNhQ29uZmlnLmhzbS5zbG90LFxuICAgICAgICAgICAgbGFiZWw6IGNhQ29uZmlnLmhzbS50b2tlbkxhYmVsLFxuICAgICAgICAgICAgcGluOiBTdHJpbmcoY2FDb25maWcuaHNtLnBpbiksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIGlmICh0aGlzLnVzZXIpIHJldHVybiB0aGlzLnVzZXI7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSB0aGlzLmNhQ29uZmlnO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLlVzZXIpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy51c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ0EoKTogUHJvbWlzZTxGYWJyaWNDQVNlcnZpY2VzPiB7XG4gICAgaWYgKHRoaXMuY2EpIHJldHVybiB0aGlzLmNhO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLkNBKTtcbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IHRoaXMuY2FDb25maWc7XG5cbiAgICAvLyBGT1IgU29tZSBSZWFzb24gdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgd29ya3MgZm9yIG5vd1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSBDbGllbnQgZm9yIENBICR7Y2FOYW1lfSB1bmRlciAke3VybH1gKTtcbiAgICB0aGlzLmNhID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENsaWVudCgpOiBQcm9taXNlPHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfT4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuIHRoaXMuY2xpZW50O1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIHRoaXMuY2xpZW50ID0gKGNhIGFzIGFueSlbXCJfRmFicmljQ0FTZXJ2aWNlc1wiXTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2VydGlmaWNhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNlcnRpZmljYXRlU2VydmljZSlcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ2xpZW50KCkpLm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmNlcnRpZmljYXRlU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBBZmZpbGlhdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmFmZmlsaWF0aW9uU2VydmljZSlcbiAgICAgIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIElkZW50aXRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmlkZW50aXR5U2VydmljZSlcbiAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBDQSBjZXJ0aWZpY2F0ZSBzZXJ2aWNlIHRvIGxpc3QgY2VydGlmaWNhdGVzLCBvcHRpb25hbGx5IG1hcHBpbmcgdG8gUEVNIHN0cmluZ3Mgb25seS5cbiAgICogQHBhcmFtIHtHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0fSBbcmVxdWVzdF0gLSBPcHRpb25hbCBmaWx0ZXIgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGUgbG9va3VwLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb01hcD10cnVlXSAtIFdoZW4gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBQRU0gc3RyaW5nczsgb3RoZXJ3aXNlIHJldHVybnMgZnVsbCByZXNwb25zZSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPn0gQXJyYXkgb2YgUEVNIHN0cmluZ3Mgb3IgdGhlIGZ1bGwgY2VydGlmaWNhdGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXAgPSB0cnVlXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGVTZXJ2aWNlID0gYXdhaXQgdGhpcy5DZXJ0aWZpY2F0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDZXJ0aWZpY2F0ZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBjZXJ0aWZpY2F0ZVNlcnZpY2UuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3QgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgaWRlbnRpdHkgc2VydmljZSB0byBmZXRjaCBhbGwgaWRlbnRpdGllcyBhbmQgcmV0dXJucyB0aGUgbGlzdCBhcyBGYWJyaWNJZGVudGl0eSBvYmplY3RzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+fSBUaGUgbGlzdCBvZiBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcygpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBpZGVudGl0aWVzU2VydmljZSA9IGF3YWl0IHRoaXMuSWRlbnRpdGllcygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBpZGVudGl0aWVzU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoKSB7XG4gICAgY29uc3QgYWZmaWxpYXRpb25TZXJ2aWNlID0gYXdhaXQgdGhpcy5BZmZpbGlhdGlvbnMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBhZmZpbGlhdGlvblNlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5uZXdJZGVudGl0eVNlcnZpY2UoKS5nZXRPbmUoZW5yb2xsbWVudElkLCB1c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVnaXN0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IGNhLnJlZ2lzdGVyKHByb3BzLCB1c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmdcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLCB7fSkuZm9yKFxuICAgICAgdGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50XG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICB1cGRhdGVkT246IG5vdyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKGVucm9sbG1lbnRJZDogc3RyaW5nLCByZWdpc3RyYXRpb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZW5yb2xsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IGNhLmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljRW5yb2xsbWVudFNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jYUNvbmZpZy5jYU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHNcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLnJldm9rZShcbiAgICAgICAgeyBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLCByZWFzb246IFwiVXNlciBEZWxldGF0aW9uXCIgfSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0LCBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgbWluLFxuICBtaW5sZW5ndGgsXG4gIE1vZGVsLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciBleHRlbmRzIE1vZGVsIHtcbiAgQHJlcXVpcmVkKClcbiAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCI7XG4gIEBtaW5sZW5ndGgoMSlcbiAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXTtcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudElEITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50U2VjcmV0ITogc3RyaW5nO1xuICBAbWluKDApXG4gIG1heEVucm9sbG1lbnRzPzogbnVtYmVyO1xuICBAcmVxdWlyZWQoKVxuICByb2xlITogc3RyaW5nO1xuXG4gIGJ1aWxkKCk6IElSZWdpc3RlclJlcXVlc3Qge1xuICAgIGNvbnN0IGVycnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElSZWdpc3RlclJlcXVlc3QgPSB7XG4gICAgICBlbnJvbGxtZW50SUQ6IHRoaXMuZW5yb2xsbWVudElELFxuICAgICAgZW5yb2xsbWVudFNlY3JldDogdGhpcy5lbnJvbGxtZW50U2VjcmV0LFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgYWZmaWxpYXRpb246IHRoaXMuYWZmaWxpYXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWF4RW5yb2xsbWVudHMgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXNwb25zZS5tYXhFbnJvbGxtZW50cyA9IHRoaXMubWF4RW5yb2xsbWVudHM7XG4gICAgaWYgKHRoaXMuYXR0cnMpIHJlc3BvbnNlLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBzZXRBZmZpbGlhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZmZpbGlhdGlvbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQXR0cihhdHRyOiBJS2V5VmFsdWVBdHRyaWJ1dGUpIHtcbiAgICB0aGlzLmF0dHJzID0gdGhpcy5hdHRycyB8fCBbXTtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0cik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdHRycyh2YWx1ZTogSUtleVZhbHVlQXR0cmlidXRlW10pIHtcbiAgICB0aGlzLmF0dHJzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50SUQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudElEID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRTZWNyZXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVucm9sbG1lbnRzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSb2xlKHZhbHVlOiBDQV9ST0xFIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5yb2xlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlTWV0YWRhdGEsXG4gIENvbGxlY3Rpb25SZXNvbHZlcixcbiAgTWlycm9yTWV0YWRhdGEsXG59IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBDb250ZXh0dWFsQXJncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzU2hhcmVkKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzUHJpdmF0ZSh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgcmV0dXJuIE1vZGVsLnNlZ3JlZ2F0ZSh0aGlzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgaWYgKCFNb2RlbC5pc1RyYW5zaWVudChtb2RlbCkpIHJldHVybiB7IG1vZGVsOiBtb2RlbCB9O1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID1cbiAgICBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgfHwgW107XG5cbiAgY29uc3QgdHJhbnNpZW50UHJvcHMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIERCS2V5cy5UUkFOU0lFTlRcbiAgKTtcbiAgY29uc3QgcHJpdmF0ZVByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG4gIGNvbnN0IHNoYXJlZFByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcblxuICBjb25zdCByZXN1bHQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IHtcbiAgICBtb2RlbDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHVibGljOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICB0cmFuc2llbnQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHByaXZhdGVzOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBzaGFyZWQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICB9O1xuXG4gIGNvbnN0IHRyYW5zaWVudEtleXMgPSBPYmplY3Qua2V5cyh0cmFuc2llbnRQcm9wcyB8fCB7fSk7XG4gIGNvbnN0IHByaXZhdGVLZXlzID0gT2JqZWN0LmtleXMocHJpdmF0ZVByb3BlcnRpZXMgfHwge30pO1xuICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkUHJvcGVydGllcyB8fCB7fSk7XG5cbiAgLy8gY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMga2V5b2YgTV07XG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSB0cmFuc2llbnRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNQdWJsaWMgPSAhaXNUcmFuc2llbnQ7XG4gICAgY29uc3QgaXNQcml2YXRlID0gcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1NoYXJlZCA9IHNoYXJlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAvLyBjb25zdCBpc1ByaW1hcnlLZXkgPSBrZXkgPT09IHBrS2V5O1xuXG4gICAgaWYgKGlzVHJhbnNpZW50IHx8IGlzUHJpdmF0ZSB8fCBpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnRyYW5zaWVudCA9IHJlc3VsdC50cmFuc2llbnQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnRyYW5zaWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgcmVzdWx0LnByaXZhdGVzID0gcmVzdWx0LnByaXZhdGVzIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5wcml2YXRlcyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQuc2hhcmVkID0gcmVzdWx0LnNoYXJlZCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQuc2hhcmVkIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIHJlc3VsdC5wdWJsaWMgPSAocmVzdWx0LnB1YmxpYyB8fCB7fSkgYXMgYW55O1xuICAgICAgKHJlc3VsdC5wdWJsaWMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0Lm1vZGVsID0gTW9kZWwuYnVpbGQocmVzdWx0LnB1YmxpYywgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgU2VncmVnYXRlZE1vZGVsPE0+O1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkID0gZnVuY3Rpb24gbWlycm9yZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkub3duZXJPZiA9IGZ1bmN0aW9uIG93bmVyT2Y8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vZGVsW21ldGEgYXMga2V5b2YgTV0gYXMgc3RyaW5nO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWRBdCA9IGZ1bmN0aW9uIG1pcnJvcmVkQXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogTWlycm9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBtb2RlbCA9IHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jb2xsZWN0aW9uc0ZvciA9IGZ1bmN0aW9uIGNvbGxlY3Rpb25zRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHtcbiAgcHJpdmF0ZUNvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG4gIHNoYXJlZENvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG59IHtcbiAgY29uc3QgcHJpdmF0ZUtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5QUklWQVRFXSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hhcmVkS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlNIQVJFRF0gYXMgc3RyaW5nW107XG5cbiAgY29uc3QgcHJpdmF0ZUtleSA9IE1ldGFkYXRhLmtleSguLi5wcml2YXRlS2V5cyk7XG4gIGNvbnN0IHNoYXJlZEtleSA9IE1ldGFkYXRhLmtleSguLi5zaGFyZWRLZXlzKTtcblxuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgY29uc3QgcHJpdmF0ZU1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBwcml2YXRlS2V5XG4gICk7XG4gIGNvbnN0IHNoYXJlZE1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBzaGFyZWRLZXlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVDb2xzOiBwcml2YXRlTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gICAgc2hhcmVkQ29sczogc2hhcmVkTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gIH07XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jaGFpbmNvZGVPZiA9IGZ1bmN0aW9uIGNoYWluY29kZU9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREVcbiAgKTtcbiAgaWYgKCFtIHx8ICFtLnJlc29sdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG0ucmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBtLnJlc29sdmVyO1xuICBjb25zdCBjdHggPSBhcmdzLnBvcCgpO1xuICBpZiAoIWN0eCB8fCAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjb250ZXh0IHByb3ZpZGVkIGZvciBjaGFpbmNvZGUgcmVzb2x1dGlvbmApO1xuICByZXR1cm4gbS5yZXNvbHZlcihtb2RlbCwgLi4uYXJncywgY3R4KTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbnRyYWN0T2YgPSBmdW5jdGlvbiBjb250cmFjdE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVFxuICApO1xuICBpZiAoIW0gfHwgIW0ucmVzb2x2ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG0ucmVzb2x2ZXI7XG4gIGNvbnN0IGN0eCA9IGFyZ3MucG9wKCk7XG4gIGlmICghY3R4IHx8ICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNvbnRleHQgcHJvdmlkZWQgZm9yIGNoYWluY29kZSByZXNvbHV0aW9uYCk7XG4gIHJldHVybiBtLnJlc29sdmVyKG1vZGVsLCAuLi5hcmdzLCBjdHgpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY2hhbm5lbE9mID0gZnVuY3Rpb24gY2hhbm5lbE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFOTkVMXG4gICk7XG4gIGlmICghbSB8fCAhbS5yZXNvbHZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtLnJlc29sdmVyID09PSBcInN0cmluZ1wiKSByZXR1cm4gbS5yZXNvbHZlcjtcbiAgY29uc3QgY3R4ID0gYXJncy5wb3AoKTtcbiAgaWYgKCFjdHggfHwgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY29udGV4dCBwcm92aWRlZCBmb3IgY2hhaW5jb2RlIHJlc29sdXRpb25gKTtcbiAgcmV0dXJuIG0ucmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MsIGN0eCk7XG59LmJpbmQoTW9kZWwpO1xuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVyRnVuY3Rpb248VD4gPSAoXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiBQcm9taXNlPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250cmFjdFJlc29sdmVyID0gKFxuICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiB7XG4gIHJldHVybiBtb2RlbC5uYW1lICsgXCJDb250cmFjdFwiO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhaW5jb2RlTWV0YWRhdGEgPSB7XG4gIHJlc29sdmVyOiBzdHJpbmcgfCBSZXNvbHZlckZ1bmN0aW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udHJhY3QocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVCwgbWV0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbmNvZGUocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREUsIG1ldGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbChyZXNvbHZlcjogYW55KSB7XG4gIGNvbnN0IG1ldGE6IENoYWluY29kZU1ldGFkYXRhID0geyByZXNvbHZlciB9O1xuICByZXR1cm4gbWV0YWRhdGEoRmFicmljTW9kZWxLZXlzLkNIQU5ORUwsIG1ldGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcblxuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHxcbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIGFsbG93Q29udGV4dFRyYW5zaWVudE1hcDogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcbiAgLy8gTm9kZSBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAvLyBjb25zdCBwcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgLy8gLS1cblxuICAvLyB3ZWIgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gIC8vIC0tXG5cbiAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBFTSBidWZmZXJcbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gYSBDcnlwdG9LZXkgb2JqZWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGVtIC0gVGhlIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPENyeXB0b0tleT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDcnlwdG9LZXlcbiAqIEBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRXh0cmFjdFByaXZhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgU3VidGxlQ3J5cHRvXG4gKlxuICogICBDYWxsZXItPj5FeHRyYWN0UHJpdmF0ZUtleTogZXh0cmFjdFByaXZhdGVLZXkocGVtKVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBHZXQgU3VidGxlQ3J5cHRvIGltcGxlbWVudGF0aW9uXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IFBhcnNlIFBFTSBmb3JtYXRcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogQ29udmVydCB0byBiaW5hcnkgREVSXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+U3VidGxlQ3J5cHRvOiBpbXBvcnRLZXkocGtjczgsIGJpbmFyeURlciwgb3B0aW9ucylcbiAqICAgU3VidGxlQ3J5cHRvLS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDcnlwdG9LZXlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktLT4+Q2FsbGVyOiBDcnlwdG9LZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gIGNvbnN0IGxpYk5hbWUgPSBcIm5vZGU6Y3J5cHRvXCI7XG4gIGxldCBzdWJ0bGU7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIHN1YnRsZSA9IChnbG9iYWxUaGlzIGFzIGFueSkuY3J5cHRvLnN1YnRsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgIGJ1ZlZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGNvbnN0IHN0ciA9IHBlbVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZShcIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicGtjczhcIixcbiAgICAgIGJpbmFyeURlcixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBuYW1lZEN1cnZlOiBcIlAtMjU2XCIsXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFtcInNpZ25cIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ0xJRU5UX09WRVJSSURFX0tFWVM6IChrZXlvZiBGYWJyaWNDbGllbnRGbGFncylbXSA9IFtcbiAgXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFicmljIGNsaWVudCBjb250ZXh0IHdpdGggYSBjb25zdHJhaW5lZCBvdmVycmlkZSBzdXJmYWNlXG4gKiBAc3VtbWFyeSBSZXN0cmljdHMgd2hpY2ggY2FjaGVkIHZhbHVlcyBhcmUgcHJvcGFnYXRlZCB0byBjaGlsZCBjb250ZXh0cyBvciBzZW50XG4gKiBiYWNrIGFzIG92ZXJyaWRlcyBzbyBvbmx5IGludGVudGlvbmFsIGNsaWVudCBmbGFncyBhcmUgZm9yd2FyZGVkLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50Q29udGV4dCBleHRlbmRzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgY29uc3RydWN0b3IoY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pIHtcbiAgICBzdXBlcihjdHgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9PdmVycmlkZXMoKTogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4ge1xuICAgIGNvbnN0IG92ZXJyaWRlczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDTElFTlRfT1ZFUlJJREVfS0VZUykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE9yVW5kZWZpbmVkKGtleSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG92ZXJyaWRlc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdmVycmlkZXM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXJGbGFncyxcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBRdWVyeUNsYXVzZSxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFNlcXVlbmNlLFxuICBTdGF0ZW1lbnQsXG4gIFN0YXRlbWVudEV4ZWN1dG9yLFxuICBWaWV3S2luZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzcXVhc2hlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8TT4gfCB1bmRlZmluZWQgPSBzdXBlci5zcXVhc2goXG4gICAgICBjdHggYXMgbmV2ZXJcbiAgICApO1xuICAgIGlmICghc3F1YXNoZWQpIHJldHVybiBzcXVhc2hlZDtcblxuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMsIGFyZ3MgfSA9IHNxdWFzaGVkO1xuICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBsaW1pdCB9ID0gcGFyYW1zO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgbWV0aG9kICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzcXVhc2hlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlUHJlcGFyZWQoXG4gICAgLi4uYXJnejogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKHRoaXMuZnJvbVNlbGVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGNvbnN0IHsgbWV0aG9kLCBhcmdzIH0gPSB0aGlzLnByZXBhcmVkIGFzIFByZXBhcmVkU3RhdGVtZW50PGFueT47XG4gICAgcmV0dXJuIHJlcG8uc3RhdGVtZW50KG1ldGhvZCwgLi4uYXJncywgLi4uYXJneik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwcmVwYXJlKFxuICAgIGN0eD86IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gY29udGV4dCBhdmFpbGFibGUgZm9yIHN0YXRlbWVudFwiKTtcblxuICAgIGlmICh0aGlzLmlzU2ltcGxlUXVlcnkoKSAmJiBjdHguZ2V0KFwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllc1wiKSkge1xuICAgICAgY29uc3Qgc3F1YXNoZWQgPSB0aGlzLnNxdWFzaChjdHgpO1xuICAgICAgaWYgKHNxdWFzaGVkKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWQgPSBzcXVhc2hlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9IGFzIGFueTtcblxuICAgIGNvbnN0IHByZXBhcmVkOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+ID0ge1xuICAgICAgY2xhc3M6IHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgYXJncyxcbiAgICAgIHBhcmFtcyxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IG1ldGhvZDogc3RyaW5nW10gPSBbUXVlcnlDbGF1c2UuRklORF9CWV07XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wcmVwYXJlQ29uZGl0aW9uKHRoaXMud2hlcmVDb25kaXRpb24sIGN0eCBhcyBuZXZlcik7XG4gICAgICBtZXRob2QucHVzaChwYXJzZWQubWV0aG9kKTtcbiAgICAgIGlmIChwYXJzZWQuYXJncyAmJiBwYXJzZWQuYXJncy5sZW5ndGgpXG4gICAgICAgIGFyZ3MucHVzaCguLi4ocGFyc2VkLmFyZ3MgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIG1ldGhvZC5wdXNoKFxuICAgICAgICBRdWVyeUNsYXVzZS5TRUxFQ1QsXG4gICAgICAgIHRoaXMuc2VsZWN0U2VsZWN0b3Iuam9pbihgICR7UXVlcnlDbGF1c2UuQU5ELnRvTG93ZXJDYXNlKCl9IGApXG4gICAgICApO1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgbWV0aG9kLnB1c2goUXVlcnlDbGF1c2UuT1JERVJfQlksIHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVswXSBhcyBzdHJpbmcpO1xuICAgICAgYXJncy5wdXNoKHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVsxXSBhcyBhbnkpO1xuICAgIH1cbiAgICBwcmVwYXJlZC5tZXRob2QgPSB0b0NhbWVsQ2FzZShtZXRob2Quam9pbihcIiBcIikpO1xuICAgIHByZXBhcmVkLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnByZXBhcmVkID0gcHJlcGFyZWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZCBmcm9tIENvdWNoREIvRmFicmljXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIHRoZSBJRCBmcm9tIGEgQ291Y2hEQiBkb2N1bWVudCBhbmQgcmV2ZXJ0cyBpdCB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJvY2Vzc1JlY29yZChcbiAgICByZWNvcmQ6IGFueSxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogTSB7XG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmIChyZWNvcmRbQ291Y2hEQktleXMuSURdKSB7XG4gICAgICBjb25zdCBbLCAuLi5rZXlBcmdzXSA9IHJlY29yZFtDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJlY29yZFtwa0F0dHJdID0gU2VxdWVuY2UucGFyc2VWYWx1ZSh0eXBlIGFzIGFueSwgaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVjb3JkKHJlY29yZCwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnlcbiAgICogQHN1bW1hcnkgU2VuZHMgYSByYXcgTWFuZ28gcXVlcnkgdG8gRmFicmljIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0b3IgPSAocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlSW5mbztcbiAgICBpZiAoKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZSAmJiBhZ2dyZWdhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQWdncmVnYXRlPFI+KGFnZ3JlZ2F0b3IsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHJhd0lucHV0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgY3R4XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3Rvcikge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcmVzdWx0cy5tYXAoKHIpID0+IHRoaXMucHJvY2Vzc1JlY29yZChyLCBjdHgpKTtcbiAgICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQgYXMgdW5rbm93biBhcyBSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJIYW5kbGVyc1RvUmVzdWx0KHByb2Nlc3NlZCwgY3R4KSkgYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZCgpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgY29uc3QgYWdncmVnYXRlUXVlcnkgPSB0aGlzLmJ1aWxkQWdncmVnYXRlUXVlcnkoKTtcbiAgICBpZiAoYWdncmVnYXRlUXVlcnkpIHJldHVybiBhZ2dyZWdhdGVRdWVyeTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiBzZWxlY3RvcnMgfTtcbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcikgcXVlcnkuZmllbGRzID0gdGhpcy5zZWxlY3RTZWxlY3RvciBhcyBzdHJpbmdbXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBjb25kaXRpb246IE1hbmdvU2VsZWN0b3IgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBDb25kaXRpb24uYW5kKFxuICAgICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgICAgQ29uZGl0aW9uLmF0dHJpYnV0ZTxNPihDb3VjaERCS2V5cy5UQUJMRSBhcyBrZXlvZiBNKS5lcShcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IHNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbikgYXMgTWFuZ29PcGVyYXRvcltdO1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RvcktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoQ291Y2hEQkdyb3VwT3BlcmF0b3IpLmluZGV4T2Yoc2VsZWN0b3JLZXlzWzBdKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChzZWxlY3RvcktleXNbMF0pIHtcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdIGFzIE1hbmdvU2VsZWN0b3JcbiAgICAgICAgICAgICAgKS5yZWR1Y2UoKGFjY3VtOiBNYW5nb1NlbGVjdG9yW10sIHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlRvbyBtYW55IGtleXMgaW4gcXVlcnkgc2VsZWN0b3IuIHNob3VsZCBiZSBvbmVcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0ga2V5c1swXTtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EKVxuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi4odmFsW2tdIGFzIGFueVtdKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBhY2N1bS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBjb25kaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLk9SOiB7XG4gICAgICAgICAgICBjb25zdCBzOiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICBzW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMocXVlcnkuc2VsZWN0b3IpLm1hcCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChxdWVyeS5zZWxlY3RvcltrZXldKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBBICR7a2V5fSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiAke3F1ZXJ5LnNlbGVjdG9yW2tleV19IGJ5ICR7dmFsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcXVlcnkuc2VsZWN0b3IgfHwgKHt9IGFzIE1hbmdvU2VsZWN0b3IpO1xuICAgICAgZm9yIChjb25zdCBbc2VsZWN0b3JLZXksIGRpcmVjdGlvbl0gb2YgdGhpcy5vcmRlckJ5U2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0b3JLZXkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPiA9IHt9O1xuICAgICAgICByZWNbc2VsZWN0b3JdID0gZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uO1xuICAgICAgICAocXVlcnkuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj5bXSkucHVzaChyZWMpO1xuICAgICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAgICAgKHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSXSA9XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcXVlcnkubGltaXQgPSB0aGlzLmxpbWl0U2VsZWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBjb3VjaGRiIGxpbWl0IG9mICR7Q291Y2hEQlF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gQ291Y2hEQlF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuU1RBUlRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gcHJlZml4UmFuZ2UoY29tcGFyaXNvbik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSX0VRXSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuU01BTExFUl0gPSByYW5nZS5lbmQ7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuRU5EU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHtcbiAgICAgICAgW0NvdWNoREJPcGVyYXRvci5SRUdFWFBdOiBgJHtlc2NhcGVSZWdFeHAoY29tcGFyaXNvbil9JGAsXG4gICAgICB9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuQkVUV0VFTikge1xuICAgICAgY29uc3QgYXR0ciA9IGF0dHIxIGFzIHN0cmluZztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb21wYXJpc29uKSB8fCBjb21wYXJpc29uLmxlbmd0aCAhPT0gMilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJCRVRXRUVOIG9wZXJhdG9yIHJlcXVpcmVzIFttaW4sIG1heF0gY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb21wYXJpc29uO1xuICAgICAgY29uc3Qgb3BCZXR3ZWVuOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wQmV0d2VlblthdHRyXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuQklHR0VSX0VRKVxuICAgICAgXSA9IG1pbjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5TTUFMTEVSX0VRKVxuICAgICAgXSA9IG1heDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcEJldHdlZW4gfTtcbiAgICB9XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYW4gYWdncmVnYXRlIHF1ZXJ5IGlmIGFnZ3JlZ2F0aW9uIGlzIHJlcXVlc3RlZFxuICAgKiBAc3VtbWFyeSBDaGVja3MgZm9yIGFnZ3JlZ2F0ZSBvcGVyYXRpb25zIGFuZCByZXR1cm5zIGEgc3BlY2lhbCBNYW5nb1F1ZXJ5IGZvciB0aGVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWdncmVnYXRlUXVlcnkoKTogTWFuZ29RdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5hdmdTZWxlY3Rvcikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gU3RyaW5nKHRoaXMuYXZnU2VsZWN0b3IpO1xuICAgICAgY29uc3Qgc3VtSW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcInN1bVwiLCBhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgY291bnRJbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiY291bnRcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmICghc3VtSW5mbyB8fCAhY291bnRJbmZvKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICBgQXZnIG9wZXJhdGlvbiByZXF1aXJlcyBzdW0gYW5kIGNvdW50IHZpZXdzIGZvciBhdHRyaWJ1dGUgJHthdHRyaWJ1dGV9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoe1xuICAgICAgICBraW5kOiBcImF2Z1wiLFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHN1bURlc2NyaXB0b3I6IHN1bUluZm8uZGVzY3JpcHRvcixcbiAgICAgICAgY291bnREZXNjcmlwdG9yOiBjb3VudEluZm8uZGVzY3JpcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9XG4gICAgICAgIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yID09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogU3RyaW5nKHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJkaXN0aW5jdFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaW5mby5jb3VudERpc3RpbmN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRvclVzZWQgPVxuICAgICAgdHlwZW9mIHRoaXMuY291bnRTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhIXRoaXMubWluU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5tYXhTZWxlY3RvciB8fFxuICAgICAgISF0aGlzLnN1bVNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuZGlzdGluY3RTZWxlY3RvcjtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JDaGVja3M6IEFycmF5PFtWaWV3S2luZCwgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtcbiAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAodGhpcy5jb3VudFNlbGVjdG9yID8/IHVuZGVmaW5lZCkgYXMgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWQsXG4gICAgICBdLFxuICAgICAgW1wibWF4XCIsIHRoaXMubWF4U2VsZWN0b3JdLFxuICAgICAgW1wibWluXCIsIHRoaXMubWluU2VsZWN0b3JdLFxuICAgICAgW1wic3VtXCIsIHRoaXMuc3VtU2VsZWN0b3JdLFxuICAgICAgW1wiZGlzdGluY3RcIiwgdGhpcy5kaXN0aW5jdFNlbGVjdG9yXSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBba2luZCwgc2VsZWN0b3JdIG9mIGFnZ3JlZ2F0b3JDaGVja3MpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGVjdG9yID8gU3RyaW5nKHNlbGVjdG9yKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3Ioa2luZCwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRvclVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBgTm8gQ291Y2hEQiB2aWV3IG1ldGFkYXRhIGZvdW5kIGZvciB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgICApfSBhZ2dyZWdhdG9yYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBhZ2dyZWdhdGUgZGVzY3JpcHRvciBmb3IgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXG4gICAga2luZDogVmlld0tpbmQsXG4gICAgYXR0cmlidXRlPzogc3RyaW5nXG4gICk6IEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhcyA9IGZpbmRWaWV3TWV0YWRhdGEodGhpcy5mcm9tU2VsZWN0b3IsIGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgaWYgKCFtZXRhcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFzWzBdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3Qgdmlld05hbWUgPSBnZW5lcmF0ZVZpZXdOYW1lKHRhYmxlTmFtZSwgbWV0YS5hdHRyaWJ1dGUsIGtpbmQsIG1ldGEpO1xuICAgIGNvbnN0IGRkb2MgPSBtZXRhLmRkb2MgfHwgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lKHRhYmxlTmFtZSwgdmlld05hbWUpO1xuICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICByZWR1Y2U6IG1ldGEucmVkdWNlICE9PSB1bmRlZmluZWQgPyB0cnVlIDogIW1ldGEucmV0dXJuRG9jcyxcbiAgICB9O1xuICAgIGlmIChraW5kID09PSBcImRpc3RpbmN0XCIgfHwga2luZCA9PT0gXCJncm91cEJ5XCIpIG9wdGlvbnMuZ3JvdXAgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgbWV0YSxcbiAgICAgIGRlc2NyaXB0b3I6IHtcbiAgICAgICAgZGRvYyxcbiAgICAgICAgdmlldzogdmlld05hbWUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIHNwZWNpYWwgYWdncmVnYXRlIE1hbmdvUXVlcnkgbWFya2VyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rvcjoge30sXG4gICAgICBhZ2dyZWdhdGU6IHRydWUsXG4gICAgICBhZ2dyZWdhdGVJbmZvOiBpbmZvLFxuICAgIH0gYXMgTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgY2FzdCB0byBGYWJyaWNDbGllbnRBZGFwdGVyIGZvciB2aWV3IGFjY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRGYWJyaWNBZGFwdGVyKCk6IEZhYnJpY0NsaWVudEFkYXB0ZXIge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYW4gYWdncmVnYXRlIHF1ZXJ5IHZpYSBhZGFwdGVyJ3MgdmlldyBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKGluZm8ua2luZCAhPT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQXZlcmFnZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZFwiKTtcbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3QgW3N1bURlc2MsIGNvdW50RGVzY10gPSBbaW5mby5zdW1EZXNjcmlwdG9yLCBpbmZvLmNvdW50RGVzY3JpcHRvcl07XG4gICAgY29uc3QgW3N1bVJlc3BvbnNlLCBjb3VudFJlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBzdW1EZXNjLmRkb2MsXG4gICAgICAgIHN1bURlc2MudmlldyxcbiAgICAgICAgc3VtRGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgY291bnREZXNjLmRkb2MsXG4gICAgICAgIGNvdW50RGVzYy52aWV3LFxuICAgICAgICBjb3VudERlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgIF0pO1xuICAgIGNvbnN0IHN1bSA9IHN1bVJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBjb25zdCBjb3VudCA9IGNvdW50UmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGlmICghY291bnQpIHJldHVybiAwIGFzIHVua25vd24gYXMgUjtcbiAgICByZXR1cm4gKHN1bSAvIGNvdW50KSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyB0aGUgdmlldyByZXNwb25zZSBiYXNlZCBvbiBhZ2dyZWdhdGUga2luZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVmlld1Jlc3BvbnNlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgcmVzcG9uc2U6IFZpZXdSZXNwb25zZVxuICApOiBSIHtcbiAgICBpZiAoaW5mby5raW5kID09PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIFwiQXZlcmFnZSByZXN1bHRzIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBwcm9jZXNzaW5nIHJvd3NcIlxuICAgICAgKTtcbiAgICBjb25zdCByb3dzID0gcmVzcG9uc2Uucm93cyB8fCBbXTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IG1ldGEgPSB2aWV3SW5mby5tZXRhO1xuICAgIGlmICh2aWV3SW5mby5jb3VudERpc3RpbmN0KSB7XG4gICAgICByZXR1cm4gKHJvd3MubGVuZ3RoIHx8IDApIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKHZpZXdJbmZvLmtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCB2aWV3SW5mby5raW5kID09PSBcImdyb3VwQnlcIikge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5rZXkgPz8gcm93LnZhbHVlKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmIChtZXRhLnJldHVybkRvY3MpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cudmFsdWUgPz8gcm93LmRvYyA/PyByb3cpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICh2aWV3SW5mby5raW5kID09PSBcImNvdW50XCIgPyAwIDogbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gKHJvd3NbMF0udmFsdWUgPz8gcm93c1swXS5rZXkgPz8gbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGluZm8gaXMgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZpZXdBZ2dyZWdhdGUoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBpbmZvIGlzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB7XG4gICAgcmV0dXJuIGluZm8ua2luZCAhPT0gXCJhdmdcIjtcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi4vc2hhcmVkL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIHR5cGUgTWFuZ29RdWVyeSxcbiAgdHlwZSBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgKiBhcyBncnBjIGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgdHlwZSBNb2RlbENvbnN0cnVjdG9yLFxuICB0eXBlIFNlcmlhbGl6ZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGRlYnVnLCBmaW5hbCwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBQZWVyQ29uZmlnLFxuICB0eXBlIFNlZ3JlZ2F0ZWRNb2RlbCxcbiAgdHlwZSBNc3BEZXRhaWxzLFxufSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjb25uZWN0LFxuICB0eXBlIENvbm5lY3RPcHRpb25zLFxuICBHYXRld2F5LFxuICBOZXR3b3JrLFxuICBQcm9wb3NhbE9wdGlvbnMsXG4gIENvbnRyYWN0IGFzIENvbnRyYWt0LFxuICB0eXBlIFNpZ25lcixcbiAgR2F0ZXdheUVycm9yLFxuICBFbmRvcnNlRXJyb3IsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEdhdGV3YXkgYXMgTGVnYWN5R2F0ZXdheSwgV2FsbGV0cyB9IGZyb20gXCJmYWJyaWMtbmV0d29ya1wiO1xuaW1wb3J0IHR5cGUgeyBFbmRvcnNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQge1xuICBnZXRJZGVudGl0eSxcbiAgZ2V0U2lnbmVyLFxuICBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCxcbiAgcmVhZEZpbGUgYXMgcmVhZEZzRmlsZSxcbn0gZnJvbSBcIi4vZmFicmljLWZzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIHR5cGUgUHJpbWFyeUtleVR5cGUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJGbGFncyxcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBNaWdyYXRpb25FcnJvcixcbiAgT2JzZXJ2ZXJFcnJvcixcbiAgUGFnaW5nRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgU3RhdGVtZW50LFxuICB0eXBlIFByZXBhcmVkU3RhdGVtZW50LFxuICBQYWdpbmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIHR5cGUgUHJlcGFyZWRNb2RlbCxcbiAgQWxsT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyLCBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudERpc3BhdGNoIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50RGlzcGF0Y2hcIjtcbi8vIGltcG9ydCB7IEhTTVNpZ25lckZhY3RvcnlDdXN0b20gfSBmcm9tIFwiLi9mYWJyaWMtaHNtXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRTdGF0ZW1lbnRcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFBhZ2luYXRvclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7XG4gIEVuZG9yc2VtZW50RXJyb3IsXG4gIEVuZG9yc2VtZW50UG9saWN5RXJyb3IsXG4gIE12Y2NSZWFkQ29uZmxpY3RFcnJvcixcbiAgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yLFxuICBRdWVyeVJlc3VsdFRvb0xhcmdlRXJyb3IsXG4gIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuL2NyeXB0b1wiO1xuaW1wb3J0IHsgZXh0cmFjdElkcyB9IGZyb20gXCIuL2lkcy9pZC1leHRyYWN0aW9uXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJhY3RSZXNvbHZlciwgSWRlbnRpdHkgfSBmcm9tIFwiLi4vc2hhcmVkL2luZGV4XCI7XG5cbnR5cGUgTGVnYWN5UGVlclRhcmdldCA9IHtcbiAgbXNwSWQ6IHN0cmluZztcbiAgcGVlckVuZHBvaW50OiBzdHJpbmc7XG4gIHBlZXJIb3N0QWxpYXM/OiBzdHJpbmc7XG4gIHRsc0NlcnQ/OiBzdHJpbmcgfCBCdWZmZXI7XG59O1xuXG50eXBlIExlZ2FjeVBlZXJXaXRoTmFtZSA9IExlZ2FjeVBlZXJUYXJnZXQgJiB7IG5hbWU6IHN0cmluZyB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrc1xuICogQHN1bW1hcnkgVGhlIEZhYnJpY0FkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlciB0byBwcm92aWRlIGEgc2VhbWxlc3MgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrcy5cbiAqIEl0IGhhbmRsZXMgY29ubmVjdGlvbiBtYW5hZ2VtZW50LCB0cmFuc2FjdGlvbiBzdWJtaXNzaW9uLCBhbmQgQ1JVRCBvcGVyYXRpb25zIGFnYWluc3QgRmFicmljIGNoYWluY29kZS5cbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dDxGYWJyaWNGbGFncz4gLSBDb250ZXh0IHR5cGUgY29udGFpbmluZyBGYWJyaWMtc3BlY2lmaWMgZmxhZ3NcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBhbGlhcyAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICogQGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICogY29uc3QgY29uZmlnOiBQZWVyQ29uZmlnID0ge1xuICogICBtc3BJZDogJ09yZzFNU1AnLFxuICogICBwZWVyRW5kcG9pbnQ6ICdsb2NhbGhvc3Q6NzA1MScsXG4gKiAgIGNoYW5uZWxOYW1lOiAnbXljaGFubmVsJyxcbiAqICAgY2hhaW5jb2RlTmFtZTogJ215Y2MnLFxuICogICBjb250cmFjdE5hbWU6ICdteWNvbnRyYWN0JyxcbiAqICAgdGxzQ2VydFBhdGg6ICcvcGF0aC90by90bHMvY2VydCcsXG4gKiAgIGNlcnREaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8vY2VydC9kaXInLFxuICogICBrZXlEaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8va2V5L2RpcidcbiAqIH07XG4gKlxuICogY29uc3QgYWRhcHRlciA9IG5ldyBGYWJyaWNBZGFwdGVyKGNvbmZpZywgJ29yZzEtYWRhcHRlcicpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29ya1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5yZWFkKCd1c2VycycsICd1c2VyMScsIG15U2VyaWFsaXplcik7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsLCB0cmFuc2llbnQsIHNlcmlhbGl6ZXIpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzdWJtaXRUcmFuc2FjdGlvbihPcGVyYXRpb25LZXlzLkNSRUFURSwgW3NlcmlhbGl6ZWRNb2RlbF0sIHRyYW5zaWVudClcbiAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsTmFtZSlcbiAqICAgTmV0d29yay0+PkNvbnRyYWN0OiBnZXRDb250cmFjdChjaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBkZWNvZGUocmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkZWNvZGVkUmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogZGVzZXJpYWxpemVkUmVzdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUGVlckNvbmZpZyxcbiAgQ2xpZW50LFxuICBNYW5nb1F1ZXJ5LFxuICBGYWJyaWNDbGllbnRDb250ZXh0XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgdGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIFVpbnQ4QXJyYXkgdG8gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXIoKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0NsaWVudEFkYXB0ZXIuc2VyaWFsaXplcjtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IENvbnRleHQoKTogQ29uc3RydWN0b3I8RmFicmljQ2xpZW50Q29udGV4dD4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRDb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBlZXJDb25maWcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MsIGNvbmZpZyksXG4gICAgICBGYWJyaWNGbGF2b3VyLFxuICAgICAgYWxpYXNcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYWluY29kZUZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuY2hhaW5jb2RlRm9yKG1vZGVsLCB0aGlzLmNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhbm5lbEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuY2hhbm5lbEZvcihtb2RlbCwgdGhpcy5jb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnRyYWN0Rm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5jb250cmFjdEZvcihtb2RlbCwgdGhpcy5jb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+XG4gICk6IFN0YXRlbWVudDxNLCBGYWJyaWNDbGllbnRBZGFwdGVyLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFN0YXRlbWVudCh0aGlzLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgcXVlcnk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCBNYW5nb1F1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKTogUGFnaW5hdG9yPE0sIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50UGFnaW5hdG9yKHRoaXMsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGYWJyaWNDbGllbnRGbGFncz4ge1xuICAgIGNvbnN0IG1lcmdlZEZsYWdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWcsIGZsYWdzKTtcbiAgICBjb25zdCBmID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG1lcmdlZEZsYWdzLCAuLi5hcmdzKVxuICAgICk7XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgQWxsT3BlcmF0aW9uS2V5cyxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50Q29udGV4dD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBjcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsID8gKEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwubWFwKChtKSA9PiBNb2RlbC50YWJsZU5hbWUobSkpIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKSkgOiBcIm5vXCJ9IHRhYmxlICR7b3ZlcnJpZGVzICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykgPyBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA6IFwibm9cIn0gd2l0aCBmbGFnIG92ZXJyaWRlc2BcbiAgICApO1xuICAgIGxldCBjdHggPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgY3R4ICE9PSBcInVuZGVmaW5lZFwiICYmICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpIHtcbiAgICAgIGFyZ3MucHVzaChjdHgpO1xuICAgICAgY3R4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlcyA9IGN0eFxuICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCBjdHgudG9PdmVycmlkZXMoKSwgb3ZlcnJpZGVzKVxuICAgICAgOiBvdmVycmlkZXM7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKFxuICAgICAgdHlwZW9mIG9wZXJhdGlvbiA9PT0gXCJzdHJpbmdcIiA/IG9wZXJhdGlvbiA6IG9wZXJhdGlvbi5uYW1lLFxuICAgICAgbW9kZWwsXG4gICAgICBvdmVycmlkZXMgYXMgUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgICAuLi5bLi4uYXJncywgY3R4XS5maWx0ZXIoQm9vbGVhbilcbiAgICApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgaWYgKCEoY3R4IGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50T3AgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIik7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJhZmZlY3RlZFRhYmxlc1wiKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWN1cnJlbnRPcCB8fFxuICAgICAgICBjdXJyZW50T3AgIT09IG9wZXJhdGlvbiB8fFxuICAgICAgICAobW9kZWwgJiYgbW9kZWwgIT09IGN1cnJlbnRNb2RlbClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG5cbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdHguYWNjdW11bGF0ZShmbGFncykgYXMgYW55O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAuLi5mbGFncyxcbiAgICB9KSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY29kZXMgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGJpbmFyeSBkYXRhIHJlY2VpdmVkIGZyb20gRmFicmljIHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YSAtIFRoZSBiaW5hcnkgZGF0YSB0byBkZWNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5kZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPFBlZXJDb25maWcsIENsaWVudCwgTWFuZ29RdWVyeSwgRmFicmljQ2xpZW50Q29udGV4dD5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50UmVwb3NpdG9yeSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFtcbiAgICBDb25zdHJ1Y3RvcjxNPixcbiAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFueVtdLFxuICAgIEZhYnJpY0NsaWVudENvbnRleHQsXG4gIF0ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSByZWNvcmRzIGZvciBjcmVhdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIG5lY2Vzc2FyeSBDb3VjaERCIGZpZWxkcyB0byBtdWx0aXBsZSByZWNvcmRzIGJlZm9yZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBJRHMgb2YgdGhlIHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gcHJlcGFyZVxuICAgKiBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgdGFibGVOYW1lLCBpZHMsIGFuZCBwcmVwYXJlZCByZWNvcmRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGlkcyBhbmQgbW9kZWxzIGFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIC8vSEVSRSFcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxzID0gbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRNb2RlbHMpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50Py5baV0gfHwge30pLFxuICAgICAgICAgICAgICByZXNbaV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIHJlYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWRBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHJlYWRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE1vZGVscyldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnQ/LltpXSB8fCB7fSksXG4gICAgICAgICAgICAgIHJlc1tpXVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD59IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byBkZWxldGVcbiAgICogQHBhcmFtIHtTZXJpYWxpemVyPGFueT59IHNlcmlhbGl6ZXIgLSBTZXJpYWxpemVyIGZvciB0aGUgbW9kZWwgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZHNbMF1cbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWRBbGwoY2xhenosIGlkcywgLi4uY3R4QXJncyk7XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYGRlbGV0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgICAgPyByZXN1bHRcbiAgICAgICAgOiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlcykpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogU2VncmVnYXRlZE1vZGVsPE0+ICYgUHJlcGFyZWRNb2RlbCB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwbGl0Lm1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KG1vZGVsKTtcbiAgICBpZiAobWlycm9yTWV0YSkge1xuICAgICAgY29uc3QgbWlycm9yTXNwID0gbWlycm9yTWV0YS5tc3BJZDtcbiAgICAgIGlmICghbWlycm9yTXNwKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gbWlycm9yIE1TUCBjb3VsZCBiZSBmb3VuZGApO1xuICAgICAgbGV0IG1zcHMgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICAgIG1zcHMgPSBBcnJheS5pc0FycmF5KG1zcHMpID8gbXNwcyA6IFttc3BzXTtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IFsuLi5uZXcgU2V0KFsuLi5tc3BzLCBtaXJyb3JNc3BdKV07XG4gICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgIGVuZG9yc2luZ09yZ3M6IG1lcmdlZCxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogbWVyZ2VkLFxuICAgICAgICBsZWdhY3k6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiBzcGxpdC5tb2RlbCxcbiAgICAgIG1vZGVsOiBzcGxpdC5tb2RlbCxcbiAgICAgIGlkOiBtb2RlbFtNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPildIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgICAgcHJpdmF0ZXM6IHNwbGl0LnByaXZhdGVzLFxuICAgICAgc2hhcmVkOiBzcGxpdC5zaGFyZWQsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgY2hpbGRSZWJ1aWxkID1cbiAgICAgIHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkUmVidWlsZCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVzb2x2ZWRPcCA9IHRoaXMucmVzb2x2ZU9wZXJhdGlvbihjdHgsIG9wZXJhdGlvbik7XG4gICAgaWYgKCFyZXNvbHZlZE9wKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgb3AgPSByZXNvbHZlZE9wLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgb3AuaW5jbHVkZXMoXCJyZWFkXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcImZpbmRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicXVlcnlcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwic3RhdGVtZW50XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInBhZ2VcIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlT3BlcmF0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAob3BlcmF0aW9uKSByZXR1cm4gb3BlcmF0aW9uO1xuICAgIGlmICh0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcIm9wZXJhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFRyYW5zaWVudE92ZXJyaWRlcyhcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBoYXNUcmFuc2llbnREYXRhID0gdGhpcy5oYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YSh0cmFuc2llbnREYXRhKTtcbiAgICBjb25zdCBzaG91bGRJbmplY3QgPSAhIWN0eC5nZXRPclVuZGVmaW5lZChcImFsbG93Q29udGV4dFRyYW5zaWVudE1hcFwiKTtcbiAgICBpZiAoIWhhc1RyYW5zaWVudERhdGEgJiYgIXNob3VsZEluamVjdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdmVycmlkZXMgPSBjdHgudG9PdmVycmlkZXMoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gaGFzVHJhbnNpZW50RGF0YSA/IE9iamVjdC5hc3NpZ24oe30sIHRyYW5zaWVudERhdGEpIDoge307XG4gICAgaWYgKHNob3VsZEluamVjdCAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCkge1xuICAgICAgcGF5bG9hZFtGYWJyaWNNb2RlbEtleXMuT1ZFUlJJREVTXSA9IG92ZXJyaWRlcztcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBheWxvYWQpLmxlbmd0aCA/IHBheWxvYWQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdGhpcy5oYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YShpdGVtKSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGVudHJpZXMuc29tZSgoWywgZW50cnldKSA9PiB0aGlzLmhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKGVudHJ5KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXJlY3QgPVxuICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSB8fFxuICAgICAgKGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0Lmxlbmd0aCkgcmV0dXJuIGRpcmVjdDtcbiAgICByZXR1cm4gKFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMuY3JlYXRlXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmhlYWx0aGNoZWNrKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcImhlYWx0aGNoZWNrXCIsXG4gICAgICBbXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWQpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgLy8gcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgPyByZXN1bHRcbiAgICAgIDogdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHBlcmZvcm0gYSBxdWVyeSB1c2luZyBNYW5nbyBRdWVyeSBzeW50YXhcbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBRdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvY2VzcyAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzdWx0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogcmF3KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZXZhbHVhdGVUcmFuc2FjdGlvbihcInF1ZXJ5XCIsIFtpbnB1dF0pXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShcInF1ZXJ5XCIsIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnBhcnNlKGRlY29kZShyZXN1bHQpKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdCBiYXNlZCBvbiB0eXBlXG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IHByb2Nlc3NlZCByZXN1bHRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHJhdzxWLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnksXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgbG9nLmluZm8oYFBlcmZvcm1pbmcgcmF3IHN0YXRlbWVudCBvbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShjbGF6eil9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwicmF3XCIsXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeShyYXdJbnB1dCksIGRvY3NPbmx5XSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGNsYXp6XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0Pn0gYXJncyAtIE9wdGlvbmFsIGNvbnRleHR1YWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vmlld1Jlc3BvbnNlPFI+Pn0gVGhlIHZpZXcgcmVzcG9uc2VcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHZpZXc8Uj4oXG4gICAgZGRvYzogc3RyaW5nLFxuICAgIHZpZXdOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFZpZXdSZXNwb25zZTxSPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudmlldyk7XG4gICAgbG9nLmluZm8oYFF1ZXJ5aW5nIHZpZXcgJHtkZG9jfS8ke3ZpZXdOYW1lfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInZpZXdcIixcbiAgICAgICAgW2Rkb2MsIHZpZXdOYW1lLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBWaWV3UmVzcG9uc2U8Uj47XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHZpZXcgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciB0aGUgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNhY2hlZCBjbGllbnQgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgbm9uZSBleGlzdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDbGllbnQ+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIG92ZXJyaWRlIGdldENsaWVudCgpOiBDbGllbnQge1xuICAgIGlmICghdGhpcy5fY2xpZW50KVxuICAgICAgdGhpcy5fY2xpZW50ID0gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDbGllbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBHYXRld2F5IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IGNsaWVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIEdhdGV3YXkoY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBDb250cmFjdCBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBHYXRld2F5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29udHJha3Q+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBDb250cmFjdChcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjbGF6ek9yQ29udHJhY3ROYW1lLFxuICAgICAgY3R4XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgU3VibWl0cyBvciBldmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VibWl0IC0gV2hldGhlciB0byBzdWJtaXQgKHRydWUpIG9yIGV2YWx1YXRlIChmYWxzZSkgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZ2V0Q29udHJhY3QoKVxuICAgKiAgIGFsdCBzdWJtaXQgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVsc2UgZXZhbHVhdGUgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZW5kXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY2xvc2UoKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHRyYW5zYWN0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgdHJhbnNpZW50RGF0YSA9IHRoaXMuaW5qZWN0VHJhbnNpZW50T3ZlcnJpZGVzKHRyYW5zaWVudERhdGEsIGN0eCk7XG4gICAgaWYgKHN1Ym1pdCAmJiB0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXp6T3JDb250cmFjdE5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udHJhY3QgPSBhd2FpdCB0aGlzLkNvbnRyYWN0KGN0eCwgY2xhenpPckNvbnRyYWN0TmFtZSk7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYCR7c3VibWl0ID8gXCJTdWJtaXRcIiA6IFwiRXZhbHVhdGVcIn10aW5nIHRyYW5zYWN0aW9uICR7Y29udHJhY3QuZ2V0Q29udHJhY3ROYW1lKCl9LiR7YXBpfWBcbiAgICAgICk7XG4gICAgICBsb2cuZGVidWcoYGFyZ3M6ICR7YXJncz8ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpLmpvaW4oXCJcXG5cIikgfHwgXCJub25lXCJ9YCk7XG4gICAgICBjb25zdCBtZXRob2QgPSBzdWJtaXQgPyBjb250cmFjdC5zdWJtaXQgOiBjb250cmFjdC5ldmFsdWF0ZTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRBcmdzID0gKGFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PlxuICAgICAgICB0aGlzLm5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQoYXJnKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYW5zaWVudEVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhIHx8IHt9KTtcblxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyA9IGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/Lmxlbmd0aFxuICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm9wb3NhbE9wdGlvbnM6IFByb3Bvc2FsT3B0aW9ucyA9IHtcbiAgICAgICAgYXJndW1lbnRzOiBub3JtYWxpemVkQXJncyxcbiAgICAgICAgdHJhbnNpZW50RGF0YTogdHJhbnNpZW50RW50cmllcy5sZW5ndGhcbiAgICAgICAgICA/IHRyYW5zaWVudEVudHJpZXMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFxuICAgICAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IGN0eC5nZXRPclVuZGVmaW5lZChcImFsbG93TWFudWFsRW5kb3JzaW5nT3Jnc1wiKVxuICAgICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9ucyB8fCB1bmRlZmluZWRcbiAgICAgICAgICA6IHVuZGVmaW5lZCwgLy8gbXNwSWQgbGlzdFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IG1ldGhvZC5jYWxsKGNvbnRyYWN0LCBhcGksIHByb3Bvc2FsT3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY29ubmVjdGlvbmApO1xuICAgICAgZ2F0ZXdheS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVHJhbnNhY3Rpb25Bcmd1bWVudChhcmc6IGFueSk6IGFueSB7XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCBhcmcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyZztcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFyZztcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGFyZztcbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGFyZztcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHg6IEZhYnJpY0NsaWVudENvbnRleHQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0KTogTGVnYWN5UGVlclRhcmdldFtdIHtcbiAgICBjb25zdCBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdID0gW1xuICAgICAge1xuICAgICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgICAgICB0bHNDZXJ0OiB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgbGV0IGVuZG9yc2luZ09yZ3MgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICBlbmRvcnNpbmdPcmdzID0gQXJyYXkuaXNBcnJheShlbmRvcnNpbmdPcmdzKVxuICAgICAgPyBlbmRvcnNpbmdPcmdzXG4gICAgICA6IFtlbmRvcnNpbmdPcmdzXTtcbiAgICBjb25zdCBlbmRvcnNlcnMgPVxuICAgICAgZW5kb3JzaW5nT3Jncy5maWx0ZXIoKG9yZyk6IG9yZyBpcyBzdHJpbmcgPT4gQm9vbGVhbihvcmcpKSB8fCBbXTtcbiAgICBjb25zdCBleHRyYXMgPSBlbmRvcnNlcnMuZmlsdGVyKChvcmcpID0+IG9yZyAhPT0gdGhpcy5jb25maWcubXNwSWQpO1xuICAgIGlmICghZXh0cmFzLmxlbmd0aCkgcmV0dXJuIHBlZXJzO1xuXG4gICAgY29uc3QgbWFwID0gdGhpcy5jb25maWcubXNwTWFwO1xuICAgIGNvbnN0IGxlZ2FjeUNvdW50ID0gdGhpcy5yZXNvbHZlTGVnYWN5TXNwQ291bnQoKTtcbiAgICBmb3IgKGNvbnN0IG1zcCBvZiBleHRyYXMpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBtYXA/Llttc3BdO1xuICAgICAgaWYgKCFjYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5waWNrTGVnYWN5Q2FuZGlkYXRlcyhjYW5kaWRhdGVzLCBsZWdhY3lDb3VudCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyB2YWxpZCBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2Ygc2VsZWN0aW9ucykge1xuICAgICAgICBpZiAoIWNob2ljZS5lbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgcGVlciBtYXBwaW5nIGZvciBNU1AgJHttc3B9OiBtaXNzaW5nIGVuZHBvaW50YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGVlcnMucHVzaCh7XG4gICAgICAgICAgbXNwSWQ6IG1zcCxcbiAgICAgICAgICBwZWVyRW5kcG9pbnQ6IGNob2ljZS5lbmRwb2ludCxcbiAgICAgICAgICBwZWVySG9zdEFsaWFzOiBjaG9pY2UuYWxpYXMsXG4gICAgICAgICAgdGxzQ2VydDogY2hvaWNlLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjaGFubmVsID0gdGhpcy5jb25maWcuY2hhbm5lbDtcbiAgICAgIGxldCBjaGFpbmNvZGUgPSB0aGlzLmNvbmZpZy5jaGFpbmNvZGVOYW1lO1xuICAgICAgbGV0IGNvbnRyYWN0TmFtZSA9IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZTtcblxuICAgICAgaWYgKGNsYXp6T3JDb250cmFjdE5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGF6ek9yQ29udHJhY3ROYW1lID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgIGNvbnRyYWN0TmFtZSA9IGNsYXp6T3JDb250cmFjdE5hbWU7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBObyBjb250ZXh0IHJlY2VpdmVkIHRvIGRldGVybWluZSBjaGFpbmNvZGUgY29uZmlnYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjaGFubmVsID1cbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmNoYW5uZWxGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY3R4KSkgfHwgY2hhbm5lbDtcbiAgICAgICAgICBjaGFpbmNvZGUgPVxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuY2hhaW5jb2RlRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGN0eCkpIHx8IGNoYWluY29kZTtcbiAgICAgICAgICBjb250cmFjdE5hbWUgPSBhd2FpdCB0aGlzLmNvbnRyYWN0Rm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IGdhdGV3YXkuZ2V0TmV0d29yayhjaGFubmVsKTtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChjaGFpbmNvZGUsIGNvbnRyYWN0TmFtZSk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke2NvbnRyYWN0TmFtZX0uJHtmY259IHZpYSBwZWVycyAke3BlZXJzLm1hcCgocCkgPT4gcC5wZWVyRW5kcG9pbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbi5zdWJtaXQoLi4uYXJncyk7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdhdGV3YXkuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTGVnYWN5UGVlcnMoXG4gICAgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXVxuICApOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBMZWdhY3lQZWVyV2l0aE5hbWU+KCk7XG4gICAgY29uc3QgYWRkUGVlciA9IChwZWVyOiBMZWdhY3lQZWVyVGFyZ2V0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtwZWVyLnBlZXJFbmRwb2ludH18JHtwZWVyLnBlZXJIb3N0QWxpYXMgfHwgXCJcIn1gO1xuICAgICAgaWYgKGRlZHVwZWQuaGFzKGtleSkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5hbWUgPSBgcGVlci0ke3BlZXIubXNwSWR9LSR7ZGVkdXBlZC5zaXplfWA7XG4gICAgICBkZWR1cGVkLnNldChrZXksIHtcbiAgICAgICAgLi4ucGVlcixcbiAgICAgICAgbmFtZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwZWVycy5mb3JFYWNoKGFkZFBlZXIpO1xuICAgIGFkZFBlZXIoe1xuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZGVkdXBlZC52YWx1ZXMoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk6IFByb21pc2U8e1xuICAgIGNlcnRpZmljYXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZUtleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICByZXR1cm4geyBjZXJ0aWZpY2F0ZSwgcHJpdmF0ZUtleSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSkge1xuICAgIGNvbnN0IHBlZXJFbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgY2hhbm5lbFBlZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3Qgb3JnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGVlciBvZiBwZWVycykge1xuICAgICAgY29uc3QgdGxzUGVtID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICAgIHBlZXIudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0XG4gICAgICApO1xuICAgICAgY29uc3QgaG9zdG5hbWUgPVxuICAgICAgICBwZWVyLnBlZXJIb3N0QWxpYXMgfHwgdGhpcy5leHRyYWN0SG9zdChwZWVyLnBlZXJFbmRwb2ludCk7XG4gICAgICBwZWVyRW50cmllc1twZWVyLm5hbWVdID0ge1xuICAgICAgICB1cmw6IHRoaXMuZW5zdXJlR3JwY1VybChwZWVyLnBlZXJFbmRwb2ludCksXG4gICAgICAgIHRsc0NBQ2VydHM6IHsgcGVtOiB0bHNQZW0gfSxcbiAgICAgICAgZ3JwY09wdGlvbnM6IHtcbiAgICAgICAgICBcInNzbC10YXJnZXQtbmFtZS1vdmVycmlkZVwiOiBob3N0bmFtZSxcbiAgICAgICAgICBob3N0bmFtZU92ZXJyaWRlOiBob3N0bmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjaGFubmVsUGVlcnNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgZW5kb3JzaW5nUGVlcjogdHJ1ZSxcbiAgICAgICAgY2hhaW5jb2RlUXVlcnk6IHRydWUsXG4gICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlLFxuICAgICAgICBldmVudFNvdXJjZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdID0gb3Jnc1twZWVyLm1zcElkXSB8fCB7XG4gICAgICAgIG1zcGlkOiBwZWVyLm1zcElkLFxuICAgICAgICBwZWVyczogW10sXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXS5wZWVycy5wdXNoKHBlZXIubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IFwibGVnYWN5LW1hbnVhbFwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgY2xpZW50OiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB9LFxuICAgICAgb3JnYW5pemF0aW9uczogb3JncyxcbiAgICAgIHBlZXJzOiBwZWVyRW50cmllcyxcbiAgICAgIG9yZGVyZXJzOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFt0aGlzLmNvbmZpZy5jaGFubmVsXToge1xuICAgICAgICAgIHBlZXJzOiBjaGFubmVsUGVlcnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVlcnMuZXZlcnkoKHBlZXIpID0+IHRoaXMuaXNMb2NhbEVuZHBvaW50KHBlZXIucGVlckVuZHBvaW50KSk7XG4gIH1cblxuICBwcml2YXRlIGlzTG9jYWxFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZXh0cmFjdEhvc3QoZW5kcG9pbnQpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGhvc3QgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdCA9PT0gXCIxMjcuMC4wLjFcIjtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEhvc3QoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2FuaXRpemVkID0gZW5kcG9pbnQucmVwbGFjZSgvXmdycGNzPzpcXC9cXC8vLCBcIlwiKTtcbiAgICByZXR1cm4gc2FuaXRpemVkLnNwbGl0KFwiOlwiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlR3JwY1VybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoL15ncnBjcz86XFwvXFwvL2kudGVzdChlbmRwb2ludCkpIHJldHVybiBlbmRwb2ludDtcbiAgICByZXR1cm4gYGdycGNzOi8vJHtlbmRwb2ludH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkUGVtSW5wdXQoc291cmNlPzogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGNlcnRpZmljYXRlIG9yIGtleSBtYXRlcmlhbFwiKTtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHJldHVybiBzb3VyY2UudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGNvbnN0IHRyaW1tZWQgPSBzb3VyY2UudHJpbSgpO1xuICAgIGlmICgvLS0tLS1CRUdJTiBbQS1aIF0rLS0tLS0vLnRlc3QodHJpbW1lZCkpIHJldHVybiB0cmltbWVkO1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChzb3VyY2UpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgaWYgKHN0YXRzPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCByZWFkRnNGaWxlKHNvdXJjZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5wYXJzZUVycm9yPEU+KGVycik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgdHJ1ZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXp6T3JDb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgZmFsc2UsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGF6ek9yQ29udHJhY3ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG1pZ3JhdGUoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcHJvdmlkZWRDdHggPVxuICAgICAgbGFzdCBpbnN0YW5jZW9mIENvbnRleHQgPyAobGFzdCBhcyBGYWJyaWNDbGllbnRDb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtaWdyYXRpb25BcmdzID0gcHJvdmlkZWRDdHggPyBhcmdzLnNsaWNlKDAsIC0xKSA6IGFyZ3M7XG4gICAgY29uc3QgY3R4ID1cbiAgICAgIHByb3ZpZGVkQ3R4IHx8XG4gICAgICAoYXdhaXQgdGhpcy5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuTUlHUkFUSU9OLFxuICAgICAgICB7fSxcbiAgICAgICAgdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw8YW55Pj5cbiAgICAgICkpO1xuICAgIHJldHVybiB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJtaWdyYXRlXCIsXG4gICAgICBbcmVmZXJlbmNlLCBtaWdyYXRpb25BcmdzXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFwiTWlncmF0aW9uQ29udHJhY3RcIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93bihcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IHN0cmluZyB8IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGN0eD86IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxDb250cmFrdD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENvbnRyYWN0KTtcblxuICAgIGxldCBjaGFubmVsID0gY29uZmlnLmNoYW5uZWw7XG4gICAgbGV0IGNoYWluY29kZSA9IGNvbmZpZy5jaGFpbmNvZGVOYW1lO1xuICAgIGxldCBjb250cmFjdE5hbWUgPSBjb25maWcuY29udHJhY3ROYW1lO1xuXG4gICAgaWYgKGNsYXp6T3JDb250cmFjdE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgY2xhenpPckNvbnRyYWN0TmFtZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgY29udHJhY3ROYW1lID0gY2xhenpPckNvbnRyYWN0TmFtZTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBObyBjb250ZXh0IHJlY2VpdmVkIHRvIGRldGVybWluZSBjaGFpbmNvZGUgY29uZmlnYFxuICAgICAgICAgICk7XG4gICAgICAgIGNoYW5uZWwgPVxuICAgICAgICAgIChhd2FpdCB0aGlzLmNoYW5uZWxGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY29uZmlnLCBjdHgpKSB8fCBjaGFubmVsO1xuICAgICAgICBjaGFpbmNvZGUgPVxuICAgICAgICAgIChhd2FpdCB0aGlzLmNoYWluY29kZUZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjb25maWcsIGN0eCkpIHx8XG4gICAgICAgICAgY2hhaW5jb2RlO1xuICAgICAgICBjb250cmFjdE5hbWUgPSBhd2FpdCB0aGlzLmNvbnRyYWN0Rm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGNvbmZpZywgY3R4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5nZXROZXR3b3JrKGdhdGV3YXksIGNoYW5uZWwpO1xuICAgIGxldCBjb250cmFjdDogQ29udHJha3Q7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgY2hhaW5jb2RlICR7Y2hhaW5jb2RlfSBjb250cmFjdCAke2NvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y2hhbm5lbH1gXG4gICAgICApO1xuICAgICAgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNoYWluY29kZSwgY29udHJhY3ROYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyYWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgTmV0d29yayBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0byBhIHNwZWNpZmljIGNoYW5uZWwgb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHJldHVybiB7TmV0d29ya30gVGhlIE5ldHdvcmsgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXROZXR3b3JrKGdhdGV3YXk6IEdhdGV3YXksIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBOZXR3b3JrIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldE5ldHdvcmspO1xuICAgIGxldCBuZXR3b3JrOiBOZXR3b3JrO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hhbm5lbCAke2NoYW5uZWxOYW1lfWApO1xuICAgICAgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayhjaGFubmVsTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBhbmQgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge0NsaWVudH0gW2NsaWVudF0gLSBPcHRpb25hbCBnUlBDIGNsaWVudCwgd2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEdhdGV3YXkoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGllbnQ/OiBDbGllbnRcbiAgKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldENvbm5lY3Rpb24oXG4gICAgICBjbGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0Q2xpZW50KGNvbmZpZykpLFxuICAgICAgY29uZmlnLFxuICAgICAgY3R4XG4gICAgKSkgYXMgR2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBjbGllbnQgd2l0aCBUTFMgY3JlZGVudGlhbHMgZm9yIHNlY3VyZSBjb21tdW5pY2F0aW9uXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDbGllbnR9IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgc3RhdGljIGdldENsaWVudChjb25maWc6IFBlZXJDb25maWcpOiBDbGllbnQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENsaWVudCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIFRMUyBjcmVkZW50aWFscyBmb3IgbXNwICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGxldCBwYXRoT3JDZXJ0OiBzdHJpbmcgfCBCdWZmZXIgPSBjb25maWcudGxzQ2VydCBhcyBzdHJpbmcgfCBCdWZmZXI7XG5cbiAgICBpZiAodHlwZW9mIHBhdGhPckNlcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGF0aE9yQ2VydC5tYXRjaChcbiAgICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKHBhdGhPckNlcnQsIFwidXRmOFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKGZzLnJlYWRGaWxlU3luYyhwYXRoT3JDZXJ0LCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgdGhlIHRscyBjZXJ0aWZpY2F0ZSBmcm9tICR7cGF0aE9yQ2VydH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRsc0NyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2wocGF0aE9yQ2VydCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIEdhdGV3YXkgQ2xpZW50IGZvciB1cmwgJHtjb25maWcucGVlckVuZHBvaW50fWApO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGNvbmZpZy5wZWVyRW5kcG9pbnQsIHRsc0NyZWRlbnRpYWxzLCB7XG4gICAgICBcImdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgICBcImdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgY29ubmVjdGlvbiB3aXRoIGlkZW50aXR5IGFuZCBzaWduZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIFRoZSBnUlBDIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbm5lY3RlZCBHYXRld2F5XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBJZGVudGl0eVxuICAgKiAgIHBhcnRpY2lwYW50IFNpZ25lclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNBZGFwdGVyOiBnZXRDb25uZWN0aW9uKGNsaWVudCwgY29uZmlnKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5JZGVudGl0eTogZ2V0SWRlbnRpdHkobXNwSWQsIGNlcnREaXJlY3RvcnlQYXRoKVxuICAgKiAgIElkZW50aXR5LS0+PkZhYnJpY0FkYXB0ZXI6IGlkZW50aXR5XG4gICAqICAgRmFicmljQWRhcHRlci0+PlNpZ25lcjogZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGgpXG4gICAqICAgU2lnbmVyLS0+PkZhYnJpY0FkYXB0ZXI6IHNpZ25lclxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBDcmVhdGUgQ29ubmVjdE9wdGlvbnNcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdChvcHRpb25zKVxuICAgKiAgIEdhdGV3YXktLT4+RmFicmljQWRhcHRlcjogZ2F0ZXdheVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2FsbGVyOiBnYXRld2F5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29ubmVjdGlvbihcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNoYWluY29kZUZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBNb2RlbC5jaGFpbmNvZGVPZihtb2RlbCwgLi4uYXJncykgfHwgY29uZmlnLmNoYWluY29kZU5hbWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNoYW5uZWxGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gTW9kZWwuY2hhbm5lbE9mKG1vZGVsLCAuLi5hcmdzKSB8fCBjb25maWcuY2hhbm5lbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY29udHJhY3RGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgTW9kZWwuY29udHJhY3RPZihtb2RlbCwgLi4uYXJncykgfHxcbiAgICAgIERlZmF1bHRDb250cmFjdFJlc29sdmVyKG1vZGVsLCAuLi5hcmdzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKFxuICAgICAgbXNnLmluY2x1ZGVzKFwiY2hhaW5jb2RlIHN0cmVhbSB0ZXJtaW5hdGVkXCIpIHx8XG4gICAgICBtc2cuaW5jbHVkZXMoXCJSRVNPVVJDRV9FWEhBVVNURURcIikgfHxcbiAgICAgIG1zZy5pbmNsdWRlcyhcInJlY2VpdmVkIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gbWF4XCIpIHx8XG4gICAgICBtc2cuaW5jbHVkZXMoXCJncnBjOiByZWNlaXZlZCBtZXNzYWdlIGxhcmdlclwiKVxuICAgIClcbiAgICAgIHJldHVybiBuZXcgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJFTkRPUlNFTUVOVF9QT0xJQ1lfRkFJTFVSRVwiKSlcbiAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiUEhBTlRPTV9SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBzd2l0Y2ggKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50RXJyb3IoZXJyKSBhcyBFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoVmFsaWRhdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cbn1cblxuRmFicmljQ2xpZW50QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRGlzcGF0Y2gsXG4gIEV2ZW50SWRzLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUGVlckNvbmZpZyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudENvbnRleHRcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJnczogbG9nZ2VkQXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoY3R4QXJncywgUGVyc2lzdGVuY2VLZXlzLlNIVVRET1dOLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY2xvc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5jbG9zZSguLi5sb2dnZWRBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgcHJveGllcyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5pbmdTdGFjay5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgZXZlbnQgcGF5bG9hZCBmcm9tIGJpbmFyeSBmb3JtYXRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgSlNPTiB0byBhbiBvYmplY3Qgd2l0aCBhbiBpZCBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGpzb25CeXRlcyAtIFRoZSBiaW5hcnkgcGF5bG9hZCBmcm9tIHRoZSBjaGFpbmNvZGUgZXZlbnRcbiAgICogQHJldHVybiB7eyBpZDogc3RyaW5nIH19IFRoZSBwYXJzZWQgcGF5bG9hZCBjb250YWluaW5nIHRoZSByZWNvcmQgSURcbiAgICovXG4gIHByaXZhdGUgcGFyc2VQYXlsb2FkKGpzb25CeXRlczogVWludDhBcnJheSk6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmRlY29kZXIuZGVjb2RlKGpzb25CeXRlcyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBvYnNlcnZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvdmVycmlkZSBvYnNlcnZlKG9ic2VydmVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAoIShvYnNlcnZlciBpbnN0YW5jZW9mIEZhYnJpY0NsaWVudEFkYXB0ZXIpKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIFwiT25seSBGYWJyaWNDbGllbnRBZGFwdGVyIGNhbiBiZSBvYnNlcnZlZCBieSBkaXNwYXRjaFwiXG4gICAgICApO1xuICAgIHN1cGVyLm9ic2VydmUob2JzZXJ2ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkIC0gVGhlIGV2ZW50IHBheWxvYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gQWRhcHRlci5sb2dDdHg8RmFicmljQ2xpZW50Q29udGV4dD4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmdTdGFjaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRXZlbnQgc3RhY2sgbm90IGluaXRpYWxpemVkLiBFbnN1cmUgdGhhdCBcInN0YXJ0TGlzdGVuaW5nXCIgaXMgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRoaXMgb3BlcmF0aW9uLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5hZGFwdGVyLmNvbmZpZylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIGZvdW5kLiBzaG91bGQgYmUgaW1wb3NzaWJsZWApO1xuXG4gICAgY29uc3QgY3R4ID1cbiAgICAgIGN0eEFyZyB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgICh0aGlzLm1vZGVscyAmJiB0aGlzLm1vZGVsc1swXSkgfHwgKE1vZGVsIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3IpXG4gICAgICApKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5oYW5kbGVFdmVudHMpO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgTGlzdGVuaW5nIGZvciBpbmNvbWluZyBldmVudHMgb24gY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiLi4uYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBldnQgb2YgdGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgICBjb25zdCB7IHRhYmxlLCBldmVudCwgb3duZXIgfSA9IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwRXZlbnRPbmx5ICYmXG4gICAgICAgICAgb3duZXIgJiZcbiAgICAgICAgICBvd25lciAhPT0gdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwSWRcbiAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9ID0gdGhpcy5wYXJzZVBheWxvYWQoXG4gICAgICAgICAgZXZ0LnBheWxvYWRcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRNb2RlbCA9IHRhYmxlXG4gICAgICAgICAgICA/IE1vZGVsLmdldCh0YWJsZSlcbiAgICAgICAgICAgIDogTW9kZWwuZ2V0KHRoaXMubW9kZWxzWzBdLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGFyZ2V0TW9kZWwgPz8gKHRhYmxlIHx8IHRoaXMubW9kZWxzWzBdPy5uYW1lKTtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFyZ3MgPSBwYXlsb2FkLnJlc3VsdCA/IFtwYXlsb2FkLnJlc3VsdCwgY3R4XSA6IFtjdHhdO1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgbW9kZWxSZWYgYXMgQ29uc3RydWN0b3IgfCBzdHJpbmcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHBheWxvYWQuaWQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgLi4uKG9ic2VydmVyQXJncyBhcyBDb250ZXh0dWFsQXJnczxhbnk+KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHVwZGF0ZSBvYnNlcnZhYmxlcyBmb3IgdGFibGUgJHt0YWJsZX0gZXZlbnQgJHtldmVudH0gaWQ6ICR7cGF5bG9hZC5pZH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlYWQgZXZlbnQgZm9yIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIjogJHtlfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKGN0eCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHN1bW1hcnkgU2V0cyB1cCBldmVudCBkaXNwYXRjaGluZyBmb3IgdGhlIG9ic2VydmVkIGFkYXB0ZXIuIFdoZW5cbiAgICogYHN5bnRoZXRpY0V2ZW50c2AgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpIG5vIGdhdGV3YXkgY29ubmVjdGlvbiBpcyBvcGVuZWQ7XG4gICAqIGluc3RlYWQgZXZlcnkgQ1JVRCBvcGVyYXRpb24gaXMgd3JhcHBlZCB3aXRoIGEgUHJveHkgdGhhdCBmaXJlc1xuICAgKiBgdXBkYXRlT2JzZXJ2ZXJzYCBmb3IgKiphbGwqKiBtb2RlbHMuIFdoZW4gYHN5bnRoZXRpY0V2ZW50c2AgaXMgZmFsc2UgdGhlXG4gICAqIGV4aXN0aW5nIGdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlXG4gICAqIGxvY2FsIFByb3h5IGZhbGxiYWNrIGlzIGxpbWl0ZWQgdG8gZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHMgb25seS5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb3IgY29uZmlnIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuXG4gICAgY29uc3Qgc3ludGhldGljRXZlbnRzID0gdGhpcy5hZGFwdGVyLmNvbmZpZy5zeW50aGV0aWNFdmVudHMgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFzeW50aGV0aWNFdmVudHMpIHtcbiAgICAgIC8vIEdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiAobm9uLXN5bnRoZXRpYyBwYXRoKVxuICAgICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBcImRpc3BhdGNoXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIE1vZGVsIGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KFxuICAgICAgICBjdHgsXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcgYXMgUGVlckNvbmZpZyxcbiAgICAgICAgdGhpcy5jbGllbnRcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbCk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gYXdhaXQgbmV0d29yay5nZXRDaGFpbmNvZGVFdmVudHMoXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKGN0eCk7XG4gICAgfVxuXG4gICAgLy8gUHJveHkgQ1JVRCBtZXRob2RzLlxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSB0cnVlICDihpIgbm90aWZ5IGZvciBBTEwgbW9kZWxzIChyZXBsYWNlcyBnYXRld2F5IGV2ZW50cyBlbnRpcmVseSlcbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gZmFsc2Ug4oaSIG5vdGlmeSBvbmx5IGZvciBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVsc1xuICAgIC8vICAgKHRoZSBnYXRld2F5IHN1YnNjcmlwdGlvbiBoYW5kbGVzIHB1YmxpYyBtb2RlbHMpXG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KVtdXG4gICAgKS5mb3JFYWNoKCh0b1dyYXApID0+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gYWRhcHRlciBwcm92aWRlZCBmb3IgdGhlIGZhbGxiYWNrIG9mIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzYFxuICAgICAgICApO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXJbdG9XcmFwXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke3RvV3JhcH0gbm90IGZvdW5kIGluICR7dGhpcy5hZGFwdGVyLmFsaWFzfSBhZGFwdGVyIHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG5cbiAgICAgIGxldCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLmFkYXB0ZXIsIHRvV3JhcCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IHRoaXMuYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCB0b1dyYXApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke3RvV3JhcH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGFyZSByZWFkIG9ubHkgcHJvcGVydGllc1xuICAgICAgdGhpcy5hZGFwdGVyW3RvV3JhcF0gPSBuZXcgUHJveHkodGhpcy5hZGFwdGVyW3RvV3JhcF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jIChcbiAgICAgICAgICB0YXJnZXQ6IGFueSxcbiAgICAgICAgICB0aGlzQXJnOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgICAgICAgIGFyZ0FycmF5OiBhbnlbXVxuICAgICAgICApID0+IHtcbiAgICAgICAgICAvLyBSdW4gdGhlIG9yaWdpbmFsIG1ldGhvZCB1bmNoYW5nZWQgc28gdHJhbnNpZW50IGRhdGEgaXMgcHJlc2VydmVkXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ0FycmF5KTtcblxuICAgICAgICAgIGNvbnN0IGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+ID0gYXJnQXJyYXlbMF07XG4gICAgICAgICAgLy8gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgZmFsc2UsIHB1YmxpYyBtb2RlbHMgZW1pdCBhIGNoYWluY29kZSBldmVudFxuICAgICAgICAgIC8vIG9uIHRoZSBjb250cmFjdCBzaWRlOyBza2lwIHRoZSBsb2NhbCBmYWxsYmFjayB0byBhdm9pZFxuICAgICAgICAgIC8vIGRvdWJsZS1ub3RpZmljYXRpb24uIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIHRydWUgd2UgaGFuZGxlIGFsbCBtb2RlbHMuXG4gICAgICAgICAgaWYgKCFzeW50aGV0aWNFdmVudHMgJiYgIU1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSkgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgIC8vIENvbnRleHQgaXMgYWx3YXlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJnQXJyYXlcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoYXJnQXJyYXkubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGlkcyA9IGFyZ0FycmF5WzFdO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IGFueVtdID0gW2NsYXp6LCBidWxrVG9TaW5nbGUodG9XcmFwKSwgaWRzXTtcblxuICAgICAgICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJvYnNlcnZlRnVsbFJlc3VsdFwiKSkge1xuICAgICAgICAgICAgcmVzdWx0QXJncy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgcmVzdWx0QXJnc1swXSxcbiAgICAgICAgICAgIHJlc3VsdEFyZ3NbMV0sXG4gICAgICAgICAgICByZXN1bHRBcmdzWzJdLFxuICAgICAgICAgICAgLi4ucmVzdWx0QXJncy5zbGljZSgzKSxcbiAgICAgICAgICAgIC4uLihjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+KVxuICAgICAgICAgICkuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHt0b1dyYXB9IG9uICR7Y2xhenoubmFtZSB8fCBjbGF6en0gZm9yICR7aWRzfTogJHtlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5pZiAoRmFicmljQ2xpZW50QWRhcHRlcilcbiAgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBGYWJyaWNDbGllbnREaXNwYXRjaDtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsicmVzb2x2ZVByaW1hcnlLZXlGaWVsZCIsIm0iLCJsb2ciLCJTdHJpbmciLCJNb2RlbCIsInBrIiwibWVzc2FnZSIsIm5hbWUiLCJ2ZXJib3NlIiwidW5kZWZpbmVkIiwid2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlciIsImluZGV4ZXMiLCJwa0ZpZWxkIiwibWFwIiwiaW5kZXgiLCJmaWVsZHMiLCJpbmNsdWRlcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInNvcnRlZEZpZWxkcyIsImZpbHRlciIsImZpZWxkIiwiaGFzUGsiLCJzb21lIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibGFzdEZpZWxkIiwibGFzdERpcmVjdGlvbiIsInZhbHVlcyIsInRvTG93ZXJDYXNlIiwiZGlyZWN0aW9uIiwiYXNzaWduIiwiZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlIiwiZmlsZVBhdGgiLCJmcyIsInJlcXVpcmUiLCJwYXRoIiwiZGlybmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJnZW5lcmF0ZU1vZGVsSW5kZXhlcyIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwicmVzb2x2ZSIsInBhcmVudFBhdGgiLCJleHBvcnRzIiwiZSIsImFzeW5jIiwicmVhZE1vZGVsRm9sZGVycyIsImZvbGRlcnMiLCJyZXN1bHQiLCJmb2xkZXIiLCJyZXNvbHZlZEZvbGRlciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicmVjdXJzaXZlIiwiZiIsImlzRmlsZSIsImVuZHNXaXRoIiwicHVzaCIsIndyaXRlSW5kZXhlcyIsInAiLCJwcm9jZXNzIiwiY3dkIiwiY29sbGVjdGlvbiIsImpvaW4iLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsIndyaXRlRGVzaWduRG9jcyIsImRlc2lnbkRvY3MiLCJkb2NJZCIsInJlcGxhY2UiLCJwYXlsb2FkIiwiX3JldiIsImNvbGxlY3Rpb25Gb3IiLCJjb2xsZWN0aW9uTmFtZSIsInBvbGljeSIsInJlcXVpcmVkUGVlckNvdW50IiwibWF4UGVlckNvdW50IiwiYmxvY2tUb0xpdmUiLCJtZW1iZXJPbmx5UmVhZCIsIm1lbWJlck9ubHlXcml0ZSIsInByaXZhdGVDb2xsZWN0aW9uRm9yIiwibXNwSWQiLCJjIiwiZW5kb3JzZW1lbnRQb2xpY3kiLCJzaWduYXR1cmVQb2xpY3kiLCJzaGFyZWRDb2xsZWN0aW9uRm9yIiwibXNwSWRzIiwiZXh0cmFjdENvbGxlY3Rpb25zIiwib3ZlcnJpZGVzIiwibWlycm9yIiwicHJpdmF0ZUNvbHMiLCJzaGFyZWRDb2xzIiwiY29sbGVjdGlvbnNGb3IiLCJyZXNvbHZlQ29sbGVjdGlvbiIsImFyZyIsIkludGVybmFsRXJyb3IiLCJwcml2YXRlRGVmYXVsdHMiLCJzaGFyZWREZWZhdWx0cyIsIm1pcnJvck1ldGEiLCJtaXJyb3JlZEF0IiwicHJpdmF0ZXMiLCJmbGF0IiwicmVzb2x2ZWQiLCJyZXNvbHZlciIsInNoYXJlZCIsIndyaXRlQ29sbGVjdGlvbnMiLCJjb2xzIiwiZmlsZU5hbWUiLCJ3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzIiwiZG9jcyIsIkZhYnJpY0NsaWVudFBhZ2luYXRvciIsIlBhZ2luYXRvciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsInF1ZXJ5Iiwic2l6ZSIsImNsYXp6Iiwic3VwZXIiLCJwcmVwYXJlIiwicmF3U3RhdGVtZW50IiwiVW5zdXBwb3J0ZWRFcnJvciIsInBhZ2UiLCJhcmdzIiwiaXNTZXJpYWxpemVkUGFnZSIsIm9iaiIsImRhdGEiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJNdmNjUmVhZENvbmZsaWN0RXJyb3IiLCJQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IiLCJFbmRvcnNlbWVudFBvbGljeUVycm9yIiwiVHJhbnNhY3Rpb25MaW1pdHNFcnJvciIsImNvZGUiLCJUcmFuc2FjdGlvblRpbWVvdXRFcnJvciIsIlRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIiwiUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidGFibGVOYW1lIiwiY2xhc3MiLCJzdGF0ZW1lbnQiLCJib29rbWFyayIsImxpc3RCeSIsIkxJU1RfQlkiLCJ3YXJuIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJ0eXBlIiwiY29sdW1uIiwicmVxdWlyZWQiLCJ0YWJsZSIsIkVSQzIwV2FsbGV0IiwiQWxsb3dhbmNlIiwiQ2xpZW50U2VyaWFsaXplciIsIkpTT05TZXJpYWxpemVyIiwicHJlU2VyaWFsaXplIiwibW9kZWxOYW1lIiwidG9TZXJpYWxpemUiLCJtZXRhZGF0YSIsIk1ldGFkYXRhIiwiU2VyaWFsaXphdGlvbkVycm9yIiwiTW9kZWxLZXlzIiwiQU5DSE9SIiwiZGVzZXJpYWxpemUiLCJzdHIiLCJkZXNlcmlhbGl6YXRpb24iLCJjbGFzc05hbWUiLCJFcnJvciIsImJ1aWxkIiwic2VyaWFsaXplIiwiRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5Iiwic2VyaWFsaXplciIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsInVwZGF0ZU9ic2VydmVycyIsImV2ZW50Iiwib2JzZXJ2ZXJIYW5kbGVyIiwiY291bnQiLCJwYXJzZWRJZCIsIlNlcXVlbmNlIiwicGFyc2VWYWx1ZSIsInNlcXVlbmNlRm9yIiwidG9rZW5OYW1lIiwic3ltYm9sIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJ0b3RhbFN1cHBseSIsInRvdGFsIiwiYmFsYW5jZU9mIiwib3duZXIiLCJiYWxhbmNlIiwidHJhbnNmZXIiLCJ0byIsInRyYW5zZmVycmVkIiwic3VibWl0VHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInRyYW5zZmVyRnJvbSIsImZyb20iLCJjb250ZXh0QXJncyIsIkNvbnRleHQiLCJhcHByb3ZlIiwic3BlbmRlciIsImFwcHJvdmVkIiwiYWxsb3dhbmNlIiwiaW5pdGlhbGl6ZSIsInRva2VuIiwiaW5pdGlsaWF6ZWQiLCJjaGVja0luaXRpYWxpemVkIiwibWludCIsImFtb3VudCIsImJ1cm4iLCJidXJuRnJvbSIsImFjY291bnQiLCJjbGllbnRBY2NvdW50QmFsYW5jZSIsInNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSIsImNsaWVudEFjY291bnRJRCIsImV4dHJhY3RJZHMiLCJjb21wb3NlZCIsInBrUHJvcHMiLCJleHRyYWN0SWQiLCJjb21wb3NlQXR0cmlidXRlVmFsdWUiLCJJZGVudGl0eUNyZWRlbnRpYWxzIiwiZGVzY3JpcHRpb24iLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiSWRlbnRpdHkiLCJYNTA5Iiwib25lVG9PbmUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsImRlbGV0ZSIsIkNvcmVVdGlscyIsImxvZ2dlciIsIk1pbmlMb2dnZXIiLCJjb250ZW50T2ZMb2FkRmlsZSIsImNvbnRlbnRPclBhdGgiLCJmaWxlUmVhZGVyIiwiVWludDhBcnJheSIsIm1hdGNoIiwicmVhZEZpbGUiLCJwcm9taXNlcyIsIm5vcm1hbGl6ZUltcG9ydCIsImltcG9ydCIsImdldENBVXNlciIsInVzZXJOYW1lIiwicHJpdmF0ZUtleSIsImNlcnRpZmljYXRlIiwib3B0aW9ucyIsInN0cmluZ0Zvcm1hdCIsInVzZXIiLCJVc2VyIiwiY29uZmlnIiwiaHNtIiwic29mdHdhcmUiLCJsaWIiLCJsaWJyYXJ5Iiwic2xvdCIsImxhYmVsIiwidG9rZW5MYWJlbCIsInBpbiIsImNyeXB0b1N1aXRlIiwiZ2V0Q3J5cHRvU3VpdGUiLCJzZXRDcnlwdG9TdWl0ZSIsImVucm9sbG1lbnRLZXkiLCJnZXRIU01FbnJvbGxtZW50S2V5IiwiZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5Iiwic2V0RW5yb2xsbWVudCIsIm5ld0NyeXB0b1N1aXRlIiwiY3JlYXRlS2V5RnJvbVJhdyIsInNraSIsImtleUlkSGV4IiwidHJpbSIsIkJ1ZmZlciIsImdldENlcnRpZmljYXRlU0tJIiwiZ2V0S2V5IiwiaXNQcml2YXRlIiwieDUwOSIsIlg1MDlDZXJ0aWZpY2F0ZSIsImp3ayIsInB1YmxpY0tleSIsImV4cG9ydCIsImZvcm1hdCIsInByZWZpeCIsIngiLCJ5IiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImNvbmNhdCIsImRpZ2VzdCIsImdldElkZW50aXR5IiwiY2VydERpcmVjdG9yeVBhdGgiLCJpZGVudGl0eUZpbGVSZWFkZXIiLCJjZXJ0UGF0aCIsImdldEZpcnN0RGlyRmlsZU5hbWUiLCJjcmVkZW50aWFscyIsImRpclBhdGgiLCJyZWFkZGlyIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQiLCJnZXRGaWxlQ29udGVudCIsImdldFNpZ25lciIsImtleURpcmVjdG9yeVBhdGgiLCJzaWduZXJGaWxlUmVhZGVyIiwia2V5UGF0aCIsInByaXZhdGVLZXlQZW0iLCJleHRyYWN0UHJpdmF0ZUtleSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImsiLCJzaWduZXJzIiwibmV3UHJpdmF0ZUtleVNpZ25lciIsInBlbSIsImxpYk5hbWUiLCJzdWJ0bGUiLCJnbG9iYWxUaGlzIiwid2luZG93IiwiQ3J5cHRvIiwid2ViY3J5cHRvIiwic3RyMmFiIiwiYnVmIiwiQXJyYXlCdWZmZXIiLCJidWZWaWV3Iiwic3RyTGVuIiwiY2hhckNvZGVBdCIsInJlcGxhY2VBbGwiLCJkZWNvZGVkIiwiYmluYXJ5RGVyIiwiaW1wb3J0S2V5IiwibmFtZWRDdXJ2ZSIsImdldEFraUFuZFNlcmlhbEZyb21DZXJ0IiwiY2VydCIsIng1MDlDZXJ0aWZpY2F0ZSIsIlg1MDlDZXJ0IiwiYWtpRXh0IiwiZXh0ZW5zaW9ucyIsImFraSIsInRvVXBwZXJDYXNlIiwic3RhcnRzV2l0aCIsInNlcmlhbCIsInNlcmlhbE51bWJlciIsImNyeXB0b1Byb3ZpZGVyIiwic2V0IiwiQkFTRV9BTFBIQUJFVCIsIkNSWVBUTyIsIkJhc2VFbmNvZGVyIiwiYWxwaGFiZXQiLCJiYXNlTWFwIiwiaiIsImNoYXJBdCIsInhjIiwiYmFzZSIsImxlYWRlciIsImZhY3RvciIsIk1hdGgiLCJpRmFjdG9yIiwiZW5jb2RlIiwic291cmNlIiwiaXNWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ6ZXJvZXMiLCJwYmVnaW4iLCJwZW5kIiwiYjU4IiwiY2FycnkiLCJpdDEiLCJpdDIiLCJyZXBlYXQiLCJkZWNvZGVVbnNhZmUiLCJwc3oiLCJiMjU2IiwiaXQzIiwiaXQ0IiwidmNoIiwiQ3J5cHRvVXRpbHMiLCJiNThlbmNvZGVyIiwiQkFTRTU4IiwiZmFicmljSWRGcm9tQ2VydGlmaWNhdGUiLCJzdWJqZWN0IiwiaXNzdWVyIiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImV4dHJhY3RLZXkiLCJ1c2FnZXMiLCJSZWdFeHAiLCJleHRyYWN0UHVibGljS2V5Iiwic2lnbiIsImJ1ZmYiLCJoYXNoIiwiYiIsInBhZFN0YXJ0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwiZW5jcnlwdCIsImdldFN1YnRsZUNyeXB0byIsImlzQnJvd3NlciIsImRlY3J5cHQiLCJnZXRNYXN0ZXIiLCJ0ZXh0RW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZ2VuR2VuZXNpcyIsInJhbmRvbVVVSUQiLCJpbXBvcnRlZEtleSIsIktFWV9BTEdPUllUSE0iLCJpdiIsImdldERlcml2YXRpb25LZXkiLCJzYWx0Iiwic2FsdEJ1ZmZlciIsInNhbHRIYXNoZWQiLCJwYXJhbXMiLCJIQVNIIiwiaXRlcmF0aW9ucyIsIklURVJBVElPTlMiLCJkZXJpdmF0aW9uIiwiZGVyaXZlQml0cyIsIktFWUxFTkdUSCIsIml2bGVuIiwia2V5bGVuIiwiZGVyaXZlZEtleSIsImltcG9ydGVkRW5jcnlwdGlvbktleSIsIkFMR09SWVRITSIsImVuY3J5cHRQaW4iLCJ0ZXh0Iiwia2V5T2JqZWN0IiwidGV4dEJ1ZmZlciIsImVuY3J5cHRlZFRleHQiLCJkZWNyeXB0UGluIiwidGV4dERlY29kZXIiLCJkZWNyeXB0ZWRUZXh0IiwiSEZDQUlkZW50aXR5VHlwZSIsIkhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMiLCJGYWJyaWNFbnJvbGxtZW50U2VydmljZSIsIkxvZ2dlZENsYXNzIiwiY2FDb25maWciLCJjYU5hbWUiLCJjYUNlcnQiLCJjYUtleSIsInVybCIsIkNBIiwiY2EiLCJ0bHMiLCJ0cnVzdGVkUm9vdHMiLCJyb290IiwiRmFicmljQ0FTZXJ2aWNlcyIsIkNsaWVudCIsImNsaWVudCIsIkNlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVTZXJ2aWNlIiwibmV3Q2VydGlmaWNhdGVTZXJ2aWNlIiwiQWZmaWxpYXRpb25zIiwiYWZmaWxpYXRpb25TZXJ2aWNlIiwibmV3QWZmaWxpYXRpb25TZXJ2aWNlIiwiSWRlbnRpdGllcyIsImlkZW50aXR5U2VydmljZSIsIm5ld0lkZW50aXR5U2VydmljZSIsImdldENlcnRpZmljYXRlcyIsInJlcXVlc3QiLCJkb01hcCIsInJlc3BvbnNlIiwiY2VydHMiLCJQRU0iLCJnZXRJZGVudGl0aWVzIiwiaWRlbnRpdGllc1NlcnZpY2UiLCJnZXRBbGwiLCJpZGVudGl0aWVzIiwicGFyc2VFcnJvciIsInJlZ2V4cCIsImV4ZWMiLCJDb25mbGljdEVycm9yIiwiZ2V0QWZmaWxpYXRpb25zIiwiYSIsInJlYWQiLCJlbnJvbGxtZW50SWQiLCJnZXRPbmUiLCJOb3RGb3VuZEVycm9yIiwic3VjY2VzcyIsInJlZ2lzdGVyIiwiaXNTdXBlclVzZXIiLCJhZmZpbGlhdGlvbiIsInVzZXJSb2xlIiwiYXR0cnMiLCJtYXhFbnJvbGxtZW50cyIsInJlZ2lzdHJhdGlvbiIsInBhc3N3b3JkIiwicHJvcHMiLCJlbnJvbGxtZW50SUQiLCJlbnJvbGxtZW50U2VjcmV0IiwiaW5mbyIsImlkZW50aXR5RnJvbUVucm9sbG1lbnQiLCJlbnJvbGxtZW50Iiwicm9vdENlcnRpZmljYXRlIiwiTG9nZ2luZyIsImNsaWVudElkIiwibm93IiwiRGF0ZSIsInRvQnl0ZXMiLCJjcmVhdGVkT24iLCJ1cGRhdGVkT24iLCJlbnJvbGwiLCJpZGVudGl0eSIsInJlZ2lzdGVyQW5kRW5yb2xsIiwicmV2b2tlIiwicmVhc29uIiwiUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIiLCJlcnJzIiwicm9sZSIsInNldEFmZmlsaWF0aW9uIiwiYWRkQXR0ciIsImF0dHIiLCJzZXRBdHRycyIsInNldEVucm9sbG1lbnRJRCIsInNldEVucm9sbG1lbnRTZWNyZXQiLCJzZXRNYXhFbnJvbGxtZW50cyIsInNldFJvbGUiLCJtaW5sZW5ndGgiLCJtaW4iLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJjaGFpbmNvZGVPZiIsIkNIQUlOQ09ERSIsInBvcCIsImNvbnRyYWN0T2YiLCJDT05UUkFDVCIsImNoYW5uZWxPZiIsIkNIQU5ORUwiLCJFUkMyMEV2ZW50cyIsIkZhYnJpY0Jhc2VNb2RlbCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInZlcnNpb24iLCJ1c2VzIiwiRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCIsImNyZWF0ZWRCeSIsInVwZGF0ZWRCeSIsIkRlZmF1bHRDb250cmFjdFJlc29sdmVyIiwiY29udHJhY3QiLCJjaGFpbmNvZGUiLCJjaGFubmVsIiwiZXh0cmFjdE1zcElkIiwiZ2V0TVNQSUQiLCJPd25lciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJjbGllbnRJZGVudGl0eSIsImdldElEIiwic2VsZWN0IiwidG9rZW5zIiwiZXhlY3V0ZSIsImFwcGx5Iiwib3duZWRCeU9uQ3JlYXRlIiwiY29udGV4dCIsInN0dWIiLCJjcmVhdG9yIiwiZ2V0Q3JlYXRvciIsIm1zcGlkIiwic2V0T3duZWRCeUtleVZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJvd25lZEJ5IiwiYXR0cmlidXRlIiwiZ2VuZXJhdGVkIiwicmVhZG9ubHkiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJkZWNvcmF0b3IiLCJ0cmFuc2FjdGlvbklkT25DcmVhdGUiLCJnZXRUeElEIiwidHJhbnNhY3Rpb25JZCIsIm9uVXBkYXRlIiwiVFJBTlNBQ1RJT05fSUQiLCJldmFsTWlycm9yTWV0YWRhdGEiLCJjcmVhdGVNaXJyb3JIYW5kbGVyIiwiZmFicmljQ3R4Iiwic291cmNlTW9kZWwiLCJwdXQiLCJyZXBvIiwibWlycm9yQ29sbGVjdGlvbiIsInVwZGF0ZU1pcnJvckhhbmRsZXIiLCJhcHBseVVwZGF0ZVZhbGlkYXRpb24iLCJtZXJnZUZvclVwZGF0ZSIsImRlbGV0ZU1pcnJvckhhbmRsZXIiLCJwa1Byb3AiLCJzZWdyZWdhdGVkIiwibWlycm9yV3JpdGVHdWFyZCIsIm1zcCIsImNvbmRpdGlvbiIsInJlYWRNaXJyb3JIYW5kbGVyIiwibWF0Y2hlcyIsInJlYWRGcm9tIiwibXNwSWRPckNvbmRpdGlvbiIsImlzQ29uZGl0aW9uT25seSIsIkJvb2xlYW4iLCJjb25kIiwib25SZWFkIiwicHJpb3JpdHkiLCJvbkRlbGV0ZSIsIk1vZGVsQ29sbGVjdGlvbiIsIm9yZ05hbWUiLCJ0b1Bhc2NhbENhc2UiLCJOYW1lc3BhY2VDb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsIlNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZIiwiYXBwbHlTZWdyZWdhdGlvbkZsYWdzIiwiaXNGdWxseVNlZ3JlZ2F0ZWQiLCJoYXNQdWJsaWNQcm9wZXJ0aWVzIiwibWFya0Z1bGx5U2VncmVnYXRlZCIsImFwcGx5TWlycm9yRmxhZ3MiLCJhdHRyaWJ1dGVzIiwidHJhbnNpZW50TWV0YSIsImV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMiLCJkYXRhQXJyYXkiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJrZXlBcnJheSIsInBrS2V5IiwicGtTZXFOYW1lIiwic2VxdWVuY2VOYW1lIiwiaWRWYWx1ZSIsImNhbkJ1aWxkUGVySW5zdGFuY2UiLCJzZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uIiwicHJvcFNlcU5hbWUiLCJzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlIiwiX2siLCJrZXlTdHJpbmdzIiwid3JpdGVUbyIsInNlZ3JlZ2F0ZWREYXRhT25SZWFkIiwic2VncmVnYXRlZERhdGFPblVwZGF0ZSIsIm9sZE1vZGVsIiwic2VncmVnYXRlZERhdGFPbkRlbGV0ZSIsImlubmVyU2VncmVnYXRlZCIsInNlZ3JlZ2F0ZWREZWMiLCJTZXQiLCJhZGQiLCJjb25zdHJNZXRhIiwiY29uc3RyQ29sbGVjdGlvbnMiLCJ1cGRhdGVkVHJhbnNpZW50TWV0YSIsImRlY3MiLCJwcm9wZXJ0aWVzIiwiZ3JvdXBOYW1lIiwiZXh0cmFjdEdyb3VwTmFtZSIsImRhdGFHcm91cE5hbWUiLCJlYXJseUV4dHJhY3Rpb25NZXRhIiwiZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0IiwiZ3JvdXAiLCJwcm9wIiwib24iLCJEQk9wZXJhdGlvbnMiLCJBTEwiLCJwcml2YXRlRGF0YSIsInNoYXJlZERhdGEiLCJzb3J0S2V5c09ubHlSZWN1cnNpdmUiLCJzb3J0IiwicmVkdWNlIiwiYWNjIiwiRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJlcnJvciIsInNlbGYiLCJvIiwicmVsYXRpb25zIiwiZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnRzIiwic3BsaXQiLCJzdWIiLCJzYWZlUGFyc2VJbnQiLCJzdHJpbmciLCJkaWdpdFJlZ2V4IiwidGVzdCIsInBhcnNlZGludCIsInBhcnNlSW50IiwiaXNOYU4iLCJTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsInB1dEFuY2hvciIsInByZVNlcmlhbGl6YXRpb24iLCJGYWJyaWNJZGVudGl0eVNlcnZpY2UiLCJDbGllbnRCYXNlZFNlcnZpY2UiLCJyb290Q2xpZW50IiwiX3VzZXIiLCJjZXJ0aWZpY2F0ZXMiLCJhZmZpbGlhdGlvbnMiLCJnZXRVc2VyIiwiY2ZnIiwiSU5JVElBTElaQVRJT04iLCJnZXROYW1lIiwidXBkYXRlSWRlbnRpdHkiLCJpZGVudGl0eVJlcXVlc3QiLCJjYVVzZXJJZGVudGl0eSIsInJlZW5yb2xsVXNlciIsImNyZWF0ZVVzZXIiLCJnZXRNc3BpZCIsImVucm9sbG1lbnRBdHRycyIsIm9wdGlvbmFsIiwicmVlbnJvbGwiLCJyZW5ld2VkSWRlbnRpdHkiLCJyZXZva2VPcHRpb25zIiwicmV2b2tlUmVxdWVzdCIsIkNBX1JPTEUiLCJEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MiLCJldmFsdWF0ZVRpbWVvdXQiLCJlbmRvcnNlVGltZW91dCIsInN1Ym1pdFRpbWVvdXQiLCJjb21taXRUaW1lb3V0IiwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzIiwiYWxsb3dHYXRld2F5T3ZlcnJpZGUiLCJhbGxvd0NvbnRleHRUcmFuc2llbnRNYXAiLCJlbmNyeXB0VHJhbnNpZW50Iiwic3ludGhldGljRXZlbnRzIiwiQ0xJRU5UX09WRVJSSURFX0tFWVMiLCJGYWJyaWNDbGllbnRDb250ZXh0IiwidG9PdmVycmlkZXMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwiY2hhaW5jb2RlRm9yIiwiY2hhbm5lbEZvciIsImNvbnRyYWN0Rm9yIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInNlcmlhbGl6ZWRNb2RlbHMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJpbmplY3RUcmFuc2llbnRPdmVycmlkZXMiLCJ0cmFuc2llbnREYXRhIiwiaGFzVHJhbnNpZW50RGF0YSIsImhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhIiwic2hvdWxkSW5qZWN0IiwiT1ZFUlJJREVTIiwiaXRlbSIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsIkNvbnRyYWN0IiwiY2xhenpPckNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJzaG91bGRVc2VMZWdhY3lHYXRld2F5IiwibGVnYWN5QXJncyIsInByZXBhcmVMZWdhY3lBcmdzIiwidHJhbnNpZW50TWFwIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJwZWVyQ29uZmlncyIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJnYXRld2F5IiwiZ2V0Q29udHJhY3ROYW1lIiwiZXZhbHVhdGUiLCJub3JtYWxpemVkQXJncyIsIm5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQiLCJ0cmFuc2llbnRFbnRyaWVzIiwicHJvcG9zYWxPcHRpb25zIiwiYXJndW1lbnRzIiwiY2xvc2UiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwicGVlcnMiLCJwZWVyRW5kcG9pbnQiLCJwZWVySG9zdEFsaWFzIiwidGxzQ2VydCIsImVuZG9yc2VycyIsIm9yZyIsImV4dHJhcyIsIm1zcE1hcCIsImxlZ2FjeUNvdW50Iiwic2VsZWN0aW9ucyIsImNob2ljZSIsImVuZHBvaW50IiwiZmNuIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwiY2hhaW5jb2RlTmFtZSIsImNvbnRyYWN0TmFtZSIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY3JlYXRlVHJhbnNhY3Rpb24iLCJzZXRUcmFuc2llbnQiLCJwZWVyIiwiZ2V0Q2hhbm5lbCIsImdldEVuZG9yc2VyIiwiZW5kb3JzZXIiLCJzZXRFbmRvcnNpbmdQZWVycyIsImRpc2Nvbm5lY3QiLCJkZWR1cGVkIiwiTWFwIiwiYWRkUGVlciIsImhhcyIsInJlYWRQZW1JbnB1dCIsImNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIiwia2V5Q2VydE9yRGlyZWN0b3J5UGF0aCIsInBlZXJFbnRyaWVzIiwiY2hhbm5lbFBlZXJzIiwib3JncyIsInRsc1BlbSIsImhvc3RuYW1lIiwiZXh0cmFjdEhvc3QiLCJlbnN1cmVHcnBjVXJsIiwidGxzQ0FDZXJ0cyIsImdycGNPcHRpb25zIiwiaG9zdG5hbWVPdmVycmlkZSIsImVuZG9yc2luZ1BlZXIiLCJjaGFpbmNvZGVRdWVyeSIsImxlZGdlclF1ZXJ5IiwiZXZlbnRTb3VyY2UiLCJvcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb25zIiwib3JkZXJlcnMiLCJjaGFubmVscyIsImV2ZXJ5IiwiaXNMb2NhbEVuZHBvaW50IiwiaG9zdCIsInNhbml0aXplZCIsImlzQnVmZmVyIiwidHJpbW1lZCIsInN0YXRzIiwic3RhdCIsImNhdGNoIiwiaXNEaXJlY3RvcnkiLCJyZWFkRnNGaWxlIiwiZXJyIiwibWlncmF0ZSIsInJlZmVyZW5jZSIsImxhc3QiLCJwcm92aWRlZEN0eCIsIm1pZ3JhdGlvbkFyZ3MiLCJNSUdSQVRJT04iLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBWUEsU0FBU0EsdUJBQ1BDLEdBQ0FDO1FBRUE7WUFDRSxPQUFPQyxPQUFPQyxvQkFBQUEsTUFBTUMsR0FBR0o7QUFDekIsVUFBRTtZQUNBLE1BQU1LLFVBQVUsWUFBWUwsRUFBRU07WUFDOUJMLElBQUlNLFFBQVFGO1lBQ1osT0FBT0c7QUFDVDtBQUNG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
4001
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRDb250ZXh0LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4ID0gQ3JlYXRlSW5kZXhSZXF1ZXN0O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJpbWFyeUtleUZpZWxkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBsb2c6IExvZ2dlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKE1vZGVsLnBrKG0pKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBTa2lwcGluZyAke20ubmFtZX0gd2hpbGUgZXh0cmFjdGluZyBpbmRleGVzOiBubyBwcmltYXJ5IGtleSBpcyBkZWZpbmVkYDtcbiAgICBsb2cudmVyYm9zZShtZXNzYWdlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHBrRmllbGQ6IHN0cmluZ1xuKTogSW5kZXhbXSB7XG4gIGlmICghcGtGaWVsZCkge1xuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXMubWFwKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IChpbmRleCBhcyBhbnkpPy5pbmRleD8uZmllbGRzO1xuICAgIGlmIChcbiAgICAgICFpbmRleD8ubmFtZSB8fFxuICAgICAgdHlwZW9mIGluZGV4Lm5hbWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFpbmRleC5uYW1lLmluY2x1ZGVzKFwiZGVmYXVsdFF1ZXJ5XCIpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShmaWVsZHMpIHx8XG4gICAgICBmaWVsZHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZDogYW55KSA9PiB0eXBlb2YgZmllbGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZmllbGQpXG4gICAgKTtcbiAgICBpZiAoc29ydGVkRmllbGRzLmxlbmd0aCAhPT0gZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BrID0gZmllbGRzLnNvbWUoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIHBrRmllbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGhhc1BrKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGxhc3REaXJlY3Rpb24gPSBTdHJpbmcoXG4gICAgICBPYmplY3QudmFsdWVzKGxhc3RGaWVsZCB8fCB7fSlbMF0gfHwgXCJhc2NcIlxuICAgICkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBsYXN0RGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmRleCwge1xuICAgICAgaW5kZXg6IE9iamVjdC5hc3NpZ24oe30sIChpbmRleCBhcyBhbnkpLmluZGV4LCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbcGtGaWVsZF06IGRpcmVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbEluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGxvZzogTG9nZ2VyXG4pOiBJbmRleFtdIHtcbiAgY29uc3QgaW5kZXhlcyA9IGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xuICBjb25zdCBwa0ZpZWxkID0gcmVzb2x2ZVByaW1hcnlLZXlGaWVsZChtLCBsb2cpO1xuICByZXR1cm4gd2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlcihpbmRleGVzLCBwa0ZpZWxkIHx8IFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSk7XG4gIGNvbnN0IGV4cG9ydHMgPSByZXF1aXJlKGZpbGVQYXRoKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZGVsRm9sZGVycyhcbiAgLi4uZm9sZGVyczogc3RyaW5nW11cbik6IFByb21pc2U8TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10+IHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHJlc29sdmVkRm9sZGVyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmOiBhbnkpID0+IGYuaXNGaWxlKCkgJiYgZi5uYW1lLmVuZHNXaXRoKFwianNcIikpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUluZGV4ZXMoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9aW5kZXhlcy8ke2luZGV4Lm5hbWV9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShpbmRleCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNpZ25Eb2NzKFxuICBkZXNpZ25Eb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRlc2lnbkRvY3MubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZGVzaWduRG9jcy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQucmVwbGFjZSgvXl9kZXNpZ25cXC8vLCBcIlwiKTtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9ZGVzaWduX2RvY3MvJHtkb2NJZH0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBjb25zdCBwYXlsb2FkID0geyAuLi5kb2MgfTtcbiAgICBkZWxldGUgcGF5bG9hZC5fcmV2O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJEZXNpZ25Eb2MgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvbHZlciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IHdyaXRlRGVzaWduRG9jcyB9IGZyb20gXCIuLi9pbmRleGVzL2dlbmVyYXRpb25cIjtcblxuLy9cbi8vIGV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4vLyAgIG5hbWU6IFwiY29sbGVjdGlvbk1hcmJsZXNcIjtcbi8vICAgcG9saWN5OiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIHJlcXVpcmVkUGVlckNvdW50OiAwO1xuLy8gICBtYXhQZWVyQ291bnQ6IDM7XG4vLyAgIGJsb2NrVG9MaXZlOiAwO1xuLy8gICBtZW1iZXJPbmx5UmVhZDogdHJ1ZTtcbi8vICAgbWVtYmVyT25seVdyaXRlOiB0cnVlO1xuLy8gICBlbmRvcnNlbWVudFBvbGljeToge1xuLy8gICAgIGlkZW50aXRpZXM6IFtcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcxTVNQXCIgfSB9LFxuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzJNU1BcIiB9IH0sXG4vLyAgICAgXTtcbi8vICAgICBydWxlOiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIH07XG4vLyB9O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNQb2xpY3lJZGVudGl0eSA9IHtcbiAgcm9sZToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtc3BJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5OiB7XG4gICAgaWRlbnRpdGllczogRmFicmljUG9saWN5SWRlbnRpdHlbXTtcbiAgICBydWxlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcml2YXRlQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5Pzoge1xuICAgIHNpZ25hdHVyZVBvbGljeTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3Rpb25Gb3IoXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHBvbGljeTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlcixcbiAgYmxvY2tUb0xpdmU6IG51bWJlcixcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4sXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhblxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHBvbGljeTogcG9saWN5LFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IGAke21zcElkfVByaXZhdGVgLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUignJHttc3BJZH0ubWVtYmVyJylgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcblxuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYE9SKCcke21zcElkfS5wZWVyJylgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gIG1zcElkczogc3RyaW5nW10sXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAxLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219Lm1lbWJlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgQU5EKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219LnBlZXInYCkuam9pbihcIixcIil9KWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBvdmVycmlkZXM6IHtcbiAgICBwcml2YXRlQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICAgIHNoYXJlZENvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgfSA9IHt9LFxuICBtaXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGxldCB7IHByaXZhdGVDb2xzLCBzaGFyZWRDb2xzIH0gPSBNb2RlbC5jb2xsZWN0aW9uc0ZvcihtKTtcblxuICBmdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihhcmc6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgICAgcmV0dXJuIGFyZyhtLCBtc3BJZHNbMF0pIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlQ29scyA9IHByaXZhdGVDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG4gIHNoYXJlZENvbHMgPSBzaGFyZWRDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG5cbiAgY29uc3QgcHJpdmF0ZURlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMCxcbiAgICAgIG1heFBlZXJDb3VudDogMCxcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnByaXZhdGVDb2xzIHx8IHt9XG4gICk7XG4gIGNvbnN0IHNoYXJlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMSxcbiAgICAgIG1heFBlZXJDb3VudDogMixcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnNoYXJlZENvbHMgfHwge31cbiAgKTtcblxuICBjb25zdCBtaXJyb3JNZXRhID0gbWlycm9yID8gTW9kZWwubWlycm9yZWRBdChtKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBwcml2YXRlcyA9IG1zcElkc1xuICAgIC5tYXAoKG1zcElkKSA9PlxuICAgICAgKHByaXZhdGVDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgICByZXR1cm4gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbXNwSWQsXG4gICAgICAgICAgcCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKVxuICAgIC5mbGF0KCk7XG5cbiAgaWYgKG1pcnJvck1ldGEgJiYgbWlycm9yTWV0YS5tc3BJZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgIHR5cGVvZiBtaXJyb3JNZXRhLnJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWlycm9yTWV0YS5yZXNvbHZlclxuICAgICAgICA6IG1pcnJvck1ldGEucmVzb2x2ZXIobSwgbWlycm9yTWV0YS5tc3BJZCk7XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZWQgJiZcbiAgICAgICFwcml2YXRlcy5zb21lKFxuICAgICAgICAocCkgPT4gcC5uYW1lID09PSByZXNvbHZlZCAmJiBwLnBvbGljeS5pbmNsdWRlcyhtaXJyb3JNZXRhLm1zcElkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgIHByaXZhdGVzLnB1c2goXG4gICAgICAgIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1pcnJvck1ldGEubXNwSWQsXG4gICAgICAgICAgcmVzb2x2ZWQsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2hhcmVkID0gKHNoYXJlZENvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgICB9ID0gc2hhcmVkRGVmYXVsdHM7XG4gICAgcmV0dXJuIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gICAgICBtc3BJZHMsXG4gICAgICBwLFxuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlcyxcbiAgICBzaGFyZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25zKFxuICBjb2xzOiBQcml2YXRlQ29sbGVjdGlvbltdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBmaWxlTmFtZSA9IFwiY29sbGVjdGlvbnNfY29uZmlnXCJcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4ocCwgYC4vTUVUQS1JTkYvJHtmaWxlTmFtZX0uanNvbmApKTtcbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGNvbHMsIHVuZGVmaW5lZCwgMikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhcbiAgZG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkb2NzPy5sZW5ndGgpIHJldHVybjtcbiAgd3JpdGVEZXNpZ25Eb2NzKGRvY3MsIHAsIGNvbGxlY3Rpb24pO1xufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBTZXJpYWxpemVkUGFnZSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGlzU2VyaWFsaXplZFBhZ2Uob2JqOiBTZXJpYWxpemVkUGFnZTxhbnk+IHwgYW55KSB7XG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciBleHRlbmRzIFRyYW5zYWN0aW9uTGltaXRzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvci5uYW1lLCA1OTMpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjbGllbnQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgZ2VuZXJpYyBSZXBvc2l0b3J5IHRvIHByZXBhcmUgY29udGV4dCBhbmQgYXJndW1lbnRzIGZvciBDUlVEIG9wZXJhdGlvbnMgZXhlY3V0ZWQgdmlhIGEgRmFicmljIGNsaWVudCBBZGFwdGVyLCB3aXJpbmcgUmVwb3NpdG9yeUZsYWdzIGFuZCBGYWJyaWMtc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+fSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIHVzZWQgdG8gZXhlY3V0ZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgbW9kZWwgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgcmVwb3NpdG9yeVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuICogaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWZhYnJpY1wiO1xuICpcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBNb2RlbCB7IGlkITogc3RyaW5nOyBuYW1lITogc3RyaW5nOyB9XG4gKiBjb25zdCByZXBvID0gbmV3IEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8VXNlcj4oKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlcG8ucmVhZChcIjFcIik7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+UmVwbzogY3JlYXRlUHJlZml4KG1vZGVsLCAuLi5hcmdzKVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIGZsYWdzKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHJlc3VsdFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQSBleHRlbmRzIEZhYnJpY0NsaWVudEFkYXB0ZXIgPSBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgQT4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX292ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN1cGVyW1wiX292ZXJyaWRlc1wiXSwge1xuICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgYWxsb3dSYXdTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzOiB0cnVlLFxuICAgIGZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzOiB0cnVlLFxuICAgIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiBmYWxzZSxcbiAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenosIGZvcmNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBvcmRlcixcbiAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgKSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBsaXN0QnkgcmVzdWx0IHNldCB0b28gbGFyZ2UgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBrZXk9JHtTdHJpbmcoa2V5KX0gb3JkZXI9JHtvcmRlcn0uIFJldHVybmluZyBlbXB0eSBsaXN0LiBVc2UgcGFnaW5hdGVCeSBmb3IgbGFyZ2UgZGF0YXNldHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW10gYXMgTVtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG4gIENPTlRSQUNUID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY29udHJhY3RgLFxuICBDSEFJTkNPREUgPSBgJHtGYWJyaWNNb2RlbEtleXMuRkFCUklDfS5jaGFpbmNvZGVgLFxuICBDSEFOTkVMID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY2hhbm5lbGAsXG4gIE9WRVJSSURFUyA9IGBfX292ZXJyaWRlc2AsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgRmFicmljQ0FTZXJ2aWNlcyBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL21vZGVsL0lkZW50aXR5XCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSHlwZXJsZWRnZXIgRmFicmljIENBIGlkZW50aXR5IHR5cGVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIHJlY29nbml6ZWQgYnkgRmFicmljIENBIGZvciByZWdpc3RyYXRpb24gYW5kIGlkZW50aXR5IG1hbmFnZW1lbnQuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eVR5cGUge1xuICBQRUVSID0gXCJwZWVyXCIsXG4gIE9SREVSRVIgPSBcIm9yZGVyZXJcIixcbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbiAgVVNFUiA9IFwidXNlclwiLFxuICBBRE1JTiA9IFwiYWRtaW5cIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleS92YWx1ZSBhdHRyaWJ1dGUgdXNlZCBkdXJpbmcgQ0EgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZW50cnkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBGYWJyaWMgQ0EgaWRlbnRpdHkgZHVyaW5nIHJlZ2lzdHJhdGlvbiwgb3B0aW9uYWxseSBtYXJraW5nIGl0IGZvciBpbmNsdXNpb24gaW4gZWNlcnQuXG4gKiBAaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlY2VydF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIChFQ2VydCkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlY2VydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIEZhYnJpYyBDQSBpZGVudGl0eSBhdHRyaWJ1dGUga2V5cy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgd2VsbC1rbm93biBGYWJyaWMgQ0EgYXR0cmlidXRlIGtleXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyBmb3IgZGVsZWdhdGlvbnMgYW5kIHBlcm1pc3Npb25zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIHtcbiAgSEZSRUdJU1RSQVJST0xFUyA9IFwiaGYuUmVnaXN0cmFyLlJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSREVMRUdBVEVST0xFUyA9IFwiaGYuUmVnaXN0cmFyLkRlbGVnYXRlUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJBVFRSSUJVVEVTID0gXCJoZi5SZWdpc3RyYXIuQXR0cmlidXRlc1wiLFxuICBIRklOVEVSTUVESUFURUNBID0gXCJoZi5JbnRlcm1lZGlhdGVDQVwiLFxuICBIRlJFVk9LRVIgPSBcImhmLlJldm9rZXJcIixcbiAgSEZBRkZJTElBVElPTk1HUiA9IFwiaGYuQWZmaWxpYXRpb25NZ3JcIixcbiAgSEZHRU5DUkwgPSBcImhmLkdlbkNSTFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIHdyYXBwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0EuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBoaWdoLWxldmVsIG9wZXJhdGlvbnMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYWdhaW5zdCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIGluY2x1ZGluZyByZWdpc3RyYXRpb24sIGVucm9sbG1lbnQsIHJldm9jYXRpb24sIGFuZCBhZG1pbmlzdHJhdGl2ZSBxdWVyaWVzLiBFbmNhcHN1bGF0ZXMgbG93ZXItbGV2ZWwgRmFicmljIENBIGNsaWVudCBjYWxscyB3aXRoIGNvbnNpc3RlbnQgbG9nZ2luZyBhbmQgZXJyb3IgbWFwcGluZy5cbiAqIEBwYXJhbSB7Q0FDb25maWd9IGNhQ29uZmlnIC0gQ29ubmVjdGlvbiBhbmQgVExTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXQgQ0EuXG4gKiBAY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHN2YyA9IG5ldyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vbG9jYWxob3N0OjcwNTQnLFxuICogICBjYU5hbWU6ICdPcmcxQ0EnLFxuICogICB0bHM6IHsgdHJ1c3RlZFJvb3RzOiBbJy9wYXRoL3RvL2NhLnBlbSddLCB2ZXJpZnk6IGZhbHNlIH0sXG4gKiAgIGNhQ2VydDogJy9wYXRoL3RvL2FkbWluL2NlcnREaXInLFxuICogICBjYUtleTogJy9wYXRoL3RvL2FkbWluL2tleURpcidcbiAqIH0pO1xuICogYXdhaXQgc3ZjLnJlZ2lzdGVyKHsgdXNlck5hbWU6ICdhbGljZScsIHBhc3N3b3JkOiAnczNjcjN0JyB9LCBmYWxzZSwgJ29yZzEuZGVwYXJ0bWVudDEnLCBDQV9ST0xFLlVTRVIpO1xuICogY29uc3QgaWQgPSBhd2FpdCBzdmMuZW5yb2xsKCdhbGljZScsICdzM2NyM3QnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgYXV0b251bWJlclxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU3ZjIGFzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiAgIHBhcnRpY2lwYW50IENBIGFzIEZhYnJpYyBDQVxuICogICBBcHAtPj5TdmM6IHJlZ2lzdGVyKGNyZWRlbnRpYWxzLCAuLi4pXG4gKiAgIFN2Yy0+PkNBOiByZWdpc3RlcihyZXF1ZXN0LCBhZG1pblVzZXIpXG4gKiAgIENBLS0+PlN2YzogZW5yb2xsbWVudFNlY3JldFxuICogICBTdmMtLT4+QXBwOiBzZWNyZXRcbiAqICAgQXBwLT4+U3ZjOiBlbnJvbGwoZW5yb2xsbWVudElkLCBzZWNyZXQpXG4gKiAgIFN2Yy0+PkNBOiBlbnJvbGwoe2Vucm9sbG1lbnRJRCwgc2VjcmV0fSlcbiAqICAgQ0EtLT4+U3ZjOiBjZXJ0aWZpY2F0ZXNcbiAqICAgU3ZjLS0+PkFwcDogSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIGNhPzogRmFicmljQ0FTZXJ2aWNlcztcblxuICBwcml2YXRlIGNlcnRpZmljYXRlU2VydmljZT86IGFueTtcblxuICBwcml2YXRlIGFmZmlsaWF0aW9uU2VydmljZT86IEFmZmlsaWF0aW9uU2VydmljZTtcblxuICBwcml2YXRlIGlkZW50aXR5U2VydmljZT86IElkZW50aXR5U2VydmljZTtcblxuICBwcml2YXRlIGNsaWVudD86IGFueTtcblxuICBwcml2YXRlIHVzZXI/OiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FDb25maWc6IENBQ29uZmlnKSB7XG4gICAgQ29yZVV0aWxzLmdldENyeXB0b1N1aXRlKFxuICAgICAgY2FDb25maWcuaHNtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc29mdHdhcmU6IGZhbHNlLFxuICAgICAgICAgICAgbGliOiBjYUNvbmZpZy5oc20ubGlicmFyeSxcbiAgICAgICAgICAgIHNsb3Q6IGNhQ29uZmlnLmhzbS5zbG90LFxuICAgICAgICAgICAgbGFiZWw6IGNhQ29uZmlnLmhzbS50b2tlbkxhYmVsLFxuICAgICAgICAgICAgcGluOiBTdHJpbmcoY2FDb25maWcuaHNtLnBpbiksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIGlmICh0aGlzLnVzZXIpIHJldHVybiB0aGlzLnVzZXI7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSB0aGlzLmNhQ29uZmlnO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLlVzZXIpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy51c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ0EoKTogUHJvbWlzZTxGYWJyaWNDQVNlcnZpY2VzPiB7XG4gICAgaWYgKHRoaXMuY2EpIHJldHVybiB0aGlzLmNhO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLkNBKTtcbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IHRoaXMuY2FDb25maWc7XG5cbiAgICAvLyBGT1IgU29tZSBSZWFzb24gdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgd29ya3MgZm9yIG5vd1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSBDbGllbnQgZm9yIENBICR7Y2FOYW1lfSB1bmRlciAke3VybH1gKTtcbiAgICB0aGlzLmNhID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENsaWVudCgpOiBQcm9taXNlPHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfT4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuIHRoaXMuY2xpZW50O1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIHRoaXMuY2xpZW50ID0gKGNhIGFzIGFueSlbXCJfRmFicmljQ0FTZXJ2aWNlc1wiXTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2VydGlmaWNhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNlcnRpZmljYXRlU2VydmljZSlcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ2xpZW50KCkpLm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmNlcnRpZmljYXRlU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBBZmZpbGlhdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmFmZmlsaWF0aW9uU2VydmljZSlcbiAgICAgIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIElkZW50aXRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmlkZW50aXR5U2VydmljZSlcbiAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBDQSBjZXJ0aWZpY2F0ZSBzZXJ2aWNlIHRvIGxpc3QgY2VydGlmaWNhdGVzLCBvcHRpb25hbGx5IG1hcHBpbmcgdG8gUEVNIHN0cmluZ3Mgb25seS5cbiAgICogQHBhcmFtIHtHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0fSBbcmVxdWVzdF0gLSBPcHRpb25hbCBmaWx0ZXIgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGUgbG9va3VwLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb01hcD10cnVlXSAtIFdoZW4gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBQRU0gc3RyaW5nczsgb3RoZXJ3aXNlIHJldHVybnMgZnVsbCByZXNwb25zZSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPn0gQXJyYXkgb2YgUEVNIHN0cmluZ3Mgb3IgdGhlIGZ1bGwgY2VydGlmaWNhdGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXAgPSB0cnVlXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGVTZXJ2aWNlID0gYXdhaXQgdGhpcy5DZXJ0aWZpY2F0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDZXJ0aWZpY2F0ZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBjZXJ0aWZpY2F0ZVNlcnZpY2UuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3QgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgaWRlbnRpdHkgc2VydmljZSB0byBmZXRjaCBhbGwgaWRlbnRpdGllcyBhbmQgcmV0dXJucyB0aGUgbGlzdCBhcyBGYWJyaWNJZGVudGl0eSBvYmplY3RzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+fSBUaGUgbGlzdCBvZiBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcygpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBpZGVudGl0aWVzU2VydmljZSA9IGF3YWl0IHRoaXMuSWRlbnRpdGllcygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBpZGVudGl0aWVzU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoKSB7XG4gICAgY29uc3QgYWZmaWxpYXRpb25TZXJ2aWNlID0gYXdhaXQgdGhpcy5BZmZpbGlhdGlvbnMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBhZmZpbGlhdGlvblNlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5uZXdJZGVudGl0eVNlcnZpY2UoKS5nZXRPbmUoZW5yb2xsbWVudElkLCB1c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVnaXN0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IGNhLnJlZ2lzdGVyKHByb3BzLCB1c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmdcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLCB7fSkuZm9yKFxuICAgICAgdGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50XG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICB1cGRhdGVkT246IG5vdyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKGVucm9sbG1lbnRJZDogc3RyaW5nLCByZWdpc3RyYXRpb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZW5yb2xsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IGNhLmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljRW5yb2xsbWVudFNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jYUNvbmZpZy5jYU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHNcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLnJldm9rZShcbiAgICAgICAgeyBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLCByZWFzb246IFwiVXNlciBEZWxldGF0aW9uXCIgfSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0LCBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgbWluLFxuICBtaW5sZW5ndGgsXG4gIE1vZGVsLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciBleHRlbmRzIE1vZGVsIHtcbiAgQHJlcXVpcmVkKClcbiAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCI7XG4gIEBtaW5sZW5ndGgoMSlcbiAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXTtcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudElEITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50U2VjcmV0ITogc3RyaW5nO1xuICBAbWluKDApXG4gIG1heEVucm9sbG1lbnRzPzogbnVtYmVyO1xuICBAcmVxdWlyZWQoKVxuICByb2xlITogc3RyaW5nO1xuXG4gIGJ1aWxkKCk6IElSZWdpc3RlclJlcXVlc3Qge1xuICAgIGNvbnN0IGVycnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElSZWdpc3RlclJlcXVlc3QgPSB7XG4gICAgICBlbnJvbGxtZW50SUQ6IHRoaXMuZW5yb2xsbWVudElELFxuICAgICAgZW5yb2xsbWVudFNlY3JldDogdGhpcy5lbnJvbGxtZW50U2VjcmV0LFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgYWZmaWxpYXRpb246IHRoaXMuYWZmaWxpYXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWF4RW5yb2xsbWVudHMgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXNwb25zZS5tYXhFbnJvbGxtZW50cyA9IHRoaXMubWF4RW5yb2xsbWVudHM7XG4gICAgaWYgKHRoaXMuYXR0cnMpIHJlc3BvbnNlLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBzZXRBZmZpbGlhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZmZpbGlhdGlvbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQXR0cihhdHRyOiBJS2V5VmFsdWVBdHRyaWJ1dGUpIHtcbiAgICB0aGlzLmF0dHJzID0gdGhpcy5hdHRycyB8fCBbXTtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0cik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdHRycyh2YWx1ZTogSUtleVZhbHVlQXR0cmlidXRlW10pIHtcbiAgICB0aGlzLmF0dHJzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50SUQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudElEID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRTZWNyZXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVucm9sbG1lbnRzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSb2xlKHZhbHVlOiBDQV9ST0xFIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5yb2xlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlTWV0YWRhdGEsXG4gIENvbGxlY3Rpb25SZXNvbHZlcixcbiAgTWlycm9yTWV0YWRhdGEsXG59IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBDb250ZXh0dWFsQXJncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzU2hhcmVkKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzUHJpdmF0ZSh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgcmV0dXJuIE1vZGVsLnNlZ3JlZ2F0ZSh0aGlzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgaWYgKCFNb2RlbC5pc1RyYW5zaWVudChtb2RlbCkpIHJldHVybiB7IG1vZGVsOiBtb2RlbCB9O1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID1cbiAgICBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgfHwgW107XG5cbiAgY29uc3QgdHJhbnNpZW50UHJvcHMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIERCS2V5cy5UUkFOU0lFTlRcbiAgKTtcbiAgY29uc3QgcHJpdmF0ZVByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG4gIGNvbnN0IHNoYXJlZFByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcblxuICBjb25zdCByZXN1bHQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IHtcbiAgICBtb2RlbDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHVibGljOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICB0cmFuc2llbnQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHByaXZhdGVzOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBzaGFyZWQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICB9O1xuXG4gIGNvbnN0IHRyYW5zaWVudEtleXMgPSBPYmplY3Qua2V5cyh0cmFuc2llbnRQcm9wcyB8fCB7fSk7XG4gIGNvbnN0IHByaXZhdGVLZXlzID0gT2JqZWN0LmtleXMocHJpdmF0ZVByb3BlcnRpZXMgfHwge30pO1xuICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkUHJvcGVydGllcyB8fCB7fSk7XG5cbiAgLy8gY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMga2V5b2YgTV07XG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSB0cmFuc2llbnRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNQdWJsaWMgPSAhaXNUcmFuc2llbnQ7XG4gICAgY29uc3QgaXNQcml2YXRlID0gcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1NoYXJlZCA9IHNoYXJlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAvLyBjb25zdCBpc1ByaW1hcnlLZXkgPSBrZXkgPT09IHBrS2V5O1xuXG4gICAgaWYgKGlzVHJhbnNpZW50IHx8IGlzUHJpdmF0ZSB8fCBpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnRyYW5zaWVudCA9IHJlc3VsdC50cmFuc2llbnQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnRyYW5zaWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgcmVzdWx0LnByaXZhdGVzID0gcmVzdWx0LnByaXZhdGVzIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5wcml2YXRlcyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQuc2hhcmVkID0gcmVzdWx0LnNoYXJlZCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQuc2hhcmVkIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIHJlc3VsdC5wdWJsaWMgPSAocmVzdWx0LnB1YmxpYyB8fCB7fSkgYXMgYW55O1xuICAgICAgKHJlc3VsdC5wdWJsaWMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0Lm1vZGVsID0gTW9kZWwuYnVpbGQocmVzdWx0LnB1YmxpYywgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgU2VncmVnYXRlZE1vZGVsPE0+O1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkID0gZnVuY3Rpb24gbWlycm9yZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkub3duZXJPZiA9IGZ1bmN0aW9uIG93bmVyT2Y8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vZGVsW21ldGEgYXMga2V5b2YgTV0gYXMgc3RyaW5nO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWRBdCA9IGZ1bmN0aW9uIG1pcnJvcmVkQXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogTWlycm9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBtb2RlbCA9IHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jb2xsZWN0aW9uc0ZvciA9IGZ1bmN0aW9uIGNvbGxlY3Rpb25zRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHtcbiAgcHJpdmF0ZUNvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG4gIHNoYXJlZENvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG59IHtcbiAgY29uc3QgcHJpdmF0ZUtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5QUklWQVRFXSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hhcmVkS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlNIQVJFRF0gYXMgc3RyaW5nW107XG5cbiAgY29uc3QgcHJpdmF0ZUtleSA9IE1ldGFkYXRhLmtleSguLi5wcml2YXRlS2V5cyk7XG4gIGNvbnN0IHNoYXJlZEtleSA9IE1ldGFkYXRhLmtleSguLi5zaGFyZWRLZXlzKTtcblxuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgY29uc3QgcHJpdmF0ZU1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBwcml2YXRlS2V5XG4gICk7XG4gIGNvbnN0IHNoYXJlZE1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBzaGFyZWRLZXlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVDb2xzOiBwcml2YXRlTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gICAgc2hhcmVkQ29sczogc2hhcmVkTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gIH07XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jaGFpbmNvZGVPZiA9IGZ1bmN0aW9uIGNoYWluY29kZU9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREVcbiAgKTtcbiAgaWYgKCFtIHx8ICFtLnJlc29sdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG0ucmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBtLnJlc29sdmVyO1xuICBjb25zdCBjdHggPSBhcmdzLnBvcCgpO1xuICBpZiAoIWN0eCB8fCAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjb250ZXh0IHByb3ZpZGVkIGZvciBjaGFpbmNvZGUgcmVzb2x1dGlvbmApO1xuICByZXR1cm4gbS5yZXNvbHZlcihtb2RlbCwgLi4uYXJncywgY3R4KTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbnRyYWN0T2YgPSBmdW5jdGlvbiBjb250cmFjdE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVFxuICApO1xuICBpZiAoIW0gfHwgIW0ucmVzb2x2ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG0ucmVzb2x2ZXI7XG4gIGNvbnN0IGN0eCA9IGFyZ3MucG9wKCk7XG4gIGlmICghY3R4IHx8ICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNvbnRleHQgcHJvdmlkZWQgZm9yIGNoYWluY29kZSByZXNvbHV0aW9uYCk7XG4gIHJldHVybiBtLnJlc29sdmVyKG1vZGVsLCAuLi5hcmdzLCBjdHgpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY2hhbm5lbE9mID0gZnVuY3Rpb24gY2hhbm5lbE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFOTkVMXG4gICk7XG4gIGlmICghbSB8fCAhbS5yZXNvbHZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtLnJlc29sdmVyID09PSBcInN0cmluZ1wiKSByZXR1cm4gbS5yZXNvbHZlcjtcbiAgY29uc3QgY3R4ID0gYXJncy5wb3AoKTtcbiAgaWYgKCFjdHggfHwgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY29udGV4dCBwcm92aWRlZCBmb3IgY2hhaW5jb2RlIHJlc29sdXRpb25gKTtcbiAgcmV0dXJuIG0ucmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MsIGN0eCk7XG59LmJpbmQoTW9kZWwpO1xuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVyRnVuY3Rpb248VD4gPSAoXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiBQcm9taXNlPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250cmFjdFJlc29sdmVyID0gKFxuICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiB7XG4gIHJldHVybiBtb2RlbC5uYW1lICsgXCJDb250cmFjdFwiO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhaW5jb2RlTWV0YWRhdGEgPSB7XG4gIHJlc29sdmVyOiBzdHJpbmcgfCBSZXNvbHZlckZ1bmN0aW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udHJhY3QocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVCwgbWV0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbmNvZGUocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREUsIG1ldGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbChyZXNvbHZlcjogYW55KSB7XG4gIGNvbnN0IG1ldGE6IENoYWluY29kZU1ldGFkYXRhID0geyByZXNvbHZlciB9O1xuICByZXR1cm4gbWV0YWRhdGEoRmFicmljTW9kZWxLZXlzLkNIQU5ORUwsIG1ldGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcblxuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHxcbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIGFsbG93Q29udGV4dFRyYW5zaWVudE1hcDogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcblxuICBsZXQgaztcbiAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgLy8gd2ViIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vZGUgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgICBjb25zdCB7IGNyZWF0ZVByaXZhdGVLZXkgfSA9IGF3YWl0IGltcG9ydChcImNyeXB0b1wiKTtcbiAgICBrID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgfVxuXG4gIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyBhIHByaXZhdGUga2V5IGZyb20gYSBQRU0gYnVmZmVyXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5IHRvIGEgQ3J5cHRvS2V5IG9iamVjdFxuICogQHBhcmFtIHtCdWZmZXJ9IHBlbSAtIFRoZSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxDcnlwdG9LZXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ3J5cHRvS2V5XG4gKiBAZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEV4dHJhY3RQcml2YXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IFN1YnRsZUNyeXB0b1xuICpcbiAqICAgQ2FsbGVyLT4+RXh0cmFjdFByaXZhdGVLZXk6IGV4dHJhY3RQcml2YXRlS2V5KHBlbSlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogR2V0IFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvblxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBQYXJzZSBQRU0gZm9ybWF0XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IENvbnZlcnQgdG8gYmluYXJ5IERFUlxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PlN1YnRsZUNyeXB0bzogaW1wb3J0S2V5KHBrY3M4LCBiaW5hcnlEZXIsIG9wdGlvbnMpXG4gKiAgIFN1YnRsZUNyeXB0by0tPj5FeHRyYWN0UHJpdmF0ZUtleTogQ3J5cHRvS2V5XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LS0+PkNhbGxlcjogQ3J5cHRvS2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleShwZW06IEJ1ZmZlcikge1xuICAvLyBjb25zdCBsaWJOYW1lID0gXCJub2RlOmNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICAvLyBpZiAoaXNCcm93c2VyKCkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIC8vIH0gZWxzZSB7XG4gIC8vICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gIC8vICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgLy8gfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IENMSUVOVF9PVkVSUklERV9LRVlTOiAoa2V5b2YgRmFicmljQ2xpZW50RmxhZ3MpW10gPSBbXG4gIFwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGVcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhYnJpYyBjbGllbnQgY29udGV4dCB3aXRoIGEgY29uc3RyYWluZWQgb3ZlcnJpZGUgc3VyZmFjZVxuICogQHN1bW1hcnkgUmVzdHJpY3RzIHdoaWNoIGNhY2hlZCB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQgdG8gY2hpbGQgY29udGV4dHMgb3Igc2VudFxuICogYmFjayBhcyBvdmVycmlkZXMgc28gb25seSBpbnRlbnRpb25hbCBjbGllbnQgZmxhZ3MgYXJlIGZvcndhcmRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudENvbnRleHQgZXh0ZW5kcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gIGNvbnN0cnVjdG9yKGN0eD86IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KSB7XG4gICAgc3VwZXIoY3R4KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvT3ZlcnJpZGVzKCk6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBvdmVycmlkZXM6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ0xJRU5UX09WRVJSSURFX0tFWVMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPclVuZGVmaW5lZChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBvdmVycmlkZXNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3ZlcnJpZGVzO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudENvbnRleHRcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICBDb3VjaERCT3BlcmF0b3IsXG4gIENvdWNoREJHcm91cE9wZXJhdG9yLFxuICBDb3VjaERCUXVlcnlMaW1pdCxcbiAgTWFuZ29RdWVyeSxcbiAgTWFuZ29PcGVyYXRvcixcbiAgTWFuZ29TZWxlY3RvcixcbiAgdHJhbnNsYXRlT3BlcmF0b3JzLFxuICBnZW5lcmF0ZURlc2lnbkRvY05hbWUsXG4gIGdlbmVyYXRlVmlld05hbWUsXG4gIGZpbmRWaWV3TWV0YWRhdGEsXG4gIENvdWNoREJWaWV3TWV0YWRhdGEsXG4gIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgdG9DYW1lbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxudHlwZSBGYWJyaWNWaWV3RGVzY3JpcHRvciA9IHtcbiAgZGRvYzogc3RyaW5nO1xuICB2aWV3OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG50eXBlIEZhYnJpY0FnZ3JlZ2F0ZUluZm8gPVxuICB8IHtcbiAgICAgIGtpbmQ6IFZpZXdLaW5kO1xuICAgICAgbWV0YTogQ291Y2hEQlZpZXdNZXRhZGF0YTtcbiAgICAgIGRlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREaXN0aW5jdD86IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiYXZnXCI7XG4gICAgICBhdHRyaWJ1dGU6IHN0cmluZztcbiAgICAgIHN1bURlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICB9O1xuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5cbmZ1bmN0aW9uIG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcXHUwMDAwXCI7XG4gIGNvbnN0IGNoYXJzID0gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gIGZvciAobGV0IGkgPSBjaGFycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyc1tpXS5jb2RlUG9pbnRBdCgwKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAoY29kZSA8IDB4MTBmZmZmKSB7XG4gICAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUgKyAxKTtcbiAgICAgIHJldHVybiBjaGFycy5zbGljZSgwLCBpICsgMSkuam9pbihcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3ZhbHVlfVxcdTAwMDBgO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhSYW5nZShwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBwcmVmaXgsXG4gICAgZW5kOiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyhwcmVmaXgpLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50U3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIE0sXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gIFIsXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLCBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNxdWFzaChcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmZyb21TZWxlY3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBjb25zdCB7IG1ldGhvZCwgYXJncyB9ID0gdGhpcy5wcmVwYXJlZCBhcyBQcmVwYXJlZFN0YXRlbWVudDxhbnk+O1xuICAgIHJldHVybiByZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmFyZ3MsIC4uLmFyZ3opO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcHJlcGFyZShcbiAgICBjdHg/OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8U3RhdGVtZW50RXhlY3V0b3I8TSwgUj4+IHtcbiAgICBjdHggPVxuICAgICAgY3R4IHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFBlcnNpc3RlbmNlS2V5cy5RVUVSWSxcbiAgICAgICAgdGhpcy5vdmVycmlkZXMgfHwge30sXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApKTtcblxuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIGNvbnRleHQgYXZhaWxhYmxlIGZvciBzdGF0ZW1lbnRcIik7XG5cbiAgICBpZiAodGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiYgY3R4LmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIikpIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IE0ge1xuICAgIGNvbnN0IHBrQXR0ciA9IE1vZGVsLnBrKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLklELCBwa0F0dHIgYXMgc3RyaW5nKVxuICAgICk/LnR5cGU7XG5cbiAgICBpZiAocmVjb3JkW0NvdWNoREJLZXlzLklEXSkge1xuICAgICAgY29uc3QgWywgLi4ua2V5QXJnc10gPSByZWNvcmRbQ291Y2hEQktleXMuSURdLnNwbGl0KENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG4gICAgICBjb25zdCBpZCA9IGtleUFyZ3Muam9pbihcIl9cIik7XG4gICAgICByZWNvcmRbcGtBdHRyXSA9IFNlcXVlbmNlLnBhcnNlVmFsdWUodHlwZSBhcyBhbnksIGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1JlY29yZChyZWNvcmQsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IFNlbmRzIGEgcmF3IE1hbmdvIHF1ZXJ5IHRvIEZhYnJpYyBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCBhZ2dyZWdhdG9yID0gKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZUluZm87XG4gICAgaWYgKChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGUgJiYgYWdncmVnYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihhZ2dyZWdhdG9yLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICByYXdJbnB1dCxcbiAgICAgIHRydWUsXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IHJlc3VsdHMubWFwKChyKSA9PiB0aGlzLnByb2Nlc3NSZWNvcmQociwgY3R4KSk7XG4gICAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkIGFzIHVua25vd24gYXMgUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdChwcm9jZXNzZWQsIGN0eCkpIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIENvdWNoREIgTWFuZ28gcXVlcnkgZnJvbSB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGFuZCBvcHRpb25zIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVF1ZXJ5ID0gdGhpcy5idWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk7XG4gICAgaWYgKGFnZ3JlZ2F0ZVF1ZXJ5KSByZXR1cm4gYWdncmVnYXRlUXVlcnk7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgQSAke2tleX0gcXVlcnkgcGFyYW0gaXMgYWJvdXQgdG8gYmUgb3ZlcnJpZGRlbjogJHtxdWVyeS5zZWxlY3RvcltrZXldfSBieSAke3ZhbH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW2tleV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgcXVlcnkuc29ydCA9IHF1ZXJ5LnNvcnQgfHwgW107XG4gICAgICBxdWVyeS5zZWxlY3RvciA9IHF1ZXJ5LnNlbGVjdG9yIHx8ICh7fSBhcyBNYW5nb1NlbGVjdG9yKTtcbiAgICAgIGZvciAoY29uc3QgW3NlbGVjdG9yS2V5LCBkaXJlY3Rpb25dIG9mIHRoaXMub3JkZXJCeVNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yS2V5IGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj4gPSB7fTtcbiAgICAgICAgcmVjW3NlbGVjdG9yXSA9IGRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbjtcbiAgICAgICAgKHF1ZXJ5LnNvcnQgYXMgUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+W10pLnB1c2gocmVjKTtcbiAgICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAgIChxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl0gPVxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgY291Y2hkYiBsaW1pdCBvZiAke0NvdWNoREJRdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxdWVyeS5saW1pdCA9IENvdWNoREJRdWVyeUxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKSBxdWVyeS5za2lwID0gdGhpcy5vZmZzZXRTZWxlY3RvcjtcblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvciBzdHJ1Y3R1cmVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLlNUQVJUU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCByYW5nZSA9IHByZWZpeFJhbmdlKGNvbXBhcmlzb24pO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl9FUV0gPSByYW5nZS5zdGFydDtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLlNNQUxMRVJdID0gcmFuZ2UuZW5kO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkVORFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7XG4gICAgICAgIFtDb3VjaERCT3BlcmF0b3IuUkVHRVhQXTogYCR7ZXNjYXBlUmVnRXhwKGNvbXBhcmlzb24pfSRgLFxuICAgICAgfSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkJFVFdFRU4pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyMSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcGFyaXNvbikgfHwgY29tcGFyaXNvbi5sZW5ndGggIT09IDIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQkVUV0VFTiBvcGVyYXRvciByZXF1aXJlcyBbbWluLCBtYXhdIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gY29tcGFyaXNvbjtcbiAgICAgIGNvbnN0IG9wQmV0d2VlbjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcEJldHdlZW5bYXR0cl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLkJJR0dFUl9FUSlcbiAgICAgIF0gPSBtaW47XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuU01BTExFUl9FUSlcbiAgICAgIF0gPSBtYXg7XG4gICAgICByZXR1cm4geyBzZWxlY3Rvcjogb3BCZXR3ZWVuIH07XG4gICAgfVxuXG4gICAgbGV0IG9wOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIG9wW2F0dHIxIGFzIHN0cmluZ10gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW2F0dHIxIGFzIHN0cmluZ10gYXMgTWFuZ29TZWxlY3RvcilbdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKV0gPVxuICAgICAgICBjb21wYXJpc29uO1xuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgb3AgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3IgYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAoYXR0cjEgYXMgdW5rbm93biBhcyB7IGF0dHIxOiBzdHJpbmcgfSkuYXR0cjFcbiAgICAgIF0gPSBjb21wYXJpc29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcDE6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IG9wMjogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihjb21wYXJpc29uIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBvcCA9IG1lcmdlKHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvciksIG9wMSwgb3AyKS5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZWxlY3Rvcjogb3AgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBpZiBhZ2dyZWdhdGlvbiBpcyByZXF1ZXN0ZWRcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGZvciBhZ2dyZWdhdGUgb3BlcmF0aW9ucyBhbmQgcmV0dXJucyBhIHNwZWNpYWwgTWFuZ29RdWVyeSBmb3IgdGhlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk6IE1hbmdvUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYXZnU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IFN0cmluZyh0aGlzLmF2Z1NlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHN1bUluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJzdW1cIiwgYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGNvdW50SW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImNvdW50XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoIXN1bUluZm8gfHwgIWNvdW50SW5mbylcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgYEF2ZyBvcGVyYXRpb24gcmVxdWlyZXMgc3VtIGFuZCBjb3VudCB2aWV3cyBmb3IgYXR0cmlidXRlICR7YXR0cmlidXRlfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KHtcbiAgICAgICAga2luZDogXCJhdmdcIixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBzdW1EZXNjcmlwdG9yOiBzdW1JbmZvLmRlc2NyaXB0b3IsXG4gICAgICAgIGNvdW50RGVzY3JpcHRvcjogY291bnRJbmZvLmRlc2NyaXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPVxuICAgICAgICB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciA9PSBudWxsXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFN0cmluZyh0aGlzLmNvdW50RGlzdGluY3RTZWxlY3Rvcik7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiZGlzdGluY3RcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGluZm8uY291bnREaXN0aW5jdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JVc2VkID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgISF0aGlzLm1pblNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMubWF4U2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5zdW1TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLmRpc3RpbmN0U2VsZWN0b3I7XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yQ2hlY2tzOiBBcnJheTxbVmlld0tpbmQsIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbXG4gICAgICAgIFwiY291bnRcIixcbiAgICAgICAgKHRoaXMuY291bnRTZWxlY3RvciA/PyB1bmRlZmluZWQpIGFzIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgICAgXSxcbiAgICAgIFtcIm1heFwiLCB0aGlzLm1heFNlbGVjdG9yXSxcbiAgICAgIFtcIm1pblwiLCB0aGlzLm1pblNlbGVjdG9yXSxcbiAgICAgIFtcInN1bVwiLCB0aGlzLnN1bVNlbGVjdG9yXSxcbiAgICAgIFtcImRpc3RpbmN0XCIsIHRoaXMuZGlzdGluY3RTZWxlY3Rvcl0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgW2tpbmQsIHNlbGVjdG9yXSBvZiBhZ2dyZWdhdG9yQ2hlY2tzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzZWxlY3RvciA/IFN0cmluZyhzZWxlY3RvcikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0b3JVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgYE5vIENvdWNoREIgdmlldyBtZXRhZGF0YSBmb3VuZCBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoXG4gICAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICAgKX0gYWdncmVnYXRvcmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gYWdncmVnYXRlIGRlc2NyaXB0b3IgZm9yIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFxuICAgIGtpbmQ6IFZpZXdLaW5kLFxuICAgIGF0dHJpYnV0ZT86IHN0cmluZ1xuICApOiBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YXMgPSBmaW5kVmlld01ldGFkYXRhKHRoaXMuZnJvbVNlbGVjdG9yLCBraW5kLCBhdHRyaWJ1dGUpO1xuICAgIGlmICghbWV0YXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1swXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHZpZXdOYW1lID0gZ2VuZXJhdGVWaWV3TmFtZSh0YWJsZU5hbWUsIG1ldGEuYXR0cmlidXRlLCBraW5kLCBtZXRhKTtcbiAgICBjb25zdCBkZG9jID0gbWV0YS5kZG9jIHx8IGdlbmVyYXRlRGVzaWduRG9jTmFtZSh0YWJsZU5hbWUsIHZpZXdOYW1lKTtcbiAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgcmVkdWNlOiBtZXRhLnJlZHVjZSAhPT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICFtZXRhLnJldHVybkRvY3MsXG4gICAgfTtcbiAgICBpZiAoa2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IGtpbmQgPT09IFwiZ3JvdXBCeVwiKSBvcHRpb25zLmdyb3VwID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZCxcbiAgICAgIG1ldGEsXG4gICAgICBkZXNjcmlwdG9yOiB7XG4gICAgICAgIGRkb2MsXG4gICAgICAgIHZpZXc6IHZpZXdOYW1lLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBzcGVjaWFsIGFnZ3JlZ2F0ZSBNYW5nb1F1ZXJ5IG1hcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVRdWVyeShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHt9LFxuICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgYWdncmVnYXRlSW5mbzogaW5mbyxcbiAgICB9IGFzIE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGNhc3QgdG8gRmFicmljQ2xpZW50QWRhcHRlciBmb3IgdmlldyBhY2Nlc3NcbiAgICovXG4gIHByaXZhdGUgZ2V0RmFicmljQWRhcHRlcigpOiBGYWJyaWNDbGllbnRBZGFwdGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSB2aWEgYWRhcHRlcidzIHZpZXcgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVBZ2dyZWdhdGU8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKCF0aGlzLmlzVmlld0FnZ3JlZ2F0ZShpbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXZlcmFnZTxSPihpbmZvLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5kZG9jLFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci52aWV3LFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5vcHRpb25zLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmlld1Jlc3BvbnNlPFI+KGluZm8sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhdmVyYWdlIGNhbGN1bGF0aW9uIGZyb20gc3VtIGFuZCBjb3VudCB2aWV3c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBdmVyYWdlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciwgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudENvbnRleHQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yLFxuICBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcixcbn0gZnJvbSBcIi4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi9jcnlwdG9cIjtcbmltcG9ydCB7IGV4dHJhY3RJZHMgfSBmcm9tIFwiLi9pZHMvaWQtZXh0cmFjdGlvblwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbnRyYWN0UmVzb2x2ZXIsIElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgRmFicmljQ2xpZW50Q29udGV4dFxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIHRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBVaW50OEFycmF5IHRvIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplciA9IG5ldyBDbGllbnRTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBsb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNDbGllbnRBZGFwdGVyKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXplcjxhbnk+ID1cbiAgICBGYWJyaWNDbGllbnRBZGFwdGVyLnNlcmlhbGl6ZXI7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBDb250ZXh0KCk6IENvbnN0cnVjdG9yPEZhYnJpY0NsaWVudENvbnRleHQ+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50Q29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGFpbmNvZGVGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmNoYWluY29kZUZvcihtb2RlbCwgdGhpcy5jb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYW5uZWxGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmNoYW5uZWxGb3IobW9kZWwsIHRoaXMuY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb250cmFjdEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuY29udHJhY3RGb3IobW9kZWwsIHRoaXMuY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPEZhYnJpY0NsaWVudENvbnRleHQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICAgPixcbiAgPigpOiBDb25zdHJ1Y3RvcjxSPiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSPjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBbXG4gICAgQ29uc3RydWN0b3I8TT4sXG4gICAgUHJpbWFyeUtleVR5cGUsXG4gICAgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hbnlbXSxcbiAgICBGYWJyaWNDbGllbnRDb250ZXh0LFxuICBdIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlUHJlZml4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgcmVjb3JkcyBmb3IgY3JlYXRpb25cbiAgICogQHN1bW1hcnkgQWRkcyBuZWNlc3NhcnkgQ291Y2hEQiBmaWVsZHMgdG8gbXVsdGlwbGUgcmVjb3JkcyBiZWZvcmUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgSURzIG9mIHRoZSByZWNvcmRzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHByZXBhcmVcbiAgICogQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHRhYmxlTmFtZSwgaWRzLCBhbmQgcHJlcGFyZWQgcmVjb3Jkc1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBpZHMgYW5kIG1vZGVscyBhcnJheXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Roc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICAvL0hFUkUhXG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy5jcmVhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cuaW5mbyhgYWRkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZE1vZGVscyA9IG1vZGVscy5tYXAoKG0pID0+XG4gICAgICB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkTW9kZWxzKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuXG4gICAgbGV0IHJlczogUmVjb3JkPHN0cmluZywgYW55PltdO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBjdHgsXG4gICAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICAgIHJlc1swXVtNb2RlbC5wayhjbGF6eikgYXMgc3RyaW5nXSB8fCBpZHNbMF1cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudD8uW2ldIHx8IHt9KSxcbiAgICAgICAgICAgICAgcmVzW2ldXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLnVwZGF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxzID0gbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRNb2RlbHMpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWRzWzBdKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50Py5baV0gfHwge30pLFxuICAgICAgICAgICAgICByZXNbaV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRzWzBdXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkQWxsKGNsYXp6LCBpZHMsIC4uLmN0eEFyZ3MpO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBkZWxldGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiAmIFByZXBhcmVkTW9kZWwge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQgPSBNb2RlbC5zZWdyZWdhdGUobW9kZWwpO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGxpdC5tb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChtb2RlbCk7XG4gICAgaWYgKG1pcnJvck1ldGEpIHtcbiAgICAgIGNvbnN0IG1pcnJvck1zcCA9IG1pcnJvck1ldGEubXNwSWQ7XG4gICAgICBpZiAoIW1pcnJvck1zcCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIG1pcnJvciBNU1AgY291bGQgYmUgZm91bmRgKTtcbiAgICAgIGxldCBtc3BzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgICBtc3BzID0gQXJyYXkuaXNBcnJheShtc3BzKSA/IG1zcHMgOiBbbXNwc107XG4gICAgICBjb25zdCBtZXJnZWQgPSBbLi4ubmV3IFNldChbLi4ubXNwcywgbWlycm9yTXNwXSldO1xuICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICBlbmRvcnNpbmdPcmdzOiBtZXJnZWQsXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IG1lcmdlZCxcbiAgICAgICAgbGVnYWN5OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogc3BsaXQubW9kZWwsXG4gICAgICBtb2RlbDogc3BsaXQubW9kZWwsXG4gICAgICBpZDogbW9kZWxbTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICAgIHByaXZhdGVzOiBzcGxpdC5wcml2YXRlcyxcbiAgICAgIHNoYXJlZDogc3BsaXQuc2hhcmVkLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2llbnQgJiZcbiAgICAgIHRoaXMuc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdHlwZW9mIHYgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIC5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKGtleSBpbiBvYmogJiYgKG9iaiBhcyBhbnkpW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgb3ZlcndyaXRpbmcgZXhpc3RpbmcgJHtrZXl9LiBpZiB0aGlzIGlzIG5vdCBhIGRlZmF1bHQgdmFsdWUsIHRoaXMgbWF5IHBvc2UgYSBwcm9ibGVtYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPikob2JqKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9wZXJhdGlvbikgcmV0dXJuIG9wZXJhdGlvbjtcbiAgICBpZiAodHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJvcGVyYXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hBZnRlcldyaXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBoYXNUcmFuc2llbnQ6IGJvb2xlYW4sXG4gICAgaWQ/OiBQcmltYXJ5S2V5VHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWhhc1RyYW5zaWVudCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBnZW5lcmF0ZWQgPSBNb2RlbC5nZW5lcmF0ZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBoYXNJZCA9IGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGw7XG4gICAgaWYgKCFoYXNJZCAmJiBjb21wb3NlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFoYXNJZCAmJiBnZW5lcmF0ZWQpIHtcbiAgICAgIGN0eC5sb2dnZXIud2FybihcbiAgICAgICAgYENhbm5vdCByZWZyZXNoIHJlY29yZCB3aXRoIHByaXZhdGUgZ2VuZXJhdGVkIHByaW1hcnkga2V5YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0lkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RUcmFuc2llbnRPdmVycmlkZXMoXG4gICAgdHJhbnNpZW50RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50RGF0YSA9IHRoaXMuaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEodHJhbnNpZW50RGF0YSk7XG4gICAgY29uc3Qgc2hvdWxkSW5qZWN0ID0gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0NvbnRleHRUcmFuc2llbnRNYXBcIik7XG4gICAgaWYgKCFoYXNUcmFuc2llbnREYXRhICYmICFzaG91bGRJbmplY3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gY3R4LnRvT3ZlcnJpZGVzKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9IGhhc1RyYW5zaWVudERhdGEgPyBPYmplY3QuYXNzaWduKHt9LCB0cmFuc2llbnREYXRhKSA6IHt9O1xuICAgIGlmIChzaG91bGRJbmplY3QgJiYgT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGgpIHtcbiAgICAgIHBheWxvYWRbRmFicmljTW9kZWxLZXlzLk9WRVJSSURFU10gPSBvdmVycmlkZXM7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwYXlsb2FkKS5sZW5ndGggPyBwYXlsb2FkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIHZhbHVlLnNvbWUoKGl0ZW0pID0+IHRoaXMuaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEoaXRlbSkpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBlbnRyaWVzLnNvbWUoKFssIGVudHJ5XSkgPT4gdGhpcy5oYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YShlbnRyeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgaGVhbHRoY2hlY2s8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byByZWFkIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMudXBkYXRlXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ0xJRU5UIFVQREFURSBjbGFzcyA6ICR7dHlwZW9mIGNsYXp6fWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYHVwZGF0aW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllciB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBkZWxldGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRcbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWQoY2xhenosIGlkLCBjdHgpO1xuICAgIH1cblxuICAgIGxvZy52ZXJib3NlKGBkZWxldGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgID8gcmVzdWx0XG4gICAgICA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBwZXJmb3JtIGEgcXVlcnkgdXNpbmcgTWFuZ28gUXVlcnkgc3ludGF4XG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gUXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByb2Nlc3MgLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3VsdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFY+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IHJhdyhyYXdJbnB1dCwgcHJvY2VzcylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGV2YWx1YXRlVHJhbnNhY3Rpb24oXCJxdWVyeVwiLCBbaW5wdXRdKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoXCJxdWVyeVwiLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5wYXJzZShkZWNvZGUocmVzdWx0KSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogUHJvY2VzcyByZXN1bHQgYmFzZWQgb24gdHlwZVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBwcm9jZXNzZWQgcmVzdWx0XG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyByYXc8ViwgRCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJhd0lucHV0OiBNYW5nb1F1ZXJ5LFxuICAgIGRvY3NPbmx5OiBEID0gdHJ1ZSBhcyBELFxuICAgIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxWPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGxvZy5pbmZvKGBQZXJmb3JtaW5nIHJhdyBzdGF0ZW1lbnQgb24gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoY2xhenopfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInJhd1wiLFxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLCBkb2NzT25seV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBjbGF6elxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VSZWNvcmQgPSAocmVjb3JkOiBSZWNvcmQ8YW55LCBhbnk+KSA9PiB7XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChyZWNvcmQpKSByZXR1cm4gTW9kZWwuYnVpbGQocmVjb3JkKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgICAgY29uc3QgZWwgPSByZXN1bHRbMF07XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChlbCkpXG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBvbmUgaXMgYSBtb2RlbCwgYWxsIGFyZSBtb2RlbHNcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKGVsKSA9PiBNb2RlbC5idWlsZChlbCkpIGFzIFY7XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlUmVjb3JkKHJlc3VsdCBhcyBhbnkpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgQ291Y2hEQiB2aWV3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcXVlcnkgYSBkZXNpZ24gZG9jdW1lbnQgdmlld1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB2aWV3IHJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRkb2MgLSBEZXNpZ24gZG9jdW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmlld05hbWUgLSBWaWV3IG5hbWVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVmlldyBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Li4uQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnZpZXcpO1xuICAgIGxvZy5pbmZvKGBRdWVyeWluZyB2aWV3ICR7ZGRvY30vJHt2aWV3TmFtZX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJ2aWV3XCIsXG4gICAgICAgIFtkZG9jLCB2aWV3TmFtZSwgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVmlld1Jlc3BvbnNlPFI+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyB2aWV3IHJlc3VsdDogJHtlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgdGhlIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjYWNoZWQgY2xpZW50IG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIG5vbmUgZXhpc3RzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpZW50Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBvdmVycmlkZSBnZXRDbGllbnQoKTogQ2xpZW50IHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudClcbiAgICAgIHRoaXMuX2NsaWVudCA9IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q2xpZW50KHRoaXMuY29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgR2F0ZXdheSBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBjbGllbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBHYXRld2F5KGN0eDogRmFicmljQ2xpZW50Q29udGV4dCk6IFByb21pc2U8R2F0ZXdheT4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoY3R4LCB0aGlzLmNvbmZpZywgdGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgQ29udHJhY3QgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgR2F0ZXdheVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRyYWt0Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgQ29udHJhY3QoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPENvbnRyYWt0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q29udHJhY3QoXG4gICAgICBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgY2xhenpPckNvbnRyYWN0TmFtZSxcbiAgICAgIGN0eFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgb3IgZXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Ym1pdCAtIFdoZXRoZXIgdG8gc3VibWl0ICh0cnVlKSBvciBldmFsdWF0ZSAoZmFsc2UpIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KClcbiAgICogICBhbHQgc3VibWl0IHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbHNlIGV2YWx1YXRlIHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVuZFxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNsb3NlKClcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmFuc2FjdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgc3VibWl0ID0gdHJ1ZSxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCA9IHt9LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBzdHJpbmdbXSxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudHJhbnNhY3Rpb24pO1xuICAgIHRyYW5zaWVudERhdGEgPSB0aGlzLmluamVjdFRyYW5zaWVudE92ZXJyaWRlcyh0cmFuc2llbnREYXRhLCBjdHgpO1xuICAgIGlmIChzdWJtaXQgJiYgdGhpcy5zaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eCkpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUFyZ3MgPSB0aGlzLnByZXBhcmVMZWdhY3lBcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgdHJhbnNpZW50TWFwID0gdGhpcy5idWlsZExlZ2FjeVRyYW5zaWVudCh0cmFuc2llbnREYXRhKTtcbiAgICAgIGNvbnN0IHBlZXJDb25maWdzID0gdGhpcy5idWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgICAgIGN0eCxcbiAgICAgICAgYXBpLFxuICAgICAgICBsZWdhY3lBcmdzLFxuICAgICAgICB0cmFuc2llbnRNYXAsXG4gICAgICAgIHBlZXJDb25maWdzLFxuICAgICAgICBjbGF6ek9yQ29udHJhY3ROYW1lXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgdGhpcy5HYXRld2F5KGN0eCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gYXdhaXQgdGhpcy5Db250cmFjdChjdHgsIGNsYXp6T3JDb250cmFjdE5hbWUpO1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGAke3N1Ym1pdCA/IFwiU3VibWl0XCIgOiBcIkV2YWx1YXRlXCJ9dGluZyB0cmFuc2FjdGlvbiAke2NvbnRyYWN0LmdldENvbnRyYWN0TmFtZSgpfS4ke2FwaX1gXG4gICAgICApO1xuICAgICAgbG9nLmRlYnVnKGBhcmdzOiAke2FyZ3M/Lm1hcCgoYSkgPT4gYS50b1N0cmluZygpKS5qb2luKFwiXFxuXCIpIHx8IFwibm9uZVwifWApO1xuICAgICAgY29uc3QgbWV0aG9kID0gc3VibWl0ID8gY29udHJhY3Quc3VibWl0IDogY29udHJhY3QuZXZhbHVhdGU7XG4gICAgICBjb25zdCBub3JtYWxpemVkQXJncyA9IChhcmdzIHx8IFtdKS5tYXAoKGFyZykgPT5cbiAgICAgICAgdGhpcy5ub3JtYWxpemVUcmFuc2FjdGlvbkFyZ3VtZW50KGFyZylcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2llbnRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSB8fCB7fSk7XG5cbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgPSBlbmRvcnNpbmdPcmdhbml6YXRpb25zPy5sZW5ndGhcbiAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvcG9zYWxPcHRpb25zOiBQcm9wb3NhbE9wdGlvbnMgPSB7XG4gICAgICAgIGFyZ3VtZW50czogbm9ybWFsaXplZEFyZ3MsXG4gICAgICAgIHRyYW5zaWVudERhdGE6IHRyYW5zaWVudEVudHJpZXMubGVuZ3RoXG4gICAgICAgICAgPyB0cmFuc2llbnRFbnRyaWVzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihcbiAgICAgICAgICAgICAgKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gSlNPTi5zdHJpbmdpZnkodmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBjdHguZ2V0T3JVbmRlZmluZWQoXCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3NcIilcbiAgICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgOiB1bmRlZmluZWQsIC8vIG1zcElkIGxpc3RcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBtZXRob2QuY2FsbChjb250cmFjdCwgYXBpLCBwcm9wb3NhbE9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNvbm5lY3Rpb25gKTtcbiAgICAgIGdhdGV3YXkuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQoYXJnOiBhbnkpOiBhbnkge1xuICAgIGlmIChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpIHJldHVybiBhcmc7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwib2JqZWN0XCIpIHJldHVybiBhcmc7XG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBhcmc7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZyk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhY3R4LmdldE9yVW5kZWZpbmVkKFwibGVnYWN5XCIpICYmICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVMZWdhY3lBcmdzKGFyZ3M/OiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKGFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PlxuICAgICAgdHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVRyYW5zaWVudChcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRyYW5zaWVudERhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgbWFwW2tleV0gPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlTGVnYWN5TXNwQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gdGhpcy5jb25maWcubGVnYWN5TXNwQ291bnQgPz8gMTtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIoY29uZmlndXJlZCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPCAxKSByZXR1cm4gMTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwaWNrTGVnYWN5Q2FuZGlkYXRlcyhcbiAgICBjYW5kaWRhdGVzOiBNc3BEZXRhaWxzW10sXG4gICAgbGltaXQ6IG51bWJlclxuICApOiBNc3BEZXRhaWxzW10ge1xuICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGggfHwgbGltaXQgPD0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IFsuLi5jYW5kaWRhdGVzXTtcbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1pbihsaW1pdCwgYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgY29uc3QgcGlja2VkOiBNc3BEZXRhaWxzW10gPSBbXTtcbiAgICB3aGlsZSAocGlja2VkLmxlbmd0aCA8IHRhcmdldCAmJiBhdmFpbGFibGUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFtzZWxlY3Rpb25dID0gYXZhaWxhYmxlLnNwbGljZShpZHgsIDEpO1xuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBwaWNrZWQucHVzaChzZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGlja2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eDogRmFicmljQ2xpZW50Q29udGV4dCk6IExlZ2FjeVBlZXJUYXJnZXRbXSB7XG4gICAgY29uc3QgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICAgICAgdGxzQ2VydDogdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGxldCBlbmRvcnNpbmdPcmdzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgZW5kb3JzaW5nT3JncyA9IEFycmF5LmlzQXJyYXkoZW5kb3JzaW5nT3JncylcbiAgICAgID8gZW5kb3JzaW5nT3Jnc1xuICAgICAgOiBbZW5kb3JzaW5nT3Jnc107XG4gICAgY29uc3QgZW5kb3JzZXJzID1cbiAgICAgIGVuZG9yc2luZ09yZ3MuZmlsdGVyKChvcmcpOiBvcmcgaXMgc3RyaW5nID0+IEJvb2xlYW4ob3JnKSkgfHwgW107XG4gICAgY29uc3QgZXh0cmFzID0gZW5kb3JzZXJzLmZpbHRlcigob3JnKSA9PiBvcmcgIT09IHRoaXMuY29uZmlnLm1zcElkKTtcbiAgICBpZiAoIWV4dHJhcy5sZW5ndGgpIHJldHVybiBwZWVycztcblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuY29uZmlnLm1zcE1hcDtcbiAgICBjb25zdCBsZWdhY3lDb3VudCA9IHRoaXMucmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk7XG4gICAgZm9yIChjb25zdCBtc3Agb2YgZXh0cmFzKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gbWFwPy5bbXNwXTtcbiAgICAgIGlmICghY2FuZGlkYXRlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMucGlja0xlZ2FjeUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgbGVnYWN5Q291bnQpO1xuICAgICAgaWYgKCFzZWxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gdmFsaWQgcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hvaWNlIG9mIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UuZW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIHBlZXIgbWFwcGluZyBmb3IgTVNQICR7bXNwfTogbWlzc2luZyBlbmRwb2ludGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBlZXJzLnB1c2goe1xuICAgICAgICAgIG1zcElkOiBtc3AsXG4gICAgICAgICAgcGVlckVuZHBvaW50OiBjaG9pY2UuZW5kcG9pbnQsXG4gICAgICAgICAgcGVlckhvc3RBbGlhczogY2hvaWNlLmFsaWFzLFxuICAgICAgICAgIHRsc0NlcnQ6IGNob2ljZS50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwZWVycztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBmY246IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICB0cmFuc2llbnRNYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQsXG4gICAgcGVlckNvbmZpZ3M6IExlZ2FjeVBlZXJUYXJnZXRbXSxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKTtcbiAgICBjb25zdCBwZWVycyA9IHRoaXMubm9ybWFsaXplTGVnYWN5UGVlcnMocGVlckNvbmZpZ3MpO1xuICAgIGNvbnN0IGlkZW50aXR5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLnJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgV2FsbGV0cy5uZXdJbk1lbW9yeVdhbGxldCgpO1xuICAgIGNvbnN0IGlkZW50aXR5TGFiZWwgPSBgJHt0aGlzLmNvbmZpZy5tc3BJZH0tbGVnYWN5YDtcbiAgICBhd2FpdCB3YWxsZXQucHV0KGlkZW50aXR5TGFiZWwsIHtcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgdHlwZTogXCJYLjUwOVwiLFxuICAgIH0gYXMgSWRlbnRpdHkpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblByb2ZpbGUgPSBhd2FpdCB0aGlzLmJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnMpO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBuZXcgTGVnYWN5R2F0ZXdheSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdhdGV3YXkuY29ubmVjdChjb25uZWN0aW9uUHJvZmlsZSwge1xuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHlMYWJlbCxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFzTG9jYWxob3N0OiB0aGlzLnNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVycyksXG4gICAgICAgIH0sXG4gICAgICAgIHRsc0luZm86IHtcbiAgICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgICBrZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY29uZmlnLmNoYW5uZWw7XG4gICAgICBsZXQgY2hhaW5jb2RlID0gdGhpcy5jb25maWcuY2hhaW5jb2RlTmFtZTtcbiAgICAgIGxldCBjb250cmFjdE5hbWUgPSB0aGlzLmNvbmZpZy5jb250cmFjdE5hbWU7XG5cbiAgICAgIGlmIChjbGF6ek9yQ29udHJhY3ROYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhenpPckNvbnRyYWN0TmFtZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICBjb250cmFjdE5hbWUgPSBjbGF6ek9yQ29udHJhY3ROYW1lO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgTm8gY29udGV4dCByZWNlaXZlZCB0byBkZXRlcm1pbmUgY2hhaW5jb2RlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2hhbm5lbCA9XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFubmVsRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGN0eCkpIHx8IGNoYW5uZWw7XG4gICAgICAgICAgY2hhaW5jb2RlID1cbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmNoYWluY29kZUZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjdHgpKSB8fCBjaGFpbmNvZGU7XG4gICAgICAgICAgY29udHJhY3ROYW1lID0gYXdhaXQgdGhpcy5jb250cmFjdEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjdHgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY2hhaW5jb2RlLCBjb250cmFjdE5hbWUpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBjb250cmFjdC5jcmVhdGVUcmFuc2FjdGlvbihmY24pO1xuXG4gICAgICBpZiAodHJhbnNpZW50TWFwKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaWVudCh0cmFuc2llbnRNYXApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRvcnNlcnMgPSBwZWVyc1xuICAgICAgICAubWFwKChwZWVyKSA9PiBuZXR3b3JrLmdldENoYW5uZWwoKS5nZXRFbmRvcnNlcihwZWVyLm5hbWUpKVxuICAgICAgICAuZmlsdGVyKChlbmRvcnNlcik6IGVuZG9yc2VyIGlzIEVuZG9yc2VyID0+IEJvb2xlYW4oZW5kb3JzZXIpKTtcbiAgICAgIGlmIChlbmRvcnNlcnMubGVuZ3RoKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldEVuZG9yc2luZ1BlZXJzKGVuZG9yc2Vycyk7XG4gICAgICB9XG5cbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTGVnYWN5IHN1Ym1pdHRpbmcgJHtjb250cmFjdE5hbWV9LiR7ZmNufSB2aWEgcGVlcnMgJHtwZWVycy5tYXAoKHApID0+IHAucGVlckVuZHBvaW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb24uc3VibWl0KC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnYXRld2F5LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxlZ2FjeVBlZXJzKFxuICAgIHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W11cbiAgKTogTGVnYWN5UGVlcldpdGhOYW1lW10ge1xuICAgIGNvbnN0IGRlZHVwZWQgPSBuZXcgTWFwPHN0cmluZywgTGVnYWN5UGVlcldpdGhOYW1lPigpO1xuICAgIGNvbnN0IGFkZFBlZXIgPSAocGVlcjogTGVnYWN5UGVlclRhcmdldCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7cGVlci5wZWVyRW5kcG9pbnR9fCR7cGVlci5wZWVySG9zdEFsaWFzIHx8IFwiXCJ9YDtcbiAgICAgIGlmIChkZWR1cGVkLmhhcyhrZXkpKSByZXR1cm47XG4gICAgICBjb25zdCBuYW1lID0gYHBlZXItJHtwZWVyLm1zcElkfS0ke2RlZHVwZWQuc2l6ZX1gO1xuICAgICAgZGVkdXBlZC5zZXQoa2V5LCB7XG4gICAgICAgIC4uLnBlZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcGVlcnMuZm9yRWFjaChhZGRQZWVyKTtcbiAgICBhZGRQZWVyKHtcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGRlZHVwZWQudmFsdWVzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpOiBQcm9taXNlPHtcbiAgICBjZXJ0aWZpY2F0ZTogc3RyaW5nO1xuICAgIHByaXZhdGVLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgcmV0dXJuIHsgY2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pIHtcbiAgICBjb25zdCBwZWVyRW50cmllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGNoYW5uZWxQZWVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG9yZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgIGNvbnN0IHRsc1BlbSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgICBwZWVyLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhvc3RuYW1lID1cbiAgICAgICAgcGVlci5wZWVySG9zdEFsaWFzIHx8IHRoaXMuZXh0cmFjdEhvc3QocGVlci5wZWVyRW5kcG9pbnQpO1xuICAgICAgcGVlckVudHJpZXNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgdXJsOiB0aGlzLmVuc3VyZUdycGNVcmwocGVlci5wZWVyRW5kcG9pbnQpLFxuICAgICAgICB0bHNDQUNlcnRzOiB7IHBlbTogdGxzUGVtIH0sXG4gICAgICAgIGdycGNPcHRpb25zOiB7XG4gICAgICAgICAgXCJzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGVcIjogaG9zdG5hbWUsXG4gICAgICAgICAgaG9zdG5hbWVPdmVycmlkZTogaG9zdG5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY2hhbm5lbFBlZXJzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUsXG4gICAgICAgIGNoYWluY29kZVF1ZXJ5OiB0cnVlLFxuICAgICAgICBsZWRnZXJRdWVyeTogdHJ1ZSxcbiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUsXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXSA9IG9yZ3NbcGVlci5tc3BJZF0gfHwge1xuICAgICAgICBtc3BpZDogcGVlci5tc3BJZCxcbiAgICAgICAgcGVlcnM6IFtdLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0ucGVlcnMucHVzaChwZWVyLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBcImxlZ2FjeS1tYW51YWxcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIGNsaWVudDoge1xuICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgfSxcbiAgICAgIG9yZ2FuaXphdGlvbnM6IG9yZ3MsXG4gICAgICBwZWVyczogcGVlckVudHJpZXMsXG4gICAgICBvcmRlcmVyczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBbdGhpcy5jb25maWcuY2hhbm5lbF06IHtcbiAgICAgICAgICBwZWVyczogY2hhbm5lbFBlZXJzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlZXJzLmV2ZXJ5KChwZWVyKSA9PiB0aGlzLmlzTG9jYWxFbmRwb2ludChwZWVyLnBlZXJFbmRwb2ludCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xvY2FsRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmV4dHJhY3RIb3N0KGVuZHBvaW50KS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3QgPT09IFwiMTI3LjAuMC4xXCI7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RIb3N0KGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IGVuZHBvaW50LnJlcGxhY2UoL15ncnBjcz86XFwvXFwvLywgXCJcIik7XG4gICAgcmV0dXJuIHNhbml0aXplZC5zcGxpdChcIjpcIilbMF07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUdycGNVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKC9eZ3JwY3M/OlxcL1xcLy9pLnRlc3QoZW5kcG9pbnQpKSByZXR1cm4gZW5kcG9pbnQ7XG4gICAgcmV0dXJuIGBncnBjczovLyR7ZW5kcG9pbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFBlbUlucHV0KHNvdXJjZT86IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBjZXJ0aWZpY2F0ZSBvciBrZXkgbWF0ZXJpYWxcIik7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzb3VyY2UpKSByZXR1cm4gc291cmNlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICBjb25zdCB0cmltbWVkID0gc291cmNlLnRyaW0oKTtcbiAgICBpZiAoLy0tLS0tQkVHSU4gW0EtWiBdKy0tLS0tLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoc291cmNlKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgcmVhZEZzRmlsZShzb3VyY2UpKS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yIHwgc3RyaW5nKTogRSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIucGFyc2VFcnJvcjxFPihlcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIHRydWUsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGF6ek9yQ29udHJhY3ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhenpPckNvbnRyYWN0TmFtZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBtaWdyYXRlKFxuICAgIHJlZmVyZW5jZTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHByb3ZpZGVkQ3R4ID1cbiAgICAgIGxhc3QgaW5zdGFuY2VvZiBDb250ZXh0ID8gKGxhc3QgYXMgRmFicmljQ2xpZW50Q29udGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWlncmF0aW9uQXJncyA9IHByb3ZpZGVkQ3R4ID8gYXJncy5zbGljZSgwLCAtMSkgOiBhcmdzO1xuICAgIGNvbnN0IGN0eCA9XG4gICAgICBwcm92aWRlZEN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLk1JR1JBVElPTixcbiAgICAgICAge30sXG4gICAgICAgIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPGFueT4+XG4gICAgICApKTtcbiAgICByZXR1cm4gdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwibWlncmF0ZVwiLFxuICAgICAgW3JlZmVyZW5jZSwgbWlncmF0aW9uQXJnc10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBcIk1pZ3JhdGlvbkNvbnRyYWN0XCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDbG9zZXMgdGhlIGFjdGl2ZSBkaXNwYXRjaCAod2hpY2ggaW4gdHVybiBjbG9zZXMgYW55IGdhdGV3YXlcbiAgICogZXZlbnQgc3Vic2NyaXB0aW9uKSB2aWEgdGhlIGJhc2UgY2xhc3MsIHRoZW4gY2xvc2VzIHRoZSBnUlBDIGNsaWVudC5cbiAgICogV29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgc3ludGhldGljRXZlbnRzYCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY29ubmVjdGlvbnMgYXJlIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24oXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJhc2UgY2xhc3MgaGFuZGxlcyBkaXNwYXRjaC5jbG9zZSgpIGludGVybmFsbHkuXG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24oLi4uYXJncyk7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY2xpZW50YCk7XG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIGNoYWluY29kZSBjb250cmFjdCBmcm9tIHRoZSBzcGVjaWZpZWQgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q29udHJha3R9IFRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENvbnRyYWN0KFxuICAgIGdhdGV3YXk6IEdhdGV3YXksXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjdHg/OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG5cbiAgICBsZXQgY2hhbm5lbCA9IGNvbmZpZy5jaGFubmVsO1xuICAgIGxldCBjaGFpbmNvZGUgPSBjb25maWcuY2hhaW5jb2RlTmFtZTtcbiAgICBsZXQgY29udHJhY3ROYW1lID0gY29uZmlnLmNvbnRyYWN0TmFtZTtcblxuICAgIGlmIChjbGF6ek9yQ29udHJhY3ROYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6T3JDb250cmFjdE5hbWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIGNvbnRyYWN0TmFtZSA9IGNsYXp6T3JDb250cmFjdE5hbWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgTm8gY29udGV4dCByZWNlaXZlZCB0byBkZXRlcm1pbmUgY2hhaW5jb2RlIGNvbmZpZ2BcbiAgICAgICAgICApO1xuICAgICAgICBjaGFubmVsID1cbiAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFubmVsRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGNvbmZpZywgY3R4KSkgfHwgY2hhbm5lbDtcbiAgICAgICAgY2hhaW5jb2RlID1cbiAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFpbmNvZGVGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY29uZmlnLCBjdHgpKSB8fFxuICAgICAgICAgIGNoYWluY29kZTtcbiAgICAgICAgY29udHJhY3ROYW1lID0gYXdhaXQgdGhpcy5jb250cmFjdEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjb25maWcsIGN0eCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjaGFubmVsKTtcbiAgICBsZXQgY29udHJhY3Q6IENvbnRyYWt0O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBSZXRyaWV2aW5nIGNoYWluY29kZSAke2NoYWluY29kZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWV9IGZyb20gbmV0d29yayAke2NoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChjaGFpbmNvZGUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY2xpZW50PzogQ2xpZW50XG4gICkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2xpZW50IHx8IChhd2FpdCB0aGlzLmdldENsaWVudChjb25maWcpKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN0eFxuICAgICkpIGFzIEdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgY2xpZW50IHdpdGggVExTIGNyZWRlbnRpYWxzIGZvciBzZWN1cmUgY29tbXVuaWNhdGlvblxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q2xpZW50fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIHN0YXRpYyBnZXRDbGllbnQoY29uZmlnOiBQZWVyQ29uZmlnKTogQ2xpZW50IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDbGllbnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBUTFMgY3JlZGVudGlhbHMgZm9yIG1zcCAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBsZXQgcGF0aE9yQ2VydDogc3RyaW5nIHwgQnVmZmVyID0gY29uZmlnLnRsc0NlcnQgYXMgc3RyaW5nIHwgQnVmZmVyO1xuXG4gICAgaWYgKHR5cGVvZiBwYXRoT3JDZXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhdGhPckNlcnQubWF0Y2goXG4gICAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShwYXRoT3JDZXJ0LCBcInV0ZjhcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShmcy5yZWFkRmlsZVN5bmMocGF0aE9yQ2VydCwgXCJ1dGY4XCIpKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIHRoZSB0bHMgY2VydGlmaWNhdGUgZnJvbSAke3BhdGhPckNlcnR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0bHNDcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKHBhdGhPckNlcnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBHYXRld2F5IENsaWVudCBmb3IgdXJsICR7Y29uZmlnLnBlZXJFbmRwb2ludH1gKTtcbiAgICByZXR1cm4gbmV3IENsaWVudChjb25maWcucGVlckVuZHBvaW50LCB0bHNDcmVkZW50aWFscywge1xuICAgICAgXCJncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgICAgXCJncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IGNvbm5lY3Rpb24gd2l0aCBpZGVudGl0eSBhbmQgc2lnbmVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBUaGUgZ1JQQyBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb25uZWN0ZWQgR2F0ZXdheVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgSWRlbnRpdHlcbiAgICogICBwYXJ0aWNpcGFudCBTaWduZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqXG4gICAqICAgQ2FsbGVyLT4+RmFicmljQWRhcHRlcjogZ2V0Q29ubmVjdGlvbihjbGllbnQsIGNvbmZpZylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+SWRlbnRpdHk6IGdldElkZW50aXR5KG1zcElkLCBjZXJ0RGlyZWN0b3J5UGF0aClcbiAgICogICBJZGVudGl0eS0tPj5GYWJyaWNBZGFwdGVyOiBpZGVudGl0eVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5TaWduZXI6IGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoKVxuICAgKiAgIFNpZ25lci0tPj5GYWJyaWNBZGFwdGVyOiBzaWduZXJcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogQ3JlYXRlIENvbm5lY3RPcHRpb25zXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3Qob3B0aW9ucylcbiAgICogICBHYXRld2F5LS0+PkZhYnJpY0FkYXB0ZXI6IGdhdGV3YXlcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNhbGxlcjogZ2F0ZXdheVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENvbm5lY3Rpb24oXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldENvbm5lY3Rpb24pO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIFBlZXIgSWRlbnRpdHkgZm9yICR7Y29uZmlnLm1zcElkfSB1bmRlciAke2NvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aH1gXG4gICAgKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IGdldElkZW50aXR5KFxuICAgICAgY29uZmlnLm1zcElkLFxuICAgICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHByZXBhcmluZyB0cmFuc2FjdGlvbiBzaWduZXIgZm9yICR7Q3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoaWRlbnRpdHkuY3JlZGVudGlhbHMudG9TdHJpbmcoKSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IEZhYnJpYyBJRCBmcm9tIGNlcnRpZmljYXRlYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lcjogU2lnbmVyO1xuICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge307XG4gICAgaWYgKCFjb25maWcuaHNtKSB7XG4gICAgICBzaWduZXIgPSBhd2FpdCBnZXRTaWduZXIoY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc3QgaHNtID0gbmV3IEhTTVNpZ25lckZhY3RvcnlDdXN0b20oY29uZmlnLmhzbS5saWJyYXJ5KTtcbiAgICAgIC8vIGNvbnN0IGlkZW50aWZpZXIgPSBoc20uZ2V0U0tJRnJvbUNlcnRpZmljYXRlUGF0aChcbiAgICAgIC8vICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICAgLy8gKTtcbiAgICAgIC8vIGNvbnN0IHBrY3MxMVNpZ25lciA9IGhzbS5uZXdTaWduZXIoe1xuICAgICAgLy8gICBsYWJlbDogY29uZmlnLmhzbS50b2tlbkxhYmVsIGFzIHN0cmluZyxcbiAgICAgIC8vICAgcGluOiBTdHJpbmcoY29uZmlnLmhzbS5waW4pIGFzIHN0cmluZyxcbiAgICAgIC8vICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIC8vICAgLy8gdXNlclR5cGU6IDEgLypDS1VfVVNFUiAqLyxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gc2lnbmVyID0gcGtjczExU2lnbmVyLnNpZ25lcjtcbiAgICAgIC8vIGNsb3NlID0gcGtjczExU2lnbmVyLmNsb3NlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJIU00gTk9UIElNUExFTUVOVEVEXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjbGllbnQsXG4gICAgICBpZGVudGl0eTogaWRlbnRpdHksXG4gICAgICBzaWduZXI6IHNpZ25lcixcbiAgICAgIC8vIERlZmF1bHQgdGltZW91dHMgZm9yIGRpZmZlcmVudCBnUlBDIGNhbGxzXG4gICAgICBldmFsdWF0ZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImV2YWx1YXRlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBlbmRvcnNlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZW5kb3JzZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMTUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIHN1Ym1pdE9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcInN1Ym1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgY29tbWl0U3RhdHVzT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiY29tbWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxIG1pbnV0ZVxuICAgICAgfSxcbiAgICB9IGFzIENvbm5lY3RPcHRpb25zO1xuXG4gICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBjb25uZWN0KG9wdGlvbnMpO1xuXG4gICAgLy8gVE9ETzogcmVwbGFjZT9cbiAgICBpZiAoY29uZmlnLmhzbSkge1xuICAgICAgZ2F0ZXdheS5jbG9zZSA9IG5ldyBQcm94eShnYXRld2F5LmNsb3NlLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldDogKCkgPT4gdm9pZCwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pOiBhbnkge1xuICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBuZXcgRmFicmljQ2xpZW50RGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29yay5cbiAgICogQHJldHVybnMge0Rpc3BhdGNofSBBIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHJlbWFya3MgVGhlIERpc3BhdGNoIGluc3RhbmNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgbmV0d29yaywgc3VjaCBhcyBzdWJtaXR0aW5nIHRyYW5zYWN0aW9ucyBvciBxdWVyeWluZyBkYXRhLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBmYWJyaWNEaXNwYXRjaCA9IGZhYnJpY0NsaWVudEFkYXB0ZXIuRGlzcGF0Y2goKTtcbiAgICogZmFicmljRGlzcGF0Y2guc3VibWl0VHJhbnNhY3Rpb24oJ2NyZWF0ZVByb2R1Y3QnLCB7IG5hbWU6ICdQcm9kdWN0IEEnLCBwcmljZTogMTAwIH0pO1xuICAgKi9cbiAgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRmFicmljQ2xpZW50RGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0odGhpcy5jbGllbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjaGFpbmNvZGVGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gTW9kZWwuY2hhaW5jb2RlT2YobW9kZWwsIC4uLmFyZ3MpIHx8IGNvbmZpZy5jaGFpbmNvZGVOYW1lO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjaGFubmVsRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIE1vZGVsLmNoYW5uZWxPZihtb2RlbCwgLi4uYXJncykgfHwgY29uZmlnLmNoYW5uZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNvbnRyYWN0Rm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE1vZGVsLmNvbnRyYWN0T2YobW9kZWwsIC4uLmFyZ3MpIHx8XG4gICAgICBEZWZhdWx0Q29udHJhY3RSZXNvbHZlcihtb2RlbCwgLi4uYXJncylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3IgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyB8IEdhdGV3YXlFcnJvclxuICApOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcblxuICAgIGxldCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdhdGV3YXlFcnJvciAmJiBlcnIuZGV0YWlscy5sZW5ndGggJiYgZXJyLmNvZGUgPT09IDEwKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXJyIGluc3RhbmNlb2YgRW5kb3JzZUVycm9yICYmXG4gICAgICBlcnIuZGV0YWlscy5sZW5ndGggJiZcbiAgICAgIGVyci5jb2RlID09PSAxMCAmJlxuICAgICAgZXJyLmRldGFpbHNbMF0ubWVzc2FnZT8uaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKVxuICAgICkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJNVkNDX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IE12Y2NSZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiREVBRExJTkVfRVhDRUVERURcIikpXG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uVGltZW91dEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChcbiAgICAgIG1zZy5pbmNsdWRlcyhcImNoYWluY29kZSBzdHJlYW0gdGVybWluYXRlZFwiKSB8fFxuICAgICAgbXNnLmluY2x1ZGVzKFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIpIHx8XG4gICAgICBtc2cuaW5jbHVkZXMoXCJyZWNlaXZlZCBtZXNzYWdlIGxhcmdlciB0aGFuIG1heFwiKSB8fFxuICAgICAgbXNnLmluY2x1ZGVzKFwiZ3JwYzogcmVjZWl2ZWQgbWVzc2FnZSBsYXJnZXJcIilcbiAgICApXG4gICAgICByZXR1cm4gbmV3IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiRU5ET1JTRU1FTlRfUE9MSUNZX0ZBSUxVUkVcIikpXG4gICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50UG9saWN5RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIlBIQU5UT01fUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgc3dpdGNoICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudEVycm9yKGVycikgYXMgRTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFZhbGlkYXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE5vdEZvdW5kRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25mbGljdEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQmFkUmVxdWVzdEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBCYWRSZXF1ZXN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUXVlcnlFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBRdWVyeUVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFBhZ2luZ0Vycm9yLm5hbWUpKSByZXR1cm4gbmV3IFBhZ2luZ0Vycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTWlncmF0aW9uRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTWlncmF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoT2JzZXJ2ZXJFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBPYnNlcnZlckVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEF1dGhvcml6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEZvcmJpZGRlbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IEZvcmJpZGRlbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbm5lY3Rpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFNlcmlhbGl6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBFO1xuICB9XG59XG5cbkZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KEZhYnJpY0ZsYXZvdXIpO1xuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIERpc3BhdGNoLFxuICBFdmVudElkcyxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudENvbnRleHQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlRXZlbnQsXG4gIENsb3NlYWJsZUFzeW5jSXRlcmFibGUsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IHBhcnNlRXZlbnROYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9ldmVudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgZGlzcGF0Y2hlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGFuZCBwcm9jZXNzZXMgZXZlbnRzIGVtaXR0ZWQgYnkgRmFicmljIGNoYWluY29kZSwgZGlzcGF0Y2hpbmcgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICogQGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBGYWJyaWNBZGFwdGVyLmdldENsaWVudChwZWVyQ29uZmlnKTtcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudCk7XG4gKlxuICogLy8gQ29uZmlndXJlIHRoZSBkaXNwYXRjaCB3aXRoIHBlZXIgY29uZmlndXJhdGlvblxuICogZGlzcGF0Y2guY29uZmlndXJlKHBlZXJDb25maWcpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHNwZWNpZmljIHRhYmxlIGFuZCBldmVudFxuICogZGlzcGF0Y2gub2JzZXJ2ZSgndXNlcnMnLCAnY3JlYXRlJywgKGlkKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBVc2VyIGNyZWF0ZWQ6ICR7aWR9YCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50c1xuICogYXdhaXQgZGlzcGF0Y2guc3RhcnQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBjb25maWd1cmUocGVlckNvbmZpZylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG9ic2VydmUodGFibGUsIGV2ZW50LCBjYWxsYmFjaylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IHN0YXJ0KClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+R2F0ZXdheTogZ2V0R2F0ZXdheShjb25maWcsIGNsaWVudClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbClcbiAqICAgTmV0d29yay0+Pk5ldHdvcms6IGdldENoYWluY29kZUV2ZW50cyhjaGFpbmNvZGVOYW1lKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICogICBsb29wIEZvciBlYWNoIGV2ZW50XG4gKiAgICAgQ2hhaW5jb2RlLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQocGF5bG9hZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0tPj5DbGllbnQ6IGNhbGxiYWNrKGlkKVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2g8RmFicmljQ2xpZW50QWRhcHRlcj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGxpc3RlbmluZyBzdGFjayBmb3IgY2hhaW5jb2RlIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5pbmdTdGFjaz86IENsb3NlYWJsZUFzeW5jSXRlcmFibGU8Q2hhaW5jb2RlRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGV2ZW50IHBheWxvYWRzIGZyb20gYnl0ZXMgdG8gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBkaXNwYXRjaGVyIGZvciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2xpZW50OiBDbGllbnQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGV2ZW50IGxpc3RlbmluZyBjb25uZWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN0b3BzIGxpc3RlbmluZyBmb3IgY2hhaW5jb2RlIGV2ZW50cyBhbmQgcmVsZWFzZXMgcmVzb3VyY2VzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY2xvc2UoXG4gICAgLi4uY3R4QXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IEFkYXB0ZXIubG9nQ3R4PEZhYnJpY0NsaWVudENvbnRleHQ+KFxuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMsXG4gICAgICBldmVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2g7IHNraXBwaW5nIG9ic2VydmVyIHVwZGF0ZSBmb3IgJHt0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCl9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKG1vZGVsLCBldmVudCwgaWQsIC4uLmN0eEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGNoYWluY29kZSBldmVudHNcbiAgICogQHN1bW1hcnkgTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gdGhlIGNoYWluY29kZSBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZW50IGhhbmRsaW5nIHN0b3BzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRTdGFja1xuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50UGFyc2VyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50U3RhY2s6IGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIGxpc3RlbmluZ1N0YWNrKVxuICAgKiAgIEV2ZW50U3RhY2stLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFBhcnNlcjogcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSlcbiAgICogICBFdmVudFBhcnNlci0tPj5GYWJyaWNEaXNwYXRjaDogeyB0YWJsZSwgZXZlbnQsIG93bmVyIH1cbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBDaGVjayBpZiBldmVudCBpcyBmb3IgdGhpcyBNU1BcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQoZXZ0LnBheWxvYWQpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5PYnNlcnZlcnM6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIHBheWxvYWQuaWQpXG4gICAqICAgT2JzZXJ2ZXJzLS0+PkZhYnJpY0Rpc3BhdGNoOiBDYWxsYmFja3MgZXhlY3V0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVFdmVudHMoXG4gICAgY3R4QXJnPzogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIHJlc3VsdEFyZ3NbMF0sXG4gICAgICAgICAgICByZXN1bHRBcmdzWzFdLFxuICAgICAgICAgICAgcmVzdWx0QXJnc1syXSxcbiAgICAgICAgICAgIC4uLnJlc3VsdEFyZ3Muc2xpY2UoMyksXG4gICAgICAgICAgICAuLi4oY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PilcbiAgICAgICAgICApLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dG9XcmFwfSBvbiAke2NsYXp6Lm5hbWUgfHwgY2xhenp9IGZvciAke2lkc306ICR7ZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuaWYgKEZhYnJpY0NsaWVudEFkYXB0ZXIpXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdID0gRmFicmljQ2xpZW50RGlzcGF0Y2g7XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW12ZXIgdmVyc2lvbiBhbmQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLlxuICogVGhlIGJ1aWxkIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgYDx2ZXJzaW9uPi08Y29tbWl0PmAgdmFsdWUgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IEZVTExfVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbInJlc29sdmVQcmltYXJ5S2V5RmllbGQiLCJtIiwibG9nIiwiU3RyaW5nIiwiTW9kZWwiLCJwayIsIm1lc3NhZ2UiLCJuYW1lIiwidmVyYm9zZSIsInVuZGVmaW5lZCIsIndpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIiLCJpbmRleGVzIiwicGtGaWVsZCIsIm1hcCIsImluZGV4IiwiZmllbGRzIiwiaW5jbHVkZXMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJzb3J0ZWRGaWVsZHMiLCJmaWx0ZXIiLCJmaWVsZCIsImhhc1BrIiwic29tZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImxhc3RGaWVsZCIsImxhc3REaXJlY3Rpb24iLCJ2YWx1ZXMiLCJ0b0xvd2VyQ2FzZSIsImRpcmVjdGlvbiIsImFzc2lnbiIsImVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZSIsImZpbGVQYXRoIiwiZnMiLCJyZXF1aXJlIiwicGF0aCIsImRpcm5hbWUiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVNb2RlbEluZGV4ZXMiLCJnZW5lcmF0ZUluZGV4ZXMiLCJnZW5lcmF0ZU1vZGVsRGVzaWduRG9jcyIsImFjY3VtIiwidmlld3MiLCJnZW5lcmF0ZVZpZXdzIiwic3RvcmFnZSIsImZvckVhY2giLCJkb2MiLCJfaWQiLCJyZWFkTW9kZWxGaWxlIiwiZmlsZSIsInJlc29sdmUiLCJwYXJlbnRQYXRoIiwiZXhwb3J0cyIsImUiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwicmVzb2x2ZWRGb2xkZXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInJlY3Vyc2l2ZSIsImYiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInB1c2giLCJ3cml0ZUluZGV4ZXMiLCJwIiwicHJvY2VzcyIsImN3ZCIsImNvbGxlY3Rpb24iLCJqb2luIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJkYXRhIiwiT3ZlcmZsb3dFcnJvciIsIm1zZyIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIlF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciIsIkZhYnJpY0NsaWVudFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yY2UiLCJ0aGlzIiwiX292ZXJyaWRlcyIsImlnbm9yZVZhbGlkYXRpb24iLCJpZ25vcmVIYW5kbGVycyIsImFsbG93UmF3U3RhdGVtZW50cyIsImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXMiLCJmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllcyIsImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlIiwicmVidWlsZFdpdGhUcmFuc2llbnQiLCJvdmVycmlkZSIsImZsYWdzIiwiZm9yIiwiT2JzZXJ2ZXJIYW5kbGVyIiwicGFnaW5hdGVCeSIsImtleSIsIm9yZGVyIiwicmVmIiwib2Zmc2V0IiwibGltaXQiLCJjdHhBcmdzIiwibG9nQ3R4IiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiUEFHRV9CWSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwid2FybiIsImZpbmRCeSIsInZhbHVlIiwiRklORF9CWSIsImZpbmRPbmVCeSIsIkZJTkRfT05FX0JZIiwiZmluZCIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiRklORCIsIlBBR0UiLCJjdHgiLCJQZXJzaXN0ZW5jZUtleXMiLCJTVEFURU1FTlQiLCJjYWxsQXJncyIsInNsaWNlIiwicGFyc2UiLCJkZWNvZGUiLCJldmFsdWF0ZVRyYW5zYWN0aW9uIiwiaHlkcmF0ZWQiLCJyIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsImQiLCJhcHBseUFmdGVyUmVhZCIsImdldE9yVW5kZWZpbmVkIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiQUZURVIiLCJQcm9taXNlIiwiYWxsIiwiZW50cnkiLCJjb3VudE9mIiwiQ09VTlRfT0YiLCJzdG10QXJncyIsIm1heE9mIiwiTUFYX09GIiwibWluT2YiLCJNSU5fT0YiLCJhdmdPZiIsIkFWR19PRiIsInN1bU9mIiwiU1VNX09GIiwiZGlzdGluY3RPZiIsIkRJU1RJTkNUX09GIiwiZ3JvdXBPZiIsIkdST1VQX09GIiwiaGVhbHRoY2hlY2siLCJjcmVhdGUiLCJtb2RlbCIsImRlYnVnIiwiZW5zdXJlTGVnYWN5TWlycm9yRmxhZyIsInByZXBhcmVkIiwicmVjb3JkIiwiaWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJ1cGRhdGUiLCJjcmVhdGVBbGxQcmVmaXgiLCJtb2RlbHMiLCJDUkVBVEUiLCJnZXQiLCJpZ25vcmVWYWxpZGF0ZSIsIk9OIiwiaWdub3JlZFByb3BzIiwiZXJyb3JzIiwiaGFzRXJyb3JzIiwiZXJyb3JNZXNzYWdlcyIsInJlZHVjZUVycm9yc1RvUHJpbnQiLCJWYWxpZGF0aW9uRXJyb3IiLCJjcmVhdGVBbGwiLCJpZHMiLCJwYXlsb2FkcyIsInRyYW5zaWVudHMiLCJjcmVhdGVkIiwiaSIsInJlYWRBbGwiLCJrZXlzIiwicmVjb3JkcyIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJ1IiwiYWNjdW11bGF0ZSIsImxlZ2FjeSIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJfX2RlY29yYXRlIiwidHlwZSIsImNvbHVtbiIsInJlcXVpcmVkIiwidGFibGUiLCJFUkMyMFdhbGxldCIsIkFsbG93YW5jZSIsIkNsaWVudFNlcmlhbGl6ZXIiLCJKU09OU2VyaWFsaXplciIsInByZVNlcmlhbGl6ZSIsIm1vZGVsTmFtZSIsInRvU2VyaWFsaXplIiwibWV0YWRhdGEiLCJNZXRhZGF0YSIsIlNlcmlhbGl6YXRpb25FcnJvciIsIk1vZGVsS2V5cyIsIkFOQ0hPUiIsImRlc2VyaWFsaXplIiwic3RyIiwiZGVzZXJpYWxpemF0aW9uIiwiY2xhc3NOYW1lIiwiRXJyb3IiLCJidWlsZCIsInNlcmlhbGl6ZSIsIkZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeSIsInNlcmlhbGl6ZXIiLCJkZWNvZGVyIiwiVGV4dERlY29kZXIiLCJ1cGRhdGVPYnNlcnZlcnMiLCJldmVudCIsIm9ic2VydmVySGFuZGxlciIsImNvdW50IiwicGFyc2VkSWQiLCJTZXF1ZW5jZSIsInBhcnNlVmFsdWUiLCJzZXF1ZW5jZUZvciIsInRva2VuTmFtZSIsInN5bWJvbCIsImRlY2ltYWxzIiwiTnVtYmVyIiwidG90YWxTdXBwbHkiLCJ0b3RhbCIsImJhbGFuY2VPZiIsIm93bmVyIiwiYmFsYW5jZSIsInRyYW5zZmVyIiwidG8iLCJ0cmFuc2ZlcnJlZCIsInN1Ym1pdFRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJ0cmFuc2ZlckZyb20iLCJmcm9tIiwiY29udGV4dEFyZ3MiLCJDb250ZXh0IiwiYXBwcm92ZSIsInNwZW5kZXIiLCJhcHByb3ZlZCIsImFsbG93YW5jZSIsImluaXRpYWxpemUiLCJ0b2tlbiIsImluaXRpbGlhemVkIiwiY2hlY2tJbml0aWFsaXplZCIsIm1pbnQiLCJhbW91bnQiLCJidXJuIiwiYnVybkZyb20iLCJhY2NvdW50IiwiY2xpZW50QWNjb3VudEJhbGFuY2UiLCJzZXJpYWxpemVkQWNjb3VudEJhbGFuY2UiLCJjbGllbnRBY2NvdW50SUQiLCJleHRyYWN0SWRzIiwiY29tcG9zZWQiLCJwa1Byb3BzIiwiZXh0cmFjdElkIiwiY29tcG9zZUF0dHJpYnV0ZVZhbHVlIiwiSWRlbnRpdHlDcmVkZW50aWFscyIsImRlc2NyaXB0aW9uIiwiRmFicmljTW9kZWxLZXlzIiwiSWRlbnRpdHlUeXBlIiwiRmFicmljRmxhdm91ciIsIklkZW50aXR5IiwiWDUwOSIsIm9uZVRvT25lIiwiQ2FzY2FkZSIsIkNBU0NBREUiLCJkZWxldGUiLCJDb3JlVXRpbHMiLCJsb2dnZXIiLCJNaW5pTG9nZ2VyIiwiY29udGVudE9mTG9hZEZpbGUiLCJjb250ZW50T3JQYXRoIiwiZmlsZVJlYWRlciIsIlVpbnQ4QXJyYXkiLCJtYXRjaCIsInJlYWRGaWxlIiwicHJvbWlzZXMiLCJub3JtYWxpemVJbXBvcnQiLCJpbXBvcnQiLCJnZXRDQVVzZXIiLCJ1c2VyTmFtZSIsInByaXZhdGVLZXkiLCJjZXJ0aWZpY2F0ZSIsIm9wdGlvbnMiLCJzdHJpbmdGb3JtYXQiLCJ1c2VyIiwiVXNlciIsImNvbmZpZyIsImhzbSIsInNvZnR3YXJlIiwibGliIiwibGlicmFyeSIsInNsb3QiLCJsYWJlbCIsInRva2VuTGFiZWwiLCJwaW4iLCJjcnlwdG9TdWl0ZSIsImdldENyeXB0b1N1aXRlIiwic2V0Q3J5cHRvU3VpdGUiLCJlbnJvbGxtZW50S2V5IiwiZ2V0SFNNRW5yb2xsbWVudEtleSIsImdldFNvZnR3YXJlRW5yb2xsbWVudEtleSIsInNldEVucm9sbG1lbnQiLCJuZXdDcnlwdG9TdWl0ZSIsImNyZWF0ZUtleUZyb21SYXciLCJza2kiLCJrZXlJZEhleCIsInRyaW0iLCJCdWZmZXIiLCJnZXRDZXJ0aWZpY2F0ZVNLSSIsImdldEtleSIsImlzUHJpdmF0ZSIsIng1MDkiLCJYNTA5Q2VydGlmaWNhdGUiLCJqd2siLCJwdWJsaWNLZXkiLCJleHBvcnQiLCJmb3JtYXQiLCJwcmVmaXgiLCJ4IiwieSIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJjb25jYXQiLCJkaWdlc3QiLCJnZXRJZGVudGl0eSIsImNlcnREaXJlY3RvcnlQYXRoIiwiaWRlbnRpdHlGaWxlUmVhZGVyIiwiY2VydFBhdGgiLCJnZXRGaXJzdERpckZpbGVOYW1lIiwiY3JlZGVudGlhbHMiLCJkaXJQYXRoIiwicmVhZGRpciIsImdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50IiwiZ2V0RmlsZUNvbnRlbnQiLCJnZXRTaWduZXIiLCJrZXlEaXJlY3RvcnlQYXRoIiwic2lnbmVyRmlsZVJlYWRlciIsImtleVBhdGgiLCJwcml2YXRlS2V5UGVtIiwiZXh0cmFjdFByaXZhdGVLZXkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJrIiwic2lnbmVycyIsIm5ld1ByaXZhdGVLZXlTaWduZXIiLCJwZW0iLCJsaWJOYW1lIiwic3VidGxlIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsIkNyeXB0byIsIndlYmNyeXB0byIsInN0cjJhYiIsImJ1ZiIsIkFycmF5QnVmZmVyIiwiYnVmVmlldyIsInN0ckxlbiIsImNoYXJDb2RlQXQiLCJyZXBsYWNlQWxsIiwiZGVjb2RlZCIsImJpbmFyeURlciIsImltcG9ydEtleSIsIm5hbWVkQ3VydmUiLCJnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCIsImNlcnQiLCJ4NTA5Q2VydGlmaWNhdGUiLCJYNTA5Q2VydCIsImFraUV4dCIsImV4dGVuc2lvbnMiLCJha2kiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0c1dpdGgiLCJzZXJpYWwiLCJzZXJpYWxOdW1iZXIiLCJjcnlwdG9Qcm92aWRlciIsInNldCIsIkJBU0VfQUxQSEFCRVQiLCJDUllQVE8iLCJCYXNlRW5jb2RlciIsImFscGhhYmV0IiwiYmFzZU1hcCIsImoiLCJjaGFyQXQiLCJ4YyIsImJhc2UiLCJsZWFkZXIiLCJmYWN0b3IiLCJNYXRoIiwiaUZhY3RvciIsImVuY29kZSIsInNvdXJjZSIsImlzVmlldyIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiemVyb2VzIiwicGJlZ2luIiwicGVuZCIsImI1OCIsImNhcnJ5IiwiaXQxIiwiaXQyIiwicmVwZWF0IiwiZGVjb2RlVW5zYWZlIiwicHN6IiwiYjI1NiIsIml0MyIsIml0NCIsInZjaCIsIkNyeXB0b1V0aWxzIiwiYjU4ZW5jb2RlciIsIkJBU0U1OCIsImZhYnJpY0lkRnJvbUNlcnRpZmljYXRlIiwic3ViamVjdCIsImlzc3VlciIsInN0cmluZ1RvQXJyYXlCdWZmZXIiLCJleHRyYWN0S2V5IiwidXNhZ2VzIiwiUmVnRXhwIiwiZXh0cmFjdFB1YmxpY0tleSIsInNpZ24iLCJidWZmIiwiaGFzaCIsImIiLCJwYWRTdGFydCIsInZlcmlmeSIsInNpZ25hdHVyZSIsImVuY3J5cHQiLCJnZXRTdWJ0bGVDcnlwdG8iLCJpc0Jyb3dzZXIiLCJkZWNyeXB0IiwiZ2V0TWFzdGVyIiwidGV4dEVuY29kZXIiLCJUZXh0RW5jb2RlciIsImdlbkdlbmVzaXMiLCJyYW5kb21VVUlEIiwiaW1wb3J0ZWRLZXkiLCJLRVlfQUxHT1JZVEhNIiwiaXYiLCJnZXREZXJpdmF0aW9uS2V5Iiwic2FsdCIsInNhbHRCdWZmZXIiLCJzYWx0SGFzaGVkIiwicGFyYW1zIiwiSEFTSCIsIml0ZXJhdGlvbnMiLCJJVEVSQVRJT05TIiwiZGVyaXZhdGlvbiIsImRlcml2ZUJpdHMiLCJLRVlMRU5HVEgiLCJpdmxlbiIsImtleWxlbiIsImRlcml2ZWRLZXkiLCJpbXBvcnRlZEVuY3J5cHRpb25LZXkiLCJBTEdPUllUSE0iLCJlbmNyeXB0UGluIiwidGV4dCIsImtleU9iamVjdCIsInRleHRCdWZmZXIiLCJlbmNyeXB0ZWRUZXh0IiwiZGVjcnlwdFBpbiIsInRleHREZWNvZGVyIiwiZGVjcnlwdGVkVGV4dCIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiaXNTaGFyZWQiLCJzZWdyZWdhdGUiLCJpc1RyYW5zaWVudCIsImRlY29yYXRlZFByb3BlcnRpZXMiLCJnZXRBdHRyaWJ1dGVzIiwidHJhbnNpZW50UHJvcHMiLCJEQktleXMiLCJUUkFOU0lFTlQiLCJwcml2YXRlUHJvcGVydGllcyIsIlBSSVZBVEUiLCJzaGFyZWRQcm9wZXJ0aWVzIiwiU0hBUkVEIiwicHVibGljIiwidHJhbnNpZW50S2V5cyIsInByaXZhdGVLZXlzIiwic2hhcmVkS2V5cyIsImlzUHVibGljIiwiYmluZCIsIm1pcnJvcmVkIiwiRkFCUklDIiwiTUlSUk9SIiwib3duZXJPZiIsIm1ldGEiLCJPV05FRF9CWSIsInNoYXJlZEtleSIsImNvbnN0ciIsInByaXZhdGVNZXRhIiwic2hhcmVkTWV0YSIsImNvbGxlY3Rpb25zIiwiY2hhaW5jb2RlT2YiLCJDSEFJTkNPREUiLCJwb3AiLCJjb250cmFjdE9mIiwiQ09OVFJBQ1QiLCJjaGFubmVsT2YiLCJDSEFOTkVMIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJEZWZhdWx0Q29udHJhY3RSZXNvbHZlciIsImNvbnRyYWN0IiwiY2hhaW5jb2RlIiwiY2hhbm5lbCIsImV4dHJhY3RNc3BJZCIsImdldE1TUElEIiwiT3duZXIiLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbE1ldGhvZCIsImFjb3VudElkIiwiY2xpZW50SWRlbnRpdHkiLCJnZXRJRCIsInNlbGVjdCIsInRva2VucyIsImV4ZWN1dGUiLCJhcHBseSIsIm93bmVkQnlPbkNyZWF0ZSIsImNvbnRleHQiLCJzdHViIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwib3duZWRCeSIsImF0dHJpYnV0ZSIsImdlbmVyYXRlZCIsInJlYWRvbmx5Iiwib25DcmVhdGUiLCJwcm9wTWV0YWRhdGEiLCJEZWNvcmF0aW9uIiwiZGVmaW5lIiwiZGVjb3JhdG9yIiwidHJhbnNhY3Rpb25JZE9uQ3JlYXRlIiwiZ2V0VHhJRCIsInRyYW5zYWN0aW9uSWQiLCJvblVwZGF0ZSIsIlRSQU5TQUNUSU9OX0lEIiwiZXZhbE1pcnJvck1ldGFkYXRhIiwiY3JlYXRlTWlycm9ySGFuZGxlciIsImZhYnJpY0N0eCIsInNvdXJjZU1vZGVsIiwicHV0IiwicmVwbyIsIm1pcnJvckNvbGxlY3Rpb24iLCJ1cGRhdGVNaXJyb3JIYW5kbGVyIiwiYXBwbHlVcGRhdGVWYWxpZGF0aW9uIiwibWVyZ2VGb3JVcGRhdGUiLCJkZWxldGVNaXJyb3JIYW5kbGVyIiwicGtQcm9wIiwic2VncmVnYXRlZCIsIm1pcnJvcldyaXRlR3VhcmQiLCJtc3AiLCJjb25kaXRpb24iLCJyZWFkTWlycm9ySGFuZGxlciIsIm1hdGNoZXMiLCJyZWFkRnJvbSIsIm1zcElkT3JDb25kaXRpb24iLCJpc0NvbmRpdGlvbk9ubHkiLCJCb29sZWFuIiwiY29uZCIsIm9uUmVhZCIsInByaW9yaXR5Iiwib25EZWxldGUiLCJNb2RlbENvbGxlY3Rpb24iLCJvcmdOYW1lIiwidG9QYXNjYWxDYXNlIiwiTmFtZXNwYWNlQ29sbGVjdGlvbiIsIm5hbWVzcGFjZSIsIkltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb24iLCJTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSIsImFwcGx5U2VncmVnYXRpb25GbGFncyIsImlzRnVsbHlTZWdyZWdhdGVkIiwiaGFzUHVibGljUHJvcGVydGllcyIsIm1hcmtGdWxseVNlZ3JlZ2F0ZWQiLCJhcHBseU1pcnJvckZsYWdzIiwiYXR0cmlidXRlcyIsInRyYW5zaWVudE1ldGEiLCJleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIiwiZGF0YUFycmF5IiwiY29sbGVjdGlvblJlc29sdmVyIiwia2V5QXJyYXkiLCJwa0tleSIsInBrU2VxTmFtZSIsInNlcXVlbmNlTmFtZSIsImlkVmFsdWUiLCJjYW5CdWlsZFBlckluc3RhbmNlIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInByb3BTZXFOYW1lIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsInJlbGF0aW9ucyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwicGFyc2VFdmVudE5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwic3ViIiwic2FmZVBhcnNlSW50Iiwic3RyaW5nIiwiZGlnaXRSZWdleCIsInRlc3QiLCJwYXJzZWRpbnQiLCJwYXJzZUludCIsImlzTmFOIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJwdXRBbmNob3IiLCJwcmVTZXJpYWxpemF0aW9uIiwiRmFicmljSWRlbnRpdHlTZXJ2aWNlIiwiQ2xpZW50QmFzZWRTZXJ2aWNlIiwicm9vdENsaWVudCIsIl91c2VyIiwiY2VydGlmaWNhdGVzIiwiYWZmaWxpYXRpb25zIiwiZ2V0VXNlciIsImNmZyIsIklOSVRJQUxJWkFUSU9OIiwiZ2V0TmFtZSIsInVwZGF0ZUlkZW50aXR5IiwiaWRlbnRpdHlSZXF1ZXN0IiwiY2FVc2VySWRlbnRpdHkiLCJyZWVucm9sbFVzZXIiLCJjcmVhdGVVc2VyIiwiZ2V0TXNwaWQiLCJlbnJvbGxtZW50QXR0cnMiLCJvcHRpb25hbCIsInJlZW5yb2xsIiwicmVuZXdlZElkZW50aXR5IiwicmV2b2tlT3B0aW9ucyIsInJldm9rZVJlcXVlc3QiLCJDQV9ST0xFIiwiRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIiwiZXZhbHVhdGVUaW1lb3V0IiwiZW5kb3JzZVRpbWVvdXQiLCJzdWJtaXRUaW1lb3V0IiwiY29tbWl0VGltZW91dCIsImFsbG93TWFudWFsRW5kb3JzaW5nT3JncyIsImFsbG93R2F0ZXdheU92ZXJyaWRlIiwiYWxsb3dDb250ZXh0VHJhbnNpZW50TWFwIiwiZW5jcnlwdFRyYW5zaWVudCIsInN5bnRoZXRpY0V2ZW50cyIsImNyZWF0ZVByaXZhdGVLZXkiLCJDTElFTlRfT1ZFUlJJREVfS0VZUyIsIkZhYnJpY0NsaWVudENvbnRleHQiLCJ0b092ZXJyaWRlcyIsImVzY2FwZVJlZ0V4cCIsIm5leHRMZXhpY29ncmFwaGljU3RyaW5nIiwiY2hhcnMiLCJjb2RlUG9pbnRBdCIsImZyb21Db2RlUG9pbnQiLCJwcmVmaXhSYW5nZSIsInN0YXJ0IiwiZW5kIiwiRmFicmljQ2xpZW50U3RhdGVtZW50IiwiU3RhdGVtZW50Iiwic3F1YXNoIiwic3F1YXNoZWQiLCJtZXRob2QiLCJleGVjdXRlUHJlcGFyZWQiLCJhcmd6IiwiZm9yTW9kZWwiLCJmcm9tU2VsZWN0b3IiLCJhbGlhcyIsIlFVRVJZIiwiaXNTaW1wbGVRdWVyeSIsIlF1ZXJ5Q2xhdXNlIiwid2hlcmVDb25kaXRpb24iLCJwYXJzZWQiLCJwcmVwYXJlQ29uZGl0aW9uIiwic2VsZWN0U2VsZWN0b3IiLCJTRUxFQ1QiLCJBTkQiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJzZWxlY3RvcktleSIsInJlYyIsIkNvdWNoREJPcGVyYXRvciIsIkJJR0dFUiIsImxpbWl0U2VsZWN0b3IiLCJDb3VjaERCUXVlcnlMaW1pdCIsIm9mZnNldFNlbGVjdG9yIiwic2tpcCIsIm1lcmdlIiwib3AiLCJvYmoxIiwib2JqMiIsImF0dHIxIiwib3BlcmF0b3IiLCJjb21wYXJpc29uIiwiT3BlcmF0b3IiLCJTVEFSVFNfV0lUSCIsIlF1ZXJ5RXJyb3IiLCJyYW5nZSIsIkJJR0dFUl9FUSIsIlNNQUxMRVIiLCJFTkRTX1dJVEgiLCJSRUdFWFAiLCJCRVRXRUVOIiwibWF4Iiwib3BCZXR3ZWVuIiwidHJhbnNsYXRlT3BlcmF0b3JzIiwiU01BTExFUl9FUSIsIkdyb3VwT3BlcmF0b3IiLCJOT1QiLCJvcDEiLCJvcDIiLCJhdmdTZWxlY3RvciIsInN1bUluZm8iLCJjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yIiwiY291bnRJbmZvIiwiY3JlYXRlQWdncmVnYXRlUXVlcnkiLCJraW5kIiwic3VtRGVzY3JpcHRvciIsImNvdW50RGVzY3JpcHRvciIsImNvdW50RGlzdGluY3RTZWxlY3RvciIsImNvdW50RGlzdGluY3QiLCJhZ2dyZWdhdG9yVXNlZCIsImNvdW50U2VsZWN0b3IiLCJtaW5TZWxlY3RvciIsIm1heFNlbGVjdG9yIiwic3VtU2VsZWN0b3IiLCJkaXN0aW5jdFNlbGVjdG9yIiwiYWdncmVnYXRvckNoZWNrcyIsIm1ldGFzIiwiZmluZFZpZXdNZXRhZGF0YSIsInZpZXdOYW1lIiwiZ2VuZXJhdGVWaWV3TmFtZSIsImRkb2MiLCJnZW5lcmF0ZURlc2lnbkRvY05hbWUiLCJyZXR1cm5Eb2NzIiwidmlldyIsImdldEZhYnJpY0FkYXB0ZXIiLCJpc1ZpZXdBZ2dyZWdhdGUiLCJoYW5kbGVBdmVyYWdlIiwiZmFicmljQWRhcHRlciIsInZpZXdJbmZvIiwicHJvY2Vzc1ZpZXdSZXNwb25zZSIsInN1bURlc2MiLCJjb3VudERlc2MiLCJzdW1SZXNwb25zZSIsImNvdW50UmVzcG9uc2UiLCJzdW0iLCJyb3dzIiwicm93IiwiRmFicmljQ2xpZW50QWRhcHRlciIsIkFkYXB0ZXIiLCJjaGFpbmNvZGVGb3IiLCJjaGFubmVsRm9yIiwiY29udHJhY3RGb3IiLCJvcGVyYXRpb24iLCJtZXJnZWRGbGFncyIsInNpbGx5IiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwic2VyaWFsaXplZE1vZGVscyIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImluamVjdFRyYW5zaWVudE92ZXJyaWRlcyIsInRyYW5zaWVudERhdGEiLCJoYXNUcmFuc2llbnREYXRhIiwiaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEiLCJzaG91bGRJbmplY3QiLCJPVkVSUklERVMiLCJpdGVtIiwiZGlyZWN0IiwiZGVzZXJpYWxpemVkIiwidXBkYXRlUHJlZml4IiwiVVBEQVRFIiwiREVMRVRFIiwiZG9jc09ubHkiLCJ0cmFuc2FjdGlvblJlc3VsdCIsInBhcnNlUmVjb3JkIiwiaXNNb2RlbCIsImVsIiwiZ2V0Q2xpZW50IiwiX2NsaWVudCIsIkdhdGV3YXkiLCJnZXRHYXRld2F5IiwiQ29udHJhY3QiLCJjbGF6ek9yQ29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInNob3VsZFVzZUxlZ2FjeUdhdGV3YXkiLCJsZWdhY3lBcmdzIiwicHJlcGFyZUxlZ2FjeUFyZ3MiLCJ0cmFuc2llbnRNYXAiLCJidWlsZExlZ2FjeVRyYW5zaWVudCIsInBlZXJDb25maWdzIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImdhdGV3YXkiLCJnZXRDb250cmFjdE5hbWUiLCJldmFsdWF0ZSIsIm5vcm1hbGl6ZWRBcmdzIiwibm9ybWFsaXplVHJhbnNhY3Rpb25Bcmd1bWVudCIsInRyYW5zaWVudEVudHJpZXMiLCJwcm9wb3NhbE9wdGlvbnMiLCJhcmd1bWVudHMiLCJjbG9zZSIsInJlc29sdmVMZWdhY3lNc3BDb3VudCIsImNvbmZpZ3VyZWQiLCJsZWdhY3lNc3BDb3VudCIsImlzRmluaXRlIiwiZmxvb3IiLCJwaWNrTGVnYWN5Q2FuZGlkYXRlcyIsImNhbmRpZGF0ZXMiLCJhdmFpbGFibGUiLCJwaWNrZWQiLCJpZHgiLCJyYW5kb20iLCJzZWxlY3Rpb24iLCJzcGxpY2UiLCJwZWVycyIsInBlZXJFbmRwb2ludCIsInBlZXJIb3N0QWxpYXMiLCJ0bHNDZXJ0IiwiZW5kb3JzZXJzIiwib3JnIiwiZXh0cmFzIiwibXNwTWFwIiwibGVnYWN5Q291bnQiLCJzZWxlY3Rpb25zIiwiY2hvaWNlIiwiZW5kcG9pbnQiLCJmY24iLCJub3JtYWxpemVMZWdhY3lQZWVycyIsImlkZW50aXR5TWF0ZXJpYWwiLCJyZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCIsIndhbGxldCIsIldhbGxldHMiLCJuZXdJbk1lbW9yeVdhbGxldCIsImlkZW50aXR5TGFiZWwiLCJjb25uZWN0aW9uUHJvZmlsZSIsImJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUiLCJMZWdhY3lHYXRld2F5IiwiY29ubmVjdCIsImRpc2NvdmVyeSIsImVuYWJsZWQiLCJhc0xvY2FsaG9zdCIsInNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdCIsInRsc0luZm8iLCJjaGFpbmNvZGVOYW1lIiwiY29udHJhY3ROYW1lIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjcmVhdGVUcmFuc2FjdGlvbiIsInNldFRyYW5zaWVudCIsInBlZXIiLCJnZXRDaGFubmVsIiwiZ2V0RW5kb3JzZXIiLCJlbmRvcnNlciIsInNldEVuZG9yc2luZ1BlZXJzIiwiZGlzY29ubmVjdCIsImRlZHVwZWQiLCJNYXAiLCJhZGRQZWVyIiwiaGFzIiwicmVhZFBlbUlucHV0IiwiY2VydENlcnRPckRpcmVjdG9yeVBhdGgiLCJrZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIiwicGVlckVudHJpZXMiLCJjaGFubmVsUGVlcnMiLCJvcmdzIiwidGxzUGVtIiwiaG9zdG5hbWUiLCJleHRyYWN0SG9zdCIsImVuc3VyZUdycGNVcmwiLCJ0bHNDQUNlcnRzIiwiZ3JwY09wdGlvbnMiLCJob3N0bmFtZU92ZXJyaWRlIiwiZW5kb3JzaW5nUGVlciIsImNoYWluY29kZVF1ZXJ5IiwibGVkZ2VyUXVlcnkiLCJldmVudFNvdXJjZSIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbnMiLCJvcmRlcmVycyIsImNoYW5uZWxzIiwiZXZlcnkiLCJpc0xvY2FsRW5kcG9pbnQiLCJob3N0Iiwic2FuaXRpemVkIiwiaXNCdWZmZXIiLCJ0cmltbWVkIiwic3RhdHMiLCJzdGF0IiwiY2F0Y2giLCJpc0RpcmVjdG9yeSIsInJlYWRGc0ZpbGUiLCJlcnIiLCJtaWdyYXRlIiwicmVmZXJlbmNlIiwibGFzdCIsInByb3ZpZGVkQ3R4IiwibWlncmF0aW9uQXJncyIsIk1JR1JBVElPTiIsInNodXRkb3duIiwiY2hhbm5lbE5hbWUiLCJnZXRDb25uZWN0aW9uIiwicGF0aE9yQ2VydCIsInJlYWRGaWxlU3luYyIsInRsc0NyZWRlbnRpYWxzIiwiZ3JwYyIsImNyZWF0ZVNzbCIsInNpemVMaW1pdCIsInNpZ25lciIsImV2YWx1YXRlT3B0aW9ucyIsImRlYWRsaW5lIiwiZW5kb3JzZU9wdGlvbnMiLCJzdWJtaXRPcHRpb25zIiwiY29tbWl0U3RhdHVzT3B0aW9ucyIsIlByb3h5IiwidGhpc0FyZyIsImFyZ0FycmF5IiwiUmVmbGVjdCIsIkRpc3BhdGNoIiwiR2F0ZXdheUVycm9yIiwiZGV0YWlscyIsIkVuZG9yc2VFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlBhZ2luZ0Vycm9yIiwiTWlncmF0aW9uRXJyb3IiLCJPYnNlcnZlckVycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJmaW5hbCIsIkQiLCJfYSIsImRlY29yYXRpb24iLCJzZXRDdXJyZW50IiwiRmFicmljQ2xpZW50RGlzcGF0Y2giLCJsb2dnZWRBcmdzIiwiU0hVVERPV04iLCJsaXN0ZW5pbmdTdGFjayIsInBhcnNlUGF5bG9hZCIsImpzb25CeXRlcyIsImpzb24iLCJvYnNlcnZlIiwib2JzZXJ2ZXIiLCJ1bk9ic2VydmUiLCJyZWZyZXNoIiwiaGFuZGxlRXZlbnRzIiwiY3R4QXJnIiwiY29ycmVsYXRpb25JZCIsImV2dCIsImV2ZW50TmFtZSIsIm1zcEV2ZW50T25seSIsInRhcmdldE1vZGVsIiwibW9kZWxSZWYiLCJvYnNlcnZlckFyZ3MiLCJnZXRDaGFpbmNvZGVFdmVudHMiLCJ0b1dyYXAiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYnVsa1RvU2luZ2xlIiwicmVzdWx0QXJncyIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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