sliftutils 1.7.105 → 1.7.107

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 (54) hide show
  1. package/dist/treeSummary.ts.cache +2 -2
  2. package/index.d.ts +7 -4
  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 +1 -1
  12. package/storage/dist/ArchivesDisk.ts.cache +3 -3
  13. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  14. package/storage/dist/IArchives.ts.cache +2 -2
  15. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  16. package/storage/dist/JSONStorage.ts.cache +2 -2
  17. package/storage/dist/PendingManager.tsx.cache +2 -2
  18. package/storage/dist/StreamingLogs.ts.cache +2 -2
  19. package/storage/dist/TransactionFile.ts.cache +2 -2
  20. package/storage/dist/TransactionStorage.ts.cache +2 -2
  21. package/storage/dist/archiveHelpers.ts.cache +2 -2
  22. package/storage/dist/backblaze.ts.cache +2 -2
  23. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  24. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  25. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
  26. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
  27. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
  28. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  29. package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
  30. package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
  31. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
  32. package/storage/remoteStorage/dist/chainStartup.ts.cache +2 -2
  33. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  34. package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
  35. package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
  36. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
  37. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  38. package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
  39. package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
  40. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
  41. package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
  42. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  43. package/storage/remoteStorage/dist/storageController.ts.cache +2 -2
  44. package/storage/remoteStorage/dist/storageLogs.ts.cache +61 -42
  45. package/storage/remoteStorage/dist/storageServerState.ts.cache +2 -2
  46. package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
  47. package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
  48. package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
  49. package/storage/remoteStorage/dist/storeSync.ts.cache +72 -61
  50. package/storage/remoteStorage/dist/validation.ts.cache +2 -2
  51. package/storage/remoteStorage/storageLogs.d.ts +3 -2
  52. package/storage/remoteStorage/storageLogs.ts +56 -35
  53. package/storage/remoteStorage/storeSync.d.ts +4 -2
  54. package/storage/remoteStorage/storeSync.ts +69 -56
@@ -45,6 +45,7 @@ function newSourceState() {
45
45
  supportsChangesAfter: false,
46
46
  initialScan: (0, misc_1.promiseObj)(),
47
47
  scanComplete: false,
48
+ scanSucceeded: false,
48
49
  scannedCount: 0,
49
50
  changesAfterTime: 0,
50
51
  stopped: { stop: false },
@@ -53,10 +54,6 @@ function newSourceState() {
53
54
  function newScanTally() {
54
55
  return { filtered: 0, new: 0, updated: 0, tombstone: 0, unchanged: 0 };
55
56
  }
56
- function formatScanTally(tally, total) {
57
- let pct = (n) => `${Math.round(n / Math.max(total, 1) * 1000) / 10}%`;
58
- return `${tally.new} new paths (${pct(tally.new)}), ${tally.updated} newer writes (${pct(tally.updated)}), ${tally.tombstone} deletions (${pct(tally.tombstone)}), ${tally.unchanged} unchanged (${pct(tally.unchanged)}), ${tally.filtered} outside route (${pct(tally.filtered)})`;
59
- }
60
57
  class StoreSync {
61
58
  constructor(store) {
62
59
  this.store = store;
@@ -193,12 +190,22 @@ class StoreSync {
193
190
  }
194
191
  /** Rescans our own disk's metadata into the index - used around valid window handoffs, where another process wrote files to the shared folder that our index hasn't seen. */
195
192
  async rescanBase() {
196
- await this.scanSource(0);
193
+ await this.syncSource(0);
194
+ }
195
+ /** One synchronization round of a source: the PULL direction always (its listing, applied to our index), and with "push" the push direction too (what our index says the source is missing, written to it). Push is an argument rather than a separate call because it cannot run without the pull's listing - the index alone cannot say what the source already holds. Listings unblock (initialScan) between the halves, so they never wait behind a push. */
196
+ async syncSource(sourceIndex, push) {
197
+ let listing = await this.pullSource(sourceIndex);
198
+ let state = this.states[sourceIndex];
199
+ state.scanComplete = true;
200
+ state.initialScan.resolve(undefined);
201
+ if (push && !this.store.stopped.stop && !state.stopped.stop) {
202
+ await this.pushSource(sourceIndex, listing);
203
+ }
197
204
  }
198
205
  /** A boundary scan of the node that owned (part of) our route in the valid window before ours, when that node is different storage (a disk rescan can't see its writes): just its changes since the boundary neighborhood, with matching values pulled onto our own disk. */
199
206
  async boundaryScanRemote(source, config) {
200
207
  let scanStart = Date.now();
201
- console.log(`Boundary scan of ${source.getDebugName()} starting: changes since ${new Date(config.since).toISOString()}, route ${JSON.stringify(config.route || IArchives_1.FULL_ROUTE)} (store ${this.store.folder})`);
208
+ (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanStart", store: this.store.folder, source: source.getDebugName(), since: config.since, route: config.route || IArchives_1.FULL_ROUTE });
202
209
  let changes = await source.getChangesAfter2({ time: config.since, routes: config.route && [config.route] || undefined });
203
210
  let tally = newScanTally();
204
211
  for (let file of changes) {
@@ -218,8 +225,10 @@ class StoreSync {
218
225
  continue;
219
226
  }
220
227
  let copied = await (0, archiveHelpers_1.copyArchiveFile)({ from: source, to: this.store.sources[0].source, path: file.path, size: file.size, writeTime: file.createTime, forceSetImmutable: true, noChecks: true, internal: true });
221
- if (!copied)
228
+ if (!copied) {
229
+ 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`);
222
230
  continue;
231
+ }
223
232
  this.store.noteSyncTransfer("sync get", file.path, copied.size);
224
233
  if (copied.size === 0) {
225
234
  this.store.setIndexDeleted(file.path, copied.writeTime);
@@ -234,17 +243,18 @@ class StoreSync {
234
243
  tally.new++;
235
244
  }
236
245
  }
237
- console.log(`Boundary scan of ${source.getDebugName()} finished in ${Math.round((Date.now() - scanStart) / 1000)}s (store ${this.store.folder}): ${changes.length} changes: ${formatScanTally(tally, changes.length)}`);
238
- (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanFinish", store: this.store.folder, source: source.getDebugName(), durationMs: Date.now() - scanStart, since: config.since, changes: changes.length, newPaths: tally.new, updated: tally.updated, tombstones: tally.tombstone });
246
+ (0, storageLogs_1.logSyncEvent)({ event: "boundaryScanFinish", store: this.store.folder, source: source.getDebugName(), durationMs: Date.now() - scanStart, since: config.since, changes: changes.length, newPaths: tally.new, updated: tally.updated, tombstones: tally.tombstone, unchanged: tally.unchanged });
239
247
  }
240
248
  // ── per-source loops ──
241
249
  async runSourceSync(sourceIndex) {
250
+ var _a;
242
251
  await this.store.registerSlot(sourceIndex);
243
252
  let { source } = this.store.sources[sourceIndex];
244
253
  let state = this.states[sourceIndex];
254
+ // If a slot ever gets TWO of these, its loops are doubled - every poll and full sync runs twice
255
+ (0, storageLogs_1.logSyncEvent)({ event: "sourceSyncStart", store: this.store.folder, source: source.getDebugName(), sourceIndex, url: this.store.sources[sourceIndex].url, intermediate: this.store.sources[sourceIndex].intermediate });
245
256
  // Read live for every pass, not captured - the store's source list can change while loops run
246
257
  let noFullSync = () => this.store.sources[sourceIndex].noFullSync;
247
- let listing;
248
258
  // An intermediate is a deploy switchover's temporary alternate PORT onto a source we already have: the same bucket, reachable another way for a few minutes. Scanning it would list exactly what scanning that source lists, against a port that is about to disappear - so it is never scanned, and the source it was split out of covers it for as long as it exists and after it is gone.
249
259
  if (this.store.sources[sourceIndex].intermediate) {
250
260
  state.scanComplete = true;
@@ -255,21 +265,19 @@ class StoreSync {
255
265
  try {
256
266
  let config = await source.getConfig();
257
267
  state.supportsChangesAfter = !!config.supportsChangesAfter;
258
- listing = await this.scanSource(sourceIndex);
268
+ await this.syncSource(sourceIndex, "push");
259
269
  break;
260
270
  }
261
271
  catch (e) {
262
- console.error(`Initial scan of sync source ${source.getDebugName()} failed, retrying:`, e);
272
+ (0, storageLogs_1.logSyncEvent)({ event: "initialScanFailed", store: this.store.folder, source: source.getDebugName(), retryInMs: SCAN_RETRY_DELAY, error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 2000) });
263
273
  await (0, batching_1.delay)(SCAN_RETRY_DELAY);
264
274
  }
265
275
  }
276
+ // The loop can also exit by the stop tokens, and nothing may wait forever on a stopped source's initial scan
266
277
  state.scanComplete = true;
267
278
  state.initialScan.resolve(undefined);
268
279
  if (this.store.stopped.stop || state.stopped.stop)
269
280
  return;
270
- if (listing) {
271
- await this.reconcileSource(sourceIndex, listing);
272
- }
273
281
  if (!noFullSync()) {
274
282
  try {
275
283
  await this.copySourceFiles(sourceIndex);
@@ -280,34 +288,29 @@ class StoreSync {
280
288
  }
281
289
  if (state.supportsChangesAfter) {
282
290
  (0, batching_1.runInfinitePoll)(CHANGES_POLL_INTERVAL, async () => {
291
+ // A scan that has not succeeded yet is retried HERE, before anything else - polling changes and copying against a never-scanned source would run on arbitrarily stale information
292
+ if (!state.scanSucceeded) {
293
+ await this.syncSource(sourceIndex, "push");
294
+ }
283
295
  await this.pollChanges(sourceIndex);
284
296
  if (!noFullSync())
285
297
  await this.copySourceFiles(sourceIndex);
286
298
  }, state.stopped);
287
- // Change polls only show what the source HAS, never what it's missing, so pushes run on the full-rescan cadence (findInfo on an index-backed source is cheap)
288
- (0, batching_1.runInfinitePoll)(FULL_RESCAN_INTERVAL, async () => {
289
- let files = await source.findInfo("");
290
- await this.reconcileSource(sourceIndex, new Map(files.map(x => [x.path, x.createTime])));
291
- }, state.stopped);
292
- }
293
- else {
294
- (0, batching_1.runInfinitePoll)(FULL_RESCAN_UNINDEXED_INTERVAL, async () => {
295
- let rescan = await this.scanSource(sourceIndex);
296
- await this.reconcileSource(sourceIndex, rescan);
297
- if (!noFullSync())
298
- await this.copySourceFiles(sourceIndex);
299
- }, state.stopped);
300
299
  }
300
+ (0, batching_1.runInfinitePoll)(FULL_RESCAN_UNINDEXED_INTERVAL, async () => {
301
+ await this.syncSource(sourceIndex, "push");
302
+ if (!noFullSync())
303
+ await this.copySourceFiles(sourceIndex);
304
+ }, state.stopped);
301
305
  }
302
- // Full metadata scan (size, writeTime, path) of one source, applied to the index. Returns the source's listing (path -> write time), which reconcileSource uses for the push direction.
303
- async scanSource(sourceIndex) {
306
+ // The PULL direction: a full metadata scan (size, writeTime, path) of one source, applied to our index. Returns the source's listing (path -> write time), which pushSource uses for the opposite direction.
307
+ async pullSource(sourceIndex) {
304
308
  var _a, _b;
305
309
  let { source, route } = this.store.sources[sourceIndex];
306
310
  let state = this.states[sourceIndex];
307
311
  let scanStart = Date.now();
308
312
  let activity = { type: "metadataScan", sourceDebugName: source.getDebugName(), startTime: scanStart };
309
313
  this.activities.add(activity);
310
- console.log(`Metadata scan of ${source.getDebugName()} starting (store ${this.store.folder})`);
311
314
  (0, storageLogs_1.logSyncEvent)({ event: "scanStart", store: this.store.folder, source: source.getDebugName() });
312
315
  let progressTimer = setInterval(() => {
313
316
  console.log(`Metadata scan of ${source.getDebugName()} still running (${Math.round((Date.now() - scanStart) / 1000)}s, store ${this.store.folder})`);
@@ -378,16 +381,13 @@ class StoreSync {
378
381
  continue;
379
382
  missingOnSource++;
380
383
  }
381
- // Percentages are of the union of both sides (our index + their listing), so every count has a stable denominator
382
- let union = indexSizeBefore + newPaths;
383
- let pct = (n) => `${Math.round(n / Math.max(union, 1) * 1000) / 10}%`;
384
- console.log(`Metadata scan of ${source.getDebugName()} finished in ${Math.round((Date.now() - scanStart) / 1000)}s (store ${this.store.folder}): ${files.length} listed vs ${indexSizeBefore} indexed (union ${union}): ${formatScanTally(tally, union)}, ${missingOnSource} in index but missing on source (${pct(missingOnSource)}), ${removedFromIndex} removed from index (${pct(removedFromIndex)})`);
385
- (0, storageLogs_1.logSyncEvent)({ event: "scanFinish", store: this.store.folder, source: source.getDebugName(), durationMs: Date.now() - scanStart, listed: files.length, indexedBefore: indexSizeBefore, newPaths: tally.new, updated: tally.updated, tombstones: tally.tombstone, missingOnSource, removedFromIndex });
384
+ (0, storageLogs_1.logSyncEvent)({ event: "scanFinish", store: this.store.folder, source: source.getDebugName(), durationMs: Date.now() - scanStart, listed: files.length, indexedBefore: indexSizeBefore, newPaths: tally.new, updated: tally.updated, tombstones: tally.tombstone, unchanged: tally.unchanged, outsideRoute: tally.filtered, missingOnSource, removedFromIndex });
386
385
  state.changesAfterTime = Math.max(state.changesAfterTime, scanStart - CHANGES_POLL_OVERLAP);
386
+ state.scanSucceeded = true;
387
387
  return seen;
388
388
  }
389
389
  // The push direction of synchronization: everything we know that the source is missing (or holds an older copy of) is written to it — including deletions, as tombstone writes. This is what heals a source whose background writes failed (e.g. it was down): the next scan sees what's missing and re-sends it. A failing file is skipped, not fatal (immutable targets are handled by forceSetImmutable, and one unreadable value must not stop the rest of the pass) - only a run of consecutive failures (the source itself is down) aborts until the next scan cycle.
390
- async reconcileSource(sourceIndex, listing) {
390
+ async pushSource(sourceIndex, listing) {
391
391
  var _a;
392
392
  let { source, validWindows, route } = this.store.sources[sourceIndex];
393
393
  let state = this.states[sourceIndex];
@@ -459,12 +459,7 @@ class StoreSync {
459
459
  if (failed) {
460
460
  console.error(`Reconciling sync source ${source.getDebugName()} (store ${this.store.folder}): pushed ${pushed} files, ${failed} failed${aborted && ` before aborting the pass (${consecutiveFailures} consecutive failures - the source looks down; the next scan cycle retries)` || ""}. First errors: ${errors.join(" | ")}`);
461
461
  }
462
- else if (pushed) {
463
- console.log(`Reconciled sync source ${source.getDebugName()} (store ${this.store.folder}): pushed ${pushed} files it was missing or held older copies of`);
464
- }
465
- if (pushed || failed) {
466
- (0, storageLogs_1.logSyncEvent)({ event: "reconcileFinish", store: this.store.folder, source: source.getDebugName(), pushed, failed, aborted });
467
- }
462
+ (0, storageLogs_1.logSyncEvent)({ event: "reconcileFinish", store: this.store.folder, source: source.getDebugName(), pushed, failed, aborted });
468
463
  }
469
464
  updateScanIndex(sourceIndex, file) {
470
465
  // An in-flight scan can outlive its source's removal; its results are dead
@@ -504,9 +499,9 @@ class StoreSync {
504
499
  for (let file of changes) {
505
500
  tally[this.updateScanIndex(sourceIndex, file)]++;
506
501
  }
507
- // Polls run constantly, so only the ones that actually changed the index get a line
502
+ // Polls run constantly, so only the ones that actually changed the index get an entry
508
503
  if (tally.new || tally.updated || tally.tombstone) {
509
- console.log(`Changes poll of ${source.getDebugName()} (store ${this.store.folder}): ${changes.length} changes: ${formatScanTally(tally, changes.length)}`);
504
+ (0, storageLogs_1.logSyncEvent)({ event: "changesPoll", store: this.store.folder, source: source.getDebugName(), changes: changes.length, newPaths: tally.new, updated: tally.updated, tombstones: tally.tombstone, unchanged: tally.unchanged });
510
505
  }
511
506
  state.scannedCount += changes.length;
512
507
  state.changesAfterTime = pollStart - CHANGES_POLL_OVERLAP;
@@ -539,7 +534,7 @@ class StoreSync {
539
534
  totalBytes,
540
535
  };
541
536
  this.activities.add(activity);
542
- (0, storageLogs_1.logSyncEvent)({ event: "fullSyncStart", store: this.store.folder, source: source.getDebugName(), files: pending.length, bytes: totalBytes });
537
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncStart", store: this.store.folder, source: source.getDebugName(), diffBased: state.supportsChangesAfter, files: pending.length, bytes: totalBytes });
543
538
  let progressLogged = false;
544
539
  let logProgress = () => {
545
540
  progressLogged = true;
@@ -561,12 +556,14 @@ class StoreSync {
561
556
  console.warn(`Full sync from ${source.getDebugName()} (store ${this.store.folder}) has been running for ${(0, format_1.formatTime)(elapsed)}: ${doneFiles}/${pending.length} files (${(doneFiles / pending.length * 100).toFixed(1)}%), ${(0, format_1.formatNumber)(doneBytes)}B/${(0, format_1.formatNumber)(totalBytes)}B (${(totalBytes && doneBytes / totalBytes * 100 || 100).toFixed(1)}%), ${(0, format_1.formatNumber)(bytesPerSecond)}B/s. Estimated ${etaText}.`);
562
557
  }, FULL_SYNC_SLOW_ERROR_INTERVAL);
563
558
  (_d = (_c = slowErrorTimer).unref) === null || _d === void 0 ? void 0 : _d.call(_c);
559
+ let failed = 0;
560
+ let copiedFiles = 0;
561
+ let copiedBytes = 0;
562
+ let missingOnSource = 0;
563
+ let aborted = false;
564
564
  try {
565
565
  let nextIndex = 0;
566
- let failed = 0;
567
566
  let consecutiveFailures = 0;
568
- let errors = [];
569
- let aborted = false;
570
567
  let copyWorker = async () => {
571
568
  var _a;
572
569
  while (!aborted && !this.store.stopped.stop && !state.stopped.stop) {
@@ -577,10 +574,29 @@ class StoreSync {
577
574
  try {
578
575
  let copied = await (0, archiveHelpers_1.copyArchiveFile)({ from: source, to: this.store.sources[0].source, path: key, size: entry.size, writeTime: entry.writeTime, forceSetImmutable: true, noChecks: true, internal: true });
579
576
  if (copied) {
577
+ copiedFiles++;
578
+ copiedBytes += copied.size;
580
579
  this.store.noteSyncTransfer("sync get", key, copied.size);
581
- // Only move the entry's source if it wasn't changed while we copied
582
- if (this.entryUnchanged(key, entry)) {
583
- this.store.setIndexEntry(key, { writeTime: copied.writeTime, size: copied.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
580
+ // The copy carries the source's write time, and the index commits it under the normal ordering rule (>= the current time wins) - it refusing means a NEWER write landed while we copied, which must be said, not swallowed
581
+ if (!this.store.setIndexEntry(key, { writeTime: copied.writeTime, size: copied.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) })) {
582
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncCommitSuperseded", store: this.store.folder, source: source.getDebugName(), path: key, copiedWriteTime: copied.writeTime, currentWriteTime: this.store.currentWriteTime(key) });
583
+ }
584
+ }
585
+ else {
586
+ missingOnSource++;
587
+ // The source's listing vouched for the file but its read has nothing - and asking again forever is not an answer. If our own disk holds a copy, IT is the real holder, so the entry repoints there; if neither side has bytes, the entry was simply wrong, and it is purged - forgotten, not deleted, exactly like a read that comes up empty everywhere (a scan re-finds the file if it exists anywhere else).
588
+ let local = await this.store.sources[0].source.getInfo(key);
589
+ if (local) {
590
+ this.store.setIndexEntry(key, { writeTime: entry.writeTime, size: local.size, sourcesListIndex: this.store.sourcesListIndexOfSlot(0) });
591
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncMissingOnSource", store: this.store.folder, source: source.getDebugName(), path: key, expectedSize: entry.size, expectedWriteTime: entry.writeTime, resolution: "repointed to our local copy", localSize: local.size });
592
+ }
593
+ else if (this.store.currentWriteTime(key) <= entry.writeTime) {
594
+ this.store.purgeIndexEntry(key);
595
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncMissingOnSource", store: this.store.folder, source: source.getDebugName(), path: key, expectedSize: entry.size, expectedWriteTime: entry.writeTime, resolution: "purged - neither the source nor our disk has it, so it does not exist" });
596
+ }
597
+ else {
598
+ // A newer write landed while we were checking - the entry is no longer the one we found missing, so it is left alone
599
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncMissingOnSource", store: this.store.folder, source: source.getDebugName(), path: key, expectedSize: entry.size, expectedWriteTime: entry.writeTime, resolution: "kept - a newer write appeared while checking", currentWriteTime: this.store.currentWriteTime(key) });
584
600
  }
585
601
  }
586
602
  consecutiveFailures = 0;
@@ -589,9 +605,7 @@ class StoreSync {
589
605
  // One failing file must not abort the sync: it stays on its source (reads still reach it there), and the next sync pass retries it
590
606
  failed++;
591
607
  consecutiveFailures++;
592
- if (errors.length < SYNC_ERROR_LOG_LIMIT) {
593
- errors.push(`${key}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
594
- }
608
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncCopyFailed", store: this.store.folder, source: source.getDebugName(), path: key, size: entry.size, error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 2000) });
595
609
  if (consecutiveFailures >= SYNC_MAX_CONSECUTIVE_FAILURES) {
596
610
  aborted = true;
597
611
  return;
@@ -608,9 +622,6 @@ class StoreSync {
608
622
  workers.push(copyWorker());
609
623
  }
610
624
  await Promise.all(workers);
611
- if (failed) {
612
- console.error(`Full sync from ${source.getDebugName()} (store ${this.store.folder}): ${failed} of ${pending.length} files failed to copy${aborted && ` before aborting the pass (${SYNC_MAX_CONSECUTIVE_FAILURES} consecutive failures - the source looks down; the next sync pass retries)` || " (they stay on their source, and the next sync pass retries them)"}. First errors: ${errors.join(" | ")}`);
613
- }
614
625
  }
615
626
  finally {
616
627
  clearInterval(progressTimer);
@@ -620,7 +631,7 @@ class StoreSync {
620
631
  if (progressLogged) {
621
632
  logProgress();
622
633
  }
623
- (0, storageLogs_1.logSyncEvent)({ event: "fullSyncFinish", store: this.store.folder, source: source.getDebugName(), durationMs: Date.now() - activity.startTime, copiedFiles: activity.doneFiles, copiedBytes: activity.doneBytes, totalFiles: pending.length, totalBytes });
634
+ (0, storageLogs_1.logSyncEvent)({ event: "fullSyncFinish", store: this.store.folder, source: source.getDebugName(), diffBased: state.supportsChangesAfter, durationMs: Date.now() - activity.startTime, totalFiles: pending.length, totalBytes, processedFiles: activity.doneFiles, copiedFiles, copiedBytes, missingOnSource, failed, aborted });
624
635
  }
625
636
  }
626
637
  // ── maintenance ──
@@ -742,5 +753,5 @@ class StoreSync {
742
753
  }
743
754
  }
744
755
  exports.StoreSync = StoreSync;
745
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUFzRTtBQUN0RSxtREFBMEU7QUFDMUUsa0VBQWlGO0FBQ2pGLDRDQUdzQjtBQUN0QixzREFBb0Q7QUFDcEQsNENBQWlEO0FBQ2pELGlEQUEyRztBQUUzRywyQ0FBa0U7QUFDbEUsK0NBQTZDO0FBQzdDLHdFQUFtRTtBQUVuRSxrYkFBa2I7QUFFbGIseUVBQXlFO0FBQ3pFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxtTUFBbU07QUFDbk0sTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQyxrUUFBa1E7QUFDbFEsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QyxNQUFNLDhCQUE4QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxRCxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxvTEFBb0w7QUFDcEwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsbUZBQW1GO0FBQ25GLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM3QyxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDNUMsd0lBQXdJO0FBQ3hJLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLDhLQUE4SztBQUM5SyxNQUFNLDZCQUE2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SUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUNwQyxJQUFJLFVBQVUsSUFBSSxPQUFPO2dCQUFFLE1BQU07WUFDakMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLFVBQVUsSUFBSSxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixZQUFZLElBQUksSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sd0JBQXdCLElBQUEscUJBQVksRUFBQyxnQkFBZ0IsQ0FBQyxhQUFhLElBQUEscUJBQVksRUFBQyxPQUFPLENBQUMsMkJBQTJCLE9BQU8seUJBQXlCLElBQUEscUJBQVksRUFBQyxZQUFZLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUM3UixDQUFDO0NBQ0o7QUE1bkJELDhCQTRuQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwsIGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSwgc29ydCwgcHJvbWlzZU9iaiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1N5bmNTdGF0dXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSxcbiAgICB3aW5kb3dzQWNjZXB0V3JpdGVzLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBjb3B5QXJjaGl2ZUZpbGUgfSBmcm9tIFwiLi4vYXJjaGl2ZUhlbHBlcnNcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VSb3V0aW5nRGF0YSwgZ2V0Q29uZmlnVmVyc2lvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBCbG9iU3RvcmUsIEluZGV4RW50cnkgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7IGdldEhpc3RvcnlGYWN0b3IsIEhJU1RPUllfTUlOX0JZVEVTIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBsb2dTeW5jRXZlbnQgfSBmcm9tIFwiLi9zdG9yYWdlTG9nc1wiO1xuaW1wb3J0IHsgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5cbi8vIEV2ZXJ5dGhpbmcgdGhhdCBrZWVwcyBhIHN0b3JlJ3MgaW5kZXggaW4gYWdyZWVtZW50IHdpdGggaXRzIHNvdXJjZXMsIHBsdXMgdGhlIHR3byBtYWludGVuYW5jZSBsb29wcyB0aGF0IGZvbGxvdyBmcm9tIGhvbGRpbmcgYW4gaW5kZXggKGV2aWN0aW5nIGEgYm91bmRlZCBkaXNrIGNhY2hlLCBleHBpcmluZyB0b21ic3RvbmVzKS4gVGhlIHN0b3JlIG93bnMgdGhlIHNvdXJjZXMgYW5kIGRlY2lkZXMgd2hlcmUgd3JpdGVzIGdvOyB0aGlzIGRlY2lkZXMgd2hhdCBpcyBzY2FubmVkLCBwdWxsZWQsIHB1c2hlZCwgZXZpY3RlZCwgYW5kIGZvcmdvdHRlbiAtIHNvIHRoZSB3cml0ZSBwYXRoIHN0YXlzIHJlYWRhYmxlIHdpdGhvdXQgdGhlIHNldmVyYWwgaHVuZHJlZCBsaW5lcyBvZiBzeW5jaHJvbml6YXRpb24gbWFjaGluZXJ5IGludGVybGVhdmVkIGludG8gaXQuXG5cbi8vIFNvdXJjZXMgd2l0aCBhIG5hdGl2ZSAoaW5kZXgtYmFja2VkKSBjaGFuZ2UgZmVlZCBhcmUgcG9sbGVkIHRoaXMgb2Z0ZW5cbmNvbnN0IENIQU5HRVNfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBjaGVja2VkIGZvciBvbiBldmVyeSBwZWVyIHRoaXMgb2Z0ZW4gLSBmYXIgbW9yZSBvZnRlbiB0aGFuIGEgZnVsbCByZXNjYW4sIGJlY2F1c2UgaXQgaXMgdGhlIGZpbGUgdGhhdCBkZWNpZGVzIHdoYXQgZXZlcnl0aGluZyBlbHNlIGRvZXMsIGFuZCBpdCBpcyBvbmUgc21hbGwgcmVhZCBwZXIgcGVlclxuY29uc3QgQ09ORklHX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjAgKiA1O1xuLy8gRnVsbCBtZXRhZGF0YSByZXNjYW5zLiBzdXBwb3J0c0NoYW5nZXNBZnRlciBpcyB0aGUgaGV1cmlzdGljIGZvciBcIm9uZSBvZiBvdXIgb3duIHN0b3JhZ2Ugc2VydmVyc1wiOiB0aGVpciBpbmRleC1iYWNrZWQgbGlzdGluZ3MgYXJlIGNoZWFwLCBzbyBob3VybHkgaXMgZmluZS4gRXZlcnl0aGluZyBlbHNlIChiYWNrYmxhemUsIHBsYWluIGRpc2spIHBheXMgdGhlIGZ1bGwgbGlzdGluZyBjb3N0LCBzbyBpdCByZXNjYW5zIG11Y2ggbGVzcyBvZnRlbi5cbmNvbnN0IEZVTExfUkVTQ0FOX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG5jb25zdCBGVUxMX1JFU0NBTl9VTklOREVYRURfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MCAqIDY7XG4vLyBDaGFuZ2UgcG9sbHMgcmUtcmVxdWVzdCB0aGlzIG11Y2ggb3ZlcmxhcCwgc28gY2xvY2sgc2tldyBiZXR3ZWVuIHVzIGFuZCBhIHNvdXJjZSBjYW4ndCBkcm9wIGNoYW5nZXNcbmNvbnN0IENIQU5HRVNfUE9MTF9PVkVSTEFQID0gdGltZUluTWludXRlO1xuY29uc3QgU0NBTl9SRVRSWV9ERUxBWSA9IDEwMDAgKiAzMDtcbi8vIERlbGV0ZXMgYXJlIHRvbWJzdG9uZXMgKGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpOiB0aGUgc2l6ZS0wIGluZGV4IGVudHJ5IGlzIHdoYXQgbGV0cyBhIGRlbGV0aW9uIHByb3BhZ2F0ZS9yZWNvbmNpbGUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIGFuZCBpdCBleHBpcmVzIGFmdGVyIHRoaXMgbG9uZ1xuY29uc3QgVE9NQlNUT05FX0VYUElSWSA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiA3O1xuY29uc3QgVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFdoaWxlIGEgbWV0YWRhdGEgc2NhbiBvciBmdWxsIHN5bmMgaXMgcnVubmluZywgaXRzIHByb2dyZXNzIGlzIGxvZ2dlZCB0aGlzIG9mdGVuXG5jb25zdCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbmNvbnN0IERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBGdWxsIHN5bmNzIGRvd25sb2FkIHRoaXMgbWFueSBmaWxlcyBjb25jdXJyZW50bHkgKGhpZ2gtbGF0ZW5jeSBzb3VyY2VzIGxpa2UgYmFja2JsYXplIHdvdWxkIG90aGVyd2lzZSBjcmF3bCBvbmUgcm91bmQtdHJpcCBhdCBhIHRpbWUpXG5jb25zdCBGVUxMX1NZTkNfUEFSQUxMRUwgPSA4O1xuLy8gQSBmdWxsIHN5bmMgcnVubmluZyBsb25nZXIgdGhhbiB0aGlzIGlzIGNvbnNvbGUuZXJyb3JlZCAoYW5kIGFnYWluIGV2ZXJ5IGludGVydmFsIGFmdGVyKSwgc28gYSBzeW5jIHRoYXQgd2lsbCB0YWtlIGRheXMgaXMgbG91ZCBpbnN0ZWFkIG9mIGEgcXVpZXQgY29uc29sZS5sb2cgZXZlcnkgbWludXRlXG5jb25zdCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gUmVjb25jaWxlIHBhc3NlcyBBTkQgZnVsbCBzeW5jcyBza2lwIGZhaWxpbmcgZmlsZXMgKG9uZSBiYWQgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCAtIGEgc291cmNlIGZhaWxpbmcgb25lIHJlcXVlc3QgaW4gYSB0aG91c2FuZCBjb3VsZCBvdGhlcndpc2UgbmV2ZXIgZmluaXNoIGEgc3luYyksIGJ1dCB0aGlzIG1hbnkgZmFpbHVyZXMgaW4gYSByb3cgbWVhbnMgdGhlIG90aGVyIHNpZGUgaXRzZWxmIGlzIGRvd24sIHNvIHRoZSBwYXNzIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBjeWNsZVxuY29uc3QgU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMgPSA1O1xuY29uc3QgU1lOQ19FUlJPUl9MT0dfTElNSVQgPSAzO1xuLy8gRXZlcnkgZmFpbGVkIGZpbGUgd2FpdHMgdGhpcyBsb25nIGJlZm9yZSB0aGUgcGFzcyBjb250aW51ZXMsIHNvIGEgZG93biBuZXR3b3JrIGJ1cm5zIHRocm91Z2ggdGhlIGNvbnNlY3V0aXZlLWZhaWx1cmUgYWxsb3dhbmNlIG92ZXIgYSBtaW51dGUtcGx1cyBpbnN0ZWFkIG9mIGluIGFuIGluc3RhbnRcbmNvbnN0IFNZTkNfRkFJTFVSRV9ERUxBWSA9IDEwMDAgKiAxNTtcbi8vIEEgZnVsbCBsaXN0aW5nIHRoYXQgY29tZXMgYmFjayBFTVBUWSAtIG9yIHVuZGVyIGhhbGYgb2Ygd2hhdCB3ZSBrbm93IHRoZSBzb3VyY2UgaG9sZHMgLSBpcyB0cmVhdGVkIGFzIHRoZSBvdGhlciBlbmQgYmVpbmcgYnJpZWZseSBicm9rZW4sIG5vdCBhcyB0aGUgdHJ1dGg6IGl0IGlzIHJldHJpZWQgdGhpcyBtYW55IHRpbWVzLCB0aGlzIGZhciBhcGFydCwgYmVmb3JlIGJlaW5nIGJlbGlldmVkLiBCZWxpZXZpbmcgYSB3cm9uZ2x5LXNocnVua2VuIGxpc3RpbmcgcHVyZ2VzIGV2ZXJ5IGluZGV4IGVudHJ5IHRoZSBzb3VyY2UgaGVsZCwgd2hpY2ggaXMgaG93IHN5bmMgcHJvZ3Jlc3MgXCJnb2VzIGJhY2t3YXJkc1wiLlxuY29uc3QgU1VTUElDSU9VU19TQ0FOX1JFVFJJRVMgPSAzO1xuY29uc3QgU1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDYwO1xuXG50eXBlIFNvdXJjZVN0YXRlID0ge1xuICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBib29sZWFuO1xuICAgIGluaXRpYWxTY2FuOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9taXNlT2JqPjtcbiAgICBzY2FuQ29tcGxldGU6IGJvb2xlYW47XG4gICAgLy8gRmlsZXMgc2VlbiBpbiB0aGlzIHNvdXJjZSdzIHNjYW5zIC8gY2hhbmdlIHBvbGxzIHNvIGZhclxuICAgIHNjYW5uZWRDb3VudDogbnVtYmVyO1xuICAgIC8vIFdhdGVybWFyayBmb3IgZ2V0Q2hhbmdlc0FmdGVyMiBwb2xsc1xuICAgIGNoYW5nZXNBZnRlclRpbWU6IG51bWJlcjtcbiAgICAvLyBQZXItc2xvdCBzdG9wIHRva2VuOiBhIHJlbW92ZWQgc291cmNlJ3MgbG9vcHMgc3RvcCB3aXRob3V0IHRvdWNoaW5nIHRoZSByZXN0IG9mIHRoZSBzdG9yZVxuICAgIHN0b3BwZWQ6IHsgc3RvcDogYm9vbGVhbiB9O1xuICAgIC8vIEEgcmVtb3ZlZCBzb3VyY2UncyBzbG90IHN0YXlzIGluIHRoZSBhcnJheXMgKHRoZXkgYXJlIG5ldmVyIHNwbGljZWQsIHNvIHNsb3QgbnVtYmVycyBoZWxkIGJ5IHJ1bm5pbmcgbG9vcHMgc3RheSBtZWFuaW5nZnVsKSwgbWFya2VkIGRlYWQgLSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiBJbmRleCBlbnRyaWVzIGRvbid0IHJlZmVyZW5jZSBzbG90cyBhdCBhbGw7IHRoZXkgcGVyc2lzdCB0aGUgc291cmNlcyBsaXN0J3Mgc291cmNlc0xpc3RJbmRleC5cbiAgICBkZWFkPzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIG5ld1NvdXJjZVN0YXRlKCk6IFNvdXJjZVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogZmFsc2UsXG4gICAgICAgIGluaXRpYWxTY2FuOiBwcm9taXNlT2JqKCksXG4gICAgICAgIHNjYW5Db21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHNjYW5uZWRDb3VudDogMCxcbiAgICAgICAgY2hhbmdlc0FmdGVyVGltZTogMCxcbiAgICAgICAgc3RvcHBlZDogeyBzdG9wOiBmYWxzZSB9LFxuICAgIH07XG59XG5cbi8vIFdoYXQgYSBzY2FubmVkIGxpc3RpbmcgZW50cnkgbWVhbnQgd2hlbiBjb21wYXJlZCBhZ2FpbnN0IG91ciBpbmRleFxudHlwZSBTY2FuT3V0Y29tZSA9IFwiZmlsdGVyZWRcIiB8IFwibmV3XCIgfCBcInVwZGF0ZWRcIiB8IFwidG9tYnN0b25lXCIgfCBcInVuY2hhbmdlZFwiO1xudHlwZSBTY2FuVGFsbHkgPSBSZWNvcmQ8U2Nhbk91dGNvbWUsIG51bWJlcj47XG5mdW5jdGlvbiBuZXdTY2FuVGFsbHkoKTogU2NhblRhbGx5IHtcbiAgICByZXR1cm4geyBmaWx0ZXJlZDogMCwgbmV3OiAwLCB1cGRhdGVkOiAwLCB0b21ic3RvbmU6IDAsIHVuY2hhbmdlZDogMCB9O1xufVxuZnVuY3Rpb24gZm9ybWF0U2NhblRhbGx5KHRhbGx5OiBTY2FuVGFsbHksIHRvdGFsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCBwY3QgPSAobjogbnVtYmVyKSA9PiBgJHtNYXRoLnJvdW5kKG4gLyBNYXRoLm1heCh0b3RhbCwgMSkgKiAxMDAwKSAvIDEwfSVgO1xuICAgIHJldHVybiBgJHt0YWxseS5uZXd9IG5ldyBwYXRocyAoJHtwY3QodGFsbHkubmV3KX0pLCAke3RhbGx5LnVwZGF0ZWR9IG5ld2VyIHdyaXRlcyAoJHtwY3QodGFsbHkudXBkYXRlZCl9KSwgJHt0YWxseS50b21ic3RvbmV9IGRlbGV0aW9ucyAoJHtwY3QodGFsbHkudG9tYnN0b25lKX0pLCAke3RhbGx5LnVuY2hhbmdlZH0gdW5jaGFuZ2VkICgke3BjdCh0YWxseS51bmNoYW5nZWQpfSksICR7dGFsbHkuZmlsdGVyZWR9IG91dHNpZGUgcm91dGUgKCR7cGN0KHRhbGx5LmZpbHRlcmVkKX0pYDtcbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JlU3luYyB7XG4gICAgLy8gUGVyIHNvdXJjZSBzbG90LCBpbiBzdGVwIHdpdGggdGhlIHN0b3JlJ3Mgc291cmNlcyBhcnJheS4gU2xvdHMgYXJlIG5ldmVyIHNwbGljZWQgb3V0IC0gYSByZW1vdmVkIG9uZSBpcyBtYXJrZWQgZGVhZCAtIHNvIGEgc2xvdCBudW1iZXIgaGVsZCBieSBhIHJ1bm5pbmcgbG9vcCBhbHdheXMgbWVhbnMgdGhlIHNhbWUgc291cmNlLlxuICAgIHByaXZhdGUgc3RhdGVzOiBTb3VyY2VTdGF0ZVtdO1xuICAgIC8vIFNjYW5zIC8gZnVsbCBzeW5jcyBpbiBwcm9ncmVzcyAoYSBTZXQgLSBvbmUgc291cmNlIGNhbiBoYXZlIGEgY2hhbmdlIHBvbGwncyBmdWxsIHN5bmMgYW5kIGEgcmVzY2FuIG92ZXJsYXBwaW5nKVxuICAgIHByaXZhdGUgYWN0aXZpdGllcyA9IG5ldyBTZXQ8U3luY0FjdGl2aXR5PigpO1xuICAgIC8vIEd1YXJkcyBhZ2FpbnN0IGEgc2Vjb25kIGV2aWN0aW9uIHBhc3Mgc3RhcnRpbmcgd2hpbGUgb25lIGlzIHN0aWxsIHdhbGtpbmcgdGhlIGluZGV4XG4gICAgcHJpdmF0ZSBldmljdGluZyA9IGZhbHNlO1xuICAgIC8vIFdoZW4gZWFjaCBrZXkgd2FzIGxhc3Qgc2VydmVkLCBmb3IgcmVhZGVyRGlza0xpbWl0J3MgTFJVIGV2aWN0aW9uLiBOZXZlciBwZXJzaXN0ZWQgKGEgcmVzdGFydCBoYXMgbm8gb3BpbmlvbiBhYm91dCByZWNlbmN5KSwgYW5kIG9ubHkga2VwdCBmb3Iga2V5cyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiByZWFkIC0gYW4gaW5kZXggZW50cnkgbm8gb25lIGhhcyB0b3VjaGVkIGZhbGxzIGJhY2sgdG8gd2hlbiB3ZSBsYXN0IGNoYW5nZWQgaXQuXG4gICAgcHJpdmF0ZSBsYXN0QWNjZXNzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IEJsb2JTdG9yZSkge1xuICAgICAgICB0aGlzLnN0YXRlcyA9IHN0b3JlLnNvdXJjZXMubWFwKCgpID0+IG5ld1NvdXJjZVN0YXRlKCkpO1xuICAgIH1cblxuICAgIC8qKiBTdGFydHMgZXZlcnkgbGl2ZSBzb3VyY2UncyBzeW5jaHJvbml6YXRpb24sIHBsdXMgdGhlIG1haW50ZW5hbmNlIGxvb3BzLiBDYWxsZWQgb25jZSwgYnkgdGhlIHN0b3JlJ3MgaW5pdCAtIHRoZSBzdG9yZSdzIGluZGV4IG11c3QgYWxyZWFkeSBiZSBsb2FkZWQsIHNpbmNlIHNjYW5zIHdyaXRlIHN0cmFpZ2h0IGludG8gaXQuICovXG4gICAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICB2b2lkIHRoaXMucnVuU291cmNlU3luYyhpKTtcbiAgICAgICAgfVxuICAgICAgICBydW5JbmZpbml0ZVBvbGwoQ09ORklHX1BPTExfSU5URVJWQUwsICgpID0+IHRoaXMucG9sbFJvdXRpbmdDb25maWcoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmNsZWFudXBUb21ic3RvbmVzKCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5lbmZvcmNlSGlzdG9yeUxpbWl0KCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIC8vIFJlYWQgbGl2ZTogdGhlIGxpbWl0IGNvbWVzIGZyb20gdGhlIGNvbmZpZywgc28gYSBzdG9yZSB0aGF0IGdhaW5zIG9uZSBsYXRlciBzdGFydHMgZW5mb3JjaW5nIGl0IHdpdGhvdXQgYmVpbmcgcmVzdGFydGVkXG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChESVNLX0xJTUlUX0NIRUNLX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmVuZm9yY2VEaXNrTGltaXQoKSwgdGhpcy5zdG9yZS5zdG9wcGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc2tzIGV2ZXJ5IHBlZXIgZm9yIHRoZSByb3V0aW5nIGNvbmZpZywgYW5kIHRha2VzIGl0IGlmIGl0IGlzIG5ld2VyIHRoYW4gb3Vycy4gVGhpcyBpcyB0aGUgd2hvbGVcbiAgICAgKiBvZiBjb25maWd1cmF0aW9uIHByb3BhZ2F0aW9uOiBpdCByaWRlcyBiZXNpZGUgdGhlIHNjYW5zIHJhdGhlciB0aGFuIGJlaW5nIHBhcnQgb2YgdGhlbSwgYmVjYXVzZVxuICAgICAqIG9uZSBzbWFsbCByZWFkIGlzIHdvcnRoIGRvaW5nIGV2ZXJ5IGZldyBtaW51dGVzIHdoaWxlIGEgZnVsbCBsaXN0aW5nIGlzIG5vdCwgYW5kIGJlY2F1c2UgYVxuICAgICAqIGNvbmZpZyB3ZSBhcmUgbWlzc2luZyBpcyB3aGF0IHN0b3BzIGV2ZXJ5dGhpbmcgZWxzZSBmcm9tIGJlaW5nIHJpZ2h0LlxuICAgICAqXG4gICAgICogVGhlIGNvcHkgaXMgc3RvcmVkIHRoZSBzYW1lIHdheSBhIHNjYW4gc3RvcmVzIGFueXRoaW5nIGl0IHB1bGxzIC0gYW4gaW50ZXJuYWwgd3JpdGUgaW50byBvdXIgb3duXG4gICAgICogc3RvcmUgLSBhbmQgdGhlIHN0b3JlIG5vdGljZXMgdGhhdCBmaWxlIGxhbmRpbmcgYW5kIHJlLWNvbmZpZ3VyZXMgaXRzZWxmLiBOb3RoaW5nIGhlcmUga25vd3Mgd2hhdFxuICAgICAqIGEgY29uZmlnIG1lYW5zOyBpdCBvbmx5IGtub3dzIHRoaXMgb25lIGZpbGUgaXMgd29ydGggYXNraW5nIGZvciBvZnRlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHBvbGxSb3V0aW5nQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zb3VyY2VzW2ldLmludGVybWVkaWF0ZSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWlycyA9IGF3YWl0IHNvdXJjZS5nZXQyKFJPVVRJTkdfRklMRSwgeyBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoZWlycyB8fCAhdGhlaXJzLmRhdGEgfHwgIXRoZWlycy5kYXRhLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHZlcnNpb24gPSBnZXRDb25maWdWZXJzaW9uKHBhcnNlUm91dGluZ0RhdGEodGhlaXJzLmRhdGEpKTtcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA8PSB0aGlzLnN0b3JlLnJvdXRpbmdWZXJzaW9uKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7dmVyc2lvbn0gZm91bmQgb24gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9ICh3ZSBoYXZlICR7dGhpcy5zdG9yZS5yb3V0aW5nVmVyc2lvbigpfSwgc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiB0YWtpbmcgaXRgKTtcbiAgICAgICAgICAgICAgICAvLyBTdGFtcGVkIE5PVywgbm90IHdpdGggdGhlaXIgd3JpdGUgdGltZTogY29uZmlncyBhcmUgb3JkZXJlZCBieSB2ZXJzaW9uLCBhbmQgdGhpcyBvbmUgaXMgbmV3ZXIgYnkgdGhhdCBvcmRlcmluZy4gVGhlaXIgZmlsZSBjYW4gZWFzaWx5IGJlIG9sZGVyIGJ5IHdyaXRlIHRpbWUgKG91cnMgd2FzIHJld3JpdHRlbiBsb2NhbGx5IG1vcmUgcmVjZW50bHkpLCBhbmQgdGhlIHN0b3JlJ3Mgb25seS10YWtlLXRoZS1sYXRlc3QgcnVsZSB3b3VsZCB0aGVuIGRyb3AgaXQgLSBsZWF2aW5nIHVzIGZpbmRpbmcgdGhlIHNhbWUgbmV3ZXIgdmVyc2lvbiBvbiBldmVyeSBwb2xsIGFuZCBuZXZlciBhZG9wdGluZyBpdC5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNldCh7IHBhdGg6IFJPVVRJTkdfRklMRSwgZGF0YTogdGhlaXJzLmRhdGEsIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gQSBwZWVyIHRoYXQgY2Fubm90IGFuc3dlciBpcyB0aGUgbm9ybWFsIGNhc2UgZm9yIGEgc291cmNlIHRoYXQgaXMgZG93bjsgdGhlIG5leHQgcG9sbCBhc2tzIGFnYWluXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ2hlY2tpbmcgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZvciBhIG5ld2VyIHJvdXRpbmcgY29uZmlnIGZhaWxlZCAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFN0b3BzIGV2ZXJ5IHNvdXJjZSdzIGxvb3BzICh0aGUgc3RvcmUncyBvd24gc3RvcCB0b2tlbiBzdG9wcyB0aGUgbWFpbnRlbmFuY2UgbG9vcHMpLiAqL1xuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIHNsb3QgdGhlIHN0b3JlIGp1c3QgYXBwZW5kZWQgdG8gaXRzIHNvdXJjZXMgYXJyYXk6IGl0IHN0YXJ0cyBmcm9tIG5vdGhpbmcsIHNvIGl0IGdldHMgYSBmdWxsIHNjYW4uICovXG4gICAgcHVibGljIGFkZFNvdXJjZShzbG90OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZXNbc2xvdF0gPSBuZXdTb3VyY2VTdGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5zdG9yZS5zeW5jU3RhcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJ1blNvdXJjZVN5bmMoc2xvdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIHNsb3Qgc3RheXMgaW4gdGhlIHN0b3JlJ3MgYXJyYXlzIGZvcmV2ZXIgKHJ1bm5pbmcgbG9vcHMgaG9sZCBzbG90IG51bWJlcnMpOyBpdCBqdXN0IGdvZXMgZGVhZCAtIGxvb3BzIHN0b3AsIGFuZCBpdHMgaW5kZXggZW50cmllcyBkcm9wIChvdGhlciBzb3VyY2VzJyBzY2FucyByZS1maW5kIGFueSBjb3B5IHRoYXQncyBzdGlsbCByZWFjaGFibGUgdGhyb3VnaCB0aGUgbmV3IGNvbmZpZykuICovXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZVNvdXJjZShzbG90OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc2xvdF07XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnN0b3JlLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBzdGF0ZS5kZWFkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBsZXQgc291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc2xvdFNvdXJjZXNMaXN0SW5kZXgoc2xvdCk7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYmUgYW5vdGhlciBsaXZlIHNsb3QgKG9uZSBlbnRyeSBwZXIgdmFsaWQgd2luZG93KSAtIHRoZSBlbmRwb2ludCBpcyBzdGlsbCBjb25maWd1cmVkLCBzbyBpdHMgZW50cmllcyBzdGF5XG4gICAgICAgIGlmIChzb3VyY2VzTGlzdEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zdG9yZS5zbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ICE9PSBzb3VyY2VzTGlzdEluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBGb3Jnb3R0ZW4sIG5vdCBkZWxldGVkOiB0aGUgZmlsZXMgc3RpbGwgZXhpc3Qgd2hlcmV2ZXIgdGhhdCBzb3VyY2UgcHV0IHRoZW0sIHdlIGp1c3Qgbm8gbG9uZ2VyIGhhdmUgYSB3YXkgdG8gcmVhY2ggdGhlbVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCBhbmQgJHtkcm9wcGVkfSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgd2VyZSBkcm9wcGVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGl0cyBzY2FucyBhcmUgc3RvcHBlZCAoaXRzIFVSTCBpcyBzdGlsbCBzZXJ2ZWQgYnkgYW5vdGhlciBzbG90LCBzbyBpdHMgaW5kZXggZW50cmllcyBzdGF5KWApO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGEgc2xvdCBpcyBzdGlsbCBjb25maWd1cmVkLiBEZWFkIHNsb3RzIGFyZSBuZXZlciBzY2FubmVkLCB3cml0dGVuLCBvciByZWFkLiAqL1xuICAgIHB1YmxpYyBpc0xpdmUoc2xvdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3RvcmUuc291cmNlc1tzbG90XSAmJiAhdGhpcy5zdGF0ZXNbc2xvdF0/LmRlYWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGl2aXRpZXMoKTogU3luY0FjdGl2aXR5W10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuYWN0aXZpdGllc107XG4gICAgfVxuXG4gICAgLyoqIEEga2V5IHdhcyBqdXN0IHNlcnZlZCwgc28gaXQgZ29lcyB0byB0aGUgYmFjayBvZiB0aGUgZXZpY3Rpb24gcXVldWUuICovXG4gICAgcHVibGljIG5vdGVBY2Nlc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzLnNldChrZXksIERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdGhlIGluZGV4IHN0aWxsIGhvbGRzIGV4YWN0bHkgdGhlIGVudHJ5IGEgcGFzcyBwaWNrZWQgdXAgZWFybGllci4gSW5kZXggcm93cyBhcmUgcmVhZCBvdXQgb2YgdGhlIGRhdGFiYXNlIHBlciBsb29rdXAsIHNvIHRoaXMgY29tcGFyZXMgdGhlIHJvdywgbm90IHRoZSBvYmplY3QgLSBhIHdyaXRlIGxhbmRpbmcgbWlkLXBhc3MgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgdGhyZWUuXG4gICAgcHJpdmF0ZSBlbnRyeVVuY2hhbmdlZChrZXk6IHN0cmluZywgZW50cnk6IEluZGV4RW50cnkpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjdXJyZW50LndyaXRlVGltZSA9PT0gZW50cnkud3JpdGVUaW1lICYmIGN1cnJlbnQuc2l6ZSA9PT0gZW50cnkuc2l6ZSAmJiBjdXJyZW50LnNvdXJjZXNMaXN0SW5kZXggPT09IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXR1cygpOiBBcmNoaXZlc1N5bmNTdGF0dXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogdGhpcy5zdGF0ZXMuZXZlcnkoeCA9PiB4LnNjYW5Db21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHRoaXMuc3RvcmUuaW5kZXhTaXplKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0aGlzLnN0b3JlLnNvdXJjZXMubWFwKCh4LCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzOiB4LnZhbGlkV2luZG93cyxcbiAgICAgICAgICAgICAgICByb3V0ZTogeC5yb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jOiB4Lm5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRoaXMuc3RhdGVzW2ldLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLFxuICAgICAgICAgICAgICAgIGluaXRpYWxTY2FuQ29tcGxldGU6IHRoaXMuc3RhdGVzW2ldLnNjYW5Db21wbGV0ZSxcbiAgICAgICAgICAgICAgICBzY2FubmVkQ291bnQ6IHRoaXMuc3RhdGVzW2ldLnNjYW5uZWRDb3VudCxcbiAgICAgICAgICAgIH0pKS5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogTGlzdGluZ3MgY29tZSBzdHJhaWdodCBmcm9tIHRoZSBpbmRleCwgc28gdGhleSBtdXN0IHdhaXQgZm9yIG91ciBvd24gYmFzZSBzb3VyY2UncyBpbml0aWFsIHNjYW4gKHdoaWNoIG1pZ2h0IGxhZyBtaW51dGVzKSBiZWZvcmUgdGhleSBhcmUgdHJ1c3R3b3J0aHkuIFRoZSBiYXNlIChsb2NhbCBkaXNrKSBpcyBpbXBsaWNpdGx5IHJlcXVpcmVkIC0gcmVtb3RlIHNvdXJjZXMgYXJlIG5vdCwgdGhleSBjb21lIGFuZCBnby4gKi9cbiAgICBwdWJsaWMgYXN5bmMgd2FpdEZvclJlcXVpcmVkU2NhbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVzWzBdLmluaXRpYWxTY2FuLnByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCB2YWxpZCB3aW5kb3cgaGFuZG9mZnMsIHdoZXJlIGFub3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY2FuU291cmNlKDApO1xuICAgIH1cblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKToganVzdCBpdHMgY2hhbmdlcyBzaW5jZSB0aGUgYm91bmRhcnkgbmVpZ2hib3Job29kLCB3aXRoIG1hdGNoaW5nIHZhbHVlcyBwdWxsZWQgb250byBvdXIgb3duIGRpc2suICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gc3RhcnRpbmc6IGNoYW5nZXMgc2luY2UgJHtuZXcgRGF0ZShjb25maWcuc2luY2UpLnRvSVNPU3RyaW5nKCl9LCByb3V0ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KWApO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIyKHsgdGltZTogY29uZmlnLnNpbmNlLCByb3V0ZXM6IGNvbmZpZy5yb3V0ZSAmJiBbY29uZmlnLnJvdXRlXSB8fCB1bmRlZmluZWQgfSk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LmZpbHRlcmVkKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSB0aGlzLnN0b3JlLmN1cnJlbnRXcml0ZVRpbWUoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBTaXplIDAgaW4gYSBsaXN0aW5nIElTIGEgZGVsZXRpb24gKGFuIGVtcHR5IGZpbGUgaXMgYSBtaXNzaW5nIGZpbGUpLCBzbyBpdCBpcyB0YWtlbiBhcyBvbmVcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICAgICAgdGFsbHkudG9tYnN0b25lKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogc291cmNlLCB0bzogdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZSwgcGF0aDogZmlsZS5wYXRoLCBzaXplOiBmaWxlLnNpemUsIHdyaXRlVGltZTogZmlsZS5jcmVhdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKCFjb3BpZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwgZmlsZS5wYXRoLCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICBpZiAoY29waWVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGNvcGllZC53cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51cGRhdGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbGx5Lm5ldysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmaW5pc2hlZCBpbiAke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cyAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAke2NoYW5nZXMubGVuZ3RofSBjaGFuZ2VzOiAke2Zvcm1hdFNjYW5UYWxseSh0YWxseSwgY2hhbmdlcy5sZW5ndGgpfWApO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5GaW5pc2hcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHNjYW5TdGFydCwgc2luY2U6IGNvbmZpZy5zaW5jZSwgY2hhbmdlczogY2hhbmdlcy5sZW5ndGgsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSB9KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcGVyLXNvdXJjZSBsb29wcyDilIDilIBcblxuICAgIHByaXZhdGUgYXN5bmMgcnVuU291cmNlU3luYyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmUucmVnaXN0ZXJTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIC8vIFJlYWQgbGl2ZSBmb3IgZXZlcnkgcGFzcywgbm90IGNhcHR1cmVkIC0gdGhlIHN0b3JlJ3Mgc291cmNlIGxpc3QgY2FuIGNoYW5nZSB3aGlsZSBsb29wcyBydW5cbiAgICAgICAgbGV0IG5vRnVsbFN5bmMgPSAoKSA9PiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLm5vRnVsbFN5bmM7XG4gICAgICAgIGxldCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBBbiBpbnRlcm1lZGlhdGUgaXMgYSBkZXBsb3kgc3dpdGNob3ZlcidzIHRlbXBvcmFyeSBhbHRlcm5hdGUgUE9SVCBvbnRvIGEgc291cmNlIHdlIGFscmVhZHkgaGF2ZTogdGhlIHNhbWUgYnVja2V0LCByZWFjaGFibGUgYW5vdGhlciB3YXkgZm9yIGEgZmV3IG1pbnV0ZXMuIFNjYW5uaW5nIGl0IHdvdWxkIGxpc3QgZXhhY3RseSB3aGF0IHNjYW5uaW5nIHRoYXQgc291cmNlIGxpc3RzLCBhZ2FpbnN0IGEgcG9ydCB0aGF0IGlzIGFib3V0IHRvIGRpc2FwcGVhciAtIHNvIGl0IGlzIG5ldmVyIHNjYW5uZWQsIGFuZCB0aGUgc291cmNlIGl0IHdhcyBzcGxpdCBvdXQgb2YgY292ZXJzIGl0IGZvciBhcyBsb25nIGFzIGl0IGV4aXN0cyBhbmQgYWZ0ZXIgaXQgaXMgZ29uZS5cbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF0uaW50ZXJtZWRpYXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgc291cmNlLmdldENvbmZpZygpO1xuICAgICAgICAgICAgICAgIHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyID0gISFjb25maWcuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI7XG4gICAgICAgICAgICAgICAgbGlzdGluZyA9IGF3YWl0IHRoaXMuc2NhblNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgSW5pdGlhbCBzY2FuIG9mIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQsIHJldHJ5aW5nOmAsIGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICBpZiAobGlzdGluZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIGxpc3RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9GdWxsU3luYygpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3B5aW5nIGZpbGVzIGZyb20gc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDpgLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgICAgICAvLyBDaGFuZ2UgcG9sbHMgb25seSBzaG93IHdoYXQgdGhlIHNvdXJjZSBIQVMsIG5ldmVyIHdoYXQgaXQncyBtaXNzaW5nLCBzbyBwdXNoZXMgcnVuIG9uIHRoZSBmdWxsLXJlc2NhbiBjYWRlbmNlIChmaW5kSW5mbyBvbiBhbiBpbmRleC1iYWNrZWQgc291cmNlIGlzIGNoZWFwKVxuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZVTExfUkVTQ0FOX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVzID0gYXdhaXQgc291cmNlLmZpbmRJbmZvKFwiXCIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCBuZXcgTWFwKGZpbGVzLm1hcCh4ID0+IFt4LnBhdGgsIHguY3JlYXRlVGltZV0pKSk7XG4gICAgICAgICAgICB9LCBzdGF0ZS5zdG9wcGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChGVUxMX1JFU0NBTl9VTklOREVYRURfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzY2FuID0gYXdhaXQgdGhpcy5zY2FuU291cmNlKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleCwgcmVzY2FuKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGdWxsIG1ldGFkYXRhIHNjYW4gKHNpemUsIHdyaXRlVGltZSwgcGF0aCkgb2Ygb25lIHNvdXJjZSwgYXBwbGllZCB0byB0aGUgaW5kZXguIFJldHVybnMgdGhlIHNvdXJjZSdzIGxpc3RpbmcgKHBhdGggLT4gd3JpdGUgdGltZSksIHdoaWNoIHJlY29uY2lsZVNvdXJjZSB1c2VzIGZvciB0aGUgcHVzaCBkaXJlY3Rpb24uXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7IHR5cGU6IFwibWV0YWRhdGFTY2FuXCIsIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzdGFydFRpbWU6IHNjYW5TdGFydCB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0YXJ0aW5nIChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSlgKTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblN0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCkgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0aWxsIHJ1bm5pbmcgKCR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zLCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSlgKTtcbiAgICAgICAgfSwgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIC8vIFRoZSBsaXN0aW5nIHJlcXVlc3QgZGVsaWJlcmF0ZWx5IHRha2VzIG5vIHRpbWUgb3Igcm91dGUgZmlsdGVyczogb3VyIHNsb3dlc3Qgc291cmNlcyAoYmFja2JsYXplKSBzdXBwb3J0IG5laXRoZXIsIHNvIGZpbHRlcmluZyB3b3VsZCBoYXBwZW4gYWZ0ZXIgdGhlIGZ1bGwgZmV0Y2ggYW55d2F5IC0gbGl0dGxlIGJlbmVmaXQsIG1vcmUgcm9vbSBmb3IgZGVzeW5jaHJvbml6YXRpb24uIEFuZCBpZiBhIGZ1bGwgbGlzdGluZyBldmVyIGJlY29tZXMgdG9vIGJpZyB0byBzZW5kIG92ZXIgdGhlIG5ldHdvcmssIGl0IGlzIGFsc28gdG9vIGJpZyBmb3IgdGhlIHJlY2VpdmluZyBwcm9jZXNzIHRvIGhvbGQgaW4gbWVtb3J5IC0gdGhlIGZpeCBpcyBtb3JlIHJvdXRpbmcgc2hhcmRzIChlYWNoIHN0b3JpbmcgYW5kIHNlbmRpbmcgbGVzcyksIG5vdCBmaWx0ZXJpbmcuXG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBXaGF0IHdlIGJlbGlldmUgdGhlIHNvdXJjZSBoYXM6IHdoaWNoZXZlciBpcyBsYXJnZXIgb2YgaXRzIHByZXZpb3VzIGxpc3RpbmcgYW5kIHRoZSBpbmRleCBlbnRyaWVzIG5hbWluZyBpdCBhcyBob2xkZXIuIEZpbGVzIGRvIG5vdCBqdXN0IHZhbmlzaCAtIGEgbGlzdGluZyBmYXIgYmVsb3cgdGhpcyBtZWFucyB0aGUgb3RoZXIgZW5kIGlzIGJyaWVmbHkgYnJva2VuLCBhbmQgYmVsaWV2aW5nIGl0IHdvdWxkIHB1cmdlIGV2ZXJ5dGhpbmcgaXQgaGVsZC5cbiAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCA9PT0gc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXgpIGhlbGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gTWF0aC5tYXgoc3RhdGUuc2Nhbm5lZENvdW50LCBoZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIShleHBlY3RlZCA+IDAgJiYgZmlsZXMubGVuZ3RoIDwgZXhwZWN0ZWQgLyAyKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRzID49IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBTVElMTCBsaXN0cyAke2ZpbGVzLmxlbmd0aH0gZmlsZXMgd2hlcmUgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQsIGFmdGVyICR7YXR0ZW1wdHN9IHJldHJpZXMgLSBhY2NlcHRpbmcgdGhlIGxpc3RpbmcgYXMgdGhlIHRydXRoYCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBsaXN0ZWQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzLCBidXQgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQgKHByZXZpb3VzIGxpc3RpbmcgJHtzdGF0ZS5zY2FubmVkQ291bnR9LCBpbmRleCBlbnRyaWVzIGl0IGhvbGRzICR7aGVsZH0pIC0gdGhlIG90aGVyIGVuZCBpcyBwcm9iYWJseSBicmllZmx5IGJyb2tlbjsgYXNraW5nIGFnYWluIGluICR7U1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChyZXRyeSAke2F0dGVtcHRzfSBvZiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgbWF5IGhhdmUgYmVlbiByZW1vdmVkIHdoaWxlIHRoZSBsaXN0aW5nIHdhcyBpbiBmbGlnaHQ7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmIChzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybiBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBpbmRleFNpemVCZWZvcmUgPSB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBsZXQgbmV3UGF0aHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWVuLnNldChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIC8vIEVudHJpZXMgdGhpcyBzb3VyY2Ugd2FzIHRoZSBob2xkZXIgb2YsIGJ1dCB0aGF0IGl0cyBsaXN0aW5nIGRpZCBub3QgbWVudGlvbiwgYXJlIGZvcmdvdHRlbiAtIHdlIHdlcmUgd3JvbmcgYWJvdXQgd2hlcmUgdGhleSBhcmUsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGVtIGhhdmluZyBiZWVuIGRlbGV0ZWQuIEVudHJpZXMgY2hhbmdlZCBhZnRlciB0aGUgc2NhbiBzdGFydGVkIGFyZSBrZXB0OiB0aGUgbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBhcmUgbm90IHdhbGtlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZSB0aGV5IGFyZSBub3QgZmlsZXMgYSBsaXN0aW5nIGNvdWxkIHZvdWNoIGZvci5cbiAgICAgICAgbGV0IHJlbW92ZWRGcm9tSW5kZXggPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSBzY2FubmVkU291cmNlc0xpc3RJbmRleCAmJiBlbnRyeS5jaGFuZ2VkQXQgPCBzY2FuU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRGcm9tSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50ZWQgb25seSB3aGVuIHRoZSBzb3VyY2UgU0hPVUxEIGhvbGQgdGhlIGVudHJ5IChpdHMgcm91dGUgbWF0Y2hlcykgLSB0aGVzZSBhcmUgd2hhdCB0aGUgcmVjb25jaWxlIHBhc3MgcHVzaGVzIHRvIGl0ICh3aGljaCBhbHNvIGlnbm9yZXMgdGhlIHZhbGlkIHdpbmRvdzogc3luY2hyb25pemF0aW9uIG1vdmVzIGV4aXN0aW5nIHZhbHVlcywgdGhlIHdpbmRvdyBvbmx5IHJvdXRlcyBmcmVzaCB3cml0ZXMpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJjZW50YWdlcyBhcmUgb2YgdGhlIHVuaW9uIG9mIGJvdGggc2lkZXMgKG91ciBpbmRleCArIHRoZWlyIGxpc3RpbmcpLCBzbyBldmVyeSBjb3VudCBoYXMgYSBzdGFibGUgZGVub21pbmF0b3JcbiAgICAgICAgbGV0IHVuaW9uID0gaW5kZXhTaXplQmVmb3JlICsgbmV3UGF0aHM7XG4gICAgICAgIGxldCBwY3QgPSAobjogbnVtYmVyKSA9PiBgJHtNYXRoLnJvdW5kKG4gLyBNYXRoLm1heCh1bmlvbiwgMSkgKiAxMDAwKSAvIDEwfSVgO1xuICAgICAgICBjb25zb2xlLmxvZyhgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmluaXNoZWQgaW4gJHtNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc2NhblN0YXJ0KSAvIDEwMDApfXMgKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHtmaWxlcy5sZW5ndGh9IGxpc3RlZCB2cyAke2luZGV4U2l6ZUJlZm9yZX0gaW5kZXhlZCAodW5pb24gJHt1bmlvbn0pOiAke2Zvcm1hdFNjYW5UYWxseSh0YWxseSwgdW5pb24pfSwgJHttaXNzaW5nT25Tb3VyY2V9IGluIGluZGV4IGJ1dCBtaXNzaW5nIG9uIHNvdXJjZSAoJHtwY3QobWlzc2luZ09uU291cmNlKX0pLCAke3JlbW92ZWRGcm9tSW5kZXh9IHJlbW92ZWQgZnJvbSBpbmRleCAoJHtwY3QocmVtb3ZlZEZyb21JbmRleCl9KWApO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIGxpc3RlZDogZmlsZXMubGVuZ3RoLCBpbmRleGVkQmVmb3JlOiBpbmRleFNpemVCZWZvcmUsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgbWlzc2luZ09uU291cmNlLCByZW1vdmVkRnJvbUluZGV4IH0pO1xuICAgICAgICBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lID0gTWF0aC5tYXgoc3RhdGUuY2hhbmdlc0FmdGVyVGltZSwgc2NhblN0YXJ0IC0gQ0hBTkdFU19QT0xMX09WRVJMQVApO1xuICAgICAgICByZXR1cm4gc2VlbjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHVzaCBkaXJlY3Rpb24gb2Ygc3luY2hyb25pemF0aW9uOiBldmVyeXRoaW5nIHdlIGtub3cgdGhhdCB0aGUgc291cmNlIGlzIG1pc3NpbmcgKG9yIGhvbGRzIGFuIG9sZGVyIGNvcHkgb2YpIGlzIHdyaXR0ZW4gdG8gaXQg4oCUIGluY2x1ZGluZyBkZWxldGlvbnMsIGFzIHRvbWJzdG9uZSB3cml0ZXMuIFRoaXMgaXMgd2hhdCBoZWFscyBhIHNvdXJjZSB3aG9zZSBiYWNrZ3JvdW5kIHdyaXRlcyBmYWlsZWQgKGUuZy4gaXQgd2FzIGRvd24pOiB0aGUgbmV4dCBzY2FuIHNlZXMgd2hhdCdzIG1pc3NpbmcgYW5kIHJlLXNlbmRzIGl0LiBBIGZhaWxpbmcgZmlsZSBpcyBza2lwcGVkLCBub3QgZmF0YWwgKGltbXV0YWJsZSB0YXJnZXRzIGFyZSBoYW5kbGVkIGJ5IGZvcmNlU2V0SW1tdXRhYmxlLCBhbmQgb25lIHVucmVhZGFibGUgdmFsdWUgbXVzdCBub3Qgc3RvcCB0aGUgcmVzdCBvZiB0aGUgcGFzcykgLSBvbmx5IGEgcnVuIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzICh0aGUgc291cmNlIGl0c2VsZiBpcyBkb3duKSBhYm9ydHMgdW50aWwgdGhlIG5leHQgc2NhbiBjeWNsZS5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3dzLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzKTtcbiAgICAgICAgbGV0IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgcHVzaGVkID0gMDtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmlsZXMgZmlyc3QsIHRoZW4gdGhlIGRlbGV0aW9ucyAtIHR3byB3YWxrcyBub3cgdGhhdCB0aGV5IGFyZSB0d28gbWFwcywgYW5kIHRoZSBkZWxldGlvbnMgb25lIGlzIHRoZSBzaG9ydCBvbmVcbiAgICAgICAgbGV0IHB1c2hhYmxlOiB7IGtleTogc3RyaW5nOyB3cml0ZVRpbWU6IG51bWJlcjsgZW50cnk/OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHRhcmdldFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGVudHJ5IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBwdXNoYWJsZS5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeyBrZXksIHdyaXRlVGltZSwgZW50cnkgfSBvZiBwdXNoYWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBub3QgcmVjb25jaWxlZDogaXQgcHJvcGFnYXRlcyBieSBiZWluZyBhc2tlZCBmb3IsIG9uIGl0cyBvd24gc2NoZWR1bGUgKHNlZSBwb2xsUm91dGluZ0NvbmZpZylcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjY2VwdHNXcml0ZXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gd3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbGV0aW9uIG9ubHkgbmVlZHMgcHVzaGluZyB3aGlsZSB0aGUgc291cmNlIHN0aWxsIGhvbGRzIGFuIG9sZGVyIGNvcHkuIEl0IHRyYXZlbHMgYXMgZGVsIChuZXZlciBhcyBhbiBlbXB0eSBzZXQgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKSwgd2l0aCB0aGUgT1JJR0lOQUwgZGVsZXRpb24gdGltZSBzbyBvcmRlcmluZyBzdXJ2aXZlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBzZXRcIiwga2V5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlciA9IGF3YWl0IHRoaXMuc3RvcmUuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICghaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogaG9sZGVyLCB0bzogc291cmNlLCBwYXRoOiBrZXksIHNpemU6IGVudHJ5LnNpemUsIHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY29waWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIHNldFwiLCBrZXksIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgICAgICBwdXNoZWQrKztcbiAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzKys7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPCBTWU5DX0VSUk9SX0xPR19MSU1JVCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtrZXl9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEEgcGF1c2UgcGVyIGZhaWx1cmUsIHNvIGEgZG93biBuZXR3b3JrIHRha2VzIG1pbnV0ZXMgdG8gYnVybiB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnRcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY29uY2lsaW5nIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBwdXNoZWQgJHtwdXNoZWR9IGZpbGVzLCAke2ZhaWxlZH0gZmFpbGVkJHthYm9ydGVkICYmIGAgYmVmb3JlIGFib3J0aW5nIHRoZSBwYXNzICgke2NvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlIGZhaWx1cmVzIC0gdGhlIHNvdXJjZSBsb29rcyBkb3duOyB0aGUgbmV4dCBzY2FuIGN5Y2xlIHJldHJpZXMpYCB8fCBcIlwifS4gRmlyc3QgZXJyb3JzOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9IGVsc2UgaWYgKHB1c2hlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlY29uY2lsZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IHB1c2hlZCAke3B1c2hlZH0gZmlsZXMgaXQgd2FzIG1pc3Npbmcgb3IgaGVsZCBvbGRlciBjb3BpZXMgb2ZgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHVzaGVkIHx8IGZhaWxlZCkge1xuICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwicmVjb25jaWxlRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHB1c2hlZCwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTY2FuSW5kZXgoc291cmNlSW5kZXg6IG51bWJlciwgZmlsZTogQXJjaGl2ZUZpbGVJbmZvKTogU2Nhbk91dGNvbWUge1xuICAgICAgICAvLyBBbiBpbi1mbGlnaHQgc2NhbiBjYW4gb3V0bGl2ZSBpdHMgc291cmNlJ3MgcmVtb3ZhbDsgaXRzIHJlc3VsdHMgYXJlIGRlYWRcbiAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShzb3VyY2VJbmRleCkpIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIGlmIChmaWxlLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIE5FVkVSIHB1bGxlZCBmcm9tIG90aGVyIHNvdXJjZXMgLSBpdCBvbmx5IGV2ZXIgYXJyaXZlcyBhcyBhbiBleHBsaWNpdCwgdmVyc2lvbi12YWxpZGF0ZWQgd3JpdGUsIGFuZCBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrLiBSb3V0ZSBhbmQgdmFsaWQtd2luZG93IGZpbHRlcnMgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gaXQgZWl0aGVyOiBpdCBpcyB0aGUgZmlsZSBERUZJTklORyB0aGVtLCBzbyBmaWx0ZXJpbmcgaXQgd291bGQgbWVhbiBjZXJ0YWluIHNvdXJjZXMgY291bGQgbmV2ZXIgaGF2ZSB0aGVpciByb3V0aW5nIGNvbmZpZyB1cGRhdGVkLCBldmVyLlxuICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ICE9PSAwKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHZhbGlkIHdpbmRvdyBpcyBkZWxpYmVyYXRlbHkgTk9UIGFwcGxpZWQgaGVyZTogaXQgZGVjaWRlcyB3aGVyZSBXUklURVMgcm91dGUsIGJ1dCBhIHNjYW4gaXMgdXMgYXNraW5nIGEgc291cmNlIHdoYXQgaXQgYWxyZWFkeSBob2xkcyAtIGV4aXN0aW5nIHZhbHVlcyBzeW5jaHJvbml6ZSByZWdhcmRsZXNzIG9mIHRoZSB3aW5kb3cgKHRoZSBzYW1lIHJlYXNvbmluZyB0aGF0IGxldHMgc3luY2hyb25pemF0aW9uIGlnbm9yZSB0aGUgaW1tdXRhYmxlIGZsYWcpLiBPbmx5IHRoZSByb3V0ZSBmaWx0ZXJzOiBhIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZCdzIGxpc3RpbmcgbGVnaXRpbWF0ZWx5IGluY2x1ZGVzIGtleXMgdGhhdCBhcmVuJ3Qgb3Vycy5cbiAgICAgICAgICAgIGxldCB7IHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShmaWxlLnBhdGgpKSkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnN0b3JlLmdldEluZGV4RW50cnkoZmlsZS5wYXRoKTtcbiAgICAgICAgLy8gVGhlIGhpZ2hlc3Qgd3JpdGUgdGltZSB3aW5zIGFjcm9zcyBhbGwgc291cmNlcywgYW5kIGEgdGllIGtlZXBzIHdoYXQgd2UgaGF2ZSAtIG90aGVyd2lzZSBldmVyeSByZXNjYW4gb2YgYW4gdW5jaGFuZ2VkIGZpbGUgd291bGQgcmUtcmVjb3JkIGl0LCBtb3ZpbmcgaXRzIGhvbGRlciBhbmQgd3JpdGluZyBhIGxvZyByZWNvcmQgZm9yIG5vdGhpbmcuIGN1cnJlbnRXcml0ZVRpbWUgY291bnRzIGRlbGV0aW9ucywgc28gYSBsaXN0aW5nIHRoYXQgc3RpbGwgc2hvd3MgYSBmaWxlIHdlIGtub3cgd2FzIGRlbGV0ZWQgZG9lcyBub3QgcmVzdXJyZWN0IGl0LlxuICAgICAgICBpZiAoZmlsZS5jcmVhdGVUaW1lIDw9IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShmaWxlLnBhdGgpKSByZXR1cm4gXCJ1bmNoYW5nZWRcIjtcbiAgICAgICAgLy8gU2l6ZSAwIGluIGEgbGlzdGluZyBJUyBhIGRlbGV0aW9uIC0gYW4gZW1wdHkgZmlsZSBpcyBhIG1pc3NpbmcgZmlsZSAtIHNvIHRoYXQgaXMgd2hhdCBpdCBpcyB0YWtlbiBhc1xuICAgICAgICBpZiAoZmlsZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICByZXR1cm4gXCJ0b21ic3RvbmVcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoZmlsZS5wYXRoLCB7IHdyaXRlVGltZTogZmlsZS5jcmVhdGVUaW1lLCBzaXplOiBmaWxlLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCkgfSk7XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIFwidXBkYXRlZFwiO1xuICAgICAgICByZXR1cm4gXCJuZXdcIjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgcG9sbFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBhd2FpdCBzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyMih7IHRpbWU6IHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHJvdXRlczogcm91dGUgJiYgW3JvdXRlXSB8fCB1bmRlZmluZWQgfSk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICAvLyBQb2xscyBydW4gY29uc3RhbnRseSwgc28gb25seSB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGNoYW5nZWQgdGhlIGluZGV4IGdldCBhIGxpbmVcbiAgICAgICAgaWYgKHRhbGx5Lm5ldyB8fCB0YWxseS51cGRhdGVkIHx8IHRhbGx5LnRvbWJzdG9uZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYENoYW5nZXMgcG9sbCBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHtjaGFuZ2VzLmxlbmd0aH0gY2hhbmdlczogJHtmb3JtYXRTY2FuVGFsbHkodGFsbHksIGNoYW5nZXMubGVuZ3RoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgKz0gY2hhbmdlcy5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBwb2xsU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUDtcbiAgICB9XG5cbiAgICAvLyBEb3dubG9hZHMgdGhlIGZpbGVzIGEgc291cmNlIGN1cnJlbnRseSBob2xkcyBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgcHJlc2VydmluZyB0aGVpciBtb2RpZmllZCB0aW1lcyDigJQgc28gYSBuZXdlciBsb2NhbCB3cml0ZSBhbHdheXMgd2lucy4gU2tpcHBlZCBmb3Igbm9GdWxsU3luYyBzb3VyY2VzIChmcm9udGluZyBhIGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyBpdCk7IHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgbGF6aWx5LlxuICAgIHByaXZhdGUgYXN5bmMgY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSAwKSByZXR1cm47XG4gICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgcGVuZGluZzogeyBrZXk6IHN0cmluZzsgZW50cnk6IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgbGV0IGNvcGllZFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggIT09IGNvcGllZFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcGVuZGluZy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJmdWxsU3luY1wiLFxuICAgICAgICAgICAgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICBkb25lRmlsZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIGRvbmVCeXRlczogMCxcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJmdWxsU3luY1N0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGZpbGVzOiBwZW5kaW5nLmxlbmd0aCwgYnl0ZXM6IHRvdGFsQnl0ZXMgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc0xvZ2dlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbG9nUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBwcm9ncmVzc0xvZ2dlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHthY3Rpdml0eS5kb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeygoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpYCkpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKGxvZ1Byb2dyZXNzLCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgbGV0IHNsb3dFcnJvclRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lO1xuICAgICAgICAgICAgbGV0IGRvbmVGaWxlcyA9IGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGRvbmVCeXRlcyA9IGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGJ5dGVzUGVyU2Vjb25kID0gZG9uZUJ5dGVzIC8gKGVsYXBzZWQgLyAxMDAwKTtcbiAgICAgICAgICAgIGxldCByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXMgLSBkb25lQnl0ZXM7XG4gICAgICAgICAgICBsZXQgZXRhVGV4dCA9IFwidW5rbm93biAobm8gYnl0ZXMgdHJhbnNmZXJyZWQgeWV0KVwiO1xuICAgICAgICAgICAgaWYgKGJ5dGVzUGVyU2Vjb25kID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdNcyA9IHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNQZXJTZWNvbmQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIGV0YVRleHQgPSBgJHtmb3JtYXRUaW1lKHJlbWFpbmluZ01zKX0gcmVtYWluaW5nLCBjb21wbGV0aW5nIGFyb3VuZCAke25ldyBEYXRlKERhdGUubm93KCkgKyByZW1haW5pbmdNcykudG9JU09TdHJpbmcoKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBoYXMgYmVlbiBydW5uaW5nIGZvciAke2Zvcm1hdFRpbWUoZWxhcHNlZCl9OiAke2RvbmVGaWxlc30vJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgKCR7KGRvbmVGaWxlcyAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihkb25lQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiAoJHsodG90YWxCeXRlcyAmJiBkb25lQnl0ZXMgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoYnl0ZXNQZXJTZWNvbmQpfUIvcy4gRXN0aW1hdGVkICR7ZXRhVGV4dH0uYCk7XG4gICAgICAgIH0sIEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMKTtcbiAgICAgICAgKHNsb3dFcnJvclRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgICAgICBsZXQgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBjb3B5V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICghYWJvcnRlZCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGtleSwgZW50cnkgfSA9IHBlbmRpbmdbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGtleSwgc2l6ZTogZW50cnkuc2l6ZSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwga2V5LCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtb3ZlIHRoZSBlbnRyeSdzIHNvdXJjZSBpZiBpdCB3YXNuJ3QgY2hhbmdlZCB3aGlsZSB3ZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbnRyeVVuY2hhbmdlZChrZXksIGVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgc2l6ZTogY29waWVkLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25lIGZhaWxpbmcgZmlsZSBtdXN0IG5vdCBhYm9ydCB0aGUgc3luYzogaXQgc3RheXMgb24gaXRzIHNvdXJjZSAocmVhZHMgc3RpbGwgcmVhY2ggaXQgdGhlcmUpLCBhbmQgdGhlIG5leHQgc3luYyBwYXNzIHJldHJpZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPCBTWU5DX0VSUk9SX0xPR19MSU1JVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcGF1c2UgcGVyIGZhaWx1cmUsIHNvIGEgZG93biBuZXR3b3JrIHRha2VzIG1pbnV0ZXMgdG8gYnVybiB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNZTkNfRkFJTFVSRV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZG9uZUZpbGVzID0gKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVCeXRlcyA9IChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgKyBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgd29ya2VyczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKEZVTExfU1lOQ19QQVJBTExFTCwgcGVuZGluZy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJzLnB1c2goY29weVdvcmtlcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xuICAgICAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZ1bGwgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAke2ZhaWxlZH0gb2YgJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgZmFpbGVkIHRvIGNvcHkke2Fib3J0ZWQgJiYgYCBiZWZvcmUgYWJvcnRpbmcgdGhlIHBhc3MgKCR7U1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVN9IGNvbnNlY3V0aXZlIGZhaWx1cmVzIC0gdGhlIHNvdXJjZSBsb29rcyBkb3duOyB0aGUgbmV4dCBzeW5jIHBhc3MgcmV0cmllcylgIHx8IFwiICh0aGV5IHN0YXkgb24gdGhlaXIgc291cmNlLCBhbmQgdGhlIG5leHQgc3luYyBwYXNzIHJldHJpZXMgdGhlbSlcIn0uIEZpcnN0IGVycm9yczogJHtlcnJvcnMuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWUsIGNvcGllZEZpbGVzOiBhY3Rpdml0eS5kb25lRmlsZXMsIGNvcGllZEJ5dGVzOiBhY3Rpdml0eS5kb25lQnl0ZXMsIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLCB0b3RhbEJ5dGVzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIG1haW50ZW5hbmNlIOKUgOKUgFxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGl0IC0gYnV0IE9OTFkgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIGEgc2FtZS1vci1uZXdlciBjb3B5ICh0aGUgb25seSBjb3B5IG9mIGEgZmlsZSBpcyBuZXZlciBkZWxldGVkKSwgYW5kIHRoZSBpbmRleCBlbnRyeSByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBhc3luYyBlbmZvcmNlRGlza0xpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnN0b3JlLnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLnN0b3JlLmluZGV4VG90YWxzKCk7XG4gICAgICAgIC8vIENvdW50ZWQgZG93biBhcyB3ZSBldmljdCwgcmF0aGVyIHRoYW4gcmUtcmVhZCBwZXIgZmlsZTogYSBwYXNzIG9ubHkgZXZlciByZW1vdmVzIGJ5dGVzIGZyb20gdGhlIGRpc2ssIGFuZCBhbnl0aGluZyB3cml0dGVuIGR1cmluZyBpdCBpcyBwaWNrZWQgdXAgYnkgdGhlIG5leHQgcGFzc1xuICAgICAgICBsZXQgZGlza0J5dGVzID0gdG90YWxzLnNsb3RzWzBdLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKGRpc2tCeXRlcyA8PSBsaW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmV2aWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGV2aWN0ZWRGaWxlcyA9IDA7XG4gICAgICAgIGxldCBldmljdGVkQnl0ZXMgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXM6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXggfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZWFzdCByZWNlbnRseSBSRUFEIGZpcnN0OyBhIGtleSBub2JvZHkgaGFzIHJlYWQgc2luY2Ugd2Ugc3RhcnRlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4gdGhpcy5sYXN0QWNjZXNzLmdldCh4LmtleSkgfHwgeC5lbnRyeS5jaGFuZ2VkQXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbnRyeVVuY2hhbmdlZChrZXksIGVudHJ5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbaV0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmIGluZm8ud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBkb3duIHNvdXJjZSBqdXN0IGNhbid0IHZvdWNoIGZvciB0aGlzIGZpbGUgcmlnaHQgbm93XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvbGRlciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChob2xkZXIpIH0pO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIGRpc2tCeXRlcyAtPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5ldmljdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV2aWN0ZWRGaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEaXNrIGNhY2hlIG92ZXIgcmVhZGVyRGlza0xpbWl0IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGV2aWN0ZWQgJHtldmljdGVkRmlsZXN9IGxlYXN0LXJlY2VudGx5LXVzZWQgZmlsZXMgKCR7Zm9ybWF0TnVtYmVyKGV2aWN0ZWRCeXRlcyl9QiksIG5vdyBhdCAke2Zvcm1hdE51bWJlcihkaXNrQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIobGltaXQpfUJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWQgb25lcyBhcmUgZm9yZ290dGVuIGVudGlyZWx5LiBBIHdhbGsgb2YgdGhlIHRvbWJzdG9uZXMgYWxvbmUsIHdoaWNoIGlzIHdoeSBpdCBjYW4gcnVuIG9mdGVuIGFuZCBjb3N0IG5vdGhpbmcuIFRoZSBwaHlzaWNhbCBlbXB0eSBmaWxlIGlzIHJlbW92ZWQgb25seSBvbiBiYWNrYmxhemUgc291cmNlczogcmVtb3RlIHN0b3JlcyBleHBpcmUgdGhlaXIgb3duIHRvbWJzdG9uZXMgKGEgZGVsIHRoZXJlIHdvdWxkIGp1c3QgbWludCBhIGZyZXNoIG9uZSksIGFuZCBvdXIgb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgTUFSS0VEIGRlbGV0aW9uIG5ldmVyIGV4cGlyZXMgYnkgdGltZSAtIGl0cyBieXRlcyBhcmUgc3RpbGwgb24gZGlzaywgYW5kIHB1cmdpbmcgdGhlIHRvbWJzdG9uZSB3b3VsZCBsZXQgdGhlIG5leHQgZGlzayBzY2FuIHJlc3VycmVjdCB0aGVtIGFzIGxpdmUuIFJldGVudGlvbiBleHBpcmVzIGl0IGJ5IFNJWkUgKGVuZm9yY2VIaXN0b3J5TGltaXQpOyBvbmx5IG9uY2UgdGhlIGJ5dGVzIGFyZSBnb25lIGRvZXMgdGhlIHBsYWluIHRvbWJzdG9uZSBhZ2Ugb3V0IGhlcmUuXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRNYXJrZWRFbnRyeShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd3NBY2NlcHRXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlbGV0aW9uIGhpc3RvcnkgcmV0ZW50aW9uOiBtYXJrZWQgZmlsZXMga2VlcCB0aGVpciBieXRlcyBvbiBvdXIgZGlzayB1bnRpbCB0aGUgaGlzdG9yeSBvdXRncm93cyBtYXgoSElTVE9SWV9NSU5fQllURVMsIGxpdmUgYnl0ZXMgKiBoaXN0b3J5IGZhY3Rvcik7IHRoZW4gdGhlIE9MREVTVCBkZWxldGlvbnMgbG9zZSB0aGVpciBieXRlcyBhbmQgYmVjb21lIHBsYWluIHRvbWJzdG9uZXMsIHdoaWNoIGFnZSBvdXQgbm9ybWFsbHkgKGNsZWFudXBUb21ic3RvbmVzKVxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZUhpc3RvcnlMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChISVNUT1JZX01JTl9CWVRFUywgdGhpcy5zdG9yZS5pbmRleFRvdGFscygpLmJ5dGVDb3VudCAqIGF3YWl0IGdldEhpc3RvcnlGYWN0b3IoKSk7XG4gICAgICAgIGxldCBtYXJrZWQ6IHsga2V5OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZGVsZXRlVGltZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgbWFya2VkLnB1c2goeyBrZXksIHNpemU6IGVudHJ5LnNpemUsIGRlbGV0ZVRpbWU6IGVudHJ5LmRlbGV0ZVRpbWUgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPD0gYWxsb3dlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhcnRlZFdpdGhCeXRlcyA9IHRvdGFsQnl0ZXM7XG4gICAgICAgIHNvcnQobWFya2VkLCB4ID0+IHguZGVsZXRlVGltZSk7XG4gICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgbGV0IGRyb3BwZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IHsga2V5LCBzaXplIH0gb2YgbWFya2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5kcm9wTWFya2VkSGlzdG9yeShrZXkpO1xuICAgICAgICAgICAgdG90YWxCeXRlcyAtPSBzaXplO1xuICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgZHJvcHBlZEJ5dGVzICs9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW9uIGhpc3Rvcnkgb2Ygc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0gb3V0Z3JldyBpdHMgYnVkZ2V0ICgke2Zvcm1hdE51bWJlcihzdGFydGVkV2l0aEJ5dGVzKX1CIGtlcHQgdnMgJHtmb3JtYXROdW1iZXIoYWxsb3dlZCl9QiBhbGxvd2VkKTogZHJvcHBlZCB0aGUgJHtkcm9wcGVkfSBvbGRlc3QgbWFya2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihkcm9wcGVkQnl0ZXMpfUIpOyB0aGVpciB0b21ic3RvbmVzIHJlbWFpbiB1bnRpbCB0aGV5IGFnZSBvdXRgKTtcbiAgICB9XG59XG4iXX0=
746
- /* _JS_SOURCE_HASH = "6af4d0c3ddf84241c6ea4d178f0323d4c7db8a337499751150484be339ebe3a8"; */
756
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUFzRTtBQUN0RSxtREFBMEU7QUFDMUUsa0VBQWlGO0FBQ2pGLDRDQUdzQjtBQUN0QixzREFBb0Q7QUFDcEQsNENBQWlEO0FBQ2pELGlEQUEyRztBQUUzRywyQ0FBa0U7QUFDbEUsK0NBQTZDO0FBQzdDLHdFQUFtRTtBQUVuRSxrYkFBa2I7QUFFbGIseUVBQXlFO0FBQ3pFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxtTUFBbU07QUFDbk0sTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQyxrUUFBa1E7QUFDbFEsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QyxNQUFNLDhCQUE4QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxRCxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxvTEFBb0w7QUFDcEwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsbUZBQW1GO0FBQ25GLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM3QyxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDNUMsd0lBQXdJO0FBQ3hJLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLDhLQUE4SztBQUM5SyxNQUFNLDZCQUE2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QUFHLFVBQVUsQ0FBQztRQUNsQyxJQUFBLFdBQUksRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDcEMsSUFBSSxVQUFVLElBQUksT0FBTztnQkFBRSxNQUFNO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsWUFBWSxJQUFJLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixJQUFBLHFCQUFZLEVBQUMsZ0JBQWdCLENBQUMsYUFBYSxJQUFBLHFCQUFZLEVBQUMsT0FBTyxDQUFDLDJCQUEyQixPQUFPLHlCQUF5QixJQUFBLHFCQUFZLEVBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDN1IsQ0FBQztDQUNKO0FBMW9CRCw4QkEwb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsLCBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUsIHNvcnQsIHByb21pc2VPYmogfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBTeW5jQWN0aXZpdHksIEZVTExfUk9VVEUsXG4gICAgd2luZG93c0FjY2VwdFdyaXRlcyxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4uL2FyY2hpdmVIZWxwZXJzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHBhcnNlUm91dGluZ0RhdGEsIGdldENvbmZpZ1ZlcnNpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQmxvYlN0b3JlLCBJbmRleEVudHJ5IH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRIaXN0b3J5RmFjdG9yLCBISVNUT1JZX01JTl9CWVRFUyB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHsgbG9nU3luY0V2ZW50IH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcbmltcG9ydCB7IG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBFdmVyeXRoaW5nIHRoYXQga2VlcHMgYSBzdG9yZSdzIGluZGV4IGluIGFncmVlbWVudCB3aXRoIGl0cyBzb3VyY2VzLCBwbHVzIHRoZSB0d28gbWFpbnRlbmFuY2UgbG9vcHMgdGhhdCBmb2xsb3cgZnJvbSBob2xkaW5nIGFuIGluZGV4IChldmljdGluZyBhIGJvdW5kZWQgZGlzayBjYWNoZSwgZXhwaXJpbmcgdG9tYnN0b25lcykuIFRoZSBzdG9yZSBvd25zIHRoZSBzb3VyY2VzIGFuZCBkZWNpZGVzIHdoZXJlIHdyaXRlcyBnbzsgdGhpcyBkZWNpZGVzIHdoYXQgaXMgc2Nhbm5lZCwgcHVsbGVkLCBwdXNoZWQsIGV2aWN0ZWQsIGFuZCBmb3Jnb3R0ZW4gLSBzbyB0aGUgd3JpdGUgcGF0aCBzdGF5cyByZWFkYWJsZSB3aXRob3V0IHRoZSBzZXZlcmFsIGh1bmRyZWQgbGluZXMgb2Ygc3luY2hyb25pemF0aW9uIG1hY2hpbmVyeSBpbnRlcmxlYXZlZCBpbnRvIGl0LlxuXG4vLyBTb3VyY2VzIHdpdGggYSBuYXRpdmUgKGluZGV4LWJhY2tlZCkgY2hhbmdlIGZlZWQgYXJlIHBvbGxlZCB0aGlzIG9mdGVuXG5jb25zdCBDSEFOR0VTX1BPTExfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBUaGUgcm91dGluZyBjb25maWcgaXMgY2hlY2tlZCBmb3Igb24gZXZlcnkgcGVlciB0aGlzIG9mdGVuIC0gZmFyIG1vcmUgb2Z0ZW4gdGhhbiBhIGZ1bGwgcmVzY2FuLCBiZWNhdXNlIGl0IGlzIHRoZSBmaWxlIHRoYXQgZGVjaWRlcyB3aGF0IGV2ZXJ5dGhpbmcgZWxzZSBkb2VzLCBhbmQgaXQgaXMgb25lIHNtYWxsIHJlYWQgcGVyIHBlZXJcbmNvbnN0IENPTkZJR19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNTtcbi8vIEZ1bGwgbWV0YWRhdGEgcmVzY2Fucy4gc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgaXMgdGhlIGhldXJpc3RpYyBmb3IgXCJvbmUgb2Ygb3VyIG93biBzdG9yYWdlIHNlcnZlcnNcIjogdGhlaXIgaW5kZXgtYmFja2VkIGxpc3RpbmdzIGFyZSBjaGVhcCwgc28gaG91cmx5IGlzIGZpbmUuIEV2ZXJ5dGhpbmcgZWxzZSAoYmFja2JsYXplLCBwbGFpbiBkaXNrKSBwYXlzIHRoZSBmdWxsIGxpc3RpbmcgY29zdCwgc28gaXQgcmVzY2FucyBtdWNoIGxlc3Mgb2Z0ZW4uXG5jb25zdCBGVUxMX1JFU0NBTl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuY29uc3QgRlVMTF9SRVNDQU5fVU5JTkRFWEVEX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiA2O1xuLy8gQ2hhbmdlIHBvbGxzIHJlLXJlcXVlc3QgdGhpcyBtdWNoIG92ZXJsYXAsIHNvIGNsb2NrIHNrZXcgYmV0d2VlbiB1cyBhbmQgYSBzb3VyY2UgY2FuJ3QgZHJvcCBjaGFuZ2VzXG5jb25zdCBDSEFOR0VTX1BPTExfT1ZFUkxBUCA9IHRpbWVJbk1pbnV0ZTtcbmNvbnN0IFNDQU5fUkVUUllfREVMQVkgPSAxMDAwICogMzA7XG4vLyBEZWxldGVzIGFyZSB0b21ic3RvbmVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpcyB3aGF0IGxldHMgYSBkZWxldGlvbiBwcm9wYWdhdGUvcmVjb25jaWxlIGxpa2UgYW55IG90aGVyIHdyaXRlLCBhbmQgaXQgZXhwaXJlcyBhZnRlciB0aGlzIGxvbmdcbmNvbnN0IFRPTUJTVE9ORV9FWFBJUlkgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogNztcbmNvbnN0IFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBXaGlsZSBhIG1ldGFkYXRhIHNjYW4gb3IgZnVsbCBzeW5jIGlzIHJ1bm5pbmcsIGl0cyBwcm9ncmVzcyBpcyBsb2dnZWQgdGhpcyBvZnRlblxuY29uc3QgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDAwICogNjA7XG5jb25zdCBESVNLX0xJTUlUX0NIRUNLX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gRnVsbCBzeW5jcyBkb3dubG9hZCB0aGlzIG1hbnkgZmlsZXMgY29uY3VycmVudGx5IChoaWdoLWxhdGVuY3kgc291cmNlcyBsaWtlIGJhY2tibGF6ZSB3b3VsZCBvdGhlcndpc2UgY3Jhd2wgb25lIHJvdW5kLXRyaXAgYXQgYSB0aW1lKVxuY29uc3QgRlVMTF9TWU5DX1BBUkFMTEVMID0gODtcbi8vIEEgZnVsbCBzeW5jIHJ1bm5pbmcgbG9uZ2VyIHRoYW4gdGhpcyBpcyBjb25zb2xlLmVycm9yZWQgKGFuZCBhZ2FpbiBldmVyeSBpbnRlcnZhbCBhZnRlciksIHNvIGEgc3luYyB0aGF0IHdpbGwgdGFrZSBkYXlzIGlzIGxvdWQgaW5zdGVhZCBvZiBhIHF1aWV0IGNvbnNvbGUubG9nIGV2ZXJ5IG1pbnV0ZVxuY29uc3QgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFJlY29uY2lsZSBwYXNzZXMgQU5EIGZ1bGwgc3luY3Mgc2tpcCBmYWlsaW5nIGZpbGVzIChvbmUgYmFkIHZhbHVlIG11c3Qgbm90IHN0b3AgdGhlIHJlc3QgLSBhIHNvdXJjZSBmYWlsaW5nIG9uZSByZXF1ZXN0IGluIGEgdGhvdXNhbmQgY291bGQgb3RoZXJ3aXNlIG5ldmVyIGZpbmlzaCBhIHN5bmMpLCBidXQgdGhpcyBtYW55IGZhaWx1cmVzIGluIGEgcm93IG1lYW5zIHRoZSBvdGhlciBzaWRlIGl0c2VsZiBpcyBkb3duLCBzbyB0aGUgcGFzcyBhYm9ydHMgdW50aWwgdGhlIG5leHQgY3ljbGVcbmNvbnN0IFNZTkNfTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gNTtcbmNvbnN0IFNZTkNfRVJST1JfTE9HX0xJTUlUID0gMztcbi8vIEV2ZXJ5IGZhaWxlZCBmaWxlIHdhaXRzIHRoaXMgbG9uZyBiZWZvcmUgdGhlIHBhc3MgY29udGludWVzLCBzbyBhIGRvd24gbmV0d29yayBidXJucyB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBvdmVyIGEgbWludXRlLXBsdXMgaW5zdGVhZCBvZiBpbiBhbiBpbnN0YW50XG5jb25zdCBTWU5DX0ZBSUxVUkVfREVMQVkgPSAxMDAwICogMTU7XG4vLyBBIGZ1bGwgbGlzdGluZyB0aGF0IGNvbWVzIGJhY2sgRU1QVFkgLSBvciB1bmRlciBoYWxmIG9mIHdoYXQgd2Uga25vdyB0aGUgc291cmNlIGhvbGRzIC0gaXMgdHJlYXRlZCBhcyB0aGUgb3RoZXIgZW5kIGJlaW5nIGJyaWVmbHkgYnJva2VuLCBub3QgYXMgdGhlIHRydXRoOiBpdCBpcyByZXRyaWVkIHRoaXMgbWFueSB0aW1lcywgdGhpcyBmYXIgYXBhcnQsIGJlZm9yZSBiZWluZyBiZWxpZXZlZC4gQmVsaWV2aW5nIGEgd3JvbmdseS1zaHJ1bmtlbiBsaXN0aW5nIHB1cmdlcyBldmVyeSBpbmRleCBlbnRyeSB0aGUgc291cmNlIGhlbGQsIHdoaWNoIGlzIGhvdyBzeW5jIHByb2dyZXNzIFwiZ29lcyBiYWNrd2FyZHNcIi5cbmNvbnN0IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTID0gMztcbmNvbnN0IFNVU1BJQ0lPVVNfU0NBTl9SRVRSWV9ERUxBWSA9IDEwMDAgKiA2MDtcblxudHlwZSBTb3VyY2VTdGF0ZSA9IHtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbjogUmV0dXJuVHlwZTx0eXBlb2YgcHJvbWlzZU9iaj47XG4gICAgc2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIFdoZXRoZXIgYSBzY2FuIG9mIHRoaXMgc291cmNlIGhhcyBldmVyIGFjdHVhbGx5IFNVQ0NFRURFRCAtIHdoYXQgZnVsbCBzeW5jcyBnYXRlIG9uOiB3aXRob3V0IG9uZSwgdGhlIGluZGV4J3MgdmlldyBvZiB0aGlzIHNvdXJjZSBjYW4gYmUgYXJiaXRyYXJpbHkgc3RhbGUgKGUuZy4gaXQgd2FzIHJlc3RhcnRpbmcgd2hlbiB3ZSBmaXJzdCB0cmllZCksIGFuZCBzeW5jaW5nIGZyb20gc3RhbGUgaW5mb3JtYXRpb24gY2h1cm5zIGZvcmV2ZXJcbiAgICBzY2FuU3VjY2VlZGVkOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbiAgICAvLyBXYXRlcm1hcmsgZm9yIGdldENoYW5nZXNBZnRlcjIgcG9sbHNcbiAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiBudW1iZXI7XG4gICAgLy8gUGVyLXNsb3Qgc3RvcCB0b2tlbjogYSByZW1vdmVkIHNvdXJjZSdzIGxvb3BzIHN0b3Agd2l0aG91dCB0b3VjaGluZyB0aGUgcmVzdCBvZiB0aGUgc3RvcmVcbiAgICBzdG9wcGVkOiB7IHN0b3A6IGJvb2xlYW4gfTtcbiAgICAvLyBBIHJlbW92ZWQgc291cmNlJ3Mgc2xvdCBzdGF5cyBpbiB0aGUgYXJyYXlzICh0aGV5IGFyZSBuZXZlciBzcGxpY2VkLCBzbyBzbG90IG51bWJlcnMgaGVsZCBieSBydW5uaW5nIGxvb3BzIHN0YXkgbWVhbmluZ2Z1bCksIG1hcmtlZCBkZWFkIC0gbmV2ZXIgc2Nhbm5lZCwgd3JpdHRlbiwgb3IgcmVhZC4gSW5kZXggZW50cmllcyBkb24ndCByZWZlcmVuY2Ugc2xvdHMgYXQgYWxsOyB0aGV5IHBlcnNpc3QgdGhlIHNvdXJjZXMgbGlzdCdzIHNvdXJjZXNMaXN0SW5kZXguXG4gICAgZGVhZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBuZXdTb3VyY2VTdGF0ZSgpOiBTb3VyY2VTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGZhbHNlLFxuICAgICAgICBpbml0aWFsU2NhbjogcHJvbWlzZU9iaigpLFxuICAgICAgICBzY2FuQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICBzY2FuU3VjY2VlZGVkOiBmYWxzZSxcbiAgICAgICAgc2Nhbm5lZENvdW50OiAwLFxuICAgICAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiAwLFxuICAgICAgICBzdG9wcGVkOiB7IHN0b3A6IGZhbHNlIH0sXG4gICAgfTtcbn1cblxuLy8gV2hhdCBhIHNjYW5uZWQgbGlzdGluZyBlbnRyeSBtZWFudCB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3VyIGluZGV4XG50eXBlIFNjYW5PdXRjb21lID0gXCJmaWx0ZXJlZFwiIHwgXCJuZXdcIiB8IFwidXBkYXRlZFwiIHwgXCJ0b21ic3RvbmVcIiB8IFwidW5jaGFuZ2VkXCI7XG50eXBlIFNjYW5UYWxseSA9IFJlY29yZDxTY2FuT3V0Y29tZSwgbnVtYmVyPjtcbmZ1bmN0aW9uIG5ld1NjYW5UYWxseSgpOiBTY2FuVGFsbHkge1xuICAgIHJldHVybiB7IGZpbHRlcmVkOiAwLCBuZXc6IDAsIHVwZGF0ZWQ6IDAsIHRvbWJzdG9uZTogMCwgdW5jaGFuZ2VkOiAwIH07XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yZVN5bmMge1xuICAgIC8vIFBlciBzb3VyY2Ugc2xvdCwgaW4gc3RlcCB3aXRoIHRoZSBzdG9yZSdzIHNvdXJjZXMgYXJyYXkuIFNsb3RzIGFyZSBuZXZlciBzcGxpY2VkIG91dCAtIGEgcmVtb3ZlZCBvbmUgaXMgbWFya2VkIGRlYWQgLSBzbyBhIHNsb3QgbnVtYmVyIGhlbGQgYnkgYSBydW5uaW5nIGxvb3AgYWx3YXlzIG1lYW5zIHRoZSBzYW1lIHNvdXJjZS5cbiAgICBwcml2YXRlIHN0YXRlczogU291cmNlU3RhdGVbXTtcbiAgICAvLyBTY2FucyAvIGZ1bGwgc3luY3MgaW4gcHJvZ3Jlc3MgKGEgU2V0IC0gb25lIHNvdXJjZSBjYW4gaGF2ZSBhIGNoYW5nZSBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIGFjdGl2aXRpZXMgPSBuZXcgU2V0PFN5bmNBY3Rpdml0eT4oKTtcbiAgICAvLyBHdWFyZHMgYWdhaW5zdCBhIHNlY29uZCBldmljdGlvbiBwYXNzIHN0YXJ0aW5nIHdoaWxlIG9uZSBpcyBzdGlsbCB3YWxraW5nIHRoZSBpbmRleFxuICAgIHByaXZhdGUgZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAvLyBXaGVuIGVhY2gga2V5IHdhcyBsYXN0IHNlcnZlZCwgZm9yIHJlYWRlckRpc2tMaW1pdCdzIExSVSBldmljdGlvbi4gTmV2ZXIgcGVyc2lzdGVkIChhIHJlc3RhcnQgaGFzIG5vIG9waW5pb24gYWJvdXQgcmVjZW5jeSksIGFuZCBvbmx5IGtlcHQgZm9yIGtleXMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gcmVhZCAtIGFuIGluZGV4IGVudHJ5IG5vIG9uZSBoYXMgdG91Y2hlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0LlxuICAgIHByaXZhdGUgbGFzdEFjY2VzcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBCbG9iU3RvcmUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBzdG9yZS5zb3VyY2VzLm1hcCgoKSA9PiBuZXdTb3VyY2VTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogU3RhcnRzIGV2ZXJ5IGxpdmUgc291cmNlJ3Mgc3luY2hyb25pemF0aW9uLCBwbHVzIHRoZSBtYWludGVuYW5jZSBsb29wcy4gQ2FsbGVkIG9uY2UsIGJ5IHRoZSBzdG9yZSdzIGluaXQgLSB0aGUgc3RvcmUncyBpbmRleCBtdXN0IGFscmVhZHkgYmUgbG9hZGVkLCBzaW5jZSBzY2FucyB3cml0ZSBzdHJhaWdodCBpbnRvIGl0LiAqL1xuICAgIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJ1blNvdXJjZVN5bmMoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKENPTkZJR19QT0xMX0lOVEVSVkFMLCAoKSA9PiB0aGlzLnBvbGxSb3V0aW5nQ29uZmlnKCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5jbGVhbnVwVG9tYnN0b25lcygpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZUhpc3RvcnlMaW1pdCgpLCB0aGlzLnN0b3JlLnN0b3BwZWQpO1xuICAgICAgICAvLyBSZWFkIGxpdmU6IHRoZSBsaW1pdCBjb21lcyBmcm9tIHRoZSBjb25maWcsIHNvIGEgc3RvcmUgdGhhdCBnYWlucyBvbmUgbGF0ZXIgc3RhcnRzIGVuZm9yY2luZyBpdCB3aXRob3V0IGJlaW5nIHJlc3RhcnRlZFxuICAgICAgICBydW5JbmZpbml0ZVBvbGwoRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCwgKCkgPT4gdGhpcy5lbmZvcmNlRGlza0xpbWl0KCksIHRoaXMuc3RvcmUuc3RvcHBlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNrcyBldmVyeSBwZWVyIGZvciB0aGUgcm91dGluZyBjb25maWcsIGFuZCB0YWtlcyBpdCBpZiBpdCBpcyBuZXdlciB0aGFuIG91cnMuIFRoaXMgaXMgdGhlIHdob2xlXG4gICAgICogb2YgY29uZmlndXJhdGlvbiBwcm9wYWdhdGlvbjogaXQgcmlkZXMgYmVzaWRlIHRoZSBzY2FucyByYXRoZXIgdGhhbiBiZWluZyBwYXJ0IG9mIHRoZW0sIGJlY2F1c2VcbiAgICAgKiBvbmUgc21hbGwgcmVhZCBpcyB3b3J0aCBkb2luZyBldmVyeSBmZXcgbWludXRlcyB3aGlsZSBhIGZ1bGwgbGlzdGluZyBpcyBub3QsIGFuZCBiZWNhdXNlIGFcbiAgICAgKiBjb25maWcgd2UgYXJlIG1pc3NpbmcgaXMgd2hhdCBzdG9wcyBldmVyeXRoaW5nIGVsc2UgZnJvbSBiZWluZyByaWdodC5cbiAgICAgKlxuICAgICAqIFRoZSBjb3B5IGlzIHN0b3JlZCB0aGUgc2FtZSB3YXkgYSBzY2FuIHN0b3JlcyBhbnl0aGluZyBpdCBwdWxscyAtIGFuIGludGVybmFsIHdyaXRlIGludG8gb3VyIG93blxuICAgICAqIHN0b3JlIC0gYW5kIHRoZSBzdG9yZSBub3RpY2VzIHRoYXQgZmlsZSBsYW5kaW5nIGFuZCByZS1jb25maWd1cmVzIGl0c2VsZi4gTm90aGluZyBoZXJlIGtub3dzIHdoYXRcbiAgICAgKiBhIGNvbmZpZyBtZWFuczsgaXQgb25seSBrbm93cyB0aGlzIG9uZSBmaWxlIGlzIHdvcnRoIGFza2luZyBmb3Igb2Z0ZW4uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwb2xsUm91dGluZ0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnN0b3JlLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc291cmNlc1tpXS5pbnRlcm1lZGlhdGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbaV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB0aGVpcnMgPSBhd2FpdCBzb3VyY2UuZ2V0MihST1VUSU5HX0ZJTEUsIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGVpcnMgfHwgIXRoZWlycy5kYXRhIHx8ICF0aGVpcnMuZGF0YS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCB2ZXJzaW9uID0gZ2V0Q29uZmlnVmVyc2lvbihwYXJzZVJvdXRpbmdEYXRhKHRoZWlycy5kYXRhKSk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPD0gdGhpcy5zdG9yZS5yb3V0aW5nVmVyc2lvbigpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGluZyBjb25maWcgdmVyc2lvbiAke3ZlcnNpb259IGZvdW5kIG9uICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAod2UgaGF2ZSAke3RoaXMuc3RvcmUucm91dGluZ1ZlcnNpb24oKX0sIHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogdGFraW5nIGl0YCk7XG4gICAgICAgICAgICAgICAgLy8gU3RhbXBlZCBOT1csIG5vdCB3aXRoIHRoZWlyIHdyaXRlIHRpbWU6IGNvbmZpZ3MgYXJlIG9yZGVyZWQgYnkgdmVyc2lvbiwgYW5kIHRoaXMgb25lIGlzIG5ld2VyIGJ5IHRoYXQgb3JkZXJpbmcuIFRoZWlyIGZpbGUgY2FuIGVhc2lseSBiZSBvbGRlciBieSB3cml0ZSB0aW1lIChvdXJzIHdhcyByZXdyaXR0ZW4gbG9jYWxseSBtb3JlIHJlY2VudGx5KSwgYW5kIHRoZSBzdG9yZSdzIG9ubHktdGFrZS10aGUtbGF0ZXN0IHJ1bGUgd291bGQgdGhlbiBkcm9wIGl0IC0gbGVhdmluZyB1cyBmaW5kaW5nIHRoZSBzYW1lIG5ld2VyIHZlcnNpb24gb24gZXZlcnkgcG9sbCBhbmQgbmV2ZXIgYWRvcHRpbmcgaXQuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zZXQoeyBwYXRoOiBST1VUSU5HX0ZJTEUsIGRhdGE6IHRoZWlycy5kYXRhLCBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgcGVlciB0aGF0IGNhbm5vdCBhbnN3ZXIgaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhIHNvdXJjZSB0aGF0IGlzIGRvd247IHRoZSBuZXh0IHBvbGwgYXNrcyBhZ2FpblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENoZWNraW5nICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmb3IgYSBuZXdlciByb3V0aW5nIGNvbmZpZyBmYWlsZWQgKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTdG9wcyBldmVyeSBzb3VyY2UncyBsb29wcyAodGhlIHN0b3JlJ3Mgb3duIHN0b3AgdG9rZW4gc3RvcHMgdGhlIG1haW50ZW5hbmNlIGxvb3BzKS4gKi9cbiAgICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc3RhdGUgb2YgdGhpcy5zdGF0ZXMpIHtcbiAgICAgICAgICAgIHN0YXRlLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBzbG90IHRoZSBzdG9yZSBqdXN0IGFwcGVuZGVkIHRvIGl0cyBzb3VyY2VzIGFycmF5OiBpdCBzdGFydHMgZnJvbSBub3RoaW5nLCBzbyBpdCBnZXRzIGEgZnVsbCBzY2FuLiAqL1xuICAgIHB1YmxpYyBhZGRTb3VyY2Uoc2xvdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGVzW3Nsb3RdID0gbmV3U291cmNlU3RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5Tb3VyY2VTeW5jKHNsb3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBzbG90IHN0YXlzIGluIHRoZSBzdG9yZSdzIGFycmF5cyBmb3JldmVyIChydW5uaW5nIGxvb3BzIGhvbGQgc2xvdCBudW1iZXJzKTsgaXQganVzdCBnb2VzIGRlYWQgLSBsb29wcyBzdG9wLCBhbmQgaXRzIGluZGV4IGVudHJpZXMgZHJvcCAob3RoZXIgc291cmNlcycgc2NhbnMgcmUtZmluZCBhbnkgY29weSB0aGF0J3Mgc3RpbGwgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG5ldyBjb25maWcpLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZW1vdmVTb3VyY2Uoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3Nsb3RdO1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zdG9yZS5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgc3RhdGUuZGVhZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnN0b3BwZWQuc3RvcCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHN0YXRlLmluaXRpYWxTY2FuLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgbGV0IHNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNsb3RTb3VyY2VzTGlzdEluZGV4KHNsb3QpO1xuICAgICAgICAvLyBUaGUgc2FtZSBVUkwgY2FuIGJlIGFub3RoZXIgbGl2ZSBzbG90IChvbmUgZW50cnkgcGVyIHZhbGlkIHdpbmRvdykgLSB0aGUgZW5kcG9pbnQgaXMgc3RpbGwgY29uZmlndXJlZCwgc28gaXRzIGVudHJpZXMgc3RheVxuICAgICAgICBpZiAoc291cmNlc0xpc3RJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc3RvcmUuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoc291cmNlc0xpc3RJbmRleCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGRyb3BwZWQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gc291cmNlc0xpc3RJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gRm9yZ290dGVuLCBub3QgZGVsZXRlZDogdGhlIGZpbGVzIHN0aWxsIGV4aXN0IHdoZXJldmVyIHRoYXQgc291cmNlIHB1dCB0aGVtLCB3ZSBqdXN0IG5vIGxvbmdlciBoYXZlIGEgd2F5IHRvIHJlYWNoIHRoZW1cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIGRyb3BwZWQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmVkIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgc2NhbnMgYXJlIHN0b3BwZWQgYW5kICR7ZHJvcHBlZH0gaW5kZXggZW50cmllcyBpdCBoZWxkIHdlcmUgZHJvcHBlZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmVkIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBpdHMgc2NhbnMgYXJlIHN0b3BwZWQgKGl0cyBVUkwgaXMgc3RpbGwgc2VydmVkIGJ5IGFub3RoZXIgc2xvdCwgc28gaXRzIGluZGV4IGVudHJpZXMgc3RheSlgKTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciBhIHNsb3QgaXMgc3RpbGwgY29uZmlndXJlZC4gRGVhZCBzbG90cyBhcmUgbmV2ZXIgc2Nhbm5lZCwgd3JpdHRlbiwgb3IgcmVhZC4gKi9cbiAgICBwdWJsaWMgaXNMaXZlKHNsb3Q6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnN0b3JlLnNvdXJjZXNbc2xvdF0gJiYgIXRoaXMuc3RhdGVzW3Nsb3RdPy5kZWFkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBY3Rpdml0aWVzKCk6IFN5bmNBY3Rpdml0eVtdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmFjdGl2aXRpZXNdO1xuICAgIH1cblxuICAgIC8qKiBBIGtleSB3YXMganVzdCBzZXJ2ZWQsIHNvIGl0IGdvZXMgdG8gdGhlIGJhY2sgb2YgdGhlIGV2aWN0aW9uIHF1ZXVlLiAqL1xuICAgIHB1YmxpYyBub3RlQWNjZXNzKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGFzdEFjY2Vzcy5zZXQoa2V5LCBEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBpbmRleCBzdGlsbCBob2xkcyBleGFjdGx5IHRoZSBlbnRyeSBhIHBhc3MgcGlja2VkIHVwIGVhcmxpZXIuIEluZGV4IHJvd3MgYXJlIHJlYWQgb3V0IG9mIHRoZSBkYXRhYmFzZSBwZXIgbG9va3VwLCBzbyB0aGlzIGNvbXBhcmVzIHRoZSByb3csIG5vdCB0aGUgb2JqZWN0IC0gYSB3cml0ZSBsYW5kaW5nIG1pZC1wYXNzIGNoYW5nZXMgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIHRocmVlLlxuICAgIHByaXZhdGUgZW50cnlVbmNoYW5nZWQoa2V5OiBzdHJpbmcsIGVudHJ5OiBJbmRleEVudHJ5KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5zdG9yZS5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY3VycmVudC53cml0ZVRpbWUgPT09IGVudHJ5LndyaXRlVGltZSAmJiBjdXJyZW50LnNpemUgPT09IGVudHJ5LnNpemUgJiYgY3VycmVudC5zb3VyY2VzTGlzdEluZGV4ID09PSBlbnRyeS5zb3VyY2VzTGlzdEluZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0dXMoKTogQXJjaGl2ZXNTeW5jU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHRoaXMuc3RhdGVzLmV2ZXJ5KHggPT4geC5zY2FuQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpLFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zdG9yZS5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93czogeC52YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGU6IHgucm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYzogeC5ub0Z1bGxTeW5jLFxuICAgICAgICAgICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0aGlzLnN0YXRlc1tpXS5zdXBwb3J0c0NoYW5nZXNBZnRlcixcbiAgICAgICAgICAgICAgICBpbml0aWFsU2NhbkNvbXBsZXRlOiB0aGlzLnN0YXRlc1tpXS5zY2FuQ29tcGxldGUsXG4gICAgICAgICAgICAgICAgc2Nhbm5lZENvdW50OiB0aGlzLnN0YXRlc1tpXS5zY2FubmVkQ291bnQsXG4gICAgICAgICAgICB9KSkuZmlsdGVyKCh4LCBpKSA9PiB0aGlzLmlzTGl2ZShpKSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIExpc3RpbmdzIGNvbWUgc3RyYWlnaHQgZnJvbSB0aGUgaW5kZXgsIHNvIHRoZXkgbXVzdCB3YWl0IGZvciBvdXIgb3duIGJhc2Ugc291cmNlJ3MgaW5pdGlhbCBzY2FuICh3aGljaCBtaWdodCBsYWcgbWludXRlcykgYmVmb3JlIHRoZXkgYXJlIHRydXN0d29ydGh5LiBUaGUgYmFzZSAobG9jYWwgZGlzaykgaXMgaW1wbGljaXRseSByZXF1aXJlZCAtIHJlbW90ZSBzb3VyY2VzIGFyZSBub3QsIHRoZXkgY29tZSBhbmQgZ28uICovXG4gICAgcHVibGljIGFzeW5jIHdhaXRGb3JSZXF1aXJlZFNjYW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlc1swXS5pbml0aWFsU2Nhbi5wcm9taXNlO1xuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgdmFsaWQgd2luZG93IGhhbmRvZmZzLCB3aGVyZSBhbm90aGVyIHByb2Nlc3Mgd3JvdGUgZmlsZXMgdG8gdGhlIHNoYXJlZCBmb2xkZXIgdGhhdCBvdXIgaW5kZXggaGFzbid0IHNlZW4uICovXG4gICAgcHVibGljIGFzeW5jIHJlc2NhbkJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY1NvdXJjZSgwKTtcbiAgICB9XG5cbiAgICAvKiogT25lIHN5bmNocm9uaXphdGlvbiByb3VuZCBvZiBhIHNvdXJjZTogdGhlIFBVTEwgZGlyZWN0aW9uIGFsd2F5cyAoaXRzIGxpc3RpbmcsIGFwcGxpZWQgdG8gb3VyIGluZGV4KSwgYW5kIHdpdGggXCJwdXNoXCIgdGhlIHB1c2ggZGlyZWN0aW9uIHRvbyAod2hhdCBvdXIgaW5kZXggc2F5cyB0aGUgc291cmNlIGlzIG1pc3NpbmcsIHdyaXR0ZW4gdG8gaXQpLiBQdXNoIGlzIGFuIGFyZ3VtZW50IHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgY2FsbCBiZWNhdXNlIGl0IGNhbm5vdCBydW4gd2l0aG91dCB0aGUgcHVsbCdzIGxpc3RpbmcgLSB0aGUgaW5kZXggYWxvbmUgY2Fubm90IHNheSB3aGF0IHRoZSBzb3VyY2UgYWxyZWFkeSBob2xkcy4gTGlzdGluZ3MgdW5ibG9jayAoaW5pdGlhbFNjYW4pIGJldHdlZW4gdGhlIGhhbHZlcywgc28gdGhleSBuZXZlciB3YWl0IGJlaGluZCBhIHB1c2guICovXG4gICAgcHJpdmF0ZSBhc3luYyBzeW5jU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIsIHB1c2g/OiBcInB1c2hcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGlzdGluZyA9IGF3YWl0IHRoaXMucHVsbFNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBpZiAocHVzaCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wdXNoU291cmNlKHNvdXJjZUluZGV4LCBsaXN0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKToganVzdCBpdHMgY2hhbmdlcyBzaW5jZSB0aGUgYm91bmRhcnkgbmVpZ2hib3Job29kLCB3aXRoIG1hdGNoaW5nIHZhbHVlcyBwdWxsZWQgb250byBvdXIgb3duIGRpc2suICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJib3VuZGFyeVNjYW5TdGFydFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzaW5jZTogY29uZmlnLnNpbmNlLCByb3V0ZTogY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUgfSk7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgc291cmNlLmdldENoYW5nZXNBZnRlcjIoeyB0aW1lOiBjb25maWcuc2luY2UsIHJvdXRlczogY29uZmlnLnJvdXRlICYmIFtjb25maWcucm91dGVdIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGFsbHkuZmlsdGVyZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShmaWxlLnBhdGgpO1xuICAgICAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgIHRhbGx5LnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFNpemUgMCBpbiBhIGxpc3RpbmcgSVMgYSBkZWxldGlvbiAoYW4gZW1wdHkgZmlsZSBpcyBhIG1pc3NpbmcgZmlsZSksIHNvIGl0IGlzIHRha2VuIGFzIG9uZVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB0YWxseS50b21ic3RvbmUrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiBzb3VyY2UsIHRvOiB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLCBwYXRoOiBmaWxlLnBhdGgsIHNpemU6IGZpbGUuc2l6ZSwgd3JpdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQm91bmRhcnkgc2NhbiBjb3VsZCBub3QgY29weSAke2ZpbGUucGF0aH0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KTogaXRzIGNoYW5nZSBmZWVkIGxpc3RlZCBpdCAoJHtmaWxlLnNpemV9IGJ5dGVzLCB3cml0ZVRpbWUgJHtuZXcgRGF0ZShmaWxlLmNyZWF0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBidXQgdGhlIHJlYWQgZm91bmQgbm90aGluZ2ApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwgZmlsZS5wYXRoLCBjb3BpZWQuc2l6ZSk7XG4gICAgICAgICAgICBpZiAoY29waWVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNldEluZGV4RGVsZXRlZChmaWxlLnBhdGgsIGNvcGllZC53cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgIHRhbGx5LnRvbWJzdG9uZSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGNvcGllZC53cml0ZVRpbWUsIHNpemU6IGNvcGllZC5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0YWxseS51cGRhdGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbGx5Lm5ldysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImJvdW5kYXJ5U2NhbkZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc2NhblN0YXJ0LCBzaW5jZTogY29uZmlnLnNpbmNlLCBjaGFuZ2VzOiBjaGFuZ2VzLmxlbmd0aCwgbmV3UGF0aHM6IHRhbGx5Lm5ldywgdXBkYXRlZDogdGFsbHkudXBkYXRlZCwgdG9tYnN0b25lczogdGFsbHkudG9tYnN0b25lLCB1bmNoYW5nZWQ6IHRhbGx5LnVuY2hhbmdlZCB9KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgcGVyLXNvdXJjZSBsb29wcyDilIDilIBcblxuICAgIHByaXZhdGUgYXN5bmMgcnVuU291cmNlU3luYyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmUucmVnaXN0ZXJTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIC8vIElmIGEgc2xvdCBldmVyIGdldHMgVFdPIG9mIHRoZXNlLCBpdHMgbG9vcHMgYXJlIGRvdWJsZWQgLSBldmVyeSBwb2xsIGFuZCBmdWxsIHN5bmMgcnVucyB0d2ljZVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzb3VyY2VTeW5jU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc291cmNlSW5kZXgsIHVybDogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS51cmwsIGludGVybWVkaWF0ZTogdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUgfSk7XG4gICAgICAgIC8vIFJlYWQgbGl2ZSBmb3IgZXZlcnkgcGFzcywgbm90IGNhcHR1cmVkIC0gdGhlIHN0b3JlJ3Mgc291cmNlIGxpc3QgY2FuIGNoYW5nZSB3aGlsZSBsb29wcyBydW5cbiAgICAgICAgbGV0IG5vRnVsbFN5bmMgPSAoKSA9PiB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdLm5vRnVsbFN5bmM7XG4gICAgICAgIC8vIEFuIGludGVybWVkaWF0ZSBpcyBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZSBQT1JUIG9udG8gYSBzb3VyY2Ugd2UgYWxyZWFkeSBoYXZlOiB0aGUgc2FtZSBidWNrZXQsIHJlYWNoYWJsZSBhbm90aGVyIHdheSBmb3IgYSBmZXcgbWludXRlcy4gU2Nhbm5pbmcgaXQgd291bGQgbGlzdCBleGFjdGx5IHdoYXQgc2Nhbm5pbmcgdGhhdCBzb3VyY2UgbGlzdHMsIGFnYWluc3QgYSBwb3J0IHRoYXQgaXMgYWJvdXQgdG8gZGlzYXBwZWFyIC0gc28gaXQgaXMgbmV2ZXIgc2Nhbm5lZCwgYW5kIHRoZSBzb3VyY2UgaXQgd2FzIHNwbGl0IG91dCBvZiBjb3ZlcnMgaXQgZm9yIGFzIGxvbmcgYXMgaXQgZXhpc3RzIGFuZCBhZnRlciBpdCBpcyBnb25lLlxuICAgICAgICBpZiAodGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XS5pbnRlcm1lZGlhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLnNjYW5Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCAmJiAhc3RhdGUuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCBzb3VyY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgPSAhIWNvbmZpZy5zdXBwb3J0c0NoYW5nZXNBZnRlcjtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTb3VyY2Uoc291cmNlSW5kZXgsIFwicHVzaFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJpbml0aWFsU2NhbkZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCByZXRyeUluTXM6IFNDQU5fUkVUUllfREVMQVksIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFNDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBsb29wIGNhbiBhbHNvIGV4aXQgYnkgdGhlIHN0b3AgdG9rZW5zLCBhbmQgbm90aGluZyBtYXkgd2FpdCBmb3JldmVyIG9uIGEgc3RvcHBlZCBzb3VyY2UncyBpbml0aWFsIHNjYW5cbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgIGlmICghbm9GdWxsU3luYygpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3B5aW5nIGZpbGVzIGZyb20gc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDpgLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChDSEFOR0VTX1BPTExfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBIHNjYW4gdGhhdCBoYXMgbm90IHN1Y2NlZWRlZCB5ZXQgaXMgcmV0cmllZCBIRVJFLCBiZWZvcmUgYW55dGhpbmcgZWxzZSAtIHBvbGxpbmcgY2hhbmdlcyBhbmQgY29weWluZyBhZ2FpbnN0IGEgbmV2ZXItc2Nhbm5lZCBzb3VyY2Ugd291bGQgcnVuIG9uIGFyYml0cmFyaWx5IHN0YWxlIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5zY2FuU3VjY2VlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NvdXJjZShzb3VyY2VJbmRleCwgXCJwdXNoXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSwgc3RhdGUuc3RvcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZVTExfUkVTQ0FOX1VOSU5ERVhFRF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU291cmNlKHNvdXJjZUluZGV4LCBcInB1c2hcIik7XG4gICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMoKSkgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICB9LCBzdGF0ZS5zdG9wcGVkKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgUFVMTCBkaXJlY3Rpb246IGEgZnVsbCBtZXRhZGF0YSBzY2FuIChzaXplLCB3cml0ZVRpbWUsIHBhdGgpIG9mIG9uZSBzb3VyY2UsIGFwcGxpZWQgdG8gb3VyIGluZGV4LiBSZXR1cm5zIHRoZSBzb3VyY2UncyBsaXN0aW5nIChwYXRoIC0+IHdyaXRlIHRpbWUpLCB3aGljaCBwdXNoU291cmNlIHVzZXMgZm9yIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uXG4gICAgcHJpdmF0ZSBhc3luYyBwdWxsU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc2NhblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7IHR5cGU6IFwibWV0YWRhdGFTY2FuXCIsIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBzdGFydFRpbWU6IHNjYW5TdGFydCB9O1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwic2NhblN0YXJ0XCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCkgfSk7XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0aWxsIHJ1bm5pbmcgKCR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zLCBzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSlgKTtcbiAgICAgICAgfSwgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIC8vIFRoZSBsaXN0aW5nIHJlcXVlc3QgZGVsaWJlcmF0ZWx5IHRha2VzIG5vIHRpbWUgb3Igcm91dGUgZmlsdGVyczogb3VyIHNsb3dlc3Qgc291cmNlcyAoYmFja2JsYXplKSBzdXBwb3J0IG5laXRoZXIsIHNvIGZpbHRlcmluZyB3b3VsZCBoYXBwZW4gYWZ0ZXIgdGhlIGZ1bGwgZmV0Y2ggYW55d2F5IC0gbGl0dGxlIGJlbmVmaXQsIG1vcmUgcm9vbSBmb3IgZGVzeW5jaHJvbml6YXRpb24uIEFuZCBpZiBhIGZ1bGwgbGlzdGluZyBldmVyIGJlY29tZXMgdG9vIGJpZyB0byBzZW5kIG92ZXIgdGhlIG5ldHdvcmssIGl0IGlzIGFsc28gdG9vIGJpZyBmb3IgdGhlIHJlY2VpdmluZyBwcm9jZXNzIHRvIGhvbGQgaW4gbWVtb3J5IC0gdGhlIGZpeCBpcyBtb3JlIHJvdXRpbmcgc2hhcmRzIChlYWNoIHN0b3JpbmcgYW5kIHNlbmRpbmcgbGVzcyksIG5vdCBmaWx0ZXJpbmcuXG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgfHwgc3RhdGUuc3RvcHBlZC5zdG9wKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBXaGF0IHdlIGJlbGlldmUgdGhlIHNvdXJjZSBoYXM6IHdoaWNoZXZlciBpcyBsYXJnZXIgb2YgaXRzIHByZXZpb3VzIGxpc3RpbmcgYW5kIHRoZSBpbmRleCBlbnRyaWVzIG5hbWluZyBpdCBhcyBob2xkZXIuIEZpbGVzIGRvIG5vdCBqdXN0IHZhbmlzaCAtIGEgbGlzdGluZyBmYXIgYmVsb3cgdGhpcyBtZWFucyB0aGUgb3RoZXIgZW5kIGlzIGJyaWVmbHkgYnJva2VuLCBhbmQgYmVsaWV2aW5nIGl0IHdvdWxkIHB1cmdlIGV2ZXJ5dGhpbmcgaXQgaGVsZC5cbiAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCA9PT0gc2Nhbm5lZFNvdXJjZXNMaXN0SW5kZXgpIGhlbGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gTWF0aC5tYXgoc3RhdGUuc2Nhbm5lZENvdW50LCBoZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIShleHBlY3RlZCA+IDAgJiYgZmlsZXMubGVuZ3RoIDwgZXhwZWN0ZWQgLyAyKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRzID49IFNVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBTVElMTCBsaXN0cyAke2ZpbGVzLmxlbmd0aH0gZmlsZXMgd2hlcmUgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQsIGFmdGVyICR7YXR0ZW1wdHN9IHJldHJpZXMgLSBhY2NlcHRpbmcgdGhlIGxpc3RpbmcgYXMgdGhlIHRydXRoYCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5zdG9yZS5mb2xkZXJ9KSBsaXN0ZWQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzLCBidXQgfiR7ZXhwZWN0ZWR9IHdlcmUgZXhwZWN0ZWQgKHByZXZpb3VzIGxpc3RpbmcgJHtzdGF0ZS5zY2FubmVkQ291bnR9LCBpbmRleCBlbnRyaWVzIGl0IGhvbGRzICR7aGVsZH0pIC0gdGhlIG90aGVyIGVuZCBpcyBwcm9iYWJseSBicmllZmx5IGJyb2tlbjsgYXNraW5nIGFnYWluIGluICR7U1VTUElDSU9VU19TQ0FOX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChyZXRyeSAke2F0dGVtcHRzfSBvZiAke1NVU1BJQ0lPVVNfU0NBTl9SRVRSSUVTfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTVVNQSUNJT1VTX1NDQU5fUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBzb3VyY2UgbWF5IGhhdmUgYmVlbiByZW1vdmVkIHdoaWxlIHRoZSBsaXN0aW5nIHdhcyBpbiBmbGlnaHQ7IGl0cyByZXN1bHRzIGFyZSBkZWFkXG4gICAgICAgIGlmIChzdGF0ZS5zdG9wcGVkLnN0b3ApIHJldHVybiBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBpbmRleFNpemVCZWZvcmUgPSB0aGlzLnN0b3JlLmluZGV4U2l6ZSgpO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGxldCB0YWxseSA9IG5ld1NjYW5UYWxseSgpO1xuICAgICAgICBsZXQgbmV3UGF0aHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWVuLnNldChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhbGx5W3RoaXMudXBkYXRlU2NhbkluZGV4KHNvdXJjZUluZGV4LCBmaWxlKV0rKztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIC8vIEVudHJpZXMgdGhpcyBzb3VyY2Ugd2FzIHRoZSBob2xkZXIgb2YsIGJ1dCB0aGF0IGl0cyBsaXN0aW5nIGRpZCBub3QgbWVudGlvbiwgYXJlIGZvcmdvdHRlbiAtIHdlIHdlcmUgd3JvbmcgYWJvdXQgd2hlcmUgdGhleSBhcmUsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGVtIGhhdmluZyBiZWVuIGRlbGV0ZWQuIEVudHJpZXMgY2hhbmdlZCBhZnRlciB0aGUgc2NhbiBzdGFydGVkIGFyZSBrZXB0OiB0aGUgbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBhcmUgbm90IHdhbGtlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZSB0aGV5IGFyZSBub3QgZmlsZXMgYSBsaXN0aW5nIGNvdWxkIHZvdWNoIGZvci5cbiAgICAgICAgbGV0IHJlbW92ZWRGcm9tSW5kZXggPSAwO1xuICAgICAgICBsZXQgbWlzc2luZ09uU291cmNlID0gMDtcbiAgICAgICAgbGV0IHNjYW5uZWRTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2VzTGlzdEluZGV4ID09PSBzY2FubmVkU291cmNlc0xpc3RJbmRleCAmJiBlbnRyeS5jaGFuZ2VkQXQgPCBzY2FuU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRGcm9tSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50ZWQgb25seSB3aGVuIHRoZSBzb3VyY2UgU0hPVUxEIGhvbGQgdGhlIGVudHJ5IChpdHMgcm91dGUgbWF0Y2hlcykgLSB0aGVzZSBhcmUgd2hhdCB0aGUgcmVjb25jaWxlIHBhc3MgcHVzaGVzIHRvIGl0ICh3aGljaCBhbHNvIGlnbm9yZXMgdGhlIHZhbGlkIHdpbmRvdzogc3luY2hyb25pemF0aW9uIG1vdmVzIGV4aXN0aW5nIHZhbHVlcywgdGhlIHdpbmRvdyBvbmx5IHJvdXRlcyBmcmVzaCB3cml0ZXMpXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgfVxuICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJzY2FuRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzY2FuU3RhcnQsIGxpc3RlZDogZmlsZXMubGVuZ3RoLCBpbmRleGVkQmVmb3JlOiBpbmRleFNpemVCZWZvcmUsIG5ld1BhdGhzOiB0YWxseS5uZXcsIHVwZGF0ZWQ6IHRhbGx5LnVwZGF0ZWQsIHRvbWJzdG9uZXM6IHRhbGx5LnRvbWJzdG9uZSwgdW5jaGFuZ2VkOiB0YWxseS51bmNoYW5nZWQsIG91dHNpZGVSb3V0ZTogdGFsbHkuZmlsdGVyZWQsIG1pc3NpbmdPblNvdXJjZSwgcmVtb3ZlZEZyb21JbmRleCB9KTtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgc3RhdGUuc2NhblN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBzZWVuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwdXNoIGRpcmVjdGlvbiBvZiBzeW5jaHJvbml6YXRpb246IGV2ZXJ5dGhpbmcgd2Uga25vdyB0aGF0IHRoZSBzb3VyY2UgaXMgbWlzc2luZyAob3IgaG9sZHMgYW4gb2xkZXIgY29weSBvZikgaXMgd3JpdHRlbiB0byBpdCDigJQgaW5jbHVkaW5nIGRlbGV0aW9ucywgYXMgdG9tYnN0b25lIHdyaXRlcy4gVGhpcyBpcyB3aGF0IGhlYWxzIGEgc291cmNlIHdob3NlIGJhY2tncm91bmQgd3JpdGVzIGZhaWxlZCAoZS5nLiBpdCB3YXMgZG93bik6IHRoZSBuZXh0IHNjYW4gc2VlcyB3aGF0J3MgbWlzc2luZyBhbmQgcmUtc2VuZHMgaXQuIEEgZmFpbGluZyBmaWxlIGlzIHNraXBwZWQsIG5vdCBmYXRhbCAoaW1tdXRhYmxlIHRhcmdldHMgYXJlIGhhbmRsZWQgYnkgZm9yY2VTZXRJbW11dGFibGUsIGFuZCBvbmUgdW5yZWFkYWJsZSB2YWx1ZSBtdXN0IG5vdCBzdG9wIHRoZSByZXN0IG9mIHRoZSBwYXNzKSAtIG9ubHkgYSBydW4gb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMgKHRoZSBzb3VyY2UgaXRzZWxmIGlzIGRvd24pIGFib3J0cyB1bnRpbCB0aGUgbmV4dCBzY2FuIGN5Y2xlLlxuICAgIHByaXZhdGUgYXN5bmMgcHVzaFNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3dzLCByb3V0ZSB9ID0gdGhpcy5zdG9yZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd3NBY2NlcHRXcml0ZXModmFsaWRXaW5kb3dzKTtcbiAgICAgICAgbGV0IHRhcmdldFNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnN0b3JlLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc291cmNlSW5kZXgpO1xuICAgICAgICBsZXQgcHVzaGVkID0gMDtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmlsZXMgZmlyc3QsIHRoZW4gdGhlIGRlbGV0aW9ucyAtIHR3byB3YWxrcyBub3cgdGhhdCB0aGV5IGFyZSB0d28gbWFwcywgYW5kIHRoZSBkZWxldGlvbnMgb25lIGlzIHRoZSBzaG9ydCBvbmVcbiAgICAgICAgbGV0IHB1c2hhYmxlOiB7IGtleTogc3RyaW5nOyB3cml0ZVRpbWU6IG51bWJlcjsgZW50cnk/OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggPT09IHRhcmdldFNvdXJjZXNMaXN0SW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHVzaGFibGUucHVzaCh7IGtleSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGVudHJ5IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBwdXNoYWJsZS5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IHRvbWJzdG9uZS53cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeyBrZXksIHdyaXRlVGltZSwgZW50cnkgfSBvZiBwdXNoYWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuc3RvcHBlZC5zdG9wIHx8IHN0YXRlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBub3QgcmVjb25jaWxlZDogaXQgcHJvcGFnYXRlcyBieSBiZWluZyBhc2tlZCBmb3IsIG9uIGl0cyBvd24gc2NoZWR1bGUgKHNlZSBwb2xsUm91dGluZ0NvbmZpZylcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjY2VwdHNXcml0ZXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gd3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbGV0aW9uIG9ubHkgbmVlZHMgcHVzaGluZyB3aGlsZSB0aGUgc291cmNlIHN0aWxsIGhvbGRzIGFuIG9sZGVyIGNvcHkuIEl0IHRyYXZlbHMgYXMgZGVsIChuZXZlciBhcyBhbiBlbXB0eSBzZXQgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKSwgd2l0aCB0aGUgT1JJR0lOQUwgZGVsZXRpb24gdGltZSBzbyBvcmRlcmluZyBzdXJ2aXZlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBzZXRcIiwga2V5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcHVzaGVkKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlciA9IGF3YWl0IHRoaXMuc3RvcmUuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICghaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogaG9sZGVyLCB0bzogc291cmNlLCBwYXRoOiBrZXksIHNpemU6IGVudHJ5LnNpemUsIHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY29waWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIHNldFwiLCBrZXksIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgICAgICBwdXNoZWQrKztcbiAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzKys7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPCBTWU5DX0VSUk9SX0xPR19MSU1JVCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtrZXl9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBTWU5DX01BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEEgcGF1c2UgcGVyIGZhaWx1cmUsIHNvIGEgZG93biBuZXR3b3JrIHRha2VzIG1pbnV0ZXMgdG8gYnVybiB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZS1mYWlsdXJlIGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnRcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY29uY2lsaW5nIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiBwdXNoZWQgJHtwdXNoZWR9IGZpbGVzLCAke2ZhaWxlZH0gZmFpbGVkJHthYm9ydGVkICYmIGAgYmVmb3JlIGFib3J0aW5nIHRoZSBwYXNzICgke2NvbnNlY3V0aXZlRmFpbHVyZXN9IGNvbnNlY3V0aXZlIGZhaWx1cmVzIC0gdGhlIHNvdXJjZSBsb29rcyBkb3duOyB0aGUgbmV4dCBzY2FuIGN5Y2xlIHJldHJpZXMpYCB8fCBcIlwifS4gRmlyc3QgZXJyb3JzOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcInJlY29uY2lsZUZpbmlzaFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwdXNoZWQsIGZhaWxlZCwgYWJvcnRlZCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNjYW5JbmRleChzb3VyY2VJbmRleDogbnVtYmVyLCBmaWxlOiBBcmNoaXZlRmlsZUluZm8pOiBTY2FuT3V0Y29tZSB7XG4gICAgICAgIC8vIEFuIGluLWZsaWdodCBzY2FuIGNhbiBvdXRsaXZlIGl0cyBzb3VyY2UncyByZW1vdmFsOyBpdHMgcmVzdWx0cyBhcmUgZGVhZFxuICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKHNvdXJjZUluZGV4KSkgcmV0dXJuIFwiZmlsdGVyZWRcIjtcbiAgICAgICAgaWYgKGZpbGUucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgaXMgTkVWRVIgcHVsbGVkIGZyb20gb3RoZXIgc291cmNlcyAtIGl0IG9ubHkgZXZlciBhcnJpdmVzIGFzIGFuIGV4cGxpY2l0LCB2ZXJzaW9uLXZhbGlkYXRlZCB3cml0ZSwgYW5kIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2suIFJvdXRlIGFuZCB2YWxpZC13aW5kb3cgZmlsdGVycyBjYW4ndCBwb3NzaWJseSBhcHBseSB0byBpdCBlaXRoZXI6IGl0IGlzIHRoZSBmaWxlIERFRklOSU5HIHRoZW0sIHNvIGZpbHRlcmluZyBpdCB3b3VsZCBtZWFuIGNlcnRhaW4gc291cmNlcyBjb3VsZCBuZXZlciBoYXZlIHRoZWlyIHJvdXRpbmcgY29uZmlnIHVwZGF0ZWQsIGV2ZXIuXG4gICAgICAgICAgICBpZiAoc291cmNlSW5kZXggIT09IDApIHJldHVybiBcImZpbHRlcmVkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgdmFsaWQgd2luZG93IGlzIGRlbGliZXJhdGVseSBOT1QgYXBwbGllZCBoZXJlOiBpdCBkZWNpZGVzIHdoZXJlIFdSSVRFUyByb3V0ZSwgYnV0IGEgc2NhbiBpcyB1cyBhc2tpbmcgYSBzb3VyY2Ugd2hhdCBpdCBhbHJlYWR5IGhvbGRzIC0gZXhpc3RpbmcgdmFsdWVzIHN5bmNocm9uaXplIHJlZ2FyZGxlc3Mgb2YgdGhlIHdpbmRvdyAodGhlIHNhbWUgcmVhc29uaW5nIHRoYXQgbGV0cyBzeW5jaHJvbml6YXRpb24gaWdub3JlIHRoZSBpbW11dGFibGUgZmxhZykuIE9ubHkgdGhlIHJvdXRlIGZpbHRlcnM6IGEgcGFydGlhbGx5LW92ZXJsYXBwaW5nIHNoYXJkJ3MgbGlzdGluZyBsZWdpdGltYXRlbHkgaW5jbHVkZXMga2V5cyB0aGF0IGFyZW4ndCBvdXJzLlxuICAgICAgICAgICAgbGV0IHsgcm91dGUgfSA9IHRoaXMuc3RvcmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGZpbGUucGF0aCkpKSByZXR1cm4gXCJmaWx0ZXJlZFwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc3RvcmUuZ2V0SW5kZXhFbnRyeShmaWxlLnBhdGgpO1xuICAgICAgICAvLyBUaGUgaGlnaGVzdCB3cml0ZSB0aW1lIHdpbnMgYWNyb3NzIGFsbCBzb3VyY2VzLCBhbmQgYSB0aWUga2VlcHMgd2hhdCB3ZSBoYXZlIC0gb3RoZXJ3aXNlIGV2ZXJ5IHJlc2NhbiBvZiBhbiB1bmNoYW5nZWQgZmlsZSB3b3VsZCByZS1yZWNvcmQgaXQsIG1vdmluZyBpdHMgaG9sZGVyIGFuZCB3cml0aW5nIGEgbG9nIHJlY29yZCBmb3Igbm90aGluZy4gY3VycmVudFdyaXRlVGltZSBjb3VudHMgZGVsZXRpb25zLCBzbyBhIGxpc3RpbmcgdGhhdCBzdGlsbCBzaG93cyBhIGZpbGUgd2Uga25vdyB3YXMgZGVsZXRlZCBkb2VzIG5vdCByZXN1cnJlY3QgaXQuXG4gICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGZpbGUucGF0aCkpIHJldHVybiBcInVuY2hhbmdlZFwiO1xuICAgICAgICAvLyBTaXplIDAgaW4gYSBsaXN0aW5nIElTIGEgZGVsZXRpb24gLSBhbiBlbXB0eSBmaWxlIGlzIGEgbWlzc2luZyBmaWxlIC0gc28gdGhhdCBpcyB3aGF0IGl0IGlzIHRha2VuIGFzXG4gICAgICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhEZWxldGVkKGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgIHJldHVybiBcInRvbWJzdG9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShmaWxlLnBhdGgsIHsgd3JpdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KSB9KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gXCJ1cGRhdGVkXCI7XG4gICAgICAgIHJldHVybiBcIm5ld1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcG9sbENoYW5nZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIHJvdXRlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwb2xsU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIyKHsgdGltZTogc3RhdGUuY2hhbmdlc0FmdGVyVGltZSwgcm91dGVzOiByb3V0ZSAmJiBbcm91dGVdIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgbGV0IHRhbGx5ID0gbmV3U2NhblRhbGx5KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgdGFsbHlbdGhpcy51cGRhdGVTY2FuSW5kZXgoc291cmNlSW5kZXgsIGZpbGUpXSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvbGxzIHJ1biBjb25zdGFudGx5LCBzbyBvbmx5IHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgY2hhbmdlZCB0aGUgaW5kZXggZ2V0IGFuIGVudHJ5XG4gICAgICAgIGlmICh0YWxseS5uZXcgfHwgdGFsbHkudXBkYXRlZCB8fCB0YWxseS50b21ic3RvbmUpIHtcbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImNoYW5nZXNQb2xsXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGNoYW5nZXM6IGNoYW5nZXMubGVuZ3RoLCBuZXdQYXRoczogdGFsbHkubmV3LCB1cGRhdGVkOiB0YWxseS51cGRhdGVkLCB0b21ic3RvbmVzOiB0YWxseS50b21ic3RvbmUsIHVuY2hhbmdlZDogdGFsbHkudW5jaGFuZ2VkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCArPSBjaGFuZ2VzLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IHBvbGxTdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkcyB0aGUgZmlsZXMgYSBzb3VyY2UgY3VycmVudGx5IGhvbGRzIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLCBwcmVzZXJ2aW5nIHRoZWlyIG1vZGlmaWVkIHRpbWVzIOKAlCBzbyBhIG5ld2VyIGxvY2FsIHdyaXRlIGFsd2F5cyB3aW5zLiBTa2lwcGVkIGZvciBub0Z1bGxTeW5jIHNvdXJjZXMgKGZyb250aW5nIGEgbGFyZ2UgZGF0YWJhc2Ugd2l0aG91dCBjb3B5aW5nIGl0KTsgcmVhZHMgc3RpbGwgZG93bi1jYWNoZSBsYXppbHkuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IDApIHJldHVybjtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnN0b3JlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwZW5kaW5nOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgY29waWVkU291cmNlc0xpc3RJbmRleCA9IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gY29waWVkU291cmNlc0xpc3RJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBwZW5kaW5nLnB1c2goeyBrZXksIGVudHJ5IH0pO1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IGFjdGl2aXR5OiBTeW5jQWN0aXZpdHkgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bGxTeW5jXCIsXG4gICAgICAgICAgICBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSxcbiAgICAgICAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGRvbmVGaWxlczogMCxcbiAgICAgICAgICAgIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLFxuICAgICAgICAgICAgZG9uZUJ5dGVzOiAwLFxuICAgICAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jU3RhcnRcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgZGlmZkJhc2VkOiBzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciwgZmlsZXM6IHBlbmRpbmcubGVuZ3RoLCBieXRlczogdG90YWxCeXRlcyB9KTtcbiAgICAgICAgbGV0IHByb2dyZXNzTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBsb2dQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyZXNzTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYEZ1bGwgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pOiAke2FjdGl2aXR5LmRvbmVGaWxlc30vJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgKCR7KChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApfUIvJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiAoJHsodG90YWxCeXRlcyAmJiAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSlgKSk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwobG9nUHJvZ3Jlc3MsIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgc2xvd0Vycm9yVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWU7XG4gICAgICAgICAgICBsZXQgZG9uZUZpbGVzID0gYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgZG9uZUJ5dGVzID0gYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgYnl0ZXNQZXJTZWNvbmQgPSBkb25lQnl0ZXMgLyAoZWxhcHNlZCAvIDEwMDApO1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZ0J5dGVzID0gdG90YWxCeXRlcyAtIGRvbmVCeXRlcztcbiAgICAgICAgICAgIGxldCBldGFUZXh0ID0gXCJ1bmtub3duIChubyBieXRlcyB0cmFuc2ZlcnJlZCB5ZXQpXCI7XG4gICAgICAgICAgICBpZiAoYnl0ZXNQZXJTZWNvbmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZ01zID0gcmVtYWluaW5nQnl0ZXMgLyBieXRlc1BlclNlY29uZCAqIDEwMDA7XG4gICAgICAgICAgICAgICAgZXRhVGV4dCA9IGAke2Zvcm1hdFRpbWUocmVtYWluaW5nTXMpfSByZW1haW5pbmcsIGNvbXBsZXRpbmcgYXJvdW5kICR7bmV3IERhdGUoRGF0ZS5ub3coKSArIHJlbWFpbmluZ01zKS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZ1bGwgc3luYyBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0pIGhhcyBiZWVuIHJ1bm5pbmcgZm9yICR7Zm9ybWF0VGltZShlbGFwc2VkKX06ICR7ZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoZG9uZUZpbGVzIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGRvbmVCeXRlcyl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIGRvbmVCeXRlcyAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihieXRlc1BlclNlY29uZCl9Qi9zLiBFc3RpbWF0ZWQgJHtldGFUZXh0fS5gKTtcbiAgICAgICAgfSwgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwpO1xuICAgICAgICAoc2xvd0Vycm9yVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgZmFpbGVkID0gMDtcbiAgICAgICAgbGV0IGNvcGllZEZpbGVzID0gMDtcbiAgICAgICAgbGV0IGNvcGllZEJ5dGVzID0gMDtcbiAgICAgICAgbGV0IG1pc3NpbmdPblNvdXJjZSA9IDA7XG4gICAgICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgICAgIGxldCBjb3B5V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICghYWJvcnRlZCAmJiAhdGhpcy5zdG9yZS5zdG9wcGVkLnN0b3AgJiYgIXN0YXRlLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGtleSwgZW50cnkgfSA9IHBlbmRpbmdbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZCA9IGF3YWl0IGNvcHlBcmNoaXZlRmlsZSh7IGZyb206IHNvdXJjZSwgdG86IHRoaXMuc3RvcmUuc291cmNlc1swXS5zb3VyY2UsIHBhdGg6IGtleSwgc2l6ZTogZW50cnkuc2l6ZSwgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkRmlsZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRCeXRlcyArPSBjb3BpZWQuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBrZXksIGNvcGllZC5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29weSBjYXJyaWVzIHRoZSBzb3VyY2UncyB3cml0ZSB0aW1lLCBhbmQgdGhlIGluZGV4IGNvbW1pdHMgaXQgdW5kZXIgdGhlIG5vcm1hbCBvcmRlcmluZyBydWxlICg+PSB0aGUgY3VycmVudCB0aW1lIHdpbnMpIC0gaXQgcmVmdXNpbmcgbWVhbnMgYSBORVdFUiB3cml0ZSBsYW5kZWQgd2hpbGUgd2UgY29waWVkLCB3aGljaCBtdXN0IGJlIHNhaWQsIG5vdCBzd2FsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBjb3BpZWQud3JpdGVUaW1lLCBzaXplOiBjb3BpZWQuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jQ29tbWl0U3VwZXJzZWRlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGNvcGllZFdyaXRlVGltZTogY29waWVkLndyaXRlVGltZSwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nT25Tb3VyY2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlJ3MgbGlzdGluZyB2b3VjaGVkIGZvciB0aGUgZmlsZSBidXQgaXRzIHJlYWQgaGFzIG5vdGhpbmcgLSBhbmQgYXNraW5nIGFnYWluIGZvcmV2ZXIgaXMgbm90IGFuIGFuc3dlci4gSWYgb3VyIG93biBkaXNrIGhvbGRzIGEgY29weSwgSVQgaXMgdGhlIHJlYWwgaG9sZGVyLCBzbyB0aGUgZW50cnkgcmVwb2ludHMgdGhlcmU7IGlmIG5laXRoZXIgc2lkZSBoYXMgYnl0ZXMsIHRoZSBlbnRyeSB3YXMgc2ltcGx5IHdyb25nLCBhbmQgaXQgaXMgcHVyZ2VkIC0gZm9yZ290dGVuLCBub3QgZGVsZXRlZCwgZXhhY3RseSBsaWtlIGEgcmVhZCB0aGF0IGNvbWVzIHVwIGVtcHR5IGV2ZXJ5d2hlcmUgKGEgc2NhbiByZS1maW5kcyB0aGUgZmlsZSBpZiBpdCBleGlzdHMgYW55d2hlcmUgZWxzZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsID0gYXdhaXQgdGhpcy5zdG9yZS5zb3VyY2VzWzBdLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGxvY2FsLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZnVsbFN5bmNNaXNzaW5nT25Tb3VyY2VcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHJlc29sdXRpb246IFwicmVwb2ludGVkIHRvIG91ciBsb2NhbCBjb3B5XCIsIGxvY2FsU2l6ZTogbG9jYWwuc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RvcmUuY3VycmVudFdyaXRlVGltZShrZXkpIDw9IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1cmdlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dTeW5jRXZlbnQoeyBldmVudDogXCJmdWxsU3luY01pc3NpbmdPblNvdXJjZVwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIGV4cGVjdGVkU2l6ZTogZW50cnkuc2l6ZSwgZXhwZWN0ZWRXcml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgcmVzb2x1dGlvbjogXCJwdXJnZWQgLSBuZWl0aGVyIHRoZSBzb3VyY2Ugbm9yIG91ciBkaXNrIGhhcyBpdCwgc28gaXQgZG9lcyBub3QgZXhpc3RcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG5ld2VyIHdyaXRlIGxhbmRlZCB3aGlsZSB3ZSB3ZXJlIGNoZWNraW5nIC0gdGhlIGVudHJ5IGlzIG5vIGxvbmdlciB0aGUgb25lIHdlIGZvdW5kIG1pc3NpbmcsIHNvIGl0IGlzIGxlZnQgYWxvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU3luY0V2ZW50KHsgZXZlbnQ6IFwiZnVsbFN5bmNNaXNzaW5nT25Tb3VyY2VcIiwgc3RvcmU6IHRoaXMuc3RvcmUuZm9sZGVyLCBzb3VyY2U6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgcGF0aDoga2V5LCBleHBlY3RlZFNpemU6IGVudHJ5LnNpemUsIGV4cGVjdGVkV3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHJlc29sdXRpb246IFwia2VwdCAtIGEgbmV3ZXIgd3JpdGUgYXBwZWFyZWQgd2hpbGUgY2hlY2tpbmdcIiwgY3VycmVudFdyaXRlVGltZTogdGhpcy5zdG9yZS5jdXJyZW50V3JpdGVUaW1lKGtleSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBmYWlsaW5nIGZpbGUgbXVzdCBub3QgYWJvcnQgdGhlIHN5bmM6IGl0IHN0YXlzIG9uIGl0cyBzb3VyY2UgKHJlYWRzIHN0aWxsIHJlYWNoIGl0IHRoZXJlKSwgYW5kIHRoZSBuZXh0IHN5bmMgcGFzcyByZXRyaWVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jQ29weUZhaWxlZFwiLCBzdG9yZTogdGhpcy5zdG9yZS5mb2xkZXIsIHNvdXJjZTogc291cmNlLmdldERlYnVnTmFtZSgpLCBwYXRoOiBrZXksIHNpemU6IGVudHJ5LnNpemUsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDIwMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gU1lOQ19NQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBhdXNlIHBlciBmYWlsdXJlLCBzbyBhIGRvd24gbmV0d29yayB0YWtlcyBtaW51dGVzIHRvIGJ1cm4gdGhyb3VnaCB0aGUgY29uc2VjdXRpdmUtZmFpbHVyZSBhbGxvd2FuY2UgaW5zdGVhZCBvZiBhbiBpbnN0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTWU5DX0ZBSUxVUkVfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1N5bmNFdmVudCh7IGV2ZW50OiBcImZ1bGxTeW5jRmluaXNoXCIsIHN0b3JlOiB0aGlzLnN0b3JlLmZvbGRlciwgc291cmNlOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIGRpZmZCYXNlZDogc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWUsIHRvdGFsRmlsZXM6IHBlbmRpbmcubGVuZ3RoLCB0b3RhbEJ5dGVzLCBwcm9jZXNzZWRGaWxlczogYWN0aXZpdHkuZG9uZUZpbGVzLCBjb3BpZWRGaWxlcywgY29waWVkQnl0ZXMsIG1pc3NpbmdPblNvdXJjZSwgZmFpbGVkLCBhYm9ydGVkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIG1haW50ZW5hbmNlIOKUgOKUgFxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGl0IC0gYnV0IE9OTFkgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIGEgc2FtZS1vci1uZXdlciBjb3B5ICh0aGUgb25seSBjb3B5IG9mIGEgZmlsZSBpcyBuZXZlciBkZWxldGVkKSwgYW5kIHRoZSBpbmRleCBlbnRyeSByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBhc3luYyBlbmZvcmNlRGlza0xpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnN0b3JlLnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLnN0b3JlLmluZGV4VG90YWxzKCk7XG4gICAgICAgIC8vIENvdW50ZWQgZG93biBhcyB3ZSBldmljdCwgcmF0aGVyIHRoYW4gcmUtcmVhZCBwZXIgZmlsZTogYSBwYXNzIG9ubHkgZXZlciByZW1vdmVzIGJ5dGVzIGZyb20gdGhlIGRpc2ssIGFuZCBhbnl0aGluZyB3cml0dGVuIGR1cmluZyBpdCBpcyBwaWNrZWQgdXAgYnkgdGhlIG5leHQgcGFzc1xuICAgICAgICBsZXQgZGlza0J5dGVzID0gdG90YWxzLnNsb3RzWzBdLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKGRpc2tCeXRlcyA8PSBsaW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmV2aWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGV2aWN0ZWRGaWxlcyA9IDA7XG4gICAgICAgIGxldCBldmljdGVkQnl0ZXMgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zdG9yZS5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXM6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXggfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZWFzdCByZWNlbnRseSBSRUFEIGZpcnN0OyBhIGtleSBub2JvZHkgaGFzIHJlYWQgc2luY2Ugd2Ugc3RhcnRlZCBmYWxscyBiYWNrIHRvIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4gdGhpcy5sYXN0QWNjZXNzLmdldCh4LmtleSkgfHwgeC5lbnRyeS5jaGFuZ2VkQXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBrZXksIGVudHJ5IH0gb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChkaXNrQnl0ZXMgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbnRyeVVuY2hhbmdlZChrZXksIGVudHJ5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGhvbGRlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5zdG9yZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbaV0uc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmIGluZm8ud3JpdGVUaW1lID49IGVudHJ5LndyaXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBkb3duIHNvdXJjZSBqdXN0IGNhbid0IHZvdWNoIGZvciB0aGlzIGZpbGUgcmlnaHQgbm93XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvbGRlciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNvdXJjZXNbMF0uc291cmNlLmRlbChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc3RvcmUuc291cmNlc0xpc3RJbmRleE9mU2xvdChob2xkZXIpIH0pO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgIGV2aWN0ZWRCeXRlcyArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgICAgIGRpc2tCeXRlcyAtPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5ldmljdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV2aWN0ZWRGaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEaXNrIGNhY2hlIG92ZXIgcmVhZGVyRGlza0xpbWl0IChzdG9yZSAke3RoaXMuc3RvcmUuZm9sZGVyfSk6IGV2aWN0ZWQgJHtldmljdGVkRmlsZXN9IGxlYXN0LXJlY2VudGx5LXVzZWQgZmlsZXMgKCR7Zm9ybWF0TnVtYmVyKGV2aWN0ZWRCeXRlcyl9QiksIG5vdyBhdCAke2Zvcm1hdE51bWJlcihkaXNrQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIobGltaXQpfUJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWQgb25lcyBhcmUgZm9yZ290dGVuIGVudGlyZWx5LiBBIHdhbGsgb2YgdGhlIHRvbWJzdG9uZXMgYWxvbmUsIHdoaWNoIGlzIHdoeSBpdCBjYW4gcnVuIG9mdGVuIGFuZCBjb3N0IG5vdGhpbmcuIFRoZSBwaHlzaWNhbCBlbXB0eSBmaWxlIGlzIHJlbW92ZWQgb25seSBvbiBiYWNrYmxhemUgc291cmNlczogcmVtb3RlIHN0b3JlcyBleHBpcmUgdGhlaXIgb3duIHRvbWJzdG9uZXMgKGEgZGVsIHRoZXJlIHdvdWxkIGp1c3QgbWludCBhIGZyZXNoIG9uZSksIGFuZCBvdXIgb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5zdG9yZS5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgTUFSS0VEIGRlbGV0aW9uIG5ldmVyIGV4cGlyZXMgYnkgdGltZSAtIGl0cyBieXRlcyBhcmUgc3RpbGwgb24gZGlzaywgYW5kIHB1cmdpbmcgdGhlIHRvbWJzdG9uZSB3b3VsZCBsZXQgdGhlIG5leHQgZGlzayBzY2FuIHJlc3VycmVjdCB0aGVtIGFzIGxpdmUuIFJldGVudGlvbiBleHBpcmVzIGl0IGJ5IFNJWkUgKGVuZm9yY2VIaXN0b3J5TGltaXQpOyBvbmx5IG9uY2UgdGhlIGJ5dGVzIGFyZSBnb25lIGRvZXMgdGhlIHBsYWluIHRvbWJzdG9uZSBhZ2Ugb3V0IGhlcmUuXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRNYXJrZWRFbnRyeShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RvcmUuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VFbnRyeSA9IHRoaXMuc3RvcmUuc291cmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvd3NBY2NlcHRXcml0ZXMoc291cmNlRW50cnkudmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlbGV0aW9uIGhpc3RvcnkgcmV0ZW50aW9uOiBtYXJrZWQgZmlsZXMga2VlcCB0aGVpciBieXRlcyBvbiBvdXIgZGlzayB1bnRpbCB0aGUgaGlzdG9yeSBvdXRncm93cyBtYXgoSElTVE9SWV9NSU5fQllURVMsIGxpdmUgYnl0ZXMgKiBoaXN0b3J5IGZhY3Rvcik7IHRoZW4gdGhlIE9MREVTVCBkZWxldGlvbnMgbG9zZSB0aGVpciBieXRlcyBhbmQgYmVjb21lIHBsYWluIHRvbWJzdG9uZXMsIHdoaWNoIGFnZSBvdXQgbm9ybWFsbHkgKGNsZWFudXBUb21ic3RvbmVzKVxuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZUhpc3RvcnlMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChISVNUT1JZX01JTl9CWVRFUywgdGhpcy5zdG9yZS5pbmRleFRvdGFscygpLmJ5dGVDb3VudCAqIGF3YWl0IGdldEhpc3RvcnlGYWN0b3IoKSk7XG4gICAgICAgIGxldCBtYXJrZWQ6IHsga2V5OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZGVsZXRlVGltZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgbWFya2VkLnB1c2goeyBrZXksIHNpemU6IGVudHJ5LnNpemUsIGRlbGV0ZVRpbWU6IGVudHJ5LmRlbGV0ZVRpbWUgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPD0gYWxsb3dlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhcnRlZFdpdGhCeXRlcyA9IHRvdGFsQnl0ZXM7XG4gICAgICAgIHNvcnQobWFya2VkLCB4ID0+IHguZGVsZXRlVGltZSk7XG4gICAgICAgIGxldCBkcm9wcGVkID0gMDtcbiAgICAgICAgbGV0IGRyb3BwZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IHsga2V5LCBzaXplIH0gb2YgbWFya2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzIDw9IGFsbG93ZWQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5kcm9wTWFya2VkSGlzdG9yeShrZXkpO1xuICAgICAgICAgICAgdG90YWxCeXRlcyAtPSBzaXplO1xuICAgICAgICAgICAgZHJvcHBlZCsrO1xuICAgICAgICAgICAgZHJvcHBlZEJ5dGVzICs9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW9uIGhpc3Rvcnkgb2Ygc3RvcmUgJHt0aGlzLnN0b3JlLmZvbGRlcn0gb3V0Z3JldyBpdHMgYnVkZ2V0ICgke2Zvcm1hdE51bWJlcihzdGFydGVkV2l0aEJ5dGVzKX1CIGtlcHQgdnMgJHtmb3JtYXROdW1iZXIoYWxsb3dlZCl9QiBhbGxvd2VkKTogZHJvcHBlZCB0aGUgJHtkcm9wcGVkfSBvbGRlc3QgbWFya2VkIGZpbGVzICgke2Zvcm1hdE51bWJlcihkcm9wcGVkQnl0ZXMpfUIpOyB0aGVpciB0b21ic3RvbmVzIHJlbWFpbiB1bnRpbCB0aGV5IGFnZSBvdXRgKTtcbiAgICB9XG59XG4iXX0=
757
+ /* _JS_SOURCE_HASH = "240fe8c92c51d251cbb815f2f8c001b43a467ebb6e7a8770243ebb5690783000"; */