sliftutils 1.7.113 → 1.7.115

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.
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true , configurable: true}
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const caching_1 = require("socket-function/src/caching");
9
9
  const misc_1 = require("socket-function/src/misc");
10
+ const format_1 = require("socket-function/src/formatting/format");
10
11
  const IArchives_1 = require("../IArchives");
11
12
  const ArchivesDisk_1 = require("../ArchivesDisk");
12
13
  const remoteConfig_1 = require("./remoteConfig");
@@ -782,7 +783,7 @@ class BlobStore {
782
783
  }
783
784
  throw new Error(`Undelete failed - nothing to restore. Cannot undelete ${JSON.stringify(key)} (store ${this.folder}): it has no marked deletion to restore - it was never deleted here${this.getDeletedEntry(key) && ", or its deletion history was already dropped (a plain tombstone remains, but the bytes are gone)" || ""}`);
784
785
  }
785
- console.log(`Undeleted ${JSON.stringify(key)} (store ${this.folder}): the index entry (${marked === null || marked === void 0 ? void 0 : marked.size} bytes, deleted ${marked && new Date(marked.deleteTime).toISOString()}) is live again as of ${new Date(writeTime).toISOString()} - the bytes never left the disk`);
786
+ console.log(`Undeleted ${JSON.stringify(key)} (store ${this.folder}): the index entry (${marked === null || marked === void 0 ? void 0 : marked.size} bytes, deleted ${marked && (0, format_1.formatDateTimeDetailed)(marked.deleteTime)}) is live again as of ${(0, format_1.formatDateTimeDetailed)(writeTime)} - the bytes never left the disk`);
786
787
  (0, storageLogs_1.logMutation)({ op: "undelete", folder: this.folder, store: this.storeName, path: key, size: marked === null || marked === void 0 ? void 0 : marked.size, writeTime, internal });
787
788
  (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.onIndexChanged) === null || _b === void 0 ? void 0 : _b.call(_a, key);
788
789
  if (internal)
@@ -915,8 +916,8 @@ class BlobStore {
915
916
  assertFreshWriteTarget(key, writeTime, route) {
916
917
  let timeValid = this.storeConfig.all().filter(x => writeTime >= x.validWindow[0] && writeTime < x.validWindow[1]);
917
918
  if (!timeValid.length) {
918
- logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(key)} (store ${this.folder}): writeTime ${writeTime} (${new Date(writeTime).toISOString()}) is outside all our valid windows ${JSON.stringify(this.storeConfig.all().map(x => x.validWindow))} (a switchover moved the write target)`);
919
- throw new Error(`${IArchives_1.STORAGE_WRONG_VALID_WINDOW} Write rejected: write time is outside our valid windows. Cannot write ${JSON.stringify(key)}: its write time ${writeTime} (${new Date(writeTime).toISOString()}) is outside every valid window of store ${JSON.stringify(this.storeName)} (windows: ${JSON.stringify(this.storeConfig.all().map(x => x.validWindow))}, folder ${this.folder}) - a switchover moved the write target. Re-resolve the currently valid source and retry.`);
919
+ logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(key)} (store ${this.folder}): writeTime ${writeTime} (${(0, format_1.formatDateTimeDetailed)(writeTime)}) is outside all our valid windows ${JSON.stringify(this.storeConfig.all().map(x => x.validWindow))} (a switchover moved the write target)`);
920
+ throw new Error(`${IArchives_1.STORAGE_WRONG_VALID_WINDOW} Write rejected: write time is outside our valid windows. Cannot write ${JSON.stringify(key)}: its write time ${writeTime} (${(0, format_1.formatDateTimeDetailed)(writeTime)}) is outside every valid window of store ${JSON.stringify(this.storeName)} (windows: ${JSON.stringify(this.storeConfig.all().map(x => x.validWindow))}, folder ${this.folder}) - a switchover moved the write target. Re-resolve the currently valid source and retry.`);
920
921
  }
921
922
  if (!timeValid.some(x => (0, remoteConfig_1.routeContains)(x.route, route))) {
922
923
  logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(key)} (store ${this.folder}): route ${route} is outside our routes ${JSON.stringify(timeValid.map(x => x.route || IArchives_1.FULL_ROUTE))} at writeTime ${writeTime} (the client's shard config is stale)`);
@@ -939,7 +940,7 @@ class BlobStore {
939
940
  return;
940
941
  let covered = this.storeConfig.all().some(x => writeTime >= x.validWindow[0] && writeTime < x.validWindow[1] && (0, remoteConfig_1.routeContains)(x.route, route));
941
942
  if (!covered) {
942
- throw new Error(`Internal write rejected - outside every configured window/route. Writing ${JSON.stringify(key)}: writeTime ${writeTime} (${new Date(writeTime).toISOString()}) at route ${route} is outside every window/route this store is configured for: ${JSON.stringify(this.storeConfig.all().map(x => ({ validWindow: x.validWindow, route: x.route || IArchives_1.FULL_ROUTE })))} (store ${this.folder})`);
943
+ throw new Error(`Internal write rejected - outside every configured window/route. Writing ${JSON.stringify(key)}: writeTime ${writeTime} (${(0, format_1.formatDateTimeDetailed)(writeTime)}) at route ${route} is outside every window/route this store is configured for: ${JSON.stringify(this.storeConfig.all().map(x => ({ validWindow: x.validWindow, route: x.route || IArchives_1.FULL_ROUTE })))} (store ${this.folder})`);
943
944
  }
944
945
  }
945
946
  /** Internal (store-to-store) read: purely the local disk, completely short-circuiting the index and holder resolution - the caller is another store, and chasing OUR remote holders while answering it is how infinite get loops between stores form. No window or route checks: if the bytes are on our disk, the caller may have them. Note this reads the disk past any write delay, so a fast write still buffered in memory is invisible here; the caller re-finds it once it flushes. */
@@ -1080,5 +1081,5 @@ class BlobStore {
1080
1081
  }
1081
1082
  }
1082
1083
  exports.BlobStore = BlobStore;
1083
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQW1OO0FBQ25OLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsd0RBQXFEO0FBQ3JELCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUM3RCwrQ0FBNkU7QUFFN0UscWdCQUFxZ0I7QUFFcmdCLG1OQUFtTjtBQUN0TSxRQUFBLHVCQUF1QixHQUFHLG1CQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3hELE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QywyR0FBMkc7QUFDM0csTUFBTSx1QkFBdUIsR0FBRyxZQUFZLENBQUM7QUFDN0MsMkdBQTJHO0FBQzNHLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFOUMsb01BQW9NO0FBQ3ZMLFFBQUEsaUJBQWlCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixtS0FBbUs7QUFDNUosS0FBSyxVQUFVLGdCQUFnQjtJQUNsQyxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDO0FBRkQsNENBRUM7QUFvQ0QsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsU0FBUyx1QkFBdUIsQ0FBQyxPQUFlO0lBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixHQUFHLHlCQUF5QjtRQUFFLE9BQU87SUFDeEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLElBQUEsNkJB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LENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsTUFBTSxhQUFhLE1BQUEsQ0FBQyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6SixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0tBQWdLO0lBQ3hKLGFBQWE7UUFDakIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNkpBQTZKO0lBQ3JKLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFlO1FBQzVDLEtBQUssSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE9BQU8sR0FBRyxJQUFBLDJCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7Q0FHSjtBQXRpQ0QsOEJBc2lDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVzU3luY1N0YXR1cywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBGaW5kQ29uZmlnLCBIb3N0ZWRDb25maWcsIFJlbW90ZUNvbmZpZywgU291cmNlQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLCBTeW5jQWN0aXZpdHksIEZVTExfUk9VVEUsIEZVTExfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrLCBhcHBseUZpbmRJbmZvU2hhcGUgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiwgcGFyc2VSb3V0aW5nRGF0YSwgc2VyaWFsaXplUmVtb3RlQ29uZmlnLCBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZywgZ2V0Q29uZmlnVmVyc2lvbiwgc291cmNlSWRlbnRpdHksIHNvdXJjZVBlcnNpc3RlbnRVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IHNlbGVjdEVudHJ5QXQgfSBmcm9tIFwiLi9zdG9yZVBsYW5cIjtcbmltcG9ydCB7IHNvdXJjZVdyaXRlRGVsYXkgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uRmlsZSB9IGZyb20gXCIuLi9UcmFuc2FjdGlvbkZpbGVcIjtcbmltcG9ydCB7IFNvdXJjZXNMaXN0IH0gZnJvbSBcIi4vc291cmNlc0xpc3RcIjtcbmltcG9ydCB7IFN0b3JlU3luYyB9IGZyb20gXCIuL3N0b3JlU3luY1wiO1xuaW1wb3J0IHsgU3RvcmVDb25maWcgfSBmcm9tIFwiLi9zdG9yZUNvbmZpZ1wiO1xuaW1wb3J0IHsgYXNEZWxheWVkLCB1bndyYXBEZWxheWVkIH0gZnJvbSBcIi4vQXJjaGl2ZXNEZWxheWVkXCI7XG5pbXBvcnQgeyBsb2dNdXRhdGlvbiwgbG9nU3RvcmFnZUVycm9yLCBsb2dTdG9yYWdlV2FybiB9IGZyb20gXCIuL3N0b3JhZ2VMb2dzXCI7XG5cbi8vIFRoZSBzdG9yYWdlIGVuZ2luZSBvZiB0aGUgcmVtb3RlIHN0b3JhZ2Ugc2VydmVyLiBEYXRhIGxpdmVzIGluIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzIChhdCBtaW5pbXVtIGFuIEFyY2hpdmVzRGlzaywgdGhlIGxvY2FsIGRpc2spOyBCbG9iU3RvcmUga2VlcHMgYW4gaW5kZXggb2YgZXZlcnkgZmlsZSAocGF0aCwgbGFzdCBtb2RpZmllZCB0aW1lLCBzaXplLCBhbmQgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YSkgaW4gYSBCdWxrRGF0YWJhc2UyLCBhbmQgYW5zd2VycyBldmVyeSByZWFkIGZyb20gaXQgKHNlZSBBcmNoaXZlc1NvdXJjZSBpbiBJQXJjaGl2ZXMudHMpLiBLZWVwaW5nIHRoYXQgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXMgaXMgU3RvcmVTeW5jJ3Mgam9iLCBub3QgdGhpcyBmaWxlJ3M7IHdoYXQgbGl2ZXMgaGVyZSBpcyB0aGUgaW5kZXggaXRzZWxmLCByZWFkcywgd3JpdGVzLCBhbmQgdGhlIHZhbGlkYXRpb24gYSB3cml0ZSBoYXMgdG8gcGFzcy5cblxuLy8gRmFzdCB3cml0ZXMgYXJlIG5ldmVyIGRlbGF5ZWQgcGFzdCBvdXIgb3duIHZhbGlkIHdpbmRvdywgYW5kIHdpdGhpbiB0aGlzIG1hcmdpbiBvZiB0aGUgd2luZG93J3MgZW5kIHRoZXkgd3JpdGUgdGhyb3VnaCBpbW1lZGlhdGVseSAtIHNvIHdoZW4gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIHRha2VzIG92ZXIsIHRoZSB3cml0ZXMgYXJlIGFscmVhZHkgb24gZGlza1xuZXhwb3J0IGNvbnN0IFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOID0gdGltZUluTWludXRlICogNTtcbmNvbnN0IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUgPSA2MCAqIDEwMDA7XG4vLyBNYXJrcyBhbiB1cGxvYWQgaWQgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBkaXNrLCBzbyBpdCBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIG9uZSBBcmNoaXZlc0Rpc2sgaGFuZGVkIG91dFxuY29uc3QgRElTQ0FSREVEX1VQTE9BRF9QUkVGSVggPSBcImRpc2NhcmRlZF9cIjtcbi8vIHNldCByZWZ1c2VzIGVtcHR5IGJ1ZmZlcnMsIGFuZCBhbiB1bmRlbGV0ZSBjYXJyaWVzIG5vIGRhdGEgLSB0aGlzIHNpbmdsZSBpZ25vcmVkIGJ5dGUgc2F0aXNmaWVzIHRoZSB3aXJlXG5jb25zdCBVTkRFTEVURV9QTEFDRUhPTERFUiA9IEJ1ZmZlci5mcm9tKFsxXSk7XG5cbi8vIERlbGV0aW9uIGhpc3Rvcnk6IGRlbGV0ZWQgZmlsZXMga2VlcCB0aGVpciBieXRlcyBvbiBkaXNrIChtYXJrZWQgaW4gdGhlIGluZGV4KSB1bnRpbCB0aGUgaGlzdG9yeSBvdXRncm93cyBtYXgoSElTVE9SWV9NSU5fQllURVMsIGxpdmUgYnl0ZXMgKiBoaXN0b3J5IGZhY3RvcikgLSBzZWUgU3RvcmVTeW5jLmVuZm9yY2VIaXN0b3J5TGltaXRcbmV4cG9ydCBjb25zdCBISVNUT1JZX01JTl9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQgKiAxMDI0O1xuY29uc3QgSElTVE9SWV9GQUNUT1IgPSAxO1xuLyoqIFRoZSBtdWx0aXBsZSBvZiBhIHN0b3JlJ3MgbGl2ZSBieXRlcyBpdHMgZGVsZXRpb24gaGlzdG9yeSBtYXkgZ3JvdyB0by4gQXN5bmMgc28gaXQgY2FuIGxhdGVyIGJlY29tZSBkeW5hbWljIGFuZCB1c2VyLWNvbmZpZ3VyYWJsZTsgZm9yIG5vdyBpdCBpcyBhIGNvbnN0YW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhpc3RvcnlGYWN0b3IoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gSElTVE9SWV9GQUNUT1I7XG59XG5cblxuLyoqIFdoYXQgd2Ugc3RvcmUgYWJvdXQgYSBmaWxlLiBJdHMgdGltZXMgYXJlIG5vdCBpbiBoZXJlOiB0aGUgaW5kZXgga2VlcHMgdGhvc2UgZm9yIGV2ZXJ5IGtleSwgZGVsZXRlZCBvbmVzIGluY2x1ZGVkIChzZWUgVHJhbnNhY3Rpb25GaWxlKS4gKi9cbnR5cGUgSW5kZXhWYWx1ZSA9IHtcbiAgICBzaXplOiBudW1iZXI7XG4gICAgLy8gV2hpY2ggc3luY2hyb25pemF0aW9uIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgdGhlIGRhdGE6IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc291cmNlJ3MgVVJMIGluIHRoZSBzdG9yZSdzIGFwcGVuZC1vbmx5IHNvdXJjZXMgbGlzdCAoc2VlIFNvdXJjZXNMaXN0KSAtIE5PVCBhIHBvc2l0aW9uIGluIHRoZSBpbi1tZW1vcnkgc291cmNlcyBhcnJheSwgd2hpY2ggY2hhbmdlcyBiZXR3ZWVuIHJ1bnNcbiAgICBzb3VyY2VzTGlzdEluZGV4OiBudW1iZXI7XG59O1xuXG4vKiogT25lIGZpbGUgd2UgaG9sZCwgYXMgZXZlcnl0aGluZyBvdXRzaWRlIHRoZSBpbmRleCBzZWVzIGl0LiAqL1xuZXhwb3J0IHR5cGUgSW5kZXhFbnRyeSA9IEluZGV4VmFsdWUgJiB7XG4gICAgd3JpdGVUaW1lOiBudW1iZXI7XG4gICAgLy8gV2hlbiBXRSBsYXN0IGNoYW5nZWQgdGhpcyBlbnRyeSAobm90IHRoZSBmaWxlJ3Mgd3JpdGUgdGltZSkg4oCUIHdoYXQgZ2V0Q2hhbmdlc0FmdGVyMiBmaWx0ZXJzIG9uLCBzbyBsYXRlLWFycml2aW5nIGZpbGVzIHdpdGggb2xkIHdyaXRlIHRpbWVzIGFyZSBzdGlsbCByZXBvcnRlZFxuICAgIGNoYW5nZWRBdDogbnVtYmVyO1xufTtcblxuLy8gT25lIHNvdXJjZSBvZiBhIGxpdmUgc291cmNlLWxpc3QgdXBkYXRlOyBzZWUgQmxvYlN0b3JlLnVwZGF0ZVNvdXJjZXNcbmV4cG9ydCB0eXBlIEJsb2JTb3VyY2VTcGVjID0ge1xuICAgIC8vIE1hdGNoZWQgYWdhaW5zdCBBcmNoaXZlc1NvdXJjZS5pZGVudGl0eSAoXCJkaXNrXCIgZm9yIHRoZSBiYXNlIHNsb3QpOyBlcXVhbCBpZGVudGl0aWVzIHBhaXIgb2ZmIGluIG9yZGVyXG4gICAgaWRlbnRpdHk6IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2UudXJsXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdmFsaWRXaW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW107XG4gICAgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIG5vRnVsbFN5bmM/OiBib29sZWFuO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS5pbnRlcm1lZGlhdGVcbiAgICBpbnRlcm1lZGlhdGU/OiBzdHJpbmc7XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLnNvdXJjZUNvbmZpZyAoYWJzZW50IGZvciB0aGUgYmFzZSBkaXNrIHNvdXJjZSlcbiAgICBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7XG4gICAgLy8gT25seSBjYWxsZWQgZm9yIHNvdXJjZXMgdGhhdCBkb24ndCBtYXRjaCBhbiBleGlzdGluZyBsaXZlIHNsb3RcbiAgICBjcmVhdGU6ICgpID0+IElBcmNoaXZlcztcbiAgICAvLyBUaGUgb3Bwb3NpdGUgY2FzZTogdGhlIGVuZHBvaW50IGlzIGFscmVhZHkgcnVubmluZyBhbmQgb25seSBpdHMgY29uZmlnIGNoYW5nZWQsIHNvIHRoZSBSVU5OSU5HIHNvdXJjZSBpcyBoYW5kZWQgdGhlIG5ldyBvbmUgKHNlZSBhcHBseVNvdXJjZUNvbmZpZylcbiAgICBhcHBseUNvbmZpZz86IChzb3VyY2U6IElBcmNoaXZlcykgPT4gdm9pZDtcbn07XG5cbmxldCBsYXN0V3JvbmdUYXJnZXRMb2cgPSAwO1xuZnVuY3Rpb24gbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0V3JvbmdUYXJnZXRMb2cgPCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFKSByZXR1cm47XG4gICAgbGFzdFdyb25nVGFyZ2V0TG9nID0gRGF0ZS5ub3coKTtcbiAgICBsb2dTdG9yYWdlRXJyb3IobWVzc2FnZSk7XG59XG5cbi8vIFRoZSBidWNrZXQgc3RvcmUsIGFuZCB0aGUgb25seSBvbmU6IGV2ZXJ5IGJ1Y2tldCBhIHNlcnZlciBob2xkcyBpcyBzZXJ2ZWQgYnkgdGhlc2UsIG9uZSBwZXIgc3RvcmUgbmFtZSBpbiBpdHMgcm91dGluZyBjb25maWcuIEl0cyBzb3VyY2VzIGFyZSBwbGFpbiBJQXJjaGl2ZXMgLSB0aGUgZmlyc3QgaXMgYWx3YXlzIHRoZSBzdG9yZSdzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBjb25maWd1cmVkIHBlZXJzIChzZWUgY3JlYXRlU3RvcmVTb3VyY2UpIC0gc28gXCJubyBzeW5jaHJvbml6YXRpb25cIiBpcyBzaW1wbHkgYSBzdG9yZSB3aXRoIG5vIHBlZXJzLCBub3QgYSBkaWZmZXJlbnQga2luZCBvZiBzdG9yZS5cbmV4cG9ydCBjbGFzcyBCbG9iU3RvcmUge1xuICAgIC8vIOKUgOKUgCBzdGF0ZSDilIDilIBcbiAgICAvLyBTZXQgb25jZSB0aGUgc3RvcmUgaXMgc2h1dHRpbmcgZG93bjsgZXZlcnkgbG9vcCBpdCBvd25zIChhbmQgU3RvcmVTeW5jJ3MgbWFpbnRlbmFuY2UgbG9vcHMpIHN0b3BzIG9uIGl0XG4gICAgcHVibGljIHN0b3BwZWQgPSB7IHN0b3A6IGZhbHNlIH07XG4gICAgLy8gV2hldGhlciBpbml0IGhhcyByZWFjaGVkIHRoZSBwb2ludCB3aGVyZSBhIG5ld2x5IGFkZGVkIHNvdXJjZSBjYW4gc3RhcnQgc2Nhbm5pbmcgaW1tZWRpYXRlbHlcbiAgICBwdWJsaWMgc3luY1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAvKiogSXRzIHNvdXJjZXMsIGluIGNvbmZpZyBvcmRlcjogc2xvdCAwIGlzIGFsd2F5cyBpdHMgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIHBlZXJzIGl0IHN5bmNocm9uaXplcyB3aXRoLiBGaWxsZWQgYnkgdXBkYXRlU291cmNlcywgd2hpY2ggaXMgYWxzbyBob3cgdGhleSBjaGFuZ2UuIFRoZSBzdG9yZSBPV05TIHRoZW0gLSB3cml0ZXMgcGljayBhbW9uZyB0aGVtLCByZWFkcyByZXNvbHZlIGhvbGRlcnMgdGhyb3VnaCB0aGVtIC0gYW5kIFN0b3JlU3luYyBvbmx5IHNjYW5zIHdoYXRldmVyIGlzIGluIGhlcmUgYXQgdGhlIHRpbWUuICovXG4gICAgcHVibGljIHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10gPSBbXTtcbiAgICAvLyBVcGxvYWRzIGltbXV0YWJpbGl0eSBhbHJlYWR5IGRlY2lkZWQgYWdhaW5zdDogdGhlIGNsaWVudCBpcyBtaWQtc3RyZWFtIGJ5IHRoZSB0aW1lIHdlIGtub3csIHNvIGl0IGtlZXBzIHNlbmRpbmcgYW5kIGV2ZXJ5IHBhcnQgaXMgZHJvcHBlZFxuICAgIHByaXZhdGUgZGlzY2FyZGVkVXBsb2FkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgbmV4dERpc2NhcmRlZFVwbG9hZCA9IDE7XG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgaWRlbnRpdGllcyBiZWhpbmQgSW5kZXhFbnRyeS5zb3VyY2VzTGlzdEluZGV4IChzZWUgU291cmNlc0xpc3QpXG4gICAgcHJpdmF0ZSBzb3VyY2VzTGlzdDogU291cmNlc0xpc3Q7XG4gICAgLy8gUGVyIHNsb3Q6IHRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgdGhhdCBzbG90J3MgVVJMLCBmaWxsZWQgYnkgcmVnaXN0ZXJTbG90IGJlZm9yZSB0aGUgc2xvdCdzIHN5bmMgcnVuc1xuICAgIHByaXZhdGUgc2xvdFNvdXJjZXNMaXN0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHNsb3RSZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAvLyBFdmVyeSBmaWxlIHdlIGtub3cgb2YsIGluIG1lbW9yeSwgd2l0aCBhbiBhcHBlbmQtb25seSBsb2cgb2YgdGhlIGNoYW5nZXMgYmVoaW5kIGl0IChzZWUgVHJhbnNhY3Rpb25GaWxlKS4gQSBuZXcgZmlsZSBuYW1lIGVhY2ggdGltZSB0aGUgZW50cnkgZm9ybWF0IGNoYW5nZXMgZ2VuZXJhdGlvbjogdGhlIHByZXZpb3VzIG9uZXMgY2Fubm90IGJlIHJlYWQsIGFuZCBhIHNjYW4gcmVidWlsZHMgdGhlIGluZGV4IGFueXdheSwgc28gdGhleSBhcmUgc2ltcGx5IG5ldmVyIHJlYWQgYWdhaW4uXG4gICAgcHJpdmF0ZSBpbmRleDogVHJhbnNhY3Rpb25GaWxlPEluZGV4VmFsdWU+O1xuICAgIC8qKiBLZWVwaW5nIHRoZSBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlczogc2Nhbm5pbmcsIHB1bGxpbmcsIHB1c2hpbmcsIGFuZCB0aGUgbWFpbnRlbmFuY2UgdGhhdCBmb2xsb3dzIGZyb20gaG9sZGluZyBhbiBpbmRleCAoZGlzay1saW1pdCBldmljdGlvbiwgdG9tYnN0b25lIGV4cGlyeSkuIEl0IHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzdG9yZSdzIGluZGV4IGFuZCBzb3VyY2VzIC0gaXQgZG9lcyBub3Qgb3duIHRoZW0uICovXG4gICAgcHVibGljIHN5bmM6IFN0b3JlU3luYztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvLyBQdWJsaWMgZm9yIFN0b3JlU3luYywgd2hpY2ggbG9ncyBpdCB3aXRoIGV2ZXJ5dGhpbmcgaXQgZG9lc1xuICAgICAgICBwdWJsaWMgZm9sZGVyOiBzdHJpbmcsXG4gICAgICAgIC8qKiBUaGUgbmFtZSB0aGlzIHN0b3JlIGFuc3dlcnMgdG8gKHNlZSBDb21tb25Db25maWcubmFtZSkgLSB0aGUgZW50cmllcyBvZiB0aGUgcm91dGluZyBjb25maWcgdGhhdCBjYXJyeSBpdCBhcmUgdGhlIG9uZXMgdGhhdCBjb25maWd1cmUgaXQsIGFuZCB0aGUgcmVzdCBhcmUgaXRzIHBlZXJzLiAqL1xuICAgICAgICBwdWJsaWMgc3RvcmVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29uZmlnPzoge1xuICAgICAgICAgICAgLyoqIFdoZXRoZXIgYSBjb25maWcgZW50cnkgaXMgVEhJUyBTRVJWRVIgKHNhbWUgYWNjb3VudCwgc2FtZSBidWNrZXQsIG91ciBvd24gYWRkcmVzcykuIEluamVjdGVkIGJlY2F1c2UgYSBzdG9yZSBrbm93cyBub3RoaW5nIGFib3V0IHNlcnZlcnMgLSBpdCBvbmx5IG5lZWRzIHRvIHRlbGwgaXRzIG93biBlbnRyaWVzIGFwYXJ0IGZyb20gaXRzIHBlZXJzJy4gQWJzZW50IG1lYW5zIG5vdGhpbmcgaXMgdXMsIHdoaWNoIGlzIHdoYXQgYSBiYXJlIHN0b3JlIChubyBzZXJ2ZXIgYXJvdW5kIGl0KSB3YW50cy4gKi9cbiAgICAgICAgICAgIGlzU2VsZj86IChzb3VyY2U6IFNvdXJjZUNvbmZpZykgPT4gYm9vbGVhbjtcbiAgICAgICAgICAgIC8qKiBCdWlsZHMgb25lIG9mIGl0cyBzb3VyY2VzLiBJbmplY3RlZCBmb3IgdGhlIHNhbWUgcmVhc29uLCBhbmQgYmVjYXVzZSB0aGUgZGVsYXkgaXQgaXMgY3JlYXRlZCB3aXRoIGlzIHRoaXMgc3RvcmUncyBwb2xpY3kuICovXG4gICAgICAgICAgICBjcmVhdGVTb3VyY2U/OiAoY29uZmlnOiB7IHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZzsgd3JpdGVEZWxheTogbnVtYmVyIH0pID0+IElBcmNoaXZlcztcbiAgICAgICAgICAgIC8qKiBIYW5kcyBhIHJ1bm5pbmcgc291cmNlIGEgY2hhbmdlZCBjb25maWcsIHNvIGFuIGVuZHBvaW50IHdlIGFscmVhZHkgdGFsayB0byBpcyBuZXZlciByZWJ1aWx0IGp1c3QgYmVjYXVzZSBhIGZsYWcgbW92ZWQuICovXG4gICAgICAgICAgICBhcHBseVNvdXJjZT86IChzb3VyY2U6IElBcmNoaXZlcywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHdyaXRlRGVsYXk6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhIGtleSdzIGluZGV4IGVudHJ5IGNoYW5nZXMgKG91ciBvd24gd3JpdGVzIEFORCBmaWxlcyBwdWxsZWQgaW4gdmlhIHN5bmNocm9uaXphdGlvbikg4oCUIGhvdyB0aGUgc3RvcmFnZSBzZXJ2ZXIgbm90aWNlcyByb3V0aW5nIGNvbmZpZyB1cGRhdGVzLlxuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ/OiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhpcyBzdG9yZSBhcHBsaWVzIGEgcm91dGluZyBjb25maWcgdG8gaXRzZWxmIChzdGFydHVwLCBhbiBvcGVyYXRvcidzIHdyaXRlLCBhIHBlZXIncyBjb3B5IGFycml2aW5nKSAtIHRoZSBzdG9yZSBpcyB0aGUgb25lIHRoYXQga25vd3Mgd2hlbiBhIGNvbmZpZyBsYW5kZWQsIGFuZCB0aGUgc2VydmVyIGFybXMgd2luZG93LWJvdW5kYXJ5IHNjYW5zIGZyb20gaXQuICovXG4gICAgICAgICAgICBvblJvdXRpbmdBcHBsaWVkPzogKHJvdXRpbmc6IFJlbW90ZUNvbmZpZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBBc2tzIHRoZSBjbGllbnQgd2hvc2UgcmVxdWVzdCBjcmVhdGVkIHRoaXMgc3RvcmUgd2hhdCByb3V0aW5nIGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUuIE9ubHkgdXNlZCB3aGVuIGluaXQgZmluZHMgTk8gY29uZmlndXJhdGlvbiBpbiBvdXIgZm9sZGVyOiBhIHN0b3JlIG9ubHkgZXZlciBleGlzdHMgYmVjYXVzZSBhIGNvbmZpZyBuYW1lcyBpdCwgc28gdGhlIHJlcXVlc3RlciBoYXMgdGhhdCBjb25maWcgLSBhc2tpbmcgZm9yIGl0IGxhemlseSBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyBwYXNzaW5nIHRoZSBjb25maWcgb24gZXZlcnkgY2FsbCwgd2l0aG91dCB0aGUgcGVyLWNhbGwga2lsb2J5dGVzLiAqL1xuICAgICAgICAgICAgcmVxdWVzdFJvdXRpbmdDb25maWc/OiAoKSA9PiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD47XG4gICAgICAgICAgICAvLyBFdmVyeSBhY2NlcHRlZCB3cml0ZSAoXCJvcmlnaW5hbFwiKSBhbmQgZXZlcnkgd3JpdGUgdGhhdCBhY3R1YWxseSByZWFjaGVkIHRoZSBzb3VyY2VzIChcImZsdXNoZWRcIikuIEZhc3Qgd3JpdGVzIGNvYWxlc2NlLCBzbyB0aGUgdHdvIGNvdW50cyBkaWZmZXIuXG4gICAgICAgICAgICBvbldyaXRlQ291bnRlZD86IChraW5kOiBcIm9yaWdpbmFsXCIgfCBcImZsdXNoZWRcIiwgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBBIHN5bmNocm9uaXphdGlvbiB0cmFuc2ZlcjogXCJzeW5jIGdldFwiIGlzIGJ5dGVzIHB1bGxlZCBvZmYgYSBzb3VyY2UgKHRoZSBiYWNrYmxhemUgZG93bmxvYWQgYmlsbCksIFwic3luYyBzZXRcIiBpcyBieXRlcyBwdXNoZWQgdG8gb25lLiBJbmplY3RlZCBiZWNhdXNlIHN5bmMgdHJhZmZpYyBuZXZlciBwYXNzZXMgdGhyb3VnaCB0aGUgQVBJIGNvbnRyb2xsZXIsIHNvIG5vdGhpbmcgZWxzZSBjYW4gY291bnQgaXQuICovXG4gICAgICAgICAgICBvblN5bmNUcmFuc2Zlcj86IChvcGVyYXRpb246IFwic3luYyBnZXRcIiB8IFwic3luYyBzZXRcIiwgcGF0aDogc3RyaW5nLCBieXRlczogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLy8gUmVzb2x2ZXMgYSBwZXJzaXN0ZWQgc291cmNlIFVSTCAoc2VlIEFyY2hpdmVzU291cmNlLnVybCkgdG8gYSBjYWNoZWQgSUFyY2hpdmVzLCBzbyBlbnRyaWVzIHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgY29uZmlndXJlZCBjYW4gc3RpbGwgYmUgcmVhZFxuICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZVVybD86ICh1cmw6IHN0cmluZykgPT4gSUFyY2hpdmVzO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIHRoaXMuc291cmNlc0xpc3QgPSBuZXcgU291cmNlc0xpc3QocGF0aC5qb2luKGZvbGRlciwgXCJpbmRleFwiLCBcInNvdXJjZXNMaXN0LnR4dFwiKSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXcgVHJhbnNhY3Rpb25GaWxlPEluZGV4VmFsdWU+KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJibG9iSW5kZXgzLmxvZ1wiKSk7XG4gICAgICAgIHRoaXMuc3luYyA9IG5ldyBTdG9yZVN5bmModGhpcyk7XG4gICAgICAgIHRoaXMuc3RvcmVDb25maWcgPSBuZXcgU3RvcmVDb25maWcoc3RvcmVOYW1lLCBbXSk7XG4gICAgICAgIHRoaXMub3duRGlzayA9IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKTtcbiAgICB9XG5cbiAgICAvKiogVGhpcyBzdG9yZSdzIGZvbGRlciwgdW53cmFwcGVkOiB0aGUgc2FtZSBieXRlcyBzbG90IDAgc2VydmVzLCBidXQgcmVhY2hlZCB3aXRob3V0IGl0cyB3cml0ZSBkZWxheS4gVXNlZCBmb3IgdGhlIHR3byB0aGluZ3MgdGhhdCBjYW5ub3QgZ28gdGhyb3VnaCBhIGJ1ZmZlcmVkIHNvdXJjZSAtIHJlYWRpbmcgb3VyIG93biByb3V0aW5nIGNvbmZpZyBiZWZvcmUgd2UgaGF2ZSBhbnkgc291cmNlcywgYW5kIHN0cmVhbWluZyBhIGxhcmdlIHVwbG9hZCB0aGF0IG11c3Qgbm90IHNpdCBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBvd25EaXNrOiBBcmNoaXZlc0Rpc2s7XG5cbiAgICAvKiogV2hhdCB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgdG8gYmUuIEl0IG93bnMgdGhpczogdGhlIHJvdXRpbmcgY29uZmlnIGlzIGEgZmlsZSBJTiB0aGUgc3RvcmUsIHNvIHRoZSBzdG9yZSByZWFkcyBpdCwgYXBwbGllcyBpdCB0byBpdHNlbGYsIGFuZCByZS1hcHBsaWVzIGl0IHdoZW5ldmVyIHRoZSBmaWxlIGNoYW5nZXMgLSBieSBvdXIgb3duIHdyaXRlLCBvciBieSBhIHBlZXIncyBjb3B5IGFycml2aW5nIHRocm91Z2ggc3luY2hyb25pemF0aW9uLiAqL1xuICAgIHB1YmxpYyBzdG9yZUNvbmZpZzogU3RvcmVDb25maWc7XG4gICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIHRoaXMgc3RvcmUgbGFzdCBhcHBsaWVkLCBzbyBhIHdyaXRlIG9mIGFuIGlkZW50aWNhbCAob3Igb2xkZXIpIG9uZSBpcyBub3QgcmUtYXBwbGllZFxuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmdWZXJzaW9uID0gLTE7XG4gICAgLy8gLi4uYW5kIHRoZSBjb25maWcgaXRzZWxmLCBzbyBhIHJlamVjdGlvbiBjYW4gc2F5IGV4YWN0bHkgd2hhdCB0aGUgc3RvcmUgSVMgcnVubmluZyBpbnN0ZWFkIG9mIGd1ZXNzaW5nXG4gICAgcHJpdmF0ZSBhcHBsaWVkUm91dGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gI3JlZ2lvbiBNYWluIGludGVyZmFjZVxuXG4gICAgcHVibGljIGluaXQgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ29uZmlndXJlIGZpcnN0OiB0aGUgY29uZmlnIGRlY2lkZXMgd2hhdCB0aGUgc291cmNlcyBBUkUsIGFuZCBldmVyeXRoaW5nIGJlbG93IGlzIHBlciBzb3VyY2UuIFdpdGggbm8gY29uZmlnIGF0IGFsbCB0aGF0IGlzIGp1c3Qgb3VyIG93biBkaXNrLCB3aGljaCBpcyBlbm91Z2ggdG8gc2VydmUgYW5kIHRvIGJlIHdyaXR0ZW4gdG8uXG4gICAgICAgIGF3YWl0IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIC8vIE5vIGNvbmZpZ3VyYXRpb24gaW4gb3VyIGZvbGRlciBhdCBhbGwgLSB3aGljaCBoYXBwZW5zIHdoZW4gdGhpcyBzdG9yZSB3YXMganVzdCBDUkVBVEVEIGJ5IGEgcmVxdWVzdCwgYmVmb3JlIGFueSBjb25maWcgd3JpdGUgcmVhY2hlZCBpdC4gVGhlIHJlcXVlc3RlciBrbm93cyBleGFjdGx5IHdoYXQgY29uZmlnIGl0IGludGVuZGVkIGZvciBvdXIgbmFtZSwgc28gYXNrIGl0LlxuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoICYmIHRoaXMuY29uZmlnPy5yZXF1ZXN0Um91dGluZ0NvbmZpZykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvdmlkZWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5yZXF1ZXN0Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIGlmIChwcm92aWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbjsgdGhlIHJlcXVlc3RpbmcgY2xpZW50IHByb3ZpZGVkIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHByb3ZpZGVkKX0gLSBhZG9wdGluZyBpdGApO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJhaWdodCBvbnRvIHRoZSBkaXNrLCBub3QgdGhyb3VnaCBzZXQoKTogc2V0IHdhaXRzIGZvciBpbml0LCB3aGljaCBpcyB3aGF0IGlzIHJ1bm5pbmcgcmlnaHQgbm93XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub3duRGlzay5zZXQoUk9VVElOR19GSUxFLCBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcocHJvdmlkZWQpKSwgeyBsYXN0TW9kaWZpZWQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nU3RvcmFnZVdhcm4oYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgcmVxdWVzdGluZyBjbGllbnQgaGFkIG5vIHJvdXRpbmcgY29uZmlnIG5hbWluZyBpdCBlaXRoZXIgLSBydW5uaW5nIHVuY29uZmlndXJlZGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYEFza2luZyB0aGUgcmVxdWVzdGluZyBjbGllbnQgZm9yIHRoZSByb3V0aW5nIGNvbmZpZyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIC0gcnVubmluZyB1bmNvbmZpZ3VyZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJTbG90KGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFmdGVyIHRoZSBzbG90cywgd2hpY2ggaXMgd2hhdCBpbmRleCBlbnRyaWVzIG5hbWUgYXMgdGhlaXIgaG9sZGVyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEluZGV4KCk7XG4gICAgICAgIHRoaXMuc3luY1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlLXJlYWRzIHRoZSByb3V0aW5nIGNvbmZpZyBvdXQgb2YgdGhpcyBzdG9yZSBhbmQgYXBwbGllcyBpdCB0byBpdHNlbGYuIENhbGxlZCBhdCBzdGFydHVwIGFuZFxuICAgICAqIHdoZW5ldmVyIHRoYXQgZmlsZSBjaGFuZ2VzIGhlcmUgLSB3aGljaCBpcyB0aGUgT05FIG1lY2hhbmlzbTogYSBjb25maWcgd3JpdHRlbiBieSBhbiBvcGVyYXRvclxuICAgICAqIGFuZCBhIGNvbmZpZyBwdWxsZWQgb2ZmIGEgcGVlciBhcmUgdGhlIHNhbWUgZXZlbnQsIGEgd3JpdGUgb2YgdGhhdCBwYXRoIGludG8gdGhpcyBzdG9yZS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgd2l0aCBubyByb3V0aW5nIGNvbmZpZyBjb25maWd1cmVzIGl0c2VsZiBhcyBpdHMgb3duIGRpc2ssIHZhbGlkIGFsd2F5cywgZm9yIHRoZSB3aG9sZVxuICAgICAqIGtleSBzcGFjZS4gVGhhdCBpcyBhIGNvbXBsZXRlLCB3b3JraW5nIHN0b3JlIC0gaXQganVzdCBoYXMgbm9ib2R5IHRvIHN5bmNocm9uaXplIHdpdGggLSBhbmQgaXRcbiAgICAgKiBpcyB3aGF0IGxldHMgYSBzdG9yZSBleGlzdCBiZWZvcmUgaXQgaGFzIGV2ZXIgaGVhcmQgb2YgYSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhcHBseVJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByb3V0aW5nID0gYXdhaXQgdGhpcy5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICBsZXQgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcbiAgICAgICAgbGV0IHBlZXJzOiBTb3VyY2VDb25maWdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygcm91dGluZz8uc291cmNlcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5uYW1lID09PSB0aGlzLnN0b3JlTmFtZSAmJiB0aGlzLmNvbmZpZz8uaXNTZWxmPy4oc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChzb3VyY2UgYXMgSG9zdGVkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlZXJzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGluZyAmJiAhZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1N0b3JhZ2VXYXJuKGBUaGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSkgZG9lcyBub3QgbmFtZSB0aGlzIHN0b3JlICgke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0pIGFzIG9uZSBvZiBvdXJzLCBzbyBpdCBzdGF5cyBhIGRpc2stb25seSBzdG9yZWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmV2aW91c1ZlcnNpb24gPSB0aGlzLmFwcGxpZWRSb3V0aW5nVmVyc2lvbjtcbiAgICAgICAgbGV0IG5ld1ZlcnNpb24gPSByb3V0aW5nICYmIGdldENvbmZpZ1ZlcnNpb24ocm91dGluZykgfHwgLTE7XG4gICAgICAgIGlmIChuZXdWZXJzaW9uICE9PSBwcmV2aW91c1ZlcnNpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgYWRvcHRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7cHJldmlvdXNWZXJzaW9ufSAtPiAke25ld1ZlcnNpb259OiAke2VudHJpZXMubGVuZ3RofSBlbnRyJHtlbnRyaWVzLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBvZiBvdXJzICR7SlNPTi5zdHJpbmdpZnkoZW50cmllcy5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfSwgJHtwZWVycy5sZW5ndGh9IHBlZXIocylgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnLnVwZGF0ZShlbnRyaWVzKTtcbiAgICAgICAgdGhpcy51cGRhdGVTb3VyY2VzKHRoaXMucGxhblNvdXJjZXMocGVlcnMpKTtcbiAgICAgICAgdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgICB0aGlzLmFwcGxpZWRSb3V0aW5nID0gcm91dGluZztcbiAgICAgICAgaWYgKHJvdXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnPy5vblJvdXRpbmdBcHBsaWVkPy4ocm91dGluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgYXMgdGhpcyBzdG9yZSBob2xkcyBpdCwgcmVhZCBzdHJhaWdodCBvZmYgaXRzIGZvbGRlcjogdGhlIHN0b3JlIG1heSBiZSBjb25maWd1cmluZyBpdHNlbGYgYmVmb3JlIGl0IGhhcyBzY2FubmVkIGFueXRoaW5nLCBhbmQgdGhpcyBmaWxlIGlzIHdoYXQgZGVjaWRlcyB3aGF0IGEgc2NhbiB3b3VsZCBldmVuIHRhbGsgdG9cbiAgICBwcml2YXRlIGFzeW5jIHJlYWRSb3V0aW5nQ29uZmlnKCk6IFByb21pc2U8UmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5vd25EaXNrLmdldChST1VUSU5HX0ZJTEUpO1xuICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgSWdub3JpbmcgdGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9OiBpdCBjb3VsZCBub3QgYmUgcGFyc2VkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBpcyBydW5uaW5nLCBzbyBhIGNvcHkgZm91bmQgb24gYSBwZWVyIGlzIG9ubHkgdGFrZW4gd2hlbiBpdCBpcyBnZW51aW5lbHkgbmV3ZXIuIC0xIG1lYW5zIGl0IGhhcyBub25lLiAqL1xuICAgIHB1YmxpYyByb3V0aW5nVmVyc2lvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gQXBwbHlpbmcgaXQgdG91Y2hlcyB0aGUgc291cmNlcywgc28gaXQgaXMgc2VyaWFsaXplZCBiZWhpbmQgd2hhdGV2ZXIgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nIHJhdGhlciB0aGFuIGludGVybGVhdmluZyB3aXRoIGl0XG4gICAgcHJpdmF0ZSByb3V0aW5nQXBwbGllczogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHB1YmxpYyByZWFwcGx5Um91dGluZ0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJvdXRpbmdBcHBsaWVzLnRoZW4oKCkgPT4gdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKSk7XG4gICAgICAgIHRoaXMucm91dGluZ0FwcGxpZXMgPSBuZXh0LmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgIHZvaWQgbmV4dC5jYXRjaCgoZTogRXJyb3IpID0+IGxvZ1N0b3JhZ2VFcnJvcihgQXBwbHlpbmcgdGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIH1cblxuICAgIC8vIE91ciBvd24gZGlzayBmaXJzdCAoYWx3YXlzKSwgdGhlbiBldmVyeSBwZWVyIHdob3NlIHJvdXRlIG92ZXJsYXBzIG91cnMgLSB0aGUgc291cmNlcyB0aGlzIHN0b3JlIHN5bmNocm9uaXplcyB3aXRoLCBhcyBpdHMgb3duIGNvbmZpZyBkZXNjcmliZXMgdGhlbVxuICAgIHByaXZhdGUgcGxhblNvdXJjZXMocGVlcnM6IFNvdXJjZUNvbmZpZ1tdKTogQmxvYlNvdXJjZVNwZWNbXSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcy5zdG9yZUNvbmZpZy5jdXJyZW50KCk7XG4gICAgICAgIGxldCBtYWtlU3BlYyA9IChzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZCwgdmFsaWRXaW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10sIHJvdXRlOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBub0Z1bGxTeW5jOiBib29sZWFuIHwgdW5kZWZpbmVkKTogQmxvYlNvdXJjZVNwZWMgPT4ge1xuICAgICAgICAgICAgbGV0IHdyaXRlRGVsYXkgPSBzb3VyY2VXcml0ZURlbGF5KHsgc291cmNlQ29uZmlnLCBmYXN0OiBzZWxmLmZhc3QsIHdyaXRlRGVsYXk6IHNlbGYud3JpdGVEZWxheSB9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICAgICAgdXJsOiBzb3VyY2VQZXJzaXN0ZW50VXJsKHNvdXJjZUNvbmZpZywgdGhpcy5mb2xkZXIpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93cyxcbiAgICAgICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jLFxuICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZTogc291cmNlQ29uZmlnPy5pbnRlcm1lZGlhdGUsXG4gICAgICAgICAgICAgICAgc291cmNlQ29uZmlnLFxuICAgICAgICAgICAgICAgIGNyZWF0ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlZCA9IHRoaXMuY29uZmlnPy5jcmVhdGVTb3VyY2U/Lih7IHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgc3RvcmUgaGFzIG5vIHdheSB0byBidWlsZCBzb3VyY2VzLCBzbyBpdCBjYW5ub3QgdXNlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlQ29uZmlnPy51cmwgfHwgdGhpcy5mb2xkZXIpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBQYXNzIGNyZWF0ZVNvdXJjZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFwcGx5Q29uZmlnOiAoc291cmNlOiBJQXJjaGl2ZXMpID0+IHRoaXMuY29uZmlnPy5hcHBseVNvdXJjZT8uKHNvdXJjZSwgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIC8vIE91ciBvd24gZGlzayBhY2NlcHRzIHdyaXRlcyB3aGlsZSBBTlkgd2luZG93IHRoaXMgc3RvcmUgaG9sZHMgaXMgb3Blbjsgd2l0aCBubyBjb25maWcgYXQgYWxsIGl0IGlzIHNpbXBseSBhbHdheXMgdmFsaWRcbiAgICAgICAgbGV0IG93bldpbmRvd3MgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpO1xuICAgICAgICBsZXQgc3BlY3M6IEJsb2JTb3VyY2VTcGVjW10gPSBbbWFrZVNwZWModW5kZWZpbmVkLCBvd25XaW5kb3dzLmxlbmd0aCAmJiBvd25XaW5kb3dzIHx8IFtGVUxMX1ZBTElEX1dJTkRPV10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKV07XG4gICAgICAgIC8vIE9uZSBzcGVjIHBlciBlbmRwb2ludCwgY2FycnlpbmcgYWxsIG9mIGl0cyB3aW5kb3dzOiBhIHN3aXRjaG92ZXIgc3BsaXRzIG9uZSB3aW5kb3cgYXJvdW5kIGFuIGludGVybWVkaWF0ZSwgYW5kIHRoYXQgaXMgc3RpbGwgb25lIHNvdXJjZSB0byB1c1xuICAgICAgICBsZXQgYnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBCbG9iU291cmNlU3BlYz4oKTtcbiAgICAgICAgZm9yIChsZXQgcGVlciBvZiBwZWVycykge1xuICAgICAgICAgICAgbGV0IHNoYXJlZCA9IHJvdXRlSW50ZXJzZWN0aW9uKHNlbGYucm91dGUsIHBlZXIucm91dGUpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGlkZW50aXR5ID0gc291cmNlSWRlbnRpdHkocGVlcik7XG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieUlkZW50aXR5LmdldChpZGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZFdpbmRvd3MucHVzaChwZWVyLnZhbGlkV2luZG93KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzcGVjID0gbWFrZVNwZWMocGVlciwgW3BlZXIudmFsaWRXaW5kb3ddLCBzaGFyZWQsIHBlZXIubm9GdWxsU3luYyB8fCBzZWxmLm5vRnVsbFN5bmMpO1xuICAgICAgICAgICAgYnlJZGVudGl0eS5zZXQoaWRlbnRpdHksIHNwZWMpO1xuICAgICAgICAgICAgc3BlY3MucHVzaChzcGVjKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BlY3M7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgYWxsIHN5bmNocm9uaXphdGlvbiBzY2Fucy9wb2xscyBhbmQgZmx1c2hlcyBwZW5kaW5nIHdyaXRlcy4gT25seSB1c2VkIHdoZW4gdGhlIHN0b3JlIGdlbnVpbmVseSBjYW5ub3QgY29udGludWUgKGl0cyByb3V0ZSBvciBkaXNrIGxpbWl0IGNoYW5nZWQsIHByb2Nlc3Mgc2h1dGRvd24pIC0gcm91dGluZSBjb25maWcgY2hhbmdlcyBnbyB0aHJvdWdoIHVwZGF0ZVNvdXJjZXMgaW5zdGVhZCwgd2hpY2ggdGhlIHN0b3JlIHN1cnZpdmVzLlxuICAgIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3luYy5zdG9wKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZmx1c2hEZWxheWVkV3JpdGVzKHRydWUpO1xuICAgICAgICBhd2FpdCB0aGlzLmluZGV4LmZsdXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDIoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGludGVybmFsPzogYm9vbGVhbjsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuOyBpbmNsdWRlTWFya2VkPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEludGVybmFsMihjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIGxldCByYW5nZSA9IGNvbmZpZy5yYW5nZTtcbiAgICAgICAgLy8gTm90IGluIHRoZSBpbmRleCBtZWFucyBpdCBkb2VzIG5vdCBleGlzdCBoZXJlOiB0aGUgaW5kZXggSVMgdGhlIGFuc3dlciwgYW5kIHNjYW5uaW5nIGhlYWxzIGl0IG9uIGl0cyBvd24gc2NoZWR1bGUuIEFuIGVudHJ5IHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBsaXN0IGlzIHN0aWxsIHZhbGlkIC0gZ2V0RW50cnlIb2xkZXIgcmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBVUkwgZGlyZWN0bHksIGFuZCBnZXQyJ3MgZmFsbGJhY2sgbG9vcCBjb3ZlcnMgYSBob2xkZXIgdGhhdCBpcyBnb25lIGVudGlyZWx5LlxuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgLy8gQSBtYXJrZWQgZGVsZXRpb24gc3RpbGwgaGFzIGl0cyBieXRlcywgYW5kIHRoZSBrZXB0IHZhbHVlIHNheXMgd2hlcmUgLSBzbyBhbiBpbmNsdWRlTWFya2VkIHJlYWQgaXMgYSBub3JtYWwgcmVhZCB0aHJvdWdoIHRoZSBtYXJrZWQgZW50cnkgKGl0IGp1c3QgbXVzdCBub3QgUkUtSU5ERVggYW55dGhpbmc6IHNlZSB0aGUgbWFya2VkUmVhZCBndWFyZHMgYmVsb3cpXG4gICAgICAgIGxldCBtYXJrZWRSZWFkID0gZmFsc2U7XG4gICAgICAgIGlmICghZW50cnkgJiYgY29uZmlnLmluY2x1ZGVNYXJrZWQpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5nZXRNYXJrZWRFbnRyeShrZXkpO1xuICAgICAgICAgICAgbWFya2VkUmVhZCA9ICEhZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBBIGRlbGV0aW9uIGhhcyBubyBieXRlcyAtIHRoZSB0b21ic3RvbmUgSVMgdGhlIGFuc3dlciwgc28gYSBmbGFnLWNhbGxlciBnZXRzIGl0cyB0aW1lIHdpdGggZW1wdHkgZGF0YVxuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpO1xuICAgICAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jLm5vdGVBY2Nlc3Moa2V5KTtcbiAgICAgICAgbGV0IGhvbGRlckFyY2hpdmVzID0gYXdhaXQgdGhpcy5nZXRFbnRyeUhvbGRlcihlbnRyeSk7XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob2xkZXJFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChob2xkZXJBcmNoaXZlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBpbmNsdWRlVG9tYnN0b25lczogdGhlIGhvbGRlciBhbnN3ZXJpbmcgXCJkZWxldGVkXCIgKGEgdG9tYnN0b25lLCB3aXRoIGl0cyB3cml0ZSB0aW1lKSBtdXN0IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIFwiSSBsb3N0IHRoZSBmaWxlXCIgLSB0aGUgZm9ybWVyIGlzIGF1dGhvcml0YXRpdmUgYW5kIG11c3QgTk9UIGZhbGwgYmFjayB0byBvbGRlciBjb3BpZXMsIHdoaWNoIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRpb24gZm9yIHRoaXMgcmVhZFxuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCBob2xkZXJBcmNoaXZlcy5nZXQyKGtleSwgeyByYW5nZSwgaW50ZXJuYWw6IHRydWUsIGluY2x1ZGVUb21ic3RvbmVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgIWFuc3dlci5kYXRhLmxlbmd0aCAmJiAhKHJhbmdlICYmIGFuc3dlci5zaXplKSAmJiBhbnN3ZXIud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBhIHJhbmdlZCByZWFkIG9mIGEgcmVhbCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgKHJhbmdlIHBhc3QgRU9GKSwgc28gb25seSB1bnJhbmdlZCBlbXB0aW5lc3MgbWVhbnMgdG9tYnN0b25lL2Fic2VudFxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgKGFuc3dlci5kYXRhLmxlbmd0aCB8fCByYW5nZSAmJiBhbnN3ZXIuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geyBkYXRhOiBhbnN3ZXIuZGF0YSwgd3JpdGVUaW1lOiBhbnN3ZXIud3JpdGVUaW1lLCBzaXplOiBhbnN3ZXIuc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBob2xkZXJFcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gUmFuZ2VkIHJlYWRzIGNhbid0IHBvcHVsYXRlIGEgY2FjaGUgKHRoZXkncmUgcGFydGlhbCksIGFuZCBhIG1hcmtlZCByZWFkIG11c3Qgbm90IHJlLWluZGV4IGFueXRoaW5nIC0gY2FjaGluZyB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0ZWQga2V5IGFzIGxpdmVcbiAgICAgICAgICAgIGlmICghbWFya2VkUmVhZCAmJiB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpICE9PSAwICYmICFyYW5nZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIC0gZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgc291cmNlJ3MgY29weSB3b3VsZCBzeW5jaHJvbml6ZSBpdCBiZXR3ZWVuIG5vZGVzIHRocm91Z2ggdGhlIHJlYWQgcGF0aCwgd2hpY2ggaXQgbmV2ZXIgaXNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICBpZiAoaG9sZGVyRXJyb3IpIHRocm93IGhvbGRlckVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaG9sZGVyIGlzIGRvd24gb3IgbG9zdCB0aGUgZmlsZS4gQU5ZIG90aGVyIHNvdXJjZSdzIGNvcHkgYmVhdHMgbm8gdmFsdWUgLSBldmVuIGFuIE9MREVSIG9uZSAtIGFuZCBpdCdzIGNvcGllZCBvbnRvIG91ciBkaXNrIHNvIHRoZSBuZXh0IHJlYWQgZG9lc24ndCBkZXBlbmQgb24gbHVjay5cbiAgICAgICAgbGV0IGhvbGRlclNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGhvbGRlclNsb3QgfHwgIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmYWxsYmFjazogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGFuc3dlciA9IGF3YWl0IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0MihrZXksIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBjb3VudHMgYXMgYWJzZW50IC0gYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh0aGlzIHJlYWQgaXMgdW5yYW5nZWQsIHNvIGVtcHRpbmVzcyBpcyB1bmFtYmlndW91cylcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIGFuc3dlci5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFsbGJhY2spIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gQSBtYXJrZWQgcmVhZCBtdXN0IG5vdCByZS1pbmRleCBhbnl0aGluZyAtIGNhY2hpbmcgd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGVkIGtleSBhcyBsaXZlXG4gICAgICAgICAgICBpZiAoIW1hcmtlZFJlYWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIGZhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkYXRhID0gZmFsbGJhY2suZGF0YTtcbiAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KE1hdGgubWluKHJhbmdlLnN0YXJ0LCBkYXRhLmxlbmd0aCksIE1hdGgubWluKHJhbmdlLmVuZCwgZGF0YS5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogZmFsbGJhY2sud3JpdGVUaW1lLCBzaXplOiBmYWxsYmFjay5zaXplIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgLy8gVGhlIGhvbGRlciBhbnN3ZXJlZCBcIm5vdCB0aGVyZVwiIGFuZCBubyBvdGhlciBzb3VyY2UgaGFzIGl0IGVpdGhlcjogdGhlIGVudHJ5IHdhcyBzdGFsZS4gRm9yZ290dGVuIHJhdGhlciB0aGFuIGRlbGV0ZWQgLSBub3RoaW5nIGhhcHBlbmVkIHRvIHRoaXMgZmlsZSwgd2Ugd2VyZSBzaW1wbHkgd3JvbmcgYWJvdXQgaG9sZGluZyBpdCwgYW5kIHNheWluZyBvdGhlcndpc2Ugd291bGQgcHVzaCBhIGRlbGV0aW9uIG91dCB0byBldmVyeW9uZSBlbHNlLiAoTmV2ZXIgZm9yIGEgbWFya2VkIHJlYWQ6IHB1cmdpbmcgd291bGQgZXJhc2UgdGhlIGRlbGV0aW9uJ3MgdG9tYnN0b25lLilcbiAgICAgICAgaWYgKCFtYXJrZWRSZWFkKSB7XG4gICAgICAgICAgICB0aGlzLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChjb25maWc6IHsgcGF0aDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW47IHVuZGVsZXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHBhdGg6IGtleSwgZGF0YSB9ID0gY29uZmlnO1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVtcHR5IHdyaXRlIHJlZnVzZWQ6IHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBNYXRoLmZsb29yKGNvbmZpZy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93cy9yb3V0ZXMsIHNvIHRoZXkgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gaXQgKGFuZCBpdCBuZXZlciBmbG93cyB0aHJvdWdoIHZhbGlkYXRpb24pIC0gYnV0IGl0IGhhcyBhIHJ1bGUgb2YgaXRzIG93biwgd2hpY2ggaXMgb3VycyB0byBlbmZvcmNlIGJlY2F1c2UgdGhlIGZpbGUgaXMgb3Vyc1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIHJvdXRlLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnVuZGVsZXRlKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSB1bmRlbGV0ZWQgKGl0IGNhbm5vdCBiZSBkZWxldGVkIGluIHRoZSBmaXJzdCBwbGFjZSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudW5kZWxldGVLZXkoa2V5LCB3cml0ZVRpbWUsIGNvbmZpZy5pbnRlcm5hbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpXG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgcm91dGUpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIGV4ZW1wdCBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IHNraXBzIGV2ZXJ5IG90aGVyIGNoZWNrOiBpdCBpcyB0aGUgZmlsZSB0aGF0IERFRklORVMgb3VyIHdpbmRvd3MgYW5kIHJvdXRlcywgc28ganVkZ2luZyBpdCBieSB0aGUgY29uZmlnIGl0IGlzIGFib3V0IHRvIHJlcGxhY2UgaXMgaG93IGEgc3RvcmUgZ2V0cyBzdHVjayBvbiBhIGNvbmZpZyBpdCBjYW4gbmV2ZXIgYmUgdG9sZCB0byBsZWF2ZVxuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEludGVybmFsKGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRPckRlbGV0ZShrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWwoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgZGVsZXRlZCAob3ZlcndyaXRlIGl0IHRvIGNoYW5nZSB0aGUgYnVja2V0J3MgY29uZmlndXJhdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgLy8gQSBkZWxldGlvbiBsYW5kcyBpbiBleGFjdGx5IHRoZSBzYW1lIHBsYWNlIGEgd3JpdGUgd291bGQsIHNvIGl0IGlzIGp1ZGdlZCB0aGUgc2FtZSB3YXk6IG9uZSBhaW1lZCBhdCBhIHNoYXJkIHdlIGRvbid0IHNlcnZlIGlzIGp1c3QgYXMgaW52aXNpYmxlIGFzIGEgd3JpdGUgdG8gaXRcbiAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIGdldFJvdXRlKGtleSksIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIGRlbGV0aW9ucyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgZGVsZXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIGdldFJvdXRlKGtleSkpO1xuICAgICAgICAgICAgLy8gc2V0SW50ZXJuYWwgdHJlYXRzIGFuIGVtcHR5IGJ1ZmZlciBhcyBleGFjdGx5IGEgZGVsZXRpb246IGRpc2sgcmVtb3ZhbCBwbHVzIGEgdG9tYnN0b25lIGluZGV4IGVudHJ5LCBubyBmYW4tb3V0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEludGVybmFsKGtleSwgQnVmZmVyLmFsbG9jKDApLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGVzIGFyZSB3cml0ZXMgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpOiB0aGUgdG9tYnN0b25lIGlzIG9yZGVyZWQgYnkgd3JpdGUgdGltZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgcHJvcGFnYXRlcyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbiwgYW5kIGlzIGV2ZW50dWFsbHkgZXhwaXJlZFxuICAgICAgICBhd2FpdCB0aGlzLnNldE9yRGVsZXRlKGtleSwgQnVmZmVyLmFsbG9jKDApLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG5cbiAgICAvKiogQSBub2RlLXNpZGUgbW92ZTogdGhlIGJ5dGVzIG5ldmVyIHRyYXZlbCB0aHJvdWdoIHRoZSBjbGllbnQuIERlbGliZXJhdGVseSBqdXN0IGdldDIgKyBzZXQgKyBkZWwgcmF0aGVyIHRoYW4gYSBkaXNrIHJlbmFtZSwgc28gdGhlIGRlc3RpbmF0aW9uIHdyaXRlIHBhc3NlcyBFVkVSWSBydWxlIGEgc2V0IHBhc3NlcyAod2luZG93cywgcm91dGVzLCBpbW11dGFiaWxpdHksIG9ubHktdGFrZS1sYXRlc3QsIGluZGV4LCBmYW4tb3V0IHRvIHBlZXJzKSBhbmQgdGhlIGRlbGV0aW9uIHByb3BhZ2F0ZXMgYXMgYSBub3JtYWwgdG9tYnN0b25lIC0gYSByZW5hbWUgd291bGQgYnlwYXNzIGFsbCBvZiBpdC4gVGhlIHNldCBzdGFtcHMgZnJlc2gsIHNvIHRoZSBtb3ZlZCBmaWxlIGJlYXRzIGFueSB0b21ic3RvbmUgYXQgaXRzIG5ldyBwYXRoLiAqL1xuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzogeyBmcm9tUGF0aDogc3RyaW5nOyB0b1BhdGg6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IFJPVVRJTkdfRklMRSB8fCBjb25maWcudG9QYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIG1vdmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKHsgcGF0aDogY29uZmlnLmZyb21QYXRoIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vdmUgc291cmNlIGRvZXMgbm90IGV4aXN0LiBDYW5ub3QgbW92ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5mcm9tUGF0aCl9IHRvICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnRvUGF0aCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldCh7IHBhdGg6IGNvbmZpZy50b1BhdGgsIGRhdGE6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbCh7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJtb3ZlXCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDogY29uZmlnLmZyb21QYXRoLCB0b1BhdGg6IGNvbmZpZy50b1BhdGgsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhjb25maWc6IHsgcGF0aDogc3RyaW5nOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgLy8gTm90IGluIHRoZSBpbmRleCBtZWFucyBpdCBkb2VzIG5vdCBleGlzdCBoZXJlOiB0aGUgaW5kZXggSVMgdGhlIGFuc3dlciwgYW5kIHNjYW5uaW5nIGhlYWxzIGl0IG9uIGl0cyBvd24gc2NoZWR1bGUuIEFuIGVudHJ5IHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBsaXN0IGlzIHN0aWxsIHZhbGlkIC0gZ2V0RW50cnlIb2xkZXIgcmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBVUkwgZGlyZWN0bHksIGFuZCBnZXQyJ3MgZmFsbGJhY2sgbG9vcCBjb3ZlcnMgYSBob2xkZXIgdGhhdCBpcyBnb25lIGVudGlyZWx5LlxuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSByZXR1cm4geyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9O1xuICAgICAgICBpZiAoIWNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWRlbGV0ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8oY29uZmlnOiBGaW5kQ29uZmlnICYgeyBwcmVmaXg6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLndhaXRGb3JSZXF1aXJlZFNjYW5zKCk7XG4gICAgICAgIGxldCBwcmVmaXggPSBjb25maWcucHJlZml4O1xuICAgICAgICBsZXQgaW5mb3MgPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICAvLyBEZWxldGlvbnMgYXJlIG5vdCBpbiBoZXJlIGF0IGFsbCwgd2hpY2ggaXMgd2hhdCBhIGxpc3Rpbmcgd2FudHM6IGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGVcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW5jbHVkZU1hcmtlZCkge1xuICAgICAgICAgICAgLy8gQSBrZXkgaXMgbGl2ZSBPUiBtYXJrZWQsIG5ldmVyIGJvdGgsIHNvIHRoaXMgY2Fubm90IGNvbGxpZGUgd2l0aCB0aGUgbG9vcCBhYm92ZVxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWFya2VkRW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKSwgcHJlZml4LCB7IHNoYWxsb3c6IGNvbmZpZy5zaGFsbG93LCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gQWxsIGZpbGVzIGNoYW5nZWQgYWZ0ZXIgY29uZmlnLnRpbWUg4oCUIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LiBGaWx0ZXJzIG9uIHdoZW4gV0UgbGVhcm5lZCBvZiB0aGUgY2hhbmdlIChjaGFuZ2VkQXQpLCBzbyBmaWxlcyBzeW5jaHJvbml6ZWQgbGF0ZSAod2l0aCBvbGQgd3JpdGUgdGltZXMpIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIGVudHJpZXM6IGEgY2FsbGVyIHJlYWRpbmcgYSBjaGFuZ2UgZmVlZCBoYXMgdG8gaGVhciBhYm91dCB0aGVtLCBhbmQgc2l6ZSAwIGlzIGhvdyB0aGUgZmVlZCBzYXlzIFwiZ29uZVwiIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gY29uZmlnLnJvdXRlcyBsZXRzIGEgc3RvcmUgc3luY2luZyBhIHBhcnRpYWwgc2hhcmQgYXNrIGZvciBqdXN0IGl0cyBzbGljZS5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgaW5Sb3V0ZXMgPSAoa2V5OiBzdHJpbmcpID0+ICFjb25maWcucm91dGVzIHx8IGNvbmZpZy5yb3V0ZXMuc29tZShyb3V0ZSA9PiByb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRvbWJzdG9uZS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUsIHNpemU6IDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbmRleCdzIHRvdGFscyBwbHVzIGFueSBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgZ2V0U3luY1Byb2dyZXNzKCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIG1hcmtlZDogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IG9sZGVzdERlbGV0ZVRpbWU/OiBudW1iZXIgfTtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgICAgICBzeW5jaW5nOiBTeW5jQWN0aXZpdHlbXTtcbiAgICB9IHtcbiAgICAgICAgbGV0IHRvdGFscyA9IHRoaXMubmFtZWRJbmRleFRvdGFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiB0b3RhbHMuZmlsZUNvdW50LCBieXRlQ291bnQ6IHRvdGFscy5ieXRlQ291bnQgfSxcbiAgICAgICAgICAgIG1hcmtlZDogdGhpcy5tYXJrZWRUb3RhbHMoKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRvdGFscy5zb3VyY2VzLFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0OiB0aGlzLnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgICAgIHN5bmNpbmc6IHRoaXMuc3luYy5nZXRBY3Rpdml0aWVzKCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIGdldFN5bmNQcm9ncmVzcydzIHRvdGFscywgYnV0IGxvYWRpbmcgdGhlIGluZGV4IGZpcnN0LCBzbyB0aGV5IGFyZSBuZXZlciB0aGUgemVyb2VzIG9mIGEgc3RvcmUgbm90aGluZyBoYXMgdG91Y2hlZCB5ZXQuICovXG4gICAgcHVibGljIGFzeW5jIGNvbXB1dGVJbmRleFRvdGFscygpOiBQcm9taXNlPHtcbiAgICAgICAgZmlsZUNvdW50OiBudW1iZXI7XG4gICAgICAgIGJ5dGVDb3VudDogbnVtYmVyO1xuICAgICAgICBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgIH0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVkSW5kZXhUb3RhbHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5hbWVkSW5kZXhUb3RhbHMoKTogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB7XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLmluZGV4VG90YWxzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxlQ291bnQ6IHRvdGFscy5maWxlQ291bnQsXG4gICAgICAgICAgICBieXRlQ291bnQ6IHRvdGFscy5ieXRlQ291bnQsXG4gICAgICAgICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAubWFwKCh4LCBpKSA9PiAoeyBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLCAuLi50b3RhbHMuc2xvdHNbaV0gfSkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeCwgaSkgPT4gdGhpcy5pc0xpdmUoaSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdG9yZSdzIHNvdXJjZXMsIGFzIHRoZSBjdXJyZW50IHJvdXRpbmcgY29uZmlnIHNheXMgdGhleSBzaG91bGQgYmUuIFRoaXMgaXMgdGhlIE9OTFkgd2F5XG4gICAgICogdGhleSBhcmUgZXZlciBzZXQ6IHRoZSBmaXJzdCBjYWxsIHBvcHVsYXRlcyBhbiBlbXB0eSBzdG9yZSwgZXZlcnkgbGF0ZXIgb25lIGFwcGxpZXMgYSBjaGFuZ2UgdG9cbiAgICAgKiB0aGUgcnVubmluZyBvbmUuIFdpbmRvd3MsIHJvdXRlcyBhbmQgZmxhZ3MgbW92ZSBpbiBwbGFjZSwgZ2VudWluZWx5IG5ldyBlbmRwb2ludHMgYXJlIGFkZGVkIGFuZFxuICAgICAqIHN0YXJ0IHNjYW5uaW5nLCBhbmQgZW5kcG9pbnRzIHRoYXQgYXJlIGdvbmUgZ28gZGVhZCAodGhlaXIgc2NhbnMgc3RvcCwgdGhlaXIgaW5kZXggZW50cmllc1xuICAgICAqIGRyb3ApLlxuICAgICAqXG4gICAgICogQSBzdG9yZSBpcyBuZXZlciByZWJ1aWx0IGZvciBhIGNvbmZpZyBjaGFuZ2UuIEl0cyBuYW1lIGRlY2lkZXMgaXRzIGZvbGRlciBhbmQgaXRzIGlkZW50aXR5LCBhbmRcbiAgICAgKiBhIGNvbmZpZyBjaGFuZ2UgY2Fubm90IGNoYW5nZSBlaXRoZXIgLSBzbyB0aGVyZSBpcyBub3RoaW5nIGEgY2hhbmdlIGNhbiBkbyB0byBhIHN0b3JlIGV4Y2VwdFxuICAgICAqIHRoaXMuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVNvdXJjZXMoc3BlY3M6IEJsb2JTb3VyY2VTcGVjW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzcGVjcy5sZW5ndGggfHwgc3BlY3NbMF0uaWRlbnRpdHkgIT09IFwiZGlza1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZVNvdXJjZXMgZXhwZWN0cyB0aGUgZGlzayBzb3VyY2UgZmlyc3QgKGlkZW50aXR5IFwiZGlza1wiKSwgZ290ICR7SlNPTi5zdHJpbmdpZnkoc3BlY3MubWFwKHggPT4geC5pZGVudGl0eSkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBjYWxsOiB0aGUgZGlzayBzbG90IGhhcyB0byBleGlzdCBiZWZvcmUgYW55dGhpbmcgY2FuIGJlIG1hdGNoZWQgYWdhaW5zdCBpdFxuICAgICAgICAgICAgbGV0IGRpc2sgPSBzcGVjc1swXTtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBkaXNrLmNyZWF0ZSgpO1xuICAgICAgICAgICAgYXNEZWxheWVkKHNvdXJjZSk/LmJpbmRGbHVzaERlYWRsaW5lKCgpID0+IHRoaXMud3JpdGVGbHVzaERlYWRsaW5lKCkpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzLnB1c2goeyBzb3VyY2UsIHVybDogZGlzay51cmwsIHZhbGlkV2luZG93czogZGlzay52YWxpZFdpbmRvd3MsIHJvdXRlOiBkaXNrLnJvdXRlLCBub0Z1bGxTeW5jOiBkaXNrLm5vRnVsbFN5bmMsIHNvdXJjZUNvbmZpZzogZGlzay5zb3VyY2VDb25maWcsIGlkZW50aXR5OiBkaXNrLmlkZW50aXR5IH0pO1xuICAgICAgICAgICAgdGhpcy5zeW5jLmFkZFNvdXJjZSgwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2V0V2luZG93cyA9IChpOiBudW1iZXIsIHdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9sZCA9IHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3M7XG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkKSA9PT0gSlNPTi5zdHJpbmdpZnkod2luZG93cykpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBWYWxpZCB3aW5kb3dzIGNoYW5nZWQgZm9yICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtKU09OLnN0cmluZ2lmeShvbGQpfSAtPiAke0pTT04uc3RyaW5naWZ5KHdpbmRvd3MpfWApO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cyA9IHdpbmRvd3M7XG4gICAgICAgIH07XG4gICAgICAgIHNldFdpbmRvd3MoMCwgc3BlY3NbMF0udmFsaWRXaW5kb3dzKTtcbiAgICAgICAgLy8gTGl2ZSBzbG90cyBwYWlyIHdpdGggc3BlY3MgYnkgaWRlbnRpdHkuIEVhY2ggZW5kcG9pbnQgaXMgbm93IE9ORSBzcGVjIGNhcnJ5aW5nIGFsbCBpdHMgd2luZG93cywgc28gdGhpcyBpcyBhIDE6MSBwYWlyaW5nOyBhbnkgbGVmdG92ZXIgZHVwbGljYXRlIHNsb3RzIGZyb20gYmVmb3JlIChhbiBlbmRwb2ludCB0aGF0IHVzZWQgdG8gYmUgc3BsaXQgaW50byBzZXZlcmFsIHNsb3RzKSBnbyB1bm1hdGNoZWQgYmVsb3cgYW5kIGFyZSBjb2xsYXBzZWQgYXdheS5cbiAgICAgICAgbGV0IGxpdmVCeUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICAgICAgICBsZXQgb3JpZ2luYWxMZW5ndGggPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9yaWdpbmFsTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGlkID0gdGhpcy5zb3VyY2VzW2ldLmlkZW50aXR5O1xuICAgICAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBsaXZlQnlJZGVudGl0eS5nZXQoaWQpO1xuICAgICAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGxpdmVCeUlkZW50aXR5LnNldChpZCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcy5zbGljZSgxKSkge1xuICAgICAgICAgICAgbGV0IHNsb3QgPSBsaXZlQnlJZGVudGl0eS5nZXQoc3BlYy5pZGVudGl0eSk/LnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIFNBTUUgZW5kcG9pbnQgKHNlZSBzb3VyY2VJZGVudGl0eSksIHNvIHdlIGFyZSBhbHJlYWR5IHN5bmNocm9uaXplZCB3aXRoIGl0OiB0aGUgc2xvdCBrZWVwcyBpdHMgY29ubmVjdGlvbiwgaXRzIGNvbXBsZXRlZCBzY2FucywgYW5kIGl0cyBpbmRleCBlbnRyaWVzLCBhbmQgb25seSB0aGUgcG9saWN5IG9uIGl0IG1vdmVzLiBSZWNyZWF0aW5nIGl0IGhlcmUgd291bGQgbWVhbiByZXNjYW5uaW5nIHRoZSBlbmRwb2ludCBmcm9tIHNjcmF0Y2ggZXZlcnkgdGltZSBhIGZsYWcgY2hhbmdlcy5cbiAgICAgICAgICAgICAgICBtYXRjaGVkLmFkZChzbG90KTtcbiAgICAgICAgICAgICAgICBzZXRXaW5kb3dzKHNsb3QsIHNwZWMudmFsaWRXaW5kb3dzKTtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnNvdXJjZXNbc2xvdF07XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnJvdXRlKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJvdXRlIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnJvdXRlKX0gLT4gJHtKU09OLnN0cmluZ2lmeShzcGVjLnJvdXRlKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcucm91dGUgPSBzcGVjLnJvdXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcuc291cmNlQ29uZmlnKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3BlYy5zb3VyY2VDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25maWcgY2hhbmdlZCBmb3IgJHtleGlzdGluZy5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSksIGtlZXBpbmcgdGhlIHNvdXJjZSAoc28gaXQgaXMgbm90IHJlc2Nhbm5lZCk6ICR7SlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcuc291cmNlQ29uZmlnKX0gLT4gJHtKU09OLnN0cmluZ2lmeShzcGVjLnNvdXJjZUNvbmZpZyl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBzb3VyY2UgY2FycmllcyBpdHMgY29uZmlnIChhbmQgaXRzIHdyaXRlIGRlbGF5KSBpbnRvIGV2ZXJ5dGhpbmcgaXQgZG9lcywgc28gaXQgaGFzIHRvIGxlYXJuIHRoZSBuZXcgb25lIC0gc2VlIGFwcGx5U291cmNlQ29uZmlnXG4gICAgICAgICAgICAgICAgc3BlYy5hcHBseUNvbmZpZz8uKGV4aXN0aW5nLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcubm9GdWxsU3luYyA9IHNwZWMubm9GdWxsU3luYztcbiAgICAgICAgICAgICAgICBleGlzdGluZy5zb3VyY2VDb25maWcgPSBzcGVjLnNvdXJjZUNvbmZpZztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzcGVjLmNyZWF0ZSgpO1xuICAgICAgICAgICAgYXNEZWxheWVkKHNvdXJjZSk/LmJpbmRGbHVzaERlYWRsaW5lKCgpID0+IHRoaXMud3JpdGVGbHVzaERlYWRsaW5lKCkpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzLnB1c2goeyBzb3VyY2UsIHVybDogc3BlYy51cmwsIHZhbGlkV2luZG93czogc3BlYy52YWxpZFdpbmRvd3MsIHJvdXRlOiBzcGVjLnJvdXRlLCBub0Z1bGxTeW5jOiBzcGVjLm5vRnVsbFN5bmMsIGludGVybWVkaWF0ZTogc3BlYy5pbnRlcm1lZGlhdGUsIHNvdXJjZUNvbmZpZzogc3BlYy5zb3VyY2VDb25maWcsIGlkZW50aXR5OiBzcGVjLmlkZW50aXR5IH0pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEFkZGVkIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBhIGdlbnVpbmVseSBuZXcgZW5kcG9pbnQsIHNvIGl0IGlzIHNjYW5uZWQgZnJvbSBzY3JhdGNoYCk7XG4gICAgICAgICAgICB0aGlzLnN5bmMuYWRkU291cmNlKHRoaXMuc291cmNlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9yaWdpbmFsTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkgfHwgbWF0Y2hlZC5oYXMoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVGhlIHNsb3QgaXMgZGVhZCB0aGUgbW9tZW50IHRoaXMgcmV0dXJuczsgZHJvcHBpbmcgdGhlIGluZGV4IGVudHJpZXMgaXQgaGVsZCBpcyB0aGUgcGFydCB0aGF0IHJlYWRzIHRoZSBpbmRleCwgc28gaXQgZmluaXNoZXMgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zeW5jLnJlbW92ZVNvdXJjZShpKS5jYXRjaCgoZTogRXJyb3IpID0+IGxvZ1N0b3JhZ2VFcnJvcihgUmVtb3Zpbmcgc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy5yZXNjYW5CYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpLiAqL1xuICAgIHB1YmxpYyBhc3luYyBib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlOiBJQXJjaGl2ZXMsIGNvbmZpZzogeyBzaW5jZTogbnVtYmVyOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl0gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLmJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2UsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgdXBsb2FkcyBzdHJlYW0gb250byB0aGUgbG9jYWwgZGlzayBzb3VyY2UgZGlyZWN0bHkgKHRoZXkgbWF5IG5vdCBmaXQgaW4gbWVtb3J5KSwgYW5kIHJlY29uY2lsaWF0aW9uIGNhcnJpZXMgdGhlbSB0byB0aGUgb3RoZXIgc291cmNlcyAtIHRoZXJlIGlzIG5vIGRlbGF5ZWQtd3JpdGUgc3RhZ2UgdGhleSBjb3VsZCBwYXNzIHRocm91Z2guIFRoZSB3cml0ZSBpdHNlbGYgaXMgdmFsaWRhdGVkIGV4YWN0bHkgbGlrZSBzZXQncywgcmlnaHQgaGVyZTogdGhlIGNsaWVudCBpcyBhYm91dCB0byBzZW5kIHRoZSB3aG9sZSBmaWxlLCBzbyBldmVyeSByZWFzb24gdG8gcmVmdXNlIGl0IG11c3QgYmUgZm91bmQgYmVmb3JlIHRoZSBmaXJzdCBieXRlLlxuICAgIHB1YmxpYyBhc3luYyBzdGFydExhcmdlVXBsb2FkKGNvbmZpZz86IHsgcGF0aD86IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZz8ucGF0aDtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IHdyaXRlVGltZSA9IE1hdGguZmxvb3IoY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIHJvdXRlLCBjb25maWc/Lmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB1cGxvYWRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKS4gVGhlIGNsaWVudCBpcyBhbHJlYWR5IHN0cmVhbWluZywgc28gdGhlIHVwbG9hZCBpcyBhY2NlcHRlZCBhbmQgZXZlcnkgcGFydCBkaXNjYXJkZWQgLSB0aGUgYWx0ZXJuYXRpdmUgaXMgdGhyb3dpbmcgYXQgYSBjYWxsZXIgdGhhdCBkaWQgbm90aGluZyB3cm9uZy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgcm91dGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gYCR7RElTQ0FSREVEX1VQTE9BRF9QUkVGSVh9JHt0aGlzLm5leHREaXNjYXJkZWRVcGxvYWQrK31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkZWRVcGxvYWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWc/LmludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB1cGxvYWRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IG9mZnNldD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuaGFzKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5hcHBlbmRMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5kYXRhLCBjb25maWcub2Zmc2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgbGV0IHsgZGlzaywgc291cmNlSW5kZXggfSA9IHRoaXMuZ2V0RGlza1NvdXJjZSgpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldCkgLSBhIG5ld2VyIHZhbHVlIGNhbiBsYW5kIHdoaWxlIGEgbG9uZyB1cGxvYWQgaXMgc3RpbGwgc3RyZWFtaW5nLCBzbyB0aGlzIGlzIHJlLWNoZWNrZWQgaGVyZSByYXRoZXIgdGhhbiBvbmx5IGF0IHRoZSBzdGFydFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoY29uZmlnLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBkaXNrLmZpbmlzaExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLnBhdGgsIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGRpc2suZ2V0SW5mbyhjb25maWcucGF0aCk7XG4gICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoY29uZmlnLnBhdGgsIHsgd3JpdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgc2l6ZTogaW5mby5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJzZXRMYXJnZVwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGNvbmZpZy5wYXRoLCBzaXplOiBpbmZvLnNpemUsIHdyaXRlVGltZTogaW5mby53cml0ZVRpbWUsIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBJbnRlcm5hbHNcblxuICAgIC8qKiBCeXRlcyBvZiByZWFkIGNhY2hlIHRoZSBkaXNrIG1heSBob2xkOyBzZWUgQ29tbW9uQ29uZmlnLnJlYWRlckRpc2tMaW1pdCAoU3RvcmVTeW5jIGVuZm9yY2VzIGl0KS4gUmVhZCBmcm9tIHRoZSBjb25maWcgaW4gZWZmZWN0LCBzbyByYWlzaW5nIG9yIHJlbW92aW5nIHRoZSBsaW1pdCB0YWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgZXZpY3Rpb24gcGFzcy4gKi9cbiAgICBwdWJsaWMgZ2V0IHJlYWRlckRpc2tMaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZUNvbmZpZy5jdXJyZW50KCkucmVhZGVyRGlza0xpbWl0O1xuICAgIH1cblxuICAgIC8qKiBUaGUgd3JpdGUgdGltZSBhIG5ldyB3cml0ZSBoYXMgdG8gYmVhdCwgb3IgMCB3aGVuIHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgdGhlIGtleS4gQ291bnRzIERFTEVUSU9OUyB0b286IGEgd3JpdGUgb2xkZXIgdGhhbiB0aGUgZGVsZXRpb24gdGhhdCByZW1vdmVkIGl0IG11c3Qgbm90IGJyaW5nIGl0IGJhY2suIFRoZSBpbmRleCBpcyBhdXRob3JpdGF0aXZlIGV2ZW4gZm9yIGEgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gYSBkZWxheWVkIHNvdXJjZSwgc2luY2UgdGhlIGVudHJ5IGlzIHJlY29yZGVkIHdoZW4gdGhlIHdyaXRlIGlzIGFjY2VwdGVkIHJhdGhlciB0aGFuIHdoZW4gaXQgcmVhY2hlcyBzdG9yYWdlLiAqL1xuICAgIHB1YmxpYyBjdXJyZW50V3JpdGVUaW1lKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgudGltZU9mKGtleSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xpdmUoc291cmNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmlzTGl2ZShzb3VyY2VJbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyU2xvdChzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIGxldCByZWdpc3RyYXRpb24gPSB0aGlzLnNvdXJjZXNMaXN0LmVuc3VyZSh0aGlzLnNvdXJjZXNbc2xvdF0udXJsKS50aGVuKGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XSA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XSA9IHJlZ2lzdHJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgICB9XG5cbiAgICAvKiogVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzbG90IG5ldmVyIGdvdCB0aGF0IGZhciAoYSBzb3VyY2UgcmVtb3ZlZCBiZWZvcmUgaXRzIHJlZ2lzdHJhdGlvbiByZXNvbHZlZCkuICovXG4gICAgcHVibGljIHNsb3RTb3VyY2VzTGlzdEluZGV4KHNsb3Q6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgfVxuXG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QgLSBvbmx5IHZhbGlkIG9uY2UgdGhlIHNsb3QncyByZWdpc3RyYXRpb24gcmVzb2x2ZWQgKGluaXQgYW5kIHRoZSBzb3VyY2UncyBzeW5jIGxvb3AgZ3VhcmFudGVlIHRoYXQgYmVmb3JlIGFueSBpbmRleGluZyBoYXBwZW5zKVxuICAgIHB1YmxpYyBzb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNsb3Q6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHNsb3QgaXMgbm90IHJlZ2lzdGVyZWQgeWV0LiBTbG90ICR7c2xvdH0gKCR7dGhpcy5zb3VyY2VzW3Nsb3RdPy51cmx9KSBoYXMgbm8gc291cmNlc0xpc3RJbmRleCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIC8vIFRoZSBsaXZlIHNsb3QgY3VycmVudGx5IHNlcnZpbmcgYSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNvbmZpZ3VyZWQgc291cmNlIGhhcyB0aGF0IFVSTCBhbnltb3JlLiBMaW5lYXIsIGJ1dCB0aGUgc291cmNlcyBsaXN0IGlzIHRpbnkgYW5kIHRoaXMgaXMgYWx3YXlzIGN1cnJlbnQgKHNsb3RzIGR5aW5nLCBvciBzZXZlcmFsIHNsb3RzIHNoYXJpbmcgb25lIFVSTCBhY3Jvc3MgdmFsaWQgd2luZG93cywgbmVlZCBubyBib29ra2VlcGluZykuXG4gICAgcHVibGljIHNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW2ldID09PSBzb3VyY2VzTGlzdEluZGV4ICYmIHRoaXMuaXNMaXZlKGkpKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFRoZSBJQXJjaGl2ZXMgY3VycmVudGx5IGhvbGRpbmcgYW4gZW50cnkncyBieXRlczogdGhlIGxpdmUgc2xvdCB3aGVuIHRoZSBob2xkZXIgaXMgc3RpbGwgY29uZmlndXJlZCwgb3RoZXJ3aXNlIHJlc29sdmVkIChjYWNoZWQpIHN0cmFpZ2h0IGZyb20gaXRzIHBlcnNpc3RlZCBVUkwgLSB3aW5kb3dzL3JvdXRlcyBkZWNpZGUgd2hlbiBhIHNvdXJjZSBpcyBzY2FubmVkIG9yIHdyaXR0ZW4sIGJ1dCBmb3IgcmVhZGluZyBieXRlcyB3ZSBrbm93IGl0IGhvbGRzLCB0aGUgVVJMIGFsb25lIGlzIGVub3VnaFxuICAgIHB1YmxpYyBhc3luYyBnZXRFbnRyeUhvbGRlcihlbnRyeTogSW5kZXhFbnRyeSk6IFByb21pc2U8SUFyY2hpdmVzIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuc291cmNlc1tzbG90XS5zb3VyY2U7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNvdXJjZXNMaXN0LmdldFVybChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSB8fCBhd2FpdCB0aGlzLnNvdXJjZXNMaXN0LmdldFVybFJlbG9hZGluZyhlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZz8ucmVzb2x2ZVNvdXJjZVVybD8uKHVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5kZXgubG9hZCgpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAoc2VlIFN0b3JlU3luYydzIHNjYW4gaGFuZGxpbmcpLCBhbmQgYSBsb2FkZWQgYnVja2V0IGFsd2F5cyBoYXMgaXQgdGhlcmUgLSBhIHBlcnNpc3RlZCBlbnRyeSBwb2ludGluZyBlbHNld2hlcmUgaXMgc3RhbGUsIHNvIGl0IGlzIGNvcnJlY3RlZCBvbmNlLCBoZXJlXG4gICAgICAgIGxldCByb3V0aW5nID0gdGhpcy5nZXRJbmRleEVudHJ5KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGxldCBiYXNlU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKTtcbiAgICAgICAgaWYgKHJvdXRpbmcgJiYgcm91dGluZy5zb3VyY2VzTGlzdEluZGV4ICE9PSBiYXNlU291cmNlc0xpc3RJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KFJPVVRJTkdfRklMRSwgeyB3cml0ZVRpbWU6IHJvdXRpbmcud3JpdGVUaW1lLCBzaXplOiByb3V0aW5nLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGJhc2VTb3VyY2VzTGlzdEluZGV4IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSB3ZSBob2xkLiBBIGRlbGV0ZWQgb25lIGlzIG5vdCBvbmU6IGl0IGlzIGEgdG9tYnN0b25lLCBhbmQgb25seSBnZXREZWxldGVkRW50cnkga25vd3MgYWJvdXQgaXQuICovXG4gICAgcHVibGljIGdldEluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiBJbmRleEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5pbmRleC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogV2hlbiBhIGtleSB3YXMgZGVsZXRlZCwgaWYgaXQgd2FzLiBBIGRlbGV0aW9uIGlzIGFuIGFic2VuY2Ugd2l0aCBhIHRpbWUgYXR0YWNoZWQgLSB0aGF0IHRpbWUgaXMgd2hhdCBtYWtlcyBpdCBwcm9wYWdhdGUgYW5kIHdoYXQgZXhwaXJlcyBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0RGVsZXRlZEVudHJ5KGtleTogc3RyaW5nKTogeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCB0b21ic3RvbmUgPSB0aGlzLmluZGV4LmdldERlbGV0ZWQoa2V5KTtcbiAgICAgICAgaWYgKCF0b21ic3RvbmUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBmaWxlIHdlIGhvbGQsIGZvciB0aGUgcGFzc2VzIHRoYXQgd2FsayB0aGVtIGFsbCAobGlzdGluZ3MsIHNjYW5zLCByZWNvbmNpbGlhdGlvbiwgZXZpY3Rpb24pLiBEZWxldGlvbnMgYXJlIG5vdCBpbiBoZXJlIC0gc2VlIGRlbGV0ZWRFbnRyaWVzLiBMaXZlOiBkZWxldGluZyBlbnRyaWVzIHdoaWxlIGl0ZXJhdGluZyBpcyBleHBlY3RlZCBoZXJlLCBhbmQgc2FmZS4gKi9cbiAgICBwdWJsaWMgKmluZGV4RW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEluZGV4RW50cnldPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4LmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFdmVyeSBkZWxldGlvbiB3ZSBrbm93IG9mLiBBIG11Y2ggc21hbGxlciB3YWxrIHRoYW4gdGhlIGZpbGVzLCB3aGljaCBpcyB3aGF0IG1ha2VzIGV4cGlyaW5nIHRoZW0gY2hlYXAuICovXG4gICAgcHVibGljICpkZWxldGVkRW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH1dPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5pbmRleC5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IHdyaXRlVGltZTogdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZpbGUgTUFSS0VEIGZvciBkZWxldGlvbjogaXRzIGtlcHQgaW5kZXggdmFsdWUgcGx1cyB3aGVuIGl0IHdhcyBkZWxldGVkLiBVbmRlZmluZWQgd2hlbiB0aGUga2V5IGlzIGxpdmUsIG5ldmVyIGV4aXN0ZWQsIG9yIGl0cyBoaXN0b3J5IHdhcyBhbHJlYWR5IGRyb3BwZWQuICovXG4gICAgcHVibGljIGdldE1hcmtlZEVudHJ5KGtleTogc3RyaW5nKTogKEluZGV4RW50cnkgJiB7IGRlbGV0ZVRpbWU6IG51bWJlciB9KSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCB0b21ic3RvbmUgPSB0aGlzLmluZGV4LmdldERlbGV0ZWQoa2V5KTtcbiAgICAgICAgaWYgKCF0b21ic3RvbmUgfHwgdG9tYnN0b25lLnZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLnRvbWJzdG9uZS52YWx1ZSwgd3JpdGVUaW1lOiB0b21ic3RvbmUudmFsdWVUaW1lIHx8IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQsIGRlbGV0ZVRpbWU6IHRvbWJzdG9uZS50aW1lIH07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGZpbGUgbWFya2VkIGZvciBkZWxldGlvbiAtIHRoZSBkZWxldGlvbiBoaXN0b3J5LCB3YWxrZWQgYnkgcmV0ZW50aW9uIGFuZCBieSBpbmNsdWRlTWFya2VkIGxpc3RpbmdzLiAqL1xuICAgIHB1YmxpYyAqbWFya2VkRW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEluZGV4RW50cnkgJiB7IGRlbGV0ZVRpbWU6IG51bWJlciB9XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuaW5kZXguZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRvbWJzdG9uZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgLi4udG9tYnN0b25lLnZhbHVlLCB3cml0ZVRpbWU6IHRvbWJzdG9uZS52YWx1ZVRpbWUgfHwgdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCwgZGVsZXRlVGltZTogdG9tYnN0b25lLnRpbWUgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGRlbGV0aW9uIGhpc3RvcnkncyB0b3RhbHM6IGhvdyBtYW55IG1hcmtlZCBmaWxlcywgdGhlaXIgYnl0ZXMsIGFuZCB0aGUgZGVsZXRlIHRpbWUgb2YgdGhlIE9MREVTVCBvbmUgLSB3aGljaCBpcyBob3cgZmFyIGJhY2sgdGhlIGhpc3RvcnkgcmVhY2hlcy4gKi9cbiAgICBwdWJsaWMgbWFya2VkVG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBvbGRlc3REZWxldGVUaW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IFssIGVudHJ5XSBvZiB0aGlzLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvbGRlc3REZWxldGVUaW1lID09PSB1bmRlZmluZWQgfHwgZW50cnkuZGVsZXRlVGltZSA8IG9sZGVzdERlbGV0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBvbGRlc3REZWxldGVUaW1lID0gZW50cnkuZGVsZXRlVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgb2xkZXN0RGVsZXRlVGltZSB9O1xuICAgIH1cblxuICAgIC8qKiBQaHlzaWNhbGx5IHJlbW92ZXMgYSBtYXJrZWQgZmlsZSdzIGJ5dGVzIGZyb20gb3VyIGRpc2sgYW5kIGRyb3BzIGl0cyBrZXB0IHZhbHVlLCBsZWF2aW5nIGEgcGxhaW4gdG9tYnN0b25lIHRoYXQgYWdlcyBvdXQgbm9ybWFsbHkgLSByZXRlbnRpb24gY2FsbGluZyB0aW1lIG9uIHRoZSBvbGRlc3QgaGlzdG9yeS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZHJvcE1hcmtlZEhpc3Rvcnkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vd25EaXNrLmRlbChrZXkpO1xuICAgICAgICB0aGlzLmluZGV4LmRyb3BWYWx1ZShrZXkpO1xuICAgIH1cblxuICAgIC8qKiBTZWUgU2V0Q29uZmlnLnVuZGVsZXRlOiBmbGlwcyBhIG1hcmtlZCBkZWxldGlvbiBiYWNrIHRvIGxpdmUgKGZyZXNoIHdyaXRlIHRpbWUsIHNvIHRoZSByZXN0b3JlIG91dHJhbmtzIHRoZSBkZWxldGlvbiBldmVyeXdoZXJlIGl0IHByb3BhZ2F0ZWQpIC0gdGhlIGJ5dGVzIG5ldmVyIGxlZnQgdGhlIGRpc2ssIHNvIHJlYWRzIGp1c3Qgd29yayBhZ2Fpbi4gSW50ZXJuYWwgcmVzdG9yZXMgYXJlIGEgcGVlcidzIHByb3BhZ2F0aW9uIGFuZCB0b2xlcmF0ZSBoYXZpbmcgbm90aGluZyB0byByZXN0b3JlICh0aGlzIG5vZGUgbWF5IG5ldmVyIGhhdmUgaGVsZCB0aGUgZmlsZSk7IGEgY2FsbGVyJ3MgcmVzdG9yZSB0aHJvd3MgaW5zdGVhZC4gKi9cbiAgICBwcml2YXRlIGFzeW5jIHVuZGVsZXRlS2V5KGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgaW50ZXJuYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG1hcmtlZCA9IHRoaXMuZ2V0TWFya2VkRW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LnVubWFyayhrZXksIHdyaXRlVGltZSkpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgbGl2ZTogdW5kZWxldGUgaXMgaWRlbXBvdGVudCAocmV0cmllcyBhbmQgcGVlciBwcm9wYWdhdGlvbiBib3RoIHJlLXNlbmQgaXQpXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRJbmRleEVudHJ5KGtleSkpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmRlbGV0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgaGFzIG5vdGhpbmcgdG8gcmVzdG9yZSBoZXJlIC0gdGhpcyBub2RlIG1heSBuZXZlciBoYXZlIGhlbGQgdGhlIGZpbGVgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZGVsZXRlIGZhaWxlZCAtIG5vdGhpbmcgdG8gcmVzdG9yZS4gQ2Fubm90IHVuZGVsZXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogaXQgaGFzIG5vIG1hcmtlZCBkZWxldGlvbiB0byByZXN0b3JlIC0gaXQgd2FzIG5ldmVyIGRlbGV0ZWQgaGVyZSR7dGhpcy5nZXREZWxldGVkRW50cnkoa2V5KSAmJiBcIiwgb3IgaXRzIGRlbGV0aW9uIGhpc3Rvcnkgd2FzIGFscmVhZHkgZHJvcHBlZCAoYSBwbGFpbiB0b21ic3RvbmUgcmVtYWlucywgYnV0IHRoZSBieXRlcyBhcmUgZ29uZSlcIiB8fCBcIlwifWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBVbmRlbGV0ZWQgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiB0aGUgaW5kZXggZW50cnkgKCR7bWFya2VkPy5zaXplfSBieXRlcywgZGVsZXRlZCAke21hcmtlZCAmJiBuZXcgRGF0ZShtYXJrZWQuZGVsZXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIGxpdmUgYWdhaW4gYXMgb2YgJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9IC0gdGhlIGJ5dGVzIG5ldmVyIGxlZnQgdGhlIGRpc2tgKTtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJ1bmRlbGV0ZVwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGtleSwgc2l6ZTogbWFya2VkPy5zaXplLCB3cml0ZVRpbWUsIGludGVybmFsIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICBpZiAoaW50ZXJuYWwpIHJldHVybjtcbiAgICAgICAgLy8gUGVlcnMgbWFya2VkIHRoZWlyIG93biBjb3BpZXMgd2hlbiB0aGUgZGVsZXRpb24gcHJvcGFnYXRlZCwgc28gdGhlIHJlc3RvcmUgcHJvcGFnYXRlcyB0aGUgc2FtZSB3YXkuIFN0cmFpZ2h0IHBhc3QgYW55IHdyaXRlIGRlbGF5IC0gYSBidWZmZXJlZCB1bmRlbGV0ZSBjb3VsZCBiZSByZWFkIGJhY2sgYXMgaXRzIHBsYWNlaG9sZGVyIGJ5dGUuXG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIGZvciAobGV0IGkgb2YgdGhpcy5nZXRXcml0YWJsZVNvdXJjZXMoKSkge1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIE9ubHkgb3VyIG93biBzZXJ2ZXJzIHVuZGVyc3RhbmQgdGhlIGZsYWcgLSBhIHJhdyBzb3VyY2UgKGJhY2tibGF6ZSkgd291bGQgc3RvcmUgdGhlIHBsYWNlaG9sZGVyIGJ5dGUgYXMgdGhlIGZpbGUuIFRoZWlyIG9sZGVyIGNvcHkgaXMgcmUtcHVzaGVkIGJ5IHJlY29uY2lsaWF0aW9uIGluc3RlYWQuXG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VzW2ldLnNvdXJjZUNvbmZpZz8udHlwZSAhPT0gXCJyZW1vdGVcIikgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcHVzaCA9IHVud3JhcERlbGF5ZWQodGhpcy5zb3VyY2VzW2ldLnNvdXJjZSkuc2V0KGtleSwgVU5ERUxFVEVfUExBQ0VIT0xERVIsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIHVuZGVsZXRlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB2b2lkIHB1c2guY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nU3RvcmFnZUVycm9yKGBCYWNrZ3JvdW5kIHVuZGVsZXRlIG9mICR7a2V5fSBvbiBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIChpdHMgc2NhbiBvZiB1cyByZS1maW5kcyB0aGUgZmlsZSBhbnl3YXkpOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGZpbGVzIHdlIGhvbGQsIGRlbGV0aW9ucyBleGNsdWRlZC4gKi9cbiAgICBwdWJsaWMgaW5kZXhTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnNpemU7XG4gICAgfVxuXG4gICAgLyoqIFRvdGFscyBvdmVyIHRoZSBmaWxlcyB3ZSBob2xkLCBicm9rZW4gZG93biBieSB0aGUgc2xvdCBob2xkaW5nIGVhY2ggKGVudHJpZXMgY2FuIG5hbWUgYSBzb3VyY2UgdGhhdCBpcyBubyBsb25nZXIgY29uZmlndXJlZCwgd2hpY2ggY291bnRzIHRvd2FyZHMgdGhlIHRvdGFsIGJ1dCBubyBzbG90KS4gKi9cbiAgICBwdWJsaWMgaW5kZXhUb3RhbHMoKTogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNsb3RzOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB7XG4gICAgICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IHNsb3RzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAoeyBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IFssIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5maWxlQ291bnQrKztcbiAgICAgICAgICAgIHNsb3RzW3Nsb3RdLmJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBzbG90cyB9O1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgZmlsZSwgYXMgb2YgaXRzIHdyaXRlIHRpbWUuIFJldHVybnMgZmFsc2UsIGhhdmluZyBjaGFuZ2VkIG5vdGhpbmcsIHdoZW4gd2UgYWxyZWFkeSBrbm93IHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgLSB0aGUgaW5kZXggY2Fubm90IGJlIG1hZGUgdG8gZ28gYmFja3dhcmRzLCB3aGljaGV2ZXIgcGF0aCB0aGUgd3JpdGUgY2FtZSBpbiBieS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZywgZW50cnk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgc291cmNlc0xpc3RJbmRleDogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LnNldChrZXksIHsgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogZW50cnkuc291cmNlc0xpc3RJbmRleCB9LCBlbnRyeS53cml0ZVRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBsYW5kaW5nIGhlcmUgLSB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yLCBvciBwdWxsZWQgb2ZmIGEgcGVlciBieSBzeW5jaHJvbml6YXRpb24gLSBpcyBob3cgdGhpcyBzdG9yZSBsZWFybnMgd2hhdCBpdCBpcyBtZWFudCB0byBiZVxuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zeW5jU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgREVMRVRJT04sIGFzIG9mIGl0cyB0aW1lOiB0aGUga2V5IHN0b3BzIGV4aXN0aW5nIGhlcmUsIGFuZCB0aGUgdG9tYnN0b25lIGlzIHdoYXQgbWFrZXMgdGhhdCBmYWN0IHByb3BhZ2F0ZSBhbmQgcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLiBTYW1lIG9yZGVyaW5nIHJ1bGUgYXMgc2V0SW5kZXhFbnRyeS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhEZWxldGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXguZGVsZXRlKGtleSwgd3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRm9yZ2V0cyBhIGtleSBlbnRpcmVseSwgdG9tYnN0b25lIGluY2x1ZGVkLiBOT1QgYSBkZWxldGlvbjogaXQgc2F5cyBub3RoaW5nIGhhcHBlbmVkIHRvIHRoZSBmaWxlLCBvbmx5IHRoYXQgd2Ugbm8gbG9uZ2VyIGtub3cgYW55dGhpbmcgYWJvdXQgaXQgLSBmb3IgYW4gZW50cnkgd2hvc2UgaG9sZGVyIHR1cm5lZCBvdXQgbm90IHRvIGhhdmUgaXQsIGFuZCBmb3IgYSB0b21ic3RvbmUgb2xkIGVub3VnaCB0aGF0IGV2ZXJ5b25lIGhhcyBoZWFyZC4gKi9cbiAgICBwdWJsaWMgcHVyZ2VJbmRleEVudHJ5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5kZXgucHVyZ2Uoa2V5KTtcbiAgICB9XG5cbiAgICAvKiogQ291bnRzIGEgc3luY2hyb25pemF0aW9uIHRyYW5zZmVyIGluIHRoZSBzZXJ2ZXIncyBhY2Nlc3Mgc3RhdGlzdGljcyAoc2VlIGdldFN0b3JlJ3Mgd2lyaW5nKTogXCJzeW5jIGdldFwiIGZvciBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlLCBcInN5bmMgc2V0XCIgZm9yIGJ5dGVzIHB1c2hlZCB0byBvbmUuICovXG4gICAgcHVibGljIG5vdGVTeW5jVHJhbnNmZXIob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBvcGVyYXRpb24sIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aCwgc2l6ZTogYnl0ZXMgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vblN5bmNUcmFuc2Zlcj8uKG9wZXJhdGlvbiwgcGF0aCwgYnl0ZXMpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCB2YWxpZGF0aW9uIChmcm9tIHRoaXMgc3RvcmUncyBvd24gcm91dGluZyBlbnRyaWVzKSDilIDilIBcblxuICAgIC8qKlxuICAgICAqIEV2ZXJ5IHdyaXRlLCBob3dldmVyIGl0IGlzIHN0YW1wZWQsIGhhcyB0byBiZSBvbmUgd2UgYXJlIGFjdHVhbGx5IG1lYW50IHRvIGhvbGQgLSBiZWNhdXNlIHRoZVxuICAgICAqIGFsdGVybmF0aXZlIGlzIG5vdCBhIHNtYWxsZXIgcHJvYmxlbSwgaXQgaXMgYSBzaWxlbnQgb25lLiBBIHdyaXRlIHRoYXQgbGFuZHMgb24gYSBzdG9yZSB0aGF0XG4gICAgICogZG9lcyBub3Qgc2VydmUgaXRzIHJvdXRlIChvciBvbiBhIHNlcnZlciB0aGF0IGlzIG5vdCBpbiB0aGUgYnVja2V0J3MgY29uZmlnIGF0IGFsbCkgZ29lcyBpbnRvIGFcbiAgICAgKiBmb2xkZXIgbm90aGluZyBzY2FucyBhbmQgbm8gcGVlciByZWNvbmNpbGVzOiBpdCBzdWNjZWVkcywgYW5kIHRoZW4gaXQgaXMgZ29uZS4gVGhlIG1hcmtlcnMgbWFrZVxuICAgICAqIHRoZSBjbGllbnQgcmUtcmVhZCB0aGUgcm91dGluZyBjb25maWcgYW5kIHJldHJ5LCB3aGljaCBpcyBleGFjdGx5IHRoZSByaWdodCBvdXRjb21lIHdoZW4gdGhlXG4gICAgICogcmVhc29uIGl0IGFpbWVkIGhlcmUgaXMgdGhhdCBpdHMgY29uZmlnIHdhcyBzdGFsZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzc2VydFdyaXRlVGFyZ2V0KGtleTogc3RyaW5nLCByb3V0ZTogbnVtYmVyLCBsYXN0TW9kaWZpZWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZGV0YWlsID0gdGhpcy51bmNvbmZpZ3VyZWREZXRhaWwoKTtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3Rpbmcgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9YCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9OT1RfQ09ORklHVVJFRH0gV3JpdGUgcmVqZWN0ZWQ6IHRoaXMgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24uIENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH0gRGF0YSB3cml0dGVuIHRvIGEgc3RvcmUgd2l0aCBubyBjb25maWd1cmF0aW9uIGVudHJ5IHdvdWxkIG5ldmVyIGJlIHNjYW5uZWQgb3IgcmVjb25jaWxlZCwgc28gYWNjZXB0aW5nIGl0IHdvdWxkIHNpbGVudGx5IGxvc2UgaXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5IC0gb3IsIGlmIHRoaXMgc3RvcmUgaXMgZ2VudWluZWx5IG1lYW50IHRvIHRha2UgdGhpcyB3cml0ZSwgd3JpdGUgdGhlIGJ1Y2tldCdzIHJvdXRpbmcgY29uZmlnIHdpdGggYW4gZW50cnkgbmFtaW5nIGl0IG9uIHRoaXMgc2VydmVyLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5LCBEYXRlLm5vdygpLCByb3V0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzdGFtcGVkIHdyaXRlIHBpY2tlZCBpdHMgb3duIHRpbWUsIHNvIG5vIHdpbmRvdyBjYW4ganVkZ2UgaXQgKHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIGEgc3luY2hyb25pemVkIHdyaXRlKSAtIGJ1dCB0aGUgUk9VVEUgaXMgbm90IGEgbWF0dGVyIG9mIHRpbWluZywgYW5kIGEgc3RhbXBlZCB3cml0ZSB0byB0aGUgd3Jvbmcgc2hhcmQgaXMgZXhhY3RseSBhcyBpbnZpc2libGUgYXMgYSBmcmVzaCBvbmVcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkgcmV0dXJuO1xuICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHN0YW1wZWQgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHJvdXRlIHdlIHNlcnZlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFdyaXRlIHJlamVjdGVkOiB3cm9uZyByb3V0ZSBmb3IgdGhpcyBzdG9yZS4gUm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGtleSl9LCBvdXIgcm91dGVzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9LCBzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgIH1cblxuICAgIC8qKiBFeGFjdGx5IHdoeSB0aGlzIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uIGVudHJpZXMgLSB3aGljaCBvZiB0aGUgdGhyZWUgcG9zc2libGUgcmVhc29ucyBpdCBpcywgd2l0aCB0aGUgdmFsdWVzIHRoYXQgZGVjaWRlZCBpdCwgYmVjYXVzZSBcIm5vdCBjb25maWd1cmVkXCIgYWxvbmUgaXMgdW5kaWFnbm9zYWJsZS4gKi9cbiAgICBwcml2YXRlIHVuY29uZmlndXJlZERldGFpbCgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcm91dGluZyA9IHRoaXMuYXBwbGllZFJvdXRpbmc7XG4gICAgICAgIGxldCBpZGVudGl0eSA9IGBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSlgO1xuICAgICAgICBpZiAoIXJvdXRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaGFzIG5vIHJvdXRpbmcgY29uZmlnIGF0IGFsbCAtIG5vdGhpbmcgaGFzIGV2ZXIgd3JpdHRlbiAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGludG8gaXQuYDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2JqZWN0cyA9IHJvdXRpbmcuc291cmNlcy5maWx0ZXIoeCA9PiB0eXBlb2YgeCAhPT0gXCJzdHJpbmdcIikgYXMgU291cmNlQ29uZmlnW107XG4gICAgICAgIGxldCBuYW1lZCA9IG9iamVjdHMuZmlsdGVyKHggPT4geC5uYW1lID09PSB0aGlzLnN0b3JlTmFtZSk7XG4gICAgICAgIGlmICghbmFtZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGlzIHJ1bm5pbmcgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9LCB3aGljaCBoYXMgbm8gZW50cnkgbmFtZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChpdHMgZW50cmllcyBhcmUgbmFtZWQgJHtKU09OLnN0cmluZ2lmeShvYmplY3RzLm1hcCh4ID0+IHgubmFtZSkpfSkuYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGlzIHJ1bm5pbmcgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9LCB3aG9zZSAke25hbWVkLmxlbmd0aH0gZW50ciR7bmFtZWQubGVuZ3RoID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSBwb2ludChzKSBhdCAke0pTT04uc3RyaW5naWZ5KG5hbWVkLm1hcCh4ID0+IHgudXJsKSl9IC0gbm9uZSBvZiB3aGljaCBpcyBUSElTIHNlcnZlciwgc28gdGhlIGNvbmZpZyBzYXlzIHRoaXMgc3RvcmUgbGl2ZXMgZWxzZXdoZXJlLmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBhIHJvdXRpbmcgY29uZmlnIG1heSBiZSB3cml0dGVuIGhlcmUuIFR3byBydWxlcywgYW5kIHRoaXMgaXMgdGhlIG9uZSBwbGFjZSBlaXRoZXIgaXNcbiAgICAgKiBhcHBsaWVkIC0gYSBjb25maWcgb25seSBldmVyIGVudGVycyB0aGUgc3lzdGVtIHRocm91Z2ggYSB3cml0ZSwgc28gYSBjb25maWcgdGhhdCBnb3QgaW4gaXMgYVxuICAgICAqIGNvbmZpZyB0aGF0IHBhc3NlZCwgYW5kIHJlYWRpbmcgb25lIGJhY2sgbmV2ZXIganVkZ2VzIGl0IGFnYWluLlxuICAgICAqXG4gICAgICogVGhlIGNvbmZpZyBoYXMgdG8gYmUgdmFsaWQgYXMgYSB3aG9sZSAoc2VlIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKSwgYW5kIGl0IGhhcyB0byBvdXRyYW5rIHdoYXRcbiAgICAgKiB3ZSBhcmUgcnVubmluZzogdGhlIHNhbWUgdmVyc2lvbiBtZWFucyB0aGUgc2FtZSBjb25maWcsIHNvIHJlLXdyaXRpbmcgaXQgaXMgaGFybWxlc3MsIGJ1dCBhXG4gICAgICogbG93ZXIgb25lIGlzIGFuIG9sZGVyIGNvbmZpZyBhcnJpdmluZyBsYXRlIGFuZCBtdXN0IG5ldmVyIHVuZG8gYSBuZXdlciBvbmUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRSb3V0aW5nQ29uZmlnV3JpdGFibGUoZGF0YTogQnVmZmVyKTogdm9pZCB7XG4gICAgICAgIGxldCByb3V0aW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocm91dGluZyk7XG4gICAgICAgIGxldCBpbmNvbWluZyA9IGdldENvbmZpZ1ZlcnNpb24ocm91dGluZyk7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5yb3V0aW5nVmVyc2lvbigpO1xuICAgICAgICBpZiAoaW5jb21pbmcgPj0gY3VycmVudCkgcmV0dXJuO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIHdyaXRlIHJlZnVzZWQgLSB0aGUgdmVyc2lvbiBpcyBub3QgbmV3ZXIuIFJlZnVzaW5nIHRvIHdyaXRlICR7Uk9VVElOR19GSUxFfSB0byBzdG9yZSAke3RoaXMuZm9sZGVyfTogaXRzIHZlcnNpb24gKCR7aW5jb21pbmd9KSBpcyBvbGRlciB0aGFuIHRoZSBvbmUgdGhpcyBzdG9yZSBpcyBydW5uaW5nICgke2N1cnJlbnR9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBIGZyZXNoICh1bnN0YW1wZWQpIHdyaXRlIG11c3QgbGFuZCBvbiB0aGUgbm9kZSB0aGUgY29uZmlnIGN1cnJlbnRseSBwb2ludHMgYXQ6IHRoZSBtYXJrZXJzIHRlbGwgdGhlIGNsaWVudCBpdHMgY29uZmlnIGlzIHN0YWxlLCBzbyBpdCByZS1yZXNvbHZlcyBhbmQgcmV0cmllcyBhZ2FpbnN0IHRoZSByaWdodCBub2RlIGluc3RlYWQgb2YgdXMgc2lsZW50bHkgYWNjZXB0aW5nIGRhdGEgd2Ugd2VyZSBuZXZlciBtZWFudCB0byBob2xkLlxuICAgIHByaXZhdGUgYXNzZXJ0RnJlc2hXcml0ZVRhcmdldChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuZmlsdGVyKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBXcml0ZSByZWplY3RlZDogd3JpdGUgdGltZSBpcyBvdXRzaWRlIG91ciB2YWxpZCB3aW5kb3dzLiBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogaXRzIHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgZXZlcnkgdmFsaWQgd2luZG93IG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAod2luZG93czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0sIGZvbGRlciAke3RoaXMuZm9sZGVyfSkgLSBhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldC4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBXcml0ZSByZWplY3RlZDogd3Jvbmcgcm91dGUgZm9yIHRoaXMgc3RvcmUuIFJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXNzZXJ0TXV0YWJsZShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXcml0ZSByZWplY3RlZCAtIGltbXV0YWJsZSBzdG9yZSBhbmQgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuIEF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9LCAke0pTT04uc3RyaW5naWZ5KGtleSl9IGFscmVhZHkgZXhpc3RzIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgc3RvcmUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgIHByaXZhdGUgYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBjb3ZlcmVkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSByZWplY3RlZCAtIG91dHNpZGUgZXZlcnkgY29uZmlndXJlZCB3aW5kb3cvcm91dGUuIFdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBhdCByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHdpbmRvdy9yb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZDogcHVyZWx5IHRoZSBsb2NhbCBkaXNrLCBjb21wbGV0ZWx5IHNob3J0LWNpcmN1aXRpbmcgdGhlIGluZGV4IGFuZCBob2xkZXIgcmVzb2x1dGlvbiAtIHRoZSBjYWxsZXIgaXMgYW5vdGhlciBzdG9yZSwgYW5kIGNoYXNpbmcgT1VSIHJlbW90ZSBob2xkZXJzIHdoaWxlIGFuc3dlcmluZyBpdCBpcyBob3cgaW5maW5pdGUgZ2V0IGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE5vIHdpbmRvdyBvciByb3V0ZSBjaGVja3M6IGlmIHRoZSBieXRlcyBhcmUgb24gb3VyIGRpc2ssIHRoZSBjYWxsZXIgbWF5IGhhdmUgdGhlbS4gTm90ZSB0aGlzIHJlYWRzIHRoZSBkaXNrIHBhc3QgYW55IHdyaXRlIGRlbGF5LCBzbyBhIGZhc3Qgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gbWVtb3J5IGlzIGludmlzaWJsZSBoZXJlOyB0aGUgY2FsbGVyIHJlLWZpbmRzIGl0IG9uY2UgaXQgZmx1c2hlcy4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEludGVybmFsMihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIGluY2x1ZGVUb21ic3RvbmVzIGZvcndhcmRzIHRvIHRoZSBkaXNrOiBhIGZsYWctY2FsbGVyIChhIHBlZXIgc3RvcmUncyBzeW5jaHJvbml6YXRpb24pIG5lZWRzIHRvIHNlZSBvdXIgZGVsZXRpb25zLCBub3QganVzdCBvdXIgY29udGVudC4gQSB0b21ic3RvbmUgZGVsZXRlZCBmcm9tIGRpc2sgZW50aXJlbHkgb25seSBsaXZlcyBpbiBvdXIgaW5kZXgsIHNvIGZhbGwgYmFjayB0byB0aGF0LlxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5nZXQyKGNvbmZpZy5wYXRoLCB7IHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMgfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykge1xuICAgICAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoY29uZmlnLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChkZWxldGVkKSByZXR1cm4geyBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfTtcbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSB3cml0ZTogdGhlIGxvY2FsIGRpc2sgcGx1cyBvdXIgaW5kZXgsIHdpdGggTk8gZG93bnN0cmVhbSBmYW4tb3V0IC0gdGhlIHB1c2hpbmcgc3RvcmUgb3ducyBwcm9wYWdhdGlvbiwgYW5kIGZhbm5pbmcgaXRzIHB1c2hlcyBiYWNrIG91dCBpcyBob3cgd3JpdGUgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gT25seS10YWtlLWxhdGVzdCBzdGlsbCBhcHBsaWVzIGhlcmUuICovXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRJbnRlcm5hbChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgYnl0ZXMgc3RheSBvbiBvdXIgZGlzayBhcyBkZWxldGlvbiBoaXN0b3J5IChzZWUgd3JpdGVUb1NvdXJjZXMpIC0gdGhlIG1hcmtlZCBpbmRleCBlbnRyeSBpcyB0aGUgd2hvbGUgb2YgdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJkZWxcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJzZXRcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHNpemU6IGRhdGEubGVuZ3RoLCB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGludGVybmFsOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWFkJ3MgYnl0ZXMgY2FtZSBmcm9tIGEgcmVtb3RlIHNvdXJjZSwgc28gd3JpdGUgdGhlbSBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgd2hpY2ggYmVjb21lcyB0aGUgZW50cnkncyBuZXcgaG9sZGVyIC0gcmVhZHMgb25seSBwYXkgdGhlIHJlbW90ZSBmZXRjaCBvbmNlXG4gICAgcHJpdmF0ZSBhc3luYyBjYWNoZVJlYWQoa2V5OiBzdHJpbmcsIHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAvLyBBIGRvd24tY2FjaGUgcHVsbHMgdGhlIGJ5dGVzIG9mZiBhIHNvdXJjZSBleGFjdGx5IGxpa2Ugc3luY2hyb25pemF0aW9uIGRvZXMsIHNvIGl0IGNvdW50cyAoYW5kIGxvZ3MpIHRoZSBzYW1lIHdheVxuICAgICAgICB0aGlzLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBrZXksIHJlc3VsdC5kYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNoYXJlZCBlbmdpbmUgb2Ygc2V0IGFuZCBkZWw6IGFuIGVtcHR5IGJ1ZmZlciBpcyBleGFjdGx5IGEgZGVsZXRpb24gaGVyZSwgd2hpY2ggaXMgd2h5IHRoZSBlbXB0eS1idWZmZXIgcmVqZWN0aW9uIGxpdmVzIGluIHNldCAodGhlIHB1YmxpYyBBUEkpLCBub3QgaW4gdGhpcyBtYWNoaW5lcnlcbiAgICBwcml2YXRlIGFzeW5jIHNldE9yRGVsZXRlKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcIm9yaWdpbmFsXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IGNvbmZpZy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhc3Qgd3JpdGVzIGFyZSBub3QgaGFuZGxlZCBoZXJlOiBhIHNvdXJjZSB0aGF0IHdhcyBjb25maWd1cmVkIHdpdGggYSB3cml0ZSBkZWxheSBidWZmZXJzIHRoZW0gaXRzZWxmIChzZWUgQXJjaGl2ZXNEZWxheWVkKSwgc28gdGhpcyB3cml0ZSBsYW5kcyBpbiBtZW1vcnkgYW5kIHJldHVybnMsIGV4YWN0bHkgYXMgaXQgd291bGQgaGF2ZS4gVGhlIGluZGV4IGlzIHVwZGF0ZWQgZWl0aGVyIHdheSwgc28gdGhlIHdyaXRlIGlzIGltbWVkaWF0ZWx5IHZpc2libGUgdG8gcmVhZGVycyBvZiB0aGlzIHN0b3JlLlxuICAgICAgICBhd2FpdCB0aGlzLndyaXRlVG9Tb3VyY2VzKGtleSwgZGF0YSwgTWF0aC5mbG9vcihsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSkpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5zdGFudCBldmVyeSBkZWxheWVkIHdyaXRlIG11c3QgYmUgb24gaXRzIHNvdXJjZTogdGhlIGVuZCBvZiBvdXIgb3duIHdyaXRlIHdpbmRvdyB0aGF0IGNvbnRhaW5zIG5vdywgbWludXMgdGhlIGZsdXNoIG1hcmdpbiAoc28gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIGZpbmRzIHRoZSBkYXRhIG9uIGhhbmRvZmYpLiBUaGUgTEFURVNUIGVuZCBhbW9uZyBjb3ZlcmluZyB3aW5kb3dzIC0gb3ZlcmxhcHBpbmcgd2luZG93cyBoYW5kIG9mZiBhdCB0aGUgbGFzdCBvbmUuIE5vIHdpbmRvdyBjb250YWlucyBub3cgKGFuIGluZXJ0IHN0b3JlLCBvciBhIG1vbWVudCBiZXR3ZWVuIG91ciB3aW5kb3dzKSAtPiAwLCBpLmUuIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWQgYXQgYWxsLiAqL1xuICAgIHB1YmxpYyB3cml0ZUZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gQmVmb3JlIHVwZGF0ZVNvdXJjZXMgaGFzIHJ1biB0aGVyZSBpcyBub3RoaW5nIHRvIGhvbGQgYSB3cml0ZSBhbnl3YXksIGFuZCBub3RoaW5nIG1heSBiZSBkZWxheWVkXG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkgcmV0dXJuIDA7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgZW5kID0gMDtcbiAgICAgICAgZm9yIChsZXQgdyBvZiB0aGlzLnNvdXJjZXNbMF0udmFsaWRXaW5kb3dzKSB7XG4gICAgICAgICAgICBpZiAod1swXSA8PSBub3cgJiYgbm93IDwgd1sxXSkgZW5kID0gTWF0aC5tYXgoZW5kLCB3WzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVuZCkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBlbmQgLSBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyaXRhYmxlU291cmNlcyhjb25maWc/OiB7IGlnbm9yZVdpbmRvdz86IGJvb2xlYW4gfSk6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHdyaXRhYmxlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uaWdub3JlV2luZG93ICYmICF3aW5kb3dzQWNjZXB0V3JpdGVzKHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHdyaXRhYmxlLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRhYmxlO1xuICAgIH1cblxuICAgIC8vIE91ciBvd24gc291cmNlICh0aGUgZmlyc3Qgd3JpdGFibGUgb25lKSBwbHVzIGV2ZXJ5IHJvdXRlLW1hdGNoaW5nIHBlZXIuIEVhY2ggc291cmNlIGRlY2lkZXMgZm9yIGl0c2VsZiBob3cgbG9uZyBpdCBob2xkcyB0aGUgd3JpdGUgYmVmb3JlIGl0IGhpdHMgc3RvcmFnZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkgLSBoZXJlIHRoZXkgYWxsIGp1c3QgZ2V0IHdyaXR0ZW4uXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZVRvU291cmNlcyhrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIE5FVkVSIHN5bmNocm9uaXplZCBiZXR3ZWVuIHN0b3JhZ2Ugbm9kZXM6IHRoZSB3cml0ZXIgd3JpdGVzIGl0IGRpcmVjdGx5IHRvIGVhY2ggbm9kZSwgc28gd2Ugc3RvcmUgaXQgb24gb3VyIG93biBkaXNrIG9ubHkgKG5vIHZhbGlkLXdpbmRvdyBmaWx0ZXIgLSByb3V0aW5nL3ZhbGlkIHdpbmRvd3MgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gdGhlIGZpbGUgZGVmaW5pbmcgdGhlbSkgYW5kIG5ldmVyIGZvcndhcmQgaXQgdG8gb3RoZXIgc291cmNlcy5cbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJmbHVzaGVkXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGlzUm91dGluZyA9IGtleSA9PT0gUk9VVElOR19GSUxFO1xuICAgICAgICBsZXQgd3JpdGFibGUgPSB0aGlzLmdldFdyaXRhYmxlU291cmNlcyh7IGlnbm9yZVdpbmRvdzogaXNSb3V0aW5nIH0pO1xuICAgICAgICBsZXQgZmlyc3QgPSB3cml0YWJsZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgKGV2ZXJ5IHNvdXJjZSdzIHZhbGlkIHdpbmRvdyBpcyBpbiB0aGUgcGFzdCksIHNvIHdyaXRlcyBjYW5ub3QgYmUgc3RvcmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG91ciBvd24gKGZpcnN0KSBzb3VyY2UgYmxvY2tzIHRoZSB3cml0ZS4gRG93bnN0cmVhbSBzb3VyY2VzIGFyZSB3cml0dGVuIGluIHRoZSBiYWNrZ3JvdW5kOiBhIGRvd24gZG93bnN0cmVhbSBzb3VyY2UgbXVzdCBub3QgZmFpbCBvciBzdGFsbCB3cml0ZXMsIGFuZCByZWNvbmNpbGlhdGlvbiByZS1zZW5kcyBhbnl0aGluZyB0aGV5IG1pc3NlZCBvbmNlIHRoZXkgY29tZSBiYWNrLlxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBieXRlcyBTVEFZIG9uIG91ciBkaXNrLCBhcyBkZWxldGlvbiBoaXN0b3J5OiB0aGUgaW5kZXggbWFya3MgdGhlIGtleSBkZWxldGVkIChrZWVwaW5nIGl0cyB2YWx1ZSAtIHNlZSBUcmFuc2FjdGlvbkZpbGUuZGVsZXRlKSwgcmVhZHMgc3RvcCBmaW5kaW5nIGl0LCBhbmQgdGhlIHJldGVudGlvbiBwYXNzIHBoeXNpY2FsbHkgcmVtb3ZlcyB0aGUgb2xkZXN0IGhpc3Rvcnkgb25jZSBpdCBvdXRncm93cyBpdHMgYnVkZ2V0IChzZWUgU3RvcmVTeW5jLmVuZm9yY2VIaXN0b3J5TGltaXQpLiBUaGUgbWFya2VkIGluZGV4IGVudHJ5IGlzIHRoZSB3aG9sZSBvZiB0aGUgbG9jYWwgZGVsZXRpb24uXG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIHdyaXRlVGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lLCBzaXplOiBkYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KGZpcnN0KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBkYXRhLmxlbmd0aCA9PT0gMCAmJiBcImRlbFwiIHx8IFwic2V0XCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCBzaXplOiBkYXRhLmxlbmd0aCwgd3JpdGVUaW1lIH0pO1xuICAgICAgICBpZiAoaXNSb3V0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIC8vIERlbGV0aW9ucyBkaWQgbm90IGNvbnN1bWUgdGhlIGZpcnN0IHNsb3QgKG5vdGhpbmcgaXMgd3JpdHRlbiBhbnl3aGVyZSBsb2NhbGx5KSwgc28gaXQgcmVjZWl2ZXMgdGhlIHByb3BhZ2F0ZWQgZGVsZXRpb24gbGlrZSB0aGUgcmVzdCAtIGV4Y2VwdCBzbG90IDAsIG91ciBvd24gZGlzaywgd2hvc2UgYnl0ZXMgQVJFIHRoZSBoaXN0b3J5IGJlaW5nIGtlcHRcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwICYmIGZpcnN0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0YWJsZS51bnNoaWZ0KGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpIG9mIHdyaXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gRGVsZXRpb25zIHRyYXZlbCBhcyBkZWwgY2FycnlpbmcgdGhlIG9yaWdpbmFsIHdyaXRlIHRpbWUgKG5ldmVyIGFzIGVtcHR5IHNldHMgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKS4gQmFja2JsYXplIG1hdGVyaWFsaXplcyBzdWNoIGRlbHMgYXMgcmVhbCBlbXB0eSBmaWxlcywgc28gaXRzIGxpc3RpbmdzIHN0aWxsIHNob3cgdGhlIGRlbGV0aW9uIGZvciBvdGhlciBzdG9yZXMgdG8gc2NhbiBpbiBhcyBhIHRvbWJzdG9uZS5cbiAgICAgICAgICAgIGxldCBwdXNoOiBQcm9taXNlPHVua25vd24+O1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZGVsKGtleSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoID0gdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCBwdXNoLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQmFja2dyb3VuZCB3cml0ZSBvZiAke2tleX0gdG8gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3QgMCBpcyBhbHdheXMgdGhpcyBzdG9yZSdzIG93biBmb2xkZXIgKHNlZSBwbGFuU291cmNlcyksIHNvIHRoZSBkaXNrIGlzIGtub3duIHdpdGhvdXQgc2VhcmNoaW5nIGZvciBpdCAtIGFuZCBpdCBpcyB0aGUgdW53cmFwcGVkIG9uZSwgcGFzdCBhbnkgd3JpdGUgZGVsYXlcbiAgICBwcml2YXRlIGdldERpc2tTb3VyY2UoKTogeyBkaXNrOiBBcmNoaXZlc0Rpc2s7IHNvdXJjZUluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7IGRpc2s6IHRoaXMub3duRGlzaywgc291cmNlSW5kZXg6IDAgfTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgc3RpbGwgaGVsZCBieSBhIGRlbGF5ZWQgc291cmNlIChzZWUgQXJjaGl2ZXNEZWxheWVkKS4gZm9yY2UgYWxzbyB3cml0ZXMgd2hhdCBpc24ndCBkdWUgeWV0IC0gc2h1dGRvd24gY2Fubm90IGxlYXZlIHdyaXRlcyBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaERlbGF5ZWRXcml0ZXMoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IHsgc291cmNlIH0gb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgZGVsYXllZCA9IGFzRGVsYXllZChzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFkZWxheWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5ZWQuZmx1c2goZm9yY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxufVxuIl19
1084
- /* _JS_SOURCE_HASH = "cc30492c75b262f7b56b323e8d3887fdf57f71cd17e12757c2b35ff8a5728d8a"; */
1084
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELGtFQUErRTtBQUMvRSw0Q0FHc0I7QUFDdEIsa0RBQW1FO0FBQ25FLGlEQUFtTjtBQUNuTiwyQ0FBNEM7QUFDNUMsdURBQXFEO0FBQ3JELHdEQUFxRDtBQUNyRCwrQ0FBNEM7QUFDNUMsMkNBQXdDO0FBQ3hDLCtDQUE0QztBQUM1Qyx1REFBNkQ7QUFDN0QsK0NBQTZFO0FBRTdFLHFnQkFBcWdCO0FBRXJnQixtTkFBbU47QUFDdE0sUUFBQSx1QkFBdUIsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN4RCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsMkdBQTJHO0FBQzNHLE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDO0FBQzdDLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTlDLG9NQUFvTTtBQUN2TCxRQUFBLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsbUtBQW1LO0FBQzVKLEtBQUssVUFBVSxnQkFBZ0I7SUFDbEMsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUZELDRDQUVDO0FBb0NELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsdUJBQXVCLENBQUMsT0FBZTtJQUM1QyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsR0FBRyx5QkFBeUI7UUFBRSxPQUFPO0lBQ3hFLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJ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QUFXLElBQUksQ0FBQyxNQUFNLGFBQWEsTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pKLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCxnS0FBZ0s7SUFDeEosYUFBYTtRQUNqQixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCw2SkFBNko7SUFDckosS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWU7UUFDNUMsS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxHQUFHLElBQUEsMkJBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTztnQkFBRSxTQUFTO1lBQ3ZCLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQztDQUdKO0FBdGlDRCw4QkFzaUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBmb3JtYXREYXRlVGltZURldGFpbGVkIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRmluZENvbmZpZywgSG9zdGVkQ29uZmlnLCBSZW1vdGVDb25maWcsIFNvdXJjZUNvbmZpZywgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQsXG4gICAgd2luZG93c0FjY2VwdFdyaXRlcywgU3luY0FjdGl2aXR5LCBGVUxMX1JPVVRFLCBGVUxMX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfUk9VVEUsIFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzaywgYXBwbHlGaW5kSW5mb1NoYXBlIH0gZnJvbSBcIi4uL0FyY2hpdmVzRGlza1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcm91dGVJbnRlcnNlY3Rpb24sIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcsIGdldENvbmZpZ1ZlcnNpb24sIHNvdXJjZUlkZW50aXR5LCBzb3VyY2VQZXJzaXN0ZW50VXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBzZWxlY3RFbnRyeUF0IH0gZnJvbSBcIi4vc3RvcmVQbGFuXCI7XG5pbXBvcnQgeyBzb3VyY2VXcml0ZURlbGF5IH0gZnJvbSBcIi4vQXJjaGl2ZXNEZWxheWVkXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkZpbGUgfSBmcm9tIFwiLi4vVHJhbnNhY3Rpb25GaWxlXCI7XG5pbXBvcnQgeyBTb3VyY2VzTGlzdCB9IGZyb20gXCIuL3NvdXJjZXNMaXN0XCI7XG5pbXBvcnQgeyBTdG9yZVN5bmMgfSBmcm9tIFwiLi9zdG9yZVN5bmNcIjtcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSBcIi4vc3RvcmVDb25maWdcIjtcbmltcG9ydCB7IGFzRGVsYXllZCwgdW53cmFwRGVsYXllZCB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgbG9nTXV0YXRpb24sIGxvZ1N0b3JhZ2VFcnJvciwgbG9nU3RvcmFnZVdhcm4gfSBmcm9tIFwiLi9zdG9yYWdlTG9nc1wiO1xuXG4vLyBUaGUgc3RvcmFnZSBlbmdpbmUgb2YgdGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZlci4gRGF0YSBsaXZlcyBpbiBzeW5jaHJvbml6YXRpb24gc291cmNlcyAoYXQgbWluaW11bSBhbiBBcmNoaXZlc0Rpc2ssIHRoZSBsb2NhbCBkaXNrKTsgQmxvYlN0b3JlIGtlZXBzIGFuIGluZGV4IG9mIGV2ZXJ5IGZpbGUgKHBhdGgsIGxhc3QgbW9kaWZpZWQgdGltZSwgc2l6ZSwgYW5kIHdoaWNoIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgdGhlIGRhdGEpIGluIGEgQnVsa0RhdGFiYXNlMiwgYW5kIGFuc3dlcnMgZXZlcnkgcmVhZCBmcm9tIGl0IChzZWUgQXJjaGl2ZXNTb3VyY2UgaW4gSUFyY2hpdmVzLnRzKS4gS2VlcGluZyB0aGF0IGluZGV4IGluIGFncmVlbWVudCB3aXRoIHRoZSBzb3VyY2VzIGlzIFN0b3JlU3luYydzIGpvYiwgbm90IHRoaXMgZmlsZSdzOyB3aGF0IGxpdmVzIGhlcmUgaXMgdGhlIGluZGV4IGl0c2VsZiwgcmVhZHMsIHdyaXRlcywgYW5kIHRoZSB2YWxpZGF0aW9uIGEgd3JpdGUgaGFzIHRvIHBhc3MuXG5cbi8vIEZhc3Qgd3JpdGVzIGFyZSBuZXZlciBkZWxheWVkIHBhc3Qgb3VyIG93biB2YWxpZCB3aW5kb3csIGFuZCB3aXRoaW4gdGhpcyBtYXJnaW4gb2YgdGhlIHdpbmRvdydzIGVuZCB0aGV5IHdyaXRlIHRocm91Z2ggaW1tZWRpYXRlbHkgLSBzbyB3aGVuIHRoZSBuZXh0IHdpbmRvdydzIHNvdXJjZSB0YWtlcyBvdmVyLCB0aGUgd3JpdGVzIGFyZSBhbHJlYWR5IG9uIGRpc2tcbmV4cG9ydCBjb25zdCBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTiA9IHRpbWVJbk1pbnV0ZSAqIDU7XG5jb25zdCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFID0gNjAgKiAxMDAwO1xuLy8gTWFya3MgYW4gdXBsb2FkIGlkIHRoYXQgbmV2ZXIgcmVhY2hlZCB0aGUgZGlzaywgc28gaXQgY2FuIG5ldmVyIGNvbGxpZGUgd2l0aCBvbmUgQXJjaGl2ZXNEaXNrIGhhbmRlZCBvdXRcbmNvbnN0IERJU0NBUkRFRF9VUExPQURfUFJFRklYID0gXCJkaXNjYXJkZWRfXCI7XG4vLyBzZXQgcmVmdXNlcyBlbXB0eSBidWZmZXJzLCBhbmQgYW4gdW5kZWxldGUgY2FycmllcyBubyBkYXRhIC0gdGhpcyBzaW5nbGUgaWdub3JlZCBieXRlIHNhdGlzZmllcyB0aGUgd2lyZVxuY29uc3QgVU5ERUxFVEVfUExBQ0VIT0xERVIgPSBCdWZmZXIuZnJvbShbMV0pO1xuXG4vLyBEZWxldGlvbiBoaXN0b3J5OiBkZWxldGVkIGZpbGVzIGtlZXAgdGhlaXIgYnl0ZXMgb24gZGlzayAobWFya2VkIGluIHRoZSBpbmRleCkgdW50aWwgdGhlIGhpc3Rvcnkgb3V0Z3Jvd3MgbWF4KEhJU1RPUllfTUlOX0JZVEVTLCBsaXZlIGJ5dGVzICogaGlzdG9yeSBmYWN0b3IpIC0gc2VlIFN0b3JlU3luYy5lbmZvcmNlSGlzdG9yeUxpbWl0XG5leHBvcnQgY29uc3QgSElTVE9SWV9NSU5fQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0ICogMTAyNDtcbmNvbnN0IEhJU1RPUllfRkFDVE9SID0gMTtcbi8qKiBUaGUgbXVsdGlwbGUgb2YgYSBzdG9yZSdzIGxpdmUgYnl0ZXMgaXRzIGRlbGV0aW9uIGhpc3RvcnkgbWF5IGdyb3cgdG8uIEFzeW5jIHNvIGl0IGNhbiBsYXRlciBiZWNvbWUgZHluYW1pYyBhbmQgdXNlci1jb25maWd1cmFibGU7IGZvciBub3cgaXQgaXMgYSBjb25zdGFudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRIaXN0b3J5RmFjdG9yKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIEhJU1RPUllfRkFDVE9SO1xufVxuXG5cbi8qKiBXaGF0IHdlIHN0b3JlIGFib3V0IGEgZmlsZS4gSXRzIHRpbWVzIGFyZSBub3QgaW4gaGVyZTogdGhlIGluZGV4IGtlZXBzIHRob3NlIGZvciBldmVyeSBrZXksIGRlbGV0ZWQgb25lcyBpbmNsdWRlZCAoc2VlIFRyYW5zYWN0aW9uRmlsZSkuICovXG50eXBlIEluZGV4VmFsdWUgPSB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8vIFdoaWNoIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhOiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHNvdXJjZSdzIFVSTCBpbiB0aGUgc3RvcmUncyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QgKHNlZSBTb3VyY2VzTGlzdCkgLSBOT1QgYSBwb3NpdGlvbiBpbiB0aGUgaW4tbWVtb3J5IHNvdXJjZXMgYXJyYXksIHdoaWNoIGNoYW5nZXMgYmV0d2VlbiBydW5zXG4gICAgc291cmNlc0xpc3RJbmRleDogbnVtYmVyO1xufTtcblxuLyoqIE9uZSBmaWxlIHdlIGhvbGQsIGFzIGV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgaW5kZXggc2VlcyBpdC4gKi9cbmV4cG9ydCB0eXBlIEluZGV4RW50cnkgPSBJbmRleFZhbHVlICYge1xuICAgIHdyaXRlVGltZTogbnVtYmVyO1xuICAgIC8vIFdoZW4gV0UgbGFzdCBjaGFuZ2VkIHRoaXMgZW50cnkgKG5vdCB0aGUgZmlsZSdzIHdyaXRlIHRpbWUpIOKAlCB3aGF0IGdldENoYW5nZXNBZnRlcjIgZmlsdGVycyBvbiwgc28gbGF0ZS1hcnJpdmluZyBmaWxlcyB3aXRoIG9sZCB3cml0ZSB0aW1lcyBhcmUgc3RpbGwgcmVwb3J0ZWRcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbn07XG5cbi8vIE9uZSBzb3VyY2Ugb2YgYSBsaXZlIHNvdXJjZS1saXN0IHVwZGF0ZTsgc2VlIEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzXG5leHBvcnQgdHlwZSBCbG9iU291cmNlU3BlYyA9IHtcbiAgICAvLyBNYXRjaGVkIGFnYWluc3QgQXJjaGl2ZXNTb3VyY2UuaWRlbnRpdHkgKFwiZGlza1wiIGZvciB0aGUgYmFzZSBzbG90KTsgZXF1YWwgaWRlbnRpdGllcyBwYWlyIG9mZiBpbiBvcmRlclxuICAgIGlkZW50aXR5OiBzdHJpbmc7XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLnVybFxuICAgIHVybDogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2UuaW50ZXJtZWRpYXRlXG4gICAgaW50ZXJtZWRpYXRlPzogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS5zb3VyY2VDb25maWcgKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpXG4gICAgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnO1xuICAgIC8vIE9ubHkgY2FsbGVkIGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgbWF0Y2ggYW4gZXhpc3RpbmcgbGl2ZSBzbG90XG4gICAgY3JlYXRlOiAoKSA9PiBJQXJjaGl2ZXM7XG4gICAgLy8gVGhlIG9wcG9zaXRlIGNhc2U6IHRoZSBlbmRwb2ludCBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIG9ubHkgaXRzIGNvbmZpZyBjaGFuZ2VkLCBzbyB0aGUgUlVOTklORyBzb3VyY2UgaXMgaGFuZGVkIHRoZSBuZXcgb25lIChzZWUgYXBwbHlTb3VyY2VDb25maWcpXG4gICAgYXBwbHlDb25maWc/OiAoc291cmNlOiBJQXJjaGl2ZXMpID0+IHZvaWQ7XG59O1xuXG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgbG9nU3RvcmFnZUVycm9yKG1lc3NhZ2UpO1xufVxuXG4vLyBUaGUgYnVja2V0IHN0b3JlLCBhbmQgdGhlIG9ubHkgb25lOiBldmVyeSBidWNrZXQgYSBzZXJ2ZXIgaG9sZHMgaXMgc2VydmVkIGJ5IHRoZXNlLCBvbmUgcGVyIHN0b3JlIG5hbWUgaW4gaXRzIHJvdXRpbmcgY29uZmlnLiBJdHMgc291cmNlcyBhcmUgcGxhaW4gSUFyY2hpdmVzIC0gdGhlIGZpcnN0IGlzIGFsd2F5cyB0aGUgc3RvcmUncyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgY29uZmlndXJlZCBwZWVycyAoc2VlIGNyZWF0ZVN0b3JlU291cmNlKSAtIHNvIFwibm8gc3luY2hyb25pemF0aW9uXCIgaXMgc2ltcGx5IGEgc3RvcmUgd2l0aCBubyBwZWVycywgbm90IGEgZGlmZmVyZW50IGtpbmQgb2Ygc3RvcmUuXG5leHBvcnQgY2xhc3MgQmxvYlN0b3JlIHtcbiAgICAvLyDilIDilIAgc3RhdGUg4pSA4pSAXG4gICAgLy8gU2V0IG9uY2UgdGhlIHN0b3JlIGlzIHNodXR0aW5nIGRvd247IGV2ZXJ5IGxvb3AgaXQgb3ducyAoYW5kIFN0b3JlU3luYydzIG1haW50ZW5hbmNlIGxvb3BzKSBzdG9wcyBvbiBpdFxuICAgIHB1YmxpYyBzdG9wcGVkID0geyBzdG9wOiBmYWxzZSB9O1xuICAgIC8vIFdoZXRoZXIgaW5pdCBoYXMgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgYSBuZXdseSBhZGRlZCBzb3VyY2UgY2FuIHN0YXJ0IHNjYW5uaW5nIGltbWVkaWF0ZWx5XG4gICAgcHVibGljIHN5bmNTdGFydGVkID0gZmFsc2U7XG4gICAgLyoqIEl0cyBzb3VyY2VzLCBpbiBjb25maWcgb3JkZXI6IHNsb3QgMCBpcyBhbHdheXMgaXRzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBwZWVycyBpdCBzeW5jaHJvbml6ZXMgd2l0aC4gRmlsbGVkIGJ5IHVwZGF0ZVNvdXJjZXMsIHdoaWNoIGlzIGFsc28gaG93IHRoZXkgY2hhbmdlLiBUaGUgc3RvcmUgT1dOUyB0aGVtIC0gd3JpdGVzIHBpY2sgYW1vbmcgdGhlbSwgcmVhZHMgcmVzb2x2ZSBob2xkZXJzIHRocm91Z2ggdGhlbSAtIGFuZCBTdG9yZVN5bmMgb25seSBzY2FucyB3aGF0ZXZlciBpcyBpbiBoZXJlIGF0IHRoZSB0aW1lLiAqL1xuICAgIHB1YmxpYyBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gW107XG4gICAgLy8gVXBsb2FkcyBpbW11dGFiaWxpdHkgYWxyZWFkeSBkZWNpZGVkIGFnYWluc3Q6IHRoZSBjbGllbnQgaXMgbWlkLXN0cmVhbSBieSB0aGUgdGltZSB3ZSBrbm93LCBzbyBpdCBrZWVwcyBzZW5kaW5nIGFuZCBldmVyeSBwYXJ0IGlzIGRyb3BwZWRcbiAgICBwcml2YXRlIGRpc2NhcmRlZFVwbG9hZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIG5leHREaXNjYXJkZWRVcGxvYWQgPSAxO1xuICAgIC8vIFRoZSBwZXJzaXN0ZW50IGlkZW50aXRpZXMgYmVoaW5kIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCAoc2VlIFNvdXJjZXNMaXN0KVxuICAgIHByaXZhdGUgc291cmNlc0xpc3Q6IFNvdXJjZXNMaXN0O1xuICAgIC8vIFBlciBzbG90OiB0aGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIHRoYXQgc2xvdCdzIFVSTCwgZmlsbGVkIGJ5IHJlZ2lzdGVyU2xvdCBiZWZvcmUgdGhlIHNsb3QncyBzeW5jIHJ1bnNcbiAgICBwcml2YXRlIHNsb3RTb3VyY2VzTGlzdEluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSBzbG90UmVnaXN0cmF0aW9uczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgLy8gRXZlcnkgZmlsZSB3ZSBrbm93IG9mLCBpbiBtZW1vcnksIHdpdGggYW4gYXBwZW5kLW9ubHkgbG9nIG9mIHRoZSBjaGFuZ2VzIGJlaGluZCBpdCAoc2VlIFRyYW5zYWN0aW9uRmlsZSkuIEEgbmV3IGZpbGUgbmFtZSBlYWNoIHRpbWUgdGhlIGVudHJ5IGZvcm1hdCBjaGFuZ2VzIGdlbmVyYXRpb246IHRoZSBwcmV2aW91cyBvbmVzIGNhbm5vdCBiZSByZWFkLCBhbmQgYSBzY2FuIHJlYnVpbGRzIHRoZSBpbmRleCBhbnl3YXksIHNvIHRoZXkgYXJlIHNpbXBseSBuZXZlciByZWFkIGFnYWluLlxuICAgIHByaXZhdGUgaW5kZXg6IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPjtcbiAgICAvKiogS2VlcGluZyB0aGUgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXM6IHNjYW5uaW5nLCBwdWxsaW5nLCBwdXNoaW5nLCBhbmQgdGhlIG1haW50ZW5hbmNlIHRoYXQgZm9sbG93cyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGRpc2stbGltaXQgZXZpY3Rpb24sIHRvbWJzdG9uZSBleHBpcnkpLiBJdCByZWFkcyBhbmQgd3JpdGVzIHRoaXMgc3RvcmUncyBpbmRleCBhbmQgc291cmNlcyAtIGl0IGRvZXMgbm90IG93biB0aGVtLiAqL1xuICAgIHB1YmxpYyBzeW5jOiBTdG9yZVN5bmM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLy8gUHVibGljIGZvciBTdG9yZVN5bmMsIHdoaWNoIGxvZ3MgaXQgd2l0aCBldmVyeXRoaW5nIGl0IGRvZXNcbiAgICAgICAgcHVibGljIGZvbGRlcjogc3RyaW5nLFxuICAgICAgICAvKiogVGhlIG5hbWUgdGhpcyBzdG9yZSBhbnN3ZXJzIHRvIChzZWUgQ29tbW9uQ29uZmlnLm5hbWUpIC0gdGhlIGVudHJpZXMgb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoYXQgY2FycnkgaXQgYXJlIHRoZSBvbmVzIHRoYXQgY29uZmlndXJlIGl0LCBhbmQgdGhlIHJlc3QgYXJlIGl0cyBwZWVycy4gKi9cbiAgICAgICAgcHVibGljIHN0b3JlTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbmZpZz86IHtcbiAgICAgICAgICAgIC8qKiBXaGV0aGVyIGEgY29uZmlnIGVudHJ5IGlzIFRISVMgU0VSVkVSIChzYW1lIGFjY291bnQsIHNhbWUgYnVja2V0LCBvdXIgb3duIGFkZHJlc3MpLiBJbmplY3RlZCBiZWNhdXNlIGEgc3RvcmUga25vd3Mgbm90aGluZyBhYm91dCBzZXJ2ZXJzIC0gaXQgb25seSBuZWVkcyB0byB0ZWxsIGl0cyBvd24gZW50cmllcyBhcGFydCBmcm9tIGl0cyBwZWVycycuIEFic2VudCBtZWFucyBub3RoaW5nIGlzIHVzLCB3aGljaCBpcyB3aGF0IGEgYmFyZSBzdG9yZSAobm8gc2VydmVyIGFyb3VuZCBpdCkgd2FudHMuICovXG4gICAgICAgICAgICBpc1NlbGY/OiAoc291cmNlOiBTb3VyY2VDb25maWcpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAvKiogQnVpbGRzIG9uZSBvZiBpdHMgc291cmNlcy4gSW5qZWN0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiwgYW5kIGJlY2F1c2UgdGhlIGRlbGF5IGl0IGlzIGNyZWF0ZWQgd2l0aCBpcyB0aGlzIHN0b3JlJ3MgcG9saWN5LiAqL1xuICAgICAgICAgICAgY3JlYXRlU291cmNlPzogKGNvbmZpZzogeyBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7IHdyaXRlRGVsYXk6IG51bWJlciB9KSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgICAgICAvKiogSGFuZHMgYSBydW5uaW5nIHNvdXJjZSBhIGNoYW5nZWQgY29uZmlnLCBzbyBhbiBlbmRwb2ludCB3ZSBhbHJlYWR5IHRhbGsgdG8gaXMgbmV2ZXIgcmVidWlsdCBqdXN0IGJlY2F1c2UgYSBmbGFnIG1vdmVkLiAqL1xuICAgICAgICAgICAgYXBwbHlTb3VyY2U/OiAoc291cmNlOiBJQXJjaGl2ZXMsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB3cml0ZURlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBrZXkncyBpbmRleCBlbnRyeSBjaGFuZ2VzIChvdXIgb3duIHdyaXRlcyBBTkQgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb24pIOKAlCBob3cgdGhlIHN0b3JhZ2Ugc2VydmVyIG5vdGljZXMgcm91dGluZyBjb25maWcgdXBkYXRlcy5cbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkPzogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIENhbGxlZCBldmVyeSB0aW1lIHRoaXMgc3RvcmUgYXBwbGllcyBhIHJvdXRpbmcgY29uZmlnIHRvIGl0c2VsZiAoc3RhcnR1cCwgYW4gb3BlcmF0b3IncyB3cml0ZSwgYSBwZWVyJ3MgY29weSBhcnJpdmluZykgLSB0aGUgc3RvcmUgaXMgdGhlIG9uZSB0aGF0IGtub3dzIHdoZW4gYSBjb25maWcgbGFuZGVkLCBhbmQgdGhlIHNlcnZlciBhcm1zIHdpbmRvdy1ib3VuZGFyeSBzY2FucyBmcm9tIGl0LiAqL1xuICAgICAgICAgICAgb25Sb3V0aW5nQXBwbGllZD86IChyb3V0aW5nOiBSZW1vdGVDb25maWcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQXNrcyB0aGUgY2xpZW50IHdob3NlIHJlcXVlc3QgY3JlYXRlZCB0aGlzIHN0b3JlIHdoYXQgcm91dGluZyBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLiBPbmx5IHVzZWQgd2hlbiBpbml0IGZpbmRzIE5PIGNvbmZpZ3VyYXRpb24gaW4gb3VyIGZvbGRlcjogYSBzdG9yZSBvbmx5IGV2ZXIgZXhpc3RzIGJlY2F1c2UgYSBjb25maWcgbmFtZXMgaXQsIHNvIHRoZSByZXF1ZXN0ZXIgaGFzIHRoYXQgY29uZmlnIC0gYXNraW5nIGZvciBpdCBsYXppbHkgaXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgcGFzc2luZyB0aGUgY29uZmlnIG9uIGV2ZXJ5IGNhbGwsIHdpdGhvdXQgdGhlIHBlci1jYWxsIGtpbG9ieXRlcy4gKi9cbiAgICAgICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnPzogKCkgPT4gUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgLy8gRXZlcnkgYWNjZXB0ZWQgd3JpdGUgKFwib3JpZ2luYWxcIikgYW5kIGV2ZXJ5IHdyaXRlIHRoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcyAoXCJmbHVzaGVkXCIpLiBGYXN0IHdyaXRlcyBjb2FsZXNjZSwgc28gdGhlIHR3byBjb3VudHMgZGlmZmVyLlxuICAgICAgICAgICAgb25Xcml0ZUNvdW50ZWQ/OiAoa2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQSBzeW5jaHJvbml6YXRpb24gdHJhbnNmZXI6IFwic3luYyBnZXRcIiBpcyBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlICh0aGUgYmFja2JsYXplIGRvd25sb2FkIGJpbGwpLCBcInN5bmMgc2V0XCIgaXMgYnl0ZXMgcHVzaGVkIHRvIG9uZS4gSW5qZWN0ZWQgYmVjYXVzZSBzeW5jIHRyYWZmaWMgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSBjb250cm9sbGVyLCBzbyBub3RoaW5nIGVsc2UgY2FuIGNvdW50IGl0LiAqL1xuICAgICAgICAgICAgb25TeW5jVHJhbnNmZXI/OiAob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJzb3VyY2VzTGlzdC50eHRcIikpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPihwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwiYmxvYkluZGV4My5sb2dcIikpO1xuICAgICAgICB0aGlzLnN5bmMgPSBuZXcgU3RvcmVTeW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gbmV3IFN0b3JlQ29uZmlnKHN0b3JlTmFtZSwgW10pO1xuICAgICAgICB0aGlzLm93bkRpc2sgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgc3RvcmUncyBmb2xkZXIsIHVud3JhcHBlZDogdGhlIHNhbWUgYnl0ZXMgc2xvdCAwIHNlcnZlcywgYnV0IHJlYWNoZWQgd2l0aG91dCBpdHMgd3JpdGUgZGVsYXkuIFVzZWQgZm9yIHRoZSB0d28gdGhpbmdzIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBidWZmZXJlZCBzb3VyY2UgLSByZWFkaW5nIG91ciBvd24gcm91dGluZyBjb25maWcgYmVmb3JlIHdlIGhhdmUgYW55IHNvdXJjZXMsIGFuZCBzdHJlYW1pbmcgYSBsYXJnZSB1cGxvYWQgdGhhdCBtdXN0IG5vdCBzaXQgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgb3duRGlzazogQXJjaGl2ZXNEaXNrO1xuXG4gICAgLyoqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlLiBJdCBvd25zIHRoaXM6IHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIGZpbGUgSU4gdGhlIHN0b3JlLCBzbyB0aGUgc3RvcmUgcmVhZHMgaXQsIGFwcGxpZXMgaXQgdG8gaXRzZWxmLCBhbmQgcmUtYXBwbGllcyBpdCB3aGVuZXZlciB0aGUgZmlsZSBjaGFuZ2VzIC0gYnkgb3VyIG93biB3cml0ZSwgb3IgYnkgYSBwZWVyJ3MgY29weSBhcnJpdmluZyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgc3RvcmVDb25maWc6IFN0b3JlQ29uZmlnO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGxhc3QgYXBwbGllZCwgc28gYSB3cml0ZSBvZiBhbiBpZGVudGljYWwgKG9yIG9sZGVyKSBvbmUgaXMgbm90IHJlLWFwcGxpZWRcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IC0xO1xuICAgIC8vIC4uLmFuZCB0aGUgY29uZmlnIGl0c2VsZiwgc28gYSByZWplY3Rpb24gY2FuIHNheSBleGFjdGx5IHdoYXQgdGhlIHN0b3JlIElTIHJ1bm5pbmcgaW5zdGVhZCBvZiBndWVzc2luZ1xuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vICNyZWdpb24gTWFpbiBpbnRlcmZhY2VcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIENvbmZpZ3VyZSBmaXJzdDogdGhlIGNvbmZpZyBkZWNpZGVzIHdoYXQgdGhlIHNvdXJjZXMgQVJFLCBhbmQgZXZlcnl0aGluZyBiZWxvdyBpcyBwZXIgc291cmNlLiBXaXRoIG5vIGNvbmZpZyBhdCBhbGwgdGhhdCBpcyBqdXN0IG91ciBvd24gZGlzaywgd2hpY2ggaXMgZW5vdWdoIHRvIHNlcnZlIGFuZCB0byBiZSB3cml0dGVuIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAvLyBObyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXIgYXQgYWxsIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRoaXMgc3RvcmUgd2FzIGp1c3QgQ1JFQVRFRCBieSBhIHJlcXVlc3QsIGJlZm9yZSBhbnkgY29uZmlnIHdyaXRlIHJlYWNoZWQgaXQuIFRoZSByZXF1ZXN0ZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUsIHNvIGFzayBpdC5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCAmJiB0aGlzLmNvbmZpZz8ucmVxdWVzdFJvdXRpbmdDb25maWcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3ZpZGVkID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb247IHRoZSByZXF1ZXN0aW5nIGNsaWVudCBwcm92aWRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihwcm92aWRlZCl9IC0gYWRvcHRpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyYWlnaHQgb250byB0aGUgZGlzaywgbm90IHRocm91Z2ggc2V0KCk6IHNldCB3YWl0cyBmb3IgaW5pdCwgd2hpY2ggaXMgd2hhdCBpcyBydW5uaW5nIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHByb3ZpZGVkKSksIHsgbGFzdE1vZGlmaWVkOiBNYXRoLmZsb29yKERhdGUubm93KCkpIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VXYXJuKGBTdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgaW5pdGlhbGl6ZWQgd2l0aCBubyBjb25maWd1cmF0aW9uLCBhbmQgdGhlIHJlcXVlc3RpbmcgY2xpZW50IGhhZCBubyByb3V0aW5nIGNvbmZpZyBuYW1pbmcgaXQgZWl0aGVyIC0gcnVubmluZyB1bmNvbmZpZ3VyZWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nU3RvcmFnZUVycm9yKGBBc2tpbmcgdGhlIHJlcXVlc3RpbmcgY2xpZW50IGZvciB0aGUgcm91dGluZyBjb25maWcgb2Ygc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZCAtIHJ1bm5pbmcgdW5jb25maWd1cmVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyU2xvdChpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZnRlciB0aGUgc2xvdHMsIHdoaWNoIGlzIHdoYXQgaW5kZXggZW50cmllcyBuYW1lIGFzIHRoZWlyIGhvbGRlclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleCgpO1xuICAgICAgICB0aGlzLnN5bmNTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zeW5jLnN0YXJ0KCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZS1yZWFkcyB0aGUgcm91dGluZyBjb25maWcgb3V0IG9mIHRoaXMgc3RvcmUgYW5kIGFwcGxpZXMgaXQgdG8gaXRzZWxmLiBDYWxsZWQgYXQgc3RhcnR1cCBhbmRcbiAgICAgKiB3aGVuZXZlciB0aGF0IGZpbGUgY2hhbmdlcyBoZXJlIC0gd2hpY2ggaXMgdGhlIE9ORSBtZWNoYW5pc206IGEgY29uZmlnIHdyaXR0ZW4gYnkgYW4gb3BlcmF0b3JcbiAgICAgKiBhbmQgYSBjb25maWcgcHVsbGVkIG9mZiBhIHBlZXIgYXJlIHRoZSBzYW1lIGV2ZW50LCBhIHdyaXRlIG9mIHRoYXQgcGF0aCBpbnRvIHRoaXMgc3RvcmUuXG4gICAgICpcbiAgICAgKiBBIHN0b3JlIHdpdGggbm8gcm91dGluZyBjb25maWcgY29uZmlndXJlcyBpdHNlbGYgYXMgaXRzIG93biBkaXNrLCB2YWxpZCBhbHdheXMsIGZvciB0aGUgd2hvbGVcbiAgICAgKiBrZXkgc3BhY2UuIFRoYXQgaXMgYSBjb21wbGV0ZSwgd29ya2luZyBzdG9yZSAtIGl0IGp1c3QgaGFzIG5vYm9keSB0byBzeW5jaHJvbml6ZSB3aXRoIC0gYW5kIGl0XG4gICAgICogaXMgd2hhdCBsZXRzIGEgc3RvcmUgZXhpc3QgYmVmb3JlIGl0IGhhcyBldmVyIGhlYXJkIG9mIGEgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYXBwbHlSb3V0aW5nQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcm91dGluZyA9IGF3YWl0IHRoaXMucmVhZFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgbGV0IGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdID0gW107XG4gICAgICAgIGxldCBwZWVyczogU291cmNlQ29uZmlnW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJvdXRpbmc/LnNvdXJjZXMgfHwgW10pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUgJiYgdGhpcy5jb25maWc/LmlzU2VsZj8uKHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goc291cmNlIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZWVycy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRpbmcgJiYgIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dTdG9yYWdlV2FybihgVGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0pIGRvZXMgbm90IG5hbWUgdGhpcyBzdG9yZSAoJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9KSBhcyBvbmUgb2Ygb3Vycywgc28gaXQgc3RheXMgYSBkaXNrLW9ubHkgc3RvcmVgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJldmlvdXNWZXJzaW9uID0gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgICAgIGxldCBuZXdWZXJzaW9uID0gcm91dGluZyAmJiBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpIHx8IC0xO1xuICAgICAgICBpZiAobmV3VmVyc2lvbiAhPT0gcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGFkb3B0ZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke3ByZXZpb3VzVmVyc2lvbn0gLT4gJHtuZXdWZXJzaW9ufTogJHtlbnRyaWVzLmxlbmd0aH0gZW50ciR7ZW50cmllcy5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gb2Ygb3VycyAke0pTT04uc3RyaW5naWZ5KGVudHJpZXMubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0sICR7cGVlcnMubGVuZ3RofSBwZWVyKHMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZy51cGRhdGUoZW50cmllcyk7XG4gICAgICAgIHRoaXMudXBkYXRlU291cmNlcyh0aGlzLnBsYW5Tb3VyY2VzKHBlZXJzKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgICAgdGhpcy5hcHBsaWVkUm91dGluZyA9IHJvdXRpbmc7XG4gICAgICAgIGlmIChyb3V0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZz8ub25Sb3V0aW5nQXBwbGllZD8uKHJvdXRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGFzIHRoaXMgc3RvcmUgaG9sZHMgaXQsIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBmb2xkZXI6IHRoZSBzdG9yZSBtYXkgYmUgY29uZmlndXJpbmcgaXRzZWxmIGJlZm9yZSBpdCBoYXMgc2Nhbm5lZCBhbnl0aGluZywgYW5kIHRoaXMgZmlsZSBpcyB3aGF0IGRlY2lkZXMgd2hhdCBhIHNjYW4gd291bGQgZXZlbiB0YWxrIHRvXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMub3duRGlzay5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYElnbm9yaW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfTogaXQgY291bGQgbm90IGJlIHBhcnNlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoaXMgc3RvcmUgaXMgcnVubmluZywgc28gYSBjb3B5IGZvdW5kIG9uIGEgcGVlciBpcyBvbmx5IHRha2VuIHdoZW4gaXQgaXMgZ2VudWluZWx5IG5ld2VyLiAtMSBtZWFucyBpdCBoYXMgbm9uZS4gKi9cbiAgICBwdWJsaWMgcm91dGluZ1ZlcnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEFwcGx5aW5nIGl0IHRvdWNoZXMgdGhlIHNvdXJjZXMsIHNvIGl0IGlzIHNlcmlhbGl6ZWQgYmVoaW5kIHdoYXRldmVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZyByYXRoZXIgdGhhbiBpbnRlcmxlYXZpbmcgd2l0aCBpdFxuICAgIHByaXZhdGUgcm91dGluZ0FwcGxpZXM6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwdWJsaWMgcmVhcHBseVJvdXRpbmdDb25maWcoKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5yb3V0aW5nQXBwbGllcy50aGVuKCgpID0+IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCkpO1xuICAgICAgICB0aGlzLnJvdXRpbmdBcHBsaWVzID0gbmV4dC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICB2b2lkIG5leHQuY2F0Y2goKGU6IEVycm9yKSA9PiBsb2dTdG9yYWdlRXJyb3IoYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIGRpc2sgZmlyc3QgKGFsd2F5cyksIHRoZW4gZXZlcnkgcGVlciB3aG9zZSByb3V0ZSBvdmVybGFwcyBvdXJzIC0gdGhlIHNvdXJjZXMgdGhpcyBzdG9yZSBzeW5jaHJvbml6ZXMgd2l0aCwgYXMgaXRzIG93biBjb25maWcgZGVzY3JpYmVzIHRoZW1cbiAgICBwcml2YXRlIHBsYW5Tb3VyY2VzKHBlZXJzOiBTb3VyY2VDb25maWdbXSk6IEJsb2JTb3VyY2VTcGVjW10ge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpO1xuICAgICAgICBsZXQgbWFrZVNwZWMgPSAoc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdLCByb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgbm9GdWxsU3luYzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IEJsb2JTb3VyY2VTcGVjID0+IHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gc291cmNlV3JpdGVEZWxheSh7IHNvdXJjZUNvbmZpZywgZmFzdDogc2VsZi5mYXN0LCB3cml0ZURlbGF5OiBzZWxmLndyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlUGVyc2lzdGVudFVybChzb3VyY2VDb25maWcsIHRoaXMuZm9sZGVyKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZWQgPSB0aGlzLmNvbmZpZz8uY3JlYXRlU291cmNlPy4oeyBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGhhcyBubyB3YXkgdG8gYnVpbGQgc291cmNlcywgc28gaXQgY2Fubm90IHVzZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZz8udXJsIHx8IHRoaXMuZm9sZGVyKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUGFzcyBjcmVhdGVTb3VyY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBseUNvbmZpZzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB0aGlzLmNvbmZpZz8uYXBwbHlTb3VyY2U/Lihzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgYWNjZXB0cyB3cml0ZXMgd2hpbGUgQU5ZIHdpbmRvdyB0aGlzIHN0b3JlIGhvbGRzIGlzIG9wZW47IHdpdGggbm8gY29uZmlnIGF0IGFsbCBpdCBpcyBzaW1wbHkgYWx3YXlzIHZhbGlkXG4gICAgICAgIGxldCBvd25XaW5kb3dzID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KTtcbiAgICAgICAgbGV0IHNwZWNzOiBCbG9iU291cmNlU3BlY1tdID0gW21ha2VTcGVjKHVuZGVmaW5lZCwgb3duV2luZG93cy5sZW5ndGggJiYgb3duV2luZG93cyB8fCBbRlVMTF9WQUxJRF9XSU5ET1ddLCB1bmRlZmluZWQsIHVuZGVmaW5lZCldO1xuICAgICAgICAvLyBPbmUgc3BlYyBwZXIgZW5kcG9pbnQsIGNhcnJ5aW5nIGFsbCBvZiBpdHMgd2luZG93czogYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGFyb3VuZCBhbiBpbnRlcm1lZGlhdGUsIGFuZCB0aGF0IGlzIHN0aWxsIG9uZSBzb3VyY2UgdG8gdXNcbiAgICAgICAgbGV0IGJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgQmxvYlNvdXJjZVNwZWM+KCk7XG4gICAgICAgIGZvciAobGV0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgICAgICAgIGxldCBzaGFyZWQgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmLnJvdXRlLCBwZWVyLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IHNvdXJjZUlkZW50aXR5KHBlZXIpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlJZGVudGl0eS5nZXQoaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRXaW5kb3dzLnB1c2gocGVlci52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlYyA9IG1ha2VTcGVjKHBlZXIsIFtwZWVyLnZhbGlkV2luZG93XSwgc2hhcmVkLCBwZWVyLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jKTtcbiAgICAgICAgICAgIGJ5SWRlbnRpdHkuc2V0KGlkZW50aXR5LCBzcGVjKTtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwZWNzO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIE9ubHkgdXNlZCB3aGVuIHRoZSBzdG9yZSBnZW51aW5lbHkgY2Fubm90IGNvbnRpbnVlIChpdHMgcm91dGUgb3IgZGlzayBsaW1pdCBjaGFuZ2VkLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RvcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoRGVsYXllZFdyaXRlcyh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5mbHVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbnRlcm5hbD86IGJvb2xlYW47IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbjsgaW5jbHVkZU1hcmtlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbnRlcm5hbDIoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWcucmFuZ2U7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIC8vIEEgbWFya2VkIGRlbGV0aW9uIHN0aWxsIGhhcyBpdHMgYnl0ZXMsIGFuZCB0aGUga2VwdCB2YWx1ZSBzYXlzIHdoZXJlIC0gc28gYW4gaW5jbHVkZU1hcmtlZCByZWFkIGlzIGEgbm9ybWFsIHJlYWQgdGhyb3VnaCB0aGUgbWFya2VkIGVudHJ5IChpdCBqdXN0IG11c3Qgbm90IFJFLUlOREVYIGFueXRoaW5nOiBzZWUgdGhlIG1hcmtlZFJlYWQgZ3VhcmRzIGJlbG93KVxuICAgICAgICBsZXQgbWFya2VkUmVhZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVudHJ5ICYmIGNvbmZpZy5pbmNsdWRlTWFya2VkKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuZ2V0TWFya2VkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIG1hcmtlZFJlYWQgPSAhIWVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBoYXMgbm8gYnl0ZXMgLSB0aGUgdG9tYnN0b25lIElTIHRoZSBhbnN3ZXIsIHNvIGEgZmxhZy1jYWxsZXIgZ2V0cyBpdHMgdGltZSB3aXRoIGVtcHR5IGRhdGFcbiAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luYy5ub3RlQWNjZXNzKGtleSk7XG4gICAgICAgIGxldCBob2xkZXJBcmNoaXZlcyA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaG9sZGVyQXJjaGl2ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXM6IHRoZSBob2xkZXIgYW5zd2VyaW5nIFwiZGVsZXRlZFwiIChhIHRvbWJzdG9uZSwgd2l0aCBpdHMgd3JpdGUgdGltZSkgbXVzdCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIkkgbG9zdCB0aGUgZmlsZVwiIC0gdGhlIGZvcm1lciBpcyBhdXRob3JpdGF0aXZlIGFuZCBtdXN0IE5PVCBmYWxsIGJhY2sgdG8gb2xkZXIgY29waWVzLCB3aGljaCB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0aW9uIGZvciB0aGlzIHJlYWRcbiAgICAgICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgaG9sZGVyQXJjaGl2ZXMuZ2V0MihrZXksIHsgcmFuZ2UsIGludGVybmFsOiB0cnVlLCBpbmNsdWRlVG9tYnN0b25lczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmICFhbnN3ZXIuZGF0YS5sZW5ndGggJiYgIShyYW5nZSAmJiBhbnN3ZXIuc2l6ZSkgJiYgYW5zd2VyLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYSByYW5nZWQgcmVhZCBvZiBhIHJlYWwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IChyYW5nZSBwYXN0IEVPRiksIHNvIG9ubHkgdW5yYW5nZWQgZW1wdGluZXNzIG1lYW5zIHRvbWJzdG9uZS9hYnNlbnRcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIChhbnN3ZXIuZGF0YS5sZW5ndGggfHwgcmFuZ2UgJiYgYW5zd2VyLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpLCBhbmQgYSBtYXJrZWQgcmVhZCBtdXN0IG5vdCByZS1pbmRleCBhbnl0aGluZyAtIGNhY2hpbmcgd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGVkIGtleSBhcyBsaXZlXG4gICAgICAgICAgICBpZiAoIW1hcmtlZFJlYWQgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIHNvdXJjZSdzIGNvcHkgd291bGQgc3luY2hyb25pemUgaXQgYmV0d2VlbiBub2RlcyB0aHJvdWdoIHRoZSByZWFkIHBhdGgsIHdoaWNoIGl0IG5ldmVyIGlzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhbiBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGxldCBob2xkZXJTbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBob2xkZXJTbG90IHx8ICF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldDIoa2V5LCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgY291bnRzIGFzIGFic2VudCAtIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodGhpcyByZWFkIGlzIHVucmFuZ2VkLCBzbyBlbXB0aW5lc3MgaXMgdW5hbWJpZ3VvdXMpXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiBhbnN3ZXIuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgPSB7IGRhdGE6IGFuc3dlci5kYXRhLCB3cml0ZVRpbWU6IGFuc3dlci53cml0ZVRpbWUsIHNpemU6IGFuc3dlci5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgbWFya2VkIHJlYWQgbXVzdCBub3QgcmUtaW5kZXggYW55dGhpbmcgLSBjYWNoaW5nIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRlZCBrZXkgYXMgbGl2ZVxuICAgICAgICAgICAgaWYgKCFtYXJrZWRSZWFkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGUuIEZvcmdvdHRlbiByYXRoZXIgdGhhbiBkZWxldGVkIC0gbm90aGluZyBoYXBwZW5lZCB0byB0aGlzIGZpbGUsIHdlIHdlcmUgc2ltcGx5IHdyb25nIGFib3V0IGhvbGRpbmcgaXQsIGFuZCBzYXlpbmcgb3RoZXJ3aXNlIHdvdWxkIHB1c2ggYSBkZWxldGlvbiBvdXQgdG8gZXZlcnlvbmUgZWxzZS4gKE5ldmVyIGZvciBhIG1hcmtlZCByZWFkOiBwdXJnaW5nIHdvdWxkIGVyYXNlIHRoZSBkZWxldGlvbidzIHRvbWJzdG9uZS4pXG4gICAgICAgIGlmICghbWFya2VkUmVhZCkge1xuICAgICAgICAgICAgdGhpcy5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuOyB1bmRlbGV0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBwYXRoOiBrZXksIGRhdGEgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbXB0eSB3cml0ZSByZWZ1c2VkOiBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gTWF0aC5mbG9vcihjb25maWcubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGRlZmluZXMgdGhlIHdpbmRvd3Mvcm91dGVzLCBzbyB0aGV5IGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IChhbmQgaXQgbmV2ZXIgZmxvd3MgdGhyb3VnaCB2YWxpZGF0aW9uKSAtIGJ1dCBpdCBoYXMgYSBydWxlIG9mIGl0cyBvd24sIHdoaWNoIGlzIG91cnMgdG8gZW5mb3JjZSBiZWNhdXNlIHRoZSBmaWxlIGlzIG91cnNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy51bmRlbGV0ZSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgdW5kZWxldGVkIChpdCBjYW5ub3QgYmUgZGVsZXRlZCBpbiB0aGUgZmlyc3QgcGxhY2UpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVuZGVsZXRlS2V5KGtleSwgd3JpdGVUaW1lLCBjb25maWcuaW50ZXJuYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBleGVtcHQgZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBza2lwcyBldmVyeSBvdGhlciBjaGVjazogaXQgaXMgdGhlIGZpbGUgdGhhdCBERUZJTkVTIG91ciB3aW5kb3dzIGFuZCByb3V0ZXMsIHNvIGp1ZGdpbmcgaXQgYnkgdGhlIGNvbmZpZyBpdCBpcyBhYm91dCB0byByZXBsYWNlIGlzIGhvdyBhIHN0b3JlIGdldHMgc3R1Y2sgb24gYSBjb25maWcgaXQgY2FuIG5ldmVyIGJlIHRvbGQgdG8gbGVhdmVcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIGRlbGV0ZWQgKG92ZXJ3cml0ZSBpdCB0byBjaGFuZ2UgdGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIEEgZGVsZXRpb24gbGFuZHMgaW4gZXhhY3RseSB0aGUgc2FtZSBwbGFjZSBhIHdyaXRlIHdvdWxkLCBzbyBpdCBpcyBqdWRnZWQgdGhlIHNhbWUgd2F5OiBvbmUgYWltZWQgYXQgYSBzaGFyZCB3ZSBkb24ndCBzZXJ2ZSBpcyBqdXN0IGFzIGludmlzaWJsZSBhcyBhIHdyaXRlIHRvIGl0XG4gICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCBnZXRSb3V0ZShrZXkpLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBkZWxldGlvbnMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgICAgIC8vIHNldEludGVybmFsIHRyZWF0cyBhbiBlbXB0eSBidWZmZXIgYXMgZXhhY3RseSBhIGRlbGV0aW9uOiBkaXNrIHJlbW92YWwgcGx1cyBhIHRvbWJzdG9uZSBpbmRleCBlbnRyeSwgbm8gZmFuLW91dFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlcyBhcmUgd3JpdGVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHRvbWJzdG9uZSBpcyBvcmRlcmVkIGJ5IHdyaXRlIHRpbWUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIHByb3BhZ2F0ZXMgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24sIGFuZCBpcyBldmVudHVhbGx5IGV4cGlyZWRcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRPckRlbGV0ZShrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgLyoqIEEgbm9kZS1zaWRlIG1vdmU6IHRoZSBieXRlcyBuZXZlciB0cmF2ZWwgdGhyb3VnaCB0aGUgY2xpZW50LiBEZWxpYmVyYXRlbHkganVzdCBnZXQyICsgc2V0ICsgZGVsIHJhdGhlciB0aGFuIGEgZGlzayByZW5hbWUsIHNvIHRoZSBkZXN0aW5hdGlvbiB3cml0ZSBwYXNzZXMgRVZFUlkgcnVsZSBhIHNldCBwYXNzZXMgKHdpbmRvd3MsIHJvdXRlcywgaW1tdXRhYmlsaXR5LCBvbmx5LXRha2UtbGF0ZXN0LCBpbmRleCwgZmFuLW91dCB0byBwZWVycykgYW5kIHRoZSBkZWxldGlvbiBwcm9wYWdhdGVzIGFzIGEgbm9ybWFsIHRvbWJzdG9uZSAtIGEgcmVuYW1lIHdvdWxkIGJ5cGFzcyBhbGwgb2YgaXQuIFRoZSBzZXQgc3RhbXBzIGZyZXNoLCBzbyB0aGUgbW92ZWQgZmlsZSBiZWF0cyBhbnkgdG9tYnN0b25lIGF0IGl0cyBuZXcgcGF0aC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHsgZnJvbVBhdGg6IHN0cmluZzsgdG9QYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Mih7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoeyBwYXRoOiBjb25maWcudG9QYXRoLCBkYXRhOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWwoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwibW92ZVwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGNvbmZpZy5mcm9tUGF0aCwgdG9QYXRoOiBjb25maWcudG9QYXRoLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkgcmV0dXJuIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfTtcbiAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKGNvbmZpZzogRmluZENvbmZpZyAmIHsgcHJlZml4OiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgcHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgLy8gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSBhdCBhbGwsIHdoaWNoIGlzIHdoYXQgYSBsaXN0aW5nIHdhbnRzOiBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlXG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmluY2x1ZGVNYXJrZWQpIHtcbiAgICAgICAgICAgIC8vIEEga2V5IGlzIGxpdmUgT1IgbWFya2VkLCBuZXZlciBib3RoLCBzbyB0aGlzIGNhbm5vdCBjb2xsaWRlIHdpdGggdGhlIGxvb3AgYWJvdmVcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZXMgPSBhcHBseUZpbmRJbmZvU2hhcGUoQXJyYXkuZnJvbShpbmZvcy52YWx1ZXMoKSksIHByZWZpeCwgeyBzaGFsbG93OiBjb25maWcuc2hhbGxvdywgdHlwZTogY29uZmlnLnR5cGUgfSk7XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8vIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIGNvbmZpZy50aW1lIOKAlCBzdHJhaWdodCBmcm9tIHRoZSBpbmRleC4gRmlsdGVycyBvbiB3aGVuIFdFIGxlYXJuZWQgb2YgdGhlIGNoYW5nZSAoY2hhbmdlZEF0KSwgc28gZmlsZXMgc3luY2hyb25pemVkIGxhdGUgKHdpdGggb2xkIHdyaXRlIHRpbWVzKSBhcmUgc3RpbGwgcmVwb3J0ZWQuIERlbGV0aW9ucyBBUkUgcmVwb3J0ZWQsIGFzIHNpemUtMCBlbnRyaWVzOiBhIGNhbGxlciByZWFkaW5nIGEgY2hhbmdlIGZlZWQgaGFzIHRvIGhlYXIgYWJvdXQgdGhlbSwgYW5kIHNpemUgMCBpcyBob3cgdGhlIGZlZWQgc2F5cyBcImdvbmVcIiAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSkuIGNvbmZpZy5yb3V0ZXMgbGV0cyBhIHN0b3JlIHN5bmNpbmcgYSBwYXJ0aWFsIHNoYXJkIGFzayBmb3IganVzdCBpdHMgc2xpY2UuXG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGluUm91dGVzID0gKGtleTogc3RyaW5nKSA9PiAhY29uZmlnLnJvdXRlcyB8fCBjb25maWcucm91dGVzLnNvbWUocm91dGUgPT4gcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpO1xuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdID0gW107XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lLCBzaXplOiAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5kZXgncyB0b3RhbHMgcGx1cyBhbnkgaW4tcHJvZ3Jlc3MgYmFja2dyb3VuZCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIGdldFN5bmNQcm9ncmVzcygpOiB7XG4gICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9O1xuICAgICAgICBtYXJrZWQ6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLm5hbWVkSW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCwgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50IH0sXG4gICAgICAgICAgICBtYXJrZWQ6IHRoaXMubWFya2VkVG90YWxzKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0b3RhbHMuc291cmNlcyxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogdGhpcy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBzeW5jaW5nOiB0aGlzLnN5bmMuZ2V0QWN0aXZpdGllcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBnZXRTeW5jUHJvZ3Jlc3MncyB0b3RhbHMsIGJ1dCBsb2FkaW5nIHRoZSBpbmRleCBmaXJzdCwgc28gdGhleSBhcmUgbmV2ZXIgdGhlIHplcm9lcyBvZiBhIHN0b3JlIG5vdGhpbmcgaGFzIHRvdWNoZWQgeWV0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBjb21wdXRlSW5kZXhUb3RhbHMoKTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVDb3VudDogbnVtYmVyO1xuICAgICAgICBieXRlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICB9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYW1lZEluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5pbmRleFRvdGFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMuZmlsZUNvdW50LFxuICAgICAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgLm1hcCgoeCwgaSkgPT4gKHsgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgLi4udG90YWxzLnNsb3RzW2ldIH0pKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RvcmUncyBzb3VyY2VzLCBhcyB0aGUgY3VycmVudCByb3V0aW5nIGNvbmZpZyBzYXlzIHRoZXkgc2hvdWxkIGJlLiBUaGlzIGlzIHRoZSBPTkxZIHdheVxuICAgICAqIHRoZXkgYXJlIGV2ZXIgc2V0OiB0aGUgZmlyc3QgY2FsbCBwb3B1bGF0ZXMgYW4gZW1wdHkgc3RvcmUsIGV2ZXJ5IGxhdGVyIG9uZSBhcHBsaWVzIGEgY2hhbmdlIHRvXG4gICAgICogdGhlIHJ1bm5pbmcgb25lLiBXaW5kb3dzLCByb3V0ZXMgYW5kIGZsYWdzIG1vdmUgaW4gcGxhY2UsIGdlbnVpbmVseSBuZXcgZW5kcG9pbnRzIGFyZSBhZGRlZCBhbmRcbiAgICAgKiBzdGFydCBzY2FubmluZywgYW5kIGVuZHBvaW50cyB0aGF0IGFyZSBnb25lIGdvIGRlYWQgKHRoZWlyIHNjYW5zIHN0b3AsIHRoZWlyIGluZGV4IGVudHJpZXNcbiAgICAgKiBkcm9wKS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgaXMgbmV2ZXIgcmVidWlsdCBmb3IgYSBjb25maWcgY2hhbmdlLiBJdHMgbmFtZSBkZWNpZGVzIGl0cyBmb2xkZXIgYW5kIGl0cyBpZGVudGl0eSwgYW5kXG4gICAgICogYSBjb25maWcgY2hhbmdlIGNhbm5vdCBjaGFuZ2UgZWl0aGVyIC0gc28gdGhlcmUgaXMgbm90aGluZyBhIGNoYW5nZSBjYW4gZG8gdG8gYSBzdG9yZSBleGNlcHRcbiAgICAgKiB0aGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTb3VyY2VzKHNwZWNzOiBCbG9iU291cmNlU3BlY1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghc3BlY3MubGVuZ3RoIHx8IHNwZWNzWzBdLmlkZW50aXR5ICE9PSBcImRpc2tcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVTb3VyY2VzIGV4cGVjdHMgdGhlIGRpc2sgc291cmNlIGZpcnN0IChpZGVudGl0eSBcImRpc2tcIiksIGdvdCAke0pTT04uc3RyaW5naWZ5KHNwZWNzLm1hcCh4ID0+IHguaWRlbnRpdHkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbDogdGhlIGRpc2sgc2xvdCBoYXMgdG8gZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBtYXRjaGVkIGFnYWluc3QgaXRcbiAgICAgICAgICAgIGxldCBkaXNrID0gc3BlY3NbMF07XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZGlzay5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IGRpc2sudXJsLCB2YWxpZFdpbmRvd3M6IGRpc2sudmFsaWRXaW5kb3dzLCByb3V0ZTogZGlzay5yb3V0ZSwgbm9GdWxsU3luYzogZGlzay5ub0Z1bGxTeW5jLCBzb3VyY2VDb25maWc6IGRpc2suc291cmNlQ29uZmlnLCBpZGVudGl0eTogZGlzay5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNldFdpbmRvd3MgPSAoaTogbnVtYmVyLCB3aW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pID0+IHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzO1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZCkgPT09IEpTT04uc3RyaW5naWZ5KHdpbmRvd3MpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93cyBjaGFuZ2VkIGZvciAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkob2xkKX0gLT4gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3dzKX1gKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MgPSB3aW5kb3dzO1xuICAgICAgICB9O1xuICAgICAgICBzZXRXaW5kb3dzKDAsIHNwZWNzWzBdLnZhbGlkV2luZG93cyk7XG4gICAgICAgIC8vIExpdmUgc2xvdHMgcGFpciB3aXRoIHNwZWNzIGJ5IGlkZW50aXR5LiBFYWNoIGVuZHBvaW50IGlzIG5vdyBPTkUgc3BlYyBjYXJyeWluZyBhbGwgaXRzIHdpbmRvd3MsIHNvIHRoaXMgaXMgYSAxOjEgcGFpcmluZzsgYW55IGxlZnRvdmVyIGR1cGxpY2F0ZSBzbG90cyBmcm9tIGJlZm9yZSAoYW4gZW5kcG9pbnQgdGhhdCB1c2VkIHRvIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBzbG90cykgZ28gdW5tYXRjaGVkIGJlbG93IGFuZCBhcmUgY29sbGFwc2VkIGF3YXkuXG4gICAgICAgIGxldCBsaXZlQnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICAgICAgbGV0IG9yaWdpbmFsTGVuZ3RoID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZCA9IHRoaXMuc291cmNlc1tpXS5pZGVudGl0eTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBsaXZlQnlJZGVudGl0eS5zZXQoaWQsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KHNwZWMuaWRlbnRpdHkpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBTQU1FIGVuZHBvaW50IChzZWUgc291cmNlSWRlbnRpdHkpLCBzbyB3ZSBhcmUgYWxyZWFkeSBzeW5jaHJvbml6ZWQgd2l0aCBpdDogdGhlIHNsb3Qga2VlcHMgaXRzIGNvbm5lY3Rpb24sIGl0cyBjb21wbGV0ZWQgc2NhbnMsIGFuZCBpdHMgaW5kZXggZW50cmllcywgYW5kIG9ubHkgdGhlIHBvbGljeSBvbiBpdCBtb3Zlcy4gUmVjcmVhdGluZyBpdCBoZXJlIHdvdWxkIG1lYW4gcmVzY2FubmluZyB0aGUgZW5kcG9pbnQgZnJvbSBzY3JhdGNoIGV2ZXJ5IHRpbWUgYSBmbGFnIGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQoc2xvdCk7XG4gICAgICAgICAgICAgICAgc2V0V2luZG93cyhzbG90LCBzcGVjLnZhbGlkV2luZG93cyk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zb3VyY2VzW3Nsb3RdO1xuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSkgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0ZSBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJvdXRlID0gc3BlYy5yb3V0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZykgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pLCBrZWVwaW5nIHRoZSBzb3VyY2UgKHNvIGl0IGlzIG5vdCByZXNjYW5uZWQpOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5zb3VyY2VDb25maWcpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGNhcnJpZXMgaXRzIGNvbmZpZyAoYW5kIGl0cyB3cml0ZSBkZWxheSkgaW50byBldmVyeXRoaW5nIGl0IGRvZXMsIHNvIGl0IGhhcyB0byBsZWFybiB0aGUgbmV3IG9uZSAtIHNlZSBhcHBseVNvdXJjZUNvbmZpZ1xuICAgICAgICAgICAgICAgIHNwZWMuYXBwbHlDb25maWc/LihleGlzdGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLm5vRnVsbFN5bmMgPSBzcGVjLm5vRnVsbFN5bmM7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcuc291cmNlQ29uZmlnID0gc3BlYy5zb3VyY2VDb25maWc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc3BlYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IHNwZWMudXJsLCB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLCByb3V0ZTogc3BlYy5yb3V0ZSwgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLCBpbnRlcm1lZGlhdGU6IHNwZWMuaW50ZXJtZWRpYXRlLCBzb3VyY2VDb25maWc6IHNwZWMuc291cmNlQ29uZmlnLCBpZGVudGl0eTogc3BlYy5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogYSBnZW51aW5lbHkgbmV3IGVuZHBvaW50LCBzbyBpdCBpcyBzY2FubmVkIGZyb20gc2NyYXRjaGApO1xuICAgICAgICAgICAgdGhpcy5zeW5jLmFkZFNvdXJjZSh0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpIHx8IG1hdGNoZWQuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSBzbG90IGlzIGRlYWQgdGhlIG1vbWVudCB0aGlzIHJldHVybnM7IGRyb3BwaW5nIHRoZSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgaXMgdGhlIHBhcnQgdGhhdCByZWFkcyB0aGUgaW5kZXgsIHNvIGl0IGZpbmlzaGVzIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICB2b2lkIHRoaXMuc3luYy5yZW1vdmVTb3VyY2UoaSkuY2F0Y2goKGU6IEVycm9yKSA9PiBsb2dTdG9yYWdlRXJyb3IoYFJlbW92aW5nIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgdmFsaWQgd2luZG93IGhhbmRvZmZzLCB3aGVyZSBhbm90aGVyIHByb2Nlc3Mgd3JvdGUgZmlsZXMgdG8gdGhlIHNoYXJlZCBmb2xkZXIgdGhhdCBvdXIgaW5kZXggaGFzbid0IHNlZW4uICovXG4gICAgcHVibGljIGFzeW5jIHJlc2NhbkJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMucmVzY2FuQmFzZSgpO1xuICAgIH1cblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy5ib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlLCBjb25maWcpO1xuICAgIH1cblxuICAgIC8vIExhcmdlIHVwbG9hZHMgc3RyZWFtIG9udG8gdGhlIGxvY2FsIGRpc2sgc291cmNlIGRpcmVjdGx5ICh0aGV5IG1heSBub3QgZml0IGluIG1lbW9yeSksIGFuZCByZWNvbmNpbGlhdGlvbiBjYXJyaWVzIHRoZW0gdG8gdGhlIG90aGVyIHNvdXJjZXMgLSB0aGVyZSBpcyBubyBkZWxheWVkLXdyaXRlIHN0YWdlIHRoZXkgY291bGQgcGFzcyB0aHJvdWdoLiBUaGUgd3JpdGUgaXRzZWxmIGlzIHZhbGlkYXRlZCBleGFjdGx5IGxpa2Ugc2V0J3MsIHJpZ2h0IGhlcmU6IHRoZSBjbGllbnQgaXMgYWJvdXQgdG8gc2VuZCB0aGUgd2hvbGUgZmlsZSwgc28gZXZlcnkgcmVhc29uIHRvIHJlZnVzZSBpdCBtdXN0IGJlIGZvdW5kIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZS5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnRMYXJnZVVwbG9hZChjb25maWc/OiB7IHBhdGg/OiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWc/LnBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCB3cml0ZVRpbWUgPSBNYXRoLmZsb29yKGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnPy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZz8uZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgdXBsb2FkaW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkuIFRoZSBjbGllbnQgaXMgYWxyZWFkeSBzdHJlYW1pbmcsIHNvIHRoZSB1cGxvYWQgaXMgYWNjZXB0ZWQgYW5kIGV2ZXJ5IHBhcnQgZGlzY2FyZGVkIC0gdGhlIGFsdGVybmF0aXZlIGlzIHRocm93aW5nIGF0IGEgY2FsbGVyIHRoYXQgZGlkIG5vdGhpbmcgd3JvbmcuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGY/LmltbXV0YWJsZSAmJiBhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGAke0RJU0NBUkRFRF9VUExPQURfUFJFRklYfSR7dGhpcy5uZXh0RGlzY2FyZGVkVXBsb2FkKyt9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRNdXRhYmxlKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnPy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgdXBsb2FkaW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmRMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBvZmZzZXQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmhhcyhjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcuZGF0YSwgY29uZmlnLm9mZnNldCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5pc2hMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmRlbGV0ZShjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpIC0gYSBuZXdlciB2YWx1ZSBjYW4gbGFuZCB3aGlsZSBhIGxvbmcgdXBsb2FkIGlzIHN0aWxsIHN0cmVhbWluZywgc28gdGhpcyBpcyByZS1jaGVja2VkIGhlcmUgcmF0aGVyIHRoYW4gb25seSBhdCB0aGUgc3RhcnRcbiAgICAgICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGNvbmZpZy5wYXRoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBkaXNrLmdldEluZm8oY29uZmlnLnBhdGgpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGNvbmZpZy5wYXRoLCB7IHdyaXRlVGltZTogaW5mby53cml0ZVRpbWUsIHNpemU6IGluZm8uc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KSB9KTtcbiAgICAgICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwic2V0TGFyZ2VcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBjb25maWcucGF0aCwgc2l6ZTogaW5mby5zaXplLCB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gSW50ZXJuYWxzXG5cbiAgICAvKiogQnl0ZXMgb2YgcmVhZCBjYWNoZSB0aGUgZGlzayBtYXkgaG9sZDsgc2VlIENvbW1vbkNvbmZpZy5yZWFkZXJEaXNrTGltaXQgKFN0b3JlU3luYyBlbmZvcmNlcyBpdCkuIFJlYWQgZnJvbSB0aGUgY29uZmlnIGluIGVmZmVjdCwgc28gcmFpc2luZyBvciByZW1vdmluZyB0aGUgbGltaXQgdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGV2aWN0aW9uIHBhc3MuICovXG4gICAgcHVibGljIGdldCByZWFkZXJEaXNrTGltaXQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHdyaXRlIHRpbWUgYSBuZXcgd3JpdGUgaGFzIHRvIGJlYXQsIG9yIDAgd2hlbiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIHRoZSBrZXkuIENvdW50cyBERUxFVElPTlMgdG9vOiBhIHdyaXRlIG9sZGVyIHRoYW4gdGhlIGRlbGV0aW9uIHRoYXQgcmVtb3ZlZCBpdCBtdXN0IG5vdCBicmluZyBpdCBiYWNrLiBUaGUgaW5kZXggaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGZvciBhIHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIGEgZGVsYXllZCBzb3VyY2UsIHNpbmNlIHRoZSBlbnRyeSBpcyByZWNvcmRlZCB3aGVuIHRoZSB3cml0ZSBpcyBhY2NlcHRlZCByYXRoZXIgdGhhbiB3aGVuIGl0IHJlYWNoZXMgc3RvcmFnZS4gKi9cbiAgICBwdWJsaWMgY3VycmVudFdyaXRlVGltZShrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnRpbWVPZihrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5pc0xpdmUoc291cmNlSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclNsb3Qoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF07XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICBsZXQgcmVnaXN0cmF0aW9uID0gdGhpcy5zb3VyY2VzTGlzdC5lbnN1cmUodGhpcy5zb3VyY2VzW3Nsb3RdLnVybCkudGhlbihpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF0gPSByZWdpc3RyYXRpb247XG4gICAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90LCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc2xvdCBuZXZlciBnb3QgdGhhdCBmYXIgKGEgc291cmNlIHJlbW92ZWQgYmVmb3JlIGl0cyByZWdpc3RyYXRpb24gcmVzb2x2ZWQpLiAqL1xuICAgIHB1YmxpYyBzbG90U291cmNlc0xpc3RJbmRleChzbG90OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgIH1cblxuICAgIC8vIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90IC0gb25seSB2YWxpZCBvbmNlIHRoZSBzbG90J3MgcmVnaXN0cmF0aW9uIHJlc29sdmVkIChpbml0IGFuZCB0aGUgc291cmNlJ3Mgc3luYyBsb29wIGd1YXJhbnRlZSB0aGF0IGJlZm9yZSBhbnkgaW5kZXhpbmcgaGFwcGVucylcbiAgICBwdWJsaWMgc291cmNlc0xpc3RJbmRleE9mU2xvdChzbG90OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBzbG90IGlzIG5vdCByZWdpc3RlcmVkIHlldC4gU2xvdCAke3Nsb3R9ICgke3RoaXMuc291cmNlc1tzbG90XT8udXJsfSkgaGFzIG5vIHNvdXJjZXNMaXN0SW5kZXggKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGl2ZSBzbG90IGN1cnJlbnRseSBzZXJ2aW5nIGEgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4LCBvciB1bmRlZmluZWQgd2hlbiBubyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhhdCBVUkwgYW55bW9yZS4gTGluZWFyLCBidXQgdGhlIHNvdXJjZXMgbGlzdCBpcyB0aW55IGFuZCB0aGlzIGlzIGFsd2F5cyBjdXJyZW50IChzbG90cyBkeWluZywgb3Igc2V2ZXJhbCBzbG90cyBzaGFyaW5nIG9uZSBVUkwgYWNyb3NzIHZhbGlkIHdpbmRvd3MsIG5lZWQgbm8gYm9va2tlZXBpbmcpLlxuICAgIHB1YmxpYyBzbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tpXSA9PT0gc291cmNlc0xpc3RJbmRleCAmJiB0aGlzLmlzTGl2ZShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgSUFyY2hpdmVzIGN1cnJlbnRseSBob2xkaW5nIGFuIGVudHJ5J3MgYnl0ZXM6IHRoZSBsaXZlIHNsb3Qgd2hlbiB0aGUgaG9sZGVyIGlzIHN0aWxsIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSByZXNvbHZlZCAoY2FjaGVkKSBzdHJhaWdodCBmcm9tIGl0cyBwZXJzaXN0ZWQgVVJMIC0gd2luZG93cy9yb3V0ZXMgZGVjaWRlIHdoZW4gYSBzb3VyY2UgaXMgc2Nhbm5lZCBvciB3cml0dGVuLCBidXQgZm9yIHJlYWRpbmcgYnl0ZXMgd2Uga25vdyBpdCBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2hcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cnlIb2xkZXIoZW50cnk6IEluZGV4RW50cnkpOiBQcm9taXNlPElBcmNoaXZlcyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmwoZW50cnkuc291cmNlc0xpc3RJbmRleCkgfHwgYXdhaXQgdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmxSZWxvYWRpbmcoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc/LnJlc29sdmVTb3VyY2VVcmw/Lih1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluZGV4LmxvYWQoKTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2sgKHNlZSBTdG9yZVN5bmMncyBzY2FuIGhhbmRsaW5nKSwgYW5kIGEgbG9hZGVkIGJ1Y2tldCBhbHdheXMgaGFzIGl0IHRoZXJlIC0gYSBwZXJzaXN0ZWQgZW50cnkgcG9pbnRpbmcgZWxzZXdoZXJlIGlzIHN0YWxlLCBzbyBpdCBpcyBjb3JyZWN0ZWQgb25jZSwgaGVyZVxuICAgICAgICBsZXQgcm91dGluZyA9IHRoaXMuZ2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUpO1xuICAgICAgICBsZXQgYmFzZVNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCk7XG4gICAgICAgIGlmIChyb3V0aW5nICYmIHJvdXRpbmcuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUsIHsgd3JpdGVUaW1lOiByb3V0aW5nLndyaXRlVGltZSwgc2l6ZTogcm91dGluZy5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiBiYXNlU291cmNlc0xpc3RJbmRleCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZpbGUgd2UgaG9sZC4gQSBkZWxldGVkIG9uZSBpcyBub3Qgb25lOiBpdCBpcyBhIHRvbWJzdG9uZSwgYW5kIG9ubHkgZ2V0RGVsZXRlZEVudHJ5IGtub3dzIGFib3V0IGl0LiAqL1xuICAgIHB1YmxpYyBnZXRJbmRleEVudHJ5KGtleTogc3RyaW5nKTogSW5kZXhFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuaW5kZXguZ2V0KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIFdoZW4gYSBrZXkgd2FzIGRlbGV0ZWQsIGlmIGl0IHdhcy4gQSBkZWxldGlvbiBpcyBhbiBhYnNlbmNlIHdpdGggYSB0aW1lIGF0dGFjaGVkIC0gdGhhdCB0aW1lIGlzIHdoYXQgbWFrZXMgaXQgcHJvcGFnYXRlIGFuZCB3aGF0IGV4cGlyZXMgaXQuICovXG4gICAgcHVibGljIGdldERlbGV0ZWRFbnRyeShrZXk6IHN0cmluZyk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZmlsZSB3ZSBob2xkLCBmb3IgdGhlIHBhc3NlcyB0aGF0IHdhbGsgdGhlbSBhbGwgKGxpc3RpbmdzLCBzY2FucywgcmVjb25jaWxpYXRpb24sIGV2aWN0aW9uKS4gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSAtIHNlZSBkZWxldGVkRW50cmllcy4gTGl2ZTogZGVsZXRpbmcgZW50cmllcyB3aGlsZSBpdGVyYXRpbmcgaXMgZXhwZWN0ZWQgaGVyZSwgYW5kIHNhZmUuICovXG4gICAgcHVibGljICppbmRleEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZGVsZXRpb24gd2Uga25vdyBvZi4gQSBtdWNoIHNtYWxsZXIgd2FsayB0aGFuIHRoZSBmaWxlcywgd2hpY2ggaXMgd2hhdCBtYWtlcyBleHBpcmluZyB0aGVtIGNoZWFwLiAqL1xuICAgIHB1YmxpYyAqZGVsZXRlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuaW5kZXguZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIE1BUktFRCBmb3IgZGVsZXRpb246IGl0cyBrZXB0IGluZGV4IHZhbHVlIHBsdXMgd2hlbiBpdCB3YXMgZGVsZXRlZC4gVW5kZWZpbmVkIHdoZW4gdGhlIGtleSBpcyBsaXZlLCBuZXZlciBleGlzdGVkLCBvciBpdHMgaGlzdG9yeSB3YXMgYWxyZWFkeSBkcm9wcGVkLiAqL1xuICAgIHB1YmxpYyBnZXRNYXJrZWRFbnRyeShrZXk6IHN0cmluZyk6IChJbmRleEVudHJ5ICYgeyBkZWxldGVUaW1lOiBudW1iZXIgfSkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lIHx8IHRvbWJzdG9uZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi50b21ic3RvbmUudmFsdWUsIHdyaXRlVGltZTogdG9tYnN0b25lLnZhbHVlVGltZSB8fCB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0LCBkZWxldGVUaW1lOiB0b21ic3RvbmUudGltZSB9O1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBmaWxlIG1hcmtlZCBmb3IgZGVsZXRpb24gLSB0aGUgZGVsZXRpb24gaGlzdG9yeSwgd2Fsa2VkIGJ5IHJldGVudGlvbiBhbmQgYnkgaW5jbHVkZU1hcmtlZCBsaXN0aW5ncy4gKi9cbiAgICBwdWJsaWMgKm1hcmtlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5ICYgeyBkZWxldGVUaW1lOiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUudmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLnRvbWJzdG9uZS52YWx1ZSwgd3JpdGVUaW1lOiB0b21ic3RvbmUudmFsdWVUaW1lIHx8IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQsIGRlbGV0ZVRpbWU6IHRvbWJzdG9uZS50aW1lIH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBkZWxldGlvbiBoaXN0b3J5J3MgdG90YWxzOiBob3cgbWFueSBtYXJrZWQgZmlsZXMsIHRoZWlyIGJ5dGVzLCBhbmQgdGhlIGRlbGV0ZSB0aW1lIG9mIHRoZSBPTERFU1Qgb25lIC0gd2hpY2ggaXMgaG93IGZhciBiYWNrIHRoZSBoaXN0b3J5IHJlYWNoZXMuICovXG4gICAgcHVibGljIG1hcmtlZFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgb2xkZXN0RGVsZXRlVGltZT86IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgb2xkZXN0RGVsZXRlVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICBpZiAob2xkZXN0RGVsZXRlVGltZSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LmRlbGV0ZVRpbWUgPCBvbGRlc3REZWxldGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgb2xkZXN0RGVsZXRlVGltZSA9IGVudHJ5LmRlbGV0ZVRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsZUNvdW50LCBieXRlQ291bnQsIG9sZGVzdERlbGV0ZVRpbWUgfTtcbiAgICB9XG5cbiAgICAvKiogUGh5c2ljYWxseSByZW1vdmVzIGEgbWFya2VkIGZpbGUncyBieXRlcyBmcm9tIG91ciBkaXNrIGFuZCBkcm9wcyBpdHMga2VwdCB2YWx1ZSwgbGVhdmluZyBhIHBsYWluIHRvbWJzdG9uZSB0aGF0IGFnZXMgb3V0IG5vcm1hbGx5IC0gcmV0ZW50aW9uIGNhbGxpbmcgdGltZSBvbiB0aGUgb2xkZXN0IGhpc3RvcnkuICovXG4gICAgcHVibGljIGFzeW5jIGRyb3BNYXJrZWRIaXN0b3J5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub3duRGlzay5kZWwoa2V5KTtcbiAgICAgICAgdGhpcy5pbmRleC5kcm9wVmFsdWUoa2V5KTtcbiAgICB9XG5cbiAgICAvKiogU2VlIFNldENvbmZpZy51bmRlbGV0ZTogZmxpcHMgYSBtYXJrZWQgZGVsZXRpb24gYmFjayB0byBsaXZlIChmcmVzaCB3cml0ZSB0aW1lLCBzbyB0aGUgcmVzdG9yZSBvdXRyYW5rcyB0aGUgZGVsZXRpb24gZXZlcnl3aGVyZSBpdCBwcm9wYWdhdGVkKSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrLCBzbyByZWFkcyBqdXN0IHdvcmsgYWdhaW4uIEludGVybmFsIHJlc3RvcmVzIGFyZSBhIHBlZXIncyBwcm9wYWdhdGlvbiBhbmQgdG9sZXJhdGUgaGF2aW5nIG5vdGhpbmcgdG8gcmVzdG9yZSAodGhpcyBub2RlIG1heSBuZXZlciBoYXZlIGhlbGQgdGhlIGZpbGUpOyBhIGNhbGxlcidzIHJlc3RvcmUgdGhyb3dzIGluc3RlYWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyB1bmRlbGV0ZUtleShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIGludGVybmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBtYXJrZWQgPSB0aGlzLmdldE1hcmtlZEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC51bm1hcmsoa2V5LCB3cml0ZVRpbWUpKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGxpdmU6IHVuZGVsZXRlIGlzIGlkZW1wb3RlbnQgKHJldHJpZXMgYW5kIHBlZXIgcHJvcGFnYXRpb24gYm90aCByZS1zZW5kIGl0KVxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGhhcyBub3RoaW5nIHRvIHJlc3RvcmUgaGVyZSAtIHRoaXMgbm9kZSBtYXkgbmV2ZXIgaGF2ZSBoZWxkIHRoZSBmaWxlYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlbGV0ZSBmYWlsZWQgLSBub3RoaW5nIHRvIHJlc3RvcmUuIENhbm5vdCB1bmRlbGV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGl0IGhhcyBubyBtYXJrZWQgZGVsZXRpb24gdG8gcmVzdG9yZSAtIGl0IHdhcyBuZXZlciBkZWxldGVkIGhlcmUke3RoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSkgJiYgXCIsIG9yIGl0cyBkZWxldGlvbiBoaXN0b3J5IHdhcyBhbHJlYWR5IGRyb3BwZWQgKGEgcGxhaW4gdG9tYnN0b25lIHJlbWFpbnMsIGJ1dCB0aGUgYnl0ZXMgYXJlIGdvbmUpXCIgfHwgXCJcIn1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGVkICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogdGhlIGluZGV4IGVudHJ5ICgke21hcmtlZD8uc2l6ZX0gYnl0ZXMsIGRlbGV0ZWQgJHttYXJrZWQgJiYgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChtYXJrZWQuZGVsZXRlVGltZSl9KSBpcyBsaXZlIGFnYWluIGFzIG9mICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrYCk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwidW5kZWxldGVcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHNpemU6IG1hcmtlZD8uc2l6ZSwgd3JpdGVUaW1lLCBpbnRlcm5hbCB9KTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgaWYgKGludGVybmFsKSByZXR1cm47XG4gICAgICAgIC8vIFBlZXJzIG1hcmtlZCB0aGVpciBvd24gY29waWVzIHdoZW4gdGhlIGRlbGV0aW9uIHByb3BhZ2F0ZWQsIHNvIHRoZSByZXN0b3JlIHByb3BhZ2F0ZXMgdGhlIHNhbWUgd2F5LiBTdHJhaWdodCBwYXN0IGFueSB3cml0ZSBkZWxheSAtIGEgYnVmZmVyZWQgdW5kZWxldGUgY291bGQgYmUgcmVhZCBiYWNrIGFzIGl0cyBwbGFjZWhvbGRlciBieXRlLlxuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICBmb3IgKGxldCBpIG9mIHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKCkpIHtcbiAgICAgICAgICAgIGlmIChpID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyh0aGlzLnNvdXJjZXNbaV0ucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBPbmx5IG91ciBvd24gc2VydmVycyB1bmRlcnN0YW5kIHRoZSBmbGFnIC0gYSByYXcgc291cmNlIChiYWNrYmxhemUpIHdvdWxkIHN0b3JlIHRoZSBwbGFjZWhvbGRlciBieXRlIGFzIHRoZSBmaWxlLiBUaGVpciBvbGRlciBjb3B5IGlzIHJlLXB1c2hlZCBieSByZWNvbmNpbGlhdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tpXS5zb3VyY2VDb25maWc/LnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHB1c2ggPSB1bndyYXBEZWxheWVkKHRoaXMuc291cmNlc1tpXS5zb3VyY2UpLnNldChrZXksIFVOREVMRVRFX1BMQUNFSE9MREVSLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCB1bmRlbGV0ZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgdm9pZCBwdXNoLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQmFja2dyb3VuZCB1bmRlbGV0ZSBvZiAke2tleX0gb24gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZCAoaXRzIHNjYW4gb2YgdXMgcmUtZmluZHMgdGhlIGZpbGUgYW55d2F5KTogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBIb3cgbWFueSBmaWxlcyB3ZSBob2xkLCBkZWxldGlvbnMgZXhjbHVkZWQuICovXG4gICAgcHVibGljIGluZGV4U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5zaXplO1xuICAgIH1cblxuICAgIC8qKiBUb3RhbHMgb3ZlciB0aGUgZmlsZXMgd2UgaG9sZCwgYnJva2VuIGRvd24gYnkgdGhlIHNsb3QgaG9sZGluZyBlYWNoIChlbnRyaWVzIGNhbiBuYW1lIGEgc291cmNlIHRoYXQgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQsIHdoaWNoIGNvdW50cyB0b3dhcmRzIHRoZSB0b3RhbCBidXQgbm8gc2xvdCkuICovXG4gICAgcHVibGljIGluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzbG90czogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBzbG90cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gKHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfSkpO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5ieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgc2xvdHMgfTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIGZpbGUsIGFzIG9mIGl0cyB3cml0ZSB0aW1lLiBSZXR1cm5zIGZhbHNlLCBoYXZpbmcgY2hhbmdlZCBub3RoaW5nLCB3aGVuIHdlIGFscmVhZHkga25vdyBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IC0gdGhlIGluZGV4IGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcywgd2hpY2hldmVyIHBhdGggdGhlIHdyaXRlIGNhbWUgaW4gYnkuICovXG4gICAgcHVibGljIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5zZXQoa2V5LCB7IHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggfSwgZW50cnkud3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgbGFuZGluZyBoZXJlIC0gd3JpdHRlbiBieSBhbiBvcGVyYXRvciwgb3IgcHVsbGVkIG9mZiBhIHBlZXIgYnkgc3luY2hyb25pemF0aW9uIC0gaXMgaG93IHRoaXMgc3RvcmUgbGVhcm5zIHdoYXQgaXQgaXMgbWVhbnQgdG8gYmVcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIERFTEVUSU9OLCBhcyBvZiBpdHMgdGltZTogdGhlIGtleSBzdG9wcyBleGlzdGluZyBoZXJlLCBhbmQgdGhlIHRvbWJzdG9uZSBpcyB3aGF0IG1ha2VzIHRoYXQgZmFjdCBwcm9wYWdhdGUgYW5kIHJlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZS4gU2FtZSBvcmRlcmluZyBydWxlIGFzIHNldEluZGV4RW50cnkuICovXG4gICAgcHVibGljIHNldEluZGV4RGVsZXRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LmRlbGV0ZShrZXksIHdyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgYSBrZXkgZW50aXJlbHksIHRvbWJzdG9uZSBpbmNsdWRlZC4gTk9UIGEgZGVsZXRpb246IGl0IHNheXMgbm90aGluZyBoYXBwZW5lZCB0byB0aGUgZmlsZSwgb25seSB0aGF0IHdlIG5vIGxvbmdlciBrbm93IGFueXRoaW5nIGFib3V0IGl0IC0gZm9yIGFuIGVudHJ5IHdob3NlIGhvbGRlciB0dXJuZWQgb3V0IG5vdCB0byBoYXZlIGl0LCBhbmQgZm9yIGEgdG9tYnN0b25lIG9sZCBlbm91Z2ggdGhhdCBldmVyeW9uZSBoYXMgaGVhcmQuICovXG4gICAgcHVibGljIHB1cmdlSW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmluZGV4LnB1cmdlKGtleSk7XG4gICAgfVxuXG4gICAgLyoqIENvdW50cyBhIHN5bmNocm9uaXphdGlvbiB0cmFuc2ZlciBpbiB0aGUgc2VydmVyJ3MgYWNjZXNzIHN0YXRpc3RpY3MgKHNlZSBnZXRTdG9yZSdzIHdpcmluZyk6IFwic3luYyBnZXRcIiBmb3IgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSwgXCJzeW5jIHNldFwiIGZvciBieXRlcyBwdXNoZWQgdG8gb25lLiAqL1xuICAgIHB1YmxpYyBub3RlU3luY1RyYW5zZmVyKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogb3BlcmF0aW9uLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGgsIHNpemU6IGJ5dGVzIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25TeW5jVHJhbnNmZXI/LihvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgdmFsaWRhdGlvbiAoZnJvbSB0aGlzIHN0b3JlJ3Mgb3duIHJvdXRpbmcgZW50cmllcykg4pSA4pSAXG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSB3cml0ZSwgaG93ZXZlciBpdCBpcyBzdGFtcGVkLCBoYXMgdG8gYmUgb25lIHdlIGFyZSBhY3R1YWxseSBtZWFudCB0byBob2xkIC0gYmVjYXVzZSB0aGVcbiAgICAgKiBhbHRlcm5hdGl2ZSBpcyBub3QgYSBzbWFsbGVyIHByb2JsZW0sIGl0IGlzIGEgc2lsZW50IG9uZS4gQSB3cml0ZSB0aGF0IGxhbmRzIG9uIGEgc3RvcmUgdGhhdFxuICAgICAqIGRvZXMgbm90IHNlcnZlIGl0cyByb3V0ZSAob3Igb24gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgaW4gdGhlIGJ1Y2tldCdzIGNvbmZpZyBhdCBhbGwpIGdvZXMgaW50byBhXG4gICAgICogZm9sZGVyIG5vdGhpbmcgc2NhbnMgYW5kIG5vIHBlZXIgcmVjb25jaWxlczogaXQgc3VjY2VlZHMsIGFuZCB0aGVuIGl0IGlzIGdvbmUuIFRoZSBtYXJrZXJzIG1ha2VcbiAgICAgKiB0aGUgY2xpZW50IHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGFuZCByZXRyeSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcmlnaHQgb3V0Y29tZSB3aGVuIHRoZVxuICAgICAqIHJlYXNvbiBpdCBhaW1lZCBoZXJlIGlzIHRoYXQgaXRzIGNvbmZpZyB3YXMgc3RhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRXcml0ZVRhcmdldChrZXk6IHN0cmluZywgcm91dGU6IG51bWJlciwgbGFzdE1vZGlmaWVkOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHRoaXMudW5jb25maWd1cmVkRGV0YWlsKCk7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0NPTkZJR1VSRUR9IFdyaXRlIHJlamVjdGVkOiB0aGlzIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uLiBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9IERhdGEgd3JpdHRlbiB0byBhIHN0b3JlIHdpdGggbm8gY29uZmlndXJhdGlvbiBlbnRyeSB3b3VsZCBuZXZlciBiZSBzY2FubmVkIG9yIHJlY29uY2lsZWQsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBzaWxlbnRseSBsb3NlIGl0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeSAtIG9yLCBpZiB0aGlzIHN0b3JlIGlzIGdlbnVpbmVseSBtZWFudCB0byB0YWtlIHRoaXMgd3JpdGUsIHdyaXRlIHRoZSBidWNrZXQncyByb3V0aW5nIGNvbmZpZyB3aXRoIGFuIGVudHJ5IG5hbWluZyBpdCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleSwgRGF0ZS5ub3coKSwgcm91dGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgc3RhbXBlZCB3cml0ZSBwaWNrZWQgaXRzIG93biB0aW1lLCBzbyBubyB3aW5kb3cgY2FuIGp1ZGdlIGl0ICh0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN5bmNocm9uaXplZCB3cml0ZSkgLSBidXQgdGhlIFJPVVRFIGlzIG5vdCBhIG1hdHRlciBvZiB0aW1pbmcsIGFuZCBhIHN0YW1wZWQgd3JpdGUgdG8gdGhlIHdyb25nIHNoYXJkIGlzIGV4YWN0bHkgYXMgaW52aXNpYmxlIGFzIGEgZnJlc2ggb25lXG4gICAgICAgIGlmICh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHJldHVybjtcbiAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBzdGFtcGVkIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSByb3V0ZSB3ZSBzZXJ2ZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBXcml0ZSByZWplY3RlZDogd3Jvbmcgcm91dGUgZm9yIHRoaXMgc3RvcmUuIFJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICB9XG5cbiAgICAvKiogRXhhY3RseSB3aHkgdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyaWVzIC0gd2hpY2ggb2YgdGhlIHRocmVlIHBvc3NpYmxlIHJlYXNvbnMgaXQgaXMsIHdpdGggdGhlIHZhbHVlcyB0aGF0IGRlY2lkZWQgaXQsIGJlY2F1c2UgXCJub3QgY29uZmlndXJlZFwiIGFsb25lIGlzIHVuZGlhZ25vc2FibGUuICovXG4gICAgcHJpdmF0ZSB1bmNvbmZpZ3VyZWREZXRhaWwoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmFwcGxpZWRSb3V0aW5nO1xuICAgICAgICBsZXQgaWRlbnRpdHkgPSBgc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pYDtcbiAgICAgICAgaWYgKCFyb3V0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGhhcyBubyByb3V0aW5nIGNvbmZpZyBhdCBhbGwgLSBub3RoaW5nIGhhcyBldmVyIHdyaXR0ZW4gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBpbnRvIGl0LmA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iamVjdHMgPSByb3V0aW5nLnNvdXJjZXMuZmlsdGVyKHggPT4gdHlwZW9mIHggIT09IFwic3RyaW5nXCIpIGFzIFNvdXJjZUNvbmZpZ1tdO1xuICAgICAgICBsZXQgbmFtZWQgPSBvYmplY3RzLmZpbHRlcih4ID0+IHgubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUpO1xuICAgICAgICBpZiAoIW5hbWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hpY2ggaGFzIG5vIGVudHJ5IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoaXRzIGVudHJpZXMgYXJlIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0cy5tYXAoeCA9PiB4Lm5hbWUpKX0pLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hvc2UgJHtuYW1lZC5sZW5ndGh9IGVudHIke25hbWVkLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gcG9pbnQocykgYXQgJHtKU09OLnN0cmluZ2lmeShuYW1lZC5tYXAoeCA9PiB4LnVybCkpfSAtIG5vbmUgb2Ygd2hpY2ggaXMgVEhJUyBzZXJ2ZXIsIHNvIHRoZSBjb25maWcgc2F5cyB0aGlzIHN0b3JlIGxpdmVzIGVsc2V3aGVyZS5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSByb3V0aW5nIGNvbmZpZyBtYXkgYmUgd3JpdHRlbiBoZXJlLiBUd28gcnVsZXMsIGFuZCB0aGlzIGlzIHRoZSBvbmUgcGxhY2UgZWl0aGVyIGlzXG4gICAgICogYXBwbGllZCAtIGEgY29uZmlnIG9ubHkgZXZlciBlbnRlcnMgdGhlIHN5c3RlbSB0aHJvdWdoIGEgd3JpdGUsIHNvIGEgY29uZmlnIHRoYXQgZ290IGluIGlzIGFcbiAgICAgKiBjb25maWcgdGhhdCBwYXNzZWQsIGFuZCByZWFkaW5nIG9uZSBiYWNrIG5ldmVyIGp1ZGdlcyBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIFRoZSBjb25maWcgaGFzIHRvIGJlIHZhbGlkIGFzIGEgd2hvbGUgKHNlZSBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyksIGFuZCBpdCBoYXMgdG8gb3V0cmFuayB3aGF0XG4gICAgICogd2UgYXJlIHJ1bm5pbmc6IHRoZSBzYW1lIHZlcnNpb24gbWVhbnMgdGhlIHNhbWUgY29uZmlnLCBzbyByZS13cml0aW5nIGl0IGlzIGhhcm1sZXNzLCBidXQgYVxuICAgICAqIGxvd2VyIG9uZSBpcyBhbiBvbGRlciBjb25maWcgYXJyaXZpbmcgbGF0ZSBhbmQgbXVzdCBuZXZlciB1bmRvIGEgbmV3ZXIgb25lLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKHJvdXRpbmcpO1xuICAgICAgICBsZXQgaW5jb21pbmcgPSBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucm91dGluZ1ZlcnNpb24oKTtcbiAgICAgICAgaWYgKGluY29taW5nID49IGN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSByZWZ1c2VkIC0gdGhlIHZlcnNpb24gaXMgbm90IG5ld2VyLiBSZWZ1c2luZyB0byB3cml0ZSAke1JPVVRJTkdfRklMRX0gdG8gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0cyB2ZXJzaW9uICgke2luY29taW5nfSkgaXMgb2xkZXIgdGhhbiB0aGUgb25lIHRoaXMgc3RvcmUgaXMgcnVubmluZyAoJHtjdXJyZW50fSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuYCk7XG4gICAgfVxuXG4gICAgLy8gQSBmcmVzaCAodW5zdGFtcGVkKSB3cml0ZSBtdXN0IGxhbmQgb24gdGhlIG5vZGUgdGhlIGNvbmZpZyBjdXJyZW50bHkgcG9pbnRzIGF0OiB0aGUgbWFya2VycyB0ZWxsIHRoZSBjbGllbnQgaXRzIGNvbmZpZyBpcyBzdGFsZSwgc28gaXQgcmUtcmVzb2x2ZXMgYW5kIHJldHJpZXMgYWdhaW5zdCB0aGUgcmlnaHQgbm9kZSBpbnN0ZWFkIG9mIHVzIHNpbGVudGx5IGFjY2VwdGluZyBkYXRhIHdlIHdlcmUgbmV2ZXIgbWVhbnQgdG8gaG9sZC5cbiAgICBwcml2YXRlIGFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCB0aW1lVmFsaWQgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9IChhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldClgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV30gV3JpdGUgcmVqZWN0ZWQ6IHdyaXRlIHRpbWUgaXMgb3V0c2lkZSBvdXIgdmFsaWQgd2luZG93cy4gQ2Fubm90IHdyaXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06IGl0cyB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSAoJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHdyaXRlVGltZSl9KSBpcyBvdXRzaWRlIGV2ZXJ5IHZhbGlkIHdpbmRvdyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKHdpbmRvd3M6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9LCBmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIC0gYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIG91ciByb3V0ZXMgJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9IGF0IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gV3JpdGUgcmVqZWN0ZWQ6IHdyb25nIHJvdXRlIGZvciB0aGlzIHN0b3JlLiBSb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0sIG91ciByb3V0ZXMgYXQgdGhpcyB0aW1lOiAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0sIHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFzc2VydE11dGFibGUoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgZ2V0Um91dGUoa2V5KSk7XG4gICAgICAgIGlmICghc2VsZj8uaW1tdXRhYmxlKSByZXR1cm47XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV3JpdGUgcmVqZWN0ZWQgLSBpbW11dGFibGUgc3RvcmUgYW5kIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLiBBdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSwgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBhbHJlYWR5IGV4aXN0cyAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWUgU2V0Q29uZmlnLmludGVybmFsOiB0aGUgc3RhbXAgbXVzdCBsYW5kIGluc2lkZSBTT01FIHdpbmRvdytyb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yIChhbnkgd2luZG93LCBpbmNsdWRpbmcgcGFzdCBvbmVzIC0gc3luY2hyb25pemF0aW9uIG1vdmVzIG9sZCBkYXRhKSwgc28gYSBjb25mdXNlZCBwZWVyIGNhbid0IHN0dWZmIGRhdGEgb250byBhIHN0b3JlIHRoYXQgd2FzIG5ldmVyIG1lYW50IHRvIGhvbGQgaXRcbiAgICBwcml2YXRlIGFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgY292ZXJlZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0gJiYgcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICBpZiAoIWNvdmVyZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGUgcmVqZWN0ZWQgLSBvdXRzaWRlIGV2ZXJ5IGNvbmZpZ3VyZWQgd2luZG93L3JvdXRlLiBXcml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSkgYXQgcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSB3aW5kb3cvcm91dGUgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIGZvcjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+ICh7IHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHJlYWQ6IHB1cmVseSB0aGUgbG9jYWwgZGlzaywgY29tcGxldGVseSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBpbmRleCBhbmQgaG9sZGVyIHJlc29sdXRpb24gLSB0aGUgY2FsbGVyIGlzIGFub3RoZXIgc3RvcmUsIGFuZCBjaGFzaW5nIE9VUiByZW1vdGUgaG9sZGVycyB3aGlsZSBhbnN3ZXJpbmcgaXQgaXMgaG93IGluZmluaXRlIGdldCBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtLiBObyB3aW5kb3cgb3Igcm91dGUgY2hlY2tzOiBpZiB0aGUgYnl0ZXMgYXJlIG9uIG91ciBkaXNrLCB0aGUgY2FsbGVyIG1heSBoYXZlIHRoZW0uIE5vdGUgdGhpcyByZWFkcyB0aGUgZGlzayBwYXN0IGFueSB3cml0ZSBkZWxheSwgc28gYSBmYXN0IHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIG1lbW9yeSBpcyBpbnZpc2libGUgaGVyZTsgdGhlIGNhbGxlciByZS1maW5kcyBpdCBvbmNlIGl0IGZsdXNoZXMuICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbnRlcm5hbDIoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICAvLyBpbmNsdWRlVG9tYnN0b25lcyBmb3J3YXJkcyB0byB0aGUgZGlzazogYSBmbGFnLWNhbGxlciAoYSBwZWVyIHN0b3JlJ3Mgc3luY2hyb25pemF0aW9uKSBuZWVkcyB0byBzZWUgb3VyIGRlbGV0aW9ucywgbm90IGp1c3Qgb3VyIGNvbnRlbnQuIEEgdG9tYnN0b25lIGRlbGV0ZWQgZnJvbSBkaXNrIGVudGlyZWx5IG9ubHkgbGl2ZXMgaW4gb3VyIGluZGV4LCBzbyBmYWxsIGJhY2sgdG8gdGhhdC5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suZ2V0Mihjb25maWcucGF0aCwgeyByYW5nZTogY29uZmlnLnJhbmdlLCBpbmNsdWRlVG9tYnN0b25lczogY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGNvbmZpZy5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH07XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgd3JpdGU6IHRoZSBsb2NhbCBkaXNrIHBsdXMgb3VyIGluZGV4LCB3aXRoIE5PIGRvd25zdHJlYW0gZmFuLW91dCAtIHRoZSBwdXNoaW5nIHN0b3JlIG93bnMgcHJvcGFnYXRpb24sIGFuZCBmYW5uaW5nIGl0cyBwdXNoZXMgYmFjayBvdXQgaXMgaG93IHdyaXRlIGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE9ubHktdGFrZS1sYXRlc3Qgc3RpbGwgYXBwbGllcyBoZXJlLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgc2V0SW50ZXJuYWwoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIGJ5dGVzIHN0YXkgb24gb3VyIGRpc2sgYXMgZGVsZXRpb24gaGlzdG9yeSAoc2VlIHdyaXRlVG9Tb3VyY2VzKSAtIHRoZSBtYXJrZWQgaW5kZXggZW50cnkgaXMgdGhlIHdob2xlIG9mIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwiZGVsXCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwic2V0XCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCBzaXplOiBkYXRhLmxlbmd0aCwgd3JpdGVUaW1lOiBjb25maWcubGFzdE1vZGlmaWVkLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgLy8gQSBkb3duLWNhY2hlIHB1bGxzIHRoZSBieXRlcyBvZmYgYSBzb3VyY2UgZXhhY3RseSBsaWtlIHN5bmNocm9uaXphdGlvbiBkb2VzLCBzbyBpdCBjb3VudHMgKGFuZCBsb2dzKSB0aGUgc2FtZSB3YXlcbiAgICAgICAgdGhpcy5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwga2V5LCByZXN1bHQuZGF0YS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaGFyZWQgZW5naW5lIG9mIHNldCBhbmQgZGVsOiBhbiBlbXB0eSBidWZmZXIgaXMgZXhhY3RseSBhIGRlbGV0aW9uIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGUgZW1wdHktYnVmZmVyIHJlamVjdGlvbiBsaXZlcyBpbiBzZXQgKHRoZSBwdWJsaWMgQVBJKSwgbm90IGluIHRoaXMgbWFjaGluZXJ5XG4gICAgcHJpdmF0ZSBhc3luYyBzZXRPckRlbGV0ZShrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJvcmlnaW5hbFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWcubGFzdE1vZGlmaWVkO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYXN0IHdyaXRlcyBhcmUgbm90IGhhbmRsZWQgaGVyZTogYSBzb3VyY2UgdGhhdCB3YXMgY29uZmlndXJlZCB3aXRoIGEgd3JpdGUgZGVsYXkgYnVmZmVycyB0aGVtIGl0c2VsZiAoc2VlIEFyY2hpdmVzRGVsYXllZCksIHNvIHRoaXMgd3JpdGUgbGFuZHMgaW4gbWVtb3J5IGFuZCByZXR1cm5zLCBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUuIFRoZSBpbmRleCBpcyB1cGRhdGVkIGVpdGhlciB3YXksIHNvIHRoZSB3cml0ZSBpcyBpbW1lZGlhdGVseSB2aXNpYmxlIHRvIHJlYWRlcnMgb2YgdGhpcyBzdG9yZS5cbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGRhdGEsIE1hdGguZmxvb3IobGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGluc3RhbnQgZXZlcnkgZGVsYXllZCB3cml0ZSBtdXN0IGJlIG9uIGl0cyBzb3VyY2U6IHRoZSBlbmQgb2Ygb3VyIG93biB3cml0ZSB3aW5kb3cgdGhhdCBjb250YWlucyBub3csIG1pbnVzIHRoZSBmbHVzaCBtYXJnaW4gKHNvIHRoZSBuZXh0IHdpbmRvdydzIHNvdXJjZSBmaW5kcyB0aGUgZGF0YSBvbiBoYW5kb2ZmKS4gVGhlIExBVEVTVCBlbmQgYW1vbmcgY292ZXJpbmcgd2luZG93cyAtIG92ZXJsYXBwaW5nIHdpbmRvd3MgaGFuZCBvZmYgYXQgdGhlIGxhc3Qgb25lLiBObyB3aW5kb3cgY29udGFpbnMgbm93IChhbiBpbmVydCBzdG9yZSwgb3IgYSBtb21lbnQgYmV0d2VlbiBvdXIgd2luZG93cykgLT4gMCwgaS5lLiBub3RoaW5nIG1heSBiZSBkZWxheWVkIGF0IGFsbC4gKi9cbiAgICBwdWJsaWMgd3JpdGVGbHVzaERlYWRsaW5lKCk6IG51bWJlciB7XG4gICAgICAgIC8vIEJlZm9yZSB1cGRhdGVTb3VyY2VzIGhhcyBydW4gdGhlcmUgaXMgbm90aGluZyB0byBob2xkIGEgd3JpdGUgYW55d2F5LCBhbmQgbm90aGluZyBtYXkgYmUgZGVsYXllZFxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy5zb3VyY2VzWzBdLnZhbGlkV2luZG93cykge1xuICAgICAgICAgICAgaWYgKHdbMF0gPD0gbm93ICYmIG5vdyA8IHdbMV0pIGVuZCA9IE1hdGgubWF4KGVuZCwgd1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmQpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gZW5kIC0gV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcml0YWJsZVNvdXJjZXMoY29uZmlnPzogeyBpZ25vcmVXaW5kb3c/OiBib29sZWFuIH0pOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCB3cml0YWJsZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb25maWc/Lmlnbm9yZVdpbmRvdyAmJiAhd2luZG93c0FjY2VwdFdyaXRlcyh0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIHNvdXJjZSAodGhlIGZpcnN0IHdyaXRhYmxlIG9uZSkgcGx1cyBldmVyeSByb3V0ZS1tYXRjaGluZyBwZWVyLiBFYWNoIHNvdXJjZSBkZWNpZGVzIGZvciBpdHNlbGYgaG93IGxvbmcgaXQgaG9sZHMgdGhlIHdyaXRlIGJlZm9yZSBpdCBoaXRzIHN0b3JhZ2UgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpIC0gaGVyZSB0aGV5IGFsbCBqdXN0IGdldCB3cml0dGVuLlxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVUb1NvdXJjZXMoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBORVZFUiBzeW5jaHJvbml6ZWQgYmV0d2VlbiBzdG9yYWdlIG5vZGVzOiB0aGUgd3JpdGVyIHdyaXRlcyBpdCBkaXJlY3RseSB0byBlYWNoIG5vZGUsIHNvIHdlIHN0b3JlIGl0IG9uIG91ciBvd24gZGlzayBvbmx5IChubyB2YWxpZC13aW5kb3cgZmlsdGVyIC0gcm91dGluZy92YWxpZCB3aW5kb3dzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIHRoZSBmaWxlIGRlZmluaW5nIHRoZW0pIGFuZCBuZXZlciBmb3J3YXJkIGl0IHRvIG90aGVyIHNvdXJjZXMuXG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwiZmx1c2hlZFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBpc1JvdXRpbmcgPSBrZXkgPT09IFJPVVRJTkdfRklMRTtcbiAgICAgICAgbGV0IHdyaXRhYmxlID0gdGhpcy5nZXRXcml0YWJsZVNvdXJjZXMoeyBpZ25vcmVXaW5kb3c6IGlzUm91dGluZyB9KTtcbiAgICAgICAgbGV0IGZpcnN0ID0gd3JpdGFibGUuc2hpZnQoKTtcbiAgICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIChldmVyeSBzb3VyY2UncyB2YWxpZCB3aW5kb3cgaXMgaW4gdGhlIHBhc3QpLCBzbyB3cml0ZXMgY2Fubm90IGJlIHN0b3JlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBvdXIgb3duIChmaXJzdCkgc291cmNlIGJsb2NrcyB0aGUgd3JpdGUuIERvd25zdHJlYW0gc291cmNlcyBhcmUgd3JpdHRlbiBpbiB0aGUgYmFja2dyb3VuZDogYSBkb3duIGRvd25zdHJlYW0gc291cmNlIG11c3Qgbm90IGZhaWwgb3Igc3RhbGwgd3JpdGVzLCBhbmQgcmVjb25jaWxpYXRpb24gcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgYnl0ZXMgU1RBWSBvbiBvdXIgZGlzaywgYXMgZGVsZXRpb24gaGlzdG9yeTogdGhlIGluZGV4IG1hcmtzIHRoZSBrZXkgZGVsZXRlZCAoa2VlcGluZyBpdHMgdmFsdWUgLSBzZWUgVHJhbnNhY3Rpb25GaWxlLmRlbGV0ZSksIHJlYWRzIHN0b3AgZmluZGluZyBpdCwgYW5kIHRoZSByZXRlbnRpb24gcGFzcyBwaHlzaWNhbGx5IHJlbW92ZXMgdGhlIG9sZGVzdCBoaXN0b3J5IG9uY2UgaXQgb3V0Z3Jvd3MgaXRzIGJ1ZGdldCAoc2VlIFN0b3JlU3luYy5lbmZvcmNlSGlzdG9yeUxpbWl0KS4gVGhlIG1hcmtlZCBpbmRleCBlbnRyeSBpcyB0aGUgd2hvbGUgb2YgdGhlIGxvY2FsIGRlbGV0aW9uLlxuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzW2ZpcnN0XS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZSwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChmaXJzdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogZGF0YS5sZW5ndGggPT09IDAgJiYgXCJkZWxcIiB8fCBcInNldFwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGtleSwgc2l6ZTogZGF0YS5sZW5ndGgsIHdyaXRlVGltZSB9KTtcbiAgICAgICAgaWYgKGlzUm91dGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBEZWxldGlvbnMgZGlkIG5vdCBjb25zdW1lIHRoZSBmaXJzdCBzbG90IChub3RoaW5nIGlzIHdyaXR0ZW4gYW55d2hlcmUgbG9jYWxseSksIHNvIGl0IHJlY2VpdmVzIHRoZSBwcm9wYWdhdGVkIGRlbGV0aW9uIGxpa2UgdGhlIHJlc3QgLSBleGNlcHQgc2xvdCAwLCBvdXIgb3duIGRpc2ssIHdob3NlIGJ5dGVzIEFSRSB0aGUgaGlzdG9yeSBiZWluZyBrZXB0XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCAmJiBmaXJzdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGFibGUudW5zaGlmdChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERlbGV0aW9ucyB0cmF2ZWwgYXMgZGVsIGNhcnJ5aW5nIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIChuZXZlciBhcyBlbXB0eSBzZXRzIC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycykuIEJhY2tibGF6ZSBtYXRlcmlhbGl6ZXMgc3VjaCBkZWxzIGFzIHJlYWwgZW1wdHkgZmlsZXMsIHNvIGl0cyBsaXN0aW5ncyBzdGlsbCBzaG93IHRoZSBkZWxldGlvbiBmb3Igb3RoZXIgc3RvcmVzIHRvIHNjYW4gaW4gYXMgYSB0b21ic3RvbmUuXG4gICAgICAgICAgICBsZXQgcHVzaDogUHJvbWlzZTx1bmtub3duPjtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYEJhY2tncm91bmQgd3JpdGUgb2YgJHtrZXl9IHRvIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTbG90IDAgaXMgYWx3YXlzIHRoaXMgc3RvcmUncyBvd24gZm9sZGVyIChzZWUgcGxhblNvdXJjZXMpLCBzbyB0aGUgZGlzayBpcyBrbm93biB3aXRob3V0IHNlYXJjaGluZyBmb3IgaXQgLSBhbmQgaXQgaXMgdGhlIHVud3JhcHBlZCBvbmUsIHBhc3QgYW55IHdyaXRlIGRlbGF5XG4gICAgcHJpdmF0ZSBnZXREaXNrU291cmNlKCk6IHsgZGlzazogQXJjaGl2ZXNEaXNrOyBzb3VyY2VJbmRleDogbnVtYmVyIH0ge1xuICAgICAgICByZXR1cm4geyBkaXNrOiB0aGlzLm93bkRpc2ssIHNvdXJjZUluZGV4OiAwIH07XG4gICAgfVxuXG4gICAgLyoqIFdyaXRlcyBldmVyeXRoaW5nIHN0aWxsIGhlbGQgYnkgYSBkZWxheWVkIHNvdXJjZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkuIGZvcmNlIGFsc28gd3JpdGVzIHdoYXQgaXNuJ3QgZHVlIHlldCAtIHNodXRkb3duIGNhbm5vdCBsZWF2ZSB3cml0ZXMgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hEZWxheWVkV3JpdGVzKGZvcmNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCB7IHNvdXJjZSB9IG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGRlbGF5ZWQgPSBhc0RlbGF5ZWQoc291cmNlKTtcbiAgICAgICAgICAgIGlmICghZGVsYXllZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBkZWxheWVkLmZsdXNoKGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==
1085
+ /* _JS_SOURCE_HASH = "fb12a276d219eefe0c665945bc4366121041462bf418e9eeec1909b90e5ab879"; */