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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/events-consumer.d.ts +127 -6
  2. package/dist/events-consumer.d.ts.map +1 -1
  3. package/dist/events-consumer.js +364 -50
  4. package/dist/private.d.ts +87 -18
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +116 -44
  7. package/dist/runtime/constants.d.ts +15 -1
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +22 -3
  10. package/dist/runtime/helpers.d.ts +116 -8
  11. package/dist/runtime/helpers.d.ts.map +1 -1
  12. package/dist/runtime/helpers.js +174 -2
  13. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -1
  14. package/dist/runtime/quickjs-assets.generated.js +2 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  16. package/dist/runtime/quickjs-entrypoint.js +13 -5
  17. package/dist/runtime/quickjs-runtime.d.ts +36 -1
  18. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-runtime.js +613 -185
  20. package/dist/runtime/quickjs-serde.d.ts +107 -0
  21. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-serde.js +2098 -0
  23. package/dist/runtime/replay-budget.d.ts +5 -14
  24. package/dist/runtime/replay-budget.d.ts.map +1 -1
  25. package/dist/runtime/replay-budget.js +19 -72
  26. package/dist/runtime/resume-hook.d.ts.map +1 -1
  27. package/dist/runtime/resume-hook.js +5 -1
  28. package/dist/runtime/runs.d.ts.map +1 -1
  29. package/dist/runtime/runs.js +3 -4
  30. package/dist/runtime/start.js +2 -7
  31. package/dist/runtime/step-executor.d.ts.map +1 -1
  32. package/dist/runtime/step-executor.js +1 -4
  33. package/dist/runtime/suspension-handler.d.ts +7 -0
  34. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  35. package/dist/runtime/suspension-handler.js +58 -11
  36. package/dist/runtime/world-compatibility.d.ts +15 -0
  37. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  38. package/dist/runtime/world-compatibility.js +25 -5
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +474 -418
  41. package/dist/serialization/codec-devalue-vm.d.ts +7 -0
  42. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -1
  43. package/dist/serialization/codec-devalue-vm.js +12 -1
  44. package/dist/serialization/workflow-vm.d.ts +8 -3
  45. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  46. package/dist/serialization/workflow-vm.js +9 -4
  47. package/dist/step.js +2 -2
  48. package/dist/telemetry/semantic-conventions.d.ts +23 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +18 -1
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +2 -2
  53. package/dist/vm/index.d.ts.map +1 -1
  54. package/dist/vm/index.js +9 -6
  55. package/dist/workflow/abort-controller.d.ts.map +1 -1
  56. package/dist/workflow/abort-controller.js +4 -6
  57. package/dist/workflow/attribute-dispatcher.js +2 -2
  58. package/dist/workflow/hook.js +2 -2
  59. package/dist/workflow/sleep.js +2 -2
  60. package/dist/workflow.d.ts +10 -0
  61. package/dist/workflow.d.ts.map +1 -1
  62. package/dist/workflow.js +60 -19
  63. package/docs/how-it-works/event-sourcing.mdx +11 -3
  64. package/package.json +6 -6
  65. package/dist/correlation-id.d.ts +0 -109
  66. package/dist/correlation-id.d.ts.map +0 -1
  67. package/dist/correlation-id.js +0 -139
  68. package/dist/serialization/vm-bundle-entry.d.ts +0 -12
  69. package/dist/serialization/vm-bundle-entry.d.ts.map +0 -1
  70. package/dist/serialization/vm-bundle-entry.js +0 -58
@@ -72,21 +72,12 @@ export declare class ReplayBudget {
72
72
  */
73
73
  isExhausted(): boolean;
74
74
  }
75
+ export declare class ReplayTimeoutRetryError extends Error {
76
+ readonly name = "ReplayTimeoutRetryError";
77
+ }
75
78
  /**
76
- * Fail the run (or retry, on early attempts) when the replay budget is
77
- * exhausted. The handling depends on whether the underlying World
78
- * supports `process.exit(1)` as a queue redelivery signal (see
79
- * `World.processExitTriggersQueueRedelivery`):
80
- *
81
- * - **Managed-platform Worlds** (`world-vercel`): on attempts <=
82
- * `REPLAY_TIMEOUT_MAX_RETRIES` exit the process so the platform fails
83
- * the invocation and the queue redelivers; on the next attempt write
84
- * `run_failed` with `RUN_ERROR_CODES.REPLAY_TIMEOUT` and exit.
85
- *
86
- * - **In-process Worlds** (`world-local`, dev servers): calling
87
- * `process.exit()` would terminate the host (e.g. `pnpm dev`), so
88
- * instead log a warning, write `run_failed` best-effort, and return.
89
- * The framework completes the request normally.
79
+ * Reject the current delivery while replay-timeout retries remain. Once
80
+ * exhausted, fail the run and let the queue acknowledge the delivery.
90
81
  */
91
82
  export declare function handleReplayBudgetExhausted(args: {
92
83
  runId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"replay-budget.d.ts","sourceRoot":"","sources":["../../src/runtime/replay-budget.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAgB;gBAEzB,OAAO,GAAE,MAA6B;IAKlD;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;OAGG;IACH,OAAO,IAAI,MAAM;IAMjB;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,MAAM,IAAI,IAAI;IAId;;;;OAIG;IACH,WAAW,IAAI,OAAO;CAGvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHhB"}
1
+ {"version":3,"file":"replay-budget.d.ts","sourceRoot":"","sources":["../../src/runtime/replay-budget.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAgB;gBAEzB,OAAO,GAAE,MAA6B;IAKlD;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;OAGG;IACH,OAAO,IAAI,MAAM;IAMjB;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,MAAM,IAAI,IAAI;IAId;;;;OAIG;IACH,WAAW,IAAI,OAAO;CAGvB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAkB,IAAI,6BAA6B;CACpD;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDhB"}
@@ -97,63 +97,26 @@ export class ReplayBudget {
97
97
  return this.elapsed() >= this.limitMs;
98
98
  }
99
99
  }
100
+ export class ReplayTimeoutRetryError extends Error {
101
+ name = 'ReplayTimeoutRetryError';
102
+ }
100
103
  /**
101
- * Fail the run (or retry, on early attempts) when the replay budget is
102
- * exhausted. The handling depends on whether the underlying World
103
- * supports `process.exit(1)` as a queue redelivery signal (see
104
- * `World.processExitTriggersQueueRedelivery`):
105
- *
106
- * - **Managed-platform Worlds** (`world-vercel`): on attempts <=
107
- * `REPLAY_TIMEOUT_MAX_RETRIES` exit the process so the platform fails
108
- * the invocation and the queue redelivers; on the next attempt write
109
- * `run_failed` with `RUN_ERROR_CODES.REPLAY_TIMEOUT` and exit.
110
- *
111
- * - **In-process Worlds** (`world-local`, dev servers): calling
112
- * `process.exit()` would terminate the host (e.g. `pnpm dev`), so
113
- * instead log a warning, write `run_failed` best-effort, and return.
114
- * The framework completes the request normally.
104
+ * Reject the current delivery while replay-timeout retries remain. Once
105
+ * exhausted, fail the run and let the queue acknowledge the delivery.
115
106
  */
116
107
  export async function handleReplayBudgetExhausted(args) {
117
108
  const { runId, workflowName, requestId, attempt, limitMs } = args;
118
109
  const runLogger = runtimeLogger.forRun(runId, workflowName);
119
- const world = await getWorld();
120
- const canExitForRedelivery = world.processExitTriggersQueueRedelivery === true;
121
- // Worlds without managed-platform redelivery (e.g. world-local, custom
122
- // in-process worlds) must not have us exit the process — that would
123
- // kill the user's host (`pnpm dev`, CLI, etc.) without producing a
124
- // retry. Surface the failure via the event log if we can, then return.
125
- if (!canExitForRedelivery) {
126
- runLogger.warn('Workflow replay exceeded timeout; current World does not support process exit for redelivery — failing the run and returning', { timeoutMs: limitMs, attempt });
127
- try {
128
- const getEncryptionKey = memoizeEncryptionKey(world, runId);
129
- const timeoutErr = new FatalError(`Workflow replay exceeded maximum duration (${limitMs / 1000}s)`);
130
- await world.events.create(runId, {
131
- eventType: 'run_failed',
132
- specVersion: SPEC_VERSION_CURRENT,
133
- eventData: {
134
- error: await dehydrateRunError(timeoutErr, runId, await getEncryptionKey()),
135
- errorCode: RUN_ERROR_CODES.REPLAY_TIMEOUT,
136
- },
137
- }, { requestId });
138
- }
139
- catch (err) {
140
- runLogger.warn('Unable to mark run as failed', {
141
- attempt,
142
- errorName: err instanceof Error ? err.name : 'UnknownError',
143
- errorMessage: err instanceof Error ? err.message : String(err),
144
- });
145
- }
146
- return;
147
- }
148
110
  const maxRetries = getReplayTimeoutMaxRetries();
149
111
  if (attempt <= maxRetries) {
150
- runLogger.warn('Workflow replay exceeded timeout but will be re-attempted (attempt < maxRetries)', {
112
+ runLogger.warn('Workflow replay exceeded timeout; retrying delivery', {
151
113
  timeoutMs: limitMs,
152
114
  attempt,
153
115
  maxRetries,
154
116
  });
155
- process.exit(1);
117
+ throw new ReplayTimeoutRetryError(`Workflow replay exceeded maximum duration (${limitMs / 1000}s)`);
156
118
  }
119
+ const world = await getWorld();
157
120
  const replayTimeoutDescription = describeError(undefined, RUN_ERROR_CODES.REPLAY_TIMEOUT);
158
121
  runLogger.error('Workflow replay exceeded timeout and max retries exceeded. Failing the run', {
159
122
  timeoutMs: limitMs,
@@ -162,31 +125,15 @@ export async function handleReplayBudgetExhausted(args) {
162
125
  errorCode: replayTimeoutDescription.errorCode,
163
126
  errorAttribution: replayTimeoutDescription.attribution,
164
127
  });
165
- try {
166
- const getEncryptionKey = memoizeEncryptionKey(world, runId);
167
- const timeoutErr = new FatalError(`Workflow replay exceeded maximum duration (${limitMs / 1000}s) after ${attempt} attempts`);
168
- await world.events.create(runId, {
169
- eventType: 'run_failed',
170
- specVersion: SPEC_VERSION_CURRENT,
171
- eventData: {
172
- error: await dehydrateRunError(timeoutErr, runId, await getEncryptionKey()),
173
- errorCode: RUN_ERROR_CODES.REPLAY_TIMEOUT,
174
- },
175
- }, { requestId });
176
- }
177
- catch (err) {
178
- // Best effort — process exits regardless. Surface why so operators
179
- // can diagnose repeat timeouts against the backend.
180
- runLogger.warn('Unable to mark run as failed. The queue will continue to retry', {
181
- attempt,
182
- errorName: err instanceof Error ? err.name : 'UnknownError',
183
- errorMessage: err instanceof Error ? err.message : String(err),
184
- errorStack: err instanceof Error ? err.stack : undefined,
185
- });
186
- }
187
- // Note that this also prevents the runtime from acking the queue
188
- // message, so the queue will call back once, after which a 410 will
189
- // get it to exit early.
190
- process.exit(1);
128
+ const getEncryptionKey = memoizeEncryptionKey(world, runId);
129
+ const timeoutErr = new FatalError(`Workflow replay exceeded maximum duration (${limitMs / 1000}s) after ${attempt} attempts`);
130
+ await world.events.create(runId, {
131
+ eventType: 'run_failed',
132
+ specVersion: SPEC_VERSION_CURRENT,
133
+ eventData: {
134
+ error: await dehydrateRunError(timeoutErr, runId, await getEncryptionKey()),
135
+ errorCode: RUN_ERROR_CODES.REPLAY_TIMEOUT,
136
+ },
137
+ }, { requestId });
191
138
  }
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LWJ1ZGdldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3JlcGxheS1idWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDTixPQUFPLENBQVM7SUFDekIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLGFBQWEsQ0FBZ0I7SUFFckMsWUFBWSxVQUFrQixrQkFBa0IsRUFBRTtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMs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QUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWM7WUFDM0QsWUFBWSxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDOUQsVUFBVSxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDekQsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELGlFQUFpRTtJQUNqRSxvRUFBb0U7SUFDcEUsd0JBQXdCO0lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZhdGFsRXJyb3IsIFJVTl9FUlJPUl9DT0RFUyB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgU1BFQ19WRVJTSU9OX0NVUlJFTlQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4uL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlUnVuRXJyb3IgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGdldFJlcGxheVRpbWVvdXRNYXhSZXRyaWVzLCBnZXRSZXBsYXlUaW1lb3V0TXMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBtZW1vaXplRW5jcnlwdGlvbktleSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKipcbiAqIFBlci1pbnZvY2F0aW9uIGFjY291bnRpbmcgb2YgdGhlICpub24tc3RlcCogcG9ydGlvbiBvZiBhIHdvcmtmbG93XG4gKiBoYW5kbGVyIHJ1bjogZGV0ZXJtaW5pc3RpYyBldmVudC1sb2cgcmVwbGF5LCB3b3JrZmxvdy1WTSBleGVjdXRpb25cbiAqIGJldHdlZW4gc3RlcCBib3VuZGFyaWVzLCBzdXNwZW5zaW9uIGhhbmRsaW5nLCBxdWV1ZSByb3VuZC10cmlwcywgZXRjLlxuICogSW5saW5lIHN0ZXAgYm9kaWVzIChgXCJ1c2Ugc3RlcFwiYCBmdW5jdGlvbnMgaW52b2tlZCB2aWEgYGV4ZWN1dGVTdGVwYClcbiAqIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkIOKAlCB0aGV5IGFyZSBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzXG4gKiBmdW5jdGlvbiBgbWF4RHVyYXRpb25gIGFuZCB0aGUgYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgIGVhcmx5LXJldHVyblxuICogZ3VhcmQuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcbiAqIC8vIOKApm5vbi1zdGVwIHdvcmsgaGFwcGVucyBoZXJlLCBhY2N1bXVsYXRlcyBhZ2FpbnN0IHRoZSBidWRnZXTigKZcbiAqIGJ1ZGdldC5wYXVzZSgpO1xuICogdHJ5IHtcbiAqICAgYXdhaXQgZXhlY3V0ZVN0ZXAoLi4uKTsgLy8gbm90IGNoYXJnZWRcbiAqIH0gZmluYWxseSB7XG4gKiAgIGJ1ZGdldC5yZXN1bWUoKTtcbiAqIH1cbiAqIC8vIGJhY2sgdG8gY2hhcmdpbmdcbiAqIGlmIChidWRnZXQuaXNFeGhhdXN0ZWQoKSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogSW1wbGVtZW50YXRpb24gbm90ZXM6XG4gKlxuICogLSBgcGF1c2UoKWAgYW5kIGByZXN1bWUoKWAgYXJlIGlkZW1wb3RlbnQ6IGNhbGxpbmcgYHBhdXNlKClgIHdoaWxlXG4gKiAgIGFscmVhZHkgcGF1c2VkIChvciBgcmVzdW1lKClgIHdoaWxlIGFscmVhZHkgcmVzdW1lZCkgaXMgYSBuby1vcC5cbiAqICAgVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IGRvdWJsZS1jb3VudGluZyBpbiBmdXR1cmUgcmVmYWN0b3JzIHRoYXQgbmVzdFxuICogICBzdGVwIGV4ZWN1dGlvbiBvciB0YWtlIGFuIGVhcmx5LXJldHVybiBwYXRoIGJldHdlZW4gYSBgcGF1c2UoKWAgYW5kXG4gKiAgIHRoZSBtYXRjaGluZyBgcmVzdW1lKClgLlxuICogLSBgaXNFeGhhdXN0ZWQoKWAgaXMgY2hlY2tlZCBhdCBsb29wIGJvdW5kYXJpZXMgYnkgdGhlIGNhbGxlciDigJQgdGhlXG4gKiAgIGJ1ZGdldCBpdHNlbGYgZG9lcyBub3QgYXJtIGFueSB0aW1lcnMuIFRoaXMgbWVhbnMgYW4gaW4tZmxpZ2h0XG4gKiAgIHBhdGhvbG9naWNhbCBgcnVuV29ya2Zsb3dgIGNhbGwgKGUuZy4gYSBodWdlIGV2ZW50LWxvZyByZXBsYXkpIGNhblxuICogICBvdmVyc2hvb3QgdGhlIGJ1ZGdldCBieSB1cCB0byBvbmUgaXRlcmF0aW9uJ3Mgd29ydGggb2Ygd29yayBiZWZvcmVcbiAqICAgdGhlIG5leHQgY2hlY2sgZmlyZXMuIEluIHByYWN0aWNlIHRoZSAyMHMgaGVhZHJvb20gYnVpbHQgaW50b1xuICogICBgTUFYX1JFUExBWV9USU1FT1VUX01TYCAoYW5kIHRoZSBmdW5jdGlvbiBgbWF4RHVyYXRpb25gIGNlaWxpbmcpXG4gKiAgIGdpdmVzIHVzIHNsYWNrOyB0aGUgb2xkIGBzZXRUaW1lb3V0YC1iYXNlZCBhcHByb2FjaCBhbHNvIHVsdGltYXRlbHlcbiAqICAgcmVsaWVkIG9uIHRoZSBwbGF0Zm9ybSBTSUdURVJNIGFzIHRoZSBoYXJkIGJhY2tzdG9wLlxuICovXG5leHBvcnQgY2xhc3MgUmVwbGF5QnVkZ2V0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW1pdE1zOiBudW1iZXI7XG4gIHByaXZhdGUgZWxhcHNlZE1zID0gMDtcbiAgcHJpdmF0ZSBpbnRlcnZhbFN0YXJ0OiBudW1iZXIgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGxpbWl0TXM6IG51bWJlciA9IGdldFJlcGxheVRpbWVvdXRNcygpKSB7XG4gICAgdGhpcy5saW1pdE1zID0gbGltaXRNcztcbiAgICB0aGlzLmludGVydmFsU3RhcnQgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmVkIHJlcGxheS10aW1lb3V0IGxpbWl0LCBpbiBtcy4gVXNlZnVsIGZvciBsb2cgbWVzc2FnZXMuXG4gICAqL1xuICBnZXQgY29uZmlndXJlZExpbWl0TXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5saW1pdE1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIG5vbi1zdGVwIHRpbWUgYWNjdW11bGF0ZWQgc28gZmFyLCBpbiBtcy4gSW5jbHVkZXMgdGhlXG4gICAqIGN1cnJlbnRseS1hY3RpdmUgaW50ZXJ2YWwgaWYgdGhlIGJ1ZGdldCBpcyBub3QgcGF1c2VkLlxuICAgKi9cbiAgZWxhcHNlZCgpOiBudW1iZXIge1xuICAgIGNvbnN0IG9wZW4gPVxuICAgICAgdGhpcy5pbnRlcnZhbFN0YXJ0ID09PSBudWxsID8gMCA6IERhdGUubm93KCkgLSB0aGlzLmludGVydmFsU3RhcnQ7XG4gICAgcmV0dXJuIHRoaXMuZWxhcHNlZE1zICsgb3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGNvdW50aW5nIGVsYXBzZWQgdGltZSB0b3dhcmQgdGhlIGJ1ZGdldC4gSWRlbXBvdGVudCDigJQgc2FmZSB0b1xuICAgKiBjYWxsIG11bHRpcGxlIHRpbWVzIGluIGEgcm93OyBzdWJzZXF1ZW50IGNhbGxzIGFyZSBuby1vcHMgdW50aWxcbiAgICogYHJlc3VtZSgpYCByZW9wZW5zIGFuIGludGVydmFsLlxuICAgKi9cbiAgcGF1c2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxTdGFydCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMuZWxhcHNlZE1zICs9IERhdGUubm93KCkgLSB0aGlzLmludGVydmFsU3RhcnQ7XG4gICAgdGhpcy5pbnRlcnZhbFN0YXJ0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgY291bnRpbmcgZWxhcHNlZCB0aW1lIHRvd2FyZCB0aGUgYnVkZ2V0LiBJZGVtcG90ZW50IOKAlCBzYWZlIHRvXG4gICAqIGNhbGwgbXVsdGlwbGUgdGltZXMgaW4gYSByb3c7IHN1YnNlcXVlbnQgY2FsbHMgcmUtYW5jaG9yIHRoZVxuICAgKiBpbnRlcnZhbCBzdGFydCB0byBgbm93KClgLCB3aGljaCBpcyBmaW5lIGJlY2F1c2Ugbm8gdGltZSBhY2NydWVzXG4gICAqIGJldHdlZW4gYmFjay10by1iYWNrIGByZXN1bWUoKWAgY2FsbHMuXG4gICAqL1xuICByZXN1bWUoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcnZhbFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIGlmIHRoZSBidWRnZXQgaGFzIGJlZW4gZXhoYXVzdGVkIChgZWxhcHNlZCgpID49IGxpbWl0TXNgKS5cbiAgICogQ2FsbGVycyBzaG91bGQgaW52b2tlIGBoYW5kbGVFeGhhdXN0ZWQoLi4uKWAgYWZ0ZXJ3YXJkIGFuZCByZXR1cm5cbiAgICogZnJvbSB0aGUgaGFuZGxlci5cbiAgICovXG4gIGlzRXhoYXVzdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVsYXBzZWQoKSA+PSB0aGlzLmxpbWl0TXM7XG4gIH1cbn1cblxuLyoqXG4gKiBGYWlsIHRoZSBydW4gKG9yIHJldHJ5LCBvbiBlYXJseSBhdHRlbXB0cykgd2hlbiB0aGUgcmVwbGF5IGJ1ZGdldCBpc1xuICogZXhoYXVzdGVkLiBUaGUgaGFuZGxpbmcgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIFdvcmxkXG4gKiBzdXBwb3J0cyBgcHJvY2Vzcy5leGl0KDEpYCBhcyBhIHF1ZXVlIHJlZGVsaXZlcnkgc2lnbmFsIChzZWVcbiAqIGBXb3JsZC5wcm9jZXNzRXhpdFRyaWdnZXJzUXVldWVSZWRlbGl2ZXJ5YCk6XG4gKlxuICogLSAqKk1hbmFnZWQtcGxhdGZvcm0gV29ybGRzKiogKGB3b3JsZC12ZXJjZWxgKTogb24gYXR0ZW1wdHMgPD1cbiAqICAgYFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYCBleGl0IHRoZSBwcm9jZXNzIHNvIHRoZSBwbGF0Zm9ybSBmYWlsc1xuICogICB0aGUgaW52b2NhdGlvbiBhbmQgdGhlIHF1ZXVlIHJlZGVsaXZlcnM7IG9uIHRoZSBuZXh0IGF0dGVtcHQgd3JpdGVcbiAqICAgYHJ1bl9mYWlsZWRgIHdpdGggYFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVGAgYW5kIGV4aXQuXG4gKlxuICogLSAqKkluLXByb2Nlc3MgV29ybGRzKiogKGB3b3JsZC1sb2NhbGAsIGRldiBzZXJ2ZXJzKTogY2FsbGluZ1xuICogICBgcHJvY2Vzcy5leGl0KClgIHdvdWxkIHRlcm1pbmF0ZSB0aGUgaG9zdCAoZS5nLiBgcG5wbSBkZXZgKSwgc29cbiAqICAgaW5zdGVhZCBsb2cgYSB3YXJuaW5nLCB3cml0ZSBgcnVuX2ZhaWxlZGAgYmVzdC1lZmZvcnQsIGFuZCByZXR1cm4uXG4gKiAgIFRoZSBmcmFtZXdvcmsgY29tcGxldGVzIHRoZSByZXF1ZXN0IG5vcm1hbGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKGFyZ3M6IHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhdHRlbXB0OiBudW1iZXI7XG4gIGxpbWl0TXM6IG51bWJlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBydW5JZCwgd29ya2Zsb3dOYW1lLCByZXF1ZXN0SWQsIGF0dGVtcHQsIGxpbWl0TXMgfSA9IGFyZ3M7XG4gIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgY29uc3QgY2FuRXhpdEZvclJlZGVsaXZlcnkgPVxuICAgIHdvcmxkLnByb2Nlc3NFeGl0VHJpZ2dlcnNRdWV1ZVJlZGVsaXZlcnkgPT09IHRydWU7XG5cbiAgLy8gV29ybGRzIHdpdGhvdXQgbWFuYWdlZC1wbGF0Zm9ybSByZWRlbGl2ZXJ5IChlLmcuIHdvcmxkLWxvY2FsLCBjdXN0b21cbiAgLy8gaW4tcHJvY2VzcyB3b3JsZHMpIG11c3Qgbm90IGhhdmUgdXMgZXhpdCB0aGUgcHJvY2VzcyDigJQgdGhhdCB3b3VsZFxuICAvLyBraWxsIHRoZSB1c2VyJ3MgaG9zdCAoYHBucG0gZGV2YCwgQ0xJLCBldGMuKSB3aXRob3V0IHByb2R1Y2luZyBhXG4gIC8vIHJldHJ5LiBTdXJmYWNlIHRoZSBmYWlsdXJlIHZpYSB0aGUgZXZlbnQgbG9nIGlmIHdlIGNhbiwgdGhlbiByZXR1cm4uXG4gIGlmICghY2FuRXhpdEZvclJlZGVsaXZlcnkpIHtcbiAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICdXb3JrZmxvdyByZXBsYXkgZXhjZWVkZWQgdGltZW91dDsgY3VycmVudCBXb3JsZCBkb2VzIG5vdCBzdXBwb3J0IHByb2Nlc3MgZXhpdCBmb3IgcmVkZWxpdmVyeSDigJQgZmFpbGluZyB0aGUgcnVuIGFuZCByZXR1cm5pbmcnLFxuICAgICAgeyB0aW1lb3V0TXM6IGxpbWl0TXMsIGF0dGVtcHQgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgY29uc3QgdGltZW91dEVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIG1heGltdW0gZHVyYXRpb24gKCR7bGltaXRNcyAvIDEwMDB9cylgXG4gICAgICApO1xuICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgIHRpbWVvdXRFcnIsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcnVuTG9nZ2VyLndhcm4oJ1VuYWJsZSB0byBtYXJrIHJ1biBhcyBmYWlsZWQnLCB7XG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtYXhSZXRyaWVzID0gZ2V0UmVwbGF5VGltZW91dE1heFJldHJpZXMoKTtcbiAgaWYgKGF0dGVtcHQgPD0gbWF4UmV0cmllcykge1xuICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgJ1dvcmtmbG93IHJlcGxheSBleGNlZWRlZCB0aW1lb3V0IGJ1dCB3aWxsIGJlIHJlLWF0dGVtcHRlZCAoYXR0ZW1wdCA8IG1heFJldHJpZXMpJyxcbiAgICAgIHtcbiAgICAgICAgdGltZW91dE1zOiBsaW1pdE1zLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBtYXhSZXRyaWVzLFxuICAgICAgfVxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcmVwbGF5VGltZW91dERlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICB1bmRlZmluZWQsXG4gICAgUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUXG4gICk7XG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIHRpbWVvdXQgYW5kIG1heCByZXRyaWVzIGV4Y2VlZGVkLiBGYWlsaW5nIHRoZSBydW4nLFxuICAgIHtcbiAgICAgIHRpbWVvdXRNczogbGltaXRNcyxcbiAgICAgIGF0dGVtcHQsXG4gICAgICBtYXhSZXRyaWVzLFxuICAgICAgZXJyb3JDb2RlOiByZXBsYXlUaW1lb3V0RGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogcmVwbGF5VGltZW91dERlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgIH1cbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgIGNvbnN0IHRpbWVvdXRFcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgIGBXb3JrZmxvdyByZXBsYXkgZXhjZWVkZWQgbWF4aW11bSBkdXJhdGlvbiAoJHtsaW1pdE1zIC8gMTAwMH1zKSBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzYFxuICAgICk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICB0aW1lb3V0RXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VULFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBCZXN0IGVmZm9ydCDigJQgcHJvY2VzcyBleGl0cyByZWdhcmRsZXNzLiBTdXJmYWNlIHdoeSBzbyBvcGVyYXRvcnNcbiAgICAvLyBjYW4gZGlhZ25vc2UgcmVwZWF0IHRpbWVvdXRzIGFnYWluc3QgdGhlIGJhY2tlbmQuXG4gICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAnVW5hYmxlIHRvIG1hcmsgcnVuIGFzIGZhaWxlZC4gVGhlIHF1ZXVlIHdpbGwgY29udGludWUgdG8gcmV0cnknLFxuICAgICAge1xuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIGVycm9yU3RhY2s6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLy8gTm90ZSB0aGF0IHRoaXMgYWxzbyBwcmV2ZW50cyB0aGUgcnVudGltZSBmcm9tIGFja2luZyB0aGUgcXVldWVcbiAgLy8gbWVzc2FnZSwgc28gdGhlIHF1ZXVlIHdpbGwgY2FsbCBiYWNrIG9uY2UsIGFmdGVyIHdoaWNoIGEgNDEwIHdpbGxcbiAgLy8gZ2V0IGl0IHRvIGV4aXQgZWFybHkuXG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cbiJdfQ==
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LWJ1ZGdldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3JlcGxheS1idWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDTixPQUFPLENBQVM7SUFDekIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLGFBQWEsQ0FBZ0I7SUFFckMsWUFBWSxVQUFrQixrQkFBa0IsRUFBRTtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRSxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN4QyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2xELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxLQUFLO0lBQzlCLElBQUksR0FBRyx5QkFBeUIsQ0FBQztDQUNwRDtBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCLENBQUMsSUFNakQ7SUFDQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUU1RCxNQUFNLFVBQVUsR0FBRywwQkFBMEIsRUFBRSxDQUFDO0lBQ2hELElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxJQUFJLENBQUMscURBQXFELEVBQUU7WUFDcEUsU0FBUyxFQUFFLE9BQU87WUFDbEIsT0FBTztZQUNQLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksdUJBQXVCLENBQy9CLDhDQUE4QyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLEVBQUUsQ0FBQztJQUUvQixNQUFNLHdCQUF3QixHQUFHLGFBQWEsQ0FDNUMsU0FBUyxFQUNULGVBQWUsQ0FBQyxjQUFjLENBQy9CLENBQUM7SUFDRixTQUFTLENBQUMsS0FBSyxDQUNiLDRFQUE0RSxFQUM1RTtRQUNFLFNBQVMsRUFBRSxPQUFPO1FBQ2xCLE9BQU87UUFDUCxVQUFVO1FBQ1YsU0FBUyxFQUFFLHdCQUF3QixDQUFDLFNBQVM7UUFDN0MsZ0JBQWdCLEVBQUUsd0JBQXdCLENBQUMsV0FBVztLQUN2RCxDQUNGLENBQUM7SUFFRixNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FDL0IsOENBQThDLE9BQU8sR0FBRyxJQUFJLFlBQVksT0FBTyxXQUFXLENBQzNGLENBQUM7SUFDRixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN2QixLQUFLLEVBQ0w7UUFDRSxTQUFTLEVBQUUsWUFBWTtRQUN2QixXQUFXLEVBQUUsb0JBQW9CO1FBQ2pDLFNBQVMsRUFBRTtZQUNULEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUM1QixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sZ0JBQWdCLEVBQUUsQ0FDekI7WUFDRCxTQUFTLEVBQUUsZUFBZSxDQUFDLGNBQWM7U0FDMUM7S0FDRixFQUNELEVBQUUsU0FBUyxFQUFFLENBQ2QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yLCBSVU5fRVJST1JfQ09ERVMgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IFNQRUNfVkVSU0lPTl9DVVJSRU5UIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuLi9kZXNjcmliZS1lcnJvci5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRSZXBsYXlUaW1lb3V0TWF4UmV0cmllcywgZ2V0UmVwbGF5VGltZW91dE1zIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgbWVtb2l6ZUVuY3J5cHRpb25LZXkgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3dvcmxkLmpzJztcblxuLyoqXG4gKiBQZXItaW52b2NhdGlvbiBhY2NvdW50aW5nIG9mIHRoZSAqbm9uLXN0ZXAqIHBvcnRpb24gb2YgYSB3b3JrZmxvd1xuICogaGFuZGxlciBydW46IGRldGVybWluaXN0aWMgZXZlbnQtbG9nIHJlcGxheSwgd29ya2Zsb3ctVk0gZXhlY3V0aW9uXG4gKiBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcywgc3VzcGVuc2lvbiBoYW5kbGluZywgcXVldWUgcm91bmQtdHJpcHMsIGV0Yy5cbiAqIElubGluZSBzdGVwIGJvZGllcyAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZCDigJQgdGhleSBhcmUgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0nc1xuICogZnVuY3Rpb24gYG1heER1cmF0aW9uYCBhbmQgdGhlIGBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TYCBlYXJseS1yZXR1cm5cbiAqIGd1YXJkLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG4gKiAvLyDigKZub24tc3RlcCB3b3JrIGhhcHBlbnMgaGVyZSwgYWNjdW11bGF0ZXMgYWdhaW5zdCB0aGUgYnVkZ2V04oCmXG4gKiBidWRnZXQucGF1c2UoKTtcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGV4ZWN1dGVTdGVwKC4uLik7IC8vIG5vdCBjaGFyZ2VkXG4gKiB9IGZpbmFsbHkge1xuICogICBidWRnZXQucmVzdW1lKCk7XG4gKiB9XG4gKiAvLyBiYWNrIHRvIGNoYXJnaW5nXG4gKiBpZiAoYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEltcGxlbWVudGF0aW9uIG5vdGVzOlxuICpcbiAqIC0gYHBhdXNlKClgIGFuZCBgcmVzdW1lKClgIGFyZSBpZGVtcG90ZW50OiBjYWxsaW5nIGBwYXVzZSgpYCB3aGlsZVxuICogICBhbHJlYWR5IHBhdXNlZCAob3IgYHJlc3VtZSgpYCB3aGlsZSBhbHJlYWR5IHJlc3VtZWQpIGlzIGEgbm8tb3AuXG4gKiAgIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBkb3VibGUtY291bnRpbmcgaW4gZnV0dXJlIHJlZmFjdG9ycyB0aGF0IG5lc3RcbiAqICAgc3RlcCBleGVjdXRpb24gb3IgdGFrZSBhbiBlYXJseS1yZXR1cm4gcGF0aCBiZXR3ZWVuIGEgYHBhdXNlKClgIGFuZFxuICogICB0aGUgbWF0Y2hpbmcgYHJlc3VtZSgpYC5cbiAqIC0gYGlzRXhoYXVzdGVkKClgIGlzIGNoZWNrZWQgYXQgbG9vcCBib3VuZGFyaWVzIGJ5IHRoZSBjYWxsZXIg4oCUIHRoZVxuICogICBidWRnZXQgaXRzZWxmIGRvZXMgbm90IGFybSBhbnkgdGltZXJzLiBUaGlzIG1lYW5zIGFuIGluLWZsaWdodFxuICogICBwYXRob2xvZ2ljYWwgYHJ1bldvcmtmbG93YCBjYWxsIChlLmcuIGEgaHVnZSBldmVudC1sb2cgcmVwbGF5KSBjYW5cbiAqICAgb3ZlcnNob290IHRoZSBidWRnZXQgYnkgdXAgdG8gb25lIGl0ZXJhdGlvbidzIHdvcnRoIG9mIHdvcmsgYmVmb3JlXG4gKiAgIHRoZSBuZXh0IGNoZWNrIGZpcmVzLiBJbiBwcmFjdGljZSB0aGUgMjBzIGhlYWRyb29tIGJ1aWx0IGludG9cbiAqICAgYE1BWF9SRVBMQVlfVElNRU9VVF9NU2AgKGFuZCB0aGUgZnVuY3Rpb24gYG1heER1cmF0aW9uYCBjZWlsaW5nKVxuICogICBnaXZlcyB1cyBzbGFjazsgdGhlIG9sZCBgc2V0VGltZW91dGAtYmFzZWQgYXBwcm9hY2ggYWxzbyB1bHRpbWF0ZWx5XG4gKiAgIHJlbGllZCBvbiB0aGUgcGxhdGZvcm0gU0lHVEVSTSBhcyB0aGUgaGFyZCBiYWNrc3RvcC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcGxheUJ1ZGdldCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGltaXRNczogbnVtYmVyO1xuICBwcml2YXRlIGVsYXBzZWRNcyA9IDA7XG4gIHByaXZhdGUgaW50ZXJ2YWxTdGFydDogbnVtYmVyIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihsaW1pdE1zOiBudW1iZXIgPSBnZXRSZXBsYXlUaW1lb3V0TXMoKSkge1xuICAgIHRoaXMubGltaXRNcyA9IGxpbWl0TXM7XG4gICAgdGhpcy5pbnRlcnZhbFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJlZCByZXBsYXktdGltZW91dCBsaW1pdCwgaW4gbXMuIFVzZWZ1bCBmb3IgbG9nIG1lc3NhZ2VzLlxuICAgKi9cbiAgZ2V0IGNvbmZpZ3VyZWRMaW1pdE1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubGltaXRNcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBub24tc3RlcCB0aW1lIGFjY3VtdWxhdGVkIHNvIGZhciwgaW4gbXMuIEluY2x1ZGVzIHRoZVxuICAgKiBjdXJyZW50bHktYWN0aXZlIGludGVydmFsIGlmIHRoZSBidWRnZXQgaXMgbm90IHBhdXNlZC5cbiAgICovXG4gIGVsYXBzZWQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBvcGVuID1cbiAgICAgIHRoaXMuaW50ZXJ2YWxTdGFydCA9PT0gbnVsbCA/IDAgOiBEYXRlLm5vdygpIC0gdGhpcy5pbnRlcnZhbFN0YXJ0O1xuICAgIHJldHVybiB0aGlzLmVsYXBzZWRNcyArIG9wZW47XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBjb3VudGluZyBlbGFwc2VkIHRpbWUgdG93YXJkIHRoZSBidWRnZXQuIElkZW1wb3RlbnQg4oCUIHNhZmUgdG9cbiAgICogY2FsbCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdzsgc3Vic2VxdWVudCBjYWxscyBhcmUgbm8tb3BzIHVudGlsXG4gICAqIGByZXN1bWUoKWAgcmVvcGVucyBhbiBpbnRlcnZhbC5cbiAgICovXG4gIHBhdXNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsU3RhcnQgPT09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmVsYXBzZWRNcyArPSBEYXRlLm5vdygpIC0gdGhpcy5pbnRlcnZhbFN0YXJ0O1xuICAgIHRoaXMuaW50ZXJ2YWxTdGFydCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGNvdW50aW5nIGVsYXBzZWQgdGltZSB0b3dhcmQgdGhlIGJ1ZGdldC4gSWRlbXBvdGVudCDigJQgc2FmZSB0b1xuICAgKiBjYWxsIG11bHRpcGxlIHRpbWVzIGluIGEgcm93OyBzdWJzZXF1ZW50IGNhbGxzIHJlLWFuY2hvciB0aGVcbiAgICogaW50ZXJ2YWwgc3RhcnQgdG8gYG5vdygpYCwgd2hpY2ggaXMgZmluZSBiZWNhdXNlIG5vIHRpbWUgYWNjcnVlc1xuICAgKiBiZXR3ZWVuIGJhY2stdG8tYmFjayBgcmVzdW1lKClgIGNhbGxzLlxuICAgKi9cbiAgcmVzdW1lKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJ2YWxTdGFydCA9IERhdGUubm93KCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgYnVkZ2V0IGhhcyBiZWVuIGV4aGF1c3RlZCAoYGVsYXBzZWQoKSA+PSBsaW1pdE1zYCkuXG4gICAqIENhbGxlcnMgc2hvdWxkIGludm9rZSBgaGFuZGxlRXhoYXVzdGVkKC4uLilgIGFmdGVyd2FyZCBhbmQgcmV0dXJuXG4gICAqIGZyb20gdGhlIGhhbmRsZXIuXG4gICAqL1xuICBpc0V4aGF1c3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbGFwc2VkKCkgPj0gdGhpcy5saW1pdE1zO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXBsYXlUaW1lb3V0UmV0cnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZSA9ICdSZXBsYXlUaW1lb3V0UmV0cnlFcnJvcic7XG59XG5cbi8qKlxuICogUmVqZWN0IHRoZSBjdXJyZW50IGRlbGl2ZXJ5IHdoaWxlIHJlcGxheS10aW1lb3V0IHJldHJpZXMgcmVtYWluLiBPbmNlXG4gKiBleGhhdXN0ZWQsIGZhaWwgdGhlIHJ1biBhbmQgbGV0IHRoZSBxdWV1ZSBhY2tub3dsZWRnZSB0aGUgZGVsaXZlcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQoYXJnczoge1xuICBydW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgbGltaXRNczogbnVtYmVyO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJ1bklkLCB3b3JrZmxvd05hbWUsIHJlcXVlc3RJZCwgYXR0ZW1wdCwgbGltaXRNcyB9ID0gYXJncztcbiAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgY29uc3QgbWF4UmV0cmllcyA9IGdldFJlcGxheVRpbWVvdXRNYXhSZXRyaWVzKCk7XG4gIGlmIChhdHRlbXB0IDw9IG1heFJldHJpZXMpIHtcbiAgICBydW5Mb2dnZXIud2FybignV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIHRpbWVvdXQ7IHJldHJ5aW5nIGRlbGl2ZXJ5Jywge1xuICAgICAgdGltZW91dE1zOiBsaW1pdE1zLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG1heFJldHJpZXMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFJlcGxheVRpbWVvdXRSZXRyeUVycm9yKFxuICAgICAgYFdvcmtmbG93IHJlcGxheSBleGNlZWRlZCBtYXhpbXVtIGR1cmF0aW9uICgke2xpbWl0TXMgLyAxMDAwfXMpYFxuICAgICk7XG4gIH1cblxuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG5cbiAgY29uc3QgcmVwbGF5VGltZW91dERlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICB1bmRlZmluZWQsXG4gICAgUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUXG4gICk7XG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIHRpbWVvdXQgYW5kIG1heCByZXRyaWVzIGV4Y2VlZGVkLiBGYWlsaW5nIHRoZSBydW4nLFxuICAgIHtcbiAgICAgIHRpbWVvdXRNczogbGltaXRNcyxcbiAgICAgIGF0dGVtcHQsXG4gICAgICBtYXhSZXRyaWVzLFxuICAgICAgZXJyb3JDb2RlOiByZXBsYXlUaW1lb3V0RGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogcmVwbGF5VGltZW91dERlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgY29uc3QgdGltZW91dEVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgIGBXb3JrZmxvdyByZXBsYXkgZXhjZWVkZWQgbWF4aW11bSBkdXJhdGlvbiAoJHtsaW1pdE1zIC8gMTAwMH1zKSBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzYFxuICApO1xuICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgIHJ1bklkLFxuICAgIHtcbiAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICB0aW1lb3V0RXJyLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICApLFxuICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IHJlcXVlc3RJZCB9XG4gICk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"resume-hook.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-hook.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,IAAI,EAUV,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAGL,KAAK,UAAU,EAGhB,MAAM,qBAAqB,CAAC;AAwJ7B;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,CAAC,EACV,qBAAqB,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,WAAW,CAAC,CAUtB;AA8ZD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CA+DnB"}
1
+ {"version":3,"file":"resume-hook.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-hook.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,IAAI,EAUV,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAGL,KAAK,UAAU,EAGhB,MAAM,qBAAqB,CAAC;AAwJ7B;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,CAAC,EACV,qBAAqB,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,WAAW,CAAC,CAUtB;AAkaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CA+DnB"}
@@ -451,6 +451,10 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
451
451
  token: hook.token,
452
452
  payload: dehydratedPayload,
453
453
  payloadDigest,
454
+ // Deployment affinity for the consumer's cheap pre-write
455
+ // check: lets a misrouted delivery re-route before its
456
+ // hoisted hook_received write instead of after.
457
+ deploymentId: resumeContext.deploymentId,
454
458
  },
455
459
  }, queueOptions),
456
460
  ]);
@@ -611,4 +615,4 @@ export async function resumeWebhook(token, request) {
611
615
  }
612
616
  return response;
613
617
  }
614
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBR3pCLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFB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RUFBRSxXQUFXLENBQUMseUJBQXlCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRVJST1JfU0xVR1MsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0RFRFVQX1ZFUlNJT04sXG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIHR5cGUgSG9vayxcbiAgdHlwZSBIb29rUmVzdW1lQ29udGV4dCxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIHR5cGUgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgZ2V0UnVuQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vY2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBkZWNvZGVSdW5QdWJsaWNLZXkgfSBmcm9tICcuLi9zZWFsZWQtYm94LmpzJztcbmltcG9ydCB7IGRlcml2ZVJ1blBheWxvYWRLZXlzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgc2VhbFRvLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgbGlua1RvVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwsIHdhaXRlZFVudGlsIH0gZnJvbSAnLi93YWl0LXVudGlsLmpzJztcblxuLyoqIE1vbm90b25pYyBVTElEIGZhY3RvcnkgZm9yIHBlci1jYWxsIHJlc3VtZSBpZGVtcG90ZW5jeSBrZXlzLiAqL1xuY29uc3QgZ2VuZXJhdGVSZXN1bWVJZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBVcHBlciBib3VuZCBvbiB0aGUgc2VyaWFsaXplZCBob29rIHBheWxvYWQgdGhhdCB0aGUgcGFyYWxsZWwgZmFzdCBwYXRoIHdpbGxcbiAqIGlubGluZSBpbnRvIHRoZSBxdWV1ZSBtZXNzYWdlJ3MgYGhvb2tJbnB1dGAuIFZlcmNlbCBRdWV1ZXMgY2FwcyBhIHNpbmdsZVxuICogbWVzc2FnZSBhdCB+MjU2IEtpQiwgYW5kIHRoZSBtZXNzYWdlIGFsc28gY2FycmllcyB0aGUgcnVuSWQsIGhvb2tJZCwgdG9rZW4sXG4gKiByZXN1bWVJZCwgZGlnZXN0LCBhbmQgdHJhY2UgY2FycmllciBhbG9uZ3NpZGUgQ0JPUiBmcmFtaW5nIG92ZXJoZWFkLiBTdGF5aW5nXG4gKiB3ZWxsIHVuZGVyIHRoYXQgY2VpbGluZyBrZWVwcyB0aGUgcXVldWUgcHVibGlzaCBmcm9tIHJlamVjdGluZyBhbiBvdmVyc2l6ZWRcbiAqIG1lc3NhZ2Ug4oCUIHdoaWNoLCBvbiB0aGUgcGFyYWxsZWwgcGF0aCwgd291bGQgcGVyc2lzdCBgaG9va19yZWNlaXZlZGAgYnV0IG5ldmVyXG4gKiByZS10cmlnZ2VyIHRoZSBydW4uIEFib3ZlIHRoaXMgc2l6ZSB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aCwgd2hvc2VcbiAqIHF1ZXVlIG1lc3NhZ2UgY2FycmllcyBvbmx5IHRoZSBydW4gSUQgKHRoZSBwYXlsb2FkIGxpdmVzIGluIHRoZSBldmVudCBsb2cpLlxuICovXG5jb25zdCBNQVhfSU5MSU5FX1JFU1VNRV9QQVlMT0FEX0JZVEVTID0gMTI4ICogMTAyNDtcblxuLyoqXG4gKiBIZXggU0hBLTI1NiBvZiB0aGUgc2VyaWFsaXplZCByZXN1bWUgcGF5bG9hZCBieXRlcy4gQ29tcHV0ZWQgb25jZSBieSB0aGVcbiAqIHByb2R1Y2VyIGFuZCBmb3J3YXJkZWQgdmVyYmF0aW0gb24gYm90aCB0aGUgZGlyZWN0IGBob29rX3JlY2VpdmVkYCB3cml0ZSBhbmRcbiAqIHRoZSBxdWV1ZSBgaG9va0lucHV0YCwgc28gYm90aCB3cml0ZXJzIG9mIHRoZSBzYW1lIGByZXN1bWVJZGAgcmVjb3JkIGFuXG4gKiBpZGVudGljYWwgZGlnZXN0IG9uIHRoZSBzZXJ2ZXIncyBgKHJ1bklkLCByZXN1bWVJZClgIGNvbnN0cmFpbnQuIEhhc2hpbmcgdGhlXG4gKiBhbHJlYWR5LXNlcmlhbGl6ZWQgYnl0ZXMgKG5vdCB0aGUgcmF3IHZhbHVlKSBrZWVwcyBwcm9kdWNlciBhbmQgY29uc3VtZXIgaW5cbiAqIGxvY2tzdGVwIOKAlCB0aGUgY29uc3VtZXIgZm9yd2FyZHMgdGhpcyBzdHJpbmcgd2l0aG91dCByZWNvbXB1dGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVJlc3VtZVBheWxvYWREaWdlc3QoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWdlc3QgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ5dGVzKTtcbiAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGRpZ2VzdCk7XG4gIGxldCBoZXggPSAnJztcbiAgZm9yIChjb25zdCBiIG9mIHZpZXcpIHtcbiAgICBoZXggKz0gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuICByZXR1cm4gaGV4O1xufVxuXG4vKipcbiAqIFRoZSByZXN1bWUgY29udGV4dCBmb3IgYSBob29rIHBsdXMgd2hlcmUgaXQgY2FtZSBmcm9tLiBgcnVuYCBpcyBwcmVzZW50IG9ubHlcbiAqIG9uIHRoZSBmYWxsYmFjayBwYXRoIChwcmUtYHJlc3VtZUNvbnRleHRgIGhvb2tzKSwgd2hlcmUgaXQgYWxzbyBjYXJyaWVzIHRoZVxuICogcnVuJ3MgbXV0YWJsZSBzdGF0dXMgZm9yIHRoZSB0ZXJtaW5hbC1ydW4gY2hlY2suIEtleSByZXNvbHV0aW9uIGlzIGtlcHRcbiAqIHNlcGFyYXRlIHNvIGNhbGxlcnMgY2FuIGdhdGUgaXQgYmVoaW5kIHRoYXQgY2hlY2suXG4gKi9cbmludGVyZmFjZSBIb29rUmVzdW1lSW5mbyB7XG4gIHJlc3VtZUNvbnRleHQ6IEhvb2tSZXN1bWVDb250ZXh0O1xuICBzb3VyY2U6ICdob29rJyB8ICdydW5fZmFsbGJhY2snO1xuICBydW4/OiBXb3JrZmxvd1J1bjtcbn1cblxuLyoqIERlcml2ZSBhIHJlc3VtZSBjb250ZXh0IGZyb20gYSBmdWxsIHJ1biAoZmFsbGJhY2sgZm9yIHByZS1gcmVzdW1lQ29udGV4dGAgaG9va3MpLiAqL1xuZnVuY3Rpb24gcmVzdW1lQ29udGV4dEZyb21SdW4ocnVuOiBXb3JrZmxvd1J1bik6IEhvb2tSZXN1bWVDb250ZXh0IHtcbiAgY29uc3QgY29yZVZlcnNpb24gPSBydW4uZXhlY3V0aW9uQ29udGV4dD8ud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgY29uc3QgdHJhY2VDYXJyaWVyID0gcnVuLmV4ZWN1dGlvbkNvbnRleHQ/LnRyYWNlQ2FycmllcjtcbiAgY29uc3QgaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHJ1bi5leGVjdXRpb25Db250ZXh0Py5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICByZXR1cm4ge1xuICAgIGRlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgcnVuU3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbixcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOlxuICAgICAgdHlwZW9mIGNvcmVWZXJzaW9uID09PSAnc3RyaW5nJyA/IGNvcmVWZXJzaW9uIDogdW5kZWZpbmVkLFxuICAgIHRyYWNlQ2FycmllcjpcbiAgICAgIHRyYWNlQ2FycmllciAmJiB0eXBlb2YgdHJhY2VDYXJyaWVyID09PSAnb2JqZWN0J1xuICAgICAgICA/ICh0cmFjZUNhcnJpZXIgYXMgSG9va1Jlc3VtZUNvbnRleHRbJ3RyYWNlQ2FycmllciddKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBlbmNyeXB0aW9uUHVibGljS2V5OiBydW4uZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uOlxuICAgICAgdHlwZW9mIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPT09ICdudW1iZXInXG4gICAgICAgID8gaG9va1Jlc3VtZUlucHV0VmVyc2lvblxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHJlc3VtZSBjb250ZXh0IGZvciBhIGhvb2suIFVzZXMgdGhlIHN0b3JlZCBgcmVzdW1lQ29udGV4dGAgd2hlblxuICogcHJlc2VudCAoZmFzdCBwYXRoIOKAlCBubyBydW4gcmVhZCk7IG90aGVyd2lzZSBmZXRjaGVzIHRoZSBydW4gYW5kIHN5bnRoZXNpemVzXG4gKiBpdC4gRG9lcyBOT1QgcmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkg4oCUIGNhbGxlcnMgZG8gdGhhdCBzZXBhcmF0ZWx5LiBPbmx5XG4gKiB0aGUgZmFsbGJhY2sgcGF0aCBjYW4gZ2F0ZSBrZXkgd29yayBiZWhpbmQgYSBsb2NhbCB0ZXJtaW5hbC1ydW4gY2hlY2sgKGl0XG4gKiBoYXMgdGhlIGZldGNoZWQgcnVuKTsgdGhlIGZhc3QgcGF0aCdzIHN0b3JlZCBjb250ZXh0IGNhcnJpZXMgbm8gc3RhdHVzLCBzb1xuICogc2VhbC9zZXJpYWxpemF0aW9uIHdvcmsgbWF5IHJ1biBiZWZvcmUgdGhlIHJlY2VpdmluZyBzaWRlIHJlamVjdHNcbiAqIGBob29rX3JlY2VpdmVkYCBmb3IgYW4gZW5kZWQgcnVuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSG9va1Jlc3VtZUluZm8oaG9vazogSG9vayk6IFByb21pc2U8SG9va1Jlc3VtZUluZm8+IHtcbiAgaWYgKGhvb2sucmVzdW1lQ29udGV4dCkge1xuICAgIHJldHVybiB7IHJlc3VtZUNvbnRleHQ6IGhvb2sucmVzdW1lQ29udGV4dCwgc291cmNlOiAnaG9vaycgfTtcbiAgfVxuICBjb25zdCBydW4gPSBhd2FpdCAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpLnJ1bnMuZ2V0KGhvb2sucnVuSWQpO1xuICByZXR1cm4ge1xuICAgIHJlc3VtZUNvbnRleHQ6IHJlc3VtZUNvbnRleHRGcm9tUnVuKHJ1biksXG4gICAgc291cmNlOiAncnVuX2ZhbGxiYWNrJyxcbiAgICBydW4sXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcnVuJ3Mgc3ltbWV0cmljIGtleSBmb3IgYSBwYXlsb2FkIFdSSVRFLCBhcyBhIGJhcmUgYENyeXB0b0tleWBcbiAqIChgaW1wb3J0S2V5YCkg4oCUIHRoZSBgZW5jcmAgd3JpdGUgZmFsbGJhY2sgdXNlZCB3aGVuIHRoZSBydW4gcHVibGlzaGVkIG5vXG4gKiBwdWJsaWMga2V5IHRvIHNlYWwgdG8uIFdyaXRpbmcgbmVlZHMgb25seSB0aGUgQUVTIGtleSwgbm90IHRoZSByZWFkLXNpZGVcbiAqIGtleXBhaXIuIE9uIHRoZSBmYXN0IHBhdGggdGhpcyBuZWVkcyBvbmx5IGBydW5JZGAgKyBgZGVwbG95bWVudElkYCAobm8gcnVuXG4gKiBlbnRpdHkpOyBvbiB0aGUgZmFsbGJhY2sgcGF0aCB0aGUgYWxyZWFkeSBmZXRjaGVkIHJ1biBpcyByZXVzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb29rRW5jcnlwdGlvbktleShcbiAgaG9vazogSG9vayxcbiAgaW5mbzogSG9va1Jlc3VtZUluZm9cbik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnRLZXk+PiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCByYXdLZXkgPSBpbmZvLnJ1blxuICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGluZm8ucnVuKVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhvb2sucnVuSWQsIHtcbiAgICAgICAgZGVwbG95bWVudElkOiBpbmZvLnJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgfSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgaG9vazogSG9vaztcbiAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgY29uc3QgaG9vayA9IGF3YWl0IHdvcmxkLmhvb2tzLmdldEJ5VG9rZW4odG9rZW4pO1xuXG4gIC8vIE9ubHkgYSBob29rIHRoYXQgYWN0dWFsbHkgY2FycmllcyBtZXRhZGF0YSBuZWVkcyB0aGUgcnVuJ3Mga2V5IHJlc29sdmVkXG4gIC8vIGhlcmU6IGh5ZHJhdGluZyB0aGF0IG1ldGFkYXRhIGlzIGEgUkVBRCwgc28gZGVyaXZlIHRoZSBmdWxsIFJ1blBheWxvYWRLZXlzXG4gIC8vICh3aGljaCBvcGVucyBzZWFsZWQgYGVuY3BgIG1ldGFkYXRhLCBub3QganVzdCBzeW1tZXRyaWMgYGVuY3JgKS4gVGhlIGNvbW1vblxuICAvLyBkZWZhdWx0IHdlYmhvb2sg4oCUIGNyZWF0ZVdlYmhvb2soKSB3aXRoIG5vIGByZXNwb25kV2l0aGAg4oCUIHN0b3JlcyBub1xuICAvLyBtZXRhZGF0YSwgc28gaXQgc2tpcHMgdGhpcyBlbnRpcmVseTogbm8gfjM1MG1zIGBydW4ta2V5YCBBUEkgcm91bmQgdHJpcCxcbiAgLy8gYW5kLCBjcnVjaWFsbHksIG5vIHJlc29sdmVkIGtleSBoYW5kZWQgdG8gYHJlc3VtZUhvb2tgLCBsZWF2aW5nIGl0IGZyZWUgdG9cbiAgLy8gc2VhbCB0aGUgcGF5bG9hZCB0byB0aGUgcnVuJ3MgcHVibGlzaGVkIHB1YmxpYyBrZXkgaW5zdGVhZC4gTWV0YWRhdGEtXG4gIC8vIGJlYXJpbmcgd2ViaG9va3Mgc3RpbGwgbGVnaXRpbWF0ZWx5IHBheSBvbmUgbG9va3VwIHRvIGh5ZHJhdGUuXG4gIGxldCBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2subWV0YWRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHJlc29sdmVIb29rUmVzdW1lSW5mbyhob29rKTtcbiAgICAvLyBPbiB0aGUgZmFzdCBwYXRoIHRoaXMgcmVzb2x2ZXMgdGhlIGtleSBieSBydW5JZCArIGRlcGxveW1lbnRJZCAobm8gcnVuXG4gICAgLy8gcmVhZCk7IG9uIHRoZSBmYWxsYmFjayBwYXRoIGl0IHJldXNlcyB0aGUgYWxyZWFkeS1mZXRjaGVkIHJ1bi5cbiAgICBjb25zdCByYXdLZXkgPSBpbmZvLnJ1blxuICAgICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaW5mby5ydW4pXG4gICAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/Lihob29rLnJ1bklkLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkOiBpbmZvLnJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgICB9KTtcbiAgICBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICBob29rLm1ldGFkYXRhID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICBob29rLm1ldGFkYXRhIGFzIGFueSxcbiAgICAgIGhvb2sucnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5XG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBob29rLCBlbmNyeXB0aW9uS2V5IH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBob29rIGJ5IHRva2VuIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQgd29ya2Zsb3cgcnVuLFxuICogYW5kIGh5ZHJhdGUgdGhlIGBtZXRhZGF0YWAgcHJvcGVydHkgaWYgaXQgd2FzIHNldCBmcm9tIHdpdGhpblxuICogdGhlIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBBIEhvb2sga2VwdCBieSBtaW5pbXVtIHJldGVudGlvbiByZW1haW5zIGF2YWlsYWJsZSBoZXJlIGFmdGVyIGl0cyBydW4gZW5kcyxcbiAqIGJ1dCBjYW5ub3QgYmUgcmVzdW1lZC5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxIb29rPiB7XG4gIGNvbnN0IHsgaG9vayB9ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuKTtcbiAgcmV0dXJuIGhvb2s7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgcmVzdW1lSG9va306IGEge0BsaW5rIEhvb2t9IGF1Z21lbnRlZCB3aXRoIGFuIG9wdGlvbmFsXG4gKiByZXNpbGllbmNlIHNpZ25hbC5cbiAqXG4gKiBPbiB0aGUgcGFyYWxsZWwgZmFzdCBwYXRoLCBgcmVzdW1lSG9vaygpYCB3cml0ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCBhbmRcbiAqIGRpc3BhdGNoZXMgdGhlIHdvcmtmbG93IHF1ZXVlIG1lc3NhZ2UgY29uY3VycmVudGx5LiBXaGVuIHRoZSBkaXJlY3QgZXZlbnRcbiAqIHdyaXRlIGZhaWxzICp0cmFuc2llbnRseSog4oCUIGEgNDI5LzV4eCwgYSB0cmFuc3BvcnQgZXJyb3IsIG9yIGFuIGV4cGVjdGVkXG4gKiBgKHJ1bklkLCByZXN1bWVJZClgIGNvbmZsaWN0IHdpdGggaXRzIG93biByZS1lbnN1cmluZyBjb25zdW1lciDigJQgYnV0IHRoZSBxdWV1ZVxuICogZGlzcGF0Y2ggc3VjY2VlZHMsIHRoZSByZXN1bWUgaXMgc3RpbGwgZ3VhcmFudGVlZDogdGhlIHF1ZXVlIGNvbnN1bWVyXG4gKiBpZGVtcG90ZW50bHkgbWF0ZXJpYWxpemVzIHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSB0aGUgcGF5bG9hZCBjYXJyaWVkXG4gKiBvbiB0aGUgbWVzc2FnZSBiZWZvcmUgcmVwbGF5LiBJbiB0aGF0IHJlY292ZXJlZCBjYXNlIHRoZSByZXR1cm5lZCBob29rIGNhcnJpZXNcbiAqIGByZXNpbGllbnRSZXN1bWU6IHRydWVgLlxuICpcbiAqIE9uIHRoZSBoYXBweSBwYXRoICh0aGUgZGlyZWN0IHdyaXRlIGxhbmRlZCkgYW5kIG9uIHRoZSBzZXF1ZW50aWFsIGZhbGxiYWNrXG4gKiBwYXRoLCB0aGUgZmxhZyBpcyBhYnNlbnQgKGB1bmRlZmluZWRgKS4gQ2FsbGVycyB0aGF0IGRvbid0IGNhcmUgYWJvdXQgdGhlXG4gKiBkaXN0aW5jdGlvbiBjYW4gdHJlYXQgdGhlIHJlc3VsdCBhcyBhIHBsYWluIHtAbGluayBIb29rfS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lZEhvb2sgPSBIb29rICYgeyByZXNpbGllbnRSZXN1bWU/OiBib29sZWFuIH07XG5cbi8qKlxuICogUmVzdW1lcyBhIHdvcmtmbG93IHJ1biBieSBzZW5kaW5nIGEgcGF5bG9hZCB0byBhIGhvb2sgaWRlbnRpZmllZCBieSBpdHMgdG9rZW4uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXh0ZXJuYWxseSAoZS5nLiwgZnJvbSBhbiBBUEkgcm91dGUgb3Igc2VydmVyIGFjdGlvbilcbiAqIHRvIHNlbmQgZGF0YSB0byBhIGhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuT3JIb29rIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9vaywgb3IgdGhlIGhvb2sgb2JqZWN0IGl0c2VsZlxuICogQHBhcmFtIHBheWxvYWQgLSBUaGUgZGF0YSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB7QGxpbmsgUmVzdW1lZEhvb2t9XG4gKiBAdGhyb3dzIHtIb29rTm90Rm91bmRFcnJvcn0gSWYgdGhlIEhvb2sgZG9lcyBub3QgZXhpc3Qgb3IgaXRzIHJ1biBoYXMgZW5kZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGltcG9ydCB7IHJlc3VtZUhvb2sgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gKiAgIGNvbnN0IHsgdG9rZW4sIGRhdGEgfSA9IGF3YWl0IHJlcXVlc3QuanNvbigpO1xuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCBob29rID0gYXdhaXQgcmVzdW1lSG9vayh0b2tlbiwgZGF0YSk7XG4gKiAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oeyBydW5JZDogaG9vay5ydW5JZCB9KTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdIb29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lSG9vazxUID0gYW55PihcbiAgdG9rZW5Pckhvb2s6IHN0cmluZyB8IEhvb2ssXG4gIHBheWxvYWQ6IFQsXG4gIGVuY3J5cHRpb25LZXlPdmVycmlkZT86IFBheWxvYWRLZXlcbik6IFByb21pc2U8UmVzdW1lZEhvb2s+IHtcbiAgLy8gUHVibGljIGVudHJ5IHBvaW50LiBJdCBuZXZlciBhdHRlc3RzIGhvb2sgZnJlc2huZXNzLCBzbyBhIEhvb2sgb2JqZWN0XG4gIC8vIHN1cHBsaWVkIGhlcmUg4oCUIHdoaWNoIG1heSBjYXJyeSBhIGByZXN1bWVDYXBhYmlsaXRpZXNgIGNhY2hlZCBiZWZvcmUgYVxuICAvLyBzZXJ2ZXIgcm9sbGJhY2sgb3Iga2lsbCBzd2l0Y2gg4oCUIGlzIGlnbm9yZWQgYnkgdGhlIGR5bmFtaWMtZGVkdXAgZ2F0ZSBhbmRcbiAgLy8gZmFpbHMgY2xvc2VkIHRvIHRoZSBzZXF1ZW50aWFsIHBhdGguIE9ubHkgYHJlc3VtZVdlYmhvb2tgLCB3aGljaCBmZXRjaGVzXG4gIC8vIHRoZSBob29rIGJ5IHRva2VuIGluLWxpbmUgZHVyaW5nIHRoZSBzYW1lIHJlc3VtZSwgcmVhY2hlcyB0aGUgaW50ZXJuYWxcbiAgLy8gaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgZnJlc2ggYXR0ZXN0YXRpb24gc2V0LiBLZWVwaW5nIHRoZSBmcmVzaG5lc3MgZmxhZ1xuICAvLyBvZmYgdGhlIGV4cG9ydGVkIHNpZ25hdHVyZSBwcmV2ZW50cyBhIGNhbGxlciBmcm9tIHBhc3NpbmcgYSBzdGFsZSBIb29rIHBsdXNcbiAgLy8gYHRydWVgIGFuZCByZWFjdGl2YXRpbmcgZHluYW1pYyBkZWR1cCBhZ2FpbnN0IGEgcm9sbGVkLWJhY2sgYmFja2VuZC5cbiAgcmV0dXJuIHJlc3VtZUhvb2tJbXBsKHRva2VuT3JIb29rLCBwYXlsb2FkLCBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgcmVzdW1lSG9va30uIE5PVCBleHBvcnRlZDogdGhlXG4gKiBgaG9va0ZyZXNobHlMb29rZWRVcGAgYXR0ZXN0YXRpb24gbXVzdCBuZXZlciBiZSByZWFjaGFibGUgYnkgcHVibGljIGNhbGxlcnNcbiAqIChzZWUgdGhlIHdyYXBwZXIgYWJvdmUpLlxuICpcbiAqIEBwYXJhbSBob29rRnJlc2hseUxvb2tlZFVwIC0gQXR0ZXN0cyB0aGF0IGEgc3VwcGxpZWQgSG9vayBvYmplY3Qgd2FzIGZldGNoZWRcbiAqICAgYnkgdG9rZW4gZHVyaW5nIFRISVMgcmVzdW1lLCBzbyBpdHMgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYFxuICogICByZWZsZWN0cyB0aGUgbGl2ZSBiYWNrZW5kIGFuZCBtYXkgYmUgdHJ1c3RlZCBmb3IgdGhlIGR5bmFtaWMtZGVkdXAgZ2F0ZS5cbiAqICAgQSB0b2tlbiBzdHJpbmcgaXMgYWx3YXlzIGZldGNoZWQgZnJlc2ggaGVyZSwgc28gaXQgaXMgaW1wbGljaXRseSBmcmVzaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzdW1lSG9va0ltcGw8VCA9IGFueT4oXG4gIHRva2VuT3JIb29rOiBzdHJpbmcgfCBIb29rLFxuICBwYXlsb2FkOiBULFxuICBlbmNyeXB0aW9uS2V5T3ZlcnJpZGU6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGhvb2tGcmVzaGx5TG9va2VkVXA6IGJvb2xlYW5cbik6IFByb21pc2U8UmVzdW1lZEhvb2s+IHtcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gdHJhY2UoJ2hvb2sucmVzdW1lJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1cHBsaWVkVG9rZW4gPSB0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCBob29rOiBIb29rID0gc3VwcGxpZWRUb2tlblxuICAgICAgICAgID8gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbk9ySG9vaylcbiAgICAgICAgICA6IHRva2VuT3JIb29rO1xuICAgICAgICAvLyBUaGUgZHluYW1pYywgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYCBtYXkgb25seSBiZSB0cnVzdGVkXG4gICAgICAgIC8vIHdoZW4gaXQgY2FtZSBmcm9tIGEgYnktdG9rZW4gbG9va3VwIHBlcmZvcm1lZCBkdXJpbmcgdGhpcyByZXN1bWUuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaCA9XG4gICAgICAgICAgc3VwcGxpZWRUb2tlbiB8fCBob29rRnJlc2hseUxvb2tlZFVwO1xuXG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlSG9va1Jlc3VtZUluZm8oaG9vayk7XG4gICAgICAgIGNvbnN0IHsgcmVzdW1lQ29udGV4dCB9ID0gaW5mbztcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9jb250ZXh0X3NvdXJjZSc6IGluZm8uc291cmNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCBpbnRlbnRpb25hbGx5IG9taXRzIHRoZSBydW4ncyBtdXRhYmxlXG4gICAgICAgIC8vIHN0YXR1cywgc28gdGhpcyBlYXJseSBjbGllbnQtc2lkZSByZWplY3Rpb24gb25seSBydW5zIG9uIHRoZVxuICAgICAgICAvLyBmYWxsYmFjayBwYXRoICh3aGljaCBmZXRjaGVkIHRoZSBydW4pLiBPbiB0aGUgZmFzdCBwYXRoIHRoZSB0ZXJtaW5hbFxuICAgICAgICAvLyBjaGVjayBoYXBwZW5zIHNlcnZlci1zaWRlOiBgaG9va19yZWNlaXZlZGAgYWdhaW5zdCBhbiBlbmRlZCBydW4gaXNcbiAgICAgICAgLy8gcmVqZWN0ZWQsIHdoaWNoIHRoZSBjYXRjaCBhcm91bmQgYHdvcmxkLmV2ZW50cy5jcmVhdGVgIGJlbG93IHJlLWtleXNcbiAgICAgICAgLy8gdG8gSG9va05vdEZvdW5kRXJyb3Ig4oCUIHNhbWUgcHVibGljIGNvbnRyYWN0LCBubyBydW4gcHJlLWZldGNoLlxuICAgICAgICBpZiAoaW5mby5ydW4gJiYgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKGluZm8ucnVuLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LCBhbmQgcnVucyBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAvLyBieXRlLXN0cmVhbSBmcmFtaW5nIHN1cHBvcnQgY2Fubm90IGRlY29kZSBmcmFtZWQgYnl0ZSBzdHJlYW1zLlxuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gICAgICAgICAgcmVzdW1lQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgcGF5bG9hZCBmb3IgdGhlIHRhcmdldCBydW4gKGEgV1JJVEUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBQcmVmZXJyZWQgcGF0aDogc2VhbCB0byB0aGUgcnVuJ3MgcHVibGlzaGVkIFgyNTUxOSBwdWJsaWMga2V5LCB3aGljaFxuICAgICAgICAvLyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCBjYXJyaWVzIGlubGluZS4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIGlzXG4gICAgICAgIC8vIHRoZSB3aG9sZSB3aW4g4oCUIG5vIHJ1biByZWFkIEFORCBubyBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAsIHdob3NlXG4gICAgICAgIC8vIH4zNTBtcyBgcnVuLWtleWAgQVBJIHJvdW5kIHRyaXAgZG9taW5hdGVzIGNyb3NzLWRlcGxveW1lbnQgaG9va1xuICAgICAgICAvLyByZXN1bXB0aW9uIGxhdGVuY3kuIChPbiB0aGUgZmFsbGJhY2sgcGF0aCB0aGUga2V5IGlzIHN5bnRoZXNpemVkXG4gICAgICAgIC8vIGZyb20gdGhlIGZldGNoZWQgcnVuLCB3aGljaCBhbHNvIGNhcnJpZXMgaXQuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWFsaW5nIGFsc28gZHJvcHMgcHJpdmlsZWdlOiB0aGUgcmVzdW1lciBlbmRzIHVwIGFibGUgdG8gd3JpdGUgYVxuICAgICAgICAvLyBwYXlsb2FkIGZvciB0aGUgcnVuIHdpdGhvdXQgYmVpbmcgYWJsZSB0byByZWFkIGFueXRoaW5nIG9mIHRoZVxuICAgICAgICAvLyBydW4ncywgd2hlcmUgZmV0Y2hpbmcgdGhlIHN5bW1ldHJpYyBrZXkgZ3JhbnRzIGJvdGguXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSBOT1QgZ2F0ZWQgb24gYGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzYCB0aGUgd2F5XG4gICAgICAgIC8vIHRoZSBzeW1tZXRyaWMgZmFsbGJhY2sgYmVsb3cgZ2F0ZXMgYGVuY3JgOiBwcmVzZW5jZSBvZiB0aGUgcHVibGljIGtleVxuICAgICAgICAvLyBpcyBpdHNlbGYgdGhlIGdhdGUuIEEgcnVuIG9ubHkgY2FycmllcyBvbmUgaWYgdGhlIHJ1bnRpbWUgdGhhdFxuICAgICAgICAvLyBjcmVhdGVkIGl0IGNvdWxkIGFsc28gb3BlbiBhIHNlYWxlZCBwYXlsb2FkLCBhbmQgcnVucyBhcmUgcGlubmVkIHRvXG4gICAgICAgIC8vIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsIHNvIHByZXNlbmNlIGlzIGEgbW9yZSByZWxpYWJsZSBhdHRlc3RhdGlvblxuICAgICAgICAvLyB0aGFuIGEgdmVyc2lvbiBjb21wYXJlIOKAlCBhbmQgaXQgc3RheXMgY29ycmVjdCBldmVuIHdoZW4gcGFja2FnZVxuICAgICAgICAvLyB2ZXJzaW9ucyBkcmlmdC5cbiAgICAgICAgbGV0IHBheWxvYWRLZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJ1blB1YmxpY0tleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZVxuICAgICAgICAgID8gLy8gVGhlIGNhbGxlciBhbHJlYWR5IGhvbGRzIGEga2V5IChyZXN1bWVXZWJob29rIHJlc29sdmVkIG9uZSB0b1xuICAgICAgICAgICAgLy8gaHlkcmF0ZSBob29rIG1ldGFkYXRhKSwgc28gc2VhbGluZyB3b3VsZCBhZGQgYW4gRUNESCBmb3Igbm9cbiAgICAgICAgICAgIC8vIHNhdmVkIHJvdW5kIHRyaXAuIFJldXNlIHdoYXQgaXQgcmVzb2x2ZWQuXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICA6IGRlY29kZVJ1blB1YmxpY0tleShyZXN1bWVDb250ZXh0LmVuY3J5cHRpb25QdWJsaWNLZXkpO1xuXG4gICAgICAgIGlmIChydW5QdWJsaWNLZXkpIHtcbiAgICAgICAgICBwYXlsb2FkS2V5ID0gc2VhbFRvKHJ1blB1YmxpY0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3ltbWV0cmljIGBlbmNyYCB3cml0ZSBmYWxsYmFjazogbmVlZHMgb25seSB0aGUgQUVTIGtleVxuICAgICAgICAgIC8vIChhIGJhcmUgQ3J5cHRvS2V5IHZpYSBgcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5YCksIG5vdCB0aGVcbiAgICAgICAgICAvLyByZWFkLXNpZGUgUnVuUGF5bG9hZEtleXMuXG4gICAgICAgICAgbGV0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICAgICAgZW5jcnlwdGlvbktleU92ZXJyaWRlID8/XG4gICAgICAgICAgICAoYXdhaXQgcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KGhvb2ssIGluZm8pKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF5bG9hZEtleSA9IGVuY3J5cHRpb25LZXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wcmVzcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBydW4gYW5kIGl0cyBkZXBsb3ltZW50IHN1cHBvcnQgdGhlXG4gICAgICAgIC8vIGNvbXByZXNzaW9uIGZvcm1hdHMgaW50cm9kdWNlZCB3aXRoIHNwZWMgdmVyc2lvbiA1LlxuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgICAgKHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTiAmJlxuICAgICAgICAgIGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVApO1xuXG4gICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgcGF5bG9hZCBmb3Igc3RvcmFnZVxuICAgICAgICBjb25zdCBvcHM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihob29rLnNwZWNWZXJzaW9uKTtcbiAgICAgICAgY29uc3QgZGVoeWRyYXRlZFBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgIHBheWxvYWRLZXksXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgdjFDb21wYXQsXG4gICAgICAgICAgY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZXNlIHBheWxvYWQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlXG4gICAgICAgIC8vIHByb21pc2UgaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZFxuICAgICAgICAvLyB3YWl0VW50aWwgcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSxcbiAgICAgICAgLy8gc28gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgIC8vIE5PVEU6IHJlamVjdGlvbnMgd2l0aCBgdW5kZWZpbmVkYCBhcmUgYW4gZXhwZWN0ZWQgYXJ0aWZhY3Qgb2YgdGhlXG4gICAgICAgIC8vIHdlYmhvb2sgYnVuZGxlIGFuZCBhcmUgaWdub3JlZCBlbnRpcmVseS5cbiAgICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdCYWNrZ3JvdW5kIGZsdXNoIG9mIGhvb2sgcGF5bG9hZCBvcHMgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGluayB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHN0b3JlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgIC8vIChza2lwcGVkIHdoZW4gYWJzZW50IG9yIGludmFsaWQpLiBSZXNvbHZlZCBiZWZvcmUgZGlzcGF0Y2ggc28gYm90aFxuICAgICAgICAvLyB0aGUgc2VxdWVudGlhbCBhbmQgcGFyYWxsZWwgcGF0aHMgYXR0YWNoIGl0LlxuICAgICAgICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyKTtcbiAgICAgICAgaWYgKG9yaWdpbkxpbmspIHtcbiAgICAgICAgICBzcGFuPy5hZGRMaW5rPy4ob3JpZ2luTGluayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudERhdGEgPSB7XG4gICAgICAgICAgLi4uKHYxQ29tcGF0ID8ge30gOiB7IHRva2VuOiBob29rLnRva2VuIH0pLFxuICAgICAgICAgIHBheWxvYWQ6IGRlaHlkcmF0ZWRQYXlsb2FkLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHF1ZXVlTmFtZSA9IGdldFdvcmtmbG93UXVldWVOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKTtcbiAgICAgICAgY29uc3QgcXVldWVPcHRpb25zID0ge1xuICAgICAgICAgIGRlcGxveW1lbnRJZDogcmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBwYXJhbGxlbGl6ZSB0aGUgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZCB0aGUgcXVldWVcbiAgICAgICAgLy8gcHVibGlzaC4gVGhlIGZhc3QgcGF0aCBpcyBvbmx5IHNhZmUgd2hlbiBFVkVSWSBwcmVjb25kaXRpb24gaG9sZHM7IHRoZVxuICAgICAgICAvLyBmaXJzdCB0aGF0IGZhaWxzIG5hbWVzIHRoZSBmYWxsYmFjayByZWFzb24gKGVtaXR0ZWQgYXMgYSBzcGFuXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBmb3Igb2JzZXJ2YWJpbGl0eSwgYW5kIHRvIG1ha2UgXCJ3aHkgZGlkIHRoaXMgcnVuIHNlcXVlbnRpYWxcIlxuICAgICAgICAvLyBhbnN3ZXJhYmxlIGluIHByb2R1Y3Rpb24pLiBBbGwgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gIC0ga2lsbCBzd2l0Y2g6IGBXT1JLRkxPV19ESVNBQkxFX0xBWllfSE9PS19SRVNVTUVgIGZvcmNlcyBzZXF1ZW50aWFsXG4gICAgICAgIC8vICAgIGlmIHRoZSBmYXN0IHBhdGggZXZlciBtaXNiZWhhdmVzLiBJdCBpcyBhbiBTREstZGVwbG95bWVudCBlbnYgdmFyLFxuICAgICAgICAvLyAgICBzbyBjaGFuZ2luZyBpdCBnZW5lcmFsbHkgcmVxdWlyZXMgcmVkZXBsb3lpbmcgdGhlIHdvcmtmbG93XG4gICAgICAgIC8vICAgIGRlcGxveW1lbnQuIChUaGUgYmFja2VuZCBjYW4gaW5kZXBlbmRlbnRseSBkcm9wIG5ldyByZXN1bWVzIHRvIHRoZVxuICAgICAgICAvLyAgICBzZXF1ZW50aWFsIHBhdGggZmxlZXQtd2lkZSBieSBjZWFzaW5nIHRvIGF0dGVzdCBkZWR1cCBzdXBwb3J0IG9uXG4gICAgICAgIC8vICAgIHRoZSBieS10b2tlbiBsb29rdXAg4oCUIHNlZSB0aGUgYmFja2VuZC1kZWR1cCBjb25kaXRpb24gYmVsb3cuKVxuICAgICAgICAvLyAgLSBiYWNrZW5kIGRlZHVwOiB0aGUgbGl2ZSBiYWNrZW5kIG11c3QgZW5mb3JjZSB0aGVcbiAgICAgICAgLy8gICAgYChydW5JZCwgcmVzdW1lSWQpYCBjb25zdHJhaW50LCBvciB0aGUgdHdvIHdyaXRlcnMgd291bGQgY29tbWl0IHR3b1xuICAgICAgICAvLyAgICBgaG9va19yZWNlaXZlZGAgZXZlbnRzLiBGYWlsIGNsb3NlZC4gQXR0ZXN0ZWQgYnkgRUlUSEVSIGEgZnJlc2gsXG4gICAgICAgIC8vICAgIHJlc3BvbnNlLW9ubHkgYGhvb2sucmVzdW1lQ2FwYWJpbGl0aWVzLmhvb2tSZXN1bWVEZWR1cFZlcnNpb25gIGZyb21cbiAgICAgICAgLy8gICAgdGhlIGJ5LXRva2VuIGxvb2t1cCAod29ybGQtdmVyY2VsIOKAlCByZWNvbXB1dGVkIGV2ZXJ5IHJlYWQsIHNvIGFcbiAgICAgICAgLy8gICAgc2VydmVyIHJvbGxiYWNrIG9yIGtpbGwgc3dpdGNoIGRyb3BzIHRvIHNlcXVlbnRpYWwgaW1tZWRpYXRlbHkpIE9SXG4gICAgICAgIC8vICAgIHRoZSBzdGF0aWMgYHdvcmxkLmNhcGFiaWxpdGllcy5ob29rUmVzdW1lRGVkdXBgICh3b3JsZC1sb2NhbCwgd2hvc2VcbiAgICAgICAgLy8gICAgYWRhcHRlciBhbmQgYmFja2VuZCBzaGlwIHRvZ2V0aGVyKS4gVGhlIHJlc3BvbnNlLW9ubHkgY2FwYWJpbGl0eSBpc1xuICAgICAgICAvLyAgICB0cnVzdGVkIE9OTFkgd2hlbiB0aGUgaG9vayB3YXMgbG9va2VkIHVwIGJ5IHRva2VuIGR1cmluZyB0aGlzXG4gICAgICAgIC8vICAgIHJlc3VtZSAoYGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaGApOyBhIEhvb2sgb2JqZWN0IGhhbmRlZCBpblxuICAgICAgICAvLyAgICBieSBhIHB1YmxpYyBjYWxsZXIgbWF5IGNhcnJ5IGEgY2FwYWJpbGl0eSBjYWNoZWQgYmVmb3JlIGEgcm9sbGJhY2ssXG4gICAgICAgIC8vICAgIHNvIGl0IGlzIGlnbm9yZWQgYW5kIHRoZSBwYXRoIGZhbGxzIGJhY2sgdG8gc2VxdWVudGlhbC5cbiAgICAgICAgLy8gIC0gY29uc3VtZXIgc3VwcG9ydDogdGhlIHRhcmdldCBydW4ncyBkZXBsb3ltZW50IG11c3QgcmUtZW5zdXJlIHRoZVxuICAgICAgICAvLyAgICBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQXR0ZXN0ZWQgYnkgdGhlIHJ1bidzIGV4cGxpY2l0XG4gICAgICAgIC8vICAgIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCBleGVjdXRpb24tY29udGV4dCBtYXJrZXIgKG1pcnJvcmVkIG9udG9cbiAgICAgICAgLy8gICAgcmVzdW1lQ29udGV4dCksIE5PVCBhIHZlcnNpb24tY29tcGFyZSBhZ2FpbnN0IGEgcHJlZGljdGVkIHJlbGVhc2VcbiAgICAgICAgLy8gICAgY3V0b2ZmLiBBYnNlbnQg4oaSIGEgbG9zdCBwcm9kdWNlciB3cml0ZSB3b3VsZCBiZSBhIGxvc3QgcmVzdW1lLlxuICAgICAgICAvLyAgLSBub3QgbGVnYWN5OiB2MUNvbXBhdCBydW5zIG9taXQgYHRva2VuYCBmcm9tIHRoZSBwcm9kdWNlcidzIGV2ZW50XG4gICAgICAgIC8vICAgIGJvZHkgYnV0IHRoZSBjb25zdW1lcidzIHJlLWVuc3VyZSBhbHdheXMgaW5jbHVkZXMgaXQsIHNvIHRoZSB0d29cbiAgICAgICAgLy8gICAgd3JpdGVycyB3b3VsZCBkaXNhZ3JlZSBvbiB0aGUgZXZlbnQgYm9keS4gTGVnYWN5IHN0YXlzIHNlcXVlbnRpYWwuXG4gICAgICAgIC8vICAtIENCT1IgdHJhbnNwb3J0OiB0aGUgcnVuIG11c3QgdXNlIENCT1IgcXVldWUgdHJhbnNwb3J0IHNvIHRoZSBiaW5hcnlcbiAgICAgICAgLy8gICAgcGF5bG9hZCBzdXJ2aXZlcyB0aGUgcXVldWUgbWVzc2FnZS5cbiAgICAgICAgLy8gIC0gcmF3IGJ5dGVzOiB0aGUgZGVoeWRyYXRlZCBwYXlsb2FkIG11c3QgYmUgYSBgVWludDhBcnJheWAgKHRoZVxuICAgICAgICAvLyAgICBjb250ZW50IGRpZ2VzdCB0aGF0IGtleXMgdGhlIGRlZHVwIGNvbnN0cmFpbnQgaXMgb3ZlciB0aGVzZSBieXRlcykuXG4gICAgICAgIC8vICAtIHNpemU6IGEgcGF5bG9hZCBhYm92ZSB0aGUgcXVldWUncyBtZXNzYWdlIGNlaWxpbmcgd291bGQgZmFpbCB0aGVcbiAgICAgICAgLy8gICAgcHVibGlzaCDigJQgd2hpY2gsIG9uIHRoZSBwYXJhbGxlbCBwYXRoLCB3b3VsZCBwZXJzaXN0IHRoZSBldmVudCBidXRcbiAgICAgICAgLy8gICAgbmV2ZXIgcmUtdHJpZ2dlciB0aGUgcnVuIOKAlCBzbyBvdmVyc2l6ZWQgcGF5bG9hZHMgc3RheSBzZXF1ZW50aWFsXG4gICAgICAgIC8vICAgICh0aGVpciBxdWV1ZSBtZXNzYWdlIGNhcnJpZXMgb25seSB0aGUgcnVuIElEKS5cbiAgICAgICAgY29uc3QgcGFyYWxsZWxSZXN1bWVEaXNhYmxlZCA9XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfRElTQUJMRV9MQVpZX0hPT0tfUkVTVU1FID09PSAnMSc7XG4gICAgICAgIC8vIEJhY2tlbmQgZGVkdXAgaXMgc3VwcG9ydGVkIHdoZW4gRUlUSEVSIHRoZSBsaXZlIHNlcnZlciBhdHRlc3RzIGl0XG4gICAgICAgIC8vIGZyZXNoIG9uIHRoaXMgYnktdG9rZW4gaG9vayAod29ybGQtdmVyY2VsOiByZXNwb25zZS1vbmx5LCByZWNvbXB1dGVkXG4gICAgICAgIC8vIGV2ZXJ5IHJlYWQsIHNvIHJvbGxiYWNrL2tpbGwtc3dpdGNoIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5KSBPUiB0aGVcbiAgICAgICAgLy8gc3RhdGljIHdvcmxkIGNhcGFiaWxpdHkgaXMgc2V0ICh3b3JsZC1sb2NhbDogYWRhcHRlciArIGJhY2tlbmQgc2hpcFxuICAgICAgICAvLyB0b2dldGhlcikuIEJvdGggYXJlIHJlLWV2YWx1YXRlZCBwZXIgcmVzdW1lLCBzbyBldmVyeSByb2xsb3V0IGFuZFxuICAgICAgICAvLyByb2xsYmFjayBkaXJlY3Rpb24gZGVncmFkZXMgc2FmZWx5IHRvIHRoZSBzZXF1ZW50aWFsIHBhdGguXG4gICAgICAgIGNvbnN0IGJhY2tlbmREZWR1cFN1cHBvcnRlZCA9XG4gICAgICAgICAgKGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaFxuICAgICAgICAgICAgPyAoaG9vay5yZXN1bWVDYXBhYmlsaXRpZXM/Lmhvb2tSZXN1bWVEZWR1cFZlcnNpb24gPz8gMClcbiAgICAgICAgICAgIDogMCkgPj0gSE9PS19SRVNVTUVfREVEVVBfVkVSU0lPTiB8fFxuICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8uaG9va1Jlc3VtZURlZHVwID09PSB0cnVlO1xuICAgICAgICBjb25zdCBmYWxsYmFja1JlYXNvbjogc3RyaW5nIHwgbnVsbCA9IHBhcmFsbGVsUmVzdW1lRGlzYWJsZWRcbiAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICA6ICFiYWNrZW5kRGVkdXBTdXBwb3J0ZWRcbiAgICAgICAgICAgID8gJ2JhY2tlbmRfdW5zdXBwb3J0ZWQnXG4gICAgICAgICAgICA6IChyZXN1bWVDb250ZXh0Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPz8gMCkgPFxuICAgICAgICAgICAgICAgIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT05cbiAgICAgICAgICAgICAgPyAnY29uc3VtZXJfdW5zdXBwb3J0ZWQnXG4gICAgICAgICAgICAgIDogdjFDb21wYXRcbiAgICAgICAgICAgICAgICA/ICdsZWdhY3knXG4gICAgICAgICAgICAgICAgOiAocmVzdW1lQ29udGV4dC5ydW5TcGVjVmVyc2lvbiA/PyAwKSA8XG4gICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICAgICAgPyAnbm9uX2Nib3JfdHJhbnNwb3J0J1xuICAgICAgICAgICAgICAgICAgOiAhKGRlaHlkcmF0ZWRQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgPyAnbm9uX2J5dGVzJ1xuICAgICAgICAgICAgICAgICAgICA6IGRlaHlkcmF0ZWRQYXlsb2FkLmJ5dGVMZW5ndGggPlxuICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lOTElORV9SRVNVTUVfUEFZTE9BRF9CWVRFU1xuICAgICAgICAgICAgICAgICAgICAgID8gJ292ZXJzaXplZCdcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHVzZVBhcmFsbGVsUmVzdW1lID0gZmFsbGJhY2tSZWFzb24gPT09IG51bGw7XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX3N0cmF0ZWd5JzogdXNlUGFyYWxsZWxSZXN1bWVcbiAgICAgICAgICAgID8gJ3BhcmFsbGVsJ1xuICAgICAgICAgICAgOiAnc2VxdWVudGlhbCcsXG4gICAgICAgICAgLi4uKGZhbGxiYWNrUmVhc29uXG4gICAgICAgICAgICA/IHsgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2ZhbGxiYWNrX3JlYXNvbic6IGZhbGxiYWNrUmVhc29uIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS1rZXkgYW55IFwiaG9vayBjYW4gbm8gbG9uZ2VyIGJlIHJlY2VpdmVkXCIgcmVqZWN0aW9uIHRvXG4gICAgICAgIC8vIEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pIHNvIGAudG9rZW5gIG1hdGNoZXMgdGhlIHByZS1mYXN0LXBhdGhcbiAgICAgICAgLy8gY29udHJhY3QsIHdoZXJlIHJlc3VtZUhvb2sgdGhyZXcgYEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pYFxuICAgICAgICAvLyBhZnRlciBpdHMgb3duIHRlcm1pbmFsIGNoZWNrLiBUaGUgc3BlY2lmaWMgZXJyb3IgZGVwZW5kcyBvbiB0aGVcbiAgICAgICAgLy8gV29ybGQ6XG4gICAgICAgIC8vICAgLSBhIGdlbnVpbmVseSBtaXNzaW5nIGhvb2sgbWFwcyB0byBIb29rTm90Rm91bmRFcnJvciAoa2V5ZWQgb24gdGhlXG4gICAgICAgIC8vICAgICBldmVudCBjb3JyZWxhdGlvbklkIC8gaG9vayBJRCk7XG4gICAgICAgIC8vICAgLSBhIHRlcm1pbmFsIHJ1biBvbiBWZXJjZWwgcmVqZWN0cyBob29rX3JlY2VpdmVkIHdpdGggNDA0LCB3aGljaFxuICAgICAgICAvLyAgICAgd29ybGQtdmVyY2VsIG1hcHMgdG8gSG9va05vdEZvdW5kRXJyb3I7XG4gICAgICAgIC8vICAgLSBhIHRlcm1pbmFsIHJ1biBvbiB3b3JsZC1sb2NhbCAvIHdvcmxkLXBvc3RncmVzIHJlamVjdHMgd2l0aFxuICAgICAgICAvLyAgICAgUnVuRXhwaXJlZEVycm9yLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbiB0aGUgU0VRVUVOVElBTCBwYXRoIGFuIEVudGl0eUNvbmZsaWN0RXJyb3IgKEhUVFAgNDA5KSBpcyBhbHNvXG4gICAgICAgIC8vIHRyZWF0ZWQgYXMgXCJob29rIGdvbmVcIiBmb3IgaGlzdG9yaWNhbCAvIGNvbmZsaWN0LXNoYXBlZC1yZWplY3Rpb25cbiAgICAgICAgLy8gY29tcGF0aWJpbGl0eTogdGhlcmUgaXMgbm8gcXVldWUgbWVzc2FnZSBpbiBmbGlnaHQsIHNvIGEgY29uZmxpY3QgaGFzXG4gICAgICAgIC8vIG5vIHJlLWVuc3VyaW5nIGNvbnN1bWVyIHRvIGNvbnZlcmdlIG9uLiBUaGUgUEFSQUxMRUwgcGF0aCBoYW5kbGVzIDQwOVxuICAgICAgICAvLyBkaWZmZXJlbnRseSAoc2VlIGJlbG93KSDigJQgaXQgcHVibGlzaGVkIHRoZSBxdWV1ZSBtZXNzYWdlIGJlZm9yZSB0aGVcbiAgICAgICAgLy8gY29uZmxpY3QsIHNvIHRoZSBjb25zdW1lciB3aWxsIGNvbnZlcmdlIHRoZSBldmVudC5cbiAgICAgICAgY29uc3QgaXNIb29rR29uZUVycm9yID0gKGVycjogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycik7XG5cbiAgICAgICAgaWYgKCF1c2VQYXJhbGxlbFJlc3VtZSkge1xuICAgICAgICAgIC8vIFNlcXVlbnRpYWwgcGF0aDogY3JlYXRlIGEgaG9va19yZWNlaXZlZCBldmVudCwgdGhlbiByZS10cmlnZ2VyLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGlzSG9va0dvbmVFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihob29rLnRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB3b3JsZC5xdWV1ZShcbiAgICAgICAgICAgIHF1ZXVlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmVzdW1lQ29udGV4dC50cmFjZUNhcnJpZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgICAgcXVldWVPcHRpb25zXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiBob29rO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyYWxsZWwgZmFzdCBwYXRoLiBBIHN0YWJsZSBpZGVtcG90ZW5jeSBrZXkgdGllcyB0aGUgZGlyZWN0IHdyaXRlIHRvXG4gICAgICAgIC8vIHRoZSBxdWV1ZSBjb25zdW1lcidzIHJlLWVuc3VyZTsgdGhlIHBheWxvYWQgZGlnZXN0IGxldHMgdGhlIHNlcnZlclxuICAgICAgICAvLyBkZXRlY3Qga2V5IHJldXNlIGFjcm9zcyBieXRlLWlkZW50aWNhbCBwYXlsb2Fkcy5cbiAgICAgICAgY29uc3QgcmVzdW1lSWQgPSBnZW5lcmF0ZVJlc3VtZUlkKCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWREaWdlc3QgPSBhd2FpdCBjb21wdXRlUmVzdW1lUGF5bG9hZERpZ2VzdChcbiAgICAgICAgICBkZWh5ZHJhdGVkUGF5bG9hZCBhcyBVaW50OEFycmF5XG4gICAgICAgICk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoeyAnd29ya2Zsb3cuaG9vay5yZXN1bWVfaWQnOiByZXN1bWVJZCB9KTtcblxuICAgICAgICBjb25zdCBbZXZlbnRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICBldmVudERhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2MUNvbXBhdCwgcmVzdW1lSWQsIHJlc3VtZVBheWxvYWREaWdlc3Q6IHBheWxvYWREaWdlc3QgfVxuICAgICAgICAgICksXG4gICAgICAgICAgd29ybGQucXVldWUoXG4gICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJ1bklkOiBob29rLnJ1bklkLFxuICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgaG9va0lucHV0OiB7XG4gICAgICAgICAgICAgICAgcmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgaG9va0lkOiBob29rLmhvb2tJZCxcbiAgICAgICAgICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBkZWh5ZHJhdGVkUGF5bG9hZCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgICAgcXVldWVPcHRpb25zXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWwg4oCUIHRoZSBydW4gd2FzIG5vdCByZS10cmlnZ2VyZWQsIHNvIG5vXG4gICAgICAgIC8vIGNvbnN1bWVyIHdpbGwgcmUtZW5zdXJlIHRoZSBldmVudC5cbiAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB3aGVuIHRoZSBkaXJlY3Qgd3JpdGUgZGlkIG5vdCBsYW5kIGJ1dCB0aGUgcXVldWUgZGlzcGF0Y2ggZGlkLCBzb1xuICAgICAgICAvLyB0aGUgY29uc3VtZXIgbWF0ZXJpYWxpemVzIHRoZSBldmVudCBiZWZvcmUgcmVwbGF5LiBTdXJmYWNlZCB0byB0aGVcbiAgICAgICAgLy8gY2FsbGVyIGFzIGBSZXN1bWVkSG9vay5yZXNpbGllbnRSZXN1bWVgIGFuZCBvbiB0aGUgc3Bhbi5cbiAgICAgICAgbGV0IHJlc2lsaWVudFJlc3VtZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gZXZlbnRSZXN1bHQucmVhc29uO1xuICAgICAgICAgIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBUaGUgaG9vaydzIHJ1biBoYXMgZ2VudWluZWx5IGVuZGVkOiBzdXJmYWNlIHRoZSBzYW1lIGNvbnRyYWN0IGFzXG4gICAgICAgICAgICAvLyB0aGUgc2VxdWVudGlhbCBwYXRoLiBUaGUgcXVldWUgbWVzc2FnZSBhbHJlYWR5IHdlbnQgb3V0LCBidXQgdGhlXG4gICAgICAgICAgICAvLyBjb25zdW1lcidzIHJlLWVuc3VyZSB3aWxsIGFsc28gcmVqZWN0IGFnYWluc3QgdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgLy8gYW5kIG5vLW9wLCBzbyB0aGUgd29ya2Zsb3cgZG9lcyBub3QgcmVzdW1lLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAvLyBSZXNpbGllbnQuIFR3byBzaGFwZXMgcmVhY2ggaGVyZSwgYm90aCBub24tdGVybWluYWw6XG4gICAgICAgICAgICAvLyAgIC0gRW50aXR5Q29uZmxpY3QgKDQwOSk6IHRoaXMgd3JpdGUgcmFjZWQgaXRzIG93biByZS1lbnN1cmluZ1xuICAgICAgICAgICAgLy8gICAgIGNvbnN1bWVyIChvciBhIHJlZHJpdmUpIG9uIHRoZSBzaGFyZWQgYHJlc3VtZUlkYCDigJQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgLy8gICAgIE5PVCBnb25lLCBhbmQgdGhlIGNvbnN1bWVyIGNvbnZlcmdlcyBvbiB0aGUgb25lIGNvbW1pdHRlZFxuICAgICAgICAgICAgLy8gICAgIGV2ZW50LiBVbmxpa2UgdGhlIHNlcXVlbnRpYWwgcGF0aCwgYSA0MDkgaGVyZSBpcyBleHBlY3RlZFxuICAgICAgICAgICAgLy8gICAgIGNvbmN1cnJlbmN5LCBub3QgYSB2YW5pc2hlZCBob29rLlxuICAgICAgICAgICAgLy8gICAtIDQyOSAvIDV4eCAvIHRyYW5zcG9ydDogYSB0cmFuc2llbnQgYmFja2VuZCBmYWlsdXJlLlxuICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcyB0aGUgcnVuIFdBUyByZS10cmlnZ2VyZWQgdmlhIHRoZSBxdWV1ZSBhbmQgdGhlXG4gICAgICAgICAgICAvLyBjb25zdW1lciBpZGVtcG90ZW50bHkgZW5zdXJlcyB0aGUgaG9va19yZWNlaXZlZCBiZWZvcmUgcmVwbGF5LCBzb1xuICAgICAgICAgICAgLy8gc3dhbGxvdyByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gUHJvZHVjZXIgdGVsZW1ldHJ5OiByZWNvcmQgdGhhdCB0aGUgZGlyZWN0IHdyaXRlIGRpZCBub3QgbGFuZCBidXRcbiAgICAgICAgICAgIC8vIHRoZSByZXN1bWUgaXMgc3RpbGwgZ3VhcmFudGVlZCB2aWEgcXVldWUtZGVsaXZlcmVkIGBob29rSW5wdXRgLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb3BlcmF0aW9uYWwgc2lnbmFsIHRoYXQgdGhlIHJlY292ZXJ5IHBhdGggZmlyZWQsXG4gICAgICAgICAgICAvLyBzdXJmYWNlZCBib3RoIG9uIHRoZSBzcGFuIGFuZCBhcyB0aGUgcHVibGljIGByZXNpbGllbnRSZXN1bWVgXG4gICAgICAgICAgICAvLyBmbGFnIG9uIHRoZSByZXR1cm5lZCBob29rICh0aGUgcmVzdW1lIG91dGNvbWUgaXMgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyBpZGVudGljYWwgdG8gdGhlIGhhcHB5IHBhdGggZnJvbSB0aGUgY2FsbGVyJ3MgcGVyc3BlY3RpdmUpLlxuICAgICAgICAgICAgcmVzaWxpZW50UmVzdW1lID0gdHJ1ZTtcbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZSh0cnVlKSxcbiAgICAgICAgICAgICAgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2V2ZW50X3dyaXRlX3JlY292ZXJlZCc6IHRydWUsXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9ldmVudF93cml0ZV9lcnJvcic6XG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICd1bmtub3duJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAnSG9vayByZXN1bWUgZXZlbnQgd3JpdGUgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgcmUtdHJpZ2dlcmVkIHZpYSAnICtcbiAgICAgICAgICAgICAgICAndGhlIHF1ZXVlLiBUaGUgaG9va19yZWNlaXZlZCBldmVudCB3aWxsIGJlIGVuc3VyZWQgYnkgdGhlICcgK1xuICAgICAgICAgICAgICAgICdxdWV1ZSBjb25zdW1lci4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICAgIHJlc3VtZUlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHJlc2lsaWVudFJlc3VtZSA/IHsgLi4uaG9vaywgcmVzaWxpZW50UmVzdW1lOiB0cnVlIH0gOiBob29rXG4gICAgICAgICkgc2F0aXNmaWVzIFJlc3VtZWRIb29rO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rVG9rZW4oXG4gICAgICAgICAgICB0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnID8gdG9rZW5Pckhvb2sgOiB0b2tlbk9ySG9vay50b2tlblxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tGb3VuZChmYWxzZSksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc3VtZXMgYSB3ZWJob29rIGJ5IHNlbmRpbmcgYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JlcXVlc3QgfCBSZXF1ZXN0fVxuICogb2JqZWN0IHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBhIHJlcXVlc3QgdG8gYSB3ZWJob29rIGFuZCByZXN1bWUgdGhlIGFzc29jaWF0ZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqIEBwYXJhbSByZXF1ZXN0IC0gVGhlIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3BvbnNlXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBob29rIGlzIG5vdCBmb3VuZCBvciBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB0aGUgcHJvY2Vzc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lV2ViaG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gKiAgIGNvbnN0IHRva2VuID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3Rva2VuJyk7XG4gKlxuICogICBpZiAoIXRva2VuKSB7XG4gKiAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnTWlzc2luZyB0b2tlbicsIHsgc3RhdHVzOiA0MDAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHRyeSB7XG4gKiAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXN1bWVXZWJob29rKHRva2VuLCByZXF1ZXN0KTtcbiAqICAgICByZXR1cm4gcmVzcG9uc2U7XG4gKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnV2ViaG9vayBub3QgZm91bmQnLCB7IHN0YXR1czogNDA0IH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3VtZVdlYmhvb2soXG4gIHRva2VuOiBzdHJpbmcsXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBob29rLCBlbmNyeXB0aW9uS2V5IH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuXG4gIC8vIE9ubHkgd2ViaG9va3MgY2FuIGJlIHJlc3VtZWQgdmlhIHRoZSBwdWJsaWMgZW5kcG9pbnQuXG4gIC8vIElmIHRoZSBob29rIHdhcyBjcmVhdGVkIHZpYSBjcmVhdGVIb29rKCkgKGlzV2ViaG9vayAhPT0gdHJ1ZSksXG4gIC8vIHRocm93IHRoZSBzYW1lIFwibm90IGZvdW5kXCIgZXJyb3IgdGhlIHdvcmxkIHdvdWxkIHRocm93IGZvciBhIG1pc3NpbmdcbiAgLy8gdG9rZW4uIFRoaXMgcHJldmVudHMgbGVha2luZyB0aGF0IHRoZSB0b2tlbiBpcyB2YWxpZC5cbiAgaWYgKGhvb2suaXNXZWJob29rID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcih0b2tlbik7XG4gIH1cblxuICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVzcG9uc2VSZWFkYWJsZTogUmVhZGFibGVTdHJlYW08UmVzcG9uc2U+IHwgdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgaG9vay5tZXRhZGF0YSAmJlxuICAgIHR5cGVvZiBob29rLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICdyZXNwb25kV2l0aCcgaW4gaG9vay5tZXRhZGF0YVxuICApIHtcbiAgICBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCA9PT0gJ21hbnVhbCcpIHtcbiAgICAgIGNvbnN0IHsgcmVhZGFibGUsIHdyaXRhYmxlIH0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFJlc3BvbnNlLCBSZXNwb25zZT4oKTtcbiAgICAgIHJlc3BvbnNlUmVhZGFibGUgPSByZWFkYWJsZTtcblxuICAgICAgLy8gVGhlIHJlcXVlc3QgaW5zdGFuY2UgaW5jbHVkZXMgdGhlIHdyaXRhYmxlIHN0cmVhbSB3aGljaCB3aWxsIGJlIHVzZWRcbiAgICAgIC8vIHRvIHdyaXRlIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBydW5cbiAgICAgIChyZXF1ZXN0IGFzIGFueSlbV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRV0gPSB3cml0YWJsZTtcbiAgICB9IGVsc2UgaWYgKGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGggaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgcmVzcG9uc2UgPSBob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFxcYHJlc3BvbmRXaXRoXFxgIHZhbHVlOiAke2hvb2subWV0YWRhdGEucmVzcG9uZFdpdGh9YCxcbiAgICAgICAgeyBzbHVnOiBFUlJPUl9TTFVHUy5XRUJIT09LX0lOVkFMSURfUkVTUE9ORF9XSVRIX1ZBTFVFIH1cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vIGByZXNwb25kV2l0aGAgdmFsdWUgaW1wbGllcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiByZXR1cm5pbmcgYSAyMDJcbiAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMjAyIH0pO1xuICB9XG5cbiAgLy8gYGhvb2tgIHdhcyBqdXN0IGZldGNoZWQgdmlhIGBnZXRIb29rQnlUb2tlbldpdGhLZXlgIChhIGZyZXNoIGJ5LXRva2VuXG4gIC8vIGxvb2t1cCkgYWJvdmUsIHNvIGl0cyByZXNwb25zZS1vbmx5IGByZXN1bWVDYXBhYmlsaXRpZXNgIHJlZmxlY3RzIHRoZSBsaXZlXG4gIC8vIGJhY2tlbmQg4oCUIGNhbGwgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGZyZXNoIGF0dGVzdGF0aW9uIHNvXG4gIC8vIHRoZSBwYXJhbGxlbCBmYXN0IHBhdGggc3RheXMgYXZhaWxhYmxlIHdpdGhvdXQgYSBzZWNvbmQgR0VULiAoVGhlIHB1YmxpY1xuICAvLyBgcmVzdW1lSG9va2AgbmV2ZXIgc2V0cyB0aGlzLCBzbyBhIGNhbGxlciBjYW5ub3QgZm9yZ2UgaXQuKVxuICBhd2FpdCByZXN1bWVIb29rSW1wbChob29rLCByZXF1ZXN0LCBlbmNyeXB0aW9uS2V5LCB0cnVlKTtcblxuICBpZiAocmVzcG9uc2VSZWFkYWJsZSkge1xuICAgIC8vIFdhaXQgZm9yIHRoZSByZWFkYWJsZSBzdHJlYW0gdG8gZW1pdCBvbmUgY2h1bmssXG4gICAgLy8gd2hpY2ggaXMgdGhlIGBSZXNwb25zZWAgb2JqZWN0XG4gICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2VSZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGNodW5rLnZhbHVlKSB7XG4gICAgICByZXNwb25zZSA9IGNodW5rLnZhbHVlO1xuICAgIH1cbiAgICByZWFkZXIuY2FuY2VsKCk7XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXb3JrZmxvdyBydW4gZGlkIG5vdCBzZW5kIGEgcmVzcG9uc2UnLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5XRUJIT09LX1JFU1BPTlNFX05PVF9TRU5ULFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuIl19
618
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBR3pCLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFB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QUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksb0JBQW9CLENBQUMsc0NBQXNDLEVBQUU7WUFDckUsSUFBSSxFQUFFLFdBQVcsQ0FBQyx5QkFBeUI7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBFUlJPUl9TTFVHUyxcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgSE9PS19SRVNVTUVfREVEVVBfVkVSU0lPTixcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgdHlwZSBIb29rLFxuICB0eXBlIEhvb2tSZXN1bWVDb250ZXh0LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGRlY29kZVJ1blB1YmxpY0tleSB9IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHsgZGVyaXZlUnVuUGF5bG9hZEtleXMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBsaW5rVG9UcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG4vKiogTW9ub3RvbmljIFVMSUQgZmFjdG9yeSBmb3IgcGVyLWNhbGwgcmVzdW1lIGlkZW1wb3RlbmN5IGtleXMuICovXG5jb25zdCBnZW5lcmF0ZVJlc3VtZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIHRoZSBzZXJpYWxpemVkIGhvb2sgcGF5bG9hZCB0aGF0IHRoZSBwYXJhbGxlbCBmYXN0IHBhdGggd2lsbFxuICogaW5saW5lIGludG8gdGhlIHF1ZXVlIG1lc3NhZ2UncyBgaG9va0lucHV0YC4gVmVyY2VsIFF1ZXVlcyBjYXBzIGEgc2luZ2xlXG4gKiBtZXNzYWdlIGF0IH4yNTYgS2lCLCBhbmQgdGhlIG1lc3NhZ2UgYWxzbyBjYXJyaWVzIHRoZSBydW5JZCwgaG9va0lkLCB0b2tlbixcbiAqIHJlc3VtZUlkLCBkaWdlc3QsIGFuZCB0cmFjZSBjYXJyaWVyIGFsb25nc2lkZSBDQk9SIGZyYW1pbmcgb3ZlcmhlYWQuIFN0YXlpbmdcbiAqIHdlbGwgdW5kZXIgdGhhdCBjZWlsaW5nIGtlZXBzIHRoZSBxdWV1ZSBwdWJsaXNoIGZyb20gcmVqZWN0aW5nIGFuIG92ZXJzaXplZFxuICogbWVzc2FnZSDigJQgd2hpY2gsIG9uIHRoZSBwYXJhbGxlbCBwYXRoLCB3b3VsZCBwZXJzaXN0IGBob29rX3JlY2VpdmVkYCBidXQgbmV2ZXJcbiAqIHJlLXRyaWdnZXIgdGhlIHJ1bi4gQWJvdmUgdGhpcyBzaXplIHdlIGZhbGwgYmFjayB0byB0aGUgc2VxdWVudGlhbCBwYXRoLCB3aG9zZVxuICogcXVldWUgbWVzc2FnZSBjYXJyaWVzIG9ubHkgdGhlIHJ1biBJRCAodGhlIHBheWxvYWQgbGl2ZXMgaW4gdGhlIGV2ZW50IGxvZykuXG4gKi9cbmNvbnN0IE1BWF9JTkxJTkVfUkVTVU1FX1BBWUxPQURfQllURVMgPSAxMjggKiAxMDI0O1xuXG4vKipcbiAqIEhleCBTSEEtMjU2IG9mIHRoZSBzZXJpYWxpemVkIHJlc3VtZSBwYXlsb2FkIGJ5dGVzLiBDb21wdXRlZCBvbmNlIGJ5IHRoZVxuICogcHJvZHVjZXIgYW5kIGZvcndhcmRlZCB2ZXJiYXRpbSBvbiBib3RoIHRoZSBkaXJlY3QgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZFxuICogdGhlIHF1ZXVlIGBob29rSW5wdXRgLCBzbyBib3RoIHdyaXRlcnMgb2YgdGhlIHNhbWUgYHJlc3VtZUlkYCByZWNvcmQgYW5cbiAqIGlkZW50aWNhbCBkaWdlc3Qgb24gdGhlIHNlcnZlcidzIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uc3RyYWludC4gSGFzaGluZyB0aGVcbiAqIGFscmVhZHktc2VyaWFsaXplZCBieXRlcyAobm90IHRoZSByYXcgdmFsdWUpIGtlZXBzIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpblxuICogbG9ja3N0ZXAg4oCUIHRoZSBjb25zdW1lciBmb3J3YXJkcyB0aGlzIHN0cmluZyB3aXRob3V0IHJlY29tcHV0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlUmVzdW1lUGF5bG9hZERpZ2VzdChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgYnl0ZXMpO1xuICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGlnZXN0KTtcbiAgbGV0IGhleCA9ICcnO1xuICBmb3IgKGNvbnN0IGIgb2Ygdmlldykge1xuICAgIGhleCArPSBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG4gIHJldHVybiBoZXg7XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBjb250ZXh0IGZvciBhIGhvb2sgcGx1cyB3aGVyZSBpdCBjYW1lIGZyb20uIGBydW5gIGlzIHByZXNlbnQgb25seVxuICogb24gdGhlIGZhbGxiYWNrIHBhdGggKHByZS1gcmVzdW1lQ29udGV4dGAgaG9va3MpLCB3aGVyZSBpdCBhbHNvIGNhcnJpZXMgdGhlXG4gKiBydW4ncyBtdXRhYmxlIHN0YXR1cyBmb3IgdGhlIHRlcm1pbmFsLXJ1biBjaGVjay4gS2V5IHJlc29sdXRpb24gaXMga2VwdFxuICogc2VwYXJhdGUgc28gY2FsbGVycyBjYW4gZ2F0ZSBpdCBiZWhpbmQgdGhhdCBjaGVjay5cbiAqL1xuaW50ZXJmYWNlIEhvb2tSZXN1bWVJbmZvIHtcbiAgcmVzdW1lQ29udGV4dDogSG9va1Jlc3VtZUNvbnRleHQ7XG4gIHNvdXJjZTogJ2hvb2snIHwgJ3J1bl9mYWxsYmFjayc7XG4gIHJ1bj86IFdvcmtmbG93UnVuO1xufVxuXG4vKiogRGVyaXZlIGEgcmVzdW1lIGNvbnRleHQgZnJvbSBhIGZ1bGwgcnVuIChmYWxsYmFjayBmb3IgcHJlLWByZXN1bWVDb250ZXh0YCBob29rcykuICovXG5mdW5jdGlvbiByZXN1bWVDb250ZXh0RnJvbVJ1bihydW46IFdvcmtmbG93UnVuKTogSG9va1Jlc3VtZUNvbnRleHQge1xuICBjb25zdCBjb3JlVmVyc2lvbiA9IHJ1bi5leGVjdXRpb25Db250ZXh0Py53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICBjb25zdCB0cmFjZUNhcnJpZXIgPSBydW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyO1xuICBjb25zdCBob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcnVuLmV4ZWN1dGlvbkNvbnRleHQ/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gIHJldHVybiB7XG4gICAgZGVwbG95bWVudElkOiBydW4uZGVwbG95bWVudElkLFxuICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICBydW5TcGVjVmVyc2lvbjogcnVuLnNwZWNWZXJzaW9uLFxuICAgIHdvcmtmbG93Q29yZVZlcnNpb246XG4gICAgICB0eXBlb2YgY29yZVZlcnNpb24gPT09ICdzdHJpbmcnID8gY29yZVZlcnNpb24gOiB1bmRlZmluZWQsXG4gICAgdHJhY2VDYXJyaWVyOlxuICAgICAgdHJhY2VDYXJyaWVyICYmIHR5cGVvZiB0cmFjZUNhcnJpZXIgPT09ICdvYmplY3QnXG4gICAgICAgID8gKHRyYWNlQ2FycmllciBhcyBIb29rUmVzdW1lQ29udGV4dFsndHJhY2VDYXJyaWVyJ10pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIGVuY3J5cHRpb25QdWJsaWNLZXk6IHJ1bi5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb246XG4gICAgICB0eXBlb2YgaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9PT0gJ251bWJlcidcbiAgICAgICAgPyBob29rUmVzdW1lSW5wdXRWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcmVzdW1lIGNvbnRleHQgZm9yIGEgaG9vay4gVXNlcyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCB3aGVuXG4gKiBwcmVzZW50IChmYXN0IHBhdGgg4oCUIG5vIHJ1biByZWFkKTsgb3RoZXJ3aXNlIGZldGNoZXMgdGhlIHJ1biBhbmQgc3ludGhlc2l6ZXNcbiAqIGl0LiBEb2VzIE5PVCByZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSDigJQgY2FsbGVycyBkbyB0aGF0IHNlcGFyYXRlbHkuIE9ubHlcbiAqIHRoZSBmYWxsYmFjayBwYXRoIGNhbiBnYXRlIGtleSB3b3JrIGJlaGluZCBhIGxvY2FsIHRlcm1pbmFsLXJ1biBjaGVjayAoaXRcbiAqIGhhcyB0aGUgZmV0Y2hlZCBydW4pOyB0aGUgZmFzdCBwYXRoJ3Mgc3RvcmVkIGNvbnRleHQgY2FycmllcyBubyBzdGF0dXMsIHNvXG4gKiBzZWFsL3NlcmlhbGl6YXRpb24gd29yayBtYXkgcnVuIGJlZm9yZSB0aGUgcmVjZWl2aW5nIHNpZGUgcmVqZWN0c1xuICogYGhvb2tfcmVjZWl2ZWRgIGZvciBhbiBlbmRlZCBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb29rUmVzdW1lSW5mbyhob29rOiBIb29rKTogUHJvbWlzZTxIb29rUmVzdW1lSW5mbz4ge1xuICBpZiAoaG9vay5yZXN1bWVDb250ZXh0KSB7XG4gICAgcmV0dXJuIHsgcmVzdW1lQ29udGV4dDogaG9vay5yZXN1bWVDb250ZXh0LCBzb3VyY2U6ICdob29rJyB9O1xuICB9XG4gIGNvbnN0IHJ1biA9IGF3YWl0IChhd2FpdCBnZXRXb3JsZExhenkoKSkucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gIHJldHVybiB7XG4gICAgcmVzdW1lQ29udGV4dDogcmVzdW1lQ29udGV4dEZyb21SdW4ocnVuKSxcbiAgICBzb3VyY2U6ICdydW5fZmFsbGJhY2snLFxuICAgIHJ1bixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBydW4ncyBzeW1tZXRyaWMga2V5IGZvciBhIHBheWxvYWQgV1JJVEUsIGFzIGEgYmFyZSBgQ3J5cHRvS2V5YFxuICogKGBpbXBvcnRLZXlgKSDigJQgdGhlIGBlbmNyYCB3cml0ZSBmYWxsYmFjayB1c2VkIHdoZW4gdGhlIHJ1biBwdWJsaXNoZWQgbm9cbiAqIHB1YmxpYyBrZXkgdG8gc2VhbCB0by4gV3JpdGluZyBuZWVkcyBvbmx5IHRoZSBBRVMga2V5LCBub3QgdGhlIHJlYWQtc2lkZVxuICoga2V5cGFpci4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIG5lZWRzIG9ubHkgYHJ1bklkYCArIGBkZXBsb3ltZW50SWRgIChubyBydW5cbiAqIGVudGl0eSk7IG9uIHRoZSBmYWxsYmFjayBwYXRoIHRoZSBhbHJlYWR5IGZldGNoZWQgcnVuIGlzIHJldXNlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KFxuICBob29rOiBIb29rLFxuICBpbmZvOiBIb29rUmVzdW1lSW5mb1xuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGltcG9ydEtleT4+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaW5mby5ydW4pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaG9vay5ydW5JZCwge1xuICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICB9KTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICBob29rOiBIb29rO1xuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xufT4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbik7XG5cbiAgLy8gT25seSBhIGhvb2sgdGhhdCBhY3R1YWxseSBjYXJyaWVzIG1ldGFkYXRhIG5lZWRzIHRoZSBydW4ncyBrZXkgcmVzb2x2ZWRcbiAgLy8gaGVyZTogaHlkcmF0aW5nIHRoYXQgbWV0YWRhdGEgaXMgYSBSRUFELCBzbyBkZXJpdmUgdGhlIGZ1bGwgUnVuUGF5bG9hZEtleXNcbiAgLy8gKHdoaWNoIG9wZW5zIHNlYWxlZCBgZW5jcGAgbWV0YWRhdGEsIG5vdCBqdXN0IHN5bW1ldHJpYyBgZW5jcmApLiBUaGUgY29tbW9uXG4gIC8vIGRlZmF1bHQgd2ViaG9vayDigJQgY3JlYXRlV2ViaG9vaygpIHdpdGggbm8gYHJlc3BvbmRXaXRoYCDigJQgc3RvcmVzIG5vXG4gIC8vIG1ldGFkYXRhLCBzbyBpdCBza2lwcyB0aGlzIGVudGlyZWx5OiBubyB+MzUwbXMgYHJ1bi1rZXlgIEFQSSByb3VuZCB0cmlwLFxuICAvLyBhbmQsIGNydWNpYWxseSwgbm8gcmVzb2x2ZWQga2V5IGhhbmRlZCB0byBgcmVzdW1lSG9va2AsIGxlYXZpbmcgaXQgZnJlZSB0b1xuICAvLyBzZWFsIHRoZSBwYXlsb2FkIHRvIHRoZSBydW4ncyBwdWJsaXNoZWQgcHVibGljIGtleSBpbnN0ZWFkLiBNZXRhZGF0YS1cbiAgLy8gYmVhcmluZyB3ZWJob29rcyBzdGlsbCBsZWdpdGltYXRlbHkgcGF5IG9uZSBsb29rdXAgdG8gaHlkcmF0ZS5cbiAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vay5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUhvb2tSZXN1bWVJbmZvKGhvb2spO1xuICAgIC8vIE9uIHRoZSBmYXN0IHBhdGggdGhpcyByZXNvbHZlcyB0aGUga2V5IGJ5IHJ1bklkICsgZGVwbG95bWVudElkIChubyBydW5cbiAgICAvLyByZWFkKTsgb24gdGhlIGZhbGxiYWNrIHBhdGggaXQgcmV1c2VzIHRoZSBhbHJlYWR5LWZldGNoZWQgcnVuLlxuICAgIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihpbmZvLnJ1bilcbiAgICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhvb2sucnVuSWQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgIH0pO1xuICAgIGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgIGhvb2subWV0YWRhdGEgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgIGhvb2subWV0YWRhdGEgYXMgYW55LFxuICAgICAgaG9vay5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXlcbiAgICApO1xuICB9XG4gIHJldHVybiB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGhvb2sgYnkgdG9rZW4gdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgaHlkcmF0ZSB0aGUgYG1ldGFkYXRhYCBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGZyb20gd2l0aGluXG4gKiB0aGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEEgSG9vayBrZXB0IGJ5IG1pbmltdW0gcmV0ZW50aW9uIHJlbWFpbnMgYXZhaWxhYmxlIGhlcmUgYWZ0ZXIgaXRzIHJ1biBlbmRzLFxuICogYnV0IGNhbm5vdCBiZSByZXN1bWVkLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgY29uc3QgeyBob29rIH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuICByZXR1cm4gaG9vaztcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayByZXN1bWVIb29rfTogYSB7QGxpbmsgSG9va30gYXVnbWVudGVkIHdpdGggYW4gb3B0aW9uYWxcbiAqIHJlc2lsaWVuY2Ugc2lnbmFsLlxuICpcbiAqIE9uIHRoZSBwYXJhbGxlbCBmYXN0IHBhdGgsIGByZXN1bWVIb29rKClgIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IGFuZFxuICogZGlzcGF0Y2hlcyB0aGUgd29ya2Zsb3cgcXVldWUgbWVzc2FnZSBjb25jdXJyZW50bHkuIFdoZW4gdGhlIGRpcmVjdCBldmVudFxuICogd3JpdGUgZmFpbHMgKnRyYW5zaWVudGx5KiDigJQgYSA0MjkvNXh4LCBhIHRyYW5zcG9ydCBlcnJvciwgb3IgYW4gZXhwZWN0ZWRcbiAqIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uZmxpY3Qgd2l0aCBpdHMgb3duIHJlLWVuc3VyaW5nIGNvbnN1bWVyIOKAlCBidXQgdGhlIHF1ZXVlXG4gKiBkaXNwYXRjaCBzdWNjZWVkcywgdGhlIHJlc3VtZSBpcyBzdGlsbCBndWFyYW50ZWVkOiB0aGUgcXVldWUgY29uc3VtZXJcbiAqIGlkZW1wb3RlbnRseSBtYXRlcmlhbGl6ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIHRoZSBwYXlsb2FkIGNhcnJpZWRcbiAqIG9uIHRoZSBtZXNzYWdlIGJlZm9yZSByZXBsYXkuIEluIHRoYXQgcmVjb3ZlcmVkIGNhc2UgdGhlIHJldHVybmVkIGhvb2sgY2Fycmllc1xuICogYHJlc2lsaWVudFJlc3VtZTogdHJ1ZWAuXG4gKlxuICogT24gdGhlIGhhcHB5IHBhdGggKHRoZSBkaXJlY3Qgd3JpdGUgbGFuZGVkKSBhbmQgb24gdGhlIHNlcXVlbnRpYWwgZmFsbGJhY2tcbiAqIHBhdGgsIHRoZSBmbGFnIGlzIGFic2VudCAoYHVuZGVmaW5lZGApLiBDYWxsZXJzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCB0aGVcbiAqIGRpc3RpbmN0aW9uIGNhbiB0cmVhdCB0aGUgcmVzdWx0IGFzIGEgcGxhaW4ge0BsaW5rIEhvb2t9LlxuICovXG5leHBvcnQgdHlwZSBSZXN1bWVkSG9vayA9IEhvb2sgJiB7IHJlc2lsaWVudFJlc3VtZT86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Pckhvb2sgLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rLCBvciB0aGUgaG9vayBvYmplY3QgaXRzZWxmXG4gKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBkYXRhIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHtAbGluayBSZXN1bWVkSG9va31cbiAqIEB0aHJvd3Mge0hvb2tOb3RGb3VuZEVycm9yfSBJZiB0aGUgSG9vayBkb2VzIG5vdCBleGlzdCBvciBpdHMgcnVuIGhhcyBlbmRlZFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lSG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgeyB0b2tlbiwgZGF0YSB9ID0gYXdhaXQgcmVxdWVzdC5qc29uKCk7XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZXN1bWVIb29rKHRva2VuLCBkYXRhKTtcbiAqICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IHJ1bklkOiBob29rLnJ1bklkIH0pO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0hvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVIb29rPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlPzogUGF5bG9hZEtleVxuKTogUHJvbWlzZTxSZXN1bWVkSG9vaz4ge1xuICAvLyBQdWJsaWMgZW50cnkgcG9pbnQuIEl0IG5ldmVyIGF0dGVzdHMgaG9vayBmcmVzaG5lc3MsIHNvIGEgSG9vayBvYmplY3RcbiAgLy8gc3VwcGxpZWQgaGVyZSDigJQgd2hpY2ggbWF5IGNhcnJ5IGEgYHJlc3VtZUNhcGFiaWxpdGllc2AgY2FjaGVkIGJlZm9yZSBhXG4gIC8vIHNlcnZlciByb2xsYmFjayBvciBraWxsIHN3aXRjaCDigJQgaXMgaWdub3JlZCBieSB0aGUgZHluYW1pYy1kZWR1cCBnYXRlIGFuZFxuICAvLyBmYWlscyBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC4gT25seSBgcmVzdW1lV2ViaG9va2AsIHdoaWNoIGZldGNoZXNcbiAgLy8gdGhlIGhvb2sgYnkgdG9rZW4gaW4tbGluZSBkdXJpbmcgdGhlIHNhbWUgcmVzdW1lLCByZWFjaGVzIHRoZSBpbnRlcm5hbFxuICAvLyBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBmcmVzaCBhdHRlc3RhdGlvbiBzZXQuIEtlZXBpbmcgdGhlIGZyZXNobmVzcyBmbGFnXG4gIC8vIG9mZiB0aGUgZXhwb3J0ZWQgc2lnbmF0dXJlIHByZXZlbnRzIGEgY2FsbGVyIGZyb20gcGFzc2luZyBhIHN0YWxlIEhvb2sgcGx1c1xuICAvLyBgdHJ1ZWAgYW5kIHJlYWN0aXZhdGluZyBkeW5hbWljIGRlZHVwIGFnYWluc3QgYSByb2xsZWQtYmFjayBiYWNrZW5kLlxuICByZXR1cm4gcmVzdW1lSG9va0ltcGwodG9rZW5Pckhvb2ssIHBheWxvYWQsIGVuY3J5cHRpb25LZXlPdmVycmlkZSwgZmFsc2UpO1xufVxuXG4vKipcbiAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayByZXN1bWVIb29rfS4gTk9UIGV4cG9ydGVkOiB0aGVcbiAqIGBob29rRnJlc2hseUxvb2tlZFVwYCBhdHRlc3RhdGlvbiBtdXN0IG5ldmVyIGJlIHJlYWNoYWJsZSBieSBwdWJsaWMgY2FsbGVyc1xuICogKHNlZSB0aGUgd3JhcHBlciBhYm92ZSkuXG4gKlxuICogQHBhcmFtIGhvb2tGcmVzaGx5TG9va2VkVXAgLSBBdHRlc3RzIHRoYXQgYSBzdXBwbGllZCBIb29rIG9iamVjdCB3YXMgZmV0Y2hlZFxuICogICBieSB0b2tlbiBkdXJpbmcgVEhJUyByZXN1bWUsIHNvIGl0cyByZXNwb25zZS1vbmx5IGByZXN1bWVDYXBhYmlsaXRpZXNgXG4gKiAgIHJlZmxlY3RzIHRoZSBsaXZlIGJhY2tlbmQgYW5kIG1heSBiZSB0cnVzdGVkIGZvciB0aGUgZHluYW1pYy1kZWR1cCBnYXRlLlxuICogICBBIHRva2VuIHN0cmluZyBpcyBhbHdheXMgZmV0Y2hlZCBmcmVzaCBoZXJlLCBzbyBpdCBpcyBpbXBsaWNpdGx5IGZyZXNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXN1bWVIb29rSW1wbDxUID0gYW55PihcbiAgdG9rZW5Pckhvb2s6IHN0cmluZyB8IEhvb2ssXG4gIHBheWxvYWQ6IFQsXG4gIGVuY3J5cHRpb25LZXlPdmVycmlkZTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgaG9va0ZyZXNobHlMb29rZWRVcDogYm9vbGVhblxuKTogUHJvbWlzZTxSZXN1bWVkSG9vaz4ge1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIHJldHVybiB0cmFjZSgnaG9vay5yZXN1bWUnLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3VwcGxpZWRUb2tlbiA9IHR5cGVvZiB0b2tlbk9ySG9vayA9PT0gJ3N0cmluZyc7XG4gICAgICAgIGNvbnN0IGhvb2s6IEhvb2sgPSBzdXBwbGllZFRva2VuXG4gICAgICAgICAgPyBhd2FpdCB3b3JsZC5ob29rcy5nZXRCeVRva2VuKHRva2VuT3JIb29rKVxuICAgICAgICAgIDogdG9rZW5Pckhvb2s7XG4gICAgICAgIC8vIFRoZSBkeW5hbWljLCByZXNwb25zZS1vbmx5IGByZXN1bWVDYXBhYmlsaXRpZXNgIG1heSBvbmx5IGJlIHRydXN0ZWRcbiAgICAgICAgLy8gd2hlbiBpdCBjYW1lIGZyb20gYSBieS10b2tlbiBsb29rdXAgcGVyZm9ybWVkIGR1cmluZyB0aGlzIHJlc3VtZS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZUNhcGFiaWxpdGllc0FyZUZyZXNoID1cbiAgICAgICAgICBzdXBwbGllZFRva2VuIHx8IGhvb2tGcmVzaGx5TG9va2VkVXA7XG5cbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHJlc29sdmVIb29rUmVzdW1lSW5mbyhob29rKTtcbiAgICAgICAgY29uc3QgeyByZXN1bWVDb250ZXh0IH0gPSBpbmZvO1xuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rVG9rZW4oaG9vay50b2tlbiksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tJZChob29rLmhvb2tJZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQoaG9vay5ydW5JZCksXG4gICAgICAgICAgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2NvbnRleHRfc291cmNlJzogaW5mby5zb3VyY2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRoZSBzdG9yZWQgYHJlc3VtZUNvbnRleHRgIGludGVudGlvbmFsbHkgb21pdHMgdGhlIHJ1bidzIG11dGFibGVcbiAgICAgICAgLy8gc3RhdHVzLCBzbyB0aGlzIGVhcmx5IGNsaWVudC1zaWRlIHJlamVjdGlvbiBvbmx5IHJ1bnMgb24gdGhlXG4gICAgICAgIC8vIGZhbGxiYWNrIHBhdGggKHdoaWNoIGZldGNoZWQgdGhlIHJ1bikuIE9uIHRoZSBmYXN0IHBhdGggdGhlIHRlcm1pbmFsXG4gICAgICAgIC8vIGNoZWNrIGhhcHBlbnMgc2VydmVyLXNpZGU6IGBob29rX3JlY2VpdmVkYCBhZ2FpbnN0IGFuIGVuZGVkIHJ1biBpc1xuICAgICAgICAvLyByZWplY3RlZCwgd2hpY2ggdGhlIGNhdGNoIGFyb3VuZCBgd29ybGQuZXZlbnRzLmNyZWF0ZWAgYmVsb3cgcmUta2V5c1xuICAgICAgICAvLyB0byBIb29rTm90Rm91bmRFcnJvciDigJQgc2FtZSBwdWJsaWMgY29udHJhY3QsIG5vIHJ1biBwcmUtZmV0Y2guXG4gICAgICAgIGlmIChpbmZvLnJ1biAmJiBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMoaW5mby5ydW4uc3RhdHVzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihob29rLnRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSB0YXJnZXQgcnVuJ3MgY2FwYWJpbGl0aWVzIHRvIGVuc3VyZSB3ZSBlbmNvZGUgdGhlXG4gICAgICAgIC8vIHBheWxvYWQgaW4gYSBmb3JtYXQgdGhlIHJ1bidzIGRlcGxveW1lbnQgY2FuIGRlY29kZS4gRm9yIGV4YW1wbGUsXG4gICAgICAgIC8vIHJ1bnMgY3JlYXRlZCBiZWZvcmUgZW5jcnlwdGlvbiBzdXBwb3J0IHdhcyBhZGRlZCBjYW5ub3QgZGVjb2RlXG4gICAgICAgIC8vIHRoZSAnZW5jcicgc2VyaWFsaXphdGlvbiBmb3JtYXQsIGFuZCBydW5zIGNyZWF0ZWQgYmVmb3JlXG4gICAgICAgIC8vIGJ5dGUtc3RyZWFtIGZyYW1pbmcgc3VwcG9ydCBjYW5ub3QgZGVjb2RlIGZyYW1lZCBieXRlIHN0cmVhbXMuXG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhcbiAgICAgICAgICByZXN1bWVDb250ZXh0LndvcmtmbG93Q29yZVZlcnNpb25cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBSZXNvbHZlIGhvdyB0byBlbmNyeXB0IHRoZSBwYXlsb2FkIGZvciB0aGUgdGFyZ2V0IHJ1biAoYSBXUklURSkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFByZWZlcnJlZCBwYXRoOiBzZWFsIHRvIHRoZSBydW4ncyBwdWJsaXNoZWQgWDI1NTE5IHB1YmxpYyBrZXksIHdoaWNoXG4gICAgICAgIC8vIHRoZSBzdG9yZWQgYHJlc3VtZUNvbnRleHRgIGNhcnJpZXMgaW5saW5lLiBPbiB0aGUgZmFzdCBwYXRoIHRoaXMgaXNcbiAgICAgICAgLy8gdGhlIHdob2xlIHdpbiDigJQgbm8gcnVuIHJlYWQgQU5EIG5vIGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCwgd2hvc2VcbiAgICAgICAgLy8gfjM1MG1zIGBydW4ta2V5YCBBUEkgcm91bmQgdHJpcCBkb21pbmF0ZXMgY3Jvc3MtZGVwbG95bWVudCBob29rXG4gICAgICAgIC8vIHJlc3VtcHRpb24gbGF0ZW5jeS4gKE9uIHRoZSBmYWxsYmFjayBwYXRoIHRoZSBrZXkgaXMgc3ludGhlc2l6ZWRcbiAgICAgICAgLy8gZnJvbSB0aGUgZmV0Y2hlZCBydW4sIHdoaWNoIGFsc28gY2FycmllcyBpdC4pXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlYWxpbmcgYWxzbyBkcm9wcyBwcml2aWxlZ2U6IHRoZSByZXN1bWVyIGVuZHMgdXAgYWJsZSB0byB3cml0ZSBhXG4gICAgICAgIC8vIHBheWxvYWQgZm9yIHRoZSBydW4gd2l0aG91dCBiZWluZyBhYmxlIHRvIHJlYWQgYW55dGhpbmcgb2YgdGhlXG4gICAgICAgIC8vIHJ1bidzLCB3aGVyZSBmZXRjaGluZyB0aGUgc3ltbWV0cmljIGtleSBncmFudHMgYm90aC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IE5PVCBnYXRlZCBvbiBgY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHNgIHRoZSB3YXlcbiAgICAgICAgLy8gdGhlIHN5bW1ldHJpYyBmYWxsYmFjayBiZWxvdyBnYXRlcyBgZW5jcmA6IHByZXNlbmNlIG9mIHRoZSBwdWJsaWMga2V5XG4gICAgICAgIC8vIGlzIGl0c2VsZiB0aGUgZ2F0ZS4gQSBydW4gb25seSBjYXJyaWVzIG9uZSBpZiB0aGUgcnVudGltZSB0aGF0XG4gICAgICAgIC8vIGNyZWF0ZWQgaXQgY291bGQgYWxzbyBvcGVuIGEgc2VhbGVkIHBheWxvYWQsIGFuZCBydW5zIGFyZSBwaW5uZWQgdG9cbiAgICAgICAgLy8gdGhlaXIgY3JlYXRpbmcgZGVwbG95bWVudCwgc28gcHJlc2VuY2UgaXMgYSBtb3JlIHJlbGlhYmxlIGF0dGVzdGF0aW9uXG4gICAgICAgIC8vIHRoYW4gYSB2ZXJzaW9uIGNvbXBhcmUg4oCUIGFuZCBpdCBzdGF5cyBjb3JyZWN0IGV2ZW4gd2hlbiBwYWNrYWdlXG4gICAgICAgIC8vIHZlcnNpb25zIGRyaWZ0LlxuICAgICAgICBsZXQgcGF5bG9hZEtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcnVuUHVibGljS2V5ID0gZW5jcnlwdGlvbktleU92ZXJyaWRlXG4gICAgICAgICAgPyAvLyBUaGUgY2FsbGVyIGFscmVhZHkgaG9sZHMgYSBrZXkgKHJlc3VtZVdlYmhvb2sgcmVzb2x2ZWQgb25lIHRvXG4gICAgICAgICAgICAvLyBoeWRyYXRlIGhvb2sgbWV0YWRhdGEpLCBzbyBzZWFsaW5nIHdvdWxkIGFkZCBhbiBFQ0RIIGZvciBub1xuICAgICAgICAgICAgLy8gc2F2ZWQgcm91bmQgdHJpcC4gUmV1c2Ugd2hhdCBpdCByZXNvbHZlZC5cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgIDogZGVjb2RlUnVuUHVibGljS2V5KHJlc3VtZUNvbnRleHQuZW5jcnlwdGlvblB1YmxpY0tleSk7XG5cbiAgICAgICAgaWYgKHJ1blB1YmxpY0tleSkge1xuICAgICAgICAgIHBheWxvYWRLZXkgPSBzZWFsVG8ocnVuUHVibGljS2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTeW1tZXRyaWMgYGVuY3JgIHdyaXRlIGZhbGxiYWNrOiBuZWVkcyBvbmx5IHRoZSBBRVMga2V5XG4gICAgICAgICAgLy8gKGEgYmFyZSBDcnlwdG9LZXkgdmlhIGByZXNvbHZlSG9va0VuY3J5cHRpb25LZXlgKSwgbm90IHRoZVxuICAgICAgICAgIC8vIHJlYWQtc2lkZSBSdW5QYXlsb2FkS2V5cy5cbiAgICAgICAgICBsZXQgZW5jcnlwdGlvbktleSA9XG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUgPz9cbiAgICAgICAgICAgIChhd2FpdCByZXNvbHZlSG9va0VuY3J5cHRpb25LZXkoaG9vaywgaW5mbykpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXlsb2FkS2V5ID0gZW5jcnlwdGlvbktleTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXByZXNzIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IHJ1biBhbmQgaXRzIGRlcGxveW1lbnQgc3VwcG9ydCB0aGVcbiAgICAgICAgLy8gY29tcHJlc3Npb24gZm9ybWF0cyBpbnRyb2R1Y2VkIHdpdGggc3BlYyB2ZXJzaW9uIDUuXG4gICAgICAgIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAgICAgICAocmVzdW1lQ29udGV4dC5ydW5TcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OICYmXG4gICAgICAgICAgY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUCk7XG5cbiAgICAgICAgLy8gRGVoeWRyYXRlIHRoZSBwYXlsb2FkIGZvciBzdG9yYWdlXG4gICAgICAgIGNvbnN0IG9wczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKGhvb2suc3BlY1ZlcnNpb24pO1xuICAgICAgICBjb25zdCBkZWh5ZHJhdGVkUGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgcGF5bG9hZEtleSxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgKTtcbiAgICAgICAgLy8gVGhlc2UgcGF5bG9hZC1zdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGVcbiAgICAgICAgLy8gcHJvbWlzZSBoYW5kZWQgdG8gd2FpdFVudGlsIG11c3QgbmV2ZXIgcmVqZWN0IChhbiB1bmNvbnN1bWVkXG4gICAgICAgIC8vIHdhaXRVbnRpbCByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLFxuICAgICAgICAvLyBzbyB1bmV4cGVjdGVkIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgICAgLy8gTk9URTogcmVqZWN0aW9ucyB3aXRoIGB1bmRlZmluZWRgIGFyZSBhbiBleHBlY3RlZCBhcnRpZmFjdCBvZiB0aGVcbiAgICAgICAgLy8gd2ViaG9vayBidW5kbGUgYW5kIGFyZSBpZ25vcmVkIGVudGlyZWx5LlxuICAgICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgICBpZiAoZXJyID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ0JhY2tncm91bmQgZmx1c2ggb2YgaG9vayBwYXlsb2FkIG9wcyBmYWlsZWQnLCB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBob29rLnJ1bklkLFxuICAgICAgICAgICAgaG9va0lkOiBob29rLmhvb2tJZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUocmVzdW1lQ29udGV4dC53b3JrZmxvd05hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMaW5rIHRvIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgc3RvcmVkIHRyYWNlIGNhcnJpZXJcbiAgICAgICAgLy8gKHNraXBwZWQgd2hlbiBhYnNlbnQgb3IgaW52YWxpZCkuIFJlc29sdmVkIGJlZm9yZSBkaXNwYXRjaCBzbyBib3RoXG4gICAgICAgIC8vIHRoZSBzZXF1ZW50aWFsIGFuZCBwYXJhbGxlbCBwYXRocyBhdHRhY2ggaXQuXG4gICAgICAgIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIocmVzdW1lQ29udGV4dC50cmFjZUNhcnJpZXIpO1xuICAgICAgICBpZiAob3JpZ2luTGluaykge1xuICAgICAgICAgIHNwYW4/LmFkZExpbms/LihvcmlnaW5MaW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICAgICAgICAuLi4odjFDb21wYXQgPyB7fSA6IHsgdG9rZW46IGhvb2sudG9rZW4gfSksXG4gICAgICAgICAgcGF5bG9hZDogZGVoeWRyYXRlZFBheWxvYWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcXVldWVOYW1lID0gZ2V0V29ya2Zsb3dRdWV1ZU5hbWUocmVzdW1lQ29udGV4dC53b3JrZmxvd05hbWUpO1xuICAgICAgICBjb25zdCBxdWV1ZU9wdGlvbnMgPSB7XG4gICAgICAgICAgZGVwbG95bWVudElkOiByZXN1bWVDb250ZXh0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogcmVzdW1lQ29udGV4dC5ydW5TcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIHBhcmFsbGVsaXplIHRoZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAvLyBwdWJsaXNoLiBUaGUgZmFzdCBwYXRoIGlzIG9ubHkgc2FmZSB3aGVuIEVWRVJZIHByZWNvbmRpdGlvbiBob2xkczsgdGhlXG4gICAgICAgIC8vIGZpcnN0IHRoYXQgZmFpbHMgbmFtZXMgdGhlIGZhbGxiYWNrIHJlYXNvbiAoZW1pdHRlZCBhcyBhIHNwYW5cbiAgICAgICAgLy8gYXR0cmlidXRlIGZvciBvYnNlcnZhYmlsaXR5LCBhbmQgdG8gbWFrZSBcIndoeSBkaWQgdGhpcyBydW4gc2VxdWVudGlhbFwiXG4gICAgICAgIC8vIGFuc3dlcmFibGUgaW4gcHJvZHVjdGlvbikuIEFsbCBjb25kaXRpb25zOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgLSBraWxsIHN3aXRjaDogYFdPUktGTE9XX0RJU0FCTEVfTEFaWV9IT09LX1JFU1VNRWAgZm9yY2VzIHNlcXVlbnRpYWxcbiAgICAgICAgLy8gICAgaWYgdGhlIGZhc3QgcGF0aCBldmVyIG1pc2JlaGF2ZXMuIEl0IGlzIGFuIFNESy1kZXBsb3ltZW50IGVudiB2YXIsXG4gICAgICAgIC8vICAgIHNvIGNoYW5naW5nIGl0IGdlbmVyYWxseSByZXF1aXJlcyByZWRlcGxveWluZyB0aGUgd29ya2Zsb3dcbiAgICAgICAgLy8gICAgZGVwbG95bWVudC4gKFRoZSBiYWNrZW5kIGNhbiBpbmRlcGVuZGVudGx5IGRyb3AgbmV3IHJlc3VtZXMgdG8gdGhlXG4gICAgICAgIC8vICAgIHNlcXVlbnRpYWwgcGF0aCBmbGVldC13aWRlIGJ5IGNlYXNpbmcgdG8gYXR0ZXN0IGRlZHVwIHN1cHBvcnQgb25cbiAgICAgICAgLy8gICAgdGhlIGJ5LXRva2VuIGxvb2t1cCDigJQgc2VlIHRoZSBiYWNrZW5kLWRlZHVwIGNvbmRpdGlvbiBiZWxvdy4pXG4gICAgICAgIC8vICAtIGJhY2tlbmQgZGVkdXA6IHRoZSBsaXZlIGJhY2tlbmQgbXVzdCBlbmZvcmNlIHRoZVxuICAgICAgICAvLyAgICBgKHJ1bklkLCByZXN1bWVJZClgIGNvbnN0cmFpbnQsIG9yIHRoZSB0d28gd3JpdGVycyB3b3VsZCBjb21taXQgdHdvXG4gICAgICAgIC8vICAgIGBob29rX3JlY2VpdmVkYCBldmVudHMuIEZhaWwgY2xvc2VkLiBBdHRlc3RlZCBieSBFSVRIRVIgYSBmcmVzaCxcbiAgICAgICAgLy8gICAgcmVzcG9uc2Utb25seSBgaG9vay5yZXN1bWVDYXBhYmlsaXRpZXMuaG9va1Jlc3VtZURlZHVwVmVyc2lvbmAgZnJvbVxuICAgICAgICAvLyAgICB0aGUgYnktdG9rZW4gbG9va3VwICh3b3JsZC12ZXJjZWwg4oCUIHJlY29tcHV0ZWQgZXZlcnkgcmVhZCwgc28gYVxuICAgICAgICAvLyAgICBzZXJ2ZXIgcm9sbGJhY2sgb3Iga2lsbCBzd2l0Y2ggZHJvcHMgdG8gc2VxdWVudGlhbCBpbW1lZGlhdGVseSkgT1JcbiAgICAgICAgLy8gICAgdGhlIHN0YXRpYyBgd29ybGQuY2FwYWJpbGl0aWVzLmhvb2tSZXN1bWVEZWR1cGAgKHdvcmxkLWxvY2FsLCB3aG9zZVxuICAgICAgICAvLyAgICBhZGFwdGVyIGFuZCBiYWNrZW5kIHNoaXAgdG9nZXRoZXIpLiBUaGUgcmVzcG9uc2Utb25seSBjYXBhYmlsaXR5IGlzXG4gICAgICAgIC8vICAgIHRydXN0ZWQgT05MWSB3aGVuIHRoZSBob29rIHdhcyBsb29rZWQgdXAgYnkgdG9rZW4gZHVyaW5nIHRoaXNcbiAgICAgICAgLy8gICAgcmVzdW1lIChgaG9va1Jlc3VtZUNhcGFiaWxpdGllc0FyZUZyZXNoYCk7IGEgSG9vayBvYmplY3QgaGFuZGVkIGluXG4gICAgICAgIC8vICAgIGJ5IGEgcHVibGljIGNhbGxlciBtYXkgY2FycnkgYSBjYXBhYmlsaXR5IGNhY2hlZCBiZWZvcmUgYSByb2xsYmFjayxcbiAgICAgICAgLy8gICAgc28gaXQgaXMgaWdub3JlZCBhbmQgdGhlIHBhdGggZmFsbHMgYmFjayB0byBzZXF1ZW50aWFsLlxuICAgICAgICAvLyAgLSBjb25zdW1lciBzdXBwb3J0OiB0aGUgdGFyZ2V0IHJ1bidzIGRlcGxveW1lbnQgbXVzdCByZS1lbnN1cmUgdGhlXG4gICAgICAgIC8vICAgIGV2ZW50IGZyb20gYGhvb2tJbnB1dGAgb24gcmVwbGF5LiBBdHRlc3RlZCBieSB0aGUgcnVuJ3MgZXhwbGljaXRcbiAgICAgICAgLy8gICAgYGhvb2tSZXN1bWVJbnB1dFZlcnNpb25gIGV4ZWN1dGlvbi1jb250ZXh0IG1hcmtlciAobWlycm9yZWQgb250b1xuICAgICAgICAvLyAgICByZXN1bWVDb250ZXh0KSwgTk9UIGEgdmVyc2lvbi1jb21wYXJlIGFnYWluc3QgYSBwcmVkaWN0ZWQgcmVsZWFzZVxuICAgICAgICAvLyAgICBjdXRvZmYuIEFic2VudCDihpIgYSBsb3N0IHByb2R1Y2VyIHdyaXRlIHdvdWxkIGJlIGEgbG9zdCByZXN1bWUuXG4gICAgICAgIC8vICAtIG5vdCBsZWdhY3k6IHYxQ29tcGF0IHJ1bnMgb21pdCBgdG9rZW5gIGZyb20gdGhlIHByb2R1Y2VyJ3MgZXZlbnRcbiAgICAgICAgLy8gICAgYm9keSBidXQgdGhlIGNvbnN1bWVyJ3MgcmUtZW5zdXJlIGFsd2F5cyBpbmNsdWRlcyBpdCwgc28gdGhlIHR3b1xuICAgICAgICAvLyAgICB3cml0ZXJzIHdvdWxkIGRpc2FncmVlIG9uIHRoZSBldmVudCBib2R5LiBMZWdhY3kgc3RheXMgc2VxdWVudGlhbC5cbiAgICAgICAgLy8gIC0gQ0JPUiB0cmFuc3BvcnQ6IHRoZSBydW4gbXVzdCB1c2UgQ0JPUiBxdWV1ZSB0cmFuc3BvcnQgc28gdGhlIGJpbmFyeVxuICAgICAgICAvLyAgICBwYXlsb2FkIHN1cnZpdmVzIHRoZSBxdWV1ZSBtZXNzYWdlLlxuICAgICAgICAvLyAgLSByYXcgYnl0ZXM6IHRoZSBkZWh5ZHJhdGVkIHBheWxvYWQgbXVzdCBiZSBhIGBVaW50OEFycmF5YCAodGhlXG4gICAgICAgIC8vICAgIGNvbnRlbnQgZGlnZXN0IHRoYXQga2V5cyB0aGUgZGVkdXAgY29uc3RyYWludCBpcyBvdmVyIHRoZXNlIGJ5dGVzKS5cbiAgICAgICAgLy8gIC0gc2l6ZTogYSBwYXlsb2FkIGFib3ZlIHRoZSBxdWV1ZSdzIG1lc3NhZ2UgY2VpbGluZyB3b3VsZCBmYWlsIHRoZVxuICAgICAgICAvLyAgICBwdWJsaXNoIOKAlCB3aGljaCwgb24gdGhlIHBhcmFsbGVsIHBhdGgsIHdvdWxkIHBlcnNpc3QgdGhlIGV2ZW50IGJ1dFxuICAgICAgICAvLyAgICBuZXZlciByZS10cmlnZ2VyIHRoZSBydW4g4oCUIHNvIG92ZXJzaXplZCBwYXlsb2FkcyBzdGF5IHNlcXVlbnRpYWxcbiAgICAgICAgLy8gICAgKHRoZWlyIHF1ZXVlIG1lc3NhZ2UgY2FycmllcyBvbmx5IHRoZSBydW4gSUQpLlxuICAgICAgICBjb25zdCBwYXJhbGxlbFJlc3VtZURpc2FibGVkID1cbiAgICAgICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19ESVNBQkxFX0xBWllfSE9PS19SRVNVTUUgPT09ICcxJztcbiAgICAgICAgLy8gQmFja2VuZCBkZWR1cCBpcyBzdXBwb3J0ZWQgd2hlbiBFSVRIRVIgdGhlIGxpdmUgc2VydmVyIGF0dGVzdHMgaXRcbiAgICAgICAgLy8gZnJlc2ggb24gdGhpcyBieS10b2tlbiBob29rICh3b3JsZC12ZXJjZWw6IHJlc3BvbnNlLW9ubHksIHJlY29tcHV0ZWRcbiAgICAgICAgLy8gZXZlcnkgcmVhZCwgc28gcm9sbGJhY2sva2lsbC1zd2l0Y2ggdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkpIE9SIHRoZVxuICAgICAgICAvLyBzdGF0aWMgd29ybGQgY2FwYWJpbGl0eSBpcyBzZXQgKHdvcmxkLWxvY2FsOiBhZGFwdGVyICsgYmFja2VuZCBzaGlwXG4gICAgICAgIC8vIHRvZ2V0aGVyKS4gQm90aCBhcmUgcmUtZXZhbHVhdGVkIHBlciByZXN1bWUsIHNvIGV2ZXJ5IHJvbGxvdXQgYW5kXG4gICAgICAgIC8vIHJvbGxiYWNrIGRpcmVjdGlvbiBkZWdyYWRlcyBzYWZlbHkgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgY29uc3QgYmFja2VuZERlZHVwU3VwcG9ydGVkID1cbiAgICAgICAgICAoaG9va1Jlc3VtZUNhcGFiaWxpdGllc0FyZUZyZXNoXG4gICAgICAgICAgICA/IChob29rLnJlc3VtZUNhcGFiaWxpdGllcz8uaG9va1Jlc3VtZURlZHVwVmVyc2lvbiA/PyAwKVxuICAgICAgICAgICAgOiAwKSA+PSBIT09LX1JFU1VNRV9ERURVUF9WRVJTSU9OIHx8XG4gICAgICAgICAgd29ybGQuY2FwYWJpbGl0aWVzPy5ob29rUmVzdW1lRGVkdXAgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUmVhc29uOiBzdHJpbmcgfCBudWxsID0gcGFyYWxsZWxSZXN1bWVEaXNhYmxlZFxuICAgICAgICAgID8gJ2Rpc2FibGVkJ1xuICAgICAgICAgIDogIWJhY2tlbmREZWR1cFN1cHBvcnRlZFxuICAgICAgICAgICAgPyAnYmFja2VuZF91bnN1cHBvcnRlZCdcbiAgICAgICAgICAgIDogKHJlc3VtZUNvbnRleHQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA/PyAwKSA8XG4gICAgICAgICAgICAgICAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTlxuICAgICAgICAgICAgICA/ICdjb25zdW1lcl91bnN1cHBvcnRlZCdcbiAgICAgICAgICAgICAgOiB2MUNvbXBhdFxuICAgICAgICAgICAgICAgID8gJ2xlZ2FjeSdcbiAgICAgICAgICAgICAgICA6IChyZXN1bWVDb250ZXh0LnJ1blNwZWNWZXJzaW9uID8/IDApIDxcbiAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUXG4gICAgICAgICAgICAgICAgICA/ICdub25fY2Jvcl90cmFuc3BvcnQnXG4gICAgICAgICAgICAgICAgICA6ICEoZGVoeWRyYXRlZFBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgICAgICAgICAgICAgICA/ICdub25fYnl0ZXMnXG4gICAgICAgICAgICAgICAgICAgIDogZGVoeWRyYXRlZFBheWxvYWQuYnl0ZUxlbmd0aCA+XG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5MSU5FX1JFU1VNRV9QQVlMT0FEX0JZVEVTXG4gICAgICAgICAgICAgICAgICAgICAgPyAnb3ZlcnNpemVkJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3QgdXNlUGFyYWxsZWxSZXN1bWUgPSBmYWxsYmFja1JlYXNvbiA9PT0gbnVsbDtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfc3RyYXRlZ3knOiB1c2VQYXJhbGxlbFJlc3VtZVxuICAgICAgICAgICAgPyAncGFyYWxsZWwnXG4gICAgICAgICAgICA6ICdzZXF1ZW50aWFsJyxcbiAgICAgICAgICAuLi4oZmFsbGJhY2tSZWFzb25cbiAgICAgICAgICAgID8geyAnd29ya2Zsb3cuaG9vay5yZXN1bWVfZmFsbGJhY2tfcmVhc29uJzogZmFsbGJhY2tSZWFzb24gfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLWtleSBhbnkgXCJob29rIGNhbiBubyBsb25nZXIgYmUgcmVjZWl2ZWRcIiByZWplY3Rpb24gdG9cbiAgICAgICAgLy8gSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbikgc28gYC50b2tlbmAgbWF0Y2hlcyB0aGUgcHJlLWZhc3QtcGF0aFxuICAgICAgICAvLyBjb250cmFjdCwgd2hlcmUgcmVzdW1lSG9vayB0aHJldyBgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbilgXG4gICAgICAgIC8vIGFmdGVyIGl0cyBvd24gdGVybWluYWwgY2hlY2suIFRoZSBzcGVjaWZpYyBlcnJvciBkZXBlbmRzIG9uIHRoZVxuICAgICAgICAvLyBXb3JsZDpcbiAgICAgICAgLy8gICAtIGEgZ2VudWluZWx5IG1pc3NpbmcgaG9vayBtYXBzIHRvIEhvb2tOb3RGb3VuZEVycm9yIChrZXllZCBvbiB0aGVcbiAgICAgICAgLy8gICAgIGV2ZW50IGNvcnJlbGF0aW9uSWQgLyBob29rIElEKTtcbiAgICAgICAgLy8gICAtIGEgdGVybWluYWwgcnVuIG9uIFZlcmNlbCByZWplY3RzIGhvb2tfcmVjZWl2ZWQgd2l0aCA0MDQsIHdoaWNoXG4gICAgICAgIC8vICAgICB3b3JsZC12ZXJjZWwgbWFwcyB0byBIb29rTm90Rm91bmRFcnJvcjtcbiAgICAgICAgLy8gICAtIGEgdGVybWluYWwgcnVuIG9uIHdvcmxkLWxvY2FsIC8gd29ybGQtcG9zdGdyZXMgcmVqZWN0cyB3aXRoXG4gICAgICAgIC8vICAgICBSdW5FeHBpcmVkRXJyb3IuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIHRoZSBTRVFVRU5USUFMIHBhdGggYW4gRW50aXR5Q29uZmxpY3RFcnJvciAoSFRUUCA0MDkpIGlzIGFsc29cbiAgICAgICAgLy8gdHJlYXRlZCBhcyBcImhvb2sgZ29uZVwiIGZvciBoaXN0b3JpY2FsIC8gY29uZmxpY3Qtc2hhcGVkLXJlamVjdGlvblxuICAgICAgICAvLyBjb21wYXRpYmlsaXR5OiB0aGVyZSBpcyBubyBxdWV1ZSBtZXNzYWdlIGluIGZsaWdodCwgc28gYSBjb25mbGljdCBoYXNcbiAgICAgICAgLy8gbm8gcmUtZW5zdXJpbmcgY29uc3VtZXIgdG8gY29udmVyZ2Ugb24uIFRoZSBQQVJBTExFTCBwYXRoIGhhbmRsZXMgNDA5XG4gICAgICAgIC8vIGRpZmZlcmVudGx5IChzZWUgYmVsb3cpIOKAlCBpdCBwdWJsaXNoZWQgdGhlIHF1ZXVlIG1lc3NhZ2UgYmVmb3JlIHRoZVxuICAgICAgICAvLyBjb25mbGljdCwgc28gdGhlIGNvbnN1bWVyIHdpbGwgY29udmVyZ2UgdGhlIGV2ZW50LlxuICAgICAgICBjb25zdCBpc0hvb2tHb25lRXJyb3IgPSAoZXJyOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgICAgICAgIEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKTtcblxuICAgICAgICBpZiAoIXVzZVBhcmFsbGVsUmVzdW1lKSB7XG4gICAgICAgICAgLy8gU2VxdWVudGlhbCBwYXRoOiBjcmVhdGUgYSBob29rX3JlY2VpdmVkIGV2ZW50LCB0aGVuIHJlLXRyaWdnZXIuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHYxQ29tcGF0IH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNIb29rR29uZUVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHdvcmxkLnF1ZXVlKFxuICAgICAgICAgICAgcXVldWVOYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXN1bWVDb250ZXh0LnRyYWNlQ2FycmllciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAgICBxdWV1ZU9wdGlvbnNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIGhvb2s7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJhbGxlbCBmYXN0IHBhdGguIEEgc3RhYmxlIGlkZW1wb3RlbmN5IGtleSB0aWVzIHRoZSBkaXJlY3Qgd3JpdGUgdG9cbiAgICAgICAgLy8gdGhlIHF1ZXVlIGNvbnN1bWVyJ3MgcmUtZW5zdXJlOyB0aGUgcGF5bG9hZCBkaWdlc3QgbGV0cyB0aGUgc2VydmVyXG4gICAgICAgIC8vIGRldGVjdCBrZXkgcmV1c2UgYWNyb3NzIGJ5dGUtaWRlbnRpY2FsIHBheWxvYWRzLlxuICAgICAgICBjb25zdCByZXN1bWVJZCA9IGdlbmVyYXRlUmVzdW1lSWQoKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZERpZ2VzdCA9IGF3YWl0IGNvbXB1dGVSZXN1bWVQYXlsb2FkRGlnZXN0KFxuICAgICAgICAgIGRlaHlkcmF0ZWRQYXlsb2FkIGFzIFVpbnQ4QXJyYXlcbiAgICAgICAgKTtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7ICd3b3JrZmxvdy5ob29rLnJlc3VtZV9pZCc6IHJlc3VtZUlkIH0pO1xuXG4gICAgICAgIGNvbnN0IFtldmVudFJlc3VsdCwgcXVldWVSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHYxQ29tcGF0LCByZXN1bWVJZCwgcmVzdW1lUGF5bG9hZERpZ2VzdDogcGF5bG9hZERpZ2VzdCB9XG4gICAgICAgICAgKSxcbiAgICAgICAgICB3b3JsZC5xdWV1ZShcbiAgICAgICAgICAgIHF1ZXVlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmVzdW1lQ29udGV4dC50cmFjZUNhcnJpZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBob29rSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICByZXN1bWVJZCxcbiAgICAgICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRlaHlkcmF0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgLy8gRGVwbG95bWVudCBhZmZpbml0eSBmb3IgdGhlIGNvbnN1bWVyJ3MgY2hlYXAgcHJlLXdyaXRlXG4gICAgICAgICAgICAgICAgLy8gY2hlY2s6IGxldHMgYSBtaXNyb3V0ZWQgZGVsaXZlcnkgcmUtcm91dGUgYmVmb3JlIGl0c1xuICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgaG9va19yZWNlaXZlZCB3cml0ZSBpbnN0ZWFkIG9mIGFmdGVyLlxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAgICBxdWV1ZU9wdGlvbnNcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCDigJQgdGhlIHJ1biB3YXMgbm90IHJlLXRyaWdnZXJlZCwgc28gbm9cbiAgICAgICAgLy8gY29uc3VtZXIgd2lsbCByZS1lbnN1cmUgdGhlIGV2ZW50LlxuICAgICAgICBpZiAocXVldWVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHdoZW4gdGhlIGRpcmVjdCB3cml0ZSBkaWQgbm90IGxhbmQgYnV0IHRoZSBxdWV1ZSBkaXNwYXRjaCBkaWQsIHNvXG4gICAgICAgIC8vIHRoZSBjb25zdW1lciBtYXRlcmlhbGl6ZXMgdGhlIGV2ZW50IGJlZm9yZSByZXBsYXkuIFN1cmZhY2VkIHRvIHRoZVxuICAgICAgICAvLyBjYWxsZXIgYXMgYFJlc3VtZWRIb29rLnJlc2lsaWVudFJlc3VtZWAgYW5kIG9uIHRoZSBzcGFuLlxuICAgICAgICBsZXQgcmVzaWxpZW50UmVzdW1lID0gZmFsc2U7XG4gICAgICAgIGlmIChldmVudFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBldmVudFJlc3VsdC5yZWFzb247XG4gICAgICAgICAgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIC8vIFRoZSBob29rJ3MgcnVuIGhhcyBnZW51aW5lbHkgZW5kZWQ6IHN1cmZhY2UgdGhlIHNhbWUgY29udHJhY3QgYXNcbiAgICAgICAgICAgIC8vIHRoZSBzZXF1ZW50aWFsIHBhdGguIFRoZSBxdWV1ZSBtZXNzYWdlIGFscmVhZHkgd2VudCBvdXQsIGJ1dCB0aGVcbiAgICAgICAgICAgIC8vIGNvbnN1bWVyJ3MgcmUtZW5zdXJlIHdpbGwgYWxzbyByZWplY3QgYWdhaW5zdCB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAvLyBhbmQgbm8tb3AsIHNvIHRoZSB3b3JrZmxvdyBkb2VzIG5vdCByZXN1bWUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgIC8vIFJlc2lsaWVudC4gVHdvIHNoYXBlcyByZWFjaCBoZXJlLCBib3RoIG5vbi10ZXJtaW5hbDpcbiAgICAgICAgICAgIC8vICAgLSBFbnRpdHlDb25mbGljdCAoNDA5KTogdGhpcyB3cml0ZSByYWNlZCBpdHMgb3duIHJlLWVuc3VyaW5nXG4gICAgICAgICAgICAvLyAgICAgY29uc3VtZXIgKG9yIGEgcmVkcml2ZSkgb24gdGhlIHNoYXJlZCBgcmVzdW1lSWRgIOKAlCB0aGUgcnVuIGlzXG4gICAgICAgICAgICAvLyAgICAgTk9UIGdvbmUsIGFuZCB0aGUgY29uc3VtZXIgY29udmVyZ2VzIG9uIHRoZSBvbmUgY29tbWl0dGVkXG4gICAgICAgICAgICAvLyAgICAgZXZlbnQuIFVubGlrZSB0aGUgc2VxdWVudGlhbCBwYXRoLCBhIDQwOSBoZXJlIGlzIGV4cGVjdGVkXG4gICAgICAgICAgICAvLyAgICAgY29uY3VycmVuY3ksIG5vdCBhIHZhbmlzaGVkIGhvb2suXG4gICAgICAgICAgICAvLyAgIC0gNDI5IC8gNXh4IC8gdHJhbnNwb3J0OiBhIHRyYW5zaWVudCBiYWNrZW5kIGZhaWx1cmUuXG4gICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzIHRoZSBydW4gV0FTIHJlLXRyaWdnZXJlZCB2aWEgdGhlIHF1ZXVlIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIGNvbnN1bWVyIGlkZW1wb3RlbnRseSBlbnN1cmVzIHRoZSBob29rX3JlY2VpdmVkIGJlZm9yZSByZXBsYXksIHNvXG4gICAgICAgICAgICAvLyBzd2FsbG93IHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGNhbGxlci5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBQcm9kdWNlciB0ZWxlbWV0cnk6IHJlY29yZCB0aGF0IHRoZSBkaXJlY3Qgd3JpdGUgZGlkIG5vdCBsYW5kIGJ1dFxuICAgICAgICAgICAgLy8gdGhlIHJlc3VtZSBpcyBzdGlsbCBndWFyYW50ZWVkIHZpYSBxdWV1ZS1kZWxpdmVyZWQgYGhvb2tJbnB1dGAuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvcGVyYXRpb25hbCBzaWduYWwgdGhhdCB0aGUgcmVjb3ZlcnkgcGF0aCBmaXJlZCxcbiAgICAgICAgICAgIC8vIHN1cmZhY2VkIGJvdGggb24gdGhlIHNwYW4gYW5kIGFzIHRoZSBwdWJsaWMgYHJlc2lsaWVudFJlc3VtZWBcbiAgICAgICAgICAgIC8vIGZsYWcgb24gdGhlIHJldHVybmVkIGhvb2sgKHRoZSByZXN1bWUgb3V0Y29tZSBpcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIGlkZW50aWNhbCB0byB0aGUgaGFwcHkgcGF0aCBmcm9tIHRoZSBjYWxsZXIncyBwZXJzcGVjdGl2ZSkuXG4gICAgICAgICAgICByZXNpbGllbnRSZXN1bWUgPSB0cnVlO1xuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rUmVzaWxpZW50UmVzdW1lKHRydWUpLFxuICAgICAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfZXZlbnRfd3JpdGVfcmVjb3ZlcmVkJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2V2ZW50X3dyaXRlX2Vycm9yJzpcbiAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ3Vua25vd24nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICdIb29rIHJlc3VtZSBldmVudCB3cml0ZSBmYWlsZWQsIGJ1dCB0aGUgcnVuIHdhcyByZS10cmlnZ2VyZWQgdmlhICcgK1xuICAgICAgICAgICAgICAgICd0aGUgcXVldWUuIFRoZSBob29rX3JlY2VpdmVkIGV2ZW50IHdpbGwgYmUgZW5zdXJlZCBieSB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ3F1ZXVlIGNvbnN1bWVyLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBob29rLnJ1bklkLFxuICAgICAgICAgICAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICAgICAgcmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcmVzaWxpZW50UmVzdW1lID8geyAuLi5ob29rLCByZXNpbGllbnRSZXN1bWU6IHRydWUgfSA6IGhvb2tcbiAgICAgICAgKSBzYXRpc2ZpZXMgUmVzdW1lZEhvb2s7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihcbiAgICAgICAgICAgIHR5cGVvZiB0b2tlbk9ySG9vayA9PT0gJ3N0cmluZycgPyB0b2tlbk9ySG9vayA6IHRva2VuT3JIb29rLnRva2VuXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0ZvdW5kKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzdW1lcyBhIHdlYmhvb2sgYnkgc2VuZGluZyBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdCB8IFJlcXVlc3R9XG4gKiBvYmplY3QgdG8gYSBob29rIGlkZW50aWZpZWQgYnkgaXRzIHRva2VuLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV4dGVybmFsbHkgKGUuZy4sIGZyb20gYW4gQVBJIHJvdXRlIG9yIHNlcnZlciBhY3Rpb24pXG4gKiB0byBzZW5kIGEgcmVxdWVzdCB0byBhIHdlYmhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9va1xuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBob29rXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzcG9uc2VcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAqICAgY29uc3QgdG9rZW4gPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndG9rZW4nKTtcbiAqXG4gKiAgIGlmICghdG9rZW4pIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAqICAgfVxuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3VtZVdlYmhvb2sodG9rZW4sIHJlcXVlc3QpO1xuICogICAgIHJldHVybiByZXNwb25zZTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdXZWJob29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lV2ViaG9vayhcbiAgdG9rZW46IHN0cmluZyxcbiAgcmVxdWVzdDogUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfSA9IGF3YWl0IGdldEhvb2tCeVRva2VuV2l0aEtleSh0b2tlbik7XG5cbiAgLy8gT25seSB3ZWJob29rcyBjYW4gYmUgcmVzdW1lZCB2aWEgdGhlIHB1YmxpYyBlbmRwb2ludC5cbiAgLy8gSWYgdGhlIGhvb2sgd2FzIGNyZWF0ZWQgdmlhIGNyZWF0ZUhvb2soKSAoaXNXZWJob29rICE9PSB0cnVlKSxcbiAgLy8gdGhyb3cgdGhlIHNhbWUgXCJub3QgZm91bmRcIiBlcnJvciB0aGUgd29ybGQgd291bGQgdGhyb3cgZm9yIGEgbWlzc2luZ1xuICAvLyB0b2tlbi4gVGhpcyBwcmV2ZW50cyBsZWFraW5nIHRoYXQgdGhlIHRva2VuIGlzIHZhbGlkLlxuICBpZiAoaG9vay5pc1dlYmhvb2sgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKHRva2VuKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTogUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNwb25zZVJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxSZXNwb25zZT4gfCB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBob29rLm1ldGFkYXRhICYmXG4gICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3Jlc3BvbmRXaXRoJyBpbiBob29rLm1ldGFkYXRhXG4gICkge1xuICAgIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoID09PSAnbWFudWFsJykge1xuICAgICAgY29uc3QgeyByZWFkYWJsZSwgd3JpdGFibGUgfSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08UmVzcG9uc2UsIFJlc3BvbnNlPigpO1xuICAgICAgcmVzcG9uc2VSZWFkYWJsZSA9IHJlYWRhYmxlO1xuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBpbnN0YW5jZSBpbmNsdWRlcyB0aGUgd3JpdGFibGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgdXNlZFxuICAgICAgLy8gdG8gd3JpdGUgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IHJ1blxuICAgICAgKHJlcXVlc3QgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHdyaXRhYmxlO1xuICAgIH0gZWxzZSBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZSA9IGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgXFxgcmVzcG9uZFdpdGhcXGAgdmFsdWU6ICR7aG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aH1gLFxuICAgICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUUgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gYHJlc3BvbmRXaXRoYCB2YWx1ZSBpbXBsaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHJldHVybmluZyBhIDIwMlxuICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAyMDIgfSk7XG4gIH1cblxuICAvLyBgaG9va2Agd2FzIGp1c3QgZmV0Y2hlZCB2aWEgYGdldEhvb2tCeVRva2VuV2l0aEtleWAgKGEgZnJlc2ggYnktdG9rZW5cbiAgLy8gbG9va3VwKSBhYm92ZSwgc28gaXRzIHJlc3BvbnNlLW9ubHkgYHJlc3VtZUNhcGFiaWxpdGllc2AgcmVmbGVjdHMgdGhlIGxpdmVcbiAgLy8gYmFja2VuZCDigJQgY2FsbCB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgZnJlc2ggYXR0ZXN0YXRpb24gc29cbiAgLy8gdGhlIHBhcmFsbGVsIGZhc3QgcGF0aCBzdGF5cyBhdmFpbGFibGUgd2l0aG91dCBhIHNlY29uZCBHRVQuIChUaGUgcHVibGljXG4gIC8vIGByZXN1bWVIb29rYCBuZXZlciBzZXRzIHRoaXMsIHNvIGEgY2FsbGVyIGNhbm5vdCBmb3JnZSBpdC4pXG4gIGF3YWl0IHJlc3VtZUhvb2tJbXBsKGhvb2ssIHJlcXVlc3QsIGVuY3J5cHRpb25LZXksIHRydWUpO1xuXG4gIGlmIChyZXNwb25zZVJlYWRhYmxlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlYWRhYmxlIHN0cmVhbSB0byBlbWl0IG9uZSBjaHVuayxcbiAgICAvLyB3aGljaCBpcyB0aGUgYFJlc3BvbnNlYCBvYmplY3RcbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZVJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsudmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gY2h1bmsudmFsdWU7XG4gICAgfVxuICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dvcmtmbG93IHJ1biBkaWQgbm90IHNlbmQgYSByZXNwb25zZScsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/runtime/runs.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,4BAA4B,EAIjC,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,4BAA4B,CAAC,CA8EvC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAoG1B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CASrC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB"}
1
+ {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/runtime/runs.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,4BAA4B,EAIjC,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,4BAA4B,CAAC,CA8EvC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAmG1B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CASrC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB"}