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
@@ -10,6 +10,7 @@
10
10
  * The brand is a module-private WeakSet: an ordinary `Error` (same message, same name a run with `timeoutMs` always
11
11
  * rejected with), recognisable only by identity.
12
12
  */
13
+ import { setLongTimeout } from '../timers/longTimeout.js';
13
14
  import { anySignal } from './anySignal.js';
14
15
  const DEADLINE_REASONS = new WeakSet();
15
16
  /** The reason the run's signal aborts with when its deadline passes — an `Error`, branded as the deadline's. */
@@ -39,32 +40,6 @@ export function isCancelled(signal) {
39
40
  export function readDeadline(value) {
40
41
  return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
41
42
  }
42
- /** The longest delay a host timer honours (2^31 − 1 ms, ~24.8 days); a longer one fires at once. */
43
- const MAX_TIMER_MS = 2_147_483_647;
44
- /**
45
- * `setTimeout` for any delay: a delay past the host's limit is waited in chunks, so a 30-day deadline does not fire
46
- * in a millisecond. Returns the one call that cancels it.
47
- */
48
- export function setLongTimeout(fn, ms) {
49
- let timer;
50
- let cancelled = false;
51
- const arm = (left) => {
52
- timer = setTimeout(() => {
53
- if (cancelled)
54
- return;
55
- if (left > MAX_TIMER_MS)
56
- arm(left - MAX_TIMER_MS);
57
- else
58
- fn();
59
- }, Math.min(left, MAX_TIMER_MS));
60
- };
61
- arm(Math.max(0, ms));
62
- return () => {
63
- cancelled = true;
64
- if (timer !== undefined)
65
- clearTimeout(timer);
66
- };
67
- }
68
43
  /** Whether `value` is an AbortSignal (structurally — a signal from another realm counts). */
69
44
  export function isAbortSignal(value) {
70
45
  return (typeof value === 'object' &&
@@ -98,4 +73,4 @@ export function armDeadline(signal, deadline, message, now = Date.now) {
98
73
  },
99
74
  };
100
75
  }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVhZGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0FBRS9DLGdIQUFnSDtBQUNoSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE9BQWU7SUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBbUIsTUFBUztJQUN2RCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHFHQUFxRztBQUNyRyxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBZTtJQUM5QyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBK0I7SUFDekQsT0FBTyxNQUFNLEVBQUUsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYztJQUN6QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUVuQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQWMsRUFBRSxFQUFVO0lBQ3ZELElBQUksS0FBZ0QsQ0FBQztJQUNyRCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUMzQixLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUN0QixJQUFJLFNBQVM7Z0JBQUUsT0FBTztZQUN0QixJQUFJLElBQUksR0FBRyxZQUFZO2dCQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUM7O2dCQUM3QyxFQUFFLEVBQUUsQ0FBQztRQUNaLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxFQUFFO1FBQ1YsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFjO0lBQzFDLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsT0FBUSxLQUFxQixDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQ25ELE9BQVEsS0FBcUIsQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVO1FBQzdELE9BQVEsS0FBcUIsQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLENBQ2pFLENBQUM7QUFDSixDQUFDO0FBUUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLE1BQStCLEVBQy9CLFFBQTRCLEVBQzVCLE9BQWUsRUFDZixNQUFvQixJQUFJLENBQUMsR0FBRztJQUU1QixJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUM5QixJQUFJLE1BQU0sR0FBZSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDekMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBQzlCLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixNQUFNLEVBQUUsQ0FBQztZQUNULFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvZGVhZGxpbmUudHMg4oCUIHdoYXQgdGhlIHJ1bidzIGRlYWRsaW5lIElTLCB0byBldmVyeXRoaW5nIHRoYXQgcmVhZHMgdGltZSAoZGVzaWduIMKnMy4xLCBsYXcgMykuXG4gKlxuICogVGhlIGRlYWRsaW5lIGlzIG9uZSBudW1iZXIsIGVwb2NoIG1pbGxpc2Vjb25kcyAoYGVudi5kZWFkbGluZWApOyB0aGUgZXhlY3V0b3IgYXJtcyB0aGUgcnVuJ3Mgc2lnbmFsIHRvIGFib3J0IHdoZW5cbiAqIGl0IHBhc3NlcyAoYHJ1bm5lci9kZWFkbGluZS50cyDCtyBhcm1SdW5gKS4gUmVhY2hpbmcgaXQgaXMgTk9UIGEgY2FuY2VsbGF0aW9uOiBhbiBhdHRlbXB0IHRoZSBkZWFkbGluZSBjdXRzIHNob3J0XG4gKiB0aW1lZCBvdXQgKGl0IGhhZCBubyBhbnN3ZXIgaW4gdGhlIHRpbWUgaXQgaGFkIOKAlCBsYXcgNCksIGFuZCB0aGUgc2VyaWVzIHN0b3BzIGBuby10aW1lLWxlZnRgLCBub3QgYGFib3J0ZWRgLiBTb1xuICogdGhlIHJlYXNvbiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0cyB3aXRoIGF0IHRoZSBkZWFkbGluZSBpcyBCUkFOREVEIGhlcmUsIGFuZCB0aGUgYXR0ZW1wdCBydW5uZXIgdGVsbHMgdGhlIHR3b1xuICogYXBhcnQgYnkgdGhlIGJyYW5kIOKAlCBuZXZlciBieSB0aGUgbWVzc2FnZSwgbmV2ZXIgYnkgdGhlIGNsb2NrLlxuICpcbiAqIFRoZSBicmFuZCBpcyBhIG1vZHVsZS1wcml2YXRlIFdlYWtTZXQ6IGFuIG9yZGluYXJ5IGBFcnJvcmAgKHNhbWUgbWVzc2FnZSwgc2FtZSBuYW1lIGEgcnVuIHdpdGggYHRpbWVvdXRNc2AgYWx3YXlzXG4gKiByZWplY3RlZCB3aXRoKSwgcmVjb2duaXNhYmxlIG9ubHkgYnkgaWRlbnRpdHkuXG4gKi9cblxuaW1wb3J0IHsgYW55U2lnbmFsIH0gZnJvbSAnLi9hbnlTaWduYWwuanMnO1xuXG5jb25zdCBERUFETElORV9SRUFTT05TID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4vKiogVGhlIHJlYXNvbiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0cyB3aXRoIHdoZW4gaXRzIGRlYWRsaW5lIHBhc3NlcyDigJQgYW4gYEVycm9yYCwgYnJhbmRlZCBhcyB0aGUgZGVhZGxpbmUncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWFkbGluZVJlYXNvbihtZXNzYWdlOiBzdHJpbmcpOiBFcnJvciB7XG4gIGNvbnN0IHJlYXNvbiA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgREVBRExJTkVfUkVBU09OUy5hZGQocmVhc29uKTtcbiAgcmV0dXJuIHJlYXNvbjtcbn1cblxuLyoqXG4gKiBCcmFuZCBgcmVhc29uYCBhcyBhIHRpbWUgbGltaXQg4oCUIHdoYXQgYW4gYXR0ZW1wdCdzIG93biBjYXAgYWJvcnRzIHdpdGggKFAyKS4gQW4gYXR0ZW1wdCdzIGNhcCBpcyB0aGUgZGVhZGxpbmUgb2ZcbiAqIGV2ZXJ5IGNhbGwgbWFkZSBpbnNpZGUgaXQgKGBhdHRlbXB0L2NhbGwudHNgKSwgc28gYSBjYWxsIGl0IGN1dHMgcmFuIG91dCBvZiB0aW1lOiBgJ3RpbWVvdXQnYCwgbmV2ZXIgYCdhYm9ydGVkJ2AuXG4gKiBUaGUgcnVuJ3Mgb3duIHNpZ25hbCBuZXZlciBhYm9ydHMgd2l0aCBpdCwgc28gYSBzdGFnZSBhdHRlbXB0IHJlYWRzIG5vdGhpbmcgbmV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya1RpbWVMaW1pdDxUIGV4dGVuZHMgb2JqZWN0PihyZWFzb246IFQpOiBUIHtcbiAgREVBRExJTkVfUkVBU09OUy5hZGQocmVhc29uKTtcbiAgcmV0dXJuIHJlYXNvbjtcbn1cblxuLyoqIFdoZXRoZXIgYHJlYXNvbmAgaXMgdGhlIHJ1bidzIGRlYWRsaW5lIG9yIGFuIGF0dGVtcHQncyBjYXAg4oCUIGEgdGltZSBsaW1pdCwgbm90IGEgY2FuY2VsbGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVhZGxpbmVSZWFzb24ocmVhc29uOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgcmVhc29uID09PSAnb2JqZWN0JyAmJiByZWFzb24gIT09IG51bGwgJiYgREVBRExJTkVfUkVBU09OUy5oYXMocmVhc29uKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHNpZ25hbCBhYm9ydGVkIGZvciBhIHJlYXNvbiBPVEhFUiB0aGFuIGEgdGltZSBsaW1pdCDigJQgYSBjYW5jZWxsYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsZWQoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2lnbmFsPy5hYm9ydGVkID09PSB0cnVlICYmICFpc0RlYWRsaW5lUmVhc29uKHNpZ25hbC5yZWFzb24pO1xufVxuXG4vKiogQSBkZWFkbGluZSBhcyB0aGUgZW5naW5lIHJlYWRzIG9uZTogYSBmaW5pdGUgbnVtYmVyIChlcG9jaCBtcyksIGVsc2Ugbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGVhZGxpbmUodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgbG9uZ2VzdCBkZWxheSBhIGhvc3QgdGltZXIgaG9ub3VycyAoMl4zMSDiiJIgMSBtcywgfjI0LjggZGF5cyk7IGEgbG9uZ2VyIG9uZSBmaXJlcyBhdCBvbmNlLiAqL1xuY29uc3QgTUFYX1RJTUVSX01TID0gMl8xNDdfNDgzXzY0NztcblxuLyoqXG4gKiBgc2V0VGltZW91dGAgZm9yIGFueSBkZWxheTogYSBkZWxheSBwYXN0IHRoZSBob3N0J3MgbGltaXQgaXMgd2FpdGVkIGluIGNodW5rcywgc28gYSAzMC1kYXkgZGVhZGxpbmUgZG9lcyBub3QgZmlyZVxuICogaW4gYSBtaWxsaXNlY29uZC4gUmV0dXJucyB0aGUgb25lIGNhbGwgdGhhdCBjYW5jZWxzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9uZ1RpbWVvdXQoZm46ICgpID0+IHZvaWQsIG1zOiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICBjb25zdCBhcm0gPSAobGVmdDogbnVtYmVyKSA9PiB7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgIGlmIChsZWZ0ID4gTUFYX1RJTUVSX01TKSBhcm0obGVmdCAtIE1BWF9USU1FUl9NUyk7XG4gICAgICBlbHNlIGZuKCk7XG4gICAgfSwgTWF0aC5taW4obGVmdCwgTUFYX1RJTUVSX01TKSk7XG4gIH07XG4gIGFybShNYXRoLm1heCgwLCBtcykpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIGB2YWx1ZWAgaXMgYW4gQWJvcnRTaWduYWwgKHN0cnVjdHVyYWxseSDigJQgYSBzaWduYWwgZnJvbSBhbm90aGVyIHJlYWxtIGNvdW50cykuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEFib3J0U2lnbmFsIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEFib3J0U2lnbmFsKS5hYm9ydGVkID09PSAnYm9vbGVhbicgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEFib3J0U2lnbmFsKS5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufVxuXG4vKiogQSBzaWduYWwgdGhhdCBhYm9ydHMgYXQgYSBkZWFkbGluZSAob3Igd2l0aCBpdHMgaW5wdXQpLCBhbmQgdGhlIG9uZSBjYWxsIHRoYXQgcmVsZWFzZXMgYm90aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJtZWREZWFkbGluZSB7XG4gIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb21wb3NlIGBzaWduYWxgIHdpdGggYSB0aW1lciB0aGF0IGFib3J0cyBhdCBgZGVhZGxpbmVgIChlcG9jaCBtcykgd2l0aCBhIGJyYW5kZWQge0BsaW5rIGRlYWRsaW5lUmVhc29ufSDigJQgc28gdGhlXG4gKiBhdHRlbXB0IHJ1bm5lcidzIHJlYWRpbmcgaG9sZHM6IHRoZSBzaWduYWwgaXQgaXMgaGFuZGVkIGFib3J0cyBhdCB0aGUgZGVhZGxpbmUsIGFzIHRoZSBydW4ncyBkb2VzIChgYXJtUnVuYCkuIEFcbiAqIGRlYWRsaW5lIGFscmVhZHkgcGFzdCBhYm9ydHMgYXQgb25jZTsgd2l0aG91dCBhIGRlYWRsaW5lIHRoZSBzaWduYWwgaXMgaGFuZGVkIGJhY2sgYXMgaXQgaXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcm1EZWFkbGluZShcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBub3c6ICgpID0+IG51bWJlciA9IERhdGUubm93LFxuKTogQXJtZWREZWFkbGluZSB7XG4gIGlmIChkZWFkbGluZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBzaWduYWwsIGRpc3Bvc2U6ICgpID0+IHVuZGVmaW5lZCB9O1xuICBjb25zdCB0aW1lciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgY29tcG9zZWQgPSBhbnlTaWduYWwoW3NpZ25hbCwgdGltZXIuc2lnbmFsXSk7XG4gIGNvbnN0IHJlYXNvbiA9IGRlYWRsaW5lUmVhc29uKG1lc3NhZ2UpO1xuICBjb25zdCBsZWZ0ID0gZGVhZGxpbmUgLSBub3coKTtcbiAgbGV0IGNhbmNlbDogKCkgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgaWYgKGxlZnQgPD0gMCkgdGltZXIuYWJvcnQocmVhc29uKTtcbiAgZWxzZSBjYW5jZWwgPSBzZXRMb25nVGltZW91dCgoKSA9PiB0aW1lci5hYm9ydChyZWFzb24pLCBsZWZ0KTtcbiAgcmV0dXJuIHtcbiAgICBzaWduYWw6IGNvbXBvc2VkLnNpZ25hbCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBjYW5jZWwoKTtcbiAgICAgIGNvbXBvc2VkLmRpc3Bvc2UoKTtcbiAgICB9LFxuICB9O1xufVxuIl19
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVhZGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztBQUUvQyxnSEFBZ0g7QUFDaEgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQW1CLE1BQVM7SUFDdkQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxxR0FBcUc7QUFDckcsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQStCO0lBQ3pELE9BQU8sTUFBTSxFQUFFLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWM7SUFDekMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFRLEtBQXFCLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFDbkQsT0FBUSxLQUFxQixDQUFDLGdCQUFnQixLQUFLLFVBQVU7UUFDN0QsT0FBUSxLQUFxQixDQUFDLG1CQUFtQixLQUFLLFVBQVUsQ0FDakUsQ0FBQztBQUNKLENBQUM7QUFRRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsTUFBK0IsRUFDL0IsUUFBNEIsRUFDNUIsT0FBZSxFQUNmLE1BQW9CLElBQUksQ0FBQyxHQUFHO0lBRTVCLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4RSxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQzlCLElBQUksTUFBTSxHQUFlLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztJQUN6QyxJQUFJLElBQUksSUFBSSxDQUFDO1FBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs7UUFDOUIsTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlELE9BQU87UUFDTCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNaLE1BQU0sRUFBRSxDQUFDO1lBQ1QsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9kZWFkbGluZS50cyDigJQgd2hhdCB0aGUgcnVuJ3MgZGVhZGxpbmUgSVMsIHRvIGV2ZXJ5dGhpbmcgdGhhdCByZWFkcyB0aW1lIChkZXNpZ24gwqczLjEsIGxhdyAzKS5cbiAqXG4gKiBUaGUgZGVhZGxpbmUgaXMgb25lIG51bWJlciwgZXBvY2ggbWlsbGlzZWNvbmRzIChgZW52LmRlYWRsaW5lYCk7IHRoZSBleGVjdXRvciBhcm1zIHRoZSBydW4ncyBzaWduYWwgdG8gYWJvcnQgd2hlblxuICogaXQgcGFzc2VzIChgcnVubmVyL2RlYWRsaW5lLnRzIMK3IGFybVJ1bmApLiBSZWFjaGluZyBpdCBpcyBOT1QgYSBjYW5jZWxsYXRpb246IGFuIGF0dGVtcHQgdGhlIGRlYWRsaW5lIGN1dHMgc2hvcnRcbiAqIHRpbWVkIG91dCAoaXQgaGFkIG5vIGFuc3dlciBpbiB0aGUgdGltZSBpdCBoYWQg4oCUIGxhdyA0KSwgYW5kIHRoZSBzZXJpZXMgc3RvcHMgYG5vLXRpbWUtbGVmdGAsIG5vdCBgYWJvcnRlZGAuIFNvXG4gKiB0aGUgcmVhc29uIHRoZSBydW4ncyBzaWduYWwgYWJvcnRzIHdpdGggYXQgdGhlIGRlYWRsaW5lIGlzIEJSQU5ERUQgaGVyZSwgYW5kIHRoZSBhdHRlbXB0IHJ1bm5lciB0ZWxscyB0aGUgdHdvXG4gKiBhcGFydCBieSB0aGUgYnJhbmQg4oCUIG5ldmVyIGJ5IHRoZSBtZXNzYWdlLCBuZXZlciBieSB0aGUgY2xvY2suXG4gKlxuICogVGhlIGJyYW5kIGlzIGEgbW9kdWxlLXByaXZhdGUgV2Vha1NldDogYW4gb3JkaW5hcnkgYEVycm9yYCAoc2FtZSBtZXNzYWdlLCBzYW1lIG5hbWUgYSBydW4gd2l0aCBgdGltZW91dE1zYCBhbHdheXNcbiAqIHJlamVjdGVkIHdpdGgpLCByZWNvZ25pc2FibGUgb25seSBieSBpZGVudGl0eS5cbiAqL1xuXG5pbXBvcnQgeyBzZXRMb25nVGltZW91dCB9IGZyb20gJy4uL3RpbWVycy9sb25nVGltZW91dC5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5cbmNvbnN0IERFQURMSU5FX1JFQVNPTlMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbi8qKiBUaGUgcmVhc29uIHRoZSBydW4ncyBzaWduYWwgYWJvcnRzIHdpdGggd2hlbiBpdHMgZGVhZGxpbmUgcGFzc2VzIOKAlCBhbiBgRXJyb3JgLCBicmFuZGVkIGFzIHRoZSBkZWFkbGluZSdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWRsaW5lUmVhc29uKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yIHtcbiAgY29uc3QgcmVhc29uID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBERUFETElORV9SRUFTT05TLmFkZChyZWFzb24pO1xuICByZXR1cm4gcmVhc29uO1xufVxuXG4vKipcbiAqIEJyYW5kIGByZWFzb25gIGFzIGEgdGltZSBsaW1pdCDigJQgd2hhdCBhbiBhdHRlbXB0J3Mgb3duIGNhcCBhYm9ydHMgd2l0aCAoUDIpLiBBbiBhdHRlbXB0J3MgY2FwIGlzIHRoZSBkZWFkbGluZSBvZlxuICogZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCAoYGF0dGVtcHQvY2FsbC50c2ApLCBzbyBhIGNhbGwgaXQgY3V0cyByYW4gb3V0IG9mIHRpbWU6IGAndGltZW91dCdgLCBuZXZlciBgJ2Fib3J0ZWQnYC5cbiAqIFRoZSBydW4ncyBvd24gc2lnbmFsIG5ldmVyIGFib3J0cyB3aXRoIGl0LCBzbyBhIHN0YWdlIGF0dGVtcHQgcmVhZHMgbm90aGluZyBuZXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrVGltZUxpbWl0PFQgZXh0ZW5kcyBvYmplY3Q+KHJlYXNvbjogVCk6IFQge1xuICBERUFETElORV9SRUFTT05TLmFkZChyZWFzb24pO1xuICByZXR1cm4gcmVhc29uO1xufVxuXG4vKiogV2hldGhlciBgcmVhc29uYCBpcyB0aGUgcnVuJ3MgZGVhZGxpbmUgb3IgYW4gYXR0ZW1wdCdzIGNhcCDigJQgYSB0aW1lIGxpbWl0LCBub3QgYSBjYW5jZWxsYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWFkbGluZVJlYXNvbihyZWFzb246IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiByZWFzb24gPT09ICdvYmplY3QnICYmIHJlYXNvbiAhPT0gbnVsbCAmJiBERUFETElORV9SRUFTT05TLmhhcyhyZWFzb24pO1xufVxuXG4vKiogV2hldGhlciB0aGUgc2lnbmFsIGFib3J0ZWQgZm9yIGEgcmVhc29uIE9USEVSIHRoYW4gYSB0aW1lIGxpbWl0IOKAlCBhIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbmNlbGxlZChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYWw/LmFib3J0ZWQgPT09IHRydWUgJiYgIWlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbik7XG59XG5cbi8qKiBBIGRlYWRsaW5lIGFzIHRoZSBlbmdpbmUgcmVhZHMgb25lOiBhIGZpbml0ZSBudW1iZXIgKGVwb2NoIG1zKSwgZWxzZSBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWREZWFkbGluZSh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFdoZXRoZXIgYHZhbHVlYCBpcyBhbiBBYm9ydFNpZ25hbCAoc3RydWN0dXJhbGx5IOKAlCBhIHNpZ25hbCBmcm9tIGFub3RoZXIgcmVhbG0gY291bnRzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Fib3J0U2lnbmFsKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQWJvcnRTaWduYWwge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLmFib3J0ZWQgPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEFib3J0U2lnbmFsKS5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nXG4gICk7XG59XG5cbi8qKiBBIHNpZ25hbCB0aGF0IGFib3J0cyBhdCBhIGRlYWRsaW5lIChvciB3aXRoIGl0cyBpbnB1dCksIGFuZCB0aGUgb25lIGNhbGwgdGhhdCByZWxlYXNlcyBib3RoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcm1lZERlYWRsaW5lIHtcbiAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbXBvc2UgYHNpZ25hbGAgd2l0aCBhIHRpbWVyIHRoYXQgYWJvcnRzIGF0IGBkZWFkbGluZWAgKGVwb2NoIG1zKSB3aXRoIGEgYnJhbmRlZCB7QGxpbmsgZGVhZGxpbmVSZWFzb259IOKAlCBzbyB0aGVcbiAqIGF0dGVtcHQgcnVubmVyJ3MgcmVhZGluZyBob2xkczogdGhlIHNpZ25hbCBpdCBpcyBoYW5kZWQgYWJvcnRzIGF0IHRoZSBkZWFkbGluZSwgYXMgdGhlIHJ1bidzIGRvZXMgKGBhcm1SdW5gKS4gQVxuICogZGVhZGxpbmUgYWxyZWFkeSBwYXN0IGFib3J0cyBhdCBvbmNlOyB3aXRob3V0IGEgZGVhZGxpbmUgdGhlIHNpZ25hbCBpcyBoYW5kZWQgYmFjayBhcyBpdCBpcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFybURlYWRsaW5lKFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIG5vdzogKCkgPT4gbnVtYmVyID0gRGF0ZS5ub3csXG4pOiBBcm1lZERlYWRsaW5lIHtcbiAgaWYgKGRlYWRsaW5lID09PSB1bmRlZmluZWQpIHJldHVybiB7IHNpZ25hbCwgZGlzcG9zZTogKCkgPT4gdW5kZWZpbmVkIH07XG4gIGNvbnN0IHRpbWVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBjb21wb3NlZCA9IGFueVNpZ25hbChbc2lnbmFsLCB0aW1lci5zaWduYWxdKTtcbiAgY29uc3QgcmVhc29uID0gZGVhZGxpbmVSZWFzb24obWVzc2FnZSk7XG4gIGNvbnN0IGxlZnQgPSBkZWFkbGluZSAtIG5vdygpO1xuICBsZXQgY2FuY2VsOiAoKSA9PiB2b2lkID0gKCkgPT4gdW5kZWZpbmVkO1xuICBpZiAobGVmdCA8PSAwKSB0aW1lci5hYm9ydChyZWFzb24pO1xuICBlbHNlIGNhbmNlbCA9IHNldExvbmdUaW1lb3V0KCgpID0+IHRpbWVyLmFib3J0KHJlYXNvbiksIGxlZnQpO1xuICByZXR1cm4ge1xuICAgIHNpZ25hbDogY29tcG9zZWQuc2lnbmFsLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgY29tcG9zZWQuZGlzcG9zZSgpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -2,11 +2,13 @@
2
2
  * attempt/ — one runner, one record: every attempt the library runs is an `AttemptRecord` with the
3
3
  * retry-or-stop decision that followed it (design docs/design/2026-10-time-and-failure-evidence.md).
4
4
  *
5
- * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, and `attempt()`
6
- * — the runner for code that is not a stage (P2). The loop itself (`runAttempts`), `runCall`, the evidence builder
7
- * and `anySignal` are the engine's. `RetryPolicy` is declared in
8
- * `./types.ts` and published through the builder's barrel, where it always was.
5
+ * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, `attempt()`
6
+ * — the runner for code that is not a stage (P2) — and the backoff builders a `RetryPolicy.backoffMs` takes. The loop
7
+ * itself (`runAttempts`), `runCall`, the evidence builder, `anySignal` and the long-timer law are the engine's.
8
+ * `RetryPolicy` is declared in `./types.ts` and published through the builder's barrel, where it always was.
9
9
  */
10
+ export type { BackoffFunction, BackoffJitter, BackoffSpec, StatedWaitReader } from './backoff.js';
11
+ export { exponentialBackoff, statedWaitFirst } from './backoff.js';
10
12
  export { errorCategory } from './category.js';
11
13
  export type { ParsedTraceparent, TraceparentFields, TraceparentRefusal } from './correlation.js';
12
14
  export { formatTraceparent, parseTraceparent, TraceparentError } from './correlation.js';
@@ -2,14 +2,15 @@
2
2
  * attempt/ — one runner, one record: every attempt the library runs is an `AttemptRecord` with the
3
3
  * retry-or-stop decision that followed it (design docs/design/2026-10-time-and-failure-evidence.md).
4
4
  *
5
- * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, and `attempt()`
6
- * — the runner for code that is not a stage (P2). The loop itself (`runAttempts`), `runCall`, the evidence builder
7
- * and `anySignal` are the engine's. `RetryPolicy` is declared in
8
- * `./types.ts` and published through the builder's barrel, where it always was.
5
+ * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, `attempt()`
6
+ * — the runner for code that is not a stage (P2) — and the backoff builders a `RetryPolicy.backoffMs` takes. The loop
7
+ * itself (`runAttempts`), `runCall`, the evidence builder, `anySignal` and the long-timer law are the engine's.
8
+ * `RetryPolicy` is declared in `./types.ts` and published through the builder's barrel, where it always was.
9
9
  */
10
+ export { exponentialBackoff, statedWaitFirst } from './backoff.js';
10
11
  export { errorCategory } from './category.js';
11
12
  export { formatTraceparent, parseTraceparent, TraceparentError } from './correlation.js';
12
13
  export { retryRules } from './decision.js';
13
14
  export { AttemptTimeoutError, UnknownEffectError } from './errors.js';
14
15
  export { attempt } from './standalone.js';
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC8g4oCUIG9uZSBydW5uZXIsIG9uZSByZWNvcmQ6IGV2ZXJ5IGF0dGVtcHQgdGhlIGxpYnJhcnkgcnVucyBpcyBhbiBgQXR0ZW1wdFJlY29yZGAgd2l0aCB0aGVcbiAqIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gdGhhdCBmb2xsb3dlZCBpdCAoZGVzaWduIGRvY3MvZGVzaWduLzIwMjYtMTAtdGltZS1hbmQtZmFpbHVyZS1ldmlkZW5jZS5tZCkuXG4gKlxuICogUHVibGljOiB0aGUgcmVjb3JkJ3Mgdm9jYWJ1bGFyeSwgdGhlIG9uZSBmYWlsdXJlIGNsYXNzaWZpZXIsIHRoZSBvbmUgcnVsZSB0YWJsZSwgdGhlIHR3byBlcnJvcnMsIGFuZCBgYXR0ZW1wdCgpYFxuICog4oCUIHRoZSBydW5uZXIgZm9yIGNvZGUgdGhhdCBpcyBub3QgYSBzdGFnZSAoUDIpLiBUaGUgbG9vcCBpdHNlbGYgKGBydW5BdHRlbXB0c2ApLCBgcnVuQ2FsbGAsIHRoZSBldmlkZW5jZSBidWlsZGVyXG4gKiBhbmQgYGFueVNpZ25hbGAgYXJlIHRoZSBlbmdpbmUncy4gYFJldHJ5UG9saWN5YCBpcyBkZWNsYXJlZCBpblxuICogYC4vdHlwZXMudHNgIGFuZCBwdWJsaXNoZWQgdGhyb3VnaCB0aGUgYnVpbGRlcidzIGJhcnJlbCwgd2hlcmUgaXQgYWx3YXlzIHdhcy5cbiAqL1xuXG5leHBvcnQgeyBlcnJvckNhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5leHBvcnQgdHlwZSB7IFBhcnNlZFRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEZpZWxkcywgVHJhY2VwYXJlbnRSZWZ1c2FsIH0gZnJvbSAnLi9jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgeyBmb3JtYXRUcmFjZXBhcmVudCwgcGFyc2VUcmFjZXBhcmVudCwgVHJhY2VwYXJlbnRFcnJvciB9IGZyb20gJy4vY29ycmVsYXRpb24uanMnO1xuZXhwb3J0IHsgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuZXhwb3J0IHR5cGUgeyBVbmtub3duRWZmZWN0SW5pdCB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IEF0dGVtcHRUaW1lb3V0RXJyb3IsIFVua25vd25FZmZlY3RFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB0eXBlIHsgQXR0ZW1wdE9wdGlvbnMgfSBmcm9tICcuL3N0YW5kYWxvbmUuanMnO1xuZXhwb3J0IHsgYXR0ZW1wdCB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRFcnJvcixcbiAgQXR0ZW1wdElucHV0cyxcbiAgQXR0ZW1wdEtpbmQsXG4gIEF0dGVtcHROZXh0LFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlYXNvbixcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIENhbGxPcHRpb25zLFxuICBJZGVtcG90ZW5jeUtleUNvbnRleHQsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBSdW5Db3JyZWxhdGlvbixcbiAgU3RhZ2VUb3VjaGVzLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbiJdfQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFHSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0LyDigJQgb25lIHJ1bm5lciwgb25lIHJlY29yZDogZXZlcnkgYXR0ZW1wdCB0aGUgbGlicmFyeSBydW5zIGlzIGFuIGBBdHRlbXB0UmVjb3JkYCB3aXRoIHRoZVxuICogcmV0cnktb3Itc3RvcCBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIGl0IChkZXNpZ24gZG9jcy9kZXNpZ24vMjAyNi0xMC10aW1lLWFuZC1mYWlsdXJlLWV2aWRlbmNlLm1kKS5cbiAqXG4gKiBQdWJsaWM6IHRoZSByZWNvcmQncyB2b2NhYnVsYXJ5LCB0aGUgb25lIGZhaWx1cmUgY2xhc3NpZmllciwgdGhlIG9uZSBydWxlIHRhYmxlLCB0aGUgdHdvIGVycm9ycywgYGF0dGVtcHQoKWBcbiAqIOKAlCB0aGUgcnVubmVyIGZvciBjb2RlIHRoYXQgaXMgbm90IGEgc3RhZ2UgKFAyKSDigJQgYW5kIHRoZSBiYWNrb2ZmIGJ1aWxkZXJzIGEgYFJldHJ5UG9saWN5LmJhY2tvZmZNc2AgdGFrZXMuIFRoZSBsb29wXG4gKiBpdHNlbGYgKGBydW5BdHRlbXB0c2ApLCBgcnVuQ2FsbGAsIHRoZSBldmlkZW5jZSBidWlsZGVyLCBgYW55U2lnbmFsYCBhbmQgdGhlIGxvbmctdGltZXIgbGF3IGFyZSB0aGUgZW5naW5lJ3MuXG4gKiBgUmV0cnlQb2xpY3lgIGlzIGRlY2xhcmVkIGluIGAuL3R5cGVzLnRzYCBhbmQgcHVibGlzaGVkIHRocm91Z2ggdGhlIGJ1aWxkZXIncyBiYXJyZWwsIHdoZXJlIGl0IGFsd2F5cyB3YXMuXG4gKi9cblxuZXhwb3J0IHR5cGUgeyBCYWNrb2ZmRnVuY3Rpb24sIEJhY2tvZmZKaXR0ZXIsIEJhY2tvZmZTcGVjLCBTdGF0ZWRXYWl0UmVhZGVyIH0gZnJvbSAnLi9iYWNrb2ZmLmpzJztcbmV4cG9ydCB7IGV4cG9uZW50aWFsQmFja29mZiwgc3RhdGVkV2FpdEZpcnN0IH0gZnJvbSAnLi9iYWNrb2ZmLmpzJztcbmV4cG9ydCB7IGVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuL2NhdGVnb3J5LmpzJztcbmV4cG9ydCB0eXBlIHsgUGFyc2VkVHJhY2VwYXJlbnQsIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2NvcnJlbGF0aW9uLmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgeyByZXRyeVJ1bGVzIH0gZnJvbSAnLi9kZWNpc2lvbi5qcyc7XG5leHBvcnQgdHlwZSB7IFVua25vd25FZmZlY3RJbml0IH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHsgQXR0ZW1wdFRpbWVvdXRFcnJvciwgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHR5cGUgeyBBdHRlbXB0T3B0aW9ucyB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgeyBhdHRlbXB0IH0gZnJvbSAnLi9zdGFuZGFsb25lLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVhc29uLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFJ1bkNvcnJlbGF0aW9uLFxuICBTdGFnZVRvdWNoZXMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuIl19
@@ -64,9 +64,10 @@
64
64
  import { extractErrorInfo } from '../errors/errorInfo.js';
65
65
  import { isInterruptSignal } from '../pause/interrupt.js';
66
66
  import { isPauseSignal } from '../pause/types.js';
67
+ import { setLongTimeout } from '../timers/longTimeout.js';
67
68
  import { anySignal } from './anySignal.js';
68
69
  import { errorCategory, terminalCategory } from './category.js';
69
- import { isCancelled, isDeadlineReason, markTimeLimit, readDeadline, setLongTimeout } from './deadline.js';
70
+ import { isCancelled, isDeadlineReason, markTimeLimit, readDeadline } from './deadline.js';
70
71
  import { decideAttempt, retryRules } from './decision.js';
71
72
  import { effectOf, recordedKeyOf, refuseKeylessRetry, unknownEffectError } from './effect.js';
72
73
  import { AttemptTimeoutError } from './errors.js';
@@ -520,4 +521,4 @@ class SeriesTally {
520
521
  return freezeDeep({ ...this.counts, last });
521
522
  }
522
523
  }
523
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFHSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUE2RXhELHNIQUFzSDtBQUN0SCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBMEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFtQztJQUMvRCxPQUFP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TyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xILE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQXNDO1FBQ25ELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25FLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQWEsRUFBRSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxXQUFXO0lBQ0UsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU1RixHQUFHLENBQUMsTUFBcUI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQTRCO1FBQ2xDLE9BQU8sVUFBVSxDQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9ydW5uZXIudHMg4oCUIGBydW5BdHRlbXB0c2AsIFRIRSByZXRyeSBsb29wIChkZXNpZ24gwqczLjEsIGxhdyAxOiBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKS5cbiAqXG4gKiBSdW5zIGEgZnVuY3Rpb24gdW5kZXIgYSBwb2xpY3kgYW5kIHJlY29yZHMgZXZlcnkgdHJ5OiBvbmUgZnJvemVuIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCwgY2FycnlpbmcgaXRzXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIChgYXR0ZW1wdC9kZWNpc2lvbi50c2ApLCBhbmQgb25lXG4gKiBgQXR0ZW1wdFN1bW1hcnlgIHdoZW4gdGhlIHNlcmllcyBlbmRzLiBUaGUgZW5naW5lJ3Mgc3RhZ2UgcmV0cnkgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCkgcnVucyBvblxuICogaXQ7IGxhdGVyIHBhY2tldHMgcnVuIGluLXN0YWdlIGNhbGxzIGFuZCBzdGFuZGFsb25lIGBhdHRlbXB0KClgIG9uIGl0IHRvby5cbiAqXG4gKiBUaGUgbG9vcCwgcGVyIGF0dGVtcHQgbiDigJQgZm9yIGEgZmFpbGVkIGF0dGVtcHQsIHRoZSA5LjE1IGxvb3AncyBvcmRlciwgc3RlcCBmb3Igc3RlcDpcbiAqXG4gKiAgIHN0YXJ0IOKGkiBydW4obikg4oaSIG91dGNvbWUgKG9rIHwgZmFpbGVkIHwgYWJvcnRlZCBbaXQgdGhyZXcgdGhlIHJ1bidzIGFib3J0IHJlYXNvbl0gfCBwYXVzZWQgW2EgUGF1c2VTaWduYWxdKVxuICogICAgICAgICDihpIgZGVjaWRlIG92ZXIgdGhlIGlucHV0cywgZmlyc3QgbWF0Y2ggd2lucyAoYHJldHJ5UnVsZXNgKSDigJQgcmV0cnlPbiBpcyBhc2tlZCBoZXJlIChydWxlIDUpXG4gKiAgICAgICAgIOKGkiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0ZWQgaW5zaWRlIHJldHJ5T24/IGRlY2lkZSBhZ2FpbjogcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXMgaGVyZSwgYmVmb3JlIHRoZVxuICogICAgICAgICAgIGRpc2NhcmQgYW5kIGJlZm9yZSBiYWNrb2ZmTXMsIGFzIHRoZSA5LjE1IGFib3J0IGNoZWNrIGRpZFxuICogICAgICAgICDihpIgcmV0cnk6IGJldHdlZW4obikg4oCUIHRoZSBkaXNjYXJkIOKAlCBhbmQgVEhFTiBiYWNrb2ZmTXMobiksIHRoZSB3YWl0J3MgbGVuZ3RoXG4gKiAgICAgICAgIOKGkiB0aGUgZXJyb3IncyBzZXJ2ZWQgZm9ybSBhbmQgY2F0ZWdvcnksIHJlYWQgYWZ0ZXIgcmV0cnlPbiBhbmQgYmFja29mZk1zIHJhbiDihpIgdGhlIHJlY29yZFxuICogICAgICAgICDihpIgb25FbmQoc3VtbWFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgd2hlbiB0aGUgc2VyaWVzIGVuZHMgaGVyZVxuICogICAgICAgICDihpIgb25BdHRlbXB0KHJlY29yZCwgc2VydmVkIGVycm9yKVxuICogICAgICAgICDihpIgZG9uZTogcmV0dXJuIHRoZSB2YWx1ZSDCtyBzdG9wOiByZXRocm93IHRoZSBhdHRlbXB0J3MgT1dOIGVycm9yXG4gKiAgICAgICAgIOKGkiByZXRyeTogb25SZXRyeShuLCBvZiwgZGVsYXksIHNlcnZlZCBlcnJvcikg4oaSIHdhaXQgKGN1dCBzaG9ydCBieSB0aGUgc2lnbmFsKSDihpIgYWJvcnRlZD8gc3RvcFxuICpcbiAqIFdIQVQgSVQgUFJFU0VSVkVTICh0aGUgOS4xNSBsb29wJ3MgYmVoYXZpb3VyLCBtb3ZlZCBoZXJlIHVuY2hhbmdlZCk6IHRoZSBmdW5jdGlvbiBydW5zIHRoZSBzYW1lIG51bWJlciBvZlxuICogdGltZXM7IGByZXRyeU9uYCBpcyBhc2tlZCBvbmx5IGZvciBhIGZhaWxlZCwgbm9uLWZpbmFsIGF0dGVtcHQ7IGBiYWNrb2ZmTXNgIG9ubHkgd2hlbiBhIHJldHJ5IGZvbGxvd3MsIGFmdGVyXG4gKiB0aGUgZGlzY2FyZDsgYSB0aHJvd2luZyBwcmVkaWNhdGUgaXMgXCJkbyBub3QgcmV0cnlcIiwgYSB0aHJvd2luZyBvciBub24tZmluaXRlIGJhY2tvZmYgaXMgXCJubyB3YWl0XCI7IGEgcGF1c2UgaXNcbiAqIG5ldmVyIHJldHJpZWQ7IHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yIGlzIHJldGhyb3duLCBuZXZlciBhIHdyYXBwZXI7IGFuZCBhIGZhaWxlZCBhdHRlbXB0J3Mgb3JkZXIg4oCUXG4gKiBgcmV0cnlPbmAg4oaSIHRoZSBhYm9ydCBjaGVjayDihpIgdGhlIGRpc2NhcmQgKGBiZXR3ZWVuYCkg4oaSIGBiYWNrb2ZmTXNgIOKGkiB0aGUgc2VydmVkIGVycm9yIOKGkiB0aGUgcmV0cnkgZXZlbnQg4oaSXG4gKiB0aGUgd2FpdCDihpIgdGhlIGFib3J0IGNoZWNrLiBTbyBhbiBhYm9ydCBpbnNpZGUgYHJldHJ5T25gIHN0b3BzIGJlZm9yZSB0aGUgZGlzY2FyZCBhbmQgbmV2ZXIgYXNrcyBgYmFja29mZk1zYDtcbiAqIGFuIGFib3J0IGluc2lkZSBgYmFja29mZk1zYCBjb21lcyBhZnRlciB0aGUgZGlzY2FyZCwgc3RpbGwgZmlyZXMgdGhlIHJldHJ5IGV2ZW50LCB0aGVuIGVuZHMgYXQgdGhlIHdhaXQ7IGFuZFxuICogdGhlIHNlcnZlZCBlcnJvciBzaG93cyB3aGF0IGByZXRyeU9uYCBkaWQgdG8gdGhlIHRocm93biB2YWx1ZS4gVGhlIG9uZSBkaWZmZXJlbmNlOiB3aGVuIHRoZSBydW4ncyBzaWduYWwgaGFzXG4gKiBBTFJFQURZIGFib3J0ZWQgYXMgdGhlIGF0dGVtcHQgZmFpbHMsIHRoZSBzZXJpZXMgc3RvcHMgd2l0aG91dCBhc2tpbmcgYHJldHJ5T25gICh0aGUgYWJvcnQgZGVjaWRlcyBmaXJzdCDigJRcbiAqIHJ1bGUgMyBiZWZvcmUgcnVsZSA1KS5cbiAqXG4gKiBXSEFUIElUIEFERFM6IHRoZSByZWNvcmQgYW5kIHRoZSBzdW1tYXJ5LiBBIHJlY29yZCBpcyBmcm96ZW4gdG8gaXRzIGxlYXZlcyBhbmQgaG9sZHMgb25seSBjbG9uZS1zYWZlIGRhdGEg4oCUXG4gKiB0aGUgZXJyb3IgYXMgdGhlIHJ1biBTRVJWRVMgaXQgKGBzZXJ2ZWAsIHRoZSByZWRhY3Rpb24gcnVsZSdzIGZvcm0pIHdpdGhvdXQgYHJhd2AuIFRoZSBob29rIGdldHMgdGhlIHNlcnZlZFxuICogYFN0cnVjdHVyZWRFcnJvckluZm9gIHdob2xlLCBgcmF3YCBpbmNsdWRlZCwgYXMgYG9uU3RhZ2VSZXRyeWAgYWx3YXlzIGhhcy4gQSByZWNvcmQgbmV2ZXIgcmV3cml0ZXMgd2hhdCB0aGVcbiAqIGF0dGVtcHQgZGlkOiBhbiBhdHRlbXB0IHRoYXQgdGhyZXcgaXRzIG93biBlcnJvciBpcyBgZmFpbGVkYCwgd2l0aCBpdHMgY2F0ZWdvcnksIGV2ZW4gd2hlbiB0aGUgcnVuIGFib3J0ZWRcbiAqIGFyb3VuZCBpdCDigJQgdGhlIGFib3J0IGlzIHRoZSBzZXJpZXMnIHN0b3AgcmVhc29uIChgcmVhc29uOiAnYWJvcnRlZCdgKTsgYSB0aHJvd2luZyBgcmV0cnlPbmAgaXMgYGRlY2xpbmVkYFxuICogd2l0aCBgcmV0cnlPblRocmV3OiB0cnVlYCwgYXBhcnQgZnJvbSBhIHJlYWwgYGZhbHNlYC5cbiAqXG4gKiBUSU1FIChQMWIpLiBFYWNoIGF0dGVtcHQgcnVucyB1bmRlciBgbWluKHBvbGljeS50aW1lb3V0TXMsIHRpbWUgbGVmdCBiZWZvcmUgb3B0aW9ucy5kZWFkbGluZSlgIGFuZCBnZXRzIGFuXG4gKiBgQXR0ZW1wdENvbnRleHRgIOKAlCBpdHMgc2lnbmFsLCBjb21wb3NlZCBmcm9tIHRoZSBydW4ncyBhbmQgaXRzIG93biBjYXAncyB0aW1lciAoYExpdmVBdHRlbXB0YCkuIFRoZSBjYXAncyB0aW1lclxuICogYWJvcnRzIHdpdGggYW4gYEF0dGVtcHRUaW1lb3V0RXJyb3JgOyB0aGUgcnVuJ3MgZGVhZGxpbmUgYWJvcnRzIHRoZSBydW4ncyBzaWduYWwgd2l0aCBhIGJyYW5kZWQgcmVhc29uXG4gKiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS4gRWl0aGVyIHdheSB0aGUgYXR0ZW1wdCBpcyBgJ3RpbWVvdXQnYCwgbmV2ZXIgYCdhYm9ydGVkJ2A6IHRoZSBkZWFkbGluZSBpcyBub3QgYVxuICogY2FuY2VsbGF0aW9uLCBzbyBydWxlIDMgZG9lcyBub3QgbWF0Y2ggYW5kIHJ1bGUgNiAoYHRpbWVMZWZ0QWZ0ZXJXYWl0TXMg4omkIDBgKSBzdG9wcyBhIHNlcmllcyB3aG9zZSBuZXh0IHdhaXRcbiAqIHdvdWxkIG91dGxhc3QgaXQuIFVuZGVyIGEgZGVhZGxpbmUgcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoLCBzbyBgYmFja29mZk1zKG4sIGVycm9yKWAgaXMgYXNrZWQgRFVSSU5HIHRoZVxuICogZGVjaXNpb24g4oCUIGJlZm9yZSB0aGUgZGlzY2FyZDsgd2l0aG91dCBvbmUgdGhlIDkuMTUgb3JkZXIgYWJvdmUgaG9sZHMgdW5jaGFuZ2VkLiBObyBhdHRlbXB0IHN0YXJ0cyBhdCBvciBwYXN0XG4gKiB0aGUgZGVhZGxpbmU6IGEgd2FpdCB0aGUgZGVhZGxpbmUgY3V0IGVuZHMgdGhlIHNlcmllcyBgbm8tdGltZS1sZWZ0YCwgcmVjb3JkaW5nIG5vIGZ1cnRoZXIgYXR0ZW1wdC5cbiAqXG4gKiBUSEUgRkVOQ0UuIFRoZSBtb21lbnQgYW4gYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2lnbmFsIGFib3J0cyAoc3luY2hyb25vdXNseSwgYmVmb3JlIGFueSBsaXN0ZW5lclxuICogdGhlIGZ1bmN0aW9uIGFkZGVkKSBvciBpdCB0aHJvd3Mg4oCUIGBvbkFiYW5kb24obilgIGZpcmVzIG9uY2UsIGFuZCB0aGUgZW5naW5lIGNsb3NlcyB0aGF0IGF0dGVtcHQncyBzY29wZTogdGhlXG4gKiBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIG5vdGhpbmcgaXQgZG9lcyBhZnRlcndhcmRzIG1heSBsYW5kIGJlc2lkZSBhIGxhdGVyIGF0dGVtcHQuXG4gKlxuICogT05FIGFzeW5jIGZyYW1lIHdpdGggT05FIGF3YWl0IHBlciBhdHRlbXB0OiB0aGUgZW5naW5lIHJlbGllcyBvbiB0aGF0IHRvIGtlZXAgYSByZXRyaWVkIHN0YWdlJ3MgbWljcm90YXNrXG4gKiBzaGFwZSwgc28gcGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlciB0aGV5IGFsd2F5cyBkaWQuIFRoZSBlbmdpbmUgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmLFxuICogYXQgdGhlIHN0YWdlIGJvdW5kYXJ5IChgcmFjZWQ6IHRydWVgKTsgYW55IG90aGVyIGNhbGxlciBnZXRzIHRoZSByYWNlIGhlcmUsIHNvIHRoZSBzZXJpZXMgbmV2ZXIgd2FpdHMgb24gYW5cbiAqIGF0dGVtcHQgcGFzdCBpdHMgY2FwLlxuICpcbiAqIENBTExTIChQMikuIFRoZSBzYW1lIGxvb3AgcnVucyBhIGNhbGwgYSBzdGFnZSBtYWtlcyAoYGF0dGVtcHQvY2FsbC50cyDCtyBydW5DYWxsYCwga2luZCBgJ2NhbGwnYCwgaXRzIGB0YXJnZXRgIG9uXG4gKiBldmVyeSByZWNvcmQpIGFuZCB0aGUgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYC4gQW4gYXR0ZW1wdCdzIGNhcCBpcyB0aGUgREVBRExJTkUgb2YgZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCwgc29cbiAqIHRoZSBjYXAncyByZWFzb24gaXMgYnJhbmRlZCBhIHRpbWUgbGltaXQgKGBhdHRlbXB0L2RlYWRsaW5lLnRzIMK3IG1hcmtUaW1lTGltaXRgKTogYSBjYWxsIGN1dCBieSBpdHMgc3RhZ2VcbiAqIGF0dGVtcHQncyBjYXAgdGltZWQgb3V0LCBpdCB3YXMgbm90IGNhbmNlbGxlZC4gYGF0dGVtcHRFbmRzQXRgIHNheXMgd2hlbiBhbiBhdHRlbXB0IG11c3QgZW5kOyBhbiBgaW50ZXJydXB0KClgXG4gKiB0aHJvd24gaW5zaWRlIGEgY2FsbCBpcyBhIHBhdXNlLCBsaWtlIGEgYFBhdXNlU2lnbmFsYCDigJQgbmV2ZXIgcmV0cmllZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5pbXBvcnQgeyBlcnJvckNhdGVnb3J5LCB0ZXJtaW5hbENhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxlZCwgaXNEZWFkbGluZVJlYXNvbiwgbWFya1RpbWVMaW1pdCwgcmVhZERlYWRsaW5lLCBzZXRMb25nVGltZW91dCB9IGZyb20gJy4vZGVhZGxpbmUuanMnO1xuaW1wb3J0IHsgZGVjaWRlQXR0ZW1wdCwgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBlZmZlY3RPZiwgcmVjb3JkZWRLZXlPZiwgcmVmdXNlS2V5bGVzc1JldHJ5LCB1bmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0VGltZW91dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcsIGF0dGVtcHRUaW1lb3V0TXMsIGNhcHBlZFdhaXRNcyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB7IGZyZWV6ZURlZXAsIHJlY29yZGVkRXJyb3IgfSBmcm9tICcuL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogV2hhdCBhIHNlcmllcyByZXBvcnRzLCBhbmQgdGhlIGVuZ2luZSdzIGJldHdlZW4tYXR0ZW1wdCBzdGVwLiBFdmVyeSBtZW1iZXIgaXMgb3B0aW9uYWwuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSdW5PcHRpb25zIHtcbiAgLyoqIFRoZSBzZXJpZXMgZXZlcnkgcmVjb3JkIG5hbWVzIOKAlCBmb3IgYSBzdGFnZSBhdHRlbXB0LCBpdHMgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYC4gKi9cbiAgcmVhZG9ubHkgc2VyaWVzOiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGAnc3RhZ2UnYC4gKi9cbiAgcmVhZG9ubHkga2luZD86IEF0dGVtcHRLaW5kO1xuICAvKiogVGhlIG91dHNpZGUgdGFyZ2V0IGV2ZXJ5IHJlY29yZCBuYW1lcyDigJQgYSBjYWxsJ3MgKGAkY2FsbGAsIGBhdHRlbXB0KClgKTsgYWJzZW50IGZvciBhIHN0YWdlIGF0dGVtcHQuICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBzaWduYWwuIE9uY2UgaXQgaGFzIGFib3J0ZWQgKG90aGVyIHRoYW4gYXQgdGhlIGRlYWRsaW5lKSwgcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXNcbiAgICogKGByZWFzb246ICdhYm9ydGVkJ2ApOyBpdCBjdXRzIGEgd2FpdCBzaG9ydC4gQW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyByZWFzb24gaXMgcmVjb3JkZWQgYCdhYm9ydGVkJ2Ag4oCUIG9yXG4gICAqIGAndGltZW91dCdgIHdoZW4gdGhlIHJlYXNvbiBpcyB0aGUgZGVhZGxpbmUncyAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMuIEV2ZXJ5IGF0dGVtcHQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIGxlZnQ7IHJ1bGUgNiBzdG9wcyBhIHNlcmllcyB3aG9zZVxuICAgKiBuZXh0IHdhaXQgd291bGQgb3V0bGFzdCBpdCAoYG5vLXRpbWUtbGVmdGApLiBBYnNlbnQgKG9yIG5vdCBmaW5pdGUpID0gbm8gZGVhZGxpbmU6IHRoZSB0aW1lIGxlZnQgaXMgYEluZmluaXR5YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKiogVGhlIGNsb2NrLCBlcG9jaCBtaWxsaXNlY29uZHMuIERlZmF1bHQgYERhdGUubm93YC4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogVGhlIHNlcnZlZCBmb3JtIG9mIGEgZmFpbGVkIGF0dGVtcHQncyBlcnJvci4gRGVmYXVsdCBgZXh0cmFjdEVycm9ySW5mb2AgKG5vIHJlZGFjdGlvbiBydWxlKS4gKi9cbiAgcmVhZG9ubHkgc2VydmU/OiAoZXJyb3I6IHVua25vd24pID0+IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIC8qKiBCZXR3ZWVuIGEgZmFpbGVkIGF0dGVtcHQgYW5kIHRoZSBuZXh0LCBiZWZvcmUgYGJhY2tvZmZNc2A6IHRoZSBlbmdpbmUgZGlzY2FyZHMgdGhlIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzLiAqL1xuICByZWFkb25seSBiZXR3ZWVuPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQsIGF0IGl0cyBlbmQsIHdpdGggaXRzIHNlcnZlZCBlcnJvciAoYHVuZGVmaW5lZGAgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYCkuICovXG4gIHJlYWRvbmx5IG9uQXR0ZW1wdD86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgLyoqIEEgZmFpbGVkIGF0dGVtcHQgdGhhdCBXSUxMIGJlIHJldHJpZWQg4oCUIGFmdGVyIGBiZXR3ZWVuYCBhbmQgYG9uQXR0ZW1wdGAsIGJlZm9yZSB0aGUgd2FpdC4gKi9cbiAgcmVhZG9ubHkgb25SZXRyeT86IChhdHRlbXB0OiBudW1iZXIsIG9mOiBudW1iZXIsIGRlbGF5TXM6IG51bWJlciwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvKSA9PiB2b2lkO1xuICAvKiogVGhlIHNlcmllcyBlbmRlZDogY2FsbGVkIG9uY2UsIGJlZm9yZSB0aGUgbGFzdCBgb25BdHRlbXB0YCAob3IgYWZ0ZXIgYSB3YWl0IHRoZSBydW4ncyBzaWduYWwgY3V0KS4gKi9cbiAgcmVhZG9ubHkgb25FbmQ/OiAoc3VtbWFyeTogQXR0ZW1wdFN1bW1hcnkpID0+IHZvaWQ7XG4gIC8qKiBAaW50ZXJuYWwgTmF0aXZlIG93bmVyIG9ubHk6IHRoZSBleGFjdCBlc2NhcGluZyB2YWx1ZSBhbmQgY2F0ZWdvcnksIGJlZm9yZSBpdHMgc3RhZ2Ugc2VydmVzIHRoZSBlcnJvci4gKi9cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogKGVycm9yOiB1bmtub3duLCBjYXRlZ29yeTogQXR0ZW1wdENhdGVnb3J5KSA9PiB2b2lkO1xuICAvKiogYHJldHJ5T25gIHRocmV3IOKAlCB0aGUgYXR0ZW1wdCBpcyB0cmVhdGVkIGFzIGRlY2xpbmVkOyB0aGUgZW5naW5lIGxvZ3MgdGhlIHRocm93IGhlcmUuICovXG4gIHJlYWRvbmx5IG9uUmV0cnlPblRocmV3PzogKHRocm93bjogdW5rbm93bikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBjYWxsZWQgU1lOQ0hST05PVVNMWSB0aGUgbW9tZW50IGl0cyBzaWduYWwgYWJvcnRzIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsXG4gICAqIGEgY2FuY2VsbGF0aW9uKSwgZWxzZSBhcyBzb29uIGFzIGl0IGZhaWxlZC4gV2hhdGV2ZXIgdGhlIGFiYW5kb25lZCBmdW5jdGlvbiBkb2VzIGFmdGVyd2FyZHMgaXMgbm90IHRoaXNcbiAgICogc2VyaWVzJzogdGhlIGVuZ2luZSBmZW5jZXMgaXRzIHNjb3BlIGhlcmUuIE9uY2UgcGVyIGF0dGVtcHQ7IG5ldmVyIGZvciBgJ29rJ2Agb3IgYCdwYXVzZWQnYCDigJQgZXhjZXB0IGFuIGF0dGVtcHRcbiAgICogdGhhdCBTVEFSVEVEIHVuZGVyIGFuIGFscmVhZHktYWJvcnRlZCBzaWduYWwsIGZlbmNlZCBvbmNlIGl0cyBzeW5jaHJvbm91cyBwYXJ0IGhhcyBydW4gKG5vYm9keSB3YWl0cyBmb3IgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25BYmFuZG9uPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgcmFjZXMgYHJ1bmAncyBwcm9taXNlIGFnYWluc3QgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmIOKAlCB0aGUgZW5naW5lIGRvZXMsIGF0IHRoZSBzdGFnZSBib3VuZGFyeVxuICAgKiAoYFN0YWdlUnVubmVyYCksIHNvIGEgc3RhZ2Uga2VlcHMgaXRzIG9uZSBhd2FpdCBwZXIgYXR0ZW1wdC4gT3RoZXJ3aXNlIHRoZSBydW5uZXIgcmFjZXMgaXQ6IHRoZSBzZXJpZXMgbmV2ZXJcbiAgICogd2FpdHMgb24gYW4gYXR0ZW1wdCBwYXN0IGl0cyBjYXAuXG4gICAqL1xuICByZWFkb25seSByYWNlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGF0IGFuIGF0dGVtcHQncyBgb2JzZXJ2ZWQocmVwb3J0KWAgZG9lcyAoUDIpIOKAlCB0aGUgb3duZXIgb2YgdGhlIGF0dGVtcHQgcmVjb3JkcyB0aGUgcmVwb3J0OiBgcnVuQ2FsbGAgaGFuZHNcbiAgICogYSBjYWxsJ3MgcmVwb3J0cyB0byB0aGUgc2NvcGUsIGBhdHRlbXB0KClgIGtlZXBzIGl0cyBvd24uIGBlbmRlZGAgc2F5cyB0aGUgYXR0ZW1wdCBoYWQgYWxyZWFkeSBlbmRlZCB3aGVuIHRoZVxuICAgKiByZXBvcnQgY2FtZSAodGhlIG93bmVyIGRyb3BzIGl0KS4gQWJzZW50IOKAlCBhIHN0YWdlIGF0dGVtcHQncyBjb250ZXh0LCB3aG9zZSBgb2JzZXJ2ZWRgIHRoZSBzY29wZSdzXG4gICAqIGAkYXR0ZW1wdCgpYCByZXBsYWNlcyDigJQgYG9ic2VydmVkYCBpcyByZWZ1c2VkIHdpdGggYSBgVHlwZUVycm9yYC5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2VydmU/OiAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQsIGF0OiB7IHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjsgcmVhZG9ubHkgZW5kZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBvdXRzaWRlIHN5c3RlbSB0aGUgdGFyZ2V0IHRvdWNoZXMgKFAzLCBkZXNpZ24gwqczLjMpLiBFdmVyeSByZWNvcmQgdGhlbiBzYXlzIHdoYXQgaXRzIGF0dGVtcHQgZGlkIHRvIGl0XG4gICAqIChgZWZmZWN0YCkgYW5kIG5hbWVzIHRoZSBzeXN0ZW0gYW5kIHRoZSBSRUNPUkRFRCBrZXk7IGV2ZXJ5IGF0dGVtcHQncyBjb250ZXh0IGNhcnJpZXMgdGhlIFJFQUwga2V5LiBBIHNlcmllc1xuICAgKiB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgYW55IGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYCAoaXRzIGBjYXVzZWAgdGhlIGF0dGVtcHQncyBvd24gZXJyb3IpIOKAlFxuICAgKiBleGNlcHQgYSBwYXVzZSwgd2hpY2ggc3RheXMgYSBwYXVzZS4gQSB0b3VjaGluZyBzZXJpZXMgdGhhdCBtYXkgcmV0cnkgd2l0aG91dCBhIGtleSBpcyByZWZ1c2VkIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBydW5zOiB0aGUgbGF3J3MgbGFzdCBkb29yLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0PzogRWZmZWN0VGFyZ2V0O1xufVxuXG4vKiogV2hlbiBlYWNoIGxpdmUgYXR0ZW1wdCBtdXN0IGVuZCwgZXBvY2ggbXMg4oCUIGBzdGFydGVkQXQgKyBjYXBgLCBmb3IgYW4gYXR0ZW1wdCB0aGF0IGhhcyBhIGNhcCAoYGF0dGVtcHRFbmRzQXRgKS4gKi9cbmNvbnN0IEFUVEVNUFRfRU5EUyA9IG5ldyBXZWFrTWFwPEF0dGVtcHRDb250ZXh0LCBudW1iZXI+KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgYXR0ZW1wdCBiZWhpbmQgYGNvbnRleHRgIG11c3QgZW5kLCBlcG9jaCBtaWxsaXNlY29uZHMg4oCUIGl0cyBzdGFydCBwbHVzIGl0cyBjYXAgKGBtaW4odGltZW91dE1zLCB0aW1lXG4gKiBsZWZ0KWAsIHNvIG5ldmVyIHBhc3QgdGhlIHJ1bidzIGRlYWRsaW5lKSDigJQgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIHVuY2FwcGVkIGF0dGVtcHQuIEEgY2FsbCBtYWRlIGluc2lkZSB0aGVcbiAqIGF0dGVtcHQgcnVucyB1bmRlciBpdCBhcyBpdHMgZGVhZGxpbmUgKGBhdHRlbXB0L2NhbGwudHNgKS4gT25seSB0aGUgcnVubmVyJ3Mgb3duIGNvbnRleHRzIGFyZSBrbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRFbmRzQXQoY29udGV4dDogQXR0ZW1wdENvbnRleHQgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogQVRURU1QVF9FTkRTLmdldChjb250ZXh0KTtcbn1cblxuLyoqIEEgZmFpbGVkIGF0dGVtcHQncyB0aHJvd24gdmFsdWUsIGJveGVkOiBgdW5kZWZpbmVkYCBpcyBhIHZhbHVlIGEgc3RhZ2UgbWF5IHRocm93LiAqL1xuaW50ZXJmYWNlIEZhaWx1cmUge1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW4gYHJ1bmAgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGhlIHBvbGljeSBzdG9wcyBpdDsgcmVzb2x2ZSB3aXRoIGl0cyB2YWx1ZSBvciByZWplY3Qgd2l0aCB0aGUgTEFTVCBhdHRlbXB0J3NcbiAqIG93biBlcnJvci4gYHJ1bihuKWAgaXMgY2FsbGVkIHdpdGggdGhlIGF0dGVtcHQgbnVtYmVyLCAxLWJhc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXR0ZW1wdHM8VD4oXG4gIHJ1bjogKGF0dGVtcHQ6IG51bWJlciwgY29udGV4dDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICBvcHRpb25zOiBBdHRlbXB0UnVuT3B0aW9ucyxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvZiA9IGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cyk7XG4gIGNvbnN0IHJ1bGVzID0gcmV0cnlSdWxlcyh7IGF0dGVtcHRzOiBvZiB9KTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IGRlYWRsaW5lID0gcmVhZERlYWRsaW5lKG9wdGlvbnMuZGVhZGxpbmUpO1xuICBjb25zdCBvd25DYXAgPSBhdHRlbXB0VGltZW91dE1zKHBvbGljeS50aW1lb3V0TXMpO1xuICBjb25zdCB0YWxseSA9IG5ldyBTZXJpZXNUYWxseSgpO1xuICBpZiAob3B0aW9ucy5lZmZlY3QpIHJlZnVzZUtleWxlc3NSZXRyeShvcHRpb25zLmVmZmVjdCwgb2YpO1xuICAvKiogQW4gZWFybGllciBhdHRlbXB0IG9mIHRoaXMgdG91Y2hpbmcgc2VyaWVzIGxlZnQgdGhlIGVmZmVjdCB1bmtub3duIOKAlCBhIGxhdGVyIGFuc3dlciBvZiBgbm9uZWAgY2Fubm90IGNsZWFyIGl0LiAqL1xuICBsZXQgdW5rbm93blNvRmFyID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbm93KCk7XG4gICAgY29uc3QgbGl2ZSA9IG5ldyBMaXZlQXR0ZW1wdChvcHRpb25zLCBhdHRlbXB0LCBvZiwgc3RhcnRlZEF0LCBkZWFkbGluZSwgb3duQ2FwLCBub3cpO1xuICAgIGxldCB2YWx1ZTogVCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHJ1bihhdHRlbXB0LCBsaXZlLmNvbnRleHQpO1xuICAgICAgLy8gU3RhcnRlZCB1bmRlciBhIHNpZ25hbCB0aGF0IGhhZCBBTFJFQURZIGFib3J0ZWQgKGEgZGVjaWRlciBlbnRlcmVkIGFmdGVyIGEgY2FuY2VsKTogaXRzIHN5bmNocm9ub3VzIHBhcnRcbiAgICAgIC8vIHJhbiBhcyBpdCBhbHdheXMgZGlkOyBmcm9tIGhlcmUgb24gbm9ib2R5IHdhaXRzIGZvciBpdCwgc28gbm90aGluZyBpdCBkb2VzIGFmdGVyIGl0cyBmaXJzdCBhd2FpdCBsYW5kcy5cbiAgICAgIGlmIChsaXZlLmNvbnRleHQuc2lnbmFsLmFib3J0ZWQpIGxpdmUuYWJhbmRvblN0YXJ0ZWQoKTtcbiAgICAgIHZhbHVlID0gYXdhaXQgKG9wdGlvbnMucmFjZWQgPyBwZW5kaW5nIDogbGl2ZS5yYWNlKHBlbmRpbmcpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgZmFpbHVyZSA9IHsgZXJyb3IgfTtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIG5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZU9mKGZhaWx1cmUsIG9wdGlvbnMuc2lnbmFsLCBsaXZlLnRpbWVvdXRSZWFzb24pO1xuICAgIGxpdmUuZW5kKG91dGNvbWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5ldyBBdHRlbXB0SW5wdXRSZWFkZXIocG9saWN5LCBvcHRpb25zLCBhdHRlbXB0LCBvZiwgb3V0Y29tZSwgZmFpbHVyZSwgZGVhZGxpbmUsIG5vdyk7XG5cbiAgICBsZXQgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJ1bGVzLCBpbnB1dHMucmVhZCk7XG4gICAgLy8gOS4xNSBhc2tlZCByZXRyeU9uLCBUSEVOIGNoZWNrZWQgdGhlIHNpZ25hbC4gRGVjaWRpbmcgYWdhaW4gcmVhZHMgdGhlIHNpZ25hbCBhZnJlc2g6IHJ1bGUgMyBub3cgbWF0Y2hlcyxcbiAgICAvLyBhaGVhZCBvZiBldmVyeSB1c2VyIGZ1bmN0aW9uLCBzbyBub25lIGlzIGFza2VkIHR3aWNlIOKAlCBhbmQgbm90aGluZyBpcyBkaXNjYXJkZWQsIG5vdGhpbmcgd2FpdGVkIGZvci5cbiAgICBpZiAoZGVjaXNpb24ubmV4dCA9PT0gJ3JldHJ5JyAmJiBpc0NhbmNlbGxlZChvcHRpb25zLnNpZ25hbCkpIGRlY2lzaW9uID0gZGVjaWRlQXR0ZW1wdChydWxlcywgaW5wdXRzLnJlYWQpO1xuXG4gICAgLy8gVGhlIGRpc2NhcmQgY29tZXMgQkVGT1JFIHRoZSB3YWl0J3MgbGVuZ3RoIGlzIGFza2VkIGZvciwgYXMgaXQgZGlkIGluIDkuMTUg4oCUIHdpdGhvdXQgYSBkZWFkbGluZS4gVW5kZXIgb25lLFxuICAgIC8vIHJ1bGUgNiBuZWVkcyB0aGUgd2FpdCdzIGxlbmd0aCB0byBkZWNpZGUsIHNvIGBiYWNrb2ZmTXNgIHdhcyBhc2tlZCBkdXJpbmcgdGhlIGRlY2lzaW9uLCBiZWZvcmUgdGhlIGRpc2NhcmQuXG4gICAgaWYgKGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScpIG9wdGlvbnMuYmV0d2Vlbj8uKGF0dGVtcHQpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknID8gaW5wdXRzLmRlbGF5TXMoKSA6IGlucHV0cy5kZWxheUlmQXNrZWQoKTtcbiAgICBjb25zdCB0aW1lTGVmdE1zID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGlucHV0cy50aW1lTGVmdCgpO1xuXG4gICAgY29uc3QgY2F0ZWdvcnkgPSBpbnB1dHMuY2F0ZWdvcnkoKTtcbiAgICAvLyBQcml2YXRlIHRlcm1pbmFsIHNlbWFudGljcyBhcmUgZml4ZWQgYmVmb3JlIHNlcnZpbmcgb3Igb2JzZXJ2ZXIgZmFuLW91dC5cbiAgICAvLyBBbiBhbHJlYWR5LXVucmVzb2x2ZWQgY2FsbCB3cmFwcGVyIG11c3Qgbm90IGJlY29tZSBpdHMgcGh5c2ljYWwgY2F1c2VcbiAgICAvLyBpZiBhIGNvbnN1bWVyIGxhdGVyIGNoYW5nZXMgdGhlIHJhdyBlcnJvcidzIHByb3BlcnRpZXMgb3IgcHJvdG90eXBlLlxuICAgIGNvbnN0IHRlcm1pbmFsID0gb3B0aW9ucy5vbkZhaWx1cmUgJiYgZmFpbHVyZSA/IHRlcm1pbmFsQ2F0ZWdvcnkoZmFpbHVyZS5lcnJvciwgY2F0ZWdvcnkpIDogY2F0ZWdvcnkgPz8gJ3Vua25vd24nO1xuICAgIGNvbnN0IHNlcnZlZCA9IGlucHV0cy5mYWlsZWQgPyAob3B0aW9ucy5zZXJ2ZSA/PyBleHRyYWN0RXJyb3JJbmZvKShpbnB1dHMuZmFpbGVkLmVycm9yKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlZmZlY3QgPSBvcHRpb25zLmVmZmVjdCA/IGVmZmVjdE9mKGlucHV0cy5vdXRjb21lLCBmYWlsdXJlPy5lcnJvcikgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSBvcHRpb25zLmVmZmVjdCA/IHJlY29yZGVkS2V5T2Yob3B0aW9ucy5lZmZlY3QpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY29yZCA9IGZyZWV6ZURlZXA8QXR0ZW1wdFJlY29yZD4oe1xuICAgICAgc2VyaWVzOiBvcHRpb25zLnNlcmllcyxcbiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCA/PyAnc3RhZ2UnLFxuICAgICAgLi4uKG9wdGlvbnMudGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgeyB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IH0pLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc3RhcnRlZEF0LFxuICAgICAgZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IGlucHV0cy5vdXRjb21lLFxuICAgICAgLi4uKGNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeSB9KSxcbiAgICAgIGRlY2lzaW9uOiBkZWNpc2lvbi5ldmlkZW5jZSxcbiAgICAgIG5leHQ6IGRlY2lzaW9uLm5leHQsXG4gICAgICByZWFzb246IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgIC4uLihpbnB1dHMucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgICAgLi4uKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiB7IGRlbGF5TXMgfSksXG4gICAgICAuLi4obGl2ZS5jYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBsaXZlLmNhcE1zIH0pLFxuICAgICAgLi4uKHRpbWVMZWZ0TXMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVMZWZ0TXMgfSksXG4gICAgICAuLi4oc2VydmVkICE9PSB1bmRlZmluZWQgJiYgeyBlcnJvcjogcmVjb3JkZWRFcnJvcihzZXJ2ZWQpIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzeXN0ZW06IG9wdGlvbnMuZWZmZWN0LnN5c3RlbSB9KSxcbiAgICAgIC4uLihyZWNvcmRlZEtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IHJlY29yZGVkS2V5IH0pLFxuICAgICAgLi4uKGVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgZWZmZWN0IH0pLFxuICAgIH0pO1xuICAgIHRhbGx5LmFkZChyZWNvcmQpO1xuICAgIGlmIChyZWNvcmQuZWZmZWN0ID09PSAndW5rbm93bicpIHVua25vd25Tb0ZhciA9IHRydWU7XG4gICAgaWYgKHJlY29yZC5uZXh0ICE9PSAncmV0cnknKSBvcHRpb25zLm9uRW5kPy4odGFsbHkuc3VtbWFyeShsYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpKSk7XG4gICAgb3B0aW9ucy5vbkF0dGVtcHQ/LihyZWNvcmQsIHNlcnZlZCk7XG5cbiAgICBpZiAocmVjb3JkLm5leHQgPT09ICdkb25lJykgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gICAgaWYgKHJlY29yZC5uZXh0ID09PSAnc3RvcCcpIHRocm93IHN0b3BwZWRGYWlsdXJlKG9wdGlvbnMsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyLCB0ZXJtaW5hbCk7XG5cbiAgICBvcHRpb25zLm9uUmV0cnk/LihhdHRlbXB0LCBvZiwgZGVsYXlNcyA/PyAwLCBzZXJ2ZWQgYXMgU3RydWN0dXJlZEVycm9ySW5mbyk7XG4gICAgaWYgKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiBkZWxheU1zID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2xlZXAoZGVsYXlNcywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgb3B0aW9ucy5vbkZhaWx1cmU/LihlcnJvciwgJ3Vua25vd24nKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGF0dGVtcHQgZm9sbG93cyBhIGN1dCB3YWl0LCBzbyBub25lIGlzIHJlY29yZGVkOiB0aGUgc3VtbWFyeSBzYXlzIGhvdyB0aGUgc2VyaWVzIGVuZGVkLiBObyBhdHRlbXB0XG4gICAgLy8gU1RBUlRTIGF0IG9yIHBhc3QgdGhlIGRlYWRsaW5lIGVpdGhlciDigJQgcnVsZSA2IGRlY2lkZWQgd2l0aCB0aGUgY2xvY2ssIGFuZCB0aGUgY2xvY2sgbWF5IGhhdmUgbW92ZWQgb24uXG4gICAgY29uc3QgY3V0ID0gaXNDYW5jZWxsZWQob3B0aW9ucy5zaWduYWwpXG4gICAgICA/ICdhYm9ydGVkJ1xuICAgICAgOiBvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCB8fCAoZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiBub3coKSA+PSBkZWFkbGluZSlcbiAgICAgID8gJ25vLXRpbWUtbGVmdCdcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5vbkVuZD8uKHRhbGx5LnN1bW1hcnkoeyAuLi5sYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpLCBuZXh0OiAnc3RvcCcsIHJlYXNvbjogY3V0IH0pKTtcbiAgICAgIHRocm93IHN0b3BwZWRGYWlsdXJlKG9wdGlvbnMsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyLCB0ZXJtaW5hbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgZmluYWwgcGh5c2ljYWwgYXR0ZW1wdCBvd25zIGl0cyBjYXRlZ29yeTsgYSB3cmFwcGVyIG9yIGN1dCB3YWl0IGhhcyBubyBzdWNoIGNhdGVnb3J5LiAqL1xuZnVuY3Rpb24gc3RvcHBlZEZhaWx1cmUoXG4gIG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbiAgdGVybWluYWw6IEF0dGVtcHRDYXRlZ29yeSxcbik6IHVua25vd24ge1xuICBjb25zdCBlcnJvciA9IHN0b3BFcnJvcihvcHRpb25zLmVmZmVjdCwgcmVjb3JkLCBmYWlsdXJlLCB1bmtub3duU29GYXIpO1xuICBpZiAocmVjb3JkLm91dGNvbWUgIT09ICdwYXVzZWQnKSB7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSByZWNvcmQubmV4dCA9PT0gJ3N0b3AnICYmIE9iamVjdC5pcyhlcnJvciwgZmFpbHVyZT8uZXJyb3IpID8gdGVybWluYWwgOiAndW5rbm93bic7XG4gICAgb3B0aW9ucy5vbkZhaWx1cmU/LihlcnJvciwgY2F0ZWdvcnkpO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RvcHBlZCBzZXJpZXMgdGhyb3dzOiB0aGUgbGFzdCBhdHRlbXB0J3Mgb3duIGVycm9yIOKAlCBvciwgb24gYSB0b3VjaGluZyB0YXJnZXQgd2hlcmUgQU5ZIGF0dGVtcHQgbGVmdCB0aGVcbiAqIGVmZmVjdCB1bmtub3duLCBgVW5rbm93bkVmZmVjdEVycm9yYCB3aXRoIHRoZSBsYXN0IGF0dGVtcHQncyBlcnJvciBhcyBpdHMgY2F1c2UuIEFuIGVhcmxpZXIgdGltZW91dCBtYXkgaGF2ZVxuICogYXBwbGllZCB0aGUgZWZmZWN0OyBhIGxhdGVyIGF0dGVtcHQgdGhhdCBzYXlzIFwibm90aGluZyB3YXMgc2VudFwiIHNwZWFrcyBmb3IgaXRzZWxmIG9ubHksIHNvIGl0IGNhbm5vdCB0dXJuIHRoZVxuICogc2VyaWVzIGludG8gYSBwbGFpbiBmYWlsdXJlLiBBIHBhdXNlIGlzIG5ldmVyIGNvbnZlcnRlZDogaXQgaXMgY29udHJvbCBmbG93LlxuICovXG5mdW5jdGlvbiBzdG9wRXJyb3IoXG4gIGVmZmVjdDogRWZmZWN0VGFyZ2V0IHwgdW5kZWZpbmVkLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbik6IHVua25vd24ge1xuICBpZiAoZWZmZWN0ID09PSB1bmRlZmluZWQgfHwgIXVua25vd25Tb0ZhciB8fCByZWNvcmQub3V0Y29tZSA9PT0gJ3BhdXNlZCcpIHJldHVybiBmYWlsdXJlPy5lcnJvcjtcbiAgcmV0dXJuIHVua25vd25FZmZlY3RFcnJvcihlZmZlY3QsIHJlY29yZCwgZmFpbHVyZT8uZXJyb3IpO1xufVxuXG4vKipcbiAqIE9uZSBhdHRlbXB0IGluIGZsaWdodDogaXRzIGNhcCwgaXRzIHNpZ25hbCAodGhlIHJ1bidzLCBjb21wb3NlZCB3aXRoIGl0cyBvd24gdGltZXIpLCBhbmQgdGhlIGZlbmNlLiBJdHMgb3duXG4gKiB0aW1lciBpcyBhcm1lZCB3aGVuIHRoZSBwb2xpY3kncyBjYXAgaXMgU0hPUlRFUiB0aGFuIHRoZSB0aW1lIGxlZnQ7IGF0IHRoZSBkZWFkbGluZSB0aGUgcnVuJ3Mgb3duIHNpZ25hbCBhYm9ydHMsXG4gKiB3aXRoIHRoZSBkZWFkbGluZSdzIHJlYXNvbiAoc28gYSBydW4gcmVqZWN0cyB3aXRoIHRoZSByZWFzb24gaXQgYWx3YXlzIGRpZCkuIEV2ZXJ5dGhpbmcgaXQgYXJtcyBpcyByZWxlYXNlZFxuICogd2hlbiB0aGUgYXR0ZW1wdCBlbmRzLlxuICovXG5jbGFzcyBMaXZlQXR0ZW1wdCB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIGNhcCB0aGlzIGF0dGVtcHQgcnVucyB1bmRlciDigJQgYG1pbih0aW1lb3V0TXMsIHRpbWUgbGVmdClgLCBuZXZlciBuZWdhdGl2ZTsgYWJzZW50IHdoZW4gdW5jYXBwZWQuICovXG4gIHJlYWRvbmx5IGNhcE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVhc29uIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIGFib3J0ZWQgd2l0aCDigJQgc2V0IG9ubHkgaWYgaXQgZmlyZWQuICovXG4gIHRpbWVvdXRSZWFzb246IEF0dGVtcHRUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsVGltZXI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wb3NlZDogeyByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsOyBkaXNwb3NlKCk6IHZvaWQgfTtcbiAgcHJpdmF0ZSBhYmFuZG9uZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQg4oCUIGFuIGBvYnNlcnZlZGAgcmVwb3J0IGFmdGVyIHRoaXMgaXMgdGhlIG93bmVyJ3MgdG8gcmVmdXNlLiAqL1xuICBwcml2YXRlIGVuZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25BYm9ydCA9ICgpID0+IHRoaXMuYWJhbmRvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgb2Y6IG51bWJlcixcbiAgICBzdGFydGVkQXQ6IG51bWJlcixcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG93bkNhcDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG5vdzogKCkgPT4gbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBsZWZ0ID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKG93bkNhcCA/PyBJbmZpbml0eSwgbGVmdCk7XG4gICAgdGhpcy5jYXBNcyA9IE51bWJlci5pc0Zpbml0ZShjYXApID8gY2FwIDogdW5kZWZpbmVkO1xuICAgIC8vIEl0cyBvd24gdGltZXIgd2hlbiBpdHMgb3duIGNhcCBpcyB0aGUgc2hvcnRlciwgb3Igd2hlbiBubyBydW4gc2lnbmFsIHdpbGwgYWJvcnQgYXQgdGhlIGRlYWRsaW5lIChhIGNhbGxlclxuICAgIC8vIHdpdGggYSBkZWFkbGluZSBhbmQgbm8gc2lnbmFsKS4gT3RoZXJ3aXNlIHRoZSBydW4ncyBzaWduYWwgZW5kcyBpdCBhdCB0aGUgZGVhZGxpbmUsIHdpdGggdGhlIGRlYWRsaW5lJ3MgcmVhc29uLlxuICAgIGNvbnN0IG93blRpbWVyID0gdGhpcy5jYXBNcyAhPT0gdW5kZWZpbmVkICYmICgob3duQ2FwICE9PSB1bmRlZmluZWQgJiYgb3duQ2FwIDwgbGVmdCkgfHwgIW9wdGlvbnMuc2lnbmFsKTtcbiAgICBjb25zdCBvd24gPSBvd25UaW1lciA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAob3duKSB7XG4gICAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXMgYXMgbnVtYmVyO1xuICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldExvbmdUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gQSB0aW1lIGxpbWl0LCBicmFuZGVkIGxpa2UgdGhlIHJ1bidzIGRlYWRsaW5lOiBhIGNhbGwgbWFkZSBpbnNpZGUgdGhpcyBhdHRlbXB0IHRoYXQgaXQgY3V0cyB0aW1lZCBvdXQuXG4gICAgICAgIHRoaXMudGltZW91dFJlYXNvbiA9IG1hcmtUaW1lTGltaXQobmV3IEF0dGVtcHRUaW1lb3V0RXJyb3IoYXR0ZW1wdCwgY2FwTXMpKTtcbiAgICAgICAgb3duLmFib3J0KHRoaXMudGltZW91dFJlYXNvbik7XG4gICAgICB9LCBjYXBNcyk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZWQgPSBhbnlTaWduYWwoW29wdGlvbnMuc2lnbmFsLCBvd24/LnNpZ25hbF0pO1xuICAgIC8vIFJlZ2lzdGVyZWQgQkVGT1JFIHRoZSBmdW5jdGlvbiBydW5zLCBzbyB0aGUgZmVuY2UgY2xvc2VzIGJlZm9yZSBhbnkgbGlzdGVuZXIgdGhlIGZ1bmN0aW9uIGFkZHMuIEEgc2lnbmFsXG4gICAgLy8gQUxSRUFEWSBhYm9ydGVkIChhIGRlY2lkZXIgZW50ZXJlZCBhZnRlciBhIGNhbmNlbCDigJQgbm8gYWJvcnQgY2hlY2sgcHJlY2VkZXMgaXQpIGRvZXMgbm90IGZlbmNlIHRoZSBhdHRlbXB0XG4gICAgLy8gYmVmb3JlIGl0IHJ1bnM6IGl0IHJ1bnMgYXMgaXQgZGlkIGJlZm9yZSB0aGUgZmVuY2UgZXhpc3RlZCwgYW5kIGlzIGZlbmNlZCB3aGVuIGl0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIuXG4gICAgdGhpcy5jb21wb3NlZC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNvbXBvc2VkLnNpZ25hbDtcbiAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXM7XG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBzZXJpZXM6IG9wdGlvbnMuc2VyaWVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc2lnbmFsLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIC4uLihjYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBjYXBNcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3lzdGVtOiBvcHRpb25zLmVmZmVjdC5zeXN0ZW0gfSksXG4gICAgICAuLi4ob3B0aW9ucy5lZmZlY3Q/LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogb3B0aW9ucy5lZmZlY3QuaWRlbXBvdGVuY3lLZXkgfSksXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogZGVhZGxpbmUgLSBub3coKSksXG4gICAgICBvYnNlcnZlZDogKHJlcG9ydDogT2JzZXJ2ZWRBdHRlbXB0KSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucy5vYnNlcnZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2JzZXJ2ZWQoKTogcmVwb3J0IGFuIG91dHNpZGUgYXR0ZW1wdCB0aHJvdWdoIGBzY29wZS4kYXR0ZW1wdCgpLm9ic2VydmVkKC4uLilgJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5vYnNlcnZlKHJlcG9ydCwgeyBhdHRlbXB0LCBlbmRlZDogdGhpcy5lbmRlZCB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGNhcE1zICE9PSB1bmRlZmluZWQpIEFUVEVNUFRfRU5EUy5zZXQodGhpcy5jb250ZXh0LCBzdGFydGVkQXQgKyBjYXBNcyk7XG4gIH1cblxuICAvKiogYHZhbHVlYCwgb3IgdGhlIGF0dGVtcHQgc2lnbmFsJ3MgcmVhc29uIHRoZSBtb21lbnQgaXQgYWJvcnRzIGZpcnN0IOKAlCB0aGUgZW5naW5lIHN0b3BzIHdhaXRpbmcgYXQgdGhlIGNhcC4gKi9cbiAgcmFjZTxUPih2YWx1ZTogUHJvbWlzZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHwgVCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY29tcG9zZWQuc2lnbmFsO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gcmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgdmFsdWUudGhlbihcbiAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBBbHJlYWR5IGFib3J0ZWQgKHRoZSBmdW5jdGlvbiBhYm9ydGVkIGl0IGFzIGl0IHJhbik6IGEgdmFsdWUgdGhhdCBhbHJlYWR5IHNldHRsZWQgc3RpbGwgd2lucyDigJQgaXRzXG4gICAgICAvLyByZWFjdGlvbiB3YXMgcXVldWVkIGFib3ZlLCBmaXJzdCDigJQgYW5kIGEgcGVuZGluZyBvbmUgaXMgY3V0IG9uIHRoZSBuZXh0IG1pY3JvdGFzay5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcXVldWVNaWNyb3Rhc2sob25BYm9ydCk7XG4gICAgICBlbHNlIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdCBpcyBvdmVyOiByZWxlYXNlIHRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyczsgZmVuY2UgaXQgaWYgaXQgZW5kZWQgd2l0aG91dCBhbiBhbnN3ZXIuICovXG4gIGVuZChvdXRjb21lOiBBdHRlbXB0T3V0Y29tZSk6IHZvaWQge1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FuY2VsVGltZXI/LigpO1xuICAgIHRoaXMuY29tcG9zZWQuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLmNvbXBvc2VkLmRpc3Bvc2UoKTtcbiAgICBpZiAob3V0Y29tZSAhPT0gJ29rJyAmJiBvdXRjb21lICE9PSAncGF1c2VkJykgdGhpcy5hYmFuZG9uKCk7XG4gIH1cblxuICAvKiogRmVuY2UgYW4gYXR0ZW1wdCB0aGF0IHN0YXJ0ZWQgdW5kZXIgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCwgb25jZSBpdHMgc3luY2hyb25vdXMgcGFydCBoYXMgcnVuLiAqL1xuICBhYmFuZG9uU3RhcnRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFiYW5kb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWJhbmRvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYmFuZG9uZWQpIHJldHVybjtcbiAgICB0aGlzLmFiYW5kb25lZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLm9uQWJhbmRvbj8uKHRoaXMuYXR0ZW1wdCk7XG4gIH1cbn1cblxuLyoqIFRoZSBzaWduYWwgYWJvcnRlZCBhdCBhIHRpbWUgbGltaXQg4oCUIHRoZSBydW4ncyBkZWFkbGluZSwgb3IgYSBjYWxsJ3MgYXR0ZW1wdCBjYXAg4oCUIG5vdCBieSBhIGNhbmNlbGxhdGlvbi4gKi9cbmZ1bmN0aW9uIHRpbWVkT3V0KHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiBpc0RlYWRsaW5lUmVhc29uKHNpZ25hbC5yZWFzb24pO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgYXR0ZW1wdCBpdHNlbGYgZW5kZWQuIEEgdGhyb3duIHZhbHVlIGlzIHRoZSBhdHRlbXB0J3Mgb3duIGZhaWx1cmUgdW5sZXNzIGl0IElTIHdoYXQgYSBzaWduYWwgYWJvcnRlZFxuICogd2l0aCAoU3RhZ2VSdW5uZXIncyByYWNlIHJlamVjdHMgd2l0aCBpdDsgYSBzdGFnZSBtYXkgcmV0aHJvdyBpdCk6IGl0cyBvd24gY2FwJ3MgYEF0dGVtcHRUaW1lb3V0RXJyb3JgIG9yIHRoZVxuICogcnVuJ3MgZGVhZGxpbmUg4oaSIGAndGltZW91dCdgOyB0aGUgcnVuJ3MgY2FuY2VsbGF0aW9uIOKGkiBgJ2Fib3J0ZWQnYC5cbiAqL1xuZnVuY3Rpb24gb3V0Y29tZU9mKFxuICBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICB0aW1lb3V0UmVhc29uOiBBdHRlbXB0VGltZW91dEVycm9yIHwgdW5kZWZpbmVkLFxuKTogQXR0ZW1wdE91dGNvbWUge1xuICBpZiAoIWZhaWx1cmUpIHJldHVybiAnb2snO1xuICAvLyBBbiBgaW50ZXJydXB0KClgIHRocm93biBpbnNpZGUgYSBjYWxsIGlzIGNvbnZlcnRlZCB0byBhIHBhdXNlIGF0IHRoZSBzdGFnZSBib3VuZGFyeSwgcGFzdCB0aGlzIHJ1bm5lci5cbiAgaWYgKGlzUGF1c2VTaWduYWwoZmFpbHVyZS5lcnJvcikgfHwgaXNJbnRlcnJ1cHRTaWduYWwoZmFpbHVyZS5lcnJvcikpIHJldHVybiAncGF1c2VkJztcbiAgLy8gSXRzIG93biBjYXAgcmFuIG91dCDigJQgdGhlIGF0dGVtcHQncyB0aW1lciBpcyB0aGUgb25lIHRoYXQgZmlyZWQsIGFuZCB0aGUgYXR0ZW1wdCB0aHJldyB3aGF0IGl0IGFib3J0ZWQgd2l0aC5cbiAgaWYgKHRpbWVvdXRSZWFzb24gIT09IHVuZGVmaW5lZCAmJiBmYWlsdXJlLmVycm9yID09PSB0aW1lb3V0UmVhc29uKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkICE9PSB0cnVlIHx8IGZhaWx1cmUuZXJyb3IgIT09IHNpZ25hbC5yZWFzb24pIHJldHVybiAnZmFpbGVkJztcbiAgLy8gVGhlIHJ1bidzIHNpZ25hbCBlbmRlZCBpdDogYXQgdGhlIGRlYWRsaW5lIHRoZSBhdHRlbXB0IHJhbiBvdXQgb2YgdGltZSAobGF3IDQpOyBvdGhlcndpc2UgaXQgd2FzIGNhbmNlbGxlZC5cbiAgcmV0dXJuIGlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbikgPyAndGltZW91dCcgOiAnYWJvcnRlZCc7XG59XG5cbi8qKlxuICogT25lIGF0dGVtcHQncyBkZWNpc2lvbiBpbnB1dHMsIGVhY2ggcmVhZCBvbmx5IHdoZW4gYSBydWxlIHJlYWNoZXMgaXQgKGBkZWNpZGVBdHRlbXB0YCdzIHJlYWRlcik6IHRoZSB1c2VyJ3NcbiAqIGByZXRyeU9uYCBhbmQgYGJhY2tvZmZNc2AgcnVuIGF0IG1vc3Qgb25jZSBlYWNoLCBhbmQgb25seSB3aGVuIHRoZSA5LjE1IGxvb3Agd291bGQgaGF2ZSBydW4gdGhlbS5cbiAqL1xuY2xhc3MgQXR0ZW1wdElucHV0UmVhZGVyIHtcbiAgLyoqIFRoZSBmYWlsdXJlIGEgY2F0ZWdvcnkgYW5kIGEgc2VydmVkIGVycm9yIGFyZSByZWFkIGZyb20g4oCUIG5vbmUgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYC4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBGYWlsdXJlIHwgdW5kZWZpbmVkO1xuICAvKiogYHRydWVgIG9uY2UgYHJldHJ5T25gIHRocmV3IChpdHMgdmVyZGljdCBpcyB0aGVuIGBmYWxzZWApLiAqL1xuICByZXRyeU9uVGhyZXcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXRyeU9uVmVyZGljdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB3YWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmFpbHVyZUNhdGVnb3J5OiBBdHRlbXB0Q2F0ZWdvcnkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2F0ZWdvcnlSZWFkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsZWZ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvZjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLFxuICAgIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZmFpbGVkID0gZmFpbHVyZSAmJiBvdXRjb21lICE9PSAncGF1c2VkJyA/IGZhaWx1cmUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogT25lIGlucHV0IGJ5IGl0cyBgQXR0ZW1wdElucHV0c2Aga2V5LiAqL1xuICByZWFkb25seSByZWFkID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ291dGNvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5vdXRjb21lO1xuICAgICAgY2FzZSAnY2F0ZWdvcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeSgpO1xuICAgICAgY2FzZSAnYWJvcnRlZCc6XG4gICAgICAgIC8vIExpdmU6IGEgZGVjaXNpb24gdGFrZW4gYWdhaW4gYWZ0ZXIgYHJldHJ5T25gIHNlZXMgYW4gYWJvcnQgcmFpc2VkIGluc2lkZSBpdC4gVGhlIGRlYWRsaW5lIGlzIG5vdCBhXG4gICAgICAgIC8vIGNhbmNlbGxhdGlvbiDigJQgcnVsZSA2IG93bnMgaXQuXG4gICAgICAgIHJldHVybiBpc0NhbmNlbGxlZCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGNhc2UgJ2F0dGVtcHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0O1xuICAgICAgY2FzZSAnb2YnOlxuICAgICAgICByZXR1cm4gdGhpcy5vZjtcbiAgICAgIGNhc2UgJ3RpbWVMZWZ0TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy50aW1lTGVmdCgpO1xuICAgICAgY2FzZSAndGltZUxlZnRBZnRlcldhaXRNcyc6XG4gICAgICAgIC8vIFdpdGhvdXQgYSBkZWFkbGluZSB0aGUgdGltZSBsZWZ0IGlzIHVuYm91bmRlZCwgYmVmb3JlIGFueSB3YWl0IGFuZCBhZnRlciBpdCDigJQgc28gZGVjaWRpbmcgbmVlZHMgbm9cbiAgICAgICAgLy8gd2FpdCwgYW5kIGBiYWNrb2ZmTXNgIGlzIGFza2VkIGFmdGVyIHRoZSBkaXNjYXJkLCBhcyBpbiA5LjE1LiBVbmRlciBvbmUsIHRoZSB3YWl0J3MgbGVuZ3RoIGRlY2lkZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnVuYm91bmRlZCgpID8gSW5maW5pdHkgOiB0aGlzLnRpbWVMZWZ0KCkgLSB0aGlzLmRlbGF5TXMoKTtcbiAgICAgIGNhc2UgJ2RlbGF5TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kZWxheU1zKCk7XG4gICAgICBjYXNlICdyZXRyeU9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlPbigpO1xuICAgICAgY2FzZSAna2V5UHJlc2VudCc6XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBmYWlsdXJlJ3MgY2F0ZWdvcnksIHJlYWQgb25jZSDigJQgYXQgdGhlIGZpcnN0IHJ1bGUgdGhhdCBhc2tzLCBvciBhZnRlciB0aGUgZGVjaXNpb24uICovXG4gIGNhdGVnb3J5KCk6IEF0dGVtcHRDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmNhdGVnb3J5UmVhZCkge1xuICAgICAgdGhpcy5jYXRlZ29yeVJlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5mYWlsdXJlQ2F0ZWdvcnkgPSB0aGlzLmZhaWxlZCA/IGVycm9yQ2F0ZWdvcnkodGhpcy5mYWlsZWQuZXJyb3IsIHRoaXMub3V0Y29tZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDYXRlZ29yeTtcbiAgfVxuXG4gIC8qKiBUaGUgcG9saWN5J3Mgd2FpdCBhZnRlciB0aGlzIGF0dGVtcHQgKGByZXNvbHZlQmFja29mZk1zYCksIGFza2VkIG9uY2Ug4oCUIGNhcHBlZCBhdCBpdHMgYG1heEJhY2tvZmZNc2AuICovXG4gIGRlbGF5TXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMud2FpdCA/Pz0gY2FwcGVkV2FpdE1zKFxuICAgICAgcmVzb2x2ZUJhY2tvZmZNcyh0aGlzLnBvbGljeS5iYWNrb2ZmTXMsIHRoaXMuYXR0ZW1wdCwgdGhpcy5mYWlsZWQ/LmVycm9yKSxcbiAgICAgIHRoaXMucG9saWN5Lm1heEJhY2tvZmZNcyxcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBUaGUgd2FpdCwgaWYgdGhlIGRlY2lzaW9uIGFscmVhZHkgYXNrZWQgZm9yIGl0IChydWxlIDYgdW5kZXIgYSBkZWFkbGluZSk7IG5ldmVyIGFza3MgYGJhY2tvZmZNc2AgaXRzZWxmLiAqL1xuICBkZWxheUlmQXNrZWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53YWl0O1xuICB9XG5cbiAgLyoqIE1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGRlYWRsaW5lIGF0IHRoZSBkZWNpc2lvbiwgcmVhZCBvbmNlIChgSW5maW5pdHlgIHdpdGhvdXQgb25lKS4gKi9cbiAgdGltZUxlZnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51bmJvdW5kZWQoKSkgcmV0dXJuIEluZmluaXR5O1xuICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2xvY2sgPSB0aGlzLmRlYWRsaW5lID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IHRoaXMuZGVhZGxpbmUgLSB0aGlzLm5vdygpO1xuICAgICAgLy8gQSB0aW1lIGxpbWl0IGFscmVhZHkgcmVhY2hlZCDigJQgdGhlIHNpZ25hbCBhYm9ydGVkIGF0IHRoZSBkZWFkbGluZSAob3IsIGZvciBhIGNhbGwsIGF0IGl0cyBhdHRlbXB0J3MgY2FwKSDigJRcbiAgICAgIC8vIGxlYXZlcyBubyB0aW1lLCB3aGF0ZXZlciB0aGUgY2xvY2sgc2F5czogYSBob3N0IHRpbWVyIG1heSBmaXJlIGEgbWlsbGlzZWNvbmQgYmVmb3JlIHRoZSBjbG9jayBnZXRzIHRoZXJlLlxuICAgICAgdGhpcy5sZWZ0ID0gdGltZWRPdXQodGhpcy5vcHRpb25zLnNpZ25hbCkgPyBNYXRoLm1pbihjbG9jaywgMCkgOiBjbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuXG4gIC8qKiBObyBkZWFkbGluZSBhbmQgbm8gdGltZSBsaW1pdCByZWFjaGVkOiB0aGUgdGltZSBsZWZ0IGlzIGBJbmZpbml0eWAsIGFuZCBubyB3YWl0IG5lZWQgYmUgYXNrZWQgZm9yLiAqL1xuICBwcml2YXRlIHVuYm91bmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWFkbGluZSA9PT0gdW5kZWZpbmVkICYmICF0aW1lZE91dCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUaGUgYHJldHJ5T25gIGdhdGUsIGFza2VkIG9uY2UuIEEgdGhyb3dpbmcgcHJlZGljYXRlIGlzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuIG9uZSBuZXZlciBsb29wcy4gKi9cbiAgcHJpdmF0ZSByZXRyeU9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnJldHJ5T25WZXJkaWN0ID09PSB1bmRlZmluZWQpIHRoaXMucmV0cnlPblZlcmRpY3QgPSB0aGlzLmFza1JldHJ5T24oKTtcbiAgICByZXR1cm4gdGhpcy5yZXRyeU9uVmVyZGljdDtcbiAgfVxuXG4gIHByaXZhdGUgYXNrUmV0cnlPbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2xpY3kucmV0cnlPbih0aGlzLmZhaWxlZD8uZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHRocm93bikge1xuICAgICAgdGhpcy5yZXRyeU9uVGhyZXcgPSB0cnVlO1xuICAgICAgdGhpcy5vcHRpb25zLm9uUmV0cnlPblRocmV3Py4odGhyb3duKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9saWN5J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWQgKDEtYmFzZWQpIGFuZCBpdHMgZXJyb3IuIEFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlLFxuICogcG9zaXRpdmUgbnVtYmVyIOKAlCBhIG1pc3NpbmcgZGlhbCwgYSBuZWdhdGl2ZSB2YWx1ZSwgYSBgTmFOYCBmcm9tIGEgY29uc3VtZXIncyBhcml0aG1ldGljLCBvciBhIHRocm93aW5nXG4gKiBmdW5jdGlvbiDigJQgYmVjb21lcyBgMGAsIGkuZS4gcmV0cnkgaW1tZWRpYXRlbHkuIEEgYmFja29mZiBkaWFsIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjcmFzaCBhIHJ1biBvciBwYXJrIGl0XG4gKiBmb3JldmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXM6IFJldHJ5UG9saWN5WydiYWNrb2ZmTXMnXSwgYXR0ZW1wdDogbnVtYmVyLCBlcnJvcj86IHVua25vd24pOiBudW1iZXIge1xuICBpZiAoYmFja29mZk1zID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIGlmICh0eXBlb2YgYmFja29mZk1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYmFja29mZk1zKGF0dGVtcHQsIGVycm9yKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzIGBzaWduYWwuYWJvcnRlZGAgYW5kIHJldGhyb3dzXG4gKiB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciwgc28gYSBjYW5jZWxsZWQgcnVuIG5ldmVyIHNpdHMgb3V0IGEgbG9uZyBiYWNrb2ZmIGFuZCBuZXZlciBsb3NlcyB0aGUgZmFpbHVyZSB0aGF0XG4gKiBjYXVzZWQgaXQuIFRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyIGFyZSBhbHdheXMgY2xlYW5lZCB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoZG9uZSwgbXMpO1xuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhvdyBhIHJlY29yZCBlbmRlZCBpdHMgc2VyaWVzLCBhcyB0aGUgc3VtbWFyeSdzIGBsYXN0YCBzYXlzIGl0LiBPbiBhIHRvdWNoaW5nIHRhcmdldCB0aGUgZWZmZWN0IGlzIHRoZSBTRVJJRVMnXG4gKiAoYHVua25vd25Tb0ZhcmApOiB1bmtub3duIG9uY2UgYW55IGF0dGVtcHQgbGVmdCBpdCB1bmtub3duLCB1bmxlc3MgdGhlIHNlcmllcyBlbmRlZCB3aXRoIGFuIGFuc3dlci5cbiAqL1xuZnVuY3Rpb24gbGFzdE9mKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgdW5rbm93blNvRmFyID0gZmFsc2UpOiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddIHtcbiAgY29uc3QgZWZmZWN0ID0gcmVjb3JkLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHVua25vd25Tb0ZhciAmJiByZWNvcmQub3V0Y29tZSAhPT0gJ29rJyA/ICd1bmtub3duJyA6IHJlY29yZC5lZmZlY3Q7XG4gIHJldHVybiB7XG4gICAgbmV4dDogcmVjb3JkLm5leHQgYXMgQXR0ZW1wdFN1bW1hcnlbJ2xhc3QnXVsnbmV4dCddLFxuICAgIHJlYXNvbjogcmVjb3JkLnJlYXNvbixcbiAgICAuLi4ocmVjb3JkLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5IH0pLFxuICAgIC4uLihyZWNvcmQucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgIC4uLihlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdCB9KSxcbiAgfTtcbn1cblxuLyoqIFBlci1vdXRjb21lIGNvdW50cyBvZiBhIHNlcmllcywgZm9yIGl0cyBzdW1tYXJ5LiAqL1xuY2xhc3MgU2VyaWVzVGFsbHkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvdW50cyA9IHsgY291bnQ6IDAsIG9rOiAwLCBmYWlsZWQ6IDAsIHRpbWVvdXQ6IDAsIGFib3J0ZWQ6IDAsIHBhdXNlZDogMCB9O1xuXG4gIGFkZChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50cy5jb3VudCArPSAxO1xuICAgIHRoaXMuY291bnRzW3JlY29yZC5vdXRjb21lXSArPSAxO1xuICB9XG5cbiAgc3VtbWFyeShsYXN0OiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddKTogQXR0ZW1wdFN1bW1hcnkge1xuICAgIHJldHVybiBmcmVlemVEZWVwPEF0dGVtcHRTdW1tYXJ5Pih7IC4uLnRoaXMuY291bnRzLCBsYXN0IH0pO1xuICB9XG59XG4iXX0=
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFHSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUE2RXhELHNIQUFzSDtBQUN0SCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBMEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFB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U0FBUyxJQUFJLFlBQVksSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xILE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQXNDO1FBQ25ELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25FLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQWEsRUFBRSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxXQUFXO0lBQ0UsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU1RixHQUFHLENBQUMsTUFBcUI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQTRCO1FBQ2xDLE9BQU8sVUFBVSxDQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9ydW5uZXIudHMg4oCUIGBydW5BdHRlbXB0c2AsIFRIRSByZXRyeSBsb29wIChkZXNpZ24gwqczLjEsIGxhdyAxOiBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKS5cbiAqXG4gKiBSdW5zIGEgZnVuY3Rpb24gdW5kZXIgYSBwb2xpY3kgYW5kIHJlY29yZHMgZXZlcnkgdHJ5OiBvbmUgZnJvemVuIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCwgY2FycnlpbmcgaXRzXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIChgYXR0ZW1wdC9kZWNpc2lvbi50c2ApLCBhbmQgb25lXG4gKiBgQXR0ZW1wdFN1bW1hcnlgIHdoZW4gdGhlIHNlcmllcyBlbmRzLiBUaGUgZW5naW5lJ3Mgc3RhZ2UgcmV0cnkgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCkgcnVucyBvblxuICogaXQ7IGxhdGVyIHBhY2tldHMgcnVuIGluLXN0YWdlIGNhbGxzIGFuZCBzdGFuZGFsb25lIGBhdHRlbXB0KClgIG9uIGl0IHRvby5cbiAqXG4gKiBUaGUgbG9vcCwgcGVyIGF0dGVtcHQgbiDigJQgZm9yIGEgZmFpbGVkIGF0dGVtcHQsIHRoZSA5LjE1IGxvb3AncyBvcmRlciwgc3RlcCBmb3Igc3RlcDpcbiAqXG4gKiAgIHN0YXJ0IOKGkiBydW4obikg4oaSIG91dGNvbWUgKG9rIHwgZmFpbGVkIHwgYWJvcnRlZCBbaXQgdGhyZXcgdGhlIHJ1bidzIGFib3J0IHJlYXNvbl0gfCBwYXVzZWQgW2EgUGF1c2VTaWduYWxdKVxuICogICAgICAgICDihpIgZGVjaWRlIG92ZXIgdGhlIGlucHV0cywgZmlyc3QgbWF0Y2ggd2lucyAoYHJldHJ5UnVsZXNgKSDigJQgcmV0cnlPbiBpcyBhc2tlZCBoZXJlIChydWxlIDUpXG4gKiAgICAgICAgIOKGkiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0ZWQgaW5zaWRlIHJldHJ5T24/IGRlY2lkZSBhZ2FpbjogcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXMgaGVyZSwgYmVmb3JlIHRoZVxuICogICAgICAgICAgIGRpc2NhcmQgYW5kIGJlZm9yZSBiYWNrb2ZmTXMsIGFzIHRoZSA5LjE1IGFib3J0IGNoZWNrIGRpZFxuICogICAgICAgICDihpIgcmV0cnk6IGJldHdlZW4obikg4oCUIHRoZSBkaXNjYXJkIOKAlCBhbmQgVEhFTiBiYWNrb2ZmTXMobiksIHRoZSB3YWl0J3MgbGVuZ3RoXG4gKiAgICAgICAgIOKGkiB0aGUgZXJyb3IncyBzZXJ2ZWQgZm9ybSBhbmQgY2F0ZWdvcnksIHJlYWQgYWZ0ZXIgcmV0cnlPbiBhbmQgYmFja29mZk1zIHJhbiDihpIgdGhlIHJlY29yZFxuICogICAgICAgICDihpIgb25FbmQoc3VtbWFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgd2hlbiB0aGUgc2VyaWVzIGVuZHMgaGVyZVxuICogICAgICAgICDihpIgb25BdHRlbXB0KHJlY29yZCwgc2VydmVkIGVycm9yKVxuICogICAgICAgICDihpIgZG9uZTogcmV0dXJuIHRoZSB2YWx1ZSDCtyBzdG9wOiByZXRocm93IHRoZSBhdHRlbXB0J3MgT1dOIGVycm9yXG4gKiAgICAgICAgIOKGkiByZXRyeTogb25SZXRyeShuLCBvZiwgZGVsYXksIHNlcnZlZCBlcnJvcikg4oaSIHdhaXQgKGN1dCBzaG9ydCBieSB0aGUgc2lnbmFsKSDihpIgYWJvcnRlZD8gc3RvcFxuICpcbiAqIFdIQVQgSVQgUFJFU0VSVkVTICh0aGUgOS4xNSBsb29wJ3MgYmVoYXZpb3VyLCBtb3ZlZCBoZXJlIHVuY2hhbmdlZCk6IHRoZSBmdW5jdGlvbiBydW5zIHRoZSBzYW1lIG51bWJlciBvZlxuICogdGltZXM7IGByZXRyeU9uYCBpcyBhc2tlZCBvbmx5IGZvciBhIGZhaWxlZCwgbm9uLWZpbmFsIGF0dGVtcHQ7IGBiYWNrb2ZmTXNgIG9ubHkgd2hlbiBhIHJldHJ5IGZvbGxvd3MsIGFmdGVyXG4gKiB0aGUgZGlzY2FyZDsgYSB0aHJvd2luZyBwcmVkaWNhdGUgaXMgXCJkbyBub3QgcmV0cnlcIiwgYSB0aHJvd2luZyBvciBub24tZmluaXRlIGJhY2tvZmYgaXMgXCJubyB3YWl0XCI7IGEgcGF1c2UgaXNcbiAqIG5ldmVyIHJldHJpZWQ7IHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yIGlzIHJldGhyb3duLCBuZXZlciBhIHdyYXBwZXI7IGFuZCBhIGZhaWxlZCBhdHRlbXB0J3Mgb3JkZXIg4oCUXG4gKiBgcmV0cnlPbmAg4oaSIHRoZSBhYm9ydCBjaGVjayDihpIgdGhlIGRpc2NhcmQgKGBiZXR3ZWVuYCkg4oaSIGBiYWNrb2ZmTXNgIOKGkiB0aGUgc2VydmVkIGVycm9yIOKGkiB0aGUgcmV0cnkgZXZlbnQg4oaSXG4gKiB0aGUgd2FpdCDihpIgdGhlIGFib3J0IGNoZWNrLiBTbyBhbiBhYm9ydCBpbnNpZGUgYHJldHJ5T25gIHN0b3BzIGJlZm9yZSB0aGUgZGlzY2FyZCBhbmQgbmV2ZXIgYXNrcyBgYmFja29mZk1zYDtcbiAqIGFuIGFib3J0IGluc2lkZSBgYmFja29mZk1zYCBjb21lcyBhZnRlciB0aGUgZGlzY2FyZCwgc3RpbGwgZmlyZXMgdGhlIHJldHJ5IGV2ZW50LCB0aGVuIGVuZHMgYXQgdGhlIHdhaXQ7IGFuZFxuICogdGhlIHNlcnZlZCBlcnJvciBzaG93cyB3aGF0IGByZXRyeU9uYCBkaWQgdG8gdGhlIHRocm93biB2YWx1ZS4gVGhlIG9uZSBkaWZmZXJlbmNlOiB3aGVuIHRoZSBydW4ncyBzaWduYWwgaGFzXG4gKiBBTFJFQURZIGFib3J0ZWQgYXMgdGhlIGF0dGVtcHQgZmFpbHMsIHRoZSBzZXJpZXMgc3RvcHMgd2l0aG91dCBhc2tpbmcgYHJldHJ5T25gICh0aGUgYWJvcnQgZGVjaWRlcyBmaXJzdCDigJRcbiAqIHJ1bGUgMyBiZWZvcmUgcnVsZSA1KS5cbiAqXG4gKiBXSEFUIElUIEFERFM6IHRoZSByZWNvcmQgYW5kIHRoZSBzdW1tYXJ5LiBBIHJlY29yZCBpcyBmcm96ZW4gdG8gaXRzIGxlYXZlcyBhbmQgaG9sZHMgb25seSBjbG9uZS1zYWZlIGRhdGEg4oCUXG4gKiB0aGUgZXJyb3IgYXMgdGhlIHJ1biBTRVJWRVMgaXQgKGBzZXJ2ZWAsIHRoZSByZWRhY3Rpb24gcnVsZSdzIGZvcm0pIHdpdGhvdXQgYHJhd2AuIFRoZSBob29rIGdldHMgdGhlIHNlcnZlZFxuICogYFN0cnVjdHVyZWRFcnJvckluZm9gIHdob2xlLCBgcmF3YCBpbmNsdWRlZCwgYXMgYG9uU3RhZ2VSZXRyeWAgYWx3YXlzIGhhcy4gQSByZWNvcmQgbmV2ZXIgcmV3cml0ZXMgd2hhdCB0aGVcbiAqIGF0dGVtcHQgZGlkOiBhbiBhdHRlbXB0IHRoYXQgdGhyZXcgaXRzIG93biBlcnJvciBpcyBgZmFpbGVkYCwgd2l0aCBpdHMgY2F0ZWdvcnksIGV2ZW4gd2hlbiB0aGUgcnVuIGFib3J0ZWRcbiAqIGFyb3VuZCBpdCDigJQgdGhlIGFib3J0IGlzIHRoZSBzZXJpZXMnIHN0b3AgcmVhc29uIChgcmVhc29uOiAnYWJvcnRlZCdgKTsgYSB0aHJvd2luZyBgcmV0cnlPbmAgaXMgYGRlY2xpbmVkYFxuICogd2l0aCBgcmV0cnlPblRocmV3OiB0cnVlYCwgYXBhcnQgZnJvbSBhIHJlYWwgYGZhbHNlYC5cbiAqXG4gKiBUSU1FIChQMWIpLiBFYWNoIGF0dGVtcHQgcnVucyB1bmRlciBgbWluKHBvbGljeS50aW1lb3V0TXMsIHRpbWUgbGVmdCBiZWZvcmUgb3B0aW9ucy5kZWFkbGluZSlgIGFuZCBnZXRzIGFuXG4gKiBgQXR0ZW1wdENvbnRleHRgIOKAlCBpdHMgc2lnbmFsLCBjb21wb3NlZCBmcm9tIHRoZSBydW4ncyBhbmQgaXRzIG93biBjYXAncyB0aW1lciAoYExpdmVBdHRlbXB0YCkuIFRoZSBjYXAncyB0aW1lclxuICogYWJvcnRzIHdpdGggYW4gYEF0dGVtcHRUaW1lb3V0RXJyb3JgOyB0aGUgcnVuJ3MgZGVhZGxpbmUgYWJvcnRzIHRoZSBydW4ncyBzaWduYWwgd2l0aCBhIGJyYW5kZWQgcmVhc29uXG4gKiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS4gRWl0aGVyIHdheSB0aGUgYXR0ZW1wdCBpcyBgJ3RpbWVvdXQnYCwgbmV2ZXIgYCdhYm9ydGVkJ2A6IHRoZSBkZWFkbGluZSBpcyBub3QgYVxuICogY2FuY2VsbGF0aW9uLCBzbyBydWxlIDMgZG9lcyBub3QgbWF0Y2ggYW5kIHJ1bGUgNiAoYHRpbWVMZWZ0QWZ0ZXJXYWl0TXMg4omkIDBgKSBzdG9wcyBhIHNlcmllcyB3aG9zZSBuZXh0IHdhaXRcbiAqIHdvdWxkIG91dGxhc3QgaXQuIFVuZGVyIGEgZGVhZGxpbmUgcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoLCBzbyBgYmFja29mZk1zKG4sIGVycm9yKWAgaXMgYXNrZWQgRFVSSU5HIHRoZVxuICogZGVjaXNpb24g4oCUIGJlZm9yZSB0aGUgZGlzY2FyZDsgd2l0aG91dCBvbmUgdGhlIDkuMTUgb3JkZXIgYWJvdmUgaG9sZHMgdW5jaGFuZ2VkLiBObyBhdHRlbXB0IHN0YXJ0cyBhdCBvciBwYXN0XG4gKiB0aGUgZGVhZGxpbmU6IGEgd2FpdCB0aGUgZGVhZGxpbmUgY3V0IGVuZHMgdGhlIHNlcmllcyBgbm8tdGltZS1sZWZ0YCwgcmVjb3JkaW5nIG5vIGZ1cnRoZXIgYXR0ZW1wdC5cbiAqXG4gKiBUSEUgRkVOQ0UuIFRoZSBtb21lbnQgYW4gYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2lnbmFsIGFib3J0cyAoc3luY2hyb25vdXNseSwgYmVmb3JlIGFueSBsaXN0ZW5lclxuICogdGhlIGZ1bmN0aW9uIGFkZGVkKSBvciBpdCB0aHJvd3Mg4oCUIGBvbkFiYW5kb24obilgIGZpcmVzIG9uY2UsIGFuZCB0aGUgZW5naW5lIGNsb3NlcyB0aGF0IGF0dGVtcHQncyBzY29wZTogdGhlXG4gKiBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIG5vdGhpbmcgaXQgZG9lcyBhZnRlcndhcmRzIG1heSBsYW5kIGJlc2lkZSBhIGxhdGVyIGF0dGVtcHQuXG4gKlxuICogT05FIGFzeW5jIGZyYW1lIHdpdGggT05FIGF3YWl0IHBlciBhdHRlbXB0OiB0aGUgZW5naW5lIHJlbGllcyBvbiB0aGF0IHRvIGtlZXAgYSByZXRyaWVkIHN0YWdlJ3MgbWljcm90YXNrXG4gKiBzaGFwZSwgc28gcGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlciB0aGV5IGFsd2F5cyBkaWQuIFRoZSBlbmdpbmUgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmLFxuICogYXQgdGhlIHN0YWdlIGJvdW5kYXJ5IChgcmFjZWQ6IHRydWVgKTsgYW55IG90aGVyIGNhbGxlciBnZXRzIHRoZSByYWNlIGhlcmUsIHNvIHRoZSBzZXJpZXMgbmV2ZXIgd2FpdHMgb24gYW5cbiAqIGF0dGVtcHQgcGFzdCBpdHMgY2FwLlxuICpcbiAqIENBTExTIChQMikuIFRoZSBzYW1lIGxvb3AgcnVucyBhIGNhbGwgYSBzdGFnZSBtYWtlcyAoYGF0dGVtcHQvY2FsbC50cyDCtyBydW5DYWxsYCwga2luZCBgJ2NhbGwnYCwgaXRzIGB0YXJnZXRgIG9uXG4gKiBldmVyeSByZWNvcmQpIGFuZCB0aGUgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYC4gQW4gYXR0ZW1wdCdzIGNhcCBpcyB0aGUgREVBRExJTkUgb2YgZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCwgc29cbiAqIHRoZSBjYXAncyByZWFzb24gaXMgYnJhbmRlZCBhIHRpbWUgbGltaXQgKGBhdHRlbXB0L2RlYWRsaW5lLnRzIMK3IG1hcmtUaW1lTGltaXRgKTogYSBjYWxsIGN1dCBieSBpdHMgc3RhZ2VcbiAqIGF0dGVtcHQncyBjYXAgdGltZWQgb3V0LCBpdCB3YXMgbm90IGNhbmNlbGxlZC4gYGF0dGVtcHRFbmRzQXRgIHNheXMgd2hlbiBhbiBhdHRlbXB0IG11c3QgZW5kOyBhbiBgaW50ZXJydXB0KClgXG4gKiB0aHJvd24gaW5zaWRlIGEgY2FsbCBpcyBhIHBhdXNlLCBsaWtlIGEgYFBhdXNlU2lnbmFsYCDigJQgbmV2ZXIgcmV0cmllZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBzZXRMb25nVGltZW91dCB9IGZyb20gJy4uL3RpbWVycy9sb25nVGltZW91dC5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5pbXBvcnQgeyBlcnJvckNhdGVnb3J5LCB0ZXJtaW5hbENhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxlZCwgaXNEZWFkbGluZVJlYXNvbiwgbWFya1RpbWVMaW1pdCwgcmVhZERlYWRsaW5lIH0gZnJvbSAnLi9kZWFkbGluZS5qcyc7XG5pbXBvcnQgeyBkZWNpZGVBdHRlbXB0LCByZXRyeVJ1bGVzIH0gZnJvbSAnLi9kZWNpc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEVmZmVjdFRhcmdldCB9IGZyb20gJy4vZWZmZWN0LmpzJztcbmltcG9ydCB7IGVmZmVjdE9mLCByZWNvcmRlZEtleU9mLCByZWZ1c2VLZXlsZXNzUmV0cnksIHVua25vd25FZmZlY3RFcnJvciB9IGZyb20gJy4vZWZmZWN0LmpzJztcbmltcG9ydCB7IEF0dGVtcHRUaW1lb3V0RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0Q2VpbGluZywgYXR0ZW1wdFRpbWVvdXRNcywgY2FwcGVkV2FpdE1zIH0gZnJvbSAnLi9wb2xpY3kuanMnO1xuaW1wb3J0IHsgZnJlZXplRGVlcCwgcmVjb3JkZWRFcnJvciB9IGZyb20gJy4vcmVjb3JkLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEtpbmQsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBSZXRyeVBvbGljeSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBXaGF0IGEgc2VyaWVzIHJlcG9ydHMsIGFuZCB0aGUgZW5naW5lJ3MgYmV0d2Vlbi1hdHRlbXB0IHN0ZXAuIEV2ZXJ5IG1lbWJlciBpcyBvcHRpb25hbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0ZW1wdFJ1bk9wdGlvbnMge1xuICAvKiogVGhlIHNlcmllcyBldmVyeSByZWNvcmQgbmFtZXMg4oCUIGZvciBhIHN0YWdlIGF0dGVtcHQsIGl0cyBleGVjdXRpb24ncyBgcnVudGltZVN0YWdlSWRgLiAqL1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgLyoqIERlZmF1bHQgYCdzdGFnZSdgLiAqL1xuICByZWFkb25seSBraW5kPzogQXR0ZW1wdEtpbmQ7XG4gIC8qKiBUaGUgb3V0c2lkZSB0YXJnZXQgZXZlcnkgcmVjb3JkIG5hbWVzIOKAlCBhIGNhbGwncyAoYCRjYWxsYCwgYGF0dGVtcHQoKWApOyBhYnNlbnQgZm9yIGEgc3RhZ2UgYXR0ZW1wdC4gKi9cbiAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bidzIHNpZ25hbC4gT25jZSBpdCBoYXMgYWJvcnRlZCAob3RoZXIgdGhhbiBhdCB0aGUgZGVhZGxpbmUpLCBydWxlIDMgc3RvcHMgdGhlIHNlcmllc1xuICAgKiAoYHJlYXNvbjogJ2Fib3J0ZWQnYCk7IGl0IGN1dHMgYSB3YWl0IHNob3J0LiBBbiBhdHRlbXB0IHRoYXQgdGhyZXcgaXRzIHJlYXNvbiBpcyByZWNvcmRlZCBgJ2Fib3J0ZWQnYCDigJQgb3JcbiAgICogYCd0aW1lb3V0J2Agd2hlbiB0aGUgcmVhc29uIGlzIHRoZSBkZWFkbGluZSdzIChgYXR0ZW1wdC9kZWFkbGluZS50c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1pbGxpc2Vjb25kcy4gRXZlcnkgYXR0ZW1wdCBpcyBjYXBwZWQgYnkgdGhlIHRpbWUgbGVmdDsgcnVsZSA2IHN0b3BzIGEgc2VyaWVzIHdob3NlXG4gICAqIG5leHQgd2FpdCB3b3VsZCBvdXRsYXN0IGl0IChgbm8tdGltZS1sZWZ0YCkuIEFic2VudCAob3Igbm90IGZpbml0ZSkgPSBubyBkZWFkbGluZTogdGhlIHRpbWUgbGVmdCBpcyBgSW5maW5pdHlgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZGxpbmU/OiBudW1iZXI7XG4gIC8qKiBUaGUgY2xvY2ssIGVwb2NoIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBgRGF0ZS5ub3dgLiAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG4gIC8qKiBUaGUgc2VydmVkIGZvcm0gb2YgYSBmYWlsZWQgYXR0ZW1wdCdzIGVycm9yLiBEZWZhdWx0IGBleHRyYWN0RXJyb3JJbmZvYCAobm8gcmVkYWN0aW9uIHJ1bGUpLiAqL1xuICByZWFkb25seSBzZXJ2ZT86IChlcnJvcjogdW5rbm93bikgPT4gU3RydWN0dXJlZEVycm9ySW5mbztcbiAgLyoqIEJldHdlZW4gYSBmYWlsZWQgYXR0ZW1wdCBhbmQgdGhlIG5leHQsIGJlZm9yZSBgYmFja29mZk1zYDogdGhlIGVuZ2luZSBkaXNjYXJkcyB0aGUgYXR0ZW1wdCdzIHN0YWdlZCB3cml0ZXMuICovXG4gIHJlYWRvbmx5IGJldHdlZW4/OiAoYXR0ZW1wdDogbnVtYmVyKSA9PiB2b2lkO1xuICAvKiogRXZlcnkgYXR0ZW1wdCwgYXQgaXRzIGVuZCwgd2l0aCBpdHMgc2VydmVkIGVycm9yIChgdW5kZWZpbmVkYCBmb3IgYCdvaydgIGFuZCBgJ3BhdXNlZCdgKS4gKi9cbiAgcmVhZG9ubHkgb25BdHRlbXB0PzogKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICAvKiogQSBmYWlsZWQgYXR0ZW1wdCB0aGF0IFdJTEwgYmUgcmV0cmllZCDigJQgYWZ0ZXIgYGJldHdlZW5gIGFuZCBgb25BdHRlbXB0YCwgYmVmb3JlIHRoZSB3YWl0LiAqL1xuICByZWFkb25seSBvblJldHJ5PzogKGF0dGVtcHQ6IG51bWJlciwgb2Y6IG51bWJlciwgZGVsYXlNczogbnVtYmVyLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8pID0+IHZvaWQ7XG4gIC8qKiBUaGUgc2VyaWVzIGVuZGVkOiBjYWxsZWQgb25jZSwgYmVmb3JlIHRoZSBsYXN0IGBvbkF0dGVtcHRgIChvciBhZnRlciBhIHdhaXQgdGhlIHJ1bidzIHNpZ25hbCBjdXQpLiAqL1xuICByZWFkb25seSBvbkVuZD86IChzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSkgPT4gdm9pZDtcbiAgLyoqIEBpbnRlcm5hbCBOYXRpdmUgb3duZXIgb25seTogdGhlIGV4YWN0IGVzY2FwaW5nIHZhbHVlIGFuZCBjYXRlZ29yeSwgYmVmb3JlIGl0cyBzdGFnZSBzZXJ2ZXMgdGhlIGVycm9yLiAqL1xuICByZWFkb25seSBvbkZhaWx1cmU/OiAoZXJyb3I6IHVua25vd24sIGNhdGVnb3J5OiBBdHRlbXB0Q2F0ZWdvcnkpID0+IHZvaWQ7XG4gIC8qKiBgcmV0cnlPbmAgdGhyZXcg4oCUIHRoZSBhdHRlbXB0IGlzIHRyZWF0ZWQgYXMgZGVjbGluZWQ7IHRoZSBlbmdpbmUgbG9ncyB0aGUgdGhyb3cgaGVyZS4gKi9cbiAgcmVhZG9ubHkgb25SZXRyeU9uVGhyZXc/OiAodGhyb3duOiB1bmtub3duKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGF0dGVtcHQgZW5kZWQgd2l0aG91dCBhbiBhbnN3ZXIg4oCUIGNhbGxlZCBTWU5DSFJPTk9VU0xZIHRoZSBtb21lbnQgaXRzIHNpZ25hbCBhYm9ydHMgKGl0cyBjYXAsIHRoZSBkZWFkbGluZSxcbiAgICogYSBjYW5jZWxsYXRpb24pLCBlbHNlIGFzIHNvb24gYXMgaXQgZmFpbGVkLiBXaGF0ZXZlciB0aGUgYWJhbmRvbmVkIGZ1bmN0aW9uIGRvZXMgYWZ0ZXJ3YXJkcyBpcyBub3QgdGhpc1xuICAgKiBzZXJpZXMnOiB0aGUgZW5naW5lIGZlbmNlcyBpdHMgc2NvcGUgaGVyZS4gT25jZSBwZXIgYXR0ZW1wdDsgbmV2ZXIgZm9yIGAnb2snYCBvciBgJ3BhdXNlZCdgIOKAlCBleGNlcHQgYW4gYXR0ZW1wdFxuICAgKiB0aGF0IFNUQVJURUQgdW5kZXIgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCwgZmVuY2VkIG9uY2UgaXRzIHN5bmNocm9ub3VzIHBhcnQgaGFzIHJ1biAobm9ib2R5IHdhaXRzIGZvciBpdCkuXG4gICAqL1xuICByZWFkb25seSBvbkFiYW5kb24/OiAoYXR0ZW1wdDogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGNhbGxlciByYWNlcyBgcnVuYCdzIHByb21pc2UgYWdhaW5zdCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBpdHNlbGYg4oCUIHRoZSBlbmdpbmUgZG9lcywgYXQgdGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIChgU3RhZ2VSdW5uZXJgKSwgc28gYSBzdGFnZSBrZWVwcyBpdHMgb25lIGF3YWl0IHBlciBhdHRlbXB0LiBPdGhlcndpc2UgdGhlIHJ1bm5lciByYWNlcyBpdDogdGhlIHNlcmllcyBuZXZlclxuICAgKiB3YWl0cyBvbiBhbiBhdHRlbXB0IHBhc3QgaXRzIGNhcC5cbiAgICovXG4gIHJlYWRvbmx5IHJhY2VkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoYXQgYW4gYXR0ZW1wdCdzIGBvYnNlcnZlZChyZXBvcnQpYCBkb2VzIChQMikg4oCUIHRoZSBvd25lciBvZiB0aGUgYXR0ZW1wdCByZWNvcmRzIHRoZSByZXBvcnQ6IGBydW5DYWxsYCBoYW5kc1xuICAgKiBhIGNhbGwncyByZXBvcnRzIHRvIHRoZSBzY29wZSwgYGF0dGVtcHQoKWAga2VlcHMgaXRzIG93bi4gYGVuZGVkYCBzYXlzIHRoZSBhdHRlbXB0IGhhZCBhbHJlYWR5IGVuZGVkIHdoZW4gdGhlXG4gICAqIHJlcG9ydCBjYW1lICh0aGUgb3duZXIgZHJvcHMgaXQpLiBBYnNlbnQg4oCUIGEgc3RhZ2UgYXR0ZW1wdCdzIGNvbnRleHQsIHdob3NlIGBvYnNlcnZlZGAgdGhlIHNjb3BlJ3NcbiAgICogYCRhdHRlbXB0KClgIHJlcGxhY2VzIOKAlCBgb2JzZXJ2ZWRgIGlzIHJlZnVzZWQgd2l0aCBhIGBUeXBlRXJyb3JgLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzZXJ2ZT86IChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCwgYXQ6IHsgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyOyByZWFkb25seSBlbmRlZDogYm9vbGVhbiB9KSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIG91dHNpZGUgc3lzdGVtIHRoZSB0YXJnZXQgdG91Y2hlcyAoUDMsIGRlc2lnbiDCpzMuMykuIEV2ZXJ5IHJlY29yZCB0aGVuIHNheXMgd2hhdCBpdHMgYXR0ZW1wdCBkaWQgdG8gaXRcbiAgICogKGBlZmZlY3RgKSBhbmQgbmFtZXMgdGhlIHN5c3RlbSBhbmQgdGhlIFJFQ09SREVEIGtleTsgZXZlcnkgYXR0ZW1wdCdzIGNvbnRleHQgY2FycmllcyB0aGUgUkVBTCBrZXkuIEEgc2VyaWVzXG4gICAqIHRoYXQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciBhZnRlciBhbnkgYXR0ZW1wdCBvZiB1bmtub3duIGVmZmVjdCBmYWlscyB3aXRoIGBVbmtub3duRWZmZWN0RXJyb3JgIChpdHMgYGNhdXNlYCB0aGUgYXR0ZW1wdCdzIG93biBlcnJvcikg4oCUXG4gICAqIGV4Y2VwdCBhIHBhdXNlLCB3aGljaCBzdGF5cyBhIHBhdXNlLiBBIHRvdWNoaW5nIHNlcmllcyB0aGF0IG1heSByZXRyeSB3aXRob3V0IGEga2V5IGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nXG4gICAqIHJ1bnM6IHRoZSBsYXcncyBsYXN0IGRvb3IuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3Q/OiBFZmZlY3RUYXJnZXQ7XG59XG5cbi8qKiBXaGVuIGVhY2ggbGl2ZSBhdHRlbXB0IG11c3QgZW5kLCBlcG9jaCBtcyDigJQgYHN0YXJ0ZWRBdCArIGNhcGAsIGZvciBhbiBhdHRlbXB0IHRoYXQgaGFzIGEgY2FwIChgYXR0ZW1wdEVuZHNBdGApLiAqL1xuY29uc3QgQVRURU1QVF9FTkRTID0gbmV3IFdlYWtNYXA8QXR0ZW1wdENvbnRleHQsIG51bWJlcj4oKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBhdHRlbXB0IGJlaGluZCBgY29udGV4dGAgbXVzdCBlbmQsIGVwb2NoIG1pbGxpc2Vjb25kcyDigJQgaXRzIHN0YXJ0IHBsdXMgaXRzIGNhcCAoYG1pbih0aW1lb3V0TXMsIHRpbWVcbiAqIGxlZnQpYCwgc28gbmV2ZXIgcGFzdCB0aGUgcnVuJ3MgZGVhZGxpbmUpIOKAlCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gdW5jYXBwZWQgYXR0ZW1wdC4gQSBjYWxsIG1hZGUgaW5zaWRlIHRoZVxuICogYXR0ZW1wdCBydW5zIHVuZGVyIGl0IGFzIGl0cyBkZWFkbGluZSAoYGF0dGVtcHQvY2FsbC50c2ApLiBPbmx5IHRoZSBydW5uZXIncyBvd24gY29udGV4dHMgYXJlIGtub3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0ZW1wdEVuZHNBdChjb250ZXh0OiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBBVFRFTVBUX0VORFMuZ2V0KGNvbnRleHQpO1xufVxuXG4vKiogQSBmYWlsZWQgYXR0ZW1wdCdzIHRocm93biB2YWx1ZSwgYm94ZWQ6IGB1bmRlZmluZWRgIGlzIGEgdmFsdWUgYSBzdGFnZSBtYXkgdGhyb3cuICovXG5pbnRlcmZhY2UgRmFpbHVyZSB7XG4gIHJlYWRvbmx5IGVycm9yOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFJ1biBgcnVuYCB1bnRpbCBpdCBzdWNjZWVkcyBvciB0aGUgcG9saWN5IHN0b3BzIGl0OyByZXNvbHZlIHdpdGggaXRzIHZhbHVlIG9yIHJlamVjdCB3aXRoIHRoZSBMQVNUIGF0dGVtcHQnc1xuICogb3duIGVycm9yLiBgcnVuKG4pYCBpcyBjYWxsZWQgd2l0aCB0aGUgYXR0ZW1wdCBudW1iZXIsIDEtYmFzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BdHRlbXB0czxUPihcbiAgcnVuOiAoYXR0ZW1wdDogbnVtYmVyLCBjb250ZXh0OiBBdHRlbXB0Q29udGV4dCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gIHBvbGljeTogUmV0cnlQb2xpY3ksXG4gIG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG9mID0gYXR0ZW1wdENlaWxpbmcocG9saWN5LmF0dGVtcHRzKTtcbiAgY29uc3QgcnVsZXMgPSByZXRyeVJ1bGVzKHsgYXR0ZW1wdHM6IG9mIH0pO1xuICBjb25zdCBub3cgPSBvcHRpb25zLm5vdyA/PyBEYXRlLm5vdztcbiAgY29uc3QgZGVhZGxpbmUgPSByZWFkRGVhZGxpbmUob3B0aW9ucy5kZWFkbGluZSk7XG4gIGNvbnN0IG93bkNhcCA9IGF0dGVtcHRUaW1lb3V0TXMocG9saWN5LnRpbWVvdXRNcyk7XG4gIGNvbnN0IHRhbGx5ID0gbmV3IFNlcmllc1RhbGx5KCk7XG4gIGlmIChvcHRpb25zLmVmZmVjdCkgcmVmdXNlS2V5bGVzc1JldHJ5KG9wdGlvbnMuZWZmZWN0LCBvZik7XG4gIC8qKiBBbiBlYXJsaWVyIGF0dGVtcHQgb2YgdGhpcyB0b3VjaGluZyBzZXJpZXMgbGVmdCB0aGUgZWZmZWN0IHVua25vd24g4oCUIGEgbGF0ZXIgYW5zd2VyIG9mIGBub25lYCBjYW5ub3QgY2xlYXIgaXQuICovXG4gIGxldCB1bmtub3duU29GYXIgPSBmYWxzZTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBub3coKTtcbiAgICBjb25zdCBsaXZlID0gbmV3IExpdmVBdHRlbXB0KG9wdGlvbnMsIGF0dGVtcHQsIG9mLCBzdGFydGVkQXQsIGRlYWRsaW5lLCBvd25DYXAsIG5vdyk7XG4gICAgbGV0IHZhbHVlOiBUIHwgdW5kZWZpbmVkO1xuICAgIGxldCBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gcnVuKGF0dGVtcHQsIGxpdmUuY29udGV4dCk7XG4gICAgICAvLyBTdGFydGVkIHVuZGVyIGEgc2lnbmFsIHRoYXQgaGFkIEFMUkVBRFkgYWJvcnRlZCAoYSBkZWNpZGVyIGVudGVyZWQgYWZ0ZXIgYSBjYW5jZWwpOiBpdHMgc3luY2hyb25vdXMgcGFydFxuICAgICAgLy8gcmFuIGFzIGl0IGFsd2F5cyBkaWQ7IGZyb20gaGVyZSBvbiBub2JvZHkgd2FpdHMgZm9yIGl0LCBzbyBub3RoaW5nIGl0IGRvZXMgYWZ0ZXIgaXRzIGZpcnN0IGF3YWl0IGxhbmRzLlxuICAgICAgaWYgKGxpdmUuY29udGV4dC5zaWduYWwuYWJvcnRlZCkgbGl2ZS5hYmFuZG9uU3RhcnRlZCgpO1xuICAgICAgdmFsdWUgPSBhd2FpdCAob3B0aW9ucy5yYWNlZCA/IHBlbmRpbmcgOiBsaXZlLnJhY2UocGVuZGluZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBmYWlsdXJlID0geyBlcnJvciB9O1xuICAgIH1cbiAgICBjb25zdCBkdXJhdGlvbk1zID0gTWF0aC5tYXgoMCwgbm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lT2YoZmFpbHVyZSwgb3B0aW9ucy5zaWduYWwsIGxpdmUudGltZW91dFJlYXNvbik7XG4gICAgbGl2ZS5lbmQob3V0Y29tZSk7XG4gICAgY29uc3QgaW5wdXRzID0gbmV3IEF0dGVtcHRJbnB1dFJlYWRlcihwb2xpY3ksIG9wdGlvbnMsIGF0dGVtcHQsIG9mLCBvdXRjb21lLCBmYWlsdXJlLCBkZWFkbGluZSwgbm93KTtcblxuICAgIGxldCBkZWNpc2lvbiA9IGRlY2lkZUF0dGVtcHQocnVsZXMsIGlucHV0cy5yZWFkKTtcbiAgICAvLyA5LjE1IGFza2VkIHJldHJ5T24sIFRIRU4gY2hlY2tlZCB0aGUgc2lnbmFsLiBEZWNpZGluZyBhZ2FpbiByZWFkcyB0aGUgc2lnbmFsIGFmcmVzaDogcnVsZSAzIG5vdyBtYXRjaGVzLFxuICAgIC8vIGFoZWFkIG9mIGV2ZXJ5IHVzZXIgZnVuY3Rpb24sIHNvIG5vbmUgaXMgYXNrZWQgdHdpY2Ug4oCUIGFuZCBub3RoaW5nIGlzIGRpc2NhcmRlZCwgbm90aGluZyB3YWl0ZWQgZm9yLlxuICAgIGlmIChkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknICYmIGlzQ2FuY2VsbGVkKG9wdGlvbnMuc2lnbmFsKSkgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJ1bGVzLCBpbnB1dHMucmVhZCk7XG5cbiAgICAvLyBUaGUgZGlzY2FyZCBjb21lcyBCRUZPUkUgdGhlIHdhaXQncyBsZW5ndGggaXMgYXNrZWQgZm9yLCBhcyBpdCBkaWQgaW4gOS4xNSDigJQgd2l0aG91dCBhIGRlYWRsaW5lLiBVbmRlciBvbmUsXG4gICAgLy8gcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoIHRvIGRlY2lkZSwgc28gYGJhY2tvZmZNc2Agd2FzIGFza2VkIGR1cmluZyB0aGUgZGVjaXNpb24sIGJlZm9yZSB0aGUgZGlzY2FyZC5cbiAgICBpZiAoZGVjaXNpb24ubmV4dCA9PT0gJ3JldHJ5Jykgb3B0aW9ucy5iZXR3ZWVuPy4oYXR0ZW1wdCk7XG4gICAgY29uc3QgZGVsYXlNcyA9IGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScgPyBpbnB1dHMuZGVsYXlNcygpIDogaW5wdXRzLmRlbGF5SWZBc2tlZCgpO1xuICAgIGNvbnN0IHRpbWVMZWZ0TXMgPSBkZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaW5wdXRzLnRpbWVMZWZ0KCk7XG5cbiAgICBjb25zdCBjYXRlZ29yeSA9IGlucHV0cy5jYXRlZ29yeSgpO1xuICAgIC8vIFByaXZhdGUgdGVybWluYWwgc2VtYW50aWNzIGFyZSBmaXhlZCBiZWZvcmUgc2VydmluZyBvciBvYnNlcnZlciBmYW4tb3V0LlxuICAgIC8vIEFuIGFscmVhZHktdW5yZXNvbHZlZCBjYWxsIHdyYXBwZXIgbXVzdCBub3QgYmVjb21lIGl0cyBwaHlzaWNhbCBjYXVzZVxuICAgIC8vIGlmIGEgY29uc3VtZXIgbGF0ZXIgY2hhbmdlcyB0aGUgcmF3IGVycm9yJ3MgcHJvcGVydGllcyBvciBwcm90b3R5cGUuXG4gICAgY29uc3QgdGVybWluYWwgPSBvcHRpb25zLm9uRmFpbHVyZSAmJiBmYWlsdXJlID8gdGVybWluYWxDYXRlZ29yeShmYWlsdXJlLmVycm9yLCBjYXRlZ29yeSkgOiBjYXRlZ29yeSA/PyAndW5rbm93bic7XG4gICAgY29uc3Qgc2VydmVkID0gaW5wdXRzLmZhaWxlZCA/IChvcHRpb25zLnNlcnZlID8/IGV4dHJhY3RFcnJvckluZm8pKGlucHV0cy5mYWlsZWQuZXJyb3IpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVmZmVjdCA9IG9wdGlvbnMuZWZmZWN0ID8gZWZmZWN0T2YoaW5wdXRzLm91dGNvbWUsIGZhaWx1cmU/LmVycm9yKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWNvcmRlZEtleSA9IG9wdGlvbnMuZWZmZWN0ID8gcmVjb3JkZWRLZXlPZihvcHRpb25zLmVmZmVjdCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkID0gZnJlZXplRGVlcDxBdHRlbXB0UmVjb3JkPih7XG4gICAgICBzZXJpZXM6IG9wdGlvbnMuc2VyaWVzLFxuICAgICAga2luZDogb3B0aW9ucy5raW5kID8/ICdzdGFnZScsXG4gICAgICAuLi4ob3B0aW9ucy50YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB7IHRhcmdldDogb3B0aW9ucy50YXJnZXQgfSksXG4gICAgICBhdHRlbXB0LFxuICAgICAgb2YsXG4gICAgICBzdGFydGVkQXQsXG4gICAgICBkdXJhdGlvbk1zLFxuICAgICAgb3V0Y29tZTogaW5wdXRzLm91dGNvbWUsXG4gICAgICAuLi4oY2F0ZWdvcnkgIT09IHVuZGVmaW5lZCAmJiB7IGNhdGVnb3J5IH0pLFxuICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmV2aWRlbmNlLFxuICAgICAgbmV4dDogZGVjaXNpb24ubmV4dCxcbiAgICAgIHJlYXNvbjogZGVjaXNpb24ucmVhc29uLFxuICAgICAgLi4uKGlucHV0cy5yZXRyeU9uVGhyZXcgJiYgeyByZXRyeU9uVGhyZXc6IHRydWUgYXMgY29uc3QgfSksXG4gICAgICAuLi4oZGVsYXlNcyAhPT0gdW5kZWZpbmVkICYmIHsgZGVsYXlNcyB9KSxcbiAgICAgIC4uLihsaXZlLmNhcE1zICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0TXM6IGxpdmUuY2FwTXMgfSksXG4gICAgICAuLi4odGltZUxlZnRNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZUxlZnRNcyB9KSxcbiAgICAgIC4uLihzZXJ2ZWQgIT09IHVuZGVmaW5lZCAmJiB7IGVycm9yOiByZWNvcmRlZEVycm9yKHNlcnZlZCkgfSksXG4gICAgICAuLi4ob3B0aW9ucy5lZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IHN5c3RlbTogb3B0aW9ucy5lZmZlY3Quc3lzdGVtIH0pLFxuICAgICAgLi4uKHJlY29yZGVkS2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogcmVjb3JkZWRLZXkgfSksXG4gICAgICAuLi4oZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBlZmZlY3QgfSksXG4gICAgfSk7XG4gICAgdGFsbHkuYWRkKHJlY29yZCk7XG4gICAgaWYgKHJlY29yZC5lZmZlY3QgPT09ICd1bmtub3duJykgdW5rbm93blNvRmFyID0gdHJ1ZTtcbiAgICBpZiAocmVjb3JkLm5leHQgIT09ICdyZXRyeScpIG9wdGlvbnMub25FbmQ/Lih0YWxseS5zdW1tYXJ5KGxhc3RPZihyZWNvcmQsIHVua25vd25Tb0ZhcikpKTtcbiAgICBvcHRpb25zLm9uQXR0ZW1wdD8uKHJlY29yZCwgc2VydmVkKTtcblxuICAgIGlmIChyZWNvcmQubmV4dCA9PT0gJ2RvbmUnKSByZXR1cm4gdmFsdWUgYXMgVDtcbiAgICBpZiAocmVjb3JkLm5leHQgPT09ICdzdG9wJykgdGhyb3cgc3RvcHBlZEZhaWx1cmUob3B0aW9ucywgcmVjb3JkLCBmYWlsdXJlLCB1bmtub3duU29GYXIsIHRlcm1pbmFsKTtcblxuICAgIG9wdGlvbnMub25SZXRyeT8uKGF0dGVtcHQsIG9mLCBkZWxheU1zID8/IDAsIHNlcnZlZCBhcyBTdHJ1Y3R1cmVkRXJyb3JJbmZvKTtcbiAgICBpZiAoZGVsYXlNcyAhPT0gdW5kZWZpbmVkICYmIGRlbGF5TXMgPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheU1zLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBvcHRpb25zLm9uRmFpbHVyZT8uKGVycm9yLCAndW5rbm93bicpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTm8gYXR0ZW1wdCBmb2xsb3dzIGEgY3V0IHdhaXQsIHNvIG5vbmUgaXMgcmVjb3JkZWQ6IHRoZSBzdW1tYXJ5IHNheXMgaG93IHRoZSBzZXJpZXMgZW5kZWQuIE5vIGF0dGVtcHRcbiAgICAvLyBTVEFSVFMgYXQgb3IgcGFzdCB0aGUgZGVhZGxpbmUgZWl0aGVyIOKAlCBydWxlIDYgZGVjaWRlZCB3aXRoIHRoZSBjbG9jaywgYW5kIHRoZSBjbG9jayBtYXkgaGF2ZSBtb3ZlZCBvbi5cbiAgICBjb25zdCBjdXQgPSBpc0NhbmNlbGxlZChvcHRpb25zLnNpZ25hbClcbiAgICAgID8gJ2Fib3J0ZWQnXG4gICAgICA6IG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkIHx8IChkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIG5vdygpID49IGRlYWRsaW5lKVxuICAgICAgPyAnbm8tdGltZS1sZWZ0J1xuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGN1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLm9uRW5kPy4odGFsbHkuc3VtbWFyeSh7IC4uLmxhc3RPZihyZWNvcmQsIHVua25vd25Tb0ZhciksIG5leHQ6ICdzdG9wJywgcmVhc29uOiBjdXQgfSkpO1xuICAgICAgdGhyb3cgc3RvcHBlZEZhaWx1cmUob3B0aW9ucywgcmVjb3JkLCBmYWlsdXJlLCB1bmtub3duU29GYXIsIHRlcm1pbmFsKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFRoZSBmaW5hbCBwaHlzaWNhbCBhdHRlbXB0IG93bnMgaXRzIGNhdGVnb3J5OyBhIHdyYXBwZXIgb3IgY3V0IHdhaXQgaGFzIG5vIHN1Y2ggY2F0ZWdvcnkuICovXG5mdW5jdGlvbiBzdG9wcGVkRmFpbHVyZShcbiAgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gIHJlY29yZDogQXR0ZW1wdFJlY29yZCxcbiAgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZCxcbiAgdW5rbm93blNvRmFyOiBib29sZWFuLFxuICB0ZXJtaW5hbDogQXR0ZW1wdENhdGVnb3J5LFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGVycm9yID0gc3RvcEVycm9yKG9wdGlvbnMuZWZmZWN0LCByZWNvcmQsIGZhaWx1cmUsIHVua25vd25Tb0Zhcik7XG4gIGlmIChyZWNvcmQub3V0Y29tZSAhPT0gJ3BhdXNlZCcpIHtcbiAgICBjb25zdCBjYXRlZ29yeSA9IHJlY29yZC5uZXh0ID09PSAnc3RvcCcgJiYgT2JqZWN0LmlzKGVycm9yLCBmYWlsdXJlPy5lcnJvcikgPyB0ZXJtaW5hbCA6ICd1bmtub3duJztcbiAgICBvcHRpb25zLm9uRmFpbHVyZT8uKGVycm9yLCBjYXRlZ29yeSk7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG4vKipcbiAqIFdoYXQgYSBzdG9wcGVkIHNlcmllcyB0aHJvd3M6IHRoZSBsYXN0IGF0dGVtcHQncyBvd24gZXJyb3Ig4oCUIG9yLCBvbiBhIHRvdWNoaW5nIHRhcmdldCB3aGVyZSBBTlkgYXR0ZW1wdCBsZWZ0IHRoZVxuICogZWZmZWN0IHVua25vd24sIGBVbmtub3duRWZmZWN0RXJyb3JgIHdpdGggdGhlIGxhc3QgYXR0ZW1wdCdzIGVycm9yIGFzIGl0cyBjYXVzZS4gQW4gZWFybGllciB0aW1lb3V0IG1heSBoYXZlXG4gKiBhcHBsaWVkIHRoZSBlZmZlY3Q7IGEgbGF0ZXIgYXR0ZW1wdCB0aGF0IHNheXMgXCJub3RoaW5nIHdhcyBzZW50XCIgc3BlYWtzIGZvciBpdHNlbGYgb25seSwgc28gaXQgY2Fubm90IHR1cm4gdGhlXG4gKiBzZXJpZXMgaW50byBhIHBsYWluIGZhaWx1cmUuIEEgcGF1c2UgaXMgbmV2ZXIgY29udmVydGVkOiBpdCBpcyBjb250cm9sIGZsb3cuXG4gKi9cbmZ1bmN0aW9uIHN0b3BFcnJvcihcbiAgZWZmZWN0OiBFZmZlY3RUYXJnZXQgfCB1bmRlZmluZWQsXG4gIHJlY29yZDogQXR0ZW1wdFJlY29yZCxcbiAgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZCxcbiAgdW5rbm93blNvRmFyOiBib29sZWFuLFxuKTogdW5rbm93biB7XG4gIGlmIChlZmZlY3QgPT09IHVuZGVmaW5lZCB8fCAhdW5rbm93blNvRmFyIHx8IHJlY29yZC5vdXRjb21lID09PSAncGF1c2VkJykgcmV0dXJuIGZhaWx1cmU/LmVycm9yO1xuICByZXR1cm4gdW5rbm93bkVmZmVjdEVycm9yKGVmZmVjdCwgcmVjb3JkLCBmYWlsdXJlPy5lcnJvcik7XG59XG5cbi8qKlxuICogT25lIGF0dGVtcHQgaW4gZmxpZ2h0OiBpdHMgY2FwLCBpdHMgc2lnbmFsICh0aGUgcnVuJ3MsIGNvbXBvc2VkIHdpdGggaXRzIG93biB0aW1lciksIGFuZCB0aGUgZmVuY2UuIEl0cyBvd25cbiAqIHRpbWVyIGlzIGFybWVkIHdoZW4gdGhlIHBvbGljeSdzIGNhcCBpcyBTSE9SVEVSIHRoYW4gdGhlIHRpbWUgbGVmdDsgYXQgdGhlIGRlYWRsaW5lIHRoZSBydW4ncyBvd24gc2lnbmFsIGFib3J0cyxcbiAqIHdpdGggdGhlIGRlYWRsaW5lJ3MgcmVhc29uIChzbyBhIHJ1biByZWplY3RzIHdpdGggdGhlIHJlYXNvbiBpdCBhbHdheXMgZGlkKS4gRXZlcnl0aGluZyBpdCBhcm1zIGlzIHJlbGVhc2VkXG4gKiB3aGVuIHRoZSBhdHRlbXB0IGVuZHMuXG4gKi9cbmNsYXNzIExpdmVBdHRlbXB0IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQXR0ZW1wdENvbnRleHQ7XG4gIC8qKiBUaGUgY2FwIHRoaXMgYXR0ZW1wdCBydW5zIHVuZGVyIOKAlCBgbWluKHRpbWVvdXRNcywgdGltZSBsZWZ0KWAsIG5ldmVyIG5lZ2F0aXZlOyBhYnNlbnQgd2hlbiB1bmNhcHBlZC4gKi9cbiAgcmVhZG9ubHkgY2FwTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSByZWFzb24gdGhlIGF0dGVtcHQncyBPV04gdGltZXIgYWJvcnRlZCB3aXRoIOKAlCBzZXQgb25seSBpZiBpdCBmaXJlZC4gKi9cbiAgdGltZW91dFJlYXNvbjogQXR0ZW1wdFRpbWVvdXRFcnJvciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjYW5jZWxUaW1lcjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvc2VkOiB7IHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7IGRpc3Bvc2UoKTogdm9pZCB9O1xuICBwcml2YXRlIGFiYW5kb25lZCA9IGZhbHNlO1xuICAvKiogVGhlIGF0dGVtcHQgaXMgb3ZlciwgaG93ZXZlciBpdCBlbmRlZCDigJQgYW4gYG9ic2VydmVkYCByZXBvcnQgYWZ0ZXIgdGhpcyBpcyB0aGUgb3duZXIncyB0byByZWZ1c2UuICovXG4gIHByaXZhdGUgZW5kZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkFib3J0ID0gKCkgPT4gdGhpcy5hYmFuZG9uKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBBdHRlbXB0UnVuT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcixcbiAgICBvZjogbnVtYmVyLFxuICAgIHN0YXJ0ZWRBdDogbnVtYmVyLFxuICAgIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgb3duQ2FwOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgbm93OiAoKSA9PiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IGxlZnQgPSBkZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gSW5maW5pdHkgOiBNYXRoLm1heCgwLCBkZWFkbGluZSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3QgY2FwID0gTWF0aC5taW4ob3duQ2FwID8/IEluZmluaXR5LCBsZWZ0KTtcbiAgICB0aGlzLmNhcE1zID0gTnVtYmVyLmlzRmluaXRlKGNhcCkgPyBjYXAgOiB1bmRlZmluZWQ7XG4gICAgLy8gSXRzIG93biB0aW1lciB3aGVuIGl0cyBvd24gY2FwIGlzIHRoZSBzaG9ydGVyLCBvciB3aGVuIG5vIHJ1biBzaWduYWwgd2lsbCBhYm9ydCBhdCB0aGUgZGVhZGxpbmUgKGEgY2FsbGVyXG4gICAgLy8gd2l0aCBhIGRlYWRsaW5lIGFuZCBubyBzaWduYWwpLiBPdGhlcndpc2UgdGhlIHJ1bidzIHNpZ25hbCBlbmRzIGl0IGF0IHRoZSBkZWFkbGluZSwgd2l0aCB0aGUgZGVhZGxpbmUncyByZWFzb24uXG4gICAgY29uc3Qgb3duVGltZXIgPSB0aGlzLmNhcE1zICE9PSB1bmRlZmluZWQgJiYgKChvd25DYXAgIT09IHVuZGVmaW5lZCAmJiBvd25DYXAgPCBsZWZ0KSB8fCAhb3B0aW9ucy5zaWduYWwpO1xuICAgIGNvbnN0IG93biA9IG93blRpbWVyID8gbmV3IEFib3J0Q29udHJvbGxlcigpIDogdW5kZWZpbmVkO1xuICAgIGlmIChvd24pIHtcbiAgICAgIGNvbnN0IGNhcE1zID0gdGhpcy5jYXBNcyBhcyBudW1iZXI7XG4gICAgICB0aGlzLmNhbmNlbFRpbWVyID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBBIHRpbWUgbGltaXQsIGJyYW5kZWQgbGlrZSB0aGUgcnVuJ3MgZGVhZGxpbmU6IGEgY2FsbCBtYWRlIGluc2lkZSB0aGlzIGF0dGVtcHQgdGhhdCBpdCBjdXRzIHRpbWVkIG91dC5cbiAgICAgICAgdGhpcy50aW1lb3V0UmVhc29uID0gbWFya1RpbWVMaW1pdChuZXcgQXR0ZW1wdFRpbWVvdXRFcnJvcihhdHRlbXB0LCBjYXBNcykpO1xuICAgICAgICBvd24uYWJvcnQodGhpcy50aW1lb3V0UmVhc29uKTtcbiAgICAgIH0sIGNhcE1zKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb3NlZCA9IGFueVNpZ25hbChbb3B0aW9ucy5zaWduYWwsIG93bj8uc2lnbmFsXSk7XG4gICAgLy8gUmVnaXN0ZXJlZCBCRUZPUkUgdGhlIGZ1bmN0aW9uIHJ1bnMsIHNvIHRoZSBmZW5jZSBjbG9zZXMgYmVmb3JlIGFueSBsaXN0ZW5lciB0aGUgZnVuY3Rpb24gYWRkcy4gQSBzaWduYWxcbiAgICAvLyBBTFJFQURZIGFib3J0ZWQgKGEgZGVjaWRlciBlbnRlcmVkIGFmdGVyIGEgY2FuY2VsIOKAlCBubyBhYm9ydCBjaGVjayBwcmVjZWRlcyBpdCkgZG9lcyBub3QgZmVuY2UgdGhlIGF0dGVtcHRcbiAgICAvLyBiZWZvcmUgaXQgcnVuczogaXQgcnVucyBhcyBpdCBkaWQgYmVmb3JlIHRoZSBmZW5jZSBleGlzdGVkLCBhbmQgaXMgZmVuY2VkIHdoZW4gaXQgZW5kcyB3aXRob3V0IGFuIGFuc3dlci5cbiAgICB0aGlzLmNvbXBvc2VkLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY29tcG9zZWQuc2lnbmFsO1xuICAgIGNvbnN0IGNhcE1zID0gdGhpcy5jYXBNcztcbiAgICB0aGlzLmNvbnRleHQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgIHNlcmllczogb3B0aW9ucy5zZXJpZXMsXG4gICAgICBhdHRlbXB0LFxuICAgICAgb2YsXG4gICAgICBzaWduYWwsXG4gICAgICAuLi4oZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lIH0pLFxuICAgICAgLi4uKGNhcE1zICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0TXM6IGNhcE1zIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzeXN0ZW06IG9wdGlvbnMuZWZmZWN0LnN5c3RlbSB9KSxcbiAgICAgIC4uLihvcHRpb25zLmVmZmVjdD8uaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiBvcHRpb25zLmVmZmVjdC5pZGVtcG90ZW5jeUtleSB9KSxcbiAgICAgIHRpbWVMZWZ0TXM6ICgpID0+IChkZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gSW5maW5pdHkgOiBkZWFkbGluZSAtIG5vdygpKSxcbiAgICAgIG9ic2VydmVkOiAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zLm9ic2VydmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvYnNlcnZlZCgpOiByZXBvcnQgYW4gb3V0c2lkZSBhdHRlbXB0IHRocm91Z2ggYHNjb3BlLiRhdHRlbXB0KCkub2JzZXJ2ZWQoLi4uKWAnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLm9ic2VydmUocmVwb3J0LCB7IGF0dGVtcHQsIGVuZGVkOiB0aGlzLmVuZGVkIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoY2FwTXMgIT09IHVuZGVmaW5lZCkgQVRURU1QVF9FTkRTLnNldCh0aGlzLmNvbnRleHQsIHN0YXJ0ZWRBdCArIGNhcE1zKTtcbiAgfVxuXG4gIC8qKiBgdmFsdWVgLCBvciB0aGUgYXR0ZW1wdCBzaWduYWwncyByZWFzb24gdGhlIG1vbWVudCBpdCBhYm9ydHMgZmlyc3Qg4oCUIHRoZSBlbmdpbmUgc3RvcHMgd2FpdGluZyBhdCB0aGUgY2FwLiAqL1xuICByYWNlPFQ+KHZhbHVlOiBQcm9taXNlPFQ+IHwgVCk6IFByb21pc2U8VD4gfCBUIHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jb21wb3NlZC5zaWduYWw7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiByZWplY3Qoc2lnbmFsLnJlYXNvbik7XG4gICAgICB2YWx1ZS50aGVuKFxuICAgICAgICAodikgPT4ge1xuICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICAgIHJlc29sdmUodik7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIEFscmVhZHkgYWJvcnRlZCAodGhlIGZ1bmN0aW9uIGFib3J0ZWQgaXQgYXMgaXQgcmFuKTogYSB2YWx1ZSB0aGF0IGFscmVhZHkgc2V0dGxlZCBzdGlsbCB3aW5zIOKAlCBpdHNcbiAgICAgIC8vIHJlYWN0aW9uIHdhcyBxdWV1ZWQgYWJvdmUsIGZpcnN0IOKAlCBhbmQgYSBwZW5kaW5nIG9uZSBpcyBjdXQgb24gdGhlIG5leHQgbWljcm90YXNrLlxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSBxdWV1ZU1pY3JvdGFzayhvbkFib3J0KTtcbiAgICAgIGVsc2Ugc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGlzIG92ZXI6IHJlbGVhc2UgdGhlIHRpbWVyIGFuZCB0aGUgbGlzdGVuZXJzOyBmZW5jZSBpdCBpZiBpdCBlbmRlZCB3aXRob3V0IGFuIGFuc3dlci4gKi9cbiAgZW5kKG91dGNvbWU6IEF0dGVtcHRPdXRjb21lKTogdm9pZCB7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgdGhpcy5jYW5jZWxUaW1lcj8uKCk7XG4gICAgdGhpcy5jb21wb3NlZC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIHRoaXMuY29tcG9zZWQuZGlzcG9zZSgpO1xuICAgIGlmIChvdXRjb21lICE9PSAnb2snICYmIG91dGNvbWUgIT09ICdwYXVzZWQnKSB0aGlzLmFiYW5kb24oKTtcbiAgfVxuXG4gIC8qKiBGZW5jZSBhbiBhdHRlbXB0IHRoYXQgc3RhcnRlZCB1bmRlciBhbiBhbHJlYWR5LWFib3J0ZWQgc2lnbmFsLCBvbmNlIGl0cyBzeW5jaHJvbm91cyBwYXJ0IGhhcyBydW4uICovXG4gIGFiYW5kb25TdGFydGVkKCk6IHZvaWQge1xuICAgIHRoaXMuYWJhbmRvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhYmFuZG9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFiYW5kb25lZCkgcmV0dXJuO1xuICAgIHRoaXMuYWJhbmRvbmVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wdGlvbnMub25BYmFuZG9uPy4odGhpcy5hdHRlbXB0KTtcbiAgfVxufVxuXG4vKiogVGhlIHNpZ25hbCBhYm9ydGVkIGF0IGEgdGltZSBsaW1pdCDigJQgdGhlIHJ1bidzIGRlYWRsaW5lLCBvciBhIGNhbGwncyBhdHRlbXB0IGNhcCDigJQgbm90IGJ5IGEgY2FuY2VsbGF0aW9uLiAqL1xuZnVuY3Rpb24gdGltZWRPdXQoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2lnbmFsPy5hYm9ydGVkID09PSB0cnVlICYmIGlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbik7XG59XG5cbi8qKlxuICogSG93IHRoZSBhdHRlbXB0IGl0c2VsZiBlbmRlZC4gQSB0aHJvd24gdmFsdWUgaXMgdGhlIGF0dGVtcHQncyBvd24gZmFpbHVyZSB1bmxlc3MgaXQgSVMgd2hhdCBhIHNpZ25hbCBhYm9ydGVkXG4gKiB3aXRoIChTdGFnZVJ1bm5lcidzIHJhY2UgcmVqZWN0cyB3aXRoIGl0OyBhIHN0YWdlIG1heSByZXRocm93IGl0KTogaXRzIG93biBjYXAncyBgQXR0ZW1wdFRpbWVvdXRFcnJvcmAgb3IgdGhlXG4gKiBydW4ncyBkZWFkbGluZSDihpIgYCd0aW1lb3V0J2A7IHRoZSBydW4ncyBjYW5jZWxsYXRpb24g4oaSIGAnYWJvcnRlZCdgLlxuICovXG5mdW5jdGlvbiBvdXRjb21lT2YoXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gIHRpbWVvdXRSZWFzb246IEF0dGVtcHRUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQsXG4pOiBBdHRlbXB0T3V0Y29tZSB7XG4gIGlmICghZmFpbHVyZSkgcmV0dXJuICdvayc7XG4gIC8vIEFuIGBpbnRlcnJ1cHQoKWAgdGhyb3duIGluc2lkZSBhIGNhbGwgaXMgY29udmVydGVkIHRvIGEgcGF1c2UgYXQgdGhlIHN0YWdlIGJvdW5kYXJ5LCBwYXN0IHRoaXMgcnVubmVyLlxuICBpZiAoaXNQYXVzZVNpZ25hbChmYWlsdXJlLmVycm9yKSB8fCBpc0ludGVycnVwdFNpZ25hbChmYWlsdXJlLmVycm9yKSkgcmV0dXJuICdwYXVzZWQnO1xuICAvLyBJdHMgb3duIGNhcCByYW4gb3V0IOKAlCB0aGUgYXR0ZW1wdCdzIHRpbWVyIGlzIHRoZSBvbmUgdGhhdCBmaXJlZCwgYW5kIHRoZSBhdHRlbXB0IHRocmV3IHdoYXQgaXQgYWJvcnRlZCB3aXRoLlxuICBpZiAodGltZW91dFJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGZhaWx1cmUuZXJyb3IgPT09IHRpbWVvdXRSZWFzb24pIHJldHVybiAndGltZW91dCc7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQgIT09IHRydWUgfHwgZmFpbHVyZS5lcnJvciAhPT0gc2lnbmFsLnJlYXNvbikgcmV0dXJuICdmYWlsZWQnO1xuICAvLyBUaGUgcnVuJ3Mgc2lnbmFsIGVuZGVkIGl0OiBhdCB0aGUgZGVhZGxpbmUgdGhlIGF0dGVtcHQgcmFuIG91dCBvZiB0aW1lIChsYXcgNCk7IG90aGVyd2lzZSBpdCB3YXMgY2FuY2VsbGVkLlxuICByZXR1cm4gaXNEZWFkbGluZVJlYXNvbihzaWduYWwucmVhc29uKSA/ICd0aW1lb3V0JyA6ICdhYm9ydGVkJztcbn1cblxuLyoqXG4gKiBPbmUgYXR0ZW1wdCdzIGRlY2lzaW9uIGlucHV0cywgZWFjaCByZWFkIG9ubHkgd2hlbiBhIHJ1bGUgcmVhY2hlcyBpdCAoYGRlY2lkZUF0dGVtcHRgJ3MgcmVhZGVyKTogdGhlIHVzZXInc1xuICogYHJldHJ5T25gIGFuZCBgYmFja29mZk1zYCBydW4gYXQgbW9zdCBvbmNlIGVhY2gsIGFuZCBvbmx5IHdoZW4gdGhlIDkuMTUgbG9vcCB3b3VsZCBoYXZlIHJ1biB0aGVtLlxuICovXG5jbGFzcyBBdHRlbXB0SW5wdXRSZWFkZXIge1xuICAvKiogVGhlIGZhaWx1cmUgYSBjYXRlZ29yeSBhbmQgYSBzZXJ2ZWQgZXJyb3IgYXJlIHJlYWQgZnJvbSDigJQgbm9uZSBmb3IgYCdvaydgIGFuZCBgJ3BhdXNlZCdgLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IEZhaWx1cmUgfCB1bmRlZmluZWQ7XG4gIC8qKiBgdHJ1ZWAgb25jZSBgcmV0cnlPbmAgdGhyZXcgKGl0cyB2ZXJkaWN0IGlzIHRoZW4gYGZhbHNlYCkuICovXG4gIHJldHJ5T25UaHJldyA9IGZhbHNlO1xuICBwcml2YXRlIHJldHJ5T25WZXJkaWN0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHdhaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmYWlsdXJlQ2F0ZWdvcnk6IEF0dGVtcHRDYXRlZ29yeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjYXRlZ29yeVJlYWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGxlZnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvbGljeTogUmV0cnlQb2xpY3ksXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBBdHRlbXB0UnVuT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9mOiBudW1iZXIsXG4gICAgcmVhZG9ubHkgb3V0Y29tZTogQXR0ZW1wdE91dGNvbWUsXG4gICAgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBub3c6ICgpID0+IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy5mYWlsZWQgPSBmYWlsdXJlICYmIG91dGNvbWUgIT09ICdwYXVzZWQnID8gZmFpbHVyZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBPbmUgaW5wdXQgYnkgaXRzIGBBdHRlbXB0SW5wdXRzYCBrZXkuICovXG4gIHJlYWRvbmx5IHJlYWQgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnb3V0Y29tZSc6XG4gICAgICAgIHJldHVybiB0aGlzLm91dGNvbWU7XG4gICAgICBjYXNlICdjYXRlZ29yeSc6XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5KCk7XG4gICAgICBjYXNlICdhYm9ydGVkJzpcbiAgICAgICAgLy8gTGl2ZTogYSBkZWNpc2lvbiB0YWtlbiBhZ2FpbiBhZnRlciBgcmV0cnlPbmAgc2VlcyBhbiBhYm9ydCByYWlzZWQgaW5zaWRlIGl0LiBUaGUgZGVhZGxpbmUgaXMgbm90IGFcbiAgICAgICAgLy8gY2FuY2VsbGF0aW9uIOKAlCBydWxlIDYgb3ducyBpdC5cbiAgICAgICAgcmV0dXJuIGlzQ2FuY2VsbGVkKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgICAgY2FzZSAnYXR0ZW1wdCc6XG4gICAgICAgIHJldHVybiB0aGlzLmF0dGVtcHQ7XG4gICAgICBjYXNlICdvZic6XG4gICAgICAgIHJldHVybiB0aGlzLm9mO1xuICAgICAgY2FzZSAndGltZUxlZnRNcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVMZWZ0KCk7XG4gICAgICBjYXNlICd0aW1lTGVmdEFmdGVyV2FpdE1zJzpcbiAgICAgICAgLy8gV2l0aG91dCBhIGRlYWRsaW5lIHRoZSB0aW1lIGxlZnQgaXMgdW5ib3VuZGVkLCBiZWZvcmUgYW55IHdhaXQgYW5kIGFmdGVyIGl0IOKAlCBzbyBkZWNpZGluZyBuZWVkcyBub1xuICAgICAgICAvLyB3YWl0LCBhbmQgYGJhY2tvZmZNc2AgaXMgYXNrZWQgYWZ0ZXIgdGhlIGRpc2NhcmQsIGFzIGluIDkuMTUuIFVuZGVyIG9uZSwgdGhlIHdhaXQncyBsZW5ndGggZGVjaWRlcy5cbiAgICAgICAgcmV0dXJuIHRoaXMudW5ib3VuZGVkKCkgPyBJbmZpbml0eSA6IHRoaXMudGltZUxlZnQoKSAtIHRoaXMuZGVsYXlNcygpO1xuICAgICAgY2FzZSAnZGVsYXlNcyc6XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGF5TXMoKTtcbiAgICAgIGNhc2UgJ3JldHJ5T24nOlxuICAgICAgICByZXR1cm4gdGhpcy5yZXRyeU9uKCk7XG4gICAgICBjYXNlICdrZXlQcmVzZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5lZmZlY3Q/LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICAvKiogVGhlIGZhaWx1cmUncyBjYXRlZ29yeSwgcmVhZCBvbmNlIOKAlCBhdCB0aGUgZmlyc3QgcnVsZSB0aGF0IGFza3MsIG9yIGFmdGVyIHRoZSBkZWNpc2lvbi4gKi9cbiAgY2F0ZWdvcnkoKTogQXR0ZW1wdENhdGVnb3J5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuY2F0ZWdvcnlSZWFkKSB7XG4gICAgICB0aGlzLmNhdGVnb3J5UmVhZCA9IHRydWU7XG4gICAgICB0aGlzLmZhaWx1cmVDYXRlZ29yeSA9IHRoaXMuZmFpbGVkID8gZXJyb3JDYXRlZ29yeSh0aGlzLmZhaWxlZC5lcnJvciwgdGhpcy5vdXRjb21lKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNhdGVnb3J5O1xuICB9XG5cbiAgLyoqIFRoZSBwb2xpY3kncyB3YWl0IGFmdGVyIHRoaXMgYXR0ZW1wdCAoYHJlc29sdmVCYWNrb2ZmTXNgKSwgYXNrZWQgb25jZSDigJQgY2FwcGVkIGF0IGl0cyBgbWF4QmFja29mZk1zYC4gKi9cbiAgZGVsYXlNcygpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy53YWl0ID8/PSBjYXBwZWRXYWl0TXMoXG4gICAgICByZXNvbHZlQmFja29mZk1zKHRoaXMucG9saWN5LmJhY2tvZmZNcywgdGhpcy5hdHRlbXB0LCB0aGlzLmZhaWxlZD8uZXJyb3IpLFxuICAgICAgdGhpcy5wb2xpY3kubWF4QmFja29mZk1zLFxuICAgICkpO1xuICB9XG5cbiAgLyoqIFRoZSB3YWl0LCBpZiB0aGUgZGVjaXNpb24gYWxyZWFkeSBhc2tlZCBmb3IgaXQgKHJ1bGUgNiB1bmRlciBhIGRlYWRsaW5lKTsgbmV2ZXIgYXNrcyBgYmFja29mZk1zYCBpdHNlbGYuICovXG4gIGRlbGF5SWZBc2tlZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLndhaXQ7XG4gIH1cblxuICAvKiogTWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgZGVhZGxpbmUgYXQgdGhlIGRlY2lzaW9uLCByZWFkIG9uY2UgKGBJbmZpbml0eWAgd2l0aG91dCBvbmUpLiAqL1xuICB0aW1lTGVmdCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnVuYm91bmRlZCgpKSByZXR1cm4gSW5maW5pdHk7XG4gICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjbG9jayA9IHRoaXMuZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogdGhpcy5kZWFkbGluZSAtIHRoaXMubm93KCk7XG4gICAgICAvLyBBIHRpbWUgbGltaXQgYWxyZWFkeSByZWFjaGVkIOKAlCB0aGUgc2lnbmFsIGFib3J0ZWQgYXQgdGhlIGRlYWRsaW5lIChvciwgZm9yIGEgY2FsbCwgYXQgaXRzIGF0dGVtcHQncyBjYXApIOKAlFxuICAgICAgLy8gbGVhdmVzIG5vIHRpbWUsIHdoYXRldmVyIHRoZSBjbG9jayBzYXlzOiBhIGhvc3QgdGltZXIgbWF5IGZpcmUgYSBtaWxsaXNlY29uZCBiZWZvcmUgdGhlIGNsb2NrIGdldHMgdGhlcmUuXG4gICAgICB0aGlzLmxlZnQgPSB0aW1lZE91dCh0aGlzLm9wdGlvbnMuc2lnbmFsKSA/IE1hdGgubWluKGNsb2NrLCAwKSA6IGNsb2NrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZWZ0O1xuICB9XG5cbiAgLyoqIE5vIGRlYWRsaW5lIGFuZCBubyB0aW1lIGxpbWl0IHJlYWNoZWQ6IHRoZSB0aW1lIGxlZnQgaXMgYEluZmluaXR5YCwgYW5kIG5vIHdhaXQgbmVlZCBiZSBhc2tlZCBmb3IuICovXG4gIHByaXZhdGUgdW5ib3VuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlYWRsaW5lID09PSB1bmRlZmluZWQgJiYgIXRpbWVkT3V0KHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICB9XG5cbiAgLyoqIFRoZSBgcmV0cnlPbmAgZ2F0ZSwgYXNrZWQgb25jZS4gQSB0aHJvd2luZyBwcmVkaWNhdGUgaXMgXCJkbyBub3QgcmV0cnlcIiDigJQgYSBicm9rZW4gb25lIG5ldmVyIGxvb3BzLiAqL1xuICBwcml2YXRlIHJldHJ5T24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucmV0cnlPblZlcmRpY3QgPT09IHVuZGVmaW5lZCkgdGhpcy5yZXRyeU9uVmVyZGljdCA9IHRoaXMuYXNrUmV0cnlPbigpO1xuICAgIHJldHVybiB0aGlzLnJldHJ5T25WZXJkaWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc2tSZXRyeU9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5wb2xpY3kucmV0cnlPbikgcmV0dXJuIHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnBvbGljeS5yZXRyeU9uKHRoaXMuZmFpbGVkPy5lcnJvcikgPT09IHRydWU7XG4gICAgfSBjYXRjaCAodGhyb3duKSB7XG4gICAgICB0aGlzLnJldHJ5T25UaHJldyA9IHRydWU7XG4gICAgICB0aGlzLm9wdGlvbnMub25SZXRyeU9uVGhyZXc/Lih0aHJvd24pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgYSBwb2xpY3kncyBgYmFja29mZk1zYCBmb3IgdGhlIGF0dGVtcHQgdGhhdCBqdXN0IGZhaWxlZCAoMS1iYXNlZCkgYW5kIGl0cyBlcnJvci4gQW55dGhpbmcgdGhhdCBpcyBub3QgYSBmaW5pdGUsXG4gKiBwb3NpdGl2ZSBudW1iZXIg4oCUIGEgbWlzc2luZyBkaWFsLCBhIG5lZ2F0aXZlIHZhbHVlLCBhIGBOYU5gIGZyb20gYSBjb25zdW1lcidzIGFyaXRobWV0aWMsIG9yIGEgdGhyb3dpbmdcbiAqIGZ1bmN0aW9uIOKAlCBiZWNvbWVzIGAwYCwgaS5lLiByZXRyeSBpbW1lZGlhdGVseS4gQSBiYWNrb2ZmIGRpYWwgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNyYXNoIGEgcnVuIG9yIHBhcmsgaXRcbiAqIGZvcmV2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQmFja29mZk1zKGJhY2tvZmZNczogUmV0cnlQb2xpY3lbJ2JhY2tvZmZNcyddLCBhdHRlbXB0OiBudW1iZXIsIGVycm9yPzogdW5rbm93bik6IG51bWJlciB7XG4gIGlmIChiYWNrb2ZmTXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgaWYgKHR5cGVvZiBiYWNrb2ZmTXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBiYWNrb2ZmTXMoYXR0ZW1wdCwgZXJyb3IpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gYmFja29mZk1zO1xuICB9XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIEF3YWl0IGBtc2AsIGN1dCBzaG9ydCBieSBhbiBhYm9ydC4gUmVzb2x2ZXMgZWl0aGVyIHdheSDigJQgdGhlIGNhbGxlciByZS1jaGVja3MgYHNpZ25hbC5hYm9ydGVkYCBhbmQgcmV0aHJvd3NcbiAqIHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yLCBzbyBhIGNhbmNlbGxlZCBydW4gbmV2ZXIgc2l0cyBvdXQgYSBsb25nIGJhY2tvZmYgYW5kIG5ldmVyIGxvc2VzIHRoZSBmYWlsdXJlIHRoYXRcbiAqIGNhdXNlZCBpdC4gVGhlIHRpbWVyIGFuZCB0aGUgbGlzdGVuZXIgYXJlIGFsd2F5cyBjbGVhbmVkIHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkb25lID0gKCkgPT4ge1xuICAgICAgY2FuY2VsKCk7XG4gICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBjb25zdCBjYW5jZWwgPSBzZXRMb25nVGltZW91dChkb25lLCBtcyk7XG4gICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogSG93IGEgcmVjb3JkIGVuZGVkIGl0cyBzZXJpZXMsIGFzIHRoZSBzdW1tYXJ5J3MgYGxhc3RgIHNheXMgaXQuIE9uIGEgdG91Y2hpbmcgdGFyZ2V0IHRoZSBlZmZlY3QgaXMgdGhlIFNFUklFUydcbiAqIChgdW5rbm93blNvRmFyYCk6IHVua25vd24gb25jZSBhbnkgYXR0ZW1wdCBsZWZ0IGl0IHVua25vd24sIHVubGVzcyB0aGUgc2VyaWVzIGVuZGVkIHdpdGggYW4gYW5zd2VyLlxuICovXG5mdW5jdGlvbiBsYXN0T2YocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCB1bmtub3duU29GYXIgPSBmYWxzZSk6IEF0dGVtcHRTdW1tYXJ5WydsYXN0J10ge1xuICBjb25zdCBlZmZlY3QgPSByZWNvcmQuZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgdW5rbm93blNvRmFyICYmIHJlY29yZC5vdXRjb21lICE9PSAnb2snID8gJ3Vua25vd24nIDogcmVjb3JkLmVmZmVjdDtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiByZWNvcmQubmV4dCBhcyBBdHRlbXB0U3VtbWFyeVsnbGFzdCddWyduZXh0J10sXG4gICAgcmVhc29uOiByZWNvcmQucmVhc29uLFxuICAgIC4uLihyZWNvcmQuY2F0ZWdvcnkgIT09IHVuZGVmaW5lZCAmJiB7IGNhdGVnb3J5OiByZWNvcmQuY2F0ZWdvcnkgfSksXG4gICAgLi4uKHJlY29yZC5yZXRyeU9uVGhyZXcgJiYgeyByZXRyeU9uVGhyZXc6IHRydWUgYXMgY29uc3QgfSksXG4gICAgLi4uKGVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgZWZmZWN0IH0pLFxuICB9O1xufVxuXG4vKiogUGVyLW91dGNvbWUgY291bnRzIG9mIGEgc2VyaWVzLCBmb3IgaXRzIHN1bW1hcnkuICovXG5jbGFzcyBTZXJpZXNUYWxseSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY291bnRzID0geyBjb3VudDogMCwgb2s6IDAsIGZhaWxlZDogMCwgdGltZW91dDogMCwgYWJvcnRlZDogMCwgcGF1c2VkOiAwIH07XG5cbiAgYWRkKHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IHZvaWQge1xuICAgIHRoaXMuY291bnRzLmNvdW50ICs9IDE7XG4gICAgdGhpcy5jb3VudHNbcmVjb3JkLm91dGNvbWVdICs9IDE7XG4gIH1cblxuICBzdW1tYXJ5KGxhc3Q6IEF0dGVtcHRTdW1tYXJ5WydsYXN0J10pOiBBdHRlbXB0U3VtbWFyeSB7XG4gICAgcmV0dXJuIGZyZWV6ZURlZXA8QXR0ZW1wdFN1bW1hcnk+KHsgLi4udGhpcy5jb3VudHMsIGxhc3QgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -22,8 +22,10 @@
22
22
  import { type ChildRunner } from '../runChild.js';
23
23
  import type { DetachDriver } from '../types.js';
24
24
  export interface SetTimeoutDriverOptions {
25
- /** Milliseconds to wait before flushing the batch. Default 0
26
- * (next macrotask). */
25
+ /** Milliseconds to wait before flushing the batch — a finite number.
26
+ * Default 0 (next macrotask); a negative delay waits nothing, as the
27
+ * host timer does. A delay past 2^31 − 1 ms is waited in full (the one
28
+ * long-timer law, `timers/longTimeout.ts`), never cut to 1 ms. */
27
29
  readonly delayMs?: number;
28
30
  /** Custom `runChild`. Defaults to spawning a `FlowChartExecutor`. */
29
31
  readonly runChild?: ChildRunner;
@@ -19,18 +19,28 @@
19
19
  * - Browser tab freezing / throttling can extend the delay
20
20
  * significantly. Don't rely on precise timing.
21
21
  */
22
+ import { setLongTimeout } from '../../timers/longTimeout.js';
22
23
  import { defaultRunChild } from '../runChild.js';
23
24
  import { createBatchSchedule } from './batch.js';
24
25
  export function createSetTimeoutDriver(opts = {}) {
25
26
  const delayMs = opts.delayMs ?? 0;
27
+ // `Infinity` would never flush the batch (a silent hang) and `NaN` names no delay: refused when the driver is made,
28
+ // by the field and the shape it needs — never the value (a TypeError for a non-number, a RangeError otherwise).
29
+ const rule = 'createSetTimeoutDriver: delayMs must be a finite number of milliseconds';
30
+ if (typeof delayMs !== 'number')
31
+ throw new TypeError(rule);
32
+ if (!Number.isFinite(delayMs))
33
+ throw new RangeError(rule);
26
34
  const runChild = opts.runChild ?? defaultRunChild;
27
35
  return {
28
36
  name: delayMs === 0 ? 'set-timeout' : `set-timeout-${delayMs}ms`,
29
37
  capabilities: { browserSafe: true, nodeSafe: true, edgeSafe: true },
30
- schedule: createBatchSchedule((flush) => setTimeout(flush, delayMs), runChild),
38
+ schedule: createBatchSchedule((flush) => {
39
+ setLongTimeout(flush, delayMs);
40
+ }, runChild),
31
41
  };
32
42
  }
33
43
  /** Default singleton — zero-delay (next macrotask). For configurable
34
44
  * delays, use `createSetTimeoutDriver({ delayMs })`. */
35
45
  export const setTimeoutDriver = createSetTimeoutDriver();
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0VGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQW9CLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVVqRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBZ0MsRUFBRTtJQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGVBQWUsQ0FBQztJQUNsRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxPQUFPLElBQUk7UUFDaEUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUMvRSxDQUFDO0FBQ0osQ0FBQztBQUVEO3lEQUN5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUIsc0JBQXNCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyDigJQgRGVmZXIgZGV0YWNoZWQgd29yayB2aWEgYHNldFRpbWVvdXQoLi4uLCBkZWxheU1zKWAuXG4gKlxuICogUGF0dGVybjogIFByb2R1Y2VyLWNvbnN1bWVyIGJhdGNoIGZsdXNoOyBkZWZlcnJhbCBtZWNoYW5pc20gaXNcbiAqICAgICAgICAgICBgc2V0VGltZW91dGAgd2l0aCBhIGNvbmZpZ3VyYWJsZSBkZWxheSAoZGVmYXVsdCBgMGApLlxuICogUm9sZTogICAgIENyb3NzLXJ1bnRpbWUgXCJuZXh0IG1hY3JvdGFza1wiIGRyaXZlci4gV29ya3MgaW4gYnJvd3NlcnMsXG4gKiAgICAgICAgICAgTm9kZS5qcywgRGVubywgQ2xvdWRmbGFyZSBXb3JrZXJzLCBCdW4sIGV0Yy5cbiAqXG4gKiBXaGVuIHRvIHBpY2sgdGhpczpcbiAqICAgLSBDb25zdW1lciB3YW50cyBhIFNQRUNJRklDIGRlbGF5IChlLmcuIFwic2hpcCB0ZWxlbWV0cnkgaW4gNVxuICogICAgIHNlY29uZHMsIGJhdGNoZWRcIikg4oCUIHBhc3MgYGNyZWF0ZVNldFRpbWVvdXREcml2ZXIoeyBkZWxheU1zOiA1MDAwIH0pYFxuICogICAtIENyb3NzLXJ1bnRpbWUgZGV0YWNoIHdoZXJlIGBzZXRJbW1lZGlhdGVgIGlzbid0IGF2YWlsYWJsZVxuICogICAtIENvYWxlc2NpbmcgaGlnaC1mcmVxdWVuY3kgZXZlbnRzIGludG8gYSBsb3ctZnJlcXVlbmN5IGZsdXNoXG4gKlxuICogQ2F2ZWF0czpcbiAqICAgLSBOb3QgZm9yIGxvdy1sYXRlbmN5IGhvdCBwYXRocyDigJQgbWluaW11bSBkZWxheSBpcyB+NG1zIGluXG4gKiAgICAgYnJvd3NlcnMgcGVyIHRoZSBIVE1MNSBzcGVjLCB+MW1zIGluIE5vZGUuIFVzZVxuICogICAgIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgZm9yIHN1Yi1tcyBzY2hlZHVsaW5nLlxuICogICAtIEJyb3dzZXIgdGFiIGZyZWV6aW5nIC8gdGhyb3R0bGluZyBjYW4gZXh0ZW5kIHRoZSBkZWxheVxuICogICAgIHNpZ25pZmljYW50bHkuIERvbid0IHJlbHkgb24gcHJlY2lzZSB0aW1pbmcuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDaGlsZFJ1bm5lciwgZGVmYXVsdFJ1bkNoaWxkIH0gZnJvbSAnLi4vcnVuQ2hpbGQuanMnO1xuaW1wb3J0IHR5cGUgeyBEZXRhY2hEcml2ZXIgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVCYXRjaFNjaGVkdWxlIH0gZnJvbSAnLi9iYXRjaC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0VGltZW91dERyaXZlck9wdGlvbnMge1xuICAvKiogTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGZsdXNoaW5nIHRoZSBiYXRjaC4gRGVmYXVsdCAwXG4gICAqICAobmV4dCBtYWNyb3Rhc2spLiAqL1xuICByZWFkb25seSBkZWxheU1zPzogbnVtYmVyO1xuICAvKiogQ3VzdG9tIGBydW5DaGlsZGAuIERlZmF1bHRzIHRvIHNwYXduaW5nIGEgYEZsb3dDaGFydEV4ZWN1dG9yYC4gKi9cbiAgcmVhZG9ubHkgcnVuQ2hpbGQ/OiBDaGlsZFJ1bm5lcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldFRpbWVvdXREcml2ZXIob3B0czogU2V0VGltZW91dERyaXZlck9wdGlvbnMgPSB7fSk6IERldGFjaERyaXZlciB7XG4gIGNvbnN0IGRlbGF5TXMgPSBvcHRzLmRlbGF5TXMgPz8gMDtcbiAgY29uc3QgcnVuQ2hpbGQgPSBvcHRzLnJ1bkNoaWxkID8/IGRlZmF1bHRSdW5DaGlsZDtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBkZWxheU1zID09PSAwID8gJ3NldC10aW1lb3V0JyA6IGBzZXQtdGltZW91dC0ke2RlbGF5TXN9bXNgLFxuICAgIGNhcGFiaWxpdGllczogeyBicm93c2VyU2FmZTogdHJ1ZSwgbm9kZVNhZmU6IHRydWUsIGVkZ2VTYWZlOiB0cnVlIH0sXG4gICAgc2NoZWR1bGU6IGNyZWF0ZUJhdGNoU2NoZWR1bGUoKGZsdXNoKSA9PiBzZXRUaW1lb3V0KGZsdXNoLCBkZWxheU1zKSwgcnVuQ2hpbGQpLFxuICB9O1xufVxuXG4vKiogRGVmYXVsdCBzaW5nbGV0b24g4oCUIHplcm8tZGVsYXkgKG5leHQgbWFjcm90YXNrKS4gRm9yIGNvbmZpZ3VyYWJsZVxuICogIGRlbGF5cywgdXNlIGBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKHsgZGVsYXlNcyB9KWAuICovXG5leHBvcnQgY29uc3Qgc2V0VGltZW91dERyaXZlcjogRGV0YWNoRHJpdmVyID0gY3JlYXRlU2V0VGltZW91dERyaXZlcigpO1xuIl19
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0VGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFvQixlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFZakQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE9BQWdDLEVBQUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDbEMsb0hBQW9IO0lBQ3BILGdIQUFnSDtJQUNoSCxNQUFNLElBQUksR0FBRyx5RUFBeUUsQ0FBQztJQUN2RixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxlQUFlLENBQUM7SUFDbEQsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGVBQWUsT0FBTyxJQUFJO1FBQ2hFLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ25FLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQ7eURBQ3lEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQixzQkFBc0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZXRhY2gvZHJpdmVycy9zZXRUaW1lb3V0LnRzIOKAlCBEZWZlciBkZXRhY2hlZCB3b3JrIHZpYSBgc2V0VGltZW91dCguLi4sIGRlbGF5TXMpYC5cbiAqXG4gKiBQYXR0ZXJuOiAgUHJvZHVjZXItY29uc3VtZXIgYmF0Y2ggZmx1c2g7IGRlZmVycmFsIG1lY2hhbmlzbSBpc1xuICogICAgICAgICAgIGBzZXRUaW1lb3V0YCB3aXRoIGEgY29uZmlndXJhYmxlIGRlbGF5IChkZWZhdWx0IGAwYCkuXG4gKiBSb2xlOiAgICAgQ3Jvc3MtcnVudGltZSBcIm5leHQgbWFjcm90YXNrXCIgZHJpdmVyLiBXb3JrcyBpbiBicm93c2VycyxcbiAqICAgICAgICAgICBOb2RlLmpzLCBEZW5vLCBDbG91ZGZsYXJlIFdvcmtlcnMsIEJ1biwgZXRjLlxuICpcbiAqIFdoZW4gdG8gcGljayB0aGlzOlxuICogICAtIENvbnN1bWVyIHdhbnRzIGEgU1BFQ0lGSUMgZGVsYXkgKGUuZy4gXCJzaGlwIHRlbGVtZXRyeSBpbiA1XG4gKiAgICAgc2Vjb25kcywgYmF0Y2hlZFwiKSDigJQgcGFzcyBgY3JlYXRlU2V0VGltZW91dERyaXZlcih7IGRlbGF5TXM6IDUwMDAgfSlgXG4gKiAgIC0gQ3Jvc3MtcnVudGltZSBkZXRhY2ggd2hlcmUgYHNldEltbWVkaWF0ZWAgaXNuJ3QgYXZhaWxhYmxlXG4gKiAgIC0gQ29hbGVzY2luZyBoaWdoLWZyZXF1ZW5jeSBldmVudHMgaW50byBhIGxvdy1mcmVxdWVuY3kgZmx1c2hcbiAqXG4gKiBDYXZlYXRzOlxuICogICAtIE5vdCBmb3IgbG93LWxhdGVuY3kgaG90IHBhdGhzIOKAlCBtaW5pbXVtIGRlbGF5IGlzIH40bXMgaW5cbiAqICAgICBicm93c2VycyBwZXIgdGhlIEhUTUw1IHNwZWMsIH4xbXMgaW4gTm9kZS4gVXNlXG4gKiAgICAgYG1pY3JvdGFza0JhdGNoRHJpdmVyYCBmb3Igc3ViLW1zIHNjaGVkdWxpbmcuXG4gKiAgIC0gQnJvd3NlciB0YWIgZnJlZXppbmcgLyB0aHJvdHRsaW5nIGNhbiBleHRlbmQgdGhlIGRlbGF5XG4gKiAgICAgc2lnbmlmaWNhbnRseS4gRG9uJ3QgcmVseSBvbiBwcmVjaXNlIHRpbWluZy5cbiAqL1xuXG5pbXBvcnQgeyBzZXRMb25nVGltZW91dCB9IGZyb20gJy4uLy4uL3RpbWVycy9sb25nVGltZW91dC5qcyc7XG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJhdGNoU2NoZWR1bGUgfSBmcm9tICcuL2JhdGNoLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXRUaW1lb3V0RHJpdmVyT3B0aW9ucyB7XG4gIC8qKiBNaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZmx1c2hpbmcgdGhlIGJhdGNoIOKAlCBhIGZpbml0ZSBudW1iZXIuXG4gICAqICBEZWZhdWx0IDAgKG5leHQgbWFjcm90YXNrKTsgYSBuZWdhdGl2ZSBkZWxheSB3YWl0cyBub3RoaW5nLCBhcyB0aGVcbiAgICogIGhvc3QgdGltZXIgZG9lcy4gQSBkZWxheSBwYXN0IDJeMzEg4oiSIDEgbXMgaXMgd2FpdGVkIGluIGZ1bGwgKHRoZSBvbmVcbiAgICogIGxvbmctdGltZXIgbGF3LCBgdGltZXJzL2xvbmdUaW1lb3V0LnRzYCksIG5ldmVyIGN1dCB0byAxIG1zLiAqL1xuICByZWFkb25seSBkZWxheU1zPzogbnVtYmVyO1xuICAvKiogQ3VzdG9tIGBydW5DaGlsZGAuIERlZmF1bHRzIHRvIHNwYXduaW5nIGEgYEZsb3dDaGFydEV4ZWN1dG9yYC4gKi9cbiAgcmVhZG9ubHkgcnVuQ2hpbGQ/OiBDaGlsZFJ1bm5lcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldFRpbWVvdXREcml2ZXIob3B0czogU2V0VGltZW91dERyaXZlck9wdGlvbnMgPSB7fSk6IERldGFjaERyaXZlciB7XG4gIGNvbnN0IGRlbGF5TXMgPSBvcHRzLmRlbGF5TXMgPz8gMDtcbiAgLy8gYEluZmluaXR5YCB3b3VsZCBuZXZlciBmbHVzaCB0aGUgYmF0Y2ggKGEgc2lsZW50IGhhbmcpIGFuZCBgTmFOYCBuYW1lcyBubyBkZWxheTogcmVmdXNlZCB3aGVuIHRoZSBkcml2ZXIgaXMgbWFkZSxcbiAgLy8gYnkgdGhlIGZpZWxkIGFuZCB0aGUgc2hhcGUgaXQgbmVlZHMg4oCUIG5ldmVyIHRoZSB2YWx1ZSAoYSBUeXBlRXJyb3IgZm9yIGEgbm9uLW51bWJlciwgYSBSYW5nZUVycm9yIG90aGVyd2lzZSkuXG4gIGNvbnN0IHJ1bGUgPSAnY3JlYXRlU2V0VGltZW91dERyaXZlcjogZGVsYXlNcyBtdXN0IGJlIGEgZmluaXRlIG51bWJlciBvZiBtaWxsaXNlY29uZHMnO1xuICBpZiAodHlwZW9mIGRlbGF5TXMgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgVHlwZUVycm9yKHJ1bGUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShkZWxheU1zKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IocnVsZSk7XG4gIGNvbnN0IHJ1bkNoaWxkID0gb3B0cy5ydW5DaGlsZCA/PyBkZWZhdWx0UnVuQ2hpbGQ7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZGVsYXlNcyA9PT0gMCA/ICdzZXQtdGltZW91dCcgOiBgc2V0LXRpbWVvdXQtJHtkZWxheU1zfW1zYCxcbiAgICBjYXBhYmlsaXRpZXM6IHsgYnJvd3NlclNhZmU6IHRydWUsIG5vZGVTYWZlOiB0cnVlLCBlZGdlU2FmZTogdHJ1ZSB9LFxuICAgIHNjaGVkdWxlOiBjcmVhdGVCYXRjaFNjaGVkdWxlKChmbHVzaCkgPT4ge1xuICAgICAgc2V0TG9uZ1RpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgIH0sIHJ1bkNoaWxkKSxcbiAgfTtcbn1cblxuLyoqIERlZmF1bHQgc2luZ2xldG9uIOKAlCB6ZXJvLWRlbGF5IChuZXh0IG1hY3JvdGFzaykuIEZvciBjb25maWd1cmFibGVcbiAqICBkZWxheXMsIHVzZSBgY3JlYXRlU2V0VGltZW91dERyaXZlcih7IGRlbGF5TXMgfSlgLiAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVvdXREcml2ZXI6IERldGFjaERyaXZlciA9IGNyZWF0ZVNldFRpbWVvdXREcml2ZXIoKTtcbiJdfQ==
@@ -37,7 +37,12 @@ export interface FlushResult {
37
37
  readonly pending: number;
38
38
  }
39
39
  export interface FlushOptions {
40
- /** Max wall-clock to spend draining, in milliseconds. Default 30s. */
40
+ /**
41
+ * Max wall-clock to spend draining, in milliseconds. Default 30s.
42
+ * `Infinity` waits for every handle and arms no timer; a limit past
43
+ * 2^31 − 1 ms is waited in full, never cut to 1 ms; `0` or less gives up
44
+ * at once.
45
+ */
41
46
  readonly timeoutMs?: number;
42
47
  }
43
48
  /**