footprintjs 10.6.0 → 10.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CLAUDE.md +2 -1
  2. package/dist/esm/index.d.ts +12 -2
  3. package/dist/esm/index.js +5 -3
  4. package/dist/esm/lib/attempt/backoff.d.ts +96 -0
  5. package/dist/esm/lib/attempt/backoff.js +173 -0
  6. package/dist/esm/lib/attempt/deadline.d.ts +0 -5
  7. package/dist/esm/lib/attempt/deadline.js +2 -27
  8. package/dist/esm/lib/attempt/index.d.ts +6 -4
  9. package/dist/esm/lib/attempt/index.js +6 -5
  10. package/dist/esm/lib/attempt/runner.js +3 -2
  11. package/dist/esm/lib/detach/drivers/setTimeout.d.ts +4 -2
  12. package/dist/esm/lib/detach/drivers/setTimeout.js +12 -2
  13. package/dist/esm/lib/detach/flush.d.ts +6 -1
  14. package/dist/esm/lib/detach/flush.js +8 -6
  15. package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +8 -1
  16. package/dist/esm/lib/observer-queue/deferredDispatcher.js +13 -6
  17. package/dist/esm/lib/recorder/AttemptRecorder.js +8 -9
  18. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -2
  19. package/dist/esm/lib/runner/FlowChartExecutor.js +8 -3
  20. package/dist/esm/lib/runner/captureHistory.js +6 -4
  21. package/dist/esm/lib/runner/deadline.js +3 -2
  22. package/dist/esm/lib/runner/recordSink.d.ts +2 -1
  23. package/dist/esm/lib/runner/recordSink.js +12 -7
  24. package/dist/esm/lib/sinks/fileSink.js +7 -6
  25. package/dist/esm/lib/sinks/indexedIO.js +5 -3
  26. package/dist/esm/lib/timers/longTimeout.d.ts +37 -0
  27. package/dist/esm/lib/timers/longTimeout.js +56 -0
  28. package/dist/index.js +8 -3
  29. package/dist/lib/attempt/backoff.js +178 -0
  30. package/dist/lib/attempt/deadline.js +4 -30
  31. package/dist/lib/attempt/index.js +9 -6
  32. package/dist/lib/attempt/runner.js +4 -3
  33. package/dist/lib/detach/drivers/setTimeout.js +12 -2
  34. package/dist/lib/detach/flush.js +8 -6
  35. package/dist/lib/observer-queue/deferredDispatcher.js +13 -6
  36. package/dist/lib/recorder/AttemptRecorder.js +8 -9
  37. package/dist/lib/runner/FlowChartExecutor.js +8 -3
  38. package/dist/lib/runner/captureHistory.js +6 -4
  39. package/dist/lib/runner/deadline.js +3 -2
  40. package/dist/lib/runner/recordSink.js +12 -7
  41. package/dist/lib/sinks/fileSink.js +7 -6
  42. package/dist/lib/sinks/indexedIO.js +5 -3
  43. package/dist/lib/timers/longTimeout.js +60 -0
  44. package/dist/types/index.d.ts +12 -2
  45. package/dist/types/lib/attempt/backoff.d.ts +96 -0
  46. package/dist/types/lib/attempt/deadline.d.ts +0 -5
  47. package/dist/types/lib/attempt/index.d.ts +6 -4
  48. package/dist/types/lib/detach/drivers/setTimeout.d.ts +4 -2
  49. package/dist/types/lib/detach/flush.d.ts +6 -1
  50. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +8 -1
  51. package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -2
  52. package/dist/types/lib/runner/recordSink.d.ts +2 -1
  53. package/dist/types/lib/timers/longTimeout.d.ts +37 -0
  54. package/package.json +2 -2
@@ -23,6 +23,7 @@
23
23
  * is normal (it's why `wait()` rejects); we still want to drain
24
24
  * the siblings.
25
25
  */
26
+ import { setLongTimeout } from '../timers/longTimeout.js';
26
27
  import { ids, lookup, size } from './registry.js';
27
28
  /**
28
29
  * Wait for every in-flight detached handle to reach a terminal state.
@@ -67,15 +68,16 @@ export async function flushAllDetached(opts) {
67
68
  seen.add(id);
68
69
  const handles = newIds.map((id) => lookup(id)).filter((h) => h !== undefined);
69
70
  // Race the drain against the per-iteration timeout. We use a
70
- // `'timeout'` sentinel on the timeout side so the type narrows.
71
- let timerId;
71
+ // `'timeout'` sentinel on the timeout side so the type narrows. The
72
+ // timer is the one long-timer law's (`timers/longTimeout.ts`): no
73
+ // timer for `Infinity`, never a 1 ms timer for a long limit.
74
+ let cancelTimer = () => undefined;
72
75
  const timeoutPromise = new Promise((resolve) => {
73
- timerId = setTimeout(() => resolve('__detach_timeout__'), remainingMs);
76
+ cancelTimer = setLongTimeout(() => resolve('__detach_timeout__'), remainingMs);
74
77
  });
75
78
  const drainPromise = Promise.allSettled(handles.map((h) => h.wait()));
76
79
  const result = await Promise.race([drainPromise, timeoutPromise]);
77
- if (timerId !== undefined)
78
- clearTimeout(timerId);
80
+ cancelTimer();
79
81
  if (result === '__detach_timeout__') {
80
82
  return { done, failed, pending: size() };
81
83
  }
@@ -88,4 +90,4 @@ export async function flushAllDetached(opts) {
88
90
  }
89
91
  return { done, failed, pending: 0 };
90
92
  }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RldGFjaC9mbHVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBc0JsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxJQUFtQjtJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsU0FBUyxJQUFJLE1BQU0sQ0FBQztJQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFZixPQUFPLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLFdBQVcsSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFFL0QsaUVBQWlFO1FBQ2pFLGlFQUFpRTtRQUNqRSxnQ0FBZ0M7UUFDaEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsaUVBQWlFO1lBQ2pFLCtEQUErRDtZQUMvRCxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixTQUFTO1FBQ1gsQ0FBQztRQUNELEtBQUssTUFBTSxFQUFFLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFxQixFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBRWpHLDZEQUE2RDtRQUM3RCxnRUFBZ0U7UUFDaEUsSUFBSSxPQUFrRCxDQUFDO1FBQ3ZELE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxDQUF1QixDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25FLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxPQUFPLEtBQUssU0FBUztZQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRCxJQUFJLE1BQU0sS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXO2dCQUFFLElBQUksRUFBRSxDQUFDOztnQkFDaEMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2ZsdXNoLnRzIOKAlCBEcmFpbiBldmVyeSBpbi1mbGlnaHQgZGV0YWNoZWQgaGFuZGxlIHRvIHRlcm1pbmFsLlxuICpcbiAqIFBhdHRlcm46ICBEcmFpbi1sb29wIHdpdGggZGVhZGxpbmUuIFNhbWUgc2hhcGUgYXMgYSBncmFjZWZ1bCBIVFRQXG4gKiAgICAgICAgICAgc2VydmVyIHNodXRkb3duOiBzbmFwc2hvdCB0aGUgcXVldWUsIGF3YWl0IGV2ZXJ5dGhpbmcgaW5cbiAqICAgICAgICAgICBmbGlnaHQsIHJlcGVhdCB1bnRpbCBlbXB0eSBvciBkZWFkbGluZS5cbiAqIFJvbGU6ICAgICBHcmFjZWZ1bC1zaHV0ZG93biBob29rIGZvciBjb25zdW1lcnMgd2hvIGxhdW5jaGVkXG4gKiAgICAgICAgICAgZmlyZS1hbmQtZm9yZ2V0IHdvcmsgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGFjdHVhbGx5XG4gKiAgICAgICAgICAgZmx1c2hlZCBiZWZvcmUgZXhpdGluZyAoc2VydmVyIHN0b3AsIHRlc3QgY2xlYW51cCwgZXRjLikuXG4gKlxuICogV2h5IGl0ZXJhdGUgKG5vdCBzaW5nbGUgUHJvbWlzZS5hbGwgb3ZlciBhIHNuYXBzaG90KTpcbiAqICAgLSBBIGNoaWxkIHN0YWdlIGNhbiBpdHNlbGYgY2FsbCBgZGV0YWNoQW5kRm9yZ2V0YCB3aGlsZSBydW5uaW5nIOKAlFxuICogICAgIG5ldyBoYW5kbGVzIGFycml2ZSBXSElMRSB3ZSdyZSBmbHVzaGluZy4gQSBzaW5nbGUgc25hcHNob3Qgd291bGRcbiAqICAgICBtaXNzIHRoZW0uIExvb3BpbmcgdW50aWwgYHNpemUoKSA9PT0gMGAgZHJhaW5zIHRyYW5zaXRpdmVseS5cbiAqXG4gKiBXaHkgZGVkdXBlIHZpYSBgc2VlbmAgU2V0OlxuICogICAtIEhhbmRsZXMgYWxyZWFkeSB0ZXJtaW5hbCAoYnV0IG5vdCB5ZXQgYHVucmVnaXN0ZXJgZWQgYnkgdGhlaXJcbiAqICAgICBkcml2ZXIncyBmaW5hbGx5LWJsb2NrKSBjYW4gcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzLlxuICogICAgIFdpdGhvdXQgZGVkdXBlLCB0aGUgYGRvbmVgIGNvdW50ZXIgd291bGQgZG91YmxlLWNvdW50IHRoZW0uXG4gKlxuICogV2h5IGBQcm9taXNlLmFsbFNldHRsZWRgIChub3QgYFByb21pc2UuYWxsYCk6XG4gKiAgIC0gT25lIGhhbmRsZSdzIHJlamVjdGlvbiBtdXN0IE5PVCBhYm9ydCB0aGUgcmVzdC4gQSBmYWlsZWQgY2hpbGRcbiAqICAgICBpcyBub3JtYWwgKGl0J3Mgd2h5IGB3YWl0KClgIHJlamVjdHMpOyB3ZSBzdGlsbCB3YW50IHRvIGRyYWluXG4gKiAgICAgdGhlIHNpYmxpbmdzLlxuICovXG5cbmltcG9ydCB7IGlkcywgbG9va3VwLCBzaXplIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoUmVzdWx0IHtcbiAgLyoqIEhhbmRsZXMgd2hvc2UgYHdhaXQoKWAgd2UgRVhQTElDSVRMWSBhd2FpdGVkIGFuZCBzYXcgZnVsZmlsbGVkLlxuICAgKiAgQmVzdC1lZmZvcnQgY291bnQg4oCUIGEgY2hpbGQgdGhhdCBjb21wbGV0ZXMgaW5zaWRlIGFub3RoZXInc1xuICAgKiAgYHdhaXQoKWAgbWF5IGZpbmlzaCAoYW5kIHVucmVnaXN0ZXIpIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG9cbiAgICogIGF3YWl0IGl0IGRpcmVjdGx5LiBUaGUgRFJBSU4gaXMgc3RpbGwgZ3VhcmFudGVlZCAocmVnaXN0cnkgZW1wdHlcbiAgICogIG9uIHJldHVybik7IG9ubHkgdGhlIENPVU5UIGlzIGFwcHJveGltYXRlLiAqL1xuICByZWFkb25seSBkb25lOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHdob3NlIGB3YWl0KClgIHJlamVjdGVkLiBTYW1lIGJlc3QtZWZmb3J0IHNlbWFudGljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHN0aWxsIGluLWZsaWdodCB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgaW5kaWNhdGVzXG4gICAqICBhIHN1Y2Nlc3NmdWwgKGNvbXBsZXRlKSBkcmFpbiDigJQgcmVnaXN0cnkgd2FzIGVtcHR5IG9uIHJldHVybi4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoT3B0aW9ucyB7XG4gIC8qKiBNYXggd2FsbC1jbG9jayB0byBzcGVuZCBkcmFpbmluZywgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IDMwcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdhaXQgZm9yIGV2ZXJ5IGluLWZsaWdodCBkZXRhY2hlZCBoYW5kbGUgdG8gcmVhY2ggYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqIFJldHVybnMgY291bnRzIGZvciBkaWFnbm9zdGljcy4gUFJPQ0VTUy1XSURFIOKAlCBkcmFpbnMgZXZlcnkgZHJpdmVyXG4gKiBhY3Jvc3MgZXZlcnkgZXhlY3V0b3IuIEZvciBwZXItZXhlY3V0b3Igc2NvcGluZywgY29uc3VtZXJzIHNob3VsZFxuICogY29sbGVjdCB0aGVpciBvd24gaGFuZGxlcyBmcm9tIGBleGVjdXRvci5kZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAqIGNhbGxzIGFuZCBhd2FpdCBgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5dLm1hcChoID0+IGgud2FpdCgpKSlgXG4gKiB0aGVtc2VsdmVzLlxuICpcbiAqIEBleGFtcGxlIEdyYWNlZnVsIHNlcnZlciBzaHV0ZG93blxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZmx1c2hBbGxEZXRhY2hlZCB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gKlxuICogcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAqICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmbHVzaEFsbERldGFjaGVkKHsgdGltZW91dE1zOiAxMF8wMDAgfSk7XG4gKiAgIGNvbnNvbGUubG9nKGBEcmFpbmVkICR7c3RhdHMuZG9uZX0gZG9uZSwgJHtzdGF0cy5mYWlsZWR9IGZhaWxlZCwgJHtzdGF0cy5wZW5kaW5nfSBwZW5kaW5nLmApO1xuICogICBwcm9jZXNzLmV4aXQoc3RhdHMucGVuZGluZyA9PT0gMCA/IDAgOiAxKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaEFsbERldGFjaGVkKG9wdHM/OiBGbHVzaE9wdGlvbnMpOiBQcm9taXNlPEZsdXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IG9wdHM/LnRpbWVvdXRNcyA/PyAzMF8wMDA7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGRvbmUgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcblxuICB3aGlsZSAoc2l6ZSgpID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dE1zIC0gKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGlmIChyZW1haW5pbmdNcyA8PSAwKSByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHNpemUoKSB9O1xuXG4gICAgLy8gU25hcHNob3Qgb2YgTkVXICh1bnNlZW4pIGhhbmRsZXMuIEV4aXN0aW5nIHRlcm1pbmFsLWJ1dC1zdGlsbC1cbiAgICAvLyByZWdpc3RlcmVkIGhhbmRsZXMgcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzOyB0aGUgc2VlblxuICAgIC8vIHNldCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcuXG4gICAgY29uc3QgbmV3SWRzID0gaWRzKCkuZmlsdGVyKChpZCkgPT4gIXNlZW4uaGFzKGlkKSk7XG4gICAgaWYgKG5ld0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5IGlzIGFscmVhZHkgYXdhaXRlZCDigJQgeWllbGQgb25jZSBhbmRcbiAgICAgIC8vIHJlLWNoZWNrLiBUaGUgZHJpdmVyJ3MgdW5yZWdpc3Rlci1pbi1maW5hbGx5IGhhc24ndCBydW4geWV0LlxuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpZCBvZiBuZXdJZHMpIHNlZW4uYWRkKGlkKTtcblxuICAgIGNvbnN0IGhhbmRsZXMgPSBuZXdJZHMubWFwKChpZCkgPT4gbG9va3VwKGlkKSkuZmlsdGVyKChoKTogaCBpcyBEZXRhY2hIYW5kbGUgPT4gaCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIFJhY2UgdGhlIGRyYWluIGFnYWluc3QgdGhlIHBlci1pdGVyYXRpb24gdGltZW91dC4gV2UgdXNlIGFcbiAgICAvLyBgJ3RpbWVvdXQnYCBzZW50aW5lbCBvbiB0aGUgdGltZW91dCBzaWRlIHNvIHRoZSB0eXBlIG5hcnJvd3MuXG4gICAgbGV0IHRpbWVySWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8J19fZGV0YWNoX3RpbWVvdXRfXyc+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCdfX2RldGFjaF90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IGRyYWluUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2RyYWluUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cbiAgICBpZiAocmVzdWx0ID09PSAnX19kZXRhY2hfdGltZW91dF9fJykge1xuICAgICAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiBzaXplKCkgfTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHJlc3VsdCkge1xuICAgICAgaWYgKHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJykgZG9uZSsrO1xuICAgICAgZWxzZSBmYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IDAgfTtcbn1cbiJdfQ==
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RldGFjaC9mbHVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTJCbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsSUFBbUI7SUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxFQUFFLFNBQVMsSUFBSSxNQUFNLENBQUM7SUFDNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsT0FBTyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQixNQUFNLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDekQsSUFBSSxXQUFXLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBRS9ELGlFQUFpRTtRQUNqRSxpRUFBaUU7UUFDakUsZ0NBQWdDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLGlFQUFpRTtZQUNqRSwrREFBK0Q7WUFDL0QsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsU0FBUztRQUNYLENBQUM7UUFDRCxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBcUIsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUVqRyw2REFBNkQ7UUFDN0Qsb0VBQW9FO1FBQ3BFLGtFQUFrRTtRQUNsRSw2REFBNkQ7UUFDN0QsSUFBSSxXQUFXLEdBQWUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxDQUF1QixDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25FLFdBQVcsR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsV0FBVyxFQUFFLENBQUM7UUFFZCxJQUFJLE1BQU0sS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXO2dCQUFFLElBQUksRUFBRSxDQUFDOztnQkFDaEMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2ZsdXNoLnRzIOKAlCBEcmFpbiBldmVyeSBpbi1mbGlnaHQgZGV0YWNoZWQgaGFuZGxlIHRvIHRlcm1pbmFsLlxuICpcbiAqIFBhdHRlcm46ICBEcmFpbi1sb29wIHdpdGggZGVhZGxpbmUuIFNhbWUgc2hhcGUgYXMgYSBncmFjZWZ1bCBIVFRQXG4gKiAgICAgICAgICAgc2VydmVyIHNodXRkb3duOiBzbmFwc2hvdCB0aGUgcXVldWUsIGF3YWl0IGV2ZXJ5dGhpbmcgaW5cbiAqICAgICAgICAgICBmbGlnaHQsIHJlcGVhdCB1bnRpbCBlbXB0eSBvciBkZWFkbGluZS5cbiAqIFJvbGU6ICAgICBHcmFjZWZ1bC1zaHV0ZG93biBob29rIGZvciBjb25zdW1lcnMgd2hvIGxhdW5jaGVkXG4gKiAgICAgICAgICAgZmlyZS1hbmQtZm9yZ2V0IHdvcmsgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGFjdHVhbGx5XG4gKiAgICAgICAgICAgZmx1c2hlZCBiZWZvcmUgZXhpdGluZyAoc2VydmVyIHN0b3AsIHRlc3QgY2xlYW51cCwgZXRjLikuXG4gKlxuICogV2h5IGl0ZXJhdGUgKG5vdCBzaW5nbGUgUHJvbWlzZS5hbGwgb3ZlciBhIHNuYXBzaG90KTpcbiAqICAgLSBBIGNoaWxkIHN0YWdlIGNhbiBpdHNlbGYgY2FsbCBgZGV0YWNoQW5kRm9yZ2V0YCB3aGlsZSBydW5uaW5nIOKAlFxuICogICAgIG5ldyBoYW5kbGVzIGFycml2ZSBXSElMRSB3ZSdyZSBmbHVzaGluZy4gQSBzaW5nbGUgc25hcHNob3Qgd291bGRcbiAqICAgICBtaXNzIHRoZW0uIExvb3BpbmcgdW50aWwgYHNpemUoKSA9PT0gMGAgZHJhaW5zIHRyYW5zaXRpdmVseS5cbiAqXG4gKiBXaHkgZGVkdXBlIHZpYSBgc2VlbmAgU2V0OlxuICogICAtIEhhbmRsZXMgYWxyZWFkeSB0ZXJtaW5hbCAoYnV0IG5vdCB5ZXQgYHVucmVnaXN0ZXJgZWQgYnkgdGhlaXJcbiAqICAgICBkcml2ZXIncyBmaW5hbGx5LWJsb2NrKSBjYW4gcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzLlxuICogICAgIFdpdGhvdXQgZGVkdXBlLCB0aGUgYGRvbmVgIGNvdW50ZXIgd291bGQgZG91YmxlLWNvdW50IHRoZW0uXG4gKlxuICogV2h5IGBQcm9taXNlLmFsbFNldHRsZWRgIChub3QgYFByb21pc2UuYWxsYCk6XG4gKiAgIC0gT25lIGhhbmRsZSdzIHJlamVjdGlvbiBtdXN0IE5PVCBhYm9ydCB0aGUgcmVzdC4gQSBmYWlsZWQgY2hpbGRcbiAqICAgICBpcyBub3JtYWwgKGl0J3Mgd2h5IGB3YWl0KClgIHJlamVjdHMpOyB3ZSBzdGlsbCB3YW50IHRvIGRyYWluXG4gKiAgICAgdGhlIHNpYmxpbmdzLlxuICovXG5cbmltcG9ydCB7IHNldExvbmdUaW1lb3V0IH0gZnJvbSAnLi4vdGltZXJzL2xvbmdUaW1lb3V0LmpzJztcbmltcG9ydCB7IGlkcywgbG9va3VwLCBzaXplIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoUmVzdWx0IHtcbiAgLyoqIEhhbmRsZXMgd2hvc2UgYHdhaXQoKWAgd2UgRVhQTElDSVRMWSBhd2FpdGVkIGFuZCBzYXcgZnVsZmlsbGVkLlxuICAgKiAgQmVzdC1lZmZvcnQgY291bnQg4oCUIGEgY2hpbGQgdGhhdCBjb21wbGV0ZXMgaW5zaWRlIGFub3RoZXInc1xuICAgKiAgYHdhaXQoKWAgbWF5IGZpbmlzaCAoYW5kIHVucmVnaXN0ZXIpIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG9cbiAgICogIGF3YWl0IGl0IGRpcmVjdGx5LiBUaGUgRFJBSU4gaXMgc3RpbGwgZ3VhcmFudGVlZCAocmVnaXN0cnkgZW1wdHlcbiAgICogIG9uIHJldHVybik7IG9ubHkgdGhlIENPVU5UIGlzIGFwcHJveGltYXRlLiAqL1xuICByZWFkb25seSBkb25lOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHdob3NlIGB3YWl0KClgIHJlamVjdGVkLiBTYW1lIGJlc3QtZWZmb3J0IHNlbWFudGljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHN0aWxsIGluLWZsaWdodCB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgaW5kaWNhdGVzXG4gICAqICBhIHN1Y2Nlc3NmdWwgKGNvbXBsZXRlKSBkcmFpbiDigJQgcmVnaXN0cnkgd2FzIGVtcHR5IG9uIHJldHVybi4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXggd2FsbC1jbG9jayB0byBzcGVuZCBkcmFpbmluZywgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IDMwcy5cbiAgICogYEluZmluaXR5YCB3YWl0cyBmb3IgZXZlcnkgaGFuZGxlIGFuZCBhcm1zIG5vIHRpbWVyOyBhIGxpbWl0IHBhc3RcbiAgICogMl4zMSDiiJIgMSBtcyBpcyB3YWl0ZWQgaW4gZnVsbCwgbmV2ZXIgY3V0IHRvIDEgbXM7IGAwYCBvciBsZXNzIGdpdmVzIHVwXG4gICAqIGF0IG9uY2UuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2FpdCBmb3IgZXZlcnkgaW4tZmxpZ2h0IGRldGFjaGVkIGhhbmRsZSB0byByZWFjaCBhIHRlcm1pbmFsIHN0YXRlLlxuICogUmV0dXJucyBjb3VudHMgZm9yIGRpYWdub3N0aWNzLiBQUk9DRVNTLVdJREUg4oCUIGRyYWlucyBldmVyeSBkcml2ZXJcbiAqIGFjcm9zcyBldmVyeSBleGVjdXRvci4gRm9yIHBlci1leGVjdXRvciBzY29waW5nLCBjb25zdW1lcnMgc2hvdWxkXG4gKiBjb2xsZWN0IHRoZWlyIG93biBoYW5kbGVzIGZyb20gYGV4ZWN1dG9yLmRldGFjaEFuZEpvaW5MYXRlciguLi4pYFxuICogY2FsbHMgYW5kIGF3YWl0IGBQcm9taXNlLmFsbFNldHRsZWQoWy4uLl0ubWFwKGggPT4gaC53YWl0KCkpKWBcbiAqIHRoZW1zZWx2ZXMuXG4gKlxuICogQGV4YW1wbGUgR3JhY2VmdWwgc2VydmVyIHNodXRkb3duXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBmbHVzaEFsbERldGFjaGVkIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAqXG4gKiBwcm9jZXNzLm9uKCdTSUdURVJNJywgYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBzdGF0cyA9IGF3YWl0IGZsdXNoQWxsRGV0YWNoZWQoeyB0aW1lb3V0TXM6IDEwXzAwMCB9KTtcbiAqICAgY29uc29sZS5sb2coYERyYWluZWQgJHtzdGF0cy5kb25lfSBkb25lLCAke3N0YXRzLmZhaWxlZH0gZmFpbGVkLCAke3N0YXRzLnBlbmRpbmd9IHBlbmRpbmcuYCk7XG4gKiAgIHByb2Nlc3MuZXhpdChzdGF0cy5wZW5kaW5nID09PSAwID8gMCA6IDEpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoQWxsRGV0YWNoZWQob3B0cz86IEZsdXNoT3B0aW9ucyk6IFByb21pc2U8Rmx1c2hSZXN1bHQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0cz8udGltZW91dE1zID8/IDMwXzAwMDtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBsZXQgZG9uZSA9IDA7XG4gIGxldCBmYWlsZWQgPSAwO1xuXG4gIHdoaWxlIChzaXplKCkgPiAwKSB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSB0aW1lb3V0TXMgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogc2l6ZSgpIH07XG5cbiAgICAvLyBTbmFwc2hvdCBvZiBORVcgKHVuc2VlbikgaGFuZGxlcy4gRXhpc3RpbmcgdGVybWluYWwtYnV0LXN0aWxsLVxuICAgIC8vIHJlZ2lzdGVyZWQgaGFuZGxlcyByZS1hcHBlYXIgaW4gc3Vic2VxdWVudCBzbmFwc2hvdHM7IHRoZSBzZWVuXG4gICAgLy8gc2V0IHByZXZlbnRzIGRvdWJsZS1jb3VudGluZy5cbiAgICBjb25zdCBuZXdJZHMgPSBpZHMoKS5maWx0ZXIoKGlkKSA9PiAhc2Vlbi5oYXMoaWQpKTtcbiAgICBpZiAobmV3SWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRXZlcnl0aGluZyBpbiB0aGUgcmVnaXN0cnkgaXMgYWxyZWFkeSBhd2FpdGVkIOKAlCB5aWVsZCBvbmNlIGFuZFxuICAgICAgLy8gcmUtY2hlY2suIFRoZSBkcml2ZXIncyB1bnJlZ2lzdGVyLWluLWZpbmFsbHkgaGFzbid0IHJ1biB5ZXQuXG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlkIG9mIG5ld0lkcykgc2Vlbi5hZGQoaWQpO1xuXG4gICAgY29uc3QgaGFuZGxlcyA9IG5ld0lkcy5tYXAoKGlkKSA9PiBsb29rdXAoaWQpKS5maWx0ZXIoKGgpOiBoIGlzIERldGFjaEhhbmRsZSA9PiBoICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8gUmFjZSB0aGUgZHJhaW4gYWdhaW5zdCB0aGUgcGVyLWl0ZXJhdGlvbiB0aW1lb3V0LiBXZSB1c2UgYVxuICAgIC8vIGAndGltZW91dCdgIHNlbnRpbmVsIG9uIHRoZSB0aW1lb3V0IHNpZGUgc28gdGhlIHR5cGUgbmFycm93cy4gVGhlXG4gICAgLy8gdGltZXIgaXMgdGhlIG9uZSBsb25nLXRpbWVyIGxhdydzIChgdGltZXJzL2xvbmdUaW1lb3V0LnRzYCk6IG5vXG4gICAgLy8gdGltZXIgZm9yIGBJbmZpbml0eWAsIG5ldmVyIGEgMSBtcyB0aW1lciBmb3IgYSBsb25nIGxpbWl0LlxuICAgIGxldCBjYW5jZWxUaW1lcjogKCkgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPCdfX2RldGFjaF90aW1lb3V0X18nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dCgoKSA9PiByZXNvbHZlKCdfX2RldGFjaF90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IGRyYWluUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2RyYWluUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBjYW5jZWxUaW1lcigpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gJ19fZGV0YWNoX3RpbWVvdXRfXycpIHtcbiAgICAgIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogc2l6ZSgpIH07XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByZXN1bHQpIHtcbiAgICAgIGlmIChyLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIGRvbmUrKztcbiAgICAgIGVsc2UgZmFpbGVkKys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiAwIH07XG59XG4iXX0=
@@ -8,7 +8,9 @@
8
8
  * Role: The pipeline held by `runner/DeferredObserverTier.ts · DeferredObserverTier`.
9
9
  * Producers call `capture()`; listeners
10
10
  * receive envelopes at the next checkpoint, "one beat behind".
11
- * Pure module — zero engine imports.
11
+ * Pure module — zero engine imports. Beside the capture
12
+ * envelope's types, it imports only the L0 long-timer leaf
13
+ * (`timers/longTimeout.ts`), which arms `drain`'s deadline.
12
14
  *
13
15
  * Delivery semantics (normative, RFC-001 §5 + amendments A2/A4):
14
16
  * - Per-listener FIFO: every listener sees envelopes in seq order
@@ -153,6 +155,11 @@ export declare class DeferredDispatcher {
153
155
  * `Promise.allSettled` under a deadline, shaped like `flushAllDetached`.
154
156
  * Loops while continuations spawn new captures, until quiescent or the
155
157
  * deadline expires.
158
+ *
159
+ * `timeoutMs` (default 30 000) is armed by the one long-timer law
160
+ * (`timers/longTimeout.ts · setLongTimeout`): `Infinity` arms no timer
161
+ * and waits for every continuation; a limit past 2^31 − 1 ms is waited in
162
+ * full, never cut to 1 ms; `0` or less gives up at once.
156
163
  */
157
164
  drain(opts?: {
158
165
  timeoutMs?: number;
@@ -8,7 +8,9 @@
8
8
  * Role: The pipeline held by `runner/DeferredObserverTier.ts · DeferredObserverTier`.
9
9
  * Producers call `capture()`; listeners
10
10
  * receive envelopes at the next checkpoint, "one beat behind".
11
- * Pure module — zero engine imports.
11
+ * Pure module — zero engine imports. Beside the capture
12
+ * envelope's types, it imports only the L0 long-timer leaf
13
+ * (`timers/longTimeout.ts`), which arms `drain`'s deadline.
12
14
  *
13
15
  * Delivery semantics (normative, RFC-001 §5 + amendments A2/A4):
14
16
  * - Per-listener FIFO: every listener sees envelopes in seq order
@@ -42,6 +44,7 @@
42
44
  * the time that actually blocks the flush. An async listener's continuation
43
45
  * time is intentionally not attributed (it does not block delivery).
44
46
  */
47
+ import { setLongTimeout } from '../timers/longTimeout.js';
45
48
  import { FlushDriver } from './flushDriver.js';
46
49
  import { MergedQueue } from './mergedQueue.js';
47
50
  const defaultNow = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());
@@ -122,6 +125,11 @@ export class DeferredDispatcher {
122
125
  * `Promise.allSettled` under a deadline, shaped like `flushAllDetached`.
123
126
  * Loops while continuations spawn new captures, until quiescent or the
124
127
  * deadline expires.
128
+ *
129
+ * `timeoutMs` (default 30 000) is armed by the one long-timer law
130
+ * (`timers/longTimeout.ts · setLongTimeout`): `Infinity` arms no timer
131
+ * and waits for every continuation; a limit past 2^31 − 1 ms is waited in
132
+ * full, never cut to 1 ms; `0` or less gives up at once.
125
133
  */
126
134
  async drain(opts) {
127
135
  const timeoutMs = opts?.timeoutMs ?? 30_000;
@@ -134,13 +142,12 @@ export class DeferredDispatcher {
134
142
  if (remainingMs <= 0)
135
143
  return { done, failed, pending: this.inflight.size + this.queue.depth };
136
144
  const batch = [...this.inflight];
137
- let timerId;
145
+ let cancelTimer = () => undefined;
138
146
  const timeoutPromise = new Promise((resolve) => {
139
- timerId = setTimeout(() => resolve('__drain_timeout__'), remainingMs);
147
+ cancelTimer = setLongTimeout(() => resolve('__drain_timeout__'), remainingMs);
140
148
  });
141
149
  const settled = await Promise.race([Promise.allSettled(batch), timeoutPromise]);
142
- if (timerId !== undefined)
143
- clearTimeout(timerId);
150
+ cancelTimer();
144
151
  if (settled === '__drain_timeout__') {
145
152
  return { done, failed, pending: this.inflight.size + this.queue.depth };
146
153
  }
@@ -223,4 +230,4 @@ export class DeferredDispatcher {
223
230
  }
224
231
  }
225
232
  }
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXJyZWREaXNwYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9vYnNlcnZlci1xdWV1ZS9kZWZlcnJlZERpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQ0c7QUFHSCxPQUFPLEVBQXdCLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBcUIsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUF3RmxFLE1BQU0sVUFBVSxHQUFHLEdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBRXZHLFNBQVMsVUFBVSxDQUFDLEtBQTJCO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBUSxLQUF1QixDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7QUFDNUcsQ0FBQztBQUVELE1BQU0sT0FBTyxrQkFBa0I7SUFDWixLQUFLLENBQWM7SUFDbkIsTUFBTSxDQUFjO0lBQ3BCLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztJQUNoRCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDekUsNEVBQTRFO0lBQzNELFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUN2QyxPQUFPLENBQXdCO0lBQy9CLEdBQUcsQ0FBZTtJQUMzQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFN0IsWUFBWSxJQUFnQztRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVB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QUFDLE9BQXNCLEVBQUUsVUFBa0IsRUFBRSxRQUF5QjtRQUNqRixNQUFNLE9BQU8sR0FBcUIsT0FBTyxDQUFDLElBQUksQ0FDNUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUNWLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLHdFQUF3RTtRQUN4RSx1QkFBdUI7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx3REFBd0Q7SUFDaEQsV0FBVyxDQUFDLEtBQWMsRUFBRSxPQUE2QjtRQUMvRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxtQ0FBbUM7UUFDckMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogb2JzZXJ2ZXItcXVldWUvZGVmZXJyZWREaXNwYXRjaGVyLnRzIOKAlCBSRkMtMDAxIEJsb2NrIDU6IGRlZmVycmVkIGRlbGl2ZXJ5IGZhw6dhZGUuXG4gKlxuICogUGF0dGVybjogIGNhcHR1cmUg4oaSIGVucXVldWUg4oaSIChtaWNyb3Rhc2spIGZsdXNoIOKGkiBpbnZva2UsIHdpdGggcGVyLWxpc3RlbmVyXG4gKiAgICAgICAgICAgZXJyb3IgaXNvbGF0aW9uLiBDb21wb3NlcyB0aGUgd2hvbGUgcHVyZSBwaXBlbGluZTogTWVyZ2VkUXVldWVcbiAqICAgICAgICAgICAoQmxvY2sgMywgd2hpY2ggY2FwdHVyZXMgdmlhIEJsb2NrIDEpICsgRmx1c2hEcml2ZXIgKEJsb2NrIDQpICtcbiAqICAgICAgICAgICBhIGxpc3RlbmVyIHJlZ2lzdHJ5IHdpdGggdGltaW5nL2luZmxpZ2h0IGFjY291bnRpbmcuXG4gKiBSb2xlOiAgICAgVGhlIHBpcGVsaW5lIGhlbGQgYnkgYHJ1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyDCtyBEZWZlcnJlZE9ic2VydmVyVGllcmAuXG4gKiAgICAgICAgICAgUHJvZHVjZXJzIGNhbGwgYGNhcHR1cmUoKWA7IGxpc3RlbmVyc1xuICogICAgICAgICAgIHJlY2VpdmUgZW52ZWxvcGVzIGF0IHRoZSBuZXh0IGNoZWNrcG9pbnQsIFwib25lIGJlYXQgYmVoaW5kXCIuXG4gKiAgICAgICAgICAgUHVyZSBtb2R1bGUg4oCUIHplcm8gZW5naW5lIGltcG9ydHMuXG4gKlxuICogRGVsaXZlcnkgc2VtYW50aWNzIChub3JtYXRpdmUsIFJGQy0wMDEgwqc1ICsgYW1lbmRtZW50cyBBMi9BNCk6XG4gKiAgIC0gUGVyLWxpc3RlbmVyIEZJRk86IGV2ZXJ5IGxpc3RlbmVyIHNlZXMgZW52ZWxvcGVzIGluIHNlcSBvcmRlclxuICogICAgIChpbnZvY2F0aW9uIG9yZGVyOyBhbiBhc3luYyBsaXN0ZW5lcidzIENPTVBMRVRJT04gb3JkZXIgaXMgaXRzIG93blxuICogICAgIGNvbmNlcm4pIOKAlCBFWENFUFQgdW5kZXIgYCdibG9jaydgIG92ZXJmbG93LCB3aGVyZSBhIHJlZnVzZWQgZW5xdWV1ZVxuICogICAgIGlzIGRlbGl2ZXJlZCBpbmxpbmUgYW5kIG92ZXJ0YWtlcyB0aGUgcXVldWVkIGJhY2tsb2cuIGBzZXFgIGFsd2F5c1xuICogICAgIHJlY29yZHMgdHJ1ZSBhcnJpdmFsIG9yZGVyLCBzbyBvcmRlci1zZW5zaXRpdmUgY29uc3VtZXJzIHJlLXNvcnQ7XG4gKiAgICAgc2VlIHRoZSBgJ2Jsb2NrJ2AgY2F2ZWF0IGJlbG93LlxuICogICAtIEVycm9yIGlzb2xhdGlvbjogYSB0aHJvd2luZyBsaXN0ZW5lciAoc3luYykgb3IgcmVqZWN0aW5nIGxpc3RlbmVyXG4gKiAgICAgKGFzeW5jKSBuZXZlciBhZmZlY3RzIHNpYmxpbmdzIG9yIHRoZSBwcm9kdWNlci4gQm90aCBmYWlsdXJlIG1vZGVzXG4gKiAgICAgcm91dGUgdG8gdGhlIGluamVjdGVkIGBvbkVycm9yYDsgYSB0aHJvd2luZyBgb25FcnJvcmAgaXMgaXRzZWxmXG4gKiAgICAgc3dhbGxvd2VkLlxuICogICAtIFRoZSBmbHVzaCBORVZFUiBhd2FpdHMgYSBsaXN0ZW5lci4gQXN5bmMgY29udGludWF0aW9ucyBhcmUgdHJhY2tlZCBpblxuICogICAgIGFuIGluZmxpZ2h0IHNldDsgYGRyYWluKHsgdGltZW91dE1zIH0pYCBzZXR0bGVzIHRoZW1cbiAqICAgICAoYFByb21pc2UuYWxsU2V0dGxlZGAgKyBkZWFkbGluZSwgc2hhcGVkIGxpa2UgYGZsdXNoQWxsRGV0YWNoZWRgKS5cbiAqICAgLSBgJ2Jsb2NrJ2Agb3ZlcmZsb3c6IGEgcmVmdXNlZCBlbnF1ZXVlIGlzIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5XG4gKiAgICAgSU5MSU5FIGZyb20gYGNhcHR1cmUoKWAg4oCUIHJlLWludHJvZHVjaW5nIGJsb2NraW5nIGRlbGl2ZXJ5IGJ5IHRoZVxuICogICAgIGNvbnN1bWVyJ3MgZXhwbGljaXQgY2hvaWNlLiBPcmRlcmluZyBjYXZlYXQgKGRvY3VtZW50ZWQgKyB0ZXN0ZWQpOiBhblxuICogICAgIGlubGluZSBldmVudCBvdmVydGFrZXMgdGhlIHF1ZXVlZCBiYWNrbG9nIOKAlCBgJ2Jsb2NrJ2AgdHJhZGVzIGdsb2JhbFxuICogICAgIG9yZGVyaW5nIGZvciB6ZXJvIGxvc3MgYW5kIGJvdW5kZWQgbWVtb3J5LiBgc2VxYCBzdGlsbCB0ZWxscyB0aGVcbiAqICAgICB0cnVlIGFycml2YWwgb3JkZXIuXG4gKiAgIC0gTGlzdGVuZXIgcmVnaXN0cnkgaXMgaWRlbXBvdGVudCBieSBpZCAoc2FtZSBpZCByZXBsYWNlcywgZGlmZmVyZW50XG4gKiAgICAgaWRzIGNvZXhpc3QpIOKAlCBtaXJyb3JzIHRoZSByZXBvLXdpZGUgcmVjb3JkZXIgSUQgY29udHJhY3QuIFN0YXRzXG4gKiAgICAgYWNjdW11bGF0ZSBwZXIgaWQgYWNyb3NzIHJlcGxhY2VtZW50OyBgcmVtb3ZlTGlzdGVuZXJgIGtlZXBzIHRoZVxuICogICAgIGlkJ3MgYWNjdW11bGF0ZWQgc3RhdHMgZm9yIHBvc3QtcnVuIHJlcG9ydHMuXG4gKiAgIC0gRXZlbnRzIGNhcHR1cmVkIEJFRk9SRSBhbnkgbGlzdGVuZXIgYXR0YWNoZXMgc3RheSBxdWV1ZWQg4oCUIGEgbGlzdGVuZXJcbiAqICAgICBhdHRhY2hlZCBiZWZvcmUgdGhlIG5leHQgY2hlY2twb2ludCBzdGlsbCByZWNlaXZlcyB0aGUgYmFja2xvZy5cbiAqXG4gKiBQZXItbGlzdGVuZXIgdGltZSBhY2NvdW50aW5nIChhbWVuZG1lbnQgQTIg4oCUIFwibmFtZSB0aGUgaG9nXCIpOiBjdW11bGF0aXZlXG4gKiBgdG90YWxNc2AgYW5kIHBlci1jaGVja3BvaW50IGBsYXN0Rmx1c2hNc2Agb2YgU1lOQyB0aW1lIHBlciBsaXN0ZW5lciBpZCDigJRcbiAqIHRoZSB0aW1lIHRoYXQgYWN0dWFsbHkgYmxvY2tzIHRoZSBmbHVzaC4gQW4gYXN5bmMgbGlzdGVuZXIncyBjb250aW51YXRpb25cbiAqIHRpbWUgaXMgaW50ZW50aW9uYWxseSBub3QgYXR0cmlidXRlZCAoaXQgZG9lcyBub3QgYmxvY2sgZGVsaXZlcnkpLlxuICovXG5cbmltcG9ydCB7IHR5cGUgQ2FwdHVyZUVudmVsb3BlLCB0eXBlIENhcHR1cmVIb29rcywgdHlwZSBDYXB0dXJlUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9lbnZlbG9wZS5qcyc7XG5pbXBvcnQgeyB0eXBlIEZsdXNoU3luY1Jlc3VsdCwgRmx1c2hEcml2ZXIgfSBmcm9tICcuL2ZsdXNoRHJpdmVyLmpzJztcbmltcG9ydCB7IHR5cGUgRW5xdWV1ZUlucHV0LCBNZXJnZWRRdWV1ZSB9IGZyb20gJy4vbWVyZ2VkUXVldWUuanMnO1xuaW1wb3J0IHsgdHlwZSBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vcmluZy5qcyc7XG5cbi8qKlxuICogT25lIGRlZmVycmVkIG9ic2VydmVyLiBNYXkgcmV0dXJuIGEgUHJvbWlzZSDigJQgdGhlIGRpc3BhdGNoZXIgdHJhY2tzIGl0IGluXG4gKiB0aGUgaW5mbGlnaHQgc2V0IGJ1dCBORVZFUiBhd2FpdHMgaXQgZHVyaW5nIGEgZmx1c2guXG4gKi9cbmV4cG9ydCB0eXBlIERlZmVycmVkTGlzdGVuZXIgPSAoZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hFcnJvckNvbnRleHQge1xuICByZWFkb25seSBsaXN0ZW5lcklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGU7XG4gIC8qKiBgJ3N5bmMnYCA9IGxpc3RlbmVyIHRocmV3OyBgJ2FzeW5jJ2AgPSByZXR1cm5lZCBwcm9taXNlIHJlamVjdGVkLiAqL1xuICByZWFkb25seSBwaGFzZTogJ3N5bmMnIHwgJ2FzeW5jJztcbn1cblxuLyoqIEluamVjdGVkIGVycm9yIHNpbmsg4oCUIHRoZSB3aXJpbmcgbGF5ZXIgcm91dGVzIHRoZXNlIChCbG9jayA2KS4gKi9cbmV4cG9ydCB0eXBlIERpc3BhdGNoRXJyb3JIYW5kbGVyID0gKGVycm9yOiB1bmtub3duLCBjb250ZXh0OiBEaXNwYXRjaEVycm9yQ29udGV4dCkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBEZWZlcnJlZERpc3BhdGNoZXJPcHRpb25zIHtcbiAgLyoqIFF1ZXVlIGJvdW5kIOKAlCBkZWZhdWx0IDEwIDAwMCAoc2VlIGBNZXJnZWRRdWV1ZWApLiAqL1xuICByZWFkb25seSBtYXhRdWV1ZT86IG51bWJlcjtcbiAgLyoqIE92ZXJmbG93IHBvbGljeSDigJQgZGVmYXVsdCBgJ2Ryb3Atb2xkZXN0J2AuICovXG4gIHJlYWRvbmx5IG92ZXJmbG93PzogT3ZlcmZsb3dQb2xpY3k7XG4gIC8qKiBgJ3NhbXBsZSdgIG92ZXJmbG93IG9ubHkg4oCUIGFkbWl0IDEgaW4gdGhpcyBtYW55IHNhdHVyYXRlZCBhcnJpdmFscy4gKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnk/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IGNhcHR1cmUgcG9saWN5IOKAlCBkZWZhdWx0IGAnc3VtbWFyeSdgLiAqL1xuICByZWFkb25seSBjYXB0dXJlUG9saWN5PzogQ2FwdHVyZVBvbGljeTtcbiAgLyoqIFBlci1mbHVzaCB0aW1lIGJ1ZGdldCwgbXMgKEExKSDigJQgZGVmYXVsdCAyOyBgSW5maW5pdHlgID0gZnVsbCBkcmFpbi4gKi9cbiAgcmVhZG9ubHkgZmx1c2hCdWRnZXRNcz86IG51bWJlcjtcbiAgLyoqIExpc3RlbmVyLWZhaWx1cmUgc2luay4gTm8gZGVmYXVsdCDigJQgd2l0aG91dCBpdCwgZmFpbHVyZXMgYXJlIHNpbGVudC4gKi9cbiAgcmVhZG9ubHkgb25FcnJvcj86IERpc3BhdGNoRXJyb3JIYW5kbGVyO1xuICAvKiogQ2FwdHVyZSBzZWFtcyAoZGV2LXdhcm4sIGNhcHR1cmVkQXQgY2xvY2spIOKAlCBzZWUgYENhcHR1cmVIb29rc2AuICovXG4gIHJlYWRvbmx5IGhvb2tzPzogQ2FwdHVyZUhvb2tzO1xuICAvKiogVGltaW5nIGNsb2NrIGZvciBidWRnZXQgKyBwZXItbGlzdGVuZXIgYWNjb3VudGluZy4gSW5qZWN0YWJsZS4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogQ2hlY2twb2ludCBwcmltaXRpdmUg4oCUIGRlZmF1bHQgYHF1ZXVlTWljcm90YXNrYC4gSW5qZWN0YWJsZS4gKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiAoY2I6ICgpID0+IHZvaWQpID0+IHZvaWQ7XG59XG5cbi8qKiBQZXItbGlzdGVuZXIgYWNjb3VudGluZyAoQTIvQTQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5lclN0YXRzIHtcbiAgLyoqIEVudmVsb3BlcyBkZWxpdmVyZWQgKGludm9jYXRpb25zLCBpbmNsdWRpbmcgb25lcyB0aGF0IHRocmV3KS4gKi9cbiAgcmVhZG9ubHkgZXZlbnRzOiBudW1iZXI7XG4gIC8qKiBDdW11bGF0aXZlIHN5bmMgZGVsaXZlcnkgdGltZSwgbXMuICovXG4gIHJlYWRvbmx5IHRvdGFsTXM6IG51bWJlcjtcbiAgLyoqIFN5bmMgZGVsaXZlcnkgdGltZSBzaW5jZSB0aGUgbGFzdCBmbHVzaCBzdGFydGVkLCBtcy4gKi9cbiAgcmVhZG9ubHkgbGFzdEZsdXNoTXM6IG51bWJlcjtcbn1cblxuLyoqIFRoZSBCbG9jayA5IG9ic2VydmFiaWxpdHkgc3VyZmFjZSAoYW1lbmRtZW50IEE0KSDigJQgcHVyZSBnZXR0ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoZXJTdGF0cyB7XG4gIC8qKiBDdXJyZW50IGJhY2tsb2cuICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIC8qKiBFdmVudHMgTE9TVCAob3ZlcmZsb3cpIOKAlCBuZXZlciBzaWxlbnQ7IGFsc28gdmlzaWJsZSBhcyBzZXEgZ2Fwcy4gKi9cbiAgcmVhZG9ubHkgZHJvcHM6IG51bWJlcjtcbiAgLyoqIENvbXBsZXRlZCBjaGVja3BvaW50IGZsdXNoZXMuICovXG4gIHJlYWRvbmx5IGZsdXNoZXM6IG51bWJlcjtcbiAgLyoqIEZsdXNoZXMgY3V0IHNob3J0IGJ5IGBmbHVzaEJ1ZGdldE1zYCAoQTEpLiAqL1xuICByZWFkb25seSBidWRnZXRFeGhhdXN0ZWQ6IG51bWJlcjtcbiAgLyoqIHA5NSBmbHVzaCBkdXJhdGlvbiwgbXMgKHJvbGxpbmcgd2luZG93KS4gKi9cbiAgcmVhZG9ubHkgcDk1Rmx1c2hNczogbnVtYmVyO1xuICAvKiogYCdibG9jaydgLXBvbGljeSByZWZ1c2FscyBkZWxpdmVyZWQgc3luY2hyb25vdXNseSBpbmxpbmUuICovXG4gIHJlYWRvbmx5IGlubGluZURlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqIEFzeW5jIGxpc3RlbmVyIGNvbnRpbnVhdGlvbnMgbm90IHlldCBzZXR0bGVkLiAqL1xuICByZWFkb25seSBpbmZsaWdodDogbnVtYmVyO1xuICAvKiogUGVyLWxpc3RlbmVyIHRpbWUgYWNjb3VudGluZyDigJQgXCJuYW1lIHRoZSBob2dcIiAoQTIpLiAqL1xuICByZWFkb25seSBwZXJMaXN0ZW5lcjogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTGlzdGVuZXJTdGF0cz4+O1xufVxuXG4vKiogUmVzdWx0IG9mIHtAbGluayBEZWZlcnJlZERpc3BhdGNoZXIuZHJhaW59IOKAlCBgZmx1c2hBbGxEZXRhY2hlZGAgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIERyYWluUmVzdWx0IHtcbiAgLyoqIEFzeW5jIGNvbnRpbnVhdGlvbnMgc2VlbiBzZXR0bGluZyBmdWxmaWxsZWQuIEJlc3QtZWZmb3J0IGNvdW50IOKAlCBhXG4gICAqICBjb250aW51YXRpb24gdGhhdCBzZXR0bGVzIGJldHdlZW4gY2hlY2tzIGlzIGRyYWluZWQgYnV0IG1heSBub3QgYmVcbiAgICogIGNvdW50ZWQgKHNhbWUgc2VtYW50aWNzIGFzIGBmbHVzaEFsbERldGFjaGVkYCkuICovXG4gIHJlYWRvbmx5IGRvbmU6IG51bWJlcjtcbiAgLyoqIENvbnRpbnVhdGlvbnMgd2hvc2UgbGlzdGVuZXIgcHJvbWlzZSByZWplY3RlZCAocm91dGVkIHRvIG9uRXJyb3IpLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIFN0aWxsIGluIGZsaWdodCAob3IgcXVldWVkKSB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgPSBkcmFpbmVkLiAqL1xuICByZWFkb25seSBwZW5kaW5nOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBNdXRhYmxlTGlzdGVuZXJTdGF0cyB7XG4gIGV2ZW50czogbnVtYmVyO1xuICB0b3RhbE1zOiBudW1iZXI7XG4gIGxhc3RGbHVzaE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHROb3cgPSAoKTogbnVtYmVyID0+ICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnID8gcGVyZm9ybWFuY2Uubm93KCkgOiBEYXRlLm5vdygpKTtcblxuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZTogdm9pZCB8IFByb21pc2U8dm9pZD4pOiB2YWx1ZSBpcyBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlPHZvaWQ+KS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmZXJyZWREaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZTogTWVyZ2VkUXVldWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJpdmVyOiBGbHVzaERyaXZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgRGVmZXJyZWRMaXN0ZW5lcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lclN0YXRzID0gbmV3IE1hcDxzdHJpbmcsIE11dGFibGVMaXN0ZW5lclN0YXRzPigpO1xuICAvKiogVHJhY2tlZCBhc3luYyBjb250aW51YXRpb25zIOKAlCByZXNvbHZlIGB0cnVlYCAob2spIC8gYGZhbHNlYCAoZmFpbGVkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbmZsaWdodCA9IG5ldyBTZXQ8UHJvbWlzZTxib29sZWFuPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkVycm9yPzogRGlzcGF0Y2hFcnJvckhhbmRsZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgaW5saW5lRGVsaXZlcmllcyA9IDA7XG5cbiAgY29uc3RydWN0b3Iob3B0cz86IERlZmVycmVkRGlzcGF0Y2hlck9wdGlvbnMpIHtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRzPy5vbkVycm9yO1xuICAgIHRoaXMubm93ID0gb3B0cz8ubm93ID8/IGRlZmF1bHROb3c7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBNZXJnZWRRdWV1ZSh7XG4gICAgICBtYXhRdWV1ZTogb3B0cz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0cz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0cz8uc2FtcGxlRXZlcnksXG4gICAgICBjYXB0dXJlUG9saWN5OiBvcHRzPy5jYXB0dXJlUG9saWN5LFxuICAgICAgaG9va3M6IG9wdHM/Lmhvb2tzLFxuICAgIH0pO1xuICAgIHRoaXMuZHJpdmVyID0gbmV3IEZsdXNoRHJpdmVyKHtcbiAgICAgIGRlcHRoOiAoKSA9PiB0aGlzLnF1ZXVlLmRlcHRoLFxuICAgICAgcHJvY2Vzc05leHQ6ICgpID0+IHRoaXMuZGVsaXZlck5leHQoKSxcbiAgICAgIGZsdXNoQnVkZ2V0TXM6IG9wdHM/LmZsdXNoQnVkZ2V0TXMsXG4gICAgICBub3c6IG9wdHM/Lm5vdyxcbiAgICAgIHNjaGVkdWxlOiBvcHRzPy5zY2hlZHVsZSxcbiAgICAgIG9uRmx1c2hTdGFydDogKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHN0YXRzIG9mIHRoaXMubGlzdGVuZXJTdGF0cy52YWx1ZXMoKSkgc3RhdHMubGFzdEZsdXNoTXMgPSAwO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBJZGVtcG90ZW50IGJ5IGlkIOKAlCBzYW1lIGlkIHJlcGxhY2VzIChzdGF0cyBjb250aW51ZSksIGlkcyBjb2V4aXN0LiAqL1xuICBhZGRMaXN0ZW5lcihpZDogc3RyaW5nLCBsaXN0ZW5lcjogRGVmZXJyZWRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbGlzdGVuZXIpO1xuICAgIGlmICghdGhpcy5saXN0ZW5lclN0YXRzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJTdGF0cy5zZXQoaWQsIHsgZXZlbnRzOiAwLCB0b3RhbE1zOiAwLCBsYXN0Rmx1c2hNczogMCB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RvcCBkZWxpdmVyaW5nIHRvIGBpZGAuIEFjY3VtdWxhdGVkIHN0YXRzIGFyZSBrZXB0IGZvciByZXBvcnRzLiAqL1xuICByZW1vdmVMaXN0ZW5lcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlciBlbnRyeSBwb2ludDogY2FwdHVyZSB0aGUgZXZlbnQgKHNlcS1zdGFtcGVkLCBwYXlsb2FkIHBlclxuICAgKiBwb2xpY3kpIGFuZCBzdGFnZSBpdCBmb3IgdGhlIG5leHQgY2hlY2twb2ludC4gQ2hlYXA7IE5FVkVSIHRocm93cztcbiAgICogbmV2ZXIgYmxvY2tzIOKAlCBleGNlcHQgdW5kZXIgYCdibG9jaydgIG92ZXJmbG93LCB3aGVyZSBhIHJlZnVzZWRcbiAgICogZW5xdWV1ZSBpcyBkZWxpdmVyZWQgc3luY2hyb25vdXNseSBpbmxpbmUgKGV4cGxpY2l0IGNvbnN1bWVyIGNob2ljZSkuXG4gICAqL1xuICBjYXB0dXJlKGlucHV0OiBFbnF1ZXVlSW5wdXQsIHBvbGljeT86IENhcHR1cmVQb2xpY3kpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnF1ZXVlLmVucXVldWUoaW5wdXQsIHBvbGljeSk7XG4gICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAncXVldWVkJykge1xuICAgICAgdGhpcy5kcml2ZXIuYXJtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQub3V0Y29tZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMuaW5saW5lRGVsaXZlcmllcyArPSAxO1xuICAgICAgdGhpcy5kZWxpdmVyKHJlc3VsdC5lbnZlbG9wZSk7XG4gICAgfVxuICAgIC8vICdkcm9wcGVkJzogY291bnRlZCBieSB0aGUgcXVldWU7IGxvc3Mgc3VyZmFjZXMgaW4gc3RhdHMgKyBzZXEgZ2Fwcy5cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXJtaW5hbCBmbHVzaCDigJQgc3luY2hyb25vdXNseSBkZWxpdmVyIGV2ZXJ5dGhpbmcgcXVldWVkIChlbmQgb2YgcnVuIC9cbiAgICogc2h1dGRvd24pLiBBc3luYyBsaXN0ZW5lciBjb250aW51YXRpb25zIGFyZSBOT1QgYXdhaXRlZDsgZm9sbG93IHdpdGhcbiAgICogYGRyYWluKClgIGZvciB0aGF0LlxuICAgKi9cbiAgZmx1c2hOb3cob3B0cz86IHsgbWF4Um91bmRzPzogbnVtYmVyIH0pOiBGbHVzaFN5bmNSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRyaXZlci5mbHVzaFN5bmMob3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGJhY2tsb2csIHRoZW4gc2V0dGxlIGFsbCBpbmZsaWdodCBhc3luYyBjb250aW51YXRpb25zIOKAlFxuICAgKiBgUHJvbWlzZS5hbGxTZXR0bGVkYCB1bmRlciBhIGRlYWRsaW5lLCBzaGFwZWQgbGlrZSBgZmx1c2hBbGxEZXRhY2hlZGAuXG4gICAqIExvb3BzIHdoaWxlIGNvbnRpbnVhdGlvbnMgc3Bhd24gbmV3IGNhcHR1cmVzLCB1bnRpbCBxdWllc2NlbnQgb3IgdGhlXG4gICAqIGRlYWRsaW5lIGV4cGlyZXMuXG4gICAqL1xuICBhc3luYyBkcmFpbihvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8RHJhaW5SZXN1bHQ+IHtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRzPy50aW1lb3V0TXMgPz8gMzBfMDAwO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgbGV0IGRvbmUgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgdGhpcy5mbHVzaE5vdygpO1xuICAgIHdoaWxlICh0aGlzLmluZmxpZ2h0LnNpemUgPiAwKSB7XG4gICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXRNcyAtIChEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICAgIGlmIChyZW1haW5pbmdNcyA8PSAwKSByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHRoaXMuaW5mbGlnaHQuc2l6ZSArIHRoaXMucXVldWUuZGVwdGggfTtcblxuICAgICAgY29uc3QgYmF0Y2ggPSBbLi4udGhpcy5pbmZsaWdodF07XG4gICAgICBsZXQgdGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPCdfX2RyYWluX3RpbWVvdXRfXyc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoJ19fZHJhaW5fdGltZW91dF9fJyksIHJlbWFpbmluZ01zKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UucmFjZShbUHJvbWlzZS5hbGxTZXR0bGVkKGJhdGNoKSwgdGltZW91dFByb21pc2VdKTtcbiAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIGlmIChzZXR0bGVkID09PSAnX19kcmFpbl90aW1lb3V0X18nKSB7XG4gICAgICAgIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogdGhpcy5pbmZsaWdodC5zaXplICsgdGhpcy5xdWV1ZS5kZXB0aCB9O1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCByIG9mIHNldHRsZWQpIHtcbiAgICAgICAgLy8gVHJhY2tlZCBwcm9taXNlcyBuZXZlciByZWplY3Qg4oCUIHRoZXkgcmVzb2x2ZSB0cnVlIChvaykgLyBmYWxzZS5cbiAgICAgICAgaWYgKHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByLnZhbHVlID09PSBmYWxzZSkgZmFpbGVkICs9IDE7XG4gICAgICAgIGVsc2UgZG9uZSArPSAxO1xuICAgICAgfVxuICAgICAgLy8gQ29udGludWF0aW9ucyBtYXkgaGF2ZSBjYXB0dXJlZCBtb3JlIGV2ZW50cyDigJQgZmx1c2ggYW5kIHJlLWNoZWNrLlxuICAgICAgdGhpcy5mbHVzaE5vdygpO1xuICAgIH1cbiAgICByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHRoaXMucXVldWUuZGVwdGggfTtcbiAgfVxuXG4gIC8qKiBBNCDigJQgdGhlIHN0YXRzIG9iamVjdCBCbG9jayA5IGNvbnN1bWVzLiBQdXJlIGdldHRlciwgZnJlc2ggc25hcHNob3QuICovXG4gIGdldFN0YXRzKCk6IERpc3BhdGNoZXJTdGF0cyB7XG4gICAgY29uc3QgY291bnRlcnMgPSB0aGlzLnF1ZXVlLmdldENvdW50ZXJzKCk7XG4gICAgY29uc3QgZHJpdmVyU3RhdHMgPSB0aGlzLmRyaXZlci5nZXRTdGF0cygpO1xuICAgIGNvbnN0IHBlckxpc3RlbmVyOiBSZWNvcmQ8c3RyaW5nLCBMaXN0ZW5lclN0YXRzPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2lkLCBzdGF0c10gb2YgdGhpcy5saXN0ZW5lclN0YXRzKSB7XG4gICAgICBwZXJMaXN0ZW5lcltpZF0gPSB7IGV2ZW50czogc3RhdHMuZXZlbnRzLCB0b3RhbE1zOiBzdGF0cy50b3RhbE1zLCBsYXN0Rmx1c2hNczogc3RhdHMubGFzdEZsdXNoTXMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcHRoOiB0aGlzLnF1ZXVlLmRlcHRoLFxuICAgICAgZHJvcHM6IGNvdW50ZXJzLmRyb3BzLFxuICAgICAgZmx1c2hlczogZHJpdmVyU3RhdHMuZmx1c2hlcyxcbiAgICAgIGJ1ZGdldEV4aGF1c3RlZDogZHJpdmVyU3RhdHMuYnVkZ2V0RXhoYXVzdGVkLFxuICAgICAgcDk1Rmx1c2hNczogZHJpdmVyU3RhdHMucDk1Rmx1c2hNcyxcbiAgICAgIGlubGluZURlbGl2ZXJpZXM6IHRoaXMuaW5saW5lRGVsaXZlcmllcyxcbiAgICAgIGluZmxpZ2h0OiB0aGlzLmluZmxpZ2h0LnNpemUsXG4gICAgICBwZXJMaXN0ZW5lcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxpdmVyTmV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICBpZiAoZW52ZWxvcGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuZGVsaXZlcihlbnZlbG9wZSk7XG4gIH1cblxuICAvKiogSW52b2tlIGV2ZXJ5IGxpc3RlbmVyIHdpdGggZnVsbCBlcnJvciBpc29sYXRpb24gKyB0aW1lIGFjY291bnRpbmcuICovXG4gIHByaXZhdGUgZGVsaXZlcihlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbaWQsIGxpc3RlbmVyXSBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmxpc3RlbmVyU3RhdHMuZ2V0KGlkKSBhcyBNdXRhYmxlTGlzdGVuZXJTdGF0cztcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5ub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGxpc3RlbmVyKGVudmVsb3BlKTtcbiAgICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkgdGhpcy50cmFjayhyZXN1bHQsIGlkLCBlbnZlbG9wZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnNhZmVPbkVycm9yKGVycm9yLCB7IGxpc3RlbmVySWQ6IGlkLCBlbnZlbG9wZSwgcGhhc2U6ICdzeW5jJyB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aGlzLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIHN0YXRzLmV2ZW50cyArPSAxO1xuICAgICAgICBzdGF0cy50b3RhbE1zICs9IGVsYXBzZWQ7XG4gICAgICAgIHN0YXRzLmxhc3RGbHVzaE1zICs9IGVsYXBzZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFRyYWNrIGFuIGFzeW5jIGNvbnRpbnVhdGlvbjsgcm91dGUgaXRzIHJlamVjdGlvbjsgbmV2ZXIgcmVqZWN0LiAqL1xuICBwcml2YXRlIHRyYWNrKHByb21pc2U6IFByb21pc2U8dm9pZD4sIGxpc3RlbmVySWQ6IHN0cmluZywgZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNrZWQ6IFByb21pc2U8Ym9vbGVhbj4gPSBwcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2FmZU9uRXJyb3IoZXJyb3IsIHsgbGlzdGVuZXJJZCwgZW52ZWxvcGUsIHBoYXNlOiAnYXN5bmMnIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5pbmZsaWdodC5hZGQodHJhY2tlZCk7XG4gICAgLy8gU2VsZi1jbGVhbnVwIOKAlCBgdHJhY2tlZGAgbmV2ZXIgcmVqZWN0cywgc28gdGhpcyBjaGFpbiBjYW5ub3QgZmxvYXQgYW5cbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgIHRyYWNrZWQudGhlbigoKSA9PiB0aGlzLmluZmxpZ2h0LmRlbGV0ZSh0cmFja2VkKSk7XG4gIH1cblxuICAvKiogVGhlIGVycm9yIHNpbmsgbXVzdCBuZXZlciBiZWNvbWUgYW4gZXJyb3Igc291cmNlLiAqL1xuICBwcml2YXRlIHNhZmVPbkVycm9yKGVycm9yOiB1bmtub3duLCBjb250ZXh0OiBEaXNwYXRjaEVycm9yQ29udGV4dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uRXJyb3I/LihlcnJvciwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCBpc29sYXRpb24gaXMgYWJzb2x1dGUuXG4gICAgfVxuICB9XG59XG4iXX0=
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXJyZWREaXNwYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9vYnNlcnZlci1xdWV1ZS9kZWZlcnJlZERpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUdILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQXdCLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBcUIsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUF3RmxFLE1BQU0sVUFBVSxHQUFHLEdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBRXZHLFNBQVMsVUFBVSxDQUFDLEtBQTJCO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBUSxLQUF1QixDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7QUFDNUcsQ0FBQztBQUVELE1BQU0sT0FBTyxrQkFBa0I7SUFDWixLQUFLLENBQWM7SUFDbkIsTUFBTSxDQUFjO0lBQ3BCLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztJQUNoRCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDekUsNEVBQTRFO0lBQzNELFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUN2QyxPQUFPLENBQXdCO0lBQy9CLEdBQUcsQ0FBZTtJQUMzQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFN0IsWUFBWSxJQUFnQztRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFB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QUM7SUFDSCxDQUFDO0lBRUQsc0VBQXNFO0lBQzlELEtBQUssQ0FBQyxPQUFzQixFQUFFLFVBQWtCLEVBQUUsUUFBeUI7UUFDakYsTUFBTSxPQUFPLEdBQXFCLE9BQU8sQ0FBQyxJQUFJLENBQzVDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFDVixDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQix3RUFBd0U7UUFDeEUsdUJBQXVCO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0RBQXdEO0lBQ2hELFdBQVcsQ0FBQyxLQUFjLEVBQUUsT0FBNkI7UUFDL0QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsbUNBQW1DO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG9ic2VydmVyLXF1ZXVlL2RlZmVycmVkRGlzcGF0Y2hlci50cyDigJQgUkZDLTAwMSBCbG9jayA1OiBkZWZlcnJlZCBkZWxpdmVyeSBmYcOnYWRlLlxuICpcbiAqIFBhdHRlcm46ICBjYXB0dXJlIOKGkiBlbnF1ZXVlIOKGkiAobWljcm90YXNrKSBmbHVzaCDihpIgaW52b2tlLCB3aXRoIHBlci1saXN0ZW5lclxuICogICAgICAgICAgIGVycm9yIGlzb2xhdGlvbi4gQ29tcG9zZXMgdGhlIHdob2xlIHB1cmUgcGlwZWxpbmU6IE1lcmdlZFF1ZXVlXG4gKiAgICAgICAgICAgKEJsb2NrIDMsIHdoaWNoIGNhcHR1cmVzIHZpYSBCbG9jayAxKSArIEZsdXNoRHJpdmVyIChCbG9jayA0KSArXG4gKiAgICAgICAgICAgYSBsaXN0ZW5lciByZWdpc3RyeSB3aXRoIHRpbWluZy9pbmZsaWdodCBhY2NvdW50aW5nLlxuICogUm9sZTogICAgIFRoZSBwaXBlbGluZSBoZWxkIGJ5IGBydW5uZXIvRGVmZXJyZWRPYnNlcnZlclRpZXIudHMgwrcgRGVmZXJyZWRPYnNlcnZlclRpZXJgLlxuICogICAgICAgICAgIFByb2R1Y2VycyBjYWxsIGBjYXB0dXJlKClgOyBsaXN0ZW5lcnNcbiAqICAgICAgICAgICByZWNlaXZlIGVudmVsb3BlcyBhdCB0aGUgbmV4dCBjaGVja3BvaW50LCBcIm9uZSBiZWF0IGJlaGluZFwiLlxuICogICAgICAgICAgIFB1cmUgbW9kdWxlIOKAlCB6ZXJvIGVuZ2luZSBpbXBvcnRzLiBCZXNpZGUgdGhlIGNhcHR1cmVcbiAqICAgICAgICAgICBlbnZlbG9wZSdzIHR5cGVzLCBpdCBpbXBvcnRzIG9ubHkgdGhlIEwwIGxvbmctdGltZXIgbGVhZlxuICogICAgICAgICAgIChgdGltZXJzL2xvbmdUaW1lb3V0LnRzYCksIHdoaWNoIGFybXMgYGRyYWluYCdzIGRlYWRsaW5lLlxuICpcbiAqIERlbGl2ZXJ5IHNlbWFudGljcyAobm9ybWF0aXZlLCBSRkMtMDAxIMKnNSArIGFtZW5kbWVudHMgQTIvQTQpOlxuICogICAtIFBlci1saXN0ZW5lciBGSUZPOiBldmVyeSBsaXN0ZW5lciBzZWVzIGVudmVsb3BlcyBpbiBzZXEgb3JkZXJcbiAqICAgICAoaW52b2NhdGlvbiBvcmRlcjsgYW4gYXN5bmMgbGlzdGVuZXIncyBDT01QTEVUSU9OIG9yZGVyIGlzIGl0cyBvd25cbiAqICAgICBjb25jZXJuKSDigJQgRVhDRVBUIHVuZGVyIGAnYmxvY2snYCBvdmVyZmxvdywgd2hlcmUgYSByZWZ1c2VkIGVucXVldWVcbiAqICAgICBpcyBkZWxpdmVyZWQgaW5saW5lIGFuZCBvdmVydGFrZXMgdGhlIHF1ZXVlZCBiYWNrbG9nLiBgc2VxYCBhbHdheXNcbiAqICAgICByZWNvcmRzIHRydWUgYXJyaXZhbCBvcmRlciwgc28gb3JkZXItc2Vuc2l0aXZlIGNvbnN1bWVycyByZS1zb3J0O1xuICogICAgIHNlZSB0aGUgYCdibG9jaydgIGNhdmVhdCBiZWxvdy5cbiAqICAgLSBFcnJvciBpc29sYXRpb246IGEgdGhyb3dpbmcgbGlzdGVuZXIgKHN5bmMpIG9yIHJlamVjdGluZyBsaXN0ZW5lclxuICogICAgIChhc3luYykgbmV2ZXIgYWZmZWN0cyBzaWJsaW5ncyBvciB0aGUgcHJvZHVjZXIuIEJvdGggZmFpbHVyZSBtb2Rlc1xuICogICAgIHJvdXRlIHRvIHRoZSBpbmplY3RlZCBgb25FcnJvcmA7IGEgdGhyb3dpbmcgYG9uRXJyb3JgIGlzIGl0c2VsZlxuICogICAgIHN3YWxsb3dlZC5cbiAqICAgLSBUaGUgZmx1c2ggTkVWRVIgYXdhaXRzIGEgbGlzdGVuZXIuIEFzeW5jIGNvbnRpbnVhdGlvbnMgYXJlIHRyYWNrZWQgaW5cbiAqICAgICBhbiBpbmZsaWdodCBzZXQ7IGBkcmFpbih7IHRpbWVvdXRNcyB9KWAgc2V0dGxlcyB0aGVtXG4gKiAgICAgKGBQcm9taXNlLmFsbFNldHRsZWRgICsgZGVhZGxpbmUsIHNoYXBlZCBsaWtlIGBmbHVzaEFsbERldGFjaGVkYCkuXG4gKiAgIC0gYCdibG9jaydgIG92ZXJmbG93OiBhIHJlZnVzZWQgZW5xdWV1ZSBpcyBkZWxpdmVyZWQgc3luY2hyb25vdXNseVxuICogICAgIElOTElORSBmcm9tIGBjYXB0dXJlKClgIOKAlCByZS1pbnRyb2R1Y2luZyBibG9ja2luZyBkZWxpdmVyeSBieSB0aGVcbiAqICAgICBjb25zdW1lcidzIGV4cGxpY2l0IGNob2ljZS4gT3JkZXJpbmcgY2F2ZWF0IChkb2N1bWVudGVkICsgdGVzdGVkKTogYW5cbiAqICAgICBpbmxpbmUgZXZlbnQgb3ZlcnRha2VzIHRoZSBxdWV1ZWQgYmFja2xvZyDigJQgYCdibG9jaydgIHRyYWRlcyBnbG9iYWxcbiAqICAgICBvcmRlcmluZyBmb3IgemVybyBsb3NzIGFuZCBib3VuZGVkIG1lbW9yeS4gYHNlcWAgc3RpbGwgdGVsbHMgdGhlXG4gKiAgICAgdHJ1ZSBhcnJpdmFsIG9yZGVyLlxuICogICAtIExpc3RlbmVyIHJlZ2lzdHJ5IGlzIGlkZW1wb3RlbnQgYnkgaWQgKHNhbWUgaWQgcmVwbGFjZXMsIGRpZmZlcmVudFxuICogICAgIGlkcyBjb2V4aXN0KSDigJQgbWlycm9ycyB0aGUgcmVwby13aWRlIHJlY29yZGVyIElEIGNvbnRyYWN0LiBTdGF0c1xuICogICAgIGFjY3VtdWxhdGUgcGVyIGlkIGFjcm9zcyByZXBsYWNlbWVudDsgYHJlbW92ZUxpc3RlbmVyYCBrZWVwcyB0aGVcbiAqICAgICBpZCdzIGFjY3VtdWxhdGVkIHN0YXRzIGZvciBwb3N0LXJ1biByZXBvcnRzLlxuICogICAtIEV2ZW50cyBjYXB0dXJlZCBCRUZPUkUgYW55IGxpc3RlbmVyIGF0dGFjaGVzIHN0YXkgcXVldWVkIOKAlCBhIGxpc3RlbmVyXG4gKiAgICAgYXR0YWNoZWQgYmVmb3JlIHRoZSBuZXh0IGNoZWNrcG9pbnQgc3RpbGwgcmVjZWl2ZXMgdGhlIGJhY2tsb2cuXG4gKlxuICogUGVyLWxpc3RlbmVyIHRpbWUgYWNjb3VudGluZyAoYW1lbmRtZW50IEEyIOKAlCBcIm5hbWUgdGhlIGhvZ1wiKTogY3VtdWxhdGl2ZVxuICogYHRvdGFsTXNgIGFuZCBwZXItY2hlY2twb2ludCBgbGFzdEZsdXNoTXNgIG9mIFNZTkMgdGltZSBwZXIgbGlzdGVuZXIgaWQg4oCUXG4gKiB0aGUgdGltZSB0aGF0IGFjdHVhbGx5IGJsb2NrcyB0aGUgZmx1c2guIEFuIGFzeW5jIGxpc3RlbmVyJ3MgY29udGludWF0aW9uXG4gKiB0aW1lIGlzIGludGVudGlvbmFsbHkgbm90IGF0dHJpYnV0ZWQgKGl0IGRvZXMgbm90IGJsb2NrIGRlbGl2ZXJ5KS5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENhcHR1cmVFbnZlbG9wZSwgdHlwZSBDYXB0dXJlSG9va3MsIHR5cGUgQ2FwdHVyZVBvbGljeSB9IGZyb20gJy4uL2NhcHR1cmUvZW52ZWxvcGUuanMnO1xuaW1wb3J0IHsgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuLi90aW1lcnMvbG9uZ1RpbWVvdXQuanMnO1xuaW1wb3J0IHsgdHlwZSBGbHVzaFN5bmNSZXN1bHQsIEZsdXNoRHJpdmVyIH0gZnJvbSAnLi9mbHVzaERyaXZlci5qcyc7XG5pbXBvcnQgeyB0eXBlIEVucXVldWVJbnB1dCwgTWVyZ2VkUXVldWUgfSBmcm9tICcuL21lcmdlZFF1ZXVlLmpzJztcbmltcG9ydCB7IHR5cGUgT3ZlcmZsb3dQb2xpY3kgfSBmcm9tICcuL3JpbmcuanMnO1xuXG4vKipcbiAqIE9uZSBkZWZlcnJlZCBvYnNlcnZlci4gTWF5IHJldHVybiBhIFByb21pc2Ug4oCUIHRoZSBkaXNwYXRjaGVyIHRyYWNrcyBpdCBpblxuICogdGhlIGluZmxpZ2h0IHNldCBidXQgTkVWRVIgYXdhaXRzIGl0IGR1cmluZyBhIGZsdXNoLlxuICovXG5leHBvcnQgdHlwZSBEZWZlcnJlZExpc3RlbmVyID0gKGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGUpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoRXJyb3JDb250ZXh0IHtcbiAgcmVhZG9ubHkgbGlzdGVuZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlO1xuICAvKiogYCdzeW5jJ2AgPSBsaXN0ZW5lciB0aHJldzsgYCdhc3luYydgID0gcmV0dXJuZWQgcHJvbWlzZSByZWplY3RlZC4gKi9cbiAgcmVhZG9ubHkgcGhhc2U6ICdzeW5jJyB8ICdhc3luYyc7XG59XG5cbi8qKiBJbmplY3RlZCBlcnJvciBzaW5rIOKAlCB0aGUgd2lyaW5nIGxheWVyIHJvdXRlcyB0aGVzZSAoQmxvY2sgNikuICovXG5leHBvcnQgdHlwZSBEaXNwYXRjaEVycm9ySGFuZGxlciA9IChlcnJvcjogdW5rbm93biwgY29udGV4dDogRGlzcGF0Y2hFcnJvckNvbnRleHQpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmZXJyZWREaXNwYXRjaGVyT3B0aW9ucyB7XG4gIC8qKiBRdWV1ZSBib3VuZCDigJQgZGVmYXVsdCAxMCAwMDAgKHNlZSBgTWVyZ2VkUXVldWVgKS4gKi9cbiAgcmVhZG9ubHkgbWF4UXVldWU/OiBudW1iZXI7XG4gIC8qKiBPdmVyZmxvdyBwb2xpY3kg4oCUIGRlZmF1bHQgYCdkcm9wLW9sZGVzdCdgLiAqL1xuICByZWFkb25seSBvdmVyZmxvdz86IE92ZXJmbG93UG9saWN5O1xuICAvKiogYCdzYW1wbGUnYCBvdmVyZmxvdyBvbmx5IOKAlCBhZG1pdCAxIGluIHRoaXMgbWFueSBzYXR1cmF0ZWQgYXJyaXZhbHMuICovXG4gIHJlYWRvbmx5IHNhbXBsZUV2ZXJ5PzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCBjYXB0dXJlIHBvbGljeSDigJQgZGVmYXVsdCBgJ3N1bW1hcnknYC4gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZVBvbGljeT86IENhcHR1cmVQb2xpY3k7XG4gIC8qKiBQZXItZmx1c2ggdGltZSBidWRnZXQsIG1zIChBMSkg4oCUIGRlZmF1bHQgMjsgYEluZmluaXR5YCA9IGZ1bGwgZHJhaW4uICovXG4gIHJlYWRvbmx5IGZsdXNoQnVkZ2V0TXM/OiBudW1iZXI7XG4gIC8qKiBMaXN0ZW5lci1mYWlsdXJlIHNpbmsuIE5vIGRlZmF1bHQg4oCUIHdpdGhvdXQgaXQsIGZhaWx1cmVzIGFyZSBzaWxlbnQuICovXG4gIHJlYWRvbmx5IG9uRXJyb3I/OiBEaXNwYXRjaEVycm9ySGFuZGxlcjtcbiAgLyoqIENhcHR1cmUgc2VhbXMgKGRldi13YXJuLCBjYXB0dXJlZEF0IGNsb2NrKSDigJQgc2VlIGBDYXB0dXJlSG9va3NgLiAqL1xuICByZWFkb25seSBob29rcz86IENhcHR1cmVIb29rcztcbiAgLyoqIFRpbWluZyBjbG9jayBmb3IgYnVkZ2V0ICsgcGVyLWxpc3RlbmVyIGFjY291bnRpbmcuIEluamVjdGFibGUuICovXG4gIHJlYWRvbmx5IG5vdz86ICgpID0+IG51bWJlcjtcbiAgLyoqIENoZWNrcG9pbnQgcHJpbWl0aXZlIOKAlCBkZWZhdWx0IGBxdWV1ZU1pY3JvdGFza2AuIEluamVjdGFibGUuICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogKGNiOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xufVxuXG4vKiogUGVyLWxpc3RlbmVyIGFjY291bnRpbmcgKEEyL0E0KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXJTdGF0cyB7XG4gIC8qKiBFbnZlbG9wZXMgZGVsaXZlcmVkIChpbnZvY2F0aW9ucywgaW5jbHVkaW5nIG9uZXMgdGhhdCB0aHJldykuICovXG4gIHJlYWRvbmx5IGV2ZW50czogbnVtYmVyO1xuICAvKiogQ3VtdWxhdGl2ZSBzeW5jIGRlbGl2ZXJ5IHRpbWUsIG1zLiAqL1xuICByZWFkb25seSB0b3RhbE1zOiBudW1iZXI7XG4gIC8qKiBTeW5jIGRlbGl2ZXJ5IHRpbWUgc2luY2UgdGhlIGxhc3QgZmx1c2ggc3RhcnRlZCwgbXMuICovXG4gIHJlYWRvbmx5IGxhc3RGbHVzaE1zOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgQmxvY2sgOSBvYnNlcnZhYmlsaXR5IHN1cmZhY2UgKGFtZW5kbWVudCBBNCkg4oCUIHB1cmUgZ2V0dGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaGVyU3RhdHMge1xuICAvKiogQ3VycmVudCBiYWNrbG9nLiAqL1xuICByZWFkb25seSBkZXB0aDogbnVtYmVyO1xuICAvKiogRXZlbnRzIExPU1QgKG92ZXJmbG93KSDigJQgbmV2ZXIgc2lsZW50OyBhbHNvIHZpc2libGUgYXMgc2VxIGdhcHMuICovXG4gIHJlYWRvbmx5IGRyb3BzOiBudW1iZXI7XG4gIC8qKiBDb21wbGV0ZWQgY2hlY2twb2ludCBmbHVzaGVzLiAqL1xuICByZWFkb25seSBmbHVzaGVzOiBudW1iZXI7XG4gIC8qKiBGbHVzaGVzIGN1dCBzaG9ydCBieSBgZmx1c2hCdWRnZXRNc2AgKEExKS4gKi9cbiAgcmVhZG9ubHkgYnVkZ2V0RXhoYXVzdGVkOiBudW1iZXI7XG4gIC8qKiBwOTUgZmx1c2ggZHVyYXRpb24sIG1zIChyb2xsaW5nIHdpbmRvdykuICovXG4gIHJlYWRvbmx5IHA5NUZsdXNoTXM6IG51bWJlcjtcbiAgLyoqIGAnYmxvY2snYC1wb2xpY3kgcmVmdXNhbHMgZGVsaXZlcmVkIHN5bmNocm9ub3VzbHkgaW5saW5lLiAqL1xuICByZWFkb25seSBpbmxpbmVEZWxpdmVyaWVzOiBudW1iZXI7XG4gIC8qKiBBc3luYyBsaXN0ZW5lciBjb250aW51YXRpb25zIG5vdCB5ZXQgc2V0dGxlZC4gKi9cbiAgcmVhZG9ubHkgaW5mbGlnaHQ6IG51bWJlcjtcbiAgLyoqIFBlci1saXN0ZW5lciB0aW1lIGFjY291bnRpbmcg4oCUIFwibmFtZSB0aGUgaG9nXCIgKEEyKS4gKi9cbiAgcmVhZG9ubHkgcGVyTGlzdGVuZXI6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIExpc3RlbmVyU3RhdHM+Pjtcbn1cblxuLyoqIFJlc3VsdCBvZiB7QGxpbmsgRGVmZXJyZWREaXNwYXRjaGVyLmRyYWlufSDigJQgYGZsdXNoQWxsRGV0YWNoZWRgIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcmFpblJlc3VsdCB7XG4gIC8qKiBBc3luYyBjb250aW51YXRpb25zIHNlZW4gc2V0dGxpbmcgZnVsZmlsbGVkLiBCZXN0LWVmZm9ydCBjb3VudCDigJQgYVxuICAgKiAgY29udGludWF0aW9uIHRoYXQgc2V0dGxlcyBiZXR3ZWVuIGNoZWNrcyBpcyBkcmFpbmVkIGJ1dCBtYXkgbm90IGJlXG4gICAqICBjb3VudGVkIChzYW1lIHNlbWFudGljcyBhcyBgZmx1c2hBbGxEZXRhY2hlZGApLiAqL1xuICByZWFkb25seSBkb25lOiBudW1iZXI7XG4gIC8qKiBDb250aW51YXRpb25zIHdob3NlIGxpc3RlbmVyIHByb21pc2UgcmVqZWN0ZWQgKHJvdXRlZCB0byBvbkVycm9yKS4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBTdGlsbCBpbiBmbGlnaHQgKG9yIHF1ZXVlZCkgd2hlbiB0aGUgZGVhZGxpbmUgZXhwaXJlZC4gYDBgID0gZHJhaW5lZC4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgTXV0YWJsZUxpc3RlbmVyU3RhdHMge1xuICBldmVudHM6IG51bWJlcjtcbiAgdG90YWxNczogbnVtYmVyO1xuICBsYXN0Rmx1c2hNczogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0Tm93ID0gKCk6IG51bWJlciA9PiAodHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyA/IHBlcmZvcm1hbmNlLm5vdygpIDogRGF0ZS5ub3coKSk7XG5cbmZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWU6IHZvaWQgfCBQcm9taXNlPHZvaWQ+KTogdmFsdWUgaXMgUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiAodmFsdWUgYXMgUHJvbWlzZTx2b2lkPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNsYXNzIERlZmVycmVkRGlzcGF0Y2hlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IE1lcmdlZFF1ZXVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyaXZlcjogRmx1c2hEcml2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIERlZmVycmVkTGlzdGVuZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBNdXRhYmxlTGlzdGVuZXJTdGF0cz4oKTtcbiAgLyoqIFRyYWNrZWQgYXN5bmMgY29udGludWF0aW9ucyDigJQgcmVzb2x2ZSBgdHJ1ZWAgKG9rKSAvIGBmYWxzZWAgKGZhaWxlZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5mbGlnaHQgPSBuZXcgU2V0PFByb21pc2U8Ym9vbGVhbj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FcnJvcj86IERpc3BhdGNoRXJyb3JIYW5kbGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIGlubGluZURlbGl2ZXJpZXMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM/OiBEZWZlcnJlZERpc3BhdGNoZXJPcHRpb25zKSB7XG4gICAgdGhpcy5vbkVycm9yID0gb3B0cz8ub25FcnJvcjtcbiAgICB0aGlzLm5vdyA9IG9wdHM/Lm5vdyA/PyBkZWZhdWx0Tm93O1xuICAgIHRoaXMucXVldWUgPSBuZXcgTWVyZ2VkUXVldWUoe1xuICAgICAgbWF4UXVldWU6IG9wdHM/Lm1heFF1ZXVlLFxuICAgICAgb3ZlcmZsb3c6IG9wdHM/Lm92ZXJmbG93LFxuICAgICAgc2FtcGxlRXZlcnk6IG9wdHM/LnNhbXBsZUV2ZXJ5LFxuICAgICAgY2FwdHVyZVBvbGljeTogb3B0cz8uY2FwdHVyZVBvbGljeSxcbiAgICAgIGhvb2tzOiBvcHRzPy5ob29rcyxcbiAgICB9KTtcbiAgICB0aGlzLmRyaXZlciA9IG5ldyBGbHVzaERyaXZlcih7XG4gICAgICBkZXB0aDogKCkgPT4gdGhpcy5xdWV1ZS5kZXB0aCxcbiAgICAgIHByb2Nlc3NOZXh0OiAoKSA9PiB0aGlzLmRlbGl2ZXJOZXh0KCksXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRzPy5mbHVzaEJ1ZGdldE1zLFxuICAgICAgbm93OiBvcHRzPy5ub3csXG4gICAgICBzY2hlZHVsZTogb3B0cz8uc2NoZWR1bGUsXG4gICAgICBvbkZsdXNoU3RhcnQ6ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzdGF0cyBvZiB0aGlzLmxpc3RlbmVyU3RhdHMudmFsdWVzKCkpIHN0YXRzLmxhc3RGbHVzaE1zID0gMDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogSWRlbXBvdGVudCBieSBpZCDigJQgc2FtZSBpZCByZXBsYWNlcyAoc3RhdHMgY29udGludWUpLCBpZHMgY29leGlzdC4gKi9cbiAgYWRkTGlzdGVuZXIoaWQ6IHN0cmluZywgbGlzdGVuZXI6IERlZmVycmVkTGlzdGVuZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVycy5zZXQoaWQsIGxpc3RlbmVyKTtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJTdGF0cy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyU3RhdHMuc2V0KGlkLCB7IGV2ZW50czogMCwgdG90YWxNczogMCwgbGFzdEZsdXNoTXM6IDAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0b3AgZGVsaXZlcmluZyB0byBgaWRgLiBBY2N1bXVsYXRlZCBzdGF0cyBhcmUga2VwdCBmb3IgcmVwb3J0cy4gKi9cbiAgcmVtb3ZlTGlzdGVuZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShpZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZHVjZXIgZW50cnkgcG9pbnQ6IGNhcHR1cmUgdGhlIGV2ZW50IChzZXEtc3RhbXBlZCwgcGF5bG9hZCBwZXJcbiAgICogcG9saWN5KSBhbmQgc3RhZ2UgaXQgZm9yIHRoZSBuZXh0IGNoZWNrcG9pbnQuIENoZWFwOyBORVZFUiB0aHJvd3M7XG4gICAqIG5ldmVyIGJsb2NrcyDigJQgZXhjZXB0IHVuZGVyIGAnYmxvY2snYCBvdmVyZmxvdywgd2hlcmUgYSByZWZ1c2VkXG4gICAqIGVucXVldWUgaXMgZGVsaXZlcmVkIHN5bmNocm9ub3VzbHkgaW5saW5lIChleHBsaWNpdCBjb25zdW1lciBjaG9pY2UpLlxuICAgKi9cbiAgY2FwdHVyZShpbnB1dDogRW5xdWV1ZUlucHV0LCBwb2xpY3k/OiBDYXB0dXJlUG9saWN5KTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5xdWV1ZS5lbnF1ZXVlKGlucHV0LCBwb2xpY3kpO1xuICAgIGlmIChyZXN1bHQub3V0Y29tZSA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgIHRoaXMuZHJpdmVyLmFybSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lm91dGNvbWUgPT09ICdpbmxpbmUnKSB7XG4gICAgICB0aGlzLmlubGluZURlbGl2ZXJpZXMgKz0gMTtcbiAgICAgIHRoaXMuZGVsaXZlcihyZXN1bHQuZW52ZWxvcGUpO1xuICAgIH1cbiAgICAvLyAnZHJvcHBlZCc6IGNvdW50ZWQgYnkgdGhlIHF1ZXVlOyBsb3NzIHN1cmZhY2VzIGluIHN0YXRzICsgc2VxIGdhcHMuXG4gIH1cblxuICAvKipcbiAgICogVGVybWluYWwgZmx1c2gg4oCUIHN5bmNocm9ub3VzbHkgZGVsaXZlciBldmVyeXRoaW5nIHF1ZXVlZCAoZW5kIG9mIHJ1biAvXG4gICAqIHNodXRkb3duKS4gQXN5bmMgbGlzdGVuZXIgY29udGludWF0aW9ucyBhcmUgTk9UIGF3YWl0ZWQ7IGZvbGxvdyB3aXRoXG4gICAqIGBkcmFpbigpYCBmb3IgdGhhdC5cbiAgICovXG4gIGZsdXNoTm93KG9wdHM/OiB7IG1heFJvdW5kcz86IG51bWJlciB9KTogRmx1c2hTeW5jUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5kcml2ZXIuZmx1c2hTeW5jKG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSBiYWNrbG9nLCB0aGVuIHNldHRsZSBhbGwgaW5mbGlnaHQgYXN5bmMgY29udGludWF0aW9ucyDigJRcbiAgICogYFByb21pc2UuYWxsU2V0dGxlZGAgdW5kZXIgYSBkZWFkbGluZSwgc2hhcGVkIGxpa2UgYGZsdXNoQWxsRGV0YWNoZWRgLlxuICAgKiBMb29wcyB3aGlsZSBjb250aW51YXRpb25zIHNwYXduIG5ldyBjYXB0dXJlcywgdW50aWwgcXVpZXNjZW50IG9yIHRoZVxuICAgKiBkZWFkbGluZSBleHBpcmVzLlxuICAgKlxuICAgKiBgdGltZW91dE1zYCAoZGVmYXVsdCAzMCAwMDApIGlzIGFybWVkIGJ5IHRoZSBvbmUgbG9uZy10aW1lciBsYXdcbiAgICogKGB0aW1lcnMvbG9uZ1RpbWVvdXQudHMgwrcgc2V0TG9uZ1RpbWVvdXRgKTogYEluZmluaXR5YCBhcm1zIG5vIHRpbWVyXG4gICAqIGFuZCB3YWl0cyBmb3IgZXZlcnkgY29udGludWF0aW9uOyBhIGxpbWl0IHBhc3QgMl4zMSDiiJIgMSBtcyBpcyB3YWl0ZWQgaW5cbiAgICogZnVsbCwgbmV2ZXIgY3V0IHRvIDEgbXM7IGAwYCBvciBsZXNzIGdpdmVzIHVwIGF0IG9uY2UuXG4gICAqL1xuICBhc3luYyBkcmFpbihvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8RHJhaW5SZXN1bHQ+IHtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRzPy50aW1lb3V0TXMgPz8gMzBfMDAwO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgbGV0IGRvbmUgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgdGhpcy5mbHVzaE5vdygpO1xuICAgIHdoaWxlICh0aGlzLmluZmxpZ2h0LnNpemUgPiAwKSB7XG4gICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXRNcyAtIChEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICAgIGlmIChyZW1haW5pbmdNcyA8PSAwKSByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHRoaXMuaW5mbGlnaHQuc2l6ZSArIHRoaXMucXVldWUuZGVwdGggfTtcblxuICAgICAgY29uc3QgYmF0Y2ggPSBbLi4udGhpcy5pbmZsaWdodF07XG4gICAgICBsZXQgY2FuY2VsVGltZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPCdfX2RyYWluX3RpbWVvdXRfXyc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNhbmNlbFRpbWVyID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4gcmVzb2x2ZSgnX19kcmFpbl90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgY2FuY2VsVGltZXIoKTtcbiAgICAgIGlmIChzZXR0bGVkID09PSAnX19kcmFpbl90aW1lb3V0X18nKSB7XG4gICAgICAgIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogdGhpcy5pbmZsaWdodC5zaXplICsgdGhpcy5xdWV1ZS5kZXB0aCB9O1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCByIG9mIHNldHRsZWQpIHtcbiAgICAgICAgLy8gVHJhY2tlZCBwcm9taXNlcyBuZXZlciByZWplY3Qg4oCUIHRoZXkgcmVzb2x2ZSB0cnVlIChvaykgLyBmYWxzZS5cbiAgICAgICAgaWYgKHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByLnZhbHVlID09PSBmYWxzZSkgZmFpbGVkICs9IDE7XG4gICAgICAgIGVsc2UgZG9uZSArPSAxO1xuICAgICAgfVxuICAgICAgLy8gQ29udGludWF0aW9ucyBtYXkgaGF2ZSBjYXB0dXJlZCBtb3JlIGV2ZW50cyDigJQgZmx1c2ggYW5kIHJlLWNoZWNrLlxuICAgICAgdGhpcy5mbHVzaE5vdygpO1xuICAgIH1cbiAgICByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHRoaXMucXVldWUuZGVwdGggfTtcbiAgfVxuXG4gIC8qKiBBNCDigJQgdGhlIHN0YXRzIG9iamVjdCBCbG9jayA5IGNvbnN1bWVzLiBQdXJlIGdldHRlciwgZnJlc2ggc25hcHNob3QuICovXG4gIGdldFN0YXRzKCk6IERpc3BhdGNoZXJTdGF0cyB7XG4gICAgY29uc3QgY291bnRlcnMgPSB0aGlzLnF1ZXVlLmdldENvdW50ZXJzKCk7XG4gICAgY29uc3QgZHJpdmVyU3RhdHMgPSB0aGlzLmRyaXZlci5nZXRTdGF0cygpO1xuICAgIGNvbnN0IHBlckxpc3RlbmVyOiBSZWNvcmQ8c3RyaW5nLCBMaXN0ZW5lclN0YXRzPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2lkLCBzdGF0c10gb2YgdGhpcy5saXN0ZW5lclN0YXRzKSB7XG4gICAgICBwZXJMaXN0ZW5lcltpZF0gPSB7IGV2ZW50czogc3RhdHMuZXZlbnRzLCB0b3RhbE1zOiBzdGF0cy50b3RhbE1zLCBsYXN0Rmx1c2hNczogc3RhdHMubGFzdEZsdXNoTXMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcHRoOiB0aGlzLnF1ZXVlLmRlcHRoLFxuICAgICAgZHJvcHM6IGNvdW50ZXJzLmRyb3BzLFxuICAgICAgZmx1c2hlczogZHJpdmVyU3RhdHMuZmx1c2hlcyxcbiAgICAgIGJ1ZGdldEV4aGF1c3RlZDogZHJpdmVyU3RhdHMuYnVkZ2V0RXhoYXVzdGVkLFxuICAgICAgcDk1Rmx1c2hNczogZHJpdmVyU3RhdHMucDk1Rmx1c2hNcyxcbiAgICAgIGlubGluZURlbGl2ZXJpZXM6IHRoaXMuaW5saW5lRGVsaXZlcmllcyxcbiAgICAgIGluZmxpZ2h0OiB0aGlzLmluZmxpZ2h0LnNpemUsXG4gICAgICBwZXJMaXN0ZW5lcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxpdmVyTmV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICBpZiAoZW52ZWxvcGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuZGVsaXZlcihlbnZlbG9wZSk7XG4gIH1cblxuICAvKiogSW52b2tlIGV2ZXJ5IGxpc3RlbmVyIHdpdGggZnVsbCBlcnJvciBpc29sYXRpb24gKyB0aW1lIGFjY291bnRpbmcuICovXG4gIHByaXZhdGUgZGVsaXZlcihlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbaWQsIGxpc3RlbmVyXSBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmxpc3RlbmVyU3RhdHMuZ2V0KGlkKSBhcyBNdXRhYmxlTGlzdGVuZXJTdGF0cztcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5ub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGxpc3RlbmVyKGVudmVsb3BlKTtcbiAgICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkgdGhpcy50cmFjayhyZXN1bHQsIGlkLCBlbnZlbG9wZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnNhZmVPbkVycm9yKGVycm9yLCB7IGxpc3RlbmVySWQ6IGlkLCBlbnZlbG9wZSwgcGhhc2U6ICdzeW5jJyB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aGlzLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIHN0YXRzLmV2ZW50cyArPSAxO1xuICAgICAgICBzdGF0cy50b3RhbE1zICs9IGVsYXBzZWQ7XG4gICAgICAgIHN0YXRzLmxhc3RGbHVzaE1zICs9IGVsYXBzZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFRyYWNrIGFuIGFzeW5jIGNvbnRpbnVhdGlvbjsgcm91dGUgaXRzIHJlamVjdGlvbjsgbmV2ZXIgcmVqZWN0LiAqL1xuICBwcml2YXRlIHRyYWNrKHByb21pc2U6IFByb21pc2U8dm9pZD4sIGxpc3RlbmVySWQ6IHN0cmluZywgZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNrZWQ6IFByb21pc2U8Ym9vbGVhbj4gPSBwcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2FmZU9uRXJyb3IoZXJyb3IsIHsgbGlzdGVuZXJJZCwgZW52ZWxvcGUsIHBoYXNlOiAnYXN5bmMnIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5pbmZsaWdodC5hZGQodHJhY2tlZCk7XG4gICAgLy8gU2VsZi1jbGVhbnVwIOKAlCBgdHJhY2tlZGAgbmV2ZXIgcmVqZWN0cywgc28gdGhpcyBjaGFpbiBjYW5ub3QgZmxvYXQgYW5cbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgIHRyYWNrZWQudGhlbigoKSA9PiB0aGlzLmluZmxpZ2h0LmRlbGV0ZSh0cmFja2VkKSk7XG4gIH1cblxuICAvKiogVGhlIGVycm9yIHNpbmsgbXVzdCBuZXZlciBiZWNvbWUgYW4gZXJyb3Igc291cmNlLiAqL1xuICBwcml2YXRlIHNhZmVPbkVycm9yKGVycm9yOiB1bmtub3duLCBjb250ZXh0OiBEaXNwYXRjaEVycm9yQ29udGV4dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uRXJyb3I/LihlcnJvciwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCBpc29sYXRpb24gaXMgYWJzb2x1dGUuXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,5 +1,6 @@
1
1
  /** P7: one bounded, payload-free metric projection collected from traversal hooks. */
2
2
  import { parseAttemptId } from 'foottrace';
3
+ import { setLongTimeout } from '../timers/longTimeout.js';
3
4
  import { matchesQuery, metricRow, metricWindow, ownDataRecord } from './attemptMetricRows.js';
4
5
  import { aggregateAttempts, attemptRowKey, logicalKey, worst } from './attemptMetrics.js';
5
6
  import { attemptOTel } from './attemptOTel.js';
@@ -217,18 +218,17 @@ export class AttemptRecorder {
217
218
  async flush() {
218
219
  if (this.pending.size === 0)
219
220
  return this.storage();
220
- let timer;
221
+ let cancelTimer = () => undefined;
221
222
  try {
222
223
  await Promise.race([
223
224
  Promise.all([...this.pending]),
224
225
  new Promise((resolve) => {
225
- timer = setTimeout(resolve, this.timeoutMs);
226
+ cancelTimer = setLongTimeout(resolve, this.timeoutMs);
226
227
  }),
227
228
  ]);
228
229
  }
229
230
  finally {
230
- if (timer !== undefined)
231
- clearTimeout(timer);
231
+ cancelTimer();
232
232
  }
233
233
  return this.storage();
234
234
  }
@@ -312,7 +312,7 @@ export class AttemptRecorder {
312
312
  if (store === undefined)
313
313
  return this.rows.values();
314
314
  this.reads++;
315
- let timer;
315
+ let cancelTimer = () => undefined;
316
316
  let released = false;
317
317
  const release = () => {
318
318
  if (!released) {
@@ -336,13 +336,12 @@ export class AttemptRecorder {
336
336
  return await Promise.race([
337
337
  work,
338
338
  new Promise((_resolve, reject) => {
339
- timer = setTimeout(() => reject(new Error('attempts: store read timed out')), this.timeoutMs);
339
+ cancelTimer = setLongTimeout(() => reject(new Error('attempts: store read timed out')), this.timeoutMs);
340
340
  }),
341
341
  ]);
342
342
  }
343
343
  finally {
344
- if (timer !== undefined)
345
- clearTimeout(timer);
344
+ cancelTimer();
346
345
  }
347
346
  }
348
347
  toSnapshot() {
@@ -409,4 +408,4 @@ export function memoryStore(options = {}) {
409
408
  },
410
409
  };
411
410
  }
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0ZW1wdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9BdHRlbXB0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsU0FBUyxNQUFNLENBQUMsS0FBeUIsRUFBRSxRQUFnQixFQUFFLEdBQVcsRUFBRSxJQUFZLEVBQUUsSUFBSSxHQUFHLEtBQUs7SUFDbEcsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixNQUFNLE9BQU8sZUFBZTtJQUNqQixFQUFFLEdBQUcsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQzFCLElBQUksR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO0lBQ3BD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Q0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ1QsT0FBTyxFQUFFLENBQUM7b0JBQ1YsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDeEMsSUFBSSxNQUFNLEtBQUssU0FBUzt3QkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM5QyxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDZCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFDRCxLQUFLO1lBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUDc6IG9uZSBib3VuZGVkLCBwYXlsb2FkLWZyZWUgbWV0cmljIHByb2plY3Rpb24gY29sbGVjdGVkIGZyb20gdHJhdmVyc2FsIGhvb2tzLiAqL1xuaW1wb3J0IHsgcGFyc2VBdHRlbXB0SWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93UGF1c2VFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbn0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBtYXRjaGVzUXVlcnksIG1ldHJpY1JvdywgbWV0cmljV2luZG93LCBvd25EYXRhUmVjb3JkIH0gZnJvbSAnLi9hdHRlbXB0TWV0cmljUm93cy5qcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVBdHRlbXB0cywgYXR0ZW1wdFJvd0tleSwgbG9naWNhbEtleSwgd29yc3QgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdEFnZ3JlZ2F0ZSxcbiAgQXR0ZW1wdERlY2lzaW9uUm93LFxuICBBdHRlbXB0UXVlcnksXG4gIEF0dGVtcHRSZWNvcmRlck9wdGlvbnMsXG4gIEF0dGVtcHRSb3csXG4gIEF0dGVtcHRTdG9yYWdlU3RhdHMsXG4gIEF0dGVtcHRTdG9yZSxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdE9UZWwgfSBmcm9tICcuL2F0dGVtcHRPVGVsLmpzJztcbmltcG9ydCB7IEtleWVkU3RvcmUgfSBmcm9tICcuL0tleWVkU3RvcmUuanMnO1xuXG5mdW5jdGlvbiBvcHRpb24odmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWF4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgemVybyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG4pIHx8IG4gPCAoemVybyA/IDAgOiAxKSB8fCBuID4gbWF4KSB0aHJvdyBuZXcgVHlwZUVycm9yKGBhdHRlbXB0czogaW52YWxpZCAke25hbWV9YCk7XG4gIHJldHVybiBuO1xufVxubGV0IG5leHRSZWNvcmRlciA9IDA7XG5leHBvcnQgY2xhc3MgQXR0ZW1wdFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQgPSBgYXR0ZW1wdHMtJHsrK25leHRSZWNvcmRlcn1gO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvd3MgPSBuZXcgS2V5ZWRTdG9yZTxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2ljYWwgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHN0YXJ0ZWRBdDogbnVtYmVyOyByZWFkb25seSBvdXRjb21lOiAncnVubmluZycgfCAncGF1c2VkJyB9PigpO1xuICBwcml2YXRlIHJlYWRzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IFNldDxQcm9taXNlPHZvaWQ+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZW1wbGFyczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhQZW5kaW5nOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU/OiBBdHRlbXB0U3RvcmU7XG4gIHByaXZhdGUgZmFpbGVkID0gMDtcbiAgcHJpdmF0ZSBkcm9wcGVkID0gMDtcbiAgcHJpdmF0ZSBvbWl0dGVkUm93cyA9IDA7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEF0dGVtcHRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZXhlbXBsYXJzID0gb3B0aW9uKG9wdGlvbnMuZXhlbXBsYXJzLCAxMCwgMTAwLCAnZXhlbXBsYXJzJyk7XG4gICAgdGhpcy5tYXhSb3dzID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgICB0aGlzLm1heFBlbmRpbmcgPSBvcHRpb24ob3B0aW9ucy5tYXhQZW5kaW5nLCA4LCA2NCwgJ21heFBlbmRpbmcnKTtcbiAgICB0aGlzLnRpbWVvdXRNcyA9IG9wdGlvbihvcHRpb25zLnN0b3JlVGltZW91dE1zLCAxMDAwLCA2MDAwMCwgJ3N0b3JlVGltZW91dE1zJyk7XG4gICAgdGhpcy5zdG9yZSA9IG9wdGlvbnMuc3RvcmU7XG4gIH1cblxuICBvblJ1blN0YXJ0KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmIChydW5JZCkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID49IHRoaXMubWF4Um93cyAmJiAhdGhpcy5zdGFydHMuaGFzKHJ1bklkKSkge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnN0YXJ0cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGFydHMuZ2V0KG9sZGVzdCk/Lm91dGNvbWUgPT09ICdydW5uaW5nJykgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgICAgIHRoaXMuc3RhcnRzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lOiAncnVubmluZycgfSk7XG4gICAgICB0aGlzLmNvbGxlY3QoeyBraW5kOiAncnVuJywgcnVuSWQsIHN0YXJ0ZWRBdCwgb3V0Y29tZTogJ3J1bm5pbmcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZChldmVudCwgJ29rJyk7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBGbG93UGF1c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW5kKGV2ZW50LCAncGF1c2VkJyk7XG4gIH1cblxuICBvblJ1bkZhaWxlZChldmVudDogRmxvd1J1bkZhaWxlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbmQoZXZlbnQsICdmYWlsZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kKGV2ZW50OiBGbG93UnVuRXZlbnQgfCBGbG93UnVuRmFpbGVkRXZlbnQgfCBGbG93UGF1c2VFdmVudCwgb3V0Y29tZTogJ29rJyB8ICdmYWlsZWQnIHwgJ3BhdXNlZCcpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmICghcnVuSWQpIHJldHVybjtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMucm93cy5nZXQoYXR0ZW1wdFJvd0tleSh7IGtpbmQ6ICdydW4nLCBydW5JZCwgc3RhcnRlZEF0OiAwLCBvdXRjb21lOiAncnVubmluZycgfSkpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuc3RhcnRzLmdldChydW5JZCkgPz8gKHByaW9yPy5raW5kID09PSAncnVuJyA/IHByaW9yIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFyYWxsZWwgY2hpbGRyZW4gY2FuIGVhY2ggcmVwb3J0IGEgcGF1c2UgaW4gb25lIGxlZy4gSXQgaXMgb25lIGxpZmVjeWNsZSBmYWN0LCBub3QgYSBsb3N0IHJvdy5cbiAgICAvLyBLZWVwIHRoZSBzdGFydCB1bnRpbCBhIHJlYWwgdGVybWluYWwgZXZlbnQsIHNvIGEgbGF0ZXIgZmFpbHVyZSBjYW4gc3VwZXJzZWRlIGEgY2hpbGQncyBwYXVzZS5cbiAgICBpZiAob3V0Y29tZSA9PT0gJ3BhdXNlZCcgJiYgYWN0aXZlLm91dGNvbWUgIT09ICdydW5uaW5nJykgcmV0dXJuO1xuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJyAmJiAoYWN0aXZlLm91dGNvbWUgPT09ICdvaycgfHwgYWN0aXZlLm91dGNvbWUgPT09ICdmYWlsZWQnKSkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IGFjdGl2ZS5zdGFydGVkQXQ7XG4gICAgaWYgKG91dGNvbWUgPT09ICdwYXVzZWQnKSB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lIH0pO1xuICAgIGVsc2UgdGhpcy5zdGFydHMuZGVsZXRlKHJ1bklkKTtcbiAgICB0aGlzLmNvbGxlY3Qoe1xuICAgICAga2luZDogJ3J1bicsXG4gICAgICBydW5JZCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGVuZGVkQXQ6IERhdGUubm93KCksXG4gICAgICBvdXRjb21lLFxuICAgIH0pO1xuICAgIC8vIE90aGVyIHBhcmFsbGVsIGNoaWxkcmVuIG1heSBzdGlsbCBmaW5pc2ggYWZ0ZXIgb25lIGNoaWxkIHBhdXNlcy4gS2VlcCB0aGVpciBib3VuZGVkIGlkZW50aXR5IGxpbmtzXG4gICAgLy8gdW50aWwgYSByZWFsIHRlcm1pbmFsIGV2ZW50LCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGVpciBsYXRlciBuYXRpdmUgZGVjaXNpb25zLlxuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJykgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKHJvdy5ydW5JZCA9PT0gcnVuSWQpIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgIGlmICghY3R4Py5ydW5JZCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGAke3JlY29yZC5zZXJpZXN9QCR7cmVjb3JkLmF0dGVtcHR9YDtcbiAgICBpZiAoaWQubGVuZ3RoID4gNDA5Nikge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUF0dGVtcHRJZChpZCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkLFxuICAgICAgc2VyaWVzOiByZWNvcmQuc2VyaWVzLFxuICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHgucnVudGltZVN0YWdlSWQsXG4gICAgICB0YXJnZXQ6IHJlY29yZC50YXJnZXQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHRyYWNlSWQ6IGN0eC5jb3JyZWxhdGlvbj8udHJhY2VJZCxcbiAgICAgIHN0YXJ0ZWRBdDogcmVjb3JkLnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHJlY29yZC5kdXJhdGlvbk1zLFxuICAgICAgb3V0Y29tZTogcmVjb3JkLm91dGNvbWUsXG4gICAgICBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5LFxuICAgICAgbmV4dDogcmVjb3JkLm5leHQsXG4gICAgICByZWFzb246IHJlY29yZC5yZWFzb24sXG4gICAgICBhdHRlbXB0S2luZDogcmVjb3JkLmtpbmQsXG4gICAgICBhdHRlbXB0OiByZWNvcmQuYXR0ZW1wdCxcbiAgICAgIG9mOiByZWNvcmQub2YsXG4gICAgICBlZmZlY3Q6IHJlY29yZC5lZmZlY3QsXG4gICAgICByZXRyeUxvb3A6IHJlY29yZC5yZXRyeUxvb3AsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCAhPT0gJ2F0dGVtcHQnKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29sbGVjdChyb3cpO1xuICAgIGlmIChyb3cucmV0cnlMb29wPy5waGFzZSA9PT0gJ2F0dGVtcHQnKSB7XG4gICAgICBjb25zdCBrZXkgPSBsb2dpY2FsS2V5KHJvdy5ydW5JZCwgcm93LnJldHJ5TG9vcC5zZXJpZXMsIHJvdy5yZXRyeUxvb3AuYXR0ZW1wdCk7XG4gICAgICBpZiAoIXRoaXMubG9naWNhbC5oYXMoa2V5KSAmJiB0aGlzLmxvZ2ljYWwuc2l6ZSA+PSB0aGlzLm1heFJvd3MpIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5sb2dpY2FsLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5sb2dpY2FsLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2ljYWwuc2V0KGtleSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2ljYWwgPSBldmVudC5ldmlkZW5jZT8ucmV0cnlMb29wO1xuICAgIGNvbnN0IHJ1bklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVuSWQ7XG4gICAgaWYgKCFsb2dpY2FsIHx8ICFydW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGxvZ2ljYWxLZXkocnVuSWQsIGxvZ2ljYWwuc2VyaWVzLCBsb2dpY2FsLmF0dGVtcHQpO1xuICAgIGNvbnN0IHBoeXNpY2FsID0gdGhpcy5sb2dpY2FsLmdldChrZXkpO1xuICAgIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgICBpZiAoIXBoeXNpY2FsKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IG1ldHJpY1Jvdyh7XG4gICAgICAuLi5sb2dpY2FsLFxuICAgICAga2luZDogJ2RlY2lzaW9uJyxcbiAgICAgIHJ1bklkLFxuICAgICAgdGFyZ2V0OiBwaHlzaWNhbC50YXJnZXQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBhdHRlbXB0SWQ6IHBoeXNpY2FsLmlkLFxuICAgICAgc3RhcnRlZEF0OiBwaHlzaWNhbC5zdGFydGVkQXQsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCA9PT0gJ2RlY2lzaW9uJykgdGhpcy5jb2xsZWN0KHJvdyk7XG4gICAgZWxzZSB0aGlzLm9taXR0ZWRSb3dzKys7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3Qocm93OiBBdHRlbXB0Um93KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYXR0ZW1wdFJvd0tleShyb3cpO1xuICAgIGlmICghdGhpcy5yb3dzLmhhcyhrZXkpICYmIHRoaXMucm93cy5zaXplID49IHRoaXMubWF4Um93cykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5yb3dzLmdldE1hcCgpLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHRoaXMucm93cy5kZWxldGUob2xkZXN0KTtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICB9XG4gICAgdGhpcy5yb3dzLnNldChrZXksIHJvdyk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSByZXR1cm47XG4gICAgaWYgKHRoaXMucGVuZGluZy5zaXplICsgdGhpcy5yZWFkcyA+PSB0aGlzLm1heFBlbmRpbmcpIHtcbiAgICAgIHRoaXMuZHJvcHBlZCsrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBIb29rcyBjYW5ub3QgYXdhaXQuIE93biBldmVyeSByZWplY3Rpb24gaW1tZWRpYXRlbHksIHdpdGggYSBib3VuZGVkIHBvb2wgYW5kIG5vIGhpZGRlbiByZXRyeSBxdWV1ZS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZS5hcHBlbmQoW3N0cnVjdHVyZWRDbG9uZShyb3cpXSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGFzazogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHRhc2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmcuYWRkKHRhc2spO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICBzdG9yYWdlKCk6IEF0dGVtcHRTdG9yYWdlU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMsXG4gICAgICBmYWlsZWQ6IHRoaXMuZmFpbGVkLFxuICAgICAgZHJvcHBlZDogdGhpcy5kcm9wcGVkLFxuICAgICAgb21pdHRlZFJvd3M6IHRoaXMub21pdHRlZFJvd3MsXG4gICAgICBpbmNvbXBsZXRlOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMgKyB0aGlzLmZhaWxlZCArIHRoaXMuZHJvcHBlZCArIHRoaXMub21pdHRlZFJvd3MgPiAwLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPEF0dGVtcHRTdG9yYWdlU3RhdHM+IHtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPT09IDApIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICBQcm9taXNlLmFsbChbLi4udGhpcy5wZW5kaW5nXSksXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KHJlc29sdmUsIHRoaXMudGltZW91dE1zKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgfVxuXG4gIGJ5VGFyZ2V0KCk6IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5VGFyZ2V0J10ge1xuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSkuYnlUYXJnZXQ7XG4gIH1cblxuICBieVJ1bigpOiBBdHRlbXB0QWdncmVnYXRlWydieVJ1biddIHtcbiAgICByZXR1cm4gYWdncmVnYXRlQXR0ZW1wdHModGhpcy5yb3dzLnZhbHVlcygpLCB0aGlzLmV4ZW1wbGFycywgdGhpcy5zdG9yYWdlKCkpLmJ5UnVuO1xuICB9XG5cbiAgc2xvd2VzdCh0YXJnZXQ6IHN0cmluZywgbGltaXQgPSB0aGlzLmV4ZW1wbGFycykge1xuICAgIGNvbnN0IGNhcCA9IG9wdGlvbihsaW1pdCwgdGhpcy5leGVtcGxhcnMsIDEwMCwgJ2xpbWl0JywgdHJ1ZSk7XG4gICAgcmV0dXJuIHdvcnN0KFxuICAgICAgdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnICYmIHJvdy50YXJnZXQgPT09IHRhcmdldCksXG4gICAgICBjYXAsXG4gICAgKTtcbiAgfVxuXG4gIHNlcmllcyhzZXJpZXM6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB7IGF0dGVtcHRzOiBQaHlzaWNhbEF0dGVtcHRSb3dbXTsgZGVjaXNpb25zOiBBdHRlbXB0RGVjaXNpb25Sb3dbXSB9IHtcbiAgICBjb25zdCBoZWxkID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiBydW5JZCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5ydW5JZCA9PT0gcnVuSWQpO1xuICAgIGNvbnN0IGxpbmtlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGhlbGQpXG4gICAgICBpZiAocm93LmtpbmQgPT09ICdhdHRlbXB0JyAmJiByb3cuc2VyaWVzID09PSBzZXJpZXMgJiYgcm93LnJldHJ5TG9vcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBsaW5rZWQuYWRkKEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5yZXRyeUxvb3Auc2VyaWVzXSkpO1xuICAgIGNvbnN0IHJvd3MgPSBoZWxkLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHJvdy5raW5kICE9PSAncnVuJyAmJlxuICAgICAgICAocm93LnNlcmllcyA9PT0gc2VyaWVzIHx8XG4gICAgICAgICAgKHJvdy5raW5kID09PSAnYXR0ZW1wdCcgJiYgcm93LnJldHJ5TG9vcD8uc2VyaWVzID09PSBzZXJpZXMpIHx8XG4gICAgICAgICAgbGlua2VkLmhhcyhKU09OLnN0cmluZ2lmeShbcm93LnJ1bklkLCByb3cua2luZCA9PT0gJ2F0dGVtcHQnID8gcm93LnJldHJ5TG9vcD8uc2VyaWVzIDogcm93LnNlcmllc10pKSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHtcbiAgICAgIGF0dGVtcHRzOiByb3dzLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKSxcbiAgICAgIGRlY2lzaW9uczogcm93cy5maWx0ZXIoKHJvdyk6IHJvdyBpcyBBdHRlbXB0RGVjaXNpb25Sb3cgPT4gcm93LmtpbmQgPT09ICdkZWNpc2lvbicpLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYWdncmVnYXRlKHN1cHBsaWVkOiBBdHRlbXB0UXVlcnkgPSB7fSk6IFByb21pc2U8QXR0ZW1wdEFnZ3JlZ2F0ZT4ge1xuICAgIGNvbnN0IGFkbWl0dGVkID0gb3duRGF0YVJlY29yZChzdXBwbGllZCk7XG4gICAgaWYgKGFkbWl0dGVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F0dGVtcHRzOiBpbnZhbGlkIHF1ZXJ5Jyk7XG4gICAgY29uc3QgeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSA9IGFkbWl0dGVkIGFzIEF0dGVtcHRRdWVyeTtcbiAgICBpZiAoXG4gICAgICAoc2luY2UgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZShzaW5jZSkgfHwgc2luY2UgPCAwKSkgfHxcbiAgICAgICh1bnRpbCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzRmluaXRlKHVudGlsKSB8fCB1bnRpbCA8IDApKSB8fFxuICAgICAgKHNpbmNlICE9PSB1bmRlZmluZWQgJiYgdW50aWwgIT09IHVuZGVmaW5lZCAmJiBzaW5jZSA+IHVudGlsKSB8fFxuICAgICAgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJyB8fCB0YXJnZXQubGVuZ3RoID09PSAwKSkgfHxcbiAgICAgIChydW5JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnIHx8IHJ1bklkLmxlbmd0aCA9PT0gMCkpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgcXVlcnknKTtcbiAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5mcmVlemUoeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSk7XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuc3RvcmUgPT09IHVuZGVmaW5lZCA/IHRoaXMucm93cy52YWx1ZXMoKSA6IGF3YWl0IHRoaXMucmVhZFN0b3JlZChxdWVyeSk7XG4gICAgY29uc3Qgcm93czogQXR0ZW1wdFJvd1tdID0gW107XG4gICAgY29uc3Qgd2luZG93ID0gbWV0cmljV2luZG93KHJhdywgdGhpcy5tYXhSb3dzKTtcbiAgICBsZXQgaW52YWxpZCA9IHdpbmRvdy5vbWl0dGVkO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygd2luZG93LnZhbHVlcykge1xuICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgIGlmIChyb3cgJiYgbWF0Y2hlc1F1ZXJ5KHJvdywgcXVlcnkpKSByb3dzLnB1c2gocm93KTtcbiAgICAgIGVsc2UgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSBpbnZhbGlkKys7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgc3RvcmVPbWl0dGVkID0gMDtcbiAgICBsZXQgYWNjb3VudGluZ1Vua25vd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zdG9yZT8uc3RhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBvd25EYXRhUmVjb3JkKHRoaXMuc3RvcmUuc3RhdHMoKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdGF0cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgdHlwZW9mIHN0YXRzLm9taXR0ZWRSb3dzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihzdGF0cy5vbWl0dGVkUm93cykgfHxcbiAgICAgICAgICBzdGF0cy5vbWl0dGVkUm93cyA8IDBcbiAgICAgICAgKVxuICAgICAgICAgIGFjY291bnRpbmdVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBzdG9yZU9taXR0ZWQgPSBzdGF0cy5vbWl0dGVkUm93cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhY2NvdW50aW5nVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyhyb3dzLCB0aGlzLmV4ZW1wbGFycywge1xuICAgICAgLi4uc3RvcmFnZSxcbiAgICAgIG9taXR0ZWRSb3dzOiBzdG9yYWdlLm9taXR0ZWRSb3dzICsgaW52YWxpZCArIHN0b3JlT21pdHRlZCxcbiAgICAgIGluY29tcGxldGU6IHN0b3JhZ2UuaW5jb21wbGV0ZSB8fCBpbnZhbGlkICsgc3RvcmVPbWl0dGVkID4gMCB8fCBhY2NvdW50aW5nVW5rbm93bixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFN0b3JlZChxdWVyeTogQXR0ZW1wdFF1ZXJ5KTogUHJvbWlzZTxyZWFkb25seSBBdHRlbXB0Um93W10+IHtcbiAgICBpZiAodGhpcy5yZWFkcyArIHRoaXMucGVuZGluZy5zaXplID49IHRoaXMubWF4UGVuZGluZykgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBjYXBhY2l0eSByZWFjaGVkJyk7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgIGlmIChzdG9yZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5yb3dzLnZhbHVlcygpO1xuICAgIHRoaXMucmVhZHMrKztcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXJlbGVhc2VkKSB7XG4gICAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWFkcy0tO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gQSB0aW1lZC1vdXQgSS9PIHN0aWxsIG93bnMgaXRzIHNsb3QgdW50aWwgaXQgc2V0dGxlczogYSBjYWxsZXIgY2Fubm90IGNyZWF0ZSBhbiB1bmJvdW5kZWQgcG9vbCBvZiBzdHVjayByZWFkcy5cbiAgICBjb25zdCB3b3JrID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHN0b3JlLnJlYWQocXVlcnkpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyb3dzKSA9PiB7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dzKSkgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogaW52YWxpZCBzdG9yZSByb3dzJyk7XG4gICAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICB3b3JrLFxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignYXR0ZW1wdHM6IHN0b3JlIHJlYWQgdGltZWQgb3V0JykpLCB0aGlzLnRpbWVvdXRNcyk7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxuXG4gIHRvU25hcHNob3QoKSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdBdHRlbXB0cycsXG4gICAgICBkYXRhOiB7IGJ5VGFyZ2V0OiBzdGF0cy5ieVRhcmdldCwgYnlSdW46IHN0YXRzLmJ5UnVuIH0sXG4gICAgICBtZXRhOiB7XG4gICAgICAgIHByb2plY3Rpb246ICdwZXItdGFyZ2V0JyxcbiAgICAgICAgZXhlbXBsYXJzOiB0aGlzLmV4ZW1wbGFycyxcbiAgICAgICAgcm93czogdGhpcy5yb3dzLnNpemUsXG4gICAgICAgIG1heFJvd3M6IHRoaXMubWF4Um93cyxcbiAgICAgICAgc3RvcmFnZTogc3RhdHMuc3RvcmFnZSxcbiAgICAgICAgd29ya1RpbWU6ICdzdW0tb2YtYXR0ZW1wdC1kdXJhdGlvbnMnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdG9PVGVsKCkge1xuICAgIHJldHVybiBhdHRlbXB0T1RlbChcbiAgICAgIHRoaXMucm93cy52YWx1ZXMoKS5maWx0ZXIoKHJvdyk6IHJvdyBpcyBQaHlzaWNhbEF0dGVtcHRSb3cgPT4gcm93LmtpbmQgPT09ICdhdHRlbXB0JyksXG4gICAgICB0aGlzLmJ5VGFyZ2V0KCksXG4gICAgICB0aGlzLmV4ZW1wbGFycyxcbiAgICApO1xuICB9XG5cbiAgLyoqIENsZWFyIGNvbXBsZXRlZCBsb2NhbCBwcm9qZWN0aW9uczsgYWN0aXZlL3BhdXNlZCBldmlkZW5jZSBhbmQgYm91bmRlZCBvd25lcnNoaXAgc3Vydml2ZSBleGVjdXRvciBhdXRvLWNsZWFyLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiB0aGlzLnN0YXJ0cy5oYXMocm93LnJ1bklkKSk7XG4gICAgdGhpcy5yb3dzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Yga2VwdCkgdGhpcy5yb3dzLnNldChhdHRlbXB0Um93S2V5KHJvdyksIHJvdyk7XG4gICAgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKCF0aGlzLnN0YXJ0cy5oYXMocm93LnJ1bklkKSkgdGhpcy5sb2dpY2FsLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID09PSAwKSB0aGlzLm9taXR0ZWRSb3dzID0gMDtcbiAgfVxufVxuXG4vKiogQm91bmRlZCByZWZlcmVuY2UgYWRhcHRlciBmb3IgdGVzdHMvbG9jYWwgdXNlOyBhcHBzIHN1cHBseSB0aGVpciBvd24gZGF0YWJhc2UgYWRhcHRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vcnlTdG9yZShcbiAgb3B0aW9uczogeyByZWFkb25seSBtYXhSb3dzPzogbnVtYmVyIH0gPSB7fSxcbik6IEF0dGVtcHRTdG9yZSAmIHsgc3RhdHMoKTogeyByb3dzOiBudW1iZXI7IG9taXR0ZWRSb3dzOiBudW1iZXIgfSB9IHtcbiAgY29uc3QgbWF4ID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgY29uc3Qgcm93cyA9IG5ldyBNYXA8bnVtYmVyLCBBdHRlbXB0Um93PigpO1xuICBsZXQgb21pdHRlZCA9IDA7XG4gIGxldCBvcmRpbmFsID0gMDtcbiAgcmV0dXJuIHtcbiAgICBhcHBlbmQoaW5jb21pbmcpIHtcbiAgICAgIGNvbnN0IHdpbmRvdyA9IG1ldHJpY1dpbmRvdyhpbmNvbWluZywgbWF4KTtcbiAgICAgIG9taXR0ZWQgKz0gd2luZG93Lm9taXR0ZWQ7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHdpbmRvdy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICBvbWl0dGVkKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvd3Muc2l6ZSA+PSBtYXgpIHtcbiAgICAgICAgICBjb25zdCBvbGRlc3QgPSByb3dzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSByb3dzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICAgIG9taXR0ZWQrKztcbiAgICAgICAgfVxuICAgICAgICByb3dzLnNldCgrK29yZGluYWwsIHJvdyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyByZWFkKHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gWy4uLnJvd3MudmFsdWVzKCldLmZpbHRlcigocm93KSA9PiBtYXRjaGVzUXVlcnkocm93LCBxdWVyeSkpLm1hcCgocm93KSA9PiBzdHJ1Y3R1cmVkQ2xvbmUocm93KSk7XG4gICAgfSxcbiAgICBzdGF0cygpIHtcbiAgICAgIHJldHVybiB7IHJvd3M6IHJvd3Muc2l6ZSwgb21pdHRlZFJvd3M6IG9taXR0ZWQgfTtcbiAgICB9LFxuICB9O1xufVxuIl19
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0ZW1wdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9BdHRlbXB0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVcxRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLFNBQVMsTUFBTSxDQUFDLEtBQXlCLEVBQUUsUUFBZ0IsRUFBRSxHQUFXLEVBQUUsSUFBWSxFQUFFLElBQUksR0FBRyxLQUFLO0lBQ2xHLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUM7SUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoSCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDckIsTUFBTSxPQUFPLGVBQWU7SUFDakIsRUFBRSxHQUFHLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FB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QUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNULE9BQU8sRUFBRSxDQUFDO29CQUNWLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ3hDLElBQUksTUFBTSxLQUFLLFNBQVM7d0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDOUMsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ2QsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsS0FBSztZQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFA3OiBvbmUgYm91bmRlZCwgcGF5bG9hZC1mcmVlIG1ldHJpYyBwcm9qZWN0aW9uIGNvbGxlY3RlZCBmcm9tIHRyYXZlcnNhbCBob29rcy4gKi9cbmltcG9ydCB7IHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd1BhdXNlRXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1J1bkV2ZW50LFxuICBGbG93UnVuRmFpbGVkRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuLi90aW1lcnMvbG9uZ1RpbWVvdXQuanMnO1xuaW1wb3J0IHsgbWF0Y2hlc1F1ZXJ5LCBtZXRyaWNSb3csIG1ldHJpY1dpbmRvdywgb3duRGF0YVJlY29yZCB9IGZyb20gJy4vYXR0ZW1wdE1ldHJpY1Jvd3MuanMnO1xuaW1wb3J0IHsgYWdncmVnYXRlQXR0ZW1wdHMsIGF0dGVtcHRSb3dLZXksIGxvZ2ljYWxLZXksIHdvcnN0IH0gZnJvbSAnLi9hdHRlbXB0TWV0cmljcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRBZ2dyZWdhdGUsXG4gIEF0dGVtcHREZWNpc2lvblJvdyxcbiAgQXR0ZW1wdFF1ZXJ5LFxuICBBdHRlbXB0UmVjb3JkZXJPcHRpb25zLFxuICBBdHRlbXB0Um93LFxuICBBdHRlbXB0U3RvcmFnZVN0YXRzLFxuICBBdHRlbXB0U3RvcmUsXG4gIFBoeXNpY2FsQXR0ZW1wdFJvdyxcbn0gZnJvbSAnLi9hdHRlbXB0TWV0cmljc1R5cGVzLmpzJztcbmltcG9ydCB7IGF0dGVtcHRPVGVsIH0gZnJvbSAnLi9hdHRlbXB0T1RlbC5qcyc7XG5pbXBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9LZXllZFN0b3JlLmpzJztcblxuZnVuY3Rpb24gb3B0aW9uKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG1heDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIHplcm8gPSBmYWxzZSk6IG51bWJlciB7XG4gIGNvbnN0IG4gPSB2YWx1ZSA/PyBmYWxsYmFjaztcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSB8fCBuIDwgKHplcm8gPyAwIDogMSkgfHwgbiA+IG1heCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXR0ZW1wdHM6IGludmFsaWQgJHtuYW1lfWApO1xuICByZXR1cm4gbjtcbn1cbmxldCBuZXh0UmVjb3JkZXIgPSAwO1xuZXhwb3J0IGNsYXNzIEF0dGVtcHRSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkID0gYGF0dGVtcHRzLSR7KytuZXh0UmVjb3JkZXJ9YDtcbiAgcHJpdmF0ZSByZWFkb25seSByb3dzID0gbmV3IEtleWVkU3RvcmU8QXR0ZW1wdFJvdz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dpY2FsID0gbmV3IE1hcDxzdHJpbmcsIFBoeXNpY2FsQXR0ZW1wdFJvdz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFydHMgPSBuZXcgTWFwPHN0cmluZywgeyByZWFkb25seSBzdGFydGVkQXQ6IG51bWJlcjsgcmVhZG9ubHkgb3V0Y29tZTogJ3J1bm5pbmcnIHwgJ3BhdXNlZCcgfT4oKTtcbiAgcHJpdmF0ZSByZWFkcyA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBTZXQ8UHJvbWlzZTx2b2lkPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVtcGxhcnM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhSb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4UGVuZGluZzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXRNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlPzogQXR0ZW1wdFN0b3JlO1xuICBwcml2YXRlIGZhaWxlZCA9IDA7XG4gIHByaXZhdGUgZHJvcHBlZCA9IDA7XG4gIHByaXZhdGUgb21pdHRlZFJvd3MgPSAwO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBdHRlbXB0UmVjb3JkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmV4ZW1wbGFycyA9IG9wdGlvbihvcHRpb25zLmV4ZW1wbGFycywgMTAsIDEwMCwgJ2V4ZW1wbGFycycpO1xuICAgIHRoaXMubWF4Um93cyA9IG9wdGlvbihvcHRpb25zLm1heFJvd3MsIDEwMDAwLCAxMDAwMDAsICdtYXhSb3dzJyk7XG4gICAgdGhpcy5tYXhQZW5kaW5nID0gb3B0aW9uKG9wdGlvbnMubWF4UGVuZGluZywgOCwgNjQsICdtYXhQZW5kaW5nJyk7XG4gICAgdGhpcy50aW1lb3V0TXMgPSBvcHRpb24ob3B0aW9ucy5zdG9yZVRpbWVvdXRNcywgMTAwMCwgNjAwMDAsICdzdG9yZVRpbWVvdXRNcycpO1xuICAgIHRoaXMuc3RvcmUgPSBvcHRpb25zLnN0b3JlO1xuICB9XG5cbiAgb25SdW5TdGFydChldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcnVuSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW5JZDtcbiAgICBpZiAocnVuSWQpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICBpZiAodGhpcy5zdGFydHMuc2l6ZSA+PSB0aGlzLm1heFJvd3MgJiYgIXRoaXMuc3RhcnRzLmhhcyhydW5JZCkpIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5zdGFydHMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhcnRzLmdldChvbGRlc3QpPy5vdXRjb21lID09PSAncnVubmluZycpIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgICAgICB0aGlzLnN0YXJ0cy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdGFydHMuc2V0KHJ1bklkLCB7IHN0YXJ0ZWRBdCwgb3V0Y29tZTogJ3J1bm5pbmcnIH0pO1xuICAgICAgdGhpcy5jb2xsZWN0KHsga2luZDogJ3J1bicsIHJ1bklkLCBzdGFydGVkQXQsIG91dGNvbWU6ICdydW5uaW5nJyB9KTtcbiAgICB9XG4gIH1cblxuICBvblJ1bkVuZChldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbmQoZXZlbnQsICdvaycpO1xuICB9XG5cbiAgb25QYXVzZShldmVudDogRmxvd1BhdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZChldmVudCwgJ3BhdXNlZCcpO1xuICB9XG5cbiAgb25SdW5GYWlsZWQoZXZlbnQ6IEZsb3dSdW5GYWlsZWRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW5kKGV2ZW50LCAnZmFpbGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGVuZChldmVudDogRmxvd1J1bkV2ZW50IHwgRmxvd1J1bkZhaWxlZEV2ZW50IHwgRmxvd1BhdXNlRXZlbnQsIG91dGNvbWU6ICdvaycgfCAnZmFpbGVkJyB8ICdwYXVzZWQnKTogdm9pZCB7XG4gICAgY29uc3QgcnVuSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW5JZDtcbiAgICBpZiAoIXJ1bklkKSByZXR1cm47XG4gICAgY29uc3QgcHJpb3IgPSB0aGlzLnJvd3MuZ2V0KGF0dGVtcHRSb3dLZXkoeyBraW5kOiAncnVuJywgcnVuSWQsIHN0YXJ0ZWRBdDogMCwgb3V0Y29tZTogJ3J1bm5pbmcnIH0pKTtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLnN0YXJ0cy5nZXQocnVuSWQpID8/IChwcmlvcj8ua2luZCA9PT0gJ3J1bicgPyBwcmlvciA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhcmFsbGVsIGNoaWxkcmVuIGNhbiBlYWNoIHJlcG9ydCBhIHBhdXNlIGluIG9uZSBsZWcuIEl0IGlzIG9uZSBsaWZlY3ljbGUgZmFjdCwgbm90IGEgbG9zdCByb3cuXG4gICAgLy8gS2VlcCB0aGUgc3RhcnQgdW50aWwgYSByZWFsIHRlcm1pbmFsIGV2ZW50LCBzbyBhIGxhdGVyIGZhaWx1cmUgY2FuIHN1cGVyc2VkZSBhIGNoaWxkJ3MgcGF1c2UuXG4gICAgaWYgKG91dGNvbWUgPT09ICdwYXVzZWQnICYmIGFjdGl2ZS5vdXRjb21lICE9PSAncnVubmluZycpIHJldHVybjtcbiAgICBpZiAob3V0Y29tZSAhPT0gJ3BhdXNlZCcgJiYgKGFjdGl2ZS5vdXRjb21lID09PSAnb2snIHx8IGFjdGl2ZS5vdXRjb21lID09PSAnZmFpbGVkJykpIHJldHVybjtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBhY3RpdmUuc3RhcnRlZEF0O1xuICAgIGlmIChvdXRjb21lID09PSAncGF1c2VkJykgdGhpcy5zdGFydHMuc2V0KHJ1bklkLCB7IHN0YXJ0ZWRBdCwgb3V0Y29tZSB9KTtcbiAgICBlbHNlIHRoaXMuc3RhcnRzLmRlbGV0ZShydW5JZCk7XG4gICAgdGhpcy5jb2xsZWN0KHtcbiAgICAgIGtpbmQ6ICdydW4nLFxuICAgICAgcnVuSWQsXG4gICAgICBzdGFydGVkQXQsXG4gICAgICBlbmRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgb3V0Y29tZSxcbiAgICB9KTtcbiAgICAvLyBPdGhlciBwYXJhbGxlbCBjaGlsZHJlbiBtYXkgc3RpbGwgZmluaXNoIGFmdGVyIG9uZSBjaGlsZCBwYXVzZXMuIEtlZXAgdGhlaXIgYm91bmRlZCBpZGVudGl0eSBsaW5rc1xuICAgIC8vIHVudGlsIGEgcmVhbCB0ZXJtaW5hbCBldmVudCwgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlaXIgbGF0ZXIgbmF0aXZlIGRlY2lzaW9ucy5cbiAgICBpZiAob3V0Y29tZSAhPT0gJ3BhdXNlZCcpIGZvciAoY29uc3QgW2tleSwgcm93XSBvZiB0aGlzLmxvZ2ljYWwpIGlmIChyb3cucnVuSWQgPT09IHJ1bklkKSB0aGlzLmxvZ2ljYWwuZGVsZXRlKGtleSk7XG4gIH1cblxuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDtcbiAgICBpZiAoIWN0eD8ucnVuSWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgJHtyZWNvcmQuc2VyaWVzfUAke3JlY29yZC5hdHRlbXB0fWA7XG4gICAgaWYgKGlkLmxlbmd0aCA+IDQwOTYpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VBdHRlbXB0SWQoaWQpO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IG1ldHJpY1Jvdyh7XG4gICAgICBraW5kOiAnYXR0ZW1wdCcsXG4gICAgICBpZCxcbiAgICAgIHNlcmllczogcmVjb3JkLnNlcmllcyxcbiAgICAgIHJ1bklkOiBjdHgucnVuSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY3R4LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgdGFyZ2V0OiByZWNvcmQudGFyZ2V0ID8/IGV2ZW50LnN0YWdlSWQsXG4gICAgICB0cmFjZUlkOiBjdHguY29ycmVsYXRpb24/LnRyYWNlSWQsXG4gICAgICBzdGFydGVkQXQ6IHJlY29yZC5zdGFydGVkQXQsXG4gICAgICBkdXJhdGlvbk1zOiByZWNvcmQuZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IHJlY29yZC5vdXRjb21lLFxuICAgICAgY2F0ZWdvcnk6IHJlY29yZC5jYXRlZ29yeSxcbiAgICAgIG5leHQ6IHJlY29yZC5uZXh0LFxuICAgICAgcmVhc29uOiByZWNvcmQucmVhc29uLFxuICAgICAgYXR0ZW1wdEtpbmQ6IHJlY29yZC5raW5kLFxuICAgICAgYXR0ZW1wdDogcmVjb3JkLmF0dGVtcHQsXG4gICAgICBvZjogcmVjb3JkLm9mLFxuICAgICAgZWZmZWN0OiByZWNvcmQuZWZmZWN0LFxuICAgICAgcmV0cnlMb29wOiByZWNvcmQucmV0cnlMb29wLFxuICAgIH0pO1xuICAgIGlmIChyb3c/LmtpbmQgIT09ICdhdHRlbXB0Jykge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbGxlY3Qocm93KTtcbiAgICBpZiAocm93LnJldHJ5TG9vcD8ucGhhc2UgPT09ICdhdHRlbXB0Jykge1xuICAgICAgY29uc3Qga2V5ID0gbG9naWNhbEtleShyb3cucnVuSWQsIHJvdy5yZXRyeUxvb3Auc2VyaWVzLCByb3cucmV0cnlMb29wLmF0dGVtcHQpO1xuICAgICAgaWYgKCF0aGlzLmxvZ2ljYWwuaGFzKGtleSkgJiYgdGhpcy5sb2dpY2FsLnNpemUgPj0gdGhpcy5tYXhSb3dzKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMubG9naWNhbC5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHRoaXMubG9naWNhbC5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2dpY2FsLnNldChrZXksIHJvdyk7XG4gICAgfVxuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBsb2dpY2FsID0gZXZlbnQuZXZpZGVuY2U/LnJldHJ5TG9vcDtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmICghbG9naWNhbCB8fCAhcnVuSWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBsb2dpY2FsS2V5KHJ1bklkLCBsb2dpY2FsLnNlcmllcywgbG9naWNhbC5hdHRlbXB0KTtcbiAgICBjb25zdCBwaHlzaWNhbCA9IHRoaXMubG9naWNhbC5nZXQoa2V5KTtcbiAgICB0aGlzLmxvZ2ljYWwuZGVsZXRlKGtleSk7XG4gICAgaWYgKCFwaHlzaWNhbCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSBtZXRyaWNSb3coe1xuICAgICAgLi4ubG9naWNhbCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbicsXG4gICAgICBydW5JZCxcbiAgICAgIHRhcmdldDogcGh5c2ljYWwudGFyZ2V0LFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgYXR0ZW1wdElkOiBwaHlzaWNhbC5pZCxcbiAgICAgIHN0YXJ0ZWRBdDogcGh5c2ljYWwuc3RhcnRlZEF0LFxuICAgIH0pO1xuICAgIGlmIChyb3c/LmtpbmQgPT09ICdkZWNpc2lvbicpIHRoaXMuY29sbGVjdChyb3cpO1xuICAgIGVsc2UgdGhpcy5vbWl0dGVkUm93cysrO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0KHJvdzogQXR0ZW1wdFJvdyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGF0dGVtcHRSb3dLZXkocm93KTtcbiAgICBpZiAoIXRoaXMucm93cy5oYXMoa2V5KSAmJiB0aGlzLnJvd3Muc2l6ZSA+PSB0aGlzLm1heFJvd3MpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMucm93cy5nZXRNYXAoKS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJvd3MuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgfVxuICAgIHRoaXMucm93cy5zZXQoa2V5LCByb3cpO1xuICAgIGlmICghdGhpcy5zdG9yZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMgPj0gdGhpcy5tYXhQZW5kaW5nKSB7XG4gICAgICB0aGlzLmRyb3BwZWQrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSG9va3MgY2Fubm90IGF3YWl0LiBPd24gZXZlcnkgcmVqZWN0aW9uIGltbWVkaWF0ZWx5LCB3aXRoIGEgYm91bmRlZCBwb29sIGFuZCBubyBoaWRkZW4gcmV0cnkgcXVldWUuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3RvcmUuYXBwZW5kKFtzdHJ1Y3R1cmVkQ2xvbmUocm93KV0pO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHRhc2s6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmZhaWxlZCsrO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nLmFkZCh0YXNrKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgfVxuICB9XG5cbiAgc3RvcmFnZSgpOiBBdHRlbXB0U3RvcmFnZVN0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVuZGluZzogdGhpcy5wZW5kaW5nLnNpemUgKyB0aGlzLnJlYWRzLFxuICAgICAgZmFpbGVkOiB0aGlzLmZhaWxlZCxcbiAgICAgIGRyb3BwZWQ6IHRoaXMuZHJvcHBlZCxcbiAgICAgIG9taXR0ZWRSb3dzOiB0aGlzLm9taXR0ZWRSb3dzLFxuICAgICAgaW5jb21wbGV0ZTogdGhpcy5wZW5kaW5nLnNpemUgKyB0aGlzLnJlYWRzICsgdGhpcy5mYWlsZWQgKyB0aGlzLmRyb3BwZWQgKyB0aGlzLm9taXR0ZWRSb3dzID4gMCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTxBdHRlbXB0U3RvcmFnZVN0YXRzPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZy5zaXplID09PSAwKSByZXR1cm4gdGhpcy5zdG9yYWdlKCk7XG4gICAgbGV0IGNhbmNlbFRpbWVyOiAoKSA9PiB2b2lkID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICBQcm9taXNlLmFsbChbLi4udGhpcy5wZW5kaW5nXSksXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dChyZXNvbHZlLCB0aGlzLnRpbWVvdXRNcyk7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNhbmNlbFRpbWVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgfVxuXG4gIGJ5VGFyZ2V0KCk6IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5VGFyZ2V0J10ge1xuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSkuYnlUYXJnZXQ7XG4gIH1cblxuICBieVJ1bigpOiBBdHRlbXB0QWdncmVnYXRlWydieVJ1biddIHtcbiAgICByZXR1cm4gYWdncmVnYXRlQXR0ZW1wdHModGhpcy5yb3dzLnZhbHVlcygpLCB0aGlzLmV4ZW1wbGFycywgdGhpcy5zdG9yYWdlKCkpLmJ5UnVuO1xuICB9XG5cbiAgc2xvd2VzdCh0YXJnZXQ6IHN0cmluZywgbGltaXQgPSB0aGlzLmV4ZW1wbGFycykge1xuICAgIGNvbnN0IGNhcCA9IG9wdGlvbihsaW1pdCwgdGhpcy5leGVtcGxhcnMsIDEwMCwgJ2xpbWl0JywgdHJ1ZSk7XG4gICAgcmV0dXJuIHdvcnN0KFxuICAgICAgdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnICYmIHJvdy50YXJnZXQgPT09IHRhcmdldCksXG4gICAgICBjYXAsXG4gICAgKTtcbiAgfVxuXG4gIHNlcmllcyhzZXJpZXM6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB7IGF0dGVtcHRzOiBQaHlzaWNhbEF0dGVtcHRSb3dbXTsgZGVjaXNpb25zOiBBdHRlbXB0RGVjaXNpb25Sb3dbXSB9IHtcbiAgICBjb25zdCBoZWxkID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiBydW5JZCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5ydW5JZCA9PT0gcnVuSWQpO1xuICAgIGNvbnN0IGxpbmtlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGhlbGQpXG4gICAgICBpZiAocm93LmtpbmQgPT09ICdhdHRlbXB0JyAmJiByb3cuc2VyaWVzID09PSBzZXJpZXMgJiYgcm93LnJldHJ5TG9vcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBsaW5rZWQuYWRkKEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5yZXRyeUxvb3Auc2VyaWVzXSkpO1xuICAgIGNvbnN0IHJvd3MgPSBoZWxkLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHJvdy5raW5kICE9PSAncnVuJyAmJlxuICAgICAgICAocm93LnNlcmllcyA9PT0gc2VyaWVzIHx8XG4gICAgICAgICAgKHJvdy5raW5kID09PSAnYXR0ZW1wdCcgJiYgcm93LnJldHJ5TG9vcD8uc2VyaWVzID09PSBzZXJpZXMpIHx8XG4gICAgICAgICAgbGlua2VkLmhhcyhKU09OLnN0cmluZ2lmeShbcm93LnJ1bklkLCByb3cua2luZCA9PT0gJ2F0dGVtcHQnID8gcm93LnJldHJ5TG9vcD8uc2VyaWVzIDogcm93LnNlcmllc10pKSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHtcbiAgICAgIGF0dGVtcHRzOiByb3dzLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKSxcbiAgICAgIGRlY2lzaW9uczogcm93cy5maWx0ZXIoKHJvdyk6IHJvdyBpcyBBdHRlbXB0RGVjaXNpb25Sb3cgPT4gcm93LmtpbmQgPT09ICdkZWNpc2lvbicpLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYWdncmVnYXRlKHN1cHBsaWVkOiBBdHRlbXB0UXVlcnkgPSB7fSk6IFByb21pc2U8QXR0ZW1wdEFnZ3JlZ2F0ZT4ge1xuICAgIGNvbnN0IGFkbWl0dGVkID0gb3duRGF0YVJlY29yZChzdXBwbGllZCk7XG4gICAgaWYgKGFkbWl0dGVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F0dGVtcHRzOiBpbnZhbGlkIHF1ZXJ5Jyk7XG4gICAgY29uc3QgeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSA9IGFkbWl0dGVkIGFzIEF0dGVtcHRRdWVyeTtcbiAgICBpZiAoXG4gICAgICAoc2luY2UgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZShzaW5jZSkgfHwgc2luY2UgPCAwKSkgfHxcbiAgICAgICh1bnRpbCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzRmluaXRlKHVudGlsKSB8fCB1bnRpbCA8IDApKSB8fFxuICAgICAgKHNpbmNlICE9PSB1bmRlZmluZWQgJiYgdW50aWwgIT09IHVuZGVmaW5lZCAmJiBzaW5jZSA+IHVudGlsKSB8fFxuICAgICAgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJyB8fCB0YXJnZXQubGVuZ3RoID09PSAwKSkgfHxcbiAgICAgIChydW5JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnIHx8IHJ1bklkLmxlbmd0aCA9PT0gMCkpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgcXVlcnknKTtcbiAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5mcmVlemUoeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSk7XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuc3RvcmUgPT09IHVuZGVmaW5lZCA/IHRoaXMucm93cy52YWx1ZXMoKSA6IGF3YWl0IHRoaXMucmVhZFN0b3JlZChxdWVyeSk7XG4gICAgY29uc3Qgcm93czogQXR0ZW1wdFJvd1tdID0gW107XG4gICAgY29uc3Qgd2luZG93ID0gbWV0cmljV2luZG93KHJhdywgdGhpcy5tYXhSb3dzKTtcbiAgICBsZXQgaW52YWxpZCA9IHdpbmRvdy5vbWl0dGVkO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygd2luZG93LnZhbHVlcykge1xuICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgIGlmIChyb3cgJiYgbWF0Y2hlc1F1ZXJ5KHJvdywgcXVlcnkpKSByb3dzLnB1c2gocm93KTtcbiAgICAgIGVsc2UgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSBpbnZhbGlkKys7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgc3RvcmVPbWl0dGVkID0gMDtcbiAgICBsZXQgYWNjb3VudGluZ1Vua25vd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zdG9yZT8uc3RhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBvd25EYXRhUmVjb3JkKHRoaXMuc3RvcmUuc3RhdHMoKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdGF0cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgdHlwZW9mIHN0YXRzLm9taXR0ZWRSb3dzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihzdGF0cy5vbWl0dGVkUm93cykgfHxcbiAgICAgICAgICBzdGF0cy5vbWl0dGVkUm93cyA8IDBcbiAgICAgICAgKVxuICAgICAgICAgIGFjY291bnRpbmdVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBzdG9yZU9taXR0ZWQgPSBzdGF0cy5vbWl0dGVkUm93cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhY2NvdW50aW5nVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyhyb3dzLCB0aGlzLmV4ZW1wbGFycywge1xuICAgICAgLi4uc3RvcmFnZSxcbiAgICAgIG9taXR0ZWRSb3dzOiBzdG9yYWdlLm9taXR0ZWRSb3dzICsgaW52YWxpZCArIHN0b3JlT21pdHRlZCxcbiAgICAgIGluY29tcGxldGU6IHN0b3JhZ2UuaW5jb21wbGV0ZSB8fCBpbnZhbGlkICsgc3RvcmVPbWl0dGVkID4gMCB8fCBhY2NvdW50aW5nVW5rbm93bixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFN0b3JlZChxdWVyeTogQXR0ZW1wdFF1ZXJ5KTogUHJvbWlzZTxyZWFkb25seSBBdHRlbXB0Um93W10+IHtcbiAgICBpZiAodGhpcy5yZWFkcyArIHRoaXMucGVuZGluZy5zaXplID49IHRoaXMubWF4UGVuZGluZykgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBjYXBhY2l0eSByZWFjaGVkJyk7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgIGlmIChzdG9yZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5yb3dzLnZhbHVlcygpO1xuICAgIHRoaXMucmVhZHMrKztcbiAgICBsZXQgY2FuY2VsVGltZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgIGlmICghcmVsZWFzZWQpIHtcbiAgICAgICAgcmVsZWFzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlYWRzLS07XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBBIHRpbWVkLW91dCBJL08gc3RpbGwgb3ducyBpdHMgc2xvdCB1bnRpbCBpdCBzZXR0bGVzOiBhIGNhbGxlciBjYW5ub3QgY3JlYXRlIGFuIHVuYm91bmRlZCBwb29sIG9mIHN0dWNrIHJlYWRzLlxuICAgIGNvbnN0IHdvcmsgPSBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgLnRoZW4oKCkgPT4gc3RvcmUucmVhZChxdWVyeSkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJvd3MpID0+IHtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd3MpKSB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHRzOiBpbnZhbGlkIHN0b3JlIHJvd3MnKTtcbiAgICAgICAgICByZXR1cm4gcm93cztcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHRzOiBzdG9yZSByZWFkIGZhaWxlZCcpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHdvcmssXG4gICAgICAgIG5ldyBQcm9taXNlPG5ldmVyPigoX3Jlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNhbmNlbFRpbWVyID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignYXR0ZW1wdHM6IHN0b3JlIHJlYWQgdGltZWQgb3V0JykpLCB0aGlzLnRpbWVvdXRNcyk7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNhbmNlbFRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBzdGF0cyA9IGFnZ3JlZ2F0ZUF0dGVtcHRzKHRoaXMucm93cy52YWx1ZXMoKSwgdGhpcy5leGVtcGxhcnMsIHRoaXMuc3RvcmFnZSgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ0F0dGVtcHRzJyxcbiAgICAgIGRhdGE6IHsgYnlUYXJnZXQ6IHN0YXRzLmJ5VGFyZ2V0LCBieVJ1bjogc3RhdHMuYnlSdW4gfSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgcHJvamVjdGlvbjogJ3Blci10YXJnZXQnLFxuICAgICAgICBleGVtcGxhcnM6IHRoaXMuZXhlbXBsYXJzLFxuICAgICAgICByb3dzOiB0aGlzLnJvd3Muc2l6ZSxcbiAgICAgICAgbWF4Um93czogdGhpcy5tYXhSb3dzLFxuICAgICAgICBzdG9yYWdlOiBzdGF0cy5zdG9yYWdlLFxuICAgICAgICB3b3JrVGltZTogJ3N1bS1vZi1hdHRlbXB0LWR1cmF0aW9ucycsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0b09UZWwoKSB7XG4gICAgcmV0dXJuIGF0dGVtcHRPVGVsKFxuICAgICAgdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKSxcbiAgICAgIHRoaXMuYnlUYXJnZXQoKSxcbiAgICAgIHRoaXMuZXhlbXBsYXJzLFxuICAgICk7XG4gIH1cblxuICAvKiogQ2xlYXIgY29tcGxldGVkIGxvY2FsIHByb2plY3Rpb25zOyBhY3RpdmUvcGF1c2VkIGV2aWRlbmNlIGFuZCBib3VuZGVkIG93bmVyc2hpcCBzdXJ2aXZlIGV4ZWN1dG9yIGF1dG8tY2xlYXIuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpID0+IHRoaXMuc3RhcnRzLmhhcyhyb3cucnVuSWQpKTtcbiAgICB0aGlzLnJvd3MuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBrZXB0KSB0aGlzLnJvd3Muc2V0KGF0dGVtcHRSb3dLZXkocm93KSwgcm93KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJvd10gb2YgdGhpcy5sb2dpY2FsKSBpZiAoIXRoaXMuc3RhcnRzLmhhcyhyb3cucnVuSWQpKSB0aGlzLmxvZ2ljYWwuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuc3RhcnRzLnNpemUgPT09IDApIHRoaXMub21pdHRlZFJvd3MgPSAwO1xuICB9XG59XG5cbi8qKiBCb3VuZGVkIHJlZmVyZW5jZSBhZGFwdGVyIGZvciB0ZXN0cy9sb2NhbCB1c2U7IGFwcHMgc3VwcGx5IHRoZWlyIG93biBkYXRhYmFzZSBhZGFwdGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeVN0b3JlKFxuICBvcHRpb25zOiB7IHJlYWRvbmx5IG1heFJvd3M/OiBudW1iZXIgfSA9IHt9LFxuKTogQXR0ZW1wdFN0b3JlICYgeyBzdGF0cygpOiB7IHJvd3M6IG51bWJlcjsgb21pdHRlZFJvd3M6IG51bWJlciB9IH0ge1xuICBjb25zdCBtYXggPSBvcHRpb24ob3B0aW9ucy5tYXhSb3dzLCAxMDAwMCwgMTAwMDAwLCAnbWF4Um93cycpO1xuICBjb25zdCByb3dzID0gbmV3IE1hcDxudW1iZXIsIEF0dGVtcHRSb3c+KCk7XG4gIGxldCBvbWl0dGVkID0gMDtcbiAgbGV0IG9yZGluYWwgPSAwO1xuICByZXR1cm4ge1xuICAgIGFwcGVuZChpbmNvbWluZykge1xuICAgICAgY29uc3Qgd2luZG93ID0gbWV0cmljV2luZG93KGluY29taW5nLCBtYXgpO1xuICAgICAgb21pdHRlZCArPSB3aW5kb3cub21pdHRlZDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygd2luZG93LnZhbHVlcykge1xuICAgICAgICBjb25zdCByb3cgPSBtZXRyaWNSb3codmFsdWUpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIG9taXR0ZWQrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93cy5zaXplID49IG1heCkge1xuICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IHJvd3Mua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHJvd3MuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgICAgb21pdHRlZCsrO1xuICAgICAgICB9XG4gICAgICAgIHJvd3Muc2V0KCsrb3JkaW5hbCwgcm93KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHJlYWQocXVlcnkpIHtcbiAgICAgIHJldHVybiBbLi4ucm93cy52YWx1ZXMoKV0uZmlsdGVyKChyb3cpID0+IG1hdGNoZXNRdWVyeShyb3csIHF1ZXJ5KSkubWFwKChyb3cpID0+IHN0cnVjdHVyZWRDbG9uZShyb3cpKTtcbiAgICB9LFxuICAgIHN0YXRzKCkge1xuICAgICAgcmV0dXJuIHsgcm93czogcm93cy5zaXplLCBvbWl0dGVkUm93czogb21pdHRlZCB9O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -322,7 +322,9 @@ export declare class FlowChartExecutor<TOut = any, TScope = any> {
322
322
  * Flush the deferred-observer backlog, then await async listener completions
323
323
  * under a deadline — call before a serverless process freezes or exits.
324
324
  * Zeros when no deferred observer was attached; `pending > 0` reports what
325
- * was still outstanding at the deadline.
325
+ * was still outstanding at the deadline. `timeoutMs` defaults to 30 000;
326
+ * `Infinity` waits for every listener and arms no timer, and a limit past
327
+ * 2^31 − 1 ms is waited in full (`timers/longTimeout.ts`).
326
328
  */
327
329
  drainObservers(opts?: {
328
330
  timeoutMs?: number;
@@ -330,7 +332,10 @@ export declare class FlowChartExecutor<TOut = any, TScope = any> {
330
332
  /**
331
333
  * Flush the record sink (10.1, P6): await the adapter's `flush()` — for an executor built with
332
334
  * `sink: { adapter, flush: 'manual' }`, or before a serverless process freezes. `timeoutMs` bounds the wait; a
333
- * flush still running then is `pending` (and keeps running). A failed flush is counted on `getSnapshot().sink`.
335
+ * flush still running then is `pending` (and keeps running). The limit follows the one long-timer law, as
336
+ * `drainObservers` does: `Infinity` waits for the flush and arms no timer, a limit past 2^31 − 1 ms is waited in
337
+ * full, and a value that is not a number > 0 (`NaN`, a negative, `-Infinity`) gives up at once. A failed flush is
338
+ * counted on `getSnapshot().sink`.
334
339
  * Done at once without a sink, or with an adapter that has no `flush`.
335
340
  *
336
341
  * @example