sliftutils 1.7.97 → 1.7.98
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.
- package/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +18 -1
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/LogMap.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/archiveHelpers.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/blobStore.d.ts +2 -0
- package/storage/remoteStorage/blobStore.ts +19 -1
- package/storage/remoteStorage/chainStartup.d.ts +1 -0
- package/storage/remoteStorage/chainStartup.ts +6 -1
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +21 -2
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -2
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +45 -4
- package/storage/remoteStorage/dist/storageServerState.ts.cache +15 -4
- package/storage/remoteStorage/dist/storeConfig.ts.cache +7 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +2 -2
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
- package/storage/remoteStorage/storageClientController.d.ts +14 -0
- package/storage/remoteStorage/storageClientController.ts +42 -1
- package/storage/remoteStorage/storageServerState.d.ts +1 -1
- package/storage/remoteStorage/storageServerState.ts +11 -2
- package/storage/remoteStorage/storeConfig.ts +5 -0
|
@@ -57,8 +57,27 @@ class BlobStore {
|
|
|
57
57
|
this.appliedRoutingVersion = -1;
|
|
58
58
|
// #region Main interface
|
|
59
59
|
this.init = (0, caching_1.lazy)(async () => {
|
|
60
|
+
var _a, _b;
|
|
60
61
|
// Configure first: the config decides what the sources ARE, and everything below is per source. With no config at all that is just our own disk, which is enough to serve and to be written to.
|
|
61
62
|
await this.applyRoutingConfig();
|
|
63
|
+
// No configuration in our folder at all - which happens when this store was just CREATED by a request, before any config write reached it. The requester knows exactly what config it intended for our name, so ask it.
|
|
64
|
+
if (!this.storeConfig.all().length && ((_a = this.config) === null || _a === void 0 ? void 0 : _a.requestRoutingConfig)) {
|
|
65
|
+
try {
|
|
66
|
+
let provided = await this.config.requestRoutingConfig();
|
|
67
|
+
if (provided) {
|
|
68
|
+
console.log(`Store ${JSON.stringify(this.storeName)} (folder ${this.folder}) initialized with no configuration; the requesting client provided routing config version ${(0, remoteConfig_1.getConfigVersion)(provided)} - adopting it`);
|
|
69
|
+
// Straight onto the disk, not through set(): set waits for init, which is what is running right now
|
|
70
|
+
await this.ownDisk.set(remoteConfig_1.ROUTING_FILE, Buffer.from((0, remoteConfig_1.serializeRemoteConfig)(provided)), { lastModified: Date.now() });
|
|
71
|
+
await this.applyRoutingConfig();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.warn(`Store ${JSON.stringify(this.storeName)} (folder ${this.folder}) initialized with no configuration, and the requesting client had no routing config naming it either - running unconfigured`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error(`Asking the requesting client for the routing config of store ${JSON.stringify(this.storeName)} (folder ${this.folder}) failed - running unconfigured: ${(_b = e.stack) !== null && _b !== void 0 ? _b : e}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
62
81
|
for (let i = 0; i < this.sources.length; i++) {
|
|
63
82
|
await this.registerSlot(i);
|
|
64
83
|
}
|
|
@@ -937,5 +956,5 @@ class BlobStore {
|
|
|
937
956
|
}
|
|
938
957
|
}
|
|
939
958
|
exports.BlobStore = BlobStore;
|
|
940
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQTRMO0FBQzVMLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsc0NBQW1DO0FBQ25DLCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUU3RCxxZ0JBQXFnQjtBQUVyZ0IsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzVDLDJHQUEyRztBQUMzRyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQztBQW9DN0MsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsU0FBUyx1QkFBdUIsQ0FBQyxPQUFlO0lBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixHQUFHLHlCQUF5QjtRQUFFLE9BQU87SUFDeEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELHVXQUF1VztBQUN2VyxNQUFhLFNBQVM7SUFxQmxCO0lBQ0ksOERBQThEO0lBQ3ZELE1BQWM7SUFDckIsMktBQTJLO0lBQ3BLLFNBQWlCLEVBQ2hCLE1BZVA7UUFsQk0sV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUVkLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FlYjtRQXhDTCxjQUFjO1FBQ2QsMEdBQTBHO1FBQ25HLFlBQU8sR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztR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QUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2SSxDQUFDO1lBQ0QsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUU7O2dCQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixHQUFHLG1CQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEksQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVELGdLQUFnSztJQUN4SixhQUFhO1FBQ2pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELDZKQUE2SjtJQUNySixLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBZTtRQUM1QyxLQUFLLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxPQUFPLEdBQUcsSUFBQSwyQkFBUyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPO2dCQUFFLFNBQVM7WUFDdkIsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDTCxDQUFDO0NBR0o7QUF0NkJELDhCQXM2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSwgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRmluZENvbmZpZywgSG9zdGVkQ29uZmlnLCBSZW1vdGVDb25maWcsIFNvdXJjZUNvbmZpZywgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQsXG4gICAgd2luZG93c0FjY2VwdFdyaXRlcywgU3luY0FjdGl2aXR5LCBGVUxMX1JPVVRFLCBGVUxMX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfUk9VVEUsIFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzaywgYXBwbHlGaW5kSW5mb1NoYXBlIH0gZnJvbSBcIi4uL0FyY2hpdmVzRGlza1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcm91dGVJbnRlcnNlY3Rpb24sIHBhcnNlUm91dGluZ0RhdGEsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgTG9nTWFwIH0gZnJvbSBcIi4uL0xvZ01hcFwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuXG5cbi8qKiBXaGF0IHdlIHN0b3JlIGFib3V0IGEgZmlsZS4gSXRzIHRpbWVzIGFyZSBub3QgaW4gaGVyZTogdGhlIGluZGV4IGtlZXBzIHRob3NlIGZvciBldmVyeSBrZXksIGRlbGV0ZWQgb25lcyBpbmNsdWRlZCAoc2VlIExvZ01hcCkuICovXG50eXBlIEluZGV4VmFsdWUgPSB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8vIFdoaWNoIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhOiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHNvdXJjZSdzIFVSTCBpbiB0aGUgc3RvcmUncyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QgKHNlZSBTb3VyY2VzTGlzdCkgLSBOT1QgYSBwb3NpdGlvbiBpbiB0aGUgaW4tbWVtb3J5IHNvdXJjZXMgYXJyYXksIHdoaWNoIGNoYW5nZXMgYmV0d2VlbiBydW5zXG4gICAgc291cmNlc0xpc3RJbmRleDogbnVtYmVyO1xufTtcblxuLyoqIE9uZSBmaWxlIHdlIGhvbGQsIGFzIGV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgaW5kZXggc2VlcyBpdC4gKi9cbmV4cG9ydCB0eXBlIEluZGV4RW50cnkgPSBJbmRleFZhbHVlICYge1xuICAgIHdyaXRlVGltZTogbnVtYmVyO1xuICAgIC8vIFdoZW4gV0UgbGFzdCBjaGFuZ2VkIHRoaXMgZW50cnkgKG5vdCB0aGUgZmlsZSdzIHdyaXRlIHRpbWUpIOKAlCB3aGF0IGdldENoYW5nZXNBZnRlcjIgZmlsdGVycyBvbiwgc28gbGF0ZS1hcnJpdmluZyBmaWxlcyB3aXRoIG9sZCB3cml0ZSB0aW1lcyBhcmUgc3RpbGwgcmVwb3J0ZWRcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbn07XG5cbi8vIE9uZSBzb3VyY2Ugb2YgYSBsaXZlIHNvdXJjZS1saXN0IHVwZGF0ZTsgc2VlIEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzXG5leHBvcnQgdHlwZSBCbG9iU291cmNlU3BlYyA9IHtcbiAgICAvLyBNYXRjaGVkIGFnYWluc3QgQXJjaGl2ZXNTb3VyY2UuaWRlbnRpdHkgKFwiZGlza1wiIGZvciB0aGUgYmFzZSBzbG90KTsgZXF1YWwgaWRlbnRpdGllcyBwYWlyIG9mZiBpbiBvcmRlclxuICAgIGlkZW50aXR5OiBzdHJpbmc7XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLnVybFxuICAgIHVybDogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2UuaW50ZXJtZWRpYXRlXG4gICAgaW50ZXJtZWRpYXRlPzogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS5zb3VyY2VDb25maWcgKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpXG4gICAgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnO1xuICAgIC8vIE9ubHkgY2FsbGVkIGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgbWF0Y2ggYW4gZXhpc3RpbmcgbGl2ZSBzbG90XG4gICAgY3JlYXRlOiAoKSA9PiBJQXJjaGl2ZXM7XG4gICAgLy8gVGhlIG9wcG9zaXRlIGNhc2U6IHRoZSBlbmRwb2ludCBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIG9ubHkgaXRzIGNvbmZpZyBjaGFuZ2VkLCBzbyB0aGUgUlVOTklORyBzb3VyY2UgaXMgaGFuZGVkIHRoZSBuZXcgb25lIChzZWUgYXBwbHlTb3VyY2VDb25maWcpXG4gICAgYXBwbHlDb25maWc/OiAoc291cmNlOiBJQXJjaGl2ZXMpID0+IHZvaWQ7XG59O1xuXG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG5cbi8vIFRoZSBidWNrZXQgc3RvcmUsIGFuZCB0aGUgb25seSBvbmU6IGV2ZXJ5IGJ1Y2tldCBhIHNlcnZlciBob2xkcyBpcyBzZXJ2ZWQgYnkgdGhlc2UsIG9uZSBwZXIgc3RvcmUgbmFtZSBpbiBpdHMgcm91dGluZyBjb25maWcuIEl0cyBzb3VyY2VzIGFyZSBwbGFpbiBJQXJjaGl2ZXMgLSB0aGUgZmlyc3QgaXMgYWx3YXlzIHRoZSBzdG9yZSdzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBjb25maWd1cmVkIHBlZXJzIChzZWUgY3JlYXRlU3RvcmVTb3VyY2UpIC0gc28gXCJubyBzeW5jaHJvbml6YXRpb25cIiBpcyBzaW1wbHkgYSBzdG9yZSB3aXRoIG5vIHBlZXJzLCBub3QgYSBkaWZmZXJlbnQga2luZCBvZiBzdG9yZS5cbmV4cG9ydCBjbGFzcyBCbG9iU3RvcmUge1xuICAgIC8vIOKUgOKUgCBzdGF0ZSDilIDilIBcbiAgICAvLyBTZXQgb25jZSB0aGUgc3RvcmUgaXMgc2h1dHRpbmcgZG93bjsgZXZlcnkgbG9vcCBpdCBvd25zIChhbmQgU3RvcmVTeW5jJ3MgbWFpbnRlbmFuY2UgbG9vcHMpIHN0b3BzIG9uIGl0XG4gICAgcHVibGljIHN0b3BwZWQgPSB7IHN0b3A6IGZhbHNlIH07XG4gICAgLy8gV2hldGhlciBpbml0IGhhcyByZWFjaGVkIHRoZSBwb2ludCB3aGVyZSBhIG5ld2x5IGFkZGVkIHNvdXJjZSBjYW4gc3RhcnQgc2Nhbm5pbmcgaW1tZWRpYXRlbHlcbiAgICBwdWJsaWMgc3luY1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAvKiogSXRzIHNvdXJjZXMsIGluIGNvbmZpZyBvcmRlcjogc2xvdCAwIGlzIGFsd2F5cyBpdHMgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIHBlZXJzIGl0IHN5bmNocm9uaXplcyB3aXRoLiBGaWxsZWQgYnkgdXBkYXRlU291cmNlcywgd2hpY2ggaXMgYWxzbyBob3cgdGhleSBjaGFuZ2UuIFRoZSBzdG9yZSBPV05TIHRoZW0gLSB3cml0ZXMgcGljayBhbW9uZyB0aGVtLCByZWFkcyByZXNvbHZlIGhvbGRlcnMgdGhyb3VnaCB0aGVtIC0gYW5kIFN0b3JlU3luYyBvbmx5IHNjYW5zIHdoYXRldmVyIGlzIGluIGhlcmUgYXQgdGhlIHRpbWUuICovXG4gICAgcHVibGljIHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10gPSBbXTtcbiAgICAvLyBVcGxvYWRzIGltbXV0YWJpbGl0eSBhbHJlYWR5IGRlY2lkZWQgYWdhaW5zdDogdGhlIGNsaWVudCBpcyBtaWQtc3RyZWFtIGJ5IHRoZSB0aW1lIHdlIGtub3csIHNvIGl0IGtlZXBzIHNlbmRpbmcgYW5kIGV2ZXJ5IHBhcnQgaXMgZHJvcHBlZFxuICAgIHByaXZhdGUgZGlzY2FyZGVkVXBsb2FkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgbmV4dERpc2NhcmRlZFVwbG9hZCA9IDE7XG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgaWRlbnRpdGllcyBiZWhpbmQgSW5kZXhFbnRyeS5zb3VyY2VzTGlzdEluZGV4IChzZWUgU291cmNlc0xpc3QpXG4gICAgcHJpdmF0ZSBzb3VyY2VzTGlzdDogU291cmNlc0xpc3Q7XG4gICAgLy8gUGVyIHNsb3Q6IHRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgdGhhdCBzbG90J3MgVVJMLCBmaWxsZWQgYnkgcmVnaXN0ZXJTbG90IGJlZm9yZSB0aGUgc2xvdCdzIHN5bmMgcnVuc1xuICAgIHByaXZhdGUgc2xvdFNvdXJjZXNMaXN0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHNsb3RSZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAvLyBFdmVyeSBmaWxlIHdlIGtub3cgb2YsIGluIG1lbW9yeSwgd2l0aCBhbiBhcHBlbmQtb25seSBsb2cgb2YgdGhlIGNoYW5nZXMgYmVoaW5kIGl0IChzZWUgTG9nTWFwKS4gQSBuZXcgZmlsZSBuYW1lIGVhY2ggdGltZSB0aGUgZW50cnkgZm9ybWF0IGNoYW5nZXMgZ2VuZXJhdGlvbjogdGhlIHByZXZpb3VzIG9uZXMgY2Fubm90IGJlIHJlYWQsIGFuZCBhIHNjYW4gcmVidWlsZHMgdGhlIGluZGV4IGFueXdheSwgc28gdGhleSBhcmUgc2ltcGx5IG5ldmVyIHJlYWQgYWdhaW4uXG4gICAgcHJpdmF0ZSBpbmRleDogTG9nTWFwPEluZGV4VmFsdWU+O1xuICAgIC8qKiBLZWVwaW5nIHRoZSBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlczogc2Nhbm5pbmcsIHB1bGxpbmcsIHB1c2hpbmcsIGFuZCB0aGUgbWFpbnRlbmFuY2UgdGhhdCBmb2xsb3dzIGZyb20gaG9sZGluZyBhbiBpbmRleCAoZGlzay1saW1pdCBldmljdGlvbiwgdG9tYnN0b25lIGV4cGlyeSkuIEl0IHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzdG9yZSdzIGluZGV4IGFuZCBzb3VyY2VzIC0gaXQgZG9lcyBub3Qgb3duIHRoZW0uICovXG4gICAgcHVibGljIHN5bmM6IFN0b3JlU3luYztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvLyBQdWJsaWMgZm9yIFN0b3JlU3luYywgd2hpY2ggbG9ncyBpdCB3aXRoIGV2ZXJ5dGhpbmcgaXQgZG9lc1xuICAgICAgICBwdWJsaWMgZm9sZGVyOiBzdHJpbmcsXG4gICAgICAgIC8qKiBUaGUgbmFtZSB0aGlzIHN0b3JlIGFuc3dlcnMgdG8gKHNlZSBDb21tb25Db25maWcubmFtZSkgLSB0aGUgZW50cmllcyBvZiB0aGUgcm91dGluZyBjb25maWcgdGhhdCBjYXJyeSBpdCBhcmUgdGhlIG9uZXMgdGhhdCBjb25maWd1cmUgaXQsIGFuZCB0aGUgcmVzdCBhcmUgaXRzIHBlZXJzLiAqL1xuICAgICAgICBwdWJsaWMgc3RvcmVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29uZmlnPzoge1xuICAgICAgICAgICAgLyoqIFdoZXRoZXIgYSBjb25maWcgZW50cnkgaXMgVEhJUyBTRVJWRVIgKHNhbWUgYWNjb3VudCwgc2FtZSBidWNrZXQsIG91ciBvd24gYWRkcmVzcykuIEluamVjdGVkIGJlY2F1c2UgYSBzdG9yZSBrbm93cyBub3RoaW5nIGFib3V0IHNlcnZlcnMgLSBpdCBvbmx5IG5lZWRzIHRvIHRlbGwgaXRzIG93biBlbnRyaWVzIGFwYXJ0IGZyb20gaXRzIHBlZXJzJy4gQWJzZW50IG1lYW5zIG5vdGhpbmcgaXMgdXMsIHdoaWNoIGlzIHdoYXQgYSBiYXJlIHN0b3JlIChubyBzZXJ2ZXIgYXJvdW5kIGl0KSB3YW50cy4gKi9cbiAgICAgICAgICAgIGlzU2VsZj86IChzb3VyY2U6IFNvdXJjZUNvbmZpZykgPT4gYm9vbGVhbjtcbiAgICAgICAgICAgIC8qKiBCdWlsZHMgb25lIG9mIGl0cyBzb3VyY2VzLiBJbmplY3RlZCBmb3IgdGhlIHNhbWUgcmVhc29uLCBhbmQgYmVjYXVzZSB0aGUgZGVsYXkgaXQgaXMgY3JlYXRlZCB3aXRoIGlzIHRoaXMgc3RvcmUncyBwb2xpY3kuICovXG4gICAgICAgICAgICBjcmVhdGVTb3VyY2U/OiAoY29uZmlnOiB7IHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZzsgd3JpdGVEZWxheTogbnVtYmVyIH0pID0+IElBcmNoaXZlcztcbiAgICAgICAgICAgIC8qKiBIYW5kcyBhIHJ1bm5pbmcgc291cmNlIGEgY2hhbmdlZCBjb25maWcsIHNvIGFuIGVuZHBvaW50IHdlIGFscmVhZHkgdGFsayB0byBpcyBuZXZlciByZWJ1aWx0IGp1c3QgYmVjYXVzZSBhIGZsYWcgbW92ZWQuICovXG4gICAgICAgICAgICBhcHBseVNvdXJjZT86IChzb3VyY2U6IElBcmNoaXZlcywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHdyaXRlRGVsYXk6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhIGtleSdzIGluZGV4IGVudHJ5IGNoYW5nZXMgKG91ciBvd24gd3JpdGVzIEFORCBmaWxlcyBwdWxsZWQgaW4gdmlhIHN5bmNocm9uaXphdGlvbikg4oCUIGhvdyB0aGUgc3RvcmFnZSBzZXJ2ZXIgbm90aWNlcyByb3V0aW5nIGNvbmZpZyB1cGRhdGVzLlxuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ/OiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhpcyBzdG9yZSBhcHBsaWVzIGEgcm91dGluZyBjb25maWcgdG8gaXRzZWxmIChzdGFydHVwLCBhbiBvcGVyYXRvcidzIHdyaXRlLCBhIHBlZXIncyBjb3B5IGFycml2aW5nKSAtIHRoZSBzdG9yZSBpcyB0aGUgb25lIHRoYXQga25vd3Mgd2hlbiBhIGNvbmZpZyBsYW5kZWQsIGFuZCB0aGUgc2VydmVyIGFybXMgd2luZG93LWJvdW5kYXJ5IHNjYW5zIGZyb20gaXQuICovXG4gICAgICAgICAgICBvblJvdXRpbmdBcHBsaWVkPzogKHJvdXRpbmc6IFJlbW90ZUNvbmZpZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHdyaXRlIChcIm9yaWdpbmFsXCIpIGFuZCBldmVyeSB3cml0ZSB0aGF0IGFjdHVhbGx5IHJlYWNoZWQgdGhlIHNvdXJjZXMgKFwiZmx1c2hlZFwiKS4gRmFzdCB3cml0ZXMgY29hbGVzY2UsIHNvIHRoZSB0d28gY291bnRzIGRpZmZlci5cbiAgICAgICAgICAgIG9uV3JpdGVDb3VudGVkPzogKGtpbmQ6IFwib3JpZ2luYWxcIiB8IFwiZmx1c2hlZFwiLCBieXRlczogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLy8gUmVzb2x2ZXMgYSBwZXJzaXN0ZWQgc291cmNlIFVSTCAoc2VlIEFyY2hpdmVzU291cmNlLnVybCkgdG8gYSBjYWNoZWQgSUFyY2hpdmVzLCBzbyBlbnRyaWVzIHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgY29uZmlndXJlZCBjYW4gc3RpbGwgYmUgcmVhZFxuICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZVVybD86ICh1cmw6IHN0cmluZykgPT4gSUFyY2hpdmVzO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIHRoaXMuc291cmNlc0xpc3QgPSBuZXcgU291cmNlc0xpc3QocGF0aC5qb2luKGZvbGRlciwgXCJpbmRleFwiLCBcInNvdXJjZXNMaXN0LnR4dFwiKSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXcgTG9nTWFwPEluZGV4VmFsdWU+KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJibG9iSW5kZXgzLmxvZ1wiKSk7XG4gICAgICAgIHRoaXMuc3luYyA9IG5ldyBTdG9yZVN5bmModGhpcyk7XG4gICAgICAgIHRoaXMuc3RvcmVDb25maWcgPSBuZXcgU3RvcmVDb25maWcoc3RvcmVOYW1lLCBbXSk7XG4gICAgICAgIHRoaXMub3duRGlzayA9IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKTtcbiAgICB9XG5cbiAgICAvKiogVGhpcyBzdG9yZSdzIGZvbGRlciwgdW53cmFwcGVkOiB0aGUgc2FtZSBieXRlcyBzbG90IDAgc2VydmVzLCBidXQgcmVhY2hlZCB3aXRob3V0IGl0cyB3cml0ZSBkZWxheS4gVXNlZCBmb3IgdGhlIHR3byB0aGluZ3MgdGhhdCBjYW5ub3QgZ28gdGhyb3VnaCBhIGJ1ZmZlcmVkIHNvdXJjZSAtIHJlYWRpbmcgb3VyIG93biByb3V0aW5nIGNvbmZpZyBiZWZvcmUgd2UgaGF2ZSBhbnkgc291cmNlcywgYW5kIHN0cmVhbWluZyBhIGxhcmdlIHVwbG9hZCB0aGF0IG11c3Qgbm90IHNpdCBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBvd25EaXNrOiBBcmNoaXZlc0Rpc2s7XG5cbiAgICAvKiogV2hhdCB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgdG8gYmUuIEl0IG93bnMgdGhpczogdGhlIHJvdXRpbmcgY29uZmlnIGlzIGEgZmlsZSBJTiB0aGUgc3RvcmUsIHNvIHRoZSBzdG9yZSByZWFkcyBpdCwgYXBwbGllcyBpdCB0byBpdHNlbGYsIGFuZCByZS1hcHBsaWVzIGl0IHdoZW5ldmVyIHRoZSBmaWxlIGNoYW5nZXMgLSBieSBvdXIgb3duIHdyaXRlLCBvciBieSBhIHBlZXIncyBjb3B5IGFycml2aW5nIHRocm91Z2ggc3luY2hyb25pemF0aW9uLiAqL1xuICAgIHB1YmxpYyBzdG9yZUNvbmZpZzogU3RvcmVDb25maWc7XG4gICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIHRoaXMgc3RvcmUgbGFzdCBhcHBsaWVkLCBzbyBhIHdyaXRlIG9mIGFuIGlkZW50aWNhbCAob3Igb2xkZXIpIG9uZSBpcyBub3QgcmUtYXBwbGllZFxuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmdWZXJzaW9uID0gLTE7XG4gICAgLy8gLi4uYW5kIHRoZSBjb25maWcgaXRzZWxmLCBzbyBhIHJlamVjdGlvbiBjYW4gc2F5IGV4YWN0bHkgd2hhdCB0aGUgc3RvcmUgSVMgcnVubmluZyBpbnN0ZWFkIG9mIGd1ZXNzaW5nXG4gICAgcHJpdmF0ZSBhcHBsaWVkUm91dGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gI3JlZ2lvbiBNYWluIGludGVyZmFjZVxuXG4gICAgcHVibGljIGluaXQgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ29uZmlndXJlIGZpcnN0OiB0aGUgY29uZmlnIGRlY2lkZXMgd2hhdCB0aGUgc291cmNlcyBBUkUsIGFuZCBldmVyeXRoaW5nIGJlbG93IGlzIHBlciBzb3VyY2UuIFdpdGggbm8gY29uZmlnIGF0IGFsbCB0aGF0IGlzIGp1c3Qgb3VyIG93biBkaXNrLCB3aGljaCBpcyBlbm91Z2ggdG8gc2VydmUgYW5kIHRvIGJlIHdyaXR0ZW4gdG8uXG4gICAgICAgIGF3YWl0IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyU2xvdChpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZnRlciB0aGUgc2xvdHMsIHdoaWNoIGlzIHdoYXQgaW5kZXggZW50cmllcyBuYW1lIGFzIHRoZWlyIGhvbGRlclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleCgpO1xuICAgICAgICB0aGlzLnN5bmNTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zeW5jLnN0YXJ0KCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZS1yZWFkcyB0aGUgcm91dGluZyBjb25maWcgb3V0IG9mIHRoaXMgc3RvcmUgYW5kIGFwcGxpZXMgaXQgdG8gaXRzZWxmLiBDYWxsZWQgYXQgc3RhcnR1cCBhbmRcbiAgICAgKiB3aGVuZXZlciB0aGF0IGZpbGUgY2hhbmdlcyBoZXJlIC0gd2hpY2ggaXMgdGhlIE9ORSBtZWNoYW5pc206IGEgY29uZmlnIHdyaXR0ZW4gYnkgYW4gb3BlcmF0b3JcbiAgICAgKiBhbmQgYSBjb25maWcgcHVsbGVkIG9mZiBhIHBlZXIgYXJlIHRoZSBzYW1lIGV2ZW50LCBhIHdyaXRlIG9mIHRoYXQgcGF0aCBpbnRvIHRoaXMgc3RvcmUuXG4gICAgICpcbiAgICAgKiBBIHN0b3JlIHdpdGggbm8gcm91dGluZyBjb25maWcgY29uZmlndXJlcyBpdHNlbGYgYXMgaXRzIG93biBkaXNrLCB2YWxpZCBhbHdheXMsIGZvciB0aGUgd2hvbGVcbiAgICAgKiBrZXkgc3BhY2UuIFRoYXQgaXMgYSBjb21wbGV0ZSwgd29ya2luZyBzdG9yZSAtIGl0IGp1c3QgaGFzIG5vYm9keSB0byBzeW5jaHJvbml6ZSB3aXRoIC0gYW5kIGl0XG4gICAgICogaXMgd2hhdCBsZXRzIGEgc3RvcmUgZXhpc3QgYmVmb3JlIGl0IGhhcyBldmVyIGhlYXJkIG9mIGEgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYXBwbHlSb3V0aW5nQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcm91dGluZyA9IGF3YWl0IHRoaXMucmVhZFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgbGV0IGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdID0gW107XG4gICAgICAgIGxldCBwZWVyczogU291cmNlQ29uZmlnW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJvdXRpbmc/LnNvdXJjZXMgfHwgW10pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUgJiYgdGhpcy5jb25maWc/LmlzU2VsZj8uKHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goc291cmNlIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZWVycy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRpbmcgJiYgIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9KSBkb2VzIG5vdCBuYW1lIHRoaXMgc3RvcmUgKCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSkgYXMgb25lIG9mIG91cnMsIHNvIGl0IHN0YXlzIGEgZGlzay1vbmx5IHN0b3JlYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXZpb3VzVmVyc2lvbiA9IHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IHJvdXRpbmcgJiYgZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKSB8fCAtMTtcbiAgICAgICAgaWYgKG5ld1ZlcnNpb24gIT09IHByZXZpb3VzVmVyc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBhZG9wdGVkIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtwcmV2aW91c1ZlcnNpb259IC0+ICR7bmV3VmVyc2lvbn06ICR7ZW50cmllcy5sZW5ndGh9IGVudHIke2VudHJpZXMubGVuZ3RoID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9IG9mIG91cnMgJHtKU09OLnN0cmluZ2lmeShlbnRyaWVzLm1hcCh4ID0+ICh7IHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9LCAke3BlZXJzLmxlbmd0aH0gcGVlcihzKWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmVDb25maWcudXBkYXRlKGVudHJpZXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZXModGhpcy5wbGFuU291cmNlcyhwZWVycykpO1xuICAgICAgICB0aGlzLmFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmcgPSByb3V0aW5nO1xuICAgICAgICBpZiAocm91dGluZykge1xuICAgICAgICAgICAgdGhpcy5jb25maWc/Lm9uUm91dGluZ0FwcGxpZWQ/Lihyb3V0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBhcyB0aGlzIHN0b3JlIGhvbGRzIGl0LCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgZm9sZGVyOiB0aGUgc3RvcmUgbWF5IGJlIGNvbmZpZ3VyaW5nIGl0c2VsZiBiZWZvcmUgaXQgaGFzIHNjYW5uZWQgYW55dGhpbmcsIGFuZCB0aGlzIGZpbGUgaXMgd2hhdCBkZWNpZGVzIHdoYXQgYSBzY2FuIHdvdWxkIGV2ZW4gdGFsayB0b1xuICAgIHByaXZhdGUgYXN5bmMgcmVhZFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLm93bkRpc2suZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgSWdub3JpbmcgdGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9OiBpdCBjb3VsZCBub3QgYmUgcGFyc2VkICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoaXMgc3RvcmUgaXMgcnVubmluZywgc28gYSBjb3B5IGZvdW5kIG9uIGEgcGVlciBpcyBvbmx5IHRha2VuIHdoZW4gaXQgaXMgZ2VudWluZWx5IG5ld2VyLiAtMSBtZWFucyBpdCBoYXMgbm9uZS4gKi9cbiAgICBwdWJsaWMgcm91dGluZ1ZlcnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEFwcGx5aW5nIGl0IHRvdWNoZXMgdGhlIHNvdXJjZXMsIHNvIGl0IGlzIHNlcmlhbGl6ZWQgYmVoaW5kIHdoYXRldmVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZyByYXRoZXIgdGhhbiBpbnRlcmxlYXZpbmcgd2l0aCBpdFxuICAgIHByaXZhdGUgcm91dGluZ0FwcGxpZXM6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwdWJsaWMgcmVhcHBseVJvdXRpbmdDb25maWcoKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5yb3V0aW5nQXBwbGllcy50aGVuKCgpID0+IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCkpO1xuICAgICAgICB0aGlzLnJvdXRpbmdBcHBsaWVzID0gbmV4dC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICB2b2lkIG5leHQuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBBcHBseWluZyB0aGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfVxuXG4gICAgLy8gT3VyIG93biBkaXNrIGZpcnN0IChhbHdheXMpLCB0aGVuIGV2ZXJ5IHBlZXIgd2hvc2Ugcm91dGUgb3ZlcmxhcHMgb3VycyAtIHRoZSBzb3VyY2VzIHRoaXMgc3RvcmUgc3luY2hyb25pemVzIHdpdGgsIGFzIGl0cyBvd24gY29uZmlnIGRlc2NyaWJlcyB0aGVtXG4gICAgcHJpdmF0ZSBwbGFuU291cmNlcyhwZWVyczogU291cmNlQ29uZmlnW10pOiBCbG9iU291cmNlU3BlY1tdIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzLnN0b3JlQ29uZmlnLmN1cnJlbnQoKTtcbiAgICAgICAgbGV0IG1ha2VTcGVjID0gKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXSwgcm91dGU6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIG5vRnVsbFN5bmM6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBCbG9iU291cmNlU3BlYyA9PiB7XG4gICAgICAgICAgICBsZXQgd3JpdGVEZWxheSA9IHNvdXJjZVdyaXRlRGVsYXkoeyBzb3VyY2VDb25maWcsIGZhc3Q6IHNlbGYuZmFzdCwgd3JpdGVEZWxheTogc2VsZi53cml0ZURlbGF5IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZGVudGl0eTogc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnKSxcbiAgICAgICAgICAgICAgICB1cmw6IHNvdXJjZVBlcnNpc3RlbnRVcmwoc291cmNlQ29uZmlnLCB0aGlzLmZvbGRlciksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlOiBzb3VyY2VDb25maWc/LmludGVybWVkaWF0ZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VDb25maWcsXG4gICAgICAgICAgICAgICAgY3JlYXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVkID0gdGhpcy5jb25maWc/LmNyZWF0ZVNvdXJjZT8uKHsgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5IH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBzdG9yZSBoYXMgbm8gd2F5IHRvIGJ1aWxkIHNvdXJjZXMsIHNvIGl0IGNhbm5vdCB1c2UgJHtKU09OLnN0cmluZ2lmeShzb3VyY2VDb25maWc/LnVybCB8fCB0aGlzLmZvbGRlcil9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFBhc3MgY3JlYXRlU291cmNlLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXBwbHlDb25maWc6IChzb3VyY2U6IElBcmNoaXZlcykgPT4gdGhpcy5jb25maWc/LmFwcGx5U291cmNlPy4oc291cmNlLCBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gT3VyIG93biBkaXNrIGFjY2VwdHMgd3JpdGVzIHdoaWxlIEFOWSB3aW5kb3cgdGhpcyBzdG9yZSBob2xkcyBpcyBvcGVuOyB3aXRoIG5vIGNvbmZpZyBhdCBhbGwgaXQgaXMgc2ltcGx5IGFsd2F5cyB2YWxpZFxuICAgICAgICBsZXQgb3duV2luZG93cyA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdyk7XG4gICAgICAgIGxldCBzcGVjczogQmxvYlNvdXJjZVNwZWNbXSA9IFttYWtlU3BlYyh1bmRlZmluZWQsIG93bldpbmRvd3MubGVuZ3RoICYmIG93bldpbmRvd3MgfHwgW0ZVTExfVkFMSURfV0lORE9XXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpXTtcbiAgICAgICAgLy8gT25lIHNwZWMgcGVyIGVuZHBvaW50LCBjYXJyeWluZyBhbGwgb2YgaXRzIHdpbmRvd3M6IGEgc3dpdGNob3ZlciBzcGxpdHMgb25lIHdpbmRvdyBhcm91bmQgYW4gaW50ZXJtZWRpYXRlLCBhbmQgdGhhdCBpcyBzdGlsbCBvbmUgc291cmNlIHRvIHVzXG4gICAgICAgIGxldCBieUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIEJsb2JTb3VyY2VTcGVjPigpO1xuICAgICAgICBmb3IgKGxldCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICAgICAgICBsZXQgc2hhcmVkID0gcm91dGVJbnRlcnNlY3Rpb24oc2VsZi5yb3V0ZSwgcGVlci5yb3V0ZSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBzb3VyY2VJZGVudGl0eShwZWVyKTtcbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5SWRlbnRpdHkuZ2V0KGlkZW50aXR5KTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkV2luZG93cy5wdXNoKHBlZXIudmFsaWRXaW5kb3cpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNwZWMgPSBtYWtlU3BlYyhwZWVyLCBbcGVlci52YWxpZFdpbmRvd10sIHNoYXJlZCwgcGVlci5ub0Z1bGxTeW5jIHx8IHNlbGYubm9GdWxsU3luYyk7XG4gICAgICAgICAgICBieUlkZW50aXR5LnNldChpZGVudGl0eSwgc3BlYyk7XG4gICAgICAgICAgICBzcGVjcy5wdXNoKHNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGVjcztcbiAgICB9XG5cbiAgICAvLyBTdG9wcyBhbGwgc3luY2hyb25pemF0aW9uIHNjYW5zL3BvbGxzIGFuZCBmbHVzaGVzIHBlbmRpbmcgd3JpdGVzLiBPbmx5IHVzZWQgd2hlbiB0aGUgc3RvcmUgZ2VudWluZWx5IGNhbm5vdCBjb250aW51ZSAoaXRzIHJvdXRlIG9yIGRpc2sgbGltaXQgY2hhbmdlZCwgcHJvY2VzcyBzaHV0ZG93bikgLSByb3V0aW5lIGNvbmZpZyBjaGFuZ2VzIGdvIHRocm91Z2ggdXBkYXRlU291cmNlcyBpbnN0ZWFkLCB3aGljaCB0aGUgc3RvcmUgc3Vydml2ZXMuXG4gICAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zeW5jLnN0b3AoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaERlbGF5ZWRXcml0ZXModHJ1ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5kZXguZmx1c2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Mihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW50ZXJuYWw/OiBib29sZWFuOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbnRlcm5hbDIoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWcucmFuZ2U7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBoYXMgbm8gYnl0ZXMgLSB0aGUgdG9tYnN0b25lIElTIHRoZSBhbnN3ZXIsIHNvIGEgZmxhZy1jYWxsZXIgZ2V0cyBpdHMgdGltZSB3aXRoIGVtcHR5IGRhdGFcbiAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luYy5ub3RlQWNjZXNzKGtleSk7XG4gICAgICAgIGxldCBob2xkZXJBcmNoaXZlcyA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaG9sZGVyQXJjaGl2ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXM6IHRoZSBob2xkZXIgYW5zd2VyaW5nIFwiZGVsZXRlZFwiIChhIHRvbWJzdG9uZSwgd2l0aCBpdHMgd3JpdGUgdGltZSkgbXVzdCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIkkgbG9zdCB0aGUgZmlsZVwiIC0gdGhlIGZvcm1lciBpcyBhdXRob3JpdGF0aXZlIGFuZCBtdXN0IE5PVCBmYWxsIGJhY2sgdG8gb2xkZXIgY29waWVzLCB3aGljaCB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0aW9uIGZvciB0aGlzIHJlYWRcbiAgICAgICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgaG9sZGVyQXJjaGl2ZXMuZ2V0MihrZXksIHsgcmFuZ2UsIGludGVybmFsOiB0cnVlLCBpbmNsdWRlVG9tYnN0b25lczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmICFhbnN3ZXIuZGF0YS5sZW5ndGggJiYgIShyYW5nZSAmJiBhbnN3ZXIuc2l6ZSkgJiYgYW5zd2VyLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYSByYW5nZWQgcmVhZCBvZiBhIHJlYWwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IChyYW5nZSBwYXN0IEVPRiksIHNvIG9ubHkgdW5yYW5nZWQgZW1wdGluZXNzIG1lYW5zIHRvbWJzdG9uZS9hYnNlbnRcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIChhbnN3ZXIuZGF0YS5sZW5ndGggfHwgcmFuZ2UgJiYgYW5zd2VyLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpXG4gICAgICAgICAgICBpZiAodGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIHNvdXJjZSdzIGNvcHkgd291bGQgc3luY2hyb25pemUgaXQgYmV0d2VlbiBub2RlcyB0aHJvdWdoIHRoZSByZWFkIHBhdGgsIHdoaWNoIGl0IG5ldmVyIGlzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhbiBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGxldCBob2xkZXJTbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBob2xkZXJTbG90IHx8ICF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldDIoa2V5LCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgY291bnRzIGFzIGFic2VudCAtIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodGhpcyByZWFkIGlzIHVucmFuZ2VkLCBzbyBlbXB0aW5lc3MgaXMgdW5hbWJpZ3VvdXMpXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiBhbnN3ZXIuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgPSB7IGRhdGE6IGFuc3dlci5kYXRhLCB3cml0ZVRpbWU6IGFuc3dlci53cml0ZVRpbWUsIHNpemU6IGFuc3dlci5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgZmFsbGJhY2spO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBmYWxsYmFjay5kYXRhO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIGRhdGEubGVuZ3RoKSwgTWF0aC5taW4ocmFuZ2UuZW5kLCBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBmYWxsYmFjay53cml0ZVRpbWUsIHNpemU6IGZhbGxiYWNrLnNpemUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9sZGVyRXJyb3IpIHRocm93IGhvbGRlckVycm9yO1xuICAgICAgICAvLyBUaGUgaG9sZGVyIGFuc3dlcmVkIFwibm90IHRoZXJlXCIgYW5kIG5vIG90aGVyIHNvdXJjZSBoYXMgaXQgZWl0aGVyOiB0aGUgZW50cnkgd2FzIHN0YWxlLiBGb3Jnb3R0ZW4gcmF0aGVyIHRoYW4gZGVsZXRlZCAtIG5vdGhpbmcgaGFwcGVuZWQgdG8gdGhpcyBmaWxlLCB3ZSB3ZXJlIHNpbXBseSB3cm9uZyBhYm91dCBob2xkaW5nIGl0LCBhbmQgc2F5aW5nIG90aGVyd2lzZSB3b3VsZCBwdXNoIGEgZGVsZXRpb24gb3V0IHRvIGV2ZXJ5b25lIGVsc2UuXG4gICAgICAgIHRoaXMucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChjb25maWc6IHsgcGF0aDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBwYXRoOiBrZXksIGRhdGEgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnLmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGRlZmluZXMgdGhlIHdpbmRvd3Mvcm91dGVzLCBzbyB0aGV5IGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IChhbmQgaXQgbmV2ZXIgZmxvd3MgdGhyb3VnaCB2YWxpZGF0aW9uKSAtIGJ1dCBpdCBoYXMgYSBydWxlIG9mIGl0cyBvd24sIHdoaWNoIGlzIG91cnMgdG8gZW5mb3JjZSBiZWNhdXNlIHRoZSBmaWxlIGlzIG91cnNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpXG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgcm91dGUpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIGV4ZW1wdCBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IHNraXBzIGV2ZXJ5IG90aGVyIGNoZWNrOiBpdCBpcyB0aGUgZmlsZSB0aGF0IERFRklORVMgb3VyIHdpbmRvd3MgYW5kIHJvdXRlcywgc28ganVkZ2luZyBpdCBieSB0aGUgY29uZmlnIGl0IGlzIGFib3V0IHRvIHJlcGxhY2UgaXMgaG93IGEgc3RvcmUgZ2V0cyBzdHVjayBvbiBhIGNvbmZpZyBpdCBjYW4gbmV2ZXIgYmUgdG9sZCB0byBsZWF2ZVxuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEludGVybmFsKGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRPckRlbGV0ZShrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWwoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgZGVsZXRlZCAob3ZlcndyaXRlIGl0IHRvIGNoYW5nZSB0aGUgYnVja2V0J3MgY29uZmlndXJhdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgLy8gQSBkZWxldGlvbiBsYW5kcyBpbiBleGFjdGx5IHRoZSBzYW1lIHBsYWNlIGEgd3JpdGUgd291bGQsIHNvIGl0IGlzIGp1ZGdlZCB0aGUgc2FtZSB3YXk6IG9uZSBhaW1lZCBhdCBhIHNoYXJkIHdlIGRvbid0IHNlcnZlIGlzIGp1c3QgYXMgaW52aXNpYmxlIGFzIGEgd3JpdGUgdG8gaXRcbiAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIGdldFJvdXRlKGtleSksIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIGRlbGV0aW9ucyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgZGVsZXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIGdldFJvdXRlKGtleSkpO1xuICAgICAgICAgICAgLy8gc2V0SW50ZXJuYWwgdHJlYXRzIGFuIGVtcHR5IGJ1ZmZlciBhcyBleGFjdGx5IGEgZGVsZXRpb246IGRpc2sgcmVtb3ZhbCBwbHVzIGEgdG9tYnN0b25lIGluZGV4IGVudHJ5LCBubyBmYW4tb3V0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEludGVybmFsKGtleSwgQnVmZmVyLmFsbG9jKDApLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGVzIGFyZSB3cml0ZXMgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpOiB0aGUgdG9tYnN0b25lIGlzIG9yZGVyZWQgYnkgd3JpdGUgdGltZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgcHJvcGFnYXRlcyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbiwgYW5kIGlzIGV2ZW50dWFsbHkgZXhwaXJlZFxuICAgICAgICBhd2FpdCB0aGlzLnNldE9yRGVsZXRlKGtleSwgQnVmZmVyLmFsbG9jKDApLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG5cbiAgICAvKiogQSBub2RlLXNpZGUgbW92ZTogdGhlIGJ5dGVzIG5ldmVyIHRyYXZlbCB0aHJvdWdoIHRoZSBjbGllbnQuIERlbGliZXJhdGVseSBqdXN0IGdldDIgKyBzZXQgKyBkZWwgcmF0aGVyIHRoYW4gYSBkaXNrIHJlbmFtZSwgc28gdGhlIGRlc3RpbmF0aW9uIHdyaXRlIHBhc3NlcyBFVkVSWSBydWxlIGEgc2V0IHBhc3NlcyAod2luZG93cywgcm91dGVzLCBpbW11dGFiaWxpdHksIG9ubHktdGFrZS1sYXRlc3QsIGluZGV4LCBmYW4tb3V0IHRvIHBlZXJzKSBhbmQgdGhlIGRlbGV0aW9uIHByb3BhZ2F0ZXMgYXMgYSBub3JtYWwgdG9tYnN0b25lIC0gYSByZW5hbWUgd291bGQgYnlwYXNzIGFsbCBvZiBpdC4gVGhlIHNldCBzdGFtcHMgZnJlc2gsIHNvIHRoZSBtb3ZlZCBmaWxlIGJlYXRzIGFueSB0b21ic3RvbmUgYXQgaXRzIG5ldyBwYXRoLiAqL1xuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzogeyBmcm9tUGF0aDogc3RyaW5nOyB0b1BhdGg6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IFJPVVRJTkdfRklMRSB8fCBjb25maWcudG9QYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIG1vdmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKHsgcGF0aDogY29uZmlnLmZyb21QYXRoIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX06IHRoZSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBleGlzdCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoeyBwYXRoOiBjb25maWcudG9QYXRoLCBkYXRhOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWwoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkgcmV0dXJuIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfTtcbiAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKGNvbmZpZzogRmluZENvbmZpZyAmIHsgcHJlZml4OiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgcHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgLy8gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSBhdCBhbGwsIHdoaWNoIGlzIHdoYXQgYSBsaXN0aW5nIHdhbnRzOiBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlXG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZXMgPSBhcHBseUZpbmRJbmZvU2hhcGUoQXJyYXkuZnJvbShpbmZvcy52YWx1ZXMoKSksIHByZWZpeCwgeyBzaGFsbG93OiBjb25maWcuc2hhbGxvdywgdHlwZTogY29uZmlnLnR5cGUgfSk7XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8vIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIGNvbmZpZy50aW1lIOKAlCBzdHJhaWdodCBmcm9tIHRoZSBpbmRleC4gRmlsdGVycyBvbiB3aGVuIFdFIGxlYXJuZWQgb2YgdGhlIGNoYW5nZSAoY2hhbmdlZEF0KSwgc28gZmlsZXMgc3luY2hyb25pemVkIGxhdGUgKHdpdGggb2xkIHdyaXRlIHRpbWVzKSBhcmUgc3RpbGwgcmVwb3J0ZWQuIERlbGV0aW9ucyBBUkUgcmVwb3J0ZWQsIGFzIHNpemUtMCBlbnRyaWVzOiBhIGNhbGxlciByZWFkaW5nIGEgY2hhbmdlIGZlZWQgaGFzIHRvIGhlYXIgYWJvdXQgdGhlbSwgYW5kIHNpemUgMCBpcyBob3cgdGhlIGZlZWQgc2F5cyBcImdvbmVcIiAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSkuIGNvbmZpZy5yb3V0ZXMgbGV0cyBhIHN0b3JlIHN5bmNpbmcgYSBwYXJ0aWFsIHNoYXJkIGFzayBmb3IganVzdCBpdHMgc2xpY2UuXG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGluUm91dGVzID0gKGtleTogc3RyaW5nKSA9PiAhY29uZmlnLnJvdXRlcyB8fCBjb25maWcucm91dGVzLnNvbWUocm91dGUgPT4gcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpO1xuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdID0gW107XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lLCBzaXplOiAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5kZXgncyB0b3RhbHMgcGx1cyBhbnkgaW4tcHJvZ3Jlc3MgYmFja2dyb3VuZCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIGdldFN5bmNQcm9ncmVzcygpOiB7XG4gICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9O1xuICAgICAgICBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgIHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdO1xuICAgIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IHRvdGFscy5maWxlQ291bnQsIGJ5dGVDb3VudDogdG90YWxzLmJ5dGVDb3VudCB9LFxuICAgICAgICAgICAgc291cmNlczogdG90YWxzLnNvdXJjZXMsXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHRoaXMucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgc3luY2luZzogdGhpcy5zeW5jLmdldEFjdGl2aXRpZXMoKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogZ2V0U3luY1Byb2dyZXNzJ3MgdG90YWxzLCBidXQgbG9hZGluZyB0aGUgaW5kZXggZmlyc3QsIHNvIHRoZXkgYXJlIG5ldmVyIHRoZSB6ZXJvZXMgb2YgYSBzdG9yZSBub3RoaW5nIGhhcyB0b3VjaGVkIHlldC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tcHV0ZUluZGV4VG90YWxzKCk6IFByb21pc2U8e1xuICAgICAgICBmaWxlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgfT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZWRJbmRleFRvdGFscygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmFtZWRJbmRleFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHtcbiAgICAgICAgbGV0IHRvdGFscyA9IHRoaXMuaW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCxcbiAgICAgICAgICAgIGJ5dGVDb3VudDogdG90YWxzLmJ5dGVDb3VudCxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlc1xuICAgICAgICAgICAgICAgIC5tYXAoKHgsIGkpID0+ICh7IGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksIC4uLnRvdGFscy5zbG90c1tpXSB9KSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh4LCBpKSA9PiB0aGlzLmlzTGl2ZShpKSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0b3JlJ3Mgc291cmNlcywgYXMgdGhlIGN1cnJlbnQgcm91dGluZyBjb25maWcgc2F5cyB0aGV5IHNob3VsZCBiZS4gVGhpcyBpcyB0aGUgT05MWSB3YXlcbiAgICAgKiB0aGV5IGFyZSBldmVyIHNldDogdGhlIGZpcnN0IGNhbGwgcG9wdWxhdGVzIGFuIGVtcHR5IHN0b3JlLCBldmVyeSBsYXRlciBvbmUgYXBwbGllcyBhIGNoYW5nZSB0b1xuICAgICAqIHRoZSBydW5uaW5nIG9uZS4gV2luZG93cywgcm91dGVzIGFuZCBmbGFncyBtb3ZlIGluIHBsYWNlLCBnZW51aW5lbHkgbmV3IGVuZHBvaW50cyBhcmUgYWRkZWQgYW5kXG4gICAgICogc3RhcnQgc2Nhbm5pbmcsIGFuZCBlbmRwb2ludHMgdGhhdCBhcmUgZ29uZSBnbyBkZWFkICh0aGVpciBzY2FucyBzdG9wLCB0aGVpciBpbmRleCBlbnRyaWVzXG4gICAgICogZHJvcCkuXG4gICAgICpcbiAgICAgKiBBIHN0b3JlIGlzIG5ldmVyIHJlYnVpbHQgZm9yIGEgY29uZmlnIGNoYW5nZS4gSXRzIG5hbWUgZGVjaWRlcyBpdHMgZm9sZGVyIGFuZCBpdHMgaWRlbnRpdHksIGFuZFxuICAgICAqIGEgY29uZmlnIGNoYW5nZSBjYW5ub3QgY2hhbmdlIGVpdGhlciAtIHNvIHRoZXJlIGlzIG5vdGhpbmcgYSBjaGFuZ2UgY2FuIGRvIHRvIGEgc3RvcmUgZXhjZXB0XG4gICAgICogdGhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlU291cmNlcyhzcGVjczogQmxvYlNvdXJjZVNwZWNbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXNwZWNzLmxlbmd0aCB8fCBzcGVjc1swXS5pZGVudGl0eSAhPT0gXCJkaXNrXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlU291cmNlcyBleHBlY3RzIHRoZSBkaXNrIHNvdXJjZSBmaXJzdCAoaWRlbnRpdHkgXCJkaXNrXCIpLCBnb3QgJHtKU09OLnN0cmluZ2lmeShzcGVjcy5tYXAoeCA9PiB4LmlkZW50aXR5KSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNhbGw6IHRoZSBkaXNrIHNsb3QgaGFzIHRvIGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgbWF0Y2hlZCBhZ2FpbnN0IGl0XG4gICAgICAgICAgICBsZXQgZGlzayA9IHNwZWNzWzBdO1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGRpc2suY3JlYXRlKCk7XG4gICAgICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uYmluZEZsdXNoRGVhZGxpbmUoKCkgPT4gdGhpcy53cml0ZUZsdXNoRGVhZGxpbmUoKSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBkaXNrLnVybCwgdmFsaWRXaW5kb3dzOiBkaXNrLnZhbGlkV2luZG93cywgcm91dGU6IGRpc2sucm91dGUsIG5vRnVsbFN5bmM6IGRpc2subm9GdWxsU3luYywgc291cmNlQ29uZmlnOiBkaXNrLnNvdXJjZUNvbmZpZywgaWRlbnRpdHk6IGRpc2suaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICB0aGlzLnN5bmMuYWRkU291cmNlKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZXRXaW5kb3dzID0gKGk6IG51bWJlciwgd2luZG93czogW251bWJlciwgbnVtYmVyXVtdKSA9PiB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cztcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGQpID09PSBKU09OLnN0cmluZ2lmeSh3aW5kb3dzKSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFZhbGlkIHdpbmRvd3MgY2hhbmdlZCBmb3IgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke0pTT04uc3RyaW5naWZ5KG9sZCl9IC0+ICR7SlNPTi5zdHJpbmdpZnkod2luZG93cyl9YCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzID0gd2luZG93cztcbiAgICAgICAgfTtcbiAgICAgICAgc2V0V2luZG93cygwLCBzcGVjc1swXS52YWxpZFdpbmRvd3MpO1xuICAgICAgICAvLyBMaXZlIHNsb3RzIHBhaXIgd2l0aCBzcGVjcyBieSBpZGVudGl0eS4gRWFjaCBlbmRwb2ludCBpcyBub3cgT05FIHNwZWMgY2FycnlpbmcgYWxsIGl0cyB3aW5kb3dzLCBzbyB0aGlzIGlzIGEgMToxIHBhaXJpbmc7IGFueSBsZWZ0b3ZlciBkdXBsaWNhdGUgc2xvdHMgZnJvbSBiZWZvcmUgKGFuIGVuZHBvaW50IHRoYXQgdXNlZCB0byBiZSBzcGxpdCBpbnRvIHNldmVyYWwgc2xvdHMpIGdvIHVubWF0Y2hlZCBiZWxvdyBhbmQgYXJlIGNvbGxhcHNlZCBhd2F5LlxuICAgICAgICBsZXQgbGl2ZUJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gICAgICAgIGxldCBvcmlnaW5hbExlbmd0aCA9IHRoaXMuc291cmNlcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgaWQgPSB0aGlzLnNvdXJjZXNbaV0uaWRlbnRpdHk7XG4gICAgICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IGxpdmVCeUlkZW50aXR5LmdldChpZCk7XG4gICAgICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW107XG4gICAgICAgICAgICAgICAgbGl2ZUJ5SWRlbnRpdHkuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2hlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgICAgICBmb3IgKGxldCBzcGVjIG9mIHNwZWNzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IGxpdmVCeUlkZW50aXR5LmdldChzcGVjLmlkZW50aXR5KT8uc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgU0FNRSBlbmRwb2ludCAoc2VlIHNvdXJjZUlkZW50aXR5KSwgc28gd2UgYXJlIGFscmVhZHkgc3luY2hyb25pemVkIHdpdGggaXQ6IHRoZSBzbG90IGtlZXBzIGl0cyBjb25uZWN0aW9uLCBpdHMgY29tcGxldGVkIHNjYW5zLCBhbmQgaXRzIGluZGV4IGVudHJpZXMsIGFuZCBvbmx5IHRoZSBwb2xpY3kgb24gaXQgbW92ZXMuIFJlY3JlYXRpbmcgaXQgaGVyZSB3b3VsZCBtZWFuIHJlc2Nhbm5pbmcgdGhlIGVuZHBvaW50IGZyb20gc2NyYXRjaCBldmVyeSB0aW1lIGEgZmxhZyBjaGFuZ2VzLlxuICAgICAgICAgICAgICAgIG1hdGNoZWQuYWRkKHNsb3QpO1xuICAgICAgICAgICAgICAgIHNldFdpbmRvd3Moc2xvdCwgc3BlYy52YWxpZFdpbmRvd3MpO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc291cmNlc1tzbG90XTtcbiAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnJvdXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGUgY2hhbmdlZCBmb3IgJHtleGlzdGluZy5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpfWApO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yb3V0ZSA9IHNwZWMucm91dGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5zb3VyY2VDb25maWcpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnNvdXJjZUNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZyBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSwga2VlcGluZyB0aGUgc291cmNlIChzbyBpdCBpcyBub3QgcmVzY2FubmVkKTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5zb3VyY2VDb25maWcpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBjYXJyaWVzIGl0cyBjb25maWcgKGFuZCBpdHMgd3JpdGUgZGVsYXkpIGludG8gZXZlcnl0aGluZyBpdCBkb2VzLCBzbyBpdCBoYXMgdG8gbGVhcm4gdGhlIG5ldyBvbmUgLSBzZWUgYXBwbHlTb3VyY2VDb25maWdcbiAgICAgICAgICAgICAgICBzcGVjLmFwcGx5Q29uZmlnPy4oZXhpc3Rpbmcuc291cmNlKTtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5ub0Z1bGxTeW5jID0gc3BlYy5ub0Z1bGxTeW5jO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNwZWMuY3JlYXRlKCk7XG4gICAgICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uYmluZEZsdXNoRGVhZGxpbmUoKCkgPT4gdGhpcy53cml0ZUZsdXNoRGVhZGxpbmUoKSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBzcGVjLnVybCwgdmFsaWRXaW5kb3dzOiBzcGVjLnZhbGlkV2luZG93cywgcm91dGU6IHNwZWMucm91dGUsIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYywgaW50ZXJtZWRpYXRlOiBzcGVjLmludGVybWVkaWF0ZSwgc291cmNlQ29uZmlnOiBzcGVjLnNvdXJjZUNvbmZpZywgaWRlbnRpdHk6IHNwZWMuaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWRkZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGEgZ2VudWluZWx5IG5ldyBlbmRwb2ludCwgc28gaXQgaXMgc2Nhbm5lZCBmcm9tIHNjcmF0Y2hgKTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UodGhpcy5zb3VyY2VzLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSB8fCBtYXRjaGVkLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBUaGUgc2xvdCBpcyBkZWFkIHRoZSBtb21lbnQgdGhpcyByZXR1cm5zOyBkcm9wcGluZyB0aGUgaW5kZXggZW50cmllcyBpdCBoZWxkIGlzIHRoZSBwYXJ0IHRoYXQgcmVhZHMgdGhlIGluZGV4LCBzbyBpdCBmaW5pc2hlcyBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgdm9pZCB0aGlzLnN5bmMucmVtb3ZlU291cmNlKGkpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgUmVtb3Zpbmcgc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy5yZXNjYW5CYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpLiAqL1xuICAgIHB1YmxpYyBhc3luYyBib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlOiBJQXJjaGl2ZXMsIGNvbmZpZzogeyBzaW5jZTogbnVtYmVyOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl0gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLmJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2UsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgdXBsb2FkcyBzdHJlYW0gb250byB0aGUgbG9jYWwgZGlzayBzb3VyY2UgZGlyZWN0bHkgKHRoZXkgbWF5IG5vdCBmaXQgaW4gbWVtb3J5KSwgYW5kIHJlY29uY2lsaWF0aW9uIGNhcnJpZXMgdGhlbSB0byB0aGUgb3RoZXIgc291cmNlcyAtIHRoZXJlIGlzIG5vIGRlbGF5ZWQtd3JpdGUgc3RhZ2UgdGhleSBjb3VsZCBwYXNzIHRocm91Z2guIFRoZSB3cml0ZSBpdHNlbGYgaXMgdmFsaWRhdGVkIGV4YWN0bHkgbGlrZSBzZXQncywgcmlnaHQgaGVyZTogdGhlIGNsaWVudCBpcyBhYm91dCB0byBzZW5kIHRoZSB3aG9sZSBmaWxlLCBzbyBldmVyeSByZWFzb24gdG8gcmVmdXNlIGl0IG11c3QgYmUgZm91bmQgYmVmb3JlIHRoZSBmaXJzdCBieXRlLlxuICAgIHB1YmxpYyBhc3luYyBzdGFydExhcmdlVXBsb2FkKGNvbmZpZz86IHsgcGF0aD86IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZz8ucGF0aDtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIHJvdXRlLCBjb25maWc/Lmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB1cGxvYWRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKS4gVGhlIGNsaWVudCBpcyBhbHJlYWR5IHN0cmVhbWluZywgc28gdGhlIHVwbG9hZCBpcyBhY2NlcHRlZCBhbmQgZXZlcnkgcGFydCBkaXNjYXJkZWQgLSB0aGUgYWx0ZXJuYXRpdmUgaXMgdGhyb3dpbmcgYXQgYSBjYWxsZXIgdGhhdCBkaWQgbm90aGluZyB3cm9uZy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgcm91dGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gYCR7RElTQ0FSREVEX1VQTE9BRF9QUkVGSVh9JHt0aGlzLm5leHREaXNjYXJkZWRVcGxvYWQrK31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkZWRVcGxvYWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWc/LmludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB1cGxvYWRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nOyBkYXRhOiBCdWZmZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmhhcyhjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcuZGF0YSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5pc2hMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmRlbGV0ZShjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpIC0gYSBuZXdlciB2YWx1ZSBjYW4gbGFuZCB3aGlsZSBhIGxvbmcgdXBsb2FkIGlzIHN0aWxsIHN0cmVhbWluZywgc28gdGhpcyBpcyByZS1jaGVja2VkIGhlcmUgcmF0aGVyIHRoYW4gb25seSBhdCB0aGUgc3RhcnRcbiAgICAgICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGNvbmZpZy5wYXRoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBkaXNrLmdldEluZm8oY29uZmlnLnBhdGgpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGNvbmZpZy5wYXRoLCB7IHdyaXRlVGltZTogaW5mby53cml0ZVRpbWUsIHNpemU6IGluZm8uc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmRlbGV0ZShjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnLmlkKTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIEludGVybmFsc1xuXG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQgY2FjaGUgdGhlIGRpc2sgbWF5IGhvbGQ7IHNlZSBDb21tb25Db25maWcucmVhZGVyRGlza0xpbWl0IChTdG9yZVN5bmMgZW5mb3JjZXMgaXQpLiBSZWFkIGZyb20gdGhlIGNvbmZpZyBpbiBlZmZlY3QsIHNvIHJhaXNpbmcgb3IgcmVtb3ZpbmcgdGhlIGxpbWl0IHRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCBldmljdGlvbiBwYXNzLiAqL1xuICAgIHB1YmxpYyBnZXQgcmVhZGVyRGlza0xpbWl0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlQ29uZmlnLmN1cnJlbnQoKS5yZWFkZXJEaXNrTGltaXQ7XG4gICAgfVxuXG4gICAgLyoqIFRoZSB3cml0ZSB0aW1lIGEgbmV3IHdyaXRlIGhhcyB0byBiZWF0LCBvciAwIHdoZW4gd2UgaGF2ZSBuZXZlciBoZWFyZCBvZiB0aGUga2V5LiBDb3VudHMgREVMRVRJT05TIHRvbzogYSB3cml0ZSBvbGRlciB0aGFuIHRoZSBkZWxldGlvbiB0aGF0IHJlbW92ZWQgaXQgbXVzdCBub3QgYnJpbmcgaXQgYmFjay4gVGhlIGluZGV4IGlzIGF1dGhvcml0YXRpdmUgZXZlbiBmb3IgYSB3cml0ZSBzdGlsbCBidWZmZXJlZCBpbiBhIGRlbGF5ZWQgc291cmNlLCBzaW5jZSB0aGUgZW50cnkgaXMgcmVjb3JkZWQgd2hlbiB0aGUgd3JpdGUgaXMgYWNjZXB0ZWQgcmF0aGVyIHRoYW4gd2hlbiBpdCByZWFjaGVzIHN0b3JhZ2UuICovXG4gICAgcHVibGljIGN1cnJlbnRXcml0ZVRpbWUoa2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC50aW1lT2Yoa2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTGl2ZShzb3VyY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMuaXNMaXZlKHNvdXJjZUluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJTbG90KHNsb3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnNsb3RSZWdpc3RyYXRpb25zW3Nsb3RdO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICAgICAgbGV0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuc291cmNlc0xpc3QuZW5zdXJlKHRoaXMuc291cmNlc1tzbG90XS51cmwpLnRoZW4oaW5kZXggPT4ge1xuICAgICAgICAgICAgdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNsb3RSZWdpc3RyYXRpb25zW3Nsb3RdID0gcmVnaXN0cmF0aW9uO1xuICAgICAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKiBUaGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIGEgc2xvdCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNsb3QgbmV2ZXIgZ290IHRoYXQgZmFyIChhIHNvdXJjZSByZW1vdmVkIGJlZm9yZSBpdHMgcmVnaXN0cmF0aW9uIHJlc29sdmVkKS4gKi9cbiAgICBwdWJsaWMgc2xvdFNvdXJjZXNMaXN0SW5kZXgoc2xvdDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIGEgc2xvdCAtIG9ubHkgdmFsaWQgb25jZSB0aGUgc2xvdCdzIHJlZ2lzdHJhdGlvbiByZXNvbHZlZCAoaW5pdCBhbmQgdGhlIHNvdXJjZSdzIHN5bmMgbG9vcCBndWFyYW50ZWUgdGhhdCBiZWZvcmUgYW55IGluZGV4aW5nIGhhcHBlbnMpXG4gICAgcHVibGljIHNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc2xvdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2Ugc2xvdCAke3Nsb3R9ICgke3RoaXMuc291cmNlc1tzbG90XT8udXJsfSkgaGFzIG5vIHJlZ2lzdGVyZWQgc291cmNlc0xpc3RJbmRleCB5ZXQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGl2ZSBzbG90IGN1cnJlbnRseSBzZXJ2aW5nIGEgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4LCBvciB1bmRlZmluZWQgd2hlbiBubyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhhdCBVUkwgYW55bW9yZS4gTGluZWFyLCBidXQgdGhlIHNvdXJjZXMgbGlzdCBpcyB0aW55IGFuZCB0aGlzIGlzIGFsd2F5cyBjdXJyZW50IChzbG90cyBkeWluZywgb3Igc2V2ZXJhbCBzbG90cyBzaGFyaW5nIG9uZSBVUkwgYWNyb3NzIHZhbGlkIHdpbmRvd3MsIG5lZWQgbm8gYm9va2tlZXBpbmcpLlxuICAgIHB1YmxpYyBzbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tpXSA9PT0gc291cmNlc0xpc3RJbmRleCAmJiB0aGlzLmlzTGl2ZShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgSUFyY2hpdmVzIGN1cnJlbnRseSBob2xkaW5nIGFuIGVudHJ5J3MgYnl0ZXM6IHRoZSBsaXZlIHNsb3Qgd2hlbiB0aGUgaG9sZGVyIGlzIHN0aWxsIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSByZXNvbHZlZCAoY2FjaGVkKSBzdHJhaWdodCBmcm9tIGl0cyBwZXJzaXN0ZWQgVVJMIC0gd2luZG93cy9yb3V0ZXMgZGVjaWRlIHdoZW4gYSBzb3VyY2UgaXMgc2Nhbm5lZCBvciB3cml0dGVuLCBidXQgZm9yIHJlYWRpbmcgYnl0ZXMgd2Uga25vdyBpdCBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2hcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cnlIb2xkZXIoZW50cnk6IEluZGV4RW50cnkpOiBQcm9taXNlPElBcmNoaXZlcyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmwoZW50cnkuc291cmNlc0xpc3RJbmRleCkgfHwgYXdhaXQgdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmxSZWxvYWRpbmcoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc/LnJlc29sdmVTb3VyY2VVcmw/Lih1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluZGV4LmxvYWQoKTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2sgKHNlZSBTdG9yZVN5bmMncyBzY2FuIGhhbmRsaW5nKSwgYW5kIGEgbG9hZGVkIGJ1Y2tldCBhbHdheXMgaGFzIGl0IHRoZXJlIC0gYSBwZXJzaXN0ZWQgZW50cnkgcG9pbnRpbmcgZWxzZXdoZXJlIGlzIHN0YWxlLCBzbyBpdCBpcyBjb3JyZWN0ZWQgb25jZSwgaGVyZVxuICAgICAgICBsZXQgcm91dGluZyA9IHRoaXMuZ2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUpO1xuICAgICAgICBsZXQgYmFzZVNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCk7XG4gICAgICAgIGlmIChyb3V0aW5nICYmIHJvdXRpbmcuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUsIHsgd3JpdGVUaW1lOiByb3V0aW5nLndyaXRlVGltZSwgc2l6ZTogcm91dGluZy5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiBiYXNlU291cmNlc0xpc3RJbmRleCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZpbGUgd2UgaG9sZC4gQSBkZWxldGVkIG9uZSBpcyBub3Qgb25lOiBpdCBpcyBhIHRvbWJzdG9uZSwgYW5kIG9ubHkgZ2V0RGVsZXRlZEVudHJ5IGtub3dzIGFib3V0IGl0LiAqL1xuICAgIHB1YmxpYyBnZXRJbmRleEVudHJ5KGtleTogc3RyaW5nKTogSW5kZXhFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuaW5kZXguZ2V0KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIFdoZW4gYSBrZXkgd2FzIGRlbGV0ZWQsIGlmIGl0IHdhcy4gQSBkZWxldGlvbiBpcyBhbiBhYnNlbmNlIHdpdGggYSB0aW1lIGF0dGFjaGVkIC0gdGhhdCB0aW1lIGlzIHdoYXQgbWFrZXMgaXQgcHJvcGFnYXRlIGFuZCB3aGF0IGV4cGlyZXMgaXQuICovXG4gICAgcHVibGljIGdldERlbGV0ZWRFbnRyeShrZXk6IHN0cmluZyk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZmlsZSB3ZSBob2xkLCBmb3IgdGhlIHBhc3NlcyB0aGF0IHdhbGsgdGhlbSBhbGwgKGxpc3RpbmdzLCBzY2FucywgcmVjb25jaWxpYXRpb24sIGV2aWN0aW9uKS4gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSAtIHNlZSBkZWxldGVkRW50cmllcy4gTGl2ZTogZGVsZXRpbmcgZW50cmllcyB3aGlsZSBpdGVyYXRpbmcgaXMgZXhwZWN0ZWQgaGVyZSwgYW5kIHNhZmUuICovXG4gICAgcHVibGljICppbmRleEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZGVsZXRpb24gd2Uga25vdyBvZi4gQSBtdWNoIHNtYWxsZXIgd2FsayB0aGFuIHRoZSBmaWxlcywgd2hpY2ggaXMgd2hhdCBtYWtlcyBleHBpcmluZyB0aGVtIGNoZWFwLiAqL1xuICAgIHB1YmxpYyAqZGVsZXRlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuaW5kZXguZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSG93IG1hbnkgZmlsZXMgd2UgaG9sZCwgZGVsZXRpb25zIGV4Y2x1ZGVkLiAqL1xuICAgIHB1YmxpYyBpbmRleFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguc2l6ZTtcbiAgICB9XG5cbiAgICAvKiogVG90YWxzIG92ZXIgdGhlIGZpbGVzIHdlIGhvbGQsIGJyb2tlbiBkb3duIGJ5IHRoZSBzbG90IGhvbGRpbmcgZWFjaCAoZW50cmllcyBjYW4gbmFtZSBhIHNvdXJjZSB0aGF0IGlzIG5vIGxvbmdlciBjb25maWd1cmVkLCB3aGljaCBjb3VudHMgdG93YXJkcyB0aGUgdG90YWwgYnV0IG5vIHNsb3QpLiAqL1xuICAgIHB1YmxpYyBpbmRleFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc2xvdHM6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgc2xvdHMgPSB0aGlzLnNvdXJjZXMubWFwKCgpID0+ICh7IGZpbGVDb3VudDogMCwgYnl0ZUNvdW50OiAwIH0pKTtcbiAgICAgICAgZm9yIChsZXQgWywgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgICAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNsb3RzW3Nsb3RdLmZpbGVDb3VudCsrO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsZUNvdW50LCBieXRlQ291bnQsIHNsb3RzIH07XG4gICAgfVxuXG4gICAgLyoqIFJlY29yZHMgYSBmaWxlLCBhcyBvZiBpdHMgd3JpdGUgdGltZS4gUmV0dXJucyBmYWxzZSwgaGF2aW5nIGNoYW5nZWQgbm90aGluZywgd2hlbiB3ZSBhbHJlYWR5IGtub3cgc29tZXRoaW5nIGF0IGxlYXN0IGFzIG5ldyAtIHRoZSBpbmRleCBjYW5ub3QgYmUgbWFkZSB0byBnbyBiYWNrd2FyZHMsIHdoaWNoZXZlciBwYXRoIHRoZSB3cml0ZSBjYW1lIGluIGJ5LiAqL1xuICAgIHB1YmxpYyBzZXRJbmRleEVudHJ5KGtleTogc3RyaW5nLCBlbnRyeTogeyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyBzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXguc2V0KGtleSwgeyBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiBlbnRyeS5zb3VyY2VzTGlzdEluZGV4IH0sIGVudHJ5LndyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGxhbmRpbmcgaGVyZSAtIHdyaXR0ZW4gYnkgYW4gb3BlcmF0b3IsIG9yIHB1bGxlZCBvZmYgYSBwZWVyIGJ5IHN5bmNocm9uaXphdGlvbiAtIGlzIGhvdyB0aGlzIHN0b3JlIGxlYXJucyB3aGF0IGl0IGlzIG1lYW50IHRvIGJlXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlYXBwbHlSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIFJlY29yZHMgYSBERUxFVElPTiwgYXMgb2YgaXRzIHRpbWU6IHRoZSBrZXkgc3RvcHMgZXhpc3RpbmcgaGVyZSwgYW5kIHRoZSB0b21ic3RvbmUgaXMgd2hhdCBtYWtlcyB0aGF0IGZhY3QgcHJvcGFnYXRlIGFuZCByZWNvbmNpbGUgbGlrZSBhbnkgb3RoZXIgd3JpdGUuIFNhbWUgb3JkZXJpbmcgcnVsZSBhcyBzZXRJbmRleEVudHJ5LiAqL1xuICAgIHB1YmxpYyBzZXRJbmRleERlbGV0ZWQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5kZWxldGUoa2V5LCB3cml0ZVRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBGb3JnZXRzIGEga2V5IGVudGlyZWx5LCB0b21ic3RvbmUgaW5jbHVkZWQuIE5PVCBhIGRlbGV0aW9uOiBpdCBzYXlzIG5vdGhpbmcgaGFwcGVuZWQgdG8gdGhlIGZpbGUsIG9ubHkgdGhhdCB3ZSBubyBsb25nZXIga25vdyBhbnl0aGluZyBhYm91dCBpdCAtIGZvciBhbiBlbnRyeSB3aG9zZSBob2xkZXIgdHVybmVkIG91dCBub3QgdG8gaGF2ZSBpdCwgYW5kIGZvciBhIHRvbWJzdG9uZSBvbGQgZW5vdWdoIHRoYXQgZXZlcnlvbmUgaGFzIGhlYXJkLiAqL1xuICAgIHB1YmxpYyBwdXJnZUluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmRleC5wdXJnZShrZXkpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCB2YWxpZGF0aW9uIChmcm9tIHRoaXMgc3RvcmUncyBvd24gcm91dGluZyBlbnRyaWVzKSDilIDilIBcblxuICAgIC8qKlxuICAgICAqIEV2ZXJ5IHdyaXRlLCBob3dldmVyIGl0IGlzIHN0YW1wZWQsIGhhcyB0byBiZSBvbmUgd2UgYXJlIGFjdHVhbGx5IG1lYW50IHRvIGhvbGQgLSBiZWNhdXNlIHRoZVxuICAgICAqIGFsdGVybmF0aXZlIGlzIG5vdCBhIHNtYWxsZXIgcHJvYmxlbSwgaXQgaXMgYSBzaWxlbnQgb25lLiBBIHdyaXRlIHRoYXQgbGFuZHMgb24gYSBzdG9yZSB0aGF0XG4gICAgICogZG9lcyBub3Qgc2VydmUgaXRzIHJvdXRlIChvciBvbiBhIHNlcnZlciB0aGF0IGlzIG5vdCBpbiB0aGUgYnVja2V0J3MgY29uZmlnIGF0IGFsbCkgZ29lcyBpbnRvIGFcbiAgICAgKiBmb2xkZXIgbm90aGluZyBzY2FucyBhbmQgbm8gcGVlciByZWNvbmNpbGVzOiBpdCBzdWNjZWVkcywgYW5kIHRoZW4gaXQgaXMgZ29uZS4gVGhlIG1hcmtlcnMgbWFrZVxuICAgICAqIHRoZSBjbGllbnQgcmUtcmVhZCB0aGUgcm91dGluZyBjb25maWcgYW5kIHJldHJ5LCB3aGljaCBpcyBleGFjdGx5IHRoZSByaWdodCBvdXRjb21lIHdoZW4gdGhlXG4gICAgICogcmVhc29uIGl0IGFpbWVkIGhlcmUgaXMgdGhhdCBpdHMgY29uZmlnIHdhcyBzdGFsZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzc2VydFdyaXRlVGFyZ2V0KGtleTogc3RyaW5nLCByb3V0ZTogbnVtYmVyLCBsYXN0TW9kaWZpZWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZGV0YWlsID0gdGhpcy51bmNvbmZpZ3VyZWREZXRhaWwoKTtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3Rpbmcgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9YCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9OT1RfQ09ORklHVVJFRH0gQ2Fubm90IHdyaXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfSBEYXRhIHdyaXR0ZW4gdG8gYSBzdG9yZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gZW50cnkgd291bGQgbmV2ZXIgYmUgc2Nhbm5lZCBvciByZWNvbmNpbGVkLCBzbyBhY2NlcHRpbmcgaXQgd291bGQgc2lsZW50bHkgbG9zZSBpdC4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkgLSBvciwgaWYgdGhpcyBzdG9yZSBpcyBnZW51aW5lbHkgbWVhbnQgdG8gdGFrZSB0aGlzIHdyaXRlLCB3cml0ZSB0aGUgYnVja2V0J3Mgcm91dGluZyBjb25maWcgd2l0aCBhbiBlbnRyeSBuYW1pbmcgaXQgb24gdGhpcyBzZXJ2ZXIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0RnJlc2hXcml0ZVRhcmdldChrZXksIERhdGUubm93KCksIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHN0YW1wZWQgd3JpdGUgcGlja2VkIGl0cyBvd24gdGltZSwgc28gbm8gd2luZG93IGNhbiBqdWRnZSBpdCAodGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgYSBzeW5jaHJvbml6ZWQgd3JpdGUpIC0gYnV0IHRoZSBST1VURSBpcyBub3QgYSBtYXR0ZXIgb2YgdGltaW5nLCBhbmQgYSBzdGFtcGVkIHdyaXRlIHRvIHRoZSB3cm9uZyBzaGFyZCBpcyBleGFjdGx5IGFzIGludmlzaWJsZSBhcyBhIGZyZXNoIG9uZVxuICAgICAgICBpZiAodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSByZXR1cm47XG4gICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3Rpbmcgc3RhbXBlZCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgcm91dGUgd2Ugc2VydmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzdG9yZSBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGtleSl9LCBvdXIgcm91dGVzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9LCBzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgIH1cblxuICAgIC8qKiBFeGFjdGx5IHdoeSB0aGlzIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uIGVudHJpZXMgLSB3aGljaCBvZiB0aGUgdGhyZWUgcG9zc2libGUgcmVhc29ucyBpdCBpcywgd2l0aCB0aGUgdmFsdWVzIHRoYXQgZGVjaWRlZCBpdCwgYmVjYXVzZSBcIm5vdCBjb25maWd1cmVkXCIgYWxvbmUgaXMgdW5kaWFnbm9zYWJsZS4gKi9cbiAgICBwcml2YXRlIHVuY29uZmlndXJlZERldGFpbCgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcm91dGluZyA9IHRoaXMuYXBwbGllZFJvdXRpbmc7XG4gICAgICAgIGxldCBpZGVudGl0eSA9IGBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSlgO1xuICAgICAgICBpZiAoIXJvdXRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaGFzIG5vIHJvdXRpbmcgY29uZmlnIGF0IGFsbCAtIG5vdGhpbmcgaGFzIGV2ZXIgd3JpdHRlbiAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGludG8gaXQuYDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2JqZWN0cyA9IHJvdXRpbmcuc291cmNlcy5maWx0ZXIoeCA9PiB0eXBlb2YgeCAhPT0gXCJzdHJpbmdcIikgYXMgU291cmNlQ29uZmlnW107XG4gICAgICAgIGxldCBuYW1lZCA9IG9iamVjdHMuZmlsdGVyKHggPT4geC5uYW1lID09PSB0aGlzLnN0b3JlTmFtZSk7XG4gICAgICAgIGlmICghbmFtZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGlzIHJ1bm5pbmcgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9LCB3aGljaCBoYXMgbm8gZW50cnkgbmFtZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChpdHMgZW50cmllcyBhcmUgbmFtZWQgJHtKU09OLnN0cmluZ2lmeShvYmplY3RzLm1hcCh4ID0+IHgubmFtZSkpfSkuYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGlzIHJ1bm5pbmcgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9LCB3aG9zZSAke25hbWVkLmxlbmd0aH0gZW50ciR7bmFtZWQubGVuZ3RoID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSBwb2ludChzKSBhdCAke0pTT04uc3RyaW5naWZ5KG5hbWVkLm1hcCh4ID0+IHgudXJsKSl9IC0gbm9uZSBvZiB3aGljaCBpcyBUSElTIHNlcnZlciwgc28gdGhlIGNvbmZpZyBzYXlzIHRoaXMgc3RvcmUgbGl2ZXMgZWxzZXdoZXJlLmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBhIHJvdXRpbmcgY29uZmlnIG1heSBiZSB3cml0dGVuIGhlcmUuIFR3byBydWxlcywgYW5kIHRoaXMgaXMgdGhlIG9uZSBwbGFjZSBlaXRoZXIgaXNcbiAgICAgKiBhcHBsaWVkIC0gYSBjb25maWcgb25seSBldmVyIGVudGVycyB0aGUgc3lzdGVtIHRocm91Z2ggYSB3cml0ZSwgc28gYSBjb25maWcgdGhhdCBnb3QgaW4gaXMgYVxuICAgICAqIGNvbmZpZyB0aGF0IHBhc3NlZCwgYW5kIHJlYWRpbmcgb25lIGJhY2sgbmV2ZXIganVkZ2VzIGl0IGFnYWluLlxuICAgICAqXG4gICAgICogVGhlIGNvbmZpZyBoYXMgdG8gYmUgdmFsaWQgYXMgYSB3aG9sZSAoc2VlIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKSwgYW5kIGl0IGhhcyB0byBvdXRyYW5rIHdoYXRcbiAgICAgKiB3ZSBhcmUgcnVubmluZzogdGhlIHNhbWUgdmVyc2lvbiBtZWFucyB0aGUgc2FtZSBjb25maWcsIHNvIHJlLXdyaXRpbmcgaXQgaXMgaGFybWxlc3MsIGJ1dCBhXG4gICAgICogbG93ZXIgb25lIGlzIGFuIG9sZGVyIGNvbmZpZyBhcnJpdmluZyBsYXRlIGFuZCBtdXN0IG5ldmVyIHVuZG8gYSBuZXdlciBvbmUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRSb3V0aW5nQ29uZmlnV3JpdGFibGUoZGF0YTogQnVmZmVyKTogdm9pZCB7XG4gICAgICAgIGxldCByb3V0aW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocm91dGluZyk7XG4gICAgICAgIGxldCBpbmNvbWluZyA9IGdldENvbmZpZ1ZlcnNpb24ocm91dGluZyk7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5yb3V0aW5nVmVyc2lvbigpO1xuICAgICAgICBpZiAoaW5jb21pbmcgPj0gY3VycmVudCkgcmV0dXJuO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZnVzaW5nIHRvIHdyaXRlICR7Uk9VVElOR19GSUxFfSB0byBzdG9yZSAke3RoaXMuZm9sZGVyfTogaXRzIHZlcnNpb24gKCR7aW5jb21pbmd9KSBpcyBvbGRlciB0aGFuIHRoZSBvbmUgdGhpcyBzdG9yZSBpcyBydW5uaW5nICgke2N1cnJlbnR9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBIGZyZXNoICh1bnN0YW1wZWQpIHdyaXRlIG11c3QgbGFuZCBvbiB0aGUgbm9kZSB0aGUgY29uZmlnIGN1cnJlbnRseSBwb2ludHMgYXQ6IHRoZSBtYXJrZXJzIHRlbGwgdGhlIGNsaWVudCBpdHMgY29uZmlnIGlzIHN0YWxlLCBzbyBpdCByZS1yZXNvbHZlcyBhbmQgcmV0cmllcyBhZ2FpbnN0IHRoZSByaWdodCBub2RlIGluc3RlYWQgb2YgdXMgc2lsZW50bHkgYWNjZXB0aW5nIGRhdGEgd2Ugd2VyZSBuZXZlciBtZWFudCB0byBob2xkLlxuICAgIHByaXZhdGUgYXNzZXJ0RnJlc2hXcml0ZVRhcmdldChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuZmlsdGVyKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogaXRzIHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgZXZlcnkgdmFsaWQgd2luZG93IG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAod2luZG93czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0sIGZvbGRlciAke3RoaXMuZm9sZGVyfSkgLSBhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldC4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHN0b3JlIGRvZXMgbm90IGhhbmRsZSByb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0sIG91ciByb3V0ZXMgYXQgdGhpcyB0aW1lOiAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0sIHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFzc2VydE11dGFibGUoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHRoaXMuc3RvcmVDb25maWcuYWxsKCksIHdyaXRlVGltZSwgZ2V0Um91dGUoa2V5KSk7XG4gICAgICAgIGlmICghc2VsZj8uaW1tdXRhYmxlKSByZXR1cm47XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBzdG9yZSBpcyBpbW11dGFibGUgKGF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9KSBhbmQgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBhbHJlYWR5IGV4aXN0cywgc28gaXQgY2Fubm90IGJlIHdyaXR0ZW4gdG8gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VlIFNldENvbmZpZy5pbnRlcm5hbDogdGhlIHN0YW1wIG11c3QgbGFuZCBpbnNpZGUgU09NRSB3aW5kb3crcm91dGUgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIGZvciAoYW55IHdpbmRvdywgaW5jbHVkaW5nIHBhc3Qgb25lcyAtIHN5bmNocm9uaXphdGlvbiBtb3ZlcyBvbGQgZGF0YSksIHNvIGEgY29uZnVzZWQgcGVlciBjYW4ndCBzdHVmZiBkYXRhIG9udG8gYSBzdG9yZSB0aGF0IHdhcyBuZXZlciBtZWFudCB0byBob2xkIGl0XG4gICAgcHJpdmF0ZSBhc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IGNvdmVyZWQgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdICYmIHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKCFjb3ZlcmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gcmVqZWN0ZWQ6IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgYXQgcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSB3aW5kb3cvcm91dGUgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIGZvcjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+ICh7IHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHJlYWQ6IHB1cmVseSB0aGUgbG9jYWwgZGlzaywgY29tcGxldGVseSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBpbmRleCBhbmQgaG9sZGVyIHJlc29sdXRpb24gLSB0aGUgY2FsbGVyIGlzIGFub3RoZXIgc3RvcmUsIGFuZCBjaGFzaW5nIE9VUiByZW1vdGUgaG9sZGVycyB3aGlsZSBhbnN3ZXJpbmcgaXQgaXMgaG93IGluZmluaXRlIGdldCBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtLiBObyB3aW5kb3cgb3Igcm91dGUgY2hlY2tzOiBpZiB0aGUgYnl0ZXMgYXJlIG9uIG91ciBkaXNrLCB0aGUgY2FsbGVyIG1heSBoYXZlIHRoZW0uIE5vdGUgdGhpcyByZWFkcyB0aGUgZGlzayBwYXN0IGFueSB3cml0ZSBkZWxheSwgc28gYSBmYXN0IHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIG1lbW9yeSBpcyBpbnZpc2libGUgaGVyZTsgdGhlIGNhbGxlciByZS1maW5kcyBpdCBvbmNlIGl0IGZsdXNoZXMuICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbnRlcm5hbDIoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICAvLyBpbmNsdWRlVG9tYnN0b25lcyBmb3J3YXJkcyB0byB0aGUgZGlzazogYSBmbGFnLWNhbGxlciAoYSBwZWVyIHN0b3JlJ3Mgc3luY2hyb25pemF0aW9uKSBuZWVkcyB0byBzZWUgb3VyIGRlbGV0aW9ucywgbm90IGp1c3Qgb3VyIGNvbnRlbnQuIEEgdG9tYnN0b25lIGRlbGV0ZWQgZnJvbSBkaXNrIGVudGlyZWx5IG9ubHkgbGl2ZXMgaW4gb3VyIGluZGV4LCBzbyBmYWxsIGJhY2sgdG8gdGhhdC5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suZ2V0Mihjb25maWcucGF0aCwgeyByYW5nZTogY29uZmlnLnJhbmdlLCBpbmNsdWRlVG9tYnN0b25lczogY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGNvbmZpZy5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH07XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgd3JpdGU6IHRoZSBsb2NhbCBkaXNrIHBsdXMgb3VyIGluZGV4LCB3aXRoIE5PIGRvd25zdHJlYW0gZmFuLW91dCAtIHRoZSBwdXNoaW5nIHN0b3JlIG93bnMgcHJvcGFnYXRpb24sIGFuZCBmYW5uaW5nIGl0cyBwdXNoZXMgYmFjayBvdXQgaXMgaG93IHdyaXRlIGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE9ubHktdGFrZS1sYXRlc3Qgc3RpbGwgYXBwbGllcyBoZXJlLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgc2V0SW50ZXJuYWwoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSB0b21ic3RvbmUgaXMgdGhlIHdob2xlIG9mIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBjb25maWcubGFzdE1vZGlmaWVkLCBzaXplOiBkYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWFkJ3MgYnl0ZXMgY2FtZSBmcm9tIGEgcmVtb3RlIHNvdXJjZSwgc28gd3JpdGUgdGhlbSBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgd2hpY2ggYmVjb21lcyB0aGUgZW50cnkncyBuZXcgaG9sZGVyIC0gcmVhZHMgb25seSBwYXkgdGhlIHJlbW90ZSBmZXRjaCBvbmNlXG4gICAgcHJpdmF0ZSBhc3luYyBjYWNoZVJlYWQoa2V5OiBzdHJpbmcsIHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaGFyZWQgZW5naW5lIG9mIHNldCBhbmQgZGVsOiBhbiBlbXB0eSBidWZmZXIgaXMgZXhhY3RseSBhIGRlbGV0aW9uIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGUgZW1wdHktYnVmZmVyIHJlamVjdGlvbiBsaXZlcyBpbiBzZXQgKHRoZSBwdWJsaWMgQVBJKSwgbm90IGluIHRoaXMgbWFjaGluZXJ5XG4gICAgcHJpdmF0ZSBhc3luYyBzZXRPckRlbGV0ZShrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJvcmlnaW5hbFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWcubGFzdE1vZGlmaWVkO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYXN0IHdyaXRlcyBhcmUgbm90IGhhbmRsZWQgaGVyZTogYSBzb3VyY2UgdGhhdCB3YXMgY29uZmlndXJlZCB3aXRoIGEgd3JpdGUgZGVsYXkgYnVmZmVycyB0aGVtIGl0c2VsZiAoc2VlIEFyY2hpdmVzRGVsYXllZCksIHNvIHRoaXMgd3JpdGUgbGFuZHMgaW4gbWVtb3J5IGFuZCByZXR1cm5zLCBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUuIFRoZSBpbmRleCBpcyB1cGRhdGVkIGVpdGhlciB3YXksIHNvIHRoZSB3cml0ZSBpcyBpbW1lZGlhdGVseSB2aXNpYmxlIHRvIHJlYWRlcnMgb2YgdGhpcyBzdG9yZS5cbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGRhdGEsIGxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGluc3RhbnQgZXZlcnkgZGVsYXllZCB3cml0ZSBtdXN0IGJlIG9uIGl0cyBzb3VyY2U6IHRoZSBlbmQgb2Ygb3VyIG93biB3cml0ZSB3aW5kb3cgdGhhdCBjb250YWlucyBub3csIG1pbnVzIHRoZSBmbHVzaCBtYXJnaW4gKHNvIHRoZSBuZXh0IHdpbmRvdydzIHNvdXJjZSBmaW5kcyB0aGUgZGF0YSBvbiBoYW5kb2ZmKS4gVGhlIExBVEVTVCBlbmQgYW1vbmcgY292ZXJpbmcgd2luZG93cyAtIG92ZXJsYXBwaW5nIHdpbmRvd3MgaGFuZCBvZmYgYXQgdGhlIGxhc3Qgb25lLiBObyB3aW5kb3cgY29udGFpbnMgbm93IChhbiBpbmVydCBzdG9yZSwgb3IgYSBtb21lbnQgYmV0d2VlbiBvdXIgd2luZG93cykgLT4gMCwgaS5lLiBub3RoaW5nIG1heSBiZSBkZWxheWVkIGF0IGFsbC4gKi9cbiAgICBwdWJsaWMgd3JpdGVGbHVzaERlYWRsaW5lKCk6IG51bWJlciB7XG4gICAgICAgIC8vIEJlZm9yZSB1cGRhdGVTb3VyY2VzIGhhcyBydW4gdGhlcmUgaXMgbm90aGluZyB0byBob2xkIGEgd3JpdGUgYW55d2F5LCBhbmQgbm90aGluZyBtYXkgYmUgZGVsYXllZFxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy5zb3VyY2VzWzBdLnZhbGlkV2luZG93cykge1xuICAgICAgICAgICAgaWYgKHdbMF0gPD0gbm93ICYmIG5vdyA8IHdbMV0pIGVuZCA9IE1hdGgubWF4KGVuZCwgd1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmQpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gZW5kIC0gV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcml0YWJsZVNvdXJjZXMoY29uZmlnPzogeyBpZ25vcmVXaW5kb3c/OiBib29sZWFuIH0pOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCB3cml0YWJsZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb25maWc/Lmlnbm9yZVdpbmRvdyAmJiAhd2luZG93c0FjY2VwdFdyaXRlcyh0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIHNvdXJjZSAodGhlIGZpcnN0IHdyaXRhYmxlIG9uZSkgcGx1cyBldmVyeSByb3V0ZS1tYXRjaGluZyBwZWVyLiBFYWNoIHNvdXJjZSBkZWNpZGVzIGZvciBpdHNlbGYgaG93IGxvbmcgaXQgaG9sZHMgdGhlIHdyaXRlIGJlZm9yZSBpdCBoaXRzIHN0b3JhZ2UgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpIC0gaGVyZSB0aGV5IGFsbCBqdXN0IGdldCB3cml0dGVuLlxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVUb1NvdXJjZXMoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBORVZFUiBzeW5jaHJvbml6ZWQgYmV0d2VlbiBzdG9yYWdlIG5vZGVzOiB0aGUgd3JpdGVyIHdyaXRlcyBpdCBkaXJlY3RseSB0byBlYWNoIG5vZGUsIHNvIHdlIHN0b3JlIGl0IG9uIG91ciBvd24gZGlzayBvbmx5IChubyB2YWxpZC13aW5kb3cgZmlsdGVyIC0gcm91dGluZy92YWxpZCB3aW5kb3dzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIHRoZSBmaWxlIGRlZmluaW5nIHRoZW0pIGFuZCBuZXZlciBmb3J3YXJkIGl0IHRvIG90aGVyIHNvdXJjZXMuXG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwiZmx1c2hlZFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBpc1JvdXRpbmcgPSBrZXkgPT09IFJPVVRJTkdfRklMRTtcbiAgICAgICAgbGV0IHdyaXRhYmxlID0gdGhpcy5nZXRXcml0YWJsZVNvdXJjZXMoeyBpZ25vcmVXaW5kb3c6IGlzUm91dGluZyB9KTtcbiAgICAgICAgbGV0IGZpcnN0ID0gd3JpdGFibGUuc2hpZnQoKTtcbiAgICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIChldmVyeSBzb3VyY2UncyB2YWxpZCB3aW5kb3cgaXMgaW4gdGhlIHBhc3QpLCBzbyB3cml0ZXMgY2Fubm90IGJlIHN0b3JlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBvdXIgb3duIChmaXJzdCkgc291cmNlIGJsb2NrcyB0aGUgd3JpdGUuIERvd25zdHJlYW0gc291cmNlcyBhcmUgd3JpdHRlbiBpbiB0aGUgYmFja2dyb3VuZDogYSBkb3duIGRvd25zdHJlYW0gc291cmNlIG11c3Qgbm90IGZhaWwgb3Igc3RhbGwgd3JpdGVzLCBhbmQgcmVjb25jaWxpYXRpb24gcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBBIGRlbGV0aW9uIHN0b3JlcyBub3RoaW5nIG9uIG91ciBvd24gc291cmNlIC0gdGhlIHRvbWJzdG9uZSBpcyB0aGUgd2hvbGUgb2YgaXRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzW2ZpcnN0XS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZSwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChmaXJzdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUm91dGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICBmb3IgKGxldCBpIG9mIHdyaXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gRGVsZXRpb25zIHRyYXZlbCBhcyBkZWwgY2FycnlpbmcgdGhlIG9yaWdpbmFsIHdyaXRlIHRpbWUgKG5ldmVyIGFzIGVtcHR5IHNldHMgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKS4gQmFja2JsYXplIG1hdGVyaWFsaXplcyBzdWNoIGRlbHMgYXMgcmVhbCBlbXB0eSBmaWxlcywgc28gaXRzIGxpc3RpbmdzIHN0aWxsIHNob3cgdGhlIGRlbGV0aW9uIGZvciBvdGhlciBzdG9yZXMgdG8gc2NhbiBpbiBhcyBhIHRvbWJzdG9uZS5cbiAgICAgICAgICAgIGxldCBwdXNoOiBQcm9taXNlPHVua25vd24+O1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZGVsKGtleSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoID0gdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCBwdXNoLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tncm91bmQgd3JpdGUgb2YgJHtrZXl9IHRvIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2xvdCAwIGlzIGFsd2F5cyB0aGlzIHN0b3JlJ3Mgb3duIGZvbGRlciAoc2VlIHBsYW5Tb3VyY2VzKSwgc28gdGhlIGRpc2sgaXMga25vd24gd2l0aG91dCBzZWFyY2hpbmcgZm9yIGl0IC0gYW5kIGl0IGlzIHRoZSB1bndyYXBwZWQgb25lLCBwYXN0IGFueSB3cml0ZSBkZWxheVxuICAgIHByaXZhdGUgZ2V0RGlza1NvdXJjZSgpOiB7IGRpc2s6IEFyY2hpdmVzRGlzazsgc291cmNlSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgcmV0dXJuIHsgZGlzazogdGhpcy5vd25EaXNrLCBzb3VyY2VJbmRleDogMCB9O1xuICAgIH1cblxuICAgIC8qKiBXcml0ZXMgZXZlcnl0aGluZyBzdGlsbCBoZWxkIGJ5IGEgZGVsYXllZCBzb3VyY2UgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpLiBmb3JjZSBhbHNvIHdyaXRlcyB3aGF0IGlzbid0IGR1ZSB5ZXQgLSBzaHV0ZG93biBjYW5ub3QgbGVhdmUgd3JpdGVzIGluIG1lbW9yeS4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGZsdXNoRGVsYXllZFdyaXRlcyhmb3JjZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgeyBzb3VyY2UgfSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBkZWxheWVkID0gYXNEZWxheWVkKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoIWRlbGF5ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgZGVsYXllZC5mbHVzaChmb3JjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uXG59XG4iXX0=
|
|
941
|
-
/* _JS_SOURCE_HASH = "
|
|
959
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQW1OO0FBQ25OLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsc0NBQW1DO0FBQ25DLCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUU3RCxxZ0JBQXFnQjtBQUVyZ0IsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzVDLDJHQUEyRztBQUMzRyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQztBQW9DN0MsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsU0FBUyx1QkFBdUIsQ0FBQyxPQUFlO0lBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixHQUFHLHlCQUF5QjtRQUFFLE9BQU87SUFDeEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELHVXQUF1VztBQUN2VyxNQUFhLFNBQVM7SUFxQmxCO0lBQ0ksOERBQThEO0lBQ3ZELE1BQWM7SUFDckIsMktBQTJLO0lBQ3BLLFNBQWlCLEVBQ2hCLE1BaUJQO1FBcEJNLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBaUJiO1FBMUNMLGNBQWM7UUFDZCwwR0FBMEc7UUFDbkcsWUFBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2pDLCtGQUErRjtRQUN4RixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUMzQiw0VEFBNFQ7UUFDclQsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFDdEMsNElBQTRJO1FBQ3BJLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsd0JBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBR2hDLG1IQUFtSDtRQUMzRywyQkFBc0IsR0FBYSxFQUFFLENBQUM7UUFDdEMsc0JBQWlCLEdBQW9CLEVBQUUsQ0FBQztRQTBDaEQsMEdBQTBHO1FBQ2xHLDBCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBSW5DLHlCQUF5QjtRQUVsQixTQUFJLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7O1lBQzFCLGdNQUFnTTtZQUNoTSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hDLHdOQUF3TjtZQUN4TixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEtBQUksTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxvQkFBb0IsQ0FBQSxFQUFFLENBQUM7Z0JBQ3RFLElBQUksQ0FBQztvQkFDRCxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxRQUFRLEVBQUUsQ0FBQzt3QkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sOEZBQThGLElBQUEsK0JBQWdCLEVBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7d0JBQ3BOLG9HQUFvRzt3QkFDcEcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSxvQ0FBcUIsRUFBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ2pILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3BDLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sOEhBQThILENBQUMsQ0FBQztvQkFDL00sQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sb0NBQW9DLE1BQUMsQ0FBVyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdE0sQ0FBQztZQUNMLENBQUM7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFDRCxvRUFBb0U7WUFDcEUsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQXlESCx1SUFBdUk7UUFDL0gsbUJBQWMsR0FBa0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBdkd0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkseUJBQVcsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxlQUFNLENBQWEsY0FBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkseUJBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDJCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQTBDRDs7Ozs7Ozs7T0FRRztJQUNJLEtBQUssQ0FBQyxrQkFBa0I7O1FBQzNCLElBQUksT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsSUFBSSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUNqQyxJQUFJLEtBQUssR0FBbUIsRUFBRSxDQUFDO1FBQy9CLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxLQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFBRSxTQUFTO1lBQ3pDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxNQUFNLG1EQUFHLE1BQU0sQ0FBQyxDQUFBLEVBQUUsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFzQixDQUFDLENBQUM7Z0JBQ3JDLFNBQVM7WUFDYixDQUFDO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsSUFBSSxDQUFDLE1BQU0sYUFBYSxJQUFBLCtCQUFnQixFQUFDLE9BQU8sQ0FBQywrQkFBK0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDak4sQ0FBQztRQUNELElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUNqRCxJQUFJLFVBQVUsR0FBRyxPQUFPLElBQUksSUFBQSwrQkFBZ0IsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLFVBQVUsS0FBSyxlQUFlLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sb0NBQW9DLGVBQWUsT0FBTyxVQUFVLEtBQUssT0FBTyxDQUFDLE1BQU0sUUFBUSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxzQkFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUM7UUFDMVYsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7UUFDOUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxnQkFBZ0IsbURBQUcsT0FBTyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNMLENBQUM7SUFFRCw0TUFBNE07SUFDcE0sS0FBSyxDQUFDLGlCQUFpQjtRQUMzQixJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QyxJQUFJLENBQUM7WUFDRCxPQUFPLElBQUEsK0JBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxJQUFJLENBQUMsTUFBTSw2QkFBOEIsQ0FBVyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDdkgsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztJQUNMLENBQUM7SUFFRCx5SkFBeUo7SUFDbEosY0FBYztRQUNqQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDO0lBSU0sb0JBQW9CO1FBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxJQUFJLENBQUMsTUFBTSxZQUFZLE1BQUEsQ0FBQyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQztJQUNoSSxDQUFDO0lBRUQsc0pBQXNKO0lBQzlJLFdBQVcsQ0FBQyxLQUFxQjtRQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLElBQUksUUFBUSxHQUFHLENBQUMsWUFBc0MsRUFBRSxZQUFnQyxFQUFFLEtBQW1DLEVBQUUsVUFBK0IsRUFBa0IsRUFBRTtZQUM5SyxJQUFJLFVBQVUsR0FBRyxJQUFBLGtDQUFnQixFQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNsRyxPQUFPO2dCQUNILFFBQVEsRUFBRSxJQUFBLDZCQUFjLEVBQUMsWUFBWSxDQUFDO2dCQUN0QyxHQUFHLEVBQUUsSUFBQSxrQ0FBbUIsRUFBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDbkQsWUFBWTtnQkFDWixLQUFLO2dCQUNMLFVBQVU7Z0JBQ1YsWUFBWSxFQUFFLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxZQUFZO2dCQUN4QyxZQUFZO2dCQUNaLE1BQU0sRUFBRSxHQUFHLEVBQUU7O29CQUNULElBQUksT0FBTyxHQUFHLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxZQUFZLG1EQUFHLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ3hFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUEsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLEdBQUcsS0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sdUJBQXVCLENBQUMsQ0FBQztvQkFDL0ssQ0FBQztvQkFDRCxPQUFPLE9BQU8sQ0FBQztnQkFDbkIsQ0FBQztnQkFDRCxXQUFXLEVBQUUsQ0FBQyxNQUFpQixFQUFFLEVBQUUsZUFBQyxPQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxXQUFXLG1EQUFHLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUEsRUFBQTthQUNuRyxDQUFDO1FBQ04sQ0FBQyxDQUFDO1FBQ0YseUhBQXlIO1FBQ3pILElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hFLElBQUksS0FBSyxHQUFxQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLElBQUksQ0FBQyw2QkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2xJLGdKQUFnSjtRQUNoSixJQUFJLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztRQUNuRCxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3JCLElBQUksTUFBTSxHQUFHLElBQUEsZ0NBQWlCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLE1BQU07Z0JBQUUsU0FBUztZQUN0QixJQUFJLFFBQVEsR0FBRyxJQUFBLDZCQUFjLEVBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0MsU0FBUztZQUNiLENBQUM7WUFDRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxRixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsZ1FBQWdRO0lBQ3pQLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFpSDtRQUMvSCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLGdUQUFnVDtRQUNoVCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQ2hELHdHQUF3RztZQUN4RyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLE1BQXFFLENBQUM7UUFDMUUsSUFBSSxXQUE4QixDQUFDO1FBQ25DLElBQUksY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNELDZQQUE2UDtnQkFDN1AsSUFBSSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2hHLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDakgsT0FBTyxTQUFTLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQ0QsbUlBQW1JO2dCQUNuSSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN4RSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuRixDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsV0FBVyxHQUFHLENBQVUsQ0FBQztZQUM3QixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCx3REFBd0Q7WUFDeEQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFDRCwwS0FBMEs7UUFDMUssSUFBSSxHQUFHLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksV0FBVztnQkFBRSxNQUFNLFdBQVcsQ0FBQztZQUNuQyxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsMktBQTJLO1FBQzNLLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFBRSxTQUFTO1lBQ2xELElBQUksUUFBdUUsQ0FBQztZQUM1RSxJQUFJLENBQUM7Z0JBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLDhHQUE4RztnQkFDOUcsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUM5QyxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyRixDQUFDO1lBQ0wsQ0FBQztZQUFDLFdBQU0sQ0FBQztnQkFDTCxTQUFTO1lBQ2IsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRO2dCQUFFLFNBQVM7WUFDeEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3pCLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxXQUFXO1lBQUUsTUFBTSxXQUFXLENBQUM7UUFDbkMsaVFBQWlRO1FBQ2pRLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBOEc7UUFDM0gsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLGlHQUFpRyxDQUFDLENBQUM7UUFDM00sQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xELElBQUksS0FBSyxHQUFHLElBQUEsdUJBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUMxQiw0TUFBNE07UUFDNU0sSUFBSSxHQUFHLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxHQUFHLEtBQUssMkJBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hELElBQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkdBQTZHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9LLENBQUM7Z0JBQ0QsNkdBQTZHO2dCQUM3RyxJQUFJLElBQUksR0FBRyxJQUFBLHlCQUFhLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsU0FBUyxLQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztvQkFBRSxPQUFPO1lBQ3JFLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtSEFBbUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNyTCxDQUFDO1lBQ0Qsd1BBQXdQO1lBQ3hQLElBQUksR0FBRyxLQUFLLDJCQUFZLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUN6RSxPQUFPO1FBQ1gsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQW1FO1FBQ2hGLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxHQUFHLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQVksQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO1FBQ2hKLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixvS0FBb0s7UUFDcEssSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUhBQXVILElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDekwsQ0FBQztZQUNELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxRSxrSEFBa0g7WUFDbEgsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLE9BQU87UUFDWCxDQUFDO1FBQ0QsbUxBQW1MO1FBQ25MLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsc2FBQXNhO0lBQy9aLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBNEM7UUFDMUQsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUM5QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssMkJBQVksSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUFZLENBQUMsMkJBQTJCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQ0FBMkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakssQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUQ7UUFDdEUsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN0QixnVEFBZ1Q7UUFDaFQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUs7WUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQjtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2hELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQXVDO1FBQ3pELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7UUFDL0MsbUdBQW1HO1FBQ25HLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsU0FBUztZQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxJQUFBLGlDQUFrQixFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILElBQUEsV0FBSSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsb2JBQW9iO0lBQzdhLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUEwQjtRQUNwRCxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLEtBQUssRUFBRSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksS0FBSyxHQUFzQixFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSTtnQkFBRSxTQUFTO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJO2dCQUFFLFNBQVM7WUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBQSxXQUFJLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUN0QixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELDBFQUEwRTtJQUNuRSxlQUFlO1FBTWxCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JDLE9BQU87WUFDSCxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNuRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtTQUNyQyxDQUFDO0lBQ04sQ0FBQztJQUVELDhIQUE4SDtJQUN2SCxLQUFLLENBQUMsa0JBQWtCO1FBSzNCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTztZQUNILFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztZQUMzQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2lCQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4QyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxhQUFhLENBQUMsS0FBdUI7O1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLG1GQUFtRjtZQUNuRixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQUEsSUFBQSwyQkFBUyxFQUFDLE1BQU0sQ0FBQywwQ0FBRSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN4TCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFTLEVBQUUsT0FBMkIsRUFBRSxFQUFFO1lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPO1lBQzVELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvSixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsdVFBQXVRO1FBQ3ZRLElBQUksY0FBYyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ2pELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsU0FBUztZQUM5QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLEVBQUUsS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDL0IsSUFBSSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDVixjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNoQyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksR0FBRyxNQUFBLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQ0FBRSxLQUFLLEVBQUUsQ0FBQztZQUN0RCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckIsNFJBQTRSO2dCQUM1UixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5SixRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLG1EQUFtRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlOLENBQUM7Z0JBQ0Qsc0lBQXNJO2dCQUN0SSxNQUFBLElBQUksQ0FBQyxXQUFXLHFEQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUN0QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzFDLFNBQVM7WUFDYixDQUFDO1lBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQUEsSUFBQSwyQkFBUyxFQUFDLE1BQU0sQ0FBQywwQ0FBRSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6TixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sNERBQTRELENBQUMsQ0FBQztZQUMxSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFNBQVM7WUFDaEQsa0pBQWtKO1lBQ2xKLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsV0FBQyxPQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLGFBQWEsTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDO1FBQ3RMLENBQUM7SUFDTCxDQUFDO0lBRUQsNktBQTZLO0lBQ3RLLEtBQUssQ0FBQyxVQUFVO1FBQ25CLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsNEtBQTRLO0lBQ3JLLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFpQixFQUFFLE1BQW1EO1FBQ2xHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHFYQUFxWDtJQUM5VyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBc0g7UUFDaEosTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLEdBQUcsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksQ0FBQztRQUN2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ04sSUFBSSxTQUFTLEdBQUcsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxLQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuRCxJQUFJLEtBQUssR0FBRyxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxHQUFHLEtBQUssMkJBQVksRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELElBQUksR0FBRyxLQUFLLDJCQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsaUJBQWlCLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywrR0FBK0csSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDakwsQ0FBQztvQkFDRCxvUUFBb1E7b0JBQ3BRLElBQUksSUFBSSxHQUFHLElBQUEseUJBQWEsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxTQUFTLEtBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDdkQsSUFBSSxFQUFFLEdBQUcsR0FBRyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO3dCQUNuRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM5QixPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHFIQUFxSCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN2TCxDQUFDO2dCQUNELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFvQztRQUMvRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDakQsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBZ0k7UUFDM0osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPO1FBQ3BELElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUEsbUNBQXVCLEVBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLDRMQUE0TDtZQUM1TCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsT0FBTztZQUNYLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRSxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hKLENBQUM7SUFDTCxDQUFDO0lBQ00sS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQXNCO1FBQ2pELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQUUsT0FBTztRQUNwRCxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxhQUFhO0lBRWIsb0JBQW9CO0lBRXBCLGdOQUFnTjtJQUNoTixJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsa1dBQWtXO0lBQzNWLGdCQUFnQixDQUFDLEdBQVc7UUFDL0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQW1CO1FBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZO1FBQzVCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUM1QyxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQsb0pBQW9KO0lBQzdJLG9CQUFvQixDQUFDLElBQVk7UUFDcEMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELDRLQUE0SztJQUNySyxzQkFBc0IsQ0FBQyxJQUFZOztRQUN0QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksS0FBSyxNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLDBDQUFFLEdBQUcsbURBQW1ELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RJLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQseVJBQXlSO0lBQ2xSLHVCQUF1QixDQUFDLGdCQUF3QjtRQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsZ1NBQWdTO0lBQ3pSLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBaUI7O1FBQ3pDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVILElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDM0IsT0FBTyxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsZ0JBQWdCLG1EQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUztRQUNuQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsZ05BQWdOO1FBQ2hOLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUNuSSxDQUFDO0lBQ0wsQ0FBQztJQUVELDRHQUE0RztJQUNyRyxhQUFhLENBQUMsR0FBVztRQUM1QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdCLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBRUQsbUpBQW1KO0lBQzVJLGVBQWUsQ0FBQyxHQUFXO1FBQzlCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVELDROQUE0TjtJQUNyTixDQUFDLFlBQVk7UUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0wsQ0FBQztJQUVELDhHQUE4RztJQUN2RyxDQUFDLGNBQWM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7SUFDTCxDQUFDO0lBRUQsa0RBQWtEO0lBQzNDLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxnTEFBZ0w7SUFDekssV0FBVztRQUNkLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxDQUFDO1lBQ1osU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDeEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hFLElBQUksSUFBSSxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbU5BQW1OO0lBQzVNLGFBQWEsQ0FBQyxHQUFXLEVBQUUsS0FBb0U7O1FBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEgsc0pBQXNKO1FBQ3RKLElBQUksR0FBRyxLQUFLLDJCQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsY0FBYyxtREFBRyxHQUFHLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsb01BQW9NO0lBQzdMLGVBQWUsQ0FBQyxHQUFXLEVBQUUsU0FBaUI7O1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckQsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGNBQWMsbURBQUcsR0FBRyxDQUFDLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHFRQUFxUTtJQUM5UCxlQUFlLENBQUMsR0FBVztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsMkRBQTJEO0lBRTNEOzs7Ozs7O09BT0c7SUFDSyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsS0FBYSxFQUFFLFlBQWdDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZDLHVCQUF1QixDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGtDQUFzQixpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLHlUQUF5VCxDQUFDLENBQUM7UUFDdlosQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxPQUFPO1FBQ1gsQ0FBQztRQUNELDRPQUE0TztRQUM1TyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQzVFLHVCQUF1QixDQUFDLDhCQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLFlBQVksS0FBSyxvQ0FBb0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksc0JBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlOLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRywrQkFBbUIscUNBQXFDLEtBQUssU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksc0JBQVUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sa0RBQWtELENBQUMsQ0FBQztJQUNqUixDQUFDO0lBRUQseUxBQXlMO0lBQ2pMLGtCQUFrQjtRQUN0QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2xDLElBQUksUUFBUSxHQUFHLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxRQUFRLDREQUE0RCxJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUFZLENBQUMsV0FBVyxDQUFDO1FBQzFILENBQUM7UUFDRCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBbUIsQ0FBQztRQUNuRixJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLEdBQUcsUUFBUSxzQ0FBc0MsSUFBQSwrQkFBZ0IsRUFBQyxPQUFPLENBQUMsOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6TixDQUFDO1FBQ0QsT0FBTyxHQUFHLFFBQVEsc0NBQXNDLElBQUEsK0JBQWdCLEVBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxDQUFDLE1BQU0sUUFBUSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlGQUFpRixDQUFDO0lBQ3JVLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLDJCQUEyQixDQUFDLElBQVk7UUFDNUMsSUFBSSxPQUFPLEdBQUcsSUFBQSwrQkFBZ0IsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFBLHNDQUF1QixFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksUUFBUSxHQUFHLElBQUEsK0JBQWdCLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BDLElBQUksUUFBUSxJQUFJLE9BQU87WUFBRSxPQUFPO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLDJCQUFZLGFBQWEsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLFFBQVEsa0RBQWtELE9BQU8sd0NBQXdDLENBQUMsQ0FBQztJQUMxTSxDQUFDO0lBRUQsMlBBQTJQO0lBQ25QLHNCQUFzQixDQUFDLEdBQVcsRUFBRSxTQUFpQixFQUFFLEtBQWE7UUFDeEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsdUJBQXVCLENBQUMsNEJBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sZ0JBQWdCLFNBQVMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsc0NBQXNDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUMxUyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsc0NBQTBCLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsU0FBUyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSw0Q0FBNEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLDJGQUEyRixDQUFDLENBQUM7UUFDbGEsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RELHVCQUF1QixDQUFDLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLFlBQVksS0FBSywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxzQkFBVSxDQUFDLENBQUMsaUJBQWlCLFNBQVMsdUNBQXVDLENBQUMsQ0FBQztZQUNwUSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsK0JBQW1CLHFDQUFxQyxLQUFLLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksc0JBQVUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sa0RBQWtELENBQUMsQ0FBQztRQUNqUixDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVyxFQUFFLFNBQWlCO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzNDLElBQUksSUFBSSxHQUFHLElBQUEseUJBQWEsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsU0FBUyxDQUFBO1lBQUUsT0FBTztRQUM3QixJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsU0FBUyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN6SyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlQQUF5UDtJQUNqUCwyQkFBMkIsQ0FBQyxHQUFXLEVBQUUsU0FBaUIsRUFBRSxLQUFhO1FBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzNDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsU0FBUyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxjQUFjLEtBQUssZ0VBQWdFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksc0JBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hXLENBQUM7SUFDTCxDQUFDO0lBRUQsK2RBQStkO0lBQ3ZkLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBNkY7UUFDcEgsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsaU9BQWlPO1FBQ2pPLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDckksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxPQUFPO29CQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekYsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBRUQsb1BBQW9QO0lBQzVPLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxNQUFnQztRQUNqRixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFBLG1DQUF1QixFQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUNuRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEIsaUZBQWlGO1lBQ2pGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvQyxPQUFPO1FBQ1gsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFFRCxtTEFBbUw7SUFDM0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsTUFBMkM7UUFDNUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6SSxDQUFDO0lBRUQsNktBQTZLO0lBQ3JLLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxNQUFpQzs7UUFDbEYsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGNBQWMsbURBQUcsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixJQUFBLG1DQUF1QixFQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RDLGtFQUFrRTtZQUNsRSxJQUFJLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsT0FBTztRQUNoRSxDQUFDO1FBQ0QsbVNBQW1TO1FBQ25TLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQseVlBQXlZO0lBQ2xZLGtCQUFrQjtRQUNyQixtR0FBbUc7UUFDbkcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQixPQUFPLEdBQUcsR0FBRywrQkFBdUIsQ0FBQztJQUN6QyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBbUM7UUFDMUQsSUFBSSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFBRSxTQUFTO1lBQzlCLElBQUksQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxZQUFZLENBQUEsSUFBSSxDQUFDLElBQUEsK0JBQW1CLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQUUsU0FBUztZQUMxRixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsb05BQW9OO0lBQzVNLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxTQUFpQjs7UUFDckUsdVJBQXVSO1FBQ3ZSLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxjQUFjLG1EQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsSUFBSSxTQUFTLEdBQUcsR0FBRyxLQUFLLDJCQUFZLENBQUM7UUFDckMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEdBQTRHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hKLENBQUM7UUFDRCxnT0FBZ087UUFDaE8sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLGlGQUFpRjtZQUNqRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEgsQ0FBQztRQUNELElBQUksU0FBUztZQUFFLE9BQU87UUFDdEIsSUFBSSxLQUFLLEdBQUcsSUFBQSx1QkFBUSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUEsNEJBQWEsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUMzRCx3UEFBd1A7WUFDeFAsSUFBSSxJQUFzQixDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEcsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkksQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztnQkFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxtQkFBbUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFlBQVksTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hJLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCxnS0FBZ0s7SUFDeEosYUFBYTtRQUNqQixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCw2SkFBNko7SUFDckosS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWU7UUFDNUMsS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxHQUFHLElBQUEsMkJBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTztnQkFBRSxTQUFTO1lBQ3ZCLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQztDQUdKO0FBeDdCRCw4QkF3N0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEZpbmRDb25maWcsIEhvc3RlZENvbmZpZywgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSwgRlVMTF9WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBTVE9SQUdFX05PVF9DT05GSUdVUkVELFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgTG9nTWFwIH0gZnJvbSBcIi4uL0xvZ01hcFwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuXG5cbi8qKiBXaGF0IHdlIHN0b3JlIGFib3V0IGEgZmlsZS4gSXRzIHRpbWVzIGFyZSBub3QgaW4gaGVyZTogdGhlIGluZGV4IGtlZXBzIHRob3NlIGZvciBldmVyeSBrZXksIGRlbGV0ZWQgb25lcyBpbmNsdWRlZCAoc2VlIExvZ01hcCkuICovXG50eXBlIEluZGV4VmFsdWUgPSB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8vIFdoaWNoIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhOiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHNvdXJjZSdzIFVSTCBpbiB0aGUgc3RvcmUncyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QgKHNlZSBTb3VyY2VzTGlzdCkgLSBOT1QgYSBwb3NpdGlvbiBpbiB0aGUgaW4tbWVtb3J5IHNvdXJjZXMgYXJyYXksIHdoaWNoIGNoYW5nZXMgYmV0d2VlbiBydW5zXG4gICAgc291cmNlc0xpc3RJbmRleDogbnVtYmVyO1xufTtcblxuLyoqIE9uZSBmaWxlIHdlIGhvbGQsIGFzIGV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgaW5kZXggc2VlcyBpdC4gKi9cbmV4cG9ydCB0eXBlIEluZGV4RW50cnkgPSBJbmRleFZhbHVlICYge1xuICAgIHdyaXRlVGltZTogbnVtYmVyO1xuICAgIC8vIFdoZW4gV0UgbGFzdCBjaGFuZ2VkIHRoaXMgZW50cnkgKG5vdCB0aGUgZmlsZSdzIHdyaXRlIHRpbWUpIOKAlCB3aGF0IGdldENoYW5nZXNBZnRlcjIgZmlsdGVycyBvbiwgc28gbGF0ZS1hcnJpdmluZyBmaWxlcyB3aXRoIG9sZCB3cml0ZSB0aW1lcyBhcmUgc3RpbGwgcmVwb3J0ZWRcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbn07XG5cbi8vIE9uZSBzb3VyY2Ugb2YgYSBsaXZlIHNvdXJjZS1saXN0IHVwZGF0ZTsgc2VlIEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzXG5leHBvcnQgdHlwZSBCbG9iU291cmNlU3BlYyA9IHtcbiAgICAvLyBNYXRjaGVkIGFnYWluc3QgQXJjaGl2ZXNTb3VyY2UuaWRlbnRpdHkgKFwiZGlza1wiIGZvciB0aGUgYmFzZSBzbG90KTsgZXF1YWwgaWRlbnRpdGllcyBwYWlyIG9mZiBpbiBvcmRlclxuICAgIGlkZW50aXR5OiBzdHJpbmc7XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLnVybFxuICAgIHVybDogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2UuaW50ZXJtZWRpYXRlXG4gICAgaW50ZXJtZWRpYXRlPzogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS5zb3VyY2VDb25maWcgKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpXG4gICAgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnO1xuICAgIC8vIE9ubHkgY2FsbGVkIGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgbWF0Y2ggYW4gZXhpc3RpbmcgbGl2ZSBzbG90XG4gICAgY3JlYXRlOiAoKSA9PiBJQXJjaGl2ZXM7XG4gICAgLy8gVGhlIG9wcG9zaXRlIGNhc2U6IHRoZSBlbmRwb2ludCBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIG9ubHkgaXRzIGNvbmZpZyBjaGFuZ2VkLCBzbyB0aGUgUlVOTklORyBzb3VyY2UgaXMgaGFuZGVkIHRoZSBuZXcgb25lIChzZWUgYXBwbHlTb3VyY2VDb25maWcpXG4gICAgYXBwbHlDb25maWc/OiAoc291cmNlOiBJQXJjaGl2ZXMpID0+IHZvaWQ7XG59O1xuXG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG5cbi8vIFRoZSBidWNrZXQgc3RvcmUsIGFuZCB0aGUgb25seSBvbmU6IGV2ZXJ5IGJ1Y2tldCBhIHNlcnZlciBob2xkcyBpcyBzZXJ2ZWQgYnkgdGhlc2UsIG9uZSBwZXIgc3RvcmUgbmFtZSBpbiBpdHMgcm91dGluZyBjb25maWcuIEl0cyBzb3VyY2VzIGFyZSBwbGFpbiBJQXJjaGl2ZXMgLSB0aGUgZmlyc3QgaXMgYWx3YXlzIHRoZSBzdG9yZSdzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBjb25maWd1cmVkIHBlZXJzIChzZWUgY3JlYXRlU3RvcmVTb3VyY2UpIC0gc28gXCJubyBzeW5jaHJvbml6YXRpb25cIiBpcyBzaW1wbHkgYSBzdG9yZSB3aXRoIG5vIHBlZXJzLCBub3QgYSBkaWZmZXJlbnQga2luZCBvZiBzdG9yZS5cbmV4cG9ydCBjbGFzcyBCbG9iU3RvcmUge1xuICAgIC8vIOKUgOKUgCBzdGF0ZSDilIDilIBcbiAgICAvLyBTZXQgb25jZSB0aGUgc3RvcmUgaXMgc2h1dHRpbmcgZG93bjsgZXZlcnkgbG9vcCBpdCBvd25zIChhbmQgU3RvcmVTeW5jJ3MgbWFpbnRlbmFuY2UgbG9vcHMpIHN0b3BzIG9uIGl0XG4gICAgcHVibGljIHN0b3BwZWQgPSB7IHN0b3A6IGZhbHNlIH07XG4gICAgLy8gV2hldGhlciBpbml0IGhhcyByZWFjaGVkIHRoZSBwb2ludCB3aGVyZSBhIG5ld2x5IGFkZGVkIHNvdXJjZSBjYW4gc3RhcnQgc2Nhbm5pbmcgaW1tZWRpYXRlbHlcbiAgICBwdWJsaWMgc3luY1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAvKiogSXRzIHNvdXJjZXMsIGluIGNvbmZpZyBvcmRlcjogc2xvdCAwIGlzIGFsd2F5cyBpdHMgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIHBlZXJzIGl0IHN5bmNocm9uaXplcyB3aXRoLiBGaWxsZWQgYnkgdXBkYXRlU291cmNlcywgd2hpY2ggaXMgYWxzbyBob3cgdGhleSBjaGFuZ2UuIFRoZSBzdG9yZSBPV05TIHRoZW0gLSB3cml0ZXMgcGljayBhbW9uZyB0aGVtLCByZWFkcyByZXNvbHZlIGhvbGRlcnMgdGhyb3VnaCB0aGVtIC0gYW5kIFN0b3JlU3luYyBvbmx5IHNjYW5zIHdoYXRldmVyIGlzIGluIGhlcmUgYXQgdGhlIHRpbWUuICovXG4gICAgcHVibGljIHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10gPSBbXTtcbiAgICAvLyBVcGxvYWRzIGltbXV0YWJpbGl0eSBhbHJlYWR5IGRlY2lkZWQgYWdhaW5zdDogdGhlIGNsaWVudCBpcyBtaWQtc3RyZWFtIGJ5IHRoZSB0aW1lIHdlIGtub3csIHNvIGl0IGtlZXBzIHNlbmRpbmcgYW5kIGV2ZXJ5IHBhcnQgaXMgZHJvcHBlZFxuICAgIHByaXZhdGUgZGlzY2FyZGVkVXBsb2FkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgbmV4dERpc2NhcmRlZFVwbG9hZCA9IDE7XG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgaWRlbnRpdGllcyBiZWhpbmQgSW5kZXhFbnRyeS5zb3VyY2VzTGlzdEluZGV4IChzZWUgU291cmNlc0xpc3QpXG4gICAgcHJpdmF0ZSBzb3VyY2VzTGlzdDogU291cmNlc0xpc3Q7XG4gICAgLy8gUGVyIHNsb3Q6IHRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgdGhhdCBzbG90J3MgVVJMLCBmaWxsZWQgYnkgcmVnaXN0ZXJTbG90IGJlZm9yZSB0aGUgc2xvdCdzIHN5bmMgcnVuc1xuICAgIHByaXZhdGUgc2xvdFNvdXJjZXNMaXN0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHNsb3RSZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAvLyBFdmVyeSBmaWxlIHdlIGtub3cgb2YsIGluIG1lbW9yeSwgd2l0aCBhbiBhcHBlbmQtb25seSBsb2cgb2YgdGhlIGNoYW5nZXMgYmVoaW5kIGl0IChzZWUgTG9nTWFwKS4gQSBuZXcgZmlsZSBuYW1lIGVhY2ggdGltZSB0aGUgZW50cnkgZm9ybWF0IGNoYW5nZXMgZ2VuZXJhdGlvbjogdGhlIHByZXZpb3VzIG9uZXMgY2Fubm90IGJlIHJlYWQsIGFuZCBhIHNjYW4gcmVidWlsZHMgdGhlIGluZGV4IGFueXdheSwgc28gdGhleSBhcmUgc2ltcGx5IG5ldmVyIHJlYWQgYWdhaW4uXG4gICAgcHJpdmF0ZSBpbmRleDogTG9nTWFwPEluZGV4VmFsdWU+O1xuICAgIC8qKiBLZWVwaW5nIHRoZSBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlczogc2Nhbm5pbmcsIHB1bGxpbmcsIHB1c2hpbmcsIGFuZCB0aGUgbWFpbnRlbmFuY2UgdGhhdCBmb2xsb3dzIGZyb20gaG9sZGluZyBhbiBpbmRleCAoZGlzay1saW1pdCBldmljdGlvbiwgdG9tYnN0b25lIGV4cGlyeSkuIEl0IHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzdG9yZSdzIGluZGV4IGFuZCBzb3VyY2VzIC0gaXQgZG9lcyBub3Qgb3duIHRoZW0uICovXG4gICAgcHVibGljIHN5bmM6IFN0b3JlU3luYztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvLyBQdWJsaWMgZm9yIFN0b3JlU3luYywgd2hpY2ggbG9ncyBpdCB3aXRoIGV2ZXJ5dGhpbmcgaXQgZG9lc1xuICAgICAgICBwdWJsaWMgZm9sZGVyOiBzdHJpbmcsXG4gICAgICAgIC8qKiBUaGUgbmFtZSB0aGlzIHN0b3JlIGFuc3dlcnMgdG8gKHNlZSBDb21tb25Db25maWcubmFtZSkgLSB0aGUgZW50cmllcyBvZiB0aGUgcm91dGluZyBjb25maWcgdGhhdCBjYXJyeSBpdCBhcmUgdGhlIG9uZXMgdGhhdCBjb25maWd1cmUgaXQsIGFuZCB0aGUgcmVzdCBhcmUgaXRzIHBlZXJzLiAqL1xuICAgICAgICBwdWJsaWMgc3RvcmVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29uZmlnPzoge1xuICAgICAgICAgICAgLyoqIFdoZXRoZXIgYSBjb25maWcgZW50cnkgaXMgVEhJUyBTRVJWRVIgKHNhbWUgYWNjb3VudCwgc2FtZSBidWNrZXQsIG91ciBvd24gYWRkcmVzcykuIEluamVjdGVkIGJlY2F1c2UgYSBzdG9yZSBrbm93cyBub3RoaW5nIGFib3V0IHNlcnZlcnMgLSBpdCBvbmx5IG5lZWRzIHRvIHRlbGwgaXRzIG93biBlbnRyaWVzIGFwYXJ0IGZyb20gaXRzIHBlZXJzJy4gQWJzZW50IG1lYW5zIG5vdGhpbmcgaXMgdXMsIHdoaWNoIGlzIHdoYXQgYSBiYXJlIHN0b3JlIChubyBzZXJ2ZXIgYXJvdW5kIGl0KSB3YW50cy4gKi9cbiAgICAgICAgICAgIGlzU2VsZj86IChzb3VyY2U6IFNvdXJjZUNvbmZpZykgPT4gYm9vbGVhbjtcbiAgICAgICAgICAgIC8qKiBCdWlsZHMgb25lIG9mIGl0cyBzb3VyY2VzLiBJbmplY3RlZCBmb3IgdGhlIHNhbWUgcmVhc29uLCBhbmQgYmVjYXVzZSB0aGUgZGVsYXkgaXQgaXMgY3JlYXRlZCB3aXRoIGlzIHRoaXMgc3RvcmUncyBwb2xpY3kuICovXG4gICAgICAgICAgICBjcmVhdGVTb3VyY2U/OiAoY29uZmlnOiB7IHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZzsgd3JpdGVEZWxheTogbnVtYmVyIH0pID0+IElBcmNoaXZlcztcbiAgICAgICAgICAgIC8qKiBIYW5kcyBhIHJ1bm5pbmcgc291cmNlIGEgY2hhbmdlZCBjb25maWcsIHNvIGFuIGVuZHBvaW50IHdlIGFscmVhZHkgdGFsayB0byBpcyBuZXZlciByZWJ1aWx0IGp1c3QgYmVjYXVzZSBhIGZsYWcgbW92ZWQuICovXG4gICAgICAgICAgICBhcHBseVNvdXJjZT86IChzb3VyY2U6IElBcmNoaXZlcywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHdyaXRlRGVsYXk6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhIGtleSdzIGluZGV4IGVudHJ5IGNoYW5nZXMgKG91ciBvd24gd3JpdGVzIEFORCBmaWxlcyBwdWxsZWQgaW4gdmlhIHN5bmNocm9uaXphdGlvbikg4oCUIGhvdyB0aGUgc3RvcmFnZSBzZXJ2ZXIgbm90aWNlcyByb3V0aW5nIGNvbmZpZyB1cGRhdGVzLlxuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ/OiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhpcyBzdG9yZSBhcHBsaWVzIGEgcm91dGluZyBjb25maWcgdG8gaXRzZWxmIChzdGFydHVwLCBhbiBvcGVyYXRvcidzIHdyaXRlLCBhIHBlZXIncyBjb3B5IGFycml2aW5nKSAtIHRoZSBzdG9yZSBpcyB0aGUgb25lIHRoYXQga25vd3Mgd2hlbiBhIGNvbmZpZyBsYW5kZWQsIGFuZCB0aGUgc2VydmVyIGFybXMgd2luZG93LWJvdW5kYXJ5IHNjYW5zIGZyb20gaXQuICovXG4gICAgICAgICAgICBvblJvdXRpbmdBcHBsaWVkPzogKHJvdXRpbmc6IFJlbW90ZUNvbmZpZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBBc2tzIHRoZSBjbGllbnQgd2hvc2UgcmVxdWVzdCBjcmVhdGVkIHRoaXMgc3RvcmUgd2hhdCByb3V0aW5nIGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUuIE9ubHkgdXNlZCB3aGVuIGluaXQgZmluZHMgTk8gY29uZmlndXJhdGlvbiBpbiBvdXIgZm9sZGVyOiBhIHN0b3JlIG9ubHkgZXZlciBleGlzdHMgYmVjYXVzZSBhIGNvbmZpZyBuYW1lcyBpdCwgc28gdGhlIHJlcXVlc3RlciBoYXMgdGhhdCBjb25maWcgLSBhc2tpbmcgZm9yIGl0IGxhemlseSBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyBwYXNzaW5nIHRoZSBjb25maWcgb24gZXZlcnkgY2FsbCwgd2l0aG91dCB0aGUgcGVyLWNhbGwga2lsb2J5dGVzLiAqL1xuICAgICAgICAgICAgcmVxdWVzdFJvdXRpbmdDb25maWc/OiAoKSA9PiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD47XG4gICAgICAgICAgICAvLyBFdmVyeSBhY2NlcHRlZCB3cml0ZSAoXCJvcmlnaW5hbFwiKSBhbmQgZXZlcnkgd3JpdGUgdGhhdCBhY3R1YWxseSByZWFjaGVkIHRoZSBzb3VyY2VzIChcImZsdXNoZWRcIikuIEZhc3Qgd3JpdGVzIGNvYWxlc2NlLCBzbyB0aGUgdHdvIGNvdW50cyBkaWZmZXIuXG4gICAgICAgICAgICBvbldyaXRlQ291bnRlZD86IChraW5kOiBcIm9yaWdpbmFsXCIgfCBcImZsdXNoZWRcIiwgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJzb3VyY2VzTGlzdC50eHRcIikpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IExvZ01hcDxJbmRleFZhbHVlPihwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwiYmxvYkluZGV4My5sb2dcIikpO1xuICAgICAgICB0aGlzLnN5bmMgPSBuZXcgU3RvcmVTeW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gbmV3IFN0b3JlQ29uZmlnKHN0b3JlTmFtZSwgW10pO1xuICAgICAgICB0aGlzLm93bkRpc2sgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgc3RvcmUncyBmb2xkZXIsIHVud3JhcHBlZDogdGhlIHNhbWUgYnl0ZXMgc2xvdCAwIHNlcnZlcywgYnV0IHJlYWNoZWQgd2l0aG91dCBpdHMgd3JpdGUgZGVsYXkuIFVzZWQgZm9yIHRoZSB0d28gdGhpbmdzIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBidWZmZXJlZCBzb3VyY2UgLSByZWFkaW5nIG91ciBvd24gcm91dGluZyBjb25maWcgYmVmb3JlIHdlIGhhdmUgYW55IHNvdXJjZXMsIGFuZCBzdHJlYW1pbmcgYSBsYXJnZSB1cGxvYWQgdGhhdCBtdXN0IG5vdCBzaXQgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgb3duRGlzazogQXJjaGl2ZXNEaXNrO1xuXG4gICAgLyoqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlLiBJdCBvd25zIHRoaXM6IHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIGZpbGUgSU4gdGhlIHN0b3JlLCBzbyB0aGUgc3RvcmUgcmVhZHMgaXQsIGFwcGxpZXMgaXQgdG8gaXRzZWxmLCBhbmQgcmUtYXBwbGllcyBpdCB3aGVuZXZlciB0aGUgZmlsZSBjaGFuZ2VzIC0gYnkgb3VyIG93biB3cml0ZSwgb3IgYnkgYSBwZWVyJ3MgY29weSBhcnJpdmluZyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgc3RvcmVDb25maWc6IFN0b3JlQ29uZmlnO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGxhc3QgYXBwbGllZCwgc28gYSB3cml0ZSBvZiBhbiBpZGVudGljYWwgKG9yIG9sZGVyKSBvbmUgaXMgbm90IHJlLWFwcGxpZWRcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IC0xO1xuICAgIC8vIC4uLmFuZCB0aGUgY29uZmlnIGl0c2VsZiwgc28gYSByZWplY3Rpb24gY2FuIHNheSBleGFjdGx5IHdoYXQgdGhlIHN0b3JlIElTIHJ1bm5pbmcgaW5zdGVhZCBvZiBndWVzc2luZ1xuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vICNyZWdpb24gTWFpbiBpbnRlcmZhY2VcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIENvbmZpZ3VyZSBmaXJzdDogdGhlIGNvbmZpZyBkZWNpZGVzIHdoYXQgdGhlIHNvdXJjZXMgQVJFLCBhbmQgZXZlcnl0aGluZyBiZWxvdyBpcyBwZXIgc291cmNlLiBXaXRoIG5vIGNvbmZpZyBhdCBhbGwgdGhhdCBpcyBqdXN0IG91ciBvd24gZGlzaywgd2hpY2ggaXMgZW5vdWdoIHRvIHNlcnZlIGFuZCB0byBiZSB3cml0dGVuIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAvLyBObyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXIgYXQgYWxsIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRoaXMgc3RvcmUgd2FzIGp1c3QgQ1JFQVRFRCBieSBhIHJlcXVlc3QsIGJlZm9yZSBhbnkgY29uZmlnIHdyaXRlIHJlYWNoZWQgaXQuIFRoZSByZXF1ZXN0ZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUsIHNvIGFzayBpdC5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCAmJiB0aGlzLmNvbmZpZz8ucmVxdWVzdFJvdXRpbmdDb25maWcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3ZpZGVkID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb247IHRoZSByZXF1ZXN0aW5nIGNsaWVudCBwcm92aWRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihwcm92aWRlZCl9IC0gYWRvcHRpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyYWlnaHQgb250byB0aGUgZGlzaywgbm90IHRocm91Z2ggc2V0KCk6IHNldCB3YWl0cyBmb3IgaW5pdCwgd2hpY2ggaXMgd2hhdCBpcyBydW5uaW5nIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHByb3ZpZGVkKSksIHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFza2luZyB0aGUgcmVxdWVzdGluZyBjbGllbnQgZm9yIHRoZSByb3V0aW5nIGNvbmZpZyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIC0gcnVubmluZyB1bmNvbmZpZ3VyZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJTbG90KGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFmdGVyIHRoZSBzbG90cywgd2hpY2ggaXMgd2hhdCBpbmRleCBlbnRyaWVzIG5hbWUgYXMgdGhlaXIgaG9sZGVyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEluZGV4KCk7XG4gICAgICAgIHRoaXMuc3luY1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlLXJlYWRzIHRoZSByb3V0aW5nIGNvbmZpZyBvdXQgb2YgdGhpcyBzdG9yZSBhbmQgYXBwbGllcyBpdCB0byBpdHNlbGYuIENhbGxlZCBhdCBzdGFydHVwIGFuZFxuICAgICAqIHdoZW5ldmVyIHRoYXQgZmlsZSBjaGFuZ2VzIGhlcmUgLSB3aGljaCBpcyB0aGUgT05FIG1lY2hhbmlzbTogYSBjb25maWcgd3JpdHRlbiBieSBhbiBvcGVyYXRvclxuICAgICAqIGFuZCBhIGNvbmZpZyBwdWxsZWQgb2ZmIGEgcGVlciBhcmUgdGhlIHNhbWUgZXZlbnQsIGEgd3JpdGUgb2YgdGhhdCBwYXRoIGludG8gdGhpcyBzdG9yZS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgd2l0aCBubyByb3V0aW5nIGNvbmZpZyBjb25maWd1cmVzIGl0c2VsZiBhcyBpdHMgb3duIGRpc2ssIHZhbGlkIGFsd2F5cywgZm9yIHRoZSB3aG9sZVxuICAgICAqIGtleSBzcGFjZS4gVGhhdCBpcyBhIGNvbXBsZXRlLCB3b3JraW5nIHN0b3JlIC0gaXQganVzdCBoYXMgbm9ib2R5IHRvIHN5bmNocm9uaXplIHdpdGggLSBhbmQgaXRcbiAgICAgKiBpcyB3aGF0IGxldHMgYSBzdG9yZSBleGlzdCBiZWZvcmUgaXQgaGFzIGV2ZXIgaGVhcmQgb2YgYSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhcHBseVJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByb3V0aW5nID0gYXdhaXQgdGhpcy5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICBsZXQgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcbiAgICAgICAgbGV0IHBlZXJzOiBTb3VyY2VDb25maWdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygcm91dGluZz8uc291cmNlcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5uYW1lID09PSB0aGlzLnN0b3JlTmFtZSAmJiB0aGlzLmNvbmZpZz8uaXNTZWxmPy4oc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChzb3VyY2UgYXMgSG9zdGVkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlZXJzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGluZyAmJiAhZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIHJvdXRpbmcgY29uZmlnIGluIHN0b3JlICR7dGhpcy5mb2xkZXJ9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0pIGRvZXMgbm90IG5hbWUgdGhpcyBzdG9yZSAoJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9KSBhcyBvbmUgb2Ygb3Vycywgc28gaXQgc3RheXMgYSBkaXNrLW9ubHkgc3RvcmVgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJldmlvdXNWZXJzaW9uID0gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgICAgIGxldCBuZXdWZXJzaW9uID0gcm91dGluZyAmJiBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpIHx8IC0xO1xuICAgICAgICBpZiAobmV3VmVyc2lvbiAhPT0gcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGFkb3B0ZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke3ByZXZpb3VzVmVyc2lvbn0gLT4gJHtuZXdWZXJzaW9ufTogJHtlbnRyaWVzLmxlbmd0aH0gZW50ciR7ZW50cmllcy5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gb2Ygb3VycyAke0pTT04uc3RyaW5naWZ5KGVudHJpZXMubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0sICR7cGVlcnMubGVuZ3RofSBwZWVyKHMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZy51cGRhdGUoZW50cmllcyk7XG4gICAgICAgIHRoaXMudXBkYXRlU291cmNlcyh0aGlzLnBsYW5Tb3VyY2VzKHBlZXJzKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgICAgdGhpcy5hcHBsaWVkUm91dGluZyA9IHJvdXRpbmc7XG4gICAgICAgIGlmIChyb3V0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZz8ub25Sb3V0aW5nQXBwbGllZD8uKHJvdXRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGFzIHRoaXMgc3RvcmUgaG9sZHMgaXQsIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBmb2xkZXI6IHRoZSBzdG9yZSBtYXkgYmUgY29uZmlndXJpbmcgaXRzZWxmIGJlZm9yZSBpdCBoYXMgc2Nhbm5lZCBhbnl0aGluZywgYW5kIHRoaXMgZmlsZSBpcyB3aGF0IGRlY2lkZXMgd2hhdCBhIHNjYW4gd291bGQgZXZlbiB0YWxrIHRvXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMub3duRGlzay5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBJZ25vcmluZyB0aGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0IGNvdWxkIG5vdCBiZSBwYXJzZWQgKCR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBpcyBydW5uaW5nLCBzbyBhIGNvcHkgZm91bmQgb24gYSBwZWVyIGlzIG9ubHkgdGFrZW4gd2hlbiBpdCBpcyBnZW51aW5lbHkgbmV3ZXIuIC0xIG1lYW5zIGl0IGhhcyBub25lLiAqL1xuICAgIHB1YmxpYyByb3V0aW5nVmVyc2lvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWVkUm91dGluZ1ZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gQXBwbHlpbmcgaXQgdG91Y2hlcyB0aGUgc291cmNlcywgc28gaXQgaXMgc2VyaWFsaXplZCBiZWhpbmQgd2hhdGV2ZXIgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nIHJhdGhlciB0aGFuIGludGVybGVhdmluZyB3aXRoIGl0XG4gICAgcHJpdmF0ZSByb3V0aW5nQXBwbGllczogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHB1YmxpYyByZWFwcGx5Um91dGluZ0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJvdXRpbmdBcHBsaWVzLnRoZW4oKCkgPT4gdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKSk7XG4gICAgICAgIHRoaXMucm91dGluZ0FwcGxpZXMgPSBuZXh0LmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgIHZvaWQgbmV4dC5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIGRpc2sgZmlyc3QgKGFsd2F5cyksIHRoZW4gZXZlcnkgcGVlciB3aG9zZSByb3V0ZSBvdmVybGFwcyBvdXJzIC0gdGhlIHNvdXJjZXMgdGhpcyBzdG9yZSBzeW5jaHJvbml6ZXMgd2l0aCwgYXMgaXRzIG93biBjb25maWcgZGVzY3JpYmVzIHRoZW1cbiAgICBwcml2YXRlIHBsYW5Tb3VyY2VzKHBlZXJzOiBTb3VyY2VDb25maWdbXSk6IEJsb2JTb3VyY2VTcGVjW10ge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpO1xuICAgICAgICBsZXQgbWFrZVNwZWMgPSAoc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdLCByb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgbm9GdWxsU3luYzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IEJsb2JTb3VyY2VTcGVjID0+IHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gc291cmNlV3JpdGVEZWxheSh7IHNvdXJjZUNvbmZpZywgZmFzdDogc2VsZi5mYXN0LCB3cml0ZURlbGF5OiBzZWxmLndyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlUGVyc2lzdGVudFVybChzb3VyY2VDb25maWcsIHRoaXMuZm9sZGVyKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZWQgPSB0aGlzLmNvbmZpZz8uY3JlYXRlU291cmNlPy4oeyBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGhhcyBubyB3YXkgdG8gYnVpbGQgc291cmNlcywgc28gaXQgY2Fubm90IHVzZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZz8udXJsIHx8IHRoaXMuZm9sZGVyKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUGFzcyBjcmVhdGVTb3VyY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBseUNvbmZpZzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB0aGlzLmNvbmZpZz8uYXBwbHlTb3VyY2U/Lihzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgYWNjZXB0cyB3cml0ZXMgd2hpbGUgQU5ZIHdpbmRvdyB0aGlzIHN0b3JlIGhvbGRzIGlzIG9wZW47IHdpdGggbm8gY29uZmlnIGF0IGFsbCBpdCBpcyBzaW1wbHkgYWx3YXlzIHZhbGlkXG4gICAgICAgIGxldCBvd25XaW5kb3dzID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KTtcbiAgICAgICAgbGV0IHNwZWNzOiBCbG9iU291cmNlU3BlY1tdID0gW21ha2VTcGVjKHVuZGVmaW5lZCwgb3duV2luZG93cy5sZW5ndGggJiYgb3duV2luZG93cyB8fCBbRlVMTF9WQUxJRF9XSU5ET1ddLCB1bmRlZmluZWQsIHVuZGVmaW5lZCldO1xuICAgICAgICAvLyBPbmUgc3BlYyBwZXIgZW5kcG9pbnQsIGNhcnJ5aW5nIGFsbCBvZiBpdHMgd2luZG93czogYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGFyb3VuZCBhbiBpbnRlcm1lZGlhdGUsIGFuZCB0aGF0IGlzIHN0aWxsIG9uZSBzb3VyY2UgdG8gdXNcbiAgICAgICAgbGV0IGJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgQmxvYlNvdXJjZVNwZWM+KCk7XG4gICAgICAgIGZvciAobGV0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgICAgICAgIGxldCBzaGFyZWQgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmLnJvdXRlLCBwZWVyLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IHNvdXJjZUlkZW50aXR5KHBlZXIpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlJZGVudGl0eS5nZXQoaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRXaW5kb3dzLnB1c2gocGVlci52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlYyA9IG1ha2VTcGVjKHBlZXIsIFtwZWVyLnZhbGlkV2luZG93XSwgc2hhcmVkLCBwZWVyLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jKTtcbiAgICAgICAgICAgIGJ5SWRlbnRpdHkuc2V0KGlkZW50aXR5LCBzcGVjKTtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwZWNzO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIE9ubHkgdXNlZCB3aGVuIHRoZSBzdG9yZSBnZW51aW5lbHkgY2Fubm90IGNvbnRpbnVlIChpdHMgcm91dGUgb3IgZGlzayBsaW1pdCBjaGFuZ2VkLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RvcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoRGVsYXllZFdyaXRlcyh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5mbHVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbnRlcm5hbD86IGJvb2xlYW47IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEludGVybmFsMihjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIGxldCByYW5nZSA9IGNvbmZpZy5yYW5nZTtcbiAgICAgICAgLy8gTm90IGluIHRoZSBpbmRleCBtZWFucyBpdCBkb2VzIG5vdCBleGlzdCBoZXJlOiB0aGUgaW5kZXggSVMgdGhlIGFuc3dlciwgYW5kIHNjYW5uaW5nIGhlYWxzIGl0IG9uIGl0cyBvd24gc2NoZWR1bGUuIEFuIGVudHJ5IHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBsaXN0IGlzIHN0aWxsIHZhbGlkIC0gZ2V0RW50cnlIb2xkZXIgcmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBVUkwgZGlyZWN0bHksIGFuZCBnZXQyJ3MgZmFsbGJhY2sgbG9vcCBjb3ZlcnMgYSBob2xkZXIgdGhhdCBpcyBnb25lIGVudGlyZWx5LlxuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBBIGRlbGV0aW9uIGhhcyBubyBieXRlcyAtIHRoZSB0b21ic3RvbmUgSVMgdGhlIGFuc3dlciwgc28gYSBmbGFnLWNhbGxlciBnZXRzIGl0cyB0aW1lIHdpdGggZW1wdHkgZGF0YVxuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpO1xuICAgICAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jLm5vdGVBY2Nlc3Moa2V5KTtcbiAgICAgICAgbGV0IGhvbGRlckFyY2hpdmVzID0gYXdhaXQgdGhpcy5nZXRFbnRyeUhvbGRlcihlbnRyeSk7XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob2xkZXJFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChob2xkZXJBcmNoaXZlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBpbmNsdWRlVG9tYnN0b25lczogdGhlIGhvbGRlciBhbnN3ZXJpbmcgXCJkZWxldGVkXCIgKGEgdG9tYnN0b25lLCB3aXRoIGl0cyB3cml0ZSB0aW1lKSBtdXN0IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIFwiSSBsb3N0IHRoZSBmaWxlXCIgLSB0aGUgZm9ybWVyIGlzIGF1dGhvcml0YXRpdmUgYW5kIG11c3QgTk9UIGZhbGwgYmFjayB0byBvbGRlciBjb3BpZXMsIHdoaWNoIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRpb24gZm9yIHRoaXMgcmVhZFxuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCBob2xkZXJBcmNoaXZlcy5nZXQyKGtleSwgeyByYW5nZSwgaW50ZXJuYWw6IHRydWUsIGluY2x1ZGVUb21ic3RvbmVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgIWFuc3dlci5kYXRhLmxlbmd0aCAmJiAhKHJhbmdlICYmIGFuc3dlci5zaXplKSAmJiBhbnN3ZXIud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBhIHJhbmdlZCByZWFkIG9mIGEgcmVhbCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgKHJhbmdlIHBhc3QgRU9GKSwgc28gb25seSB1bnJhbmdlZCBlbXB0aW5lc3MgbWVhbnMgdG9tYnN0b25lL2Fic2VudFxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgKGFuc3dlci5kYXRhLmxlbmd0aCB8fCByYW5nZSAmJiBhbnN3ZXIuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geyBkYXRhOiBhbnN3ZXIuZGF0YSwgd3JpdGVUaW1lOiBhbnN3ZXIud3JpdGVUaW1lLCBzaXplOiBhbnN3ZXIuc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBob2xkZXJFcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gUmFuZ2VkIHJlYWRzIGNhbid0IHBvcHVsYXRlIGEgY2FjaGUgKHRoZXkncmUgcGFydGlhbClcbiAgICAgICAgICAgIGlmICh0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpICE9PSAwICYmICFyYW5nZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIC0gZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgc291cmNlJ3MgY29weSB3b3VsZCBzeW5jaHJvbml6ZSBpdCBiZXR3ZWVuIG5vZGVzIHRocm91Z2ggdGhlIHJlYWQgcGF0aCwgd2hpY2ggaXQgbmV2ZXIgaXNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICBpZiAoaG9sZGVyRXJyb3IpIHRocm93IGhvbGRlckVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaG9sZGVyIGlzIGRvd24gb3IgbG9zdCB0aGUgZmlsZS4gQU5ZIG90aGVyIHNvdXJjZSdzIGNvcHkgYmVhdHMgbm8gdmFsdWUgLSBldmVuIGFuIE9MREVSIG9uZSAtIGFuZCBpdCdzIGNvcGllZCBvbnRvIG91ciBkaXNrIHNvIHRoZSBuZXh0IHJlYWQgZG9lc24ndCBkZXBlbmQgb24gbHVjay5cbiAgICAgICAgbGV0IGhvbGRlclNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGhvbGRlclNsb3QgfHwgIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmYWxsYmFjazogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGFuc3dlciA9IGF3YWl0IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0MihrZXksIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBjb3VudHMgYXMgYWJzZW50IC0gYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh0aGlzIHJlYWQgaXMgdW5yYW5nZWQsIHNvIGVtcHRpbmVzcyBpcyB1bmFtYmlndW91cylcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIGFuc3dlci5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFsbGJhY2spIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGUuIEZvcmdvdHRlbiByYXRoZXIgdGhhbiBkZWxldGVkIC0gbm90aGluZyBoYXBwZW5lZCB0byB0aGlzIGZpbGUsIHdlIHdlcmUgc2ltcGx5IHdyb25nIGFib3V0IGhvbGRpbmcgaXQsIGFuZCBzYXlpbmcgb3RoZXJ3aXNlIHdvdWxkIHB1c2ggYSBkZWxldGlvbiBvdXQgdG8gZXZlcnlvbmUgZWxzZS5cbiAgICAgICAgdGhpcy5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHBhdGg6IGtleSwgZGF0YSB9ID0gY29uZmlnO1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWcubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93cy9yb3V0ZXMsIHNvIHRoZXkgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gaXQgKGFuZCBpdCBuZXZlciBmbG93cyB0aHJvdWdoIHZhbGlkYXRpb24pIC0gYnV0IGl0IGhhcyBhIHJ1bGUgb2YgaXRzIG93biwgd2hpY2ggaXMgb3VycyB0byBlbmZvcmNlIGJlY2F1c2UgdGhlIGZpbGUgaXMgb3Vyc1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRXcml0ZVRhcmdldChrZXksIHJvdXRlLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGY/LmltbXV0YWJsZSAmJiBhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRNdXRhYmxlKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgZXhlbXB0IGZvciB0aGUgc2FtZSByZWFzb24gaXQgc2tpcHMgZXZlcnkgb3RoZXIgY2hlY2s6IGl0IGlzIHRoZSBmaWxlIHRoYXQgREVGSU5FUyBvdXIgd2luZG93cyBhbmQgcm91dGVzLCBzbyBqdWRnaW5nIGl0IGJ5IHRoZSBjb25maWcgaXQgaXMgYWJvdXQgdG8gcmVwbGFjZSBpcyBob3cgYSBzdG9yZSBnZXRzIHN0dWNrIG9uIGEgY29uZmlnIGl0IGNhbiBuZXZlciBiZSB0b2xkIHRvIGxlYXZlXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SW50ZXJuYWwoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldE9yRGVsZXRlKGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbChjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICAvLyBBIGRlbGV0aW9uIGxhbmRzIGluIGV4YWN0bHkgdGhlIHNhbWUgcGxhY2UgYSB3cml0ZSB3b3VsZCwgc28gaXQgaXMganVkZ2VkIHRoZSBzYW1lIHdheTogb25lIGFpbWVkIGF0IGEgc2hhcmQgd2UgZG9uJ3Qgc2VydmUgaXMganVzdCBhcyBpbnZpc2libGUgYXMgYSB3cml0ZSB0byBpdFxuICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgZ2V0Um91dGUoa2V5KSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZGVsZXRpb25zIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCBkZWxldGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgZ2V0Um91dGUoa2V5KSk7XG4gICAgICAgICAgICAvLyBzZXRJbnRlcm5hbCB0cmVhdHMgYW4gZW1wdHkgYnVmZmVyIGFzIGV4YWN0bHkgYSBkZWxldGlvbjogZGlzayByZW1vdmFsIHBsdXMgYSB0b21ic3RvbmUgaW5kZXggZW50cnksIG5vIGZhbi1vdXRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SW50ZXJuYWwoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZXMgYXJlIHdyaXRlcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSB0b21ic3RvbmUgaXMgb3JkZXJlZCBieSB3cml0ZSB0aW1lIGxpa2UgYW55IG90aGVyIHdyaXRlLCBwcm9wYWdhdGVzIHRocm91Z2ggc3luY2hyb25pemF0aW9uLCBhbmQgaXMgZXZlbnR1YWxseSBleHBpcmVkXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgIH1cblxuICAgIC8qKiBBIG5vZGUtc2lkZSBtb3ZlOiB0aGUgYnl0ZXMgbmV2ZXIgdHJhdmVsIHRocm91Z2ggdGhlIGNsaWVudC4gRGVsaWJlcmF0ZWx5IGp1c3QgZ2V0MiArIHNldCArIGRlbCByYXRoZXIgdGhhbiBhIGRpc2sgcmVuYW1lLCBzbyB0aGUgZGVzdGluYXRpb24gd3JpdGUgcGFzc2VzIEVWRVJZIHJ1bGUgYSBzZXQgcGFzc2VzICh3aW5kb3dzLCByb3V0ZXMsIGltbXV0YWJpbGl0eSwgb25seS10YWtlLWxhdGVzdCwgaW5kZXgsIGZhbi1vdXQgdG8gcGVlcnMpIGFuZCB0aGUgZGVsZXRpb24gcHJvcGFnYXRlcyBhcyBhIG5vcm1hbCB0b21ic3RvbmUgLSBhIHJlbmFtZSB3b3VsZCBieXBhc3MgYWxsIG9mIGl0LiBUaGUgc2V0IHN0YW1wcyBmcmVzaCwgc28gdGhlIG1vdmVkIGZpbGUgYmVhdHMgYW55IHRvbWJzdG9uZSBhdCBpdHMgbmV3IHBhdGguICovXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiB7IGZyb21QYXRoOiBzdHJpbmc7IHRvUGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IGNvbmZpZy50b1BhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gUk9VVElOR19GSUxFIHx8IGNvbmZpZy50b1BhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgbW92ZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIHNvdXJjZSBmaWxlIGRvZXMgbm90IGV4aXN0IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldCh7IHBhdGg6IGNvbmZpZy50b1BhdGgsIGRhdGE6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbCh7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhjb25maWc6IHsgcGF0aDogc3RyaW5nOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgLy8gTm90IGluIHRoZSBpbmRleCBtZWFucyBpdCBkb2VzIG5vdCBleGlzdCBoZXJlOiB0aGUgaW5kZXggSVMgdGhlIGFuc3dlciwgYW5kIHNjYW5uaW5nIGhlYWxzIGl0IG9uIGl0cyBvd24gc2NoZWR1bGUuIEFuIGVudHJ5IHdob3NlIGhvbGRlciBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBsaXN0IGlzIHN0aWxsIHZhbGlkIC0gZ2V0RW50cnlIb2xkZXIgcmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBVUkwgZGlyZWN0bHksIGFuZCBnZXQyJ3MgZmFsbGJhY2sgbG9vcCBjb3ZlcnMgYSBob2xkZXIgdGhhdCBpcyBnb25lIGVudGlyZWx5LlxuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSByZXR1cm4geyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9O1xuICAgICAgICBpZiAoIWNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWRlbGV0ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8oY29uZmlnOiBGaW5kQ29uZmlnICYgeyBwcmVmaXg6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLndhaXRGb3JSZXF1aXJlZFNjYW5zKCk7XG4gICAgICAgIGxldCBwcmVmaXggPSBjb25maWcucHJlZml4O1xuICAgICAgICBsZXQgaW5mb3MgPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICAvLyBEZWxldGlvbnMgYXJlIG5vdCBpbiBoZXJlIGF0IGFsbCwgd2hpY2ggaXMgd2hhdCBhIGxpc3Rpbmcgd2FudHM6IGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGVcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKSwgcHJlZml4LCB7IHNoYWxsb3c6IGNvbmZpZy5zaGFsbG93LCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gQWxsIGZpbGVzIGNoYW5nZWQgYWZ0ZXIgY29uZmlnLnRpbWUg4oCUIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LiBGaWx0ZXJzIG9uIHdoZW4gV0UgbGVhcm5lZCBvZiB0aGUgY2hhbmdlIChjaGFuZ2VkQXQpLCBzbyBmaWxlcyBzeW5jaHJvbml6ZWQgbGF0ZSAod2l0aCBvbGQgd3JpdGUgdGltZXMpIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIGVudHJpZXM6IGEgY2FsbGVyIHJlYWRpbmcgYSBjaGFuZ2UgZmVlZCBoYXMgdG8gaGVhciBhYm91dCB0aGVtLCBhbmQgc2l6ZSAwIGlzIGhvdyB0aGUgZmVlZCBzYXlzIFwiZ29uZVwiIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gY29uZmlnLnJvdXRlcyBsZXRzIGEgc3RvcmUgc3luY2luZyBhIHBhcnRpYWwgc2hhcmQgYXNrIGZvciBqdXN0IGl0cyBzbGljZS5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgaW5Sb3V0ZXMgPSAoa2V5OiBzdHJpbmcpID0+ICFjb25maWcucm91dGVzIHx8IGNvbmZpZy5yb3V0ZXMuc29tZShyb3V0ZSA9PiByb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRvbWJzdG9uZS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUsIHNpemU6IDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbmRleCdzIHRvdGFscyBwbHVzIGFueSBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgZ2V0U3luY1Byb2dyZXNzKCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLm5hbWVkSW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCwgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50IH0sXG4gICAgICAgICAgICBzb3VyY2VzOiB0b3RhbHMuc291cmNlcyxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogdGhpcy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBzeW5jaW5nOiB0aGlzLnN5bmMuZ2V0QWN0aXZpdGllcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBnZXRTeW5jUHJvZ3Jlc3MncyB0b3RhbHMsIGJ1dCBsb2FkaW5nIHRoZSBpbmRleCBmaXJzdCwgc28gdGhleSBhcmUgbmV2ZXIgdGhlIHplcm9lcyBvZiBhIHN0b3JlIG5vdGhpbmcgaGFzIHRvdWNoZWQgeWV0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBjb21wdXRlSW5kZXhUb3RhbHMoKTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVDb3VudDogbnVtYmVyO1xuICAgICAgICBieXRlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICB9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYW1lZEluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5pbmRleFRvdGFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMuZmlsZUNvdW50LFxuICAgICAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgLm1hcCgoeCwgaSkgPT4gKHsgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgLi4udG90YWxzLnNsb3RzW2ldIH0pKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RvcmUncyBzb3VyY2VzLCBhcyB0aGUgY3VycmVudCByb3V0aW5nIGNvbmZpZyBzYXlzIHRoZXkgc2hvdWxkIGJlLiBUaGlzIGlzIHRoZSBPTkxZIHdheVxuICAgICAqIHRoZXkgYXJlIGV2ZXIgc2V0OiB0aGUgZmlyc3QgY2FsbCBwb3B1bGF0ZXMgYW4gZW1wdHkgc3RvcmUsIGV2ZXJ5IGxhdGVyIG9uZSBhcHBsaWVzIGEgY2hhbmdlIHRvXG4gICAgICogdGhlIHJ1bm5pbmcgb25lLiBXaW5kb3dzLCByb3V0ZXMgYW5kIGZsYWdzIG1vdmUgaW4gcGxhY2UsIGdlbnVpbmVseSBuZXcgZW5kcG9pbnRzIGFyZSBhZGRlZCBhbmRcbiAgICAgKiBzdGFydCBzY2FubmluZywgYW5kIGVuZHBvaW50cyB0aGF0IGFyZSBnb25lIGdvIGRlYWQgKHRoZWlyIHNjYW5zIHN0b3AsIHRoZWlyIGluZGV4IGVudHJpZXNcbiAgICAgKiBkcm9wKS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgaXMgbmV2ZXIgcmVidWlsdCBmb3IgYSBjb25maWcgY2hhbmdlLiBJdHMgbmFtZSBkZWNpZGVzIGl0cyBmb2xkZXIgYW5kIGl0cyBpZGVudGl0eSwgYW5kXG4gICAgICogYSBjb25maWcgY2hhbmdlIGNhbm5vdCBjaGFuZ2UgZWl0aGVyIC0gc28gdGhlcmUgaXMgbm90aGluZyBhIGNoYW5nZSBjYW4gZG8gdG8gYSBzdG9yZSBleGNlcHRcbiAgICAgKiB0aGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTb3VyY2VzKHNwZWNzOiBCbG9iU291cmNlU3BlY1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghc3BlY3MubGVuZ3RoIHx8IHNwZWNzWzBdLmlkZW50aXR5ICE9PSBcImRpc2tcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVTb3VyY2VzIGV4cGVjdHMgdGhlIGRpc2sgc291cmNlIGZpcnN0IChpZGVudGl0eSBcImRpc2tcIiksIGdvdCAke0pTT04uc3RyaW5naWZ5KHNwZWNzLm1hcCh4ID0+IHguaWRlbnRpdHkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbDogdGhlIGRpc2sgc2xvdCBoYXMgdG8gZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBtYXRjaGVkIGFnYWluc3QgaXRcbiAgICAgICAgICAgIGxldCBkaXNrID0gc3BlY3NbMF07XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZGlzay5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IGRpc2sudXJsLCB2YWxpZFdpbmRvd3M6IGRpc2sudmFsaWRXaW5kb3dzLCByb3V0ZTogZGlzay5yb3V0ZSwgbm9GdWxsU3luYzogZGlzay5ub0Z1bGxTeW5jLCBzb3VyY2VDb25maWc6IGRpc2suc291cmNlQ29uZmlnLCBpZGVudGl0eTogZGlzay5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNldFdpbmRvd3MgPSAoaTogbnVtYmVyLCB3aW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pID0+IHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzO1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZCkgPT09IEpTT04uc3RyaW5naWZ5KHdpbmRvd3MpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93cyBjaGFuZ2VkIGZvciAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkob2xkKX0gLT4gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3dzKX1gKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MgPSB3aW5kb3dzO1xuICAgICAgICB9O1xuICAgICAgICBzZXRXaW5kb3dzKDAsIHNwZWNzWzBdLnZhbGlkV2luZG93cyk7XG4gICAgICAgIC8vIExpdmUgc2xvdHMgcGFpciB3aXRoIHNwZWNzIGJ5IGlkZW50aXR5LiBFYWNoIGVuZHBvaW50IGlzIG5vdyBPTkUgc3BlYyBjYXJyeWluZyBhbGwgaXRzIHdpbmRvd3MsIHNvIHRoaXMgaXMgYSAxOjEgcGFpcmluZzsgYW55IGxlZnRvdmVyIGR1cGxpY2F0ZSBzbG90cyBmcm9tIGJlZm9yZSAoYW4gZW5kcG9pbnQgdGhhdCB1c2VkIHRvIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBzbG90cykgZ28gdW5tYXRjaGVkIGJlbG93IGFuZCBhcmUgY29sbGFwc2VkIGF3YXkuXG4gICAgICAgIGxldCBsaXZlQnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICAgICAgbGV0IG9yaWdpbmFsTGVuZ3RoID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZCA9IHRoaXMuc291cmNlc1tpXS5pZGVudGl0eTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBsaXZlQnlJZGVudGl0eS5zZXQoaWQsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KHNwZWMuaWRlbnRpdHkpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBTQU1FIGVuZHBvaW50IChzZWUgc291cmNlSWRlbnRpdHkpLCBzbyB3ZSBhcmUgYWxyZWFkeSBzeW5jaHJvbml6ZWQgd2l0aCBpdDogdGhlIHNsb3Qga2VlcHMgaXRzIGNvbm5lY3Rpb24sIGl0cyBjb21wbGV0ZWQgc2NhbnMsIGFuZCBpdHMgaW5kZXggZW50cmllcywgYW5kIG9ubHkgdGhlIHBvbGljeSBvbiBpdCBtb3Zlcy4gUmVjcmVhdGluZyBpdCBoZXJlIHdvdWxkIG1lYW4gcmVzY2FubmluZyB0aGUgZW5kcG9pbnQgZnJvbSBzY3JhdGNoIGV2ZXJ5IHRpbWUgYSBmbGFnIGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQoc2xvdCk7XG4gICAgICAgICAgICAgICAgc2V0V2luZG93cyhzbG90LCBzcGVjLnZhbGlkV2luZG93cyk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zb3VyY2VzW3Nsb3RdO1xuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSkgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0ZSBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJvdXRlID0gc3BlYy5yb3V0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZykgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pLCBrZWVwaW5nIHRoZSBzb3VyY2UgKHNvIGl0IGlzIG5vdCByZXNjYW5uZWQpOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5zb3VyY2VDb25maWcpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGNhcnJpZXMgaXRzIGNvbmZpZyAoYW5kIGl0cyB3cml0ZSBkZWxheSkgaW50byBldmVyeXRoaW5nIGl0IGRvZXMsIHNvIGl0IGhhcyB0byBsZWFybiB0aGUgbmV3IG9uZSAtIHNlZSBhcHBseVNvdXJjZUNvbmZpZ1xuICAgICAgICAgICAgICAgIHNwZWMuYXBwbHlDb25maWc/LihleGlzdGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLm5vRnVsbFN5bmMgPSBzcGVjLm5vRnVsbFN5bmM7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcuc291cmNlQ29uZmlnID0gc3BlYy5zb3VyY2VDb25maWc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc3BlYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IHNwZWMudXJsLCB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLCByb3V0ZTogc3BlYy5yb3V0ZSwgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLCBpbnRlcm1lZGlhdGU6IHNwZWMuaW50ZXJtZWRpYXRlLCBzb3VyY2VDb25maWc6IHNwZWMuc291cmNlQ29uZmlnLCBpZGVudGl0eTogc3BlYy5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogYSBnZW51aW5lbHkgbmV3IGVuZHBvaW50LCBzbyBpdCBpcyBzY2FubmVkIGZyb20gc2NyYXRjaGApO1xuICAgICAgICAgICAgdGhpcy5zeW5jLmFkZFNvdXJjZSh0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpIHx8IG1hdGNoZWQuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSBzbG90IGlzIGRlYWQgdGhlIG1vbWVudCB0aGlzIHJldHVybnM7IGRyb3BwaW5nIHRoZSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgaXMgdGhlIHBhcnQgdGhhdCByZWFkcyB0aGUgaW5kZXgsIHNvIGl0IGZpbmlzaGVzIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICB2b2lkIHRoaXMuc3luYy5yZW1vdmVTb3VyY2UoaSkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmVzY2FucyBvdXIgb3duIGRpc2sncyBtZXRhZGF0YSBpbnRvIHRoZSBpbmRleCAtIHVzZWQgYXJvdW5kIHZhbGlkIHdpbmRvdyBoYW5kb2Zmcywgd2hlcmUgYW5vdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLnJlc2NhbkJhc2UoKTtcbiAgICB9XG5cbiAgICAvKiogQSBib3VuZGFyeSBzY2FuIG9mIHRoZSBub2RlIHRoYXQgb3duZWQgKHBhcnQgb2YpIG91ciByb3V0ZSBpbiB0aGUgdmFsaWQgd2luZG93IGJlZm9yZSBvdXJzLCB3aGVuIHRoYXQgbm9kZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSAoYSBkaXNrIHJlc2NhbiBjYW4ndCBzZWUgaXRzIHdyaXRlcykuICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMuYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBMYXJnZSB1cGxvYWRzIHN0cmVhbSBvbnRvIHRoZSBsb2NhbCBkaXNrIHNvdXJjZSBkaXJlY3RseSAodGhleSBtYXkgbm90IGZpdCBpbiBtZW1vcnkpLCBhbmQgcmVjb25jaWxpYXRpb24gY2FycmllcyB0aGVtIHRvIHRoZSBvdGhlciBzb3VyY2VzIC0gdGhlcmUgaXMgbm8gZGVsYXllZC13cml0ZSBzdGFnZSB0aGV5IGNvdWxkIHBhc3MgdGhyb3VnaC4gVGhlIHdyaXRlIGl0c2VsZiBpcyB2YWxpZGF0ZWQgZXhhY3RseSBsaWtlIHNldCdzLCByaWdodCBoZXJlOiB0aGUgY2xpZW50IGlzIGFib3V0IHRvIHNlbmQgdGhlIHdob2xlIGZpbGUsIHNvIGV2ZXJ5IHJlYXNvbiB0byByZWZ1c2UgaXQgbXVzdCBiZSBmb3VuZCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoY29uZmlnPzogeyBwYXRoPzogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnPy5wYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgcm91dGUsIGNvbmZpZz8ubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWc/LmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpLiBUaGUgY2xpZW50IGlzIGFscmVhZHkgc3RyZWFtaW5nLCBzbyB0aGUgdXBsb2FkIGlzIGFjY2VwdGVkIGFuZCBldmVyeSBwYXJ0IGRpc2NhcmRlZCAtIHRoZSBhbHRlcm5hdGl2ZSBpcyB0aHJvd2luZyBhdCBhIGNhbGxlciB0aGF0IGRpZCBub3RoaW5nIHdyb25nLlxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBgJHtESVNDQVJERURfVVBMT0FEX1BSRUZJWH0ke3RoaXMubmV4dERpc2NhcmRlZFVwbG9hZCsrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRlZFVwbG9hZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuaGFzKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5hcHBlbmRMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5kYXRhKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgbGV0IHsgZGlzaywgc291cmNlSW5kZXggfSA9IHRoaXMuZ2V0RGlza1NvdXJjZSgpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldCkgLSBhIG5ld2VyIHZhbHVlIGNhbiBsYW5kIHdoaWxlIGEgbG9uZyB1cGxvYWQgaXMgc3RpbGwgc3RyZWFtaW5nLCBzbyB0aGlzIGlzIHJlLWNoZWNrZWQgaGVyZSByYXRoZXIgdGhhbiBvbmx5IGF0IHRoZSBzdGFydFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoY29uZmlnLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBkaXNrLmZpbmlzaExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLnBhdGgsIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGRpc2suZ2V0SW5mbyhjb25maWcucGF0aCk7XG4gICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoY29uZmlnLnBhdGgsIHsgd3JpdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgc2l6ZTogaW5mby5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gSW50ZXJuYWxzXG5cbiAgICAvKiogQnl0ZXMgb2YgcmVhZCBjYWNoZSB0aGUgZGlzayBtYXkgaG9sZDsgc2VlIENvbW1vbkNvbmZpZy5yZWFkZXJEaXNrTGltaXQgKFN0b3JlU3luYyBlbmZvcmNlcyBpdCkuIFJlYWQgZnJvbSB0aGUgY29uZmlnIGluIGVmZmVjdCwgc28gcmFpc2luZyBvciByZW1vdmluZyB0aGUgbGltaXQgdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGV2aWN0aW9uIHBhc3MuICovXG4gICAgcHVibGljIGdldCByZWFkZXJEaXNrTGltaXQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHdyaXRlIHRpbWUgYSBuZXcgd3JpdGUgaGFzIHRvIGJlYXQsIG9yIDAgd2hlbiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIHRoZSBrZXkuIENvdW50cyBERUxFVElPTlMgdG9vOiBhIHdyaXRlIG9sZGVyIHRoYW4gdGhlIGRlbGV0aW9uIHRoYXQgcmVtb3ZlZCBpdCBtdXN0IG5vdCBicmluZyBpdCBiYWNrLiBUaGUgaW5kZXggaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGZvciBhIHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIGEgZGVsYXllZCBzb3VyY2UsIHNpbmNlIHRoZSBlbnRyeSBpcyByZWNvcmRlZCB3aGVuIHRoZSB3cml0ZSBpcyBhY2NlcHRlZCByYXRoZXIgdGhhbiB3aGVuIGl0IHJlYWNoZXMgc3RvcmFnZS4gKi9cbiAgICBwdWJsaWMgY3VycmVudFdyaXRlVGltZShrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnRpbWVPZihrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5pc0xpdmUoc291cmNlSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclNsb3Qoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF07XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICBsZXQgcmVnaXN0cmF0aW9uID0gdGhpcy5zb3VyY2VzTGlzdC5lbnN1cmUodGhpcy5zb3VyY2VzW3Nsb3RdLnVybCkudGhlbihpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF0gPSByZWdpc3RyYXRpb247XG4gICAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90LCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc2xvdCBuZXZlciBnb3QgdGhhdCBmYXIgKGEgc291cmNlIHJlbW92ZWQgYmVmb3JlIGl0cyByZWdpc3RyYXRpb24gcmVzb2x2ZWQpLiAqL1xuICAgIHB1YmxpYyBzbG90U291cmNlc0xpc3RJbmRleChzbG90OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgIH1cblxuICAgIC8vIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90IC0gb25seSB2YWxpZCBvbmNlIHRoZSBzbG90J3MgcmVnaXN0cmF0aW9uIHJlc29sdmVkIChpbml0IGFuZCB0aGUgc291cmNlJ3Mgc3luYyBsb29wIGd1YXJhbnRlZSB0aGF0IGJlZm9yZSBhbnkgaW5kZXhpbmcgaGFwcGVucylcbiAgICBwdWJsaWMgc291cmNlc0xpc3RJbmRleE9mU2xvdChzbG90OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBzbG90ICR7c2xvdH0gKCR7dGhpcy5zb3VyY2VzW3Nsb3RdPy51cmx9KSBoYXMgbm8gcmVnaXN0ZXJlZCBzb3VyY2VzTGlzdEluZGV4IHlldCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIC8vIFRoZSBsaXZlIHNsb3QgY3VycmVudGx5IHNlcnZpbmcgYSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNvbmZpZ3VyZWQgc291cmNlIGhhcyB0aGF0IFVSTCBhbnltb3JlLiBMaW5lYXIsIGJ1dCB0aGUgc291cmNlcyBsaXN0IGlzIHRpbnkgYW5kIHRoaXMgaXMgYWx3YXlzIGN1cnJlbnQgKHNsb3RzIGR5aW5nLCBvciBzZXZlcmFsIHNsb3RzIHNoYXJpbmcgb25lIFVSTCBhY3Jvc3MgdmFsaWQgd2luZG93cywgbmVlZCBubyBib29ra2VlcGluZykuXG4gICAgcHVibGljIHNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW2ldID09PSBzb3VyY2VzTGlzdEluZGV4ICYmIHRoaXMuaXNMaXZlKGkpKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFRoZSBJQXJjaGl2ZXMgY3VycmVudGx5IGhvbGRpbmcgYW4gZW50cnkncyBieXRlczogdGhlIGxpdmUgc2xvdCB3aGVuIHRoZSBob2xkZXIgaXMgc3RpbGwgY29uZmlndXJlZCwgb3RoZXJ3aXNlIHJlc29sdmVkIChjYWNoZWQpIHN0cmFpZ2h0IGZyb20gaXRzIHBlcnNpc3RlZCBVUkwgLSB3aW5kb3dzL3JvdXRlcyBkZWNpZGUgd2hlbiBhIHNvdXJjZSBpcyBzY2FubmVkIG9yIHdyaXR0ZW4sIGJ1dCBmb3IgcmVhZGluZyBieXRlcyB3ZSBrbm93IGl0IGhvbGRzLCB0aGUgVVJMIGFsb25lIGlzIGVub3VnaFxuICAgIHB1YmxpYyBhc3luYyBnZXRFbnRyeUhvbGRlcihlbnRyeTogSW5kZXhFbnRyeSk6IFByb21pc2U8SUFyY2hpdmVzIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuc291cmNlc1tzbG90XS5zb3VyY2U7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNvdXJjZXNMaXN0LmdldFVybChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSB8fCBhd2FpdCB0aGlzLnNvdXJjZXNMaXN0LmdldFVybFJlbG9hZGluZyhlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZz8ucmVzb2x2ZVNvdXJjZVVybD8uKHVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5kZXgubG9hZCgpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAoc2VlIFN0b3JlU3luYydzIHNjYW4gaGFuZGxpbmcpLCBhbmQgYSBsb2FkZWQgYnVja2V0IGFsd2F5cyBoYXMgaXQgdGhlcmUgLSBhIHBlcnNpc3RlZCBlbnRyeSBwb2ludGluZyBlbHNld2hlcmUgaXMgc3RhbGUsIHNvIGl0IGlzIGNvcnJlY3RlZCBvbmNlLCBoZXJlXG4gICAgICAgIGxldCByb3V0aW5nID0gdGhpcy5nZXRJbmRleEVudHJ5KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGxldCBiYXNlU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKTtcbiAgICAgICAgaWYgKHJvdXRpbmcgJiYgcm91dGluZy5zb3VyY2VzTGlzdEluZGV4ICE9PSBiYXNlU291cmNlc0xpc3RJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KFJPVVRJTkdfRklMRSwgeyB3cml0ZVRpbWU6IHJvdXRpbmcud3JpdGVUaW1lLCBzaXplOiByb3V0aW5nLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGJhc2VTb3VyY2VzTGlzdEluZGV4IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSB3ZSBob2xkLiBBIGRlbGV0ZWQgb25lIGlzIG5vdCBvbmU6IGl0IGlzIGEgdG9tYnN0b25lLCBhbmQgb25seSBnZXREZWxldGVkRW50cnkga25vd3MgYWJvdXQgaXQuICovXG4gICAgcHVibGljIGdldEluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiBJbmRleEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5pbmRleC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogV2hlbiBhIGtleSB3YXMgZGVsZXRlZCwgaWYgaXQgd2FzLiBBIGRlbGV0aW9uIGlzIGFuIGFic2VuY2Ugd2l0aCBhIHRpbWUgYXR0YWNoZWQgLSB0aGF0IHRpbWUgaXMgd2hhdCBtYWtlcyBpdCBwcm9wYWdhdGUgYW5kIHdoYXQgZXhwaXJlcyBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0RGVsZXRlZEVudHJ5KGtleTogc3RyaW5nKTogeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCB0b21ic3RvbmUgPSB0aGlzLmluZGV4LmdldERlbGV0ZWQoa2V5KTtcbiAgICAgICAgaWYgKCF0b21ic3RvbmUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBmaWxlIHdlIGhvbGQsIGZvciB0aGUgcGFzc2VzIHRoYXQgd2FsayB0aGVtIGFsbCAobGlzdGluZ3MsIHNjYW5zLCByZWNvbmNpbGlhdGlvbiwgZXZpY3Rpb24pLiBEZWxldGlvbnMgYXJlIG5vdCBpbiBoZXJlIC0gc2VlIGRlbGV0ZWRFbnRyaWVzLiBMaXZlOiBkZWxldGluZyBlbnRyaWVzIHdoaWxlIGl0ZXJhdGluZyBpcyBleHBlY3RlZCBoZXJlLCBhbmQgc2FmZS4gKi9cbiAgICBwdWJsaWMgKmluZGV4RW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEluZGV4RW50cnldPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4LmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFdmVyeSBkZWxldGlvbiB3ZSBrbm93IG9mLiBBIG11Y2ggc21hbGxlciB3YWxrIHRoYW4gdGhlIGZpbGVzLCB3aGljaCBpcyB3aGF0IG1ha2VzIGV4cGlyaW5nIHRoZW0gY2hlYXAuICovXG4gICAgcHVibGljICpkZWxldGVkRW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH1dPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5pbmRleC5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IHdyaXRlVGltZTogdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBIb3cgbWFueSBmaWxlcyB3ZSBob2xkLCBkZWxldGlvbnMgZXhjbHVkZWQuICovXG4gICAgcHVibGljIGluZGV4U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5zaXplO1xuICAgIH1cblxuICAgIC8qKiBUb3RhbHMgb3ZlciB0aGUgZmlsZXMgd2UgaG9sZCwgYnJva2VuIGRvd24gYnkgdGhlIHNsb3QgaG9sZGluZyBlYWNoIChlbnRyaWVzIGNhbiBuYW1lIGEgc291cmNlIHRoYXQgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQsIHdoaWNoIGNvdW50cyB0b3dhcmRzIHRoZSB0b3RhbCBidXQgbm8gc2xvdCkuICovXG4gICAgcHVibGljIGluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzbG90czogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBzbG90cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gKHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfSkpO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5ieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgc2xvdHMgfTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIGZpbGUsIGFzIG9mIGl0cyB3cml0ZSB0aW1lLiBSZXR1cm5zIGZhbHNlLCBoYXZpbmcgY2hhbmdlZCBub3RoaW5nLCB3aGVuIHdlIGFscmVhZHkga25vdyBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IC0gdGhlIGluZGV4IGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcywgd2hpY2hldmVyIHBhdGggdGhlIHdyaXRlIGNhbWUgaW4gYnkuICovXG4gICAgcHVibGljIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5zZXQoa2V5LCB7IHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggfSwgZW50cnkud3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgbGFuZGluZyBoZXJlIC0gd3JpdHRlbiBieSBhbiBvcGVyYXRvciwgb3IgcHVsbGVkIG9mZiBhIHBlZXIgYnkgc3luY2hyb25pemF0aW9uIC0gaXMgaG93IHRoaXMgc3RvcmUgbGVhcm5zIHdoYXQgaXQgaXMgbWVhbnQgdG8gYmVcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIERFTEVUSU9OLCBhcyBvZiBpdHMgdGltZTogdGhlIGtleSBzdG9wcyBleGlzdGluZyBoZXJlLCBhbmQgdGhlIHRvbWJzdG9uZSBpcyB3aGF0IG1ha2VzIHRoYXQgZmFjdCBwcm9wYWdhdGUgYW5kIHJlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZS4gU2FtZSBvcmRlcmluZyBydWxlIGFzIHNldEluZGV4RW50cnkuICovXG4gICAgcHVibGljIHNldEluZGV4RGVsZXRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LmRlbGV0ZShrZXksIHdyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgYSBrZXkgZW50aXJlbHksIHRvbWJzdG9uZSBpbmNsdWRlZC4gTk9UIGEgZGVsZXRpb246IGl0IHNheXMgbm90aGluZyBoYXBwZW5lZCB0byB0aGUgZmlsZSwgb25seSB0aGF0IHdlIG5vIGxvbmdlciBrbm93IGFueXRoaW5nIGFib3V0IGl0IC0gZm9yIGFuIGVudHJ5IHdob3NlIGhvbGRlciB0dXJuZWQgb3V0IG5vdCB0byBoYXZlIGl0LCBhbmQgZm9yIGEgdG9tYnN0b25lIG9sZCBlbm91Z2ggdGhhdCBldmVyeW9uZSBoYXMgaGVhcmQuICovXG4gICAgcHVibGljIHB1cmdlSW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmluZGV4LnB1cmdlKGtleSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHZhbGlkYXRpb24gKGZyb20gdGhpcyBzdG9yZSdzIG93biByb3V0aW5nIGVudHJpZXMpIOKUgOKUgFxuXG4gICAgLyoqXG4gICAgICogRXZlcnkgd3JpdGUsIGhvd2V2ZXIgaXQgaXMgc3RhbXBlZCwgaGFzIHRvIGJlIG9uZSB3ZSBhcmUgYWN0dWFsbHkgbWVhbnQgdG8gaG9sZCAtIGJlY2F1c2UgdGhlXG4gICAgICogYWx0ZXJuYXRpdmUgaXMgbm90IGEgc21hbGxlciBwcm9ibGVtLCBpdCBpcyBhIHNpbGVudCBvbmUuIEEgd3JpdGUgdGhhdCBsYW5kcyBvbiBhIHN0b3JlIHRoYXRcbiAgICAgKiBkb2VzIG5vdCBzZXJ2ZSBpdHMgcm91dGUgKG9yIG9uIGEgc2VydmVyIHRoYXQgaXMgbm90IGluIHRoZSBidWNrZXQncyBjb25maWcgYXQgYWxsKSBnb2VzIGludG8gYVxuICAgICAqIGZvbGRlciBub3RoaW5nIHNjYW5zIGFuZCBubyBwZWVyIHJlY29uY2lsZXM6IGl0IHN1Y2NlZWRzLCBhbmQgdGhlbiBpdCBpcyBnb25lLiBUaGUgbWFya2VycyBtYWtlXG4gICAgICogdGhlIGNsaWVudCByZS1yZWFkIHRoZSByb3V0aW5nIGNvbmZpZyBhbmQgcmV0cnksIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHJpZ2h0IG91dGNvbWUgd2hlbiB0aGVcbiAgICAgKiByZWFzb24gaXQgYWltZWQgaGVyZSBpcyB0aGF0IGl0cyBjb25maWcgd2FzIHN0YWxlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0V3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHJvdXRlOiBudW1iZXIsIGxhc3RNb2RpZmllZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkZXRhaWwgPSB0aGlzLnVuY29uZmlndXJlZERldGFpbCgpO1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH1gKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX05PVF9DT05GSUdVUkVEfSBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9IERhdGEgd3JpdHRlbiB0byBhIHN0b3JlIHdpdGggbm8gY29uZmlndXJhdGlvbiBlbnRyeSB3b3VsZCBuZXZlciBiZSBzY2FubmVkIG9yIHJlY29uY2lsZWQsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBzaWxlbnRseSBsb3NlIGl0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeSAtIG9yLCBpZiB0aGlzIHN0b3JlIGlzIGdlbnVpbmVseSBtZWFudCB0byB0YWtlIHRoaXMgd3JpdGUsIHdyaXRlIHRoZSBidWNrZXQncyByb3V0aW5nIGNvbmZpZyB3aXRoIGFuIGVudHJ5IG5hbWluZyBpdCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleSwgRGF0ZS5ub3coKSwgcm91dGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgc3RhbXBlZCB3cml0ZSBwaWNrZWQgaXRzIG93biB0aW1lLCBzbyBubyB3aW5kb3cgY2FuIGp1ZGdlIGl0ICh0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN5bmNocm9uaXplZCB3cml0ZSkgLSBidXQgdGhlIFJPVVRFIGlzIG5vdCBhIG1hdHRlciBvZiB0aW1pbmcsIGFuZCBhIHN0YW1wZWQgd3JpdGUgdG8gdGhlIHdyb25nIHNoYXJkIGlzIGV4YWN0bHkgYXMgaW52aXNpYmxlIGFzIGEgZnJlc2ggb25lXG4gICAgICAgIGlmICh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHJldHVybjtcbiAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBzdGFtcGVkIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSByb3V0ZSB3ZSBzZXJ2ZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHN0b3JlIGRvZXMgbm90IGhhbmRsZSByb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0sIG91ciByb3V0ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0sIHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgfVxuXG4gICAgLyoqIEV4YWN0bHkgd2h5IHRoaXMgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZW50cmllcyAtIHdoaWNoIG9mIHRoZSB0aHJlZSBwb3NzaWJsZSByZWFzb25zIGl0IGlzLCB3aXRoIHRoZSB2YWx1ZXMgdGhhdCBkZWNpZGVkIGl0LCBiZWNhdXNlIFwibm90IGNvbmZpZ3VyZWRcIiBhbG9uZSBpcyB1bmRpYWdub3NhYmxlLiAqL1xuICAgIHByaXZhdGUgdW5jb25maWd1cmVkRGV0YWlsKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCByb3V0aW5nID0gdGhpcy5hcHBsaWVkUm91dGluZztcbiAgICAgICAgbGV0IGlkZW50aXR5ID0gYHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KWA7XG4gICAgICAgIGlmICghcm91dGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBoYXMgbm8gcm91dGluZyBjb25maWcgYXQgYWxsIC0gbm90aGluZyBoYXMgZXZlciB3cml0dGVuICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gaW50byBpdC5gO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvYmplY3RzID0gcm91dGluZy5zb3VyY2VzLmZpbHRlcih4ID0+IHR5cGVvZiB4ICE9PSBcInN0cmluZ1wiKSBhcyBTb3VyY2VDb25maWdbXTtcbiAgICAgICAgbGV0IG5hbWVkID0gb2JqZWN0cy5maWx0ZXIoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgICAgaWYgKCFuYW1lZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaXMgcnVubmluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0sIHdoaWNoIGhhcyBubyBlbnRyeSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGl0cyBlbnRyaWVzIGFyZSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KG9iamVjdHMubWFwKHggPT4geC5uYW1lKSl9KS5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaXMgcnVubmluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0sIHdob3NlICR7bmFtZWQubGVuZ3RofSBlbnRyJHtuYW1lZC5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gbmFtZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IHBvaW50KHMpIGF0ICR7SlNPTi5zdHJpbmdpZnkobmFtZWQubWFwKHggPT4geC51cmwpKX0gLSBub25lIG9mIHdoaWNoIGlzIFRISVMgc2VydmVyLCBzbyB0aGUgY29uZmlnIHNheXMgdGhpcyBzdG9yZSBsaXZlcyBlbHNld2hlcmUuYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGEgcm91dGluZyBjb25maWcgbWF5IGJlIHdyaXR0ZW4gaGVyZS4gVHdvIHJ1bGVzLCBhbmQgdGhpcyBpcyB0aGUgb25lIHBsYWNlIGVpdGhlciBpc1xuICAgICAqIGFwcGxpZWQgLSBhIGNvbmZpZyBvbmx5IGV2ZXIgZW50ZXJzIHRoZSBzeXN0ZW0gdGhyb3VnaCBhIHdyaXRlLCBzbyBhIGNvbmZpZyB0aGF0IGdvdCBpbiBpcyBhXG4gICAgICogY29uZmlnIHRoYXQgcGFzc2VkLCBhbmQgcmVhZGluZyBvbmUgYmFjayBuZXZlciBqdWRnZXMgaXQgYWdhaW4uXG4gICAgICpcbiAgICAgKiBUaGUgY29uZmlnIGhhcyB0byBiZSB2YWxpZCBhcyBhIHdob2xlIChzZWUgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcpLCBhbmQgaXQgaGFzIHRvIG91dHJhbmsgd2hhdFxuICAgICAqIHdlIGFyZSBydW5uaW5nOiB0aGUgc2FtZSB2ZXJzaW9uIG1lYW5zIHRoZSBzYW1lIGNvbmZpZywgc28gcmUtd3JpdGluZyBpdCBpcyBoYXJtbGVzcywgYnV0IGFcbiAgICAgKiBsb3dlciBvbmUgaXMgYW4gb2xkZXIgY29uZmlnIGFycml2aW5nIGxhdGUgYW5kIG11c3QgbmV2ZXIgdW5kbyBhIG5ld2VyIG9uZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyhyb3V0aW5nKTtcbiAgICAgICAgbGV0IGluY29taW5nID0gZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnJvdXRpbmdWZXJzaW9uKCk7XG4gICAgICAgIGlmIChpbmNvbWluZyA+PSBjdXJyZW50KSByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVmdXNpbmcgdG8gd3JpdGUgJHtST1VUSU5HX0ZJTEV9IHRvIHN0b3JlICR7dGhpcy5mb2xkZXJ9OiBpdHMgdmVyc2lvbiAoJHtpbmNvbWluZ30pIGlzIG9sZGVyIHRoYW4gdGhlIG9uZSB0aGlzIHN0b3JlIGlzIHJ1bm5pbmcgKCR7Y3VycmVudH0pLiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gdG8gdXBkYXRlIGl0LmApO1xuICAgIH1cblxuICAgIC8vIEEgZnJlc2ggKHVuc3RhbXBlZCkgd3JpdGUgbXVzdCBsYW5kIG9uIHRoZSBub2RlIHRoZSBjb25maWcgY3VycmVudGx5IHBvaW50cyBhdDogdGhlIG1hcmtlcnMgdGVsbCB0aGUgY2xpZW50IGl0cyBjb25maWcgaXMgc3RhbGUsIHNvIGl0IHJlLXJlc29sdmVzIGFuZCByZXRyaWVzIGFnYWluc3QgdGhlIHJpZ2h0IG5vZGUgaW5zdGVhZCBvZiB1cyBzaWxlbnRseSBhY2NlcHRpbmcgZGF0YSB3ZSB3ZXJlIG5ldmVyIG1lYW50IHRvIGhvbGQuXG4gICAgcHJpdmF0ZSBhc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgdGltZVZhbGlkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGFsbCBvdXIgdmFsaWQgd2luZG93cyAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSAoYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1d9IENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiBpdHMgd3JpdGUgdGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBldmVyeSB2YWxpZCB3aW5kb3cgb2Ygc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9ICh3aW5kb3dzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSwgZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSAtIGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRpbWVWYWxpZC5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBvdXIgcm91dGVzICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSBhdCB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICh0aGUgY2xpZW50J3Mgc2hhcmQgY29uZmlnIGlzIHN0YWxlKWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc3RvcmUgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXNzZXJ0TXV0YWJsZShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGlzIGltbXV0YWJsZSAoYXQgd3JpdGUgdGltZSAke3dyaXRlVGltZX0pIGFuZCAke0pTT04uc3RyaW5naWZ5KGtleSl9IGFscmVhZHkgZXhpc3RzLCBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiB0byAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWUgU2V0Q29uZmlnLmludGVybmFsOiB0aGUgc3RhbXAgbXVzdCBsYW5kIGluc2lkZSBTT01FIHdpbmRvdytyb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yIChhbnkgd2luZG93LCBpbmNsdWRpbmcgcGFzdCBvbmVzIC0gc3luY2hyb25pemF0aW9uIG1vdmVzIG9sZCBkYXRhKSwgc28gYSBjb25mdXNlZCBwZWVyIGNhbid0IHN0dWZmIGRhdGEgb250byBhIHN0b3JlIHRoYXQgd2FzIG5ldmVyIG1lYW50IHRvIGhvbGQgaXRcbiAgICBwcml2YXRlIGFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgY292ZXJlZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0gJiYgcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICBpZiAoIWNvdmVyZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSByZWplY3RlZDogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBhdCByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHdpbmRvdy9yb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZDogcHVyZWx5IHRoZSBsb2NhbCBkaXNrLCBjb21wbGV0ZWx5IHNob3J0LWNpcmN1aXRpbmcgdGhlIGluZGV4IGFuZCBob2xkZXIgcmVzb2x1dGlvbiAtIHRoZSBjYWxsZXIgaXMgYW5vdGhlciBzdG9yZSwgYW5kIGNoYXNpbmcgT1VSIHJlbW90ZSBob2xkZXJzIHdoaWxlIGFuc3dlcmluZyBpdCBpcyBob3cgaW5maW5pdGUgZ2V0IGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE5vIHdpbmRvdyBvciByb3V0ZSBjaGVja3M6IGlmIHRoZSBieXRlcyBhcmUgb24gb3VyIGRpc2ssIHRoZSBjYWxsZXIgbWF5IGhhdmUgdGhlbS4gTm90ZSB0aGlzIHJlYWRzIHRoZSBkaXNrIHBhc3QgYW55IHdyaXRlIGRlbGF5LCBzbyBhIGZhc3Qgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gbWVtb3J5IGlzIGludmlzaWJsZSBoZXJlOyB0aGUgY2FsbGVyIHJlLWZpbmRzIGl0IG9uY2UgaXQgZmx1c2hlcy4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEludGVybmFsMihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIGluY2x1ZGVUb21ic3RvbmVzIGZvcndhcmRzIHRvIHRoZSBkaXNrOiBhIGZsYWctY2FsbGVyIChhIHBlZXIgc3RvcmUncyBzeW5jaHJvbml6YXRpb24pIG5lZWRzIHRvIHNlZSBvdXIgZGVsZXRpb25zLCBub3QganVzdCBvdXIgY29udGVudC4gQSB0b21ic3RvbmUgZGVsZXRlZCBmcm9tIGRpc2sgZW50aXJlbHkgb25seSBsaXZlcyBpbiBvdXIgaW5kZXgsIHNvIGZhbGwgYmFjayB0byB0aGF0LlxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5nZXQyKGNvbmZpZy5wYXRoLCB7IHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMgfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykge1xuICAgICAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoY29uZmlnLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChkZWxldGVkKSByZXR1cm4geyBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfTtcbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSB3cml0ZTogdGhlIGxvY2FsIGRpc2sgcGx1cyBvdXIgaW5kZXgsIHdpdGggTk8gZG93bnN0cmVhbSBmYW4tb3V0IC0gdGhlIHB1c2hpbmcgc3RvcmUgb3ducyBwcm9wYWdhdGlvbiwgYW5kIGZhbm5pbmcgaXRzIHB1c2hlcyBiYWNrIG91dCBpcyBob3cgd3JpdGUgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gT25seS10YWtlLWxhdGVzdCBzdGlsbCBhcHBsaWVzIGhlcmUuICovXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRJbnRlcm5hbChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBBIGRlbGV0aW9uIHN0b3JlcyBub3RoaW5nIG9uIG91ciBvd24gc291cmNlIC0gdGhlIHRvbWJzdG9uZSBpcyB0aGUgd2hvbGUgb2YgaXRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2UuZGVsKGtleSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlYWQncyBieXRlcyBjYW1lIGZyb20gYSByZW1vdGUgc291cmNlLCBzbyB3cml0ZSB0aGVtIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCB3aGljaCBiZWNvbWVzIHRoZSBlbnRyeSdzIG5ldyBob2xkZXIgLSByZWFkcyBvbmx5IHBheSB0aGUgcmVtb3RlIGZldGNoIG9uY2VcbiAgICBwcml2YXRlIGFzeW5jIGNhY2hlUmVhZChrZXk6IHN0cmluZywgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNoYXJlZCBlbmdpbmUgb2Ygc2V0IGFuZCBkZWw6IGFuIGVtcHR5IGJ1ZmZlciBpcyBleGFjdGx5IGEgZGVsZXRpb24gaGVyZSwgd2hpY2ggaXMgd2h5IHRoZSBlbXB0eS1idWZmZXIgcmVqZWN0aW9uIGxpdmVzIGluIHNldCAodGhlIHB1YmxpYyBBUEkpLCBub3QgaW4gdGhpcyBtYWNoaW5lcnlcbiAgICBwcml2YXRlIGFzeW5jIHNldE9yRGVsZXRlKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcIm9yaWdpbmFsXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IGNvbmZpZy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhc3Qgd3JpdGVzIGFyZSBub3QgaGFuZGxlZCBoZXJlOiBhIHNvdXJjZSB0aGF0IHdhcyBjb25maWd1cmVkIHdpdGggYSB3cml0ZSBkZWxheSBidWZmZXJzIHRoZW0gaXRzZWxmIChzZWUgQXJjaGl2ZXNEZWxheWVkKSwgc28gdGhpcyB3cml0ZSBsYW5kcyBpbiBtZW1vcnkgYW5kIHJldHVybnMsIGV4YWN0bHkgYXMgaXQgd291bGQgaGF2ZS4gVGhlIGluZGV4IGlzIHVwZGF0ZWQgZWl0aGVyIHdheSwgc28gdGhlIHdyaXRlIGlzIGltbWVkaWF0ZWx5IHZpc2libGUgdG8gcmVhZGVycyBvZiB0aGlzIHN0b3JlLlxuICAgICAgICBhd2FpdCB0aGlzLndyaXRlVG9Tb3VyY2VzKGtleSwgZGF0YSwgbGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5zdGFudCBldmVyeSBkZWxheWVkIHdyaXRlIG11c3QgYmUgb24gaXRzIHNvdXJjZTogdGhlIGVuZCBvZiBvdXIgb3duIHdyaXRlIHdpbmRvdyB0aGF0IGNvbnRhaW5zIG5vdywgbWludXMgdGhlIGZsdXNoIG1hcmdpbiAoc28gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIGZpbmRzIHRoZSBkYXRhIG9uIGhhbmRvZmYpLiBUaGUgTEFURVNUIGVuZCBhbW9uZyBjb3ZlcmluZyB3aW5kb3dzIC0gb3ZlcmxhcHBpbmcgd2luZG93cyBoYW5kIG9mZiBhdCB0aGUgbGFzdCBvbmUuIE5vIHdpbmRvdyBjb250YWlucyBub3cgKGFuIGluZXJ0IHN0b3JlLCBvciBhIG1vbWVudCBiZXR3ZWVuIG91ciB3aW5kb3dzKSAtPiAwLCBpLmUuIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWQgYXQgYWxsLiAqL1xuICAgIHB1YmxpYyB3cml0ZUZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gQmVmb3JlIHVwZGF0ZVNvdXJjZXMgaGFzIHJ1biB0aGVyZSBpcyBub3RoaW5nIHRvIGhvbGQgYSB3cml0ZSBhbnl3YXksIGFuZCBub3RoaW5nIG1heSBiZSBkZWxheWVkXG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkgcmV0dXJuIDA7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgZW5kID0gMDtcbiAgICAgICAgZm9yIChsZXQgdyBvZiB0aGlzLnNvdXJjZXNbMF0udmFsaWRXaW5kb3dzKSB7XG4gICAgICAgICAgICBpZiAod1swXSA8PSBub3cgJiYgbm93IDwgd1sxXSkgZW5kID0gTWF0aC5tYXgoZW5kLCB3WzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVuZCkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBlbmQgLSBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyaXRhYmxlU291cmNlcyhjb25maWc/OiB7IGlnbm9yZVdpbmRvdz86IGJvb2xlYW4gfSk6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHdyaXRhYmxlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uaWdub3JlV2luZG93ICYmICF3aW5kb3dzQWNjZXB0V3JpdGVzKHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHdyaXRhYmxlLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRhYmxlO1xuICAgIH1cblxuICAgIC8vIE91ciBvd24gc291cmNlICh0aGUgZmlyc3Qgd3JpdGFibGUgb25lKSBwbHVzIGV2ZXJ5IHJvdXRlLW1hdGNoaW5nIHBlZXIuIEVhY2ggc291cmNlIGRlY2lkZXMgZm9yIGl0c2VsZiBob3cgbG9uZyBpdCBob2xkcyB0aGUgd3JpdGUgYmVmb3JlIGl0IGhpdHMgc3RvcmFnZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkgLSBoZXJlIHRoZXkgYWxsIGp1c3QgZ2V0IHdyaXR0ZW4uXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZVRvU291cmNlcyhrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIE5FVkVSIHN5bmNocm9uaXplZCBiZXR3ZWVuIHN0b3JhZ2Ugbm9kZXM6IHRoZSB3cml0ZXIgd3JpdGVzIGl0IGRpcmVjdGx5IHRvIGVhY2ggbm9kZSwgc28gd2Ugc3RvcmUgaXQgb24gb3VyIG93biBkaXNrIG9ubHkgKG5vIHZhbGlkLXdpbmRvdyBmaWx0ZXIgLSByb3V0aW5nL3ZhbGlkIHdpbmRvd3MgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gdGhlIGZpbGUgZGVmaW5pbmcgdGhlbSkgYW5kIG5ldmVyIGZvcndhcmQgaXQgdG8gb3RoZXIgc291cmNlcy5cbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJmbHVzaGVkXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGlzUm91dGluZyA9IGtleSA9PT0gUk9VVElOR19GSUxFO1xuICAgICAgICBsZXQgd3JpdGFibGUgPSB0aGlzLmdldFdyaXRhYmxlU291cmNlcyh7IGlnbm9yZVdpbmRvdzogaXNSb3V0aW5nIH0pO1xuICAgICAgICBsZXQgZmlyc3QgPSB3cml0YWJsZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgKGV2ZXJ5IHNvdXJjZSdzIHZhbGlkIHdpbmRvdyBpcyBpbiB0aGUgcGFzdCksIHNvIHdyaXRlcyBjYW5ub3QgYmUgc3RvcmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG91ciBvd24gKGZpcnN0KSBzb3VyY2UgYmxvY2tzIHRoZSB3cml0ZS4gRG93bnN0cmVhbSBzb3VyY2VzIGFyZSB3cml0dGVuIGluIHRoZSBiYWNrZ3JvdW5kOiBhIGRvd24gZG93bnN0cmVhbSBzb3VyY2UgbXVzdCBub3QgZmFpbCBvciBzdGFsbCB3cml0ZXMsIGFuZCByZWNvbmNpbGlhdGlvbiByZS1zZW5kcyBhbnl0aGluZyB0aGV5IG1pc3NlZCBvbmNlIHRoZXkgY29tZSBiYWNrLlxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gc3RvcmVzIG5vdGhpbmcgb24gb3VyIG93biBzb3VyY2UgLSB0aGUgdG9tYnN0b25lIGlzIHRoZSB3aG9sZSBvZiBpdFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzW2ZpcnN0XS5zb3VyY2UuZGVsKGtleSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIHdyaXRlVGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lLCBzaXplOiBkYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KGZpcnN0KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSb3V0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIGZvciAobGV0IGkgb2Ygd3JpdGFibGUpIHtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyh0aGlzLnNvdXJjZXNbaV0ucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBEZWxldGlvbnMgdHJhdmVsIGFzIGRlbCBjYXJyeWluZyB0aGUgb3JpZ2luYWwgd3JpdGUgdGltZSAobmV2ZXIgYXMgZW1wdHkgc2V0cyAtIHNldCByZWplY3RzIGVtcHR5IGJ1ZmZlcnMpLiBCYWNrYmxhemUgbWF0ZXJpYWxpemVzIHN1Y2ggZGVscyBhcyByZWFsIGVtcHR5IGZpbGVzLCBzbyBpdHMgbGlzdGluZ3Mgc3RpbGwgc2hvdyB0aGUgZGVsZXRpb24gZm9yIG90aGVyIHN0b3JlcyB0byBzY2FuIGluIGFzIGEgdG9tYnN0b25lLlxuICAgICAgICAgICAgbGV0IHB1c2g6IFByb21pc2U8dW5rbm93bj47XG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwdXNoID0gdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5kZWwoa2V5LCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2b2lkIHB1c2guY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2dyb3VuZCB3cml0ZSBvZiAke2tleX0gdG8gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTbG90IDAgaXMgYWx3YXlzIHRoaXMgc3RvcmUncyBvd24gZm9sZGVyIChzZWUgcGxhblNvdXJjZXMpLCBzbyB0aGUgZGlzayBpcyBrbm93biB3aXRob3V0IHNlYXJjaGluZyBmb3IgaXQgLSBhbmQgaXQgaXMgdGhlIHVud3JhcHBlZCBvbmUsIHBhc3QgYW55IHdyaXRlIGRlbGF5XG4gICAgcHJpdmF0ZSBnZXREaXNrU291cmNlKCk6IHsgZGlzazogQXJjaGl2ZXNEaXNrOyBzb3VyY2VJbmRleDogbnVtYmVyIH0ge1xuICAgICAgICByZXR1cm4geyBkaXNrOiB0aGlzLm93bkRpc2ssIHNvdXJjZUluZGV4OiAwIH07XG4gICAgfVxuXG4gICAgLyoqIFdyaXRlcyBldmVyeXRoaW5nIHN0aWxsIGhlbGQgYnkgYSBkZWxheWVkIHNvdXJjZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkuIGZvcmNlIGFsc28gd3JpdGVzIHdoYXQgaXNuJ3QgZHVlIHlldCAtIHNodXRkb3duIGNhbm5vdCBsZWF2ZSB3cml0ZXMgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hEZWxheWVkV3JpdGVzKGZvcmNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCB7IHNvdXJjZSB9IG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGRlbGF5ZWQgPSBhc0RlbGF5ZWQoc291cmNlKTtcbiAgICAgICAgICAgIGlmICghZGVsYXllZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBkZWxheWVkLmZsdXNoKGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==
|
|
960
|
+
/* _JS_SOURCE_HASH = "c90e057d3b06476ce109f73274bfbe87f01a3f2211d3e892fbd588b7e35544ce"; */
|