@workflow/core 4.5.0 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities.d.ts +22 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +52 -4
- package/dist/classify-error.d.ts +15 -0
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +47 -3
- package/dist/events-consumer.d.ts +9 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +56 -18
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +48 -2
- package/dist/private.d.ts +31 -0
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +13 -1
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +14 -8
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +63 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +6 -5
- package/dist/runtime/start.d.ts +11 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +81 -25
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +7 -2
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +2 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +20 -2
- package/dist/serialization.d.ts +72 -3
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +229 -30
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +6 -3
- package/dist/step-hydration-cache.d.ts +148 -0
- package/dist/step-hydration-cache.d.ts.map +1 -0
- package/dist/step-hydration-cache.js +171 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +18 -2
- package/dist/symbols.d.ts +1 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +2 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow.d.ts +10 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +37 -6
- package/docs/api-reference/create-hook.mdx +2 -2
- package/docs/foundations/hooks.mdx +1 -1
- package/package.json +10 -6
package/dist/runtime/start.js
CHANGED
|
@@ -1,18 +1,44 @@
|
|
|
1
|
-
import { EntityConflictError,
|
|
1
|
+
import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
|
|
2
2
|
import { isLegacySpecVersion, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_EVENT_SOURCING, } from '@workflow/world';
|
|
3
3
|
import { monotonicFactory } from 'ulid';
|
|
4
|
+
import { getRunCapabilities } from '../capabilities.js';
|
|
5
|
+
import { isRetryableWorldError } from '../classify-error.js';
|
|
4
6
|
import { importKey } from '../encryption.js';
|
|
5
7
|
import { runtimeLogger } from '../logger.js';
|
|
6
8
|
import { dehydrateWorkflowArguments } from '../serialization.js';
|
|
7
9
|
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
8
10
|
import { serializeTraceCarrier, trace } from '../telemetry.js';
|
|
9
11
|
import { version as workflowCoreVersion } from '../version.js';
|
|
10
|
-
import { getWorkflowQueueName } from './helpers.js';
|
|
12
|
+
import { getWorkflowQueueName, healthCheck } from './helpers.js';
|
|
11
13
|
import { Run } from './run.js';
|
|
12
14
|
import { safeWaitUntil, waitedUntil } from './wait-until.js';
|
|
13
15
|
import { getWorld } from './world.js';
|
|
16
|
+
/**
|
|
17
|
+
* Timeout for the cross-deployment capability probe done before
|
|
18
|
+
* dehydrating workflow arguments. Kept tight on purpose: the probe is
|
|
19
|
+
* an optimization (it lets the caller emit the framed byte-stream wire
|
|
20
|
+
* format when the target supports it), and the fallback on timeout is
|
|
21
|
+
* the legacy raw format which always works. Long delays here would just
|
|
22
|
+
* make `start({ deploymentId: ... })` slower for users whose target
|
|
23
|
+
* deployments don't recognize the health check at all.
|
|
24
|
+
*/
|
|
25
|
+
const CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS = 2_000;
|
|
14
26
|
/** ULID generator for client-side runId generation */
|
|
15
27
|
const ulid = monotonicFactory();
|
|
28
|
+
// `deploymentId: 'latest'` is a no-op in Worlds without atomic deployments.
|
|
29
|
+
// The warning that explains this only needs to fire once per process: a
|
|
30
|
+
// workflow that hardcodes 'latest' for its Vercel deployment would otherwise
|
|
31
|
+
// log it on every local/Postgres run, flooding tight dev loops.
|
|
32
|
+
let hasWarnedLatestNoOp = false;
|
|
33
|
+
/**
|
|
34
|
+
* Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only —
|
|
35
|
+
* exported so unit tests can exercise the warn path across `start()` calls.
|
|
36
|
+
*
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export function _resetLatestNoOpWarnForTests() {
|
|
40
|
+
hasWarnedLatestNoOp = false;
|
|
41
|
+
}
|
|
16
42
|
export async function start(workflow, argsOrOptions, options) {
|
|
17
43
|
return await waitedUntil(() => {
|
|
18
44
|
// @ts-expect-error this field is added by our client transform
|
|
@@ -37,15 +63,57 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
37
63
|
...Attribute.WorkflowArgumentsCount(args.length),
|
|
38
64
|
});
|
|
39
65
|
const world = opts?.world ?? getWorld();
|
|
40
|
-
|
|
66
|
+
const currentDeploymentId = await world.getDeploymentId();
|
|
67
|
+
let deploymentId = opts.deploymentId ?? currentDeploymentId;
|
|
41
68
|
// When 'latest' is requested, resolve the actual latest deployment ID
|
|
42
69
|
// for the current deployment's environment (same production target or
|
|
43
70
|
// same git branch for preview deployments).
|
|
71
|
+
//
|
|
72
|
+
// Resolving 'latest' only means something in worlds with atomic,
|
|
73
|
+
// immutable deployments (e.g. Vercel), which implement
|
|
74
|
+
// resolveLatestDeploymentId(). Worlds without that concept (local dev,
|
|
75
|
+
// self-hosted Postgres) have nothing to resolve between, so rather than
|
|
76
|
+
// fail a run that works fine on Vercel, we warn and fall back to the
|
|
77
|
+
// current deployment — making 'latest' an effective no-op there.
|
|
44
78
|
if (deploymentId === 'latest') {
|
|
45
|
-
if (
|
|
46
|
-
|
|
79
|
+
if (world.resolveLatestDeploymentId) {
|
|
80
|
+
deploymentId = await world.resolveLatestDeploymentId();
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Warn once per process — see hasWarnedLatestNoOp above.
|
|
84
|
+
if (!hasWarnedLatestNoOp) {
|
|
85
|
+
hasWarnedLatestNoOp = true;
|
|
86
|
+
runtimeLogger.warn("deploymentId: 'latest' has no effect in this world and was ignored. " +
|
|
87
|
+
'It is only supported by worlds with atomic deployments, such as Vercel. ' +
|
|
88
|
+
'The run will target the current deployment.', { currentDeploymentId });
|
|
89
|
+
}
|
|
90
|
+
deploymentId = currentDeploymentId;
|
|
47
91
|
}
|
|
48
|
-
|
|
92
|
+
}
|
|
93
|
+
// Decide whether to write byte streams in the framed wire format.
|
|
94
|
+
// For same-deployment starts (the common case) we know the target is
|
|
95
|
+
// running this same SDK version, so framing is safe. For cross-
|
|
96
|
+
// deployment starts (explicit deploymentId or 'latest' that resolves
|
|
97
|
+
// to a different deployment) we probe the target via healthCheck to
|
|
98
|
+
// learn its workflow-core version, then derive the capability. The
|
|
99
|
+
// probe has a tight timeout — on miss/failure we fall back to the
|
|
100
|
+
// legacy raw byte format, which is universally readable.
|
|
101
|
+
//
|
|
102
|
+
// Worlds that don't expose the stream-reading API (e.g. minimal test
|
|
103
|
+
// mocks) can't service health checks, so we skip the probe for them.
|
|
104
|
+
let framedByteStreams;
|
|
105
|
+
if (deploymentId === currentDeploymentId) {
|
|
106
|
+
framedByteStreams = true;
|
|
107
|
+
}
|
|
108
|
+
else if (typeof world.readFromStream !== 'function') {
|
|
109
|
+
framedByteStreams = false;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const probe = await healthCheck(world, 'workflow', {
|
|
113
|
+
deploymentId,
|
|
114
|
+
timeout: CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS,
|
|
115
|
+
}).catch(() => undefined);
|
|
116
|
+
framedByteStreams = getRunCapabilities(probe?.workflowCoreVersion).framedByteStreams;
|
|
49
117
|
}
|
|
50
118
|
const ops = [];
|
|
51
119
|
// Generate runId client-side so we have it before serialization
|
|
@@ -75,7 +143,7 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
75
143
|
const encryptionKey = rawKey ? await importKey(rawKey) : undefined;
|
|
76
144
|
// Create run via run_created event (event-sourced architecture)
|
|
77
145
|
// Pass client-generated runId - server will accept and use it
|
|
78
|
-
const workflowArguments = await dehydrateWorkflowArguments(args, runId, encryptionKey, ops, globalThis, v1Compat);
|
|
146
|
+
const workflowArguments = await dehydrateWorkflowArguments(args, runId, encryptionKey, ops, globalThis, v1Compat, framedByteStreams);
|
|
79
147
|
const executionContext = {
|
|
80
148
|
traceCarrier,
|
|
81
149
|
workflowCoreVersion,
|
|
@@ -128,10 +196,11 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
128
196
|
// + run_started call completes faster. We expect this to be <=1% of cases.
|
|
129
197
|
// In this case, we can safely return.
|
|
130
198
|
}
|
|
131
|
-
else if (
|
|
132
|
-
// 429 (ThrottleError)
|
|
133
|
-
// are retryable — the run was accepted via the
|
|
134
|
-
// will be re-tried by the runtime when it calls
|
|
199
|
+
else if (isRetryableWorldError(err)) {
|
|
200
|
+
// 429 (ThrottleError), 5xx, and transient transport failures
|
|
201
|
+
// (TRANSPORT/TIMEOUT) are retryable — the run was accepted via the
|
|
202
|
+
// queue and creation will be re-tried by the runtime when it calls
|
|
203
|
+
// run_started.
|
|
135
204
|
resilientStart = true;
|
|
136
205
|
runtimeLogger.warn('Run creation event failed, but the run was accepted via the queue. ' +
|
|
137
206
|
'The run_created event will be re-tried async by the runtime.', { workflowRunId: runId, error: err.message });
|
|
@@ -173,17 +242,4 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
173
242
|
});
|
|
174
243
|
});
|
|
175
244
|
}
|
|
176
|
-
/**
|
|
177
|
-
* Checks if an error from events.create (run_created) is retryable,
|
|
178
|
-
* meaning the queue can re-try creation later via the run_started path.
|
|
179
|
-
* - ThrottleError (429): rate limited, will succeed later
|
|
180
|
-
* - WorkflowWorldError with status >= 500: server error, will succeed later
|
|
181
|
-
*/
|
|
182
|
-
function isRetryableStartError(err) {
|
|
183
|
-
if (ThrottleError.is(err))
|
|
184
|
-
return true;
|
|
185
|
-
if (WorkflowWorldError.is(err) && err.status && err.status >= 500)
|
|
186
|
-
return true;
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwwQ0FBMEMsRUFDMUMsb0NBQW9DLEdBQ3JDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDLHNEQUFzRDtBQUN0RCxNQUFNLElBQUksR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBeUZoQyxNQUFNLENBQUMsS0FBSyxVQUFVLEtBQUssQ0FDekIsUUFBNkQsRUFDN0QsYUFBb0MsRUFDcEMsT0FBc0I7SUFFdEIsT0FBTyxNQUFNLFdBQVcs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LEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHO1FBQy9ELE9BQU8sSUFBSSxDQUFDO0lBQ2QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgVGhyb3R0bGVFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW52b2tlUGF5bG9hZCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfRVZFTlRfU09VUkNJTkcsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVUxJRCBnZW5lcmF0b3IgZm9yIGNsaWVudC1zaWRlIHJ1bklkIGdlbmVyYXRpb24gKi9cbmNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuIGNyZWF0aW9uLFxuICAgKiBieSBkZWZhdWx0IHRoZSB3b3JsZCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICB3b3JsZD86IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlYyB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi4gRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGRlcGxveW1lbnQgSUQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogd2hlbiBkZXBsb3lpbmcgdG8gVmVyY2VsLlxuICAgKlxuICAgKiBTZXQgdG8gYCdsYXRlc3QnYCB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlIG1vc3QgcmVjZW50IGRlcGxveW1lbnRcbiAgICogZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yIGdpdCBicmFuY2gpLlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSBhIFZlcmNlbC1zcGVjaWZpYyBmZWF0dXJlLlxuICAgKlxuICAgKiAqKk5vdGU6KiogV2hlbiBgZGVwbG95bWVudElkYCBpcyBwcm92aWRlZCwgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYmVjb21lIGB1bmtub3duYFxuICAgKiBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIHR5cGVzIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqL1xuICBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIHwgKHN0cmluZyAmIHt9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIGRlcGxveW1lbnRJZD86IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhcnRPcHRpb25zID1cbiAgfCBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4gIHwgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9IChcbiAgLi4uYXJnczogVEFyZ3NcbikgPT4gUHJvbWlzZTxUUmVzdWx0PjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgb2YgYSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSA9IHsgd29ya2Zsb3dJZDogc3RyaW5nIH07XG5cbi8qKlxuICogU3RhcnRzIGEgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbiB0byBzdGFydC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3b3JrZmxvdyAob3B0aW9uYWwpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IHJ1biAob3B0aW9uYWwpLlxuICogQHJldHVybnMgVGhlIHVuaXF1ZSBydW4gSUQgZm9yIHRoZSBuZXdseSBzdGFydGVkIHdvcmtmbG93IGludm9jYXRpb24uXG4gKi9cbi8vIE92ZXJsb2FkcyB3aXRoIGRlcGxveW1lbnRJZCAtIGFyZ3MgYW5kIHJldHVybiB0eXBlIGJlY29tZSB1bmtub3duXG4vLyBVc2VzIGdlbmVyaWNzIHNvIHR5cGVkIHdvcmtmbG93cyBhcmUgYXNzaWduYWJsZSAoYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyksXG4vLyBidXQgdGhlIHJldHVybiB0eXBlIGFuZCBhcmdzIGFyZSBzdGlsbCB1bmtub3duIHNpbmNlIHRoZSBkZXBsb3llZCB2ZXJzaW9uIG1heSBkaWZmZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiB1bmtub3duW10sXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbi8vIE92ZXJsb2FkcyB3aXRob3V0IGRlcGxveW1lbnRJZCAtIHByZXNlcnZlIHR5cGUgaW5mZXJlbmNlXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiBUQXJncyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzT3JPcHRpb25zPzogVEFyZ3MgfCBTdGFydE9wdGlvbnMsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNcbikge1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBmaWVsZCBpcyBhZGRlZCBieSBvdXIgY2xpZW50IHRyYW5zZm9ybVxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93Py53b3JrZmxvd0lkO1xuXG4gICAgaWYgKCF3b3JrZmxvd05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYCdzdGFydCcgcmVjZWl2ZWQgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbi4gRW5zdXJlIHRoZSBXb3JrZmxvdyBTREsgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgYW5kIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZS5gLFxuICAgICAgICB7IHNsdWc6ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFjZShgd29ya2Zsb3cuc3RhcnQgJHt3b3JrZmxvd05hbWV9YCwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignc3RhcnQnKSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYXJnczogU2VyaWFsaXphYmxlW10gPSBbXTtcbiAgICAgIGxldCBvcHRzOiBTdGFydE9wdGlvbnMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc09yT3B0aW9ucykpIHtcbiAgICAgICAgYXJncyA9IGFyZ3NPck9wdGlvbnMgYXMgU2VyaWFsaXphYmxlW107XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzT3JPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRzID0gYXJnc09yT3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KGFyZ3MubGVuZ3RoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IG9wdHM/LndvcmxkID8/IGdldFdvcmxkKCk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gKGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpKTtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICghd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIFwiZGVwbG95bWVudElkICdsYXRlc3QnIHJlcXVpcmVzIGEgV29ybGQgdGhhdCBpbXBsZW1lbnRzIHJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlIGVuY3J5cHRpb24gY29udGV4dClcbiAgICAgIGNvbnN0IHJ1bklkID0gYHdydW5fJHt1bGlkKCl9YDtcblxuICAgICAgLy8gU2VyaWFsaXplIGN1cnJlbnQgdHJhY2UgY29udGV4dCB0byBwcm9wYWdhdGUgYWNyb3NzIHF1ZXVlIGJvdW5kYXJ5XG4gICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTtcblxuICAgICAgLy8gVXNlIHdvcmxkLWRlY2xhcmVkIHNwZWNWZXJzaW9uIHdoZW4gYXZhaWxhYmxlIChvdXIgd29ybGRzIHNldCB0aGlzKSxcbiAgICAgIC8vIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIHNhZmUgYmFzZWxpbmUgdGhhdCBjb21tdW5pdHkgd29ybGRzIGhhbmRsZS5cbiAgICAgIC8vIENvbW11bml0eSB3b3JsZHMgYnVpbHQgYWdhaW5zdCBvbGRlciBAd29ya2Zsb3cvd29ybGQgcmVqZWN0IHJ1bnMgd2l0aFxuICAgICAgLy8gc3BlY1ZlcnNpb24gPiB0aGVpciBTUEVDX1ZFUlNJT05fQ1VSUkVOVCB2aWEgcmVxdWlyZXNOZXdlcldvcmxkKCkuXG4gICAgICBjb25zdCBzcGVjVmVyc2lvbiA9XG4gICAgICAgIG9wdHMuc3BlY1ZlcnNpb24gPz9cbiAgICAgICAgd29ybGQuc3BlY1ZlcnNpb24gPz9cbiAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0VWRU5UX1NPVVJDSU5HO1xuICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKHNwZWNWZXJzaW9uKTtcblxuICAgICAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIG5ldyBydW4uIFRoZSBydW5JZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAvLyBnZW5lcmF0ZWQgYWJvdmUgKGNsaWVudC1nZW5lcmF0ZWQgVUxJRCkgYW5kIHdpbGwgYmUgdXNlZCBmb3IgYm90aFxuICAgICAgLy8ga2V5IGRlcml2YXRpb24gYW5kIHRoZSBydW5fY3JlYXRlZCBldmVudC4gVGhlIFdvcmxkIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyB1c2VzIHRoZSBydW5JZCBmb3IgcGVyLXJ1biBIS0RGIGtleSBkZXJpdmF0aW9uLiBXZSBwYXNzIHRoZSByZXNvbHZlZFxuICAgICAgLy8gZGVwbG95bWVudElkIChub3QganVzdCB0aGUgcmF3IG9wdHMpIHNvIHRoZSBXb3JsZCBjYW4gdXNlIGl0IGZvclxuICAgICAgLy8ga2V5IHJlc29sdXRpb24gZXZlbiB3aGVuIGRlcGxveW1lbnRJZCB3YXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gb3B0cyAoZS5nLiwgaW4gZTJlIHRlc3QgcnVubmVycykuXG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuSWQsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICBjb25zdCB3b3JrZmxvd0FyZ3VtZW50cyA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgb3BzLFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICB2MUNvbXBhdFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZXZlbnRzLmNyZWF0ZSAocnVuX2NyZWF0ZWQpIGFuZCBxdWV1ZSBpbiBwYXJhbGxlbC5cbiAgICAgIC8vIElmIGV2ZW50cy5jcmVhdGUgZmFpbHMgd2l0aCA0MjkvNXh4LCB0aGUgcnVuIHdhcyBzdGlsbCBhY2NlcHRlZFxuICAgICAgLy8gdmlhIHRoZSBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS5cbiAgICAgIGNvbnN0IFtydW5DcmVhdGVkUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICApLFxuICAgICAgICB3b3JsZC5xdWV1ZShcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWwg4oCUIHRoZSBydW4gd2FzIG5vdCBlbnF1ZXVlZFxuICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBldmVudHMuY3JlYXRlIHJlc3VsdFxuICAgICAgbGV0IHJlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG4gICAgICBpZiAocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3QgZXJyID0gcnVuQ3JlYXRlZFJlc3VsdC5yZWFzb247XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyA0MDk6IFRoZSBydW4gYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIGhhcHBlbiBpbiBleHRyZW1lIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gdGhlIHJ1biBjcmVhdGlvbiBjYWxsIGdldHMgYSBjb2xkIHN0YXJ0IG9yIG90aGVyIHNsb3dkb3duLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gKyBydW5fc3RhcnRlZCBjYWxsIGNvbXBsZXRlcyBmYXN0ZXIuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIDw9MSUgb2YgY2FzZXMuXG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc2FmZWx5IHJldHVybi5cbiAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVN0YXJ0RXJyb3IoZXJyKSkge1xuICAgICAgICAgIC8vIDQyOSAoVGhyb3R0bGVFcnJvcikgYW5kIDV4eCAoV29ya2Zsb3dXb3JsZEVycm9yIHdpdGggc3RhdHVzID49IDUwMClcbiAgICAgICAgICAvLyBhcmUgcmV0cnlhYmxlIOKAlCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvblxuICAgICAgICAgIC8vIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxscyBydW5fc3RhcnRlZC5cbiAgICAgICAgICByZXNpbGllbnRTdGFydCA9IHRydWU7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgJ1J1biBjcmVhdGlvbiBldmVudCBmYWlsZWQsIGJ1dCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlIHF1ZXVlLiAnICtcbiAgICAgICAgICAgICAgJ1RoZSBydW5fY3JlYXRlZCBldmVudCB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLicsXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBlcnJvcjogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBydW5DcmVhdGVkUmVzdWx0LnZhbHVlO1xuICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcnVuIHdhcyBjcmVhdGVkXG4gICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIFwiTWlzc2luZyAncnVuJyBpbiBzZXJ2ZXIgcmVzcG9uc2UgZm9yICdydW5fY3JlYXRlZCcgZXZlbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgc2VydmVyIGFjY2VwdGVkIG91ciBydW5JZFxuICAgICAgICBpZiAoIXYxQ29tcGF0ICYmIHJlc3VsdC5ydW4ucnVuSWQgIT09IHJ1bklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYFNlcnZlciByZXR1cm5lZCBkaWZmZXJlbnQgcnVuSWQgdGhhbiByZXF1ZXN0ZWQ6IGV4cGVjdGVkICR7cnVuSWR9LCBnb3QgJHtyZXN1bHQucnVuLnJ1bklkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZXNlIGFyZ3VtZW50LXN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZSBwcm9taXNlXG4gICAgICAvLyBoYW5kZWQgdG8gd2FpdFVudGlsIG11c3QgbmV2ZXIgcmVqZWN0IChhbiB1bmNvbnN1bWVkIHdhaXRVbnRpbFxuICAgICAgLy8gcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSwgc28gdW5leHBlY3RlZFxuICAgICAgLy8gZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnQmFja2dyb3VuZCBmbHVzaCBvZiB3b3JrZmxvdyBhcmd1bWVudCBzdHJlYW1zIGZhaWxlZCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRGVwbG95bWVudElkKGRlcGxveW1lbnRJZCksXG4gICAgICAgIC4uLihydW5DcmVhdGVkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW5cbiAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1bi5zdGF0dXMpXG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBSdW48VFJlc3VsdD4ocnVuSWQsIHsgcmVzaWxpZW50U3RhcnQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBlcnJvciBmcm9tIGV2ZW50cy5jcmVhdGUgKHJ1bl9jcmVhdGVkKSBpcyByZXRyeWFibGUsXG4gKiBtZWFuaW5nIHRoZSBxdWV1ZSBjYW4gcmUtdHJ5IGNyZWF0aW9uIGxhdGVyIHZpYSB0aGUgcnVuX3N0YXJ0ZWQgcGF0aC5cbiAqIC0gVGhyb3R0bGVFcnJvciAoNDI5KTogcmF0ZSBsaW1pdGVkLCB3aWxsIHN1Y2NlZWQgbGF0ZXJcbiAqIC0gV29ya2Zsb3dXb3JsZEVycm9yIHdpdGggc3RhdHVzID49IDUwMDogc2VydmVyIGVycm9yLCB3aWxsIHN1Y2NlZWQgbGF0ZXJcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVTdGFydEVycm9yKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFdvcmtmbG93V29ybGRFcnJvci5pcyhlcnIpICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA+PSA1MDApXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLDBDQUEwQyxFQUMxQyxvQ0FBb0MsR0FDckMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSw0Q0FBNEMsR0FBRyxLQUFLLENBQUM7QUFFM0Qsc0RBQXNEO0FBQ3RELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7QUFFaEMsNEVBQTRFO0FBQzVFLHdFQUF3RTtBQUN4RSw2RUFBNkU7QUFDN0UsZ0VBQWdFO0FBQ2hFLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBRWhDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDOUIsQ0FBQztBQTRGRCxNQUFNLENBQUMsS0FBSyxVQUFVLEtBQUssQ0FDekIsUUFBNkQsRUFDN0QsYUFBb0MsRUFDcEMsT0FBc0I7SUFFdEIsT0FBTyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDNUIsK0RBQStEO1FBQy9ELE1BQU0sWUFBWSxHQUFHLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFFMUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsc0pBQXNKLEVBQ3RKLEVBQUUsSUFBSSxFQUFFLGlDQUFpQyxFQUFFLENBQzVDLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsa0JBQWtCLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUM1RCxJQUFJLEVBQUUsYUFBYSxDQUFDO2dCQUNsQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUN2QyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7YUFDeEMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxJQUFJLEdBQW1CLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksR0FBaUIsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxHQUFHLGFBQStCLENBQUM7WUFDekMsQ0FBQztpQkFBTSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLEdBQUcsYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxJQUFJLEVBQUUsYUFBYSxDQUFDO2dCQUNsQixHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ2pELENBQUMsQ0FBQztZQUVILE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDeEMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLG1CQUFtQixDQUFDO1lBRTVELHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUsNENBQTRDO1lBQzVDLEVBQUU7WUFDRixpRUFBaUU7WUFDakUsdURBQXVEO1lBQ3ZELHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUscUVBQXFFO1lBQ3JFLGlFQUFpRTtZQUNqRSxJQUFJLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLE1BQU0sS0FBSyxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ3pELENBQUM7cUJBQU0sQ0FBQztvQkFDTix5REFBeUQ7b0JBQ3pELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUN6QixtQkFBbUIsR0FBRyxJQUFJLENBQUM7d0JBQzNCLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLHNFQUFzRTs0QkFDcEUsMEVBQTBFOzRCQUMxRSw2Q0FBNkMsRUFDL0MsRUFBRSxtQkFBbUIsRUFBRSxDQUN4QixDQUFDO29CQUNKLENBQUM7b0JBQ0QsWUFBWSxHQUFHLG1CQUFtQixDQUFDO2dCQUNyQyxDQUFDO1lBQ0gsQ0FBQztZQUVELGtFQUFrRTtZQUNsRSxxRUFBcUU7WUFDckUsZ0VBQWdFO1lBQ2hFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUsbUVBQW1FO1lBQ25FLGtFQUFrRTtZQUNsRSx5REFBeUQ7WUFDekQsRUFBRTtZQUNGLHFFQUFxRTtZQUNyRSxxRUFBcUU7WUFDckUsSUFBSSxpQkFBMEIsQ0FBQztZQUMvQixJQUFJLFlBQVksS0FBSyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN6QyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDdEQsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO29CQUNqRCxZQUFZO29CQUNaLE9BQU8sRUFBRSw0Q0FBNEM7aUJBQ3RELENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFCLGlCQUFpQixHQUFHLGtCQUFrQixDQUNwQyxLQUFLLEVBQUUsbUJBQW1CLENBQzNCLENBQUMsaUJBQWlCLENBQUM7WUFDdEIsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFvQixFQUFFLENBQUM7WUFFaEMsZ0VBQWdFO1lBQ2hFLHFGQUFxRjtZQUNyRixNQUFNLEtBQUssR0FBRyxRQUFRLElBQUksRUFBRSxFQUFFLENBQUM7WUFFL0IscUVBQXFFO1lBQ3JFLE1BQU0sWUFBWSxHQUFHLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztZQUVuRCx1RUFBdUU7WUFDdkUseUVBQXlFO1lBQ3pFLHdFQUF3RTtZQUN4RSxxRUFBcUU7WUFDckUsTUFBTSxXQUFXLEdBQ2YsSUFBSSxDQUFDLFdBQVc7Z0JBQ2hCLEtBQUssQ0FBQyxXQUFXO2dCQUNqQixvQ0FBb0MsQ0FBQztZQUN2QyxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVsRCxxRUFBcUU7WUFDckUsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsbUVBQW1FO1lBQ25FLDBFQUEwRTtZQUMxRSx1RUFBdUU7WUFDdkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3pELEdBQUcsSUFBSTtnQkFDUCxZQUFZO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRW5FLGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLDBCQUEwQixDQUN4RCxJQUFJLEVBQ0osS0FBSyxFQUNMLGFBQWEsRUFDYixHQUFHLEVBQ0gsVUFBVSxFQUNWLFFBQVEsRUFDUixpQkFBaUIsQ0FDbEIsQ0FBQztZQUVGLE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLFlBQVk7Z0JBQ1osbUJBQW1CO2dCQUNuQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRTthQUMxQyxDQUFDO1lBRUYsMERBQTBEO1lBQzFELGtFQUFrRTtZQUNsRSxvRUFBb0U7WUFDcEUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDL0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ2pCLEtBQUssRUFDTDtvQkFDRSxTQUFTLEVBQUUsYUFBYTtvQkFDeEIsV0FBVztvQkFDWCxTQUFTLEVBQUU7d0JBQ1QsWUFBWSxFQUFFLFlBQVk7d0JBQzFCLFlBQVksRUFBRSxZQUFZO3dCQUMxQixLQUFLLEVBQUUsaUJBQWlCO3dCQUN4QixnQkFBZ0I7cUJBQ2pCO2lCQUNGLEVBQ0QsRUFBRSxRQUFRLEVBQUUsQ0FDYjtnQkFDRCxLQUFLLENBQUMsS0FBSyxDQUNULG9CQUFvQixDQUFDLFlBQVksQ0FBQyxFQUNsQztvQkFDRSxLQUFLO29CQUNMLFlBQVk7b0JBQ1osR0FBRyxDQUFDLFdBQVcsSUFBSSwwQ0FBMEM7d0JBQzNELENBQUMsQ0FBQzs0QkFDRSxRQUFRLEVBQUU7Z0NBQ1IsS0FBSyxFQUFFLGlCQUFpQjtnQ0FDeEIsWUFBWTtnQ0FDWixZQUFZO2dDQUNaLFdBQVc7Z0NBQ1gsZ0JBQWdCOzZCQUNqQjt5QkFDRjt3QkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUN3QixFQUNqQztvQkFDRSxZQUFZO29CQUNaLFdBQVc7aUJBQ1osQ0FDRjthQUNGLENBQUMsQ0FBQztZQUVILDJEQUEyRDtZQUMzRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUMzQixDQUFDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2dCQUNwQyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNoQyxzRUFBc0U7b0JBQ3RFLDJFQUEyRTtvQkFDM0UsMkVBQTJFO29CQUMzRSxzQ0FBc0M7Z0JBQ3hDLENBQUM7cUJBQU0sSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0Qyw2REFBNkQ7b0JBQzdELG1FQUFtRTtvQkFDbkUsbUVBQW1FO29CQUNuRSxlQUFlO29CQUNmLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLHFFQUFxRTt3QkFDbkUsOERBQThELEVBQ2hFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUM3QyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztnQkFDdEMsa0NBQWtDO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNoQixNQUFNLElBQUksb0JBQW9CLENBQzVCLDBEQUEwRCxDQUMzRCxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUM1QyxNQUFNLElBQUksb0JBQW9CLENBQzVCLDREQUE0RCxLQUFLLFNBQVMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FDN0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELHVFQUF1RTtZQUN2RSxpRUFBaUU7WUFDakUsc0VBQXNFO1lBQ3RFLCtCQUErQjtZQUMvQixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QyxhQUFhLENBQUMsSUFBSSxDQUNoQixzREFBc0QsRUFDdEQ7b0JBQ0UsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssV0FBVztvQkFDM0MsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUc7b0JBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0JBQ2hFLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksR0FBRyxDQUFVLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0VWRU5UX1NPVVJDSU5HLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgZ2V0UnVuQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vY2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NjaGVtYXMuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBoZWFsdGhDaGVjayB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKipcbiAqIFRpbWVvdXQgZm9yIHRoZSBjcm9zcy1kZXBsb3ltZW50IGNhcGFiaWxpdHkgcHJvYmUgZG9uZSBiZWZvcmVcbiAqIGRlaHlkcmF0aW5nIHdvcmtmbG93IGFyZ3VtZW50cy4gS2VwdCB0aWdodCBvbiBwdXJwb3NlOiB0aGUgcHJvYmUgaXNcbiAqIGFuIG9wdGltaXphdGlvbiAoaXQgbGV0cyB0aGUgY2FsbGVyIGVtaXQgdGhlIGZyYW1lZCBieXRlLXN0cmVhbSB3aXJlXG4gKiBmb3JtYXQgd2hlbiB0aGUgdGFyZ2V0IHN1cHBvcnRzIGl0KSwgYW5kIHRoZSBmYWxsYmFjayBvbiB0aW1lb3V0IGlzXG4gKiB0aGUgbGVnYWN5IHJhdyBmb3JtYXQgd2hpY2ggYWx3YXlzIHdvcmtzLiBMb25nIGRlbGF5cyBoZXJlIHdvdWxkIGp1c3RcbiAqIG1ha2UgYHN0YXJ0KHsgZGVwbG95bWVudElkOiAuLi4gfSlgIHNsb3dlciBmb3IgdXNlcnMgd2hvc2UgdGFyZ2V0XG4gKiBkZXBsb3ltZW50cyBkb24ndCByZWNvZ25pemUgdGhlIGhlYWx0aCBjaGVjayBhdCBhbGwuXG4gKi9cbmNvbnN0IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKiBVTElEIGdlbmVyYXRvciBmb3IgY2xpZW50LXNpZGUgcnVuSWQgZ2VuZXJhdGlvbiAqL1xuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLy8gYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIGlzIGEgbm8tb3AgaW4gV29ybGRzIHdpdGhvdXQgYXRvbWljIGRlcGxveW1lbnRzLlxuLy8gVGhlIHdhcm5pbmcgdGhhdCBleHBsYWlucyB0aGlzIG9ubHkgbmVlZHMgdG8gZmlyZSBvbmNlIHBlciBwcm9jZXNzOiBhXG4vLyB3b3JrZmxvdyB0aGF0IGhhcmRjb2RlcyAnbGF0ZXN0JyBmb3IgaXRzIFZlcmNlbCBkZXBsb3ltZW50IHdvdWxkIG90aGVyd2lzZVxuLy8gbG9nIGl0IG9uIGV2ZXJ5IGxvY2FsL1Bvc3RncmVzIHJ1biwgZmxvb2RpbmcgdGlnaHQgZGV2IGxvb3BzLlxubGV0IGhhc1dhcm5lZExhdGVzdE5vT3AgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXNldCB0aGUgYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIG5vLW9wIHdhcm4tb25jZSBndWFyZC4gVGVzdC1vbmx5IOKAlFxuICogZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW4gZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCBhY3Jvc3MgYHN0YXJ0KClgIGNhbGxzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TGF0ZXN0Tm9PcFdhcm5Gb3JUZXN0cygpOiB2b2lkIHtcbiAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaW4gd29ybGRzIHdpdGggYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHNcbiAgICogKGN1cnJlbnRseSBWZXJjZWwpLiBJbiBvdGhlciB3b3JsZHMgKGxvY2FsIGRldiwgUG9zdGdyZXMpIHRoZXJlIGlzIG5vXG4gICAqIG5vdGlvbiBvZiBtdWx0aXBsZSBkZXBsb3ltZW50cyB0byByZXNvbHZlIGJldHdlZW4sIHNvIGAnbGF0ZXN0J2AgaGFzIG5vXG4gICAqIGVmZmVjdCDigJQgYSB3YXJuaW5nIGlzIGxvZ2dlZCBhbmQgdGhlIHJ1biB0YXJnZXRzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqTm90ZToqKiBXaGVuIGBkZXBsb3ltZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBiZWNvbWUgYHVua25vd25gXG4gICAqIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGUgdHlwZXMgd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBkZXBsb3ltZW50cy5cbiAgICovXG4gIGRlcGxveW1lbnRJZDogJ2xhdGVzdCcgfCAoc3RyaW5nICYge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgZGVwbG95bWVudElkPzogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgdHlwZSBTdGFydE9wdGlvbnMgPVxuICB8IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbiAgfCBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+ID0gKFxuICAuLi5hcmdzOiBUQXJnc1xuKSA9PiBQcm9taXNlPFRSZXN1bHQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YSBvZiBhIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd01ldGFkYXRhID0geyB3b3JrZmxvd0lkOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTdGFydHMgYSB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uIHRvIHN0YXJ0LlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHdvcmtmbG93IChvcHRpb25hbCkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgcnVuIChvcHRpb25hbCkuXG4gKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJ1biBJRCBmb3IgdGhlIG5ld2x5IHN0YXJ0ZWQgd29ya2Zsb3cgaW52b2NhdGlvbi5cbiAqL1xuLy8gT3ZlcmxvYWRzIHdpdGggZGVwbG95bWVudElkIC0gYXJncyBhbmQgcmV0dXJuIHR5cGUgYmVjb21lIHVua25vd25cbi8vIFVzZXMgZ2VuZXJpY3Mgc28gdHlwZWQgd29ya2Zsb3dzIGFyZSBhc3NpZ25hYmxlIChhdm9pZHMgY29udHJhdmFyaWFuY2UgaXNzdWVzKSxcbi8vIGJ1dCB0aGUgcmV0dXJuIHR5cGUgYW5kIGFyZ3MgYXJlIHN0aWxsIHVua25vd24gc2luY2UgdGhlIGRlcGxveWVkIHZlcnNpb24gbWF5IGRpZmZlci5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuLy8gT3ZlcmxvYWRzIHdpdGhvdXQgZGVwbG95bWVudElkIC0gcHJlc2VydmUgdHlwZSBpbmZlcmVuY2VcbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IFRBcmdzLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3NPck9wdGlvbnM/OiBUQXJncyB8IFN0YXJ0T3B0aW9ucyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1xuKSB7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGZpZWxkIGlzIGFkZGVkIGJ5IG91ciBjbGllbnQgdHJhbnNmb3JtXG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3c/LndvcmtmbG93SWQ7XG5cbiAgICBpZiAoIXdvcmtmbG93TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgJ3N0YXJ0JyByZWNlaXZlZCBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLiBFbnN1cmUgdGhlIFdvcmtmbG93IFNESyBpcyBjb25maWd1cmVkIGNvcnJlY3RseSBhbmQgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGEgJ3VzZSB3b3JrZmxvdycgZGlyZWN0aXZlLmAsXG4gICAgICAgIHsgc2x1ZzogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5zdGFydCAke3dvcmtmbG93TmFtZX1gLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cz8ud29ybGQgPz8gZ2V0V29ybGQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgIGxldCBkZXBsb3ltZW50SWQgPSBvcHRzLmRlcGxveW1lbnRJZCA/PyBjdXJyZW50RGVwbG95bWVudElkO1xuXG4gICAgICAvLyBXaGVuICdsYXRlc3QnIGlzIHJlcXVlc3RlZCwgcmVzb2x2ZSB0aGUgYWN0dWFsIGxhdGVzdCBkZXBsb3ltZW50IElEXG4gICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCdzIGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yXG4gICAgICAvLyBzYW1lIGdpdCBicmFuY2ggZm9yIHByZXZpZXcgZGVwbG95bWVudHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFJlc29sdmluZyAnbGF0ZXN0JyBvbmx5IG1lYW5zIHNvbWV0aGluZyBpbiB3b3JsZHMgd2l0aCBhdG9taWMsXG4gICAgICAvLyBpbW11dGFibGUgZGVwbG95bWVudHMgKGUuZy4gVmVyY2VsKSwgd2hpY2ggaW1wbGVtZW50XG4gICAgICAvLyByZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCkuIFdvcmxkcyB3aXRob3V0IHRoYXQgY29uY2VwdCAobG9jYWwgZGV2LFxuICAgICAgLy8gc2VsZi1ob3N0ZWQgUG9zdGdyZXMpIGhhdmUgbm90aGluZyB0byByZXNvbHZlIGJldHdlZW4sIHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBmYWlsIGEgcnVuIHRoYXQgd29ya3MgZmluZSBvbiBWZXJjZWwsIHdlIHdhcm4gYW5kIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGN1cnJlbnQgZGVwbG95bWVudCDigJQgbWFraW5nICdsYXRlc3QnIGFuIGVmZmVjdGl2ZSBuby1vcCB0aGVyZS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICh3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKSB7XG4gICAgICAgICAgZGVwbG95bWVudElkID0gYXdhaXQgd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdhcm4gb25jZSBwZXIgcHJvY2VzcyDigJQgc2VlIGhhc1dhcm5lZExhdGVzdE5vT3AgYWJvdmUuXG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRMYXRlc3ROb09wKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRMYXRlc3ROb09wID0gdHJ1ZTtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgXCJkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIGhhcyBubyBlZmZlY3QgaW4gdGhpcyB3b3JsZCBhbmQgd2FzIGlnbm9yZWQuIFwiICtcbiAgICAgICAgICAgICAgICAnSXQgaXMgb25seSBzdXBwb3J0ZWQgYnkgd29ybGRzIHdpdGggYXRvbWljIGRlcGxveW1lbnRzLCBzdWNoIGFzIFZlcmNlbC4gJyArXG4gICAgICAgICAgICAgICAgJ1RoZSBydW4gd2lsbCB0YXJnZXQgdGhlIGN1cnJlbnQgZGVwbG95bWVudC4nLFxuICAgICAgICAgICAgICB7IGN1cnJlbnREZXBsb3ltZW50SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVwbG95bWVudElkID0gY3VycmVudERlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byB3cml0ZSBieXRlIHN0cmVhbXMgaW4gdGhlIGZyYW1lZCB3aXJlIGZvcm1hdC5cbiAgICAgIC8vIEZvciBzYW1lLWRlcGxveW1lbnQgc3RhcnRzICh0aGUgY29tbW9uIGNhc2UpIHdlIGtub3cgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gcnVubmluZyB0aGlzIHNhbWUgU0RLIHZlcnNpb24sIHNvIGZyYW1pbmcgaXMgc2FmZS4gRm9yIGNyb3NzLVxuICAgICAgLy8gZGVwbG95bWVudCBzdGFydHMgKGV4cGxpY2l0IGRlcGxveW1lbnRJZCBvciAnbGF0ZXN0JyB0aGF0IHJlc29sdmVzXG4gICAgICAvLyB0byBhIGRpZmZlcmVudCBkZXBsb3ltZW50KSB3ZSBwcm9iZSB0aGUgdGFyZ2V0IHZpYSBoZWFsdGhDaGVjayB0b1xuICAgICAgLy8gbGVhcm4gaXRzIHdvcmtmbG93LWNvcmUgdmVyc2lvbiwgdGhlbiBkZXJpdmUgdGhlIGNhcGFiaWxpdHkuIFRoZVxuICAgICAgLy8gcHJvYmUgaGFzIGEgdGlnaHQgdGltZW91dCDigJQgb24gbWlzcy9mYWlsdXJlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGxlZ2FjeSByYXcgYnl0ZSBmb3JtYXQsIHdoaWNoIGlzIHVuaXZlcnNhbGx5IHJlYWRhYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIFdvcmxkcyB0aGF0IGRvbid0IGV4cG9zZSB0aGUgc3RyZWFtLXJlYWRpbmcgQVBJIChlLmcuIG1pbmltYWwgdGVzdFxuICAgICAgLy8gbW9ja3MpIGNhbid0IHNlcnZpY2UgaGVhbHRoIGNoZWNrcywgc28gd2Ugc2tpcCB0aGUgcHJvYmUgZm9yIHRoZW0uXG4gICAgICBsZXQgZnJhbWVkQnl0ZVN0cmVhbXM6IGJvb2xlYW47XG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSBjdXJyZW50RGVwbG95bWVudElkKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdvcmxkLnJlYWRGcm9tU3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGhlYWx0aENoZWNrKHdvcmxkLCAnd29ya2Zsb3cnLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgIHRpbWVvdXQ6IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TLFxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhcbiAgICAgICAgICBwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICApLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBydW5JZCBjbGllbnQtc2lkZSBzbyB3ZSBoYXZlIGl0IGJlZm9yZSBzZXJpYWxpemF0aW9uXG4gICAgICAvLyAocmVxdWlyZWQgZm9yIGZ1dHVyZSBFMkUgZW5jcnlwdGlvbiB3aGVyZSBydW5JZCBpcyBwYXJ0IG9mIHRoZSBlbmNyeXB0aW9uIGNvbnRleHQpXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7dWxpZCgpfWA7XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIFVzZSB3b3JsZC1kZWNsYXJlZCBzcGVjVmVyc2lvbiB3aGVuIGF2YWlsYWJsZSAob3VyIHdvcmxkcyBzZXQgdGhpcyksXG4gICAgICAvLyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBzYWZlIGJhc2VsaW5lIHRoYXQgY29tbXVuaXR5IHdvcmxkcyBoYW5kbGUuXG4gICAgICAvLyBDb21tdW5pdHkgd29ybGRzIGJ1aWx0IGFnYWluc3Qgb2xkZXIgQHdvcmtmbG93L3dvcmxkIHJlamVjdCBydW5zIHdpdGhcbiAgICAgIC8vIHNwZWNWZXJzaW9uID4gdGhlaXIgU1BFQ19WRVJTSU9OX0NVUlJFTlQgdmlhIHJlcXVpcmVzTmV3ZXJXb3JsZCgpLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPVxuICAgICAgICBvcHRzLnNwZWNWZXJzaW9uID8/XG4gICAgICAgIHdvcmxkLnNwZWNWZXJzaW9uID8/XG4gICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19FVkVOVF9TT1VSQ0lORztcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDcmVhdGUgcnVuIHZpYSBydW5fY3JlYXRlZCBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAvLyBQYXNzIGNsaWVudC1nZW5lcmF0ZWQgcnVuSWQgLSBzZXJ2ZXIgd2lsbCBhY2NlcHQgYW5kIHVzZSBpdFxuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAuLi4oc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCDigJQgdGhlIHJ1biB3YXMgbm90IGVucXVldWVkXG4gICAgICBpZiAocXVldWVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGV2ZW50cy5jcmVhdGUgcmVzdWx0XG4gICAgICBsZXQgcmVzaWxpZW50U3RhcnQgPSBmYWxzZTtcbiAgICAgIGlmIChydW5DcmVhdGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICBjb25zdCBlcnIgPSBydW5DcmVhdGVkUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIC8vIDQwOTogVGhlIHJ1biBhbHJlYWR5IGV4aXN0cy4gVGhpcyBjYW4gaGFwcGVuIGluIGV4dHJlbWUgY2FzZXMgd2hlcmVcbiAgICAgICAgICAvLyB0aGUgcnVuIGNyZWF0aW9uIGNhbGwgZ2V0cyBhIGNvbGQgc3RhcnQgb3Igb3RoZXIgc2xvd2Rvd24sIGFuZCB0aGUgcXVldWVcbiAgICAgICAgICAvLyArIHJ1bl9zdGFydGVkIGNhbGwgY29tcGxldGVzIGZhc3Rlci4gV2UgZXhwZWN0IHRoaXMgdG8gYmUgPD0xJSBvZiBjYXNlcy5cbiAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiBzYWZlbHkgcmV0dXJuLlxuICAgICAgICB9IGVsc2UgaWYgKGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgLy8gNDI5IChUaHJvdHRsZUVycm9yKSwgNXh4LCBhbmQgdHJhbnNpZW50IHRyYW5zcG9ydCBmYWlsdXJlc1xuICAgICAgICAgIC8vIChUUkFOU1BPUlQvVElNRU9VVCkgYXJlIHJldHJ5YWJsZSDigJQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZVxuICAgICAgICAgIC8vIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGJ5IHRoZSBydW50aW1lIHdoZW4gaXQgY2FsbHNcbiAgICAgICAgICAvLyBydW5fc3RhcnRlZC5cbiAgICAgICAgICByZXNpbGllbnRTdGFydCA9IHRydWU7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgJ1J1biBjcmVhdGlvbiBldmVudCBmYWlsZWQsIGJ1dCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlIHF1ZXVlLiAnICtcbiAgICAgICAgICAgICAgJ1RoZSBydW5fY3JlYXRlZCBldmVudCB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLicsXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBlcnJvcjogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBydW5DcmVhdGVkUmVzdWx0LnZhbHVlO1xuICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcnVuIHdhcyBjcmVhdGVkXG4gICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIFwiTWlzc2luZyAncnVuJyBpbiBzZXJ2ZXIgcmVzcG9uc2UgZm9yICdydW5fY3JlYXRlZCcgZXZlbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgc2VydmVyIGFjY2VwdGVkIG91ciBydW5JZFxuICAgICAgICBpZiAoIXYxQ29tcGF0ICYmIHJlc3VsdC5ydW4ucnVuSWQgIT09IHJ1bklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYFNlcnZlciByZXR1cm5lZCBkaWZmZXJlbnQgcnVuSWQgdGhhbiByZXF1ZXN0ZWQ6IGV4cGVjdGVkICR7cnVuSWR9LCBnb3QgJHtyZXN1bHQucnVuLnJ1bklkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZXNlIGFyZ3VtZW50LXN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZSBwcm9taXNlXG4gICAgICAvLyBoYW5kZWQgdG8gd2FpdFVudGlsIG11c3QgbmV2ZXIgcmVqZWN0IChhbiB1bmNvbnN1bWVkIHdhaXRVbnRpbFxuICAgICAgLy8gcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSwgc28gdW5leHBlY3RlZFxuICAgICAgLy8gZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnQmFja2dyb3VuZCBmbHVzaCBvZiB3b3JrZmxvdyBhcmd1bWVudCBzdHJlYW1zIGZhaWxlZCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRGVwbG95bWVudElkKGRlcGxveW1lbnRJZCksXG4gICAgICAgIC4uLihydW5DcmVhdGVkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW5cbiAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1bi5zdGF0dXMpXG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBSdW48VFJlc3VsdD4ocnVuSWQsIHsgcmVzaWxpZW50U3RhcnQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/step-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/step-handler.ts"],"names":[],"mappings":"AA+5BA;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CACC,CAAC"}
|