@workflow/core 5.0.0-beta.42 → 5.0.0-beta.43
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.
- package/dist/create-hook.d.ts +9 -5
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/private.d.ts +31 -12
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +147 -23
- package/dist/runtime/constants.d.ts +27 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +33 -1
- package/dist/runtime/quickjs-entrypoint.d.ts +2 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +3 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +54 -29
- package/dist/runtime/step-executor.d.ts +49 -1
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +67 -8
- package/dist/runtime/step-latency.d.ts +6 -0
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +3 -1
- package/dist/runtime/suspension-handler.d.ts +81 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +501 -15
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +126 -16
- package/dist/serialization.d.ts +10 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +48 -6
- package/dist/telemetry.d.ts +6 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +22 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/hook.js +3 -3
- package/dist/workflow.js +16 -8
- package/docs/foundations/hooks.mdx +2 -2
- package/docs/foundations/streaming.mdx +24 -0
- package/docs/how-it-works/event-sourcing.mdx +39 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAIL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAYzB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAQnB,gBAAgB;AAChB,wBAAgB,4BAA4B,IAAI,MAAM,CAMrD;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAiC9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;CAqI7B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}
|
package/dist/runtime/run.js
CHANGED
|
@@ -7,6 +7,10 @@ import { getWorkflowRunStreamId } from '../util.js';
|
|
|
7
7
|
import { getWorldLazy } from './get-world-lazy.js';
|
|
8
8
|
import { wakeUpRun, } from './runs.js';
|
|
9
9
|
const RETURN_VALUE_POLL_INTERVAL_MS = 1_000;
|
|
10
|
+
const PAYLOAD_TERMINAL_RUN_STATUSES = new Set([
|
|
11
|
+
'completed',
|
|
12
|
+
'failed',
|
|
13
|
+
]);
|
|
10
14
|
/** @internal */
|
|
11
15
|
export function getReturnValuePollIntervalMs() {
|
|
12
16
|
return envNumber('WORKFLOW_RETURN_VALUE_POLL_INTERVAL_MS', RETURN_VALUE_POLL_INTERVAL_MS, { integer: true, min: 1 });
|
|
@@ -59,12 +63,12 @@ export class Run {
|
|
|
59
63
|
* to be resolved once.
|
|
60
64
|
* @internal
|
|
61
65
|
*/
|
|
62
|
-
#getEncryptionKey() {
|
|
66
|
+
#getEncryptionKey(run) {
|
|
63
67
|
if (!this.#encryptionKeyPromise) {
|
|
64
68
|
this.#encryptionKeyPromise = (async () => {
|
|
65
69
|
const world = await this.#lazyWorldPromise;
|
|
66
|
-
const
|
|
67
|
-
const rawKey = await world.getEncryptionKeyForRun?.(
|
|
70
|
+
const runData = run ?? (await world.runs.get(this.runId));
|
|
71
|
+
const rawKey = await world.getEncryptionKeyForRun?.(runData);
|
|
68
72
|
return rawKey ? await deriveRunPayloadKeys(rawKey) : undefined;
|
|
69
73
|
})();
|
|
70
74
|
}
|
|
@@ -128,7 +132,9 @@ export class Run {
|
|
|
128
132
|
*/
|
|
129
133
|
get status() {
|
|
130
134
|
'use step';
|
|
131
|
-
return this.#lazyWorldPromise.then((world) => world.runs
|
|
135
|
+
return this.#lazyWorldPromise.then((world) => world.runs
|
|
136
|
+
.get(this.runId, { resolveData: 'none' })
|
|
137
|
+
.then((run) => run.status));
|
|
132
138
|
}
|
|
133
139
|
/**
|
|
134
140
|
* The return value of the workflow run.
|
|
@@ -209,6 +215,38 @@ export class Run {
|
|
|
209
215
|
},
|
|
210
216
|
});
|
|
211
217
|
}
|
|
218
|
+
/** @internal */
|
|
219
|
+
async #resolveTerminalReturnValue(run) {
|
|
220
|
+
if (run.status === 'completed') {
|
|
221
|
+
const encryptionKey = await this.#getEncryptionKey(run);
|
|
222
|
+
return await hydrateWorkflowReturnValue(run.output, this.runId, encryptionKey);
|
|
223
|
+
}
|
|
224
|
+
if (run.status === 'cancelled') {
|
|
225
|
+
throw new WorkflowRunCancelledError(this.runId);
|
|
226
|
+
}
|
|
227
|
+
if (run.status === 'failed') {
|
|
228
|
+
// Hydrate the serialized run error so the original thrown value
|
|
229
|
+
// (with its type identity, cause chain, etc.) is set as the
|
|
230
|
+
// `cause` on WorkflowRunFailedError.
|
|
231
|
+
const encryptionKey = await this.#getEncryptionKey(run);
|
|
232
|
+
let hydratedError;
|
|
233
|
+
try {
|
|
234
|
+
hydratedError = await hydrateRunError(run.error, this.runId, encryptionKey);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// If hydration fails, surface a generic fallback rather than
|
|
238
|
+
// leaving the user with a raw Uint8Array. The run's errorCode
|
|
239
|
+
// is still preserved on the thrown WorkflowRunFailedError.
|
|
240
|
+
hydratedError = new Error('Failed to hydrate workflow run error');
|
|
241
|
+
}
|
|
242
|
+
throw new WorkflowRunFailedError(this.runId, hydratedError, {
|
|
243
|
+
errorCode: run.errorCode,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// Terminal statuses are immutable, but if an inconsistent world returns
|
|
247
|
+
// a non-terminal full record, resume polling safely.
|
|
248
|
+
throw new WorkflowRunNotCompletedError(this.runId, run.status);
|
|
249
|
+
}
|
|
212
250
|
/**
|
|
213
251
|
* Polls the workflow return value until it is completed.
|
|
214
252
|
* @internal
|
|
@@ -233,35 +271,22 @@ export class Run {
|
|
|
233
271
|
// changelog for details.
|
|
234
272
|
while (true) {
|
|
235
273
|
try {
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
if (run.status === 'cancelled') {
|
|
274
|
+
const runMetadata = await world.runs.get(this.runId, {
|
|
275
|
+
resolveData: 'none',
|
|
276
|
+
});
|
|
277
|
+
if (runMetadata.status === 'cancelled') {
|
|
242
278
|
throw new WorkflowRunCancelledError(this.runId);
|
|
243
279
|
}
|
|
244
|
-
if (
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
let hydratedError;
|
|
250
|
-
try {
|
|
251
|
-
hydratedError = await hydrateRunError(run.error, this.runId, encryptionKey);
|
|
252
|
-
}
|
|
253
|
-
catch {
|
|
254
|
-
// If hydration fails, surface a generic fallback rather than
|
|
255
|
-
// leaving the user with a raw Uint8Array. The run's errorCode
|
|
256
|
-
// is still preserved on the thrown WorkflowRunFailedError.
|
|
257
|
-
hydratedError = new Error('Failed to hydrate workflow run error');
|
|
258
|
-
}
|
|
259
|
-
throw new WorkflowRunFailedError(this.runId, hydratedError, {
|
|
260
|
-
errorCode: run.errorCode,
|
|
280
|
+
if (PAYLOAD_TERMINAL_RUN_STATUSES.has(runMetadata.status)) {
|
|
281
|
+
// The polling read above deliberately skips input/output/error refs.
|
|
282
|
+
// Resolve payloads only once the run reaches a terminal state.
|
|
283
|
+
const run = await world.runs.get(this.runId, {
|
|
284
|
+
resolveData: 'all',
|
|
261
285
|
});
|
|
286
|
+
return await this.#resolveTerminalReturnValue(run);
|
|
262
287
|
}
|
|
263
288
|
// Run not completed yet — sleep and poll again.
|
|
264
|
-
throw new WorkflowRunNotCompletedError(this.runId,
|
|
289
|
+
throw new WorkflowRunNotCompletedError(this.runId, runMetadata.status);
|
|
265
290
|
}
|
|
266
291
|
catch (error) {
|
|
267
292
|
if (WorkflowRunNotCompletedError.is(error)) {
|
|
@@ -290,4 +315,4 @@ export class Run {
|
|
|
290
315
|
export function getRun(runId) {
|
|
291
316
|
return new Run(runId);
|
|
292
317
|
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixHQUdyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZiwwQkFBMEIsR0FDM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFJTCxTQUFTLEdBQ1YsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFFNUMsZ0JBQWdCO0FBQ2hCLE1BQU0sVUFBVSw0QkFBNEI7SUFDMUMsT0FBTyxTQUFTLENBQ2Qsd0NBQXdDLEVBQ3hDLDZCQUE2QixFQUM3QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUMxQixDQUFDO0FBQ0osQ0FBQztBQTZDRDs7R0FFRztBQUNILE1BQU0sT0FBTyxHQUFHO0lBQ2QsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFzQjtRQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQs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ICBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yLFxuICBXb3JrZmxvd1J1bkZhaWxlZEVycm9yLFxuICBXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yLFxuICBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfREVTRVJJQUxJWkUsIFdPUktGTE9XX1NFUklBTElaRSB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5pbXBvcnQge1xuICBlbnZOdW1iZXIsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICB0eXBlIFdvcmtmbG93UnVuU3RhdHVzLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldEV4dGVybmFsUmV2aXZlcnMsXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIENhbmNlbFJ1bk9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW5zLmpzJztcblxuY29uc3QgUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMgPSAxXzAwMDtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlUG9sbEludGVydmFsTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMnLFxuICAgIFJFVFVSTl9WQUxVRV9QT0xMX0lOVEVSVkFMX01TLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBBIGBSZWFkYWJsZVN0cmVhbWAgZXh0ZW5kZWQgd2l0aCB3b3JrZmxvdy1zcGVjaWZpYyBoZWxwZXJzLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtPFIgPSBhbnk+ID0gUmVhZGFibGVTdHJlYW08Uj4gJiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YWlsIGluZGV4IChpbmRleCBvZiB0aGUgbGFzdCBrbm93biBjaHVuaywgMC1iYXNlZCkgb2YgdGhlXG4gICAqIHVuZGVybHlpbmcgd29ya2Zsb3cgc3RyZWFtLiBVc2VmdWwgZm9yIHJlc29sdmluZyBhIG5lZ2F0aXZlIGBzdGFydEluZGV4YFxuICAgKiBpbnRvIGFuIGFic29sdXRlIHBvc2l0aW9uIOKAlCBmb3IgZXhhbXBsZSwgd2hlbiBidWlsZGluZyByZWNvbm5lY3Rpb25cbiAgICogZW5kcG9pbnRzIHRoYXQgbmVlZCB0byBpbmZvcm0gdGhlIGNsaWVudCB3aGVyZSB0aGUgc3RyZWFtIHN0YXJ0cy5cbiAgICpcbiAgICogUmV0dXJucyBgLTFgIHdoZW4gbm8gY2h1bmtzIGhhdmUgYmVlbiB3cml0dGVuIHlldC5cbiAgICovXG4gIGdldFRhaWxJbmRleCgpOiBQcm9taXNlPG51bWJlcj47XG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgd29ya2Zsb3cncyByZWFkYWJsZSBzdHJlYW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZXNwYWNlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgc3RyZWFtcyBhc3NvY2lhdGVkXG4gICAqIHdpdGggdGhlIHNhbWUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGluZGV4IG51bWJlciBvZiB0aGUgc3RhcnRpbmcgY2h1bmsgdG8gYmVnaW4gcmVhZGluZyB0aGUgc3RyZWFtIGZyb20uXG4gICAqIE5lZ2F0aXZlIHZhbHVlcyBzdGFydCBmcm9tIHRoZSBlbmQgKGUuZy4gLTMgcmVhZHMgdGhlIGxhc3QgMyBjaHVua3MpLlxuICAgKi9cbiAgc3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uXG4gICAqIGVudmlyb25tZW50IGlzIHBhdXNlZCAvIHRlcm1pbmF0ZWRcbiAgICogKGkuZS4gdXNpbmcgW2B3YWl0VW50aWwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FeHRlbmRhYmxlRXZlbnQvd2FpdFVudGlsKSBvciBzaW1pbGFyKS5cbiAgICovXG4gIG9wcz86IFByb21pc2U8YW55PltdO1xuICAvKipcbiAgICogVGhlIGdsb2JhbCBvYmplY3QgdG8gdXNlIGZvciBoeWRyYXRpbmcgdHlwZXMgZnJvbSB0aGUgZ2xvYmFsIHNjb3BlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgW2BnbG9iYWxUaGlzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZ2xvYmFsVGhpcyl9LlxuICAgKi9cbiAgZ2xvYmFsPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgY2xhc3MgZm9yIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgUnVuPFRSZXN1bHQ+IHtcbiAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKGluc3RhbmNlOiBSdW48dW5rbm93bj4pIHtcbiAgICByZXR1cm4geyBydW5JZDogaW5zdGFuY2UucnVuSWQsIHJlc2lsaWVudFN0YXJ0OiBpbnN0YW5jZS4jcmVzaWxpZW50U3RhcnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGE6IHtcbiAgICBydW5JZDogc3RyaW5nO1xuICAgIHJlc2lsaWVudFN0YXJ0PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHJldHVybiBuZXcgUnVuKGRhdGEucnVuSWQsIHsgcmVzaWxpZW50U3RhcnQ6IGRhdGEucmVzaWxpZW50U3RhcnQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgb2JqZWN0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICN3b3JsZFByb21pc2U6IFByb21pc2U8V29ybGQ+IHwgdW5kZWZpbmVkO1xuICBnZXQgI2xhenlXb3JsZFByb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLiN3b3JsZFByb21pc2UpIHRoaXMuI3dvcmxkUHJvbWlzZSA9IGdldFdvcmxkTGF6eSgpO1xuICAgIHJldHVybiB0aGlzLiN3b3JsZFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGVkIGVuY3J5cHRpb24ga2V5IHJlc29sdXRpb24uIFJlc29sdmVkIG9uY2Ugb24gZmlyc3QgdXNlIGFuZFxuICAgKiByZXVzZWQgZm9yIHJldHVyblZhbHVlLCBnZXRSZWFkYWJsZSgpLCBldGMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2VuY3J5cHRpb25LZXlQcm9taXNlOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgcnVuX2NyZWF0ZWQgZmFpbGVkIGFuZCB0aGUgcnVuIG1heSBub3QgZXhpc3QgeWV0ICh0aGVcbiAgICogcmVzaWxpZW50IHN0YXJ0IHBhdGggd2lsbCBjcmVhdGUgaXQgdmlhIHJ1bl9zdGFydGVkKS4gcG9sbFJldHVyblZhbHVlXG4gICAqIHJldHJpZXMgb24gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIG9ubHkgd2hlbiB0aGlzIGZsYWcgaXMgc2V0IHNvXG4gICAqIHRoYXQgbm9ybWFsIHJ1bnMgZmFpbCBmYXN0IG9uIDQwNC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjcmVzaWxpZW50U3RhcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBvcHRzPzogeyByZXNpbGllbnRTdGFydD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLiNyZXNpbGllbnRTdGFydCA9IG9wdHM/LnJlc2lsaWVudFN0YXJ0ID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuZCBjYWNoZXMgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bi5cbiAgICogVGhlIGtleSBpcyB0aGUgc2FtZSBmb3IgdGhlIGxpZmV0aW1lIG9mIGEgcnVuLCBzbyBpdCBvbmx5IG5lZWRzXG4gICAqIHRvIGJlIHJlc29sdmVkIG9uY2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2dldEVuY3J5cHRpb25LZXkoKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLiNlbmNyeXB0aW9uS2V5UHJvbWlzZSkge1xuICAgICAgdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpO1xuICAgICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVmZXIgZmV0Y2hpbmcgdGhlIHJ1biBhbmQgaXRzIGVuY3J5cHRpb24ga2V5IHVudGlsIHNlcmlhbGl6ZWQgc3RyZWFtIGRhdGFcbiAgICogaXMgYWN0dWFsbHkgcmVhZC4gQW4gZW1wdHkgb3IgbWV0YWRhdGEtb25seSBzdHJlYW0gbXVzdCBub3Qgc3RhcnQgYW5cbiAgICogdW5vYnNlcnZlZCBydW4gbG9va3VwLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNnZXRFbmNyeXB0aW9uS2V5TGF6aWx5KCk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJydXB0cyBwZW5kaW5nIGBzbGVlcCgpYCBjYWxscywgcmVzdW1pbmcgdGhlIHdvcmtmbG93IGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIHRvIHRhcmdldCBzcGVjaWZpYyBzbGVlcCBjYWxscyBieSBjb3JyZWxhdGlvbiBJRC5cbiAgICogICBJZiBub3QgcHJvdmlkZWQsIGFsbCBwZW5kaW5nIHNsZWVwIGNhbGxzIHdpbGwgYmUgaW50ZXJydXB0ZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFN0b3BTbGVlcFJlc3VsdH0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzbGVlcCBjYWxscyB0aGF0IHdlcmUgaW50ZXJydXB0ZWQuXG4gICAqL1xuICBhc3luYyB3YWtlVXAob3B0aW9ucz86IFN0b3BTbGVlcE9wdGlvbnMpOiBQcm9taXNlPFN0b3BTbGVlcFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHdha2VVcFJ1bihhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlLCB0aGlzLnJ1bklkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY2FuY2VsbGF0aW9uIHNldHRpbmdzLiBgY2FuY2VsUmVhc29uYCByZWNvcmRzIGFcbiAgICogICBmcmVlLXRleHQgcmVhc29uIChtYXggNTEyIGNoYXJzKSBvbiB0aGUgcnVuX2NhbmNlbGxlZCBldmVudCwgc3VyZmFjZWQgaW5cbiAgICogICB0aGUgcnVuIGRldGFpbCB2aWV3LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKG9wdGlvbnM/OiBDYW5jZWxSdW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh0aGlzLnJ1bklkLCB7XG4gICAgICBldmVudFR5cGU6ICdydW5fY2FuY2VsbGVkJyxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIC4uLihvcHRpb25zPy5jYW5jZWxSZWFzb24gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgZXZlbnREYXRhOiB7IGNhbmNlbFJlYXNvbjogb3B0aW9ucy5jYW5jZWxSZWFzb24gfSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IHJ1biBleGlzdHMuXG4gICAqL1xuICBnZXQgZXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldCBzdGF0dXMoKTogUHJvbWlzZTxXb3JrZmxvd1J1blN0YXR1cz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGF0dXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqIFBvbGxzIHRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgdW50aWwgaXQgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGxSZXR1cm5WYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIGdldCB3b3JrZmxvd05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkudGhlbigocnVuKSA9PiBydW4ud29ya2Zsb3dOYW1lKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBydW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCk6IFByb21pc2U8RGF0ZT4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5jcmVhdGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBzdGFydGVkIGV4ZWN1dGlvbi5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQuXG4gICAqL1xuICBnZXQgc3RhcnRlZEF0KCk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGFydGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBjb21wbGV0ZWQuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSB3b3JrZmxvdyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgY29tcGxldGVkQXQoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLmNvbXBsZXRlZEF0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZ2V0IHJlYWRhYmxlKCk6IFdvcmtmbG93UmVhZGFibGVTdHJlYW0ge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB3b3JrZmxvdyBydW4ncyBkZWZhdWx0IHJlYWRhYmxlIHN0cmVhbSwgd2hpY2ggcmVhZHMgY2h1bmtzXG4gICAqIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGFibGUgc3RyZWFtIHtAbGluayBnZXRXcml0YWJsZX0uXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGFuIGFkZGl0aW9uYWwge0BsaW5rIFdvcmtmbG93UmVhZGFibGVTdHJlYW0uZ2V0VGFpbEluZGV4IHwgZ2V0VGFpbEluZGV4KCl9XG4gICAqIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLiBUaGlzIGlzIHVzZWZ1bCB3aGVuXG4gICAqIGJ1aWxkaW5nIHJlY29ubmVjdGlvbiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSBjbGllbnRzIHdoZXJlIHRoZVxuICAgKiBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgcmVhZGFibGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyBBIGBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtYCBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldFJlYWRhYmxlPFIgPSBhbnk+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zID0ge31cbiAgKTogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbTxSPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB7IG9wcyA9IFtdLCBnbG9iYWwgPSBnbG9iYWxUaGlzLCBzdGFydEluZGV4LCBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQodGhpcy5ydW5JZCwgbmFtZXNwYWNlKTtcbiAgICAvLyBUaGUgcmVzb2x2ZXIgc3RhcnRzIG9ubHkgd2hlbiB0aGUgZGVzZXJpYWxpemUgc3RyZWFtIHNlZXMgaXRzIGZpcnN0XG4gICAgLy8gY2h1bmssIHNvIGNyZWF0aW5nIG9yIHByb2JpbmcgYW4gZW1wdHkgc3RyZWFtIGNhbm5vdCByZWplY3QgaW4gdGhlXG4gICAgLy8gYmFja2dyb3VuZC5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jZ2V0RW5jcnlwdGlvbktleUxhemlseSgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHRoaXMucnVuSWQsIGVuY3J5cHRpb25LZXkpXG4gICAgICAuUmVhZGFibGVTdHJlYW0hKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydEluZGV4LFxuICAgIH0pIGFzIFJlYWRhYmxlU3RyZWFtPFI+O1xuXG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcbiAgICBjb25zdCBydW5JZCA9IHRoaXMucnVuSWQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3RyZWFtLCB7XG4gICAgICBnZXRUYWlsSW5kZXg6IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0SW5mbyhydW5JZCwgbmFtZSk7XG4gICAgICAgIHJldHVybiBpbmZvLnRhaWxJbmRleDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZSB1bnRpbCBpdCBpcyBjb21wbGV0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcmV0dXJucyBUaGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgI3BvbGxSZXR1cm5WYWx1ZSgpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG5cbiAgICAvLyBXaGVuIHJlc2lsaWVudFN0YXJ0IGlzIHRydWUsIHJ1bl9jcmVhdGVkIGZhaWxlZCBhbmQgdGhlIHJ1biBtYXlcbiAgICAvLyBub3QgZXhpc3QgeWV0LiBSZXRyeSBvbiBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgdXAgdG8gMyB0aW1lc1xuICAgIC8vICgxcyArIDNzICsgNnMgPSAxMHMgdG90YWwpIHRvIGdpdmUgdGhlIHF1ZXVlIHRpbWUgdG8gZGVsaXZlclxuICAgIC8vIGFuZCB0aGUgcnVudGltZSB0byBjcmVhdGUgdGhlIHJ1biB2aWEgcnVuX3N0YXJ0ZWQuXG4gICAgLy8gV2hlbiByZXNpbGllbnRTdGFydCBpcyBmYWxzZSwgNDA0IGlzIGEgcmVhbCBlcnJvciDigJQgZmFpbCBmYXN0LlxuICAgIGxldCBub3RGb3VuZFJldHJpZXMgPSAwO1xuICAgIGNvbnN0IE5PVF9GT1VORF9NQVhfUkVUUklFUyA9IHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID8gMyA6IDA7XG4gICAgY29uc3QgTk9UX0ZPVU5EX0RFTEFZUyA9IFsxXzAwMCwgM18wMDAsIDZfMDAwXTtcblxuICAgIC8vIE5PVEU6IHdoZW4gdGhpcyBwb2xsIHJ1bnMgaW5zaWRlIGEgc3RlcCAoZS5nLiB0aGUgc3RlcCB0aGF0IGEgcGFyZW50XG4gICAgLy8gd29ya2Zsb3cgdXNlcyB0byBhd2FpdCBhIGNoaWxkIHdvcmtmbG93J3MgYHJldHVyblZhbHVlYCksIGl0IGJsb2Nrc1xuICAgIC8vIGEgcXVldWUgd29ya2VyIHNsb3QgZm9yIGFzIGxvbmcgYXMgdGhlIGNoaWxkIHJ1biB0YWtlcyB0byBmaW5pc2guXG4gICAgLy8gV29ya2VyLWJhc2VkIHdvcmxkcyBsaWtlIGB3b3JsZC1wb3N0Z3Jlc2AgbXVzdCBiZSBzaXplZCB0byBjb3ZlciB0aGVcbiAgICAvLyBwZWFrIG51bWJlciBvZiBzdWNoIHBvbGxzIGluIGZsaWdodCDigJQgc2VlIHRoZSBgcXVldWVDb25jdXJyZW5jeWBcbiAgICAvLyBkZWZhdWx0IG9uIHRoZSBQb3N0Z3JlcyB3b3JsZCBhbmQgdGhlIG5vdGVzIGluIHRoZSBlYWdlci1wcm9jZXNzaW5nXG4gICAgLy8gY2hhbmdlbG9nIGZvciBkZXRhaWxzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKTtcblxuICAgICAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgdGhpcy4jZ2V0RW5jcnlwdGlvbktleSgpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgIHJ1bi5vdXRwdXQsXG4gICAgICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcih0aGlzLnJ1bklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW4uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgIC8vIEh5ZHJhdGUgdGhlIHNlcmlhbGl6ZWQgcnVuIGVycm9yIHNvIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWVcbiAgICAgICAgICAvLyAod2l0aCBpdHMgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW4sIGV0Yy4pIGlzIHNldCBhcyB0aGVcbiAgICAgICAgICAvLyBgY2F1c2VgIG9uIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IuXG4gICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IHRoaXMuI2dldEVuY3J5cHRpb25LZXkoKTtcbiAgICAgICAgICBsZXQgaHlkcmF0ZWRFcnJvcjogdW5rbm93bjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgcnVuLmVycm9yLFxuICAgICAgICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWYgaHlkcmF0aW9uIGZhaWxzLCBzdXJmYWNlIGEgZ2VuZXJpYyBmYWxsYmFjayByYXRoZXIgdGhhblxuICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgdXNlciB3aXRoIGEgcmF3IFVpbnQ4QXJyYXkuIFRoZSBydW4ncyBlcnJvckNvZGVcbiAgICAgICAgICAgIC8vIGlzIHN0aWxsIHByZXNlcnZlZCBvbiB0aGUgdGhyb3duIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IuXG4gICAgICAgICAgICBoeWRyYXRlZEVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gaHlkcmF0ZSB3b3JrZmxvdyBydW4gZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuRmFpbGVkRXJyb3IodGhpcy5ydW5JZCwgaHlkcmF0ZWRFcnJvciwge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiBydW4uZXJyb3JDb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIG5vdCBjb21wbGV0ZWQgeWV0IOKAlCBzbGVlcCBhbmQgcG9sbCBhZ2Fpbi5cbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuLnN0YXR1cyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZ2V0UmV0dXJuVmFsdWVQb2xsSW50ZXJ2YWxNcygpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvci5pcyhlcnJvcikgJiZcbiAgICAgICAgICBub3RGb3VuZFJldHJpZXMgPCBOT1RfRk9VTkRfTUFYX1JFVFJJRVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBOT1RfRk9VTkRfREVMQVlTW25vdEZvdW5kUmV0cmllc10hO1xuICAgICAgICAgIG5vdEZvdW5kUmV0cmllcysrO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgYFJ1bmAgb2JqZWN0IGZvciBhIGdpdmVuIHJ1biBJRC5cbiAqXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIG9idGFpbmVkIGZyb20ge0BsaW5rIHN0YXJ0fS5cbiAqIEByZXR1cm5zIEEgYFJ1bmAgb2JqZWN0LlxuICogQHRocm93cyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgaWYgdGhlIHJ1biBJRCBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW48VFJlc3VsdD4ocnVuSWQ6IHN0cmluZyk6IFJ1bjxUUmVzdWx0PiB7XG4gIHJldHVybiBuZXcgUnVuKHJ1bklkKTtcbn1cbiJdfQ==
|
|
318
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixHQUlyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZiwwQkFBMEIsR0FDM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFJTCxTQUFTLEdBQ1YsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFDNUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBb0I7SUFDL0QsV0FBVztJQUNYLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCxnQkFBZ0I7QUFDaEIsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxPQUFPLFNBQVMsQ0FDZCx3Q0FBd0MsRUFDeEMsNkJBQTZCLEVBQzdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFDSixDQUFDO0FBNkNEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLEdBQUc7SUFDZCxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQXNCO1FBQ2hELE9BQU8sRUFBRSxLQUFLLEVB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QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksNEJBQTRCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzNDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUM1QixVQUFVLENBQUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLENBQUMsQ0FDcEQsQ0FBQztvQkFDRixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFDRSx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNsQyxlQUFlLEdBQUcscUJBQXFCLEVBQ3ZDLENBQUM7b0JBQ0QsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFFLENBQUM7b0JBQ2pELGVBQWUsRUFBRSxDQUFDO29CQUNsQixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzNELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBVSxLQUFhO0lBQzNDLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3IsXG4gIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbmltcG9ydCB7XG4gIGVudk51bWJlcixcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0RXh0ZXJuYWxSZXZpdmVycyxcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnMuanMnO1xuXG5jb25zdCBSRVRVUk5fVkFMVUVfUE9MTF9JTlRFUlZBTF9NUyA9IDFfMDAwO1xuY29uc3QgUEFZTE9BRF9URVJNSU5BTF9SVU5fU1RBVFVTRVMgPSBuZXcgU2V0PFdvcmtmbG93UnVuU3RhdHVzPihbXG4gICdjb21wbGV0ZWQnLFxuICAnZmFpbGVkJyxcbl0pO1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0dXJuVmFsdWVQb2xsSW50ZXJ2YWxNcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVRVUk5fVkFMVUVfUE9MTF9JTlRFUlZBTF9NUycsXG4gICAgUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xufVxuXG4vKipcbiAqIEEgYFJlYWRhYmxlU3RyZWFtYCBleHRlbmRlZCB3aXRoIHdvcmtmbG93LXNwZWNpZmljIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW08UiA9IGFueT4gPSBSZWFkYWJsZVN0cmVhbTxSPiAmIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhaWwgaW5kZXggKGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLCAwLWJhc2VkKSBvZiB0aGVcbiAgICogdW5kZXJseWluZyB3b3JrZmxvdyBzdHJlYW0uIFVzZWZ1bCBmb3IgcmVzb2x2aW5nIGEgbmVnYXRpdmUgYHN0YXJ0SW5kZXhgXG4gICAqIGludG8gYW4gYWJzb2x1dGUgcG9zaXRpb24g4oCUIGZvciBleGFtcGxlLCB3aGVuIGJ1aWxkaW5nIHJlY29ubmVjdGlvblxuICAgKiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSB0aGUgY2xpZW50IHdoZXJlIHRoZSBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBSZXR1cm5zIGAtMWAgd2hlbiBubyBjaHVua3MgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LlxuICAgKi9cbiAgZ2V0VGFpbEluZGV4KCk6IFByb21pc2U8bnVtYmVyPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3b3JrZmxvdydzIHJlYWRhYmxlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lc3BhY2UgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBzdHJlYW1zIGFzc29jaWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggbnVtYmVyIG9mIHRoZSBzdGFydGluZyBjaHVuayB0byBiZWdpbiByZWFkaW5nIHRoZSBzdHJlYW0gZnJvbS5cbiAgICogTmVnYXRpdmUgdmFsdWVzIHN0YXJ0IGZyb20gdGhlIGVuZCAoZS5nLiAtMyByZWFkcyB0aGUgbGFzdCAzIGNodW5rcykuXG4gICAqL1xuICBzdGFydEluZGV4PzogbnVtYmVyO1xuICAvKipcbiAgICogQW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBleGVjdXRpb25cbiAgICogZW52aXJvbm1lbnQgaXMgcGF1c2VkIC8gdGVybWluYXRlZFxuICAgKiAoaS5lLiB1c2luZyBbYHdhaXRVbnRpbCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0V4dGVuZGFibGVFdmVudC93YWl0VW50aWwpIG9yIHNpbWlsYXIpLlxuICAgKi9cbiAgb3BzPzogUHJvbWlzZTxhbnk+W107XG4gIC8qKlxuICAgKiBUaGUgZ2xvYmFsIG9iamVjdCB0byB1c2UgZm9yIGh5ZHJhdGluZyB0eXBlcyBmcm9tIHRoZSBnbG9iYWwgc2NvcGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBbYGdsb2JhbFRoaXNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9nbG9iYWxUaGlzKX0uXG4gICAqL1xuICBnbG9iYWw/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBjbGFzcyBmb3IgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW48VFJlc3VsdD4ge1xuICBzdGF0aWMgW1dPUktGTE9XX1NFUklBTElaRV0oaW5zdGFuY2U6IFJ1bjx1bmtub3duPikge1xuICAgIHJldHVybiB7IHJ1bklkOiBpbnN0YW5jZS5ydW5JZCwgcmVzaWxpZW50U3RhcnQ6IGluc3RhbmNlLiNyZXNpbGllbnRTdGFydCB9O1xuICB9XG5cbiAgc3RhdGljIFtXT1JLRkxPV19ERVNFUklBTElaRV0oZGF0YToge1xuICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgcmVzaWxpZW50U3RhcnQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgcmV0dXJuIG5ldyBSdW4oZGF0YS5ydW5JZCwgeyByZXNpbGllbnRTdGFydDogZGF0YS5yZXNpbGllbnRTdGFydCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCBvYmplY3QuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI3dvcmxkUHJvbWlzZTogUHJvbWlzZTxXb3JsZD4gfCB1bmRlZmluZWQ7XG4gIGdldCAjbGF6eVdvcmxkUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMuI3dvcmxkUHJvbWlzZSkgdGhpcy4jd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG4gICAgcmV0dXJuIHRoaXMuI3dvcmxkUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWNoZWQgZW5jcnlwdGlvbiBrZXkgcmVzb2x1dGlvbi4gUmVzb2x2ZWQgb25jZSBvbiBmaXJzdCB1c2UgYW5kXG4gICAqIHJldXNlZCBmb3IgcmV0dXJuVmFsdWUsIGdldFJlYWRhYmxlKCksIGV0Yy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjZW5jcnlwdGlvbktleVByb21pc2U6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogV2hlbiB0cnVlLCBydW5fY3JlYXRlZCBmYWlsZWQgYW5kIHRoZSBydW4gbWF5IG5vdCBleGlzdCB5ZXQgKHRoZVxuICAgKiByZXNpbGllbnQgc3RhcnQgcGF0aCB3aWxsIGNyZWF0ZSBpdCB2aWEgcnVuX3N0YXJ0ZWQpLiBwb2xsUmV0dXJuVmFsdWVcbiAgICogcmV0cmllcyBvbiBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3Igb25seSB3aGVuIHRoaXMgZmxhZyBpcyBzZXQgc29cbiAgICogdGhhdCBub3JtYWwgcnVucyBmYWlsIGZhc3Qgb24gNDA0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNyZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG9wdHM/OiB7IHJlc2lsaWVudFN0YXJ0PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID0gb3B0cz8ucmVzaWxpZW50U3RhcnQgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIGNhY2hlcyB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuLlxuICAgKiBUaGUga2V5IGlzIHRoZSBzYW1lIGZvciB0aGUgbGlmZXRpbWUgb2YgYSBydW4sIHNvIGl0IG9ubHkgbmVlZHNcbiAgICogdG8gYmUgcmVzb2x2ZWQgb25jZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjZ2V0RW5jcnlwdGlvbktleShydW4/OiBXb3JrZmxvd1J1bik6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2UpIHtcbiAgICAgIHRoaXMuI2VuY3J5cHRpb25LZXlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlO1xuICAgICAgICBjb25zdCBydW5EYXRhID0gcnVuID8/IChhd2FpdCB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKSk7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5EYXRhKTtcbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVmZXIgZmV0Y2hpbmcgdGhlIHJ1biBhbmQgaXRzIGVuY3J5cHRpb24ga2V5IHVudGlsIHNlcmlhbGl6ZWQgc3RyZWFtIGRhdGFcbiAgICogaXMgYWN0dWFsbHkgcmVhZC4gQW4gZW1wdHkgb3IgbWV0YWRhdGEtb25seSBzdHJlYW0gbXVzdCBub3Qgc3RhcnQgYW5cbiAgICogdW5vYnNlcnZlZCBydW4gbG9va3VwLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNnZXRFbmNyeXB0aW9uS2V5TGF6aWx5KCk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJydXB0cyBwZW5kaW5nIGBzbGVlcCgpYCBjYWxscywgcmVzdW1pbmcgdGhlIHdvcmtmbG93IGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIHRvIHRhcmdldCBzcGVjaWZpYyBzbGVlcCBjYWxscyBieSBjb3JyZWxhdGlvbiBJRC5cbiAgICogICBJZiBub3QgcHJvdmlkZWQsIGFsbCBwZW5kaW5nIHNsZWVwIGNhbGxzIHdpbGwgYmUgaW50ZXJydXB0ZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFN0b3BTbGVlcFJlc3VsdH0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzbGVlcCBjYWxscyB0aGF0IHdlcmUgaW50ZXJydXB0ZWQuXG4gICAqL1xuICBhc3luYyB3YWtlVXAob3B0aW9ucz86IFN0b3BTbGVlcE9wdGlvbnMpOiBQcm9taXNlPFN0b3BTbGVlcFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHdha2VVcFJ1bihhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlLCB0aGlzLnJ1bklkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY2FuY2VsbGF0aW9uIHNldHRpbmdzLiBgY2FuY2VsUmVhc29uYCByZWNvcmRzIGFcbiAgICogICBmcmVlLXRleHQgcmVhc29uIChtYXggNTEyIGNoYXJzKSBvbiB0aGUgcnVuX2NhbmNlbGxlZCBldmVudCwgc3VyZmFjZWQgaW5cbiAgICogICB0aGUgcnVuIGRldGFpbCB2aWV3LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKG9wdGlvbnM/OiBDYW5jZWxSdW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh0aGlzLnJ1bklkLCB7XG4gICAgICBldmVudFR5cGU6ICdydW5fY2FuY2VsbGVkJyxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIC4uLihvcHRpb25zPy5jYW5jZWxSZWFzb24gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgZXZlbnREYXRhOiB7IGNhbmNlbFJlYXNvbjogb3B0aW9ucy5jYW5jZWxSZWFzb24gfSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IHJ1biBleGlzdHMuXG4gICAqL1xuICBnZXQgZXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldCBzdGF0dXMoKTogUHJvbWlzZTxXb3JrZmxvd1J1blN0YXR1cz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKChydW4pID0+IHJ1bi5zdGF0dXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqIFBvbGxzIHRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgdW50aWwgaXQgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGxSZXR1cm5WYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIGdldCB3b3JrZmxvd05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkudGhlbigocnVuKSA9PiBydW4ud29ya2Zsb3dOYW1lKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBydW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCk6IFByb21pc2U8RGF0ZT4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5jcmVhdGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBzdGFydGVkIGV4ZWN1dGlvbi5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQuXG4gICAqL1xuICBnZXQgc3RhcnRlZEF0KCk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGFydGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBjb21wbGV0ZWQuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSB3b3JrZmxvdyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgY29tcGxldGVkQXQoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLmNvbXBsZXRlZEF0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZ2V0IHJlYWRhYmxlKCk6IFdvcmtmbG93UmVhZGFibGVTdHJlYW0ge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB3b3JrZmxvdyBydW4ncyBkZWZhdWx0IHJlYWRhYmxlIHN0cmVhbSwgd2hpY2ggcmVhZHMgY2h1bmtzXG4gICAqIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGFibGUgc3RyZWFtIHtAbGluayBnZXRXcml0YWJsZX0uXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGFuIGFkZGl0aW9uYWwge0BsaW5rIFdvcmtmbG93UmVhZGFibGVTdHJlYW0uZ2V0VGFpbEluZGV4IHwgZ2V0VGFpbEluZGV4KCl9XG4gICAqIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLiBUaGlzIGlzIHVzZWZ1bCB3aGVuXG4gICAqIGJ1aWxkaW5nIHJlY29ubmVjdGlvbiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSBjbGllbnRzIHdoZXJlIHRoZVxuICAgKiBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgcmVhZGFibGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyBBIGBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtYCBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldFJlYWRhYmxlPFIgPSBhbnk+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zID0ge31cbiAgKTogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbTxSPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB7IG9wcyA9IFtdLCBnbG9iYWwgPSBnbG9iYWxUaGlzLCBzdGFydEluZGV4LCBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQodGhpcy5ydW5JZCwgbmFtZXNwYWNlKTtcbiAgICAvLyBUaGUgcmVzb2x2ZXIgc3RhcnRzIG9ubHkgd2hlbiB0aGUgZGVzZXJpYWxpemUgc3RyZWFtIHNlZXMgaXRzIGZpcnN0XG4gICAgLy8gY2h1bmssIHNvIGNyZWF0aW5nIG9yIHByb2JpbmcgYW4gZW1wdHkgc3RyZWFtIGNhbm5vdCByZWplY3QgaW4gdGhlXG4gICAgLy8gYmFja2dyb3VuZC5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jZ2V0RW5jcnlwdGlvbktleUxhemlseSgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHRoaXMucnVuSWQsIGVuY3J5cHRpb25LZXkpXG4gICAgICAuUmVhZGFibGVTdHJlYW0hKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydEluZGV4LFxuICAgIH0pIGFzIFJlYWRhYmxlU3RyZWFtPFI+O1xuXG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcbiAgICBjb25zdCBydW5JZCA9IHRoaXMucnVuSWQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3RyZWFtLCB7XG4gICAgICBnZXRUYWlsSW5kZXg6IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0SW5mbyhydW5JZCwgbmFtZSk7XG4gICAgICAgIHJldHVybiBpbmZvLnRhaWxJbmRleDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jICNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW46IFdvcmtmbG93UnVuKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgdGhpcy4jZ2V0RW5jcnlwdGlvbktleShydW4pO1xuICAgICAgcmV0dXJuIGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgICBydW4ub3V0cHV0LFxuICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChydW4uc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3IodGhpcy5ydW5JZCk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAvLyBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIHJ1biBlcnJvciBzbyB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlXG4gICAgICAvLyAod2l0aCBpdHMgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW4sIGV0Yy4pIGlzIHNldCBhcyB0aGVcbiAgICAgIC8vIGBjYXVzZWAgb24gV29ya2Zsb3dSdW5GYWlsZWRFcnJvci5cbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KHJ1bik7XG4gICAgICBsZXQgaHlkcmF0ZWRFcnJvcjogdW5rbm93bjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcnVuLmVycm9yLFxuICAgICAgICAgIHRoaXMucnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElmIGh5ZHJhdGlvbiBmYWlscywgc3VyZmFjZSBhIGdlbmVyaWMgZmFsbGJhY2sgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gbGVhdmluZyB0aGUgdXNlciB3aXRoIGEgcmF3IFVpbnQ4QXJyYXkuIFRoZSBydW4ncyBlcnJvckNvZGVcbiAgICAgICAgLy8gaXMgc3RpbGwgcHJlc2VydmVkIG9uIHRoZSB0aHJvd24gV29ya2Zsb3dSdW5GYWlsZWRFcnJvci5cbiAgICAgICAgaHlkcmF0ZWRFcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGh5ZHJhdGUgd29ya2Zsb3cgcnVuIGVycm9yJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5GYWlsZWRFcnJvcih0aGlzLnJ1bklkLCBoeWRyYXRlZEVycm9yLCB7XG4gICAgICAgIGVycm9yQ29kZTogcnVuLmVycm9yQ29kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRlcm1pbmFsIHN0YXR1c2VzIGFyZSBpbW11dGFibGUsIGJ1dCBpZiBhbiBpbmNvbnNpc3RlbnQgd29ybGQgcmV0dXJuc1xuICAgIC8vIGEgbm9uLXRlcm1pbmFsIGZ1bGwgcmVjb3JkLCByZXN1bWUgcG9sbGluZyBzYWZlbHkuXG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuLnN0YXR1cyk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZSB1bnRpbCBpdCBpcyBjb21wbGV0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcmV0dXJucyBUaGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgI3BvbGxSZXR1cm5WYWx1ZSgpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG5cbiAgICAvLyBXaGVuIHJlc2lsaWVudFN0YXJ0IGlzIHRydWUsIHJ1bl9jcmVhdGVkIGZhaWxlZCBhbmQgdGhlIHJ1biBtYXlcbiAgICAvLyBub3QgZXhpc3QgeWV0LiBSZXRyeSBvbiBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgdXAgdG8gMyB0aW1lc1xuICAgIC8vICgxcyArIDNzICsgNnMgPSAxMHMgdG90YWwpIHRvIGdpdmUgdGhlIHF1ZXVlIHRpbWUgdG8gZGVsaXZlclxuICAgIC8vIGFuZCB0aGUgcnVudGltZSB0byBjcmVhdGUgdGhlIHJ1biB2aWEgcnVuX3N0YXJ0ZWQuXG4gICAgLy8gV2hlbiByZXNpbGllbnRTdGFydCBpcyBmYWxzZSwgNDA0IGlzIGEgcmVhbCBlcnJvciDigJQgZmFpbCBmYXN0LlxuICAgIGxldCBub3RGb3VuZFJldHJpZXMgPSAwO1xuICAgIGNvbnN0IE5PVF9GT1VORF9NQVhfUkVUUklFUyA9IHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID8gMyA6IDA7XG4gICAgY29uc3QgTk9UX0ZPVU5EX0RFTEFZUyA9IFsxXzAwMCwgM18wMDAsIDZfMDAwXTtcblxuICAgIC8vIE5PVEU6IHdoZW4gdGhpcyBwb2xsIHJ1bnMgaW5zaWRlIGEgc3RlcCAoZS5nLiB0aGUgc3RlcCB0aGF0IGEgcGFyZW50XG4gICAgLy8gd29ya2Zsb3cgdXNlcyB0byBhd2FpdCBhIGNoaWxkIHdvcmtmbG93J3MgYHJldHVyblZhbHVlYCksIGl0IGJsb2Nrc1xuICAgIC8vIGEgcXVldWUgd29ya2VyIHNsb3QgZm9yIGFzIGxvbmcgYXMgdGhlIGNoaWxkIHJ1biB0YWtlcyB0byBmaW5pc2guXG4gICAgLy8gV29ya2VyLWJhc2VkIHdvcmxkcyBsaWtlIGB3b3JsZC1wb3N0Z3Jlc2AgbXVzdCBiZSBzaXplZCB0byBjb3ZlciB0aGVcbiAgICAvLyBwZWFrIG51bWJlciBvZiBzdWNoIHBvbGxzIGluIGZsaWdodCDigJQgc2VlIHRoZSBgcXVldWVDb25jdXJyZW5jeWBcbiAgICAvLyBkZWZhdWx0IG9uIHRoZSBQb3N0Z3JlcyB3b3JsZCBhbmQgdGhlIG5vdGVzIGluIHRoZSBlYWdlci1wcm9jZXNzaW5nXG4gICAgLy8gY2hhbmdlbG9nIGZvciBkZXRhaWxzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW5NZXRhZGF0YSA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQsIHtcbiAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocnVuTWV0YWRhdGEuc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yKHRoaXMucnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFBBWUxPQURfVEVSTUlOQUxfUlVOX1NUQVRVU0VTLmhhcyhydW5NZXRhZGF0YS5zdGF0dXMpKSB7XG4gICAgICAgICAgLy8gVGhlIHBvbGxpbmcgcmVhZCBhYm92ZSBkZWxpYmVyYXRlbHkgc2tpcHMgaW5wdXQvb3V0cHV0L2Vycm9yIHJlZnMuXG4gICAgICAgICAgLy8gUmVzb2x2ZSBwYXlsb2FkcyBvbmx5IG9uY2UgdGhlIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCwge1xuICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIG5vdCBjb21wbGV0ZWQgeWV0IOKAlCBzbGVlcCBhbmQgcG9sbCBhZ2Fpbi5cbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuTWV0YWRhdGEuc3RhdHVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBnZXRSZXR1cm5WYWx1ZVBvbGxJbnRlcnZhbE1zKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSAmJlxuICAgICAgICAgIG5vdEZvdW5kUmV0cmllcyA8IE5PVF9GT1VORF9NQVhfUkVUUklFU1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IE5PVF9GT1VORF9ERUxBWVNbbm90Rm91bmRSZXRyaWVzXSE7XG4gICAgICAgICAgbm90Rm91bmRSZXRyaWVzKys7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBgUnVuYCBvYmplY3QgZm9yIGEgZ2l2ZW4gcnVuIElELlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgb2J0YWluZWQgZnJvbSB7QGxpbmsgc3RhcnR9LlxuICogQHJldHVybnMgQSBgUnVuYCBvYmplY3QuXG4gKiBAdGhyb3dzIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciBpZiB0aGUgcnVuIElEIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bjxUUmVzdWx0PihydW5JZDogc3RyaW5nKTogUnVuPFRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBSdW4ocnVuSWQpO1xufVxuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Event, SerializedData, World } from '@workflow/world';
|
|
1
|
+
import type { Event, SerializedData, StartedStep, World } from '@workflow/world';
|
|
2
2
|
import type { PayloadKey } from '../serialization/encryption.js';
|
|
3
3
|
import { type SlotSnapshotParams } from './helpers.js';
|
|
4
4
|
import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
|
|
@@ -12,6 +12,8 @@ export interface StepExecutorParams {
|
|
|
12
12
|
workflowDeploymentId?: string;
|
|
13
13
|
workflowName: string;
|
|
14
14
|
workflowStartedAt: number;
|
|
15
|
+
/** Request ID of the invocation executing this step, when provided by its queue. */
|
|
16
|
+
requestId?: string;
|
|
15
17
|
/** Root run id of this run's lineage, carried into the step context. */
|
|
16
18
|
rootRunId?: string;
|
|
17
19
|
stepId: string;
|
|
@@ -35,6 +37,17 @@ export interface StepExecutorParams {
|
|
|
35
37
|
* carries no payload (the legacy contract).
|
|
36
38
|
*/
|
|
37
39
|
lazyStepInput?: SerializedData;
|
|
40
|
+
/**
|
|
41
|
+
* Pre-claimed inline start: the suspension handler committed (or lost) this
|
|
42
|
+
* step's `step_created` + `step_started` pair inside its batched fan-out
|
|
43
|
+
* write, so the start this executor would otherwise send has already been
|
|
44
|
+
* decided. `owned: false` returns `{ type: 'skipped' }` before any write —
|
|
45
|
+
* the same outcome as losing the lazy claim's atomic create. `owned: true`
|
|
46
|
+
* skips both start paths (no start write at all) and runs the body against
|
|
47
|
+
* the claimed step. Mutually exclusive with `lazyStepInput`: the input
|
|
48
|
+
* already rode the pair's `step_created`, and the claimed step carries it.
|
|
49
|
+
*/
|
|
50
|
+
preclaimedStart?: PreclaimedInlineStart;
|
|
38
51
|
/**
|
|
39
52
|
* Inline step ownership: the queue message ID of the invocation this
|
|
40
53
|
* executeStep call runs in (from the queue handler's meta). When set, the
|
|
@@ -140,6 +153,41 @@ export interface StepExecutorParams {
|
|
|
140
153
|
/** One-shot recovery telemetry activated by the orchestrator replay. */
|
|
141
154
|
replayRecoveryReporter?: ReplayRecoveryReporter;
|
|
142
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* The settled outcome of a `step_created` + `step_started` pair the
|
|
158
|
+
* suspension handler folded into its batched fan-out write (see
|
|
159
|
+
* `SuspensionHandlerResult.inlineClaims`). Handed to executeStep as
|
|
160
|
+
* {@link StepExecutorParams.preclaimedStart} so the executor runs (or skips)
|
|
161
|
+
* the body off the batch's verdict instead of sending a start of its own.
|
|
162
|
+
*/
|
|
163
|
+
export type PreclaimedInlineStart = {
|
|
164
|
+
/** The pair committed: this execution owns the step and runs the body. */
|
|
165
|
+
owned: true;
|
|
166
|
+
/**
|
|
167
|
+
* The started step entity from the batch result, with the locally
|
|
168
|
+
* dehydrated input attached by the suspension handler (batch responses
|
|
169
|
+
* return refs lazily; the body's hydration wants the same bytes the
|
|
170
|
+
* pair's `step_created` carried).
|
|
171
|
+
*/
|
|
172
|
+
step: StartedStep;
|
|
173
|
+
/**
|
|
174
|
+
* `Date.now()` taken right before the batch POST that carried the pair
|
|
175
|
+
* — the claim's "start POST sent" instant, anchoring RSFS exactly like
|
|
176
|
+
* the lazy claim's own POST would.
|
|
177
|
+
*/
|
|
178
|
+
batchPostSentAtMs?: number;
|
|
179
|
+
/**
|
|
180
|
+
* `Date.now()` taken right after that batch POST returned — the
|
|
181
|
+
* claim's completion instant (T6 of the hook-resume TTR window).
|
|
182
|
+
*/
|
|
183
|
+
claimCompletedAtMs?: number;
|
|
184
|
+
} | {
|
|
185
|
+
/**
|
|
186
|
+
* The pair lost its atomic create-claim (per-event 409): a concurrent
|
|
187
|
+
* writer owns the step, so the body must not run here.
|
|
188
|
+
*/
|
|
189
|
+
owned: false;
|
|
190
|
+
};
|
|
143
191
|
/**
|
|
144
192
|
* Inline-delta returned by a step-terminal write when the caller passed
|
|
145
193
|
* {@link StepExecutorParams.inlineDeltaSinceCursor} and the World supports
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"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"}
|