sliftutils 1.7.101 → 1.7.102

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.
@@ -737,6 +737,11 @@ class BlobStore {
737
737
  purgeIndexEntry(key) {
738
738
  this.index.purge(key);
739
739
  }
740
+ /** Counts a synchronization transfer in the server's access statistics (see getStore's wiring): "sync get" for bytes pulled off a source, "sync set" for bytes pushed to one. */
741
+ noteSyncTransfer(operation, path, bytes) {
742
+ var _a, _b;
743
+ (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.onSyncTransfer) === null || _b === void 0 ? void 0 : _b.call(_a, operation, path, bytes);
744
+ }
740
745
  // ── validation (from this store's own routing entries) ──
741
746
  /**
742
747
  * Every write, however it is stamped, has to be one we are actually meant to hold - because the
@@ -956,5 +961,5 @@ class BlobStore {
956
961
  }
957
962
  }
958
963
  exports.BlobStore = BlobStore;
959
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQW1OO0FBQ25OLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsd0RBQXFEO0FBQ3JELCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUU3RCxxZ0JBQXFnQjtBQUVyZ0IsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzVDLDJHQUEyRztBQUMzRyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQztBQW9DN0MsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsU0FBUyx1QkFBdUIsQ0FBQyxPQUFlO0lBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixHQUFHLHlCQUF5QjtRQUFFLE9BQU87SUFDeEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELHVXQUF1VztBQUN2VyxNQUFhLFNBQVM7SUFxQmxCO0lBQ0ksOERBQThEO0lBQ3ZELE1BQWM7SUFDckIsMktBQTJLO0lBQ3BLLFNBQWlCLEVBQ2hCLE1BaUJQO1FBcEJNLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBaUJiO1FBMUNMLGNBQWM7UUFDZCwwR0FBMEc7UUFDbkcsWUFBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFD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fSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEZpbmRDb25maWcsIEhvc3RlZENvbmZpZywgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSwgRlVMTF9WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBTVE9SQUdFX05PVF9DT05GSUdVUkVELFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25GaWxlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uRmlsZVwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuXG5cbi8qKiBXaGF0IHdlIHN0b3JlIGFib3V0IGEgZmlsZS4gSXRzIHRpbWVzIGFyZSBub3QgaW4gaGVyZTogdGhlIGluZGV4IGtlZXBzIHRob3NlIGZvciBldmVyeSBrZXksIGRlbGV0ZWQgb25lcyBpbmNsdWRlZCAoc2VlIFRyYW5zYWN0aW9uRmlsZSkuICovXG50eXBlIEluZGV4VmFsdWUgPSB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8vIFdoaWNoIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhOiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHNvdXJjZSdzIFVSTCBpbiB0aGUgc3RvcmUncyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QgKHNlZSBTb3VyY2VzTGlzdCkgLSBOT1QgYSBwb3NpdGlvbiBpbiB0aGUgaW4tbWVtb3J5IHNvdXJjZXMgYXJyYXksIHdoaWNoIGNoYW5nZXMgYmV0d2VlbiBydW5zXG4gICAgc291cmNlc0xpc3RJbmRleDogbnVtYmVyO1xufTtcblxuLyoqIE9uZSBmaWxlIHdlIGhvbGQsIGFzIGV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgaW5kZXggc2VlcyBpdC4gKi9cbmV4cG9ydCB0eXBlIEluZGV4RW50cnkgPSBJbmRleFZhbHVlICYge1xuICAgIHdyaXRlVGltZTogbnVtYmVyO1xuICAgIC8vIFdoZW4gV0UgbGFzdCBjaGFuZ2VkIHRoaXMgZW50cnkgKG5vdCB0aGUgZmlsZSdzIHdyaXRlIHRpbWUpIOKAlCB3aGF0IGdldENoYW5nZXNBZnRlcjIgZmlsdGVycyBvbiwgc28gbGF0ZS1hcnJpdmluZyBmaWxlcyB3aXRoIG9sZCB3cml0ZSB0aW1lcyBhcmUgc3RpbGwgcmVwb3J0ZWRcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbn07XG5cbi8vIE9uZSBzb3VyY2Ugb2YgYSBsaXZlIHNvdXJjZS1saXN0IHVwZGF0ZTsgc2VlIEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzXG5leHBvcnQgdHlwZSBCbG9iU291cmNlU3BlYyA9IHtcbiAgICAvLyBNYXRjaGVkIGFnYWluc3QgQXJjaGl2ZXNTb3VyY2UuaWRlbnRpdHkgKFwiZGlza1wiIGZvciB0aGUgYmFzZSBzbG90KTsgZXF1YWwgaWRlbnRpdGllcyBwYWlyIG9mZiBpbiBvcmRlclxuICAgIGlkZW50aXR5OiBzdHJpbmc7XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLnVybFxuICAgIHVybDogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2UuaW50ZXJtZWRpYXRlXG4gICAgaW50ZXJtZWRpYXRlPzogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS5zb3VyY2VDb25maWcgKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpXG4gICAgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnO1xuICAgIC8vIE9ubHkgY2FsbGVkIGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgbWF0Y2ggYW4gZXhpc3RpbmcgbGl2ZSBzbG90XG4gICAgY3JlYXRlOiAoKSA9PiBJQXJjaGl2ZXM7XG4gICAgLy8gVGhlIG9wcG9zaXRlIGNhc2U6IHRoZSBlbmRwb2ludCBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIG9ubHkgaXRzIGNvbmZpZyBjaGFuZ2VkLCBzbyB0aGUgUlVOTklORyBzb3VyY2UgaXMgaGFuZGVkIHRoZSBuZXcgb25lIChzZWUgYXBwbHlTb3VyY2VDb25maWcpXG4gICAgYXBwbHlDb25maWc/OiAoc291cmNlOiBJQXJjaGl2ZXMpID0+IHZvaWQ7XG59O1xuXG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG5cbi8vIFRoZSBidWNrZXQgc3RvcmUsIGFuZCB0aGUgb25seSBvbmU6IGV2ZXJ5IGJ1Y2tldCBhIHNlcnZlciBob2xkcyBpcyBzZXJ2ZWQgYnkgdGhlc2UsIG9uZSBwZXIgc3RvcmUgbmFtZSBpbiBpdHMgcm91dGluZyBjb25maWcuIEl0cyBzb3VyY2VzIGFyZSBwbGFpbiBJQXJjaGl2ZXMgLSB0aGUgZmlyc3QgaXMgYWx3YXlzIHRoZSBzdG9yZSdzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBjb25maWd1cmVkIHBlZXJzIChzZWUgY3JlYXRlU3RvcmVTb3VyY2UpIC0gc28gXCJubyBzeW5jaHJvbml6YXRpb25cIiBpcyBzaW1wbHkgYSBzdG9yZSB3aXRoIG5vIHBlZXJzLCBub3QgYSBkaWZmZXJlbnQga2luZCBvZiBzdG9yZS5cbmV4cG9ydCBjbGFzcyBCbG9iU3RvcmUge1xuICAgIC8vIOKUgOKUgCBzdGF0ZSDilIDilIBcbiAgICAvLyBTZXQgb25jZSB0aGUgc3RvcmUgaXMgc2h1dHRpbmcgZG93bjsgZXZlcnkgbG9vcCBpdCBvd25zIChhbmQgU3RvcmVTeW5jJ3MgbWFpbnRlbmFuY2UgbG9vcHMpIHN0b3BzIG9uIGl0XG4gICAgcHVibGljIHN0b3BwZWQgPSB7IHN0b3A6IGZhbHNlIH07XG4gICAgLy8gV2hldGhlciBpbml0IGhhcyByZWFjaGVkIHRoZSBwb2ludCB3aGVyZSBhIG5ld2x5IGFkZGVkIHNvdXJjZSBjYW4gc3RhcnQgc2Nhbm5pbmcgaW1tZWRpYXRlbHlcbiAgICBwdWJsaWMgc3luY1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAvKiogSXRzIHNvdXJjZXMsIGluIGNvbmZpZyBvcmRlcjogc2xvdCAwIGlzIGFsd2F5cyBpdHMgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIHBlZXJzIGl0IHN5bmNocm9uaXplcyB3aXRoLiBGaWxsZWQgYnkgdXBkYXRlU291cmNlcywgd2hpY2ggaXMgYWxzbyBob3cgdGhleSBjaGFuZ2UuIFRoZSBzdG9yZSBPV05TIHRoZW0gLSB3cml0ZXMgcGljayBhbW9uZyB0aGVtLCByZWFkcyByZXNvbHZlIGhvbGRlcnMgdGhyb3VnaCB0aGVtIC0gYW5kIFN0b3JlU3luYyBvbmx5IHNjYW5zIHdoYXRldmVyIGlzIGluIGhlcmUgYXQgdGhlIHRpbWUuICovXG4gICAgcHVibGljIHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10gPSBbXTtcbiAgICAvLyBVcGxvYWRzIGltbXV0YWJpbGl0eSBhbHJlYWR5IGRlY2lkZWQgYWdhaW5zdDogdGhlIGNsaWVudCBpcyBtaWQtc3RyZWFtIGJ5IHRoZSB0aW1lIHdlIGtub3csIHNvIGl0IGtlZXBzIHNlbmRpbmcgYW5kIGV2ZXJ5IHBhcnQgaXMgZHJvcHBlZFxuICAgIHByaXZhdGUgZGlzY2FyZGVkVXBsb2FkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgbmV4dERpc2NhcmRlZFVwbG9hZCA9IDE7XG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgaWRlbnRpdGllcyBiZWhpbmQgSW5kZXhFbnRyeS5zb3VyY2VzTGlzdEluZGV4IChzZWUgU291cmNlc0xpc3QpXG4gICAgcHJpdmF0ZSBzb3VyY2VzTGlzdDogU291cmNlc0xpc3Q7XG4gICAgLy8gUGVyIHNsb3Q6IHRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgdGhhdCBzbG90J3MgVVJMLCBmaWxsZWQgYnkgcmVnaXN0ZXJTbG90IGJlZm9yZSB0aGUgc2xvdCdzIHN5bmMgcnVuc1xuICAgIHByaXZhdGUgc2xvdFNvdXJjZXNMaXN0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHNsb3RSZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAvLyBFdmVyeSBmaWxlIHdlIGtub3cgb2YsIGluIG1lbW9yeSwgd2l0aCBhbiBhcHBlbmQtb25seSBsb2cgb2YgdGhlIGNoYW5nZXMgYmVoaW5kIGl0IChzZWUgVHJhbnNhY3Rpb25GaWxlKS4gQSBuZXcgZmlsZSBuYW1lIGVhY2ggdGltZSB0aGUgZW50cnkgZm9ybWF0IGNoYW5nZXMgZ2VuZXJhdGlvbjogdGhlIHByZXZpb3VzIG9uZXMgY2Fubm90IGJlIHJlYWQsIGFuZCBhIHNjYW4gcmVidWlsZHMgdGhlIGluZGV4IGFueXdheSwgc28gdGhleSBhcmUgc2ltcGx5IG5ldmVyIHJlYWQgYWdhaW4uXG4gICAgcHJpdmF0ZSBpbmRleDogVHJhbnNhY3Rpb25GaWxlPEluZGV4VmFsdWU+O1xuICAgIC8qKiBLZWVwaW5nIHRoZSBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlczogc2Nhbm5pbmcsIHB1bGxpbmcsIHB1c2hpbmcsIGFuZCB0aGUgbWFpbnRlbmFuY2UgdGhhdCBmb2xsb3dzIGZyb20gaG9sZGluZyBhbiBpbmRleCAoZGlzay1saW1pdCBldmljdGlvbiwgdG9tYnN0b25lIGV4cGlyeSkuIEl0IHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzdG9yZSdzIGluZGV4IGFuZCBzb3VyY2VzIC0gaXQgZG9lcyBub3Qgb3duIHRoZW0uICovXG4gICAgcHVibGljIHN5bmM6IFN0b3JlU3luYztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvLyBQdWJsaWMgZm9yIFN0b3JlU3luYywgd2hpY2ggbG9ncyBpdCB3aXRoIGV2ZXJ5dGhpbmcgaXQgZG9lc1xuICAgICAgICBwdWJsaWMgZm9sZGVyOiBzdHJpbmcsXG4gICAgICAgIC8qKiBUaGUgbmFtZSB0aGlzIHN0b3JlIGFuc3dlcnMgdG8gKHNlZSBDb21tb25Db25maWcubmFtZSkgLSB0aGUgZW50cmllcyBvZiB0aGUgcm91dGluZyBjb25maWcgdGhhdCBjYXJyeSBpdCBhcmUgdGhlIG9uZXMgdGhhdCBjb25maWd1cmUgaXQsIGFuZCB0aGUgcmVzdCBhcmUgaXRzIHBlZXJzLiAqL1xuICAgICAgICBwdWJsaWMgc3RvcmVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29uZmlnPzoge1xuICAgICAgICAgICAgLyoqIFdoZXRoZXIgYSBjb25maWcgZW50cnkgaXMgVEhJUyBTRVJWRVIgKHNhbWUgYWNjb3VudCwgc2FtZSBidWNrZXQsIG91ciBvd24gYWRkcmVzcykuIEluamVjdGVkIGJlY2F1c2UgYSBzdG9yZSBrbm93cyBub3RoaW5nIGFib3V0IHNlcnZlcnMgLSBpdCBvbmx5IG5lZWRzIHRvIHRlbGwgaXRzIG93biBlbnRyaWVzIGFwYXJ0IGZyb20gaXRzIHBlZXJzJy4gQWJzZW50IG1lYW5zIG5vdGhpbmcgaXMgdXMsIHdoaWNoIGlzIHdoYXQgYSBiYXJlIHN0b3JlIChubyBzZXJ2ZXIgYXJvdW5kIGl0KSB3YW50cy4gKi9cbiAgICAgICAgICAgIGlzU2VsZj86IChzb3VyY2U6IFNvdXJjZUNvbmZpZykgPT4gYm9vbGVhbjtcbiAgICAgICAgICAgIC8qKiBCdWlsZHMgb25lIG9mIGl0cyBzb3VyY2VzLiBJbmplY3RlZCBmb3IgdGhlIHNhbWUgcmVhc29uLCBhbmQgYmVjYXVzZSB0aGUgZGVsYXkgaXQgaXMgY3JlYXRlZCB3aXRoIGlzIHRoaXMgc3RvcmUncyBwb2xpY3kuICovXG4gICAgICAgICAgICBjcmVhdGVTb3VyY2U/OiAoY29uZmlnOiB7IHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZzsgd3JpdGVEZWxheTogbnVtYmVyIH0pID0+IElBcmNoaXZlcztcbiAgICAgICAgICAgIC8qKiBIYW5kcyBhIHJ1bm5pbmcgc291cmNlIGEgY2hhbmdlZCBjb25maWcsIHNvIGFuIGVuZHBvaW50IHdlIGFscmVhZHkgdGFsayB0byBpcyBuZXZlciByZWJ1aWx0IGp1c3QgYmVjYXVzZSBhIGZsYWcgbW92ZWQuICovXG4gICAgICAgICAgICBhcHBseVNvdXJjZT86IChzb3VyY2U6IElBcmNoaXZlcywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHdyaXRlRGVsYXk6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhIGtleSdzIGluZGV4IGVudHJ5IGNoYW5nZXMgKG91ciBvd24gd3JpdGVzIEFORCBmaWxlcyBwdWxsZWQgaW4gdmlhIHN5bmNocm9uaXphdGlvbikg4oCUIGhvdyB0aGUgc3RvcmFnZSBzZXJ2ZXIgbm90aWNlcyByb3V0aW5nIGNvbmZpZyB1cGRhdGVzLlxuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ/OiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhpcyBzdG9yZSBhcHBsaWVzIGEgcm91dGluZyBjb25maWcgdG8gaXRzZWxmIChzdGFydHVwLCBhbiBvcGVyYXRvcidzIHdyaXRlLCBhIHBlZXIncyBjb3B5IGFycml2aW5nKSAtIHRoZSBzdG9yZSBpcyB0aGUgb25lIHRoYXQga25vd3Mgd2hlbiBhIGNvbmZpZyBsYW5kZWQsIGFuZCB0aGUgc2VydmVyIGFybXMgd2luZG93LWJvdW5kYXJ5IHNjYW5zIGZyb20gaXQuICovXG4gICAgICAgICAgICBvblJvdXRpbmdBcHBsaWVkPzogKHJvdXRpbmc6IFJlbW90ZUNvbmZpZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBBc2tzIHRoZSBjbGllbnQgd2hvc2UgcmVxdWVzdCBjcmVhdGVkIHRoaXMgc3RvcmUgd2hhdCByb3V0aW5nIGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUuIE9ubHkgdXNlZCB3aGVuIGluaXQgZmluZHMgTk8gY29uZmlndXJhdGlvbiBpbiBvdXIgZm9sZGVyOiBhIHN0b3JlIG9ubHkgZXZlciBleGlzdHMgYmVjYXVzZSBhIGNvbmZpZyBuYW1lcyBpdCwgc28gdGhlIHJlcXVlc3RlciBoYXMgdGhhdCBjb25maWcgLSBhc2tpbmcgZm9yIGl0IGxhemlseSBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyBwYXNzaW5nIHRoZSBjb25maWcgb24gZXZlcnkgY2FsbCwgd2l0aG91dCB0aGUgcGVyLWNhbGwga2lsb2J5dGVzLiAqL1xuICAgICAgICAgICAgcmVxdWVzdFJvdXRpbmdDb25maWc/OiAoKSA9PiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD47XG4gICAgICAgICAgICAvLyBFdmVyeSBhY2NlcHRlZCB3cml0ZSAoXCJvcmlnaW5hbFwiKSBhbmQgZXZlcnkgd3JpdGUgdGhhdCBhY3R1YWxseSByZWFjaGVkIHRoZSBzb3VyY2VzIChcImZsdXNoZWRcIikuIEZhc3Qgd3JpdGVzIGNvYWxlc2NlLCBzbyB0aGUgdHdvIGNvdW50cyBkaWZmZXIuXG4gICAgICAgICAgICBvbldyaXRlQ291bnRlZD86IChraW5kOiBcIm9yaWdpbmFsXCIgfCBcImZsdXNoZWRcIiwgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJzb3VyY2VzTGlzdC50eHRcIikpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPihwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwiYmxvYkluZGV4My5sb2dcIikpO1xuICAgICAgICB0aGlzLnN5bmMgPSBuZXcgU3RvcmVTeW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gbmV3IFN0b3JlQ29uZmlnKHN0b3JlTmFtZSwgW10pO1xuICAgICAgICB0aGlzLm93bkRpc2sgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgc3RvcmUncyBmb2xkZXIsIHVud3JhcHBlZDogdGhlIHNhbWUgYnl0ZXMgc2xvdCAwIHNlcnZlcywgYnV0IHJlYWNoZWQgd2l0aG91dCBpdHMgd3JpdGUgZGVsYXkuIFVzZWQgZm9yIHRoZSB0d28gdGhpbmdzIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBidWZmZXJlZCBzb3VyY2UgLSByZWFkaW5nIG91ciBvd24gcm91dGluZyBjb25maWcgYmVmb3JlIHdlIGhhdmUgYW55IHNvdXJjZXMsIGFuZCBzdHJlYW1pbmcgYSBsYXJnZSB1cGxvYWQgdGhhdCBtdXN0IG5vdCBzaXQgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgb3duRGlzazogQXJjaGl2ZXNEaXNrO1xuXG4gICAgLyoqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlLiBJdCBvd25zIHRoaXM6IHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIGZpbGUgSU4gdGhlIHN0b3JlLCBzbyB0aGUgc3RvcmUgcmVhZHMgaXQsIGFwcGxpZXMgaXQgdG8gaXRzZWxmLCBhbmQgcmUtYXBwbGllcyBpdCB3aGVuZXZlciB0aGUgZmlsZSBjaGFuZ2VzIC0gYnkgb3VyIG93biB3cml0ZSwgb3IgYnkgYSBwZWVyJ3MgY29weSBhcnJpdmluZyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgc3RvcmVDb25maWc6IFN0b3JlQ29uZmlnO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGxhc3QgYXBwbGllZCwgc28gYSB3cml0ZSBvZiBhbiBpZGVudGljYWwgKG9yIG9sZGVyKSBvbmUgaXMgbm90IHJlLWFwcGxpZWRcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IC0xO1xuICAgIC8vIC4uLmFuZCB0aGUgY29uZmlnIGl0c2VsZiwgc28gYSByZWplY3Rpb24gY2FuIHNheSBleGFjdGx5IHdoYXQgdGhlIHN0b3JlIElTIHJ1bm5pbmcgaW5zdGVhZCBvZiBndWVzc2luZ1xuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vICNyZWdpb24gTWFpbiBpbnRlcmZhY2VcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIENvbmZpZ3VyZSBmaXJzdDogdGhlIGNvbmZpZyBkZWNpZGVzIHdoYXQgdGhlIHNvdXJjZXMgQVJFLCBhbmQgZXZlcnl0aGluZyBiZWxvdyBpcyBwZXIgc291cmNlLiBXaXRoIG5vIGNvbmZpZyBhdCBhbGwgdGhhdCBpcyBqdXN0IG91ciBvd24gZGlzaywgd2hpY2ggaXMgZW5vdWdoIHRvIHNlcnZlIGFuZCB0byBiZSB3cml0dGVuIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAvLyBObyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXIgYXQgYWxsIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRoaXMgc3RvcmUgd2FzIGp1c3QgQ1JFQVRFRCBieSBhIHJlcXVlc3QsIGJlZm9yZSBhbnkgY29uZmlnIHdyaXRlIHJlYWNoZWQgaXQuIFRoZSByZXF1ZXN0ZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUsIHNvIGFzayBpdC5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCAmJiB0aGlzLmNvbmZpZz8ucmVxdWVzdFJvdXRpbmdDb25maWcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3ZpZGVkID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb247IHRoZSByZXF1ZXN0aW5nIGNsaWVudCBwcm92aWRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihwcm92aWRlZCl9IC0gYWRvcHRpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyYWlnaHQgb250byB0aGUgZGlzaywgbm90IHRocm91Z2ggc2V0KCk6IHNldCB3YWl0cyBmb3IgaW5pdCwgd2hpY2ggaXMgd2hhdCBpcyBydW5uaW5nIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHByb3ZpZGVkKSksIHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFza2luZyB0aGUgcmVxdWVzdGluZyBjbGllbnQgZm9yIHRoZSByb3V0aW5nIGNvbmZpZyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIC0gcnVubmluZyB1bmNvbmZpZ3VyZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/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/LmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpLiBUaGUgY2xpZW50IGlzIGFscmVhZHkgc3RyZWFtaW5nLCBzbyB0aGUgdXBsb2FkIGlzIGFjY2VwdGVkIGFuZCBldmVyeSBwYXJ0IGRpc2NhcmRlZCAtIHRoZSBhbHRlcm5hdGl2ZSBpcyB0aHJvd2luZyBhdCBhIGNhbGxlciB0aGF0IGRpZCBub3RoaW5nIHdyb25nLlxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBgJHtESVNDQVJERURfVVBMT0FEX1BSRUZJWH0ke3RoaXMubmV4dERpc2NhcmRlZFVwbG9hZCsrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRlZFVwbG9hZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgb2Zmc2V0PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5oYXMoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLmRhdGEsIGNvbmZpZy5vZmZzZXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBkaXNrLCBzb3VyY2VJbmRleCB9ID0gdGhpcy5nZXREaXNrU291cmNlKCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KSAtIGEgbmV3ZXIgdmFsdWUgY2FuIGxhbmQgd2hpbGUgYSBsb25nIHVwbG9hZCBpcyBzdGlsbCBzdHJlYW1pbmcsIHNvIHRoaXMgaXMgcmUtY2hlY2tlZCBoZXJlIHJhdGhlciB0aGFuIG9ubHkgYXQgdGhlIHN0YXJ0XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShjb25maWcucGF0aCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGRpc2suZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcucGF0aCwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGxldCBpbmZvID0gYXdhaXQgZGlzay5nZXRJbmZvKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShjb25maWcucGF0aCwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBJbnRlcm5hbHNcblxuICAgIC8qKiBCeXRlcyBvZiByZWFkIGNhY2hlIHRoZSBkaXNrIG1heSBob2xkOyBzZWUgQ29tbW9uQ29uZmlnLnJlYWRlckRpc2tMaW1pdCAoU3RvcmVTeW5jIGVuZm9yY2VzIGl0KS4gUmVhZCBmcm9tIHRoZSBjb25maWcgaW4gZWZmZWN0LCBzbyByYWlzaW5nIG9yIHJlbW92aW5nIHRoZSBsaW1pdCB0YWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgZXZpY3Rpb24gcGFzcy4gKi9cbiAgICBwdWJsaWMgZ2V0IHJlYWRlckRpc2tMaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZUNvbmZpZy5jdXJyZW50KCkucmVhZGVyRGlza0xpbWl0O1xuICAgIH1cblxuICAgIC8qKiBUaGUgd3JpdGUgdGltZSBhIG5ldyB3cml0ZSBoYXMgdG8gYmVhdCwgb3IgMCB3aGVuIHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgdGhlIGtleS4gQ291bnRzIERFTEVUSU9OUyB0b286IGEgd3JpdGUgb2xkZXIgdGhhbiB0aGUgZGVsZXRpb24gdGhhdCByZW1vdmVkIGl0IG11c3Qgbm90IGJyaW5nIGl0IGJhY2suIFRoZSBpbmRleCBpcyBhdXRob3JpdGF0aXZlIGV2ZW4gZm9yIGEgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gYSBkZWxheWVkIHNvdXJjZSwgc2luY2UgdGhlIGVudHJ5IGlzIHJlY29yZGVkIHdoZW4gdGhlIHdyaXRlIGlzIGFjY2VwdGVkIHJhdGhlciB0aGFuIHdoZW4gaXQgcmVhY2hlcyBzdG9yYWdlLiAqL1xuICAgIHB1YmxpYyBjdXJyZW50V3JpdGVUaW1lKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgudGltZU9mKGtleSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xpdmUoc291cmNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmlzTGl2ZShzb3VyY2VJbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyU2xvdChzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIGxldCByZWdpc3RyYXRpb24gPSB0aGlzLnNvdXJjZXNMaXN0LmVuc3VyZSh0aGlzLnNvdXJjZXNbc2xvdF0udXJsKS50aGVuKGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XSA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XSA9IHJlZ2lzdHJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgICB9XG5cbiAgICAvKiogVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzbG90IG5ldmVyIGdvdCB0aGF0IGZhciAoYSBzb3VyY2UgcmVtb3ZlZCBiZWZvcmUgaXRzIHJlZ2lzdHJhdGlvbiByZXNvbHZlZCkuICovXG4gICAgcHVibGljIHNsb3RTb3VyY2VzTGlzdEluZGV4KHNsb3Q6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgfVxuXG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QgLSBvbmx5IHZhbGlkIG9uY2UgdGhlIHNsb3QncyByZWdpc3RyYXRpb24gcmVzb2x2ZWQgKGluaXQgYW5kIHRoZSBzb3VyY2UncyBzeW5jIGxvb3AgZ3VhcmFudGVlIHRoYXQgYmVmb3JlIGFueSBpbmRleGluZyBoYXBwZW5zKVxuICAgIHB1YmxpYyBzb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNsb3Q6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHNsb3QgJHtzbG90fSAoJHt0aGlzLnNvdXJjZXNbc2xvdF0/LnVybH0pIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZXNMaXN0SW5kZXggeWV0IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxpdmUgc2xvdCBjdXJyZW50bHkgc2VydmluZyBhIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY29uZmlndXJlZCBzb3VyY2UgaGFzIHRoYXQgVVJMIGFueW1vcmUuIExpbmVhciwgYnV0IHRoZSBzb3VyY2VzIGxpc3QgaXMgdGlueSBhbmQgdGhpcyBpcyBhbHdheXMgY3VycmVudCAoc2xvdHMgZHlpbmcsIG9yIHNldmVyYWwgc2xvdHMgc2hhcmluZyBvbmUgVVJMIGFjcm9zcyB2YWxpZCB3aW5kb3dzLCBuZWVkIG5vIGJvb2trZWVwaW5nKS5cbiAgICBwdWJsaWMgc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoc291cmNlc0xpc3RJbmRleDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbaV0gPT09IHNvdXJjZXNMaXN0SW5kZXggJiYgdGhpcy5pc0xpdmUoaSkpIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIElBcmNoaXZlcyBjdXJyZW50bHkgaG9sZGluZyBhbiBlbnRyeSdzIGJ5dGVzOiB0aGUgbGl2ZSBzbG90IHdoZW4gdGhlIGhvbGRlciBpcyBzdGlsbCBjb25maWd1cmVkLCBvdGhlcndpc2UgcmVzb2x2ZWQgKGNhY2hlZCkgc3RyYWlnaHQgZnJvbSBpdHMgcGVyc2lzdGVkIFVSTCAtIHdpbmRvd3Mvcm91dGVzIGRlY2lkZSB3aGVuIGEgc291cmNlIGlzIHNjYW5uZWQgb3Igd3JpdHRlbiwgYnV0IGZvciByZWFkaW5nIGJ5dGVzIHdlIGtub3cgaXQgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoXG4gICAgcHVibGljIGFzeW5jIGdldEVudHJ5SG9sZGVyKGVudHJ5OiBJbmRleEVudHJ5KTogUHJvbWlzZTxJQXJjaGl2ZXMgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpIHx8IGF3YWl0IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsUmVsb2FkaW5nKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5yZXNvbHZlU291cmNlVXJsPy4odXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5sb2FkKCk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIChzZWUgU3RvcmVTeW5jJ3Mgc2NhbiBoYW5kbGluZyksIGFuZCBhIGxvYWRlZCBidWNrZXQgYWx3YXlzIGhhcyBpdCB0aGVyZSAtIGEgcGVyc2lzdGVkIGVudHJ5IHBvaW50aW5nIGVsc2V3aGVyZSBpcyBzdGFsZSwgc28gaXQgaXMgY29ycmVjdGVkIG9uY2UsIGhlcmVcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmdldEluZGV4RW50cnkoUk9VVElOR19GSUxFKTtcbiAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICBpZiAocm91dGluZyAmJiByb3V0aW5nLnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoUk9VVElOR19GSUxFLCB7IHdyaXRlVGltZTogcm91dGluZy53cml0ZVRpbWUsIHNpemU6IHJvdXRpbmcuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogYmFzZVNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIHdlIGhvbGQuIEEgZGVsZXRlZCBvbmUgaXMgbm90IG9uZTogaXQgaXMgYSB0b21ic3RvbmUsIGFuZCBvbmx5IGdldERlbGV0ZWRFbnRyeSBrbm93cyBhYm91dCBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IEluZGV4RW50cnkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmluZGV4LmdldChrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBXaGVuIGEga2V5IHdhcyBkZWxldGVkLCBpZiBpdCB3YXMuIEEgZGVsZXRpb24gaXMgYW4gYWJzZW5jZSB3aXRoIGEgdGltZSBhdHRhY2hlZCAtIHRoYXQgdGltZSBpcyB3aGF0IG1ha2VzIGl0IHByb3BhZ2F0ZSBhbmQgd2hhdCBleHBpcmVzIGl0LiAqL1xuICAgIHB1YmxpYyBnZXREZWxldGVkRW50cnkoa2V5OiBzdHJpbmcpOiB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHRvbWJzdG9uZSA9IHRoaXMuaW5kZXguZ2V0RGVsZXRlZChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGZpbGUgd2UgaG9sZCwgZm9yIHRoZSBwYXNzZXMgdGhhdCB3YWxrIHRoZW0gYWxsIChsaXN0aW5ncywgc2NhbnMsIHJlY29uY2lsaWF0aW9uLCBldmljdGlvbikuIERlbGV0aW9ucyBhcmUgbm90IGluIGhlcmUgLSBzZWUgZGVsZXRlZEVudHJpZXMuIExpdmU6IGRlbGV0aW5nIGVudHJpZXMgd2hpbGUgaXRlcmF0aW5nIGlzIGV4cGVjdGVkIGhlcmUsIGFuZCBzYWZlLiAqL1xuICAgIHB1YmxpYyAqaW5kZXhFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgSW5kZXhFbnRyeV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXguZW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGRlbGV0aW9uIHdlIGtub3cgb2YuIEEgbXVjaCBzbWFsbGVyIHdhbGsgdGhhbiB0aGUgZmlsZXMsIHdoaWNoIGlzIHdoYXQgbWFrZXMgZXhwaXJpbmcgdGhlbSBjaGVhcC4gKi9cbiAgICBwdWJsaWMgKmRlbGV0ZWRFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGZpbGVzIHdlIGhvbGQsIGRlbGV0aW9ucyBleGNsdWRlZC4gKi9cbiAgICBwdWJsaWMgaW5kZXhTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnNpemU7XG4gICAgfVxuXG4gICAgLyoqIFRvdGFscyBvdmVyIHRoZSBmaWxlcyB3ZSBob2xkLCBicm9rZW4gZG93biBieSB0aGUgc2xvdCBob2xkaW5nIGVhY2ggKGVudHJpZXMgY2FuIG5hbWUgYSBzb3VyY2UgdGhhdCBpcyBubyBsb25nZXIgY29uZmlndXJlZCwgd2hpY2ggY291bnRzIHRvd2FyZHMgdGhlIHRvdGFsIGJ1dCBubyBzbG90KS4gKi9cbiAgICBwdWJsaWMgaW5kZXhUb3RhbHMoKTogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNsb3RzOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB7XG4gICAgICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IHNsb3RzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAoeyBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IFssIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5maWxlQ291bnQrKztcbiAgICAgICAgICAgIHNsb3RzW3Nsb3RdLmJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBzbG90cyB9O1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgZmlsZSwgYXMgb2YgaXRzIHdyaXRlIHRpbWUuIFJldHVybnMgZmFsc2UsIGhhdmluZyBjaGFuZ2VkIG5vdGhpbmcsIHdoZW4gd2UgYWxyZWFkeSBrbm93IHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgLSB0aGUgaW5kZXggY2Fubm90IGJlIG1hZGUgdG8gZ28gYmFja3dhcmRzLCB3aGljaGV2ZXIgcGF0aCB0aGUgd3JpdGUgY2FtZSBpbiBieS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZywgZW50cnk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgc291cmNlc0xpc3RJbmRleDogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LnNldChrZXksIHsgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogZW50cnkuc291cmNlc0xpc3RJbmRleCB9LCBlbnRyeS53cml0ZVRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBsYW5kaW5nIGhlcmUgLSB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yLCBvciBwdWxsZWQgb2ZmIGEgcGVlciBieSBzeW5jaHJvbml6YXRpb24gLSBpcyBob3cgdGhpcyBzdG9yZSBsZWFybnMgd2hhdCBpdCBpcyBtZWFudCB0byBiZVxuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zeW5jU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgREVMRVRJT04sIGFzIG9mIGl0cyB0aW1lOiB0aGUga2V5IHN0b3BzIGV4aXN0aW5nIGhlcmUsIGFuZCB0aGUgdG9tYnN0b25lIGlzIHdoYXQgbWFrZXMgdGhhdCBmYWN0IHByb3BhZ2F0ZSBhbmQgcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLiBTYW1lIG9yZGVyaW5nIHJ1bGUgYXMgc2V0SW5kZXhFbnRyeS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhEZWxldGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXguZGVsZXRlKGtleSwgd3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRm9yZ2V0cyBhIGtleSBlbnRpcmVseSwgdG9tYnN0b25lIGluY2x1ZGVkLiBOT1QgYSBkZWxldGlvbjogaXQgc2F5cyBub3RoaW5nIGhhcHBlbmVkIHRvIHRoZSBmaWxlLCBvbmx5IHRoYXQgd2Ugbm8gbG9uZ2VyIGtub3cgYW55dGhpbmcgYWJvdXQgaXQgLSBmb3IgYW4gZW50cnkgd2hvc2UgaG9sZGVyIHR1cm5lZCBvdXQgbm90IHRvIGhhdmUgaXQsIGFuZCBmb3IgYSB0b21ic3RvbmUgb2xkIGVub3VnaCB0aGF0IGV2ZXJ5b25lIGhhcyBoZWFyZC4gKi9cbiAgICBwdWJsaWMgcHVyZ2VJbmRleEVudHJ5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5kZXgucHVyZ2Uoa2V5KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgdmFsaWRhdGlvbiAoZnJvbSB0aGlzIHN0b3JlJ3Mgb3duIHJvdXRpbmcgZW50cmllcykg4pSA4pSAXG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSB3cml0ZSwgaG93ZXZlciBpdCBpcyBzdGFtcGVkLCBoYXMgdG8gYmUgb25lIHdlIGFyZSBhY3R1YWxseSBtZWFudCB0byBob2xkIC0gYmVjYXVzZSB0aGVcbiAgICAgKiBhbHRlcm5hdGl2ZSBpcyBub3QgYSBzbWFsbGVyIHByb2JsZW0sIGl0IGlzIGEgc2lsZW50IG9uZS4gQSB3cml0ZSB0aGF0IGxhbmRzIG9uIGEgc3RvcmUgdGhhdFxuICAgICAqIGRvZXMgbm90IHNlcnZlIGl0cyByb3V0ZSAob3Igb24gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgaW4gdGhlIGJ1Y2tldCdzIGNvbmZpZyBhdCBhbGwpIGdvZXMgaW50byBhXG4gICAgICogZm9sZGVyIG5vdGhpbmcgc2NhbnMgYW5kIG5vIHBlZXIgcmVjb25jaWxlczogaXQgc3VjY2VlZHMsIGFuZCB0aGVuIGl0IGlzIGdvbmUuIFRoZSBtYXJrZXJzIG1ha2VcbiAgICAgKiB0aGUgY2xpZW50IHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGFuZCByZXRyeSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcmlnaHQgb3V0Y29tZSB3aGVuIHRoZVxuICAgICAqIHJlYXNvbiBpdCBhaW1lZCBoZXJlIGlzIHRoYXQgaXRzIGNvbmZpZyB3YXMgc3RhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRXcml0ZVRhcmdldChrZXk6IHN0cmluZywgcm91dGU6IG51bWJlciwgbGFzdE1vZGlmaWVkOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHRoaXMudW5jb25maWd1cmVkRGV0YWlsKCk7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0NPTkZJR1VSRUR9IENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH0gRGF0YSB3cml0dGVuIHRvIGEgc3RvcmUgd2l0aCBubyBjb25maWd1cmF0aW9uIGVudHJ5IHdvdWxkIG5ldmVyIGJlIHNjYW5uZWQgb3IgcmVjb25jaWxlZCwgc28gYWNjZXB0aW5nIGl0IHdvdWxkIHNpbGVudGx5IGxvc2UgaXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5IC0gb3IsIGlmIHRoaXMgc3RvcmUgaXMgZ2VudWluZWx5IG1lYW50IHRvIHRha2UgdGhpcyB3cml0ZSwgd3JpdGUgdGhlIGJ1Y2tldCdzIHJvdXRpbmcgY29uZmlnIHdpdGggYW4gZW50cnkgbmFtaW5nIGl0IG9uIHRoaXMgc2VydmVyLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5LCBEYXRlLm5vdygpLCByb3V0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzdGFtcGVkIHdyaXRlIHBpY2tlZCBpdHMgb3duIHRpbWUsIHNvIG5vIHdpbmRvdyBjYW4ganVkZ2UgaXQgKHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIGEgc3luY2hyb25pemVkIHdyaXRlKSAtIGJ1dCB0aGUgUk9VVEUgaXMgbm90IGEgbWF0dGVyIG9mIHRpbWluZywgYW5kIGEgc3RhbXBlZCB3cml0ZSB0byB0aGUgd3Jvbmcgc2hhcmQgaXMgZXhhY3RseSBhcyBpbnZpc2libGUgYXMgYSBmcmVzaCBvbmVcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkgcmV0dXJuO1xuICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHN0YW1wZWQgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHJvdXRlIHdlIHNlcnZlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc3RvcmUgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICB9XG5cbiAgICAvKiogRXhhY3RseSB3aHkgdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyaWVzIC0gd2hpY2ggb2YgdGhlIHRocmVlIHBvc3NpYmxlIHJlYXNvbnMgaXQgaXMsIHdpdGggdGhlIHZhbHVlcyB0aGF0IGRlY2lkZWQgaXQsIGJlY2F1c2UgXCJub3QgY29uZmlndXJlZFwiIGFsb25lIGlzIHVuZGlhZ25vc2FibGUuICovXG4gICAgcHJpdmF0ZSB1bmNvbmZpZ3VyZWREZXRhaWwoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmFwcGxpZWRSb3V0aW5nO1xuICAgICAgICBsZXQgaWRlbnRpdHkgPSBgc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pYDtcbiAgICAgICAgaWYgKCFyb3V0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGhhcyBubyByb3V0aW5nIGNvbmZpZyBhdCBhbGwgLSBub3RoaW5nIGhhcyBldmVyIHdyaXR0ZW4gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBpbnRvIGl0LmA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iamVjdHMgPSByb3V0aW5nLnNvdXJjZXMuZmlsdGVyKHggPT4gdHlwZW9mIHggIT09IFwic3RyaW5nXCIpIGFzIFNvdXJjZUNvbmZpZ1tdO1xuICAgICAgICBsZXQgbmFtZWQgPSBvYmplY3RzLmZpbHRlcih4ID0+IHgubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUpO1xuICAgICAgICBpZiAoIW5hbWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hpY2ggaGFzIG5vIGVudHJ5IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoaXRzIGVudHJpZXMgYXJlIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0cy5tYXAoeCA9PiB4Lm5hbWUpKX0pLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hvc2UgJHtuYW1lZC5sZW5ndGh9IGVudHIke25hbWVkLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gcG9pbnQocykgYXQgJHtKU09OLnN0cmluZ2lmeShuYW1lZC5tYXAoeCA9PiB4LnVybCkpfSAtIG5vbmUgb2Ygd2hpY2ggaXMgVEhJUyBzZXJ2ZXIsIHNvIHRoZSBjb25maWcgc2F5cyB0aGlzIHN0b3JlIGxpdmVzIGVsc2V3aGVyZS5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSByb3V0aW5nIGNvbmZpZyBtYXkgYmUgd3JpdHRlbiBoZXJlLiBUd28gcnVsZXMsIGFuZCB0aGlzIGlzIHRoZSBvbmUgcGxhY2UgZWl0aGVyIGlzXG4gICAgICogYXBwbGllZCAtIGEgY29uZmlnIG9ubHkgZXZlciBlbnRlcnMgdGhlIHN5c3RlbSB0aHJvdWdoIGEgd3JpdGUsIHNvIGEgY29uZmlnIHRoYXQgZ290IGluIGlzIGFcbiAgICAgKiBjb25maWcgdGhhdCBwYXNzZWQsIGFuZCByZWFkaW5nIG9uZSBiYWNrIG5ldmVyIGp1ZGdlcyBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIFRoZSBjb25maWcgaGFzIHRvIGJlIHZhbGlkIGFzIGEgd2hvbGUgKHNlZSBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyksIGFuZCBpdCBoYXMgdG8gb3V0cmFuayB3aGF0XG4gICAgICogd2UgYXJlIHJ1bm5pbmc6IHRoZSBzYW1lIHZlcnNpb24gbWVhbnMgdGhlIHNhbWUgY29uZmlnLCBzbyByZS13cml0aW5nIGl0IGlzIGhhcm1sZXNzLCBidXQgYVxuICAgICAqIGxvd2VyIG9uZSBpcyBhbiBvbGRlciBjb25maWcgYXJyaXZpbmcgbGF0ZSBhbmQgbXVzdCBuZXZlciB1bmRvIGEgbmV3ZXIgb25lLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKHJvdXRpbmcpO1xuICAgICAgICBsZXQgaW5jb21pbmcgPSBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucm91dGluZ1ZlcnNpb24oKTtcbiAgICAgICAgaWYgKGluY29taW5nID49IGN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWZ1c2luZyB0byB3cml0ZSAke1JPVVRJTkdfRklMRX0gdG8gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0cyB2ZXJzaW9uICgke2luY29taW5nfSkgaXMgb2xkZXIgdGhhbiB0aGUgb25lIHRoaXMgc3RvcmUgaXMgcnVubmluZyAoJHtjdXJyZW50fSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuYCk7XG4gICAgfVxuXG4gICAgLy8gQSBmcmVzaCAodW5zdGFtcGVkKSB3cml0ZSBtdXN0IGxhbmQgb24gdGhlIG5vZGUgdGhlIGNvbmZpZyBjdXJyZW50bHkgcG9pbnRzIGF0OiB0aGUgbWFya2VycyB0ZWxsIHRoZSBjbGllbnQgaXRzIGNvbmZpZyBpcyBzdGFsZSwgc28gaXQgcmUtcmVzb2x2ZXMgYW5kIHJldHJpZXMgYWdhaW5zdCB0aGUgcmlnaHQgbm9kZSBpbnN0ZWFkIG9mIHVzIHNpbGVudGx5IGFjY2VwdGluZyBkYXRhIHdlIHdlcmUgbmV2ZXIgbWVhbnQgdG8gaG9sZC5cbiAgICBwcml2YXRlIGFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCB0aW1lVmFsaWQgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9IChhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldClgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV30gQ2Fubm90IHdyaXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06IGl0cyB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGV2ZXJ5IHZhbGlkIHdpbmRvdyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKHdpbmRvd3M6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9LCBmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIC0gYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIG91ciByb3V0ZXMgJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9IGF0IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzdG9yZSBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGtleSl9LCBvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9LCBzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhc3NlcnRNdXRhYmxlKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIGdldFJvdXRlKGtleSkpO1xuICAgICAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgc3RvcmUgaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gYWxyZWFkeSBleGlzdHMsIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIHRvIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgc3RvcmUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgIHByaXZhdGUgYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBjb3ZlcmVkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IHJlamVjdGVkOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGF0IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgd2luZG93L3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3I6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSByZWFkOiBwdXJlbHkgdGhlIGxvY2FsIGRpc2ssIGNvbXBsZXRlbHkgc2hvcnQtY2lyY3VpdGluZyB0aGUgaW5kZXggYW5kIGhvbGRlciByZXNvbHV0aW9uIC0gdGhlIGNhbGxlciBpcyBhbm90aGVyIHN0b3JlLCBhbmQgY2hhc2luZyBPVVIgcmVtb3RlIGhvbGRlcnMgd2hpbGUgYW5zd2VyaW5nIGl0IGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gTm8gd2luZG93IG9yIHJvdXRlIGNoZWNrczogaWYgdGhlIGJ5dGVzIGFyZSBvbiBvdXIgZGlzaywgdGhlIGNhbGxlciBtYXkgaGF2ZSB0aGVtLiBOb3RlIHRoaXMgcmVhZHMgdGhlIGRpc2sgcGFzdCBhbnkgd3JpdGUgZGVsYXksIHNvIGEgZmFzdCB3cml0ZSBzdGlsbCBidWZmZXJlZCBpbiBtZW1vcnkgaXMgaW52aXNpYmxlIGhlcmU7IHRoZSBjYWxsZXIgcmUtZmluZHMgaXQgb25jZSBpdCBmbHVzaGVzLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW50ZXJuYWwyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXMgZm9yd2FyZHMgdG8gdGhlIGRpc2s6IGEgZmxhZy1jYWxsZXIgKGEgcGVlciBzdG9yZSdzIHN5bmNocm9uaXphdGlvbikgbmVlZHMgdG8gc2VlIG91ciBkZWxldGlvbnMsIG5vdCBqdXN0IG91ciBjb250ZW50LiBBIHRvbWJzdG9uZSBkZWxldGVkIGZyb20gZGlzayBlbnRpcmVseSBvbmx5IGxpdmVzIGluIG91ciBpbmRleCwgc28gZmFsbCBiYWNrIHRvIHRoYXQuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmdldDIoY29uZmlnLnBhdGgsIHsgcmFuZ2U6IGNvbmZpZy5yYW5nZSwgaW5jbHVkZVRvbWJzdG9uZXM6IGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcyB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShjb25maWcucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9O1xuICAgIH1cblxuICAgIC8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHdyaXRlOiB0aGUgbG9jYWwgZGlzayBwbHVzIG91ciBpbmRleCwgd2l0aCBOTyBkb3duc3RyZWFtIGZhbi1vdXQgLSB0aGUgcHVzaGluZyBzdG9yZSBvd25zIHByb3BhZ2F0aW9uLCBhbmQgZmFubmluZyBpdHMgcHVzaGVzIGJhY2sgb3V0IGlzIGhvdyB3cml0ZSBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtLiBPbmx5LXRha2UtbGF0ZXN0IHN0aWxsIGFwcGxpZXMgaGVyZS4gKi9cbiAgICBwcml2YXRlIGFzeW5jIHNldEludGVybmFsKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZzogeyBsYXN0TW9kaWZpZWQ6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSkgcmV0dXJuO1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gc3RvcmVzIG5vdGhpbmcgb24gb3VyIG93biBzb3VyY2UgLSB0aGUgdG9tYnN0b25lIGlzIHRoZSB3aG9sZSBvZiBpdFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2hhcmVkIGVuZ2luZSBvZiBzZXQgYW5kIGRlbDogYW4gZW1wdHkgYnVmZmVyIGlzIGV4YWN0bHkgYSBkZWxldGlvbiBoZXJlLCB3aGljaCBpcyB3aHkgdGhlIGVtcHR5LWJ1ZmZlciByZWplY3Rpb24gbGl2ZXMgaW4gc2V0ICh0aGUgcHVibGljIEFQSSksIG5vdCBpbiB0aGlzIG1hY2hpbmVyeVxuICAgIHByaXZhdGUgYXN5bmMgc2V0T3JEZWxldGUoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwib3JpZ2luYWxcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnLmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCB3cml0ZXMgYXJlIG5vdCBoYW5kbGVkIGhlcmU6IGEgc291cmNlIHRoYXQgd2FzIGNvbmZpZ3VyZWQgd2l0aCBhIHdyaXRlIGRlbGF5IGJ1ZmZlcnMgdGhlbSBpdHNlbGYgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpLCBzbyB0aGlzIHdyaXRlIGxhbmRzIGluIG1lbW9yeSBhbmQgcmV0dXJucywgZXhhY3RseSBhcyBpdCB3b3VsZCBoYXZlLiBUaGUgaW5kZXggaXMgdXBkYXRlZCBlaXRoZXIgd2F5LCBzbyB0aGUgd3JpdGUgaXMgaW1tZWRpYXRlbHkgdmlzaWJsZSB0byByZWFkZXJzIG9mIHRoaXMgc3RvcmUuXG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCBsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbnN0YW50IGV2ZXJ5IGRlbGF5ZWQgd3JpdGUgbXVzdCBiZSBvbiBpdHMgc291cmNlOiB0aGUgZW5kIG9mIG91ciBvd24gd3JpdGUgd2luZG93IHRoYXQgY29udGFpbnMgbm93LCBtaW51cyB0aGUgZmx1c2ggbWFyZ2luIChzbyB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgZmluZHMgdGhlIGRhdGEgb24gaGFuZG9mZikuIFRoZSBMQVRFU1QgZW5kIGFtb25nIGNvdmVyaW5nIHdpbmRvd3MgLSBvdmVybGFwcGluZyB3aW5kb3dzIGhhbmQgb2ZmIGF0IHRoZSBsYXN0IG9uZS4gTm8gd2luZG93IGNvbnRhaW5zIG5vdyAoYW4gaW5lcnQgc3RvcmUsIG9yIGEgbW9tZW50IGJldHdlZW4gb3VyIHdpbmRvd3MpIC0+IDAsIGkuZS4gbm90aGluZyBtYXkgYmUgZGVsYXllZCBhdCBhbGwuICovXG4gICAgcHVibGljIHdyaXRlRmx1c2hEZWFkbGluZSgpOiBudW1iZXIge1xuICAgICAgICAvLyBCZWZvcmUgdXBkYXRlU291cmNlcyBoYXMgcnVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gaG9sZCBhIHdyaXRlIGFueXdheSwgYW5kIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWRcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXMubGVuZ3RoKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCB3IG9mIHRoaXMuc291cmNlc1swXS52YWxpZFdpbmRvd3MpIHtcbiAgICAgICAgICAgIGlmICh3WzBdIDw9IG5vdyAmJiBub3cgPCB3WzFdKSBlbmQgPSBNYXRoLm1heChlbmQsIHdbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5kKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIGVuZCAtIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JpdGFibGVTb3VyY2VzKGNvbmZpZz86IHsgaWdub3JlV2luZG93PzogYm9vbGVhbiB9KTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgd3JpdGFibGU6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd3NBY2NlcHRXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgd3JpdGFibGUucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGFibGU7XG4gICAgfVxuXG4gICAgLy8gT3VyIG93biBzb3VyY2UgKHRoZSBmaXJzdCB3cml0YWJsZSBvbmUpIHBsdXMgZXZlcnkgcm91dGUtbWF0Y2hpbmcgcGVlci4gRWFjaCBzb3VyY2UgZGVjaWRlcyBmb3IgaXRzZWxmIGhvdyBsb25nIGl0IGhvbGRzIHRoZSB3cml0ZSBiZWZvcmUgaXQgaGl0cyBzdG9yYWdlIChzZWUgQXJjaGl2ZXNEZWxheWVkKSAtIGhlcmUgdGhleSBhbGwganVzdCBnZXQgd3JpdHRlbi5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlczogdGhlIHdyaXRlciB3cml0ZXMgaXQgZGlyZWN0bHkgdG8gZWFjaCBub2RlLCBzbyB3ZSBzdG9yZSBpdCBvbiBvdXIgb3duIGRpc2sgb25seSAobm8gdmFsaWQtd2luZG93IGZpbHRlciAtIHJvdXRpbmcvdmFsaWQgd2luZG93cyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byB0aGUgZmlsZSBkZWZpbmluZyB0aGVtKSBhbmQgbmV2ZXIgZm9yd2FyZCBpdCB0byBvdGhlciBzb3VyY2VzLlxuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcImZsdXNoZWRcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgaXNSb3V0aW5nID0ga2V5ID09PSBST1VUSU5HX0ZJTEU7XG4gICAgICAgIGxldCB3cml0YWJsZSA9IHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKHsgaWdub3JlV2luZG93OiBpc1JvdXRpbmcgfSk7XG4gICAgICAgIGxldCBmaXJzdCA9IHdyaXRhYmxlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyAoZXZlcnkgc291cmNlJ3MgdmFsaWQgd2luZG93IGlzIGluIHRoZSBwYXN0KSwgc28gd3JpdGVzIGNhbm5vdCBiZSBzdG9yZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgb3VyIG93biAoZmlyc3QpIHNvdXJjZSBibG9ja3MgdGhlIHdyaXRlLiBEb3duc3RyZWFtIHNvdXJjZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIGJhY2tncm91bmQ6IGEgZG93biBkb3duc3RyZWFtIHNvdXJjZSBtdXN0IG5vdCBmYWlsIG9yIHN0YWxsIHdyaXRlcywgYW5kIHJlY29uY2lsaWF0aW9uIHJlLXNlbmRzIGFueXRoaW5nIHRoZXkgbWlzc2VkIG9uY2UgdGhleSBjb21lIGJhY2suXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSB0b21ic3RvbmUgaXMgdGhlIHdob2xlIG9mIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWUsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoZmlyc3QpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JvdXRpbmcpIHJldHVybjtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERlbGV0aW9ucyB0cmF2ZWwgYXMgZGVsIGNhcnJ5aW5nIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIChuZXZlciBhcyBlbXB0eSBzZXRzIC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycykuIEJhY2tibGF6ZSBtYXRlcmlhbGl6ZXMgc3VjaCBkZWxzIGFzIHJlYWwgZW1wdHkgZmlsZXMsIHNvIGl0cyBsaXN0aW5ncyBzdGlsbCBzaG93IHRoZSBkZWxldGlvbiBmb3Igb3RoZXIgc3RvcmVzIHRvIHNjYW4gaW4gYXMgYSB0b21ic3RvbmUuXG4gICAgICAgICAgICBsZXQgcHVzaDogUHJvbWlzZTx1bmtub3duPjtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHdyaXRlIG9mICR7a2V5fSB0byBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3QgMCBpcyBhbHdheXMgdGhpcyBzdG9yZSdzIG93biBmb2xkZXIgKHNlZSBwbGFuU291cmNlcyksIHNvIHRoZSBkaXNrIGlzIGtub3duIHdpdGhvdXQgc2VhcmNoaW5nIGZvciBpdCAtIGFuZCBpdCBpcyB0aGUgdW53cmFwcGVkIG9uZSwgcGFzdCBhbnkgd3JpdGUgZGVsYXlcbiAgICBwcml2YXRlIGdldERpc2tTb3VyY2UoKTogeyBkaXNrOiBBcmNoaXZlc0Rpc2s7IHNvdXJjZUluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7IGRpc2s6IHRoaXMub3duRGlzaywgc291cmNlSW5kZXg6IDAgfTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgc3RpbGwgaGVsZCBieSBhIGRlbGF5ZWQgc291cmNlIChzZWUgQXJjaGl2ZXNEZWxheWVkKS4gZm9yY2UgYWxzbyB3cml0ZXMgd2hhdCBpc24ndCBkdWUgeWV0IC0gc2h1dGRvd24gY2Fubm90IGxlYXZlIHdyaXRlcyBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaERlbGF5ZWRXcml0ZXMoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IHsgc291cmNlIH0gb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgZGVsYXllZCA9IGFzRGVsYXllZChzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFkZWxheWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5ZWQuZmx1c2goZm9yY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxufVxuIl19
960
- /* _JS_SOURCE_HASH = "4aec7d0db36662d884c3fbb76e1560eb32b809c2ff3a2f660447a5d927fefe90"; */
964
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELDRDQUdzQjtBQUN0QixrREFBbUU7QUFDbkUsaURBQW1OO0FBQ25OLDJDQUE0QztBQUM1Qyx1REFBcUQ7QUFDckQsd0RBQXFEO0FBQ3JELCtDQUE0QztBQUM1QywyQ0FBd0M7QUFDeEMsK0NBQTRDO0FBQzVDLHVEQUE2RDtBQUU3RCxxZ0JBQXFnQjtBQUVyZ0IsbU5BQW1OO0FBQ3RNLFFBQUEsdUJBQXVCLEdBQUcsbUJBQVksR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzVDLDJHQUEyRztBQUMzRyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQztBQW9DN0MsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsU0FBUyx1QkFBdUIsQ0FBQyxPQUFlO0lBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixHQUFHLHlCQUF5QjtRQUFFLE9BQU87SUFDeEUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELHVXQUF1VztBQUN2VyxNQUFhLFNBQVM7SUFxQmxCO0lBQ0ksOERBQThEO0lBQ3ZELE1BQWM7SUFDckIsMktBQTJLO0lBQ3BLLFNBQWlCLEVBQ2hCLE1BbUJQO1FBdEJNLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBbUJiO1FBNUNMLGNBQWM7UUFDZCwwR0FBMEc7UUFDbkcsWUFBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFD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UztZQUN2QixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7Q0FHSjtBQS83QkQsOEJBKzdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVzU3luY1N0YXR1cywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBGaW5kQ29uZmlnLCBIb3N0ZWRDb25maWcsIFJlbW90ZUNvbmZpZywgU291cmNlQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLCBTeW5jQWN0aXZpdHksIEZVTExfUk9VVEUsIEZVTExfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgU1RPUkFHRV9OT1RfQ09ORklHVVJFRCxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrLCBhcHBseUZpbmRJbmZvU2hhcGUgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiwgcGFyc2VSb3V0aW5nRGF0YSwgc2VyaWFsaXplUmVtb3RlQ29uZmlnLCBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZywgZ2V0Q29uZmlnVmVyc2lvbiwgc291cmNlSWRlbnRpdHksIHNvdXJjZVBlcnNpc3RlbnRVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IHNlbGVjdEVudHJ5QXQgfSBmcm9tIFwiLi9zdG9yZVBsYW5cIjtcbmltcG9ydCB7IHNvdXJjZVdyaXRlRGVsYXkgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uRmlsZSB9IGZyb20gXCIuLi9UcmFuc2FjdGlvbkZpbGVcIjtcbmltcG9ydCB7IFNvdXJjZXNMaXN0IH0gZnJvbSBcIi4vc291cmNlc0xpc3RcIjtcbmltcG9ydCB7IFN0b3JlU3luYyB9IGZyb20gXCIuL3N0b3JlU3luY1wiO1xuaW1wb3J0IHsgU3RvcmVDb25maWcgfSBmcm9tIFwiLi9zdG9yZUNvbmZpZ1wiO1xuaW1wb3J0IHsgYXNEZWxheWVkLCB1bndyYXBEZWxheWVkIH0gZnJvbSBcIi4vQXJjaGl2ZXNEZWxheWVkXCI7XG5cbi8vIFRoZSBzdG9yYWdlIGVuZ2luZSBvZiB0aGUgcmVtb3RlIHN0b3JhZ2Ugc2VydmVyLiBEYXRhIGxpdmVzIGluIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzIChhdCBtaW5pbXVtIGFuIEFyY2hpdmVzRGlzaywgdGhlIGxvY2FsIGRpc2spOyBCbG9iU3RvcmUga2VlcHMgYW4gaW5kZXggb2YgZXZlcnkgZmlsZSAocGF0aCwgbGFzdCBtb2RpZmllZCB0aW1lLCBzaXplLCBhbmQgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YSkgaW4gYSBCdWxrRGF0YWJhc2UyLCBhbmQgYW5zd2VycyBldmVyeSByZWFkIGZyb20gaXQgKHNlZSBBcmNoaXZlc1NvdXJjZSBpbiBJQXJjaGl2ZXMudHMpLiBLZWVwaW5nIHRoYXQgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXMgaXMgU3RvcmVTeW5jJ3Mgam9iLCBub3QgdGhpcyBmaWxlJ3M7IHdoYXQgbGl2ZXMgaGVyZSBpcyB0aGUgaW5kZXggaXRzZWxmLCByZWFkcywgd3JpdGVzLCBhbmQgdGhlIHZhbGlkYXRpb24gYSB3cml0ZSBoYXMgdG8gcGFzcy5cblxuLy8gRmFzdCB3cml0ZXMgYXJlIG5ldmVyIGRlbGF5ZWQgcGFzdCBvdXIgb3duIHZhbGlkIHdpbmRvdywgYW5kIHdpdGhpbiB0aGlzIG1hcmdpbiBvZiB0aGUgd2luZG93J3MgZW5kIHRoZXkgd3JpdGUgdGhyb3VnaCBpbW1lZGlhdGVseSAtIHNvIHdoZW4gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIHRha2VzIG92ZXIsIHRoZSB3cml0ZXMgYXJlIGFscmVhZHkgb24gZGlza1xuZXhwb3J0IGNvbnN0IFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOID0gdGltZUluTWludXRlICogNTtcbmNvbnN0IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUgPSA2MCAqIDEwMDA7XG4vLyBNYXJrcyBhbiB1cGxvYWQgaWQgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBkaXNrLCBzbyBpdCBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIG9uZSBBcmNoaXZlc0Rpc2sgaGFuZGVkIG91dFxuY29uc3QgRElTQ0FSREVEX1VQTE9BRF9QUkVGSVggPSBcImRpc2NhcmRlZF9cIjtcblxuXG4vKiogV2hhdCB3ZSBzdG9yZSBhYm91dCBhIGZpbGUuIEl0cyB0aW1lcyBhcmUgbm90IGluIGhlcmU6IHRoZSBpbmRleCBrZWVwcyB0aG9zZSBmb3IgZXZlcnkga2V5LCBkZWxldGVkIG9uZXMgaW5jbHVkZWQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiAqL1xudHlwZSBJbmRleFZhbHVlID0ge1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiBPbmUgZmlsZSB3ZSBob2xkLCBhcyBldmVyeXRoaW5nIG91dHNpZGUgdGhlIGluZGV4IHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBJbmRleEVudHJ5ID0gSW5kZXhWYWx1ZSAmIHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkXG4gICAgY2hhbmdlZEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS51cmxcbiAgICB1cmw6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLmludGVybWVkaWF0ZVxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2Uuc291cmNlQ29uZmlnIChhYnNlbnQgZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlKVxuICAgIHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZztcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xuICAgIC8vIFRoZSBvcHBvc2l0ZSBjYXNlOiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBvbmx5IGl0cyBjb25maWcgY2hhbmdlZCwgc28gdGhlIFJVTk5JTkcgc291cmNlIGlzIGhhbmRlZCB0aGUgbmV3IG9uZSAoc2VlIGFwcGx5U291cmNlQ29uZmlnKVxuICAgIGFwcGx5Q29uZmlnPzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB2b2lkO1xufTtcblxubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xufVxuXG4vLyBUaGUgYnVja2V0IHN0b3JlLCBhbmQgdGhlIG9ubHkgb25lOiBldmVyeSBidWNrZXQgYSBzZXJ2ZXIgaG9sZHMgaXMgc2VydmVkIGJ5IHRoZXNlLCBvbmUgcGVyIHN0b3JlIG5hbWUgaW4gaXRzIHJvdXRpbmcgY29uZmlnLiBJdHMgc291cmNlcyBhcmUgcGxhaW4gSUFyY2hpdmVzIC0gdGhlIGZpcnN0IGlzIGFsd2F5cyB0aGUgc3RvcmUncyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgY29uZmlndXJlZCBwZWVycyAoc2VlIGNyZWF0ZVN0b3JlU291cmNlKSAtIHNvIFwibm8gc3luY2hyb25pemF0aW9uXCIgaXMgc2ltcGx5IGEgc3RvcmUgd2l0aCBubyBwZWVycywgbm90IGEgZGlmZmVyZW50IGtpbmQgb2Ygc3RvcmUuXG5leHBvcnQgY2xhc3MgQmxvYlN0b3JlIHtcbiAgICAvLyDilIDilIAgc3RhdGUg4pSA4pSAXG4gICAgLy8gU2V0IG9uY2UgdGhlIHN0b3JlIGlzIHNodXR0aW5nIGRvd247IGV2ZXJ5IGxvb3AgaXQgb3ducyAoYW5kIFN0b3JlU3luYydzIG1haW50ZW5hbmNlIGxvb3BzKSBzdG9wcyBvbiBpdFxuICAgIHB1YmxpYyBzdG9wcGVkID0geyBzdG9wOiBmYWxzZSB9O1xuICAgIC8vIFdoZXRoZXIgaW5pdCBoYXMgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgYSBuZXdseSBhZGRlZCBzb3VyY2UgY2FuIHN0YXJ0IHNjYW5uaW5nIGltbWVkaWF0ZWx5XG4gICAgcHVibGljIHN5bmNTdGFydGVkID0gZmFsc2U7XG4gICAgLyoqIEl0cyBzb3VyY2VzLCBpbiBjb25maWcgb3JkZXI6IHNsb3QgMCBpcyBhbHdheXMgaXRzIG93biBkaXNrIGZvbGRlciwgdGhlIHJlc3QgYXJlIHRoZSBwZWVycyBpdCBzeW5jaHJvbml6ZXMgd2l0aC4gRmlsbGVkIGJ5IHVwZGF0ZVNvdXJjZXMsIHdoaWNoIGlzIGFsc28gaG93IHRoZXkgY2hhbmdlLiBUaGUgc3RvcmUgT1dOUyB0aGVtIC0gd3JpdGVzIHBpY2sgYW1vbmcgdGhlbSwgcmVhZHMgcmVzb2x2ZSBob2xkZXJzIHRocm91Z2ggdGhlbSAtIGFuZCBTdG9yZVN5bmMgb25seSBzY2FucyB3aGF0ZXZlciBpcyBpbiBoZXJlIGF0IHRoZSB0aW1lLiAqL1xuICAgIHB1YmxpYyBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gW107XG4gICAgLy8gVXBsb2FkcyBpbW11dGFiaWxpdHkgYWxyZWFkeSBkZWNpZGVkIGFnYWluc3Q6IHRoZSBjbGllbnQgaXMgbWlkLXN0cmVhbSBieSB0aGUgdGltZSB3ZSBrbm93LCBzbyBpdCBrZWVwcyBzZW5kaW5nIGFuZCBldmVyeSBwYXJ0IGlzIGRyb3BwZWRcbiAgICBwcml2YXRlIGRpc2NhcmRlZFVwbG9hZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIG5leHREaXNjYXJkZWRVcGxvYWQgPSAxO1xuICAgIC8vIFRoZSBwZXJzaXN0ZW50IGlkZW50aXRpZXMgYmVoaW5kIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCAoc2VlIFNvdXJjZXNMaXN0KVxuICAgIHByaXZhdGUgc291cmNlc0xpc3Q6IFNvdXJjZXNMaXN0O1xuICAgIC8vIFBlciBzbG90OiB0aGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIHRoYXQgc2xvdCdzIFVSTCwgZmlsbGVkIGJ5IHJlZ2lzdGVyU2xvdCBiZWZvcmUgdGhlIHNsb3QncyBzeW5jIHJ1bnNcbiAgICBwcml2YXRlIHNsb3RTb3VyY2VzTGlzdEluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSBzbG90UmVnaXN0cmF0aW9uczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgLy8gRXZlcnkgZmlsZSB3ZSBrbm93IG9mLCBpbiBtZW1vcnksIHdpdGggYW4gYXBwZW5kLW9ubHkgbG9nIG9mIHRoZSBjaGFuZ2VzIGJlaGluZCBpdCAoc2VlIFRyYW5zYWN0aW9uRmlsZSkuIEEgbmV3IGZpbGUgbmFtZSBlYWNoIHRpbWUgdGhlIGVudHJ5IGZvcm1hdCBjaGFuZ2VzIGdlbmVyYXRpb246IHRoZSBwcmV2aW91cyBvbmVzIGNhbm5vdCBiZSByZWFkLCBhbmQgYSBzY2FuIHJlYnVpbGRzIHRoZSBpbmRleCBhbnl3YXksIHNvIHRoZXkgYXJlIHNpbXBseSBuZXZlciByZWFkIGFnYWluLlxuICAgIHByaXZhdGUgaW5kZXg6IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPjtcbiAgICAvKiogS2VlcGluZyB0aGUgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggdGhlIHNvdXJjZXM6IHNjYW5uaW5nLCBwdWxsaW5nLCBwdXNoaW5nLCBhbmQgdGhlIG1haW50ZW5hbmNlIHRoYXQgZm9sbG93cyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGRpc2stbGltaXQgZXZpY3Rpb24sIHRvbWJzdG9uZSBleHBpcnkpLiBJdCByZWFkcyBhbmQgd3JpdGVzIHRoaXMgc3RvcmUncyBpbmRleCBhbmQgc291cmNlcyAtIGl0IGRvZXMgbm90IG93biB0aGVtLiAqL1xuICAgIHB1YmxpYyBzeW5jOiBTdG9yZVN5bmM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLy8gUHVibGljIGZvciBTdG9yZVN5bmMsIHdoaWNoIGxvZ3MgaXQgd2l0aCBldmVyeXRoaW5nIGl0IGRvZXNcbiAgICAgICAgcHVibGljIGZvbGRlcjogc3RyaW5nLFxuICAgICAgICAvKiogVGhlIG5hbWUgdGhpcyBzdG9yZSBhbnN3ZXJzIHRvIChzZWUgQ29tbW9uQ29uZmlnLm5hbWUpIC0gdGhlIGVudHJpZXMgb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoYXQgY2FycnkgaXQgYXJlIHRoZSBvbmVzIHRoYXQgY29uZmlndXJlIGl0LCBhbmQgdGhlIHJlc3QgYXJlIGl0cyBwZWVycy4gKi9cbiAgICAgICAgcHVibGljIHN0b3JlTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbmZpZz86IHtcbiAgICAgICAgICAgIC8qKiBXaGV0aGVyIGEgY29uZmlnIGVudHJ5IGlzIFRISVMgU0VSVkVSIChzYW1lIGFjY291bnQsIHNhbWUgYnVja2V0LCBvdXIgb3duIGFkZHJlc3MpLiBJbmplY3RlZCBiZWNhdXNlIGEgc3RvcmUga25vd3Mgbm90aGluZyBhYm91dCBzZXJ2ZXJzIC0gaXQgb25seSBuZWVkcyB0byB0ZWxsIGl0cyBvd24gZW50cmllcyBhcGFydCBmcm9tIGl0cyBwZWVycycuIEFic2VudCBtZWFucyBub3RoaW5nIGlzIHVzLCB3aGljaCBpcyB3aGF0IGEgYmFyZSBzdG9yZSAobm8gc2VydmVyIGFyb3VuZCBpdCkgd2FudHMuICovXG4gICAgICAgICAgICBpc1NlbGY/OiAoc291cmNlOiBTb3VyY2VDb25maWcpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAvKiogQnVpbGRzIG9uZSBvZiBpdHMgc291cmNlcy4gSW5qZWN0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiwgYW5kIGJlY2F1c2UgdGhlIGRlbGF5IGl0IGlzIGNyZWF0ZWQgd2l0aCBpcyB0aGlzIHN0b3JlJ3MgcG9saWN5LiAqL1xuICAgICAgICAgICAgY3JlYXRlU291cmNlPzogKGNvbmZpZzogeyBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7IHdyaXRlRGVsYXk6IG51bWJlciB9KSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgICAgICAvKiogSGFuZHMgYSBydW5uaW5nIHNvdXJjZSBhIGNoYW5nZWQgY29uZmlnLCBzbyBhbiBlbmRwb2ludCB3ZSBhbHJlYWR5IHRhbGsgdG8gaXMgbmV2ZXIgcmVidWlsdCBqdXN0IGJlY2F1c2UgYSBmbGFnIG1vdmVkLiAqL1xuICAgICAgICAgICAgYXBwbHlTb3VyY2U/OiAoc291cmNlOiBJQXJjaGl2ZXMsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB3cml0ZURlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBrZXkncyBpbmRleCBlbnRyeSBjaGFuZ2VzIChvdXIgb3duIHdyaXRlcyBBTkQgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb24pIOKAlCBob3cgdGhlIHN0b3JhZ2Ugc2VydmVyIG5vdGljZXMgcm91dGluZyBjb25maWcgdXBkYXRlcy5cbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkPzogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIENhbGxlZCBldmVyeSB0aW1lIHRoaXMgc3RvcmUgYXBwbGllcyBhIHJvdXRpbmcgY29uZmlnIHRvIGl0c2VsZiAoc3RhcnR1cCwgYW4gb3BlcmF0b3IncyB3cml0ZSwgYSBwZWVyJ3MgY29weSBhcnJpdmluZykgLSB0aGUgc3RvcmUgaXMgdGhlIG9uZSB0aGF0IGtub3dzIHdoZW4gYSBjb25maWcgbGFuZGVkLCBhbmQgdGhlIHNlcnZlciBhcm1zIHdpbmRvdy1ib3VuZGFyeSBzY2FucyBmcm9tIGl0LiAqL1xuICAgICAgICAgICAgb25Sb3V0aW5nQXBwbGllZD86IChyb3V0aW5nOiBSZW1vdGVDb25maWcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQXNrcyB0aGUgY2xpZW50IHdob3NlIHJlcXVlc3QgY3JlYXRlZCB0aGlzIHN0b3JlIHdoYXQgcm91dGluZyBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLiBPbmx5IHVzZWQgd2hlbiBpbml0IGZpbmRzIE5PIGNvbmZpZ3VyYXRpb24gaW4gb3VyIGZvbGRlcjogYSBzdG9yZSBvbmx5IGV2ZXIgZXhpc3RzIGJlY2F1c2UgYSBjb25maWcgbmFtZXMgaXQsIHNvIHRoZSByZXF1ZXN0ZXIgaGFzIHRoYXQgY29uZmlnIC0gYXNraW5nIGZvciBpdCBsYXppbHkgaXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgcGFzc2luZyB0aGUgY29uZmlnIG9uIGV2ZXJ5IGNhbGwsIHdpdGhvdXQgdGhlIHBlci1jYWxsIGtpbG9ieXRlcy4gKi9cbiAgICAgICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnPzogKCkgPT4gUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgLy8gRXZlcnkgYWNjZXB0ZWQgd3JpdGUgKFwib3JpZ2luYWxcIikgYW5kIGV2ZXJ5IHdyaXRlIHRoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcyAoXCJmbHVzaGVkXCIpLiBGYXN0IHdyaXRlcyBjb2FsZXNjZSwgc28gdGhlIHR3byBjb3VudHMgZGlmZmVyLlxuICAgICAgICAgICAgb25Xcml0ZUNvdW50ZWQ/OiAoa2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvKiogQSBzeW5jaHJvbml6YXRpb24gdHJhbnNmZXI6IFwic3luYyBnZXRcIiBpcyBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlICh0aGUgYmFja2JsYXplIGRvd25sb2FkIGJpbGwpLCBcInN5bmMgc2V0XCIgaXMgYnl0ZXMgcHVzaGVkIHRvIG9uZS4gSW5qZWN0ZWQgYmVjYXVzZSBzeW5jIHRyYWZmaWMgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSBjb250cm9sbGVyLCBzbyBub3RoaW5nIGVsc2UgY2FuIGNvdW50IGl0LiAqL1xuICAgICAgICAgICAgb25TeW5jVHJhbnNmZXI/OiAob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcikgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIFJlc29sdmVzIGEgcGVyc2lzdGVkIHNvdXJjZSBVUkwgKHNlZSBBcmNoaXZlc1NvdXJjZS51cmwpIHRvIGEgY2FjaGVkIElBcmNoaXZlcywgc28gZW50cmllcyB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQgY2FuIHN0aWxsIGJlIHJlYWRcbiAgICAgICAgICAgIHJlc29sdmVTb3VyY2VVcmw/OiAodXJsOiBzdHJpbmcpID0+IElBcmNoaXZlcztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gbmV3IFNvdXJjZXNMaXN0KHBhdGguam9pbihmb2xkZXIsIFwiaW5kZXhcIiwgXCJzb3VyY2VzTGlzdC50eHRcIikpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRyYW5zYWN0aW9uRmlsZTxJbmRleFZhbHVlPihwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwiYmxvYkluZGV4My5sb2dcIikpO1xuICAgICAgICB0aGlzLnN5bmMgPSBuZXcgU3RvcmVTeW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gbmV3IFN0b3JlQ29uZmlnKHN0b3JlTmFtZSwgW10pO1xuICAgICAgICB0aGlzLm93bkRpc2sgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgc3RvcmUncyBmb2xkZXIsIHVud3JhcHBlZDogdGhlIHNhbWUgYnl0ZXMgc2xvdCAwIHNlcnZlcywgYnV0IHJlYWNoZWQgd2l0aG91dCBpdHMgd3JpdGUgZGVsYXkuIFVzZWQgZm9yIHRoZSB0d28gdGhpbmdzIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBidWZmZXJlZCBzb3VyY2UgLSByZWFkaW5nIG91ciBvd24gcm91dGluZyBjb25maWcgYmVmb3JlIHdlIGhhdmUgYW55IHNvdXJjZXMsIGFuZCBzdHJlYW1pbmcgYSBsYXJnZSB1cGxvYWQgdGhhdCBtdXN0IG5vdCBzaXQgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgb3duRGlzazogQXJjaGl2ZXNEaXNrO1xuXG4gICAgLyoqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlLiBJdCBvd25zIHRoaXM6IHRoZSByb3V0aW5nIGNvbmZpZyBpcyBhIGZpbGUgSU4gdGhlIHN0b3JlLCBzbyB0aGUgc3RvcmUgcmVhZHMgaXQsIGFwcGxpZXMgaXQgdG8gaXRzZWxmLCBhbmQgcmUtYXBwbGllcyBpdCB3aGVuZXZlciB0aGUgZmlsZSBjaGFuZ2VzIC0gYnkgb3VyIG93biB3cml0ZSwgb3IgYnkgYSBwZWVyJ3MgY29weSBhcnJpdmluZyB0aHJvdWdoIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgc3RvcmVDb25maWc6IFN0b3JlQ29uZmlnO1xuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGxhc3QgYXBwbGllZCwgc28gYSB3cml0ZSBvZiBhbiBpZGVudGljYWwgKG9yIG9sZGVyKSBvbmUgaXMgbm90IHJlLWFwcGxpZWRcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IC0xO1xuICAgIC8vIC4uLmFuZCB0aGUgY29uZmlnIGl0c2VsZiwgc28gYSByZWplY3Rpb24gY2FuIHNheSBleGFjdGx5IHdoYXQgdGhlIHN0b3JlIElTIHJ1bm5pbmcgaW5zdGVhZCBvZiBndWVzc2luZ1xuICAgIHByaXZhdGUgYXBwbGllZFJvdXRpbmc6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vICNyZWdpb24gTWFpbiBpbnRlcmZhY2VcblxuICAgIHB1YmxpYyBpbml0ID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIENvbmZpZ3VyZSBmaXJzdDogdGhlIGNvbmZpZyBkZWNpZGVzIHdoYXQgdGhlIHNvdXJjZXMgQVJFLCBhbmQgZXZlcnl0aGluZyBiZWxvdyBpcyBwZXIgc291cmNlLiBXaXRoIG5vIGNvbmZpZyBhdCBhbGwgdGhhdCBpcyBqdXN0IG91ciBvd24gZGlzaywgd2hpY2ggaXMgZW5vdWdoIHRvIHNlcnZlIGFuZCB0byBiZSB3cml0dGVuIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAvLyBObyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXIgYXQgYWxsIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRoaXMgc3RvcmUgd2FzIGp1c3QgQ1JFQVRFRCBieSBhIHJlcXVlc3QsIGJlZm9yZSBhbnkgY29uZmlnIHdyaXRlIHJlYWNoZWQgaXQuIFRoZSByZXF1ZXN0ZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3Igb3VyIG5hbWUsIHNvIGFzayBpdC5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCAmJiB0aGlzLmNvbmZpZz8ucmVxdWVzdFJvdXRpbmdDb25maWcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3ZpZGVkID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBpbml0aWFsaXplZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb247IHRoZSByZXF1ZXN0aW5nIGNsaWVudCBwcm92aWRlZCByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihwcm92aWRlZCl9IC0gYWRvcHRpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyYWlnaHQgb250byB0aGUgZGlzaywgbm90IHRocm91Z2ggc2V0KCk6IHNldCB3YWl0cyBmb3IgaW5pdCwgd2hpY2ggaXMgd2hhdCBpcyBydW5uaW5nIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHByb3ZpZGVkKSksIHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFza2luZyB0aGUgcmVxdWVzdGluZyBjbGllbnQgZm9yIHRoZSByb3V0aW5nIGNvbmZpZyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgZmFpbGVkIC0gcnVubmluZyB1bmNvbmZpZ3VyZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/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/LmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpLiBUaGUgY2xpZW50IGlzIGFscmVhZHkgc3RyZWFtaW5nLCBzbyB0aGUgdXBsb2FkIGlzIGFjY2VwdGVkIGFuZCBldmVyeSBwYXJ0IGRpc2NhcmRlZCAtIHRoZSBhbHRlcm5hdGl2ZSBpcyB0aHJvd2luZyBhdCBhIGNhbGxlciB0aGF0IGRpZCBub3RoaW5nIHdyb25nLlxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBgJHtESVNDQVJERURfVVBMT0FEX1BSRUZJWH0ke3RoaXMubmV4dERpc2NhcmRlZFVwbG9hZCsrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRlZFVwbG9hZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgb2Zmc2V0PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5oYXMoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLmRhdGEsIGNvbmZpZy5vZmZzZXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBkaXNrLCBzb3VyY2VJbmRleCB9ID0gdGhpcy5nZXREaXNrU291cmNlKCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KSAtIGEgbmV3ZXIgdmFsdWUgY2FuIGxhbmQgd2hpbGUgYSBsb25nIHVwbG9hZCBpcyBzdGlsbCBzdHJlYW1pbmcsIHNvIHRoaXMgaXMgcmUtY2hlY2tlZCBoZXJlIHJhdGhlciB0aGFuIG9ubHkgYXQgdGhlIHN0YXJ0XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShjb25maWcucGF0aCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGRpc2suZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcucGF0aCwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGxldCBpbmZvID0gYXdhaXQgZGlzay5nZXRJbmZvKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShjb25maWcucGF0aCwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZzogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBJbnRlcm5hbHNcblxuICAgIC8qKiBCeXRlcyBvZiByZWFkIGNhY2hlIHRoZSBkaXNrIG1heSBob2xkOyBzZWUgQ29tbW9uQ29uZmlnLnJlYWRlckRpc2tMaW1pdCAoU3RvcmVTeW5jIGVuZm9yY2VzIGl0KS4gUmVhZCBmcm9tIHRoZSBjb25maWcgaW4gZWZmZWN0LCBzbyByYWlzaW5nIG9yIHJlbW92aW5nIHRoZSBsaW1pdCB0YWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgZXZpY3Rpb24gcGFzcy4gKi9cbiAgICBwdWJsaWMgZ2V0IHJlYWRlckRpc2tMaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZUNvbmZpZy5jdXJyZW50KCkucmVhZGVyRGlza0xpbWl0O1xuICAgIH1cblxuICAgIC8qKiBUaGUgd3JpdGUgdGltZSBhIG5ldyB3cml0ZSBoYXMgdG8gYmVhdCwgb3IgMCB3aGVuIHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgdGhlIGtleS4gQ291bnRzIERFTEVUSU9OUyB0b286IGEgd3JpdGUgb2xkZXIgdGhhbiB0aGUgZGVsZXRpb24gdGhhdCByZW1vdmVkIGl0IG11c3Qgbm90IGJyaW5nIGl0IGJhY2suIFRoZSBpbmRleCBpcyBhdXRob3JpdGF0aXZlIGV2ZW4gZm9yIGEgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gYSBkZWxheWVkIHNvdXJjZSwgc2luY2UgdGhlIGVudHJ5IGlzIHJlY29yZGVkIHdoZW4gdGhlIHdyaXRlIGlzIGFjY2VwdGVkIHJhdGhlciB0aGFuIHdoZW4gaXQgcmVhY2hlcyBzdG9yYWdlLiAqL1xuICAgIHB1YmxpYyBjdXJyZW50V3JpdGVUaW1lKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgudGltZU9mKGtleSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xpdmUoc291cmNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmlzTGl2ZShzb3VyY2VJbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyU2xvdChzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIGxldCByZWdpc3RyYXRpb24gPSB0aGlzLnNvdXJjZXNMaXN0LmVuc3VyZSh0aGlzLnNvdXJjZXNbc2xvdF0udXJsKS50aGVuKGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XSA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zbG90UmVnaXN0cmF0aW9uc1tzbG90XSA9IHJlZ2lzdHJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgICB9XG5cbiAgICAvKiogVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzbG90IG5ldmVyIGdvdCB0aGF0IGZhciAoYSBzb3VyY2UgcmVtb3ZlZCBiZWZvcmUgaXRzIHJlZ2lzdHJhdGlvbiByZXNvbHZlZCkuICovXG4gICAgcHVibGljIHNsb3RTb3VyY2VzTGlzdEluZGV4KHNsb3Q6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgfVxuXG4gICAgLy8gVGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiBhIHNsb3QgLSBvbmx5IHZhbGlkIG9uY2UgdGhlIHNsb3QncyByZWdpc3RyYXRpb24gcmVzb2x2ZWQgKGluaXQgYW5kIHRoZSBzb3VyY2UncyBzeW5jIGxvb3AgZ3VhcmFudGVlIHRoYXQgYmVmb3JlIGFueSBpbmRleGluZyBoYXBwZW5zKVxuICAgIHB1YmxpYyBzb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNsb3Q6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHNsb3QgJHtzbG90fSAoJHt0aGlzLnNvdXJjZXNbc2xvdF0/LnVybH0pIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZXNMaXN0SW5kZXggeWV0IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxpdmUgc2xvdCBjdXJyZW50bHkgc2VydmluZyBhIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY29uZmlndXJlZCBzb3VyY2UgaGFzIHRoYXQgVVJMIGFueW1vcmUuIExpbmVhciwgYnV0IHRoZSBzb3VyY2VzIGxpc3QgaXMgdGlueSBhbmQgdGhpcyBpcyBhbHdheXMgY3VycmVudCAoc2xvdHMgZHlpbmcsIG9yIHNldmVyYWwgc2xvdHMgc2hhcmluZyBvbmUgVVJMIGFjcm9zcyB2YWxpZCB3aW5kb3dzLCBuZWVkIG5vIGJvb2trZWVwaW5nKS5cbiAgICBwdWJsaWMgc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoc291cmNlc0xpc3RJbmRleDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbaV0gPT09IHNvdXJjZXNMaXN0SW5kZXggJiYgdGhpcy5pc0xpdmUoaSkpIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIElBcmNoaXZlcyBjdXJyZW50bHkgaG9sZGluZyBhbiBlbnRyeSdzIGJ5dGVzOiB0aGUgbGl2ZSBzbG90IHdoZW4gdGhlIGhvbGRlciBpcyBzdGlsbCBjb25maWd1cmVkLCBvdGhlcndpc2UgcmVzb2x2ZWQgKGNhY2hlZCkgc3RyYWlnaHQgZnJvbSBpdHMgcGVyc2lzdGVkIFVSTCAtIHdpbmRvd3Mvcm91dGVzIGRlY2lkZSB3aGVuIGEgc291cmNlIGlzIHNjYW5uZWQgb3Igd3JpdHRlbiwgYnV0IGZvciByZWFkaW5nIGJ5dGVzIHdlIGtub3cgaXQgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoXG4gICAgcHVibGljIGFzeW5jIGdldEVudHJ5SG9sZGVyKGVudHJ5OiBJbmRleEVudHJ5KTogUHJvbWlzZTxJQXJjaGl2ZXMgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpIHx8IGF3YWl0IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsUmVsb2FkaW5nKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5yZXNvbHZlU291cmNlVXJsPy4odXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5sb2FkKCk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIChzZWUgU3RvcmVTeW5jJ3Mgc2NhbiBoYW5kbGluZyksIGFuZCBhIGxvYWRlZCBidWNrZXQgYWx3YXlzIGhhcyBpdCB0aGVyZSAtIGEgcGVyc2lzdGVkIGVudHJ5IHBvaW50aW5nIGVsc2V3aGVyZSBpcyBzdGFsZSwgc28gaXQgaXMgY29ycmVjdGVkIG9uY2UsIGhlcmVcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmdldEluZGV4RW50cnkoUk9VVElOR19GSUxFKTtcbiAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICBpZiAocm91dGluZyAmJiByb3V0aW5nLnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoUk9VVElOR19GSUxFLCB7IHdyaXRlVGltZTogcm91dGluZy53cml0ZVRpbWUsIHNpemU6IHJvdXRpbmcuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogYmFzZVNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIHdlIGhvbGQuIEEgZGVsZXRlZCBvbmUgaXMgbm90IG9uZTogaXQgaXMgYSB0b21ic3RvbmUsIGFuZCBvbmx5IGdldERlbGV0ZWRFbnRyeSBrbm93cyBhYm91dCBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IEluZGV4RW50cnkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmluZGV4LmdldChrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBXaGVuIGEga2V5IHdhcyBkZWxldGVkLCBpZiBpdCB3YXMuIEEgZGVsZXRpb24gaXMgYW4gYWJzZW5jZSB3aXRoIGEgdGltZSBhdHRhY2hlZCAtIHRoYXQgdGltZSBpcyB3aGF0IG1ha2VzIGl0IHByb3BhZ2F0ZSBhbmQgd2hhdCBleHBpcmVzIGl0LiAqL1xuICAgIHB1YmxpYyBnZXREZWxldGVkRW50cnkoa2V5OiBzdHJpbmcpOiB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHRvbWJzdG9uZSA9IHRoaXMuaW5kZXguZ2V0RGVsZXRlZChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGZpbGUgd2UgaG9sZCwgZm9yIHRoZSBwYXNzZXMgdGhhdCB3YWxrIHRoZW0gYWxsIChsaXN0aW5ncywgc2NhbnMsIHJlY29uY2lsaWF0aW9uLCBldmljdGlvbikuIERlbGV0aW9ucyBhcmUgbm90IGluIGhlcmUgLSBzZWUgZGVsZXRlZEVudHJpZXMuIExpdmU6IGRlbGV0aW5nIGVudHJpZXMgd2hpbGUgaXRlcmF0aW5nIGlzIGV4cGVjdGVkIGhlcmUsIGFuZCBzYWZlLiAqL1xuICAgIHB1YmxpYyAqaW5kZXhFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgSW5kZXhFbnRyeV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXguZW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGRlbGV0aW9uIHdlIGtub3cgb2YuIEEgbXVjaCBzbWFsbGVyIHdhbGsgdGhhbiB0aGUgZmlsZXMsIHdoaWNoIGlzIHdoYXQgbWFrZXMgZXhwaXJpbmcgdGhlbSBjaGVhcC4gKi9cbiAgICBwdWJsaWMgKmRlbGV0ZWRFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGZpbGVzIHdlIGhvbGQsIGRlbGV0aW9ucyBleGNsdWRlZC4gKi9cbiAgICBwdWJsaWMgaW5kZXhTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnNpemU7XG4gICAgfVxuXG4gICAgLyoqIFRvdGFscyBvdmVyIHRoZSBmaWxlcyB3ZSBob2xkLCBicm9rZW4gZG93biBieSB0aGUgc2xvdCBob2xkaW5nIGVhY2ggKGVudHJpZXMgY2FuIG5hbWUgYSBzb3VyY2UgdGhhdCBpcyBubyBsb25nZXIgY29uZmlndXJlZCwgd2hpY2ggY291bnRzIHRvd2FyZHMgdGhlIHRvdGFsIGJ1dCBubyBzbG90KS4gKi9cbiAgICBwdWJsaWMgaW5kZXhUb3RhbHMoKTogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNsb3RzOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB7XG4gICAgICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IHNsb3RzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAoeyBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IFssIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5maWxlQ291bnQrKztcbiAgICAgICAgICAgIHNsb3RzW3Nsb3RdLmJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBzbG90cyB9O1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgZmlsZSwgYXMgb2YgaXRzIHdyaXRlIHRpbWUuIFJldHVybnMgZmFsc2UsIGhhdmluZyBjaGFuZ2VkIG5vdGhpbmcsIHdoZW4gd2UgYWxyZWFkeSBrbm93IHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgLSB0aGUgaW5kZXggY2Fubm90IGJlIG1hZGUgdG8gZ28gYmFja3dhcmRzLCB3aGljaGV2ZXIgcGF0aCB0aGUgd3JpdGUgY2FtZSBpbiBieS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZywgZW50cnk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgc291cmNlc0xpc3RJbmRleDogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LnNldChrZXksIHsgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogZW50cnkuc291cmNlc0xpc3RJbmRleCB9LCBlbnRyeS53cml0ZVRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBsYW5kaW5nIGhlcmUgLSB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yLCBvciBwdWxsZWQgb2ZmIGEgcGVlciBieSBzeW5jaHJvbml6YXRpb24gLSBpcyBob3cgdGhpcyBzdG9yZSBsZWFybnMgd2hhdCBpdCBpcyBtZWFudCB0byBiZVxuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zeW5jU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFwcGx5Um91dGluZ0NvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBSZWNvcmRzIGEgREVMRVRJT04sIGFzIG9mIGl0cyB0aW1lOiB0aGUga2V5IHN0b3BzIGV4aXN0aW5nIGhlcmUsIGFuZCB0aGUgdG9tYnN0b25lIGlzIHdoYXQgbWFrZXMgdGhhdCBmYWN0IHByb3BhZ2F0ZSBhbmQgcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLiBTYW1lIG9yZGVyaW5nIHJ1bGUgYXMgc2V0SW5kZXhFbnRyeS4gKi9cbiAgICBwdWJsaWMgc2V0SW5kZXhEZWxldGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXguZGVsZXRlKGtleSwgd3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRm9yZ2V0cyBhIGtleSBlbnRpcmVseSwgdG9tYnN0b25lIGluY2x1ZGVkLiBOT1QgYSBkZWxldGlvbjogaXQgc2F5cyBub3RoaW5nIGhhcHBlbmVkIHRvIHRoZSBmaWxlLCBvbmx5IHRoYXQgd2Ugbm8gbG9uZ2VyIGtub3cgYW55dGhpbmcgYWJvdXQgaXQgLSBmb3IgYW4gZW50cnkgd2hvc2UgaG9sZGVyIHR1cm5lZCBvdXQgbm90IHRvIGhhdmUgaXQsIGFuZCBmb3IgYSB0b21ic3RvbmUgb2xkIGVub3VnaCB0aGF0IGV2ZXJ5b25lIGhhcyBoZWFyZC4gKi9cbiAgICBwdWJsaWMgcHVyZ2VJbmRleEVudHJ5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5kZXgucHVyZ2Uoa2V5KTtcbiAgICB9XG5cbiAgICAvKiogQ291bnRzIGEgc3luY2hyb25pemF0aW9uIHRyYW5zZmVyIGluIHRoZSBzZXJ2ZXIncyBhY2Nlc3Mgc3RhdGlzdGljcyAoc2VlIGdldFN0b3JlJ3Mgd2lyaW5nKTogXCJzeW5jIGdldFwiIGZvciBieXRlcyBwdWxsZWQgb2ZmIGEgc291cmNlLCBcInN5bmMgc2V0XCIgZm9yIGJ5dGVzIHB1c2hlZCB0byBvbmUuICovXG4gICAgcHVibGljIG5vdGVTeW5jVHJhbnNmZXIob3BlcmF0aW9uOiBcInN5bmMgZ2V0XCIgfCBcInN5bmMgc2V0XCIsIHBhdGg6IHN0cmluZywgYnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25TeW5jVHJhbnNmZXI/LihvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgdmFsaWRhdGlvbiAoZnJvbSB0aGlzIHN0b3JlJ3Mgb3duIHJvdXRpbmcgZW50cmllcykg4pSA4pSAXG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSB3cml0ZSwgaG93ZXZlciBpdCBpcyBzdGFtcGVkLCBoYXMgdG8gYmUgb25lIHdlIGFyZSBhY3R1YWxseSBtZWFudCB0byBob2xkIC0gYmVjYXVzZSB0aGVcbiAgICAgKiBhbHRlcm5hdGl2ZSBpcyBub3QgYSBzbWFsbGVyIHByb2JsZW0sIGl0IGlzIGEgc2lsZW50IG9uZS4gQSB3cml0ZSB0aGF0IGxhbmRzIG9uIGEgc3RvcmUgdGhhdFxuICAgICAqIGRvZXMgbm90IHNlcnZlIGl0cyByb3V0ZSAob3Igb24gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgaW4gdGhlIGJ1Y2tldCdzIGNvbmZpZyBhdCBhbGwpIGdvZXMgaW50byBhXG4gICAgICogZm9sZGVyIG5vdGhpbmcgc2NhbnMgYW5kIG5vIHBlZXIgcmVjb25jaWxlczogaXQgc3VjY2VlZHMsIGFuZCB0aGVuIGl0IGlzIGdvbmUuIFRoZSBtYXJrZXJzIG1ha2VcbiAgICAgKiB0aGUgY2xpZW50IHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGFuZCByZXRyeSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcmlnaHQgb3V0Y29tZSB3aGVuIHRoZVxuICAgICAqIHJlYXNvbiBpdCBhaW1lZCBoZXJlIGlzIHRoYXQgaXRzIGNvbmZpZyB3YXMgc3RhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRXcml0ZVRhcmdldChrZXk6IHN0cmluZywgcm91dGU6IG51bWJlciwgbGFzdE1vZGlmaWVkOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHRoaXMudW5jb25maWd1cmVkRGV0YWlsKCk7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0NPTkZJR1VSRUR9IENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH0gRGF0YSB3cml0dGVuIHRvIGEgc3RvcmUgd2l0aCBubyBjb25maWd1cmF0aW9uIGVudHJ5IHdvdWxkIG5ldmVyIGJlIHNjYW5uZWQgb3IgcmVjb25jaWxlZCwgc28gYWNjZXB0aW5nIGl0IHdvdWxkIHNpbGVudGx5IGxvc2UgaXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5IC0gb3IsIGlmIHRoaXMgc3RvcmUgaXMgZ2VudWluZWx5IG1lYW50IHRvIHRha2UgdGhpcyB3cml0ZSwgd3JpdGUgdGhlIGJ1Y2tldCdzIHJvdXRpbmcgY29uZmlnIHdpdGggYW4gZW50cnkgbmFtaW5nIGl0IG9uIHRoaXMgc2VydmVyLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5LCBEYXRlLm5vdygpLCByb3V0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzdGFtcGVkIHdyaXRlIHBpY2tlZCBpdHMgb3duIHRpbWUsIHNvIG5vIHdpbmRvdyBjYW4ganVkZ2UgaXQgKHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIGEgc3luY2hyb25pemVkIHdyaXRlKSAtIGJ1dCB0aGUgUk9VVEUgaXMgbm90IGEgbWF0dGVyIG9mIHRpbWluZywgYW5kIGEgc3RhbXBlZCB3cml0ZSB0byB0aGUgd3Jvbmcgc2hhcmQgaXMgZXhhY3RseSBhcyBpbnZpc2libGUgYXMgYSBmcmVzaCBvbmVcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVDb25maWcuYWxsKCkuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkgcmV0dXJuO1xuICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHN0YW1wZWQgd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHJvdXRlIHdlIHNlcnZlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc3RvcmUgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICB9XG5cbiAgICAvKiogRXhhY3RseSB3aHkgdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyaWVzIC0gd2hpY2ggb2YgdGhlIHRocmVlIHBvc3NpYmxlIHJlYXNvbnMgaXQgaXMsIHdpdGggdGhlIHZhbHVlcyB0aGF0IGRlY2lkZWQgaXQsIGJlY2F1c2UgXCJub3QgY29uZmlndXJlZFwiIGFsb25lIGlzIHVuZGlhZ25vc2FibGUuICovXG4gICAgcHJpdmF0ZSB1bmNvbmZpZ3VyZWREZXRhaWwoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmFwcGxpZWRSb3V0aW5nO1xuICAgICAgICBsZXQgaWRlbnRpdHkgPSBgc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pYDtcbiAgICAgICAgaWYgKCFyb3V0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGhhcyBubyByb3V0aW5nIGNvbmZpZyBhdCBhbGwgLSBub3RoaW5nIGhhcyBldmVyIHdyaXR0ZW4gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBpbnRvIGl0LmA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iamVjdHMgPSByb3V0aW5nLnNvdXJjZXMuZmlsdGVyKHggPT4gdHlwZW9mIHggIT09IFwic3RyaW5nXCIpIGFzIFNvdXJjZUNvbmZpZ1tdO1xuICAgICAgICBsZXQgbmFtZWQgPSBvYmplY3RzLmZpbHRlcih4ID0+IHgubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUpO1xuICAgICAgICBpZiAoIW5hbWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hpY2ggaGFzIG5vIGVudHJ5IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoaXRzIGVudHJpZXMgYXJlIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0cy5tYXAoeCA9PiB4Lm5hbWUpKX0pLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hvc2UgJHtuYW1lZC5sZW5ndGh9IGVudHIke25hbWVkLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gcG9pbnQocykgYXQgJHtKU09OLnN0cmluZ2lmeShuYW1lZC5tYXAoeCA9PiB4LnVybCkpfSAtIG5vbmUgb2Ygd2hpY2ggaXMgVEhJUyBzZXJ2ZXIsIHNvIHRoZSBjb25maWcgc2F5cyB0aGlzIHN0b3JlIGxpdmVzIGVsc2V3aGVyZS5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSByb3V0aW5nIGNvbmZpZyBtYXkgYmUgd3JpdHRlbiBoZXJlLiBUd28gcnVsZXMsIGFuZCB0aGlzIGlzIHRoZSBvbmUgcGxhY2UgZWl0aGVyIGlzXG4gICAgICogYXBwbGllZCAtIGEgY29uZmlnIG9ubHkgZXZlciBlbnRlcnMgdGhlIHN5c3RlbSB0aHJvdWdoIGEgd3JpdGUsIHNvIGEgY29uZmlnIHRoYXQgZ290IGluIGlzIGFcbiAgICAgKiBjb25maWcgdGhhdCBwYXNzZWQsIGFuZCByZWFkaW5nIG9uZSBiYWNrIG5ldmVyIGp1ZGdlcyBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIFRoZSBjb25maWcgaGFzIHRvIGJlIHZhbGlkIGFzIGEgd2hvbGUgKHNlZSBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyksIGFuZCBpdCBoYXMgdG8gb3V0cmFuayB3aGF0XG4gICAgICogd2UgYXJlIHJ1bm5pbmc6IHRoZSBzYW1lIHZlcnNpb24gbWVhbnMgdGhlIHNhbWUgY29uZmlnLCBzbyByZS13cml0aW5nIGl0IGlzIGhhcm1sZXNzLCBidXQgYVxuICAgICAqIGxvd2VyIG9uZSBpcyBhbiBvbGRlciBjb25maWcgYXJyaXZpbmcgbGF0ZSBhbmQgbXVzdCBuZXZlciB1bmRvIGEgbmV3ZXIgb25lLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKHJvdXRpbmcpO1xuICAgICAgICBsZXQgaW5jb21pbmcgPSBnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucm91dGluZ1ZlcnNpb24oKTtcbiAgICAgICAgaWYgKGluY29taW5nID49IGN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWZ1c2luZyB0byB3cml0ZSAke1JPVVRJTkdfRklMRX0gdG8gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0cyB2ZXJzaW9uICgke2luY29taW5nfSkgaXMgb2xkZXIgdGhhbiB0aGUgb25lIHRoaXMgc3RvcmUgaXMgcnVubmluZyAoJHtjdXJyZW50fSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuYCk7XG4gICAgfVxuXG4gICAgLy8gQSBmcmVzaCAodW5zdGFtcGVkKSB3cml0ZSBtdXN0IGxhbmQgb24gdGhlIG5vZGUgdGhlIGNvbmZpZyBjdXJyZW50bHkgcG9pbnRzIGF0OiB0aGUgbWFya2VycyB0ZWxsIHRoZSBjbGllbnQgaXRzIGNvbmZpZyBpcyBzdGFsZSwgc28gaXQgcmUtcmVzb2x2ZXMgYW5kIHJldHJpZXMgYWdhaW5zdCB0aGUgcmlnaHQgbm9kZSBpbnN0ZWFkIG9mIHVzIHNpbGVudGx5IGFjY2VwdGluZyBkYXRhIHdlIHdlcmUgbmV2ZXIgbWVhbnQgdG8gaG9sZC5cbiAgICBwcml2YXRlIGFzc2VydEZyZXNoV3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCB0aW1lVmFsaWQgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9IChhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldClgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV30gQ2Fubm90IHdyaXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06IGl0cyB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGV2ZXJ5IHZhbGlkIHdpbmRvdyBvZiBzdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKHdpbmRvd3M6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9LCBmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIC0gYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIG91ciByb3V0ZXMgJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9IGF0IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzdG9yZSBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGtleSl9LCBvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9LCBzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhc3NlcnRNdXRhYmxlKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIGdldFJvdXRlKGtleSkpO1xuICAgICAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgc3RvcmUgaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gYWxyZWFkeSBleGlzdHMsIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIHRvIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgc3RvcmUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgIHByaXZhdGUgYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBjb3ZlcmVkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IHJlamVjdGVkOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGF0IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgd2luZG93L3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3I6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSByZWFkOiBwdXJlbHkgdGhlIGxvY2FsIGRpc2ssIGNvbXBsZXRlbHkgc2hvcnQtY2lyY3VpdGluZyB0aGUgaW5kZXggYW5kIGhvbGRlciByZXNvbHV0aW9uIC0gdGhlIGNhbGxlciBpcyBhbm90aGVyIHN0b3JlLCBhbmQgY2hhc2luZyBPVVIgcmVtb3RlIGhvbGRlcnMgd2hpbGUgYW5zd2VyaW5nIGl0IGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gTm8gd2luZG93IG9yIHJvdXRlIGNoZWNrczogaWYgdGhlIGJ5dGVzIGFyZSBvbiBvdXIgZGlzaywgdGhlIGNhbGxlciBtYXkgaGF2ZSB0aGVtLiBOb3RlIHRoaXMgcmVhZHMgdGhlIGRpc2sgcGFzdCBhbnkgd3JpdGUgZGVsYXksIHNvIGEgZmFzdCB3cml0ZSBzdGlsbCBidWZmZXJlZCBpbiBtZW1vcnkgaXMgaW52aXNpYmxlIGhlcmU7IHRoZSBjYWxsZXIgcmUtZmluZHMgaXQgb25jZSBpdCBmbHVzaGVzLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW50ZXJuYWwyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXMgZm9yd2FyZHMgdG8gdGhlIGRpc2s6IGEgZmxhZy1jYWxsZXIgKGEgcGVlciBzdG9yZSdzIHN5bmNocm9uaXphdGlvbikgbmVlZHMgdG8gc2VlIG91ciBkZWxldGlvbnMsIG5vdCBqdXN0IG91ciBjb250ZW50LiBBIHRvbWJzdG9uZSBkZWxldGVkIGZyb20gZGlzayBlbnRpcmVseSBvbmx5IGxpdmVzIGluIG91ciBpbmRleCwgc28gZmFsbCBiYWNrIHRvIHRoYXQuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmdldDIoY29uZmlnLnBhdGgsIHsgcmFuZ2U6IGNvbmZpZy5yYW5nZSwgaW5jbHVkZVRvbWJzdG9uZXM6IGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcyB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSB0aGlzLmdldERlbGV0ZWRFbnRyeShjb25maWcucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9O1xuICAgIH1cblxuICAgIC8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHdyaXRlOiB0aGUgbG9jYWwgZGlzayBwbHVzIG91ciBpbmRleCwgd2l0aCBOTyBkb3duc3RyZWFtIGZhbi1vdXQgLSB0aGUgcHVzaGluZyBzdG9yZSBvd25zIHByb3BhZ2F0aW9uLCBhbmQgZmFubmluZyBpdHMgcHVzaGVzIGJhY2sgb3V0IGlzIGhvdyB3cml0ZSBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtLiBPbmx5LXRha2UtbGF0ZXN0IHN0aWxsIGFwcGxpZXMgaGVyZS4gKi9cbiAgICBwcml2YXRlIGFzeW5jIHNldEludGVybmFsKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZzogeyBsYXN0TW9kaWZpZWQ6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSkgcmV0dXJuO1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gc3RvcmVzIG5vdGhpbmcgb24gb3VyIG93biBzb3VyY2UgLSB0aGUgdG9tYnN0b25lIGlzIHRoZSB3aG9sZSBvZiBpdFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2hhcmVkIGVuZ2luZSBvZiBzZXQgYW5kIGRlbDogYW4gZW1wdHkgYnVmZmVyIGlzIGV4YWN0bHkgYSBkZWxldGlvbiBoZXJlLCB3aGljaCBpcyB3aHkgdGhlIGVtcHR5LWJ1ZmZlciByZWplY3Rpb24gbGl2ZXMgaW4gc2V0ICh0aGUgcHVibGljIEFQSSksIG5vdCBpbiB0aGlzIG1hY2hpbmVyeVxuICAgIHByaXZhdGUgYXN5bmMgc2V0T3JEZWxldGUoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwib3JpZ2luYWxcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnLmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCB3cml0ZXMgYXJlIG5vdCBoYW5kbGVkIGhlcmU6IGEgc291cmNlIHRoYXQgd2FzIGNvbmZpZ3VyZWQgd2l0aCBhIHdyaXRlIGRlbGF5IGJ1ZmZlcnMgdGhlbSBpdHNlbGYgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpLCBzbyB0aGlzIHdyaXRlIGxhbmRzIGluIG1lbW9yeSBhbmQgcmV0dXJucywgZXhhY3RseSBhcyBpdCB3b3VsZCBoYXZlLiBUaGUgaW5kZXggaXMgdXBkYXRlZCBlaXRoZXIgd2F5LCBzbyB0aGUgd3JpdGUgaXMgaW1tZWRpYXRlbHkgdmlzaWJsZSB0byByZWFkZXJzIG9mIHRoaXMgc3RvcmUuXG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCBsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBpbnN0YW50IGV2ZXJ5IGRlbGF5ZWQgd3JpdGUgbXVzdCBiZSBvbiBpdHMgc291cmNlOiB0aGUgZW5kIG9mIG91ciBvd24gd3JpdGUgd2luZG93IHRoYXQgY29udGFpbnMgbm93LCBtaW51cyB0aGUgZmx1c2ggbWFyZ2luIChzbyB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgZmluZHMgdGhlIGRhdGEgb24gaGFuZG9mZikuIFRoZSBMQVRFU1QgZW5kIGFtb25nIGNvdmVyaW5nIHdpbmRvd3MgLSBvdmVybGFwcGluZyB3aW5kb3dzIGhhbmQgb2ZmIGF0IHRoZSBsYXN0IG9uZS4gTm8gd2luZG93IGNvbnRhaW5zIG5vdyAoYW4gaW5lcnQgc3RvcmUsIG9yIGEgbW9tZW50IGJldHdlZW4gb3VyIHdpbmRvd3MpIC0+IDAsIGkuZS4gbm90aGluZyBtYXkgYmUgZGVsYXllZCBhdCBhbGwuICovXG4gICAgcHVibGljIHdyaXRlRmx1c2hEZWFkbGluZSgpOiBudW1iZXIge1xuICAgICAgICAvLyBCZWZvcmUgdXBkYXRlU291cmNlcyBoYXMgcnVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gaG9sZCBhIHdyaXRlIGFueXdheSwgYW5kIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWRcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXMubGVuZ3RoKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCB3IG9mIHRoaXMuc291cmNlc1swXS52YWxpZFdpbmRvd3MpIHtcbiAgICAgICAgICAgIGlmICh3WzBdIDw9IG5vdyAmJiBub3cgPCB3WzFdKSBlbmQgPSBNYXRoLm1heChlbmQsIHdbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5kKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIGVuZCAtIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JpdGFibGVTb3VyY2VzKGNvbmZpZz86IHsgaWdub3JlV2luZG93PzogYm9vbGVhbiB9KTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgd3JpdGFibGU6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd3NBY2NlcHRXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgd3JpdGFibGUucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGFibGU7XG4gICAgfVxuXG4gICAgLy8gT3VyIG93biBzb3VyY2UgKHRoZSBmaXJzdCB3cml0YWJsZSBvbmUpIHBsdXMgZXZlcnkgcm91dGUtbWF0Y2hpbmcgcGVlci4gRWFjaCBzb3VyY2UgZGVjaWRlcyBmb3IgaXRzZWxmIGhvdyBsb25nIGl0IGhvbGRzIHRoZSB3cml0ZSBiZWZvcmUgaXQgaGl0cyBzdG9yYWdlIChzZWUgQXJjaGl2ZXNEZWxheWVkKSAtIGhlcmUgdGhleSBhbGwganVzdCBnZXQgd3JpdHRlbi5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgTkVWRVIgc3luY2hyb25pemVkIGJldHdlZW4gc3RvcmFnZSBub2RlczogdGhlIHdyaXRlciB3cml0ZXMgaXQgZGlyZWN0bHkgdG8gZWFjaCBub2RlLCBzbyB3ZSBzdG9yZSBpdCBvbiBvdXIgb3duIGRpc2sgb25seSAobm8gdmFsaWQtd2luZG93IGZpbHRlciAtIHJvdXRpbmcvdmFsaWQgd2luZG93cyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byB0aGUgZmlsZSBkZWZpbmluZyB0aGVtKSBhbmQgbmV2ZXIgZm9yd2FyZCBpdCB0byBvdGhlciBzb3VyY2VzLlxuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcImZsdXNoZWRcIiwgZGF0YS5sZW5ndGgpO1xuICAgICAgICBsZXQgaXNSb3V0aW5nID0ga2V5ID09PSBST1VUSU5HX0ZJTEU7XG4gICAgICAgIGxldCB3cml0YWJsZSA9IHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKHsgaWdub3JlV2luZG93OiBpc1JvdXRpbmcgfSk7XG4gICAgICAgIGxldCBmaXJzdCA9IHdyaXRhYmxlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyAoZXZlcnkgc291cmNlJ3MgdmFsaWQgd2luZG93IGlzIGluIHRoZSBwYXN0KSwgc28gd3JpdGVzIGNhbm5vdCBiZSBzdG9yZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgb3VyIG93biAoZmlyc3QpIHNvdXJjZSBibG9ja3MgdGhlIHdyaXRlLiBEb3duc3RyZWFtIHNvdXJjZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIGJhY2tncm91bmQ6IGEgZG93biBkb3duc3RyZWFtIHNvdXJjZSBtdXN0IG5vdCBmYWlsIG9yIHN0YWxsIHdyaXRlcywgYW5kIHJlY29uY2lsaWF0aW9uIHJlLXNlbmRzIGFueXRoaW5nIHRoZXkgbWlzc2VkIG9uY2UgdGhleSBjb21lIGJhY2suXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSB0b21ic3RvbmUgaXMgdGhlIHdob2xlIG9mIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhEZWxldGVkKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWUsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoZmlyc3QpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JvdXRpbmcpIHJldHVybjtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERlbGV0aW9ucyB0cmF2ZWwgYXMgZGVsIGNhcnJ5aW5nIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIChuZXZlciBhcyBlbXB0eSBzZXRzIC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycykuIEJhY2tibGF6ZSBtYXRlcmlhbGl6ZXMgc3VjaCBkZWxzIGFzIHJlYWwgZW1wdHkgZmlsZXMsIHNvIGl0cyBsaXN0aW5ncyBzdGlsbCBzaG93IHRoZSBkZWxldGlvbiBmb3Igb3RoZXIgc3RvcmVzIHRvIHNjYW4gaW4gYXMgYSB0b21ic3RvbmUuXG4gICAgICAgICAgICBsZXQgcHVzaDogUHJvbWlzZTx1bmtub3duPjtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHdyaXRlIG9mICR7a2V5fSB0byBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3QgMCBpcyBhbHdheXMgdGhpcyBzdG9yZSdzIG93biBmb2xkZXIgKHNlZSBwbGFuU291cmNlcyksIHNvIHRoZSBkaXNrIGlzIGtub3duIHdpdGhvdXQgc2VhcmNoaW5nIGZvciBpdCAtIGFuZCBpdCBpcyB0aGUgdW53cmFwcGVkIG9uZSwgcGFzdCBhbnkgd3JpdGUgZGVsYXlcbiAgICBwcml2YXRlIGdldERpc2tTb3VyY2UoKTogeyBkaXNrOiBBcmNoaXZlc0Rpc2s7IHNvdXJjZUluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7IGRpc2s6IHRoaXMub3duRGlzaywgc291cmNlSW5kZXg6IDAgfTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgc3RpbGwgaGVsZCBieSBhIGRlbGF5ZWQgc291cmNlIChzZWUgQXJjaGl2ZXNEZWxheWVkKS4gZm9yY2UgYWxzbyB3cml0ZXMgd2hhdCBpc24ndCBkdWUgeWV0IC0gc2h1dGRvd24gY2Fubm90IGxlYXZlIHdyaXRlcyBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaERlbGF5ZWRXcml0ZXMoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IHsgc291cmNlIH0gb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgZGVsYXllZCA9IGFzRGVsYXllZChzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFkZWxheWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5ZWQuZmx1c2goZm9yY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxufVxuIl19
965
+ /* _JS_SOURCE_HASH = "5e08ba66757017889354fcb9c2a4da5e2402a477be4bdc0fb70383049adbfcfe"; */