sliftutils 1.7.28 → 1.7.29

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.
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.getLocalArchives = exports.deleteBucketFile = exports.listAccountBuckets = exports.rebuildAllLoadedBuckets = exports.getBucketConfig = exports.writeBucketFile = exports.assertMutable = exports.getLoadedBucket = exports.addExtraListenPort = exports.setTrustedMachines = exports.getRequests = exports.getTrust = exports.assertWritesAllowed = exports.getWritesRejectedReason = exports.setWritesRejectedReason = exports.getStorageServerConfigOptional = exports.getStorageServerConfig = exports.setStorageServerConfig = void 0;
6
+ //exports.getLocalArchives = exports.deleteBucketFile = exports.listAccountBuckets = exports.rebuildAllLoadedBuckets = exports.getBucketConfig = exports.writeBucketFile = exports.assertMutable = exports.getRoutingGeneration = exports.getLoadedBucket = exports.addExtraListenPort = exports.setTrustedMachines = exports.getRequests = exports.getTrust = exports.assertWritesAllowed = exports.getWritesRejectedReason = exports.setWritesRejectedReason = exports.getStorageServerConfigOptional = exports.getStorageServerConfig = exports.setStorageServerConfig = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const FileFolderAPI_1 = require("../FileFolderAPI");
@@ -533,6 +533,14 @@ function getLoadedBucket(account, bucketName) {
533
533
  return loaded;
534
534
  }
535
535
  exports.getLoadedBucket = getLoadedBucket;
536
+ // Bumped whenever any bucket's routing config is applied (created, updated in place, or rebuilt).
537
+ // Advertised in ping responses, so every connected client learns of a config change within one
538
+ // ping interval - the same broadcast channel the deploy-takeover stamp uses.
539
+ let routingGeneration = 0;
540
+ function getRoutingGeneration() {
541
+ return routingGeneration;
542
+ }
543
+ exports.getRoutingGeneration = getRoutingGeneration;
536
544
  // Routing reloads are serialized per bucket, so concurrent writes/syncs can't rebuild the same
537
545
  // store twice in parallel
538
546
  const routingReloads = new Map();
@@ -665,9 +673,9 @@ async function writeBucketFile(account, bucketName, filePath, data, config) {
665
673
  // target from a stale view - it must re-resolve and retry at the correct source.
666
674
  let route = (0, remoteConfig_1.getRoute)(filePath);
667
675
  if (!(config === null || config === void 0 ? void 0 : config.lastModified) && loaded.selfEntries.length) {
668
- let timeValid = loaded.selfEntries.filter(x => writeTime >= x.validWindow[0] - IArchives_1.WRITE_PAST_WINDOW_GRACE && writeTime <= x.validWindow[1] + IArchives_1.WRITE_PAST_WINDOW_GRACE);
676
+ let timeValid = loaded.selfEntries.filter(x => writeTime >= x.validWindow[0] && writeTime < x.validWindow[1]);
669
677
  if (!timeValid.length) {
670
- logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(filePath)} to bucket ${account}/${bucketName}: writeTime ${writeTime} (${new Date(writeTime).toISOString()}) is outside all our valid windows ${JSON.stringify(loaded.selfEntries.map(x => x.validWindow))} even with the ${IArchives_1.WRITE_PAST_WINDOW_GRACE}ms grace (a switchover moved the write target)`);
678
+ logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(filePath)} to bucket ${account}/${bucketName}: writeTime ${writeTime} (${new Date(writeTime).toISOString()}) is outside all our valid windows ${JSON.stringify(loaded.selfEntries.map(x => x.validWindow))} (a switchover moved the write target)`);
671
679
  throw new Error(`${IArchives_1.STORAGE_WRONG_VALID_WINDOW} This server is not a valid write target at ${writeTime} for bucket ${account}/${bucketName} (our valid windows: ${JSON.stringify(loaded.selfEntries.map(x => x.validWindow))}). Re-resolve the currently valid source and retry.`);
672
680
  }
673
681
  if (!timeValid.some(x => (0, remoteConfig_1.routeContains)(x.route, route))) {
@@ -878,5 +886,5 @@ function getLocalArchives(account, bucketName) {
878
886
  return archives;
879
887
  }
880
888
  exports.getLocalArchives = getLocalArchives;
881
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUF5RztBQUN6Ryw0Q0FJc0I7QUFDdEIsaURBQTRKO0FBQzVKLHFEQUE4RztBQUM5RyxxREFBcUQ7QUFHckQsdUNBQW1DO0FBd0JuQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxpR0FBaUc7QUFDakcseURBQXlEO0FBQ3pELFNBQWdCLDhCQUE4QjtJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRkQsd0VBRUM7QUFFRCxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLDZDQUE2QztBQUM3QyxJQUFJLG9CQUF3QyxDQUFDO0FBQzdDLFNBQWdCLHVCQUF1QixDQUFDLE1BQTBCO0lBQzlELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQixtQkFBbUI7SUFDL0IsSUFBSSxvQkFBb0I7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEUs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RyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdG9yYWdlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uU3RvcmFnZVwiO1xuaW1wb3J0IHsgSlNPTlN0b3JhZ2UgfSBmcm9tIFwiLi4vSlNPTlN0b3JhZ2VcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgSUJ1Y2tldFN0b3JlLCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVksIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBCYWNrYmxhemVDb25maWcsIElBcmNoaXZlcywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsXG4gICAgQXJjaGl2ZXNTeW5jU3RhdHVzLFxuICAgIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBwYXJzZUhvc3RlZFVybCwgYnVpbGRGaWxlVXJsLCBnZXRDb25maWdWZXJzaW9uLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcm91dGVJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGFwcGx5RGVwbG95UmVtYXAsIGdldFRha2VvdmVyQWx0UG9ydCwgZ2V0T3duV2luZG93RW5kQ2xpcCwgb25UYWtlb3ZlckV2ZW50IH0gZnJvbSBcIi4vZGVwbG95VGFrZW92ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzIH0gZnJvbSBcIi4vY3JlYXRlQXJjaGl2ZXNcIjtcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2UgfSBmcm9tIFwiLi4vSVN0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgQWNjZXNzUmVxdWVzdCwgVHJ1c3RSZWNvcmQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgZ2V0QXJnIH0gZnJvbSBcIi4vY2xpQXJnc1wiO1xuXG4vLyBUaGUgc3RvcmFnZSBzZXJ2ZXIncyBnbG9iYWwgc2VydmVyLXNpZGUgc3RhdGUuIGhvc3RTdG9yYWdlU2VydmVyIHNldHMgdGhlIGNvbmZpZyBvbmNlIGF0XG4vLyBzdGFydHVwOyBldmVyeXRoaW5nIGVsc2UgKHN5c3RlbSBzdG9yYWdlcywgYnVja2V0cykgaXMgYSBnbG9iYWwgY2FjaGUgY3JlYXRlZCBsYXppbHkgb24gZmlyc3Rcbi8vIHVzZSwgdGhyb3dpbmcgaWYgdGhlIGNvbmZpZyB3YXMgbmV2ZXIgc2V0LlxuLy9cbi8vIEJ1Y2tldHMgaGF2ZSBubyBzZXBhcmF0ZSByZWdpc3RyeTogZWFjaCBidWNrZXQncyBjb25maWd1cmF0aW9uIChhIFJlbW90ZUNvbmZpZykgbGl2ZXMgaW5zaWRlIHRoZVxuLy8gYnVja2V0IGl0c2VsZiwgYXQgUk9VVElOR19GSUxFLiBBIGJ1Y2tldCBleGlzdHMgaWZmIHRoYXQgZmlsZSBleGlzdHMuIFdyaXRpbmcgaXQgY3JlYXRlcyB0aGVcbi8vIGJ1Y2tldCAoYnVpbGRpbmcgaXRzIHN0b3JlLCB3aGljaCBtYXkgaW1tZWRpYXRlbHkgc3RhcnQgc3luY2hyb25pemF0aW9uIHNjYW5zKTsgb3ZlcndyaXRpbmcgaXQg4oCUXG4vLyBkaXJlY3RseSBvciB2aWEgYSBmaWxlIHB1bGxlZCBpbiBmcm9tIGEgc3luY2hyb25pemF0aW9uIHNvdXJjZSDigJQgcmVidWlsZHMgdGhlIHN0b3JlIHdpdGggdGhlIG5ld1xuLy8gc291cmNlcyAoY2FuY2VsbGluZyB0aGUgb2xkIHN0b3JlJ3Mgc2NhbnMpLlxuXG5leHBvcnQgdHlwZSBTdG9yYWdlU2VydmVyQ29uZmlnID0ge1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICByb290RG9tYWluOiBzdHJpbmc7XG4gICAgLy8gdXNlckBleHRlcm5hbElwIG9mIHRoZSBzdG9yYWdlIG1hY2hpbmUsIGZvciBnZW5lcmF0ZWQgc3NoIGNvbW1hbmRzXG4gICAgc3NoVGFyZ2V0OiBzdHJpbmc7XG4gICAgLy8gQWJzb2x1dGUgY29tbWFuZCB0aGF0IHJ1bnMgdGhlIGdyYW50QWNjZXNzIENMSSBvbiB0aGUgc3RvcmFnZSBtYWNoaW5lIChhZG1pbiBhcmdzIGFwcGVuZGVkKVxuICAgIHNlcnZlckNvbW1hbmQ6IHN0cmluZztcbiAgICAvLyBUaGUgc2VydmVyJ3Mgcm9vdCBzdG9yYWdlIGZvbGRlciAoYWJzb2x1dGUpXG4gICAgZm9sZGVyOiBzdHJpbmc7XG59O1xuXG5sZXQgY29uZmlnOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcodmFsdWU6IFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgICBjb25maWcgPSB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkICh0aGlzIEFQSSBvbmx5IHdvcmtzIG9uIHRoZSBzdG9yYWdlIHNlcnZlcilgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbi8vIEZvciBzZWxmLWRldGVjdGlvbjogY29kZSB0aGF0IENBTiBydW4gb3V0c2lkZSB0aGUgc3RvcmFnZSBzZXJ2ZXIgKGNyZWF0ZUFyY2hpdmVzKSB1c2VzIHRoaXMgdG9cbi8vIGNoZWNrIFwiaXMgdGhpcyBVUkwgb3VyIG93biBwcm9jZXNzP1wiIHdpdGhvdXQgdGhyb3dpbmcuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbi8vIFdoZW4gc2V0LCBhbGwgd3JpdGUtcGF0aCBvcGVyYXRpb25zIChjcmVhdGluZyBmaWxlcywgYXBwZW5kaW5nIGxhcmdlIHVwbG9hZHMsIGNyZWF0aW5nIGJ1Y2tldHMpXG4vLyB0aHJvdyB0aGlzIG1lc3NhZ2UuIFJlYWRzLCBmaW5kSW5mbywgYW5kIGRlbGV0ZXMgc3RpbGwgd29yayDigJQgc28gY2xpZW50cyBjYW4gZnJlZSBzcGFjZS4gTWFuYWdlZFxuLy8gYnkgaG9zdFN0b3JhZ2VTZXJ2ZXIncyBkaXNrLXNwYWNlIG1vbml0b3IuXG5sZXQgd3JpdGVzUmVqZWN0ZWRSZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbihyZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHdyaXRlc1JlamVjdGVkUmVhc29uID0gcmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRlc1JlamVjdGVkUmVhc29uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHdyaXRlc1JlamVjdGVkUmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdyaXRlc0FsbG93ZWQoKTogdm9pZCB7XG4gICAgaWYgKHdyaXRlc1JlamVjdGVkUmVhc29uKSB0aHJvdyBuZXcgRXJyb3Iod3JpdGVzUmVqZWN0ZWRSZWFzb24pO1xufVxuXG4vLyBUaGUgc3lzdGVtIHN0b3JhZ2VzICh0cnVzdCwgcmVxdWVzdHMpIGFyZSB0aGUgc2FtZSBraW5kIG9mIHRoaW5nIOKAlCBhIEpTT04ga2V5L3ZhbHVlIHN0b3JlIHVuZGVyXG4vLyA8Zm9sZGVyPi9zeXN0ZW0yLzxuYW1lPiDigJQgc28gdGhleSBzaGFyZSBvbmUgY2FjaGUsIGtleWVkIGJ5IG5hbWUuIChcInN5c3RlbTJcIiBiZWNhdXNlIHRoZSBsYXlvdXRcbi8vIGNoYW5nZWQgd2hlbiBidWNrZXQgY29uZmlncyBtb3ZlZCBpbnRvIHRoZSBidWNrZXRzIHRoZW1zZWx2ZXM7IG9sZCBcInN5c3RlbVwiL1wiYnVja2V0c1wiIGZvbGRlcnNcbi8vIGFyZSBzaW1wbHkgaWdub3JlZC4pXG4vLyBzZXRUcnVzdGVkTWFjaGluZXMgaXMgY2FsbGVkIGJ5IGNvbnN1bWVycyBCRUZPUkUgc3RhcnRpbmcgdGhlIHNlcnZlciwgc28gd2hlbiB0aGUgY29uZmlnIGlzbid0XG4vLyBzZXQgeWV0IHdlIGZhbGwgYmFjayB0byB0aGUgc2FtZSAtLWZvbGRlciBhcmcgdGhlIENMSSBzdGFydHMgdGhlIHNlcnZlciB3aXRoLlxuZnVuY3Rpb24gZ2V0U3RvcmFnZUZvbGRlcigpOiBzdHJpbmcge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoY29uZmlnKSByZXR1cm4gY29uZmlnLmZvbGRlcjtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkIGFuZCB0aGVyZSBpcyBubyAtLWZvbGRlciBhcmcsIHNvIHRoZSBzdG9yYWdlIGZvbGRlciBpcyB1bmtub3duYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZm9sZGVyKTtcbn1cblxuY29uc3Qgc3lzdGVtU3RvcmFnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxJU3RvcmFnZTx1bmtub3duPj4+KCk7XG5mdW5jdGlvbiBnZXRTeXN0ZW1TdG9yYWdlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICBsZXQgc3RvcmFnZSA9IHN5c3RlbVN0b3JhZ2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcm9vdCA9IGF3YWl0IGdldEZpbGVTdG9yYWdlTmVzdGVkMihnZXRTdG9yYWdlRm9sZGVyKCkpO1xuICAgICAgICAgICAgbGV0IHN5c3RlbSA9IGF3YWl0IHJvb3QuZm9sZGVyLmdldFN0b3JhZ2UoXCJzeXN0ZW0yXCIpO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uTmFtZSA9IFwic3RvcmFnZVwiICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8dW5rbm93bj4obmV3IFRyYW5zYWN0aW9uU3RvcmFnZShhd2FpdCBzeXN0ZW0uZm9sZGVyLmdldFN0b3JhZ2UobmFtZSksIHRyYW5zYWN0aW9uTmFtZSkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICBzeXN0ZW1TdG9yYWdlcy5zZXQobmFtZSwgc3RvcmFnZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlIGFzIFByb21pc2U8SVN0b3JhZ2U8VD4+O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRydXN0KCk6IFByb21pc2U8SVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+KFwidHJ1c3RcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdHMoKTogUHJvbWlzZTxJU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPihcInJlcXVlc3RzXCIpO1xufVxuXG4vKiogTWFrZXMgbWFjaGluZUlkcyB0aGUgY29tcGxldGUgdHJ1c3QgbGlzdCBmb3IgdGhlIGFjY291bnQ6IG1hY2hpbmVzIG5vdCBpbiB0aGUgbGlzdCBsb3NlIGFjY2VzcywgbWFjaGluZXMgYWxyZWFkeSB0cnVzdGVkIGtlZXAgdGhlaXIgZXhpc3RpbmcgcmVjb3JkLCBhbmQgbWlzc2luZyBvbmVzIGFyZSBhZGRlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG4vLyDilIDilIAgYnVja2V0cyDilIDilIBcblxuZXhwb3J0IHR5cGUgTG9hZGVkQnVja2V0ID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gVGhlIGJ1Y2tldCdzIHBhcnNlZCByb3V0aW5nIGNvbmZpZyAodGhlIGNvbnRlbnRzIG9mIFJPVVRJTkdfRklMRSlcbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgLy8gSlNPTiBvZiByb3V0aW5nLCBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgIHJvdXRpbmdKU09OOiBzdHJpbmc7XG4gICAgLy8gQUxMIG9mIG91ciBvd24gZW50cmllcyBpbiByb3V0aW5nLnNvdXJjZXMgKHRoaXMgYnVja2V0IG9uIHRoaXMgc2VydmVyKS4gTW9yZSB0aGFuIG9uZSB3aGVuXG4gICAgLy8gdGhlIGJ1Y2tldCdzIG9wdGlvbnMgY2hhbmdlIG92ZXIgdGltZSAtIG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93IChlLmcuIGltbXV0YWJsZSBkcm9wcGVkLFxuICAgIC8vIG9yIGZhc3QgZW5hYmxlZCwgc3RhcnRpbmcgYXQgYSBzY2hlZHVsZWQgaW5zdGFudCkuXG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIC8vIFRoZSBlbnRyeSB2YWxpZCB3aGVuIHRoZSBzdG9yZSB3YXMgYnVpbHQgLSB0aGUgc3RydWN0dXJhbCBvcHRpb25zIChyYXdEaXNrLCB3aGljaCBlbnRyaWVzXG4gICAgLy8gYXJlIGRvd25zdHJlYW0pLiBQZXItd3JpdGUgb3B0aW9ucyAoZmFzdC9pbW11dGFibGUpIGFyZSBpbnN0ZWFkIGV2YWx1YXRlZCBhdCBlYWNoIHdyaXRlJ3NcbiAgICAvLyB0aW1lLCBzZWUgZ2V0V3JpdGVDb25maWcvYXNzZXJ0TXV0YWJsZS4gdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkb2Vzbid0IG1lbnRpb24gdXMuXG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgLy8gVGhlIHN0b3JlIHBsYW4gbWludXMgaXRzIHZhbGlkIHdpbmRvd3MgKHNlZSBTdG9yZVBsYW4uc3RydWN0dXJlS2V5KTogd2hlbiBvbmx5IHdpbmRvd3NcbiAgICAvLyBjaGFuZ2UsIHRoZSBzdG9yZSBpcyB1cGRhdGVkIGluIHBsYWNlIGluc3RlYWQgb2YgcmVidWlsdFxuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4+KCk7XG5cbi8vIHNldFRpbWVvdXQgY2Fubm90IHJlcHJlc2VudCBsb25nZXIgZGVsYXlzOyBtb3JlIGRpc3RhbnQgd2luZG93IGJvdW5kYXJpZXMgcmUtY2hlY2sgYWZ0ZXIgdGhpc1xuY29uc3QgTUFYX1JFQlVJTERfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbi8vIFJlYnVpbGQgc2xpZ2h0bHkgYWZ0ZXIgdGhlIGJvdW5kYXJ5LCBzbyB0aGUgbmV3bHktdmFsaWQgZW50cnkgaXMgdW5hbWJpZ3VvdXNseSBhY3RpdmVcbmNvbnN0IFJFQlVJTERfQk9VTkRBUllfQlVGRkVSID0gMTAwMDtcblxuZnVuY3Rpb24gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbi8vIFBvcnRzIHdlIGFyZSBsaXN0ZW5pbmcgb24gYmV5b25kIHRoZSBtYWluIGNvbmZpZyBwb3J0IC0gYSBkZXBsb3ktdGFrZW92ZXIgc3VjY2Vzc29yIHNlcnZlcyBvbiBhXG4vLyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIHBvcnQsIGFuZCBtdXN0IHJlY29nbml6ZSBhbHRlcm5hdGUtcG9ydCBzb3VyY2UgVVJMcyBhcyBpdHNlbGZcbmNvbnN0IGV4dHJhTGlzdGVuUG9ydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRyYUxpc3RlblBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXh0cmFMaXN0ZW5Qb3J0cy5hZGQocG9ydCk7XG59XG5mdW5jdGlvbiBmaW5kU2VsZkluZGV4ZXMocm91dGluZzogUmVtb3RlQ29uZmlnLCBhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICAvLyBUaGUgdGFrZW92ZXIncyBhbHRlcm5hdGUgcG9ydCBpcyB0aGUgT1RIRVIgcHJvY2VzcyBvZiB0aGUgc3dpdGNob3Zlciwgb24gT1VSIG1hY2hpbmUgd2l0aFxuICAgIC8vIE9VUiBkaXNrIC0gc2VsZiBmb3Igc3luYyBwdXJwb3NlcyBvbiBib3RoIHNpZGVzICh0aGUgb2xkIG5vZGUgbXVzdCBub3Qgc2Nhbi9wdXNoIGl0cyBvd25cbiAgICAvLyBzdWNjZXNzb3I7IHRoZSBzaGFyZWQgZm9sZGVyIHBsdXMgdGhlIHN3aXRjaG92ZXIgZGlzayBzY2FucyByZWNvbmNpbGUgdGhlbSlcbiAgICBsZXQgdGFrZW92ZXJBbHRQb3J0ID0gZ2V0VGFrZW92ZXJBbHRQb3J0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0aW5nLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJvdXRpbmcuc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gZG9tYWluIHx8IHBhcnNlZC5hY2NvdW50ICE9PSBhY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBidWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHBhcnNlZC5wb3J0ID09PSBwb3J0IHx8IGV4dHJhTGlzdGVuUG9ydHMuaGFzKHBhcnNlZC5wb3J0KSB8fCBwYXJzZWQucG9ydCA9PT0gdGFrZW92ZXJBbHRQb3J0KSB7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbi8vIFRoZSBlbnRyeSB3aG9zZSB2YWxpZCB3aW5kb3cgY29udGFpbnMgdGhlIHRpbWUgKGFtb25nIHRoZSBlbnRyaWVzIGNvdmVyaW5nIHRoZSBrZXkncyByb3V0ZSxcbi8vIHdoZW4gb25lIGlzIGdpdmVuIC0gYSBzZXJ2ZXIgY2FuIGhvbGQgZGlmZmVyZW50IHNoYXJkcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zKS4gSGFsZi1vcGVuXG4vLyAoW3N0YXJ0LCBlbmQpKSwgc28gY2xlYW4gYnJlYWtzIHJlc29sdmUgdW5hbWJpZ3VvdXNseS4gRmFsbHMgYmFjayB0byB0aGUgbmVhcmVzdCB3aW5kb3cgd2hlblxuLy8gbm9uZSBjb250YWlucyB0aGUgdGltZSAtIGdhcHMgc2hvdWxkbid0IGV4aXN0LCBidXQgYSB3cml0ZSBtdXN0IHN0aWxsIHJlc29sdmUgdG8gU09NRVxuLy8gY29uZmlndXJhdGlvbi5cbmZ1bmN0aW9uIHNlbGVjdEVudHJ5QXQoZW50cmllczogSG9zdGVkQ29uZmlnW10sIHRpbWU6IG51bWJlciwgcm91dGU/OiBudW1iZXIpOiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjb3ZlcmluZyA9IGVudHJpZXMuZmlsdGVyKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICBpZiAoY292ZXJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gY292ZXJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbnRhaW5pbmcgPSBlbnRyaWVzLmZpbmQoeCA9PiB4LnZhbGlkV2luZG93WzBdIDw9IHRpbWUgJiYgdGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgIGlmIChjb250YWluaW5nKSByZXR1cm4gY29udGFpbmluZztcbiAgICBsZXQgYmVzdDogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGxldCBkaXN0YW5jZSA9IE1hdGgubWluKE1hdGguYWJzKHRpbWUgLSBlbnRyeS52YWxpZFdpbmRvd1swXSksIE1hdGguYWJzKHRpbWUgLSBlbnRyeS52YWxpZFdpbmRvd1sxXSkpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgYmVzdCA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuXG4vLyBCdWNrZXQgb3B0aW9ucyBjYW4gY2hhbmdlIG92ZXIgdGltZSAobXVsdGlwbGUgc2VsZiBlbnRyaWVzIHdpdGggZGlmZmVyZW50IHZhbGlkIHdpbmRvd3MpLCBhbmRcbi8vIHRoZSBzdHJ1Y3R1cmFsIG9uZXMgKHJhd0Rpc2ssIHRoZSBkb3duc3RyZWFtIGxpc3QpIGFyZSBiYWtlZCBpbnRvIHRoZSBzdG9yZSAtIHNvIHRoZSBzdG9yZSBpc1xuLy8gcmVidWlsdCBzaG9ydGx5IGFmdGVyIGVhY2ggb2Ygb3VyIHdpbmRvdyBib3VuZGFyaWVzIHBhc3NlcywgbWFraW5nIHRoZSBuZXdseS12YWxpZCBlbnRyeSBhcHBseS5cbmZ1bmN0aW9uIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IGJvdW5kYXJpZXMgPSBsb2FkZWQuc2VsZkVudHJpZXMuZmxhdE1hcCh4ID0+IHgudmFsaWRXaW5kb3cpLmZpbHRlcih0ID0+IHQgPiBub3cpO1xuICAgIGlmICghYm91bmRhcmllcy5sZW5ndGgpIHJldHVybjtcbiAgICBsZXQgbmV4dEJvdW5kYXJ5ID0gTWF0aC5taW4oLi4uYm91bmRhcmllcyk7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEEgcm91dGluZyBjaGFuZ2UgbWF5IGhhdmUgYWxyZWFkeSByZXBsYWNlZCB0aGlzIHN0b3JlOyBvbmx5IElUIGdldHMgYSBib3VuZGFyeSB0aW1lclxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBuZXh0Qm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJhIHZhbGlkIHdpbmRvdyBib3VuZGFyeSBwYXNzZWRcIiB9KTtcbiAgICAgICAgfSkoKTtcbiAgICB9LCBNYXRoLm1pbihuZXh0Qm91bmRhcnkgLSBub3cgKyBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG4vLyBFeHRyYSBzY2FucyBhcm91bmQgZWFjaCBvZiBPVVIgdmFsaWQtd2luZG93IHN0YXJ0cyAoYSBkZXBsb3kgc3dpdGNob3ZlciBpcyBqdXN0IHRoaXMgdG9vIC0gaXRzXG4vLyByZW1hcCBhZGRzIHZhbGlkIHdpbmRvd3MpLCBjYXRjaGluZyBsYXN0LW1vbWVudCB3cml0ZXMgdGhlIHByZXZpb3VzIHdpbmRvdydzIG93bmVyIGFjY2VwdGVkIG5lYXJcbi8vIHRoZSBib3VuZGFyeS4gQnkgdGhlIGZpbmFsIHNjYW4gdGhlIHByZXZpb3VzIG93bmVyIGhhcyBmbHVzaGVkIGV2ZXJ5dGhpbmcgKGZhc3Qgd3JpdGVzIG5ldmVyXG4vLyBkZWxheSBwYXN0IGEgd2luZG93J3MgZW5kKSwgc28gbm90aGluZyBpcyBtaXNzZWQuXG5jb25zdCBCT1VOREFSWV9TQ0FOX09GRlNFVFMgPSBbLTMwICogMTAwMCwgMiAqIDEwMDAsIDMwICogMTAwMF07XG4vLyBIb3cgZmFyIGJhY2sgYSBib3VuZGFyeSBzY2FuIGFza3MgdGhlIHByZXZpb3VzIG93bmVyIGZvciBjaGFuZ2VzOiBhbnl0aGluZyBvbGRlciBoYXMgYWxyZWFkeVxuLy8gYXJyaXZlZCB0aHJvdWdoIG5vcm1hbCBzeW5jaHJvbml6YXRpb24sIGFuZCB0aGlzIGNvdmVycyB0aGUgbG9uZ2VzdCBhIHdyaXRlIGNhbiBzaXQgdW5mbHVzaGVkXG5jb25zdCBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLID0gREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZICsgV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4vLyBUaGUgY2F0Y2gtdXAgc2NhbiBmb3IgYSB3aW5kb3cgdGhhdCB3YXMgYWxyZWFkeSBhY3RpdmUgd2hlbiB3ZSBidWlsdCB0aGUgc3RvcmVcbmNvbnN0IFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSA9IDMwICogMTAwMDtcblxuLy8gRWFjaCAoYnVja2V0LCBib3VuZGFyeSwgb2Zmc2V0KSBpcyBzY2hlZHVsZWQgZXhhY3RseSBvbmNlLCBzdXJ2aXZpbmcgc3RvcmUgcmVidWlsZHMgLSB0aGUgdGltZXJcbi8vIHJlLXJlc29sdmVzIHRoZSBidWNrZXQgKGFuZCByZWNvbXB1dGVzIG93bmVycyBmcm9tIHRoZSB0aGVuLWN1cnJlbnQgcm91dGluZykgd2hlbiBpdCBmaXJlc1xuY29uc3Qgc2NoZWR1bGVkQm91bmRhcnlTY2FucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYm91bmRhcnlTY2Fuc1J1bm5pbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IHN0YXJ0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHNlbGYudmFsaWRXaW5kb3dbMF07XG4gICAgICAgIGlmIChzdGFydCA+IG5vdyAmJiBzdGFydCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBzdGFydHMuYWRkKHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBIHdpbmRvdyB3ZSBhcmUgQUxSRUFEWSBpbnNpZGUgd2hlbiB0aGUgc3RvcmUgaXMgYnVpbHQgKHN0YXJ0dXAsIG9yIGEgY29uZmlnIHRoYXQgbWFkZSB1c1xuICAgIC8vIHZhbGlkIGltbWVkaWF0ZWx5KSBnb3Qgbm9uZSBvZiB0aGUgbGVhZC11cCBzY2FucyAtIHNvIG9uZSBydW5zIHNob3J0bHkgYWZ0ZXIsIGluIGNhc2Ugd2VcbiAgICAvLyBjYW1lIHVwIGp1c3QgYXMgdGhlIHByZXZpb3VzIG93bmVyIGlzIHJlYWxpemluZyBpdCBtdXN0IHNodXQgZG93bi4gT25seSByZWNlbnQgYm91bmRhcmllc1xuICAgIC8vIHF1YWxpZnk6IG9sZGVyIHRyYWlsaW5nIHdyaXRlcyBoYXZlIGxvbmcgc2luY2UgcHJvcGFnYXRlZCB0aHJvdWdoIG5vcm1hbCBzeW5jaHJvbml6YXRpb24uXG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghKHN0YXJ0IDw9IG5vdyAmJiBub3cgPCBlbmQpIHx8IHN0YXJ0IDw9IDApIGNvbnRpbnVlO1xuICAgICAgICBpZiAobm93IC0gc3RhcnQgPiBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXxzdGFydHVwYDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVksIFwic3RhcnR1cCszMHNcIikuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBzdGFydCBvZiBzdGFydHMpIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0IG9mIEJPVU5EQVJZX1NDQU5fT0ZGU0VUUykge1xuICAgICAgICAgICAgbGV0IGF0ID0gc3RhcnQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYXQgPD0gbm93KSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18JHtvZmZzZXR9YDtcbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICAgICAgbGV0IGFybSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGltZXIgbGVuZ3RoIGlzIGNhcHBlZCAoZmFyLWZ1dHVyZSBib3VuZGFyaWVzKSwgc28gcmUtYXJtIHVudGlsIHRoZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGFycml2ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgb2Zmc2V0KS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgICAgICAgICAgfSwgTWF0aC5taW4oYXQgLSBEYXRlLm5vdygpLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICAgICAgICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJvdW5kYXJ5U2NhbihidWNrZXRLZXk6IHN0cmluZywgd2luZG93U3RhcnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIG9mZnNldExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhYmVsID0gYGJ1Y2tldCAke2J1Y2tldEtleX0sIHdpbmRvdyBzdGFydGluZyAke25ldyBEYXRlKHdpbmRvd1N0YXJ0KS50b0lTT1N0cmluZygpfSwgb2Zmc2V0ICR7b2Zmc2V0TGFiZWwgfHwgYCR7b2Zmc2V0IC8gMTAwMH1zYH1gO1xuICAgIGlmIChib3VuZGFyeVNjYW5zUnVubmluZy5oYXMoYnVja2V0S2V5KSkge1xuICAgICAgICAvLyBCb3VuZGFyeSBzY2FucyBuZXZlciBydW4gaW4gcGFyYWxsZWw7IGEgc2xvdyBvbmUgc2ltcGx5IHN3YWxsb3dzIGxhdGVyIHNjaGVkdWxlZCBwb2ludHNcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIGJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogdGhlIHByZXZpb3VzIGJvdW5kYXJ5IHNjYW4gaXMgc3RpbGwgcnVubmluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmFkZChidWNrZXRLZXkpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChidWNrZXRLZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RvcmUgPSBsb2FkZWQuc3RvcmU7XG4gICAgICAgIGlmICghKHN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgcmV0dXJuO1xuICAgICAgICAvLyBPd25lcnMgYXJlIHJlY29tcHV0ZWQgYXQgZmlyZSB0aW1lIC0gdGhlIHJvdXRpbmcgKG9yIHRoZSB0YWtlb3ZlciByZW1hcCkgbWF5IGhhdmVcbiAgICAgICAgLy8gY2hhbmdlZCBzaW5jZSB0aGlzIHNjYW4gd2FzIHNjaGVkdWxlZFxuICAgICAgICBsZXQgZWZmZWN0aXZlID0gYXBwbHlEZXBsb3lSZW1hcChsb2FkZWQucm91dGluZyk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhTZXQgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgbGV0IHNlbHZlcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZykuZmlsdGVyKHggPT4geC52YWxpZFdpbmRvd1swXSA9PT0gd2luZG93U3RhcnQpO1xuICAgICAgICBpZiAoIXNlbHZlcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZUaW1lID0gd2luZG93U3RhcnQgLSAxO1xuICAgICAgICBsZXQgbmVlZERpc2tTY2FuID0gZmFsc2U7XG4gICAgICAgIC8vIHNvdXJjZUluZGV4IC0+IHRoZSBzbGljZSBvZiBvdXIgcm91dGUgdGhhdCBzb3VyY2Ugb3duZWQgaW4gdGhlIHByZXZpb3VzIHdpbmRvd1xuICAgICAgICBsZXQgcmVtb3RlT3duZXJzID0gbmV3IE1hcDxudW1iZXIsIFtudW1iZXIsIG51bWJlcl0+KCk7XG4gICAgICAgIGZvciAobGV0IHNlbGYgb2Ygc2VsdmVzKSB7XG4gICAgICAgICAgICBsZXQgc2VsZlJvdXRlID0gc2VsZi5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgbGV0IGlkeCA9IGVmZmVjdGl2ZS5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgICAgICAgICAvLyBUaGVzZSBzY2FucyBvbmx5IHJ1biBvbiB0aGUgd3JpdGUgbm9kZSAtIHRoZSBmaXJzdCBzb3VyY2UgdmFsaWQgYXQgdGhlIG5ldyB3aW5kb3cnc1xuICAgICAgICAgICAgLy8gc3RhcnQgZm9yIG91ciByb3V0ZS4gQW4gZWFybGllciBlbnRyeSBmdWxseSBjb3ZlcmluZyBvdXIgcm91dGUgbWVhbnMgd3JpdGVzIGdvIHRoZXJlLFxuICAgICAgICAgICAgLy8gYW5kIElUIGRvZXMgdGhlIGJvdW5kYXJ5IHNjYW5zLlxuICAgICAgICAgICAgbGV0IHNoYWRvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlkeDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gd2luZG93U3RhcnQgJiYgd2luZG93U3RhcnQgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoclswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZG93ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIHdpbmRvdydzIG93bmVyczogd2Fsa2luZyB0aGUgY29uZmlnIGluIG9yZGVyICh3cml0ZS10YXJnZXQgb3JkZXIpLFxuICAgICAgICAgICAgLy8gZWFjaCBzb3VyY2UgY2xhaW1zIHdoYXRldmVyIHNsaWNlIG9mIG91ciByb3V0ZSBubyBlYXJsaWVyIHNvdXJjZSBhbHJlYWR5IG93bnNcbiAgICAgICAgICAgIGxldCB1bmNvdmVyZWQ6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtbc2VsZlJvdXRlWzBdLCBzZWxmUm91dGVbMV1dXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWZmZWN0aXZlLnNvdXJjZXMubGVuZ3RoICYmIHVuY292ZXJlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IGVmZmVjdGl2ZS5zb3VyY2VzW2pdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBbd3MsIHdlXSA9IG90aGVyLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgIGlmICghKHdzIDw9IHByZXZUaW1lICYmIHByZXZUaW1lIDwgd2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgciA9IG90aGVyLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZzogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGNsYWltZWQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdSBvZiB1bmNvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyID0gcm91dGVJbnRlcnNlY3Rpb24odSwgcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5wdXNoKHUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhaW1lZCA9IGNsYWltZWQgJiYgW01hdGgubWluKGNsYWltZWRbMF0sIGludGVyWzBdKSwgTWF0aC5tYXgoY2xhaW1lZFsxXSwgaW50ZXJbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGludGVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodVswXSA8IGludGVyWzBdKSByZW1haW5pbmcucHVzaChbdVswXSwgaW50ZXJbMF1dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyWzFdIDwgdVsxXSkgcmVtYWluaW5nLnB1c2goW2ludGVyWzFdLCB1WzFdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY292ZXJlZCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICBpZiAoIWNsYWltZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmSW5kZXhTZXQuaGFzKGopKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBvd25lciBzaGFyZXMgb3VyIHN0b3JhZ2UgKHNhbWUgbWFjaGluZSArIGJ1Y2tldCwgZS5nLiB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBvZiBhIGRlcGxveSBzd2l0Y2hvdmVyKSwgc28gYSBkaXNrIHJlc2NhbiBzZWVzIGl0cyB3cml0ZXNcbiAgICAgICAgICAgICAgICAgICAgbmVlZERpc2tTY2FuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSByZW1vdGVPd25lcnMuZ2V0KGopO1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVPd25lcnMuc2V0KGosIGV4aXN0aW5nICYmIFtNYXRoLm1pbihleGlzdGluZ1swXSwgY2xhaW1lZFswXSksIE1hdGgubWF4KGV4aXN0aW5nWzFdLCBjbGFpbWVkWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBjbGFpbWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZWVkRGlza1NjYW4gJiYgIXJlbW90ZU93bmVycy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IGRpc2tTY2FuPSR7bmVlZERpc2tTY2FufSwgcmVtb3RlIHByZXZpb3VzLXdpbmRvdyBvd25lcnM6ICR7cmVtb3RlT3duZXJzLnNpemV9YCk7XG4gICAgICAgIGlmIChuZWVkRGlza1NjYW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2luY2UgPSB3aW5kb3dTdGFydCAtIEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0s7XG4gICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIHJlbW90ZU93bmVycykge1xuICAgICAgICAgICAgbGV0IG93bmVyU291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KSBvZiBwcmV2aW91cy13aW5kb3cgb3duZXIgKHNvdXJjZSBpbmRleCAke3NvdXJjZUluZGV4fSkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGJ1Y2tldEtleSk7XG4gICAgfVxufVxuXG50eXBlIFN0b3JlUGxhbiA9IHtcbiAgICBlZmZlY3RpdmU6IFJlbW90ZUNvbmZpZztcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHJhd0Rpc2s6IGJvb2xlYW47XG4gICAgLy8gVGhlIEJsb2JTdG9yZSBzb3VyY2VzIHRoaXMgcGxhbiBidWlsZHM6IFswXSBpcyB0aGUgZGlzaywgdGhlIHJlc3QgYXJlIGRvd25zdHJlYW0gY29uZmlnc1xuICAgIHNvdXJjZVNwZWNzOiB7IHNvdXJjZUNvbmZpZz86IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZzsgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07IHJvdXRlPzogW251bWJlciwgbnVtYmVyXTsgbm9GdWxsU3luYz86IGJvb2xlYW4gfVtdO1xuICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAvLyBFdmVyeXRoaW5nIGFib3V0IHRoZSBwbGFuIEVYQ0VQVCB0aGUgdmFsaWQgd2luZG93cy4gVHdvIHBsYW5zIHdpdGggZXF1YWwgc3RydWN0dXJlIGtleXNcbiAgICAvLyBkaWZmZXIgb25seSBpbiB3aW5kb3dzLCB3aGljaCB0aGUgcnVubmluZyBzdG9yZSBhcHBsaWVzIGluIHBsYWNlIC0gaXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIC8vIHJvdXRpbmUgY29uZmlnIGV2b2x1dGlvbiBvZiByZWR1Y2luZyB0aGUgbGFzdCBmb3JldmVyLXdpbmRvdyBhbmQgYXBwZW5kaW5nIGEgbmV3IGVudHJ5LFxuICAgIC8vIGluc3RlYWQgb2YgYmVpbmcgZGlzcG9zZWQgYW5kIHJlYnVpbHQgKGxvc2luZyBzeW5jIHN0YXRlIGFuZCByZXNjYW5uaW5nIGV2ZXJ5dGhpbmcpLlxuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuLy8gVGhlIHN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBlbmRwb2ludDogaXRzIGNvbmZpZyB3aXRoIHRoZSBpbi1wbGFjZS11cGRhdGFibGUgcGFydHNcbi8vICh3aW5kb3dzLCByb3V0ZXMpIHN0cmlwcGVkLCBzbyBhIHNvdXJjZSBpcyByZWNvZ25pemVkIGFjcm9zcyBjb25maWcgY2hhbmdlc1xuZnVuY3Rpb24gc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghc291cmNlQ29uZmlnKSByZXR1cm4gXCJkaXNrXCI7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgLi4uc291cmNlQ29uZmlnLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkLCByb3V0ZTogdW5kZWZpbmVkIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcpOiBTdG9yZVBsYW4ge1xuICAgIC8vIFRoZSBkZXBsb3ktdGFrZW92ZXIgcmVtYXAgaXMgYW4gSU5URVJQUkVUQVRJT04gb3ZlcmxheTogZXZlcnl0aGluZyBiZWhhdmlvcmFsIChzZWxmIGVudHJpZXMsXG4gICAgLy8gd2luZG93cywgZG93bnN0cmVhbSBzb3VyY2VzKSB1c2VzIHRoZSByZW1hcHBlZCB2aWV3LCB3aGlsZSBsb2FkZWQucm91dGluZy9yb3V0aW5nSlNPTiBzdGF5XG4gICAgLy8gdGhlIFNUT1JFRCBjb25maWcgLSBzbyB2ZXJzaW9uIGd1YXJkcywgY2hhbmdlIGRldGVjdGlvbiwgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciBzZWUgKG9yXG4gICAgLy8gcGVyc2lzdCkgdGhlIHJlbWFwXG4gICAgbGV0IGVmZmVjdGl2ZSA9IGFwcGx5RGVwbG95UmVtYXAocm91dGluZyk7XG4gICAgbGV0IHNlbGZJbmRleGVzID0gZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gZWZmZWN0aXZlLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKTtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoc2VsZkVudHJpZXMsIERhdGUubm93KCkpO1xuICAgIGxldCBzZWxmSW5kZXggPSAtMTtcbiAgICBpZiAoc2VsZikge1xuICAgICAgICBzZWxmSW5kZXggPSBlZmZlY3RpdmUuc291cmNlcy5pbmRleE9mKHNlbGYpO1xuICAgIH1cbiAgICAvLyBPdXIgb3duIGRpc2sgaXMgdGhlIGJhc2Ugc291cmNlOyBvbmx5IHRoZSByb3V0aW5nIGVudHJpZXMgRE9XTlNUUkVBTSBmcm9tIHVzIChhZnRlciBvdXJcbiAgICAvLyBjdXJyZW50bHktdmFsaWQgZW50cnkpIGJlY29tZSBzeW5jaHJvbml6YXRpb24gc291cmNlcy4gVXBzdHJlYW0gc291cmNlcyBzeW5jIGZyb20gdXMsIHNvXG4gICAgLy8gd3JpdGluZyB0byBvciBzY2FubmluZyB0aGVtIHdvdWxkIGp1c3QgZWNobyBvdXIgb3duIGRhdGEgYmFjayAoYW5kIG1ha2Ugb3VyIGF2YWlsYWJpbGl0eVxuICAgIC8vIGRlcGVuZCBvbiB0aGVpcnMpLiBBIHNlcnZlciBOT1QgaW4gdGhlIGxpc3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBidWNrZXQ6IGl0IGtlZXBzXG4gICAgLy8gaXRzIGRpc2sgZGF0YSAodGhlIGNvbmZpZyBtYXkgcmUtYWRkIGl0KSwgYnV0IHN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gLSBubyBvbmVcbiAgICAvLyBjb250YWN0cyBhIHJlbW92ZWQgc291cmNlLCBhbmQgc2Nhbm5pbmcvcHVzaGluZyBhcyBpZiB3ZSB3ZXJlIHN0aWxsIG9uZSB3b3VsZCBmaWdodCB0aGVcbiAgICAvLyByZWFsIGNoYWluLiBUaGUgY29uZmlnLWxldmVsIHZhbGlkV2luZG93IHJpZGVzIG9uIGVhY2ggQXJjaGl2ZXNTb3VyY2U7IHRoZSBkaXNrIHNvdXJjZVxuICAgIC8vIHNoYXJlcyBvdXIgY3VycmVudGx5LXZhbGlkIGVudHJ5J3Mgd2luZG93IChpdCBob2xkcyBvdXIgY29weSBvZiB0aGUgZGF0YSkuXG4gICAgLy8gT3VyIG93biBkaXNrIGdldHMgbm8gcm91dGUgZmlsdGVyOiBldmVyeXRoaW5nIGl0IGhvbGRzIGlzIG91cnMgdG8gaW5kZXggYW5kIHNlcnZlLlxuICAgIC8vIEJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgY29uZmlnIGVudGlyZWx5IGlzIGEgdmFsaWQgd2luZG93IG9mIE5PVEhJTkcgKFswLCAwXSk6IGZhc3RcbiAgICAvLyB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHkgKG5vdGhpbmcgbWF5IHNpdCBpbiBtZW1vcnkgb24gYSBub2RlIHRoYXQncyBiZWVuIGN1dCBvdXQpLFxuICAgIC8vIHdoaWxlIHRoZSBkaXNrIGRhdGEgYW5kIGluZGV4IHN0YXkgc2VydmVkLlxuICAgIC8vIEludGVybmFsbHkgZXZlcnkgc2VsZiBlbnRyeSBpcyB0aGUgU0FNRSBzdG9yZSAtIG9uZSBwcm9jZXNzIGxpc3RlbmluZyBvbiBvbmUgb3IgbW9yZSBwb3J0c1xuICAgIC8vIChhIHRha2VvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgbWlkZGxlIHdpbmRvdyBpbmNsdWRlZCkuIFNvIHRoZSBkaXNrIHdpbmRvdyBtZXJnZXMgYWxsXG4gICAgLy8gY29udGlndW91cyBvd24gd2luZG93czogYW4gb3B0aW9ucyBib3VuZGFyeSBvciB0aGUgcG9ydCBzcGxpdCBtdXN0IG5ldmVyIGZvcmNlIGEgcG9pbnRsZXNzXG4gICAgLy8gaW50ZXJuYWwgZmx1c2ggYmV0d2VlbiB0d28gd2luZG93cyB0aGF0IGFyZSBib3RoIHVzLiBPbmx5IHRoZSBEWUlORyBwcm9jZXNzIG9mIGEgdGFrZW92ZXJcbiAgICAvLyBjbGlwcyBpdHMgZW5kIC0gZnJvbSB0aGUgd3JpdGUgaGFuZG9mZiBvbiwgdGhlIGRhdGEgYmVsb25ncyB0byB0aGUgc3VjY2Vzc29yIHByb2Nlc3MuXG4gICAgbGV0IGRpc2tXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgaWYgKHNlbGYpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB3aGlsZSAobWVyZ2VkKSB7XG4gICAgICAgICAgICBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHNlbGZFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtlbnRyeVN0YXJ0LCBlbnRyeUVuZF0gPSBlbnRyeS52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA+IGVuZCB8fCBlbnRyeUVuZCA8IHN0YXJ0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA8IHN0YXJ0IHx8IGVudHJ5RW5kID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIGVudHJ5U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIGVudHJ5RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNsaXAgPSBnZXRPd25XaW5kb3dFbmRDbGlwKCk7XG4gICAgICAgIGlmIChjbGlwICE9PSB1bmRlZmluZWQgJiYgY2xpcCA8IGVuZCkge1xuICAgICAgICAgICAgZW5kID0gY2xpcDtcbiAgICAgICAgfVxuICAgICAgICBkaXNrV2luZG93ID0gW3N0YXJ0LCBlbmRdO1xuICAgIH1cbiAgICBsZXQgb3duSW5kZXhlcyA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgIGxldCBzb3VyY2VTcGVjczogU3RvcmVQbGFuW1wic291cmNlU3BlY3NcIl0gPSBbe1xuICAgICAgICB2YWxpZFdpbmRvdzogZGlza1dpbmRvdyxcbiAgICB9XTtcbiAgICBpZiAoc2VsZkluZGV4ICE9PSAtMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gc2VsZkluZGV4ICsgMTsgaSA8IGVmZmVjdGl2ZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBvd25JbmRleGVzLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBEaXNqb2ludC1zaGFyZCBzb3VyY2VzIG5ldmVyIHRhbGsgdG8gZWFjaCBvdGhlcjsgYSBwYXJ0aWFsIG92ZXJsYXAgc3luY3Mgb25seVxuICAgICAgICAgICAgLy8gdGhlIGludGVyc2VjdGlvbiAoc2NhbnMgaWdub3JlIHRoZSByZXN0LCB3cml0ZXMgb25seSBzZW5kIG1hdGNoaW5nIGtleXMpXG4gICAgICAgICAgICBsZXQgc2hhcmVkUm91dGUgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmPy5yb3V0ZSwgc291cmNlLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gQSBib3VuZGVkLWNhY2hlIHNlcnZlciAobm9GdWxsU3luYyBvbiBvdXIgb3duIGVudHJ5KSBtdXN0IG5vdCBmdWxsLXN5bmMgZnJvbVxuICAgICAgICAgICAgLy8gQU5ZIHNvdXJjZSwgb3IgaXRzIGRpc2sgd291bGQgZmlsbCByZWdhcmRsZXNzIG9mIHRoZSBsaW1pdFxuICAgICAgICAgICAgc291cmNlU3BlY3MucHVzaCh7IHNvdXJjZUNvbmZpZzogc291cmNlLCB2YWxpZFdpbmRvdzogc291cmNlLnZhbGlkV2luZG93LCByb3V0ZTogc2hhcmVkUm91dGUsIG5vRnVsbFN5bmM6IHNvdXJjZS5ub0Z1bGxTeW5jIHx8IHNlbGY/Lm5vRnVsbFN5bmMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhd0Rpc2sgPSAhIXNlbGY/LnJhd0Rpc2s7XG4gICAgLy8gT25seSB3aGF0IHRoZSBydW5uaW5nIHN0b3JlIGdlbnVpbmVseSBjYW5ub3QgY2hhbmdlIGluIHBsYWNlOiB0aGUgc3RvcmUgVFlQRSAocmF3RGlzaykgYW5kXG4gICAgLy8gd2hldGhlciB0aGUgZGlzay1saW1pdCBwb2xsIHJ1bnMuIFNvdXJjZSBhZGRpdGlvbnMvcmVtb3ZhbHMgYW5kIHdpbmRvdy9yb3V0ZSBjaGFuZ2VzIGFyZSBhbGxcbiAgICAvLyBhcHBsaWVkIGxpdmUgdmlhIHVwZGF0ZVNvdXJjZXMgLSBhIGNvbmZpZyBjaGFuZ2UgbXVzdCBuZXZlciBkZXN0cm95IHRoZSBydW5uaW5nIHN0b3JlLlxuICAgIGxldCBzdHJ1Y3R1cmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJhd0Rpc2ssXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogc2VsZj8ucmVhZGVyRGlza0xpbWl0LFxuICAgIH0pO1xuICAgIHJldHVybiB7IGVmZmVjdGl2ZSwgc2VsZkVudHJpZXMsIHNlbGYsIHJhd0Rpc2ssIHNvdXJjZVNwZWNzLCByZWFkZXJEaXNrTGltaXQ6IHNlbGY/LnJlYWRlckRpc2tMaW1pdCwgc3RydWN0dXJlS2V5IH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcsIHBsYW4/OiBTdG9yZVBsYW4pOiBMb2FkZWRCdWNrZXQge1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFwbGFuKSB7XG4gICAgICAgIHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIH1cbiAgICBsZXQgeyBzZWxmRW50cmllcywgc2VsZiB9ID0gcGxhbjtcbiAgICBsZXQgc3RvcmU6IElCdWNrZXRTdG9yZTtcbiAgICBpZiAocGxhbi5yYXdEaXNrKSB7XG4gICAgICAgIHN0b3JlID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc2VsZikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFRoaXMgc2VydmVyIGlzIG5vdCBpbiB0aGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IG5vIGxvbmdlciBzeW5jaHJvbml6aW5nLCB2YWxpZCB3aW5kb3cgdHJlYXRlZCBhcyBbMCwgMF0gKGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5KSwgZGlzayBkYXRhIGtlcHQgYW5kIHNlcnZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gcGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiAoe1xuICAgICAgICAgICAgc291cmNlOiBzcGVjLnNvdXJjZUNvbmZpZyAmJiBjcmVhdGVBcGlBcmNoaXZlcyhzcGVjLnNvdXJjZUNvbmZpZykgfHwgbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csXG4gICAgICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzcGVjLnNvdXJjZUNvbmZpZyksXG4gICAgICAgIH0pKTtcbiAgICAgICAgc3RvcmUgPSBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ6IGtleSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZXMgZm9yIG91ciBvd24gcm91dGluZyB3cml0ZXMgQU5EIHJvdXRpbmcgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb25cbiAgICAgICAgICAgICAgICAvLyAob25seSBldmVyIG5ld2VyIG9uZXMsIHNlZSBJQXJjaGl2ZXMuc2V0KSDigJQgZWl0aGVyIHdheSwgYXBwbHkgdGhlIG5ldyBjb25maWdcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2b2lkIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHBsYW4ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZDogTG9hZGVkQnVja2V0ID0geyBhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nLCByb3V0aW5nSlNPTjogSlNPTi5zdHJpbmdpZnkocm91dGluZyksIHNlbGZFbnRyaWVzLCBzZWxmLCBzdG9yZSwgc3RydWN0dXJlS2V5OiBwbGFuLnN0cnVjdHVyZUtleSB9O1xuICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZCk7XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGxvYWRlZCA9IGxvYWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgbG9hZGVkKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIGFyZSBub3QgY2FjaGVkIOKAlCB0aGV5IGNhbiBiZSBjcmVhdGVkIGF0IGFueSB0aW1lIChndWFyZGluZyBhZ2FpbnN0IGFcbiAgICAgICAgLy8gY29uY3VycmVudCBjcmVhdGUgaGF2aW5nIGFscmVhZHkgcmVwbGFjZWQgb3VyIGVudHJ5KVxuICAgICAgICB2b2lkIGxvYWRlZC50aGVuKGJ1Y2tldCA9PiB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCAmJiBidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbi8vIFJvdXRpbmcgcmVsb2FkcyBhcmUgc2VyaWFsaXplZCBwZXIgYnVja2V0LCBzbyBjb25jdXJyZW50IHdyaXRlcy9zeW5jcyBjYW4ndCByZWJ1aWxkIHRoZSBzYW1lXG4vLyBzdG9yZSB0d2ljZSBpbiBwYXJhbGxlbFxuY29uc3Qgcm91dGluZ1JlbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcbmZ1bmN0aW9uIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBuZXh0ID0gKHJvdXRpbmdSZWxvYWRzLmdldChrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgICAudGhlbigoKSA9PiBjaGVja1JvdXRpbmdDaGFuZ2VkKGFjY291bnQsIGJ1Y2tldE5hbWUsIGNvbmZpZykpXG4gICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoYFJlbG9hZGluZyByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6YCwgZSkpO1xuICAgIHJvdXRpbmdSZWxvYWRzLnNldChrZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1JvdXRpbmdDaGFuZ2VkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGl0IGlzIG5ldmVyIHB1bGxlZCBmcm9tIGFub3RoZXJcbiAgICAvLyBzb3VyY2UgKGl0IHJlYWNoZXMgdXMgZXhjbHVzaXZlbHkgYXMgYSB2ZXJzaW9uLXZhbGlkYXRlZCB3cml0ZSwgd2hpY2ggbGFuZHMgb24gZGlzayBmaXJzdClcbiAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgaWYgKCFjb25maWc/LmZvcmNlICYmIEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpID09PSBsb2FkZWQucm91dGluZ0pTT04pIHJldHVybjtcbiAgICBsZXQgcmVhc29uID0gY29uZmlnPy5mb3JjZSAmJiAoY29uZmlnLnJlYXNvbiB8fCBcImZvcmNlZFwiKSB8fCBcInJvdXRpbmcgY29uZmlnIGNoYW5nZWRcIjtcbiAgICBsZXQgcGxhbiA9IGNvbXB1dGVTdG9yZVBsYW4oYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyk7XG4gICAgLy8gQ29uZmlnIGNoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIFJVTk5JTkcgc3RvcmUgaW4gcGxhY2UgLSB3aW5kb3dzL3JvdXRlcyBtdXRhdGUsIGFkZGVkXG4gICAgLy8gc291cmNlcyBzdGFydCBzeW5jaW5nLCByZW1vdmVkIHNvdXJjZXMnIHNsb3RzIGdvIGRlYWQgLSBzbyB0aGUgaW5kZXgsIHBlbmRpbmcgZmFzdCB3cml0ZXNcbiAgICAvLyAocmUtY2FwcGVkIHRvIHRoZSBuZXcgZGVhZGxpbmUpLCBhbmQgdW5hZmZlY3RlZCBzeW5jIGxvb3BzIGFsbCBzdXJ2aXZlLiBUaGUgc3RvcmUgaXMgb25seVxuICAgIC8vIGRlc3Ryb3llZCBmb3Igd2hhdCBpdCBzdHJ1Y3R1cmFsbHkgY2Fubm90IGV4cHJlc3MgKGEgcmF3RGlzayBmbGlwKS5cbiAgICBpZiAocGxhbi5zdHJ1Y3R1cmVLZXkgPT09IGxvYWRlZC5zdHJ1Y3R1cmVLZXkgJiYgbG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBcHBseWluZyB0aGUgcm91dGluZyBjb25maWcgdG8gdGhlIHJ1bm5pbmcgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICAgICAgbG9hZGVkLnN0b3JlLnVwZGF0ZVNvdXJjZXMocGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb25maWcgPSBzcGVjLnNvdXJjZUNvbmZpZztcbiAgICAgICAgICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHVuZGVmaW5lZCksIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LCBjcmVhdGU6ICgpOiBJQXJjaGl2ZXMgPT4gbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRlOiBzcGVjLnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBMb2FkZWRCdWNrZXQgPSB7IC4uLmxvYWRlZCwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllczogcGxhbi5zZWxmRW50cmllcywgc2VsZjogcGxhbi5zZWxmIH07XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWQpKTtcbiAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQodXBkYXRlZCk7XG4gICAgICAgIHNjaGVkdWxlQm91bmRhcnlTY2Fucyh1cGRhdGVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUmVidWlsZGluZyB0aGUgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICBpZiAobG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHBsYW4pKSk7XG59XG5cbi8vIFBlci13cml0ZSBvcHRpb25zIGFyZSBldmFsdWF0ZWQgYXQgdGhlIFdSSVRFJ3MgdGltZSAoYW5kIHRoZSBrZXkncyByb3V0ZSksIG5vdCB0aGUgY3VycmVudFxuLy8gY29uZmlnOiB0aGUgd3JpdGUgdGltZSBpcyBzdGFtcGVkIGV4YWN0bHkgb25jZSAoYXQgdGhlIGZpcnN0IG5vZGUgdGhhdCByZWNlaXZlcyB0aGUgd3JpdGUpIGFuZFxuLy8gcHJvcGFnYXRlcyB3aXRoIHRoZSBkYXRhLCBzbyBldmVyeSBub2RlIHJlc29sdmVzIHRoZSBzYW1lIHNlbGYgZW50cnkgLSBhbmQgdGhlIHNhbWUgb3B0aW9ucy5cbmZ1bmN0aW9uIGdldFdyaXRlQ29uZmlnKGJ1Y2tldDogTG9hZGVkQnVja2V0LCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHsgZmFzdD86IGJvb2xlYW47IHdyaXRlRGVsYXk/OiBudW1iZXIgfSB7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGJ1Y2tldC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgcmV0dXJuIHsgZmFzdDogc2VsZj8uZmFzdCwgd3JpdGVEZWxheTogc2VsZj8ud3JpdGVEZWxheSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TXV0YWJsZShidWNrZXQ6IExvYWRlZEJ1Y2tldCwgZmlsZVBhdGg6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIGdldFJvdXRlKGZpbGVQYXRoKSk7XG4gICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICBpZiAoYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YnVja2V0LmFjY291bnR9LyR7YnVja2V0LmJ1Y2tldE5hbWV9IGlzIGltbXV0YWJsZSAoYXQgd3JpdGUgdGltZSAke3dyaXRlVGltZX0pIGFuZCAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gYWxyZWFkeSBleGlzdHMsIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIHRvYCk7XG4gICAgfVxufVxuXG4vLyBXcm9uZy10YXJnZXQgcmVqZWN0aW9ucyBhcmUgcmFyZSBhbmQgaW1wb3J0YW50ICh0aGV5IEFSRSB0aGUgc3dpdGNob3ZlciBoYW5kb2ZmKSwgYnV0IGEgYnVyc3Qgb2Zcbi8vIHJhY2luZyB3cml0ZXMgYXQgYSBib3VuZGFyeSBtdXN0IG5vdCBmbG9vZCB0aGUgbG9nIC0gc28gYXQgbW9zdCBvbmUgbGluZSBhIG1pbnV0ZVxuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbmxldCBsYXN0V3JvbmdUYXJnZXRMb2cgPSAwO1xuZnVuY3Rpb24gbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0V3JvbmdUYXJnZXRMb2cgPCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFKSByZXR1cm47XG4gICAgbGFzdFdyb25nVGFyZ2V0TG9nID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cblxuLy8gUm91dGluZyB3cml0ZXMgYXJlIHNlcmlhbGl6ZWQgcGVyIGJ1Y2tldCwgc28gdHdvIGNvbmN1cnJlbnQgY3JlYXRlcyBjYW4ndCBib3RoIGJ1aWxkIGEgc3RvcmVcbi8vICh0aGUgbG9zZXIncyBzdG9yZSB3b3VsZCBsZWFrIHdpdGggaXRzIHN5bmMgbG9vcHMgcnVubmluZyBmb3JldmVyKVxuY29uc3Qgcm91dGluZ1dyaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAvLyBWYWxpZGF0ZXMgYmVmb3JlIHN0b3JpbmcgYW55dGhpbmcsIHNvIGEgYmFkIGNvbmZpZyBjYW4ndCBicmljayB0aGUgYnVja2V0XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIGluY29taW5nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZCBidWNrZXQgJHtrZXl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBjaGFuZ2VkIGNvbmZpZyBtdXN0IGNhcnJ5IGEgaGlnaGVyIHZlcnNpb24gdGhhbiB0aGUgb25lIGN1cnJlbnRseSBzdG9yZWQg4oCUIG90aGVyd2lzZSB0d29cbiAgICAvLyBjbGllbnRzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgYXQgdGhlIHNhbWUgdmVyc2lvbiB3b3VsZCBrZWVwIGNsb2JiZXJpbmcgZWFjaCBvdGhlci4gU2FtZVxuICAgIC8vIGNvbnRlbnQgYXQgYW55IHZlcnNpb24gaXMgYSBoYXJtbGVzcyBuby1vcCBhbmQgaXMgYWxsb3dlZCB0aHJvdWdoLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShpbmNvbWluZykgIT09IGxvYWRlZC5yb3V0aW5nSlNPTiAmJiBnZXRDb25maWdWZXJzaW9uKGluY29taW5nKSA8PSBnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1cGRhdGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX06IHRoZSBuZXcgY29uZmlnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUgYnV0IGl0cyB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSkgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuIEN1cnJlbnQ6ICR7bG9hZGVkLnJvdXRpbmdKU09OfS4gQXR0ZW1wdGVkOiAke0pTT04uc3RyaW5naWZ5KGluY29taW5nKX1gKTtcbiAgICB9XG4gICAgLy8gUm91dGluZyB3cml0ZXMgYnlwYXNzIGZhc3QgbW9kZSAodGhlIGNvbmZpZyBtdXN0IGFwcGx5IGltbWVkaWF0ZWx5IGFuZCBzdXJ2aXZlIGEgY3Jhc2gpXG4gICAgLy8gYW5kIGlnbm9yZSBpbW11dGFibGUgKHRoZSByb3V0aW5nIGZpbGUgbXVzdCBhbHdheXMgc3RheSB1cGRhdGFibGUpLiBBbiBvbGRlciBsYXN0TW9kaWZpZWRcbiAgICAvLyBuby1vcHMgaW5zaWRlIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgcmVsb2FkIGJlbG93IHNlZXMgbm8gY2hhbmdlLlxuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICBsZXQgcnVuID0gKHJvdXRpbmdXcml0ZXMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKCkgPT4gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQsIGJ1Y2tldE5hbWUsIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICAvLyBUaGUgY2hhaW4gbXVzdCBzdXJ2aXZlIGEgZmFpbGVkIHdyaXRlLCBzbyB0aGUgc3RvcmVkIGxpbmsgc3dhbGxvd3MgdGhlIGVycm9yICh0aGUgY2FsbGVyXG4gICAgICAgIC8vIHN0aWxsIGdldHMgaXQgZnJvbSBydW4pXG4gICAgICAgIHJvdXRpbmdXcml0ZXMuc2V0KGtleSwgcnVuLnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bjtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICB9XG4gICAgLy8gVGhlIHdyaXRlIHRpbWUgaXMgZGV0ZXJtaW5lZCBleGFjdGx5IG9uY2UsIEhFUkUgYXQgdGhlIGZpcnN0IG5vZGUgdGhhdCByZWNlaXZlcyB0aGUgd3JpdGU7XG4gICAgLy8gaXQgcHJvcGFnYXRlcyBhcyBsYXN0TW9kaWZpZWQsIHNvIGV2ZXJ5IG5vZGUgZXZhbHVhdGVzIHRoZSBidWNrZXQgb3B0aW9ucyBhdCB0aGUgc2FtZSBpbnN0YW50XG4gICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgLy8gT25seSBmcmVzaGx5LXN0YW1wZWQgd3JpdGVzIGFyZSBjaGVja2VkOiBhIHdyaXRlIHdpdGggYW4gZXhwbGljaXQgbGFzdE1vZGlmaWVkIGlzXG4gICAgLy8gc3luY2hyb25pemF0aW9uL2JhY2tmaWxsIChvbGQgZGF0YSBsZWdpdGltYXRlbHkgbGFuZHMgb24gc291cmNlcyB3aG9zZSB3aW5kb3cgaGFzIG1vdmVkIG9uKSxcbiAgICAvLyBidXQgYSBmcmVzaCB3cml0ZSByZWFjaGluZyB1cyBvdXRzaWRlIG91ciB3aW5kb3dzL3JvdXRlcyBtZWFucyB0aGUgY2xpZW50IHJlc29sdmVkIGl0c1xuICAgIC8vIHRhcmdldCBmcm9tIGEgc3RhbGUgdmlldyAtIGl0IG11c3QgcmUtcmVzb2x2ZSBhbmQgcmV0cnkgYXQgdGhlIGNvcnJlY3Qgc291cmNlLlxuICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICBpZiAoIWNvbmZpZz8ubGFzdE1vZGlmaWVkICYmIGxvYWRlZC5zZWxmRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IGxvYWRlZC5zZWxmRW50cmllcy5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAtIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFICYmIHdyaXRlVGltZSA8PSB4LnZhbGlkV2luZG93WzFdICsgV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0UpO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSBldmVuIHdpdGggdGhlICR7V1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0V9bXMgZ3JhY2UgKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBUaGlzIHNlcnZlciBpcyBub3QgYSB2YWxpZCB3cml0ZSB0YXJnZXQgYXQgJHt3cml0ZVRpbWV9IGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgdmFsaWQgd2luZG93czogJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSkuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0pIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShsb2FkZWQsIGZpbGVQYXRoLCB3cml0ZVRpbWUpO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoZmlsZVBhdGgsIGRhdGEsIHsgLi4uZ2V0V3JpdGVDb25maWcobG9hZGVkLCB3cml0ZVRpbWUsIHJvdXRlKSwgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXRDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQpOiBBcmNoaXZlc0NvbmZpZyB7XG4gICAgbGV0IHByb2dyZXNzID0gYnVja2V0LnN0b3JlLmdldFN5bmNQcm9ncmVzcz8uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6ICEhYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcixcbiAgICAgICAgLy8gVGhlIHJlbWFwcGVkIChpbnRlcnByZXRhdGlvbikgdmlldzogZ2V0Q29uZmlnIGlzIGhvdyBjbGllbnRzIGxlYXJuIG9mIGFuIGluLXByb2dyZXNzXG4gICAgICAgIC8vIGRlcGxveSB0YWtlb3Zlciwgc2luY2UgdGhlIHJlbWFwIGlzIG5ldmVyIHdyaXR0ZW4gaW50byB0aGUgcm91dGluZyBmaWxlIGl0c2VsZlxuICAgICAgICByZW1vdGVDb25maWc6IGFwcGx5RGVwbG95UmVtYXAoYnVja2V0LnJvdXRpbmcpLFxuICAgICAgICBpbmRleDogcHJvZ3Jlc3M/LmluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXM6IHByb2dyZXNzPy5zb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHByb2dyZXNzPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmc6IHByb2dyZXNzPy5zeW5jaW5nLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLmJ1Y2tldHMua2V5cygpXSkge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChrZXkuc2xpY2UoMCwgc2xhc2gpLCBrZXkuc2xpY2Uoc2xhc2ggKyAxKSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImRlcGxveSB0YWtlb3ZlciBzdGF0ZSBjaGFuZ2VkXCIgfSk7XG4gICAgfVxufVxuXG5vblRha2VvdmVyRXZlbnQoZXZlbnQgPT4ge1xuICAgIGlmIChldmVudCA9PT0gXCJyZW1hcENoYW5nZWRcIikge1xuICAgICAgICAvLyBUaGUgcmVidWlsZCBhcHBsaWVzIHRoZSByZW1hcHBlZCB3aW5kb3dzLCBhbmQgc2NoZWR1bGVCb3VuZGFyeVNjYW5zIChwYXJ0IG9mIHRoZVxuICAgICAgICAvLyByZWJ1aWxkKSBzY2hlZHVsZXMgdGhlIGhhbmRvZmYgc2NhbnMgYXJvdW5kIHRoZSBuZXcgd2luZG93cycgc3RhcnRzXG4gICAgICAgIHZvaWQgcmVidWlsZEFsbExvYWRlZEJ1Y2tldHMoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gTG9hZGVkIGluIG1lbW9yeSAoY3JlYXRlZCBvciBhY2Nlc3NlZCBzaW5jZSBzdGFydHVwKSwgc28gaXRzIHN5bmNocm9uaXphdGlvbiBpcyBydW5uaW5nXG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuLyoqIEV2ZXJ5IGJ1Y2tldCB0aGUgYWNjb3VudCBoYXMgb24gdGhpcyBzZXJ2ZXIsIGFjdGl2ZSBvciBub3QsIGVhY2ggd2l0aCBpdHMgY29uZmlndXJhdGlvbi5cbiAqICBJbmFjdGl2ZSBidWNrZXRzIGFyZSBpbnNwZWN0ZWQgc3RyYWlnaHQgZnJvbSBkaXNrIFdJVEhPVVQgbG9hZGluZyB0aGVtIC0gbG9hZGluZyB3b3VsZCBzdGFydFxuICogIHRoZWlyIHN5bmNocm9uaXphdGlvbiwgYW5kIG9sZCBpbnZhbGlkIGJ1Y2tldHMgbXVzdCBzdGF5IGluZXJ0ICh0aGVpciBwYXJzZSBlcnJvciBpcyByZXBvcnRlZFxuICogIGluc3RlYWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBhY2NvdW50Rm9sZGVyID0gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCk7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBuYW1lcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoYWNjb3VudEZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHM6IFNlcnZlckJ1Y2tldEluZm9bXSA9IFtdO1xuICAgIGZvciAobGV0IGJ1Y2tldE5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCk7XG4gICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBsb2FkZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBjb25maWc6IGdldEJ1Y2tldENvbmZpZyhsb2FkZWQpIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHBhcnNlUm91dGluZ0RhdGEoZGF0YSkgfSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiBmYWxzZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRlbChmaWxlUGF0aCwgZ2V0V3JpdGVDb25maWcobG9hZGVkLCBEYXRlLm5vdygpLCBnZXRSb3V0ZShmaWxlUGF0aCkpKTtcbn1cblxuLy8g4pSA4pSAIGxvY2FsIElBcmNoaXZlcyBhY2Nlc3Mg4pSA4pSAXG5cbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBUaGUgaW4tcHJvY2VzcyBJQXJjaGl2ZXMgZm9yIGEgYnVja2V0IGhvc3RlZCBieSBUSElTIHNlcnZlciDigJQgdXNlZCB3aGVuIGEgUmVtb3RlQ29uZmlnIHNvdXJjZVxuLy8gVVJMIHBvaW50cyBhdCBvdXJzZWx2ZXMsIHNvIHdlIGRvbid0IHRhbGsgdG8gb3Vyc2VsdmVzIG92ZXIgSFRUUFMuIE9uZSBzaW5nbGV0b24gcGVyIGJ1Y2tldC5cbmNsYXNzIEFyY2hpdmVzTG9jYWxCdWNrZXQgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNjb3VudDogc3RyaW5nLCBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1Y2tldCgpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsQnVja2V0IGFjY291bnQgJHt0aGlzLmFjY291bnR9IGJ1Y2tldCAke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShidWNrZXQsIGNvbmZpZy5wYXRoLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgYnVja2V0LnN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgTEFSR0VfRklMRV9QQVJUX1NJWkUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIHNheSB0cnVlLCBtYXRjaGluZyB3aGF0IHRoZXkgYmVjb21lIG9uY2UgY3JlYXRlZCAodGhlIGRlZmF1bHQgc3RvcmUgdHlwZSlcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIGluZGV4KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKHRpbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IGFsbFNjYW5zQ29tcGxldGU6IHRydWUsIGluZGV4U2l6ZTogMCwgc291cmNlczogW10gfTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXMgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIHN5bmNocm9uaXphdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMoKTtcbiAgICB9XG59XG5cbmNvbnN0IGxvY2FsQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsQXJjaGl2ZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgZXhpc3RpbmcgPSBsb2NhbEFyY2hpdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlcyA9IG5ldyBBcmNoaXZlc0xvY2FsQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxvY2FsQXJjaGl2ZXMuc2V0KGtleSwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cbiJdfQ==
882
- /* _JS_SOURCE_HASH = "e852cd5f45e08333eed94b4b6ad7e3405f6a38b8c981cdd8491e0f4135b2a84e"; */
889
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUF5RztBQUN6Ryw0Q0FJc0I7QUFDdEIsaURBQTRKO0FBQzVKLHFEQUE4RztBQUM5RyxxREFBcUQ7QUFHckQsdUNBQW1DO0FBd0JuQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxpR0FBaUc7QUFDakcseURBQXlEO0FBQ3pELFNBQWdCLDhCQUE4QjtJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRkQsd0VBRUM7QUFFRCxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLDZDQUE2QztBQUM3QyxJQUFJLG9CQUF3QyxDQUFDO0FBQzdDLFNBQWdCLHVCQUF1QixDQUFDLE1BQTBCO0lBQzlELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQixtQkFBbUI7SUFDL0IsSUFBSSxvQkFBb0I7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEUs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Q0FBQztJQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RCxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBUEQsNENBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RvcmFnZSB9IGZyb20gXCIuLi9UcmFuc2FjdGlvblN0b3JhZ2VcIjtcbmltcG9ydCB7IEpTT05TdG9yYWdlIH0gZnJvbSBcIi4uL0pTT05TdG9yYWdlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2sgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBCbG9iU3RvcmUsIElCdWNrZXRTdG9yZSwgREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZLCBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTiB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHtcbiAgICBSZW1vdGVDb25maWcsIEhvc3RlZENvbmZpZywgQmFja2JsYXplQ29uZmlnLCBJQXJjaGl2ZXMsIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLFxuICAgIEFyY2hpdmVzU3luY1N0YXR1cyxcbiAgICBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBwYXJzZUhvc3RlZFVybCwgYnVpbGRGaWxlVXJsLCBnZXRDb25maWdWZXJzaW9uLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcm91dGVJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGFwcGx5RGVwbG95UmVtYXAsIGdldFRha2VvdmVyQWx0UG9ydCwgZ2V0T3duV2luZG93RW5kQ2xpcCwgb25UYWtlb3ZlckV2ZW50IH0gZnJvbSBcIi4vZGVwbG95VGFrZW92ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzIH0gZnJvbSBcIi4vY3JlYXRlQXJjaGl2ZXNcIjtcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2UgfSBmcm9tIFwiLi4vSVN0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgQWNjZXNzUmVxdWVzdCwgVHJ1c3RSZWNvcmQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgZ2V0QXJnIH0gZnJvbSBcIi4vY2xpQXJnc1wiO1xuXG4vLyBUaGUgc3RvcmFnZSBzZXJ2ZXIncyBnbG9iYWwgc2VydmVyLXNpZGUgc3RhdGUuIGhvc3RTdG9yYWdlU2VydmVyIHNldHMgdGhlIGNvbmZpZyBvbmNlIGF0XG4vLyBzdGFydHVwOyBldmVyeXRoaW5nIGVsc2UgKHN5c3RlbSBzdG9yYWdlcywgYnVja2V0cykgaXMgYSBnbG9iYWwgY2FjaGUgY3JlYXRlZCBsYXppbHkgb24gZmlyc3Rcbi8vIHVzZSwgdGhyb3dpbmcgaWYgdGhlIGNvbmZpZyB3YXMgbmV2ZXIgc2V0LlxuLy9cbi8vIEJ1Y2tldHMgaGF2ZSBubyBzZXBhcmF0ZSByZWdpc3RyeTogZWFjaCBidWNrZXQncyBjb25maWd1cmF0aW9uIChhIFJlbW90ZUNvbmZpZykgbGl2ZXMgaW5zaWRlIHRoZVxuLy8gYnVja2V0IGl0c2VsZiwgYXQgUk9VVElOR19GSUxFLiBBIGJ1Y2tldCBleGlzdHMgaWZmIHRoYXQgZmlsZSBleGlzdHMuIFdyaXRpbmcgaXQgY3JlYXRlcyB0aGVcbi8vIGJ1Y2tldCAoYnVpbGRpbmcgaXRzIHN0b3JlLCB3aGljaCBtYXkgaW1tZWRpYXRlbHkgc3RhcnQgc3luY2hyb25pemF0aW9uIHNjYW5zKTsgb3ZlcndyaXRpbmcgaXQg4oCUXG4vLyBkaXJlY3RseSBvciB2aWEgYSBmaWxlIHB1bGxlZCBpbiBmcm9tIGEgc3luY2hyb25pemF0aW9uIHNvdXJjZSDigJQgcmVidWlsZHMgdGhlIHN0b3JlIHdpdGggdGhlIG5ld1xuLy8gc291cmNlcyAoY2FuY2VsbGluZyB0aGUgb2xkIHN0b3JlJ3Mgc2NhbnMpLlxuXG5leHBvcnQgdHlwZSBTdG9yYWdlU2VydmVyQ29uZmlnID0ge1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICByb290RG9tYWluOiBzdHJpbmc7XG4gICAgLy8gdXNlckBleHRlcm5hbElwIG9mIHRoZSBzdG9yYWdlIG1hY2hpbmUsIGZvciBnZW5lcmF0ZWQgc3NoIGNvbW1hbmRzXG4gICAgc3NoVGFyZ2V0OiBzdHJpbmc7XG4gICAgLy8gQWJzb2x1dGUgY29tbWFuZCB0aGF0IHJ1bnMgdGhlIGdyYW50QWNjZXNzIENMSSBvbiB0aGUgc3RvcmFnZSBtYWNoaW5lIChhZG1pbiBhcmdzIGFwcGVuZGVkKVxuICAgIHNlcnZlckNvbW1hbmQ6IHN0cmluZztcbiAgICAvLyBUaGUgc2VydmVyJ3Mgcm9vdCBzdG9yYWdlIGZvbGRlciAoYWJzb2x1dGUpXG4gICAgZm9sZGVyOiBzdHJpbmc7XG59O1xuXG5sZXQgY29uZmlnOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcodmFsdWU6IFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgICBjb25maWcgPSB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkICh0aGlzIEFQSSBvbmx5IHdvcmtzIG9uIHRoZSBzdG9yYWdlIHNlcnZlcilgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbi8vIEZvciBzZWxmLWRldGVjdGlvbjogY29kZSB0aGF0IENBTiBydW4gb3V0c2lkZSB0aGUgc3RvcmFnZSBzZXJ2ZXIgKGNyZWF0ZUFyY2hpdmVzKSB1c2VzIHRoaXMgdG9cbi8vIGNoZWNrIFwiaXMgdGhpcyBVUkwgb3VyIG93biBwcm9jZXNzP1wiIHdpdGhvdXQgdGhyb3dpbmcuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbi8vIFdoZW4gc2V0LCBhbGwgd3JpdGUtcGF0aCBvcGVyYXRpb25zIChjcmVhdGluZyBmaWxlcywgYXBwZW5kaW5nIGxhcmdlIHVwbG9hZHMsIGNyZWF0aW5nIGJ1Y2tldHMpXG4vLyB0aHJvdyB0aGlzIG1lc3NhZ2UuIFJlYWRzLCBmaW5kSW5mbywgYW5kIGRlbGV0ZXMgc3RpbGwgd29yayDigJQgc28gY2xpZW50cyBjYW4gZnJlZSBzcGFjZS4gTWFuYWdlZFxuLy8gYnkgaG9zdFN0b3JhZ2VTZXJ2ZXIncyBkaXNrLXNwYWNlIG1vbml0b3IuXG5sZXQgd3JpdGVzUmVqZWN0ZWRSZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbihyZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHdyaXRlc1JlamVjdGVkUmVhc29uID0gcmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRlc1JlamVjdGVkUmVhc29uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHdyaXRlc1JlamVjdGVkUmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdyaXRlc0FsbG93ZWQoKTogdm9pZCB7XG4gICAgaWYgKHdyaXRlc1JlamVjdGVkUmVhc29uKSB0aHJvdyBuZXcgRXJyb3Iod3JpdGVzUmVqZWN0ZWRSZWFzb24pO1xufVxuXG4vLyBUaGUgc3lzdGVtIHN0b3JhZ2VzICh0cnVzdCwgcmVxdWVzdHMpIGFyZSB0aGUgc2FtZSBraW5kIG9mIHRoaW5nIOKAlCBhIEpTT04ga2V5L3ZhbHVlIHN0b3JlIHVuZGVyXG4vLyA8Zm9sZGVyPi9zeXN0ZW0yLzxuYW1lPiDigJQgc28gdGhleSBzaGFyZSBvbmUgY2FjaGUsIGtleWVkIGJ5IG5hbWUuIChcInN5c3RlbTJcIiBiZWNhdXNlIHRoZSBsYXlvdXRcbi8vIGNoYW5nZWQgd2hlbiBidWNrZXQgY29uZmlncyBtb3ZlZCBpbnRvIHRoZSBidWNrZXRzIHRoZW1zZWx2ZXM7IG9sZCBcInN5c3RlbVwiL1wiYnVja2V0c1wiIGZvbGRlcnNcbi8vIGFyZSBzaW1wbHkgaWdub3JlZC4pXG4vLyBzZXRUcnVzdGVkTWFjaGluZXMgaXMgY2FsbGVkIGJ5IGNvbnN1bWVycyBCRUZPUkUgc3RhcnRpbmcgdGhlIHNlcnZlciwgc28gd2hlbiB0aGUgY29uZmlnIGlzbid0XG4vLyBzZXQgeWV0IHdlIGZhbGwgYmFjayB0byB0aGUgc2FtZSAtLWZvbGRlciBhcmcgdGhlIENMSSBzdGFydHMgdGhlIHNlcnZlciB3aXRoLlxuZnVuY3Rpb24gZ2V0U3RvcmFnZUZvbGRlcigpOiBzdHJpbmcge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoY29uZmlnKSByZXR1cm4gY29uZmlnLmZvbGRlcjtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkIGFuZCB0aGVyZSBpcyBubyAtLWZvbGRlciBhcmcsIHNvIHRoZSBzdG9yYWdlIGZvbGRlciBpcyB1bmtub3duYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZm9sZGVyKTtcbn1cblxuY29uc3Qgc3lzdGVtU3RvcmFnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxJU3RvcmFnZTx1bmtub3duPj4+KCk7XG5mdW5jdGlvbiBnZXRTeXN0ZW1TdG9yYWdlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICBsZXQgc3RvcmFnZSA9IHN5c3RlbVN0b3JhZ2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcm9vdCA9IGF3YWl0IGdldEZpbGVTdG9yYWdlTmVzdGVkMihnZXRTdG9yYWdlRm9sZGVyKCkpO1xuICAgICAgICAgICAgbGV0IHN5c3RlbSA9IGF3YWl0IHJvb3QuZm9sZGVyLmdldFN0b3JhZ2UoXCJzeXN0ZW0yXCIpO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uTmFtZSA9IFwic3RvcmFnZVwiICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8dW5rbm93bj4obmV3IFRyYW5zYWN0aW9uU3RvcmFnZShhd2FpdCBzeXN0ZW0uZm9sZGVyLmdldFN0b3JhZ2UobmFtZSksIHRyYW5zYWN0aW9uTmFtZSkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICBzeXN0ZW1TdG9yYWdlcy5zZXQobmFtZSwgc3RvcmFnZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlIGFzIFByb21pc2U8SVN0b3JhZ2U8VD4+O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRydXN0KCk6IFByb21pc2U8SVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+KFwidHJ1c3RcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdHMoKTogUHJvbWlzZTxJU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPihcInJlcXVlc3RzXCIpO1xufVxuXG4vKiogTWFrZXMgbWFjaGluZUlkcyB0aGUgY29tcGxldGUgdHJ1c3QgbGlzdCBmb3IgdGhlIGFjY291bnQ6IG1hY2hpbmVzIG5vdCBpbiB0aGUgbGlzdCBsb3NlIGFjY2VzcywgbWFjaGluZXMgYWxyZWFkeSB0cnVzdGVkIGtlZXAgdGhlaXIgZXhpc3RpbmcgcmVjb3JkLCBhbmQgbWlzc2luZyBvbmVzIGFyZSBhZGRlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG4vLyDilIDilIAgYnVja2V0cyDilIDilIBcblxuZXhwb3J0IHR5cGUgTG9hZGVkQnVja2V0ID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gVGhlIGJ1Y2tldCdzIHBhcnNlZCByb3V0aW5nIGNvbmZpZyAodGhlIGNvbnRlbnRzIG9mIFJPVVRJTkdfRklMRSlcbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgLy8gSlNPTiBvZiByb3V0aW5nLCBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgIHJvdXRpbmdKU09OOiBzdHJpbmc7XG4gICAgLy8gQUxMIG9mIG91ciBvd24gZW50cmllcyBpbiByb3V0aW5nLnNvdXJjZXMgKHRoaXMgYnVja2V0IG9uIHRoaXMgc2VydmVyKS4gTW9yZSB0aGFuIG9uZSB3aGVuXG4gICAgLy8gdGhlIGJ1Y2tldCdzIG9wdGlvbnMgY2hhbmdlIG92ZXIgdGltZSAtIG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93IChlLmcuIGltbXV0YWJsZSBkcm9wcGVkLFxuICAgIC8vIG9yIGZhc3QgZW5hYmxlZCwgc3RhcnRpbmcgYXQgYSBzY2hlZHVsZWQgaW5zdGFudCkuXG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIC8vIFRoZSBlbnRyeSB2YWxpZCB3aGVuIHRoZSBzdG9yZSB3YXMgYnVpbHQgLSB0aGUgc3RydWN0dXJhbCBvcHRpb25zIChyYXdEaXNrLCB3aGljaCBlbnRyaWVzXG4gICAgLy8gYXJlIGRvd25zdHJlYW0pLiBQZXItd3JpdGUgb3B0aW9ucyAoZmFzdC9pbW11dGFibGUpIGFyZSBpbnN0ZWFkIGV2YWx1YXRlZCBhdCBlYWNoIHdyaXRlJ3NcbiAgICAvLyB0aW1lLCBzZWUgZ2V0V3JpdGVDb25maWcvYXNzZXJ0TXV0YWJsZS4gdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkb2Vzbid0IG1lbnRpb24gdXMuXG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgLy8gVGhlIHN0b3JlIHBsYW4gbWludXMgaXRzIHZhbGlkIHdpbmRvd3MgKHNlZSBTdG9yZVBsYW4uc3RydWN0dXJlS2V5KTogd2hlbiBvbmx5IHdpbmRvd3NcbiAgICAvLyBjaGFuZ2UsIHRoZSBzdG9yZSBpcyB1cGRhdGVkIGluIHBsYWNlIGluc3RlYWQgb2YgcmVidWlsdFxuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4+KCk7XG5cbi8vIHNldFRpbWVvdXQgY2Fubm90IHJlcHJlc2VudCBsb25nZXIgZGVsYXlzOyBtb3JlIGRpc3RhbnQgd2luZG93IGJvdW5kYXJpZXMgcmUtY2hlY2sgYWZ0ZXIgdGhpc1xuY29uc3QgTUFYX1JFQlVJTERfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbi8vIFJlYnVpbGQgc2xpZ2h0bHkgYWZ0ZXIgdGhlIGJvdW5kYXJ5LCBzbyB0aGUgbmV3bHktdmFsaWQgZW50cnkgaXMgdW5hbWJpZ3VvdXNseSBhY3RpdmVcbmNvbnN0IFJFQlVJTERfQk9VTkRBUllfQlVGRkVSID0gMTAwMDtcblxuZnVuY3Rpb24gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbi8vIFBvcnRzIHdlIGFyZSBsaXN0ZW5pbmcgb24gYmV5b25kIHRoZSBtYWluIGNvbmZpZyBwb3J0IC0gYSBkZXBsb3ktdGFrZW92ZXIgc3VjY2Vzc29yIHNlcnZlcyBvbiBhXG4vLyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIHBvcnQsIGFuZCBtdXN0IHJlY29nbml6ZSBhbHRlcm5hdGUtcG9ydCBzb3VyY2UgVVJMcyBhcyBpdHNlbGZcbmNvbnN0IGV4dHJhTGlzdGVuUG9ydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRyYUxpc3RlblBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXh0cmFMaXN0ZW5Qb3J0cy5hZGQocG9ydCk7XG59XG5mdW5jdGlvbiBmaW5kU2VsZkluZGV4ZXMocm91dGluZzogUmVtb3RlQ29uZmlnLCBhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICAvLyBUaGUgdGFrZW92ZXIncyBhbHRlcm5hdGUgcG9ydCBpcyB0aGUgT1RIRVIgcHJvY2VzcyBvZiB0aGUgc3dpdGNob3Zlciwgb24gT1VSIG1hY2hpbmUgd2l0aFxuICAgIC8vIE9VUiBkaXNrIC0gc2VsZiBmb3Igc3luYyBwdXJwb3NlcyBvbiBib3RoIHNpZGVzICh0aGUgb2xkIG5vZGUgbXVzdCBub3Qgc2Nhbi9wdXNoIGl0cyBvd25cbiAgICAvLyBzdWNjZXNzb3I7IHRoZSBzaGFyZWQgZm9sZGVyIHBsdXMgdGhlIHN3aXRjaG92ZXIgZGlzayBzY2FucyByZWNvbmNpbGUgdGhlbSlcbiAgICBsZXQgdGFrZW92ZXJBbHRQb3J0ID0gZ2V0VGFrZW92ZXJBbHRQb3J0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0aW5nLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJvdXRpbmcuc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gZG9tYWluIHx8IHBhcnNlZC5hY2NvdW50ICE9PSBhY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBidWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHBhcnNlZC5wb3J0ID09PSBwb3J0IHx8IGV4dHJhTGlzdGVuUG9ydHMuaGFzKHBhcnNlZC5wb3J0KSB8fCBwYXJzZWQucG9ydCA9PT0gdGFrZW92ZXJBbHRQb3J0KSB7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbi8vIFRoZSBlbnRyeSB3aG9zZSB2YWxpZCB3aW5kb3cgY29udGFpbnMgdGhlIHRpbWUgKGFtb25nIHRoZSBlbnRyaWVzIGNvdmVyaW5nIHRoZSBrZXkncyByb3V0ZSxcbi8vIHdoZW4gb25lIGlzIGdpdmVuIC0gYSBzZXJ2ZXIgY2FuIGhvbGQgZGlmZmVyZW50IHNoYXJkcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zKS4gSGFsZi1vcGVuXG4vLyAoW3N0YXJ0LCBlbmQpKSwgc28gY2xlYW4gYnJlYWtzIHJlc29sdmUgdW5hbWJpZ3VvdXNseS4gRmFsbHMgYmFjayB0byB0aGUgbmVhcmVzdCB3aW5kb3cgd2hlblxuLy8gbm9uZSBjb250YWlucyB0aGUgdGltZSAtIGdhcHMgc2hvdWxkbid0IGV4aXN0LCBidXQgYSB3cml0ZSBtdXN0IHN0aWxsIHJlc29sdmUgdG8gU09NRVxuLy8gY29uZmlndXJhdGlvbi5cbmZ1bmN0aW9uIHNlbGVjdEVudHJ5QXQoZW50cmllczogSG9zdGVkQ29uZmlnW10sIHRpbWU6IG51bWJlciwgcm91dGU/OiBudW1iZXIpOiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjb3ZlcmluZyA9IGVudHJpZXMuZmlsdGVyKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICBpZiAoY292ZXJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gY292ZXJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbnRhaW5pbmcgPSBlbnRyaWVzLmZpbmQoeCA9PiB4LnZhbGlkV2luZG93WzBdIDw9IHRpbWUgJiYgdGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgIGlmIChjb250YWluaW5nKSByZXR1cm4gY29udGFpbmluZztcbiAgICBsZXQgYmVzdDogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGxldCBkaXN0YW5jZSA9IE1hdGgubWluKE1hdGguYWJzKHRpbWUgLSBlbnRyeS52YWxpZFdpbmRvd1swXSksIE1hdGguYWJzKHRpbWUgLSBlbnRyeS52YWxpZFdpbmRvd1sxXSkpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgYmVzdCA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuXG4vLyBCdWNrZXQgb3B0aW9ucyBjYW4gY2hhbmdlIG92ZXIgdGltZSAobXVsdGlwbGUgc2VsZiBlbnRyaWVzIHdpdGggZGlmZmVyZW50IHZhbGlkIHdpbmRvd3MpLCBhbmRcbi8vIHRoZSBzdHJ1Y3R1cmFsIG9uZXMgKHJhd0Rpc2ssIHRoZSBkb3duc3RyZWFtIGxpc3QpIGFyZSBiYWtlZCBpbnRvIHRoZSBzdG9yZSAtIHNvIHRoZSBzdG9yZSBpc1xuLy8gcmVidWlsdCBzaG9ydGx5IGFmdGVyIGVhY2ggb2Ygb3VyIHdpbmRvdyBib3VuZGFyaWVzIHBhc3NlcywgbWFraW5nIHRoZSBuZXdseS12YWxpZCBlbnRyeSBhcHBseS5cbmZ1bmN0aW9uIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IGJvdW5kYXJpZXMgPSBsb2FkZWQuc2VsZkVudHJpZXMuZmxhdE1hcCh4ID0+IHgudmFsaWRXaW5kb3cpLmZpbHRlcih0ID0+IHQgPiBub3cpO1xuICAgIGlmICghYm91bmRhcmllcy5sZW5ndGgpIHJldHVybjtcbiAgICBsZXQgbmV4dEJvdW5kYXJ5ID0gTWF0aC5taW4oLi4uYm91bmRhcmllcyk7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEEgcm91dGluZyBjaGFuZ2UgbWF5IGhhdmUgYWxyZWFkeSByZXBsYWNlZCB0aGlzIHN0b3JlOyBvbmx5IElUIGdldHMgYSBib3VuZGFyeSB0aW1lclxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBuZXh0Qm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJhIHZhbGlkIHdpbmRvdyBib3VuZGFyeSBwYXNzZWRcIiB9KTtcbiAgICAgICAgfSkoKTtcbiAgICB9LCBNYXRoLm1pbihuZXh0Qm91bmRhcnkgLSBub3cgKyBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG4vLyBFeHRyYSBzY2FucyBhcm91bmQgZWFjaCBvZiBPVVIgdmFsaWQtd2luZG93IHN0YXJ0cyAoYSBkZXBsb3kgc3dpdGNob3ZlciBpcyBqdXN0IHRoaXMgdG9vIC0gaXRzXG4vLyByZW1hcCBhZGRzIHZhbGlkIHdpbmRvd3MpLCBjYXRjaGluZyBsYXN0LW1vbWVudCB3cml0ZXMgdGhlIHByZXZpb3VzIHdpbmRvdydzIG93bmVyIGFjY2VwdGVkIG5lYXJcbi8vIHRoZSBib3VuZGFyeS4gQnkgdGhlIGZpbmFsIHNjYW4gdGhlIHByZXZpb3VzIG93bmVyIGhhcyBmbHVzaGVkIGV2ZXJ5dGhpbmcgKGZhc3Qgd3JpdGVzIG5ldmVyXG4vLyBkZWxheSBwYXN0IGEgd2luZG93J3MgZW5kKSwgc28gbm90aGluZyBpcyBtaXNzZWQuXG5jb25zdCBCT1VOREFSWV9TQ0FOX09GRlNFVFMgPSBbLTMwICogMTAwMCwgMiAqIDEwMDAsIDMwICogMTAwMF07XG4vLyBIb3cgZmFyIGJhY2sgYSBib3VuZGFyeSBzY2FuIGFza3MgdGhlIHByZXZpb3VzIG93bmVyIGZvciBjaGFuZ2VzOiBhbnl0aGluZyBvbGRlciBoYXMgYWxyZWFkeVxuLy8gYXJyaXZlZCB0aHJvdWdoIG5vcm1hbCBzeW5jaHJvbml6YXRpb24sIGFuZCB0aGlzIGNvdmVycyB0aGUgbG9uZ2VzdCBhIHdyaXRlIGNhbiBzaXQgdW5mbHVzaGVkXG5jb25zdCBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLID0gREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZICsgV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4vLyBUaGUgY2F0Y2gtdXAgc2NhbiBmb3IgYSB3aW5kb3cgdGhhdCB3YXMgYWxyZWFkeSBhY3RpdmUgd2hlbiB3ZSBidWlsdCB0aGUgc3RvcmVcbmNvbnN0IFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSA9IDMwICogMTAwMDtcblxuLy8gRWFjaCAoYnVja2V0LCBib3VuZGFyeSwgb2Zmc2V0KSBpcyBzY2hlZHVsZWQgZXhhY3RseSBvbmNlLCBzdXJ2aXZpbmcgc3RvcmUgcmVidWlsZHMgLSB0aGUgdGltZXJcbi8vIHJlLXJlc29sdmVzIHRoZSBidWNrZXQgKGFuZCByZWNvbXB1dGVzIG93bmVycyBmcm9tIHRoZSB0aGVuLWN1cnJlbnQgcm91dGluZykgd2hlbiBpdCBmaXJlc1xuY29uc3Qgc2NoZWR1bGVkQm91bmRhcnlTY2FucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYm91bmRhcnlTY2Fuc1J1bm5pbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IHN0YXJ0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHNlbGYudmFsaWRXaW5kb3dbMF07XG4gICAgICAgIGlmIChzdGFydCA+IG5vdyAmJiBzdGFydCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBzdGFydHMuYWRkKHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBIHdpbmRvdyB3ZSBhcmUgQUxSRUFEWSBpbnNpZGUgd2hlbiB0aGUgc3RvcmUgaXMgYnVpbHQgKHN0YXJ0dXAsIG9yIGEgY29uZmlnIHRoYXQgbWFkZSB1c1xuICAgIC8vIHZhbGlkIGltbWVkaWF0ZWx5KSBnb3Qgbm9uZSBvZiB0aGUgbGVhZC11cCBzY2FucyAtIHNvIG9uZSBydW5zIHNob3J0bHkgYWZ0ZXIsIGluIGNhc2Ugd2VcbiAgICAvLyBjYW1lIHVwIGp1c3QgYXMgdGhlIHByZXZpb3VzIG93bmVyIGlzIHJlYWxpemluZyBpdCBtdXN0IHNodXQgZG93bi4gT25seSByZWNlbnQgYm91bmRhcmllc1xuICAgIC8vIHF1YWxpZnk6IG9sZGVyIHRyYWlsaW5nIHdyaXRlcyBoYXZlIGxvbmcgc2luY2UgcHJvcGFnYXRlZCB0aHJvdWdoIG5vcm1hbCBzeW5jaHJvbml6YXRpb24uXG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghKHN0YXJ0IDw9IG5vdyAmJiBub3cgPCBlbmQpIHx8IHN0YXJ0IDw9IDApIGNvbnRpbnVlO1xuICAgICAgICBpZiAobm93IC0gc3RhcnQgPiBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXxzdGFydHVwYDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVksIFwic3RhcnR1cCszMHNcIikuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBzdGFydCBvZiBzdGFydHMpIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0IG9mIEJPVU5EQVJZX1NDQU5fT0ZGU0VUUykge1xuICAgICAgICAgICAgbGV0IGF0ID0gc3RhcnQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYXQgPD0gbm93KSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18JHtvZmZzZXR9YDtcbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICAgICAgbGV0IGFybSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGltZXIgbGVuZ3RoIGlzIGNhcHBlZCAoZmFyLWZ1dHVyZSBib3VuZGFyaWVzKSwgc28gcmUtYXJtIHVudGlsIHRoZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGFycml2ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgb2Zmc2V0KS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgICAgICAgICAgfSwgTWF0aC5taW4oYXQgLSBEYXRlLm5vdygpLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICAgICAgICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJvdW5kYXJ5U2NhbihidWNrZXRLZXk6IHN0cmluZywgd2luZG93U3RhcnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIG9mZnNldExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhYmVsID0gYGJ1Y2tldCAke2J1Y2tldEtleX0sIHdpbmRvdyBzdGFydGluZyAke25ldyBEYXRlKHdpbmRvd1N0YXJ0KS50b0lTT1N0cmluZygpfSwgb2Zmc2V0ICR7b2Zmc2V0TGFiZWwgfHwgYCR7b2Zmc2V0IC8gMTAwMH1zYH1gO1xuICAgIGlmIChib3VuZGFyeVNjYW5zUnVubmluZy5oYXMoYnVja2V0S2V5KSkge1xuICAgICAgICAvLyBCb3VuZGFyeSBzY2FucyBuZXZlciBydW4gaW4gcGFyYWxsZWw7IGEgc2xvdyBvbmUgc2ltcGx5IHN3YWxsb3dzIGxhdGVyIHNjaGVkdWxlZCBwb2ludHNcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIGJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogdGhlIHByZXZpb3VzIGJvdW5kYXJ5IHNjYW4gaXMgc3RpbGwgcnVubmluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmFkZChidWNrZXRLZXkpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChidWNrZXRLZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RvcmUgPSBsb2FkZWQuc3RvcmU7XG4gICAgICAgIGlmICghKHN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgcmV0dXJuO1xuICAgICAgICAvLyBPd25lcnMgYXJlIHJlY29tcHV0ZWQgYXQgZmlyZSB0aW1lIC0gdGhlIHJvdXRpbmcgKG9yIHRoZSB0YWtlb3ZlciByZW1hcCkgbWF5IGhhdmVcbiAgICAgICAgLy8gY2hhbmdlZCBzaW5jZSB0aGlzIHNjYW4gd2FzIHNjaGVkdWxlZFxuICAgICAgICBsZXQgZWZmZWN0aXZlID0gYXBwbHlEZXBsb3lSZW1hcChsb2FkZWQucm91dGluZyk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhTZXQgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgbGV0IHNlbHZlcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZykuZmlsdGVyKHggPT4geC52YWxpZFdpbmRvd1swXSA9PT0gd2luZG93U3RhcnQpO1xuICAgICAgICBpZiAoIXNlbHZlcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZUaW1lID0gd2luZG93U3RhcnQgLSAxO1xuICAgICAgICBsZXQgbmVlZERpc2tTY2FuID0gZmFsc2U7XG4gICAgICAgIC8vIHNvdXJjZUluZGV4IC0+IHRoZSBzbGljZSBvZiBvdXIgcm91dGUgdGhhdCBzb3VyY2Ugb3duZWQgaW4gdGhlIHByZXZpb3VzIHdpbmRvd1xuICAgICAgICBsZXQgcmVtb3RlT3duZXJzID0gbmV3IE1hcDxudW1iZXIsIFtudW1iZXIsIG51bWJlcl0+KCk7XG4gICAgICAgIGZvciAobGV0IHNlbGYgb2Ygc2VsdmVzKSB7XG4gICAgICAgICAgICBsZXQgc2VsZlJvdXRlID0gc2VsZi5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgbGV0IGlkeCA9IGVmZmVjdGl2ZS5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgICAgICAgICAvLyBUaGVzZSBzY2FucyBvbmx5IHJ1biBvbiB0aGUgd3JpdGUgbm9kZSAtIHRoZSBmaXJzdCBzb3VyY2UgdmFsaWQgYXQgdGhlIG5ldyB3aW5kb3cnc1xuICAgICAgICAgICAgLy8gc3RhcnQgZm9yIG91ciByb3V0ZS4gQW4gZWFybGllciBlbnRyeSBmdWxseSBjb3ZlcmluZyBvdXIgcm91dGUgbWVhbnMgd3JpdGVzIGdvIHRoZXJlLFxuICAgICAgICAgICAgLy8gYW5kIElUIGRvZXMgdGhlIGJvdW5kYXJ5IHNjYW5zLlxuICAgICAgICAgICAgbGV0IHNoYWRvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlkeDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gd2luZG93U3RhcnQgJiYgd2luZG93U3RhcnQgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoclswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZG93ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIHdpbmRvdydzIG93bmVyczogd2Fsa2luZyB0aGUgY29uZmlnIGluIG9yZGVyICh3cml0ZS10YXJnZXQgb3JkZXIpLFxuICAgICAgICAgICAgLy8gZWFjaCBzb3VyY2UgY2xhaW1zIHdoYXRldmVyIHNsaWNlIG9mIG91ciByb3V0ZSBubyBlYXJsaWVyIHNvdXJjZSBhbHJlYWR5IG93bnNcbiAgICAgICAgICAgIGxldCB1bmNvdmVyZWQ6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtbc2VsZlJvdXRlWzBdLCBzZWxmUm91dGVbMV1dXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWZmZWN0aXZlLnNvdXJjZXMubGVuZ3RoICYmIHVuY292ZXJlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IGVmZmVjdGl2ZS5zb3VyY2VzW2pdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBbd3MsIHdlXSA9IG90aGVyLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgIGlmICghKHdzIDw9IHByZXZUaW1lICYmIHByZXZUaW1lIDwgd2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgciA9IG90aGVyLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZzogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGNsYWltZWQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdSBvZiB1bmNvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyID0gcm91dGVJbnRlcnNlY3Rpb24odSwgcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5wdXNoKHUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhaW1lZCA9IGNsYWltZWQgJiYgW01hdGgubWluKGNsYWltZWRbMF0sIGludGVyWzBdKSwgTWF0aC5tYXgoY2xhaW1lZFsxXSwgaW50ZXJbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGludGVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodVswXSA8IGludGVyWzBdKSByZW1haW5pbmcucHVzaChbdVswXSwgaW50ZXJbMF1dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyWzFdIDwgdVsxXSkgcmVtYWluaW5nLnB1c2goW2ludGVyWzFdLCB1WzFdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY292ZXJlZCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICBpZiAoIWNsYWltZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmSW5kZXhTZXQuaGFzKGopKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBvd25lciBzaGFyZXMgb3VyIHN0b3JhZ2UgKHNhbWUgbWFjaGluZSArIGJ1Y2tldCwgZS5nLiB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBvZiBhIGRlcGxveSBzd2l0Y2hvdmVyKSwgc28gYSBkaXNrIHJlc2NhbiBzZWVzIGl0cyB3cml0ZXNcbiAgICAgICAgICAgICAgICAgICAgbmVlZERpc2tTY2FuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSByZW1vdGVPd25lcnMuZ2V0KGopO1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVPd25lcnMuc2V0KGosIGV4aXN0aW5nICYmIFtNYXRoLm1pbihleGlzdGluZ1swXSwgY2xhaW1lZFswXSksIE1hdGgubWF4KGV4aXN0aW5nWzFdLCBjbGFpbWVkWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBjbGFpbWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZWVkRGlza1NjYW4gJiYgIXJlbW90ZU93bmVycy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IGRpc2tTY2FuPSR7bmVlZERpc2tTY2FufSwgcmVtb3RlIHByZXZpb3VzLXdpbmRvdyBvd25lcnM6ICR7cmVtb3RlT3duZXJzLnNpemV9YCk7XG4gICAgICAgIGlmIChuZWVkRGlza1NjYW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2luY2UgPSB3aW5kb3dTdGFydCAtIEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0s7XG4gICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIHJlbW90ZU93bmVycykge1xuICAgICAgICAgICAgbGV0IG93bmVyU291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KSBvZiBwcmV2aW91cy13aW5kb3cgb3duZXIgKHNvdXJjZSBpbmRleCAke3NvdXJjZUluZGV4fSkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGJ1Y2tldEtleSk7XG4gICAgfVxufVxuXG50eXBlIFN0b3JlUGxhbiA9IHtcbiAgICBlZmZlY3RpdmU6IFJlbW90ZUNvbmZpZztcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHJhd0Rpc2s6IGJvb2xlYW47XG4gICAgLy8gVGhlIEJsb2JTdG9yZSBzb3VyY2VzIHRoaXMgcGxhbiBidWlsZHM6IFswXSBpcyB0aGUgZGlzaywgdGhlIHJlc3QgYXJlIGRvd25zdHJlYW0gY29uZmlnc1xuICAgIHNvdXJjZVNwZWNzOiB7IHNvdXJjZUNvbmZpZz86IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZzsgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07IHJvdXRlPzogW251bWJlciwgbnVtYmVyXTsgbm9GdWxsU3luYz86IGJvb2xlYW4gfVtdO1xuICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAvLyBFdmVyeXRoaW5nIGFib3V0IHRoZSBwbGFuIEVYQ0VQVCB0aGUgdmFsaWQgd2luZG93cy4gVHdvIHBsYW5zIHdpdGggZXF1YWwgc3RydWN0dXJlIGtleXNcbiAgICAvLyBkaWZmZXIgb25seSBpbiB3aW5kb3dzLCB3aGljaCB0aGUgcnVubmluZyBzdG9yZSBhcHBsaWVzIGluIHBsYWNlIC0gaXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIC8vIHJvdXRpbmUgY29uZmlnIGV2b2x1dGlvbiBvZiByZWR1Y2luZyB0aGUgbGFzdCBmb3JldmVyLXdpbmRvdyBhbmQgYXBwZW5kaW5nIGEgbmV3IGVudHJ5LFxuICAgIC8vIGluc3RlYWQgb2YgYmVpbmcgZGlzcG9zZWQgYW5kIHJlYnVpbHQgKGxvc2luZyBzeW5jIHN0YXRlIGFuZCByZXNjYW5uaW5nIGV2ZXJ5dGhpbmcpLlxuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuLy8gVGhlIHN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBlbmRwb2ludDogaXRzIGNvbmZpZyB3aXRoIHRoZSBpbi1wbGFjZS11cGRhdGFibGUgcGFydHNcbi8vICh3aW5kb3dzLCByb3V0ZXMpIHN0cmlwcGVkLCBzbyBhIHNvdXJjZSBpcyByZWNvZ25pemVkIGFjcm9zcyBjb25maWcgY2hhbmdlc1xuZnVuY3Rpb24gc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghc291cmNlQ29uZmlnKSByZXR1cm4gXCJkaXNrXCI7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgLi4uc291cmNlQ29uZmlnLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkLCByb3V0ZTogdW5kZWZpbmVkIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcpOiBTdG9yZVBsYW4ge1xuICAgIC8vIFRoZSBkZXBsb3ktdGFrZW92ZXIgcmVtYXAgaXMgYW4gSU5URVJQUkVUQVRJT04gb3ZlcmxheTogZXZlcnl0aGluZyBiZWhhdmlvcmFsIChzZWxmIGVudHJpZXMsXG4gICAgLy8gd2luZG93cywgZG93bnN0cmVhbSBzb3VyY2VzKSB1c2VzIHRoZSByZW1hcHBlZCB2aWV3LCB3aGlsZSBsb2FkZWQucm91dGluZy9yb3V0aW5nSlNPTiBzdGF5XG4gICAgLy8gdGhlIFNUT1JFRCBjb25maWcgLSBzbyB2ZXJzaW9uIGd1YXJkcywgY2hhbmdlIGRldGVjdGlvbiwgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciBzZWUgKG9yXG4gICAgLy8gcGVyc2lzdCkgdGhlIHJlbWFwXG4gICAgbGV0IGVmZmVjdGl2ZSA9IGFwcGx5RGVwbG95UmVtYXAocm91dGluZyk7XG4gICAgbGV0IHNlbGZJbmRleGVzID0gZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gZWZmZWN0aXZlLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKTtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoc2VsZkVudHJpZXMsIERhdGUubm93KCkpO1xuICAgIGxldCBzZWxmSW5kZXggPSAtMTtcbiAgICBpZiAoc2VsZikge1xuICAgICAgICBzZWxmSW5kZXggPSBlZmZlY3RpdmUuc291cmNlcy5pbmRleE9mKHNlbGYpO1xuICAgIH1cbiAgICAvLyBPdXIgb3duIGRpc2sgaXMgdGhlIGJhc2Ugc291cmNlOyBvbmx5IHRoZSByb3V0aW5nIGVudHJpZXMgRE9XTlNUUkVBTSBmcm9tIHVzIChhZnRlciBvdXJcbiAgICAvLyBjdXJyZW50bHktdmFsaWQgZW50cnkpIGJlY29tZSBzeW5jaHJvbml6YXRpb24gc291cmNlcy4gVXBzdHJlYW0gc291cmNlcyBzeW5jIGZyb20gdXMsIHNvXG4gICAgLy8gd3JpdGluZyB0byBvciBzY2FubmluZyB0aGVtIHdvdWxkIGp1c3QgZWNobyBvdXIgb3duIGRhdGEgYmFjayAoYW5kIG1ha2Ugb3VyIGF2YWlsYWJpbGl0eVxuICAgIC8vIGRlcGVuZCBvbiB0aGVpcnMpLiBBIHNlcnZlciBOT1QgaW4gdGhlIGxpc3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBidWNrZXQ6IGl0IGtlZXBzXG4gICAgLy8gaXRzIGRpc2sgZGF0YSAodGhlIGNvbmZpZyBtYXkgcmUtYWRkIGl0KSwgYnV0IHN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gLSBubyBvbmVcbiAgICAvLyBjb250YWN0cyBhIHJlbW92ZWQgc291cmNlLCBhbmQgc2Nhbm5pbmcvcHVzaGluZyBhcyBpZiB3ZSB3ZXJlIHN0aWxsIG9uZSB3b3VsZCBmaWdodCB0aGVcbiAgICAvLyByZWFsIGNoYWluLiBUaGUgY29uZmlnLWxldmVsIHZhbGlkV2luZG93IHJpZGVzIG9uIGVhY2ggQXJjaGl2ZXNTb3VyY2U7IHRoZSBkaXNrIHNvdXJjZVxuICAgIC8vIHNoYXJlcyBvdXIgY3VycmVudGx5LXZhbGlkIGVudHJ5J3Mgd2luZG93IChpdCBob2xkcyBvdXIgY29weSBvZiB0aGUgZGF0YSkuXG4gICAgLy8gT3VyIG93biBkaXNrIGdldHMgbm8gcm91dGUgZmlsdGVyOiBldmVyeXRoaW5nIGl0IGhvbGRzIGlzIG91cnMgdG8gaW5kZXggYW5kIHNlcnZlLlxuICAgIC8vIEJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgY29uZmlnIGVudGlyZWx5IGlzIGEgdmFsaWQgd2luZG93IG9mIE5PVEhJTkcgKFswLCAwXSk6IGZhc3RcbiAgICAvLyB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHkgKG5vdGhpbmcgbWF5IHNpdCBpbiBtZW1vcnkgb24gYSBub2RlIHRoYXQncyBiZWVuIGN1dCBvdXQpLFxuICAgIC8vIHdoaWxlIHRoZSBkaXNrIGRhdGEgYW5kIGluZGV4IHN0YXkgc2VydmVkLlxuICAgIC8vIEludGVybmFsbHkgZXZlcnkgc2VsZiBlbnRyeSBpcyB0aGUgU0FNRSBzdG9yZSAtIG9uZSBwcm9jZXNzIGxpc3RlbmluZyBvbiBvbmUgb3IgbW9yZSBwb3J0c1xuICAgIC8vIChhIHRha2VvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgbWlkZGxlIHdpbmRvdyBpbmNsdWRlZCkuIFNvIHRoZSBkaXNrIHdpbmRvdyBtZXJnZXMgYWxsXG4gICAgLy8gY29udGlndW91cyBvd24gd2luZG93czogYW4gb3B0aW9ucyBib3VuZGFyeSBvciB0aGUgcG9ydCBzcGxpdCBtdXN0IG5ldmVyIGZvcmNlIGEgcG9pbnRsZXNzXG4gICAgLy8gaW50ZXJuYWwgZmx1c2ggYmV0d2VlbiB0d28gd2luZG93cyB0aGF0IGFyZSBib3RoIHVzLiBPbmx5IHRoZSBEWUlORyBwcm9jZXNzIG9mIGEgdGFrZW92ZXJcbiAgICAvLyBjbGlwcyBpdHMgZW5kIC0gZnJvbSB0aGUgd3JpdGUgaGFuZG9mZiBvbiwgdGhlIGRhdGEgYmVsb25ncyB0byB0aGUgc3VjY2Vzc29yIHByb2Nlc3MuXG4gICAgbGV0IGRpc2tXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgaWYgKHNlbGYpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB3aGlsZSAobWVyZ2VkKSB7XG4gICAgICAgICAgICBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHNlbGZFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtlbnRyeVN0YXJ0LCBlbnRyeUVuZF0gPSBlbnRyeS52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA+IGVuZCB8fCBlbnRyeUVuZCA8IHN0YXJ0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA8IHN0YXJ0IHx8IGVudHJ5RW5kID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIGVudHJ5U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIGVudHJ5RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNsaXAgPSBnZXRPd25XaW5kb3dFbmRDbGlwKCk7XG4gICAgICAgIGlmIChjbGlwICE9PSB1bmRlZmluZWQgJiYgY2xpcCA8IGVuZCkge1xuICAgICAgICAgICAgZW5kID0gY2xpcDtcbiAgICAgICAgfVxuICAgICAgICBkaXNrV2luZG93ID0gW3N0YXJ0LCBlbmRdO1xuICAgIH1cbiAgICBsZXQgb3duSW5kZXhlcyA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgIGxldCBzb3VyY2VTcGVjczogU3RvcmVQbGFuW1wic291cmNlU3BlY3NcIl0gPSBbe1xuICAgICAgICB2YWxpZFdpbmRvdzogZGlza1dpbmRvdyxcbiAgICB9XTtcbiAgICBpZiAoc2VsZkluZGV4ICE9PSAtMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gc2VsZkluZGV4ICsgMTsgaSA8IGVmZmVjdGl2ZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBvd25JbmRleGVzLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBEaXNqb2ludC1zaGFyZCBzb3VyY2VzIG5ldmVyIHRhbGsgdG8gZWFjaCBvdGhlcjsgYSBwYXJ0aWFsIG92ZXJsYXAgc3luY3Mgb25seVxuICAgICAgICAgICAgLy8gdGhlIGludGVyc2VjdGlvbiAoc2NhbnMgaWdub3JlIHRoZSByZXN0LCB3cml0ZXMgb25seSBzZW5kIG1hdGNoaW5nIGtleXMpXG4gICAgICAgICAgICBsZXQgc2hhcmVkUm91dGUgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmPy5yb3V0ZSwgc291cmNlLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gQSBib3VuZGVkLWNhY2hlIHNlcnZlciAobm9GdWxsU3luYyBvbiBvdXIgb3duIGVudHJ5KSBtdXN0IG5vdCBmdWxsLXN5bmMgZnJvbVxuICAgICAgICAgICAgLy8gQU5ZIHNvdXJjZSwgb3IgaXRzIGRpc2sgd291bGQgZmlsbCByZWdhcmRsZXNzIG9mIHRoZSBsaW1pdFxuICAgICAgICAgICAgc291cmNlU3BlY3MucHVzaCh7IHNvdXJjZUNvbmZpZzogc291cmNlLCB2YWxpZFdpbmRvdzogc291cmNlLnZhbGlkV2luZG93LCByb3V0ZTogc2hhcmVkUm91dGUsIG5vRnVsbFN5bmM6IHNvdXJjZS5ub0Z1bGxTeW5jIHx8IHNlbGY/Lm5vRnVsbFN5bmMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhd0Rpc2sgPSAhIXNlbGY/LnJhd0Rpc2s7XG4gICAgLy8gT25seSB3aGF0IHRoZSBydW5uaW5nIHN0b3JlIGdlbnVpbmVseSBjYW5ub3QgY2hhbmdlIGluIHBsYWNlOiB0aGUgc3RvcmUgVFlQRSAocmF3RGlzaykgYW5kXG4gICAgLy8gd2hldGhlciB0aGUgZGlzay1saW1pdCBwb2xsIHJ1bnMuIFNvdXJjZSBhZGRpdGlvbnMvcmVtb3ZhbHMgYW5kIHdpbmRvdy9yb3V0ZSBjaGFuZ2VzIGFyZSBhbGxcbiAgICAvLyBhcHBsaWVkIGxpdmUgdmlhIHVwZGF0ZVNvdXJjZXMgLSBhIGNvbmZpZyBjaGFuZ2UgbXVzdCBuZXZlciBkZXN0cm95IHRoZSBydW5uaW5nIHN0b3JlLlxuICAgIGxldCBzdHJ1Y3R1cmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJhd0Rpc2ssXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogc2VsZj8ucmVhZGVyRGlza0xpbWl0LFxuICAgIH0pO1xuICAgIHJldHVybiB7IGVmZmVjdGl2ZSwgc2VsZkVudHJpZXMsIHNlbGYsIHJhd0Rpc2ssIHNvdXJjZVNwZWNzLCByZWFkZXJEaXNrTGltaXQ6IHNlbGY/LnJlYWRlckRpc2tMaW1pdCwgc3RydWN0dXJlS2V5IH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcsIHBsYW4/OiBTdG9yZVBsYW4pOiBMb2FkZWRCdWNrZXQge1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFwbGFuKSB7XG4gICAgICAgIHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIH1cbiAgICBsZXQgeyBzZWxmRW50cmllcywgc2VsZiB9ID0gcGxhbjtcbiAgICBsZXQgc3RvcmU6IElCdWNrZXRTdG9yZTtcbiAgICBpZiAocGxhbi5yYXdEaXNrKSB7XG4gICAgICAgIHN0b3JlID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc2VsZikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFRoaXMgc2VydmVyIGlzIG5vdCBpbiB0aGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IG5vIGxvbmdlciBzeW5jaHJvbml6aW5nLCB2YWxpZCB3aW5kb3cgdHJlYXRlZCBhcyBbMCwgMF0gKGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5KSwgZGlzayBkYXRhIGtlcHQgYW5kIHNlcnZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gcGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiAoe1xuICAgICAgICAgICAgc291cmNlOiBzcGVjLnNvdXJjZUNvbmZpZyAmJiBjcmVhdGVBcGlBcmNoaXZlcyhzcGVjLnNvdXJjZUNvbmZpZykgfHwgbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csXG4gICAgICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzcGVjLnNvdXJjZUNvbmZpZyksXG4gICAgICAgIH0pKTtcbiAgICAgICAgc3RvcmUgPSBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ6IGtleSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZXMgZm9yIG91ciBvd24gcm91dGluZyB3cml0ZXMgQU5EIHJvdXRpbmcgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb25cbiAgICAgICAgICAgICAgICAvLyAob25seSBldmVyIG5ld2VyIG9uZXMsIHNlZSBJQXJjaGl2ZXMuc2V0KSDigJQgZWl0aGVyIHdheSwgYXBwbHkgdGhlIG5ldyBjb25maWdcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2b2lkIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHBsYW4ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZDogTG9hZGVkQnVja2V0ID0geyBhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nLCByb3V0aW5nSlNPTjogSlNPTi5zdHJpbmdpZnkocm91dGluZyksIHNlbGZFbnRyaWVzLCBzZWxmLCBzdG9yZSwgc3RydWN0dXJlS2V5OiBwbGFuLnN0cnVjdHVyZUtleSB9O1xuICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZCk7XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGxvYWRlZCA9IGxvYWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgbG9hZGVkKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIGFyZSBub3QgY2FjaGVkIOKAlCB0aGV5IGNhbiBiZSBjcmVhdGVkIGF0IGFueSB0aW1lIChndWFyZGluZyBhZ2FpbnN0IGFcbiAgICAgICAgLy8gY29uY3VycmVudCBjcmVhdGUgaGF2aW5nIGFscmVhZHkgcmVwbGFjZWQgb3VyIGVudHJ5KVxuICAgICAgICB2b2lkIGxvYWRlZC50aGVuKGJ1Y2tldCA9PiB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCAmJiBidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbi8vIEJ1bXBlZCB3aGVuZXZlciBhbnkgYnVja2V0J3Mgcm91dGluZyBjb25maWcgaXMgYXBwbGllZCAoY3JlYXRlZCwgdXBkYXRlZCBpbiBwbGFjZSwgb3IgcmVidWlsdCkuXG4vLyBBZHZlcnRpc2VkIGluIHBpbmcgcmVzcG9uc2VzLCBzbyBldmVyeSBjb25uZWN0ZWQgY2xpZW50IGxlYXJucyBvZiBhIGNvbmZpZyBjaGFuZ2Ugd2l0aGluIG9uZVxuLy8gcGluZyBpbnRlcnZhbCAtIHRoZSBzYW1lIGJyb2FkY2FzdCBjaGFubmVsIHRoZSBkZXBsb3ktdGFrZW92ZXIgc3RhbXAgdXNlcy5cbmxldCByb3V0aW5nR2VuZXJhdGlvbiA9IDA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um91dGluZ0dlbmVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm91dGluZ0dlbmVyYXRpb247XG59XG5cbi8vIFJvdXRpbmcgcmVsb2FkcyBhcmUgc2VyaWFsaXplZCBwZXIgYnVja2V0LCBzbyBjb25jdXJyZW50IHdyaXRlcy9zeW5jcyBjYW4ndCByZWJ1aWxkIHRoZSBzYW1lXG4vLyBzdG9yZSB0d2ljZSBpbiBwYXJhbGxlbFxuY29uc3Qgcm91dGluZ1JlbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcbmZ1bmN0aW9uIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBuZXh0ID0gKHJvdXRpbmdSZWxvYWRzLmdldChrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgICAudGhlbigoKSA9PiBjaGVja1JvdXRpbmdDaGFuZ2VkKGFjY291bnQsIGJ1Y2tldE5hbWUsIGNvbmZpZykpXG4gICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoYFJlbG9hZGluZyByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6YCwgZSkpO1xuICAgIHJvdXRpbmdSZWxvYWRzLnNldChrZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1JvdXRpbmdDaGFuZ2VkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGl0IGlzIG5ldmVyIHB1bGxlZCBmcm9tIGFub3RoZXJcbiAgICAvLyBzb3VyY2UgKGl0IHJlYWNoZXMgdXMgZXhjbHVzaXZlbHkgYXMgYSB2ZXJzaW9uLXZhbGlkYXRlZCB3cml0ZSwgd2hpY2ggbGFuZHMgb24gZGlzayBmaXJzdClcbiAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgaWYgKCFjb25maWc/LmZvcmNlICYmIEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpID09PSBsb2FkZWQucm91dGluZ0pTT04pIHJldHVybjtcbiAgICBsZXQgcmVhc29uID0gY29uZmlnPy5mb3JjZSAmJiAoY29uZmlnLnJlYXNvbiB8fCBcImZvcmNlZFwiKSB8fCBcInJvdXRpbmcgY29uZmlnIGNoYW5nZWRcIjtcbiAgICBsZXQgcGxhbiA9IGNvbXB1dGVTdG9yZVBsYW4oYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyk7XG4gICAgLy8gQ29uZmlnIGNoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIFJVTk5JTkcgc3RvcmUgaW4gcGxhY2UgLSB3aW5kb3dzL3JvdXRlcyBtdXRhdGUsIGFkZGVkXG4gICAgLy8gc291cmNlcyBzdGFydCBzeW5jaW5nLCByZW1vdmVkIHNvdXJjZXMnIHNsb3RzIGdvIGRlYWQgLSBzbyB0aGUgaW5kZXgsIHBlbmRpbmcgZmFzdCB3cml0ZXNcbiAgICAvLyAocmUtY2FwcGVkIHRvIHRoZSBuZXcgZGVhZGxpbmUpLCBhbmQgdW5hZmZlY3RlZCBzeW5jIGxvb3BzIGFsbCBzdXJ2aXZlLiBUaGUgc3RvcmUgaXMgb25seVxuICAgIC8vIGRlc3Ryb3llZCBmb3Igd2hhdCBpdCBzdHJ1Y3R1cmFsbHkgY2Fubm90IGV4cHJlc3MgKGEgcmF3RGlzayBmbGlwKS5cbiAgICBpZiAocGxhbi5zdHJ1Y3R1cmVLZXkgPT09IGxvYWRlZC5zdHJ1Y3R1cmVLZXkgJiYgbG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBcHBseWluZyB0aGUgcm91dGluZyBjb25maWcgdG8gdGhlIHJ1bm5pbmcgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICAgICAgbG9hZGVkLnN0b3JlLnVwZGF0ZVNvdXJjZXMocGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb25maWcgPSBzcGVjLnNvdXJjZUNvbmZpZztcbiAgICAgICAgICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHVuZGVmaW5lZCksIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LCBjcmVhdGU6ICgpOiBJQXJjaGl2ZXMgPT4gbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRlOiBzcGVjLnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBMb2FkZWRCdWNrZXQgPSB7IC4uLmxvYWRlZCwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllczogcGxhbi5zZWxmRW50cmllcywgc2VsZjogcGxhbi5zZWxmIH07XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWQpKTtcbiAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQodXBkYXRlZCk7XG4gICAgICAgIHNjaGVkdWxlQm91bmRhcnlTY2Fucyh1cGRhdGVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUmVidWlsZGluZyB0aGUgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICBpZiAobG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHBsYW4pKSk7XG59XG5cbi8vIFBlci13cml0ZSBvcHRpb25zIGFyZSBldmFsdWF0ZWQgYXQgdGhlIFdSSVRFJ3MgdGltZSAoYW5kIHRoZSBrZXkncyByb3V0ZSksIG5vdCB0aGUgY3VycmVudFxuLy8gY29uZmlnOiB0aGUgd3JpdGUgdGltZSBpcyBzdGFtcGVkIGV4YWN0bHkgb25jZSAoYXQgdGhlIGZpcnN0IG5vZGUgdGhhdCByZWNlaXZlcyB0aGUgd3JpdGUpIGFuZFxuLy8gcHJvcGFnYXRlcyB3aXRoIHRoZSBkYXRhLCBzbyBldmVyeSBub2RlIHJlc29sdmVzIHRoZSBzYW1lIHNlbGYgZW50cnkgLSBhbmQgdGhlIHNhbWUgb3B0aW9ucy5cbmZ1bmN0aW9uIGdldFdyaXRlQ29uZmlnKGJ1Y2tldDogTG9hZGVkQnVja2V0LCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHsgZmFzdD86IGJvb2xlYW47IHdyaXRlRGVsYXk/OiBudW1iZXIgfSB7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGJ1Y2tldC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgcmV0dXJuIHsgZmFzdDogc2VsZj8uZmFzdCwgd3JpdGVEZWxheTogc2VsZj8ud3JpdGVEZWxheSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TXV0YWJsZShidWNrZXQ6IExvYWRlZEJ1Y2tldCwgZmlsZVBhdGg6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIGdldFJvdXRlKGZpbGVQYXRoKSk7XG4gICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICBpZiAoYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YnVja2V0LmFjY291bnR9LyR7YnVja2V0LmJ1Y2tldE5hbWV9IGlzIGltbXV0YWJsZSAoYXQgd3JpdGUgdGltZSAke3dyaXRlVGltZX0pIGFuZCAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gYWxyZWFkeSBleGlzdHMsIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIHRvYCk7XG4gICAgfVxufVxuXG4vLyBXcm9uZy10YXJnZXQgcmVqZWN0aW9ucyBhcmUgcmFyZSBhbmQgaW1wb3J0YW50ICh0aGV5IEFSRSB0aGUgc3dpdGNob3ZlciBoYW5kb2ZmKSwgYnV0IGEgYnVyc3Qgb2Zcbi8vIHJhY2luZyB3cml0ZXMgYXQgYSBib3VuZGFyeSBtdXN0IG5vdCBmbG9vZCB0aGUgbG9nIC0gc28gYXQgbW9zdCBvbmUgbGluZSBhIG1pbnV0ZVxuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbmxldCBsYXN0V3JvbmdUYXJnZXRMb2cgPSAwO1xuZnVuY3Rpb24gbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0V3JvbmdUYXJnZXRMb2cgPCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFKSByZXR1cm47XG4gICAgbGFzdFdyb25nVGFyZ2V0TG9nID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cblxuLy8gUm91dGluZyB3cml0ZXMgYXJlIHNlcmlhbGl6ZWQgcGVyIGJ1Y2tldCwgc28gdHdvIGNvbmN1cnJlbnQgY3JlYXRlcyBjYW4ndCBib3RoIGJ1aWxkIGEgc3RvcmVcbi8vICh0aGUgbG9zZXIncyBzdG9yZSB3b3VsZCBsZWFrIHdpdGggaXRzIHN5bmMgbG9vcHMgcnVubmluZyBmb3JldmVyKVxuY29uc3Qgcm91dGluZ1dyaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAvLyBWYWxpZGF0ZXMgYmVmb3JlIHN0b3JpbmcgYW55dGhpbmcsIHNvIGEgYmFkIGNvbmZpZyBjYW4ndCBicmljayB0aGUgYnVja2V0XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIGluY29taW5nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZCBidWNrZXQgJHtrZXl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBjaGFuZ2VkIGNvbmZpZyBtdXN0IGNhcnJ5IGEgaGlnaGVyIHZlcnNpb24gdGhhbiB0aGUgb25lIGN1cnJlbnRseSBzdG9yZWQg4oCUIG90aGVyd2lzZSB0d29cbiAgICAvLyBjbGllbnRzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgYXQgdGhlIHNhbWUgdmVyc2lvbiB3b3VsZCBrZWVwIGNsb2JiZXJpbmcgZWFjaCBvdGhlci4gU2FtZVxuICAgIC8vIGNvbnRlbnQgYXQgYW55IHZlcnNpb24gaXMgYSBoYXJtbGVzcyBuby1vcCBhbmQgaXMgYWxsb3dlZCB0aHJvdWdoLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShpbmNvbWluZykgIT09IGxvYWRlZC5yb3V0aW5nSlNPTiAmJiBnZXRDb25maWdWZXJzaW9uKGluY29taW5nKSA8PSBnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1cGRhdGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX06IHRoZSBuZXcgY29uZmlnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUgYnV0IGl0cyB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSkgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuIEN1cnJlbnQ6ICR7bG9hZGVkLnJvdXRpbmdKU09OfS4gQXR0ZW1wdGVkOiAke0pTT04uc3RyaW5naWZ5KGluY29taW5nKX1gKTtcbiAgICB9XG4gICAgLy8gUm91dGluZyB3cml0ZXMgYnlwYXNzIGZhc3QgbW9kZSAodGhlIGNvbmZpZyBtdXN0IGFwcGx5IGltbWVkaWF0ZWx5IGFuZCBzdXJ2aXZlIGEgY3Jhc2gpXG4gICAgLy8gYW5kIGlnbm9yZSBpbW11dGFibGUgKHRoZSByb3V0aW5nIGZpbGUgbXVzdCBhbHdheXMgc3RheSB1cGRhdGFibGUpLiBBbiBvbGRlciBsYXN0TW9kaWZpZWRcbiAgICAvLyBuby1vcHMgaW5zaWRlIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgcmVsb2FkIGJlbG93IHNlZXMgbm8gY2hhbmdlLlxuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICBsZXQgcnVuID0gKHJvdXRpbmdXcml0ZXMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKCkgPT4gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQsIGJ1Y2tldE5hbWUsIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICAvLyBUaGUgY2hhaW4gbXVzdCBzdXJ2aXZlIGEgZmFpbGVkIHdyaXRlLCBzbyB0aGUgc3RvcmVkIGxpbmsgc3dhbGxvd3MgdGhlIGVycm9yICh0aGUgY2FsbGVyXG4gICAgICAgIC8vIHN0aWxsIGdldHMgaXQgZnJvbSBydW4pXG4gICAgICAgIHJvdXRpbmdXcml0ZXMuc2V0KGtleSwgcnVuLnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bjtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICB9XG4gICAgLy8gVGhlIHdyaXRlIHRpbWUgaXMgZGV0ZXJtaW5lZCBleGFjdGx5IG9uY2UsIEhFUkUgYXQgdGhlIGZpcnN0IG5vZGUgdGhhdCByZWNlaXZlcyB0aGUgd3JpdGU7XG4gICAgLy8gaXQgcHJvcGFnYXRlcyBhcyBsYXN0TW9kaWZpZWQsIHNvIGV2ZXJ5IG5vZGUgZXZhbHVhdGVzIHRoZSBidWNrZXQgb3B0aW9ucyBhdCB0aGUgc2FtZSBpbnN0YW50XG4gICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgLy8gT25seSBmcmVzaGx5LXN0YW1wZWQgd3JpdGVzIGFyZSBjaGVja2VkOiBhIHdyaXRlIHdpdGggYW4gZXhwbGljaXQgbGFzdE1vZGlmaWVkIGlzXG4gICAgLy8gc3luY2hyb25pemF0aW9uL2JhY2tmaWxsIChvbGQgZGF0YSBsZWdpdGltYXRlbHkgbGFuZHMgb24gc291cmNlcyB3aG9zZSB3aW5kb3cgaGFzIG1vdmVkIG9uKSxcbiAgICAvLyBidXQgYSBmcmVzaCB3cml0ZSByZWFjaGluZyB1cyBvdXRzaWRlIG91ciB3aW5kb3dzL3JvdXRlcyBtZWFucyB0aGUgY2xpZW50IHJlc29sdmVkIGl0c1xuICAgIC8vIHRhcmdldCBmcm9tIGEgc3RhbGUgdmlldyAtIGl0IG11c3QgcmUtcmVzb2x2ZSBhbmQgcmV0cnkgYXQgdGhlIGNvcnJlY3Qgc291cmNlLlxuICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICBpZiAoIWNvbmZpZz8ubGFzdE1vZGlmaWVkICYmIGxvYWRlZC5zZWxmRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IGxvYWRlZC5zZWxmRW50cmllcy5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkobG9hZGVkLnNlbGZFbnRyaWVzLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBUaGlzIHNlcnZlciBpcyBub3QgYSB2YWxpZCB3cml0ZSB0YXJnZXQgYXQgJHt3cml0ZVRpbWV9IGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgdmFsaWQgd2luZG93czogJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSkuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0pIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShsb2FkZWQsIGZpbGVQYXRoLCB3cml0ZVRpbWUpO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoZmlsZVBhdGgsIGRhdGEsIHsgLi4uZ2V0V3JpdGVDb25maWcobG9hZGVkLCB3cml0ZVRpbWUsIHJvdXRlKSwgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXRDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQpOiBBcmNoaXZlc0NvbmZpZyB7XG4gICAgbGV0IHByb2dyZXNzID0gYnVja2V0LnN0b3JlLmdldFN5bmNQcm9ncmVzcz8uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6ICEhYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcixcbiAgICAgICAgLy8gVGhlIHJlbWFwcGVkIChpbnRlcnByZXRhdGlvbikgdmlldzogZ2V0Q29uZmlnIGlzIGhvdyBjbGllbnRzIGxlYXJuIG9mIGFuIGluLXByb2dyZXNzXG4gICAgICAgIC8vIGRlcGxveSB0YWtlb3Zlciwgc2luY2UgdGhlIHJlbWFwIGlzIG5ldmVyIHdyaXR0ZW4gaW50byB0aGUgcm91dGluZyBmaWxlIGl0c2VsZlxuICAgICAgICByZW1vdGVDb25maWc6IGFwcGx5RGVwbG95UmVtYXAoYnVja2V0LnJvdXRpbmcpLFxuICAgICAgICBpbmRleDogcHJvZ3Jlc3M/LmluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXM6IHByb2dyZXNzPy5zb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHByb2dyZXNzPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmc6IHByb2dyZXNzPy5zeW5jaW5nLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLmJ1Y2tldHMua2V5cygpXSkge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChrZXkuc2xpY2UoMCwgc2xhc2gpLCBrZXkuc2xpY2Uoc2xhc2ggKyAxKSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImRlcGxveSB0YWtlb3ZlciBzdGF0ZSBjaGFuZ2VkXCIgfSk7XG4gICAgfVxufVxuXG5vblRha2VvdmVyRXZlbnQoZXZlbnQgPT4ge1xuICAgIGlmIChldmVudCA9PT0gXCJyZW1hcENoYW5nZWRcIikge1xuICAgICAgICAvLyBUaGUgcmVidWlsZCBhcHBsaWVzIHRoZSByZW1hcHBlZCB3aW5kb3dzLCBhbmQgc2NoZWR1bGVCb3VuZGFyeVNjYW5zIChwYXJ0IG9mIHRoZVxuICAgICAgICAvLyByZWJ1aWxkKSBzY2hlZHVsZXMgdGhlIGhhbmRvZmYgc2NhbnMgYXJvdW5kIHRoZSBuZXcgd2luZG93cycgc3RhcnRzXG4gICAgICAgIHZvaWQgcmVidWlsZEFsbExvYWRlZEJ1Y2tldHMoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gTG9hZGVkIGluIG1lbW9yeSAoY3JlYXRlZCBvciBhY2Nlc3NlZCBzaW5jZSBzdGFydHVwKSwgc28gaXRzIHN5bmNocm9uaXphdGlvbiBpcyBydW5uaW5nXG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuLyoqIEV2ZXJ5IGJ1Y2tldCB0aGUgYWNjb3VudCBoYXMgb24gdGhpcyBzZXJ2ZXIsIGFjdGl2ZSBvciBub3QsIGVhY2ggd2l0aCBpdHMgY29uZmlndXJhdGlvbi5cbiAqICBJbmFjdGl2ZSBidWNrZXRzIGFyZSBpbnNwZWN0ZWQgc3RyYWlnaHQgZnJvbSBkaXNrIFdJVEhPVVQgbG9hZGluZyB0aGVtIC0gbG9hZGluZyB3b3VsZCBzdGFydFxuICogIHRoZWlyIHN5bmNocm9uaXphdGlvbiwgYW5kIG9sZCBpbnZhbGlkIGJ1Y2tldHMgbXVzdCBzdGF5IGluZXJ0ICh0aGVpciBwYXJzZSBlcnJvciBpcyByZXBvcnRlZFxuICogIGluc3RlYWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBhY2NvdW50Rm9sZGVyID0gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCk7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBuYW1lcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoYWNjb3VudEZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHM6IFNlcnZlckJ1Y2tldEluZm9bXSA9IFtdO1xuICAgIGZvciAobGV0IGJ1Y2tldE5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCk7XG4gICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBsb2FkZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBjb25maWc6IGdldEJ1Y2tldENvbmZpZyhsb2FkZWQpIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHBhcnNlUm91dGluZ0RhdGEoZGF0YSkgfSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiBmYWxzZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRlbChmaWxlUGF0aCwgZ2V0V3JpdGVDb25maWcobG9hZGVkLCBEYXRlLm5vdygpLCBnZXRSb3V0ZShmaWxlUGF0aCkpKTtcbn1cblxuLy8g4pSA4pSAIGxvY2FsIElBcmNoaXZlcyBhY2Nlc3Mg4pSA4pSAXG5cbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBUaGUgaW4tcHJvY2VzcyBJQXJjaGl2ZXMgZm9yIGEgYnVja2V0IGhvc3RlZCBieSBUSElTIHNlcnZlciDigJQgdXNlZCB3aGVuIGEgUmVtb3RlQ29uZmlnIHNvdXJjZVxuLy8gVVJMIHBvaW50cyBhdCBvdXJzZWx2ZXMsIHNvIHdlIGRvbid0IHRhbGsgdG8gb3Vyc2VsdmVzIG92ZXIgSFRUUFMuIE9uZSBzaW5nbGV0b24gcGVyIGJ1Y2tldC5cbmNsYXNzIEFyY2hpdmVzTG9jYWxCdWNrZXQgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNjb3VudDogc3RyaW5nLCBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1Y2tldCgpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsQnVja2V0IGFjY291bnQgJHt0aGlzLmFjY291bnR9IGJ1Y2tldCAke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShidWNrZXQsIGNvbmZpZy5wYXRoLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgYnVja2V0LnN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgTEFSR0VfRklMRV9QQVJUX1NJWkUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIHNheSB0cnVlLCBtYXRjaGluZyB3aGF0IHRoZXkgYmVjb21lIG9uY2UgY3JlYXRlZCAodGhlIGRlZmF1bHQgc3RvcmUgdHlwZSlcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIGluZGV4KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKHRpbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IGFsbFNjYW5zQ29tcGxldGU6IHRydWUsIGluZGV4U2l6ZTogMCwgc291cmNlczogW10gfTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXMgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIHN5bmNocm9uaXphdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMoKTtcbiAgICB9XG59XG5cbmNvbnN0IGxvY2FsQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsQXJjaGl2ZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgZXhpc3RpbmcgPSBsb2NhbEFyY2hpdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlcyA9IG5ldyBBcmNoaXZlc0xvY2FsQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxvY2FsQXJjaGl2ZXMuc2V0KGtleSwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cbiJdfQ==
890
+ /* _JS_SOURCE_HASH = "65c84d2588013067a4469ddefa630c6452d63b9a68923dd256f89255c0e918ae"; */
@@ -0,0 +1,5 @@
1
+ /** Subscribe to server-pushed routing change notifications. Returns the unsubscribe function. */
2
+ export declare function onServerRoutingChanged(listener: () => void): () => void;
3
+ export declare const StorageClientController: import("socket-function/SocketFunctionTypes").SocketRegistered<{
4
+ routingConfigChanged: () => Promise<void>;
5
+ }>;
@@ -0,0 +1,35 @@
1
+ import { SocketFunction } from "socket-function/SocketFunction";
2
+
3
+ // The client half of routing-change broadcasts: the storage server tracks its connected clients
4
+ // (see trackCaller in storageController) and calls routingConfigChanged on every one of them the
5
+ // moment a routing config changes - clients react immediately instead of waiting for a poll.
6
+
7
+ const listeners = new Set<() => void>();
8
+
9
+ /** Subscribe to server-pushed routing change notifications. Returns the unsubscribe function. */
10
+ export function onServerRoutingChanged(listener: () => void): () => void {
11
+ listeners.add(listener);
12
+ return () => {
13
+ listeners.delete(listener);
14
+ };
15
+ }
16
+
17
+ class StorageClientControllerBase {
18
+ async routingConfigChanged(): Promise<void> {
19
+ for (let listener of [...listeners]) {
20
+ try {
21
+ listener();
22
+ } catch (e) {
23
+ console.error(`Routing change listener failed: ${(e as Error).stack ?? e}`);
24
+ }
25
+ }
26
+ }
27
+ }
28
+
29
+ export const StorageClientController = SocketFunction.register(
30
+ "StorageClientController-remoteStorage-2b8f1a6d",
31
+ new StorageClientControllerBase(),
32
+ () => ({
33
+ routingConfigChanged: {},
34
+ }),
35
+ );