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
@@ -12,7 +12,8 @@
12
12
  * rejected with), recognisable only by identity.
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.armDeadline = exports.isAbortSignal = exports.setLongTimeout = exports.readDeadline = exports.isCancelled = exports.isDeadlineReason = exports.markTimeLimit = exports.deadlineReason = void 0;
15
+ exports.armDeadline = exports.isAbortSignal = exports.readDeadline = exports.isCancelled = exports.isDeadlineReason = exports.markTimeLimit = exports.deadlineReason = void 0;
16
+ const longTimeout_js_1 = require("../timers/longTimeout.js");
16
17
  const anySignal_js_1 = require("./anySignal.js");
17
18
  const DEADLINE_REASONS = new WeakSet();
18
19
  /** The reason the run's signal aborts with when its deadline passes — an `Error`, branded as the deadline's. */
@@ -47,33 +48,6 @@ function readDeadline(value) {
47
48
  return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
48
49
  }
49
50
  exports.readDeadline = readDeadline;
50
- /** The longest delay a host timer honours (2^31 − 1 ms, ~24.8 days); a longer one fires at once. */
51
- const MAX_TIMER_MS = 2_147_483_647;
52
- /**
53
- * `setTimeout` for any delay: a delay past the host's limit is waited in chunks, so a 30-day deadline does not fire
54
- * in a millisecond. Returns the one call that cancels it.
55
- */
56
- function setLongTimeout(fn, ms) {
57
- let timer;
58
- let cancelled = false;
59
- const arm = (left) => {
60
- timer = setTimeout(() => {
61
- if (cancelled)
62
- return;
63
- if (left > MAX_TIMER_MS)
64
- arm(left - MAX_TIMER_MS);
65
- else
66
- fn();
67
- }, Math.min(left, MAX_TIMER_MS));
68
- };
69
- arm(Math.max(0, ms));
70
- return () => {
71
- cancelled = true;
72
- if (timer !== undefined)
73
- clearTimeout(timer);
74
- };
75
- }
76
- exports.setLongTimeout = setLongTimeout;
77
51
  /** Whether `value` is an AbortSignal (structurally — a signal from another realm counts). */
78
52
  function isAbortSignal(value) {
79
53
  return (typeof value === 'object' &&
@@ -99,7 +73,7 @@ function armDeadline(signal, deadline, message, now = Date.now) {
99
73
  if (left <= 0)
100
74
  timer.abort(reason);
101
75
  else
102
- cancel = setLongTimeout(() => timer.abort(reason), left);
76
+ cancel = (0, longTimeout_js_1.setLongTimeout)(() => timer.abort(reason), left);
103
77
  return {
104
78
  signal: composed.signal,
105
79
  dispose: () => {
@@ -109,4 +83,4 @@ function armDeadline(signal, deadline, message, now = Date.now) {
109
83
  };
110
84
  }
111
85
  exports.armDeadline = armDeadline;
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVhZGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUFFSCxpREFBMkM7QUFFM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0FBRS9DLGdIQUFnSDtBQUNoSCxTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUpELHdDQUlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBbUIsTUFBUztJQUN2RCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUhELHNDQUdDO0FBRUQscUdBQXFHO0FBQ3JHLFNBQWdCLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUZELDRDQUVDO0FBRUQsd0ZBQXdGO0FBQ3hGLFNBQWdCLFdBQVcsQ0FBQyxNQUErQjtJQUN6RCxPQUFPLE1BQU0sRUFBRSxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCxrQ0FFQztBQUVELGlGQUFpRjtBQUNqRixTQUFnQixZQUFZLENBQUMsS0FBYztJQUN6QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDO0FBRkQsb0NBRUM7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBRW5DOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxFQUFjLEVBQUUsRUFBVTtJQUN2RCxJQUFJLEtBQWdELENBQUM7SUFDckQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDM0IsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxTQUFTO2dCQUFFLE9BQU87WUFDdEIsSUFBSSxJQUFJLEdBQUcsWUFBWTtnQkFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDOztnQkFDN0MsRUFBRSxFQUFFLENBQUM7UUFDWixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsRUFBRTtRQUNWLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBZkQsd0NBZUM7QUFFRCw2RkFBNkY7QUFDN0YsU0FBZ0IsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFRLEtBQXFCLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFDbkQsT0FBUSxLQUFxQixDQUFDLGdCQUFnQixLQUFLLFVBQVU7UUFDN0QsT0FBUSxLQUFxQixDQUFDLG1CQUFtQixLQUFLLFVBQVUsQ0FDakUsQ0FBQztBQUNKLENBQUM7QUFSRCxzQ0FRQztBQVFEOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQ3pCLE1BQStCLEVBQy9CLFFBQTRCLEVBQzVCLE9BQWUsRUFDZixNQUFvQixJQUFJLENBQUMsR0FBRztJQUU1QixJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFTLEVBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUM5QixJQUFJLE1BQU0sR0FBZSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDekMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBQzlCLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixNQUFNLEVBQUUsQ0FBQztZQUNULFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFyQkQsa0NBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0L2RlYWRsaW5lLnRzIOKAlCB3aGF0IHRoZSBydW4ncyBkZWFkbGluZSBJUywgdG8gZXZlcnl0aGluZyB0aGF0IHJlYWRzIHRpbWUgKGRlc2lnbiDCpzMuMSwgbGF3IDMpLlxuICpcbiAqIFRoZSBkZWFkbGluZSBpcyBvbmUgbnVtYmVyLCBlcG9jaCBtaWxsaXNlY29uZHMgKGBlbnYuZGVhZGxpbmVgKTsgdGhlIGV4ZWN1dG9yIGFybXMgdGhlIHJ1bidzIHNpZ25hbCB0byBhYm9ydCB3aGVuXG4gKiBpdCBwYXNzZXMgKGBydW5uZXIvZGVhZGxpbmUudHMgwrcgYXJtUnVuYCkuIFJlYWNoaW5nIGl0IGlzIE5PVCBhIGNhbmNlbGxhdGlvbjogYW4gYXR0ZW1wdCB0aGUgZGVhZGxpbmUgY3V0cyBzaG9ydFxuICogdGltZWQgb3V0IChpdCBoYWQgbm8gYW5zd2VyIGluIHRoZSB0aW1lIGl0IGhhZCDigJQgbGF3IDQpLCBhbmQgdGhlIHNlcmllcyBzdG9wcyBgbm8tdGltZS1sZWZ0YCwgbm90IGBhYm9ydGVkYC4gU29cbiAqIHRoZSByZWFzb24gdGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2l0aCBhdCB0aGUgZGVhZGxpbmUgaXMgQlJBTkRFRCBoZXJlLCBhbmQgdGhlIGF0dGVtcHQgcnVubmVyIHRlbGxzIHRoZSB0d29cbiAqIGFwYXJ0IGJ5IHRoZSBicmFuZCDigJQgbmV2ZXIgYnkgdGhlIG1lc3NhZ2UsIG5ldmVyIGJ5IHRoZSBjbG9jay5cbiAqXG4gKiBUaGUgYnJhbmQgaXMgYSBtb2R1bGUtcHJpdmF0ZSBXZWFrU2V0OiBhbiBvcmRpbmFyeSBgRXJyb3JgIChzYW1lIG1lc3NhZ2UsIHNhbWUgbmFtZSBhIHJ1biB3aXRoIGB0aW1lb3V0TXNgIGFsd2F5c1xuICogcmVqZWN0ZWQgd2l0aCksIHJlY29nbmlzYWJsZSBvbmx5IGJ5IGlkZW50aXR5LlxuICovXG5cbmltcG9ydCB7IGFueVNpZ25hbCB9IGZyb20gJy4vYW55U2lnbmFsLmpzJztcblxuY29uc3QgREVBRExJTkVfUkVBU09OUyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuLyoqIFRoZSByZWFzb24gdGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2l0aCB3aGVuIGl0cyBkZWFkbGluZSBwYXNzZXMg4oCUIGFuIGBFcnJvcmAsIGJyYW5kZWQgYXMgdGhlIGRlYWRsaW5lJ3MuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhZGxpbmVSZWFzb24obWVzc2FnZTogc3RyaW5nKTogRXJyb3Ige1xuICBjb25zdCByZWFzb24gPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIERFQURMSU5FX1JFQVNPTlMuYWRkKHJlYXNvbik7XG4gIHJldHVybiByZWFzb247XG59XG5cbi8qKlxuICogQnJhbmQgYHJlYXNvbmAgYXMgYSB0aW1lIGxpbWl0IOKAlCB3aGF0IGFuIGF0dGVtcHQncyBvd24gY2FwIGFib3J0cyB3aXRoIChQMikuIEFuIGF0dGVtcHQncyBjYXAgaXMgdGhlIGRlYWRsaW5lIG9mXG4gKiBldmVyeSBjYWxsIG1hZGUgaW5zaWRlIGl0IChgYXR0ZW1wdC9jYWxsLnRzYCksIHNvIGEgY2FsbCBpdCBjdXRzIHJhbiBvdXQgb2YgdGltZTogYCd0aW1lb3V0J2AsIG5ldmVyIGAnYWJvcnRlZCdgLlxuICogVGhlIHJ1bidzIG93biBzaWduYWwgbmV2ZXIgYWJvcnRzIHdpdGggaXQsIHNvIGEgc3RhZ2UgYXR0ZW1wdCByZWFkcyBub3RoaW5nIG5ldy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtUaW1lTGltaXQ8VCBleHRlbmRzIG9iamVjdD4ocmVhc29uOiBUKTogVCB7XG4gIERFQURMSU5FX1JFQVNPTlMuYWRkKHJlYXNvbik7XG4gIHJldHVybiByZWFzb247XG59XG5cbi8qKiBXaGV0aGVyIGByZWFzb25gIGlzIHRoZSBydW4ncyBkZWFkbGluZSBvciBhbiBhdHRlbXB0J3MgY2FwIOKAlCBhIHRpbWUgbGltaXQsIG5vdCBhIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlYWRsaW5lUmVhc29uKHJlYXNvbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHJlYXNvbiA9PT0gJ29iamVjdCcgJiYgcmVhc29uICE9PSBudWxsICYmIERFQURMSU5FX1JFQVNPTlMuaGFzKHJlYXNvbik7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzaWduYWwgYWJvcnRlZCBmb3IgYSByZWFzb24gT1RIRVIgdGhhbiBhIHRpbWUgbGltaXQg4oCUIGEgY2FuY2VsbGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGVkKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiAhaXNEZWFkbGluZVJlYXNvbihzaWduYWwucmVhc29uKTtcbn1cblxuLyoqIEEgZGVhZGxpbmUgYXMgdGhlIGVuZ2luZSByZWFkcyBvbmU6IGEgZmluaXRlIG51bWJlciAoZXBvY2ggbXMpLCBlbHNlIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERlYWRsaW5lKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGxvbmdlc3QgZGVsYXkgYSBob3N0IHRpbWVyIGhvbm91cnMgKDJeMzEg4oiSIDEgbXMsIH4yNC44IGRheXMpOyBhIGxvbmdlciBvbmUgZmlyZXMgYXQgb25jZS4gKi9cbmNvbnN0IE1BWF9USU1FUl9NUyA9IDJfMTQ3XzQ4M182NDc7XG5cbi8qKlxuICogYHNldFRpbWVvdXRgIGZvciBhbnkgZGVsYXk6IGEgZGVsYXkgcGFzdCB0aGUgaG9zdCdzIGxpbWl0IGlzIHdhaXRlZCBpbiBjaHVua3MsIHNvIGEgMzAtZGF5IGRlYWRsaW5lIGRvZXMgbm90IGZpcmVcbiAqIGluIGEgbWlsbGlzZWNvbmQuIFJldHVybnMgdGhlIG9uZSBjYWxsIHRoYXQgY2FuY2VscyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvbmdUaW1lb3V0KGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKTogKCkgPT4gdm9pZCB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgYXJtID0gKGxlZnQ6IG51bWJlcikgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICBpZiAobGVmdCA+IE1BWF9USU1FUl9NUykgYXJtKGxlZnQgLSBNQVhfVElNRVJfTVMpO1xuICAgICAgZWxzZSBmbigpO1xuICAgIH0sIE1hdGgubWluKGxlZnQsIE1BWF9USU1FUl9NUykpO1xuICB9O1xuICBhcm0oTWF0aC5tYXgoMCwgbXMpKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIEFib3J0U2lnbmFsIChzdHJ1Y3R1cmFsbHkg4oCUIGEgc2lnbmFsIGZyb20gYW5vdGhlciByZWFsbSBjb3VudHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRTaWduYWwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBYm9ydFNpZ25hbCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkuYWJvcnRlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqIEEgc2lnbmFsIHRoYXQgYWJvcnRzIGF0IGEgZGVhZGxpbmUgKG9yIHdpdGggaXRzIGlucHV0KSwgYW5kIHRoZSBvbmUgY2FsbCB0aGF0IHJlbGVhc2VzIGJvdGguICovXG5leHBvcnQgaW50ZXJmYWNlIEFybWVkRGVhZGxpbmUge1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29tcG9zZSBgc2lnbmFsYCB3aXRoIGEgdGltZXIgdGhhdCBhYm9ydHMgYXQgYGRlYWRsaW5lYCAoZXBvY2ggbXMpIHdpdGggYSBicmFuZGVkIHtAbGluayBkZWFkbGluZVJlYXNvbn0g4oCUIHNvIHRoZVxuICogYXR0ZW1wdCBydW5uZXIncyByZWFkaW5nIGhvbGRzOiB0aGUgc2lnbmFsIGl0IGlzIGhhbmRlZCBhYm9ydHMgYXQgdGhlIGRlYWRsaW5lLCBhcyB0aGUgcnVuJ3MgZG9lcyAoYGFybVJ1bmApLiBBXG4gKiBkZWFkbGluZSBhbHJlYWR5IHBhc3QgYWJvcnRzIGF0IG9uY2U7IHdpdGhvdXQgYSBkZWFkbGluZSB0aGUgc2lnbmFsIGlzIGhhbmRlZCBiYWNrIGFzIGl0IGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJtRGVhZGxpbmUoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbm93OiAoKSA9PiBudW1iZXIgPSBEYXRlLm5vdyxcbik6IEFybWVkRGVhZGxpbmUge1xuICBpZiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2lnbmFsLCBkaXNwb3NlOiAoKSA9PiB1bmRlZmluZWQgfTtcbiAgY29uc3QgdGltZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNvbXBvc2VkID0gYW55U2lnbmFsKFtzaWduYWwsIHRpbWVyLnNpZ25hbF0pO1xuICBjb25zdCByZWFzb24gPSBkZWFkbGluZVJlYXNvbihtZXNzYWdlKTtcbiAgY29uc3QgbGVmdCA9IGRlYWRsaW5lIC0gbm93KCk7XG4gIGxldCBjYW5jZWw6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gIGlmIChsZWZ0IDw9IDApIHRpbWVyLmFib3J0KHJlYXNvbik7XG4gIGVsc2UgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4gdGltZXIuYWJvcnQocmVhc29uKSwgbGVmdCk7XG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBjb21wb3NlZC5zaWduYWwsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgY2FuY2VsKCk7XG4gICAgICBjb21wb3NlZC5kaXNwb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVhZGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUFFSCw2REFBMEQ7QUFDMUQsaURBQTJDO0FBRTNDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztBQUUvQyxnSEFBZ0g7QUFDaEgsU0FBZ0IsY0FBYyxDQUFDLE9BQWU7SUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFKRCx3Q0FJQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQW1CLE1BQVM7SUFDdkQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFIRCxzQ0FHQztBQUVELHFHQUFxRztBQUNyRyxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFlO0lBQzlDLE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFGRCw0Q0FFQztBQUVELHdGQUF3RjtBQUN4RixTQUFnQixXQUFXLENBQUMsTUFBK0I7SUFDekQsT0FBTyxNQUFNLEVBQUUsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRkQsa0NBRUM7QUFFRCxpRkFBaUY7QUFDakYsU0FBZ0IsWUFBWSxDQUFDLEtBQWM7SUFDekMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQztBQUZELG9DQUVDO0FBRUQsNkZBQTZGO0FBQzdGLFNBQWdCLGFBQWEsQ0FBQyxLQUFjO0lBQzFDLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsT0FBUSxLQUFxQixDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQ25ELE9BQVEsS0FBcUIsQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVO1FBQzdELE9BQVEsS0FBcUIsQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLENBQ2pFLENBQUM7QUFDSixDQUFDO0FBUkQsc0NBUUM7QUFRRDs7OztHQUlHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixNQUErQixFQUMvQixRQUE0QixFQUM1QixPQUFlLEVBQ2YsTUFBb0IsSUFBSSxDQUFDLEdBQUc7SUFFNUIsSUFBSSxRQUFRLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hFLE1BQU0sS0FBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBQSx3QkFBUyxFQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDOUIsSUFBSSxNQUFNLEdBQWUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3pDLElBQUksSUFBSSxJQUFJLENBQUM7UUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztRQUM5QixNQUFNLEdBQUcsSUFBQSwrQkFBYyxFQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsT0FBTztRQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ1osTUFBTSxFQUFFLENBQUM7WUFDVCxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBckJELGtDQXFCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9kZWFkbGluZS50cyDigJQgd2hhdCB0aGUgcnVuJ3MgZGVhZGxpbmUgSVMsIHRvIGV2ZXJ5dGhpbmcgdGhhdCByZWFkcyB0aW1lIChkZXNpZ24gwqczLjEsIGxhdyAzKS5cbiAqXG4gKiBUaGUgZGVhZGxpbmUgaXMgb25lIG51bWJlciwgZXBvY2ggbWlsbGlzZWNvbmRzIChgZW52LmRlYWRsaW5lYCk7IHRoZSBleGVjdXRvciBhcm1zIHRoZSBydW4ncyBzaWduYWwgdG8gYWJvcnQgd2hlblxuICogaXQgcGFzc2VzIChgcnVubmVyL2RlYWRsaW5lLnRzIMK3IGFybVJ1bmApLiBSZWFjaGluZyBpdCBpcyBOT1QgYSBjYW5jZWxsYXRpb246IGFuIGF0dGVtcHQgdGhlIGRlYWRsaW5lIGN1dHMgc2hvcnRcbiAqIHRpbWVkIG91dCAoaXQgaGFkIG5vIGFuc3dlciBpbiB0aGUgdGltZSBpdCBoYWQg4oCUIGxhdyA0KSwgYW5kIHRoZSBzZXJpZXMgc3RvcHMgYG5vLXRpbWUtbGVmdGAsIG5vdCBgYWJvcnRlZGAuIFNvXG4gKiB0aGUgcmVhc29uIHRoZSBydW4ncyBzaWduYWwgYWJvcnRzIHdpdGggYXQgdGhlIGRlYWRsaW5lIGlzIEJSQU5ERUQgaGVyZSwgYW5kIHRoZSBhdHRlbXB0IHJ1bm5lciB0ZWxscyB0aGUgdHdvXG4gKiBhcGFydCBieSB0aGUgYnJhbmQg4oCUIG5ldmVyIGJ5IHRoZSBtZXNzYWdlLCBuZXZlciBieSB0aGUgY2xvY2suXG4gKlxuICogVGhlIGJyYW5kIGlzIGEgbW9kdWxlLXByaXZhdGUgV2Vha1NldDogYW4gb3JkaW5hcnkgYEVycm9yYCAoc2FtZSBtZXNzYWdlLCBzYW1lIG5hbWUgYSBydW4gd2l0aCBgdGltZW91dE1zYCBhbHdheXNcbiAqIHJlamVjdGVkIHdpdGgpLCByZWNvZ25pc2FibGUgb25seSBieSBpZGVudGl0eS5cbiAqL1xuXG5pbXBvcnQgeyBzZXRMb25nVGltZW91dCB9IGZyb20gJy4uL3RpbWVycy9sb25nVGltZW91dC5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5cbmNvbnN0IERFQURMSU5FX1JFQVNPTlMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbi8qKiBUaGUgcmVhc29uIHRoZSBydW4ncyBzaWduYWwgYWJvcnRzIHdpdGggd2hlbiBpdHMgZGVhZGxpbmUgcGFzc2VzIOKAlCBhbiBgRXJyb3JgLCBicmFuZGVkIGFzIHRoZSBkZWFkbGluZSdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWRsaW5lUmVhc29uKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yIHtcbiAgY29uc3QgcmVhc29uID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBERUFETElORV9SRUFTT05TLmFkZChyZWFzb24pO1xuICByZXR1cm4gcmVhc29uO1xufVxuXG4vKipcbiAqIEJyYW5kIGByZWFzb25gIGFzIGEgdGltZSBsaW1pdCDigJQgd2hhdCBhbiBhdHRlbXB0J3Mgb3duIGNhcCBhYm9ydHMgd2l0aCAoUDIpLiBBbiBhdHRlbXB0J3MgY2FwIGlzIHRoZSBkZWFkbGluZSBvZlxuICogZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCAoYGF0dGVtcHQvY2FsbC50c2ApLCBzbyBhIGNhbGwgaXQgY3V0cyByYW4gb3V0IG9mIHRpbWU6IGAndGltZW91dCdgLCBuZXZlciBgJ2Fib3J0ZWQnYC5cbiAqIFRoZSBydW4ncyBvd24gc2lnbmFsIG5ldmVyIGFib3J0cyB3aXRoIGl0LCBzbyBhIHN0YWdlIGF0dGVtcHQgcmVhZHMgbm90aGluZyBuZXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrVGltZUxpbWl0PFQgZXh0ZW5kcyBvYmplY3Q+KHJlYXNvbjogVCk6IFQge1xuICBERUFETElORV9SRUFTT05TLmFkZChyZWFzb24pO1xuICByZXR1cm4gcmVhc29uO1xufVxuXG4vKiogV2hldGhlciBgcmVhc29uYCBpcyB0aGUgcnVuJ3MgZGVhZGxpbmUgb3IgYW4gYXR0ZW1wdCdzIGNhcCDigJQgYSB0aW1lIGxpbWl0LCBub3QgYSBjYW5jZWxsYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWFkbGluZVJlYXNvbihyZWFzb246IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiByZWFzb24gPT09ICdvYmplY3QnICYmIHJlYXNvbiAhPT0gbnVsbCAmJiBERUFETElORV9SRUFTT05TLmhhcyhyZWFzb24pO1xufVxuXG4vKiogV2hldGhlciB0aGUgc2lnbmFsIGFib3J0ZWQgZm9yIGEgcmVhc29uIE9USEVSIHRoYW4gYSB0aW1lIGxpbWl0IOKAlCBhIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbmNlbGxlZChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYWw/LmFib3J0ZWQgPT09IHRydWUgJiYgIWlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbik7XG59XG5cbi8qKiBBIGRlYWRsaW5lIGFzIHRoZSBlbmdpbmUgcmVhZHMgb25lOiBhIGZpbml0ZSBudW1iZXIgKGVwb2NoIG1zKSwgZWxzZSBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWREZWFkbGluZSh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFdoZXRoZXIgYHZhbHVlYCBpcyBhbiBBYm9ydFNpZ25hbCAoc3RydWN0dXJhbGx5IOKAlCBhIHNpZ25hbCBmcm9tIGFub3RoZXIgcmVhbG0gY291bnRzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Fib3J0U2lnbmFsKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQWJvcnRTaWduYWwge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLmFib3J0ZWQgPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEFib3J0U2lnbmFsKS5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nXG4gICk7XG59XG5cbi8qKiBBIHNpZ25hbCB0aGF0IGFib3J0cyBhdCBhIGRlYWRsaW5lIChvciB3aXRoIGl0cyBpbnB1dCksIGFuZCB0aGUgb25lIGNhbGwgdGhhdCByZWxlYXNlcyBib3RoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcm1lZERlYWRsaW5lIHtcbiAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbXBvc2UgYHNpZ25hbGAgd2l0aCBhIHRpbWVyIHRoYXQgYWJvcnRzIGF0IGBkZWFkbGluZWAgKGVwb2NoIG1zKSB3aXRoIGEgYnJhbmRlZCB7QGxpbmsgZGVhZGxpbmVSZWFzb259IOKAlCBzbyB0aGVcbiAqIGF0dGVtcHQgcnVubmVyJ3MgcmVhZGluZyBob2xkczogdGhlIHNpZ25hbCBpdCBpcyBoYW5kZWQgYWJvcnRzIGF0IHRoZSBkZWFkbGluZSwgYXMgdGhlIHJ1bidzIGRvZXMgKGBhcm1SdW5gKS4gQVxuICogZGVhZGxpbmUgYWxyZWFkeSBwYXN0IGFib3J0cyBhdCBvbmNlOyB3aXRob3V0IGEgZGVhZGxpbmUgdGhlIHNpZ25hbCBpcyBoYW5kZWQgYmFjayBhcyBpdCBpcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFybURlYWRsaW5lKFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIG5vdzogKCkgPT4gbnVtYmVyID0gRGF0ZS5ub3csXG4pOiBBcm1lZERlYWRsaW5lIHtcbiAgaWYgKGRlYWRsaW5lID09PSB1bmRlZmluZWQpIHJldHVybiB7IHNpZ25hbCwgZGlzcG9zZTogKCkgPT4gdW5kZWZpbmVkIH07XG4gIGNvbnN0IHRpbWVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBjb21wb3NlZCA9IGFueVNpZ25hbChbc2lnbmFsLCB0aW1lci5zaWduYWxdKTtcbiAgY29uc3QgcmVhc29uID0gZGVhZGxpbmVSZWFzb24obWVzc2FnZSk7XG4gIGNvbnN0IGxlZnQgPSBkZWFkbGluZSAtIG5vdygpO1xuICBsZXQgY2FuY2VsOiAoKSA9PiB2b2lkID0gKCkgPT4gdW5kZWZpbmVkO1xuICBpZiAobGVmdCA8PSAwKSB0aW1lci5hYm9ydChyZWFzb24pO1xuICBlbHNlIGNhbmNlbCA9IHNldExvbmdUaW1lb3V0KCgpID0+IHRpbWVyLmFib3J0KHJlYXNvbiksIGxlZnQpO1xuICByZXR1cm4ge1xuICAgIHNpZ25hbDogY29tcG9zZWQuc2lnbmFsLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgY29tcG9zZWQuZGlzcG9zZSgpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -3,13 +3,16 @@
3
3
  * attempt/ — one runner, one record: every attempt the library runs is an `AttemptRecord` with the
4
4
  * retry-or-stop decision that followed it (design docs/design/2026-10-time-and-failure-evidence.md).
5
5
  *
6
- * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, and `attempt()`
7
- * — the runner for code that is not a stage (P2). The loop itself (`runAttempts`), `runCall`, the evidence builder
8
- * and `anySignal` are the engine's. `RetryPolicy` is declared in
9
- * `./types.ts` and published through the builder's barrel, where it always was.
6
+ * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, `attempt()`
7
+ * — the runner for code that is not a stage (P2) — and the backoff builders a `RetryPolicy.backoffMs` takes. The loop
8
+ * itself (`runAttempts`), `runCall`, the evidence builder, `anySignal` and the long-timer law are the engine's.
9
+ * `RetryPolicy` is declared in `./types.ts` and published through the builder's barrel, where it always was.
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.attempt = exports.UnknownEffectError = exports.AttemptTimeoutError = exports.retryRules = exports.TraceparentError = exports.parseTraceparent = exports.formatTraceparent = exports.errorCategory = void 0;
12
+ exports.attempt = exports.UnknownEffectError = exports.AttemptTimeoutError = exports.retryRules = exports.TraceparentError = exports.parseTraceparent = exports.formatTraceparent = exports.errorCategory = exports.statedWaitFirst = exports.exponentialBackoff = void 0;
13
+ var backoff_js_1 = require("./backoff.js");
14
+ Object.defineProperty(exports, "exponentialBackoff", { enumerable: true, get: function () { return backoff_js_1.exponentialBackoff; } });
15
+ Object.defineProperty(exports, "statedWaitFirst", { enumerable: true, get: function () { return backoff_js_1.statedWaitFirst; } });
13
16
  var category_js_1 = require("./category.js");
14
17
  Object.defineProperty(exports, "errorCategory", { enumerable: true, get: function () { return category_js_1.errorCategory; } });
15
18
  var correlation_js_1 = require("./correlation.js");
@@ -23,4 +26,4 @@ Object.defineProperty(exports, "AttemptTimeoutError", { enumerable: true, get: f
23
26
  Object.defineProperty(exports, "UnknownEffectError", { enumerable: true, get: function () { return errors_js_1.UnknownEffectError; } });
24
27
  var standalone_js_1 = require("./standalone.js");
25
28
  Object.defineProperty(exports, "attempt", { enumerable: true, get: function () { return standalone_js_1.attempt; } });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCw2Q0FBOEM7QUFBckMsNEdBQUEsYUFBYSxPQUFBO0FBRXRCLG1EQUF5RjtBQUFoRixtSEFBQSxpQkFBaUIsT0FBQTtBQUFFLGtIQUFBLGdCQUFnQixPQUFBO0FBQUUsa0hBQUEsZ0JBQWdCLE9BQUE7QUFDOUQsNkNBQTJDO0FBQWxDLHlHQUFBLFVBQVUsT0FBQTtBQUVuQix5Q0FBc0U7QUFBN0QsZ0hBQUEsbUJBQW1CLE9BQUE7QUFBRSwrR0FBQSxrQkFBa0IsT0FBQTtBQUVoRCxpREFBMEM7QUFBakMsd0dBQUEsT0FBTyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0LyDigJQgb25lIHJ1bm5lciwgb25lIHJlY29yZDogZXZlcnkgYXR0ZW1wdCB0aGUgbGlicmFyeSBydW5zIGlzIGFuIGBBdHRlbXB0UmVjb3JkYCB3aXRoIHRoZVxuICogcmV0cnktb3Itc3RvcCBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIGl0IChkZXNpZ24gZG9jcy9kZXNpZ24vMjAyNi0xMC10aW1lLWFuZC1mYWlsdXJlLWV2aWRlbmNlLm1kKS5cbiAqXG4gKiBQdWJsaWM6IHRoZSByZWNvcmQncyB2b2NhYnVsYXJ5LCB0aGUgb25lIGZhaWx1cmUgY2xhc3NpZmllciwgdGhlIG9uZSBydWxlIHRhYmxlLCB0aGUgdHdvIGVycm9ycywgYW5kIGBhdHRlbXB0KClgXG4gKiDigJQgdGhlIHJ1bm5lciBmb3IgY29kZSB0aGF0IGlzIG5vdCBhIHN0YWdlIChQMikuIFRoZSBsb29wIGl0c2VsZiAoYHJ1bkF0dGVtcHRzYCksIGBydW5DYWxsYCwgdGhlIGV2aWRlbmNlIGJ1aWxkZXJcbiAqIGFuZCBgYW55U2lnbmFsYCBhcmUgdGhlIGVuZ2luZSdzLiBgUmV0cnlQb2xpY3lgIGlzIGRlY2xhcmVkIGluXG4gKiBgLi90eXBlcy50c2AgYW5kIHB1Ymxpc2hlZCB0aHJvdWdoIHRoZSBidWlsZGVyJ3MgYmFycmVsLCB3aGVyZSBpdCBhbHdheXMgd2FzLlxuICovXG5cbmV4cG9ydCB7IGVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuL2NhdGVnb3J5LmpzJztcbmV4cG9ydCB0eXBlIHsgUGFyc2VkVHJhY2VwYXJlbnQsIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2NvcnJlbGF0aW9uLmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgeyByZXRyeVJ1bGVzIH0gZnJvbSAnLi9kZWNpc2lvbi5qcyc7XG5leHBvcnQgdHlwZSB7IFVua25vd25FZmZlY3RJbml0IH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHsgQXR0ZW1wdFRpbWVvdXRFcnJvciwgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHR5cGUgeyBBdHRlbXB0T3B0aW9ucyB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgeyBhdHRlbXB0IH0gZnJvbSAnLi9zdGFuZGFsb25lLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVhc29uLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFJ1bkNvcnJlbGF0aW9uLFxuICBTdGFnZVRvdWNoZXMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuIl19
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFHSCwyQ0FBbUU7QUFBMUQsZ0hBQUEsa0JBQWtCLE9BQUE7QUFBRSw2R0FBQSxlQUFlLE9BQUE7QUFDNUMsNkNBQThDO0FBQXJDLDRHQUFBLGFBQWEsT0FBQTtBQUV0QixtREFBeUY7QUFBaEYsbUhBQUEsaUJBQWlCLE9BQUE7QUFBRSxrSEFBQSxnQkFBZ0IsT0FBQTtBQUFFLGtIQUFBLGdCQUFnQixPQUFBO0FBQzlELDZDQUEyQztBQUFsQyx5R0FBQSxVQUFVLE9BQUE7QUFFbkIseUNBQXNFO0FBQTdELGdIQUFBLG1CQUFtQixPQUFBO0FBQUUsK0dBQUEsa0JBQWtCLE9BQUE7QUFFaEQsaURBQTBDO0FBQWpDLHdHQUFBLE9BQU8sT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC8g4oCUIG9uZSBydW5uZXIsIG9uZSByZWNvcmQ6IGV2ZXJ5IGF0dGVtcHQgdGhlIGxpYnJhcnkgcnVucyBpcyBhbiBgQXR0ZW1wdFJlY29yZGAgd2l0aCB0aGVcbiAqIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gdGhhdCBmb2xsb3dlZCBpdCAoZGVzaWduIGRvY3MvZGVzaWduLzIwMjYtMTAtdGltZS1hbmQtZmFpbHVyZS1ldmlkZW5jZS5tZCkuXG4gKlxuICogUHVibGljOiB0aGUgcmVjb3JkJ3Mgdm9jYWJ1bGFyeSwgdGhlIG9uZSBmYWlsdXJlIGNsYXNzaWZpZXIsIHRoZSBvbmUgcnVsZSB0YWJsZSwgdGhlIHR3byBlcnJvcnMsIGBhdHRlbXB0KClgXG4gKiDigJQgdGhlIHJ1bm5lciBmb3IgY29kZSB0aGF0IGlzIG5vdCBhIHN0YWdlIChQMikg4oCUIGFuZCB0aGUgYmFja29mZiBidWlsZGVycyBhIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIHRha2VzLiBUaGUgbG9vcFxuICogaXRzZWxmIChgcnVuQXR0ZW1wdHNgKSwgYHJ1bkNhbGxgLCB0aGUgZXZpZGVuY2UgYnVpbGRlciwgYGFueVNpZ25hbGAgYW5kIHRoZSBsb25nLXRpbWVyIGxhdyBhcmUgdGhlIGVuZ2luZSdzLlxuICogYFJldHJ5UG9saWN5YCBpcyBkZWNsYXJlZCBpbiBgLi90eXBlcy50c2AgYW5kIHB1Ymxpc2hlZCB0aHJvdWdoIHRoZSBidWlsZGVyJ3MgYmFycmVsLCB3aGVyZSBpdCBhbHdheXMgd2FzLlxuICovXG5cbmV4cG9ydCB0eXBlIHsgQmFja29mZkZ1bmN0aW9uLCBCYWNrb2ZmSml0dGVyLCBCYWNrb2ZmU3BlYywgU3RhdGVkV2FpdFJlYWRlciB9IGZyb20gJy4vYmFja29mZi5qcyc7XG5leHBvcnQgeyBleHBvbmVudGlhbEJhY2tvZmYsIHN0YXRlZFdhaXRGaXJzdCB9IGZyb20gJy4vYmFja29mZi5qcyc7XG5leHBvcnQgeyBlcnJvckNhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5leHBvcnQgdHlwZSB7IFBhcnNlZFRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEZpZWxkcywgVHJhY2VwYXJlbnRSZWZ1c2FsIH0gZnJvbSAnLi9jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgeyBmb3JtYXRUcmFjZXBhcmVudCwgcGFyc2VUcmFjZXBhcmVudCwgVHJhY2VwYXJlbnRFcnJvciB9IGZyb20gJy4vY29ycmVsYXRpb24uanMnO1xuZXhwb3J0IHsgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuZXhwb3J0IHR5cGUgeyBVbmtub3duRWZmZWN0SW5pdCB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IEF0dGVtcHRUaW1lb3V0RXJyb3IsIFVua25vd25FZmZlY3RFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB0eXBlIHsgQXR0ZW1wdE9wdGlvbnMgfSBmcm9tICcuL3N0YW5kYWxvbmUuanMnO1xuZXhwb3J0IHsgYXR0ZW1wdCB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRFcnJvcixcbiAgQXR0ZW1wdElucHV0cyxcbiAgQXR0ZW1wdEtpbmQsXG4gIEF0dGVtcHROZXh0LFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlYXNvbixcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIENhbGxPcHRpb25zLFxuICBJZGVtcG90ZW5jeUtleUNvbnRleHQsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBSdW5Db3JyZWxhdGlvbixcbiAgU3RhZ2VUb3VjaGVzLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbiJdfQ==
@@ -67,6 +67,7 @@ exports.sleep = exports.resolveBackoffMs = exports.runAttempts = exports.attempt
67
67
  const errorInfo_js_1 = require("../errors/errorInfo.js");
68
68
  const interrupt_js_1 = require("../pause/interrupt.js");
69
69
  const types_js_1 = require("../pause/types.js");
70
+ const longTimeout_js_1 = require("../timers/longTimeout.js");
70
71
  const anySignal_js_1 = require("./anySignal.js");
71
72
  const category_js_1 = require("./category.js");
72
73
  const deadline_js_1 = require("./deadline.js");
@@ -248,7 +249,7 @@ class LiveAttempt {
248
249
  const own = ownTimer ? new AbortController() : undefined;
249
250
  if (own) {
250
251
  const capMs = this.capMs;
251
- this.cancelTimer = (0, deadline_js_1.setLongTimeout)(() => {
252
+ this.cancelTimer = (0, longTimeout_js_1.setLongTimeout)(() => {
252
253
  // A time limit, branded like the run's deadline: a call made inside this attempt that it cuts timed out.
253
254
  this.timeoutReason = (0, deadline_js_1.markTimeLimit)(new errors_js_1.AttemptTimeoutError(attempt, capMs));
254
255
  own.abort(this.timeoutReason);
@@ -497,7 +498,7 @@ function sleep(ms, signal) {
497
498
  signal?.removeEventListener('abort', done);
498
499
  resolve();
499
500
  };
500
- const cancel = (0, deadline_js_1.setLongTimeout)(done, ms);
501
+ const cancel = (0, longTimeout_js_1.setLongTimeout)(done, ms);
501
502
  signal?.addEventListener('abort', done, { once: true });
502
503
  });
503
504
  }
@@ -527,4 +528,4 @@ class SeriesTally {
527
528
  return (0, record_js_1.freezeDeep)({ ...this.counts, last });
528
529
  }
529
530
  }
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERHOzs7QUFHSCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELGdEQUFrRDtBQUNsRCxpREFBMkM7QUFDM0MsK0NBQWdFO0FBQ2hFLCtDQUEyRztBQUMzRywrQ0FBMEQ7QUFFMUQsMkNBQThGO0FBQzlGLDJDQUFrRDtBQUNsRCwyQ0FBNkU7QUFDN0UsMkNBQXdEO0FBNkV4RCxzSEFBc0g7QUFDdEgsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxPQUFtQztJQUMvRCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRkQsc0NBRUM7QUFPRDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsV0FBVyxDQUMvQixHQUFpRSxFQUNqRSxNQUFtQixFQUNuQixPQUEwQjtJQUUxQixNQUFNLEVBQUUsR0FBRyxJQUFBLDBCQUFjLEVBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQVUsRUFBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLDBCQUFZLEVBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElB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QWEsRUFBRSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxXQUFXO0lBQ0UsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU1RixHQUFHLENBQUMsTUFBcUI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQTRCO1FBQ2xDLE9BQU8sSUFBQSxzQkFBVSxFQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9ydW5uZXIudHMg4oCUIGBydW5BdHRlbXB0c2AsIFRIRSByZXRyeSBsb29wIChkZXNpZ24gwqczLjEsIGxhdyAxOiBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKS5cbiAqXG4gKiBSdW5zIGEgZnVuY3Rpb24gdW5kZXIgYSBwb2xpY3kgYW5kIHJlY29yZHMgZXZlcnkgdHJ5OiBvbmUgZnJvemVuIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCwgY2FycnlpbmcgaXRzXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIChgYXR0ZW1wdC9kZWNpc2lvbi50c2ApLCBhbmQgb25lXG4gKiBgQXR0ZW1wdFN1bW1hcnlgIHdoZW4gdGhlIHNlcmllcyBlbmRzLiBUaGUgZW5naW5lJ3Mgc3RhZ2UgcmV0cnkgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCkgcnVucyBvblxuICogaXQ7IGxhdGVyIHBhY2tldHMgcnVuIGluLXN0YWdlIGNhbGxzIGFuZCBzdGFuZGFsb25lIGBhdHRlbXB0KClgIG9uIGl0IHRvby5cbiAqXG4gKiBUaGUgbG9vcCwgcGVyIGF0dGVtcHQgbiDigJQgZm9yIGEgZmFpbGVkIGF0dGVtcHQsIHRoZSA5LjE1IGxvb3AncyBvcmRlciwgc3RlcCBmb3Igc3RlcDpcbiAqXG4gKiAgIHN0YXJ0IOKGkiBydW4obikg4oaSIG91dGNvbWUgKG9rIHwgZmFpbGVkIHwgYWJvcnRlZCBbaXQgdGhyZXcgdGhlIHJ1bidzIGFib3J0IHJlYXNvbl0gfCBwYXVzZWQgW2EgUGF1c2VTaWduYWxdKVxuICogICAgICAgICDihpIgZGVjaWRlIG92ZXIgdGhlIGlucHV0cywgZmlyc3QgbWF0Y2ggd2lucyAoYHJldHJ5UnVsZXNgKSDigJQgcmV0cnlPbiBpcyBhc2tlZCBoZXJlIChydWxlIDUpXG4gKiAgICAgICAgIOKGkiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0ZWQgaW5zaWRlIHJldHJ5T24/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=
531
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERHOzs7QUFHSCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELGdEQUFrRDtBQUNsRCw2REFBMEQ7QUFDMUQsaURBQTJDO0FBQzNDLCtDQUFnRTtBQUNoRSwrQ0FBMkY7QUFDM0YsK0NBQTBEO0FBRTFELDJDQUE4RjtBQUM5RiwyQ0FBa0Q7QUFDbEQsMkNBQTZFO0FBQzdFLDJDQUF3RDtBQTZFeEQsc0hBQXNIO0FBQ3RILE1BQU0sWUFBWSxHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRTNEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQUMsT0FBbUM7SUFDL0QsT0FBTyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUZELHNDQUVDO0FBT0Q7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLFdBQVcsQ0FDL0IsR0FBaUUsRUFDakUsTUFBbUIsRUFDbkIsT0FBMEI7SUFFMUIsTUFBTSxFQUFFLEdBQUcsSUFBQSwwQkFBYyxFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFVLEVBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBQSwwQkFBWSxFQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFN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LFlBQVksRUFBRSxJQUFhLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQ3hDLENBQUM7QUFDSixDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELE1BQU0sV0FBVztJQUNFLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFNUYsR0FBRyxDQUFDLE1BQXFCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUE0QjtRQUNsQyxPQUFPLElBQUEsc0JBQVUsRUFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvcnVubmVyLnRzIOKAlCBgcnVuQXR0ZW1wdHNgLCBUSEUgcmV0cnkgbG9vcCAoZGVzaWduIMKnMy4xLCBsYXcgMTogb25lIHJ1bm5lciwgb25lIHJlY29yZCkuXG4gKlxuICogUnVucyBhIGZ1bmN0aW9uIHVuZGVyIGEgcG9saWN5IGFuZCByZWNvcmRzIGV2ZXJ5IHRyeTogb25lIGZyb3plbiBgQXR0ZW1wdFJlY29yZGAgcGVyIGF0dGVtcHQsIGNhcnJ5aW5nIGl0c1xuICogdGltaW5nLCBvdXRjb21lLCBmYWlsdXJlIGNhdGVnb3J5IGFuZCB0aGUgcmV0cnktb3Itc3RvcCBkZWNpc2lvbiAoYGF0dGVtcHQvZGVjaXNpb24udHNgKSwgYW5kIG9uZVxuICogYEF0dGVtcHRTdW1tYXJ5YCB3aGVuIHRoZSBzZXJpZXMgZW5kcy4gVGhlIGVuZ2luZSdzIHN0YWdlIHJldHJ5IChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGV4ZWN1dGVTdGFnZWApIHJ1bnMgb25cbiAqIGl0OyBsYXRlciBwYWNrZXRzIHJ1biBpbi1zdGFnZSBjYWxscyBhbmQgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYCBvbiBpdCB0b28uXG4gKlxuICogVGhlIGxvb3AsIHBlciBhdHRlbXB0IG4g4oCUIGZvciBhIGZhaWxlZCBhdHRlbXB0LCB0aGUgOS4xNSBsb29wJ3Mgb3JkZXIsIHN0ZXAgZm9yIHN0ZXA6XG4gKlxuICogICBzdGFydCDihpIgcnVuKG4pIOKGkiBvdXRjb21lIChvayB8IGZhaWxlZCB8IGFib3J0ZWQgW2l0IHRocmV3IHRoZSBydW4ncyBhYm9ydCByZWFzb25dIHwgcGF1c2VkIFthIFBhdXNlU2lnbmFsXSlcbiAqICAgICAgICAg4oaSIGRlY2lkZSBvdmVyIHRoZSBpbnB1dHMsIGZpcnN0IG1hdGNoIHdpbnMgKGByZXRyeVJ1bGVzYCkg4oCUIHJldHJ5T24gaXMgYXNrZWQgaGVyZSAocnVsZSA1KVxuICogICAgICAgICDihpIgdGhlIHJ1bidzIHNpZ25hbCBhYm9ydGVkIGluc2lkZSByZXRyeU9uPyBkZWNpZGUgYWdhaW46IHJ1bGUgMyBzdG9wcyB0aGUgc2VyaWVzIGhlcmUsIGJlZm9yZSB0aGVcbiAqICAgICAgICAgICBkaXNjYXJkIGFuZCBiZWZvcmUgYmFja29mZk1zLCBhcyB0aGUgOS4xNSBhYm9ydCBjaGVjayBkaWRcbiAqICAgICAgICAg4oaSIHJldHJ5OiBiZXR3ZWVuKG4pIOKAlCB0aGUgZGlzY2FyZCDigJQgYW5kIFRIRU4gYmFja29mZk1zKG4pLCB0aGUgd2FpdCdzIGxlbmd0aFxuICogICAgICAgICDihpIgdGhlIGVycm9yJ3Mgc2VydmVkIGZvcm0gYW5kIGNhdGVnb3J5LCByZWFkIGFmdGVyIHJldHJ5T24gYW5kIGJhY2tvZmZNcyByYW4g4oaSIHRoZSByZWNvcmRcbiAqICAgICAgICAg4oaSIG9uRW5kKHN1bW1hcnkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHdoZW4gdGhlIHNlcmllcyBlbmRzIGhlcmVcbiAqICAgICAgICAg4oaSIG9uQXR0ZW1wdChyZWNvcmQsIHNlcnZlZCBlcnJvcilcbiAqICAgICAgICAg4oaSIGRvbmU6IHJldHVybiB0aGUgdmFsdWUgwrcgc3RvcDogcmV0aHJvdyB0aGUgYXR0ZW1wdCdzIE9XTiBlcnJvclxuICogICAgICAgICDihpIgcmV0cnk6IG9uUmV0cnkobiwgb2YsIGRlbGF5LCBzZXJ2ZWQgZXJyb3IpIOKGkiB3YWl0IChjdXQgc2hvcnQgYnkgdGhlIHNpZ25hbCkg4oaSIGFib3J0ZWQ/IHN0b3BcbiAqXG4gKiBXSEFUIElUIFBSRVNFUlZFUyAodGhlIDkuMTUgbG9vcCdzIGJlaGF2aW91ciwgbW92ZWQgaGVyZSB1bmNoYW5nZWQpOiB0aGUgZnVuY3Rpb24gcnVucyB0aGUgc2FtZSBudW1iZXIgb2ZcbiAqIHRpbWVzOyBgcmV0cnlPbmAgaXMgYXNrZWQgb25seSBmb3IgYSBmYWlsZWQsIG5vbi1maW5hbCBhdHRlbXB0OyBgYmFja29mZk1zYCBvbmx5IHdoZW4gYSByZXRyeSBmb2xsb3dzLCBhZnRlclxuICogdGhlIGRpc2NhcmQ7IGEgdGhyb3dpbmcgcHJlZGljYXRlIGlzIFwiZG8gbm90IHJldHJ5XCIsIGEgdGhyb3dpbmcgb3Igbm9uLWZpbml0ZSBiYWNrb2ZmIGlzIFwibm8gd2FpdFwiOyBhIHBhdXNlIGlzXG4gKiBuZXZlciByZXRyaWVkOyB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciBpcyByZXRocm93biwgbmV2ZXIgYSB3cmFwcGVyOyBhbmQgYSBmYWlsZWQgYXR0ZW1wdCdzIG9yZGVyIOKAlFxuICogYHJldHJ5T25gIOKGkiB0aGUgYWJvcnQgY2hlY2sg4oaSIHRoZSBkaXNjYXJkIChgYmV0d2VlbmApIOKGkiBgYmFja29mZk1zYCDihpIgdGhlIHNlcnZlZCBlcnJvciDihpIgdGhlIHJldHJ5IGV2ZW50IOKGklxuICogdGhlIHdhaXQg4oaSIHRoZSBhYm9ydCBjaGVjay4gU28gYW4gYWJvcnQgaW5zaWRlIGByZXRyeU9uYCBzdG9wcyBiZWZvcmUgdGhlIGRpc2NhcmQgYW5kIG5ldmVyIGFza3MgYGJhY2tvZmZNc2A7XG4gKiBhbiBhYm9ydCBpbnNpZGUgYGJhY2tvZmZNc2AgY29tZXMgYWZ0ZXIgdGhlIGRpc2NhcmQsIHN0aWxsIGZpcmVzIHRoZSByZXRyeSBldmVudCwgdGhlbiBlbmRzIGF0IHRoZSB3YWl0OyBhbmRcbiAqIHRoZSBzZXJ2ZWQgZXJyb3Igc2hvd3Mgd2hhdCBgcmV0cnlPbmAgZGlkIHRvIHRoZSB0aHJvd24gdmFsdWUuIFRoZSBvbmUgZGlmZmVyZW5jZTogd2hlbiB0aGUgcnVuJ3Mgc2lnbmFsIGhhc1xuICogQUxSRUFEWSBhYm9ydGVkIGFzIHRoZSBhdHRlbXB0IGZhaWxzLCB0aGUgc2VyaWVzIHN0b3BzIHdpdGhvdXQgYXNraW5nIGByZXRyeU9uYCAodGhlIGFib3J0IGRlY2lkZXMgZmlyc3Qg4oCUXG4gKiBydWxlIDMgYmVmb3JlIHJ1bGUgNSkuXG4gKlxuICogV0hBVCBJVCBBRERTOiB0aGUgcmVjb3JkIGFuZCB0aGUgc3VtbWFyeS4gQSByZWNvcmQgaXMgZnJvemVuIHRvIGl0cyBsZWF2ZXMgYW5kIGhvbGRzIG9ubHkgY2xvbmUtc2FmZSBkYXRhIOKAlFxuICogdGhlIGVycm9yIGFzIHRoZSBydW4gU0VSVkVTIGl0IChgc2VydmVgLCB0aGUgcmVkYWN0aW9uIHJ1bGUncyBmb3JtKSB3aXRob3V0IGByYXdgLiBUaGUgaG9vayBnZXRzIHRoZSBzZXJ2ZWRcbiAqIGBTdHJ1Y3R1cmVkRXJyb3JJbmZvYCB3aG9sZSwgYHJhd2AgaW5jbHVkZWQsIGFzIGBvblN0YWdlUmV0cnlgIGFsd2F5cyBoYXMuIEEgcmVjb3JkIG5ldmVyIHJld3JpdGVzIHdoYXQgdGhlXG4gKiBhdHRlbXB0IGRpZDogYW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyBvd24gZXJyb3IgaXMgYGZhaWxlZGAsIHdpdGggaXRzIGNhdGVnb3J5LCBldmVuIHdoZW4gdGhlIHJ1biBhYm9ydGVkXG4gKiBhcm91bmQgaXQg4oCUIHRoZSBhYm9ydCBpcyB0aGUgc2VyaWVzJyBzdG9wIHJlYXNvbiAoYHJlYXNvbjogJ2Fib3J0ZWQnYCk7IGEgdGhyb3dpbmcgYHJldHJ5T25gIGlzIGBkZWNsaW5lZGBcbiAqIHdpdGggYHJldHJ5T25UaHJldzogdHJ1ZWAsIGFwYXJ0IGZyb20gYSByZWFsIGBmYWxzZWAuXG4gKlxuICogVElNRSAoUDFiKS4gRWFjaCBhdHRlbXB0IHJ1bnMgdW5kZXIgYG1pbihwb2xpY3kudGltZW91dE1zLCB0aW1lIGxlZnQgYmVmb3JlIG9wdGlvbnMuZGVhZGxpbmUpYCBhbmQgZ2V0cyBhblxuICogYEF0dGVtcHRDb250ZXh0YCDigJQgaXRzIHNpZ25hbCwgY29tcG9zZWQgZnJvbSB0aGUgcnVuJ3MgYW5kIGl0cyBvd24gY2FwJ3MgdGltZXIgKGBMaXZlQXR0ZW1wdGApLiBUaGUgY2FwJ3MgdGltZXJcbiAqIGFib3J0cyB3aXRoIGFuIGBBdHRlbXB0VGltZW91dEVycm9yYDsgdGhlIHJ1bidzIGRlYWRsaW5lIGFib3J0cyB0aGUgcnVuJ3Mgc2lnbmFsIHdpdGggYSBicmFuZGVkIHJlYXNvblxuICogKGBhdHRlbXB0L2RlYWRsaW5lLnRzYCkuIEVpdGhlciB3YXkgdGhlIGF0dGVtcHQgaXMgYCd0aW1lb3V0J2AsIG5ldmVyIGAnYWJvcnRlZCdgOiB0aGUgZGVhZGxpbmUgaXMgbm90IGFcbiAqIGNhbmNlbGxhdGlvbiwgc28gcnVsZSAzIGRvZXMgbm90IG1hdGNoIGFuZCBydWxlIDYgKGB0aW1lTGVmdEFmdGVyV2FpdE1zIOKJpCAwYCkgc3RvcHMgYSBzZXJpZXMgd2hvc2UgbmV4dCB3YWl0XG4gKiB3b3VsZCBvdXRsYXN0IGl0LiBVbmRlciBhIGRlYWRsaW5lIHJ1bGUgNiBuZWVkcyB0aGUgd2FpdCdzIGxlbmd0aCwgc28gYGJhY2tvZmZNcyhuLCBlcnJvcilgIGlzIGFza2VkIERVUklORyB0aGVcbiAqIGRlY2lzaW9uIOKAlCBiZWZvcmUgdGhlIGRpc2NhcmQ7IHdpdGhvdXQgb25lIHRoZSA5LjE1IG9yZGVyIGFib3ZlIGhvbGRzIHVuY2hhbmdlZC4gTm8gYXR0ZW1wdCBzdGFydHMgYXQgb3IgcGFzdFxuICogdGhlIGRlYWRsaW5lOiBhIHdhaXQgdGhlIGRlYWRsaW5lIGN1dCBlbmRzIHRoZSBzZXJpZXMgYG5vLXRpbWUtbGVmdGAsIHJlY29yZGluZyBubyBmdXJ0aGVyIGF0dGVtcHQuXG4gKlxuICogVEhFIEZFTkNFLiBUaGUgbW9tZW50IGFuIGF0dGVtcHQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciDigJQgaXRzIHNpZ25hbCBhYm9ydHMgKHN5bmNocm9ub3VzbHksIGJlZm9yZSBhbnkgbGlzdGVuZXJcbiAqIHRoZSBmdW5jdGlvbiBhZGRlZCkgb3IgaXQgdGhyb3dzIOKAlCBgb25BYmFuZG9uKG4pYCBmaXJlcyBvbmNlLCBhbmQgdGhlIGVuZ2luZSBjbG9zZXMgdGhhdCBhdHRlbXB0J3Mgc2NvcGU6IHRoZVxuICogZnVuY3Rpb24gbWF5IHN0aWxsIGJlIHJ1bm5pbmcsIGFuZCBub3RoaW5nIGl0IGRvZXMgYWZ0ZXJ3YXJkcyBtYXkgbGFuZCBiZXNpZGUgYSBsYXRlciBhdHRlbXB0LlxuICpcbiAqIE9ORSBhc3luYyBmcmFtZSB3aXRoIE9ORSBhd2FpdCBwZXIgYXR0ZW1wdDogdGhlIGVuZ2luZSByZWxpZXMgb24gdGhhdCB0byBrZWVwIGEgcmV0cmllZCBzdGFnZSdzIG1pY3JvdGFza1xuICogc2hhcGUsIHNvIHBhcmFsbGVsIHNpYmxpbmdzIHNldHRsZSBpbiB0aGUgb3JkZXIgdGhleSBhbHdheXMgZGlkLiBUaGUgZW5naW5lIHJhY2VzIHRoZSBhdHRlbXB0J3Mgc2lnbmFsIGl0c2VsZixcbiAqIGF0IHRoZSBzdGFnZSBib3VuZGFyeSAoYHJhY2VkOiB0cnVlYCk7IGFueSBvdGhlciBjYWxsZXIgZ2V0cyB0aGUgcmFjZSBoZXJlLCBzbyB0aGUgc2VyaWVzIG5ldmVyIHdhaXRzIG9uIGFuXG4gKiBhdHRlbXB0IHBhc3QgaXRzIGNhcC5cbiAqXG4gKiBDQUxMUyAoUDIpLiBUaGUgc2FtZSBsb29wIHJ1bnMgYSBjYWxsIGEgc3RhZ2UgbWFrZXMgKGBhdHRlbXB0L2NhbGwudHMgwrcgcnVuQ2FsbGAsIGtpbmQgYCdjYWxsJ2AsIGl0cyBgdGFyZ2V0YCBvblxuICogZXZlcnkgcmVjb3JkKSBhbmQgdGhlIHN0YW5kYWxvbmUgYGF0dGVtcHQoKWAuIEFuIGF0dGVtcHQncyBjYXAgaXMgdGhlIERFQURMSU5FIG9mIGV2ZXJ5IGNhbGwgbWFkZSBpbnNpZGUgaXQsIHNvXG4gKiB0aGUgY2FwJ3MgcmVhc29uIGlzIGJyYW5kZWQgYSB0aW1lIGxpbWl0IChgYXR0ZW1wdC9kZWFkbGluZS50cyDCtyBtYXJrVGltZUxpbWl0YCk6IGEgY2FsbCBjdXQgYnkgaXRzIHN0YWdlXG4gKiBhdHRlbXB0J3MgY2FwIHRpbWVkIG91dCwgaXQgd2FzIG5vdCBjYW5jZWxsZWQuIGBhdHRlbXB0RW5kc0F0YCBzYXlzIHdoZW4gYW4gYXR0ZW1wdCBtdXN0IGVuZDsgYW4gYGludGVycnVwdCgpYFxuICogdGhyb3duIGluc2lkZSBhIGNhbGwgaXMgYSBwYXVzZSwgbGlrZSBhIGBQYXVzZVNpZ25hbGAg4oCUIG5ldmVyIHJldHJpZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBpc0ludGVycnVwdFNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL2ludGVycnVwdC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuLi90aW1lcnMvbG9uZ1RpbWVvdXQuanMnO1xuaW1wb3J0IHsgYW55U2lnbmFsIH0gZnJvbSAnLi9hbnlTaWduYWwuanMnO1xuaW1wb3J0IHsgZXJyb3JDYXRlZ29yeSwgdGVybWluYWxDYXRlZ29yeSB9IGZyb20gJy4vY2F0ZWdvcnkuanMnO1xuaW1wb3J0IHsgaXNDYW5jZWxsZWQsIGlzRGVhZGxpbmVSZWFzb24sIG1hcmtUaW1lTGltaXQsIHJlYWREZWFkbGluZSB9IGZyb20gJy4vZGVhZGxpbmUuanMnO1xuaW1wb3J0IHsgZGVjaWRlQXR0ZW1wdCwgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBlZmZlY3RPZiwgcmVjb3JkZWRLZXlPZiwgcmVmdXNlS2V5bGVzc1JldHJ5LCB1bmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0VGltZW91dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcsIGF0dGVtcHRUaW1lb3V0TXMsIGNhcHBlZFdhaXRNcyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB7IGZyZWV6ZURlZXAsIHJlY29yZGVkRXJyb3IgfSBmcm9tICcuL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogV2hhdCBhIHNlcmllcyByZXBvcnRzLCBhbmQgdGhlIGVuZ2luZSdzIGJldHdlZW4tYXR0ZW1wdCBzdGVwLiBFdmVyeSBtZW1iZXIgaXMgb3B0aW9uYWwuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSdW5PcHRpb25zIHtcbiAgLyoqIFRoZSBzZXJpZXMgZXZlcnkgcmVjb3JkIG5hbWVzIOKAlCBmb3IgYSBzdGFnZSBhdHRlbXB0LCBpdHMgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYC4gKi9cbiAgcmVhZG9ubHkgc2VyaWVzOiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGAnc3RhZ2UnYC4gKi9cbiAgcmVhZG9ubHkga2luZD86IEF0dGVtcHRLaW5kO1xuICAvKiogVGhlIG91dHNpZGUgdGFyZ2V0IGV2ZXJ5IHJlY29yZCBuYW1lcyDigJQgYSBjYWxsJ3MgKGAkY2FsbGAsIGBhdHRlbXB0KClgKTsgYWJzZW50IGZvciBhIHN0YWdlIGF0dGVtcHQuICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBzaWduYWwuIE9uY2UgaXQgaGFzIGFib3J0ZWQgKG90aGVyIHRoYW4gYXQgdGhlIGRlYWRsaW5lKSwgcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXNcbiAgICogKGByZWFzb246ICdhYm9ydGVkJ2ApOyBpdCBjdXRzIGEgd2FpdCBzaG9ydC4gQW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyByZWFzb24gaXMgcmVjb3JkZWQgYCdhYm9ydGVkJ2Ag4oCUIG9yXG4gICAqIGAndGltZW91dCdgIHdoZW4gdGhlIHJlYXNvbiBpcyB0aGUgZGVhZGxpbmUncyAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMuIEV2ZXJ5IGF0dGVtcHQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIGxlZnQ7IHJ1bGUgNiBzdG9wcyBhIHNlcmllcyB3aG9zZVxuICAgKiBuZXh0IHdhaXQgd291bGQgb3V0bGFzdCBpdCAoYG5vLXRpbWUtbGVmdGApLiBBYnNlbnQgKG9yIG5vdCBmaW5pdGUpID0gbm8gZGVhZGxpbmU6IHRoZSB0aW1lIGxlZnQgaXMgYEluZmluaXR5YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKiogVGhlIGNsb2NrLCBlcG9jaCBtaWxsaXNlY29uZHMuIERlZmF1bHQgYERhdGUubm93YC4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogVGhlIHNlcnZlZCBmb3JtIG9mIGEgZmFpbGVkIGF0dGVtcHQncyBlcnJvci4gRGVmYXVsdCBgZXh0cmFjdEVycm9ySW5mb2AgKG5vIHJlZGFjdGlvbiBydWxlKS4gKi9cbiAgcmVhZG9ubHkgc2VydmU/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=
@@ -22,19 +22,29 @@
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.setTimeoutDriver = exports.createSetTimeoutDriver = void 0;
25
+ const longTimeout_js_1 = require("../../timers/longTimeout.js");
25
26
  const runChild_js_1 = require("../runChild.js");
26
27
  const batch_js_1 = require("./batch.js");
27
28
  function createSetTimeoutDriver(opts = {}) {
28
29
  const delayMs = opts.delayMs ?? 0;
30
+ // `Infinity` would never flush the batch (a silent hang) and `NaN` names no delay: refused when the driver is made,
31
+ // by the field and the shape it needs — never the value (a TypeError for a non-number, a RangeError otherwise).
32
+ const rule = 'createSetTimeoutDriver: delayMs must be a finite number of milliseconds';
33
+ if (typeof delayMs !== 'number')
34
+ throw new TypeError(rule);
35
+ if (!Number.isFinite(delayMs))
36
+ throw new RangeError(rule);
29
37
  const runChild = opts.runChild ?? runChild_js_1.defaultRunChild;
30
38
  return {
31
39
  name: delayMs === 0 ? 'set-timeout' : `set-timeout-${delayMs}ms`,
32
40
  capabilities: { browserSafe: true, nodeSafe: true, edgeSafe: true },
33
- schedule: (0, batch_js_1.createBatchSchedule)((flush) => setTimeout(flush, delayMs), runChild),
41
+ schedule: (0, batch_js_1.createBatchSchedule)((flush) => {
42
+ (0, longTimeout_js_1.setLongTimeout)(flush, delayMs);
43
+ }, runChild),
34
44
  };
35
45
  }
36
46
  exports.createSetTimeoutDriver = createSetTimeoutDriver;
37
47
  /** Default singleton — zero-delay (next macrotask). For configurable
38
48
  * delays, use `createSetTimeoutDriver({ delayMs })`. */
39
49
  exports.setTimeoutDriver = createSetTimeoutDriver();
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0VGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFFSCxnREFBbUU7QUFFbkUseUNBQWlEO0FBVWpELFNBQWdCLHNCQUFzQixDQUFDLE9BQWdDLEVBQUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSw2QkFBZSxDQUFDO0lBQ2xELE9BQU87UUFDTCxJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxlQUFlLE9BQU8sSUFBSTtRQUNoRSxZQUFZLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtRQUNuRSxRQUFRLEVBQUUsSUFBQSw4QkFBbUIsRUFBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUM7QUFSRCx3REFRQztBQUVEO3lEQUN5RDtBQUM1QyxRQUFBLGdCQUFnQixHQUFpQixzQkFBc0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZXRhY2gvZHJpdmVycy9zZXRUaW1lb3V0LnRzIOKAlCBEZWZlciBkZXRhY2hlZCB3b3JrIHZpYSBgc2V0VGltZW91dCguLi4sIGRlbGF5TXMpYC5cbiAqXG4gKiBQYXR0ZXJuOiAgUHJvZHVjZXItY29uc3VtZXIgYmF0Y2ggZmx1c2g7IGRlZmVycmFsIG1lY2hhbmlzbSBpc1xuICogICAgICAgICAgIGBzZXRUaW1lb3V0YCB3aXRoIGEgY29uZmlndXJhYmxlIGRlbGF5IChkZWZhdWx0IGAwYCkuXG4gKiBSb2xlOiAgICAgQ3Jvc3MtcnVudGltZSBcIm5leHQgbWFjcm90YXNrXCIgZHJpdmVyLiBXb3JrcyBpbiBicm93c2VycyxcbiAqICAgICAgICAgICBOb2RlLmpzLCBEZW5vLCBDbG91ZGZsYXJlIFdvcmtlcnMsIEJ1biwgZXRjLlxuICpcbiAqIFdoZW4gdG8gcGljayB0aGlzOlxuICogICAtIENvbnN1bWVyIHdhbnRzIGEgU1BFQ0lGSUMgZGVsYXkgKGUuZy4gXCJzaGlwIHRlbGVtZXRyeSBpbiA1XG4gKiAgICAgc2Vjb25kcywgYmF0Y2hlZFwiKSDigJQgcGFzcyBgY3JlYXRlU2V0VGltZW91dERyaXZlcih7IGRlbGF5TXM6IDUwMDAgfSlgXG4gKiAgIC0gQ3Jvc3MtcnVudGltZSBkZXRhY2ggd2hlcmUgYHNldEltbWVkaWF0ZWAgaXNuJ3QgYXZhaWxhYmxlXG4gKiAgIC0gQ29hbGVzY2luZyBoaWdoLWZyZXF1ZW5jeSBldmVudHMgaW50byBhIGxvdy1mcmVxdWVuY3kgZmx1c2hcbiAqXG4gKiBDYXZlYXRzOlxuICogICAtIE5vdCBmb3IgbG93LWxhdGVuY3kgaG90IHBhdGhzIOKAlCBtaW5pbXVtIGRlbGF5IGlzIH40bXMgaW5cbiAqICAgICBicm93c2VycyBwZXIgdGhlIEhUTUw1IHNwZWMsIH4xbXMgaW4gTm9kZS4gVXNlXG4gKiAgICAgYG1pY3JvdGFza0JhdGNoRHJpdmVyYCBmb3Igc3ViLW1zIHNjaGVkdWxpbmcuXG4gKiAgIC0gQnJvd3NlciB0YWIgZnJlZXppbmcgLyB0aHJvdHRsaW5nIGNhbiBleHRlbmQgdGhlIGRlbGF5XG4gKiAgICAgc2lnbmlmaWNhbnRseS4gRG9uJ3QgcmVseSBvbiBwcmVjaXNlIHRpbWluZy5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJhdGNoU2NoZWR1bGUgfSBmcm9tICcuL2JhdGNoLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXRUaW1lb3V0RHJpdmVyT3B0aW9ucyB7XG4gIC8qKiBNaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZmx1c2hpbmcgdGhlIGJhdGNoLiBEZWZhdWx0IDBcbiAgICogIChuZXh0IG1hY3JvdGFzaykuICovXG4gIHJlYWRvbmx5IGRlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gYHJ1bkNoaWxkYC4gRGVmYXVsdHMgdG8gc3Bhd25pbmcgYSBgRmxvd0NoYXJ0RXhlY3V0b3JgLiAqL1xuICByZWFkb25seSBydW5DaGlsZD86IENoaWxkUnVubmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0VGltZW91dERyaXZlcihvcHRzOiBTZXRUaW1lb3V0RHJpdmVyT3B0aW9ucyA9IHt9KTogRGV0YWNoRHJpdmVyIHtcbiAgY29uc3QgZGVsYXlNcyA9IG9wdHMuZGVsYXlNcyA/PyAwO1xuICBjb25zdCBydW5DaGlsZCA9IG9wdHMucnVuQ2hpbGQgPz8gZGVmYXVsdFJ1bkNoaWxkO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGRlbGF5TXMgPT09IDAgPyAnc2V0LXRpbWVvdXQnIDogYHNldC10aW1lb3V0LSR7ZGVsYXlNc31tc2AsXG4gICAgY2FwYWJpbGl0aWVzOiB7IGJyb3dzZXJTYWZlOiB0cnVlLCBub2RlU2FmZTogdHJ1ZSwgZWRnZVNhZmU6IHRydWUgfSxcbiAgICBzY2hlZHVsZTogY3JlYXRlQmF0Y2hTY2hlZHVsZSgoZmx1c2gpID0+IHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpLCBydW5DaGlsZCksXG4gIH07XG59XG5cbi8qKiBEZWZhdWx0IHNpbmdsZXRvbiDigJQgemVyby1kZWxheSAobmV4dCBtYWNyb3Rhc2spLiBGb3IgY29uZmlndXJhYmxlXG4gKiAgZGVsYXlzLCB1c2UgYGNyZWF0ZVNldFRpbWVvdXREcml2ZXIoeyBkZWxheU1zIH0pYC4gKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lb3V0RHJpdmVyOiBEZXRhY2hEcml2ZXIgPSBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKCk7XG4iXX0=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0VGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFFSCxnRUFBNkQ7QUFDN0QsZ0RBQW1FO0FBRW5FLHlDQUFpRDtBQVlqRCxTQUFnQixzQkFBc0IsQ0FBQyxPQUFnQyxFQUFFO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQ2xDLG9IQUFvSDtJQUNwSCxnSEFBZ0g7SUFDaEgsTUFBTSxJQUFJLEdBQUcseUVBQXlFLENBQUM7SUFDdkYsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksNkJBQWUsQ0FBQztJQUNsRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxPQUFPLElBQUk7UUFDaEUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkUsUUFBUSxFQUFFLElBQUEsOEJBQW1CLEVBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QyxJQUFBLCtCQUFjLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsRUFBRSxRQUFRLENBQUM7S0FDYixDQUFDO0FBQ0osQ0FBQztBQWZELHdEQWVDO0FBRUQ7eURBQ3lEO0FBQzVDLFFBQUEsZ0JBQWdCLEdBQWlCLHNCQUFzQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRldGFjaC9kcml2ZXJzL3NldFRpbWVvdXQudHMg4oCUIERlZmVyIGRldGFjaGVkIHdvcmsgdmlhIGBzZXRUaW1lb3V0KC4uLiwgZGVsYXlNcylgLlxuICpcbiAqIFBhdHRlcm46ICBQcm9kdWNlci1jb25zdW1lciBiYXRjaCBmbHVzaDsgZGVmZXJyYWwgbWVjaGFuaXNtIGlzXG4gKiAgICAgICAgICAgYHNldFRpbWVvdXRgIHdpdGggYSBjb25maWd1cmFibGUgZGVsYXkgKGRlZmF1bHQgYDBgKS5cbiAqIFJvbGU6ICAgICBDcm9zcy1ydW50aW1lIFwibmV4dCBtYWNyb3Rhc2tcIiBkcml2ZXIuIFdvcmtzIGluIGJyb3dzZXJzLFxuICogICAgICAgICAgIE5vZGUuanMsIERlbm8sIENsb3VkZmxhcmUgV29ya2VycywgQnVuLCBldGMuXG4gKlxuICogV2hlbiB0byBwaWNrIHRoaXM6XG4gKiAgIC0gQ29uc3VtZXIgd2FudHMgYSBTUEVDSUZJQyBkZWxheSAoZS5nLiBcInNoaXAgdGVsZW1ldHJ5IGluIDVcbiAqICAgICBzZWNvbmRzLCBiYXRjaGVkXCIpIOKAlCBwYXNzIGBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKHsgZGVsYXlNczogNTAwMCB9KWBcbiAqICAgLSBDcm9zcy1ydW50aW1lIGRldGFjaCB3aGVyZSBgc2V0SW1tZWRpYXRlYCBpc24ndCBhdmFpbGFibGVcbiAqICAgLSBDb2FsZXNjaW5nIGhpZ2gtZnJlcXVlbmN5IGV2ZW50cyBpbnRvIGEgbG93LWZyZXF1ZW5jeSBmbHVzaFxuICpcbiAqIENhdmVhdHM6XG4gKiAgIC0gTm90IGZvciBsb3ctbGF0ZW5jeSBob3QgcGF0aHMg4oCUIG1pbmltdW0gZGVsYXkgaXMgfjRtcyBpblxuICogICAgIGJyb3dzZXJzIHBlciB0aGUgSFRNTDUgc3BlYywgfjFtcyBpbiBOb2RlLiBVc2VcbiAqICAgICBgbWljcm90YXNrQmF0Y2hEcml2ZXJgIGZvciBzdWItbXMgc2NoZWR1bGluZy5cbiAqICAgLSBCcm93c2VyIHRhYiBmcmVlemluZyAvIHRocm90dGxpbmcgY2FuIGV4dGVuZCB0aGUgZGVsYXlcbiAqICAgICBzaWduaWZpY2FudGx5LiBEb24ndCByZWx5IG9uIHByZWNpc2UgdGltaW5nLlxuICovXG5cbmltcG9ydCB7IHNldExvbmdUaW1lb3V0IH0gZnJvbSAnLi4vLi4vdGltZXJzL2xvbmdUaW1lb3V0LmpzJztcbmltcG9ydCB7IHR5cGUgQ2hpbGRSdW5uZXIsIGRlZmF1bHRSdW5DaGlsZCB9IGZyb20gJy4uL3J1bkNoaWxkLmpzJztcbmltcG9ydCB0eXBlIHsgRGV0YWNoRHJpdmVyIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQmF0Y2hTY2hlZHVsZSB9IGZyb20gJy4vYmF0Y2guanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNldFRpbWVvdXREcml2ZXJPcHRpb25zIHtcbiAgLyoqIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBmbHVzaGluZyB0aGUgYmF0Y2gg4oCUIGEgZmluaXRlIG51bWJlci5cbiAgICogIERlZmF1bHQgMCAobmV4dCBtYWNyb3Rhc2spOyBhIG5lZ2F0aXZlIGRlbGF5IHdhaXRzIG5vdGhpbmcsIGFzIHRoZVxuICAgKiAgaG9zdCB0aW1lciBkb2VzLiBBIGRlbGF5IHBhc3QgMl4zMSDiiJIgMSBtcyBpcyB3YWl0ZWQgaW4gZnVsbCAodGhlIG9uZVxuICAgKiAgbG9uZy10aW1lciBsYXcsIGB0aW1lcnMvbG9uZ1RpbWVvdXQudHNgKSwgbmV2ZXIgY3V0IHRvIDEgbXMuICovXG4gIHJlYWRvbmx5IGRlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gYHJ1bkNoaWxkYC4gRGVmYXVsdHMgdG8gc3Bhd25pbmcgYSBgRmxvd0NoYXJ0RXhlY3V0b3JgLiAqL1xuICByZWFkb25seSBydW5DaGlsZD86IENoaWxkUnVubmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0VGltZW91dERyaXZlcihvcHRzOiBTZXRUaW1lb3V0RHJpdmVyT3B0aW9ucyA9IHt9KTogRGV0YWNoRHJpdmVyIHtcbiAgY29uc3QgZGVsYXlNcyA9IG9wdHMuZGVsYXlNcyA/PyAwO1xuICAvLyBgSW5maW5pdHlgIHdvdWxkIG5ldmVyIGZsdXNoIHRoZSBiYXRjaCAoYSBzaWxlbnQgaGFuZykgYW5kIGBOYU5gIG5hbWVzIG5vIGRlbGF5OiByZWZ1c2VkIHdoZW4gdGhlIGRyaXZlciBpcyBtYWRlLFxuICAvLyBieSB0aGUgZmllbGQgYW5kIHRoZSBzaGFwZSBpdCBuZWVkcyDigJQgbmV2ZXIgdGhlIHZhbHVlIChhIFR5cGVFcnJvciBmb3IgYSBub24tbnVtYmVyLCBhIFJhbmdlRXJyb3Igb3RoZXJ3aXNlKS5cbiAgY29uc3QgcnVsZSA9ICdjcmVhdGVTZXRUaW1lb3V0RHJpdmVyOiBkZWxheU1zIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyc7XG4gIGlmICh0eXBlb2YgZGVsYXlNcyAhPT0gJ251bWJlcicpIHRocm93IG5ldyBUeXBlRXJyb3IocnVsZSk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5TXMpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihydWxlKTtcbiAgY29uc3QgcnVuQ2hpbGQgPSBvcHRzLnJ1bkNoaWxkID8/IGRlZmF1bHRSdW5DaGlsZDtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBkZWxheU1zID09PSAwID8gJ3NldC10aW1lb3V0JyA6IGBzZXQtdGltZW91dC0ke2RlbGF5TXN9bXNgLFxuICAgIGNhcGFiaWxpdGllczogeyBicm93c2VyU2FmZTogdHJ1ZSwgbm9kZVNhZmU6IHRydWUsIGVkZ2VTYWZlOiB0cnVlIH0sXG4gICAgc2NoZWR1bGU6IGNyZWF0ZUJhdGNoU2NoZWR1bGUoKGZsdXNoKSA9PiB7XG4gICAgICBzZXRMb25nVGltZW91dChmbHVzaCwgZGVsYXlNcyk7XG4gICAgfSwgcnVuQ2hpbGQpLFxuICB9O1xufVxuXG4vKiogRGVmYXVsdCBzaW5nbGV0b24g4oCUIHplcm8tZGVsYXkgKG5leHQgbWFjcm90YXNrKS4gRm9yIGNvbmZpZ3VyYWJsZVxuICogIGRlbGF5cywgdXNlIGBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKHsgZGVsYXlNcyB9KWAuICovXG5leHBvcnQgY29uc3Qgc2V0VGltZW91dERyaXZlcjogRGV0YWNoRHJpdmVyID0gY3JlYXRlU2V0VGltZW91dERyaXZlcigpO1xuIl19
@@ -26,6 +26,7 @@
26
26
  */
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
28
  exports.flushAllDetached = void 0;
29
+ const longTimeout_js_1 = require("../timers/longTimeout.js");
29
30
  const registry_js_1 = require("./registry.js");
30
31
  /**
31
32
  * Wait for every in-flight detached handle to reach a terminal state.
@@ -70,15 +71,16 @@ async function flushAllDetached(opts) {
70
71
  seen.add(id);
71
72
  const handles = newIds.map((id) => (0, registry_js_1.lookup)(id)).filter((h) => h !== undefined);
72
73
  // Race the drain against the per-iteration timeout. We use a
73
- // `'timeout'` sentinel on the timeout side so the type narrows.
74
- let timerId;
74
+ // `'timeout'` sentinel on the timeout side so the type narrows. The
75
+ // timer is the one long-timer law's (`timers/longTimeout.ts`): no
76
+ // timer for `Infinity`, never a 1 ms timer for a long limit.
77
+ let cancelTimer = () => undefined;
75
78
  const timeoutPromise = new Promise((resolve) => {
76
- timerId = setTimeout(() => resolve('__detach_timeout__'), remainingMs);
79
+ cancelTimer = (0, longTimeout_js_1.setLongTimeout)(() => resolve('__detach_timeout__'), remainingMs);
77
80
  });
78
81
  const drainPromise = Promise.allSettled(handles.map((h) => h.wait()));
79
82
  const result = await Promise.race([drainPromise, timeoutPromise]);
80
- if (timerId !== undefined)
81
- clearTimeout(timerId);
83
+ cancelTimer();
82
84
  if (result === '__detach_timeout__') {
83
85
  return { done, failed, pending: (0, registry_js_1.size)() };
84
86
  }
@@ -92,4 +94,4 @@ async function flushAllDetached(opts) {
92
94
  return { done, failed, pending: 0 };
93
95
  }
94
96
  exports.flushAllDetached = flushAllDetached;
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC9mbHVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRzs7O0FBRUgsK0NBQWtEO0FBc0JsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUFDLElBQW1CO0lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxTQUFTLElBQUksTUFBTSxDQUFDO0lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLE9BQU8sSUFBQSxrQkFBSSxHQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEIsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksV0FBVyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBQSxrQkFBSSxHQUFFLEVBQUUsQ0FBQztRQUUvRCxpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLGdDQUFnQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFBLGlCQUFHLEdBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixpRUFBaUU7WUFDakUsK0RBQStEO1lBQy9ELE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFBLG9CQUFNLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQXFCLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7UUFFakcsNkRBQTZEO1FBQzdELGdFQUFnRTtRQUNoRSxJQUFJLE9BQWtELENBQUM7UUFDdkQsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQXVCLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkUsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpELElBQUksTUFBTSxLQUFLLG9CQUFvQixFQUFFLENBQUM7WUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQUksR0FBRSxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVc7Z0JBQUUsSUFBSSxFQUFFLENBQUM7O2dCQUNoQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBN0NELDRDQTZDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2ZsdXNoLnRzIOKAlCBEcmFpbiBldmVyeSBpbi1mbGlnaHQgZGV0YWNoZWQgaGFuZGxlIHRvIHRlcm1pbmFsLlxuICpcbiAqIFBhdHRlcm46ICBEcmFpbi1sb29wIHdpdGggZGVhZGxpbmUuIFNhbWUgc2hhcGUgYXMgYSBncmFjZWZ1bCBIVFRQXG4gKiAgICAgICAgICAgc2VydmVyIHNodXRkb3duOiBzbmFwc2hvdCB0aGUgcXVldWUsIGF3YWl0IGV2ZXJ5dGhpbmcgaW5cbiAqICAgICAgICAgICBmbGlnaHQsIHJlcGVhdCB1bnRpbCBlbXB0eSBvciBkZWFkbGluZS5cbiAqIFJvbGU6ICAgICBHcmFjZWZ1bC1zaHV0ZG93biBob29rIGZvciBjb25zdW1lcnMgd2hvIGxhdW5jaGVkXG4gKiAgICAgICAgICAgZmlyZS1hbmQtZm9yZ2V0IHdvcmsgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGFjdHVhbGx5XG4gKiAgICAgICAgICAgZmx1c2hlZCBiZWZvcmUgZXhpdGluZyAoc2VydmVyIHN0b3AsIHRlc3QgY2xlYW51cCwgZXRjLikuXG4gKlxuICogV2h5IGl0ZXJhdGUgKG5vdCBzaW5nbGUgUHJvbWlzZS5hbGwgb3ZlciBhIHNuYXBzaG90KTpcbiAqICAgLSBBIGNoaWxkIHN0YWdlIGNhbiBpdHNlbGYgY2FsbCBgZGV0YWNoQW5kRm9yZ2V0YCB3aGlsZSBydW5uaW5nIOKAlFxuICogICAgIG5ldyBoYW5kbGVzIGFycml2ZSBXSElMRSB3ZSdyZSBmbHVzaGluZy4gQSBzaW5nbGUgc25hcHNob3Qgd291bGRcbiAqICAgICBtaXNzIHRoZW0uIExvb3BpbmcgdW50aWwgYHNpemUoKSA9PT0gMGAgZHJhaW5zIHRyYW5zaXRpdmVseS5cbiAqXG4gKiBXaHkgZGVkdXBlIHZpYSBgc2VlbmAgU2V0OlxuICogICAtIEhhbmRsZXMgYWxyZWFkeSB0ZXJtaW5hbCAoYnV0IG5vdCB5ZXQgYHVucmVnaXN0ZXJgZWQgYnkgdGhlaXJcbiAqICAgICBkcml2ZXIncyBmaW5hbGx5LWJsb2NrKSBjYW4gcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzLlxuICogICAgIFdpdGhvdXQgZGVkdXBlLCB0aGUgYGRvbmVgIGNvdW50ZXIgd291bGQgZG91YmxlLWNvdW50IHRoZW0uXG4gKlxuICogV2h5IGBQcm9taXNlLmFsbFNldHRsZWRgIChub3QgYFByb21pc2UuYWxsYCk6XG4gKiAgIC0gT25lIGhhbmRsZSdzIHJlamVjdGlvbiBtdXN0IE5PVCBhYm9ydCB0aGUgcmVzdC4gQSBmYWlsZWQgY2hpbGRcbiAqICAgICBpcyBub3JtYWwgKGl0J3Mgd2h5IGB3YWl0KClgIHJlamVjdHMpOyB3ZSBzdGlsbCB3YW50IHRvIGRyYWluXG4gKiAgICAgdGhlIHNpYmxpbmdzLlxuICovXG5cbmltcG9ydCB7IGlkcywgbG9va3VwLCBzaXplIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoUmVzdWx0IHtcbiAgLyoqIEhhbmRsZXMgd2hvc2UgYHdhaXQoKWAgd2UgRVhQTElDSVRMWSBhd2FpdGVkIGFuZCBzYXcgZnVsZmlsbGVkLlxuICAgKiAgQmVzdC1lZmZvcnQgY291bnQg4oCUIGEgY2hpbGQgdGhhdCBjb21wbGV0ZXMgaW5zaWRlIGFub3RoZXInc1xuICAgKiAgYHdhaXQoKWAgbWF5IGZpbmlzaCAoYW5kIHVucmVnaXN0ZXIpIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG9cbiAgICogIGF3YWl0IGl0IGRpcmVjdGx5LiBUaGUgRFJBSU4gaXMgc3RpbGwgZ3VhcmFudGVlZCAocmVnaXN0cnkgZW1wdHlcbiAgICogIG9uIHJldHVybik7IG9ubHkgdGhlIENPVU5UIGlzIGFwcHJveGltYXRlLiAqL1xuICByZWFkb25seSBkb25lOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHdob3NlIGB3YWl0KClgIHJlamVjdGVkLiBTYW1lIGJlc3QtZWZmb3J0IHNlbWFudGljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHN0aWxsIGluLWZsaWdodCB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgaW5kaWNhdGVzXG4gICAqICBhIHN1Y2Nlc3NmdWwgKGNvbXBsZXRlKSBkcmFpbiDigJQgcmVnaXN0cnkgd2FzIGVtcHR5IG9uIHJldHVybi4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoT3B0aW9ucyB7XG4gIC8qKiBNYXggd2FsbC1jbG9jayB0byBzcGVuZCBkcmFpbmluZywgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IDMwcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdhaXQgZm9yIGV2ZXJ5IGluLWZsaWdodCBkZXRhY2hlZCBoYW5kbGUgdG8gcmVhY2ggYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqIFJldHVybnMgY291bnRzIGZvciBkaWFnbm9zdGljcy4gUFJPQ0VTUy1XSURFIOKAlCBkcmFpbnMgZXZlcnkgZHJpdmVyXG4gKiBhY3Jvc3MgZXZlcnkgZXhlY3V0b3IuIEZvciBwZXItZXhlY3V0b3Igc2NvcGluZywgY29uc3VtZXJzIHNob3VsZFxuICogY29sbGVjdCB0aGVpciBvd24gaGFuZGxlcyBmcm9tIGBleGVjdXRvci5kZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAqIGNhbGxzIGFuZCBhd2FpdCBgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5dLm1hcChoID0+IGgud2FpdCgpKSlgXG4gKiB0aGVtc2VsdmVzLlxuICpcbiAqIEBleGFtcGxlIEdyYWNlZnVsIHNlcnZlciBzaHV0ZG93blxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZmx1c2hBbGxEZXRhY2hlZCB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gKlxuICogcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAqICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmbHVzaEFsbERldGFjaGVkKHsgdGltZW91dE1zOiAxMF8wMDAgfSk7XG4gKiAgIGNvbnNvbGUubG9nKGBEcmFpbmVkICR7c3RhdHMuZG9uZX0gZG9uZSwgJHtzdGF0cy5mYWlsZWR9IGZhaWxlZCwgJHtzdGF0cy5wZW5kaW5nfSBwZW5kaW5nLmApO1xuICogICBwcm9jZXNzLmV4aXQoc3RhdHMucGVuZGluZyA9PT0gMCA/IDAgOiAxKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaEFsbERldGFjaGVkKG9wdHM/OiBGbHVzaE9wdGlvbnMpOiBQcm9taXNlPEZsdXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IG9wdHM/LnRpbWVvdXRNcyA/PyAzMF8wMDA7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGRvbmUgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcblxuICB3aGlsZSAoc2l6ZSgpID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dE1zIC0gKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGlmIChyZW1haW5pbmdNcyA8PSAwKSByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHNpemUoKSB9O1xuXG4gICAgLy8gU25hcHNob3Qgb2YgTkVXICh1bnNlZW4pIGhhbmRsZXMuIEV4aXN0aW5nIHRlcm1pbmFsLWJ1dC1zdGlsbC1cbiAgICAvLyByZWdpc3RlcmVkIGhhbmRsZXMgcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzOyB0aGUgc2VlblxuICAgIC8vIHNldCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcuXG4gICAgY29uc3QgbmV3SWRzID0gaWRzKCkuZmlsdGVyKChpZCkgPT4gIXNlZW4uaGFzKGlkKSk7XG4gICAgaWYgKG5ld0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5IGlzIGFscmVhZHkgYXdhaXRlZCDigJQgeWllbGQgb25jZSBhbmRcbiAgICAgIC8vIHJlLWNoZWNrLiBUaGUgZHJpdmVyJ3MgdW5yZWdpc3Rlci1pbi1maW5hbGx5IGhhc24ndCBydW4geWV0LlxuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpZCBvZiBuZXdJZHMpIHNlZW4uYWRkKGlkKTtcblxuICAgIGNvbnN0IGhhbmRsZXMgPSBuZXdJZHMubWFwKChpZCkgPT4gbG9va3VwKGlkKSkuZmlsdGVyKChoKTogaCBpcyBEZXRhY2hIYW5kbGUgPT4gaCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIFJhY2UgdGhlIGRyYWluIGFnYWluc3QgdGhlIHBlci1pdGVyYXRpb24gdGltZW91dC4gV2UgdXNlIGFcbiAgICAvLyBgJ3RpbWVvdXQnYCBzZW50aW5lbCBvbiB0aGUgdGltZW91dCBzaWRlIHNvIHRoZSB0eXBlIG5hcnJvd3MuXG4gICAgbGV0IHRpbWVySWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8J19fZGV0YWNoX3RpbWVvdXRfXyc+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCdfX2RldGFjaF90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IGRyYWluUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2RyYWluUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cbiAgICBpZiAocmVzdWx0ID09PSAnX19kZXRhY2hfdGltZW91dF9fJykge1xuICAgICAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiBzaXplKCkgfTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHJlc3VsdCkge1xuICAgICAgaWYgKHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJykgZG9uZSsrO1xuICAgICAgZWxzZSBmYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IDAgfTtcbn1cbiJdfQ==
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC9mbHVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRzs7O0FBRUgsNkRBQTBEO0FBQzFELCtDQUFrRDtBQTJCbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNJLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxJQUFtQjtJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsU0FBUyxJQUFJLE1BQU0sQ0FBQztJQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFZixPQUFPLElBQUEsa0JBQUksR0FBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLFdBQVcsSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQUksR0FBRSxFQUFFLENBQUM7UUFFL0QsaUVBQWlFO1FBQ2pFLGlFQUFpRTtRQUNqRSxnQ0FBZ0M7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxpQkFBRyxHQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsaUVBQWlFO1lBQ2pFLCtEQUErRDtZQUMvRCxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixTQUFTO1FBQ1gsQ0FBQztRQUNELEtBQUssTUFBTSxFQUFFLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBQSxvQkFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFxQixFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBRWpHLDZEQUE2RDtRQUM3RCxvRUFBb0U7UUFDcEUsa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUM3RCxJQUFJLFdBQVcsR0FBZSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQXVCLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkUsV0FBVyxHQUFHLElBQUEsK0JBQWMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNsRSxXQUFXLEVBQUUsQ0FBQztRQUVkLElBQUksTUFBTSxLQUFLLG9CQUFvQixFQUFFLENBQUM7WUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQUksR0FBRSxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVc7Z0JBQUUsSUFBSSxFQUFFLENBQUM7O2dCQUNoQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBL0NELDRDQStDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2ZsdXNoLnRzIOKAlCBEcmFpbiBldmVyeSBpbi1mbGlnaHQgZGV0YWNoZWQgaGFuZGxlIHRvIHRlcm1pbmFsLlxuICpcbiAqIFBhdHRlcm46ICBEcmFpbi1sb29wIHdpdGggZGVhZGxpbmUuIFNhbWUgc2hhcGUgYXMgYSBncmFjZWZ1bCBIVFRQXG4gKiAgICAgICAgICAgc2VydmVyIHNodXRkb3duOiBzbmFwc2hvdCB0aGUgcXVldWUsIGF3YWl0IGV2ZXJ5dGhpbmcgaW5cbiAqICAgICAgICAgICBmbGlnaHQsIHJlcGVhdCB1bnRpbCBlbXB0eSBvciBkZWFkbGluZS5cbiAqIFJvbGU6ICAgICBHcmFjZWZ1bC1zaHV0ZG93biBob29rIGZvciBjb25zdW1lcnMgd2hvIGxhdW5jaGVkXG4gKiAgICAgICAgICAgZmlyZS1hbmQtZm9yZ2V0IHdvcmsgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGFjdHVhbGx5XG4gKiAgICAgICAgICAgZmx1c2hlZCBiZWZvcmUgZXhpdGluZyAoc2VydmVyIHN0b3AsIHRlc3QgY2xlYW51cCwgZXRjLikuXG4gKlxuICogV2h5IGl0ZXJhdGUgKG5vdCBzaW5nbGUgUHJvbWlzZS5hbGwgb3ZlciBhIHNuYXBzaG90KTpcbiAqICAgLSBBIGNoaWxkIHN0YWdlIGNhbiBpdHNlbGYgY2FsbCBgZGV0YWNoQW5kRm9yZ2V0YCB3aGlsZSBydW5uaW5nIOKAlFxuICogICAgIG5ldyBoYW5kbGVzIGFycml2ZSBXSElMRSB3ZSdyZSBmbHVzaGluZy4gQSBzaW5nbGUgc25hcHNob3Qgd291bGRcbiAqICAgICBtaXNzIHRoZW0uIExvb3BpbmcgdW50aWwgYHNpemUoKSA9PT0gMGAgZHJhaW5zIHRyYW5zaXRpdmVseS5cbiAqXG4gKiBXaHkgZGVkdXBlIHZpYSBgc2VlbmAgU2V0OlxuICogICAtIEhhbmRsZXMgYWxyZWFkeSB0ZXJtaW5hbCAoYnV0IG5vdCB5ZXQgYHVucmVnaXN0ZXJgZWQgYnkgdGhlaXJcbiAqICAgICBkcml2ZXIncyBmaW5hbGx5LWJsb2NrKSBjYW4gcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzLlxuICogICAgIFdpdGhvdXQgZGVkdXBlLCB0aGUgYGRvbmVgIGNvdW50ZXIgd291bGQgZG91YmxlLWNvdW50IHRoZW0uXG4gKlxuICogV2h5IGBQcm9taXNlLmFsbFNldHRsZWRgIChub3QgYFByb21pc2UuYWxsYCk6XG4gKiAgIC0gT25lIGhhbmRsZSdzIHJlamVjdGlvbiBtdXN0IE5PVCBhYm9ydCB0aGUgcmVzdC4gQSBmYWlsZWQgY2hpbGRcbiAqICAgICBpcyBub3JtYWwgKGl0J3Mgd2h5IGB3YWl0KClgIHJlamVjdHMpOyB3ZSBzdGlsbCB3YW50IHRvIGRyYWluXG4gKiAgICAgdGhlIHNpYmxpbmdzLlxuICovXG5cbmltcG9ydCB7IHNldExvbmdUaW1lb3V0IH0gZnJvbSAnLi4vdGltZXJzL2xvbmdUaW1lb3V0LmpzJztcbmltcG9ydCB7IGlkcywgbG9va3VwLCBzaXplIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoUmVzdWx0IHtcbiAgLyoqIEhhbmRsZXMgd2hvc2UgYHdhaXQoKWAgd2UgRVhQTElDSVRMWSBhd2FpdGVkIGFuZCBzYXcgZnVsZmlsbGVkLlxuICAgKiAgQmVzdC1lZmZvcnQgY291bnQg4oCUIGEgY2hpbGQgdGhhdCBjb21wbGV0ZXMgaW5zaWRlIGFub3RoZXInc1xuICAgKiAgYHdhaXQoKWAgbWF5IGZpbmlzaCAoYW5kIHVucmVnaXN0ZXIpIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG9cbiAgICogIGF3YWl0IGl0IGRpcmVjdGx5LiBUaGUgRFJBSU4gaXMgc3RpbGwgZ3VhcmFudGVlZCAocmVnaXN0cnkgZW1wdHlcbiAgICogIG9uIHJldHVybik7IG9ubHkgdGhlIENPVU5UIGlzIGFwcHJveGltYXRlLiAqL1xuICByZWFkb25seSBkb25lOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHdob3NlIGB3YWl0KClgIHJlamVjdGVkLiBTYW1lIGJlc3QtZWZmb3J0IHNlbWFudGljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHN0aWxsIGluLWZsaWdodCB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgaW5kaWNhdGVzXG4gICAqICBhIHN1Y2Nlc3NmdWwgKGNvbXBsZXRlKSBkcmFpbiDigJQgcmVnaXN0cnkgd2FzIGVtcHR5IG9uIHJldHVybi4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXggd2FsbC1jbG9jayB0byBzcGVuZCBkcmFpbmluZywgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IDMwcy5cbiAgICogYEluZmluaXR5YCB3YWl0cyBmb3IgZXZlcnkgaGFuZGxlIGFuZCBhcm1zIG5vIHRpbWVyOyBhIGxpbWl0IHBhc3RcbiAgICogMl4zMSDiiJIgMSBtcyBpcyB3YWl0ZWQgaW4gZnVsbCwgbmV2ZXIgY3V0IHRvIDEgbXM7IGAwYCBvciBsZXNzIGdpdmVzIHVwXG4gICAqIGF0IG9uY2UuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2FpdCBmb3IgZXZlcnkgaW4tZmxpZ2h0IGRldGFjaGVkIGhhbmRsZSB0byByZWFjaCBhIHRlcm1pbmFsIHN0YXRlLlxuICogUmV0dXJucyBjb3VudHMgZm9yIGRpYWdub3N0aWNzLiBQUk9DRVNTLVdJREUg4oCUIGRyYWlucyBldmVyeSBkcml2ZXJcbiAqIGFjcm9zcyBldmVyeSBleGVjdXRvci4gRm9yIHBlci1leGVjdXRvciBzY29waW5nLCBjb25zdW1lcnMgc2hvdWxkXG4gKiBjb2xsZWN0IHRoZWlyIG93biBoYW5kbGVzIGZyb20gYGV4ZWN1dG9yLmRldGFjaEFuZEpvaW5MYXRlciguLi4pYFxuICogY2FsbHMgYW5kIGF3YWl0IGBQcm9taXNlLmFsbFNldHRsZWQoWy4uLl0ubWFwKGggPT4gaC53YWl0KCkpKWBcbiAqIHRoZW1zZWx2ZXMuXG4gKlxuICogQGV4YW1wbGUgR3JhY2VmdWwgc2VydmVyIHNodXRkb3duXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBmbHVzaEFsbERldGFjaGVkIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAqXG4gKiBwcm9jZXNzLm9uKCdTSUdURVJNJywgYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBzdGF0cyA9IGF3YWl0IGZsdXNoQWxsRGV0YWNoZWQoeyB0aW1lb3V0TXM6IDEwXzAwMCB9KTtcbiAqICAgY29uc29sZS5sb2coYERyYWluZWQgJHtzdGF0cy5kb25lfSBkb25lLCAke3N0YXRzLmZhaWxlZH0gZmFpbGVkLCAke3N0YXRzLnBlbmRpbmd9IHBlbmRpbmcuYCk7XG4gKiAgIHByb2Nlc3MuZXhpdChzdGF0cy5wZW5kaW5nID09PSAwID8gMCA6IDEpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoQWxsRGV0YWNoZWQob3B0cz86IEZsdXNoT3B0aW9ucyk6IFByb21pc2U8Rmx1c2hSZXN1bHQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0cz8udGltZW91dE1zID8/IDMwXzAwMDtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBsZXQgZG9uZSA9IDA7XG4gIGxldCBmYWlsZWQgPSAwO1xuXG4gIHdoaWxlIChzaXplKCkgPiAwKSB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSB0aW1lb3V0TXMgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogc2l6ZSgpIH07XG5cbiAgICAvLyBTbmFwc2hvdCBvZiBORVcgKHVuc2VlbikgaGFuZGxlcy4gRXhpc3RpbmcgdGVybWluYWwtYnV0LXN0aWxsLVxuICAgIC8vIHJlZ2lzdGVyZWQgaGFuZGxlcyByZS1hcHBlYXIgaW4gc3Vic2VxdWVudCBzbmFwc2hvdHM7IHRoZSBzZWVuXG4gICAgLy8gc2V0IHByZXZlbnRzIGRvdWJsZS1jb3VudGluZy5cbiAgICBjb25zdCBuZXdJZHMgPSBpZHMoKS5maWx0ZXIoKGlkKSA9PiAhc2Vlbi5oYXMoaWQpKTtcbiAgICBpZiAobmV3SWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRXZlcnl0aGluZyBpbiB0aGUgcmVnaXN0cnkgaXMgYWxyZWFkeSBhd2FpdGVkIOKAlCB5aWVsZCBvbmNlIGFuZFxuICAgICAgLy8gcmUtY2hlY2suIFRoZSBkcml2ZXIncyB1bnJlZ2lzdGVyLWluLWZpbmFsbHkgaGFzbid0IHJ1biB5ZXQuXG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlkIG9mIG5ld0lkcykgc2Vlbi5hZGQoaWQpO1xuXG4gICAgY29uc3QgaGFuZGxlcyA9IG5ld0lkcy5tYXAoKGlkKSA9PiBsb29rdXAoaWQpKS5maWx0ZXIoKGgpOiBoIGlzIERldGFjaEhhbmRsZSA9PiBoICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8gUmFjZSB0aGUgZHJhaW4gYWdhaW5zdCB0aGUgcGVyLWl0ZXJhdGlvbiB0aW1lb3V0LiBXZSB1c2UgYVxuICAgIC8vIGAndGltZW91dCdgIHNlbnRpbmVsIG9uIHRoZSB0aW1lb3V0IHNpZGUgc28gdGhlIHR5cGUgbmFycm93cy4gVGhlXG4gICAgLy8gdGltZXIgaXMgdGhlIG9uZSBsb25nLXRpbWVyIGxhdydzIChgdGltZXJzL2xvbmdUaW1lb3V0LnRzYCk6IG5vXG4gICAgLy8gdGltZXIgZm9yIGBJbmZpbml0eWAsIG5ldmVyIGEgMSBtcyB0aW1lciBmb3IgYSBsb25nIGxpbWl0LlxuICAgIGxldCBjYW5jZWxUaW1lcjogKCkgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPCdfX2RldGFjaF90aW1lb3V0X18nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dCgoKSA9PiByZXNvbHZlKCdfX2RldGFjaF90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IGRyYWluUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2RyYWluUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBjYW5jZWxUaW1lcigpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gJ19fZGV0YWNoX3RpbWVvdXRfXycpIHtcbiAgICAgIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogc2l6ZSgpIH07XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByZXN1bHQpIHtcbiAgICAgIGlmIChyLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIGRvbmUrKztcbiAgICAgIGVsc2UgZmFpbGVkKys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiAwIH07XG59XG4iXX0=