@workflow/core 5.0.0-beta.40 → 5.0.0-beta.41

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 (70) hide show
  1. package/dist/events-consumer.d.ts +127 -6
  2. package/dist/events-consumer.d.ts.map +1 -1
  3. package/dist/events-consumer.js +364 -50
  4. package/dist/private.d.ts +87 -18
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +116 -44
  7. package/dist/runtime/constants.d.ts +15 -1
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +22 -3
  10. package/dist/runtime/helpers.d.ts +116 -8
  11. package/dist/runtime/helpers.d.ts.map +1 -1
  12. package/dist/runtime/helpers.js +174 -2
  13. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -1
  14. package/dist/runtime/quickjs-assets.generated.js +2 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  16. package/dist/runtime/quickjs-entrypoint.js +13 -5
  17. package/dist/runtime/quickjs-runtime.d.ts +36 -1
  18. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-runtime.js +613 -185
  20. package/dist/runtime/quickjs-serde.d.ts +107 -0
  21. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-serde.js +2098 -0
  23. package/dist/runtime/replay-budget.d.ts +5 -14
  24. package/dist/runtime/replay-budget.d.ts.map +1 -1
  25. package/dist/runtime/replay-budget.js +19 -72
  26. package/dist/runtime/resume-hook.d.ts.map +1 -1
  27. package/dist/runtime/resume-hook.js +5 -1
  28. package/dist/runtime/runs.d.ts.map +1 -1
  29. package/dist/runtime/runs.js +3 -4
  30. package/dist/runtime/start.js +2 -7
  31. package/dist/runtime/step-executor.d.ts.map +1 -1
  32. package/dist/runtime/step-executor.js +1 -4
  33. package/dist/runtime/suspension-handler.d.ts +7 -0
  34. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  35. package/dist/runtime/suspension-handler.js +58 -11
  36. package/dist/runtime/world-compatibility.d.ts +15 -0
  37. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  38. package/dist/runtime/world-compatibility.js +25 -5
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +474 -418
  41. package/dist/serialization/codec-devalue-vm.d.ts +7 -0
  42. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -1
  43. package/dist/serialization/codec-devalue-vm.js +12 -1
  44. package/dist/serialization/workflow-vm.d.ts +8 -3
  45. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  46. package/dist/serialization/workflow-vm.js +9 -4
  47. package/dist/step.js +2 -2
  48. package/dist/telemetry/semantic-conventions.d.ts +23 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +18 -1
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +2 -2
  53. package/dist/vm/index.d.ts.map +1 -1
  54. package/dist/vm/index.js +9 -6
  55. package/dist/workflow/abort-controller.d.ts.map +1 -1
  56. package/dist/workflow/abort-controller.js +4 -6
  57. package/dist/workflow/attribute-dispatcher.js +2 -2
  58. package/dist/workflow/hook.js +2 -2
  59. package/dist/workflow/sleep.js +2 -2
  60. package/dist/workflow.d.ts +10 -0
  61. package/dist/workflow.d.ts.map +1 -1
  62. package/dist/workflow.js +60 -19
  63. package/docs/how-it-works/event-sourcing.mdx +11 -3
  64. package/package.json +6 -6
  65. package/dist/correlation-id.d.ts +0 -109
  66. package/dist/correlation-id.d.ts.map +0 -1
  67. package/dist/correlation-id.js +0 -139
  68. package/dist/serialization/vm-bundle-entry.d.ts +0 -12
  69. package/dist/serialization/vm-bundle-entry.d.ts.map +0 -1
  70. package/dist/serialization/vm-bundle-entry.js +0 -58
@@ -1,5 +1,5 @@
1
1
  import { PreconditionFailedError, RUN_ERROR_CODES, WorkflowWorldError, } from '@workflow/errors';
2
- import { getQueueTopicPrefix, HealthCheckPayloadSchema, HOOK_RESUME_INPUT_VERSION, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_LEGACY, ulidToDate, } from '@workflow/world';
2
+ import { eventIdToSlot, FIRST_EVENT_SLOT, getQueueTopicPrefix, HealthCheckPayloadSchema, HOOK_RESUME_INPUT_VERSION, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_LEGACY, ulidToDate, } from '@workflow/world';
3
3
  import { monotonicFactory } from 'ulid';
4
4
  import { runtimeLogger } from '../logger.js';
5
5
  import { bytesToBase64, deriveRunKeyPair } from '../sealed-box.js';
@@ -469,6 +469,22 @@ export async function loadWorkflowRunEvents(runId, afterCursor) {
469
469
  export function isPreconditionGuardEnabled() {
470
470
  return process.env.WORKFLOW_PRECONDITION_GUARD !== '0';
471
471
  }
472
+ /**
473
+ * Whether a replay refuses to run over a log with a hole in it (see
474
+ * {@link findEventSlotGap}). **On by default**; set
475
+ * `WORKFLOW_SLOT_GAP_CHECK=0` to replay across holes instead.
476
+ *
477
+ * The switch exists because the check trades one failure for another. A hole is
478
+ * a position claimed by a write that then failed, so most of them stand for an
479
+ * event that never happened and replaying past one is correct. But a hole
480
+ * standing for an event that *did* happen is indistinguishable from that, and
481
+ * replaying past that one produces a run whose result is wrong with nothing to
482
+ * show for it. Failing loudly is the recoverable side of the trade, and this is
483
+ * the way back out if a fleet turns out to carry benign holes.
484
+ */
485
+ export function isSlotGapCheckEnabled() {
486
+ return process.env.WORKFLOW_SLOT_GAP_CHECK !== '0';
487
+ }
472
488
  /**
473
489
  * The `stateUpdatedAt` value to send with a replay-context event creation: the
474
490
  * *maximum* ULID time (epoch ms) over the events the runtime has loaded. Returns
@@ -517,6 +533,154 @@ export function latestEventStateUpdatedAt(events) {
517
533
  }
518
534
  return time;
519
535
  }
536
+ /**
537
+ * Merge the events a bump-and-report write handed back into the log it was
538
+ * derived from, and answer how many of them were new.
539
+ *
540
+ * Unlike {@link appendUniqueEvents}, this re-sorts. The reported events occupy
541
+ * slots *below* the write that reported them, so appending them would put them
542
+ * after events they precede — and on a slot-numbered run the id order is the
543
+ * World's canonical order, so restoring it is well defined rather than a guess.
544
+ * A run that is not slot-numbered cannot produce this report in the first
545
+ * place; the sort is skipped rather than applied to ids it cannot order.
546
+ */
547
+ export function mergeReportedEvents(target, events) {
548
+ const before = target.length;
549
+ appendUniqueEvents(target, events);
550
+ const added = target.length - before;
551
+ if (added > 0 && maxEventSlot(target) !== undefined) {
552
+ target.sort((a, b) => a.eventId < b.eventId ? -1 : a.eventId > b.eventId ? 1 : 0);
553
+ }
554
+ return added;
555
+ }
556
+ /**
557
+ * The highest slot the loaded log occupies, or `undefined` when the run is not
558
+ * slot-numbered. A run keeps the id scheme it was created under, so one event
559
+ * settles it for the whole log.
560
+ *
561
+ * The maximum, not the count, and the two are not interchangeable even though
562
+ * a healthy log makes them equal. A World hands a position to the insert that
563
+ * occupies it, so a write that never lands leaves no hole behind and the log
564
+ * stays dense. What the count cannot survive is a *partial* read: a log
565
+ * assembled from a truncated report, or read while a concurrent write is
566
+ * committing, holds fewer events than its highest position. Counting those
567
+ * would make the next write claim to have seen less than it has, so the World
568
+ * would report the same events back to it on every attempt.
569
+ *
570
+ * A hole below the maximum is therefore a property of the read, not of the log,
571
+ * which is what lets {@link settleEventSlotGap} re-read instead of giving up.
572
+ */
573
+ export function maxEventSlot(events) {
574
+ let max;
575
+ for (const event of events) {
576
+ const slot = eventIdToSlot(event.eventId);
577
+ if (slot === null) {
578
+ return undefined;
579
+ }
580
+ if (max === undefined || slot > max) {
581
+ max = slot;
582
+ }
583
+ }
584
+ return max;
585
+ }
586
+ /**
587
+ * The hole in a loaded log, or `undefined` when there is none to find.
588
+ *
589
+ * On a slot-numbered run the World allocates every position, so a log that
590
+ * holds `n` events below slot `n` is missing one. That matters before a replay
591
+ * and nowhere else: the replay reads the log as the complete record of what has
592
+ * happened, and an absent position is indistinguishable from an event that
593
+ * never occurred. The branch it would have decided gets decided the other way,
594
+ * and the run diverges quietly rather than failing.
595
+ *
596
+ * Order-independent, unlike the equivalent audit the World runs over a page it
597
+ * just read. A loaded log is assembled from listed pages plus whatever a
598
+ * bump-and-report write handed back, and while {@link mergeReportedEvents}
599
+ * restores id order, a check that can fail a healthy run should not depend on
600
+ * that having happened.
601
+ *
602
+ * The first slot is never counted. It belongs to `run_created`, which `start()`
603
+ * posts concurrently with the queue send, so a log read in that window
604
+ * legitimately begins at the second slot and fills in on its own. Every replay
605
+ * that races a run's own start would otherwise report a hole.
606
+ *
607
+ * Returns `undefined` for a log this cannot read as slots at all: an empty one,
608
+ * or a run numbered by ULID, where positions carry no density to check.
609
+ */
610
+ export function findEventSlotGap(events) {
611
+ const occupied = new Set();
612
+ let maxSlot = 0;
613
+ for (const event of events) {
614
+ const slot = eventIdToSlot(event.eventId);
615
+ if (slot === null) {
616
+ return undefined;
617
+ }
618
+ occupied.add(slot);
619
+ if (slot > maxSlot) {
620
+ maxSlot = slot;
621
+ }
622
+ }
623
+ if (maxSlot === 0) {
624
+ return undefined;
625
+ }
626
+ const floor = occupied.has(FIRST_EVENT_SLOT)
627
+ ? FIRST_EVENT_SLOT
628
+ : FIRST_EVENT_SLOT + 1;
629
+ // Every slot is at or above `floor` by construction, so the log is dense
630
+ // exactly when it holds one event per position in `[floor, maxSlot]`. The
631
+ // scan below only runs once that has already answered no.
632
+ if (occupied.size === maxSlot - floor + 1) {
633
+ return undefined;
634
+ }
635
+ let firstMissingSlot;
636
+ let missingCount = 0;
637
+ for (let slot = floor; slot <= maxSlot; slot++) {
638
+ if (!occupied.has(slot)) {
639
+ firstMissingSlot ??= slot;
640
+ missingCount++;
641
+ }
642
+ }
643
+ if (firstMissingSlot === undefined) {
644
+ return undefined;
645
+ }
646
+ return { firstMissingSlot, missingCount, maxSlot };
647
+ }
648
+ /**
649
+ * How many times a detected hole is re-read before the log is taken at its
650
+ * word, and the backoff before each re-read (doubling per attempt).
651
+ *
652
+ * A hole can be transient. The World allocates a slot inside the insert that
653
+ * occupies it, so two concurrent writers can collide, one retry past the other,
654
+ * and the higher slot commit first — leaving a window in which the lower one is
655
+ * genuinely absent from a strongly-consistent read and fills in a moment later.
656
+ * The window is one commit wide, so a short backoff clears it; anything that
657
+ * survives all three re-reads is a position no write will ever occupy.
658
+ */
659
+ export const SLOT_GAP_RECHECK_ATTEMPTS = 3;
660
+ const SLOT_GAP_RECHECK_BASE_DELAY_MS = 25;
661
+ /**
662
+ * Re-read a log that looks holey until the hole fills in or the re-reads run
663
+ * out, and return the settled log alongside the hole that survived.
664
+ *
665
+ * Reads are strongly consistent, so a hole is not an artifact of *when* the log
666
+ * was read — but it can be an artifact of a write that had not committed yet
667
+ * (see {@link SLOT_GAP_RECHECK_ATTEMPTS}). Distinguishing the two costs a
668
+ * re-read, which is only ever paid by a replay that already found a hole.
669
+ *
670
+ * The reload is full rather than incremental: the missing position is below the
671
+ * log's maximum, so a cursor-anchored read starts past it and can never see it
672
+ * arrive.
673
+ */
674
+ export async function settleEventSlotGap(runId, loaded) {
675
+ let log = loaded;
676
+ let gap = findEventSlotGap(log.events);
677
+ for (let attempt = 0; gap !== undefined && attempt < SLOT_GAP_RECHECK_ATTEMPTS; attempt++) {
678
+ await new Promise((resolve) => setTimeout(resolve, SLOT_GAP_RECHECK_BASE_DELAY_MS * 2 ** attempt));
679
+ log = await loadWorkflowRunEvents(runId);
680
+ gap = findEventSlotGap(log.events);
681
+ }
682
+ return { log, gap };
683
+ }
520
684
  /**
521
685
  * Build the precondition snapshot to attach to a replay-context event creation.
522
686
  *
@@ -539,6 +703,14 @@ export function preconditionSnapshotParams(events, cursor) {
539
703
  if (!isPreconditionGuardEnabled()) {
540
704
  return {};
541
705
  }
706
+ // A slot-numbered run says with one integer everything the triple was
707
+ // approximating, so the two are alternatives rather than a pair. Sending the
708
+ // triple here would also be futile: a slot id carries no time, so
709
+ // `latestEventStateUpdatedAt` would fail open on every single write.
710
+ const eventCount = maxEventSlot(events);
711
+ if (eventCount !== undefined) {
712
+ return { eventCount };
713
+ }
542
714
  const stateUpdatedAt = latestEventStateUpdatedAt(events);
543
715
  if (stateUpdatedAt === undefined) {
544
716
  return {};
@@ -718,4 +890,4 @@ export function memoizeEncryptionKey(world, runOrId) {
718
890
  return cached;
719
891
  };
720
892
  }
721
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFXMUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsb0JBQW9CLEdBRXJCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRW5ELHdEQUF3RDtBQUN4RCxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxzQkFBc0IsQ0FBQztBQUUxRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxZQUFvQixFQUNwQixTQUFrQjtJQUVsQixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJ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QUM7WUFDWixNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbkIsMkRBQTJEO2dCQUMzRCxxRUFBcUU7Z0JBQ3JFLDhEQUE4RDtnQkFDOUQsTUFBTSxNQUFNLEdBQ1YsT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDekIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsT0FBTyxDQUFDO29CQUMvQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEQsbUVBQW1FO2dCQUNuRSxtRUFBbUU7Z0JBQ25FLGtFQUFrRTtnQkFDbEUseUJBQXlCO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZUV2ZW50UGFyYW1zLFxuICBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIEV2ZW50LFxuICBFdmVudFJlc3VsdCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBWYWxpZFF1ZXVlTmFtZSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLFxuICBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICB1bGlkVG9EYXRlLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0LCBkZXJpdmVSdW5LZXlQYWlyIH0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRTcGFuS2luZCwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcblxuLyoqIERlZmF1bHQgdGltZW91dCBmb3IgaGVhbHRoIGNoZWNrcyBpbiBtaWxsaXNlY29uZHMgKi9cbmNvbnN0IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQgPSAzMF8wMDA7XG5cbi8qKlxuICogUGF0dGVybiBmb3Igc2FmZSB3b3JrZmxvdyBuYW1lcy4gT25seSBhbGxvd3MgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsXG4gKiB1bmRlcnNjb3JlcywgaHlwaGVucywgZG90cywgZm9yd2FyZCBzbGFzaGVzIChmb3IgbmFtZXNwYWNlZCB3b3JrZmxvd3MpLFxuICogYW5kIGF0IHNpZ25zIChmb3Igc2NvcGVkIHBhY2thZ2VzKS5cbiAqL1xuY29uc3QgU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4gPSAvXlthLXpBLVowLTlfXFwtLi9AXSskLztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB3b3JrZmxvdyBuYW1lIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXVlIG5hbWUuXG4gKiBFbnN1cmVzIHRoZSB3b3JrZmxvdyBuYW1lIG9ubHkgY29udGFpbnMgc2FmZSBjaGFyYWN0ZXJzIGJlZm9yZVxuICogaW50ZXJwb2xhdGluZyBpdCBpbnRvIHRoZSBxdWV1ZSBuYW1lIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UXVldWVOYW1lKFxuICB3b3JrZmxvd05hbWU6IHN0cmluZyxcbiAgbmFtZXNwYWNlPzogc3RyaW5nXG4pOiBWYWxpZFF1ZXVlTmFtZSB7XG4gIGlmICghU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4udGVzdCh3b3JrZmxvd05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgd29ya2Zsb3cgbmFtZSBcIiR7d29ya2Zsb3dOYW1lfVwiOiBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcywgb3IgYXQgc2lnbnNgXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KFxuICAgICd3b3JrZmxvdycsXG4gICAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgKTtcbiAgcmV0dXJuIGAke3ByZWZpeH0ke3dvcmtmbG93TmFtZX1gIGFzIFZhbGlkUXVldWVOYW1lO1xufVxuXG5jb25zdCBnZW5lcmF0ZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmVhbSBuYW1lIGZvciBhIGhlYWx0aCBjaGVjayB3aXRoIHRoZSBnaXZlbiBjb3JyZWxhdGlvbiBJRC5cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgX19oZWFsdGhfY2hlY2tfXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIGhlYWx0aCBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tSZXN1bHQge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSBpZiBoZWFsdGggY2hlY2sgZmFpbGVkICovXG4gIGVycm9yPzogc3RyaW5nO1xuICAvKiogTGF0ZW5jeSBpZiB0aGUgaGVhbHRoIGNoZWNrIHdhcyBzdWNjZXNzZnVsICovXG4gIGxhdGVuY3lNcz86IG51bWJlcjtcbiAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50ICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQsIHVzZWQgZm9yXG4gICAqIGNhcGFiaWxpdHkgZGV0ZWN0aW9uIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2ApLiBPbWl0dGVkIHdoZW4gdGhlXG4gICAqIHJlc3BvbmRpbmcgZGVwbG95bWVudCBkaWQgbm90IHByb3ZpZGUgdGhlIGZpZWxkIGFzIGEgc3RyaW5nIOKAlFxuICAgKiBmb3IgZXhhbXBsZSwgYW4gb2xkZXIgYEB3b3JrZmxvdy9jb3JlYCB0aGF0IHByZWRhdGVzIHRoaXMgZmllbGQsXG4gICAqIG9yIGEgbm9uLUpTT04gcGxhaW4tdGV4dCBoZWFsdGggcmVzcG9uc2UuXG4gICAqL1xuICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRhcmdldCBydW4ncyBYMjU1MTkgcHVibGljIGtleSAoYmFzZTY0KSwgcmV0dXJuZWQgb25seSB3aGVuIHRoZSBwcm9iZVxuICAgKiBjYXJyaWVkIGEgYHJ1bklkYCBhbmQgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCBoYXMgZW5jcnlwdGlvbiBlbmFibGVkLlxuICAgKlxuICAgKiBMZXRzIGEgY3Jvc3MtZGVwbG95bWVudCBgc3RhcnQoKWAgc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHVzaW5nIGFcbiAgICogcmVzcG9uc2UgaXQgd2FzIGFscmVhZHkgd2FpdGluZyBvbiwgaW5zdGVhZCBvZiBtYWtpbmcgYSBzZXBhcmF0ZVxuICAgKiBrZXktbG9va3VwIHJlcXVlc3QuXG4gICAqL1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCdzIGBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OYCDigJQgdGhlIHByb3RvY29sXG4gICAqIHZlcnNpb24gYXQgd2hpY2ggdGhlICpjb25zdW1lciogKHF1ZXVlLW1lc3NhZ2UgdGFyZ2V0KSByZS1lbnN1cmVzIHRoZVxuICAgKiBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBgaG9va0lucHV0YCBvbiByZXBsYXkuIEEgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBgc3RhcnQoKWAgc3RhbXBzIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIChub3QgdGhlIGNhbGxlcidzKSBpbnRvIHRoZSBuZXdcbiAgICogcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbmAgc28gdGhhdCBgcmVzdW1lSG9vaygpYFxuICAgKiBvbmx5IHRha2VzIHRoZSBwYXJhbGxlbCBwYXRoIHdoZW4gdGhlIGRlcGxveW1lbnQgdGhhdCB3aWxsIGFjdHVhbGx5XG4gICAqIGNvbnN1bWUgdGhlIHF1ZXVlIG1lc3NhZ2UgaXMga25vd24gdG8gaG9ub3IgYGhvb2tJbnB1dGAuIE9taXR0ZWQgd2hlbiB0aGVcbiAgICogcmVzcG9uZGluZyBkZXBsb3ltZW50IHByZWRhdGVzIHRoaXMgZmllbGQgKGFuIG9sZGVyIGNvbnN1bWVyIHRoYXQgaWdub3Jlc1xuICAgKiBgaG9va0lucHV0YCksIHdoaWNoIGZhaWxzIHRoZSBnYXRlIGNsb3NlZC5cbiAgICovXG4gIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgaGVhbHRoIGNoZWNrIHBheWxvYWQuXG4gKiBJZiBzbywgcmV0dXJucyB0aGUgcGFyc2VkIHBheWxvYWQuIE90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKFxuICBtZXNzYWdlOiB1bmtub3duXG4pOiBIZWFsdGhDaGVja1BheWxvYWQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQgPSBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEuc2FmZVBhcnNlKG1lc3NhZ2UpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZm9yIGhlYWx0aCBjaGVjayBzdHJlYW1zLlxuICogQm90aCB0aGUgd3JpdGVyIChoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UpIGFuZCByZWFkZXIgKGhlYWx0aENoZWNrKSBkZXJpdmVcbiAqIHRoZSBzYW1lIHJ1bklkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzY29wZVxuICogc3RyZWFtIHJlYWRzIGJ5IHJ1bklkIHN0aWxsIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB3cnVuX2hjXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZSBieSB3cml0aW5nIHRoZSByZXN1bHQgdG8gdGhlIHdvcmxkJ3Mgc3RyZWFtLlxuICogVGhlIGNhbGxlciBjYW4gbGlzdGVuIHRvIHRoaXMgc3RyZWFtIHRvIGdldCB0aGUgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBoZWFsdGhDaGVjayAtIFRoZSBwYXJzZWQgaGVhbHRoIGNoZWNrIHBheWxvYWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgaGVhbHRoQ2hlY2s6IEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG5cbiAgLy8gV2hlbiB0aGUgcHJvYmUgbmFtZXMgYSBydW4gdGhlIGNhbGxlciBpcyBhYm91dCB0byBjcmVhdGUsIHB1Ymxpc2ggdGhhdFxuICAvLyBydW4ncyBwdWJsaWMga2V5LiBXZSBhcmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIGl0c1xuICAvLyBrZXkgbWF0ZXJpYWwgaXMgYXZhaWxhYmxlIGxvY2FsbHkgKG5vIEFQSSBjYWxsKSwgYW5kIHRoZSBjYWxsZXIgY2FuIHRoZW5cbiAgLy8gc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHN0cmFpZ2h0IGZyb20gdGhpcyByZXNwb25zZSByYXRoZXIgdGhhblxuICAvLyBtYWtpbmcgYSBzZXBhcmF0ZSBrZXktbG9va3VwIHJlcXVlc3QuXG4gIC8vXG4gIC8vIE9ubHkgYSAqcHVibGljKiBrZXkgbWF5IHRyYXZlbCB0aGlzIHdheTogdGhlIHByb2JlIHJlc3BvbnNlIHN0cmVhbSBpc1xuICAvLyBkZWxpYmVyYXRlbHkgdW5hdXRoZW50aWNhdGVkLCBzbyBhbnl0aGluZyBzZWNyZXQgd291bGQgYmUgZXhwb3NlZC5cbiAgLy8gQmVzdC1lZmZvcnQg4oCUIGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGhlYWx0aCBjaGVjayBpdHNlbGYsIHdoaWNoXG4gIC8vIGNhbGxlcnMgYWxzbyByZWx5IG9uIGZvciBwbGFpbiBjYXBhYmlsaXR5IGRldGVjdGlvbi5cbiAgbGV0IGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGhlYWx0aENoZWNrLnJ1bklkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihoZWFsdGhDaGVjay5ydW5JZCk7XG4gICAgICBpZiAocmF3S2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25QdWJsaWNLZXkgPSBieXRlc1RvQmFzZTY0KFxuICAgICAgICAgIChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSGVhbHRoIGNoZWNrIGNvdWxkIG5vdCBkZXJpdmUgYSBydW4gcHVibGljIGtleTsgdGhlIGNhbGxlciB3aWxsIGZhbGwgYmFjayB0byBhIGtleSBsb29rdXAnLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGhlYWx0aHk6IHRydWUsXG4gICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gdGhpcyBjb25zdGFudCByZWZsZWN0c1xuICAgIC8vIHRoZSAqY29uc3VtZXIncyogaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiDigJQgZXhhY3RseSB3aGF0IGFcbiAgICAvLyBjcm9zcy1kZXBsb3ltZW50IGNhbGxlciBuZWVkcyB0byBnYXRlIGl0cyBwYXJhbGxlbCByZXN1bWUgcGF0aCBvbi5cbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICB9KTtcbiAgLy8gVXNlIGEgZGV0ZXJtaW5pc3RpYyBmYWtlIHJ1bklkIGRlcml2ZWQgZnJvbSB0aGUgY29ycmVsYXRpb25JZCBzbyB0aGF0XG4gIC8vIHRoZSByZWFkZXIgc2lkZSBwcm9kdWNlcyB0aGUgc2FtZSB2YWx1ZS5cbiAgY29uc3QgZmFrZVJ1bklkID0gZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSwgcmVzcG9uc2UpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tPcHRpb25zIHtcbiAgLyoqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZS4gRGVmYXVsdDogMzAwMDAgKDMwcykgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIERlcGxveW1lbnQgSUQgdG8gc2VuZCB0aGUgaGVhbHRoIGNoZWNrIHRvLiBGYWxscyBiYWNrIHRvIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lELiAqL1xuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuIGlkIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gY3JlYXRlLiBXaGVuIHNldCwgdGhlIHJlc3BvbmRpbmdcbiAgICogZGVwbG95bWVudCBkZXJpdmVzIHRoYXQgcnVuJ3MgcHVibGljIGtleSBsb2NhbGx5IGFuZCByZXR1cm5zIGl0IGFzXG4gICAqIGBlbmNyeXB0aW9uUHVibGljS2V5YCwgbGV0dGluZyBhIGNyb3NzLWRlcGxveW1lbnQgYHN0YXJ0KClgIHNlYWwgdGhlXG4gICAqIHdvcmtmbG93IGFyZ3VtZW50cyB3aXRob3V0IGEgc2VwYXJhdGUga2V5IGxvb2t1cC5cbiAgICovXG4gIHJ1bklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIG9mIHRoZSB0YXJnZXQgZGVwbG95bWVudCAoZS5nLiBgJ2V2ZSdgIGZvciB0b3BpY3MgbGlrZVxuICAgKiBgX19ldmVfd2tmX3dvcmtmbG93XypgKS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLiBDcm9zcy1jb250ZXh0IGNhbGxlcnMgKGUuZy4gdGhlIG9ic2VydmFiaWxpdHlcbiAgICogZGFzaGJvYXJkKSBtdXN0IHBhc3MgdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgbmFtZXNwYWNlIGV4cGxpY2l0bHkg4oCUXG4gICAqIHRoZSBlbnYgZmFsbGJhY2sgcmVzb2x2ZXMgaW4gdGhlIGNhbGxlcidzIHByb2Nlc3MsIGFuZCBhIG1lc3NhZ2VcbiAgICogcHVibGlzaGVkIHRvIGEgbWlzbWF0Y2hlZCB0b3BpYyBoYXMgbm8gY29uc3VtZXIsIHNvIHRoZSBjaGVjayB3b3VsZFxuICAgKiBhbHdheXMgdGltZSBvdXQuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBoZWFsdGggY2hlY2sgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgcXVldWUgcGlwZWxpbmVcbiAqIGFuZCB2ZXJpZnlpbmcgaXQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBjb21iaW5lZCB3b3JrZmxvdyBlbmRwb2ludC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ5cGFzc2VzIERlcGxveW1lbnQgUHJvdGVjdGlvbiBvbiBWZXJjZWwgYmVjYXVzZSBpdCBnb2VzXG4gKiB0aHJvdWdoIHRoZSBxdWV1ZSBpbmZyYXN0cnVjdHVyZSByYXRoZXIgdGhhbiBkaXJlY3QgSFRUUC5cbiAqXG4gKiBAcGFyYW0gd29ybGQgLSBUaGUgV29ybGQgaW5zdGFuY2UgdG8gdXNlIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlYWx0aCBjaGVjayByZXN1bHRcbiAqL1xuLy8gUG9sbCBpbnRlcnZhbCBmb3IgaGVhbHRoIGNoZWNrIHJldHJpZXMgKG1zKVxuY29uc3QgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwgPSAxMDA7XG4vLyBQZXItcmVhZCB0aW1lb3V0IHRvIHByZXZlbnQgYmxvY2tpbmcgZm9yZXZlciBvbiBsb2NhbCB3b3JsZCdzIEV2ZW50RW1pdHRlclxuLy8gKHdoaWNoIGRvZXNuJ3Qgd29yayBhY3Jvc3MgcHJvY2Vzc2VzKVxuY29uc3QgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVCA9IDUwMDtcblxuLyoqXG4gKiBSZWFkIGNodW5rcyBmcm9tIGEgc3RyZWFtIHdpdGggYSB0aW1lb3V0IHBlciByZWFkIG9wZXJhdGlvbi5cbiAqIFJldHVybnMgeyBjaHVua3MsIHRpbWVkT3V0IH0gd2hlcmUgdGltZWRPdXQgaW5kaWNhdGVzIGlmIGEgcmVhZCB0aW1lZCBvdXQuXG4gKi9cbi8qKlxuICogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhIGRlYWRsaW5lLiBSZWplY3RzIHdpdGggYSB0aW1lb3V0IGVycm9yIHdoZW4gdGhlXG4gKiBkZWFkbGluZSBlbGFwc2VzIGZpcnN0LiBVc2VkIHRvIGJvdW5kIGB3b3JsZC5zdHJlYW1zLmdldCgpYCBpbnNpZGUgdGhlXG4gKiBoZWFsdGgtY2hlY2sgcG9sbCBsb29wOiBzb21lIHdvcmxkcyBob2xkIHRoYXQgcmVxdWVzdCBvcGVuIHVudGlsIHRoZVxuICogc3RyZWFtIGhhcyBkYXRhIChlLmcuIHdvcmtmbG93LXNlcnZlciBob2xkcyB1bndyaXR0ZW4gc3RyZWFtcyBvcGVuIGZvclxuICogfjIgbWludXRlcyksIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBibG93IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgaGVhbHRoXG4gKiBjaGVjayB0aW1lb3V0IOKAlCB0aGUgYHdoaWxlYCBjb25kaXRpb24gaXMgb25seSByZS1jaGVja2VkIGJldHdlZW5cbiAqIGl0ZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHdpdGhEZWFkbGluZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHByb21pc2UsXG4gICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgT3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciAke21zfW1zYCkpLFxuICAgICAgICBtc1xuICAgICAgKTtcbiAgICB9KSxcbiAgXSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbVdpdGhUaW1lb3V0KFxuICByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PixcbiAgcmVhZFRpbWVvdXQ6IG51bWJlclxuKTogUHJvbWlzZTx7IGNodW5rczogVWludDhBcnJheVtdOyB0aW1lZE91dDogYm9vbGVhbiB9PiB7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGxldCB0aW1lZE91dCA9IGZhbHNlO1xuXG4gIHdoaWxlICghZG9uZSAmJiAhdGltZWRPdXQpIHtcbiAgICBjb25zdCByZWFkUHJvbWlzZSA9IHJlYWRlci5yZWFkKCk7XG4gICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTx7IGRvbmU6IHRydWU7IHZhbHVlOiB1bmRlZmluZWQgfT4oXG4gICAgICAocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZWRPdXQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9LCByZWFkVGltZW91dClcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZWFkUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBkb25lID0gcmVzdWx0LmRvbmU7XG4gICAgaWYgKHJlc3VsdC52YWx1ZSkgY2h1bmtzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7IGNodW5rcywgdGltZWRPdXQgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBoZWFsdGggY2hlY2sgcmVzcG9uc2UgZnJvbSBzdHJlYW0gY2h1bmtzLlxuICogUmV0dXJucyB0aGUgcGFyc2VkIHJlc3BvbnNlIG9yIG51bGwgaWYgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VIZWFsdGhDaGVja1Jlc3BvbnNlKGNodW5rczogVWludDhBcnJheVtdKToge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbn0gfCBudWxsIHtcbiAgaWYgKGNodW5rcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgoc3VtLCBjaHVuaykgPT4gc3VtICsgY2h1bmsubGVuZ3RoLCAwKTtcbiAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGNvbWJpbmVkLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb21iaW5lZCk7XG5cbiAgbGV0IHJlc3BvbnNlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBPbGQgZGVwbG95bWVudHMgKHNwZWNWZXJzaW9uIDwgMykgcmV0dXJuIHBsYWluIHRleHQgbGlrZVxuICAgIC8vICdXb3JrZmxvdyBTREsgXCIuLi5cIiBlbmRwb2ludCBpcyBoZWFsdGh5Jy4gVHJlYXQgYW55IG5vbi1lbXB0eVxuICAgIC8vIHRleHQgcmVzcG9uc2UgYXMgYSBoZWFsdGh5IGRlcGxveW1lbnQgd2l0aCB1bmtub3duIHNwZWNWZXJzaW9uLlxuICAgIGlmIChyZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgaGVhbHRoeTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcmVzcG9uc2UgIT09ICdvYmplY3QnIHx8XG4gICAgcmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAhKCdoZWFsdGh5JyBpbiByZXNwb25zZSkgfHxcbiAgICB0eXBlb2YgKHJlc3BvbnNlIGFzIHsgaGVhbHRoeTogdW5rbm93biB9KS5oZWFsdGh5ICE9PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByID0gcmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHBhcnNlZDoge1xuICAgIGhlYWx0aHk6IGJvb2xlYW47XG4gICAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG4gIH0gPSB7XG4gICAgaGVhbHRoeTogci5oZWFsdGh5IGFzIGJvb2xlYW4sXG4gIH07XG4gIGlmICh0eXBlb2Ygci5zcGVjVmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJzZWQuc3BlY1ZlcnNpb24gPSByLnNwZWNWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci53b3JrZmxvd0NvcmVWZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC53b3JrZmxvd0NvcmVWZXJzaW9uID0gci53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci5lbmNyeXB0aW9uUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC5lbmNyeXB0aW9uUHVibGljS2V5ID0gci5lbmNyeXB0aW9uUHVibGljS2V5O1xuICB9XG4gIGlmICh0eXBlb2Ygci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoZWFsdGhDaGVjayhcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRpb25zPzogSGVhbHRoQ2hlY2tPcHRpb25zXG4pOiBQcm9taXNlPEhlYWx0aENoZWNrUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQ7XG4gIC8vIFVzZSB0aGUgd29ybGQncyBJRCBnZW5lcmF0b3Igd2hlbiBhdmFpbGFibGUgc28gdGhlIGNvcnJlbGF0aW9uSWQgaXMgYVxuICAvLyByZWdpb24tdGFnZ2VkIFVMSUQuIFRoZSBoZWFsdGgtY2hlY2sgcmVzcG9uc2UgaXMgZGVsaXZlcmVkIG92ZXIgYSBzdHJlYW1cbiAgLy8gd2hvc2UgbmFtZSBlbWJlZHMgdGhpcyBjb3JyZWxhdGlvbklkOyB1bmRlciBwbGF0Zm9ybS1kaXJlY3RlZCByb3V0aW5nIHRoZVxuICAvLyByZWFkZXIgYW5kIHRoZSByZXNwb25kaW5nIGVuZHBvaW50IGNhbiBiZSBzZXJ2ZWQgZnJvbSBkaWZmZXJlbnQgcGh5c2ljYWxcbiAgLy8gcmVnaW9ucywgc28gdGhlIHJlZ2lvbiBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIElEIGl0c2VsZiBmb3IgYm90aCBzaWRlcyB0b1xuICAvLyByZXNvbHZlIHRoZSBzYW1lIChyZWdpb24tcGlubmVkKSBiYWNrZW5kLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gVUxJRCBmb3JcbiAgLy8gd29ybGRzIHRoYXQgZG9uJ3QgdGFnIElEcyAoZS5nLiBsb2NhbCksIHdoaWNoIHJlc29sdmUgdG8gdGhlIGRlZmF1bHRcbiAgLy8gcmVnaW9uIG9uIGJvdGggc2lkZXMuXG4gIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB3b3JsZC5jcmVhdGVSdW5JZD8uKCkgPz8gZ2VuZXJhdGVJZCgpO1xuICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQpO1xuXG4gIGNvbnN0IHF1ZXVlTmFtZSA9XG4gICAgYCR7Z2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKSl9aGVhbHRoX2NoZWNrYCBhcyBWYWxpZFF1ZXVlTmFtZTtcblxuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICBxdWV1ZU5hbWUsXG4gICAgICB7XG4gICAgICAgIF9faGVhbHRoQ2hlY2s6IHRydWUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIC4uLihvcHRpb25zPy5ydW5JZCA/IHsgcnVuSWQ6IG9wdGlvbnMucnVuSWQgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFVzZSBKU09OIHRyYW5zcG9ydCBzbyB0aGUgaGVhbHRoIGNoZWNrIHdvcmtzIGFnYWluc3QgYm90aFxuICAgICAgICAvLyBvbGQgKEpTT04tb25seSkgYW5kIG5ldyAoZHVhbCkgZGVwbG95bWVudHMuXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICBkZXBsb3ltZW50SWQ6IG9wdGlvbnM/LmRlcGxveW1lbnRJZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aW1lb3V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdpdGhEZWFkbGluZShcbiAgICAgICAgICB3b3JsZC5zdHJlYW1zLmdldChcbiAgICAgICAgICAgIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkKSxcbiAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlbWFpbmluZ01zXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgeyBjaHVua3MsIHRpbWVkT3V0IH0gPSBhd2FpdCByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gICAgICAgICAgcmVhZGVyLFxuICAgICAgICAgIEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNhbmNlbCBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3MpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBIZWFsdGggY2hlY2sgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2AsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICByZXR1cm4gbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICBgRXZlbnQgcGFnaW5hdGlvbiAke21lc3NhZ2V9IGZvciB3b3JrZmxvdyBydW4gXCIke3J1bklkfVwiLmAsXG4gICAgeyBjb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmRSZXF1ZXN0ZWRFdmVudEN1cnNvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICByZXF1ZXN0ZWRDdXJzb3JzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmICghY3Vyc29yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWRDdXJzb3JzLmhhcyhjdXJzb3IpKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihydW5JZCwgJ2RpZCBub3QgYWR2YW5jZScpO1xuICB9XG4gIHJlcXVlc3RlZEN1cnNvcnMuYWRkKGN1cnNvcik7XG59XG5cbi8qKlxuICogQXBwZW5kcyBldmVudHMgd2hvc2UgSURzIGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluIGB0YXJnZXRgLlxuICpcbiAqIFBhc3MgdGhlIElEcyBjdXJyZW50bHkgcHJlc2VudCBpbiBgdGFyZ2V0YCB3aGVuIGFwcGVuZGluZyByZXBlYXRlZGx5IHRvIHRoZVxuICogc2FtZSBhcnJheS4gVGhlIHNldCBpcyB1cGRhdGVkIGFsb25nc2lkZSBgdGFyZ2V0YC5cbiAqXG4gKiBFdmVudHMgYXJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGUgV29ybGQgcmV0dXJuZWQgdGhlbSwgYW5kIGFyZSBub3RcbiAqIHJlLXNvcnRlZDogYSBXb3JsZCdzIGNhbm9uaWNhbCBvcmRlciBpcyBpdHMgb3duLCBhbmQgdGhlIHJ1bnRpbWUgY2Fubm90XG4gKiByZXByb2R1Y2UgaXQgZnJvbSBldmVudCBpZHMgYWxvbmUuIGB3b3JsZC12ZXJjZWxgIG9yZGVycyBieSBldmVudCBpZCwgd2hpbGVcbiAqIGB3b3JsZC1sb2NhbGAgb3JkZXJzIGJ5IGAoY3JlYXRlZEF0LCBldmVudElkKWAgYW5kIGRlbGliZXJhdGVseSByZS1taW50cyBrZXlzXG4gKiBzbyB0aGF0IHRoZSB0d28gZGl2ZXJnZS4gRXZlcnkgYXBwZW5kIHNvdXJjZSBpcyBhbHJlYWR5IGluIGNhbm9uaWNhbCBvcmRlclxuICogcmVsYXRpdmUgdG8gdGhlIHRhaWwgKGEgY3Vyc29yLWRlbGltaXRlZCBwYWdlLCBvciBhIHdyaXRlLXJlc3BvbnNlIGRlbHRhKSwgc29cbiAqIHJlY2VpcHQgb3JkZXIgaXMgdGhlIG9yZGVyIHRvIGtlZXAuIE5vdGhpbmcgZG93bnN0cmVhbSBtYXkgYXNzdW1lIHRoZSB0YWlsIGlzXG4gKiB0aGUgbmV3ZXN0IGV2ZW50IOKAlCBzZWUge0BsaW5rIGxhdGVzdEV2ZW50U3RhdGVVcGRhdGVkQXR9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kVW5pcXVlRXZlbnRzKFxuICB0YXJnZXQ6IEV2ZW50W10sXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSxcbiAgdGFyZ2V0SWRzPzogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IHRhcmdldElkcyA/PyBuZXcgU2V0KHRhcmdldC5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKSk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGlkcy5oYXMoZXZlbnQuZXZlbnRJZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZHMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIHRhcmdldC5wdXNoKGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydHMgYGV2ZW50YCBpbnRvIGB0YXJnZXRgIGF0IHRoZSBwb3NpdGlvbiB0aGF0IGtlZXBzIGB0YXJnZXRgIG9yZGVyZWQgYnlcbiAqIGFzY2VuZGluZyBgZXZlbnRJZGAsIG9yIG5vLW9wcyBpZiBhbiBldmVudCB3aXRoIHRoZSBzYW1lIGBldmVudElkYCBpcyBhbHJlYWR5XG4gKiBwcmVzZW50IChpZGVtcG90ZW50KS5cbiAqXG4gKiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBsb2FkZWQgYHNvcnRPcmRlcjogJ2FzYydgIGFuZCBpcyBuZXZlciByZS1zb3J0ZWRcbiAqIGNsaWVudC1zaWRlLCBzbyBhIGBob29rX3JlY2VpdmVkYCBzcGxpY2VkIGluIGJ5IHRoZSBsYXp5LXJlc3VtZSBjb25zdW1lciBtdXN0XG4gKiBsYW5kIGluIGBldmVudElkYCBvcmRlciDigJQgYSBwbGFpbiBgcHVzaGAgd291bGQgcGxhY2UgYSBsYXRlLWNvbW1pdHRpbmdcbiAqIGVhcmxpZXIgZXZlbnQgYWZ0ZXIgZXZlbnRzIHRoYXQgc29ydCBiZWZvcmUgaXQsIGNvcnJ1cHRpbmcgcmVwbGF5LiBFdmVudCBJRHNcbiAqIGFyZSBVTElEcywgc28gbGV4aWNvZ3JhcGhpYyBzdHJpbmcgb3JkZXIgbWF0Y2hlcyBjb21taXQgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRFdmVudEJ5RXZlbnRJZCh0YXJnZXQ6IEV2ZW50W10sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAvLyBMaW5lYXIgc2NhbiBmcm9tIHRoZSBlbmQ6IHRoZSBzcGxpY2VkIGV2ZW50IGlzIGFsbW9zdCBhbHdheXMgdGhlIG5ld2VzdFxuICAvLyAoaXQgc29ydHMgYXQgb3IgbmVhciB0aGUgdGFpbCksIHNvIHRoaXMgZmluZHMgdGhlIHNsb3QgaW4gTygxKeKAk08oaykgZm9yIHRoZVxuICAvLyBjb21tb24gY2FzZSB3aGlsZSBzdGlsbCBoYW5kbGluZyBhbiBvdXQtb2Ytb3JkZXIgbGF0ZSBhcnJpdmFsIGNvcnJlY3RseS5cbiAgbGV0IGkgPSB0YXJnZXQubGVuZ3RoO1xuICB3aGlsZSAoaSA+IDApIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRhcmdldFtpIC0gMV07XG4gICAgaWYgKGV4aXN0aW5nLmV2ZW50SWQgPT09IGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIC8vIEFscmVhZHkgcHJlc2VudCDigJQga2VlcCB0aGUgc3BsaWNlIGlkZW1wb3RlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleGlzdGluZy5ldmVudElkIDwgZXZlbnQuZXZlbnRJZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGktLTtcbiAgfVxuICB0YXJnZXQuc3BsaWNlKGksIDAsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhhc01vcmU6IGJvb2xlYW4sXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgcmVxdWVzdGVkQ3Vyc29yczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoIWhhc01vcmUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IoXG4gICAgICBydW5JZCxcbiAgICAgICdyZXR1cm5lZCBtb3JlIHBhZ2VzIHdpdGhvdXQgYSBjdXJzb3InXG4gICAgKTtcbiAgfVxuICBpZiAocmVxdWVzdGVkQ3Vyc29ycy5oYXMoY3Vyc29yKSkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IocnVuSWQsICdyZXBlYXRlZCBhIGN1cnNvcicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJldHJ5V2l0aG91dEV2ZW50Q3Vyc29yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICBhbHJlYWR5UmV0cmllZDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY3Vyc29yICE9PSBudWxsICYmXG4gICAgIWFscmVhZHlSZXRyaWVkICYmXG4gICAgV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycm9yKSAmJlxuICAgIGVycm9yLnN0YXR1cyA9PT0gNDAwXG4gICk7XG59XG5cbi8qKlxuICogTG9hZHMgd29ya2Zsb3cgcnVuIGV2ZW50cyBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgcGFnZXMgb2YgcGFnaW5hdGVkXG4gKiByZXN1bHRzLiBFdmVudHMgYXJlIHJldHVybmVkIGluIGNocm9ub2xvZ2ljYWwgKGFzY2VuZGluZykgb3JkZXIgZm9yXG4gKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IHJlcGxheS5cbiAqXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElELlxuICogQHBhcmFtIGFmdGVyQ3Vyc29yIC0gSWYgcHJvdmlkZWQsIG9ubHkgZXZlbnRzIGFmdGVyIHRoaXMgY3Vyc29yIGFyZVxuICogICByZXR1cm5lZCAoaW5jcmVtZW50YWwgbG9hZCkuIElmIG9taXR0ZWQsIGFsbCBldmVudHMgYXJlIHJldHVybmVkLlxuICogICBUaGUgcmV0dXJuZWQgY3Vyc29yIGNhbiBiZSBwYXNzZWQgYmFjayBpbiBvbiBhIHN1YnNlcXVlbnQgY2FsbCBmb3JcbiAqICAgaW5jcmVtZW50YWwgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgYWZ0ZXJDdXJzb3I/OiBzdHJpbmdcbik6IFByb21pc2U8eyBldmVudHM6IEV2ZW50W107IGN1cnNvcjogc3RyaW5nIHwgbnVsbCB9PiB7XG4gIGNvbnN0IGluY3JlbWVudGFsID0gYWZ0ZXJDdXJzb3IgIT09IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRyYWNlKFxuICAgIGluY3JlbWVudGFsID8gJ3dvcmtmbG93LmxvYWROZXdFdmVudHMnIDogJ3dvcmtmbG93LmxvYWRFdmVudHMnLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGxvYWRlZEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgICAgY29uc3QgbG9hZGVkRXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBhZnRlckN1cnNvciA/PyBudWxsO1xuICAgICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgICAgbGV0IHBhZ2VzTG9hZGVkID0gMDtcbiAgICAgIGxldCByZXRyaWVkV2l0aG91dEN1cnNvciA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgY29uc3QgbG9hZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICAgIC8vIFRPRE86IHdlJ3JlIGN1cnJlbnRseSBsb2FkaW5nIGFsbCB0aGUgZGF0YSB3aXRoIHJlc29sdmVSZWYgYmVoYXZpb3VyLiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzXG4gICAgICAgIC8vIHRvIGxhenlsb2FkIHRoZSBkYXRhIGZyb20gdGhlIHdvcmxkIGluc3RlYWQgc28gdGhhdCB3ZSBjYW4gb3B0aW1pemUgYW5kIG1ha2UgdGhlIGV2ZW50IGxvZyBsb2FkaW5nXG4gICAgICAgIC8vIG11Y2ggZmFzdGVyIGFuZCBtZW1vcnkgZWZmaWNpZW50XG4gICAgICAgIGNvbnN0IHBhZ2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgcmVjb3JkUmVxdWVzdGVkRXZlbnRDdXJzb3IocnVuSWQsIHJlcXVlc3RlZEN1cnNvciwgcmVxdWVzdGVkQ3Vyc29ycyk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHdvcmxkLmV2ZW50cy5saXN0Pj47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgICAgY3Vyc29yOiByZXF1ZXN0ZWRDdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzaG91bGRSZXRyeVdpdGhvdXRFdmVudEN1cnNvcihcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEN1cnNvcixcbiAgICAgICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3JcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciB3YXMgcmVqZWN0ZWQ7IHJldHJ5aW5nIHdpdGggYSBmdWxsIGV2ZW50IHJlbG9hZC4nLFxuICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2FkZWRFdmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxvYWRlZEV2ZW50SWRzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzLmNsZWFyKCk7XG4gICAgICAgICAgICBjdXJzb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3IgPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvYWRlZEV2ZW50cywgcmVzcG9uc2UuZGF0YSwgbG9hZGVkRXZlbnRJZHMpO1xuICAgICAgICBoYXNNb3JlID0gcmVzcG9uc2UuaGFzTW9yZTtcbiAgICAgICAgYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgICByZXNwb25zZS5jdXJzb3IsXG4gICAgICAgICAgcmVxdWVzdGVkQ3Vyc29yc1xuICAgICAgICApO1xuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgbGFzdCBub24tbnVsbCBjdXJzb3IgYWNyb3NzIHBhZ2VzLiBBIFdvcmxkIG1heVxuICAgICAgICAvLyBsZWdpdGltYXRlbHkgcmV0dXJuIGB7IGRhdGE6IFtdLCBjdXJzb3I6IG51bGwsIGhhc01vcmU6IGZhbHNlIH1gXG4gICAgICAgIC8vIG9uIGEgdHJhaWxpbmcgZW1wdHkgcGFnZSDigJQgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcHJldmlvdXMgcGFnZSdzXG4gICAgICAgIC8vIHVuZGVybHlpbmcgREIgcXVlcnkgaGl0IHRoZSBsaW1pdCBleGFjdGx5IGFuZCByZXR1cm5lZCBhXG4gICAgICAgIC8vIGBMYXN0RXZhbHVhdGVkS2V5YCBcImp1c3QgaW4gY2FzZVwiLiBPdmVyd3JpdGluZyB3aXRoIHRoYXQgbnVsbFxuICAgICAgICAvLyB3b3VsZCBsb3NlIHRoZSBwb3NpdGlvbiBwYXN0IHRoZSBsYXN0IHJlYWwgZXZlbnQgd2UgbG9hZGVkIGFuZFxuICAgICAgICAvLyBmb3JjZSB0aGUgcnVudGltZSBpbnRvIHRoZSBcIm5vIGN1cnNvciBhZnRlciBpbml0aWFsIGxvYWRcIiBmdWxsLVxuICAgICAgICAvLyByZWxvYWQgZmFsbGJhY2sgb24gZXZlcnkgc3Vic2VxdWVudCByZXBsYXkgaXRlcmF0aW9uLlxuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3IgPz8gY3Vyc29yO1xuICAgICAgICBwYWdlc0xvYWRlZCsrO1xuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0xvYWRlZCBldmVudCBwYWdlJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICAgIHBhZ2U6IHBhZ2VzTG9hZGVkLFxuICAgICAgICAgIHBhZ2VFdmVudHM6IHJlc3BvbnNlLmRhdGEubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgcGFnZU1zOiBEYXRlLm5vdygpIC0gcGFnZVN0YXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRXZlbnQgbG9hZCBjb21wbGV0ZScsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgICAgcGFnZXNMb2FkZWQsXG4gICAgICAgIHRvdGFsTXM6IERhdGUubm93KCkgLSBsb2FkU3RhcnQsXG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGxvYWRlZEV2ZW50cy5sZW5ndGgpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNQYWdlc0xvYWRlZChwYWdlc0xvYWRlZCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgZXZlbnRzOiBsb2FkZWRFdmVudHMsIGN1cnNvciB9O1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSdzIGxvYWRlZCBldmVudC1sb2cgc25hcHNob3Q6IHRoZSBldmVudHMgcmVwbGF5ZWQgc28gZmFyIGFuZCB0aGVcbiAqIGN1cnNvciBwb3NpdGlvbmVkIGFmdGVyIHRoZW0uIEhhbmRlZCB0byBoZWxwZXJzIHRoYXQgZGVyaXZlIHRoZSBwcmVjb25kaXRpb25cbiAqIHNuYXBzaG90IGZyb20gaXQ7IHRoZXkgZG8gbm90IG11dGF0ZSBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWRFdmVudExvZyB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG9wdGltaXN0aWMtY29uY3VycmVuY3kgZ3VhcmQgZm9yIGV2ZW50IGNyZWF0aW9uIGlzIGVuYWJsZWQuXG4gKiAqKk9uIGJ5IGRlZmF1bHQqKiB3aGVyZSB0aGUgcnVudGltZSBleGVjdXRlczogcmVwbGF5LWNvbnRleHQgY3JlYXRlcyBzZW5kIGFcbiAqIGBzdGF0ZVVwZGF0ZWRBdGAgc25hcHNob3QgKGFuZCBjYW4gYmUgcmVqZWN0ZWQgd2l0aCA0MTIgYnkgYSBzdXBwb3J0aW5nXG4gKiBiYWNrZW5kKSB1bmxlc3MgYFdPUktGTE9XX1BSRUNPTkRJVElPTl9HVUFSRGAgaXMgc2V0IHRvIGAwYC4gQmFja2VuZHMgd2l0aG91dFxuICogZ3VhcmQgc3VwcG9ydCBpZ25vcmUgdGhlIHNuYXBzaG90LCBzbyBlbmFibGluZyBieSBkZWZhdWx0IGlzXG4gKiBiYWNrd2FyZC1jb21wYXRpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb25kaXRpb25HdWFyZEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19QUkVDT05ESVRJT05fR1VBUkQgIT09ICcwJztcbn1cblxuLyoqXG4gKiBUaGUgYHN0YXRlVXBkYXRlZEF0YCB2YWx1ZSB0byBzZW5kIHdpdGggYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbjogdGhlXG4gKiAqbWF4aW11bSogVUxJRCB0aW1lIChlcG9jaCBtcykgb3ZlciB0aGUgZXZlbnRzIHRoZSBydW50aW1lIGhhcyBsb2FkZWQuIFJldHVybnNcbiAqIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vIGV2ZW50cyBvciB0aGF0IGlkIGlzIG5vdCBhIGRlY29kYWJsZSBVTElELlxuICpcbiAqIEl0IGlzIHRoZSBtYXhpbXVtIHJhdGhlciB0aGFuIHRoZSB0YWlsJ3MgYmVjYXVzZSB0aGUgbG9hZGVkIGxvZyBpcyBpbiB0aGVcbiAqIFdvcmxkJ3MgY2Fub25pY2FsIG9yZGVyLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgZXZlbnQtaWQgb3JkZXIgKHNlZVxuICoge0BsaW5rIGFwcGVuZFVuaXF1ZUV2ZW50c30pLiBUaGUgbWF4aW11bSBpcyB3aGF0IGxldHMgdGhlIGNvdW50IHNlbnQgYWxvbmdzaWRlXG4gKiBpdCBiZSByZWFkIGFzIFwiZXZlbnRzIGF0IG9yIGJlbG93IHRoaXMgd2F0ZXJtYXJrXCI6IGV2ZXJ5IGxvYWRlZCBldmVudCBpcyBhdCBvclxuICogYmVsb3cgaXQsIHNvIHRoZSBjb3VudCBpcyBleGFjdGx5IGBldmVudHMubGVuZ3RoYC4gUmVhZGluZyB0aGUgdGFpbCBpbnN0ZWFkXG4gKiB3b3VsZCB1bmRlcnN0YXRlIHRoZSB3YXRlcm1hcmsgb24gYSBXb3JsZCB3aG9zZSBvcmRlciBpcyBub3QgaWQtb3JkZXJlZCwgd2hpY2hcbiAqIGlzIHNhZmUgKGl0IGNhbiBvbmx5IHdlYWtlbiBkZXRlY3Rpb24pIGJ1dCBuZWVkbGVzc2x5IGltcHJlY2lzZS5cbiAqXG4gKiBUaGUgbWF4aW11bSBpcyBmb3VuZCBieSBsZXhpY29ncmFwaGljIGlkIGNvbXBhcmlzb24sIGRlY29kaW5nIG9ubHkgb25jZTogdGhlXG4gKiAyNi1jaGFyYWN0ZXIgQ3JvY2tmb3JkIFVMSUQgZW5jb2RlcyBpdHMgdGltZXN0YW1wIGluIHRoZSBsZWFkaW5nIDEwXG4gKiBjaGFyYWN0ZXJzLCBzbyB0aGUgZ3JlYXRlc3QgaWQgYWxzbyBjYXJyaWVzIHRoZSBncmVhdGVzdCB0aW1lLlxuICpcbiAqIEdyYW51bGFyaXR5OiBzbmFwc2hvdHMgYXJlIGVwb2NoLW1pbGxpc2Vjb25kcywgYW5kIHRoZSBiYWNrZW5kIGFsbG93cyBhblxuICogZXF1YWwtdGltZXN0YW1wIHNuYXBzaG90IChhbiB1cC10by1kYXRlIGNsaWVudCBtdXN0IG5vdCBiZSByZWplY3RlZCkuIFR3b1xuICogb3V0LW9mLWJhbmQgZXZlbnRzIGxhbmRpbmcgaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQgd2hlcmUgb25seSB0aGUgZmlyc3Qgd2FzXG4gKiBsb2FkZWQgdGhlcmVmb3JlIHBhc3MgdGhpcyBoYWxmIG9mIHRoZSBndWFyZCB1bmRldGVjdGVkIOKAlCB0aGF0IGlzIGV4YWN0bHlcbiAqIHRoZSBob2xlIGBzdGF0ZUV2ZW50Q291bnRgIGNsb3Nlcywgc2luY2UgdGhlIGNvdW50IG9mIGV2ZW50cyBhdCBvciBiZWxvdyB0aGVcbiAqIHdhdGVybWFyayBkaWZmZXJzIGV2ZW4gd2hlbiB0aGUgd2F0ZXJtYXJrcyBhcmUgZXF1YWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXRlc3RFdmVudFN0YXRlVXBkYXRlZEF0KGV2ZW50czogRXZlbnRbXSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBsYXRlc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAobGF0ZXN0ID09PSB1bmRlZmluZWQgfHwgZXZlbnQuZXZlbnRJZCA+IGxhdGVzdCkge1xuICAgICAgbGF0ZXN0ID0gZXZlbnQuZXZlbnRJZDtcbiAgICB9XG4gIH1cbiAgaWYgKGxhdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBFdmVudCBJRHMgYXJlIHByZWZpeGVkIFVMSURzIChlLmcuIGBldm50XzAxQVJZWi4uLmApOyB1bGlkVG9EYXRlIG9ubHlcbiAgLy8gZGVjb2RlcyB0aGUgYmFyZSAyNi1jaGFyIFVMSUQsIHNvIHN0cmlwIHRoZSBwcmVmaXggZmlyc3QuXG4gIGNvbnN0IGV2ZW50SWQgPSBsYXRlc3Q7XG4gIGNvbnN0IHVuZGVyc2NvcmUgPSBldmVudElkLmxhc3RJbmRleE9mKCdfJyk7XG4gIGNvbnN0IHJhd1VsaWQgPSB1bmRlcnNjb3JlID09PSAtMSA/IGV2ZW50SWQgOiBldmVudElkLnNsaWNlKHVuZGVyc2NvcmUgKyAxKTtcbiAgY29uc3QgdGltZSA9IHVsaWRUb0RhdGUocmF3VWxpZCk/LmdldFRpbWUoKTtcbiAgaWYgKHRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEZhaWwgb3BlbjogYSBub24tZGVjb2RhYmxlIGlkIGRpc2FybXMgdGhlIGd1YXJkIGZvciB0aGlzIGNyZWF0ZSAobm9cbiAgICAvLyBzbmFwc2hvdCBzZW50KS4gTG9nIHNvIGEgZmxlZXQtd2lkZSBzaWxlbnQgZGlzYXJtIGlzIGRpYWdub3NhYmxlLlxuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAnUHJlY29uZGl0aW9uIGd1YXJkOiBsYXRlc3QgZXZlbnQgaWQgaXMgbm90IGEgZGVjb2RhYmxlIFVMSUQ7IHNlbmRpbmcgbm8gc25hcHNob3QnLFxuICAgICAgeyBldmVudElkIH1cbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHRpbWU7XG59XG5cbi8qKlxuICogVGhlIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBhIHJlcGxheS1jb250ZXh0IGV2ZW50IGNyZWF0aW9uIHNlbmRzLCBkZXNjcmliaW5nXG4gKiB0aGUgZXZlbnQgbG9nIHRoZSByZXBsYXkgZGVyaXZlZCB0aGUgZXZlbnQgZnJvbS5cbiAqXG4gKiBUaGUgdGhyZWUgZmllbGRzIGFyZSBvbmUgaW5kaXZpc2libGUgdW5pdDogdGhlIGJhY2tlbmQgcmVhZHMgdGhlIGNvdW50IG9ubHlcbiAqIHJlbGF0aXZlIHRvIHRoZSB3YXRlcm1hcmssIGFuZCByZXR1cm5zIGl0cyBpbmxpbmUgZGVsdGEgb25seSByZWxhdGl2ZSB0byB0aGVcbiAqIGN1cnNvci4gUGFzc2luZyB0aGVtIGFzIGEgc2luZ2xlIG9iamVjdCBpcyB3aGF0IGtlZXBzIHRoZW0gZnJvbSBkcmlmdGluZ1xuICogYXBhcnQgYXQgYSBjYWxsIHNpdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMge1xuICBzdGF0ZVVwZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhdGVFdmVudENvdW50PzogbnVtYmVyO1xuICBzdGF0ZUN1cnNvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcHJlY29uZGl0aW9uIHNuYXBzaG90IHRvIGF0dGFjaCB0byBhIHJlcGxheS1jb250ZXh0IGV2ZW50IGNyZWF0aW9uLlxuICpcbiAqIFJldHVybnMgYW4gZW1wdHkgb2JqZWN0IOKAlCBubyBndWFyZCwgYmFja2VuZCBiZWhhdmVzIGFzIGJlZm9yZSDigJQgd2hlbiB0aGVcbiAqIGd1YXJkIGlzIGRpc2FibGVkIG9yIHRoZSB3YXRlcm1hcmsgaXMgbm90IGRlcml2YWJsZS4gQWxsIHRocmVlIGZpZWxkcyBmYWlsXG4gKiBvcGVuIHRvZ2V0aGVyOiBhIGNvdW50IHdpdGhvdXQgYSB3YXRlcm1hcmsgaXMgbWVhbmluZ2xlc3MgdG8gdGhlIGJhY2tlbmQsIGFuZFxuICogYSBjdXJzb3Igd2l0aG91dCBlaXRoZXIgd291bGQgaW52aXRlIGEgZGVsdGEgbm9ib2R5IGFza2VkIGZvci5cbiAqXG4gKiBgc3RhdGVFdmVudENvdW50YCBpcyBgZXZlbnRzLmxlbmd0aGAgYmVjYXVzZSB0aGUgd2F0ZXJtYXJrIGlzIHRoZSBsb2cnc1xuICogKm1heGltdW0qIFVMSUQgdGltZSwgc28gZXZlcnkgbG9hZGVkIGV2ZW50IGlzIGF0IG9yIGJlbG93IGl0IHJlZ2FyZGxlc3Mgb2YgdGhlXG4gKiBvcmRlciB0aGUgV29ybGQgcmV0dXJuZWQgdGhlbSBpbi5cbiAqXG4gKiBCb3RoIGZpZWxkcyBhcmUgdGhlcmVmb3JlIGludmFyaWFudCB1bmRlciBwZXJtdXRhdGlvbiBvZiB0aGUgbG9nOiBhIG1heGltdW0gaXNcbiAqIG9yZGVyLWluZGVwZW5kZW50LCBhbmQgdGhlIGxlbmd0aCBpcyBzZXQgY2FyZGluYWxpdHkgb25jZSBgYXBwZW5kVW5pcXVlRXZlbnRzYFxuICogaGFzIGRlZHVwZWQgYnkgZXZlbnQgaWQuIFR3byByZXBsYXlzIHRoYXQgY29uc3VtZSB0aGUgc2FtZSBldmVudHMgaW4gZGlmZmVyZW50XG4gKiBvcmRlcnMgc2VuZCBhbiBpZGVudGljYWwgc25hcHNob3QsIHNvIHRoaXMgZ3VhcmQgZGV0ZWN0cyB0aGF0IGEgbG9nIGlzIG1pc3NpbmdcbiAqIGFuIGV2ZW50IGFuZCBjYW4gbmV2ZXIgZGV0ZWN0IHRoYXQgYSByZXBsYXkgY29uc3VtZWQgb25lIGluIGEgZGlmZmVyZW50IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMoXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbFxuKTogUHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMge1xuICBpZiAoIWlzUHJlY29uZGl0aW9uR3VhcmRFbmFibGVkKCkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3Qgc3RhdGVVcGRhdGVkQXQgPSBsYXRlc3RFdmVudFN0YXRlVXBkYXRlZEF0KGV2ZW50cyk7XG4gIGlmIChzdGF0ZVVwZGF0ZWRBdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RhdGVVcGRhdGVkQXQsXG4gICAgc3RhdGVFdmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICAgIC4uLihjdXJzb3IgPyB7IHN0YXRlQ3Vyc29yOiBjdXJzb3IgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEgcmVqZWN0aW5nIFdvcmxkIGF0dGFjaGVkIHRvIGEgYFByZWNvbmRpdGlvbkZhaWxlZEVycm9yYCwgd2hlbiBpdFxuICogcmV0dXJuZWQgdGhlIG9uZXMgdGhlIGNsaWVudCdzIHNuYXBzaG90IHdhcyBtaXNzaW5nIGlubGluZS5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCBmb3IgYW55dGhpbmcgZWxzZSDigJQgbm8gZGV0YWlscywgYSBXb3JsZCB0aGF0IGRpZCBub3QgaW1wbGVtZW50XG4gKiB0aGlzLCBvciBhIHBheWxvYWQgdGhhdCBkb2VzIG5vdCBuYXJyb3cgY2xlYW5seS4gQ2FsbGVycyBmYWxsIGJhY2sgdG9cbiAqIHJlbG9hZGluZyB0aGUgZXZlbnQgbG9nLCB3aGljaCBpcyBhbHdheXMgY29ycmVjdDsgdGhpcyBpcyB1bnRydXN0ZWQtc2hhcGVkXG4gKiBkYXRhIG9uIGEgZmFpbHVyZSBwYXRoLCBzbyBub3RoaW5nIGhlcmUgaXMgcmVwYWlyZWQuXG4gKlxuICogYHJ1bklkYCBpcyB0aGUgY2FsbGVyJ3MgcnVuLiBFdmVyeSBldmVudCBtdXN0IGJlbG9uZyB0byBpdDogdGhlIGRlbHRhIGlzXG4gKiBtZXJnZWQgc3RyYWlnaHQgaW50byB0aGUgcmVwbGF5J3MgbG9nLCBhbmQgb25lIGZvcmVpZ24gZXZlbnQgdGhlcmUgaXMgYVxuICogY29ycnVwdCBsb2cgcmF0aGVyIHRoYW4gYSBjb3JyZWN0ZWQgb25lIOKAlCB0aGUgcmVwbGF5IHdvdWxkIGNvbnN1bWUgYVxuICogY29ycmVsYXRpb24gaWQgZm9yIGFuIGV2ZW50IHRoYXQgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBydW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb25kaXRpb25FdmVudERlbHRhKFxuICBlcnJvcjogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZ1xuKTogeyBldmVudHM6IEV2ZW50W107IGN1cnNvcjogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbCB7XG4gIGlmICghUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZGV0YWlscyA9IGVycm9yLmRldGFpbHM7XG4gIGlmICh0eXBlb2YgZGV0YWlscyAhPT0gJ29iamVjdCcgfHwgZGV0YWlscyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHsgZXZlbnRzLCBjdXJzb3IgfSA9IGRldGFpbHMgYXMgeyBldmVudHM/OiB1bmtub3duOyBjdXJzb3I/OiB1bmtub3duIH07XG4gIGlmICghQXJyYXkuaXNBcnJheShldmVudHMpIHx8IGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIGV2ZW50ID09PSBudWxsIHx8XG4gICAgICB0eXBlb2YgKGV2ZW50IGFzIHsgZXZlbnRJZD86IHVua25vd24gfSkuZXZlbnRJZCAhPT0gJ3N0cmluZycgfHxcbiAgICAgIChldmVudCBhcyB7IHJ1bklkPzogdW5rbm93biB9KS5ydW5JZCAhPT0gcnVuSWRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGV2ZW50czogZXZlbnRzIGFzIEV2ZW50W10sXG4gICAgY3Vyc29yOiB0eXBlb2YgY3Vyc29yID09PSAnc3RyaW5nJyA/IGN1cnNvciA6IG51bGwsXG4gIH07XG59XG5cbi8qKiBDcmVhdGVzIG9uZSBldmVudCBvbiBhIGJvdW5kIHJ1biwgY2FycnlpbmcgcmVwbGF5LXJlY292ZXJ5IHRlbGVtZXRyeS4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50Q3JlYXRvciA9IChcbiAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuKSA9PiBQcm9taXNlPEV2ZW50UmVzdWx0PjtcblxuLyoqXG4gKiBDT1JTIGhlYWRlcnMgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZXMuXG4gKiBBbGxvd3MgdGhlIG9ic2VydmFiaWxpdHkgVUkgdG8gY2hlY2sgZW5kcG9pbnQgaGVhbHRoIGZyb20gYSBkaWZmZXJlbnQgb3JpZ2luLlxuICovXG5jb25zdCBIRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTID0ge1xuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6ICdQT1NULCBPUFRJT05TLCBHRVQsIEhFQUQnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6ICdDb250ZW50LVR5cGUnLFxufTtcblxuLyoqXG4gKiBXcmFwcyBhIHJlcXVlc3QvcmVzcG9uc2UgaGFuZGxlciBhbmQgYWRkcyBhIGhlYWx0aCBjaGVjayBcIm1vZGVcIlxuICogYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgYF9faGVhbHRoYCBxdWVyeSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoSGVhbHRoQ2hlY2soXG4gIGhhbmRsZXI6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+LFxuICB3b3JsZFNwZWNWZXJzaW9uPzogbnVtYmVyXG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBhc3luYyAocmVxOiBSZXF1ZXN0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKTtcbiAgICBjb25zdCBpc0hlYWx0aENoZWNrID0gdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ19faGVhbHRoJyk7XG4gICAgaWYgKGlzSGVhbHRoQ2hlY2spIHtcbiAgICAgIC8vIEhhbmRsZSBDT1JTIHByZWZsaWdodCBmb3IgaGVhbHRoIGNoZWNrXG4gICAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICAgIGhlYWRlcnM6IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGhlYWx0aHk6IHRydWUsXG4gICAgICAgICAgZW5kcG9pbnQ6IHVybC5wYXRobmFtZSxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5IRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKHJlcSk7XG4gIH07XG59XG5cbi8qKlxuICogUXVldWVzIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlIHdpdGggdHJhY2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWVzc2FnZShcbiAgd29ybGQ6IFdvcmxkLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5cbikge1xuICBjb25zdCBxdWV1ZU5hbWUgPSBhcmdzWzBdO1xuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUocXVldWVOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3B1Ymxpc2gnKSxcbiAgICAgICAgLy8gUGVlciBzZXJ2aWNlIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwc1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUGVlclNlcnZpY2UoJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1NlcnZpY2UoJ3ZxcycpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjTWV0aG9kKCdwdWJsaXNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlSWQgfSA9IGF3YWl0IHdvcmxkLnF1ZXVlKC4uLmFyZ3MpO1xuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWVzc2FnZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHF1ZXVlIG92ZXJoZWFkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciBhIGdpdmVuIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWV1ZU92ZXJoZWFkKG1lc3NhZ2U6IHsgcmVxdWVzdGVkQXQ/OiBEYXRlIH0pIHtcbiAgaWYgKCFtZXNzYWdlLnJlcXVlc3RlZEF0KSByZXR1cm47XG4gIHRyeSB7XG4gICAgcmV0dXJuIEF0dHJpYnV0ZS5RdWV1ZU92ZXJoZWFkTXMoXG4gICAgICBEYXRlLm5vdygpIC0gbWVzc2FnZS5yZXF1ZXN0ZWRBdC5nZXRUaW1lKClcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWVtb2l6ZWQgYWNjZXNzb3IgZm9yIGEgcnVuJ3MgZnVsbCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkuXG4gKlxuICogVGhlIGZpcnN0IGNhbGwgcmVzb2x2ZXMgdGhlIHJ1bidzIGtleSBtYXRlcmlhbCB2aWFcbiAqIGB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCAod2hpY2ggbWF5IGRvIEhLREYgZGVyaXZhdGlvbiBsb2NhbGx5IG9uXG4gKiBWZXJjZWwsIG9yIGEgbmV0d29yayBmZXRjaCBmcm9tIGV4dGVybmFsIGNvbnRleHRzKSBhbmQgZGVyaXZlcyBhXG4gKiB7QGxpbmsgUGF5bG9hZEtleX0gZnJvbSBpdDsgc3Vic2VxdWVudCBjYWxscyBhd2FpdCB0aGUgc2FtZSBjYWNoZWQgcHJvbWlzZS5cbiAqIElmIHRoZSB3b3JsZCBkb2Vzbid0IHN1cHBvcnQgZW5jcnlwdGlvbiBvciB0aGUgcnVuIGhhcyBubyBrZXkgY29uZmlndXJlZCxcbiAqIHRoZSBjYWNoZWQgdmFsdWUgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHJlc29sdmVkIHZhbHVlIGlzIGRlbGliZXJhdGVseSB0aGUgKmZ1bGwqIGNhcGFiaWxpdHkg4oCUIHRoZSBzeW1tZXRyaWMgQUVTXG4gKiBrZXkgcGx1cyB0aGUgcnVuJ3MgWDI1NTE5IGtleXBhaXIg4oCUIG5vdCBqdXN0IGEgYENyeXB0b0tleWAuIEEgcnVuIHJlYWRpbmdcbiAqIGl0cyBvd24gZXZlbnQgbG9nIGNhbiBlbmNvdW50ZXIgc2VhbGVkIChgZW5jcGApIHBheWxvYWRzIHRoYXQgYW5vdGhlciBydW5cbiAqIHdyb3RlIHRvIGl0IChhIGNyb3NzLWRlcGxveW1lbnQgaG9vayByZXN1bXB0aW9uLCBzYXkpLCBhbmQgb3BlbmluZyB0aG9zZVxuICogbmVlZHMgdGhlIGtleXBhaXIuIFJlc29sdmluZyBvbmx5IHRoZSBzeW1tZXRyaWMga2V5IHdvdWxkIGxlYXZlIHRob3NlXG4gKiBwYXlsb2FkcyB1bm9wZW5hYmxlIGFuZCB3ZWRnZSB0aGUgcnVuLlxuICpcbiAqIFVzZWQgYnkgc3RlcCAvIHdvcmtmbG93IGhhbmRsZXJzIHRvIGRlZmVyIHRoZSAocG90ZW50aWFsbHkgZXhwZW5zaXZlKVxuICoga2V5IGZldGNoIHVudGlsIHRoZSBmaXJzdCBjb2RlIHBhdGggdGhhdCBhY3R1YWxseSBuZWVkcyBpdCDigJQgdHlwaWNhbGx5XG4gKiBpbnB1dCBoeWRyYXRpb24gb24gdGhlIHN1Y2Nlc3MgcGF0aCwgb3IgZXJyb3IgZGVoeWRyYXRpb24gb24gYSBmYWlsdXJlXG4gKiBwYXRoLiBCb3RoIHBhdGhzIGNhbiByYWNlLWNhbGwgdGhlIGFjY2Vzc29yIHdpdGhvdXQgdHJpZ2dlcmluZyBkdXBsaWNhdGVcbiAqIGZldGNoZXMuXG4gKlxuICogRXJyb3JzIHRocm93biBieSBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgcHJvcGFnYXRlIHRvIGV2ZXJ5IGNhbGxlclxuICogKHRoZSBjYWNoZWQgcHJvbWlzZSByZWplY3RzKS4gVGhpcyBpcyBpbnRlbnRpb25hbDogd2hlbiBlbmNyeXB0aW9uIGlzXG4gKiBjb25maWd1cmVkLCB3ZSBuZXZlciB3YW50IHRvIHNpbGVudGx5IGZhbGwgYmFjayB0byBwbGFpbnRleHRcbiAqIHNlcmlhbGl6YXRpb24uIEEgcHJvcGFnYXRlZCBlcnJvciBpbiBhbiBldmVudC1lbWlzc2lvbiBwYXRoIGxlYXZlcyB0aGVcbiAqIG91dGVyIHRyeS9jYXRjaCB0byBsb2cgYW5kIHN1cmZhY2UgdGhlIGlzc3VlOyB0aGUgcXVldWUncyByZWRlbGl2ZXJ5XG4gKiBzZW1hbnRpY3Mgd2lsbCByZXRyeSB0aGUga2V5IGZldGNoIG9uIHRoZSBuZXh0IGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5PcklkOiBXb3JrZmxvd1J1biB8IHN0cmluZ1xuKTogKCkgPT4gUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGxldCBjYWNoZWQ6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGNhY2hlZCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgb3ZlcmxvYWQgc2V0IHRha2VzIGVpdGhlciBhXG4gICAgICAgIC8vIGBXb3JrZmxvd1J1bmAgb3IgYSBgcnVuSWQ6IHN0cmluZ2AgKHdpdGggb3B0aW9uYWwgY29udGV4dCkuIEJyYW5jaFxuICAgICAgICAvLyBoZXJlIHNvIFR5cGVTY3JpcHQgcGlja3MgdGhlIHJpZ2h0IG92ZXJsb2FkIGZvciBlYWNoIHNoYXBlLlxuICAgICAgICBjb25zdCByYXdLZXkgPVxuICAgICAgICAgIHR5cGVvZiBydW5PcklkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZClcbiAgICAgICAgICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bk9ySWQpO1xuICAgICAgICAvLyBSZXNvbHZlIHRoZSAqZnVsbCogY2FwYWJpbGl0eSwgbm90IGp1c3QgdGhlIHN5bW1ldHJpYyBrZXk6IGEgcnVuXG4gICAgICAgIC8vIHJlYWRpbmcgaXRzIG93biBldmVudCBsb2cgbWF5IGVuY291bnRlciBzZWFsZWQgKGBlbmNwYCkgcGF5bG9hZHNcbiAgICAgICAgLy8gdGhhdCBhbm90aGVyIHJ1biB3cm90ZSB0byBpdCwgYW5kIG9wZW5pbmcgdGhvc2UgbmVlZHMgdGhlIHJ1bidzXG4gICAgICAgIC8vIFgyNTUxOSBzY2FsYXIgYXMgd2VsbC5cbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9O1xufVxuIl19
893
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFXMUIsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsVUFBVSxHQUNYLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsd0RBQXdEO0FBQ3hELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFlBQW9CLEVBQ3BCLFNBQWtCO0lBRWxCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFD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QixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FDM0MsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPO0lBQ1QsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQVksRUFDWixPQUE2QjtJQUU3QixJQUFJLE1BQW1ELENBQUM7SUFDeEQsT0FBTyxHQUFHLEVBQUU7UUFDVixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbkIsMkRBQTJEO2dCQUMzRCxxRUFBcUU7Z0JBQ3JFLDhEQUE4RDtnQkFDOUQsTUFBTSxNQUFNLEdBQ1YsT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDekIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsT0FBTyxDQUFDO29CQUMvQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEQsbUVBQW1FO2dCQUNuRSxtRUFBbUU7Z0JBQ25FLGtFQUFrRTtnQkFDbEUseUJBQXlCO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZUV2ZW50UGFyYW1zLFxuICBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIEV2ZW50LFxuICBFdmVudFJlc3VsdCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBWYWxpZFF1ZXVlTmFtZSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgZXZlbnRJZFRvU2xvdCxcbiAgRklSU1RfRVZFTlRfU0xPVCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLFxuICBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICB1bGlkVG9EYXRlLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0LCBkZXJpdmVSdW5LZXlQYWlyIH0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRTcGFuS2luZCwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcblxuLyoqIERlZmF1bHQgdGltZW91dCBmb3IgaGVhbHRoIGNoZWNrcyBpbiBtaWxsaXNlY29uZHMgKi9cbmNvbnN0IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQgPSAzMF8wMDA7XG5cbi8qKlxuICogUGF0dGVybiBmb3Igc2FmZSB3b3JrZmxvdyBuYW1lcy4gT25seSBhbGxvd3MgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsXG4gKiB1bmRlcnNjb3JlcywgaHlwaGVucywgZG90cywgZm9yd2FyZCBzbGFzaGVzIChmb3IgbmFtZXNwYWNlZCB3b3JrZmxvd3MpLFxuICogYW5kIGF0IHNpZ25zIChmb3Igc2NvcGVkIHBhY2thZ2VzKS5cbiAqL1xuY29uc3QgU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4gPSAvXlthLXpBLVowLTlfXFwtLi9AXSskLztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB3b3JrZmxvdyBuYW1lIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXVlIG5hbWUuXG4gKiBFbnN1cmVzIHRoZSB3b3JrZmxvdyBuYW1lIG9ubHkgY29udGFpbnMgc2FmZSBjaGFyYWN0ZXJzIGJlZm9yZVxuICogaW50ZXJwb2xhdGluZyBpdCBpbnRvIHRoZSBxdWV1ZSBuYW1lIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UXVldWVOYW1lKFxuICB3b3JrZmxvd05hbWU6IHN0cmluZyxcbiAgbmFtZXNwYWNlPzogc3RyaW5nXG4pOiBWYWxpZFF1ZXVlTmFtZSB7XG4gIGlmICghU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4udGVzdCh3b3JrZmxvd05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgd29ya2Zsb3cgbmFtZSBcIiR7d29ya2Zsb3dOYW1lfVwiOiBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcywgb3IgYXQgc2lnbnNgXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KFxuICAgICd3b3JrZmxvdycsXG4gICAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgKTtcbiAgcmV0dXJuIGAke3ByZWZpeH0ke3dvcmtmbG93TmFtZX1gIGFzIFZhbGlkUXVldWVOYW1lO1xufVxuXG5jb25zdCBnZW5lcmF0ZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmVhbSBuYW1lIGZvciBhIGhlYWx0aCBjaGVjayB3aXRoIHRoZSBnaXZlbiBjb3JyZWxhdGlvbiBJRC5cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgX19oZWFsdGhfY2hlY2tfXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIGhlYWx0aCBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tSZXN1bHQge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSBpZiBoZWFsdGggY2hlY2sgZmFpbGVkICovXG4gIGVycm9yPzogc3RyaW5nO1xuICAvKiogTGF0ZW5jeSBpZiB0aGUgaGVhbHRoIGNoZWNrIHdhcyBzdWNjZXNzZnVsICovXG4gIGxhdGVuY3lNcz86IG51bWJlcjtcbiAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50ICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQsIHVzZWQgZm9yXG4gICAqIGNhcGFiaWxpdHkgZGV0ZWN0aW9uIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2ApLiBPbWl0dGVkIHdoZW4gdGhlXG4gICAqIHJlc3BvbmRpbmcgZGVwbG95bWVudCBkaWQgbm90IHByb3ZpZGUgdGhlIGZpZWxkIGFzIGEgc3RyaW5nIOKAlFxuICAgKiBmb3IgZXhhbXBsZSwgYW4gb2xkZXIgYEB3b3JrZmxvdy9jb3JlYCB0aGF0IHByZWRhdGVzIHRoaXMgZmllbGQsXG4gICAqIG9yIGEgbm9uLUpTT04gcGxhaW4tdGV4dCBoZWFsdGggcmVzcG9uc2UuXG4gICAqL1xuICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRhcmdldCBydW4ncyBYMjU1MTkgcHVibGljIGtleSAoYmFzZTY0KSwgcmV0dXJuZWQgb25seSB3aGVuIHRoZSBwcm9iZVxuICAgKiBjYXJyaWVkIGEgYHJ1bklkYCBhbmQgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCBoYXMgZW5jcnlwdGlvbiBlbmFibGVkLlxuICAgKlxuICAgKiBMZXRzIGEgY3Jvc3MtZGVwbG95bWVudCBgc3RhcnQoKWAgc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHVzaW5nIGFcbiAgICogcmVzcG9uc2UgaXQgd2FzIGFscmVhZHkgd2FpdGluZyBvbiwgaW5zdGVhZCBvZiBtYWtpbmcgYSBzZXBhcmF0ZVxuICAgKiBrZXktbG9va3VwIHJlcXVlc3QuXG4gICAqL1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCdzIGBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OYCDigJQgdGhlIHByb3RvY29sXG4gICAqIHZlcnNpb24gYXQgd2hpY2ggdGhlICpjb25zdW1lciogKHF1ZXVlLW1lc3NhZ2UgdGFyZ2V0KSByZS1lbnN1cmVzIHRoZVxuICAgKiBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBgaG9va0lucHV0YCBvbiByZXBsYXkuIEEgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBgc3RhcnQoKWAgc3RhbXBzIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIChub3QgdGhlIGNhbGxlcidzKSBpbnRvIHRoZSBuZXdcbiAgICogcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbmAgc28gdGhhdCBgcmVzdW1lSG9vaygpYFxuICAgKiBvbmx5IHRha2VzIHRoZSBwYXJhbGxlbCBwYXRoIHdoZW4gdGhlIGRlcGxveW1lbnQgdGhhdCB3aWxsIGFjdHVhbGx5XG4gICAqIGNvbnN1bWUgdGhlIHF1ZXVlIG1lc3NhZ2UgaXMga25vd24gdG8gaG9ub3IgYGhvb2tJbnB1dGAuIE9taXR0ZWQgd2hlbiB0aGVcbiAgICogcmVzcG9uZGluZyBkZXBsb3ltZW50IHByZWRhdGVzIHRoaXMgZmllbGQgKGFuIG9sZGVyIGNvbnN1bWVyIHRoYXQgaWdub3Jlc1xuICAgKiBgaG9va0lucHV0YCksIHdoaWNoIGZhaWxzIHRoZSBnYXRlIGNsb3NlZC5cbiAgICovXG4gIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgaGVhbHRoIGNoZWNrIHBheWxvYWQuXG4gKiBJZiBzbywgcmV0dXJucyB0aGUgcGFyc2VkIHBheWxvYWQuIE90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKFxuICBtZXNzYWdlOiB1bmtub3duXG4pOiBIZWFsdGhDaGVja1BheWxvYWQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQgPSBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEuc2FmZVBhcnNlKG1lc3NhZ2UpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZm9yIGhlYWx0aCBjaGVjayBzdHJlYW1zLlxuICogQm90aCB0aGUgd3JpdGVyIChoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UpIGFuZCByZWFkZXIgKGhlYWx0aENoZWNrKSBkZXJpdmVcbiAqIHRoZSBzYW1lIHJ1bklkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzY29wZVxuICogc3RyZWFtIHJlYWRzIGJ5IHJ1bklkIHN0aWxsIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB3cnVuX2hjXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZSBieSB3cml0aW5nIHRoZSByZXN1bHQgdG8gdGhlIHdvcmxkJ3Mgc3RyZWFtLlxuICogVGhlIGNhbGxlciBjYW4gbGlzdGVuIHRvIHRoaXMgc3RyZWFtIHRvIGdldCB0aGUgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBoZWFsdGhDaGVjayAtIFRoZSBwYXJzZWQgaGVhbHRoIGNoZWNrIHBheWxvYWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgaGVhbHRoQ2hlY2s6IEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG5cbiAgLy8gV2hlbiB0aGUgcHJvYmUgbmFtZXMgYSBydW4gdGhlIGNhbGxlciBpcyBhYm91dCB0byBjcmVhdGUsIHB1Ymxpc2ggdGhhdFxuICAvLyBydW4ncyBwdWJsaWMga2V5LiBXZSBhcmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIGl0c1xuICAvLyBrZXkgbWF0ZXJpYWwgaXMgYXZhaWxhYmxlIGxvY2FsbHkgKG5vIEFQSSBjYWxsKSwgYW5kIHRoZSBjYWxsZXIgY2FuIHRoZW5cbiAgLy8gc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHN0cmFpZ2h0IGZyb20gdGhpcyByZXNwb25zZSByYXRoZXIgdGhhblxuICAvLyBtYWtpbmcgYSBzZXBhcmF0ZSBrZXktbG9va3VwIHJlcXVlc3QuXG4gIC8vXG4gIC8vIE9ubHkgYSAqcHVibGljKiBrZXkgbWF5IHRyYXZlbCB0aGlzIHdheTogdGhlIHByb2JlIHJlc3BvbnNlIHN0cmVhbSBpc1xuICAvLyBkZWxpYmVyYXRlbHkgdW5hdXRoZW50aWNhdGVkLCBzbyBhbnl0aGluZyBzZWNyZXQgd291bGQgYmUgZXhwb3NlZC5cbiAgLy8gQmVzdC1lZmZvcnQg4oCUIGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGhlYWx0aCBjaGVjayBpdHNlbGYsIHdoaWNoXG4gIC8vIGNhbGxlcnMgYWxzbyByZWx5IG9uIGZvciBwbGFpbiBjYXBhYmlsaXR5IGRldGVjdGlvbi5cbiAgbGV0IGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGhlYWx0aENoZWNrLnJ1bklkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihoZWFsdGhDaGVjay5ydW5JZCk7XG4gICAgICBpZiAocmF3S2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25QdWJsaWNLZXkgPSBieXRlc1RvQmFzZTY0KFxuICAgICAgICAgIChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSGVhbHRoIGNoZWNrIGNvdWxkIG5vdCBkZXJpdmUgYSBydW4gcHVibGljIGtleTsgdGhlIGNhbGxlciB3aWxsIGZhbGwgYmFjayB0byBhIGtleSBsb29rdXAnLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGhlYWx0aHk6IHRydWUsXG4gICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gdGhpcyBjb25zdGFudCByZWZsZWN0c1xuICAgIC8vIHRoZSAqY29uc3VtZXIncyogaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiDigJQgZXhhY3RseSB3aGF0IGFcbiAgICAvLyBjcm9zcy1kZXBsb3ltZW50IGNhbGxlciBuZWVkcyB0byBnYXRlIGl0cyBwYXJhbGxlbCByZXN1bWUgcGF0aCBvbi5cbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICB9KTtcbiAgLy8gVXNlIGEgZGV0ZXJtaW5pc3RpYyBmYWtlIHJ1bklkIGRlcml2ZWQgZnJvbSB0aGUgY29ycmVsYXRpb25JZCBzbyB0aGF0XG4gIC8vIHRoZSByZWFkZXIgc2lkZSBwcm9kdWNlcyB0aGUgc2FtZSB2YWx1ZS5cbiAgY29uc3QgZmFrZVJ1bklkID0gZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSwgcmVzcG9uc2UpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tPcHRpb25zIHtcbiAgLyoqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZS4gRGVmYXVsdDogMzAwMDAgKDMwcykgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIERlcGxveW1lbnQgSUQgdG8gc2VuZCB0aGUgaGVhbHRoIGNoZWNrIHRvLiBGYWxscyBiYWNrIHRvIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lELiAqL1xuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuIGlkIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gY3JlYXRlLiBXaGVuIHNldCwgdGhlIHJlc3BvbmRpbmdcbiAgICogZGVwbG95bWVudCBkZXJpdmVzIHRoYXQgcnVuJ3MgcHVibGljIGtleSBsb2NhbGx5IGFuZCByZXR1cm5zIGl0IGFzXG4gICAqIGBlbmNyeXB0aW9uUHVibGljS2V5YCwgbGV0dGluZyBhIGNyb3NzLWRlcGxveW1lbnQgYHN0YXJ0KClgIHNlYWwgdGhlXG4gICAqIHdvcmtmbG93IGFyZ3VtZW50cyB3aXRob3V0IGEgc2VwYXJhdGUga2V5IGxvb2t1cC5cbiAgICovXG4gIHJ1bklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIG9mIHRoZSB0YXJnZXQgZGVwbG95bWVudCAoZS5nLiBgJ2V2ZSdgIGZvciB0b3BpY3MgbGlrZVxuICAgKiBgX19ldmVfd2tmX3dvcmtmbG93XypgKS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLiBDcm9zcy1jb250ZXh0IGNhbGxlcnMgKGUuZy4gdGhlIG9ic2VydmFiaWxpdHlcbiAgICogZGFzaGJvYXJkKSBtdXN0IHBhc3MgdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgbmFtZXNwYWNlIGV4cGxpY2l0bHkg4oCUXG4gICAqIHRoZSBlbnYgZmFsbGJhY2sgcmVzb2x2ZXMgaW4gdGhlIGNhbGxlcidzIHByb2Nlc3MsIGFuZCBhIG1lc3NhZ2VcbiAgICogcHVibGlzaGVkIHRvIGEgbWlzbWF0Y2hlZCB0b3BpYyBoYXMgbm8gY29uc3VtZXIsIHNvIHRoZSBjaGVjayB3b3VsZFxuICAgKiBhbHdheXMgdGltZSBvdXQuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBoZWFsdGggY2hlY2sgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgcXVldWUgcGlwZWxpbmVcbiAqIGFuZCB2ZXJpZnlpbmcgaXQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBjb21iaW5lZCB3b3JrZmxvdyBlbmRwb2ludC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ5cGFzc2VzIERlcGxveW1lbnQgUHJvdGVjdGlvbiBvbiBWZXJjZWwgYmVjYXVzZSBpdCBnb2VzXG4gKiB0aHJvdWdoIHRoZSBxdWV1ZSBpbmZyYXN0cnVjdHVyZSByYXRoZXIgdGhhbiBkaXJlY3QgSFRUUC5cbiAqXG4gKiBAcGFyYW0gd29ybGQgLSBUaGUgV29ybGQgaW5zdGFuY2UgdG8gdXNlIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlYWx0aCBjaGVjayByZXN1bHRcbiAqL1xuLy8gUG9sbCBpbnRlcnZhbCBmb3IgaGVhbHRoIGNoZWNrIHJldHJpZXMgKG1zKVxuY29uc3QgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwgPSAxMDA7XG4vLyBQZXItcmVhZCB0aW1lb3V0IHRvIHByZXZlbnQgYmxvY2tpbmcgZm9yZXZlciBvbiBsb2NhbCB3b3JsZCdzIEV2ZW50RW1pdHRlclxuLy8gKHdoaWNoIGRvZXNuJ3Qgd29yayBhY3Jvc3MgcHJvY2Vzc2VzKVxuY29uc3QgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVCA9IDUwMDtcblxuLyoqXG4gKiBSZWFkIGNodW5rcyBmcm9tIGEgc3RyZWFtIHdpdGggYSB0aW1lb3V0IHBlciByZWFkIG9wZXJhdGlvbi5cbiAqIFJldHVybnMgeyBjaHVua3MsIHRpbWVkT3V0IH0gd2hlcmUgdGltZWRPdXQgaW5kaWNhdGVzIGlmIGEgcmVhZCB0aW1lZCBvdXQuXG4gKi9cbi8qKlxuICogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhIGRlYWRsaW5lLiBSZWplY3RzIHdpdGggYSB0aW1lb3V0IGVycm9yIHdoZW4gdGhlXG4gKiBkZWFkbGluZSBlbGFwc2VzIGZpcnN0LiBVc2VkIHRvIGJvdW5kIGB3b3JsZC5zdHJlYW1zLmdldCgpYCBpbnNpZGUgdGhlXG4gKiBoZWFsdGgtY2hlY2sgcG9sbCBsb29wOiBzb21lIHdvcmxkcyBob2xkIHRoYXQgcmVxdWVzdCBvcGVuIHVudGlsIHRoZVxuICogc3RyZWFtIGhhcyBkYXRhIChlLmcuIHdvcmtmbG93LXNlcnZlciBob2xkcyB1bndyaXR0ZW4gc3RyZWFtcyBvcGVuIGZvclxuICogfjIgbWludXRlcyksIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBibG93IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgaGVhbHRoXG4gKiBjaGVjayB0aW1lb3V0IOKAlCB0aGUgYHdoaWxlYCBjb25kaXRpb24gaXMgb25seSByZS1jaGVja2VkIGJldHdlZW5cbiAqIGl0ZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHdpdGhEZWFkbGluZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHByb21pc2UsXG4gICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgT3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciAke21zfW1zYCkpLFxuICAgICAgICBtc1xuICAgICAgKTtcbiAgICB9KSxcbiAgXSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbVdpdGhUaW1lb3V0KFxuICByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PixcbiAgcmVhZFRpbWVvdXQ6IG51bWJlclxuKTogUHJvbWlzZTx7IGNodW5rczogVWludDhBcnJheVtdOyB0aW1lZE91dDogYm9vbGVhbiB9PiB7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGxldCB0aW1lZE91dCA9IGZhbHNlO1xuXG4gIHdoaWxlICghZG9uZSAmJiAhdGltZWRPdXQpIHtcbiAgICBjb25zdCByZWFkUHJvbWlzZSA9IHJlYWRlci5yZWFkKCk7XG4gICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTx7IGRvbmU6IHRydWU7IHZhbHVlOiB1bmRlZmluZWQgfT4oXG4gICAgICAocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZWRPdXQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9LCByZWFkVGltZW91dClcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZWFkUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBkb25lID0gcmVzdWx0LmRvbmU7XG4gICAgaWYgKHJlc3VsdC52YWx1ZSkgY2h1bmtzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7IGNodW5rcywgdGltZWRPdXQgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBoZWFsdGggY2hlY2sgcmVzcG9uc2UgZnJvbSBzdHJlYW0gY2h1bmtzLlxuICogUmV0dXJucyB0aGUgcGFyc2VkIHJlc3BvbnNlIG9yIG51bGwgaWYgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VIZWFsdGhDaGVja1Jlc3BvbnNlKGNodW5rczogVWludDhBcnJheVtdKToge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbn0gfCBudWxsIHtcbiAgaWYgKGNodW5rcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgoc3VtLCBjaHVuaykgPT4gc3VtICsgY2h1bmsubGVuZ3RoLCAwKTtcbiAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGNvbWJpbmVkLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb21iaW5lZCk7XG5cbiAgbGV0IHJlc3BvbnNlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBPbGQgZGVwbG95bWVudHMgKHNwZWNWZXJzaW9uIDwgMykgcmV0dXJuIHBsYWluIHRleHQgbGlrZVxuICAgIC8vICdXb3JrZmxvdyBTREsgXCIuLi5cIiBlbmRwb2ludCBpcyBoZWFsdGh5Jy4gVHJlYXQgYW55IG5vbi1lbXB0eVxuICAgIC8vIHRleHQgcmVzcG9uc2UgYXMgYSBoZWFsdGh5IGRlcGxveW1lbnQgd2l0aCB1bmtub3duIHNwZWNWZXJzaW9uLlxuICAgIGlmIChyZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgaGVhbHRoeTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcmVzcG9uc2UgIT09ICdvYmplY3QnIHx8XG4gICAgcmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAhKCdoZWFsdGh5JyBpbiByZXNwb25zZSkgfHxcbiAgICB0eXBlb2YgKHJlc3BvbnNlIGFzIHsgaGVhbHRoeTogdW5rbm93biB9KS5oZWFsdGh5ICE9PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByID0gcmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHBhcnNlZDoge1xuICAgIGhlYWx0aHk6IGJvb2xlYW47XG4gICAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG4gIH0gPSB7XG4gICAgaGVhbHRoeTogci5oZWFsdGh5IGFzIGJvb2xlYW4sXG4gIH07XG4gIGlmICh0eXBlb2Ygci5zcGVjVmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJzZWQuc3BlY1ZlcnNpb24gPSByLnNwZWNWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci53b3JrZmxvd0NvcmVWZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC53b3JrZmxvd0NvcmVWZXJzaW9uID0gci53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci5lbmNyeXB0aW9uUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC5lbmNyeXB0aW9uUHVibGljS2V5ID0gci5lbmNyeXB0aW9uUHVibGljS2V5O1xuICB9XG4gIGlmICh0eXBlb2Ygci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoZWFsdGhDaGVjayhcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRpb25zPzogSGVhbHRoQ2hlY2tPcHRpb25zXG4pOiBQcm9taXNlPEhlYWx0aENoZWNrUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQ7XG4gIC8vIFVzZSB0aGUgd29ybGQncyBJRCBnZW5lcmF0b3Igd2hlbiBhdmFpbGFibGUgc28gdGhlIGNvcnJlbGF0aW9uSWQgaXMgYVxuICAvLyByZWdpb24tdGFnZ2VkIFVMSUQuIFRoZSBoZWFsdGgtY2hlY2sgcmVzcG9uc2UgaXMgZGVsaXZlcmVkIG92ZXIgYSBzdHJlYW1cbiAgLy8gd2hvc2UgbmFtZSBlbWJlZHMgdGhpcyBjb3JyZWxhdGlvbklkOyB1bmRlciBwbGF0Zm9ybS1kaXJlY3RlZCByb3V0aW5nIHRoZVxuICAvLyByZWFkZXIgYW5kIHRoZSByZXNwb25kaW5nIGVuZHBvaW50IGNhbiBiZSBzZXJ2ZWQgZnJvbSBkaWZmZXJlbnQgcGh5c2ljYWxcbiAgLy8gcmVnaW9ucywgc28gdGhlIHJlZ2lvbiBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIElEIGl0c2VsZiBmb3IgYm90aCBzaWRlcyB0b1xuICAvLyByZXNvbHZlIHRoZSBzYW1lIChyZWdpb24tcGlubmVkKSBiYWNrZW5kLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gVUxJRCBmb3JcbiAgLy8gd29ybGRzIHRoYXQgZG9uJ3QgdGFnIElEcyAoZS5nLiBsb2NhbCksIHdoaWNoIHJlc29sdmUgdG8gdGhlIGRlZmF1bHRcbiAgLy8gcmVnaW9uIG9uIGJvdGggc2lkZXMuXG4gIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB3b3JsZC5jcmVhdGVSdW5JZD8uKCkgPz8gZ2VuZXJhdGVJZCgpO1xuICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQpO1xuXG4gIGNvbnN0IHF1ZXVlTmFtZSA9XG4gICAgYCR7Z2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKSl9aGVhbHRoX2NoZWNrYCBhcyBWYWxpZFF1ZXVlTmFtZTtcblxuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICBxdWV1ZU5hbWUsXG4gICAgICB7XG4gICAgICAgIF9faGVhbHRoQ2hlY2s6IHRydWUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIC4uLihvcHRpb25zPy5ydW5JZCA/IHsgcnVuSWQ6IG9wdGlvbnMucnVuSWQgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFVzZSBKU09OIHRyYW5zcG9ydCBzbyB0aGUgaGVhbHRoIGNoZWNrIHdvcmtzIGFnYWluc3QgYm90aFxuICAgICAgICAvLyBvbGQgKEpTT04tb25seSkgYW5kIG5ldyAoZHVhbCkgZGVwbG95bWVudHMuXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICBkZXBsb3ltZW50SWQ6IG9wdGlvbnM/LmRlcGxveW1lbnRJZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aW1lb3V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdpdGhEZWFkbGluZShcbiAgICAgICAgICB3b3JsZC5zdHJlYW1zLmdldChcbiAgICAgICAgICAgIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkKSxcbiAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlbWFpbmluZ01zXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgeyBjaHVua3MsIHRpbWVkT3V0IH0gPSBhd2FpdCByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gICAgICAgICAgcmVhZGVyLFxuICAgICAgICAgIEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNhbmNlbCBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3MpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBIZWFsdGggY2hlY2sgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2AsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICByZXR1cm4gbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICBgRXZlbnQgcGFnaW5hdGlvbiAke21lc3NhZ2V9IGZvciB3b3JrZmxvdyBydW4gXCIke3J1bklkfVwiLmAsXG4gICAgeyBjb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmRSZXF1ZXN0ZWRFdmVudEN1cnNvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICByZXF1ZXN0ZWRDdXJzb3JzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmICghY3Vyc29yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWRDdXJzb3JzLmhhcyhjdXJzb3IpKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihydW5JZCwgJ2RpZCBub3QgYWR2YW5jZScpO1xuICB9XG4gIHJlcXVlc3RlZEN1cnNvcnMuYWRkKGN1cnNvcik7XG59XG5cbi8qKlxuICogQXBwZW5kcyBldmVudHMgd2hvc2UgSURzIGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluIGB0YXJnZXRgLlxuICpcbiAqIFBhc3MgdGhlIElEcyBjdXJyZW50bHkgcHJlc2VudCBpbiBgdGFyZ2V0YCB3aGVuIGFwcGVuZGluZyByZXBlYXRlZGx5IHRvIHRoZVxuICogc2FtZSBhcnJheS4gVGhlIHNldCBpcyB1cGRhdGVkIGFsb25nc2lkZSBgdGFyZ2V0YC5cbiAqXG4gKiBFdmVudHMgYXJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGUgV29ybGQgcmV0dXJuZWQgdGhlbSwgYW5kIGFyZSBub3RcbiAqIHJlLXNvcnRlZDogYSBXb3JsZCdzIGNhbm9uaWNhbCBvcmRlciBpcyBpdHMgb3duLCBhbmQgdGhlIHJ1bnRpbWUgY2Fubm90XG4gKiByZXByb2R1Y2UgaXQgZnJvbSBldmVudCBpZHMgYWxvbmUuIGB3b3JsZC12ZXJjZWxgIG9yZGVycyBieSBldmVudCBpZCwgd2hpbGVcbiAqIGB3b3JsZC1sb2NhbGAgb3JkZXJzIGJ5IGAoY3JlYXRlZEF0LCBldmVudElkKWAgYW5kIGRlbGliZXJhdGVseSByZS1taW50cyBrZXlzXG4gKiBzbyB0aGF0IHRoZSB0d28gZGl2ZXJnZS4gRXZlcnkgYXBwZW5kIHNvdXJjZSBpcyBhbHJlYWR5IGluIGNhbm9uaWNhbCBvcmRlclxuICogcmVsYXRpdmUgdG8gdGhlIHRhaWwgKGEgY3Vyc29yLWRlbGltaXRlZCBwYWdlLCBvciBhIHdyaXRlLXJlc3BvbnNlIGRlbHRhKSwgc29cbiAqIHJlY2VpcHQgb3JkZXIgaXMgdGhlIG9yZGVyIHRvIGtlZXAuIE5vdGhpbmcgZG93bnN0cmVhbSBtYXkgYXNzdW1lIHRoZSB0YWlsIGlzXG4gKiB0aGUgbmV3ZXN0IGV2ZW50IOKAlCBzZWUge0BsaW5rIGxhdGVzdEV2ZW50U3RhdGVVcGRhdGVkQXR9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kVW5pcXVlRXZlbnRzKFxuICB0YXJnZXQ6IEV2ZW50W10sXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSxcbiAgdGFyZ2V0SWRzPzogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IHRhcmdldElkcyA/PyBuZXcgU2V0KHRhcmdldC5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKSk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGlkcy5oYXMoZXZlbnQuZXZlbnRJZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZHMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIHRhcmdldC5wdXNoKGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydHMgYGV2ZW50YCBpbnRvIGB0YXJnZXRgIGF0IHRoZSBwb3NpdGlvbiB0aGF0IGtlZXBzIGB0YXJnZXRgIG9yZGVyZWQgYnlcbiAqIGFzY2VuZGluZyBgZXZlbnRJZGAsIG9yIG5vLW9wcyBpZiBhbiBldmVudCB3aXRoIHRoZSBzYW1lIGBldmVudElkYCBpcyBhbHJlYWR5XG4gKiBwcmVzZW50IChpZGVtcG90ZW50KS5cbiAqXG4gKiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBsb2FkZWQgYHNvcnRPcmRlcjogJ2FzYydgIGFuZCBpcyBuZXZlciByZS1zb3J0ZWRcbiAqIGNsaWVudC1zaWRlLCBzbyBhIGBob29rX3JlY2VpdmVkYCBzcGxpY2VkIGluIGJ5IHRoZSBsYXp5LXJlc3VtZSBjb25zdW1lciBtdXN0XG4gKiBsYW5kIGluIGBldmVudElkYCBvcmRlciDigJQgYSBwbGFpbiBgcHVzaGAgd291bGQgcGxhY2UgYSBsYXRlLWNvbW1pdHRpbmdcbiAqIGVhcmxpZXIgZXZlbnQgYWZ0ZXIgZXZlbnRzIHRoYXQgc29ydCBiZWZvcmUgaXQsIGNvcnJ1cHRpbmcgcmVwbGF5LiBFdmVudCBJRHNcbiAqIGFyZSBVTElEcywgc28gbGV4aWNvZ3JhcGhpYyBzdHJpbmcgb3JkZXIgbWF0Y2hlcyBjb21taXQgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRFdmVudEJ5RXZlbnRJZCh0YXJnZXQ6IEV2ZW50W10sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAvLyBMaW5lYXIgc2NhbiBmcm9tIHRoZSBlbmQ6IHRoZSBzcGxpY2VkIGV2ZW50IGlzIGFsbW9zdCBhbHdheXMgdGhlIG5ld2VzdFxuICAvLyAoaXQgc29ydHMgYXQgb3IgbmVhciB0aGUgdGFpbCksIHNvIHRoaXMgZmluZHMgdGhlIHNsb3QgaW4gTygxKeKAk08oaykgZm9yIHRoZVxuICAvLyBjb21tb24gY2FzZSB3aGlsZSBzdGlsbCBoYW5kbGluZyBhbiBvdXQtb2Ytb3JkZXIgbGF0ZSBhcnJpdmFsIGNvcnJlY3RseS5cbiAgbGV0IGkgPSB0YXJnZXQubGVuZ3RoO1xuICB3aGlsZSAoaSA+IDApIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRhcmdldFtpIC0gMV07XG4gICAgaWYgKGV4aXN0aW5nLmV2ZW50SWQgPT09IGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIC8vIEFscmVhZHkgcHJlc2VudCDigJQga2VlcCB0aGUgc3BsaWNlIGlkZW1wb3RlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleGlzdGluZy5ldmVudElkIDwgZXZlbnQuZXZlbnRJZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGktLTtcbiAgfVxuICB0YXJnZXQuc3BsaWNlKGksIDAsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhhc01vcmU6IGJvb2xlYW4sXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgcmVxdWVzdGVkQ3Vyc29yczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoIWhhc01vcmUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IoXG4gICAgICBydW5JZCxcbiAgICAgICdyZXR1cm5lZCBtb3JlIHBhZ2VzIHdpdGhvdXQgYSBjdXJzb3InXG4gICAgKTtcbiAgfVxuICBpZiAocmVxdWVzdGVkQ3Vyc29ycy5oYXMoY3Vyc29yKSkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IocnVuSWQsICdyZXBlYXRlZCBhIGN1cnNvcicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJldHJ5V2l0aG91dEV2ZW50Q3Vyc29yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICBhbHJlYWR5UmV0cmllZDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY3Vyc29yICE9PSBudWxsICYmXG4gICAgIWFscmVhZHlSZXRyaWVkICYmXG4gICAgV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycm9yKSAmJlxuICAgIGVycm9yLnN0YXR1cyA9PT0gNDAwXG4gICk7XG59XG5cbi8qKlxuICogTG9hZHMgd29ya2Zsb3cgcnVuIGV2ZW50cyBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgcGFnZXMgb2YgcGFnaW5hdGVkXG4gKiByZXN1bHRzLiBFdmVudHMgYXJlIHJldHVybmVkIGluIGNocm9ub2xvZ2ljYWwgKGFzY2VuZGluZykgb3JkZXIgZm9yXG4gKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IHJlcGxheS5cbiAqXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElELlxuICogQHBhcmFtIGFmdGVyQ3Vyc29yIC0gSWYgcHJvdmlkZWQsIG9ubHkgZXZlbnRzIGFmdGVyIHRoaXMgY3Vyc29yIGFyZVxuICogICByZXR1cm5lZCAoaW5jcmVtZW50YWwgbG9hZCkuIElmIG9taXR0ZWQsIGFsbCBldmVudHMgYXJlIHJldHVybmVkLlxuICogICBUaGUgcmV0dXJuZWQgY3Vyc29yIGNhbiBiZSBwYXNzZWQgYmFjayBpbiBvbiBhIHN1YnNlcXVlbnQgY2FsbCBmb3JcbiAqICAgaW5jcmVtZW50YWwgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgYWZ0ZXJDdXJzb3I/OiBzdHJpbmdcbik6IFByb21pc2U8TG9hZGVkRXZlbnRMb2c+IHtcbiAgY29uc3QgaW5jcmVtZW50YWwgPSBhZnRlckN1cnNvciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJhY2UoXG4gICAgaW5jcmVtZW50YWwgPyAnd29ya2Zsb3cubG9hZE5ld0V2ZW50cycgOiAnd29ya2Zsb3cubG9hZEV2ZW50cycsXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGVkRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgICBjb25zdCBsb2FkZWRFdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IGFmdGVyQ3Vyc29yID8/IG51bGw7XG4gICAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgICBsZXQgcGFnZXNMb2FkZWQgPSAwO1xuICAgICAgbGV0IHJldHJpZWRXaXRob3V0Q3Vyc29yID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICBjb25zdCBsb2FkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgICAgLy8gVE9ETzogd2UncmUgY3VycmVudGx5IGxvYWRpbmcgYWxsIHRoZSBkYXRhIHdpdGggcmVzb2x2ZVJlZiBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXNcbiAgICAgICAgLy8gdG8gbGF6eWxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgd29ybGQgaW5zdGVhZCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBhbmQgbWFrZSB0aGUgZXZlbnQgbG9nIGxvYWRpbmdcbiAgICAgICAgLy8gbXVjaCBmYXN0ZXIgYW5kIG1lbW9yeSBlZmZpY2llbnRcbiAgICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29yID0gY3Vyc29yO1xuICAgICAgICByZWNvcmRSZXF1ZXN0ZWRFdmVudEN1cnNvcihydW5JZCwgcmVxdWVzdGVkQ3Vyc29yLCByZXF1ZXN0ZWRDdXJzb3JzKTtcblxuICAgICAgICBsZXQgcmVzcG9uc2U6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygd29ybGQuZXZlbnRzLmxpc3Q+PjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgICBjdXJzb3I6IHJlcXVlc3RlZEN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNob3VsZFJldHJ5V2l0aG91dEV2ZW50Q3Vyc29yKFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgcmVxdWVzdGVkQ3Vyc29yLFxuICAgICAgICAgICAgICByZXRyaWVkV2l0aG91dEN1cnNvclxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAnRXZlbnQgY3Vyc29yIHdhcyByZWplY3RlZDsgcmV0cnlpbmcgd2l0aCBhIGZ1bGwgZXZlbnQgcmVsb2FkLicsXG4gICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvYWRlZEV2ZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgbG9hZGVkRXZlbnRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIHJlcXVlc3RlZEN1cnNvcnMuY2xlYXIoKTtcbiAgICAgICAgICAgIGN1cnNvciA9IG51bGw7XG4gICAgICAgICAgICByZXRyaWVkV2l0aG91dEN1cnNvciA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRVbmlxdWVFdmVudHMobG9hZGVkRXZlbnRzLCByZXNwb25zZS5kYXRhLCBsb2FkZWRFdmVudElkcyk7XG4gICAgICAgIGhhc01vcmUgPSByZXNwb25zZS5oYXNNb3JlO1xuICAgICAgICBhc3NlcnRFdmVudFBhZ2luYXRpb25Qcm9ncmVzcyhcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIHJlc3BvbnNlLmN1cnNvcixcbiAgICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzXG4gICAgICAgICk7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBsYXN0IG5vbi1udWxsIGN1cnNvciBhY3Jvc3MgcGFnZXMuIEEgV29ybGQgbWF5XG4gICAgICAgIC8vIGxlZ2l0aW1hdGVseSByZXR1cm4gYHsgZGF0YTogW10sIGN1cnNvcjogbnVsbCwgaGFzTW9yZTogZmFsc2UgfWBcbiAgICAgICAgLy8gb24gYSB0cmFpbGluZyBlbXB0eSBwYWdlIOKAlCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBwcmV2aW91cyBwYWdlJ3NcbiAgICAgICAgLy8gdW5kZXJseWluZyBEQiBxdWVyeSBoaXQgdGhlIGxpbWl0IGV4YWN0bHkgYW5kIHJldHVybmVkIGFcbiAgICAgICAgLy8gYExhc3RFdmFsdWF0ZWRLZXlgIFwianVzdCBpbiBjYXNlXCIuIE92ZXJ3cml0aW5nIHdpdGggdGhhdCBudWxsXG4gICAgICAgIC8vIHdvdWxkIGxvc2UgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3QgcmVhbCBldmVudCB3ZSBsb2FkZWQgYW5kXG4gICAgICAgIC8vIGZvcmNlIHRoZSBydW50aW1lIGludG8gdGhlIFwibm8gY3Vyc29yIGFmdGVyIGluaXRpYWwgbG9hZFwiIGZ1bGwtXG4gICAgICAgIC8vIHJlbG9hZCBmYWxsYmFjayBvbiBldmVyeSBzdWJzZXF1ZW50IHJlcGxheSBpdGVyYXRpb24uXG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvciA/PyBjdXJzb3I7XG4gICAgICAgIHBhZ2VzTG9hZGVkKys7XG5cbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnTG9hZGVkIGV2ZW50IHBhZ2UnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgaW5jcmVtZW50YWwsXG4gICAgICAgICAgcGFnZTogcGFnZXNMb2FkZWQsXG4gICAgICAgICAgcGFnZUV2ZW50czogcmVzcG9uc2UuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgdG90YWxFdmVudHM6IGxvYWRlZEV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgICBwYWdlTXM6IERhdGUubm93KCkgLSBwYWdlU3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdFdmVudCBsb2FkIGNvbXBsZXRlJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgaW5jcmVtZW50YWwsXG4gICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICBwYWdlc0xvYWRlZCxcbiAgICAgICAgdG90YWxNczogRGF0ZS5ub3coKSAtIGxvYWRTdGFydCxcbiAgICAgIH0pO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQobG9hZGVkRXZlbnRzLmxlbmd0aCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkKHBhZ2VzTG9hZGVkKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBldmVudHM6IGxvYWRlZEV2ZW50cywgY3Vyc29yIH07XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFRoZSBydW50aW1lJ3MgbG9hZGVkIGV2ZW50LWxvZyBzbmFwc2hvdDogdGhlIGV2ZW50cyByZXBsYXllZCBzbyBmYXIgYW5kIHRoZVxuICogY3Vyc29yIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlbS4gSGFuZGVkIHRvIGhlbHBlcnMgdGhhdCBkZXJpdmUgdGhlIHByZWNvbmRpdGlvblxuICogc25hcHNob3QgZnJvbSBpdDsgdGhleSBkbyBub3QgbXV0YXRlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZEV2ZW50TG9nIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgb3B0aW1pc3RpYy1jb25jdXJyZW5jeSBndWFyZCBmb3IgZXZlbnQgY3JlYXRpb24gaXMgZW5hYmxlZC5cbiAqICoqT24gYnkgZGVmYXVsdCoqIHdoZXJlIHRoZSBydW50aW1lIGV4ZWN1dGVzOiByZXBsYXktY29udGV4dCBjcmVhdGVzIHNlbmQgYVxuICogYHN0YXRlVXBkYXRlZEF0YCBzbmFwc2hvdCAoYW5kIGNhbiBiZSByZWplY3RlZCB3aXRoIDQxMiBieSBhIHN1cHBvcnRpbmdcbiAqIGJhY2tlbmQpIHVubGVzcyBgV09SS0ZMT1dfUFJFQ09ORElUSU9OX0dVQVJEYCBpcyBzZXQgdG8gYDBgLiBCYWNrZW5kcyB3aXRob3V0XG4gKiBndWFyZCBzdXBwb3J0IGlnbm9yZSB0aGUgc25hcHNob3QsIHNvIGVuYWJsaW5nIGJ5IGRlZmF1bHQgaXNcbiAqIGJhY2t3YXJkLWNvbXBhdGlibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX1BSRUNPTkRJVElPTl9HVUFSRCAhPT0gJzAnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSByZXBsYXkgcmVmdXNlcyB0byBydW4gb3ZlciBhIGxvZyB3aXRoIGEgaG9sZSBpbiBpdCAoc2VlXG4gKiB7QGxpbmsgZmluZEV2ZW50U2xvdEdhcH0pLiAqKk9uIGJ5IGRlZmF1bHQqKjsgc2V0XG4gKiBgV09SS0ZMT1dfU0xPVF9HQVBfQ0hFQ0s9MGAgdG8gcmVwbGF5IGFjcm9zcyBob2xlcyBpbnN0ZWFkLlxuICpcbiAqIFRoZSBzd2l0Y2ggZXhpc3RzIGJlY2F1c2UgdGhlIGNoZWNrIHRyYWRlcyBvbmUgZmFpbHVyZSBmb3IgYW5vdGhlci4gQSBob2xlIGlzXG4gKiBhIHBvc2l0aW9uIGNsYWltZWQgYnkgYSB3cml0ZSB0aGF0IHRoZW4gZmFpbGVkLCBzbyBtb3N0IG9mIHRoZW0gc3RhbmQgZm9yIGFuXG4gKiBldmVudCB0aGF0IG5ldmVyIGhhcHBlbmVkIGFuZCByZXBsYXlpbmcgcGFzdCBvbmUgaXMgY29ycmVjdC4gQnV0IGEgaG9sZVxuICogc3RhbmRpbmcgZm9yIGFuIGV2ZW50IHRoYXQgKmRpZCogaGFwcGVuIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhhdCwgYW5kXG4gKiByZXBsYXlpbmcgcGFzdCB0aGF0IG9uZSBwcm9kdWNlcyBhIHJ1biB3aG9zZSByZXN1bHQgaXMgd3Jvbmcgd2l0aCBub3RoaW5nIHRvXG4gKiBzaG93IGZvciBpdC4gRmFpbGluZyBsb3VkbHkgaXMgdGhlIHJlY292ZXJhYmxlIHNpZGUgb2YgdGhlIHRyYWRlLCBhbmQgdGhpcyBpc1xuICogdGhlIHdheSBiYWNrIG91dCBpZiBhIGZsZWV0IHR1cm5zIG91dCB0byBjYXJyeSBiZW5pZ24gaG9sZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Nsb3RHYXBDaGVja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19TTE9UX0dBUF9DSEVDSyAhPT0gJzAnO1xufVxuXG4vKipcbiAqIFRoZSBgc3RhdGVVcGRhdGVkQXRgIHZhbHVlIHRvIHNlbmQgd2l0aCBhIHJlcGxheS1jb250ZXh0IGV2ZW50IGNyZWF0aW9uOiB0aGVcbiAqICptYXhpbXVtKiBVTElEIHRpbWUgKGVwb2NoIG1zKSBvdmVyIHRoZSBldmVudHMgdGhlIHJ1bnRpbWUgaGFzIGxvYWRlZC4gUmV0dXJuc1xuICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm8gZXZlbnRzIG9yIHRoYXQgaWQgaXMgbm90IGEgZGVjb2RhYmxlIFVMSUQuXG4gKlxuICogSXQgaXMgdGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIHRhaWwncyBiZWNhdXNlIHRoZSBsb2FkZWQgbG9nIGlzIGluIHRoZVxuICogV29ybGQncyBjYW5vbmljYWwgb3JkZXIsIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSBldmVudC1pZCBvcmRlciAoc2VlXG4gKiB7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSkuIFRoZSBtYXhpbXVtIGlzIHdoYXQgbGV0cyB0aGUgY291bnQgc2VudCBhbG9uZ3NpZGVcbiAqIGl0IGJlIHJlYWQgYXMgXCJldmVudHMgYXQgb3IgYmVsb3cgdGhpcyB3YXRlcm1hcmtcIjogZXZlcnkgbG9hZGVkIGV2ZW50IGlzIGF0IG9yXG4gKiBiZWxvdyBpdCwgc28gdGhlIGNvdW50IGlzIGV4YWN0bHkgYGV2ZW50cy5sZW5ndGhgLiBSZWFkaW5nIHRoZSB0YWlsIGluc3RlYWRcbiAqIHdvdWxkIHVuZGVyc3RhdGUgdGhlIHdhdGVybWFyayBvbiBhIFdvcmxkIHdob3NlIG9yZGVyIGlzIG5vdCBpZC1vcmRlcmVkLCB3aGljaFxuICogaXMgc2FmZSAoaXQgY2FuIG9ubHkgd2Vha2VuIGRldGVjdGlvbikgYnV0IG5lZWRsZXNzbHkgaW1wcmVjaXNlLlxuICpcbiAqIFRoZSBtYXhpbXVtIGlzIGZvdW5kIGJ5IGxleGljb2dyYXBoaWMgaWQgY29tcGFyaXNvbiwgZGVjb2Rpbmcgb25seSBvbmNlOiB0aGVcbiAqIDI2LWNoYXJhY3RlciBDcm9ja2ZvcmQgVUxJRCBlbmNvZGVzIGl0cyB0aW1lc3RhbXAgaW4gdGhlIGxlYWRpbmcgMTBcbiAqIGNoYXJhY3RlcnMsIHNvIHRoZSBncmVhdGVzdCBpZCBhbHNvIGNhcnJpZXMgdGhlIGdyZWF0ZXN0IHRpbWUuXG4gKlxuICogR3JhbnVsYXJpdHk6IHNuYXBzaG90cyBhcmUgZXBvY2gtbWlsbGlzZWNvbmRzLCBhbmQgdGhlIGJhY2tlbmQgYWxsb3dzIGFuXG4gKiBlcXVhbC10aW1lc3RhbXAgc25hcHNob3QgKGFuIHVwLXRvLWRhdGUgY2xpZW50IG11c3Qgbm90IGJlIHJlamVjdGVkKS4gVHdvXG4gKiBvdXQtb2YtYmFuZCBldmVudHMgbGFuZGluZyBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCB3aGVyZSBvbmx5IHRoZSBmaXJzdCB3YXNcbiAqIGxvYWRlZCB0aGVyZWZvcmUgcGFzcyB0aGlzIGhhbGYgb2YgdGhlIGd1YXJkIHVuZGV0ZWN0ZWQg4oCUIHRoYXQgaXMgZXhhY3RseVxuICogdGhlIGhvbGUgYHN0YXRlRXZlbnRDb3VudGAgY2xvc2VzLCBzaW5jZSB0aGUgY291bnQgb2YgZXZlbnRzIGF0IG9yIGJlbG93IHRoZVxuICogd2F0ZXJtYXJrIGRpZmZlcnMgZXZlbiB3aGVuIHRoZSB3YXRlcm1hcmtzIGFyZSBlcXVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdGVzdEV2ZW50U3RhdGVVcGRhdGVkQXQoZXZlbnRzOiBFdmVudFtdKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGxhdGVzdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChsYXRlc3QgPT09IHVuZGVmaW5lZCB8fCBldmVudC5ldmVudElkID4gbGF0ZXN0KSB7XG4gICAgICBsYXRlc3QgPSBldmVudC5ldmVudElkO1xuICAgIH1cbiAgfVxuICBpZiAobGF0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vIEV2ZW50IElEcyBhcmUgcHJlZml4ZWQgVUxJRHMgKGUuZy4gYGV2bnRfMDFBUllaLi4uYCk7IHVsaWRUb0RhdGUgb25seVxuICAvLyBkZWNvZGVzIHRoZSBiYXJlIDI2LWNoYXIgVUxJRCwgc28gc3RyaXAgdGhlIHByZWZpeCBmaXJzdC5cbiAgY29uc3QgZXZlbnRJZCA9IGxhdGVzdDtcbiAgY29uc3QgdW5kZXJzY29yZSA9IGV2ZW50SWQubGFzdEluZGV4T2YoJ18nKTtcbiAgY29uc3QgcmF3VWxpZCA9IHVuZGVyc2NvcmUgPT09IC0xID8gZXZlbnRJZCA6IGV2ZW50SWQuc2xpY2UodW5kZXJzY29yZSArIDEpO1xuICBjb25zdCB0aW1lID0gdWxpZFRvRGF0ZShyYXdVbGlkKT8uZ2V0VGltZSgpO1xuICBpZiAodGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gRmFpbCBvcGVuOiBhIG5vbi1kZWNvZGFibGUgaWQgZGlzYXJtcyB0aGUgZ3VhcmQgZm9yIHRoaXMgY3JlYXRlIChub1xuICAgIC8vIHNuYXBzaG90IHNlbnQpLiBMb2cgc28gYSBmbGVldC13aWRlIHNpbGVudCBkaXNhcm0gaXMgZGlhZ25vc2FibGUuXG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICdQcmVjb25kaXRpb24gZ3VhcmQ6IGxhdGVzdCBldmVudCBpZCBpcyBub3QgYSBkZWNvZGFibGUgVUxJRDsgc2VuZGluZyBubyBzbmFwc2hvdCcsXG4gICAgICB7IGV2ZW50SWQgfVxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdGltZTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0aGUgZXZlbnRzIGEgYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRlZCBiYWNrIGludG8gdGhlIGxvZyBpdCB3YXNcbiAqIGRlcml2ZWQgZnJvbSwgYW5kIGFuc3dlciBob3cgbWFueSBvZiB0aGVtIHdlcmUgbmV3LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSwgdGhpcyByZS1zb3J0cy4gVGhlIHJlcG9ydGVkIGV2ZW50cyBvY2N1cHlcbiAqIHNsb3RzICpiZWxvdyogdGhlIHdyaXRlIHRoYXQgcmVwb3J0ZWQgdGhlbSwgc28gYXBwZW5kaW5nIHRoZW0gd291bGQgcHV0IHRoZW1cbiAqIGFmdGVyIGV2ZW50cyB0aGV5IHByZWNlZGUg4oCUIGFuZCBvbiBhIHNsb3QtbnVtYmVyZWQgcnVuIHRoZSBpZCBvcmRlciBpcyB0aGVcbiAqIFdvcmxkJ3MgY2Fub25pY2FsIG9yZGVyLCBzbyByZXN0b3JpbmcgaXQgaXMgd2VsbCBkZWZpbmVkIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gKiBBIHJ1biB0aGF0IGlzIG5vdCBzbG90LW51bWJlcmVkIGNhbm5vdCBwcm9kdWNlIHRoaXMgcmVwb3J0IGluIHRoZSBmaXJzdFxuICogcGxhY2U7IHRoZSBzb3J0IGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gYXBwbGllZCB0byBpZHMgaXQgY2Fubm90IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZXBvcnRlZEV2ZW50cyhcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IG51bWJlciB7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC5sZW5ndGg7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyh0YXJnZXQsIGV2ZW50cyk7XG4gIGNvbnN0IGFkZGVkID0gdGFyZ2V0Lmxlbmd0aCAtIGJlZm9yZTtcbiAgaWYgKGFkZGVkID4gMCAmJiBtYXhFdmVudFNsb3QodGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGFyZ2V0LnNvcnQoKGEsIGIpID0+XG4gICAgICBhLmV2ZW50SWQgPCBiLmV2ZW50SWQgPyAtMSA6IGEuZXZlbnRJZCA+IGIuZXZlbnRJZCA/IDEgOiAwXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYWRkZWQ7XG59XG5cbi8qKlxuICogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgbG9hZGVkIGxvZyBvY2N1cGllcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVuIGlzIG5vdFxuICogc2xvdC1udW1iZXJlZC4gQSBydW4ga2VlcHMgdGhlIGlkIHNjaGVtZSBpdCB3YXMgY3JlYXRlZCB1bmRlciwgc28gb25lIGV2ZW50XG4gKiBzZXR0bGVzIGl0IGZvciB0aGUgd2hvbGUgbG9nLlxuICpcbiAqIFRoZSBtYXhpbXVtLCBub3QgdGhlIGNvdW50LCBhbmQgdGhlIHR3byBhcmUgbm90IGludGVyY2hhbmdlYWJsZSBldmVuIHRob3VnaFxuICogYSBoZWFsdGh5IGxvZyBtYWtlcyB0aGVtIGVxdWFsLiBBIFdvcmxkIGhhbmRzIGEgcG9zaXRpb24gdG8gdGhlIGluc2VydCB0aGF0XG4gKiBvY2N1cGllcyBpdCwgc28gYSB3cml0ZSB0aGF0IG5ldmVyIGxhbmRzIGxlYXZlcyBubyBob2xlIGJlaGluZCBhbmQgdGhlIGxvZ1xuICogc3RheXMgZGVuc2UuIFdoYXQgdGhlIGNvdW50IGNhbm5vdCBzdXJ2aXZlIGlzIGEgKnBhcnRpYWwqIHJlYWQ6IGEgbG9nXG4gKiBhc3NlbWJsZWQgZnJvbSBhIHRydW5jYXRlZCByZXBvcnQsIG9yIHJlYWQgd2hpbGUgYSBjb25jdXJyZW50IHdyaXRlIGlzXG4gKiBjb21taXR0aW5nLCBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbi4gQ291bnRpbmcgdGhvc2VcbiAqIHdvdWxkIG1ha2UgdGhlIG5leHQgd3JpdGUgY2xhaW0gdG8gaGF2ZSBzZWVuIGxlc3MgdGhhbiBpdCBoYXMsIHNvIHRoZSBXb3JsZFxuICogd291bGQgcmVwb3J0IHRoZSBzYW1lIGV2ZW50cyBiYWNrIHRvIGl0IG9uIGV2ZXJ5IGF0dGVtcHQuXG4gKlxuICogQSBob2xlIGJlbG93IHRoZSBtYXhpbXVtIGlzIHRoZXJlZm9yZSBhIHByb3BlcnR5IG9mIHRoZSByZWFkLCBub3Qgb2YgdGhlIGxvZyxcbiAqIHdoaWNoIGlzIHdoYXQgbGV0cyB7QGxpbmsgc2V0dGxlRXZlbnRTbG90R2FwfSByZS1yZWFkIGluc3RlYWQgb2YgZ2l2aW5nIHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4RXZlbnRTbG90KGV2ZW50czogRXZlbnRbXSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gZXZlbnRJZFRvU2xvdChldmVudC5ldmVudElkKTtcbiAgICBpZiAoc2xvdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKG1heCA9PT0gdW5kZWZpbmVkIHx8IHNsb3QgPiBtYXgpIHtcbiAgICAgIG1heCA9IHNsb3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG5cbi8qKiBBIHBvc2l0aW9uIHRoZSBsb2cgc2tpcHMgb3ZlciwgZGVzY3JpYmVkIHdlbGwgZW5vdWdoIHRvIG5hbWUgaW4gYW4gZXJyb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U2xvdEdhcCB7XG4gIC8qKiBUaGUgbG93ZXN0IHNsb3QgYmVsb3cgdGhlIGxvZydzIG1heGltdW0gdGhhdCBubyBldmVudCBvY2N1cGllcy4gKi9cbiAgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgc2xvdHMgYmVsb3cgdGhlIG1heGltdW0gbm8gZXZlbnQgb2NjdXBpZXMuICovXG4gIG1pc3NpbmdDb3VudDogbnVtYmVyO1xuICAvKiogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgbG9nIG9jY3VwaWVzLiAqL1xuICBtYXhTbG90OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGhvbGUgaW4gYSBsb2FkZWQgbG9nLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gZmluZC5cbiAqXG4gKiBPbiBhIHNsb3QtbnVtYmVyZWQgcnVuIHRoZSBXb3JsZCBhbGxvY2F0ZXMgZXZlcnkgcG9zaXRpb24sIHNvIGEgbG9nIHRoYXRcbiAqIGhvbGRzIGBuYCBldmVudHMgYmVsb3cgc2xvdCBgbmAgaXMgbWlzc2luZyBvbmUuIFRoYXQgbWF0dGVycyBiZWZvcmUgYSByZXBsYXlcbiAqIGFuZCBub3doZXJlIGVsc2U6IHRoZSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXQgaGFzXG4gKiBoYXBwZW5lZCwgYW5kIGFuIGFic2VudCBwb3NpdGlvbiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGV2ZW50IHRoYXRcbiAqIG5ldmVyIG9jY3VycmVkLiBUaGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyIHdheSxcbiAqIGFuZCB0aGUgcnVuIGRpdmVyZ2VzIHF1aWV0bHkgcmF0aGVyIHRoYW4gZmFpbGluZy5cbiAqXG4gKiBPcmRlci1pbmRlcGVuZGVudCwgdW5saWtlIHRoZSBlcXVpdmFsZW50IGF1ZGl0IHRoZSBXb3JsZCBydW5zIG92ZXIgYSBwYWdlIGl0XG4gKiBqdXN0IHJlYWQuIEEgbG9hZGVkIGxvZyBpcyBhc3NlbWJsZWQgZnJvbSBsaXN0ZWQgcGFnZXMgcGx1cyB3aGF0ZXZlciBhXG4gKiBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2ssIGFuZCB3aGlsZSB7QGxpbmsgbWVyZ2VSZXBvcnRlZEV2ZW50c31cbiAqIHJlc3RvcmVzIGlkIG9yZGVyLCBhIGNoZWNrIHRoYXQgY2FuIGZhaWwgYSBoZWFsdGh5IHJ1biBzaG91bGQgbm90IGRlcGVuZCBvblxuICogdGhhdCBoYXZpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIGZpcnN0IHNsb3QgaXMgbmV2ZXIgY291bnRlZC4gSXQgYmVsb25ncyB0byBgcnVuX2NyZWF0ZWRgLCB3aGljaCBgc3RhcnQoKWBcbiAqIHBvc3RzIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBxdWV1ZSBzZW5kLCBzbyBhIGxvZyByZWFkIGluIHRoYXQgd2luZG93XG4gKiBsZWdpdGltYXRlbHkgYmVnaW5zIGF0IHRoZSBzZWNvbmQgc2xvdCBhbmQgZmlsbHMgaW4gb24gaXRzIG93bi4gRXZlcnkgcmVwbGF5XG4gKiB0aGF0IHJhY2VzIGEgcnVuJ3Mgb3duIHN0YXJ0IHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBob2xlLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGEgbG9nIHRoaXMgY2Fubm90IHJlYWQgYXMgc2xvdHMgYXQgYWxsOiBhbiBlbXB0eSBvbmUsXG4gKiBvciBhIHJ1biBudW1iZXJlZCBieSBVTElELCB3aGVyZSBwb3NpdGlvbnMgY2Fycnkgbm8gZGVuc2l0eSB0byBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFdmVudFNsb3RHYXAoXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXVxuKTogRXZlbnRTbG90R2FwIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb2NjdXBpZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGV0IG1heFNsb3QgPSAwO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGNvbnN0IHNsb3QgPSBldmVudElkVG9TbG90KGV2ZW50LmV2ZW50SWQpO1xuICAgIGlmIChzbG90ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvY2N1cGllZC5hZGQoc2xvdCk7XG4gICAgaWYgKHNsb3QgPiBtYXhTbG90KSB7XG4gICAgICBtYXhTbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgaWYgKG1heFNsb3QgPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGZsb29yID0gb2NjdXBpZWQuaGFzKEZJUlNUX0VWRU5UX1NMT1QpXG4gICAgPyBGSVJTVF9FVkVOVF9TTE9UXG4gICAgOiBGSVJTVF9FVkVOVF9TTE9UICsgMTtcbiAgLy8gRXZlcnkgc2xvdCBpcyBhdCBvciBhYm92ZSBgZmxvb3JgIGJ5IGNvbnN0cnVjdGlvbiwgc28gdGhlIGxvZyBpcyBkZW5zZVxuICAvLyBleGFjdGx5IHdoZW4gaXQgaG9sZHMgb25lIGV2ZW50IHBlciBwb3NpdGlvbiBpbiBgW2Zsb29yLCBtYXhTbG90XWAuIFRoZVxuICAvLyBzY2FuIGJlbG93IG9ubHkgcnVucyBvbmNlIHRoYXQgaGFzIGFscmVhZHkgYW5zd2VyZWQgbm8uXG4gIGlmIChvY2N1cGllZC5zaXplID09PSBtYXhTbG90IC0gZmxvb3IgKyAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbWlzc2luZ0NvdW50ID0gMDtcbiAgZm9yIChsZXQgc2xvdCA9IGZsb29yOyBzbG90IDw9IG1heFNsb3Q7IHNsb3QrKykge1xuICAgIGlmICghb2NjdXBpZWQuaGFzKHNsb3QpKSB7XG4gICAgICBmaXJzdE1pc3NpbmdTbG90ID8/PSBzbG90O1xuICAgICAgbWlzc2luZ0NvdW50Kys7XG4gICAgfVxuICB9XG4gIGlmIChmaXJzdE1pc3NpbmdTbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IGZpcnN0TWlzc2luZ1Nsb3QsIG1pc3NpbmdDb3VudCwgbWF4U2xvdCB9O1xufVxuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGEgZGV0ZWN0ZWQgaG9sZSBpcyByZS1yZWFkIGJlZm9yZSB0aGUgbG9nIGlzIHRha2VuIGF0IGl0c1xuICogd29yZCwgYW5kIHRoZSBiYWNrb2ZmIGJlZm9yZSBlYWNoIHJlLXJlYWQgKGRvdWJsaW5nIHBlciBhdHRlbXB0KS5cbiAqXG4gKiBBIGhvbGUgY2FuIGJlIHRyYW5zaWVudC4gVGhlIFdvcmxkIGFsbG9jYXRlcyBhIHNsb3QgaW5zaWRlIHRoZSBpbnNlcnQgdGhhdFxuICogb2NjdXBpZXMgaXQsIHNvIHR3byBjb25jdXJyZW50IHdyaXRlcnMgY2FuIGNvbGxpZGUsIG9uZSByZXRyeSBwYXN0IHRoZSBvdGhlcixcbiAqIGFuZCB0aGUgaGlnaGVyIHNsb3QgY29tbWl0IGZpcnN0IOKAlCBsZWF2aW5nIGEgd2luZG93IGluIHdoaWNoIHRoZSBsb3dlciBvbmUgaXNcbiAqIGdlbnVpbmVseSBhYnNlbnQgZnJvbSBhIHN0cm9uZ2x5LWNvbnNpc3RlbnQgcmVhZCBhbmQgZmlsbHMgaW4gYSBtb21lbnQgbGF0ZXIuXG4gKiBUaGUgd2luZG93IGlzIG9uZSBjb21taXQgd2lkZSwgc28gYSBzaG9ydCBiYWNrb2ZmIGNsZWFycyBpdDsgYW55dGhpbmcgdGhhdFxuICogc3Vydml2ZXMgYWxsIHRocmVlIHJlLXJlYWRzIGlzIGEgcG9zaXRpb24gbm8gd3JpdGUgd2lsbCBldmVyIG9jY3VweS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFMgPSAzO1xuY29uc3QgU0xPVF9HQVBfUkVDSEVDS19CQVNFX0RFTEFZX01TID0gMjU7XG5cbi8qKlxuICogUmUtcmVhZCBhIGxvZyB0aGF0IGxvb2tzIGhvbGV5IHVudGlsIHRoZSBob2xlIGZpbGxzIGluIG9yIHRoZSByZS1yZWFkcyBydW5cbiAqIG91dCwgYW5kIHJldHVybiB0aGUgc2V0dGxlZCBsb2cgYWxvbmdzaWRlIHRoZSBob2xlIHRoYXQgc3Vydml2ZWQuXG4gKlxuICogUmVhZHMgYXJlIHN0cm9uZ2x5IGNvbnNpc3RlbnQsIHNvIGEgaG9sZSBpcyBub3QgYW4gYXJ0aWZhY3Qgb2YgKndoZW4qIHRoZSBsb2dcbiAqIHdhcyByZWFkIOKAlCBidXQgaXQgY2FuIGJlIGFuIGFydGlmYWN0IG9mIGEgd3JpdGUgdGhhdCBoYWQgbm90IGNvbW1pdHRlZCB5ZXRcbiAqIChzZWUge0BsaW5rIFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFN9KS4gRGlzdGluZ3Vpc2hpbmcgdGhlIHR3byBjb3N0cyBhXG4gKiByZS1yZWFkLCB3aGljaCBpcyBvbmx5IGV2ZXIgcGFpZCBieSBhIHJlcGxheSB0aGF0IGFscmVhZHkgZm91bmQgYSBob2xlLlxuICpcbiAqIFRoZSByZWxvYWQgaXMgZnVsbCByYXRoZXIgdGhhbiBpbmNyZW1lbnRhbDogdGhlIG1pc3NpbmcgcG9zaXRpb24gaXMgYmVsb3cgdGhlXG4gKiBsb2cncyBtYXhpbXVtLCBzbyBhIGN1cnNvci1hbmNob3JlZCByZWFkIHN0YXJ0cyBwYXN0IGl0IGFuZCBjYW4gbmV2ZXIgc2VlIGl0XG4gKiBhcnJpdmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR0bGVFdmVudFNsb3RHYXAoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGxvYWRlZDogTG9hZGVkRXZlbnRMb2dcbik6IFByb21pc2U8eyBsb2c6IExvYWRlZEV2ZW50TG9nOyBnYXA6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB9PiB7XG4gIGxldCBsb2cgPSBsb2FkZWQ7XG4gIGxldCBnYXAgPSBmaW5kRXZlbnRTbG90R2FwKGxvZy5ldmVudHMpO1xuICBmb3IgKFxuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICBnYXAgIT09IHVuZGVmaW5lZCAmJiBhdHRlbXB0IDwgU0xPVF9HQVBfUkVDSEVDS19BVFRFTVBUUztcbiAgICBhdHRlbXB0KytcbiAgKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFNMT1RfR0FQX1JFQ0hFQ0tfQkFTRV9ERUxBWV9NUyAqIDIgKiogYXR0ZW1wdClcbiAgICApO1xuICAgIGxvZyA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgZ2FwID0gZmluZEV2ZW50U2xvdEdhcChsb2cuZXZlbnRzKTtcbiAgfVxuICByZXR1cm4geyBsb2csIGdhcCB9O1xufVxuXG4vKipcbiAqIFRoZSBwcmVjb25kaXRpb24gc25hcHNob3QgYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbiBzZW5kcywgZGVzY3JpYmluZ1xuICogdGhlIGV2ZW50IGxvZyB0aGUgcmVwbGF5IGRlcml2ZWQgdGhlIGV2ZW50IGZyb20uXG4gKlxuICogT24gYSBzbG90LW51bWJlcmVkIHJ1biB0aGlzIGlzIGBldmVudENvdW50YCwgb3B0aW9uYWxseSB3aXRoIHRoZSBzZXQgb2ZcbiAqIGNvcnJlbGF0aW9uIGlkcyB0aGUgd3JpdGVyIGlzIGJsb2NrZWQgb24uIE9uIGEgVUxJRC1udW1iZXJlZCBydW4gaXQgaXMgdGhlXG4gKiBgc3RhdGVVcGRhdGVkQXRgIC8gYHN0YXRlRXZlbnRDb3VudGAgLyBgc3RhdGVDdXJzb3JgIHRyaXBsZSwgd2hvc2UgdGhyZWVcbiAqIGZpZWxkcyBhcmUgb25lIGluZGl2aXNpYmxlIHVuaXQ6IHRoZSBiYWNrZW5kIHJlYWRzIHRoZSBjb3VudCBvbmx5IHJlbGF0aXZlIHRvXG4gKiB0aGUgd2F0ZXJtYXJrLCBhbmQgcmV0dXJucyBpdHMgaW5saW5lIGRlbHRhIG9ubHkgcmVsYXRpdmUgdG8gdGhlIGN1cnNvci5cbiAqIFBhc3NpbmcgdGhlbSBhcyBhIHNpbmdsZSBvYmplY3QgaXMgd2hhdCBrZWVwcyB0aGVtIGZyb20gZHJpZnRpbmcgYXBhcnQgYXQgYVxuICogY2FsbCBzaXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zIHtcbiAgc3RhdGVVcGRhdGVkQXQ/OiBudW1iZXI7XG4gIHN0YXRlRXZlbnRDb3VudD86IG51bWJlcjtcbiAgc3RhdGVDdXJzb3I/OiBzdHJpbmc7XG4gIGV2ZW50Q291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHByZWNvbmRpdGlvbiBzbmFwc2hvdCB0byBhdHRhY2ggdG8gYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbi5cbiAqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IG9iamVjdCDigJQgbm8gZ3VhcmQsIGJhY2tlbmQgYmVoYXZlcyBhcyBiZWZvcmUg4oCUIHdoZW4gdGhlXG4gKiBndWFyZCBpcyBkaXNhYmxlZCBvciB0aGUgd2F0ZXJtYXJrIGlzIG5vdCBkZXJpdmFibGUuIEFsbCB0aHJlZSBmaWVsZHMgZmFpbFxuICogb3BlbiB0b2dldGhlcjogYSBjb3VudCB3aXRob3V0IGEgd2F0ZXJtYXJrIGlzIG1lYW5pbmdsZXNzIHRvIHRoZSBiYWNrZW5kLCBhbmRcbiAqIGEgY3Vyc29yIHdpdGhvdXQgZWl0aGVyIHdvdWxkIGludml0ZSBhIGRlbHRhIG5vYm9keSBhc2tlZCBmb3IuXG4gKlxuICogYHN0YXRlRXZlbnRDb3VudGAgaXMgYGV2ZW50cy5sZW5ndGhgIGJlY2F1c2UgdGhlIHdhdGVybWFyayBpcyB0aGUgbG9nJ3NcbiAqICptYXhpbXVtKiBVTElEIHRpbWUsIHNvIGV2ZXJ5IGxvYWRlZCBldmVudCBpcyBhdCBvciBiZWxvdyBpdCByZWdhcmRsZXNzIG9mIHRoZVxuICogb3JkZXIgdGhlIFdvcmxkIHJldHVybmVkIHRoZW0gaW4uXG4gKlxuICogQm90aCBmaWVsZHMgYXJlIHRoZXJlZm9yZSBpbnZhcmlhbnQgdW5kZXIgcGVybXV0YXRpb24gb2YgdGhlIGxvZzogYSBtYXhpbXVtIGlzXG4gKiBvcmRlci1pbmRlcGVuZGVudCwgYW5kIHRoZSBsZW5ndGggaXMgc2V0IGNhcmRpbmFsaXR5IG9uY2UgYGFwcGVuZFVuaXF1ZUV2ZW50c2BcbiAqIGhhcyBkZWR1cGVkIGJ5IGV2ZW50IGlkLiBUd28gcmVwbGF5cyB0aGF0IGNvbnN1bWUgdGhlIHNhbWUgZXZlbnRzIGluIGRpZmZlcmVudFxuICogb3JkZXJzIHNlbmQgYW4gaWRlbnRpY2FsIHNuYXBzaG90LCBzbyB0aGlzIGd1YXJkIGRldGVjdHMgdGhhdCBhIGxvZyBpcyBtaXNzaW5nXG4gKiBhbiBldmVudCBhbmQgY2FuIG5ldmVyIGRldGVjdCB0aGF0IGEgcmVwbGF5IGNvbnN1bWVkIG9uZSBpbiBhIGRpZmZlcmVudCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zKFxuICBldmVudHM6IEV2ZW50W10sXG4gIGN1cnNvcj86IHN0cmluZyB8IG51bGxcbik6IFByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zIHtcbiAgaWYgKCFpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIC8vIEEgc2xvdC1udW1iZXJlZCBydW4gc2F5cyB3aXRoIG9uZSBpbnRlZ2VyIGV2ZXJ5dGhpbmcgdGhlIHRyaXBsZSB3YXNcbiAgLy8gYXBwcm94aW1hdGluZywgc28gdGhlIHR3byBhcmUgYWx0ZXJuYXRpdmVzIHJhdGhlciB0aGFuIGEgcGFpci4gU2VuZGluZyB0aGVcbiAgLy8gdHJpcGxlIGhlcmUgd291bGQgYWxzbyBiZSBmdXRpbGU6IGEgc2xvdCBpZCBjYXJyaWVzIG5vIHRpbWUsIHNvXG4gIC8vIGBsYXRlc3RFdmVudFN0YXRlVXBkYXRlZEF0YCB3b3VsZCBmYWlsIG9wZW4gb24gZXZlcnkgc2luZ2xlIHdyaXRlLlxuICBjb25zdCBldmVudENvdW50ID0gbWF4RXZlbnRTbG90KGV2ZW50cyk7XG4gIGlmIChldmVudENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBldmVudENvdW50IH07XG4gIH1cbiAgY29uc3Qgc3RhdGVVcGRhdGVkQXQgPSBsYXRlc3RFdmVudFN0YXRlVXBkYXRlZEF0KGV2ZW50cyk7XG4gIGlmIChzdGF0ZVVwZGF0ZWRBdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RhdGVVcGRhdGVkQXQsXG4gICAgc3RhdGVFdmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICAgIC4uLihjdXJzb3IgPyB7IHN0YXRlQ3Vyc29yOiBjdXJzb3IgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEgcmVqZWN0aW5nIFdvcmxkIGF0dGFjaGVkIHRvIGEgYFByZWNvbmRpdGlvbkZhaWxlZEVycm9yYCwgd2hlbiBpdFxuICogcmV0dXJuZWQgdGhlIG9uZXMgdGhlIGNsaWVudCdzIHNuYXBzaG90IHdhcyBtaXNzaW5nIGlubGluZS5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCBmb3IgYW55dGhpbmcgZWxzZSDigJQgbm8gZGV0YWlscywgYSBXb3JsZCB0aGF0IGRpZCBub3QgaW1wbGVtZW50XG4gKiB0aGlzLCBvciBhIHBheWxvYWQgdGhhdCBkb2VzIG5vdCBuYXJyb3cgY2xlYW5seS4gQ2FsbGVycyBmYWxsIGJhY2sgdG9cbiAqIHJlbG9hZGluZyB0aGUgZXZlbnQgbG9nLCB3aGljaCBpcyBhbHdheXMgY29ycmVjdDsgdGhpcyBpcyB1bnRydXN0ZWQtc2hhcGVkXG4gKiBkYXRhIG9uIGEgZmFpbHVyZSBwYXRoLCBzbyBub3RoaW5nIGhlcmUgaXMgcmVwYWlyZWQuXG4gKlxuICogYHJ1bklkYCBpcyB0aGUgY2FsbGVyJ3MgcnVuLiBFdmVyeSBldmVudCBtdXN0IGJlbG9uZyB0byBpdDogdGhlIGRlbHRhIGlzXG4gKiBtZXJnZWQgc3RyYWlnaHQgaW50byB0aGUgcmVwbGF5J3MgbG9nLCBhbmQgb25lIGZvcmVpZ24gZXZlbnQgdGhlcmUgaXMgYVxuICogY29ycnVwdCBsb2cgcmF0aGVyIHRoYW4gYSBjb3JyZWN0ZWQgb25lIOKAlCB0aGUgcmVwbGF5IHdvdWxkIGNvbnN1bWUgYVxuICogY29ycmVsYXRpb24gaWQgZm9yIGFuIGV2ZW50IHRoYXQgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBydW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb25kaXRpb25FdmVudERlbHRhKFxuICBlcnJvcjogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZ1xuKTogeyBldmVudHM6IEV2ZW50W107IGN1cnNvcjogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbCB7XG4gIGlmICghUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZGV0YWlscyA9IGVycm9yLmRldGFpbHM7XG4gIGlmICh0eXBlb2YgZGV0YWlscyAhPT0gJ29iamVjdCcgfHwgZGV0YWlscyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHsgZXZlbnRzLCBjdXJzb3IgfSA9IGRldGFpbHMgYXMgeyBldmVudHM/OiB1bmtub3duOyBjdXJzb3I/OiB1bmtub3duIH07XG4gIGlmICghQXJyYXkuaXNBcnJheShldmVudHMpIHx8IGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIGV2ZW50ID09PSBudWxsIHx8XG4gICAgICB0eXBlb2YgKGV2ZW50IGFzIHsgZXZlbnRJZD86IHVua25vd24gfSkuZXZlbnRJZCAhPT0gJ3N0cmluZycgfHxcbiAgICAgIChldmVudCBhcyB7IHJ1bklkPzogdW5rbm93biB9KS5ydW5JZCAhPT0gcnVuSWRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGV2ZW50czogZXZlbnRzIGFzIEV2ZW50W10sXG4gICAgY3Vyc29yOiB0eXBlb2YgY3Vyc29yID09PSAnc3RyaW5nJyA/IGN1cnNvciA6IG51bGwsXG4gIH07XG59XG5cbi8qKiBDcmVhdGVzIG9uZSBldmVudCBvbiBhIGJvdW5kIHJ1biwgY2FycnlpbmcgcmVwbGF5LXJlY292ZXJ5IHRlbGVtZXRyeS4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50Q3JlYXRvciA9IChcbiAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuKSA9PiBQcm9taXNlPEV2ZW50UmVzdWx0PjtcblxuLyoqXG4gKiBDT1JTIGhlYWRlcnMgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZXMuXG4gKiBBbGxvd3MgdGhlIG9ic2VydmFiaWxpdHkgVUkgdG8gY2hlY2sgZW5kcG9pbnQgaGVhbHRoIGZyb20gYSBkaWZmZXJlbnQgb3JpZ2luLlxuICovXG5jb25zdCBIRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTID0ge1xuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6ICdQT1NULCBPUFRJT05TLCBHRVQsIEhFQUQnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6ICdDb250ZW50LVR5cGUnLFxufTtcblxuLyoqXG4gKiBXcmFwcyBhIHJlcXVlc3QvcmVzcG9uc2UgaGFuZGxlciBhbmQgYWRkcyBhIGhlYWx0aCBjaGVjayBcIm1vZGVcIlxuICogYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgYF9faGVhbHRoYCBxdWVyeSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoSGVhbHRoQ2hlY2soXG4gIGhhbmRsZXI6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+LFxuICB3b3JsZFNwZWNWZXJzaW9uPzogbnVtYmVyXG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBhc3luYyAocmVxOiBSZXF1ZXN0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKTtcbiAgICBjb25zdCBpc0hlYWx0aENoZWNrID0gdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ19faGVhbHRoJyk7XG4gICAgaWYgKGlzSGVhbHRoQ2hlY2spIHtcbiAgICAgIC8vIEhhbmRsZSBDT1JTIHByZWZsaWdodCBmb3IgaGVhbHRoIGNoZWNrXG4gICAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICAgIGhlYWRlcnM6IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGhlYWx0aHk6IHRydWUsXG4gICAgICAgICAgZW5kcG9pbnQ6IHVybC5wYXRobmFtZSxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5IRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKHJlcSk7XG4gIH07XG59XG5cbi8qKlxuICogUXVldWVzIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlIHdpdGggdHJhY2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWVzc2FnZShcbiAgd29ybGQ6IFdvcmxkLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5cbikge1xuICBjb25zdCBxdWV1ZU5hbWUgPSBhcmdzWzBdO1xuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUocXVldWVOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3B1Ymxpc2gnKSxcbiAgICAgICAgLy8gUGVlciBzZXJ2aWNlIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwc1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUGVlclNlcnZpY2UoJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1NlcnZpY2UoJ3ZxcycpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjTWV0aG9kKCdwdWJsaXNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlSWQgfSA9IGF3YWl0IHdvcmxkLnF1ZXVlKC4uLmFyZ3MpO1xuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWVzc2FnZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHF1ZXVlIG92ZXJoZWFkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciBhIGdpdmVuIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWV1ZU92ZXJoZWFkKG1lc3NhZ2U6IHsgcmVxdWVzdGVkQXQ/OiBEYXRlIH0pIHtcbiAgaWYgKCFtZXNzYWdlLnJlcXVlc3RlZEF0KSByZXR1cm47XG4gIHRyeSB7XG4gICAgcmV0dXJuIEF0dHJpYnV0ZS5RdWV1ZU92ZXJoZWFkTXMoXG4gICAgICBEYXRlLm5vdygpIC0gbWVzc2FnZS5yZXF1ZXN0ZWRBdC5nZXRUaW1lKClcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWVtb2l6ZWQgYWNjZXNzb3IgZm9yIGEgcnVuJ3MgZnVsbCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkuXG4gKlxuICogVGhlIGZpcnN0IGNhbGwgcmVzb2x2ZXMgdGhlIHJ1bidzIGtleSBtYXRlcmlhbCB2aWFcbiAqIGB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCAod2hpY2ggbWF5IGRvIEhLREYgZGVyaXZhdGlvbiBsb2NhbGx5IG9uXG4gKiBWZXJjZWwsIG9yIGEgbmV0d29yayBmZXRjaCBmcm9tIGV4dGVybmFsIGNvbnRleHRzKSBhbmQgZGVyaXZlcyBhXG4gKiB7QGxpbmsgUGF5bG9hZEtleX0gZnJvbSBpdDsgc3Vic2VxdWVudCBjYWxscyBhd2FpdCB0aGUgc2FtZSBjYWNoZWQgcHJvbWlzZS5cbiAqIElmIHRoZSB3b3JsZCBkb2Vzbid0IHN1cHBvcnQgZW5jcnlwdGlvbiBvciB0aGUgcnVuIGhhcyBubyBrZXkgY29uZmlndXJlZCxcbiAqIHRoZSBjYWNoZWQgdmFsdWUgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHJlc29sdmVkIHZhbHVlIGlzIGRlbGliZXJhdGVseSB0aGUgKmZ1bGwqIGNhcGFiaWxpdHkg4oCUIHRoZSBzeW1tZXRyaWMgQUVTXG4gKiBrZXkgcGx1cyB0aGUgcnVuJ3MgWDI1NTE5IGtleXBhaXIg4oCUIG5vdCBqdXN0IGEgYENyeXB0b0tleWAuIEEgcnVuIHJlYWRpbmdcbiAqIGl0cyBvd24gZXZlbnQgbG9nIGNhbiBlbmNvdW50ZXIgc2VhbGVkIChgZW5jcGApIHBheWxvYWRzIHRoYXQgYW5vdGhlciBydW5cbiAqIHdyb3RlIHRvIGl0IChhIGNyb3NzLWRlcGxveW1lbnQgaG9vayByZXN1bXB0aW9uLCBzYXkpLCBhbmQgb3BlbmluZyB0aG9zZVxuICogbmVlZHMgdGhlIGtleXBhaXIuIFJlc29sdmluZyBvbmx5IHRoZSBzeW1tZXRyaWMga2V5IHdvdWxkIGxlYXZlIHRob3NlXG4gKiBwYXlsb2FkcyB1bm9wZW5hYmxlIGFuZCB3ZWRnZSB0aGUgcnVuLlxuICpcbiAqIFVzZWQgYnkgc3RlcCAvIHdvcmtmbG93IGhhbmRsZXJzIHRvIGRlZmVyIHRoZSAocG90ZW50aWFsbHkgZXhwZW5zaXZlKVxuICoga2V5IGZldGNoIHVudGlsIHRoZSBmaXJzdCBjb2RlIHBhdGggdGhhdCBhY3R1YWxseSBuZWVkcyBpdCDigJQgdHlwaWNhbGx5XG4gKiBpbnB1dCBoeWRyYXRpb24gb24gdGhlIHN1Y2Nlc3MgcGF0aCwgb3IgZXJyb3IgZGVoeWRyYXRpb24gb24gYSBmYWlsdXJlXG4gKiBwYXRoLiBCb3RoIHBhdGhzIGNhbiByYWNlLWNhbGwgdGhlIGFjY2Vzc29yIHdpdGhvdXQgdHJpZ2dlcmluZyBkdXBsaWNhdGVcbiAqIGZldGNoZXMuXG4gKlxuICogRXJyb3JzIHRocm93biBieSBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgcHJvcGFnYXRlIHRvIGV2ZXJ5IGNhbGxlclxuICogKHRoZSBjYWNoZWQgcHJvbWlzZSByZWplY3RzKS4gVGhpcyBpcyBpbnRlbnRpb25hbDogd2hlbiBlbmNyeXB0aW9uIGlzXG4gKiBjb25maWd1cmVkLCB3ZSBuZXZlciB3YW50IHRvIHNpbGVudGx5IGZhbGwgYmFjayB0byBwbGFpbnRleHRcbiAqIHNlcmlhbGl6YXRpb24uIEEgcHJvcGFnYXRlZCBlcnJvciBpbiBhbiBldmVudC1lbWlzc2lvbiBwYXRoIGxlYXZlcyB0aGVcbiAqIG91dGVyIHRyeS9jYXRjaCB0byBsb2cgYW5kIHN1cmZhY2UgdGhlIGlzc3VlOyB0aGUgcXVldWUncyByZWRlbGl2ZXJ5XG4gKiBzZW1hbnRpY3Mgd2lsbCByZXRyeSB0aGUga2V5IGZldGNoIG9uIHRoZSBuZXh0IGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5PcklkOiBXb3JrZmxvd1J1biB8IHN0cmluZ1xuKTogKCkgPT4gUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGxldCBjYWNoZWQ6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGNhY2hlZCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgb3ZlcmxvYWQgc2V0IHRha2VzIGVpdGhlciBhXG4gICAgICAgIC8vIGBXb3JrZmxvd1J1bmAgb3IgYSBgcnVuSWQ6IHN0cmluZ2AgKHdpdGggb3B0aW9uYWwgY29udGV4dCkuIEJyYW5jaFxuICAgICAgICAvLyBoZXJlIHNvIFR5cGVTY3JpcHQgcGlja3MgdGhlIHJpZ2h0IG92ZXJsb2FkIGZvciBlYWNoIHNoYXBlLlxuICAgICAgICBjb25zdCByYXdLZXkgPVxuICAgICAgICAgIHR5cGVvZiBydW5PcklkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZClcbiAgICAgICAgICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bk9ySWQpO1xuICAgICAgICAvLyBSZXNvbHZlIHRoZSAqZnVsbCogY2FwYWJpbGl0eSwgbm90IGp1c3QgdGhlIHN5bW1ldHJpYyBrZXk6IGEgcnVuXG4gICAgICAgIC8vIHJlYWRpbmcgaXRzIG93biBldmVudCBsb2cgbWF5IGVuY291bnRlciBzZWFsZWQgKGBlbmNwYCkgcGF5bG9hZHNcbiAgICAgICAgLy8gdGhhdCBhbm90aGVyIHJ1biB3cm90ZSB0byBpdCwgYW5kIG9wZW5pbmcgdGhvc2UgbmVlZHMgdGhlIHJ1bidzXG4gICAgICAgIC8vIFgyNTUxOSBzY2FsYXIgYXMgd2VsbC5cbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9O1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"quickjs-assets.generated.d.ts","sourceRoot":"","sources":["../../src/runtime/quickjs-assets.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAoBxD,QAAA,MAAM,WAAW,6BAAu93xB,CAAC;AAUz+3xB,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,EAKlD,CAAC"}
1
+ {"version":3,"file":"quickjs-assets.generated.d.ts","sourceRoot":"","sources":["../../src/runtime/quickjs-assets.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAoBxD,QAAA,MAAM,WAAW,6BAAms8xB,CAAC;AAUrt8xB,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,EAKlD,CAAC"}