sliftutils 1.7.112 → 1.7.113

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.
Files changed (66) hide show
  1. package/dist/treeSummary.ts.cache +2 -2
  2. package/index.d.ts +2 -1
  3. package/misc/dist/environment.ts.cache +2 -2
  4. package/misc/dist/getSecret.ts.cache +2 -2
  5. package/misc/dist/strings.ts.cache +2 -2
  6. package/misc/dist/zip.ts.cache +2 -2
  7. package/misc/https/dist/certs.ts.cache +2 -2
  8. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  9. package/package.json +1 -1
  10. package/render-utils/dist/observer.tsx.cache +2 -2
  11. package/storage/ArchivesDisk.ts +8 -7
  12. package/storage/IArchives.d.ts +1 -0
  13. package/storage/IArchives.ts +2 -1
  14. package/storage/TransactionFile.d.ts +1 -1
  15. package/storage/TransactionFile.ts +13 -2
  16. package/storage/archiveHelpers.ts +11 -9
  17. package/storage/dist/ArchivesDisk.ts.cache +10 -9
  18. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  19. package/storage/dist/IArchives.ts.cache +3 -3
  20. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  21. package/storage/dist/JSONStorage.ts.cache +2 -2
  22. package/storage/dist/PendingManager.tsx.cache +2 -2
  23. package/storage/dist/StreamingLogs.ts.cache +2 -2
  24. package/storage/dist/TransactionFile.ts.cache +16 -5
  25. package/storage/dist/TransactionStorage.ts.cache +2 -2
  26. package/storage/dist/archiveHelpers.ts.cache +13 -11
  27. package/storage/dist/backblaze.ts.cache +2 -2
  28. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  29. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  30. package/storage/remoteStorage/ArchivesDelayed.ts +3 -3
  31. package/storage/remoteStorage/ArchivesRemote.ts +2 -2
  32. package/storage/remoteStorage/blobStore.ts +15 -15
  33. package/storage/remoteStorage/bucketDisk.ts +2 -1
  34. package/storage/remoteStorage/chainStartup.ts +2 -2
  35. package/storage/remoteStorage/createArchives.ts +13 -13
  36. package/storage/remoteStorage/deployTakeover.ts +1 -1
  37. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +6 -6
  38. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
  39. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
  40. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  41. package/storage/remoteStorage/dist/blobStore.ts.cache +17 -17
  42. package/storage/remoteStorage/dist/bucketDisk.ts.cache +5 -4
  43. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
  44. package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -5
  45. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  46. package/storage/remoteStorage/dist/createArchives.ts.cache +14 -14
  47. package/storage/remoteStorage/dist/deployTakeover.ts.cache +4 -4
  48. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
  49. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  50. package/storage/remoteStorage/dist/remoteConfig.ts.cache +4 -4
  51. package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
  52. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +6 -6
  53. package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
  54. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  55. package/storage/remoteStorage/dist/storageController.ts.cache +7 -7
  56. package/storage/remoteStorage/dist/storageServerState.ts.cache +4 -4
  57. package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
  58. package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
  59. package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
  60. package/storage/remoteStorage/dist/storeSync.ts.cache +8 -8
  61. package/storage/remoteStorage/dist/validation.ts.cache +2 -2
  62. package/storage/remoteStorage/remoteConfig.ts +1 -1
  63. package/storage/remoteStorage/sourceWrapper.ts +3 -3
  64. package/storage/remoteStorage/storageController.ts +4 -4
  65. package/storage/remoteStorage/storageServerState.ts +1 -1
  66. package/storage/remoteStorage/storeSync.ts +7 -7
@@ -138,7 +138,7 @@ class StoreSync {
138
138
  if (local) {
139
139
  // The local copy can be NEWER than the entry (which is exactly why copyArchiveFile refuses to overwrite it - see its destination check), so the repoint keeps the newer of the two times rather than rolling the index back
140
140
  this.store.setIndexEntry(key, { writeTime: Math.max(entry.writeTime, local.writeTime), size: local.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
141
- (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "repointed to our local copy", localSize: local.size, localWriteTime: new Date(local.writeTime).toISOString() });
141
+ (0, storageLogs_1.logSyncEvent)({ ...base, resolution: "repointed to our local copy", localSize: local.size, localWriteTime: (0, format_1.formatDateTimeDetailed)(local.writeTime) });
142
142
  return;
143
143
  }
144
144
  if (this.store.currentWriteTime(key) <= entry.writeTime) {
@@ -370,12 +370,12 @@ class StoreSync {
370
370
  // Undefined is two cases (see copyArchiveFile): our own disk already holding something newer is the boundary scan working as intended (our writes since the boundary outrank the neighbor's), only a genuinely unreadable file is worth a warning
371
371
  let local = await this.store.sources[0].source.getInfo(file.path);
372
372
  if (local && local.writeTime > file.createTime) {
373
- (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanLocalNewer", store: this.store.folder, source: source.getDebugName(), path: file.path, theirWriteTime: new Date(file.createTime).toISOString(), theirSize: file.size, localWriteTime: new Date(local.writeTime).toISOString(), localSize: local.size });
373
+ (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanLocalNewer", store: this.store.folder, source: source.getDebugName(), path: file.path, theirWriteTime: (0, format_1.formatDateTimeDetailed)(file.createTime), theirSize: file.size, localWriteTime: (0, format_1.formatDateTimeDetailed)(local.writeTime), localSize: local.size });
374
374
  this.store.setIndexEntry(file.path, { writeTime: local.writeTime, size: local.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
375
375
  tally.unchanged++;
376
376
  continue;
377
377
  }
378
- console.warn(`Boundary scan could not copy ${file.path} from ${source.getDebugName()} (store ${this.store.folder}): its change feed listed it (${file.size} bytes, writeTime ${new Date(file.createTime).toISOString()}) but the read found nothing`);
378
+ console.warn(`Boundary scan could not copy ${file.path} from ${source.getDebugName()} (store ${this.store.folder}): its change feed listed it (${file.size} bytes, writeTime ${(0, format_1.formatDateTimeDetailed)(file.createTime)}) but the read found nothing`);
379
379
  continue;
380
380
  }
381
381
  this.store.noteSyncTransfer("sync get", file.path, copied.size);
@@ -428,7 +428,7 @@ class StoreSync {
428
428
  state.initialScan.resolve(undefined);
429
429
  if (!loggedStale) {
430
430
  loggedStale = true;
431
- (0, storageLogs_1.logSyncEvent)({ event: "scanSkippedStaleWindows", store: this.store.folder, source: source.getDebugName(), validWindows: this.store.sources[sourceIndex].validWindows.map(w => [new Date(w[0]).toISOString(), new Date(w[1]).toISOString()]), pastReadDurationMs: PAST_READ_DURATION });
431
+ (0, storageLogs_1.logSyncEvent)({ event: "scanSkippedStaleWindows", store: this.store.folder, source: source.getDebugName(), validWindows: this.store.sources[sourceIndex].validWindows.map(w => [(0, format_1.formatDateTimeDetailed)(w[0]), (0, format_1.formatDateTimeDetailed)(w[1])]), pastReadDurationMs: PAST_READ_DURATION });
432
432
  }
433
433
  return true;
434
434
  };
@@ -631,10 +631,10 @@ class StoreSync {
631
631
  let theirs = await source.getInfo(key);
632
632
  if (theirs && theirs.writeTime > writeTime) {
633
633
  this.store.setIndexEntry(key, { writeTime: theirs.writeTime, size: theirs.size, sourcesListIndex: targetSourcesListIndex });
634
- (0, storageLogs_1.logSyncEvent)({ event: "pushFoundNewerOnSource", store: this.store.folder, source: source.getDebugName(), path: key, ourWriteTime: new Date(writeTime).toISOString(), theirWriteTime: new Date(theirs.writeTime).toISOString(), ourSize: entry.size, theirSize: theirs.size });
634
+ (0, storageLogs_1.logSyncEvent)({ event: "pushFoundNewerOnSource", store: this.store.folder, source: source.getDebugName(), path: key, ourWriteTime: (0, format_1.formatDateTimeDetailed)(writeTime), theirWriteTime: (0, format_1.formatDateTimeDetailed)(theirs.writeTime), ourSize: entry.size, theirSize: theirs.size });
635
635
  continue;
636
636
  }
637
- (0, storageLogs_1.logSyncEvent)({ event: "pushCopyUnavailable", store: this.store.folder, source: source.getDebugName(), path: key, holder: holder.getDebugName(), expectedSize: entry.size, expectedWriteTime: new Date(writeTime).toISOString(), sourceHas: theirs && `${theirs.size} bytes at ${new Date(theirs.writeTime).toISOString()}` || "nothing" });
637
+ (0, storageLogs_1.logSyncEvent)({ event: "pushCopyUnavailable", store: this.store.folder, source: source.getDebugName(), path: key, holder: holder.getDebugName(), expectedSize: entry.size, expectedWriteTime: (0, format_1.formatDateTimeDetailed)(writeTime), sourceHas: theirs && `${theirs.size} bytes at ${(0, format_1.formatDateTimeDetailed)(theirs.writeTime)}` || "nothing" });
638
638
  continue;
639
639
  }
640
640
  this.store.noteSyncTransfer("sync set", key, copied.size);
@@ -824,5 +824,5 @@ class StoreSync {
824
824
  }
825
825
  }
826
826
  exports.StoreSync = StoreSync;
827
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUErRztBQUMvRyx5REFBb0Q7QUFDcEQsbURBQTBFO0FBQzFFLGtFQUFpRjtBQUNqRiw0Q0FHc0I7QUFDdEIsc0RBQW9EO0FBQ3BELDRDQUFpRDtBQUNqRCxpREFBMkc7QUFFM0csMkNBQWtFO0FBQ2xFLCtDQUE2QztBQUM3Qyx3RUFBbUU7QUFFbkUsa2JBQWtiO0FBRWxiLHlFQUF5RTtBQUN6RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEMsbU1BQW1NO0FBQ25NLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Msa1FBQWtRO0FBQ2xRLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDNUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Qsc0dBQXNHO0FBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsbUJBQVksQ0FBQztBQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsb0xBQW9MO0FBQ3BMLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELG1GQUFtRjtBQUNuRixNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVDLHdJQUF3STtBQUN4SSxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3Qiw4S0FBOEs7QUFD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QztRQUNoQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFBRSxPQUFPO1lBQ3BDLElBQUksVUFBVSxJQUFJLE9BQU87Z0JBQUUsTUFBTTtZQUNqQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsVUFBVSxJQUFJLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNWLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSx3QkFBd0IsSUFBQSxxQkFBWSxFQUFDLGdCQUFnQixDQUFDLGFBQWEsSUFBQSxxQkFBWSxFQUFDLE9BQU8sQ0FBQywyQkFBMkIsT0FBTyx5QkFBeUIsSUFBQSxxQkFBWSxFQUFDLFlBQVksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQzdSLENBQUM7Q0FDSjtBQTdzQkQsOEJBNnNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCwgZGVsYXksIHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0LCBydW5JblNlcmlhbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSwgc29ydCwgcHJvbWlzZU9iaiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1N5bmNTdGF0dXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VSb3V0aW5nRGF0YSwgZ2V0Q29uZmlnVmVyc2lvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBCbG9iU3RvcmUsIEluZGV4RW50cnkgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7IGdldEhpc3RvcnlGYWN0b3IsIEhJU1RPUllfTUlOX0JZVEVTIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBsb2dTeW5jRXZlbnQgfSBmcm9tIFwiLi9zdG9yYWdlTG9nc1wiO1xuaW1wb3J0IHsgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5cbi8vIEV2ZXJ5dGhpbmcgdGhhdCBrZWVwcyBhIHN0b3JlJ3MgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggaXRzIHNvdXJjZXMsIHBsdXMgdGhlIHR3byBtYWludGVuYW5jZSBsb29wcyB0aGF0IGZvbGxvdyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGV2aWN0aW5nIGEgYm91bmRlZCBkaXNrIGNhY2hlLCBleHBpcmluZyB0b21ic3RvbmVzKS4gVGhlIHN0b3JlIG93bnMgdGhlIHNvdXJjZXMgYW5kIGRlY2lkZXMgd2hlcmUgd3JpdGVzIGdvOyB0aGlzIGRlY2lkZXMgd2hhdCBpcyBzY2FubmVkLCBwdWxsZWQsIHB1c2hlZCwgZXZpY3RlZCwgYW5kIGZvcmdvdHRlbiAtIHNvIHRoZSB3cml0ZSBwYXRoIHN0YXlzIHJlYWRhYmxlIHdpdGhvdXQgdGhlIHNldmVyYWwgaHVuZHJlZCBsaW5lcyBvZiBzeW5jaHJvbml6YXRpb24gbWFjaGluZXJ5IGludGVybGVhdmVkIGludG8gaXQuXG5cbi8vIFNvdXJjZXMgd2l0aCBhIG5hdGl2ZSAoaW5kZXgtYmFja2VkKSBjaGFuZ2UgZmVlZCBhcmUgcG9sbGVkIHRoaXMgb2Z0ZW5cbmNvbnN0IENIQU5HRVNfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBjaGVja2VkIGZvciBvbiBldmVyeSBwZWVyIHRoaXMgb2Z0ZW4gLSBmYXIgbW9yZSBvZnRlbiB0aGFuIGEgZnVsbCByZXNjYW4sIGJlY2F1c2UgaXQgaXMgdGhlIGZpbGUgdGhhdCBkZWNpZGVzIHdoYXQgZXZlcnl0aGluZyBlbHNlIGRvZXMsIGFuZCBpdCBpcyBvbmUgc21hbGwgcmVhZCBwZXIgcGVlclxuY29uc3QgQ09ORklHX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjAgKiA1O1xuLy8gRnVsbCBtZXRhZGF0YSByZXNjYW5zLiBzdXBwb3J0c0NoYW5nZXNBZnRlciBpcyB0aGUgaGV1cmlzdGljIGZvciBcIm9uZSBvZiBvdXIgb3duIHN0b3JhZ2Ugc2VydmVyc1wiOiB0aGVpciBpbmRleC1iYWNrZWQgbGlzdGluZ3MgYXJlIGNoZWFwLCBzbyBob3VybHkgaXMgZmluZS4gRXZlcnl0aGluZyBlbHNlIChiYWNrYmxhemUsIHBsYWluIGRpc2spIHBheXMgdGhlIGZ1bGwgbGlzdGluZyBjb3N0LCBzbyBpdCByZXNjYW5zIG11Y2ggbGVzcyBvZnRlbi5cbmNvbnN0IEZVTExfUkVTQ0FOX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG5jb25zdCBGVUxMX1JFU0NBTl9OT05fUkVNT1RFX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiA2O1xuLy8gQ2hhbmdlIHBvbGxzIHJlLXJlcXVlc3QgdGhpcyBtdWNoIG92ZXJsYXAsIHNvIGNsb2NrIHNrZXcgYmV0d2VlbiB1cyBhbmQgYSBzb3VyY2UgY2FuJ3QgZHJvcCBjaGFuZ2VzXG5jb25zdCBDSEFOR0VTX1BPTExfT1ZFUkxBUCA9IHRpbWVJbk1pbnV0ZTtcbmNvbnN0IFNDQU5fUkVUUllfREVMQVkgPSAxMDAwICogMzA7XG4vLyBEZWxldGVzIGFyZSB0b21ic3RvbmVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpcyB3aGF0IGxldHMgYSBkZWxldGlvbiBwcm9wYWdhdGUvcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLCBhbmQgaXQgZXhwaXJlcyBhZnRlciB0aGlzIGxvbmdcbmNvbnN0IFRPTUJTVE9ORV9FWFBJUlkgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogNztcbmNvbnN0IFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBXaGlsZSBhIG1ldGFkYXRhIHNjYW4gb3IgZnVsbCBzeW5jIGlzIHJ1bm5pbmcsIGl0cyBwcm9ncmVzcyBpcyBsb2dnZWQgdGhpcyBvZnRlblxuY29uc3QgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDAwICogNjA7XG5jb25zdCBESVNLX0xJTUlUX0NIRUNLX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gRnVsbCBzeW5jcyBkb3dubG9hZCB0aGlzIG1hbnkgZmlsZXMgY29uY3VycmVudGx5IChoaWdoLWxhdGVuY3kgc291cmNlcyBsaWtlIGJhY2tibGF6ZSB3b3VsZCBvdGhlcndpc2UgY3Jhd2wgb25lIHJvdW5kLXRyaXAgYXQgYSB0aW1lKVxuY29uc3QgRlVMTF9TWU5DX1BBUkFMTEVMID0gODtcbi8vIEEgZnVsbCBzeW5jIHJ1bm5pbmcgbG9uZ2VyIHRoYW4gdGhpcyBpcyBjb25zb2xlLmVycm9yZWQgKGFuZCBhZ2FpbiBldmVyeSBpbnRlcnZhbCBhZnRlciksIHNvIGEgc3luYyB0aGF0IHdpbGwgdGFrZSBkYXlzIGlzIGxvdWQgaW5zdGVhZCBvZiBhIHF1aWV0IGNvbnNvbGUubG9nIGV2ZXJ5IG1pbnV0ZVxuY29uc3QgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFJlY29uY2lsZSBwYXNzZXMgQU5EIGZ1bGwgc3luY3Mgc2tpcCBmYWlsaW5nIGZpbGVzIChvbmUgYmFkIHZhbHVlIG11c3Qgbm90IHN0b3AgdGhlIHJlc3QgLSBhIHNvdXJjZSBmYWlsaW5nIG9uZSByZXF1ZXN0IGluIGEgdGhvdXNhbmQgY291bGQgb3RoZXJ3aXNlIG5ldmVyIGZpbmlzaCBhIHN5bmMpLCBidXQgdGhpcyBtYW55IGZhaWx1cmVzIGluIGEgcm93IG1lYW5zIHRoZSBvdGhlciBzaWRlIGl0c2VsZiBpcyBkb3duLCBzbyB0aGUgcGFzcyBhYm9ydHMgdW50aWwgdGhlIG5leHQgY3ljbGVcbmNvbnN0IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gNTtcbmNvbnN0IFNZTkNfRVJST1JfTE9HX0xJTUlUID0gMztcbi8vIEV2ZXJ5IGZhaWxlZCBmaWxlIHdhaXRzIHRoaXMgbG9uZyBiZWZvcmUgdGhlIHBhc3MgY29udGludWVzLCBzbyBhIGRvd24gbmV0d29yayBidXJucyB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBvdmVyIGEgbWludXRlLXBsdXMgaW5zdGVhZCBvZiBpbiBhbiBpbnN0YW50XG5jb25zdCBTWU5DX0ZBSUxVUkVfREVMQVkgPSAxMDAwICogMTU7XG4vLyBBIGZ1bGwgbGlzdGluZyB0aGF0IGNvbWVzIGJhY2sgRU1QVFkgLSBvciB1bmRlciBoYWxmIG9mIHdoYXQgd2Uga25vdyB0aGUgc291cmNlIGhvbGRzIC0gaXMgdHJlYXRlZCBhcyB0aGUgb3RoZXIgZW5kIGJlaW5nIGJyaWVmbHkgYnJva2VuLCBub3QgYXMgdGhlIHRydXRoOiBpdCBpcyByZXRyaWVkIHRoaXMgbWFueSB0aW1lcywgdGhpcyBmYXIgYXBhcnQsIGJlZm9yZSBiZWluZyBiZWxpZXZlZC4gQmVsaWV2aW5nIGEgd3JvbmdseS1zaHJ1bmtlbiBsaXN0aW5nIHB1cmdlcyBldmVyeSBpbmRleCBlbnRyeSB0aGUgc291cmNlIGhlbGQsIHdoaWNoIGlzIGhvdyBzeW5jIHByb2dyZXNzIFwiZ29lcyBiYWNrd2FyZHNcIi5cbmNvbnN0IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTID0gMztcbmNvbnN0IFNVU1BJQ0lPVVNfU0NBTl9SRVRSWV9ERUxBWSA9IDEwMDAgKiA2MDtcbi8vIEhvdyBsb25nIHBhc3QgdGhlIGVuZCBvZiBhIHNvdXJjZSdzIGxhc3Qgd2luZG93IHdlIGFyZSBzdGlsbCB3aWxsaW5nIHRvIHJlYWQgKHNjYW4pIGl0LiBXZSBjYW4ndCByZWFkIGZyb20gYSBzb3VyY2UgdGhhdCdzIHRvbyBvbGQsIGJlY2F1c2Ugb3VyIHRvbWJzdG9uZXMgb25seSBsYXN0IHNvIGxvbmcgKFRPTUJTVE9ORV9FWFBJUlkpOiBhIHNvdXJjZSB3aG9zZSB3aW5kb3dzIGFyZSBhbGwgcGFzdCBuZXZlciByZWNlaXZlcyBkZWxldGlvbnMgKHRoZSB3aW5kb3cgZ2F0ZXMgd3JpdGVzLCBkZWxldGlvbnMgaW5jbHVkZWQpLCBzbyBpdCBuZXZlciBrbmV3IGFib3V0IG91ciB0b21ic3RvbmVzIC0gYW5kIGlmIHdlIHJlYWQgaXQgYWZ0ZXIgYSB0b21ic3RvbmUgZXhwaXJlcywgaXQgY2FuIHJlc3VycmVjdCBhIGRlYWQgdmFsdWUuIFdoaWxlIHdlIERPIHJlYWQgaXQsIG91ciBvd24gdG9tYnN0b25lIGlzIHdoYXQgcmVmdXRlcyBpdHMgc3RhbGUgbGlzdGluZ3MsIHNvIHRoaXMgZHVyYXRpb24gbXVzdCBzdGF5IGZhciBiZWxvdyBUT01CU1RPTkVfRVhQSVJZLlxuY29uc3QgUEFTVF9SRUFEX0RVUkFUSU9OID0gMTAwMCAqIDYwICogNjA7XG5cbnR5cGUgU291cmNlU3RhdGUgPSB7XG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGJvb2xlYW47XG4gICAgaW5pdGlhbFNjYW46IFJldHVyblR5cGU8dHlwZW9mIHByb21pc2VPYmo+O1xuICAgIHNjYW5Db21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBXaGV0aGVyIGEgc2NhbiBvZiB0aGlzIHNvdXJjZSBoYXMgZXZlciBhY3R1YWxseSBTVUNDRUVERUQgLSB3aGF0IGZ1bGwgc3luY3MgZ2F0ZSBvbjogd2l0aG91dCBvbmUsIHRoZSBpbmRleCdzIHZpZXcgb2YgdGhpcyBzb3VyY2UgY2FuIGJlIGFyYml0cmFyaWx5IHN0YWxlIChlLmcuIGl0IHdhcyByZXN0YXJ0aW5nIHdoZW4gd2UgZmlyc3QgdHJpZWQpLCBhbmQgc3luY2luZyBmcm9tIHN0YWxlIGluZm9ybWF0aW9uIGNodXJucyBmb3JldmVyXG4gICAgc2NhblN1Y2NlZWRlZDogYm9vbGVhbjtcbiAgICAvLyBGaWxlcyBzZWVuIGluIHRoaXMgc291cmNlJ3Mgc2NhbnMgLyBjaGFuZ2UgcG9sbHMgc28gZmFyXG4gICAgc2Nhbm5lZENvdW50OiBudW1iZXI7XG4gICAgLy8gV2F0ZXJtYXJrIGZvciBnZXRDaGFuZ2VzQWZ0ZXIyIHBvbGxzXG4gICAgY2hhbmdlc0FmdGVyVGltZTogbnVtYmVyO1xuICAgIC8vIFBlci1zbG90IHN0b3AgdG9rZW46IGEgcmVtb3ZlZCBzb3VyY2UncyBsb29wcyBzdG9wIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0b3JlXG4gICAgc3RvcHBlZDogeyBzdG9wOiBib29sZWFuIH07XG4gICAgLy8gQSByZW1vdmVkIHNvdXJjZSdzIHNsb3Qgc3RheXMgaW4gdGhlIGFycmF5cyAodGhleSBhcmUgbmV2ZXIgc3BsaWNlZCwgc28gc2xvdCBudW1iZXJzIGhlbGQgYnkgcnVubmluZyBsb29wcyBzdGF5IG1lYW5pbmdmdWwpLCBtYXJrZWQgZGVhZCAtIG5ldmVyIHNjYW5uZWQsIHdyaXR0ZW4sIG9yIHJlYWQuIEluZGV4IGVudHJpZXMgZG9uJ3QgcmVmZXJlbmNlIHNsb3RzIGF0IGFsbDsgdGhleSBwZXJzaXN0IHRoZSBzb3VyY2VzIGxpc3QncyBzb3VyY2VzTGlzdEluZGV4LlxuICAgIGRlYWQ/OiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gbmV3U291cmNlU3RhdGUoKTogU291cmNlU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBmYWxzZSxcbiAgICAgICAgaW5pdGlhbFNjYW46IHByb21pc2VPYmooKSxcbiAgICAgICAgc2NhbkNvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgc2NhblN1Y2NlZWRlZDogZmFsc2UsXG4gICAgICAgIHNjYW5uZWRDb3VudDogMCxcbiAgICAgICAgY2hhbmdlc0FmdGVyVGltZTogMCxcbiAgICAgICAgc3RvcHBlZDogeyBzdG9wOiBmYWxzZSB9LFxuICAgIH07XG59XG5cbi8vIFdoYXQgYSBzY2FubmVkIGxpc3RpbmcgZW50cnkgbWVhbnQgd2hlbiBjb21wYXJlZCBhZ2FpbnN0IG91ciBpbmRleFxudHlwZSBTY2FuT3V0Y29tZSA9IFwiZmlsdGVyZWRcIiB8IFwibmV3XCIgfCBcInVwZGF0ZWRcIiB8IFwidG9tYnN0b25lXCIgfCBcInVuY2hhbmdlZFwiO1xudHlwZSBTY2FuVGFsbHkgPSBSZWNvcmQ8U2Nhbk91dGNvbWUsIG51bWJlcj47XG5mdW5jdGlvbiBuZXdTY2FuVGFsbHkoKTogU2NhblRhbGx5IHtcbiAgICByZXR1cm4geyBmaWx0ZXJlZDogMCwgbmV3OiAwLCB1cGRhdGVkOiAwLCB0b21ic3RvbmU6IDAsIHVuY2hhbmdlZDogMCB9O1xufVxuXG5leHBvcnQgY2xhc3MgU3RvcmVTeW5jIHtcbiAgICAvLyBQZXIgc291cmNlIHNsb3QsIGluIHN0ZXAgd2l0aCB0aGUgc3RvcmUncyBzb3VyY2VzIGFycmF5LiBTbG90cyBhcmUgbmV2ZXIgc3BsaWNlZCBvdXQgLSBhIHJlbW92ZWQgb25lIGlzIG1hcmtlZCBkZWFkIC0gc28gYSBzbG90IG51bWJlciBoZWxkIGJ5IGEgcnVubmluZyBsb29wIGFsd2F5cyBtZWFucyB0aGUgc2FtZSBzb3VyY2UuXG4gICAgcHJpdmF0ZSBzdGF0ZXM6IFNvdXJjZVN0YXRlW107XG4gICAgLy8gU2NhbnMgLyBmdWxsIHN5bmNzIGluIHByb2dyZXNzIChhIFNldCAtIG9uZSBzb3VyY2UgY2FuIGhhdmUgYSBjaGFuZ2UgcG9sbCdzIGZ1bGwgc3luYyBhbmQgYSByZXNjYW4gb3ZlcmxhcHBpbmcpXG4gICAgcHJpdmF0ZSBhY3Rpdml0aWVzID0gbmV3IFNldDxTeW5jQWN0aXZpdHk+KCk7XG4gICAgLy8gR3VhcmRzIGFnYWluc3QgYSBzZWNvbmQgZXZpY3Rpb24gcGFzcyBzdGFydGluZyB3aGlsZSBvbmUgaXMgc3RpbGwgd2Fsa2luZyB0aGUgaW5kZXhcbiAgICBwcml2YXRlIGV2aWN0aW5nID0gZmFsc2U7XG4gICAgLy8gV2hlbiBlYWNoIGtleSB3YXMgbGFzdCBzZXJ2ZWQsIGZvciByZWFkZXJEaXNrTGltaXQncyBMUlUgZXZpY3Rpb24uIE5ldmVyIHBlcnNpc3RlZCAoYSByZXN0YXJ0IGhhcyBubyBvcGluaW9uIGFib3V0IHJlY2VuY3kpLCBhbmQgb25seSBrZXB0IGZvciBrZXlzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIHJlYWQgLSBhbiBpbmRleCBlbnRyeSBubyBvbmUgaGFzIHRvdWNoZWQgZmFsbHMgYmFjayB0byB3aGVuIHdlIGxhc3QgY2hhbmdlZCBpdC5cbiAgICBwcml2YXRlIGxhc3RBY2Nlc3MgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogQmxvYlN0b3JlKSB7XG4gICAgICAgIHRoaXMuc3RhdGVzID0gc3RvcmUuc291cmNlcy5tYXAoKCkgPT4gbmV3U291cmNlU3RhdGUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFN0YXJ0cyBldmVyeSBsaXZlIHNvdXJjZSdzIHN5bmNocm9uaXphdGlvbiwgcGx1cyB0aGUgbWFpbnRlbmFuY2UgbG9vcHMuIENhbGxlZCBvbmNlLCBieSB0aGUgc3RvcmUncyBpbml0IC0gdGhlIHN0b3JlJ3MgaW5kZXggbXVzdCBhbHJlYWR5IGJlIGxvYWRlZCwgc2luY2Ugc2NhbnMgd3JpdGUgc3RyYWlnaHQgaW50byBpdC4gKi9cbiAgICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zdGFydFNvdXJjZVN5bmNMb29wcyhpKTtcbiAgICAgICAgfVxuICAgICAgICBydW5JbmZpbml0ZVBvbGwoQ09ORklHX1BPTExfSU5URVJWQUwsICgpID0+IHRoaXMucG9sbFJvdXRpbmdDb25maWcoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmNsZWFudXBUb21ic3RvbmVzKCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5lbmZvcmNlSGlzdG9yeUxpbWl0KCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIC8vIFJlYWQgbGl2ZTogdGhlIGxpbWl0IGNvbWVzIGZyb20gdGhlIGNvbmZpZywgc28gYSBzdG9yZSB0aGF0IGdhaW5zIG9uZSBsYXRlciBzdGFydHMgZW5mb3JjaW5nIGl0IHdpdGhvdXQgYmVpbmcgcmVzdGFydGVkXG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChESVNLX0xJTUlUX0NIRUNLX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmVuZm9yY2VEaXNrTGltaXQoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc2tzIGV2ZXJ5IHBlZXIgZm9yIHRoZSByb3V0aW5nIGNvbmZpZywgYW5kIHRha2VzIGl0IGlmIGl0IGlzIG5ld2VyIHRoYW4gb3Vycy4gVGhpcyBpcyB0aGUgd2hvbGVcbiAgICAgKiBvZiBjb25maWd1cmF0aW9uIHByb3BhZ2F0aW9uOiBpdCByaWRlcyBiZXNpZGUgdGhlIHNjYW5zIHJhdGhlciB0aGFuIGJlaW5nIHBhcnQgb2YgdGhlbSwgYmVjYXVzZVxuICAgICAqIG9uZSBzbWFsbCByZWFkIGlzIHdvcnRoIGRvaW5nIGV2ZXJ5IGZldyBtaW51dGVzIHdoaWxlIGEgZnVsbCBsaXN0aW5nIGlzIG5vdCwgYW5kIGJlY2F1c2UgYVxuICAgICAqIGNvbmZpZyB3ZSBhcmUgbWlzc2luZyBpcyB3aGF0IHN0b3BzIGV2ZXJ5dGhpbmcgZWxzZSBmcm9tIGJlaW5nIHJpZ2h0LlxuICAgICAqXG4gICAgICogVGhlIGNvcHkgaXMgc3RvcmVkIHRoZSBzYW1lIHdheSBhIHNjYW4gc3RvcmVzIGFueXRoaW5nIGl0IHB1bGxzIC0gYW4gaW50ZXJuYWwgd3JpdGUgaW50byBvdXIgb3duXG4gICAgICogc3RvcmUgLSBhbmQgdGhlIHN0b3JlIG5vdGljZXMgdGhhdCBmaWxlIGxhbmRpbmcgYW5kIHJlLWNvbmZpZ3VyZXMgaXRzZWxmLiBOb3RoaW5nIGhlcmUga25vd3Mgd2hhdFxuICAgICAqIGEgY29uZmlnIG1lYW5zOyBpdCBvbmx5IGtub3dzIHRoaXMgb25lIGZpbGUgaXMgd29ydGggYXNraW5nIGZvciBvZnRlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHBvbGxSb3V0aW5nQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zb3VyY2VzW2ldLmludGVybWVkaWF0ZSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWlycyA9IGF3YWl0IHNvdXJjZS5nZXQyKFJPVVRJTkdfRklMRSwgeyBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoZWlycyB8fCAhdGhlaXJzLmRhdGEgfHwgIXRoZWlycy5kYXRhLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHZlcnNpb24gPSBnZXRDb25maWdWZXJzaW9uKHBhcnNlUm91dGluZ0RhdGEodGhlaXJzLmRhdGEpKTtcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA8PSB0aGlzLnN0b3JlLnJvdXRpbmdWZXJzaW9uKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7dmVyc2lvbn0gZm91bmQgb24gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9ICh3ZSBoYXZlICR7dGhpcy5zdG9yZS5yb3V0aW5nVmVyc2lvbigpfSwgc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiB0YWtpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAvLyBTdGFtcGVkIE5PVywgbm90IHdpdGggdGhlaXIgd3JpdGUgdGltZTogY29uZmlncyBhcmUgb3JkZXJlZCBieSB2ZXJzaW9uLCBhbmQgdGhpcyBvbmUgaXMgbmV3ZXIgYnkgdGhhdCBvcmRlcmluZy4gVGhlaXIgZmlsZSBjYW4gZWFzaWx5IGJlIG9sZGVyIGJ5IHdyaXRlIHRpbWUgKG91cnMgd2FzIHJld3JpdHRlbiBsb2NhbGx5IG1vcmUgcmVjZW50bHkpLCBhbmQgdGhlIHN0b3JlJ3Mgb25seS10YWtlLXRoZS1sYXRlc3QgcnVsZSB3b3VsZCB0aGVuIGRyb3AgaXQgLSBsZWF2aW5nIHVzIGZpbmRpbmcgdGhlIHNhbWUgbmV3ZXIgdmVyc2lvbiBvbiBldmVyeSBwb2xsIGFuZCBuZXZlciBhZG9wdGluZyBpdC5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNldCh7IHBhdGg6IFJPVVRJTkdfRklMRSwgZGF0YTogdGhlaXJzLmRhdGEsIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gQSBwZWVyIHRoYXQgY2Fubm90IGFuc3dlciBpcyB0aGUgbm9ybWFsIGNhc2UgZm9yIGEgc291cmNlIHRoYXQgaXMgZG93bjsgdGhlIG5leHQgcG9sbCBhc2tzIGFnYWluXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ2hlY2tpbmcgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZvciBhIG5ld2VyIHJvdXRpbmcgY29uZmlnIGZhaWxlZCAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFN0b3BzIGV2ZXJ5IHNvdXJjZSdzIGxvb3BzICh0aGUgc3RvcmUncyBvd24gc3RvcCB0b2tlbiBzdG9wcyB0aGUgbWFpbnRlbmFuY2UgbG9vcHMpLiAqL1xuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIHNsb3QgdGhlIHN0b3JlIGp1c3QgYXBwZW5kZWQgdG8gaXRzIHNvdXJjZXMgYXJyYXk6IGl0IHN0YXJ0cyBmcm9tIG5vdGhpbmcsIHNvIGl0IGdldHMgYSBmdWxsIHNjYW4uICovXG4gICAgcHVibGljIGFkZFNvdXJjZShzbG90OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZXNbc2xvdF0gPSBuZXdTb3VyY2VTdGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5zdG9yZS5zeW5jU3RhcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXJ0U291cmNlU3luY0xvb3BzKHNsb3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBzbG90IHN0YXlzIGluIHRoZSBzdG9yZSdzIGFycmF5cyBmb3JldmVyIChydW5uaW5nIGxvb3BzIGhvbGQgc2xvdCBudW1iZXJzKTsgaXQganVzdCBnb2VzIGRlYWQgLSBsb29wcyBzdG9wLCBhbmQgaXRzIGluZGV4IGVudHJpZXMgZHJvcCAob3RoZXIgc291cmNlcycgc2NhbnMgcmUtZmluZCBhbnkgY29weSB0aGF0J3Mgc3RpbGwgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG5ldyBjb25maWcpLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZW1vdmVTb3VyY2Uoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3Nsb3RdO1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zdG9yZS5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgc3RhdGUuZGVhZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgbGV0IHNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNsb3RTb3VyY2VzTGlzdEluZGV4KHNsb3QpO1xuICAgICAgICAvLyBUaGUgc2FtZSBVUkwgY2FuIGJlIGFub3RoZXIgbGl2ZSBzbG90IChvbmUgZW50cnkgcGVyIHZhbGlkIHdpbmRvdykgLSB0aGUgZW5kcG9pbnQgaXMgc3RpbGwgY29uZmlndXJlZCwgc28gaXRzIGVudHJpZXMgc3RheVxuICAgICAgICBpZiAoc291cmNlc0xpc3RJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc3RvcmUuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoc291cmNlc0xpc3RJbmRleCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGRyb3BwZWQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gc291cmNlc0xpc3RJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gRm9yZ290dGVuLCBub3QgZGVsZXRlZDogdGhlIGZpbGVzIHN0aWxsIGV4aXN0IHdoZXJldmVyIHRoYXQgc291cmNlIHB1dCB0aGVtLCB3ZSBqdXN0IG5vIGxvbmdlciBoYXZlIGEgd2F5IHRvIHJlYWNoIHRoZW1cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIGRyb3BwZWQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmVkIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgc2NhbnMgYXJlIHN0b3BwZWQgYW5kICR7ZHJvcHBlZH0gaW5kZXggZW50cmllcyBpdCBoZWxkIHdlcmUgZHJvcHBlZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmVkIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgc2NhbnMgYXJlIHN0b3BwZWQgKGl0cyBVUkwgaXMgc3RpbGwgc2VydmVkIGJ5IGFub3RoZXIgc2xvdCwgc28gaXRzIGluZGV4IGVudHJpZXMgc3RheSlgKTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciBhIHNsb3QgaXMgc3RpbGwgY29uZmlndXJlZC4gRGVhZCBzbG90cyBhcmUgbmV2ZXIgc2Nhbm5lZCwgd3JpdHRlbiwgb3IgcmVhZC4gKi9cbiAgICBwdWJsaWMgaXNMaXZlKHNsb3Q6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnN0b3JlLnNvdXJjZXNbc2xvdF0gJiYgIXRoaXMuc3RhdGVzW3Nsb3RdPy5kZWFkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBY3Rpdml0aWVzKCk6IFN5bmNBY3Rpdml0eVtdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmFjdGl2aXRpZXNdO1xuICAgIH1cblxuICAgIC8qKiBBIGtleSB3YXMganVzdCBzZXJ2ZWQsIHNvIGl0IGdvZXMgdG8gdGhlIGJhY2sgb2YgdGhlIGV2aWN0aW9uIHF1ZXVlLiAqL1xuICAgIHB1YmxpYyBub3RlQWNjZXNzKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGFzdEFjY2Vzcy5zZXQoa2V5LCBEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBpbmRleCBzdGlsbCBob2xkcyBleGFjdGx5IHRoZSBlbnRyeSBhIHBhc3MgcGlja2VkIHVwIGVhcmxpZXIuIEluZGV4IHJvd3MgYXJlIHJlYWQgb3V0IG9mIHRoZSBkYXRhYmFzZSBwZXIgbG9va3VwLCBzbyB0aGlzIGNvbXBhcmVzIHRoZSByb3csIG5vdCB0aGUgb2JqZWN0IC0gYSB3cml0ZSBsYW5kaW5nIG1pZC1wYXNzIGNoYW5nZXMgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIHRocmVlLlxuICAgIHByaXZhdGUgZW50cnlVbmNoYW5nZWQoa2V5OiBzdHJpbmcsIGVudHJ5OiBJbmRleEVudHJ5KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY3VycmVudC53cml0ZVRpbWUgPT09IGVudHJ5LndyaXRlVGltZSAmJiBjdXJyZW50LnNpemUgPT09IGVudHJ5LnNpemUgJiYgY3VycmVudC5zb3VyY2VzTGlzdEluZGV4ID09PSBlbnRyeS5zb3VyY2VzTGlzdEluZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0dXMoKTogQXJjaGl2ZXNTeW5jU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHRoaXMuc3RhdGVzLmV2ZXJ5KHggPT4geC5zY2FuQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpLFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zdG9yZS5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93czogeC52YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGU6IHgucm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYzogeC5ub0Z1bGxTeW5jLFxuICAgICAgICAgICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0aGlzLnN0YXRlc1tpXS5zdXBwb3J0c0NoYW5nZXNBZnRlcixcbiAgICAgICAgICAgICAgICBpbml0aWFsU2NhbkNvbXBsZXRlOiB0aGlzLnN0YXRlc1tpXS5zY2FuQ29tcGxldGUsXG4gICAgICAgICAgICAgICAgc2Nhbm5lZENvdW50OiB0aGlzLnN0YXRlc1tpXS5zY2FubmVkQ291bnQsXG4gICAgICAgICAgICB9KSkuZmlsdGVyKCh4LCBpKSA9PiB0aGlzLmlzTGl2ZShpKSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIExpc3RpbmdzIGNvbWUgc3RyYWlnaHQgZnJvbSB0aGUgaW5kZXgsIHNvIHRoZXkgbXVzdCB3YWl0IGZvciBvdXIgb3duIGJhc2Ugc291cmNlJ3MgaW5pdGlhbCBzY2FuICh3aGljaCBtaWdodCBsYWcgbWludXRlcykgYmVmb3JlIHRoZXkgYXJlIHRydXN0d29ydGh5LiBUaGUgYmFzZSAobG9jYWwgZGlzaykgaXMgaW1wbGljaXRseSByZXF1aXJlZCAtIHJlbW90ZSBzb3VyY2VzIGFyZSBub3QsIHRoZXkgY29tZSBhbmQgZ28uICovXG4gICAgcHVibGljIGFzeW5jIHdhaXRGb3JSZXF1aXJlZFNjYW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlc1swXS5pbml0aWFsU2Nhbi5wcm9taXNlO1xuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgdmFsaWQgd2luZG93IGhhbmRvZmZzLCB3aGVyZSBhbm90aGVyIHByb2Nlc3Mgd3JvdGUgZmlsZXMgdG8gdGhlIHNoYXJlZCBmb2xkZXIgdGhhdCBvdXIgaW5kZXggaGFzbid0IHNlZW4uICovXG4gICAgcHVibGljIGFzeW5jIHJlc2NhbkJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY1NvdXJjZSgwKSgpO1xuICAgIH1cblxuICAgIC8qKiBPbmUgc3luY2hyb25pemF0aW9uIHJvdW5kIG9mIGEgc291cmNlOiB0aGUgUFVMTCBkaXJlY3Rpb24gYWx3YXlzIChpdHMgbGlzdGluZywgYXBwbGllZCB0byBvdXIgaW5kZXgpLCBhbmQgd2l0aCBcInB1c2hcIiB0aGUgcHVzaCBkaXJlY3Rpb24gdG9vICh3aGF0IG91ciBpbmRleCBzYXlzIHRoZSBzb3VyY2UgaXMgbWlzc2luZywgd3JpdHRlbiB0byBpdCkuIFB1c2ggaXMgYW4gYXJndW1lbnQgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBjYWxsIGJlY2F1c2UgaXQgY2Fubm90IHJ1biB3aXRob3V0IHRoZSBwdWxsJ3MgbGlzdGluZyAtIHRoZSBpbmRleCBhbG9uZSBjYW5ub3Qgc2F5IHdoYXQgdGhlIHNvdXJjZSBhbHJlYWR5IGhvbGRzLiBMaXN0aW5ncyB1bmJsb2NrIChpbml0aWFsU2NhbikgYmV0d2VlbiB0aGUgaGFsdmVzLCBzbyB0aGV5IG5ldmVyIHdhaXQgYmVoaW5kIGEgcHVzaC4gT25seSBvbmUgcm91bmQgcGVyIFNPVVJDRSBydW5zIGF0IGEgdGltZSAoY2FjaGUga2V5cyB0aGUgc2VyaWFsaXplciBieSBzb3VyY2UgaW5kZXgpLiAqL1xuICAgIHByaXZhdGUgc3luY1NvdXJjZSA9IGNhY2hlKChzb3VyY2VJbmRleDogbnVtYmVyKSA9PiBydW5JblNlcmlhbChhc3luYyAocHVzaD86IFwicHVzaFwiKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGxldCBsaXN0aW5nID0gYXdhaXQgdGhpcy5wdWxsU291cmNlKHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChwdXNoICYmICF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1c2hTb3VyY2Uoc291cmNlSW5kZXgsIGxpc3RpbmcpO1xuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgLyoqIEEgYm91bmRhcnkgc2NhbiBvZiB0aGUgbm9kZSB0aGF0IG93bmVkIChwYXJ0IG9mKSBvdXIgcm91dGUgaW4gdGhlIHZhbGlkIHdpbmRvdyBiZWZvcmUgb3Vycywgd2hlbiB0aGF0IG5vZGUgaXMgZGlmZmVyZW50IHN0b3JhZ2UgKGEgZGlzayByZXNjYW4gY2FuJ3Qgc2VlIGl0cyB3cml0ZXMpOiBqdXN0IGl0cyBjaGFuZ2VzIHNpbmNlIHRoZSBib3VuZGFyeSBuZWlnaGJvcmhvb2QsIHdpdGggbWF0Y2hpbmcgdmFsdWVzIHB1bGxlZCBvbnRvIG91ciBvd24gZGlzay4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhblN0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHNpbmNlOiBjb25maWcuc2luY2UsIHJvdXRlOiBjb25maWcucm91dGUgfHwgRlVMTF9ST1VURSB9KTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBhd2FpdCBzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyMih7IHRpbWU6IGNvbmZpZy5zaW5jZSwgcm91dGVzOiBjb25maWcucm91dGUgJiYgW2NvbmZpZy5yb3V0ZV0gfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS5maWx0ZXJlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGZpbGUucGF0aCk7XG4gICAgICAgICAgICBpZiAoZmlsZS5jcmVhdGVUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkudW5jaGFuZ2VkKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gU2l6ZSAwIGluIGEgbGlzdGluZyBJUyBhIGRlbGV0aW9uIChhbiBlbXB0eSBmaWxlIGlzIGEgbWlzc2luZyBmaWxlKSwgc28gaXQgaXMgdGFrZW4gYXMgb25lXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGZpbGUucGF0aCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgLy8gVW5kZWZpbmVkIGlzIHR3byBjYXNlcyAoc2VlIGNvcHlBcmNoaXZlRmlsZSk6IG91ciBvd24gZGlzayBhbHJlYWR5IGhvbGRpbmcgc29tZXRoaW5nIG5ld2VyIGlzIHRoZSBib3VuZGFyeSBzY2FuIHdvcmtpbmcgYXMgaW50ZW5kZWQgKG91ciB3cml0ZXMgc2luY2UgdGhlIGJvdW5kYXJ5IG91dHJhbmsgdGhlIG5laWdoYm9yJ3MpLCBvbmx5IGEgZ2VudWluZWx5IHVucmVhZGFibGUgZmlsZSBpcyB3b3J0aCBhIHdhcm5pbmdcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWwgJiYgbG9jYWwud3JpdGVUaW1lID4gZmlsZS5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhbkxvY2FsTmV3ZXJcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDogZmlsZS5wYXRoLCB0aGVpcldyaXRlVGltZTogbmV3IERhdGUoZmlsZS5jcmVhdGVUaW1lKS50b0lTT1N0cmluZygpLCB0aGVpclNpemU6IGZpbGUuc2l6ZSwgbG9jYWxXcml0ZVRpbWU6IG5ldyBEYXRlKGxvY2FsLndyaXRlVGltZSkudG9JU09TdHJpbmcoKSwgbG9jYWxTaXplOiBsb2NhbC5zaXplIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogbG9jYWwud3JpdGVUaW1lLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRhbGx5LnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBCb3VuZGFyeSBzY2FuIGNvdWxkIG5vdCBjb3B5ICR7ZmlsZS5wYXRofSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgY2hhbmdlIGZlZWQgbGlzdGVkIGl0ICgke2ZpbGUuc2l6ZX0gYnl0ZXMsIHdyaXRlVGltZSAke25ldyBEYXRlKGZpbGUuY3JlYXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGJ1dCB0aGUgcmVhZCBmb3VuZCBub3RoaW5nYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBmaWxlLnBhdGgsIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgIGlmIChjb3BpZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgY29waWVkLndyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgc2l6ZTogY29waWVkLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVwZGF0ZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFsbHkubmV3Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiYm91bmRhcnlTY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIHNpbmNlOiBjb25maWcuc2luY2UsIGNoYW5nZXM6IGNoYW5nZXMubGVuZ3RoLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkIH0pO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBwZXItc291cmNlIGxvb3BzIOKUgOKUgFxuXG4gICAgLy8gU2xvdCAwIGlzIGV4ZW1wdDogb3VyIG93biBkaXNrIGFuc3dlcnMgZm9yIGV2ZXJ5IHdpbmRvdyB0aGlzIHN0b3JlIEVWRVIgaGVsZCwgYW5kIHNjYW5uaW5nIGl0IGlzIHdoYXQga2VlcHMgdGhlIGluZGV4IGhvbmVzdCBhYm91dCB0aGVtLiBSZWFkIGxpdmUgZWFjaCBjYWxsIC0gdXBkYXRlU291cmNlcyBtb3ZlcyB0aGUgd2luZG93cyBvbiBydW5uaW5nIHNsb3RzLCBzbyBhIHNvdXJjZSBnb2VzIHN0YWxlIChvciBjb21lcyBiYWNrKSB3aGlsZSBpdHMgbG9vcHMgcnVuLlxuICAgIHByaXZhdGUgd2luZG93c0FsbG93U2Nhbm5pbmcoc291cmNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS52YWxpZFdpbmRvd3Muc29tZSh3ID0+IHdbMV0gPiBEYXRlLm5vdygpIC0gUEFTVF9SRUFEX0RVUkFUSU9OKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0U291cmNlU3luY0xvb3BzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5yZWdpc3RlclNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgc291cmNlT2JqID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZU9iai5zb3VyY2U7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgLy8gSWYgYSBzbG90IGV2ZXIgZ2V0cyBUV08gb2YgdGhlc2UsIGl0cyBsb29wcyBhcmUgZG91YmxlZCAtIGV2ZXJ5IHBvbGwgYW5kIGZ1bGwgc3luYyBydW5zIHR3aWNlXG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNvdXJjZVN5bmNTdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzb3VyY2VJbmRleCwgdXJsOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnVybCwgaW50ZXJtZWRpYXRlOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLmludGVybWVkaWF0ZSB9KTtcbiAgICAgICAgLy8gUmVhZCBsaXZlIGZvciBldmVyeSBwYXNzLCBub3QgY2FwdHVyZWQgLSB0aGUgc3RvcmUncyBzb3VyY2UgbGlzdCBjYW4gY2hhbmdlIHdoaWxlIGxvb3BzIHJ1blxuICAgICAgICBsZXQgbm9GdWxsU3luYyA9ICgpID0+IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0ubm9GdWxsU3luYztcbiAgICAgICAgLy8gQW4gaW50ZXJtZWRpYXRlIGlzIGEgZGVwbG95IHN3aXRjaG92ZXIncyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIFBPUlQgb250byBhIHNvdXJjZSB3ZSBhbHJlYWR5IGhhdmU6IHRoZSBzYW1lIGJ1Y2tldCwgcmVhY2hhYmxlIGFub3RoZXIgd2F5IGZvciBhIGZldyBtaW51dGVzLiBTY2FubmluZyBpdCB3b3VsZCBsaXN0IGV4YWN0bHkgd2hhdCBzY2FubmluZyB0aGF0IHNvdXJjZSBsaXN0cywgYWdhaW5zdCBhIHBvcnQgdGhhdCBpcyBhYm91dCB0byBkaXNhcHBlYXIgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkLCBhbmQgdGhlIHNvdXJjZSBpdCB3YXMgc3BsaXQgb3V0IG9mIGNvdmVycyBpdCBmb3IgYXMgbG9uZyBhcyBpdCBleGlzdHMgYW5kIGFmdGVyIGl0IGlzIGdvbmUuXG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLmludGVybWVkaWF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVja2VkIHBlciB0aWNrLCBuZXZlciBkZWNpZGVkIG9uY2U6IHRoZSB3aW5kb3dzIG1vdmUgb24gcnVubmluZyBzbG90cyAoc2VlIHVwZGF0ZVNvdXJjZXMpLCBzbyBhIHNvdXJjZSBnb2VzIHN0YWxlIG1pZC1saWZlIGFuZCBjYW4gY29tZSBiYWNrIGlmIGEgY29uZmlnIGV4dGVuZHMgdGhlbS4gTG9nZ2VkIG9ubHkgb24gZWFjaCB0cmFuc2l0aW9uIGludG8gc3RhbGVuZXNzLlxuICAgICAgICBsZXQgbG9nZ2VkU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNraXBTdGFsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpbmRvd3NBbGxvd1NjYW5uaW5nKHNvdXJjZUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlZFN0YWxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghbG9nZ2VkU3RhbGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblNraXBwZWRTdGFsZVdpbmRvd3NcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgdmFsaWRXaW5kb3dzOiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnZhbGlkV2luZG93cy5tYXAodyA9PiBbbmV3IERhdGUod1swXSkudG9JU09TdHJpbmcoKSwgbmV3IERhdGUod1sxXSkudG9JU09TdHJpbmcoKV0pLCBwYXN0UmVhZER1cmF0aW9uTXM6IFBBU1RfUkVBRF9EVVJBVElPTiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBbiBhbHJlYWR5LXN0YWxlIHNvdXJjZSBza2lwcyBnZXRDb25maWcgZW50aXJlbHk6IGl0cyBlbmRwb2ludCBpcyBvZnRlbiBsb25nIGdvbmUsIGFuZCByZXRyeWluZyB0aGF0IGV2ZXJ5IDMwcyBmb3JldmVyIGlzIG5vaXNlIGFib3V0IGEgc291cmNlIHdlIHdvdWxkIG5vdCBzY2FuIGFueXdheSAoaWYgaXRzIHdpbmRvd3MgYXJlIGxhdGVyIGV4dGVuZGVkLCB0aGUgZnVsbC1yb3VuZCBwb2xsIGJlbG93IHBpY2tzIGl0IHVwIC0ganVzdCB3aXRob3V0IGNoYW5nZSBwb2xsaW5nIHVudGlsIGEgcmVzdGFydClcbiAgICAgICAgd2hpbGUgKCFza2lwU3RhbGUoKSAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgc291cmNlLmdldENvbmZpZygpO1xuICAgICAgICAgICAgICAgIHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyID0gISFjb25maWcuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiaW5pdGlhbFNjYW5GYWlsZWRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcmV0cnlJbk1zOiBTQ0FOX1JFVFJZX0RFTEFZLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgIC8vIEhvdXJseSBmb3Igb3VyIG93biBkaXNrIChubyBzb3VyY2VDb25maWcgLSBhIGNoZWFwIGxvY2FsIHdhbGssIGFuZCBob3cgYSBzaWJsaW5nIHByb2Nlc3MncyB3cml0ZXMgaW50byB0aGUgc2hhcmVkIGZvbGRlciBhcmUgZm91bmQpIGFuZCBmb3IgcmVtb3RlIHBlZXJzIChpbmRleC1iYWNrZWQsIGNoZWFwIGxpc3RpbmdzKTsgdGhlIHNsb3cgaW50ZXJ2YWwgaXMgb25seSBmb3Igc291cmNlcyB3aGVyZSBhIGZ1bGwgbGlzdGluZyBpcyBnZW51aW5lbHkgZXhwZW5zaXZlIChiYWNrYmxhemUpXG4gICAgICAgIGxldCBwb2xsSW50ZXJ2YWwgPSAoIXNvdXJjZU9iai5zb3VyY2VDb25maWcgfHwgc291cmNlT2JqLnNvdXJjZUNvbmZpZy50eXBlID09PSBcInJlbW90ZVwiKSAmJiBGVUxMX1JFU0NBTl9JTlRFUlZBTCB8fCBGVUxMX1JFU0NBTl9OT05fUkVNT1RFX0lOVEVSVkFMO1xuICAgICAgICAvLyBCb3RoIGxvb3BzIGJlbG93IHJ1biBvbmUgYXQgYSB0aW1lOiBhIGNoYW5nZS1wb2xsIHRpY2sgbGFuZGluZyBtaWQgZnVsbCByb3VuZCB3b3VsZCBvdGhlcndpc2Ugc3RhcnQgYSBzZWNvbmQgY29weSBwYXNzIG92ZXIgdGhlIHNhbWUgcGVuZGluZyBsaXN0LCBkb3dubG9hZGluZyBldmVyeXRoaW5nIHR3aWNlXG4gICAgICAgIGxldCBzZXJpYWwgPSBydW5JblNlcmlhbChhc3luYyAoZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBhd2FpdCBmbmMoKSk7XG4gICAgICAgIGF3YWl0IHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0KHBvbGxJbnRlcnZhbCwgKCkgPT4gc2VyaWFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwU3RhbGUoKSkgcmV0dXJuO1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKHNvdXJjZUluZGV4KShcInB1c2hcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYygpKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCkoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5GYWlsZWRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcmV0cnlJbk1zOiBTQ0FOX1JFVFJZX0RFTEFZLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCAyMDAwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU0NBTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsICgpID0+IHNlcmlhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBTdGFsZSgpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gQSBzY2FuIHRoYXQgaGFzIG5vdCBzdWNjZWVkZWQgeWV0IGlzIHJldHJpZWQgSEVSRSwgYmVmb3JlIGFueXRoaW5nIGVsc2UgLSBwb2xsaW5nIGNoYW5nZXMgYW5kIGNvcHlpbmcgYWdhaW5zdCBhIG5ldmVyLXNjYW5uZWQgc291cmNlIHdvdWxkIHJ1biBvbiBhcmJpdHJhcmlseSBzdGFsZSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmICghc3RhdGUuc2NhblN1Y2NlZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2Uoc291cmNlSW5kZXgpKFwicHVzaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2hhbmdlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KSgpO1xuICAgICAgICAgICAgfSksIHN0YXRlLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIFBVTEwgZGlyZWN0aW9uOiBhIGZ1bGwgbWV0YWRhdGEgc2NhbiAoc2l6ZSwgd3JpdGVUaW1lLCBwYXRoKSBvZiBvbmUgc291cmNlLCBhcHBsaWVkIHRvIG91ciBpbmRleC4gUmV0dXJucyB0aGUgc291cmNlJ3MgbGlzdGluZyAocGF0aCAtPiB3cml0ZSB0aW1lKSwgd2hpY2ggcHVzaFNvdXJjZSB1c2VzIGZvciB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLlxuICAgIHByaXZhdGUgYXN5bmMgcHVsbFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0geyB0eXBlOiBcIm1ldGFkYXRhU2NhblwiLCBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc3RhcnRUaW1lOiBzY2FuU3RhcnQgfTtcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInNjYW5TdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpIH0pO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGlsbCBydW5uaW5nICgke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cywgc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pYCk7XG4gICAgICAgIH0sIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAvLyBUaGUgbGlzdGluZyByZXF1ZXN0IGRlbGliZXJhdGVseSB0YWtlcyBubyB0aW1lIG9yIHJvdXRlIGZpbHRlcnM6IG91ciBzbG93ZXN0IHNvdXJjZXMgKGJhY2tibGF6ZSkgc3VwcG9ydCBuZWl0aGVyLCBzbyBmaWx0ZXJpbmcgd291bGQgaGFwcGVuIGFmdGVyIHRoZSBmdWxsIGZldGNoIGFueXdheSAtIGxpdHRsZSBiZW5lZml0LCBtb3JlIHJvb20gZm9yIGRlc3luY2hyb25pemF0aW9uLiBBbmQgaWYgYSBmdWxsIGxpc3RpbmcgZXZlciBiZWNvbWVzIHRvbyBiaWcgdG8gc2VuZCBvdmVyIHRoZSBuZXR3b3JrLCBpdCBpcyBhbHNvIHRvbyBiaWcgZm9yIHRoZSByZWNlaXZpbmcgcHJvY2VzcyB0byBob2xkIGluIG1lbW9yeSAtIHRoZSBmaXggaXMgbW9yZSByb3V0aW5nIHNoYXJkcyAoZWFjaCBzdG9yaW5nIGFuZCBzZW5kaW5nIGxlc3MpLCBub3QgZmlsdGVyaW5nLlxuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gV2hhdCB3ZSBiZWxpZXZlIHRoZSBzb3VyY2UgaGFzOiB3aGljaGV2ZXIgaXMgbGFyZ2VyIG9mIGl0cyBwcmV2aW91cyBsaXN0aW5nIGFuZCB0aGUgaW5kZXggZW50cmllcyBuYW1pbmcgaXQgYXMgaG9sZGVyLiBGaWxlcyBkbyBub3QganVzdCB2YW5pc2ggLSBhIGxpc3RpbmcgZmFyIGJlbG93IHRoaXMgbWVhbnMgdGhlIG90aGVyIGVuZCBpcyBicmllZmx5IGJyb2tlbiwgYW5kIGJlbGlldmluZyBpdCB3b3VsZCBwdXJnZSBldmVyeXRoaW5nIGl0IGhlbGQuXG4gICAgICAgICAgICAgICAgbGV0IGhlbGQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBzY2FubmVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgWywgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4KSBoZWxkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IE1hdGgubWF4KHN0YXRlLnNjYW5uZWRDb3VudCwgaGVsZCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXhwZWN0ZWQgPiAwICYmIGZpbGVzLmxlbmd0aCA8IGV4cGVjdGVkIC8gMikpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0cyA+PSBTVVNQSUNJT1VTX1NDQU5fUkVUUklFUykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgU1RJTEwgbGlzdHMgJHtmaWxlcy5sZW5ndGh9IGZpbGVzIHdoZXJlIH4ke2V4cGVjdGVkfSB3ZXJlIGV4cGVjdGVkLCBhZnRlciAke2F0dGVtcHRzfSByZXRyaWVzIC0gYWNjZXB0aW5nIHRoZSBsaXN0aW5nIGFzIHRoZSB0cnV0aGApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXR0ZW1wdHMrKztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgbGlzdGVkICR7ZmlsZXMubGVuZ3RofSBmaWxlcywgYnV0IH4ke2V4cGVjdGVkfSB3ZXJlIGV4cGVjdGVkIChwcmV2aW91cyBsaXN0aW5nICR7c3RhdGUuc2Nhbm5lZENvdW50fSwgaW5kZXggZW50cmllcyBpdCBob2xkcyAke2hlbGR9KSAtIHRoZSBvdGhlciBlbmQgaXMgcHJvYmFibHkgYnJpZWZseSBicm9rZW47IGFza2luZyBhZ2FpbiBpbiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSWV9ERUxBWSAvIDEwMDB9cyAocmV0cnkgJHthdHRlbXB0c30gb2YgJHtTVVNQSUNJT1VTX1NDQU5fUkVUUklFU30pYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmFjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCB3aGlsZSB0aGUgbGlzdGluZyB3YXMgaW4gZmxpZ2h0OyBpdHMgcmVzdWx0cyBhcmUgZGVhZFxuICAgICAgICBpZiAoc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm4gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgaW5kZXhTaXplQmVmb3JlID0gdGhpcy5zdG9yZS5pbmRleFNpemUoKTtcbiAgICAgICAgbGV0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgbGV0IG5ld1BhdGhzID0gMDtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgc2Vlbi5zZXQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoZmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgIG5ld1BhdGhzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICAvLyBFbnRyaWVzIHRoaXMgc291cmNlIHdhcyB0aGUgaG9sZGVyIG9mLCBidXQgdGhhdCBpdHMgbGlzdGluZyBkaWQgbm90IG1lbnRpb246IG91ciBvd24gZGlzayB0YWtlcyBvdmVyIGFzIGhvbGRlciB3aGVuIGl0IGhhcyBhIGNvcHksIGFuZCBvbmx5IHdpdGggbm8gbG9jYWwgY29weSBlaXRoZXIgaXMgdGhlIGVudHJ5IGZvcmdvdHRlbiAtIHdlIHdlcmUgd3JvbmcgYWJvdXQgd2hlcmUgdGhlIGZpbGUgaXMsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBpdCBoYXZpbmcgYmVlbiBkZWxldGVkLiBFbnRyaWVzIGNoYW5nZWQgYWZ0ZXIgdGhlIHNjYW4gc3RhcnRlZCBhcmUga2VwdDogdGhlIGxpc3RpbmcgbWF5IHNpbXBseSBwcmVkYXRlIHRoZW0uIFRvbWJzdG9uZXMgYXJlIG5vdCB3YWxrZWQgaGVyZSBhdCBhbGwsIGJlY2F1c2UgdGhleSBhcmUgbm90IGZpbGVzIGEgbGlzdGluZyBjb3VsZCB2b3VjaCBmb3IuXG4gICAgICAgIGxldCByZW1vdmVkRnJvbUluZGV4ID0gMDtcbiAgICAgICAgbGV0IHJlcG9pbnRlZFRvTG9jYWwgPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSBzY2FubmVkU291cmNlc0xpc3RJbmRleCAmJiBlbnRyeS5jaGFuZ2VkQXQgPCBzY2FuU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb2ludGVkVG9Mb2NhbCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICByZW1vdmVkRnJvbUluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb3VudGVkIG9ubHkgd2hlbiB0aGUgc291cmNlIFNIT1VMRCBob2xkIHRoZSBlbnRyeSAoaXRzIHJvdXRlIG1hdGNoZXMpIC0gdGhlc2UgYXJlIHdoYXQgdGhlIHJlY29uY2lsZSBwYXNzIHB1c2hlcyB0byBpdCAod2hpY2ggYWxzbyBpZ25vcmVzIHRoZSB2YWxpZCB3aW5kb3c6IHN5bmNocm9uaXphdGlvbiBtb3ZlcyBleGlzdGluZyB2YWx1ZXMsIHRoZSB3aW5kb3cgb25seSByb3V0ZXMgZnJlc2ggd3JpdGVzKVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbWlzc2luZ09uU291cmNlKys7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhbkZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc2NhblN0YXJ0LCBsaXN0ZWQ6IGZpbGVzLmxlbmd0aCwgaW5kZXhlZEJlZm9yZTogaW5kZXhTaXplQmVmb3JlLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkLCBvdXRzaWRlUm91dGU6IHRhbGx5LmZpbHRlcmVkLCBtaXNzaW5nT25Tb3VyY2UsIHJlcG9pbnRlZFRvTG9jYWwsIHJlbW92ZWRGcm9tSW5kZXggfSk7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBNYXRoLm1heChzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCBzY2FuU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUCk7XG4gICAgICAgIHN0YXRlLnNjYW5TdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gc2VlbjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHVzaCBkaXJlY3Rpb24gb2Ygc3luY2hyb25pemF0aW9uOiBldmVyeXRoaW5nIHdlIGtub3cgdGhhdCB0aGUgc291cmNlIGlzIG1pc3NpbmcgKG9yIGhvbGRzIGFuIG9sZGVyIGNvcHkgb2YpIGlzIHdyaXR0ZW4gdG8gaXQg4oCUIGluY2x1ZGluZyBkZWxldGlvbnMsIGFzIHRvbWJzdG9uZSB3cml0ZXMuIFRoaXMgaXMgd2hhdCBoZWFscyBhIHNvdXJjZSB3aG9zZSBiYWNrZ3JvdW5kIHdyaXRlcyBmYWlsZWQgKGUuZy4gaXQgd2FzIGRvd24pOiB0aGUgbmV4dCBzY2FuIHNlZXMgd2hhdCdzIG1pc3NpbmcgYW5kIHJlLXNlbmRzIGl0LiBBIGZhaWxpbmcgZmlsZSBpcyBza2lwcGVkLCBub3QgZmF0YWwgKGltbXV0YWJsZSB0YXJnZXRzIGFyZSBoYW5kbGVkIGJ5IGZvcmNlU2V0SW1tdXRhYmxlLCBhbmQgb25lIHVucmVhZGFibGUgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCBvZiB0aGUgcGFzcykgLSBvbmx5IGEgcnVuIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzICh0aGUgc291cmNlIGl0c2VsZiBpcyBkb3duKSBhYm9ydHMgdW50aWwgdGhlIG5leHQgc2NhbiBjeWNsZS5cbiAgICBwcml2YXRlIGFzeW5jIHB1c2hTb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlciwgbGlzdGluZzogTWFwPHN0cmluZywgbnVtYmVyPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHZhbGlkV2luZG93cywgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IGFjY2VwdHNXcml0ZXMgPSB3aW5kb3dzQWNjZXB0V3JpdGVzKHZhbGlkV2luZG93cyk7XG4gICAgICAgIGxldCB0YXJnZXRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHB1c2hlZCA9IDA7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBsZXQgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIC8vIEZpbGVzIGZpcnN0LCB0aGVuIHRoZSBkZWxldGlvbnMgLSB0d28gd2Fsa3Mgbm93IHRoYXQgdGhleSBhcmUgdHdvIG1hcHMsIGFuZCB0aGUgZGVsZXRpb25zIG9uZSBpcyB0aGUgc2hvcnQgb25lXG4gICAgICAgIGxldCBwdXNoYWJsZTogeyBrZXk6IHN0cmluZzsgd3JpdGVUaW1lOiBudW1iZXI7IGVudHJ5PzogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSB0YXJnZXRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHB1c2hhYmxlLnB1c2goeyBrZXksIHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBlbnRyeSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuc3RvcmUuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHsga2V5LCB3cml0ZVRpbWUsIGVudHJ5IH0gb2YgcHVzaGFibGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgbm90IHJlY29uY2lsZWQ6IGl0IHByb3BhZ2F0ZXMgYnkgYmVpbmcgYXNrZWQgZm9yLCBvbiBpdHMgb3duIHNjaGVkdWxlIChzZWUgcG9sbFJvdXRpbmdDb25maWcpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhY2NlcHRzV3JpdGVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRoZWlyVGltZSA9IGxpc3RpbmcuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodGhlaXJUaW1lICE9PSB1bmRlZmluZWQgJiYgdGhlaXJUaW1lID49IHdyaXRlVGltZSkgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBvbmx5IG5lZWRzIHB1c2hpbmcgd2hpbGUgdGhlIHNvdXJjZSBzdGlsbCBob2xkcyBhbiBvbGRlciBjb3B5LiBJdCB0cmF2ZWxzIGFzIGRlbCAobmV2ZXIgYXMgYW4gZW1wdHkgc2V0IC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycyksIHdpdGggdGhlIE9SSUdJTkFMIGRlbGV0aW9uIHRpbWUgc28gb3JkZXJpbmcgc3Vydml2ZXMuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGVpclRpbWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5kZWwoa2V5LCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBob2xkZXIgPSBhd2FpdCB0aGlzLnN0b3JlLmdldEVudHJ5SG9sZGVyKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IGhvbGRlciwgdG86IHNvdXJjZSwgcGF0aDoga2V5LCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBpcyB0d28gY2FzZXMgKHNlZSBjb3B5QXJjaGl2ZUZpbGUpLiBUaGUgc291cmNlIGhhdmluZyBhIE5FV0VSIGZpbGUgdGhhbiBvdXIgaW5kZXggKHRoZSBsaXN0aW5nIHdlIHB1c2hlZCBmcm9tIHdhcyBzdGFsZSkgaXMgYWRvcHRlZCBleGFjdGx5IHRoZSB3YXkgdGhlIHB1bGwgZGlyZWN0aW9uIGFkb3B0cyBhIGxpc3RpbmcgZW50cnkgLSBhbmQgcHVzaGluZyBvdXIgc3RhbGUgY29weSBzdG9wcy4gT3RoZXJ3aXNlIHRoZSBIT0xERVIgY291bGQgbm90IHByb2R1Y2UgdGhlIGZpbGUsIHdoaWNoIHRoZSBuZXh0IHJvdW5kJ3MgcHVsbCByZS1yZXNvbHZlczsgZWl0aGVyIHdheSwgc2lsZW5jZSBoZXJlIHdhcyB0aGUgYnVnLlxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlycyAmJiB0aGVpcnMud3JpdGVUaW1lID4gd3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogdGhlaXJzLndyaXRlVGltZSwgc2l6ZTogdGhlaXJzLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJwdXNoRm91bmROZXdlck9uU291cmNlXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgb3VyV3JpdGVUaW1lOiBuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCksIHRoZWlyV3JpdGVUaW1lOiBuZXcgRGF0ZSh0aGVpcnMud3JpdGVUaW1lKS50b0lTT1N0cmluZygpLCBvdXJTaXplOiBlbnRyeS5zaXplLCB0aGVpclNpemU6IHRoZWlycy5zaXplIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicHVzaENvcHlVbmF2YWlsYWJsZVwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGhvbGRlcjogaG9sZGVyLmdldERlYnVnTmFtZSgpLCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCksIHNvdXJjZUhhczogdGhlaXJzICYmIGAke3RoZWlycy5zaXplfSBieXRlcyBhdCAke25ldyBEYXRlKHRoZWlycy53cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9YCB8fCBcIm5vdGhpbmdcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgc2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgIHB1c2hlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA8IFNZTkNfRVJST1JfTE9HX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZUZhaWx1cmVzID49IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQSBwYXVzZSBwZXIgZmFpbHVyZSwgc28gYSBkb3duIG5ldHdvcmsgdGFrZXMgbWludXRlcyB0byBidXJuIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIGluc3RlYWQgb2YgYW4gaW5zdGFudFxuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVjb25jaWxpbmcgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMsICR7ZmFpbGVkfSBmYWlsZWQke2Fib3J0ZWQgJiYgYCBiZWZvcmUgYWJvcnRpbmcgdGhlIHBhc3MgKCR7Y29uc2VjdXRpdmVGYWlsdXJlc30gY29uc2VjdXRpdmUgZmFpbHVyZXMgLSB0aGUgc291cmNlIGxvb2tzIGRvd247IHRoZSBuZXh0IHNjYW4gY3ljbGUgcmV0cmllcylgIHx8IFwiXCJ9LiBGaXJzdCBlcnJvcnM6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicmVjb25jaWxlRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHB1c2hlZCwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IFNjYW5PdXRjb21lIHtcbiAgICAgICAgLy8gQW4gaW4tZmxpZ2h0IHNjYW4gY2FuIG91dGxpdmUgaXRzIHNvdXJjZSdzIHJlbW92YWw7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmICghdGhpcy5pc0xpdmUoc291cmNlSW5kZXgpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICBpZiAoZmlsZS5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBORVZFUiBwdWxsZWQgZnJvbSBvdGhlciBzb3VyY2VzIC0gaXQgb25seSBldmVyIGFycml2ZXMgYXMgYW4gZXhwbGljaXQsIHZlcnNpb24tdmFsaWRhdGVkIHdyaXRlLCBhbmQgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzay4gUm91dGUgYW5kIHZhbGlkLXdpbmRvdyBmaWx0ZXJzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IGVpdGhlcjogaXQgaXMgdGhlIGZpbGUgREVGSU5JTkcgdGhlbSwgc28gZmlsdGVyaW5nIGl0IHdvdWxkIG1lYW4gY2VydGFpbiBzb3VyY2VzIGNvdWxkIG5ldmVyIGhhdmUgdGhlaXIgcm91dGluZyBjb25maWcgdXBkYXRlZCwgZXZlci5cbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB2YWxpZCB3aW5kb3cgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhcHBsaWVkIGhlcmU6IGl0IGRlY2lkZXMgd2hlcmUgV1JJVEVTIHJvdXRlLCBidXQgYSBzY2FuIGlzIHVzIGFza2luZyBhIHNvdXJjZSB3aGF0IGl0IGFscmVhZHkgaG9sZHMgLSBleGlzdGluZyB2YWx1ZXMgc3luY2hyb25pemUgcmVnYXJkbGVzcyBvZiB0aGUgd2luZG93ICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS4gT25seSB0aGUgcm91dGUgZmlsdGVyczogYSBwYXJ0aWFsbHktb3ZlcmxhcHBpbmcgc2hhcmQncyBsaXN0aW5nIGxlZ2l0aW1hdGVseSBpbmNsdWRlcyBrZXlzIHRoYXQgYXJlbid0IG91cnMuXG4gICAgICAgICAgICBsZXQgeyByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMsIGFuZCBhIHRpZSBrZWVwcyB3aGF0IHdlIGhhdmUgLSBvdGhlcndpc2UgZXZlcnkgcmVzY2FuIG9mIGFuIHVuY2hhbmdlZCBmaWxlIHdvdWxkIHJlLXJlY29yZCBpdCwgbW92aW5nIGl0cyBob2xkZXIgYW5kIHdyaXRpbmcgYSBsb2cgcmVjb3JkIGZvciBub3RoaW5nLiBjdXJyZW50V3JpdGVUaW1lIGNvdW50cyBkZWxldGlvbnMsIHNvIGEgbGlzdGluZyB0aGF0IHN0aWxsIHNob3dzIGEgZmlsZSB3ZSBrbm93IHdhcyBkZWxldGVkIGRvZXMgbm90IHJlc3VycmVjdCBpdC5cbiAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKSkgcmV0dXJuIFwidW5jaGFuZ2VkXCI7XG4gICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAtIGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUgLSBzbyB0aGF0IGlzIHdoYXQgaXQgaXMgdGFrZW4gYXNcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBmaWxlLmNyZWF0ZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFwidG9tYnN0b25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpIH0pO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBcInVwZGF0ZWRcIjtcbiAgICAgICAgcmV0dXJuIFwibmV3XCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsQ2hhbmdlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBvbGxTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lLCByb3V0ZXM6IHJvdXRlICYmIFtyb3V0ZV0gfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgdGFsbHkgPSBuZXdTY2FuVGFsbHkoKTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0YWxseVt0aGlzLnVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleCwgZmlsZSldKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9sbHMgcnVuIGNvbnN0YW50bHksIHNvIG9ubHkgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBjaGFuZ2VkIHRoZSBpbmRleCBnZXQgYW4gZW50cnlcbiAgICAgICAgaWYgKHRhbGx5Lm5ldyB8fCB0YWxseS51cGRhdGVkIHx8IHRhbGx5LnRvbWJzdG9uZSkge1xuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiY2hhbmdlc1BvbGxcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgY2hhbmdlczogY2hhbmdlcy5sZW5ndGgsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ICs9IGNoYW5nZXMubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lID0gcG9sbFN0YXJ0IC0gQ0hBTkdFU19QT0xMX09WRVJMQVA7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWRzIHRoZSBmaWxlcyBhIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHByZXNlcnZpbmcgdGhlaXIgbW9kaWZpZWQgdGltZXMg4oCUIHNvIGEgbmV3ZXIgbG9jYWwgd3JpdGUgYWx3YXlzIHdpbnMuIFNraXBwZWQgZm9yIG5vRnVsbFN5bmMgc291cmNlcyAoZnJvbnRpbmcgYSBsYXJnZSBkYXRhYmFzZSB3aXRob3V0IGNvcHlpbmcgaXQpOyByZWFkcyBzdGlsbCBkb3duLWNhY2hlIGxhemlseS4gT25seSBvbmUgcGFzcyBwZXIgU09VUkNFIHJ1bnMgYXQgYSB0aW1lIChjYWNoZSBrZXlzIHRoZSBzZXJpYWxpemVyIGJ5IHNvdXJjZSBpbmRleCkgLSB0d28gcGFzc2VzIG92ZXIgdGhlIHNhbWUgcGVuZGluZyBsaXN0IHdvdWxkIGRvd25sb2FkIGV2ZXJ5dGhpbmcgdHdpY2UuXG4gICAgcHJpdmF0ZSBjb3B5U291cmNlRmlsZXMgPSBjYWNoZSgoc291cmNlSW5kZXg6IG51bWJlcikgPT4gcnVuSW5TZXJpYWwoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybjtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwZW5kaW5nOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gY29waWVkU291cmNlc0xpc3RJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBwZW5kaW5nLnB1c2goeyBrZXksIGVudHJ5IH0pO1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bGxTeW5jXCIsXG4gICAgICAgICAgICBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGRvbmVGaWxlczogMCxcbiAgICAgICAgICAgIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLFxuICAgICAgICAgICAgZG9uZUJ5dGVzOiAwLFxuICAgICAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImRlbHRhU3luY1N0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGRpZmZCYXNlZDogc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIGZpbGVzOiBwZW5kaW5nLmxlbmd0aCwgYnl0ZXM6IHRvdGFsQnl0ZXMgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc0xvZ2dlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbG9nUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBwcm9ncmVzc0xvZ2dlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBEZWx0YSBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7YWN0aXZpdHkuZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKWApKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHByb2dyZXNzVGltZXIgPSBzZXRJbnRlcnZhbChsb2dQcm9ncmVzcywgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBzbG93RXJyb3JUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIGFjdGl2aXR5LnN0YXJ0VGltZTtcbiAgICAgICAgICAgIGxldCBkb25lRmlsZXMgPSBhY3Rpdml0eS5kb25lRmlsZXMgfHwgMDtcbiAgICAgICAgICAgIGxldCBkb25lQnl0ZXMgPSBhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMDtcbiAgICAgICAgICAgIGxldCBieXRlc1BlclNlY29uZCA9IGRvbmVCeXRlcyAvIChlbGFwc2VkIC8gMTAwMCk7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nQnl0ZXMgPSB0b3RhbEJ5dGVzIC0gZG9uZUJ5dGVzO1xuICAgICAgICAgICAgbGV0IGV0YVRleHQgPSBcInVua25vd24gKG5vIGJ5dGVzIHRyYW5zZmVycmVkIHlldClcIjtcbiAgICAgICAgICAgIGlmIChieXRlc1BlclNlY29uZCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nTXMgPSByZW1haW5pbmdCeXRlcyAvIGJ5dGVzUGVyU2Vjb25kICogMTAwMDtcbiAgICAgICAgICAgICAgICBldGFUZXh0ID0gYCR7Zm9ybWF0VGltZShyZW1haW5pbmdNcyl9IHJlbWFpbmluZywgY29tcGxldGluZyBhcm91bmQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgcmVtYWluaW5nTXMpLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGVsdGEgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pIGhhcyBiZWVuIHJ1bm5pbmcgZm9yICR7Zm9ybWF0VGltZShlbGFwc2VkKX06ICR7ZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoZG9uZUZpbGVzIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGRvbmVCeXRlcyl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIGRvbmVCeXRlcyAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihieXRlc1BlclNlY29uZCl9Qi9zLiBFc3RpbWF0ZWQgJHtldGFUZXh0fS5gKTtcbiAgICAgICAgfSwgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwpO1xuICAgICAgICAoc2xvd0Vycm9yVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgZmFpbGVkID0gMDtcbiAgICAgICAgbGV0IGNvcGllZEZpbGVzID0gMDtcbiAgICAgICAgbGV0IGNvcGllZEJ5dGVzID0gMDtcbiAgICAgICAgbGV0IG1pc3NpbmdPblNvdXJjZSA9IDA7XG4gICAgICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgY2Fubm90IGdpdmUgdXMgdGhlIGZpbGUgKGl0cyByZWFkIGhhZCBub3RoaW5nLCBvciBpdCBlcnJvcmVkKS4gUmV0cnlpbmcgdGhlIHNhbWUgZW50cnkgZm9yZXZlciBpcyBub3QgYW4gYW5zd2VyOiBpZiBvdXIgb3duIGRpc2sgaG9sZHMgYSBjb3B5LCBJVCBiZWNvbWVzIHRoZSBob2xkZXI7IHdpdGggbm8gbG9jYWwgY29weSBlaXRoZXIsIHRoZSBlbnRyeSBpcyBwdXJnZWQgLSBmb3Jnb3R0ZW4sIG5vdCBkZWxldGVkLCBleGFjdGx5IGxpa2UgYSByZWFkIHRoYXQgY29tZXMgdXAgZW1wdHkgZXZlcnl3aGVyZSAtIGFuZCB0aGUgbmV4dCBmdWxsIHB1bGwgcmUtZmluZHMgaXQgaWYgaXQgZXhpc3RzIGFueXdoZXJlLlxuICAgICAgICBsZXQgcmVzb2x2ZVVuYXZhaWxhYmxlID0gYXN5bmMgKGV2ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBlbnRyeTogSW5kZXhFbnRyeSwgZXh0cmE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmFzZSA9IHsgZXZlbnQsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgZXhwZWN0ZWRTaXplOiBlbnRyeS5zaXplLCBleHBlY3RlZFdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCAuLi5leHRyYSB9O1xuICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbG9jYWwgY29weSBjYW4gYmUgTkVXRVIgdGhhbiB0aGUgZW50cnkgKHdoaWNoIGlzIGV4YWN0bHkgd2h5IGNvcHlBcmNoaXZlRmlsZSByZWZ1c2VzIHRvIG92ZXJ3cml0ZSBpdCAtIHNlZSBpdHMgZGVzdGluYXRpb24gY2hlY2spLCBzbyB0aGUgcmVwb2ludCBrZWVwcyB0aGUgbmV3ZXIgb2YgdGhlIHR3byB0aW1lcyByYXRoZXIgdGhhbiByb2xsaW5nIHRoZSBpbmRleCBiYWNrXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IE1hdGgubWF4KGVudHJ5LndyaXRlVGltZSwgbG9jYWwud3JpdGVUaW1lKSwgc2l6ZTogbG9jYWwuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IC4uLmJhc2UsIHJlc29sdXRpb246IFwicmVwb2ludGVkIHRvIG91ciBsb2NhbCBjb3B5XCIsIGxvY2FsU2l6ZTogbG9jYWwuc2l6ZSwgbG9jYWxXcml0ZVRpbWU6IG5ldyBEYXRlKGxvY2FsLndyaXRlVGltZSkudG9JU09TdHJpbmcoKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgPD0gZW50cnkud3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyAuLi5iYXNlLCByZXNvbHV0aW9uOiBcInB1cmdlZCAtIG5laXRoZXIgdGhlIHNvdXJjZSBub3Igb3VyIGRpc2sgaGFzIGl0LCBzbyBpdCBkb2VzIG5vdCBleGlzdFwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgbmV3ZXIgd3JpdGUgbGFuZGVkIHdoaWxlIHdlIHdlcmUgY2hlY2tpbmcgLSB0aGUgZW50cnkgaXMgbm8gbG9uZ2VyIHRoZSBvbmUgd2UgZm91bmQgdW5hdmFpbGFibGUsIHNvIGl0IGlzIGxlZnQgYWxvbmVcbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IC4uLmJhc2UsIHJlc29sdXRpb246IFwia2VwdCAtIGEgbmV3ZXIgd3JpdGUgYXBwZWFyZWQgd2hpbGUgY2hlY2tpbmdcIiwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgIGxldCBjb3B5V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICghYWJvcnRlZCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGtleSwgZW50cnkgfSA9IHBlbmRpbmdbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGtleSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZEJ5dGVzICs9IGNvcGllZC5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgZ2V0XCIsIGtleSwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3B5IGNhcnJpZXMgdGhlIHNvdXJjZSdzIHdyaXRlIHRpbWUsIGFuZCB0aGUgaW5kZXggY29tbWl0cyBpdCB1bmRlciB0aGUgbm9ybWFsIG9yZGVyaW5nIHJ1bGUgKD49IHRoZSBjdXJyZW50IHRpbWUgd2lucykgLSBpdCByZWZ1c2luZyBtZWFucyBhIE5FV0VSIHdyaXRlIGxhbmRlZCB3aGlsZSB3ZSBjb3BpZWQsIHdoaWNoIG11c3QgYmUgc2FpZCwgbm90IHN3YWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jQ29tbWl0U3VwZXJzZWRlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGNvcGllZFdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJkZWx0YVN5bmNNaXNzaW5nT25Tb3VyY2VcIiwga2V5LCBlbnRyeSwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGluZyBmaWxlIHJlc29sdmVzIGV4YWN0bHkgbGlrZSBhIG1pc3Npbmcgb25lICh0aGUgc291cmNlIGNhbm5vdCBnaXZlIGl0IHRvIHVzIGVpdGhlciB3YXkpLCBzbyBpdCBuZXZlciB3ZWRnZXMgdGhlIHBhc3Mgb24gcmV0cmllcyBmb3JldmVyIC0gYW5kIHRoZSBuZXh0IGZ1bGwgcHVsbCByZS1maW5kcyBpdCBpZiB0aGUgc291cmNlIHJlY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzb2x2ZVVuYXZhaWxhYmxlKFwiZGVsdGFTeW5jQ29weUZhaWxlZFwiLCBrZXksIGVudHJ5LCB7IGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocmVzb2x2ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jQ29weUZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApLCByZXNvbHZlRXJyb3I6IFN0cmluZygocmVzb2x2ZUVycm9yIGFzIEVycm9yKS5zdGFjayA/PyByZXNvbHZlRXJyb3IpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBhdXNlIHBlciBmYWlsdXJlLCBzbyBhIGRvd24gbmV0d29yayB0YWtlcyBtaW51dGVzIHRvIGJ1cm4gdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2UgaW5zdGVhZCBvZiBhbiBpbnN0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImRlbHRhU3luY0ZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkaWZmQmFzZWQ6IHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lLCB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCwgdG90YWxCeXRlcywgcHJvY2Vzc2VkRmlsZXM6IGFjdGl2aXR5LmRvbmVGaWxlcywgY29waWVkRmlsZXMsIGNvcGllZEJ5dGVzLCBtaXNzaW5nT25Tb3VyY2UsIGZhaWxlZCwgYWJvcnRlZCB9KTtcbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIC8vIOKUgOKUgCBtYWludGVuYW5jZSDilIDilIBcblxuICAgIC8vIHJlYWRlckRpc2tMaW1pdDogdGhlIGRpc2sgaXMgb25seSBhIGJvdW5kZWQgcmVhZCBjYWNoZSwgc28gb25jZSBpdCBleGNlZWRzIHRoZSBsaW1pdCwgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZmlsZXMgYXJlIGRlbGV0ZWQgZnJvbSBpdCAtIGJ1dCBPTkxZIHdoZW4gYW5vdGhlciBzb3VyY2UgdmVyaWZpYWJseSBob2xkcyBhIHNhbWUtb3ItbmV3ZXIgY29weSAodGhlIG9ubHkgY29weSBvZiBhIGZpbGUgaXMgbmV2ZXIgZGVsZXRlZCksIGFuZCB0aGUgaW5kZXggZW50cnkgcmVwb2ludHMgdG8gdGhhdCBzb3VyY2Ugc28gcmVhZHMga2VlcCB3b3JraW5nIChyZS1jYWNoaW5nIG9uIHRoZSBuZXh0IHJlYWQpLlxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZURpc2tMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGxpbWl0ID0gdGhpcy5zdG9yZS5yZWFkZXJEaXNrTGltaXQ7XG4gICAgICAgIGlmICghbGltaXQgfHwgdGhpcy5ldmljdGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5zdG9yZS5pbmRleFRvdGFscygpO1xuICAgICAgICAvLyBDb3VudGVkIGRvd24gYXMgd2UgZXZpY3QsIHJhdGhlciB0aGFuIHJlLXJlYWQgcGVyIGZpbGU6IGEgcGFzcyBvbmx5IGV2ZXIgcmVtb3ZlcyBieXRlcyBmcm9tIHRoZSBkaXNrLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBkdXJpbmcgaXQgaXMgcGlja2VkIHVwIGJ5IHRoZSBuZXh0IHBhc3NcbiAgICAgICAgbGV0IGRpc2tCeXRlcyA9IHRvdGFscy5zbG90c1swXS5ieXRlQ291bnQ7XG4gICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5ldmljdGluZyA9IHRydWU7XG4gICAgICAgIGxldCBldmljdGVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgZXZpY3RlZEJ5dGVzID0gMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBiYXNlU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKTtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4IHx8IGtleSA9PT0gUk9VVElOR19GSUxFKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBrZXksIGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGVhc3QgcmVjZW50bHkgUkVBRCBmaXJzdDsgYSBrZXkgbm9ib2R5IGhhcyByZWFkIHNpbmNlIHdlIHN0YXJ0ZWQgZmFsbHMgYmFjayB0byB3aGVuIHdlIGxhc3QgY2hhbmdlZCBpdFxuICAgICAgICAgICAgc29ydChjYW5kaWRhdGVzLCB4ID0+IHRoaXMubGFzdEFjY2Vzcy5nZXQoeC5rZXkpIHx8IHguZW50cnkuY2hhbmdlZEF0KTtcbiAgICAgICAgICAgIGZvciAobGV0IHsga2V5LCBlbnRyeSB9IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoZGlza0J5dGVzIDw9IGxpbWl0KSBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW50cnlVbmNoYW5nZWQoa2V5LCBlbnRyeSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBob2xkZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoaG9sZGVyKSB9KTtcbiAgICAgICAgICAgICAgICBldmljdGVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICBldmljdGVkQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICBkaXNrQnl0ZXMgLT0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmljdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGlzayBjYWNoZSBvdmVyIHJlYWRlckRpc2tMaW1pdCAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBldmljdGVkICR7ZXZpY3RlZEZpbGVzfSBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihldmljdGVkQnl0ZXMpfUIpLCBub3cgYXQgJHtmb3JtYXROdW1iZXIoZGlza0J5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKGxpbWl0KX1CYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb21ic3RvbmVzIG9ubHkgbmVlZCB0byBleGlzdCBsb25nIGVub3VnaCBmb3IgZXZlcnkgc3RvcmUgdG8gbGVhcm4gb2YgdGhlIGRlbGV0aW9uOyBleHBpcmVkIG9uZXMgYXJlIGZvcmdvdHRlbiBlbnRpcmVseS4gQSB3YWxrIG9mIHRoZSB0b21ic3RvbmVzIGFsb25lLCB3aGljaCBpcyB3aHkgaXQgY2FuIHJ1biBvZnRlbiBhbmQgY29zdCBub3RoaW5nLiBUaGUgcGh5c2ljYWwgZW1wdHkgZmlsZSBpcyByZW1vdmVkIG9ubHkgb24gYmFja2JsYXplIHNvdXJjZXM6IHJlbW90ZSBzdG9yZXMgZXhwaXJlIHRoZWlyIG93biB0b21ic3RvbmVzIChhIGRlbCB0aGVyZSB3b3VsZCBqdXN0IG1pbnQgYSBmcmVzaCBvbmUpLCBhbmQgb3VyIG93biBkaXNrIG5ldmVyIHN0b3JlZCBhbnl0aGluZyBmb3IgaXQuXG4gICAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVG9tYnN0b25lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBUT01CU1RPTkVfRVhQSVJZO1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuc3RvcmUuZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLndyaXRlVGltZSA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICAvLyBBIE1BUktFRCBkZWxldGlvbiBuZXZlciBleHBpcmVzIGJ5IHRpbWUgLSBpdHMgYnl0ZXMgYXJlIHN0aWxsIG9uIGRpc2ssIGFuZCBwdXJnaW5nIHRoZSB0b21ic3RvbmUgd291bGQgbGV0IHRoZSBuZXh0IGRpc2sgc2NhbiByZXN1cnJlY3QgdGhlbSBhcyBsaXZlLiBSZXRlbnRpb24gZXhwaXJlcyBpdCBieSBTSVpFIChlbmZvcmNlSGlzdG9yeUxpbWl0KTsgb25seSBvbmNlIHRoZSBieXRlcyBhcmUgZ29uZSBkb2VzIHRoZSBwbGFpbiB0b21ic3RvbmUgYWdlIG91dCBoZXJlLlxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuZ2V0TWFya2VkRW50cnkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRW50cnkgPSB0aGlzLnN0b3JlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3dzQWNjZXB0V3JpdGVzKHNvdXJjZUVudHJ5LnZhbGlkV2luZG93cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VFbnRyeS5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQXJjaGl2ZXNCYWNrYmxhemUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB2b2lkIHNvdXJjZS5kZWwoa2V5KS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVtb3ZpbmcgZXhwaXJlZCB0b21ic3RvbmUgJHtrZXl9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWxldGlvbiBoaXN0b3J5IHJldGVudGlvbjogbWFya2VkIGZpbGVzIGtlZXAgdGhlaXIgYnl0ZXMgb24gb3VyIGRpc2sgdW50aWwgdGhlIGhpc3Rvcnkgb3V0Z3Jvd3MgbWF4KEhJU1RPUllfTUlOX0JZVEVTLCBsaXZlIGJ5dGVzICogaGlzdG9yeSBmYWN0b3IpOyB0aGVuIHRoZSBPTERFU1QgZGVsZXRpb25zIGxvc2UgdGhlaXIgYnl0ZXMgYW5kIGJlY29tZSBwbGFpbiB0b21ic3RvbmVzLCB3aGljaCBhZ2Ugb3V0IG5vcm1hbGx5IChjbGVhbnVwVG9tYnN0b25lcylcbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VIaXN0b3J5TGltaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gTWF0aC5tYXgoSElTVE9SWV9NSU5fQllURVMsIHRoaXMuc3RvcmUuaW5kZXhUb3RhbHMoKS5ieXRlQ291bnQgKiBhd2FpdCBnZXRIaXN0b3J5RmFjdG9yKCkpO1xuICAgICAgICBsZXQgbWFya2VkOiB7IGtleTogc3RyaW5nOyBzaXplOiBudW1iZXI7IGRlbGV0ZVRpbWU6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIG1hcmtlZC5wdXNoKHsga2V5LCBzaXplOiBlbnRyeS5zaXplLCBkZWxldGVUaW1lOiBlbnRyeS5kZWxldGVUaW1lIH0pO1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXJ0ZWRXaXRoQnl0ZXMgPSB0b3RhbEJ5dGVzO1xuICAgICAgICBzb3J0KG1hcmtlZCwgeCA9PiB4LmRlbGV0ZVRpbWUpO1xuICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgIGxldCBkcm9wcGVkQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCB7IGtleSwgc2l6ZSB9IG9mIG1hcmtlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodG90YWxCeXRlcyA8PSBhbGxvd2VkKSBicmVhaztcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZHJvcE1hcmtlZEhpc3Rvcnkoa2V5KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgLT0gc2l6ZTtcbiAgICAgICAgICAgIGRyb3BwZWQrKztcbiAgICAgICAgICAgIGRyb3BwZWRCeXRlcyArPSBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGlvbiBoaXN0b3J5IG9mIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9IG91dGdyZXcgaXRzIGJ1ZGdldCAoJHtmb3JtYXROdW1iZXIoc3RhcnRlZFdpdGhCeXRlcyl9QiBrZXB0IHZzICR7Zm9ybWF0TnVtYmVyKGFsbG93ZWQpfUIgYWxsb3dlZCk6IGRyb3BwZWQgdGhlICR7ZHJvcHBlZH0gb2xkZXN0IG1hcmtlZCBmaWxlcyAoJHtmb3JtYXROdW1iZXIoZHJvcHBlZEJ5dGVzKX1CKTsgdGhlaXIgdG9tYnN0b25lcyByZW1haW4gdW50aWwgdGhleSBhZ2Ugb3V0YCk7XG4gICAgfVxufVxuIl19
828
- /* _JS_SOURCE_HASH = "bf8245c2af20d9f2d8104d9a19b2e6d64714eed411e8090294d44348d5a16fa2"; */
827
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUErRztBQUMvRyx5REFBb0Q7QUFDcEQsbURBQTBFO0FBQzFFLGtFQUF5RztBQUN6Ryw0Q0FHc0I7QUFDdEIsc0RBQW9EO0FBQ3BELDRDQUFpRDtBQUNqRCxpREFBMkc7QUFFM0csMkNBQWtFO0FBQ2xFLCtDQUE2QztBQUM3Qyx3RUFBbUU7QUFFbkUsa2JBQWtiO0FBRWxiLHlFQUF5RTtBQUN6RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEMsbU1BQW1NO0FBQ25NLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Msa1FBQWtRO0FBQ2xRLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDNUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Qsc0dBQXNHO0FBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsbUJBQVksQ0FBQztBQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsb0xBQW9MO0FBQ3BMLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELG1GQUFtRjtBQUNuRixNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVDLHdJQUF3STtBQUN4SSxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3Qiw4S0FBOEs7QUFD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Q0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDcEMsSUFBSSxVQUFVLElBQUksT0FBTztnQkFBRSxNQUFNO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsWUFBWSxJQUFJLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixJQUFBLHFCQUFZLEVBQUMsZ0JBQWdCLENBQUMsYUFBYSxJQUFBLHFCQUFZLEVBQUMsT0FBTyxDQUFDLDJCQUEyQixPQUFPLHlCQUF5QixJQUFBLHFCQUFZLEVBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDN1IsQ0FBQztDQUNKO0FBN3NCRCw4QkE2c0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsLCBkZWxheSwgcnVuSW5maW5pdGVQb2xsQ2FsbEF0U3RhcnQsIHJ1bkluU2VyaWFsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGNhY2hlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0LCBwcm9taXNlT2JqIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lLCBmb3JtYXREYXRlVGltZURldGFpbGVkIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU3luY1N0YXR1cywgU3luY0FjdGl2aXR5LCBGVUxMX1JPVVRFLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGNvcHlBcmNoaXZlRmlsZSB9IGZyb20gXCIuLi9hcmNoaXZlSGVscGVyc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNCYWNrYmxhemUgfSBmcm9tIFwiLi4vYmFja2JsYXplXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCBwYXJzZVJvdXRpbmdEYXRhLCBnZXRDb25maWdWZXJzaW9uIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IEJsb2JTdG9yZSwgSW5kZXhFbnRyeSB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHsgZ2V0SGlzdG9yeUZhY3RvciwgSElTVE9SWV9NSU5fQllURVMgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7IGxvZ1N5bmNFdmVudCB9IGZyb20gXCIuL3N0b3JhZ2VMb2dzXCI7XG5pbXBvcnQgeyBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcblxuLy8gRXZlcnl0aGluZyB0aGF0IGtlZXBzIGEgc3RvcmUncyBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCBpdHMgc291cmNlcywgcGx1cyB0aGUgdHdvIG1haW50ZW5hbmNlIGxvb3BzIHRoYXQgZm9sbG93IGZyb20gaG9sZGluZyBhbiBpbmRleCAoZXZpY3RpbmcgYSBib3VuZGVkIGRpc2sgY2FjaGUsIGV4cGlyaW5nIHRvbWJzdG9uZXMpLiBUaGUgc3RvcmUgb3ducyB0aGUgc291cmNlcyBhbmQgZGVjaWRlcyB3aGVyZSB3cml0ZXMgZ287IHRoaXMgZGVjaWRlcyB3aGF0IGlzIHNjYW5uZWQsIHB1bGxlZCwgcHVzaGVkLCBldmljdGVkLCBhbmQgZm9yZ290dGVuIC0gc28gdGhlIHdyaXRlIHBhdGggc3RheXMgcmVhZGFibGUgd2l0aG91dCB0aGUgc2V2ZXJhbCBodW5kcmVkIGxpbmVzIG9mIHN5bmNocm9uaXphdGlvbiBtYWNoaW5lcnkgaW50ZXJsZWF2ZWQgaW50byBpdC5cblxuLy8gU291cmNlcyB3aXRoIGEgbmF0aXZlIChpbmRleC1iYWNrZWQpIGNoYW5nZSBmZWVkIGFyZSBwb2xsZWQgdGhpcyBvZnRlblxuY29uc3QgQ0hBTkdFU19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIGNoZWNrZWQgZm9yIG9uIGV2ZXJ5IHBlZXIgdGhpcyBvZnRlbiAtIGZhciBtb3JlIG9mdGVuIHRoYW4gYSBmdWxsIHJlc2NhbiwgYmVjYXVzZSBpdCBpcyB0aGUgZmlsZSB0aGF0IGRlY2lkZXMgd2hhdCBldmVyeXRoaW5nIGVsc2UgZG9lcywgYW5kIGl0IGlzIG9uZSBzbWFsbCByZWFkIHBlciBwZWVyXG5jb25zdCBDT05GSUdfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDU7XG4vLyBGdWxsIG1ldGFkYXRhIHJlc2NhbnMuIHN1cHBvcnRzQ2hhbmdlc0FmdGVyIGlzIHRoZSBoZXVyaXN0aWMgZm9yIFwib25lIG9mIG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzXCI6IHRoZWlyIGluZGV4LWJhY2tlZCBsaXN0aW5ncyBhcmUgY2hlYXAsIHNvIGhvdXJseSBpcyBmaW5lLiBFdmVyeXRoaW5nIGVsc2UgKGJhY2tibGF6ZSwgcGxhaW4gZGlzaykgcGF5cyB0aGUgZnVsbCBsaXN0aW5nIGNvc3QsIHNvIGl0IHJlc2NhbnMgbXVjaCBsZXNzIG9mdGVuLlxuY29uc3QgRlVMTF9SRVNDQU5fSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbmNvbnN0IEZVTExfUkVTQ0FOX05PTl9SRU1PVEVfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MCAqIDY7XG4vLyBDaGFuZ2UgcG9sbHMgcmUtcmVxdWVzdCB0aGlzIG11Y2ggb3ZlcmxhcCwgc28gY2xvY2sgc2tldyBiZXR3ZWVuIHVzIGFuZCBhIHNvdXJjZSBjYW4ndCBkcm9wIGNoYW5nZXNcbmNvbnN0IENIQU5HRVNfUE9MTF9PVkVSTEFQID0gdGltZUluTWludXRlO1xuY29uc3QgU0NBTl9SRVRSWV9ERUxBWSA9IDEwMDAgKiAzMDtcbi8vIERlbGV0ZXMgYXJlIHRvbWJzdG9uZXMgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpOiB0aGUgc2l6ZS0wIGluZGV4IGVudHJ5IGlzIHdoYXQgbGV0cyBhIGRlbGV0aW9uIHByb3BhZ2F0ZS9yZWNvbmNpbGUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIGFuZCBpdCBleHBpcmVzIGFmdGVyIHRoaXMgbG9uZ1xuY29uc3QgVE9NQlNUT05FX0VYUElSWSA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiA3O1xuY29uc3QgVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFdoaWxlIGEgbWV0YWRhdGEgc2NhbiBvciBmdWxsIHN5bmMgaXMgcnVubmluZywgaXRzIHByb2dyZXNzIGlzIGxvZ2dlZCB0aGlzIG9mdGVuXG5jb25zdCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbmNvbnN0IERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBGdWxsIHN5bmNzIGRvd25sb2FkIHRoaXMgbWFueSBmaWxlcyBjb25jdXJyZW50bHkgKGhpZ2gtbGF0ZW5jeSBzb3VyY2VzIGxpa2UgYmFja2JsYXplIHdvdWxkIG90aGVyd2lzZSBjcmF3bCBvbmUgcm91bmQtdHJpcCBhdCBhIHRpbWUpXG5jb25zdCBGVUxMX1NZTkNfUEFSQUxMRUwgPSA4O1xuLy8gQSBmdWxsIHN5bmMgcnVubmluZyBsb25nZXIgdGhhbiB0aGlzIGlzIGNvbnNvbGUuZXJyb3JlZCAoYW5kIGFnYWluIGV2ZXJ5IGludGVydmFsIGFmdGVyKSwgc28gYSBzeW5jIHRoYXQgd2lsbCB0YWtlIGRheXMgaXMgbG91ZCBpbnN0ZWFkIG9mIGEgcXVpZXQgY29uc29sZS5sb2cgZXZlcnkgbWludXRlXG5jb25zdCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gUmVjb25jaWxlIHBhc3NlcyBBTkQgZnVsbCBzeW5jcyBza2lwIGZhaWxpbmcgZmlsZXMgKG9uZSBiYWQgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCAtIGEgc291cmNlIGZhaWxpbmcgb25lIHJlcXVlc3QgaW4gYSB0aG91c2FuZCBjb3VsZCBvdGhlcndpc2UgbmV2ZXIgZmluaXNoIGEgc3luYyksIGJ1dCB0aGlzIG1hbnkgZmFpbHVyZXMgaW4gYSByb3cgbWVhbnMgdGhlIG90aGVyIHNpZGUgaXRzZWxmIGlzIGRvd24sIHNvIHRoZSBwYXNzIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBjeWNsZVxuY29uc3QgU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMgPSA1O1xuY29uc3QgU1lOQ19FUlJPUl9MT0dfTElNSVQgPSAzO1xuLy8gRXZlcnkgZmFpbGVkIGZpbGUgd2FpdHMgdGhpcyBsb25nIGJlZm9yZSB0aGUgcGFzcyBjb250aW51ZXMsIHNvIGEgZG93biBuZXR3b3JrIGJ1cm5zIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIG92ZXIgYSBtaW51dGUtcGx1cyBpbnN0ZWFkIG9mIGluIGFuIGluc3RhbnRcbmNvbnN0IFNZTkNfRkFJTFVSRV9ERUxBWSA9IDEwMDAgKiAxNTtcbi8vIEEgZnVsbCBsaXN0aW5nIHRoYXQgY29tZXMgYmFjayBFTVBUWSAtIG9yIHVuZGVyIGhhbGYgb2Ygd2hhdCB3ZSBrbm93IHRoZSBzb3VyY2UgaG9sZHMgLSBpcyB0cmVhdGVkIGFzIHRoZSBvdGhlciBlbmQgYmVpbmcgYnJpZWZseSBicm9rZW4sIG5vdCBhcyB0aGUgdHJ1dGg6IGl0IGlzIHJldHJpZWQgdGhpcyBtYW55IHRpbWVzLCB0aGlzIGZhciBhcGFydCwgYmVmb3JlIGJlaW5nIGJlbGlldmVkLiBCZWxpZXZpbmcgYSB3cm9uZ2x5LXNocnVua2VuIGxpc3RpbmcgcHVyZ2VzIGV2ZXJ5IGluZGV4IGVudHJ5IHRoZSBzb3VyY2UgaGVsZCwgd2hpY2ggaXMgaG93IHN5bmMgcHJvZ3Jlc3MgXCJnb2VzIGJhY2t3YXJkc1wiLlxuY29uc3QgU1VTUElDSU9VU19TQ0FOX1JFVFJJRVMgPSAzO1xuY29uc3QgU1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDYwO1xuLy8gSG93IGxvbmcgcGFzdCB0aGUgZW5kIG9mIGEgc291cmNlJ3MgbGFzdCB3aW5kb3cgd2UgYXJlIHN0aWxsIHdpbGxpbmcgdG8gcmVhZCAoc2NhbikgaXQuIFdlIGNhbid0IHJlYWQgZnJvbSBhIHNvdXJjZSB0aGF0J3MgdG9vIG9sZCwgYmVjYXVzZSBvdXIgdG9tYnN0b25lcyBvbmx5IGxhc3Qgc28gbG9uZyAoVE9NQlNUT05FX0VYUElSWSk6IGEgc291cmNlIHdob3NlIHdpbmRvd3MgYXJlIGFsbCBwYXN0IG5ldmVyIHJlY2VpdmVzIGRlbGV0aW9ucyAodGhlIHdpbmRvdyBnYXRlcyB3cml0ZXMsIGRlbGV0aW9ucyBpbmNsdWRlZCksIHNvIGl0IG5ldmVyIGtuZXcgYWJvdXQgb3VyIHRvbWJzdG9uZXMgLSBhbmQgaWYgd2UgcmVhZCBpdCBhZnRlciBhIHRvbWJzdG9uZSBleHBpcmVzLCBpdCBjYW4gcmVzdXJyZWN0IGEgZGVhZCB2YWx1ZS4gV2hpbGUgd2UgRE8gcmVhZCBpdCwgb3VyIG93biB0b21ic3RvbmUgaXMgd2hhdCByZWZ1dGVzIGl0cyBzdGFsZSBsaXN0aW5ncywgc28gdGhpcyBkdXJhdGlvbiBtdXN0IHN0YXkgZmFyIGJlbG93IFRPTUJTVE9ORV9FWFBJUlkuXG5jb25zdCBQQVNUX1JFQURfRFVSQVRJT04gPSAxMDAwICogNjAgKiA2MDtcblxudHlwZSBTb3VyY2VTdGF0ZSA9IHtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbjogUmV0dXJuVHlwZTx0eXBlb2YgcHJvbWlzZU9iaj47XG4gICAgc2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIFdoZXRoZXIgYSBzY2FuIG9mIHRoaXMgc291cmNlIGhhcyBldmVyIGFjdHVhbGx5IFNVQ0NFRURFRCAtIHdoYXQgZnVsbCBzeW5jcyBnYXRlIG9uOiB3aXRob3V0IG9uZSwgdGhlIGluZGV4J3MgdmlldyBvZiB0aGlzIHNvdXJjZSBjYW4gYmUgYXJiaXRyYXJpbHkgc3RhbGUgKGUuZy4gaXQgd2FzIHJlc3RhcnRpbmcgd2hlbiB3ZSBmaXJzdCB0cmllZCksIGFuZCBzeW5jaW5nIGZyb20gc3RhbGUgaW5mb3JtYXRpb24gY2h1cm5zIGZvcmV2ZXJcbiAgICBzY2FuU3VjY2VlZGVkOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbiAgICAvLyBXYXRlcm1hcmsgZm9yIGdldENoYW5nZXNBZnRlcjIgcG9sbHNcbiAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiBudW1iZXI7XG4gICAgLy8gUGVyLXNsb3Qgc3RvcCB0b2tlbjogYSByZW1vdmVkIHNvdXJjZSdzIGxvb3BzIHN0b3Agd2l0aG91dCB0b3VjaGluZyB0aGUgcmVzdCBvZiB0aGUgc3RvcmVcbiAgICBzdG9wcGVkOiB7IHN0b3A6IGJvb2xlYW4gfTtcbiAgICAvLyBBIHJlbW92ZWQgc291cmNlJ3Mgc2xvdCBzdGF5cyBpbiB0aGUgYXJyYXlzICh0aGV5IGFyZSBuZXZlciBzcGxpY2VkLCBzbyBzbG90IG51bWJlcnMgaGVsZCBieSBydW5uaW5nIGxvb3BzIHN0YXkgbWVhbmluZ2Z1bCksIG1hcmtlZCBkZWFkIC0gbmV2ZXIgc2Nhbm5lZCwgd3JpdHRlbiwgb3IgcmVhZC4gSW5kZXggZW50cmllcyBkb24ndCByZWZlcmVuY2Ugc2xvdHMgYXQgYWxsOyB0aGV5IHBlcnNpc3QgdGhlIHNvdXJjZXMgbGlzdCdzIHNvdXJjZXNMaXN0SW5kZXguXG4gICAgZGVhZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBuZXdTb3VyY2VTdGF0ZSgpOiBTb3VyY2VTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGZhbHNlLFxuICAgICAgICBpbml0aWFsU2NhbjogcHJvbWlzZU9iaigpLFxuICAgICAgICBzY2FuQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICBzY2FuU3VjY2VlZGVkOiBmYWxzZSxcbiAgICAgICAgc2Nhbm5lZENvdW50OiAwLFxuICAgICAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiAwLFxuICAgICAgICBzdG9wcGVkOiB7IHN0b3A6IGZhbHNlIH0sXG4gICAgfTtcbn1cblxuLy8gV2hhdCBhIHNjYW5uZWQgbGlzdGluZyBlbnRyeSBtZWFudCB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3VyIGluZGV4XG50eXBlIFNjYW5PdXRjb21lID0gXCJmaWx0ZXJlZFwiIHwgXCJuZXdcIiB8IFwidXBkYXRlZFwiIHwgXCJ0b21ic3RvbmVcIiB8IFwidW5jaGFuZ2VkXCI7XG50eXBlIFNjYW5UYWxseSA9IFJlY29yZDxTY2FuT3V0Y29tZSwgbnVtYmVyPjtcbmZ1bmN0aW9uIG5ld1NjYW5UYWxseSgpOiBTY2FuVGFsbHkge1xuICAgIHJldHVybiB7IGZpbHRlcmVkOiAwLCBuZXc6IDAsIHVwZGF0ZWQ6IDAsIHRvbWJzdG9uZTogMCwgdW5jaGFuZ2VkOiAwIH07XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yZVN5bmMge1xuICAgIC8vIFBlciBzb3VyY2Ugc2xvdCwgaW4gc3RlcCB3aXRoIHRoZSBzdG9yZSdzIHNvdXJjZXMgYXJyYXkuIFNsb3RzIGFyZSBuZXZlciBzcGxpY2VkIG91dCAtIGEgcmVtb3ZlZCBvbmUgaXMgbWFya2VkIGRlYWQgLSBzbyBhIHNsb3QgbnVtYmVyIGhlbGQgYnkgYSBydW5uaW5nIGxvb3AgYWx3YXlzIG1lYW5zIHRoZSBzYW1lIHNvdXJjZS5cbiAgICBwcml2YXRlIHN0YXRlczogU291cmNlU3RhdGVbXTtcbiAgICAvLyBTY2FucyAvIGZ1bGwgc3luY3MgaW4gcHJvZ3Jlc3MgKGEgU2V0IC0gb25lIHNvdXJjZSBjYW4gaGF2ZSBhIGNoYW5nZSBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIGFjdGl2aXRpZXMgPSBuZXcgU2V0PFN5bmNBY3Rpdml0eT4oKTtcbiAgICAvLyBHdWFyZHMgYWdhaW5zdCBhIHNlY29uZCBldmljdGlvbiBwYXNzIHN0YXJ0aW5nIHdoaWxlIG9uZSBpcyBzdGlsbCB3YWxraW5nIHRoZSBpbmRleFxuICAgIHByaXZhdGUgZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAvLyBXaGVuIGVhY2gga2V5IHdhcyBsYXN0IHNlcnZlZCwgZm9yIHJlYWRlckRpc2tMaW1pdCdzIExSVSBldmljdGlvbi4gTmV2ZXIgcGVyc2lzdGVkIChhIHJlc3RhcnQgaGFzIG5vIG9waW5pb24gYWJvdXQgcmVjZW5jeSksIGFuZCBvbmx5IGtlcHQgZm9yIGtleXMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gcmVhZCAtIGFuIGluZGV4IGVudHJ5IG5vIG9uZSBoYXMgdG91Y2hlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0LlxuICAgIHByaXZhdGUgbGFzdEFjY2VzcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBCbG9iU3RvcmUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBzdG9yZS5zb3VyY2VzLm1hcCgoKSA9PiBuZXdTb3VyY2VTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogU3RhcnRzIGV2ZXJ5IGxpdmUgc291cmNlJ3Mgc3luY2hyb25pemF0aW9uLCBwbHVzIHRoZSBtYWludGVuYW5jZSBsb29wcy4gQ2FsbGVkIG9uY2UsIGJ5IHRoZSBzdG9yZSdzIGluaXQgLSB0aGUgc3RvcmUncyBpbmRleCBtdXN0IGFscmVhZHkgYmUgbG9hZGVkLCBzaW5jZSBzY2FucyB3cml0ZSBzdHJhaWdodCBpbnRvIGl0LiAqL1xuICAgIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXJ0U291cmNlU3luY0xvb3BzKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChDT05GSUdfUE9MTF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5wb2xsUm91dGluZ0NvbmZpZygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuY2xlYW51cFRvbWJzdG9uZXMoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmVuZm9yY2VIaXN0b3J5TGltaXQoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgLy8gUmVhZCBsaXZlOiB0aGUgbGltaXQgY29tZXMgZnJvbSB0aGUgY29uZmlnLCBzbyBhIHN0b3JlIHRoYXQgZ2FpbnMgb25lIGxhdGVyIHN0YXJ0cyBlbmZvcmNpbmcgaXQgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWRcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFza3MgZXZlcnkgcGVlciBmb3IgdGhlIHJvdXRpbmcgY29uZmlnLCBhbmQgdGFrZXMgaXQgaWYgaXQgaXMgbmV3ZXIgdGhhbiBvdXJzLiBUaGlzIGlzIHRoZSB3aG9sZVxuICAgICAqIG9mIGNvbmZpZ3VyYXRpb24gcHJvcGFnYXRpb246IGl0IHJpZGVzIGJlc2lkZSB0aGUgc2NhbnMgcmF0aGVyIHRoYW4gYmVpbmcgcGFydCBvZiB0aGVtLCBiZWNhdXNlXG4gICAgICogb25lIHNtYWxsIHJlYWQgaXMgd29ydGggZG9pbmcgZXZlcnkgZmV3IG1pbnV0ZXMgd2hpbGUgYSBmdWxsIGxpc3RpbmcgaXMgbm90LCBhbmQgYmVjYXVzZSBhXG4gICAgICogY29uZmlnIHdlIGFyZSBtaXNzaW5nIGlzIHdoYXQgc3RvcHMgZXZlcnl0aGluZyBlbHNlIGZyb20gYmVpbmcgcmlnaHQuXG4gICAgICpcbiAgICAgKiBUaGUgY29weSBpcyBzdG9yZWQgdGhlIHNhbWUgd2F5IGEgc2NhbiBzdG9yZXMgYW55dGhpbmcgaXQgcHVsbHMgLSBhbiBpbnRlcm5hbCB3cml0ZSBpbnRvIG91ciBvd25cbiAgICAgKiBzdG9yZSAtIGFuZCB0aGUgc3RvcmUgbm90aWNlcyB0aGF0IGZpbGUgbGFuZGluZyBhbmQgcmUtY29uZmlndXJlcyBpdHNlbGYuIE5vdGhpbmcgaGVyZSBrbm93cyB3aGF0XG4gICAgICogYSBjb25maWcgbWVhbnM7IGl0IG9ubHkga25vd3MgdGhpcyBvbmUgZmlsZSBpcyB3b3J0aCBhc2tpbmcgZm9yIG9mdGVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcG9sbFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnNvdXJjZXNbaV0uaW50ZXJtZWRpYXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgdGhlaXJzID0gYXdhaXQgc291cmNlLmdldDIoUk9VVElOR19GSUxFLCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGhlaXJzIHx8ICF0aGVpcnMuZGF0YSB8fCAhdGhlaXJzLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbiA9IGdldENvbmZpZ1ZlcnNpb24ocGFyc2VSb3V0aW5nRGF0YSh0aGVpcnMuZGF0YSkpO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDw9IHRoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHt2ZXJzaW9ufSBmb3VuZCBvbiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHdlIGhhdmUgJHt0aGlzLnN0b3JlLnJvdXRpbmdWZXJzaW9uKCl9LCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHRha2luZyBpdGApO1xuICAgICAgICAgICAgICAgIC8vIFN0YW1wZWQgTk9XLCBub3Qgd2l0aCB0aGVpciB3cml0ZSB0aW1lOiBjb25maWdzIGFyZSBvcmRlcmVkIGJ5IHZlcnNpb24sIGFuZCB0aGlzIG9uZSBpcyBuZXdlciBieSB0aGF0IG9yZGVyaW5nLiBUaGVpciBmaWxlIGNhbiBlYXNpbHkgYmUgb2xkZXIgYnkgd3JpdGUgdGltZSAob3VycyB3YXMgcmV3cml0dGVuIGxvY2FsbHkgbW9yZSByZWNlbnRseSksIGFuZCB0aGUgc3RvcmUncyBvbmx5LXRha2UtdGhlLWxhdGVzdCBydWxlIHdvdWxkIHRoZW4gZHJvcCBpdCAtIGxlYXZpbmcgdXMgZmluZGluZyB0aGUgc2FtZSBuZXdlciB2ZXJzaW9uIG9uIGV2ZXJ5IHBvbGwgYW5kIG5ldmVyIGFkb3B0aW5nIGl0LlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2V0KHsgcGF0aDogUk9VVElOR19GSUxFLCBkYXRhOiB0aGVpcnMuZGF0YSwgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBIHBlZXIgdGhhdCBjYW5ub3QgYW5zd2VyIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgYSBzb3VyY2UgdGhhdCBpcyBkb3duOyB0aGUgbmV4dCBwb2xsIGFza3MgYWdhaW5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZm9yIGEgbmV3ZXIgcm91dGluZyBjb25maWcgZmFpbGVkIChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU3RvcHMgZXZlcnkgc291cmNlJ3MgbG9vcHMgKHRoZSBzdG9yZSdzIG93biBzdG9wIHRva2VuIHN0b3BzIHRoZSBtYWludGVuYW5jZSBsb29wcykuICovXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IHN0YXRlIG9mIHRoaXMuc3RhdGVzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgc2xvdCB0aGUgc3RvcmUganVzdCBhcHBlbmRlZCB0byBpdHMgc291cmNlcyBhcnJheTogaXQgc3RhcnRzIGZyb20gbm90aGluZywgc28gaXQgZ2V0cyBhIGZ1bGwgc2Nhbi4gKi9cbiAgICBwdWJsaWMgYWRkU291cmNlKHNsb3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlc1tzbG90XSA9IG5ld1NvdXJjZVN0YXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICB2b2lkIHRoaXMuc3RhcnRTb3VyY2VTeW5jTG9vcHMoc2xvdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIHNsb3Qgc3RheXMgaW4gdGhlIHN0b3JlJ3MgYXJyYXlzIGZvcmV2ZXIgKHJ1bm5pbmcgbG9vcHMgaG9sZCBzbG90IG51bWJlcnMpOyBpdCBqdXN0IGdvZXMgZGVhZCAtIGxvb3BzIHN0b3AsIGFuZCBpdHMgaW5kZXggZW50cmllcyBkcm9wIChvdGhlciBzb3VyY2VzJyBzY2FucyByZS1maW5kIGFueSBjb3B5IHRoYXQncyBzdGlsbCByZWFjaGFibGUgdGhyb3VnaCB0aGUgbmV3IGNvbmZpZykuICovXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZVNvdXJjZShzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc2xvdF07XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnN0b3JlLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBzdGF0ZS5kZWFkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBsZXQgc291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc2xvdFNvdXJjZXNMaXN0SW5kZXgoc2xvdCk7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYmUgYW5vdGhlciBsaXZlIHNsb3QgKG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93KSAtIHRoZSBlbmRwb2ludCBpcyBzdGlsbCBjb25maWd1cmVkLCBzbyBpdHMgZW50cmllcyBzdGF5XG4gICAgICAgIGlmIChzb3VyY2VzTGlzdEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zdG9yZS5zbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBzb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBGb3Jnb3R0ZW4sIG5vdCBkZWxldGVkOiB0aGUgZmlsZXMgc3RpbGwgZXhpc3Qgd2hlcmV2ZXIgdGhhdCBzb3VyY2UgcHV0IHRoZW0sIHdlIGp1c3Qgbm8gbG9uZ2VyIGhhdmUgYSB3YXkgdG8gcmVhY2ggdGhlbVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCBhbmQgJHtkcm9wcGVkfSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgd2VyZSBkcm9wcGVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCAoaXRzIFVSTCBpcyBzdGlsbCBzZXJ2ZWQgYnkgYW5vdGhlciBzbG90LCBzbyBpdHMgaW5kZXggZW50cmllcyBzdGF5KWApO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGEgc2xvdCBpcyBzdGlsbCBjb25maWd1cmVkLiBEZWFkIHNsb3RzIGFyZSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiAqL1xuICAgIHB1YmxpYyBpc0xpdmUoc2xvdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3RvcmUuc291cmNlc1tzbG90XSAmJiAhdGhpcy5zdGF0ZXNbc2xvdF0/LmRlYWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGl2aXRpZXMoKTogU3luY0FjdGl2aXR5W10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuYWN0aXZpdGllc107XG4gICAgfVxuXG4gICAgLyoqIEEga2V5IHdhcyBqdXN0IHNlcnZlZCwgc28gaXQgZ29lcyB0byB0aGUgYmFjayBvZiB0aGUgZXZpY3Rpb24gcXVldWUuICovXG4gICAgcHVibGljIG5vdGVBY2Nlc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzLnNldChrZXksIERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdGhlIGluZGV4IHN0aWxsIGhvbGRzIGV4YWN0bHkgdGhlIGVudHJ5IGEgcGFzcyBwaWNrZWQgdXAgZWFybGllci4gSW5kZXggcm93cyBhcmUgcmVhZCBvdXQgb2YgdGhlIGRhdGFiYXNlIHBlciBsb29rdXAsIHNvIHRoaXMgY29tcGFyZXMgdGhlIHJvdywgbm90IHRoZSBvYmplY3QgLSBhIHdyaXRlIGxhbmRpbmcgbWlkLXBhc3MgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgdGhyZWUuXG4gICAgcHJpdmF0ZSBlbnRyeVVuY2hhbmdlZChrZXk6IHN0cmluZywgZW50cnk6IEluZGV4RW50cnkpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjdXJyZW50LndyaXRlVGltZSA9PT0gZW50cnkud3JpdGVUaW1lICYmIGN1cnJlbnQuc2l6ZSA9PT0gZW50cnkuc2l6ZSAmJiBjdXJyZW50LnNvdXJjZXNMaXN0SW5kZXggPT09IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXR1cygpOiBBcmNoaXZlc1N5bmNTdGF0dXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogdGhpcy5zdGF0ZXMuZXZlcnkoeCA9PiB4LnNjYW5Db21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHRoaXMuc3RvcmUuaW5kZXhTaXplKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0aGlzLnN0b3JlLnNvdXJjZXMubWFwKCh4LCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzOiB4LnZhbGlkV2luZG93cyxcbiAgICAgICAgICAgICAgICByb3V0ZTogeC5yb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jOiB4Lm5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRoaXMuc3RhdGVzW2ldLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLFxuICAgICAgICAgICAgICAgIGluaXRpYWxTY2FuQ29tcGxldGU6IHRoaXMuc3RhdGVzW2ldLnNjYW5Db21wbGV0ZSxcbiAgICAgICAgICAgICAgICBzY2FubmVkQ291bnQ6IHRoaXMuc3RhdGVzW2ldLnNjYW5uZWRDb3VudCxcbiAgICAgICAgICAgIH0pKS5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogTGlzdGluZ3MgY29tZSBzdHJhaWdodCBmcm9tIHRoZSBpbmRleCwgc28gdGhleSBtdXN0IHdhaXQgZm9yIG91ciBvd24gYmFzZSBzb3VyY2UncyBpbml0aWFsIHNjYW4gKHdoaWNoIG1pZ2h0IGxhZyBtaW51dGVzKSBiZWZvcmUgdGhleSBhcmUgdHJ1c3R3b3J0aHkuIFRoZSBiYXNlIChsb2NhbCBkaXNrKSBpcyBpbXBsaWNpdGx5IHJlcXVpcmVkIC0gcmVtb3RlIHNvdXJjZXMgYXJlIG5vdCwgdGhleSBjb21lIGFuZCBnby4gKi9cbiAgICBwdWJsaWMgYXN5bmMgd2FpdEZvclJlcXVpcmVkU2NhbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVzWzBdLmluaXRpYWxTY2FuLnByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKDApKCk7XG4gICAgfVxuXG4gICAgLyoqIE9uZSBzeW5jaHJvbml6YXRpb24gcm91bmQgb2YgYSBzb3VyY2U6IHRoZSBQVUxMIGRpcmVjdGlvbiBhbHdheXMgKGl0cyBsaXN0aW5nLCBhcHBsaWVkIHRvIG91ciBpbmRleCksIGFuZCB3aXRoIFwicHVzaFwiIHRoZSBwdXNoIGRpcmVjdGlvbiB0b28gKHdoYXQgb3VyIGluZGV4IHNheXMgdGhlIHNvdXJjZSBpcyBtaXNzaW5nLCB3cml0dGVuIHRvIGl0KS4gUHVzaCBpcyBhbiBhcmd1bWVudCByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNhbGwgYmVjYXVzZSBpdCBjYW5ub3QgcnVuIHdpdGhvdXQgdGhlIHB1bGwncyBsaXN0aW5nIC0gdGhlIGluZGV4IGFsb25lIGNhbm5vdCBzYXkgd2hhdCB0aGUgc291cmNlIGFscmVhZHkgaG9sZHMuIExpc3RpbmdzIHVuYmxvY2sgKGluaXRpYWxTY2FuKSBiZXR3ZWVuIHRoZSBoYWx2ZXMsIHNvIHRoZXkgbmV2ZXIgd2FpdCBiZWhpbmQgYSBwdXNoLiBPbmx5IG9uZSByb3VuZCBwZXIgU09VUkNFIHJ1bnMgYXQgYSB0aW1lIChjYWNoZSBrZXlzIHRoZSBzZXJpYWxpemVyIGJ5IHNvdXJjZSBpbmRleCkuICovXG4gICAgcHJpdmF0ZSBzeW5jU291cmNlID0gY2FjaGUoKHNvdXJjZUluZGV4OiBudW1iZXIpID0+IHJ1bkluU2VyaWFsKGFzeW5jIChwdXNoPzogXCJwdXNoXCIpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgbGV0IGxpc3RpbmcgPSBhd2FpdCB0aGlzLnB1bGxTb3VyY2Uoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHB1c2ggJiYgIXRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVzaFNvdXJjZShzb3VyY2VJbmRleCwgbGlzdGluZyk7XG4gICAgICAgIH1cbiAgICB9KSk7XG5cbiAgICAvKiogQSBib3VuZGFyeSBzY2FuIG9mIHRoZSBub2RlIHRoYXQgb3duZWQgKHBhcnQgb2YpIG91ciByb3V0ZSBpbiB0aGUgdmFsaWQgd2luZG93IGJlZm9yZSBvdXJzLCB3aGVuIHRoYXQgbm9kZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSAoYSBkaXNrIHJlc2NhbiBjYW4ndCBzZWUgaXRzIHdyaXRlcyk6IGp1c3QgaXRzIGNoYW5nZXMgc2luY2UgdGhlIGJvdW5kYXJ5IG5laWdoYm9yaG9vZCwgd2l0aCBtYXRjaGluZyB2YWx1ZXMgcHVsbGVkIG9udG8gb3VyIG93biBkaXNrLiAqL1xuICAgIHB1YmxpYyBhc3luYyBib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlOiBJQXJjaGl2ZXMsIGNvbmZpZzogeyBzaW5jZTogbnVtYmVyOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl0gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiYm91bmRhcnlTY2FuU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc2luY2U6IGNvbmZpZy5zaW5jZSwgcm91dGU6IGNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIyKHsgdGltZTogY29uZmlnLnNpbmNlLCByb3V0ZXM6IGNvbmZpZy5yb3V0ZSAmJiBbY29uZmlnLnJvdXRlXSB8fCB1bmRlZmluZWQgfSk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LmZpbHRlcmVkKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBTaXplIDAgaW4gYSBsaXN0aW5nIElTIGEgZGVsZXRpb24gKGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUpLCBzbyBpdCBpcyB0YWtlbiBhcyBvbmVcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogc291cmNlLCB0bzogdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZSwgcGF0aDogZmlsZS5wYXRoLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKCFjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBVbmRlZmluZWQgaXMgdHdvIGNhc2VzIChzZWUgY29weUFyY2hpdmVGaWxlKTogb3VyIG93biBkaXNrIGFscmVhZHkgaG9sZGluZyBzb21ldGhpbmcgbmV3ZXIgaXMgdGhlIGJvdW5kYXJ5IHNjYW4gd29ya2luZyBhcyBpbnRlbmRlZCAob3VyIHdyaXRlcyBzaW5jZSB0aGUgYm91bmRhcnkgb3V0cmFuayB0aGUgbmVpZ2hib3IncyksIG9ubHkgYSBnZW51aW5lbHkgdW5yZWFkYWJsZSBmaWxlIGlzIHdvcnRoIGEgd2FybmluZ1xuICAgICAgICAgICAgICAgIGxldCBsb2NhbCA9IGF3YWl0IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UuZ2V0SW5mbyhmaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbCAmJiBsb2NhbC53cml0ZVRpbWUgPiBmaWxlLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiYm91bmRhcnlTY2FuTG9jYWxOZXdlclwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBmaWxlLnBhdGgsIHRoZWlyV3JpdGVUaW1lOiBmb3JtYXREYXRlVGltZURldGFpbGVkKGZpbGUuY3JlYXRlVGltZSksIHRoZWlyU2l6ZTogZmlsZS5zaXplLCBsb2NhbFdyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChsb2NhbC53cml0ZVRpbWUpLCBsb2NhbFNpemU6IGxvY2FsLnNpemUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShmaWxlLnBhdGgsIHsgd3JpdGVUaW1lOiBsb2NhbC53cml0ZVRpbWUsIHNpemU6IGxvY2FsLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGFsbHkudW5jaGFuZ2VkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEJvdW5kYXJ5IHNjYW4gY291bGQgbm90IGNvcHkgJHtmaWxlLnBhdGh9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBjaGFuZ2UgZmVlZCBsaXN0ZWQgaXQgKCR7ZmlsZS5zaXplfSBieXRlcywgd3JpdGVUaW1lICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChmaWxlLmNyZWF0ZVRpbWUpfSkgYnV0IHRoZSByZWFkIGZvdW5kIG5vdGhpbmdgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RvcmUubm90ZVN5bmNUcmFuc2ZlcihcInN5bmMgZ2V0XCIsIGZpbGUucGF0aCwgY29waWVkLnNpemUpO1xuICAgICAgICAgICAgaWYgKGNvcGllZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleERlbGV0ZWQoZmlsZS5wYXRoLCBjb3BpZWQud3JpdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB0YWxseS50b21ic3RvbmUrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShmaWxlLnBhdGgsIHsgd3JpdGVUaW1lOiBjb3BpZWQud3JpdGVUaW1lLCBzaXplOiBjb3BpZWQuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkudXBkYXRlZCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWxseS5uZXcrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5GaW5pc2hcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHNjYW5TdGFydCwgc2luY2U6IGNvbmZpZy5zaW5jZSwgY2hhbmdlczogY2hhbmdlcy5sZW5ndGgsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQgfSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHBlci1zb3VyY2UgbG9vcHMg4pSA4pSAXG5cbiAgICAvLyBTbG90IDAgaXMgZXhlbXB0OiBvdXIgb3duIGRpc2sgYW5zd2VycyBmb3IgZXZlcnkgd2luZG93IHRoaXMgc3RvcmUgRVZFUiBoZWxkLCBhbmQgc2Nhbm5pbmcgaXQgaXMgd2hhdCBrZWVwcyB0aGUgaW5kZXggaG9uZXN0IGFib3V0IHRoZW0uIFJlYWQgbGl2ZSBlYWNoIGNhbGwgLSB1cGRhdGVTb3VyY2VzIG1vdmVzIHRoZSB3aW5kb3dzIG9uIHJ1bm5pbmcgc2xvdHMsIHNvIGEgc291cmNlIGdvZXMgc3RhbGUgKG9yIGNvbWVzIGJhY2spIHdoaWxlIGl0cyBsb29wcyBydW4uXG4gICAgcHJpdmF0ZSB3aW5kb3dzQWxsb3dTY2FubmluZyhzb3VyY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLnZhbGlkV2luZG93cy5zb21lKHcgPT4gd1sxXSA+IERhdGUubm93KCkgLSBQQVNUX1JFQURfRFVSQVRJT04pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRTb3VyY2VTeW5jTG9vcHMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnJlZ2lzdGVyU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCBzb3VyY2VPYmogPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlT2JqLnNvdXJjZTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAvLyBJZiBhIHNsb3QgZXZlciBnZXRzIFRXTyBvZiB0aGVzZSwgaXRzIGxvb3BzIGFyZSBkb3VibGVkIC0gZXZlcnkgcG9sbCBhbmQgZnVsbCBzeW5jIHJ1bnMgdHdpY2VcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic291cmNlU3luY1N0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHNvdXJjZUluZGV4LCB1cmw6IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0udXJsLCBpbnRlcm1lZGlhdGU6IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0uaW50ZXJtZWRpYXRlIH0pO1xuICAgICAgICAvLyBSZWFkIGxpdmUgZm9yIGV2ZXJ5IHBhc3MsIG5vdCBjYXB0dXJlZCAtIHRoZSBzdG9yZSdzIHNvdXJjZSBsaXN0IGNhbiBjaGFuZ2Ugd2hpbGUgbG9vcHMgcnVuXG4gICAgICAgIGxldCBub0Z1bGxTeW5jID0gKCkgPT4gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5ub0Z1bGxTeW5jO1xuICAgICAgICAvLyBBbiBpbnRlcm1lZGlhdGUgaXMgYSBkZXBsb3kgc3dpdGNob3ZlcidzIHRlbXBvcmFyeSBhbHRlcm5hdGUgUE9SVCBvbnRvIGEgc291cmNlIHdlIGFscmVhZHkgaGF2ZTogdGhlIHNhbWUgYnVja2V0LCByZWFjaGFibGUgYW5vdGhlciB3YXkgZm9yIGEgZmV3IG1pbnV0ZXMuIFNjYW5uaW5nIGl0IHdvdWxkIGxpc3QgZXhhY3RseSB3aGF0IHNjYW5uaW5nIHRoYXQgc291cmNlIGxpc3RzLCBhZ2FpbnN0IGEgcG9ydCB0aGF0IGlzIGFib3V0IHRvIGRpc2FwcGVhciAtIHNvIGl0IGlzIG5ldmVyIHNjYW5uZWQsIGFuZCB0aGUgc291cmNlIGl0IHdhcyBzcGxpdCBvdXQgb2YgY292ZXJzIGl0IGZvciBhcyBsb25nIGFzIGl0IGV4aXN0cyBhbmQgYWZ0ZXIgaXQgaXMgZ29uZS5cbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0uaW50ZXJtZWRpYXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrZWQgcGVyIHRpY2ssIG5ldmVyIGRlY2lkZWQgb25jZTogdGhlIHdpbmRvd3MgbW92ZSBvbiBydW5uaW5nIHNsb3RzIChzZWUgdXBkYXRlU291cmNlcyksIHNvIGEgc291cmNlIGdvZXMgc3RhbGUgbWlkLWxpZmUgYW5kIGNhbiBjb21lIGJhY2sgaWYgYSBjb25maWcgZXh0ZW5kcyB0aGVtLiBMb2dnZWQgb25seSBvbiBlYWNoIHRyYW5zaXRpb24gaW50byBzdGFsZW5lc3MuXG4gICAgICAgIGxldCBsb2dnZWRTdGFsZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2tpcFN0YWxlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMud2luZG93c0FsbG93U2Nhbm5pbmcoc291cmNlSW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VkU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKCFsb2dnZWRTdGFsZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuU2tpcHBlZFN0YWxlV2luZG93c1wiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCB2YWxpZFdpbmRvd3M6IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0udmFsaWRXaW5kb3dzLm1hcCh3ID0+IFtmb3JtYXREYXRlVGltZURldGFpbGVkKHdbMF0pLCBmb3JtYXREYXRlVGltZURldGFpbGVkKHdbMV0pXSksIHBhc3RSZWFkRHVyYXRpb25NczogUEFTVF9SRUFEX0RVUkFUSU9OIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEFuIGFscmVhZHktc3RhbGUgc291cmNlIHNraXBzIGdldENvbmZpZyBlbnRpcmVseTogaXRzIGVuZHBvaW50IGlzIG9mdGVuIGxvbmcgZ29uZSwgYW5kIHJldHJ5aW5nIHRoYXQgZXZlcnkgMzBzIGZvcmV2ZXIgaXMgbm9pc2UgYWJvdXQgYSBzb3VyY2Ugd2Ugd291bGQgbm90IHNjYW4gYW55d2F5IChpZiBpdHMgd2luZG93cyBhcmUgbGF0ZXIgZXh0ZW5kZWQsIHRoZSBmdWxsLXJvdW5kIHBvbGwgYmVsb3cgcGlja3MgaXQgdXAgLSBqdXN0IHdpdGhvdXQgY2hhbmdlIHBvbGxpbmcgdW50aWwgYSByZXN0YXJ0KVxuICAgICAgICB3aGlsZSAoIXNraXBTdGFsZSgpICYmICF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCBzb3VyY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgPSAhIWNvbmZpZy5zdXBwb3J0c0NoYW5nZXNBZnRlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJpbml0aWFsU2NhbkZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCByZXRyeUluTXM6IFNDQU5fUkVUUllfREVMQVksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCB8fCBzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgLy8gSG91cmx5IGZvciBvdXIgb3duIGRpc2sgKG5vIHNvdXJjZUNvbmZpZyAtIGEgY2hlYXAgbG9jYWwgd2FsaywgYW5kIGhvdyBhIHNpYmxpbmcgcHJvY2VzcydzIHdyaXRlcyBpbnRvIHRoZSBzaGFyZWQgZm9sZGVyIGFyZSBmb3VuZCkgYW5kIGZvciByZW1vdGUgcGVlcnMgKGluZGV4LWJhY2tlZCwgY2hlYXAgbGlzdGluZ3MpOyB0aGUgc2xvdyBpbnRlcnZhbCBpcyBvbmx5IGZvciBzb3VyY2VzIHdoZXJlIGEgZnVsbCBsaXN0aW5nIGlzIGdlbnVpbmVseSBleHBlbnNpdmUgKGJhY2tibGF6ZSlcbiAgICAgICAgbGV0IHBvbGxJbnRlcnZhbCA9ICghc291cmNlT2JqLnNvdXJjZUNvbmZpZyB8fCBzb3VyY2VPYmouc291cmNlQ29uZmlnLnR5cGUgPT09IFwicmVtb3RlXCIpICYmIEZVTExfUkVTQ0FOX0lOVEVSVkFMIHx8IEZVTExfUkVTQ0FOX05PTl9SRU1PVEVfSU5URVJWQUw7XG4gICAgICAgIC8vIEJvdGggbG9vcHMgYmVsb3cgcnVuIG9uZSBhdCBhIHRpbWU6IGEgY2hhbmdlLXBvbGwgdGljayBsYW5kaW5nIG1pZCBmdWxsIHJvdW5kIHdvdWxkIG90aGVyd2lzZSBzdGFydCBhIHNlY29uZCBjb3B5IHBhc3Mgb3ZlciB0aGUgc2FtZSBwZW5kaW5nIGxpc3QsIGRvd25sb2FkaW5nIGV2ZXJ5dGhpbmcgdHdpY2VcbiAgICAgICAgbGV0IHNlcmlhbCA9IHJ1bkluU2VyaWFsKGFzeW5jIChmbmM6ICgpID0+IFByb21pc2U8dm9pZD4pID0+IGF3YWl0IGZuYygpKTtcbiAgICAgICAgYXdhaXQgcnVuSW5maW5pdGVQb2xsQ2FsbEF0U3RhcnQocG9sbEludGVydmFsLCAoKSA9PiBzZXJpYWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNraXBTdGFsZSgpKSByZXR1cm47XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wICYmICFzdGF0ZS5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2Uoc291cmNlSW5kZXgpKFwicHVzaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKCkpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhbkZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCByZXRyeUluTXM6IFNDQU5fUkVUUllfREVMQVksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgIGlmIChzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlcikge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKENIQU5HRVNfUE9MTF9JTlRFUlZBTCwgKCkgPT4gc2VyaWFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcFN0YWxlKCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBBIHNjYW4gdGhhdCBoYXMgbm90IHN1Y2NlZWRlZCB5ZXQgaXMgcmV0cmllZCBIRVJFLCBiZWZvcmUgYW55dGhpbmcgZWxzZSAtIHBvbGxpbmcgY2hhbmdlcyBhbmQgY29weWluZyBhZ2FpbnN0IGEgbmV2ZXItc2Nhbm5lZCBzb3VyY2Ugd291bGQgcnVuIG9uIGFyYml0cmFyaWx5IHN0YWxlIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5zY2FuU3VjY2VlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NvdXJjZShzb3VyY2VJbmRleCkoXCJwdXNoXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpKCk7XG4gICAgICAgICAgICB9KSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgUFVMTCBkaXJlY3Rpb246IGEgZnVsbCBtZXRhZGF0YSBzY2FuIChzaXplLCB3cml0ZVRpbWUsIHBhdGgpIG9mIG9uZSBzb3VyY2UsIGFwcGxpZWQgdG8gb3VyIGluZGV4LiBSZXR1cm5zIHRoZSBzb3VyY2UncyBsaXN0aW5nIChwYXRoIC0+IHdyaXRlIHRpbWUpLCB3aGljaCBwdXNoU291cmNlIHVzZXMgZm9yIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uXG4gICAgcHJpdmF0ZSBhc3luYyBwdWxsU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7IHR5cGU6IFwibWV0YWRhdGFTY2FuXCIsIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzdGFydFRpbWU6IHNjYW5TdGFydCB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblN0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCkgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0aWxsIHJ1bm5pbmcgKCR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zLCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSlgKTtcbiAgICAgICAgfSwgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIC8vIFRoZSBsaXN0aW5nIHJlcXVlc3QgZGVsaWJlcmF0ZWx5IHRha2VzIG5vIHRpbWUgb3Igcm91dGUgZmlsdGVyczogb3VyIHNsb3dlc3Qgc291cmNlcyAoYmFja2JsYXplKSBzdXBwb3J0IG5laXRoZXIsIHNvIGZpbHRlcmluZyB3b3VsZCBoYXBwZW4gYWZ0ZXIgdGhlIGZ1bGwgZmV0Y2ggYW55d2F5IC0gbGl0dGxlIGJlbmVmaXQsIG1vcmUgcm9vbSBmb3IgZGVzeW5jaHJvbml6YXRpb24uIEFuZCBpZiBhIGZ1bGwgbGlzdGluZyBldmVyIGJlY29tZXMgdG9vIGJpZyB0byBzZW5kIG92ZXIgdGhlIG5ldHdvcmssIGl0IGlzIGFsc28gdG9vIGJpZyBmb3IgdGhlIHJlY2VpdmluZyBwcm9jZXNzIHRvIGhvbGQgaW4gbWVtb3J5IC0gdGhlIGZpeCBpcyBtb3JlIHJvdXRpbmcgc2hhcmRzIChlYWNoIHN0b3JpbmcgYW5kIHNlbmRpbmcgbGVzcyksIG5vdCBmaWx0ZXJpbmcuXG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBXaGF0IHdlIGJlbGlldmUgdGhlIHNvdXJjZSBoYXM6IHdoaWNoZXZlciBpcyBsYXJnZXIgb2YgaXRzIHByZXZpb3VzIGxpc3RpbmcgYW5kIHRoZSBpbmRleCBlbnRyaWVzIG5hbWluZyBpdCBhcyBob2xkZXIuIEZpbGVzIGRvIG5vdCBqdXN0IHZhbmlzaCAtIGEgbGlzdGluZyBmYXIgYmVsb3cgdGhpcyBtZWFucyB0aGUgb3RoZXIgZW5kIGlzIGJyaWVmbHkgYnJva2VuLCBhbmQgYmVsaWV2aW5nIGl0IHdvdWxkIHB1cmdlIGV2ZXJ5dGhpbmcgaXQgaGVsZC5cbiAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCA9PT0gc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXgpIGhlbGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gTWF0aC5tYXgoc3RhdGUuc2Nhbm5lZENvdW50LCBoZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIShleHBlY3RlZCA+IDAgJiYgZmlsZXMubGVuZ3RoIDwgZXhwZWN0ZWQgLyAyKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRzID49IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBTVElMTCBsaXN0cyAke2ZpbGVzLmxlbmd0aH0gZmlsZXMgd2hlcmUgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQsIGFmdGVyICR7YXR0ZW1wdHN9IHJldHJpZXMgLSBhY2NlcHRpbmcgdGhlIGxpc3RpbmcgYXMgdGhlIHRydXRoYCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBsaXN0ZWQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzLCBidXQgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQgKHByZXZpb3VzIGxpc3RpbmcgJHtzdGF0ZS5zY2FubmVkQ291bnR9LCBpbmRleCBlbnRyaWVzIGl0IGhvbGRzICR7aGVsZH0pIC0gdGhlIG90aGVyIGVuZCBpcyBwcm9iYWJseSBicmllZmx5IGJyb2tlbjsgYXNraW5nIGFnYWluIGluICR7U1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChyZXRyeSAke2F0dGVtcHRzfSBvZiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgbWF5IGhhdmUgYmVlbiByZW1vdmVkIHdoaWxlIHRoZSBsaXN0aW5nIHdhcyBpbiBmbGlnaHQ7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmIChzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybiBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBpbmRleFNpemVCZWZvcmUgPSB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBsZXQgbmV3UGF0aHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWVuLnNldChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIC8vIEVudHJpZXMgdGhpcyBzb3VyY2Ugd2FzIHRoZSBob2xkZXIgb2YsIGJ1dCB0aGF0IGl0cyBsaXN0aW5nIGRpZCBub3QgbWVudGlvbjogb3VyIG93biBkaXNrIHRha2VzIG92ZXIgYXMgaG9sZGVyIHdoZW4gaXQgaGFzIGEgY29weSwgYW5kIG9ubHkgd2l0aCBubyBsb2NhbCBjb3B5IGVpdGhlciBpcyB0aGUgZW50cnkgZm9yZ290dGVuIC0gd2Ugd2VyZSB3cm9uZyBhYm91dCB3aGVyZSB0aGUgZmlsZSBpcywgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGl0IGhhdmluZyBiZWVuIGRlbGV0ZWQuIEVudHJpZXMgY2hhbmdlZCBhZnRlciB0aGUgc2NhbiBzdGFydGVkIGFyZSBrZXB0OiB0aGUgbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBhcmUgbm90IHdhbGtlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZSB0aGV5IGFyZSBub3QgZmlsZXMgYSBsaXN0aW5nIGNvdWxkIHZvdWNoIGZvci5cbiAgICAgICAgbGV0IHJlbW92ZWRGcm9tSW5kZXggPSAwO1xuICAgICAgICBsZXQgcmVwb2ludGVkVG9Mb2NhbCA9IDA7XG4gICAgICAgIGxldCBtaXNzaW5nT25Tb3VyY2UgPSAwO1xuICAgICAgICBsZXQgc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ICYmIGVudHJ5LmNoYW5nZWRBdCA8IHNjYW5TdGFydCkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvaW50ZWRUb0xvY2FsKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRGcm9tSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50ZWQgb25seSB3aGVuIHRoZSBzb3VyY2UgU0hPVUxEIGhvbGQgdGhlIGVudHJ5IChpdHMgcm91dGUgbWF0Y2hlcykgLSB0aGVzZSBhcmUgd2hhdCB0aGUgcmVjb25jaWxlIHBhc3MgcHVzaGVzIHRvIGl0ICh3aGljaCBhbHNvIGlnbm9yZXMgdGhlIHZhbGlkIHdpbmRvdzogc3luY2hyb25pemF0aW9uIG1vdmVzIGV4aXN0aW5nIHZhbHVlcywgdGhlIHdpbmRvdyBvbmx5IHJvdXRlcyBmcmVzaCB3cml0ZXMpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgfVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIGxpc3RlZDogZmlsZXMubGVuZ3RoLCBpbmRleGVkQmVmb3JlOiBpbmRleFNpemVCZWZvcmUsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQsIG91dHNpZGVSb3V0ZTogdGFsbHkuZmlsdGVyZWQsIG1pc3NpbmdPblNvdXJjZSwgcmVwb2ludGVkVG9Mb2NhbCwgcmVtb3ZlZEZyb21JbmRleCB9KTtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgc3RhdGUuc2NhblN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBzZWVuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwdXNoIGRpcmVjdGlvbiBvZiBzeW5jaHJvbml6YXRpb246IGV2ZXJ5dGhpbmcgd2Uga25vdyB0aGF0IHRoZSBzb3VyY2UgaXMgbWlzc2luZyAob3IgaG9sZHMgYW4gb2xkZXIgY29weSBvZikgaXMgd3JpdHRlbiB0byBpdCDigJQgaW5jbHVkaW5nIGRlbGV0aW9ucywgYXMgdG9tYnN0b25lIHdyaXRlcy4gVGhpcyBpcyB3aGF0IGhlYWxzIGEgc291cmNlIHdob3NlIGJhY2tncm91bmQgd3JpdGVzIGZhaWxlZCAoZS5nLiBpdCB3YXMgZG93bik6IHRoZSBuZXh0IHNjYW4gc2VlcyB3aGF0J3MgbWlzc2luZyBhbmQgcmUtc2VuZHMgaXQuIEEgZmFpbGluZyBmaWxlIGlzIHNraXBwZWQsIG5vdCBmYXRhbCAoaW1tdXRhYmxlIHRhcmdldHMgYXJlIGhhbmRsZWQgYnkgZm9yY2VTZXRJbW11dGFibGUsIGFuZCBvbmUgdW5yZWFkYWJsZSB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IG9mIHRoZSBwYXNzKSAtIG9ubHkgYSBydW4gb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMgKHRoZSBzb3VyY2UgaXRzZWxmIGlzIGRvd24pIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBzY2FuIGN5Y2xlLlxuICAgIHByaXZhdGUgYXN5bmMgcHVzaFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3dzLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzKTtcbiAgICAgICAgbGV0IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgcHVzaGVkID0gMDtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmlsZXMgZmlyc3QsIHRoZW4gdGhlIGRlbGV0aW9ucyAtIHR3byB3YWxrcyBub3cgdGhhdCB0aGV5IGFyZSB0d28gbWFwcywgYW5kIHRoZSBkZWxldGlvbnMgb25lIGlzIHRoZSBzaG9ydCBvbmVcbiAgICAgICAgbGV0IHB1c2hhYmxlOiB7IGtleTogc3RyaW5nOyB3cml0ZVRpbWU6IG51bWJlcjsgZW50cnk/OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHRhcmdldFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGVudHJ5IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBwdXNoYWJsZS5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeyBrZXksIHdyaXRlVGltZSwgZW50cnkgfSBvZiBwdXNoYWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBub3QgcmVjb25jaWxlZDogaXQgcHJvcGFnYXRlcyBieSBiZWluZyBhc2tlZCBmb3IsIG9uIGl0cyBvd24gc2NoZWR1bGUgKHNlZSBwb2xsUm91dGluZ0NvbmZpZylcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjY2VwdHNXcml0ZXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gd3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbGV0aW9uIG9ubHkgbmVlZHMgcHVzaGluZyB3aGlsZSB0aGUgc291cmNlIHN0aWxsIGhvbGRzIGFuIG9sZGVyIGNvcHkuIEl0IHRyYXZlbHMgYXMgZGVsIChuZXZlciBhcyBhbiBlbXB0eSBzZXQgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKSwgd2l0aCB0aGUgT1JJR0lOQUwgZGVsZXRpb24gdGltZSBzbyBvcmRlcmluZyBzdXJ2aXZlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBzZXRcIiwga2V5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlciA9IGF3YWl0IHRoaXMuc3RvcmUuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICghaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogaG9sZGVyLCB0bzogc291cmNlLCBwYXRoOiBrZXksIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5kZWZpbmVkIGlzIHR3byBjYXNlcyAoc2VlIGNvcHlBcmNoaXZlRmlsZSkuIFRoZSBzb3VyY2UgaGF2aW5nIGEgTkVXRVIgZmlsZSB0aGFuIG91ciBpbmRleCAodGhlIGxpc3Rpbmcgd2UgcHVzaGVkIGZyb20gd2FzIHN0YWxlKSBpcyBhZG9wdGVkIGV4YWN0bHkgdGhlIHdheSB0aGUgcHVsbCBkaXJlY3Rpb24gYWRvcHRzIGEgbGlzdGluZyBlbnRyeSAtIGFuZCBwdXNoaW5nIG91ciBzdGFsZSBjb3B5IHN0b3BzLiBPdGhlcndpc2UgdGhlIEhPTERFUiBjb3VsZCBub3QgcHJvZHVjZSB0aGUgZmlsZSwgd2hpY2ggdGhlIG5leHQgcm91bmQncyBwdWxsIHJlLXJlc29sdmVzOyBlaXRoZXIgd2F5LCBzaWxlbmNlIGhlcmUgd2FzIHRoZSBidWcuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aGVpcnMgPSBhd2FpdCBzb3VyY2UuZ2V0SW5mbyhrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhlaXJzICYmIHRoZWlycy53cml0ZVRpbWUgPiB3cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiB0aGVpcnMud3JpdGVUaW1lLCBzaXplOiB0aGVpcnMuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGFyZ2V0U291cmNlc0xpc3RJbmRleCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInB1c2hGb3VuZE5ld2VyT25Tb3VyY2VcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBvdXJXcml0ZVRpbWU6IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKSwgdGhlaXJXcml0ZVRpbWU6IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQodGhlaXJzLndyaXRlVGltZSksIG91clNpemU6IGVudHJ5LnNpemUsIHRoZWlyU2l6ZTogdGhlaXJzLnNpemUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJwdXNoQ29weVVuYXZhaWxhYmxlXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgaG9sZGVyOiBob2xkZXIuZ2V0RGVidWdOYW1lKCksIGV4cGVjdGVkU2l6ZTogZW50cnkuc2l6ZSwgZXhwZWN0ZWRXcml0ZVRpbWU6IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKSwgc291cmNlSGFzOiB0aGVpcnMgJiYgYCR7dGhlaXJzLnNpemV9IGJ5dGVzIGF0ICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh0aGVpcnMud3JpdGVUaW1lKX1gIHx8IFwibm90aGluZ1wiIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBzZXRcIiwga2V5LCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkKys7XG4gICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoIDwgU1lOQ19FUlJPUl9MT0dfTElNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7a2V5fTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBIHBhdXNlIHBlciBmYWlsdXJlLCBzbyBhIGRvd24gbmV0d29yayB0YWtlcyBtaW51dGVzIHRvIGJ1cm4gdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2UgaW5zdGVhZCBvZiBhbiBpbnN0YW50XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU1lOQ19GQUlMVVJFX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZWNvbmNpbGluZyBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogcHVzaGVkICR7cHVzaGVkfSBmaWxlcywgJHtmYWlsZWR9IGZhaWxlZCR7YWJvcnRlZCAmJiBgIGJlZm9yZSBhYm9ydGluZyB0aGUgcGFzcyAoJHtjb25zZWN1dGl2ZUZhaWx1cmVzfSBjb25zZWN1dGl2ZSBmYWlsdXJlcyAtIHRoZSBzb3VyY2UgbG9va3MgZG93bjsgdGhlIG5leHQgc2NhbiBjeWNsZSByZXRyaWVzKWAgfHwgXCJcIn0uIEZpcnN0IGVycm9yczogJHtlcnJvcnMuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJyZWNvbmNpbGVGaW5pc2hcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcHVzaGVkLCBmYWlsZWQsIGFib3J0ZWQgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTY2FuSW5kZXgoc291cmNlSW5kZXg6IG51bWJlciwgZmlsZTogQXJjaGl2ZUZpbGVJbmZvKTogU2Nhbk91dGNvbWUge1xuICAgICAgICAvLyBBbiBpbi1mbGlnaHQgc2NhbiBjYW4gb3V0bGl2ZSBpdHMgc291cmNlJ3MgcmVtb3ZhbDsgaXRzIHJlc3VsdHMgYXJlIGRlYWRcbiAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShzb3VyY2VJbmRleCkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIGlmIChmaWxlLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIE5FVkVSIHB1bGxlZCBmcm9tIG90aGVyIHNvdXJjZXMgLSBpdCBvbmx5IGV2ZXIgYXJyaXZlcyBhcyBhbiBleHBsaWNpdCwgdmVyc2lvbi12YWxpZGF0ZWQgd3JpdGUsIGFuZCBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrLiBSb3V0ZSBhbmQgdmFsaWQtd2luZG93IGZpbHRlcnMgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gaXQgZWl0aGVyOiBpdCBpcyB0aGUgZmlsZSBERUZJTklORyB0aGVtLCBzbyBmaWx0ZXJpbmcgaXQgd291bGQgbWVhbiBjZXJ0YWluIHNvdXJjZXMgY291bGQgbmV2ZXIgaGF2ZSB0aGVpciByb3V0aW5nIGNvbmZpZyB1cGRhdGVkLCBldmVyLlxuICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ICE9PSAwKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHZhbGlkIHdpbmRvdyBpcyBkZWxpYmVyYXRlbHkgTk9UIGFwcGxpZWQgaGVyZTogaXQgZGVjaWRlcyB3aGVyZSBXUklURVMgcm91dGUsIGJ1dCBhIHNjYW4gaXMgdXMgYXNraW5nIGEgc291cmNlIHdoYXQgaXQgYWxyZWFkeSBob2xkcyAtIGV4aXN0aW5nIHZhbHVlcyBzeW5jaHJvbml6ZSByZWdhcmRsZXNzIG9mIHRoZSB3aW5kb3cgKHRoZSBzYW1lIHJlYXNvbmluZyB0aGF0IGxldHMgc3luY2hyb25pemF0aW9uIGlnbm9yZSB0aGUgaW1tdXRhYmxlIGZsYWcpLiBPbmx5IHRoZSByb3V0ZSBmaWx0ZXJzOiBhIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZCdzIGxpc3RpbmcgbGVnaXRpbWF0ZWx5IGluY2x1ZGVzIGtleXMgdGhhdCBhcmVuJ3Qgb3Vycy5cbiAgICAgICAgICAgIGxldCB7IHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShmaWxlLnBhdGgpKSkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoZmlsZS5wYXRoKTtcbiAgICAgICAgLy8gVGhlIGhpZ2hlc3Qgd3JpdGUgdGltZSB3aW5zIGFjcm9zcyBhbGwgc291cmNlcywgYW5kIGEgdGllIGtlZXBzIHdoYXQgd2UgaGF2ZSAtIG90aGVyd2lzZSBldmVyeSByZXNjYW4gb2YgYW4gdW5jaGFuZ2VkIGZpbGUgd291bGQgcmUtcmVjb3JkIGl0LCBtb3ZpbmcgaXRzIGhvbGRlciBhbmQgd3JpdGluZyBhIGxvZyByZWNvcmQgZm9yIG5vdGhpbmcuIGN1cnJlbnRXcml0ZVRpbWUgY291bnRzIGRlbGV0aW9ucywgc28gYSBsaXN0aW5nIHRoYXQgc3RpbGwgc2hvd3MgYSBmaWxlIHdlIGtub3cgd2FzIGRlbGV0ZWQgZG9lcyBub3QgcmVzdXJyZWN0IGl0LlxuICAgICAgICBpZiAoZmlsZS5jcmVhdGVUaW1lIDw9IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShmaWxlLnBhdGgpKSByZXR1cm4gXCJ1bmNoYW5nZWRcIjtcbiAgICAgICAgLy8gU2l6ZSAwIGluIGEgbGlzdGluZyBJUyBhIGRlbGV0aW9uIC0gYW4gZW1wdHkgZmlsZSBpcyBhIG1pc3NpbmcgZmlsZSAtIHNvIHRoYXQgaXMgd2hhdCBpdCBpcyB0YWtlbiBhc1xuICAgICAgICBpZiAoZmlsZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICByZXR1cm4gXCJ0b21ic3RvbmVcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogZmlsZS5jcmVhdGVUaW1lLCBzaXplOiBmaWxlLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCkgfSk7XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIFwidXBkYXRlZFwiO1xuICAgICAgICByZXR1cm4gXCJuZXdcIjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgcG9sbFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBhd2FpdCBzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyMih7IHRpbWU6IHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHJvdXRlczogcm91dGUgJiYgW3JvdXRlXSB8fCB1bmRlZmluZWQgfSk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICAvLyBQb2xscyBydW4gY29uc3RhbnRseSwgc28gb25seSB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGNoYW5nZWQgdGhlIGluZGV4IGdldCBhbiBlbnRyeVxuICAgICAgICBpZiAodGFsbHkubmV3IHx8IHRhbGx5LnVwZGF0ZWQgfHwgdGFsbHkudG9tYnN0b25lKSB7XG4gICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJjaGFuZ2VzUG9sbFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBjaGFuZ2VzOiBjaGFuZ2VzLmxlbmd0aCwgbmV3UGF0aHM6IHRhbGx5Lm5ldywgdXBkYXRlZDogdGFsbHkudXBkYXRlZCwgdG9tYnN0b25lczogdGFsbHkudG9tYnN0b25lLCB1bmNoYW5nZWQ6IHRhbGx5LnVuY2hhbmdlZCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgKz0gY2hhbmdlcy5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBwb2xsU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUDtcbiAgICB9XG5cbiAgICAvLyBEb3dubG9hZHMgdGhlIGZpbGVzIGEgc291cmNlIGN1cnJlbnRseSBob2xkcyBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgcHJlc2VydmluZyB0aGVpciBtb2RpZmllZCB0aW1lcyDigJQgc28gYSBuZXdlciBsb2NhbCB3cml0ZSBhbHdheXMgd2lucy4gU2tpcHBlZCBmb3Igbm9GdWxsU3luYyBzb3VyY2VzIChmcm9udGluZyBhIGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyBpdCk7IHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgbGF6aWx5LiBPbmx5IG9uZSBwYXNzIHBlciBTT1VSQ0UgcnVucyBhdCBhIHRpbWUgKGNhY2hlIGtleXMgdGhlIHNlcmlhbGl6ZXIgYnkgc291cmNlIGluZGV4KSAtIHR3byBwYXNzZXMgb3ZlciB0aGUgc2FtZSBwZW5kaW5nIGxpc3Qgd291bGQgZG93bmxvYWQgZXZlcnl0aGluZyB0d2ljZS5cbiAgICBwcml2YXRlIGNvcHlTb3VyY2VGaWxlcyA9IGNhY2hlKChzb3VyY2VJbmRleDogbnVtYmVyKSA9PiBydW5JblNlcmlhbChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBlbmRpbmc6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGxldCBjb3BpZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBjb3BpZWRTb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVsbFN5bmNcIixcbiAgICAgICAgICAgIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZG9uZUZpbGVzOiAwLFxuICAgICAgICAgICAgdG90YWxGaWxlczogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgICAgICBkb25lQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgZGlmZkJhc2VkOiBzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciwgZmlsZXM6IHBlbmRpbmcubGVuZ3RoLCBieXRlczogdG90YWxCeXRlcyB9KTtcbiAgICAgICAgbGV0IHByb2dyZXNzTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBsb2dQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyZXNzTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYERlbHRhIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHthY3Rpdml0eS5kb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeygoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpYCkpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKGxvZ1Byb2dyZXNzLCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgbGV0IHNsb3dFcnJvclRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lO1xuICAgICAgICAgICAgbGV0IGRvbmVGaWxlcyA9IGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGRvbmVCeXRlcyA9IGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGJ5dGVzUGVyU2Vjb25kID0gZG9uZUJ5dGVzIC8gKGVsYXBzZWQgLyAxMDAwKTtcbiAgICAgICAgICAgIGxldCByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXMgLSBkb25lQnl0ZXM7XG4gICAgICAgICAgICBsZXQgZXRhVGV4dCA9IFwidW5rbm93biAobm8gYnl0ZXMgdHJhbnNmZXJyZWQgeWV0KVwiO1xuICAgICAgICAgICAgaWYgKGJ5dGVzUGVyU2Vjb25kID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdNcyA9IHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNQZXJTZWNvbmQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIGV0YVRleHQgPSBgJHtmb3JtYXRUaW1lKHJlbWFpbmluZ01zKX0gcmVtYWluaW5nLCBjb21wbGV0aW5nIGFyb3VuZCAke25ldyBEYXRlKERhdGUubm93KCkgKyByZW1haW5pbmdNcykudG9JU09TdHJpbmcoKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBEZWx0YSBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSkgaGFzIGJlZW4gcnVubmluZyBmb3IgJHtmb3JtYXRUaW1lKGVsYXBzZWQpfTogJHtkb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeyhkb25lRmlsZXMgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoZG9uZUJ5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgZG9uZUJ5dGVzIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGJ5dGVzUGVyU2Vjb25kKX1CL3MuIEVzdGltYXRlZCAke2V0YVRleHR9LmApO1xuICAgICAgICB9LCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCk7XG4gICAgICAgIChzbG93RXJyb3JUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBsZXQgY29waWVkRmlsZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHNvdXJjZSBjYW5ub3QgZ2l2ZSB1cyB0aGUgZmlsZSAoaXRzIHJlYWQgaGFkIG5vdGhpbmcsIG9yIGl0IGVycm9yZWQpLiBSZXRyeWluZyB0aGUgc2FtZSBlbnRyeSBmb3JldmVyIGlzIG5vdCBhbiBhbnN3ZXI6IGlmIG91ciBvd24gZGlzayBob2xkcyBhIGNvcHksIElUIGJlY29tZXMgdGhlIGhvbGRlcjsgd2l0aCBubyBsb2NhbCBjb3B5IGVpdGhlciwgdGhlIGVudHJ5IGlzIHB1cmdlZCAtIGZvcmdvdHRlbiwgbm90IGRlbGV0ZWQsIGV4YWN0bHkgbGlrZSBhIHJlYWQgdGhhdCBjb21lcyB1cCBlbXB0eSBldmVyeXdoZXJlIC0gYW5kIHRoZSBuZXh0IGZ1bGwgcHVsbCByZS1maW5kcyBpdCBpZiBpdCBleGlzdHMgYW55d2hlcmUuXG4gICAgICAgIGxldCByZXNvbHZlVW5hdmFpbGFibGUgPSBhc3luYyAoZXZlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGVudHJ5OiBJbmRleEVudHJ5LCBleHRyYTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlID0geyBldmVudCwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIC4uLmV4dHJhIH07XG4gICAgICAgICAgICBsZXQgbG9jYWwgPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBsb2NhbCBjb3B5IGNhbiBiZSBORVdFUiB0aGFuIHRoZSBlbnRyeSAod2hpY2ggaXMgZXhhY3RseSB3aHkgY29weUFyY2hpdmVGaWxlIHJlZnVzZXMgdG8gb3ZlcndyaXRlIGl0IC0gc2VlIGl0cyBkZXN0aW5hdGlvbiBjaGVjayksIHNvIHRoZSByZXBvaW50IGtlZXBzIHRoZSBuZXdlciBvZiB0aGUgdHdvIHRpbWVzIHJhdGhlciB0aGFuIHJvbGxpbmcgdGhlIGluZGV4IGJhY2tcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogTWF0aC5tYXgoZW50cnkud3JpdGVUaW1lLCBsb2NhbC53cml0ZVRpbWUpLCBzaXplOiBsb2NhbC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgLi4uYmFzZSwgcmVzb2x1dGlvbjogXCJyZXBvaW50ZWQgdG8gb3VyIGxvY2FsIGNvcHlcIiwgbG9jYWxTaXplOiBsb2NhbC5zaXplLCBsb2NhbFdyaXRlVGltZTogZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChsb2NhbC53cml0ZVRpbWUpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSA8PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IC4uLmJhc2UsIHJlc29sdXRpb246IFwicHVyZ2VkIC0gbmVpdGhlciB0aGUgc291cmNlIG5vciBvdXIgZGlzayBoYXMgaXQsIHNvIGl0IGRvZXMgbm90IGV4aXN0XCIgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQSBuZXdlciB3cml0ZSBsYW5kZWQgd2hpbGUgd2Ugd2VyZSBjaGVja2luZyAtIHRoZSBlbnRyeSBpcyBubyBsb25nZXIgdGhlIG9uZSB3ZSBmb3VuZCB1bmF2YWlsYWJsZSwgc28gaXQgaXMgbGVmdCBhbG9uZVxuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgLi4uYmFzZSwgcmVzb2x1dGlvbjogXCJrZXB0IC0gYSBuZXdlciB3cml0ZSBhcHBlYXJlZCB3aGlsZSBjaGVja2luZ1wiLCBjdXJyZW50V3JpdGVUaW1lOiB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgbGV0IGNvcHlXb3JrZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFhYm9ydGVkICYmICF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG5leHRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsga2V5LCBlbnRyeSB9ID0gcGVuZGluZ1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogc291cmNlLCB0bzogdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZSwgcGF0aDoga2V5LCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcGllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZEZpbGVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkQnl0ZXMgKz0gY29waWVkLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwga2V5LCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvcHkgY2FycmllcyB0aGUgc291cmNlJ3Mgd3JpdGUgdGltZSwgYW5kIHRoZSBpbmRleCBjb21taXRzIGl0IHVuZGVyIHRoZSBub3JtYWwgb3JkZXJpbmcgcnVsZSAoPj0gdGhlIGN1cnJlbnQgdGltZSB3aW5zKSAtIGl0IHJlZnVzaW5nIG1lYW5zIGEgTkVXRVIgd3JpdGUgbGFuZGVkIHdoaWxlIHdlIGNvcGllZCwgd2hpY2ggbXVzdCBiZSBzYWlkLCBub3Qgc3dhbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgc2l6ZTogY29waWVkLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJkZWx0YVN5bmNDb21taXRTdXBlcnNlZGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgY29waWVkV3JpdGVUaW1lOiBjb3BpZWQud3JpdGVUaW1lLCBjdXJyZW50V3JpdGVUaW1lOiB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdPblNvdXJjZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlc29sdmVVbmF2YWlsYWJsZShcImRlbHRhU3luY01pc3NpbmdPblNvdXJjZVwiLCBrZXksIGVudHJ5LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBmYWlsaW5nIGZpbGUgcmVzb2x2ZXMgZXhhY3RseSBsaWtlIGEgbWlzc2luZyBvbmUgKHRoZSBzb3VyY2UgY2Fubm90IGdpdmUgaXQgdG8gdXMgZWl0aGVyIHdheSksIHNvIGl0IG5ldmVyIHdlZGdlcyB0aGUgcGFzcyBvbiByZXRyaWVzIGZvcmV2ZXIgLSBhbmQgdGhlIG5leHQgZnVsbCBwdWxsIHJlLWZpbmRzIGl0IGlmIHRoZSBzb3VyY2UgcmVjb3ZlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNvbHZlVW5hdmFpbGFibGUoXCJkZWx0YVN5bmNDb3B5RmFpbGVkXCIsIGtleSwgZW50cnksIHsgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyZXNvbHZlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJkZWx0YVN5bmNDb3B5RmFpbGVkXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHBhdGg6IGtleSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgMjAwMCksIHJlc29sdmVFcnJvcjogU3RyaW5nKChyZXNvbHZlRXJyb3IgYXMgRXJyb3IpLnN0YWNrID8/IHJlc29sdmVFcnJvcikuc2xpY2UoMCwgMjAwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcGF1c2UgcGVyIGZhaWx1cmUsIHNvIGEgZG93biBuZXR3b3JrIHRha2VzIG1pbnV0ZXMgdG8gYnVybiB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZG9uZUZpbGVzID0gKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVCeXRlcyA9IChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgKyBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgd29ya2VyczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKEZVTExfU1lOQ19QQVJBTExFTCwgcGVuZGluZy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJzLnB1c2goY29weVdvcmtlcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2xvd0Vycm9yVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmRlbGV0ZShhY3Rpdml0eSk7XG4gICAgICAgICAgICAvLyBBIHN5bmMgc2xvdyBlbm91Z2ggdG8gaGF2ZSBsb2dnZWQgcHJvZ3Jlc3MgYWxzbyBsb2dzIGl0cyBjb21wbGV0aW9uXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NMb2dnZWQpIHtcbiAgICAgICAgICAgICAgICBsb2dQcm9ncmVzcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZGVsdGFTeW5jRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGRpZmZCYXNlZDogc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWUsIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLCB0b3RhbEJ5dGVzLCBwcm9jZXNzZWRGaWxlczogYWN0aXZpdHkuZG9uZUZpbGVzLCBjb3BpZWRGaWxlcywgY29waWVkQnl0ZXMsIG1pc3NpbmdPblNvdXJjZSwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgLy8g4pSA4pSAIG1haW50ZW5hbmNlIOKUgOKUgFxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGl0IC0gYnV0IE9OTFkgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIGEgc2FtZS1vci1uZXdlciBjb3B5ICh0aGUgb25seSBjb3B5IG9mIGEgZmlsZSBpcyBuZXZlciBkZWxldGVkKSwgYW5kIHRoZSBpbmRleCBlbnRyeSByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBhc3luYyBlbmZvcmNlRGlza0xpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnN0b3JlLnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLnN0b3JlLmluZGV4VG90YWxzKCk7XG4gICAgICAgIC8vIENvdW50ZWQgZG93biBhcyB3ZSBldmljdCwgcmF0aGVyIHRoYW4gcmUtcmVhZCBwZXIgZmlsZTogYSBwYXNzIG9ubHkgZXZlciByZW1vdmVzIGJ5dGVzIGZyb20gdGhlIGRpc2ssIGFuZCBhbnl0aGluZyB3cml0dGVuIGR1cmluZyBpdCBpcyBwaWNrZWQgdXAgYnkgdGhlIG5leHQgcGFzc1xuICAgICAgICBsZXQgZGlza0J5dGVzID0gdG90YWxzLnNsb3RzWzBdLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKGRpc2tCeXRlcyA8PSBsaW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmV2aWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGV2aWN0ZWRGaWxlcyA9IDA7XG4gICAgICAgIGxldCBldmljdGVkQnl0ZXMgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXM6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXggfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZWFzdCByZWNlbnRseSBSRUFEIGZpcnN0OyBhIGtleSBub2JvZHkgaGFzIHJlYWQgc2luY2Ugd2Ugc3RhcnRlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4gdGhpcy5sYXN0QWNjZXNzLmdldCh4LmtleSkgfHwgeC5lbnRyeS5jaGFuZ2VkQXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbnRyeVVuY2hhbmdlZChrZXksIGVudHJ5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbaV0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmIGluZm8ud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBkb3duIHNvdXJjZSBqdXN0IGNhbid0IHZvdWNoIGZvciB0aGlzIGZpbGUgcmlnaHQgbm93XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvbGRlciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChob2xkZXIpIH0pO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIGRpc2tCeXRlcyAtPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5ldmljdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV2aWN0ZWRGaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEaXNrIGNhY2hlIG92ZXIgcmVhZGVyRGlza0xpbWl0IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGV2aWN0ZWQgJHtldmljdGVkRmlsZXN9IGxlYXN0LXJlY2VudGx5LXVzZWQgZmlsZXMgKCR7Zm9ybWF0TnVtYmVyKGV2aWN0ZWRCeXRlcyl9QiksIG5vdyBhdCAke2Zvcm1hdE51bWJlcihkaXNrQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIobGltaXQpfUJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWQgb25lcyBhcmUgZm9yZ290dGVuIGVudGlyZWx5LiBBIHdhbGsgb2YgdGhlIHRvbWJzdG9uZXMgYWxvbmUsIHdoaWNoIGlzIHdoeSBpdCBjYW4gcnVuIG9mdGVuIGFuZCBjb3N0IG5vdGhpbmcuIFRoZSBwaHlzaWNhbCBlbXB0eSBmaWxlIGlzIHJlbW92ZWQgb25seSBvbiBiYWNrYmxhemUgc291cmNlczogcmVtb3RlIHN0b3JlcyBleHBpcmUgdGhlaXIgb3duIHRvbWJzdG9uZXMgKGEgZGVsIHRoZXJlIHdvdWxkIGp1c3QgbWludCBhIGZyZXNoIG9uZSksIGFuZCBvdXIgb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgTUFSS0VEIGRlbGV0aW9uIG5ldmVyIGV4cGlyZXMgYnkgdGltZSAtIGl0cyBieXRlcyBhcmUgc3RpbGwgb24gZGlzaywgYW5kIHB1cmdpbmcgdGhlIHRvbWJzdG9uZSB3b3VsZCBsZXQgdGhlIG5leHQgZGlzayBzY2FuIHJlc3VycmVjdCB0aGVtIGFzIGxpdmUuIFJldGVudGlvbiBleHBpcmVzIGl0IGJ5IFNJWkUgKGVuZm9yY2VIaXN0b3J5TGltaXQpOyBvbmx5IG9uY2UgdGhlIGJ5dGVzIGFyZSBnb25lIGRvZXMgdGhlIHBsYWluIHRvbWJzdG9uZSBhZ2Ugb3V0IGhlcmUuXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRNYXJrZWRFbnRyeShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd3NBY2NlcHRXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlbGV0aW9uIGhpc3RvcnkgcmV0ZW50aW9uOiBtYXJrZWQgZmlsZXMga2VlcCB0aGVpciBieXRlcyBvbiBvdXIgZGlzayB1bnRpbCB0aGUgaGlzdG9yeSBvdXRncm93cyBtYXgoSElTVE9SWV9NSU5fQllURVMsIGxpdmUgYnl0ZXMgKiBoaXN0b3J5IGZhY3Rvcik7IHRoZW4gdGhlIE9MREVTVCBkZWxldGlvbnMgbG9zZSB0aGVpciBieXRlcyBhbmQgYmVjb21lIHBsYWluIHRvbWJzdG9uZXMsIHdoaWNoIGFnZSBvdXQgbm9ybWFsbHkgKGNsZWFudXBUb21ic3RvbmVzKVxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZUhpc3RvcnlMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChISVNUT1JZX01JTl9CWVRFUywgdGhpcy5zdG9yZS5pbmRleFRvdGFscygpLmJ5dGVDb3VudCAqIGF3YWl0IGdldEhpc3RvcnlGYWN0b3IoKSk7XG4gICAgICAgIGxldCBtYXJrZWQ6IHsga2V5OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZGVsZXRlVGltZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgbWFya2VkLnB1c2goeyBrZXksIHNpemU6IGVudHJ5LnNpemUsIGRlbGV0ZVRpbWU6IGVudHJ5LmRlbGV0ZVRpbWUgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPD0gYWxsb3dlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhcnRlZFdpdGhCeXRlcyA9IHRvdGFsQnl0ZXM7XG4gICAgICAgIHNvcnQobWFya2VkLCB4ID0+IHguZGVsZXRlVGltZSk7XG4gICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgbGV0IGRyb3BwZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IHsga2V5LCBzaXplIH0gb2YgbWFya2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5kcm9wTWFya2VkSGlzdG9yeShrZXkpO1xuICAgICAgICAgICAgdG90YWxCeXRlcyAtPSBzaXplO1xuICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgZHJvcHBlZEJ5dGVzICs9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW9uIGhpc3Rvcnkgb2Ygc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0gb3V0Z3JldyBpdHMgYnVkZ2V0ICgke2Zvcm1hdE51bWJlcihzdGFydGVkV2l0aEJ5dGVzKX1CIGtlcHQgdnMgJHtmb3JtYXROdW1iZXIoYWxsb3dlZCl9QiBhbGxvd2VkKTogZHJvcHBlZCB0aGUgJHtkcm9wcGVkfSBvbGRlc3QgbWFya2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihkcm9wcGVkQnl0ZXMpfUIpOyB0aGVpciB0b21ic3RvbmVzIHJlbWFpbiB1bnRpbCB0aGV5IGFnZSBvdXRgKTtcbiAgICB9XG59XG4iXX0=
828
+ /* _JS_SOURCE_HASH = "715cdf1cd6b39660a5e2eb4e207fb48d6dd1b1d164b8265bf17e0a735d727fbb"; */