@workflow/core 5.0.0-beta.35 → 5.0.0-beta.37
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 +6 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +13 -1
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +5 -2
- package/dist/create-hook.d.ts +41 -22
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +12 -1
- package/dist/encryption.d.ts +15 -2
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +28 -7
- package/dist/flushable-stream.d.ts +55 -0
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +106 -4
- package/dist/global.d.ts +2 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.js +3 -3
- package/dist/private.d.ts +82 -50
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +149 -22
- package/dist/replay-payload-cache.d.ts +57 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +143 -0
- package/dist/runtime/constants.d.ts +11 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +26 -1
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/get-port-lazy.js +4 -4
- package/dist/runtime/helpers.d.ts +47 -16
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +97 -28
- package/dist/runtime/resume-hook.d.ts +6 -3
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +180 -58
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +5 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +65 -18
- package/dist/runtime/step-executor.d.ts +48 -8
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +90 -20
- package/dist/runtime/suspension-handler.js +3 -3
- package/dist/runtime/world.d.ts +2 -7
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +3 -10
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +398 -184
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +1 -1
- package/dist/serialization/codec.d.ts +6 -4
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +1 -1
- package/dist/serialization/encryption.d.ts +118 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +131 -15
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +20 -0
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +11 -1
- package/dist/serialization-format.d.ts +44 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +66 -9
- package/dist/serialization.d.ts +61 -21
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +556 -200
- package/dist/set-attributes.d.ts +2 -7
- package/dist/set-attributes.d.ts.map +1 -1
- package/dist/set-attributes.js +1 -6
- package/dist/step/context-storage.d.ts +2 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +2 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +14 -3
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +87 -22
- package/dist/symbols.d.ts +26 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +27 -1
- package/dist/telemetry/semantic-conventions.d.ts +4 -4
- package/dist/telemetry/semantic-conventions.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +76 -9
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +38 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +85 -30
- package/dist/workflow/index.d.ts +1 -1
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -2
- package/dist/workflow/set-attributes.d.ts +0 -9
- package/dist/workflow/set-attributes.d.ts.map +1 -1
- package/dist/workflow/set-attributes.js +1 -6
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +21 -9
- package/dist/workflow.d.ts +14 -11
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +37 -92
- package/docs/api-reference/create-hook.mdx +43 -2
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +3 -4
- package/docs/api-reference/set-attributes.mdx +0 -4
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/hooks.mdx +1 -1
- package/docs/foundations/idempotency.mdx +16 -9
- package/docs/how-it-works/cancellation.mdx +2 -2
- package/docs/how-it-works/code-transform.mdx +19 -15
- package/docs/how-it-works/encryption.mdx +3 -3
- package/docs/how-it-works/event-sourcing.mdx +6 -6
- package/docs/how-it-works/framework-integrations.mdx +96 -342
- package/package.json +6 -6
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -839
- package/dist/step-hydration-cache.d.ts +0 -148
- package/dist/step-hydration-cache.d.ts.map +0 -1
- package/dist/step-hydration-cache.js +0 -171
|
@@ -14,7 +14,7 @@ import { getPortLazy } from './get-port-lazy.js';
|
|
|
14
14
|
import { memoizeEncryptionKey } from './helpers.js';
|
|
15
15
|
import { computeStepLatencyEventData, } from './step-latency.js';
|
|
16
16
|
import { safeWaitUntil } from './wait-until.js';
|
|
17
|
-
const DEFAULT_STEP_MAX_RETRIES = 3;
|
|
17
|
+
export const DEFAULT_STEP_MAX_RETRIES = 3;
|
|
18
18
|
/**
|
|
19
19
|
* Extract the inline delta from a step-terminal `events.create` result,
|
|
20
20
|
* if the World populated one. A delta is only meaningful when the caller
|
|
@@ -39,13 +39,12 @@ function extractInlineDelta(result, requested) {
|
|
|
39
39
|
* runs the step function, creates step_completed/step_failed/step_retrying events.
|
|
40
40
|
*
|
|
41
41
|
* Does NOT queue workflow continuation messages — the caller decides what to do next.
|
|
42
|
-
* Used by
|
|
42
|
+
* Used by the combined workflow handler for step execution.
|
|
43
43
|
*/
|
|
44
44
|
export async function executeStep(params) {
|
|
45
45
|
const { world, workflowRunId, workflowName, workflowStartedAt, stepId, stepName, } = params;
|
|
46
46
|
const isVercel = process.env.VERCEL_URL !== undefined;
|
|
47
|
-
// Gate payload compression on the run's specVersion
|
|
48
|
-
// as possibly containing compressed payloads (spec >= 5) get gzip data.
|
|
47
|
+
// Gate payload compression on the run's specVersion.
|
|
49
48
|
const compression = (params.runSpecVersion ?? 0) >= SPEC_VERSION_SUPPORTS_COMPRESSION;
|
|
50
49
|
const spanName = `step.execute ${stepDisplayName(stepName)}`;
|
|
51
50
|
return trace(spanName, {}, async (span) => {
|
|
@@ -63,7 +62,7 @@ export async function executeStep(params) {
|
|
|
63
62
|
const stepFn = getStepFunction(stepName);
|
|
64
63
|
if (!stepFn || typeof stepFn !== 'function') {
|
|
65
64
|
// Step function not registered — fail the step immediately (not the run).
|
|
66
|
-
//
|
|
65
|
+
// Create a step_failed event so
|
|
67
66
|
// the workflow can handle it gracefully via try/catch in user code.
|
|
68
67
|
const errorMessage = `Step "${stepName}" is not registered in the current deployment. This usually indicates a build or bundling issue that caused the step to not be included in the deployment.`;
|
|
69
68
|
runtimeLogger.error('Step function not registered, failing step', {
|
|
@@ -145,6 +144,58 @@ export async function executeStep(params) {
|
|
|
145
144
|
span?.setAttributes({
|
|
146
145
|
...Attribute.StepMaxRetries(maxRetries),
|
|
147
146
|
});
|
|
147
|
+
// maxRetries enforced before starting another attempt. Timeouts can kill
|
|
148
|
+
// a step execution without any way to catch the error, so the post-body/error
|
|
149
|
+
// guards below might miss it. Hence, we use `authoritativeAttempt` count
|
|
150
|
+
// as an additional guard based on step_started count or queue delivery count
|
|
151
|
+
// on backgrounded steps.
|
|
152
|
+
// Thrown-error exhaustion still terminates one attempt earlier via the post-body
|
|
153
|
+
// guard (with the thrown error as cause), and this check does not affect that.
|
|
154
|
+
if (params.authoritativeAttempt !== undefined &&
|
|
155
|
+
params.authoritativeAttempt > maxRetries + 1) {
|
|
156
|
+
const retryCount = maxRetries;
|
|
157
|
+
const errorMessage = `Step "${stepName}" exceeded max retries (${retryCount} ${pluralize('retry', 'retries', retryCount)})`;
|
|
158
|
+
stepLogger.error('Step exceeded max retries', {
|
|
159
|
+
workflowRunId,
|
|
160
|
+
stepName,
|
|
161
|
+
stepId,
|
|
162
|
+
attempt: params.authoritativeAttempt,
|
|
163
|
+
maxRetries,
|
|
164
|
+
});
|
|
165
|
+
try {
|
|
166
|
+
await world.events.create(workflowRunId, {
|
|
167
|
+
eventType: 'step_failed',
|
|
168
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
169
|
+
correlationId: stepId,
|
|
170
|
+
eventData: {
|
|
171
|
+
stepName,
|
|
172
|
+
error: await dehydrateStepError(new FatalError(errorMessage), workflowRunId, await getEncryptionKey(), [], globalThis, compression),
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
if (EntityConflictError.is(err)) {
|
|
178
|
+
// Step already reached a terminal state (a concurrent handler or an
|
|
179
|
+
// earlier delivery failed/completed it) — nothing to do.
|
|
180
|
+
runtimeLogger.info('Tried failing step for exceeded retries, but step has already finished.', {
|
|
181
|
+
workflowRunId,
|
|
182
|
+
stepId,
|
|
183
|
+
stepName,
|
|
184
|
+
message: err instanceof Error ? err.message : String(err),
|
|
185
|
+
});
|
|
186
|
+
return { type: 'skipped' };
|
|
187
|
+
}
|
|
188
|
+
if (RunExpiredError.is(err)) {
|
|
189
|
+
return { type: 'gone' };
|
|
190
|
+
}
|
|
191
|
+
throw err;
|
|
192
|
+
}
|
|
193
|
+
span?.setAttributes({
|
|
194
|
+
...Attribute.StepStatus('failed'),
|
|
195
|
+
...Attribute.StepRetryExhausted(true),
|
|
196
|
+
});
|
|
197
|
+
return { type: 'failed' };
|
|
198
|
+
}
|
|
148
199
|
// Maps a `step_started` rejection to a terminal StepExecutionResult,
|
|
149
200
|
// shared by the await path (below) and the optimistic-start reconciliation.
|
|
150
201
|
// Returns undefined when the error is not one we translate (caller rethrows).
|
|
@@ -202,6 +253,10 @@ export async function executeStep(params) {
|
|
|
202
253
|
// confirmed, which is exactly the property an operator opts out of with that
|
|
203
254
|
// flag, so an explicit opt-out wins over turbo's force.
|
|
204
255
|
const optimisticStart = params.lazyStepInput !== undefined &&
|
|
256
|
+
// Stale-sensitive guarded batches await the claim so the 412 fence
|
|
257
|
+
// covers the body, not just durable writes — see
|
|
258
|
+
// StepExecutorParams.suppressOptimisticStart.
|
|
259
|
+
params.suppressOptimisticStart !== true &&
|
|
205
260
|
(isOptimisticInlineStartEnabled() ||
|
|
206
261
|
(params.forceOptimisticStart === true &&
|
|
207
262
|
!isOptimisticInlineStartExplicitlyDisabled()));
|
|
@@ -255,7 +310,14 @@ export async function executeStep(params) {
|
|
|
255
310
|
? { ownerMessageId: params.ownerMessageId }
|
|
256
311
|
: {}),
|
|
257
312
|
},
|
|
258
|
-
}
|
|
313
|
+
},
|
|
314
|
+
// Guard the claim — see StepExecutorParams.stateUpdatedAt. A stale
|
|
315
|
+
// (412) rejection surfaces via reconcileOptimisticStart as a
|
|
316
|
+
// non-translatable error: the body result is discarded and the
|
|
317
|
+
// rejection propagates to the caller.
|
|
318
|
+
params.stateUpdatedAt !== undefined
|
|
319
|
+
? { stateUpdatedAt: params.stateUpdatedAt }
|
|
320
|
+
: undefined);
|
|
259
321
|
});
|
|
260
322
|
optimisticStartSettled = startedPromise.then(() => ({ ok: true }), (err) => ({ ok: false, err }));
|
|
261
323
|
const now = new Date();
|
|
@@ -281,11 +343,12 @@ export async function executeStep(params) {
|
|
|
281
343
|
// step_started (step already created, no payload).
|
|
282
344
|
try {
|
|
283
345
|
// Inline-ownership stamp: present on the lazy paths AND on the
|
|
284
|
-
// owned-recovery
|
|
285
|
-
// re-executing its step must re-stamp — ownership derives
|
|
286
|
-
// latest start, so an unstamped recovery start would read
|
|
287
|
-
// "unowned" to a later wake).
|
|
288
|
-
// ownerMessageId
|
|
346
|
+
// owned-recovery payload-less start (a redelivery of the owning
|
|
347
|
+
// message re-executing its step must re-stamp — ownership derives
|
|
348
|
+
// from the latest start, so an unstamped recovery start would read
|
|
349
|
+
// as "unowned" to a later wake). Only the background-step path
|
|
350
|
+
// passes no ownerMessageId: its start is the bare one, clearing
|
|
351
|
+
// ownership as intended.
|
|
289
352
|
const ownershipStamp = params.ownerMessageId !== undefined
|
|
290
353
|
? { ownerMessageId: params.ownerMessageId }
|
|
291
354
|
: {};
|
|
@@ -302,7 +365,14 @@ export async function executeStep(params) {
|
|
|
302
365
|
...ownershipStamp,
|
|
303
366
|
}
|
|
304
367
|
: { stepName, ...ownershipStamp },
|
|
305
|
-
}
|
|
368
|
+
},
|
|
369
|
+
// Guard the claim — see StepExecutorParams.stateUpdatedAt. A stale
|
|
370
|
+
// (412) rejection is intentionally NOT translated by
|
|
371
|
+
// startErrorToResult below, so it propagates to the caller for a
|
|
372
|
+
// fresh replay.
|
|
373
|
+
params.stateUpdatedAt !== undefined
|
|
374
|
+
? { stateUpdatedAt: params.stateUpdatedAt }
|
|
375
|
+
: undefined);
|
|
306
376
|
if (!startResult.step) {
|
|
307
377
|
throw new WorkflowRuntimeError(`step_started event for "${stepId}" did not return step entity`);
|
|
308
378
|
}
|
|
@@ -327,7 +397,7 @@ export async function executeStep(params) {
|
|
|
327
397
|
let result;
|
|
328
398
|
// Check max retries AFTER step_started (attempt was just incremented).
|
|
329
399
|
// Only enforce when the step has a previous error — this distinguishes
|
|
330
|
-
// actual retries (failed → retry) from concurrent starts
|
|
400
|
+
// actual retries (failed → retry) from concurrent inline starts
|
|
331
401
|
// execution loop can cause multiple handlers to step_started the same
|
|
332
402
|
// step simultaneously, inflating the attempt counter without any failure).
|
|
333
403
|
if (step.attempt > maxRetries + 1 && step.error) {
|
|
@@ -520,7 +590,6 @@ export async function executeStep(params) {
|
|
|
520
590
|
// settles, so the `ops` flush below always loses the 500ms race and the
|
|
521
591
|
// step reports `hasPendingOps` — forcing the inline loop to queue a
|
|
522
592
|
// continuation and paying a full round-trip per signal-bearing step.
|
|
523
|
-
// The non-inline `step-handler` path already does this after user code.
|
|
524
593
|
// Runs unconditionally (success or failure) so a throwing step doesn't
|
|
525
594
|
// leak the reader.
|
|
526
595
|
cancelAbortReaders(...args, thisVal, hydratedInput.closureVars);
|
|
@@ -547,10 +616,11 @@ export async function executeStep(params) {
|
|
|
547
616
|
return dehydrated;
|
|
548
617
|
});
|
|
549
618
|
// Flush pending ops (stream writes, etc.) with a short inline wait.
|
|
550
|
-
//
|
|
551
|
-
//
|
|
552
|
-
//
|
|
553
|
-
// settle within ~200ms (
|
|
619
|
+
// WorkflowServerWritableStream acks writes on buffer entry
|
|
620
|
+
// (group-commit batching); durability is enforced by its drain
|
|
621
|
+
// barrier, which the flushable state's completion awaits after
|
|
622
|
+
// lock release. Most ops settle within ~200ms (lock-release
|
|
623
|
+
// polling + one batched HTTP flush).
|
|
554
624
|
// If ops don't settle in 500ms (e.g., WritableStream kept open
|
|
555
625
|
// across steps), waitUntil handles the rest.
|
|
556
626
|
if (ops.length > 0) {
|
|
@@ -859,9 +929,9 @@ export async function executeStep(params) {
|
|
|
859
929
|
opsCount: ops.length,
|
|
860
930
|
});
|
|
861
931
|
}
|
|
862
|
-
// hasPendingOps signals the
|
|
932
|
+
// hasPendingOps signals the combined handler to break the loop
|
|
863
933
|
// and queue a continuation so waitUntil can flush them.
|
|
864
934
|
return { type: 'completed', hasPendingOps: !opsSettled, inlineDelta };
|
|
865
935
|
});
|
|
866
936
|
}
|
|
867
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1QsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUNBQWlDLEdBQ2xDLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsd0JBQXdCLEdBQ3pCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIseUNBQXlDLEdBQzFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pE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U0FDM0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLFVBQVUsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ3ZDLGFBQWE7Z0JBQ2IsUUFBUTtnQkFDUixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELHlEQUF5RDtRQUN6RCx3REFBd0Q7UUFDeEQsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFRocm90dGxlRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtmbG93QmFzZVVybCxcbiAgcGx1cmFsaXplLFxuICBzdGVwRGlzcGxheU5hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBTZXJpYWxpemVkRGF0YSwgU3RlcCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgQ3J5cHRvS2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyLCBzdGVwTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHtcbiAgY2FuY2VsQWJvcnRSZWFkZXJzLFxuICBkZWh5ZHJhdGVTdGVwRXJyb3IsXG4gIGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGh5ZHJhdGVTdGVwRXJyb3IsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuLi9zdGVwL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxuICBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHtcbiAgaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkLFxuICBpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydExhenkgfSBmcm9tICcuL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHsgbWVtb2l6ZUVuY3J5cHRpb25LZXkgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5VHJhY2tpbmcsXG59IGZyb20gJy4vc3RlcC1sYXRlbmN5LmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG5jb25zdCBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEV4dHJhY3QgdGhlIGlubGluZSBkZWx0YSBmcm9tIGEgc3RlcC10ZXJtaW5hbCBgZXZlbnRzLmNyZWF0ZWAgcmVzdWx0LFxuICogaWYgdGhlIFdvcmxkIHBvcHVsYXRlZCBvbmUuIEEgZGVsdGEgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGNhbGxlclxuICogcmVxdWVzdGVkIGl0IChgc2luY2VDdXJzb3JgIHdhcyBwYXNzZWQpIGFuZCB0aGUgV29ybGQgcmV0dXJuZWQgYm90aFxuICogYGV2ZW50c2AgYW5kIGEgYGN1cnNvcmA7IG90aGVyd2lzZSB3ZSByZXR1cm4gdW5kZWZpbmVkIGFuZCB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgaW5jcmVtZW50YWwgYGV2ZW50cy5saXN0YC4gYGhhc01vcmVgIGRlZmF1bHRzXG4gKiB0byBmYWxzZSAoc2luZ2xlIHBhZ2UpIHdoZW4gdGhlIFdvcmxkIG9taXRzIGl0LlxuICovXG5mdW5jdGlvbiBleHRyYWN0SW5saW5lRGVsdGEoXG4gIHJlc3VsdDogeyBldmVudHM/OiBFdmVudFtdOyBjdXJzb3I/OiBzdHJpbmcgfCBudWxsOyBoYXNNb3JlPzogYm9vbGVhbiB9LFxuICByZXF1ZXN0ZWQ6IGJvb2xlYW5cbik6IElubGluZUV2ZW50RGVsdGEgfCB1bmRlZmluZWQge1xuICBpZiAoIXJlcXVlc3RlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFyZXN1bHQuZXZlbnRzIHx8IHJlc3VsdC5jdXJzb3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yLFxuICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlID8/IGZhbHNlLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBFeGVjdXRvclBhcmFtcyB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgd29ya2Zsb3dSdW5JZDogc3RyaW5nO1xuICAvKiogRGVwbG95bWVudCB0aGF0IG93bnMgdGhlIHdvcmtmbG93IHJ1biwgZm9yIGZvcndhcmRlZCB3cml0YWJsZSBzdHJlYW1zLiAqL1xuICB3b3JrZmxvd0RlcGxveW1lbnRJZD86IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHdvcmtmbG93U3RhcnRlZEF0OiBudW1iZXI7XG4gIC8qKiBSb290IHJ1biBpZCBvZiB0aGlzIHJ1bidzIGxpbmVhZ2UsIGNhcnJpZWQgaW50byB0aGUgc3RlcCBjb250ZXh0LiAqL1xuICByb290UnVuSWQ/OiBzdHJpbmc7XG4gIHN0ZXBJZDogc3RyaW5nO1xuICBzdGVwTmFtZTogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5PzogQ3J5cHRvS2V5O1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93IHJ1bidzIHNwZWNWZXJzaW9uLCB1c2VkIHRvIGdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbi5cbiAgICogU3RlcCBvdXRwdXRzL2Vycm9ycyBhcmUgb25seSBnemlwLWNvbXByZXNzZWQgd2hlbiB0aGUgcnVuIGlzIG1hcmtlZFxuICAgKiBhcyBwb3NzaWJseSBjb250YWluaW5nIGNvbXByZXNzZWQgcGF5bG9hZHMgKHNwZWNWZXJzaW9uID49IDUpLlxuICAgKi9cbiAgcnVuU3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBMYXp5IHN0ZXAgc3RhcnQ6IHRoZSBhbHJlYWR5LWRlaHlkcmF0ZWQgc3RlcCBpbnB1dC4gV2hlbiBwcm92aWRlZCwgdGhlXG4gICAqIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50IGNhcnJpZXMgdGhpcyBpbnB1dCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCBvblxuICAgKiB0aGUgZmx5IChubyBzZXBhcmF0ZSBgc3RlcF9jcmVhdGVkYCByb3VuZC10cmlwKS4gU2V0IGJ5IHRoZSBvd25lZC1pbmxpbmVcbiAgICogcGF0aCBmb3IgdGhlIHN0ZXAgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgdGhlIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZC5cbiAgICogVGhlIHdvcmxkJ3MgYXRvbWljIGNyZWF0ZS1jbGFpbSBpcyB0aGUgZXhhY3RseS1vbmUtb3duZXIgZ2F0ZTogbG9zaW5nIGl0XG4gICAqIHN1cmZhY2VzIGFzIGBFbnRpdHlDb25mbGljdEVycm9yYCDihpIgYHsgdHlwZTogJ3NraXBwZWQnIH1gLCBzbyBhIGhhbmRsZXJcbiAgICogdGhhdCBkaWQgbm90IHdpbiB0aGUgY3JlYXRlIG5ldmVyIHJ1bnMgdGhlIGJvZHkuIE9taXR0ZWQgb24gZXZlcnkgb3RoZXJcbiAgICogcGF0aCwgd2hlcmUgdGhlIHN0ZXAgYWxyZWFkeSBoYXMgYSBgc3RlcF9jcmVhdGVkYCBhbmQgYHN0ZXBfc3RhcnRlZGBcbiAgICogY2FycmllcyBubyBwYXlsb2FkICh0aGUgbGVnYWN5IGNvbnRyYWN0KS5cbiAgICovXG4gIGxhenlTdGVwSW5wdXQ/OiBTZXJpYWxpemVkRGF0YTtcbiAgLyoqXG4gICAqIElubGluZSBzdGVwIG93bmVyc2hpcDogdGhlIHF1ZXVlIG1lc3NhZ2UgSUQgb2YgdGhlIGludm9jYXRpb24gdGhpc1xuICAgKiBleGVjdXRlU3RlcCBjYWxsIHJ1bnMgaW4gKGZyb20gdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhKS4gV2hlbiBzZXQsIHRoZVxuICAgKiBgc3RlcF9zdGFydGVkYCB0aGlzIGNhbGwgc2VuZHMgaXMgc3RhbXBlZCB3aXRoIGl0IOKAlCBvbiB0aGUgbGF6eSBwYXRoc1xuICAgKiAod2hlcmUgYGxhenlTdGVwSW5wdXRgIGlzIHByZXNlbnQpIGFuZCBvbiB0aGUgb3duZWQtcmVjb3ZlcnkgYmFyZSBzdGFydFxuICAgKiAod2hlcmUgaXQgaXMgbm90OyB0aGUgcmUtc3RhbXAga2VlcHMgYSByZWNvdmVyZWQgc3RlcCByZWFkYWJsZSBhcyBvd25lZFxuICAgKiBieSB0aGlzIG1lc3NhZ2UsIHNpbmNlIG93bmVyc2hpcCBkZXJpdmVzIGZyb20gdGhlIExBVEVTVCBzdGFydCkuIFdha2VcbiAgICogcmVwbGF5cyB0aGF0IG9ic2VydmUgYW4gYWN0aXZlbHktb3duZWQgc3RlcCBzdXBwcmVzcyB0aGUgaW1tZWRpYXRlXG4gICAqIHJlcXVldWUgYW5kIGVucXVldWUgYSBkZWxheWVkIGJhY2tzdG9wIGluc3RlYWQuIE9taXR0ZWQgb24gdGhlXG4gICAqIGJhY2tncm91bmQtc3RlcCBwYXRoLCB3aG9zZSBiYXJlIHN0YXJ0IGludGVudGlvbmFsbHkgY2xlYXJzIG93bmVyc2hpcFxuICAgKiAodGhlIHN0ZXAgaXMgcXVldWUtb3duZWQgZnJvbSB0aGF0IHBvaW50KS5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbiAob3B0LWluKS4gV2hlbiBwcm92aWRlZCwgdGhlIGN1cnNvciBvZiB0aGVcbiAgICogZXZlbnQgbG9nIGFzIG9ic2VydmVkIGJ5IHRoZSBjYWxsZXIgKmJlZm9yZSogdGhpcyBzdGVwJ3MgZXZlbnRzIHdlcmVcbiAgICogd3JpdHRlbi4gSXQgaXMgdGhyZWFkZWQgaW50byB0aGUgc3RlcC10ZXJtaW5hbCBgZXZlbnRzLmNyZWF0ZWAgc28gYVxuICAgKiBzdXBwb3J0aW5nIFdvcmxkIGNhbiByZXR1cm4gdGhlIGRlbHRhIG9mIGV2ZW50cyB3cml0dGVuIHNpbmNlIChzZWVcbiAgICoge0BsaW5rIGltcG9ydCgnQHdvcmtmbG93L3dvcmxkJykuQ3JlYXRlRXZlbnRQYXJhbXMuc2luY2VDdXJzb3J9KS5cbiAgICogT25seSBzZXQgdGhpcyB3aGVuIGBjb3JyZWxhdGlvbklkYC1iYXNlZCBvd25lcnNoaXAgZ3VhcmFudGVlcyB0aGlzXG4gICAqIGhhbmRsZXIgaXMgdGhlIHNvbGUgaW5saW5lIHdyaXRlciBmb3IgdGhlIHJ1biBvbiB0aGlzIGl0ZXJhdGlvbi5cbiAgICovXG4gIGlubGluZURlbHRhU2luY2VDdXJzb3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCByZWdhcmRsZXNzIG9mXG4gICAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAuIFNldCBieSB0dXJibyBtb2RlIG9uIHRoZSBmaXJzdCBkZWxpdmVyeVxuICAgKiBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgZm9yY2luZyBpdCBpcyBzYWZlOiB0aGVyZSBpcyBubyBjb25jdXJyZW50XG4gICAqIHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0sIHNvIHRoZSBib2R5IHJ1bnMgZXhhY3RseSBvbmNlLiBPbmx5XG4gICAqIG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCBgbGF6eVN0ZXBJbnB1dGAgKGEgYnJhbmQtbmV3IGxhenkgc3RlcCkuXG4gICAqL1xuICBmb3JjZU9wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gc2V0LCB0aGUgbGF6eS9vcHRpbWlzdGljIGBzdGVwX3N0YXJ0ZWRgIGlzXG4gICAqIGNoYWluZWQgb24gaXQgc28gdGhlIHN0ZXAgaXMgbmV2ZXIgY3JlYXRlZCBiZWZvcmUgaXRzIHJ1biBleGlzdHMuIFRoZSBib2R5XG4gICAqIHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlIOKAlCBvbmx5IHRoZSBuZXR3b3JrXG4gICAqIHdyaXRlIHdhaXRzIOKAlCBzbyB0aGUgYHJ1bl9zdGFydGVkYCByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5LiBgdW5kZWZpbmVkYFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIHdhcyBhbHJlYWR5IGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICAvKipcbiAgICogTGF0ZW5jeSB0ZWxlbWV0cnkgKFRURlMgLyBTVFNPKTogZWxpZ2liaWxpdHkgYW5kIGFuY2hvciB0aW1lc3RhbXBzIGRlY2lkZWRcbiAgICogYnkgdGhlIG9yY2hlc3RyYXRvci4gV2hlbiBzZXQsIHRoaXMgZXhlY3V0b3IgY29tcHV0ZXMgdGhlIGZpbmFsIHZhbHVlc1xuICAgKiBhZ2FpbnN0IHRoZSB3YWxsIGNsb2NrIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIGNvZGUgcnVucyBhbmRcbiAgICogYXR0YWNoZXMgdGhlbSB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LiBTZXQgb25seSBmb3IgdGhlIGZpcnN0IHN0ZXAgb2ZcbiAgICogYW4gaW5saW5lIGJhdGNoLCBhbmQgb25seSBvbiBmaXJzdC1hdHRlbXB0IGV4ZWN1dGlvbnMgdGhhdCBxdWFsaWZ5IOKAlCBzZWVcbiAgICogcnVudGltZS9zdGVwLWxhdGVuY3kudHMuXG4gICAqL1xuICBsYXRlbmN5VHJhY2tpbmc/OiBTdGVwTGF0ZW5jeVRyYWNraW5nO1xufVxuXG4vKipcbiAqIElubGluZS1kZWx0YSByZXR1cm5lZCBieSBhIHN0ZXAtdGVybWluYWwgd3JpdGUgd2hlbiB0aGUgY2FsbGVyIHBhc3NlZFxuICoge0BsaW5rIFN0ZXBFeGVjdXRvclBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yfSBhbmQgdGhlIFdvcmxkIHN1cHBvcnRzXG4gKiB0aGUgb3B0aW1pemF0aW9uLiBgZXZlbnRzYCBhcmUgdGhlIGV2ZW50cyB3cml0dGVuIHN0cmljdGx5IGFmdGVyIHRoYXRcbiAqIGN1cnNvciAodGhpcyBzdGVwJ3MgZXZlbnRzIHBsdXMgYW55dGhpbmcgaW50ZXJsZWF2ZWQgaW4tYmFuZCksIGBjdXJzb3JgXG4gKiBpcyB0aGUgcG9zaXRpb24gcGFzdCB0aGUgbGFzdCBvbmUsIGFuZCBgaGFzTW9yZWAgc2lnbmFscyBhIGZ1cnRoZXIgcGFnZVxuICogKHRoZSBjYWxsZXIgdGhlbiBmYWxscyBiYWNrIHRvIGEgZnVsbCBpbmNyZW1lbnRhbCBmZXRjaCkuIEFic2VudCB3aGVuXG4gKiB0aGUgV29ybGQgZGlkIG5vdCByZXR1cm4gYSBkZWx0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVFdmVudERlbHRhIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gIGhhc01vcmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgc3RlcCBleGVjdXRpb24gYXR0ZW1wdC4gVGhlIGNhbGxlciBkZWNpZGVzIHdoYXQgdG8gZG9cbiAqIGJhc2VkIG9uIHRoZSByZXN1bHQgdHlwZSAoZS5nLiwgcXVldWUgd29ya2Zsb3cgY29udGludWF0aW9uLCByZXBsYXkgaW5saW5lLCBldGMuKS5cbiAqXG4gKiBgaW5saW5lRGVsdGFgIGlzIGF0dGFjaGVkIHRvIGEgYGNvbXBsZXRlZGAgcmVzdWx0IHdoZW4gdGhlIGNhbGxlclxuICogcmVxdWVzdGVkIGl0IHZpYSB7QGxpbmsgU3RlcEV4ZWN1dG9yUGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3J9IGFuZFxuICogdGhlIFdvcmxkIHJldHVybmVkIG9uZS4gU3RlcCBmYWlsdXJlcyBhcmUgcmFyZSBhbmQgbm90IHRoZSBpbmxpbmVcbiAqIG9wdGltaXphdGlvbidzIHRhcmdldCwgc28gdGhlIGBmYWlsZWRgIHBhdGggbGVhdmVzIGl0IHRvIHRoZSBub3JtYWxcbiAqIGluY3JlbWVudGFsIGZldGNoLlxuICovXG5leHBvcnQgdHlwZSBTdGVwRXhlY3V0aW9uUmVzdWx0ID1cbiAgfCB7XG4gICAgICB0eXBlOiAnY29tcGxldGVkJztcbiAgICAgIGhhc1BlbmRpbmdPcHM/OiBib29sZWFuO1xuICAgICAgaW5saW5lRGVsdGE/OiBJbmxpbmVFdmVudERlbHRhO1xuICAgIH1cbiAgfCB7IHR5cGU6ICdmYWlsZWQnIH1cbiAgfCB7IHR5cGU6ICdyZXRyeSc7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfVxuICB8IHsgdHlwZTogJ3NraXBwZWQnIH1cbiAgfCB7IHR5cGU6ICdnb25lJyB9XG4gIHwgeyB0eXBlOiAndGhyb3R0bGVkJzsgdGltZW91dFNlY29uZHM6IG51bWJlciB9O1xuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc2luZ2xlIHN0ZXA6IGNyZWF0ZXMgc3RlcF9zdGFydGVkIGV2ZW50LCBoeWRyYXRlcyBpbnB1dCxcbiAqIHJ1bnMgdGhlIHN0ZXAgZnVuY3Rpb24sIGNyZWF0ZXMgc3RlcF9jb21wbGV0ZWQvc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZyBldmVudHMuXG4gKlxuICogRG9lcyBOT1QgcXVldWUgd29ya2Zsb3cgY29udGludWF0aW9uIG1lc3NhZ2VzIOKAlCB0aGUgY2FsbGVyIGRlY2lkZXMgd2hhdCB0byBkbyBuZXh0LlxuICogVXNlZCBieSBib3RoIHRoZSBWMSBzdGVwIGhhbmRsZXIgYW5kIHRoZSBWMiBjb21iaW5lZCBoYW5kbGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVN0ZXAoXG4gIHBhcmFtczogU3RlcEV4ZWN1dG9yUGFyYW1zXG4pOiBQcm9taXNlPFN0ZXBFeGVjdXRpb25SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgIHN0ZXBJZCxcbiAgICBzdGVwTmFtZSxcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgaXNWZXJjZWwgPSBwcm9jZXNzLmVudi5WRVJDRUxfVVJMICE9PSB1bmRlZmluZWQ7XG4gIC8vIEdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbiBvbiB0aGUgcnVuJ3Mgc3BlY1ZlcnNpb246IG9ubHkgcnVucyBtYXJrZWRcbiAgLy8gYXMgcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjID49IDUpIGdldCBnemlwIGRhdGEuXG4gIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAocGFyYW1zLnJ1blNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcblxuICBjb25zdCBzcGFuTmFtZSA9IGBzdGVwLmV4ZWN1dGUgJHtzdGVwRGlzcGxheU5hbWUoc3RlcE5hbWUpfWA7XG4gIHJldHVybiB0cmFjZShzcGFuTmFtZSwge30sIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcE5hbWUoc3RlcE5hbWUpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcElkKHN0ZXBJZCksXG4gICAgfSk7XG5cbiAgICAvLyBNZW1vaXplZCBhY2Nlc3NvciBmb3IgdGhlIHBlci1ydW4gZW5jcnlwdGlvbiBrZXkuIFRoZSBmaXJzdCBjYWxsZXJcbiAgICAvLyAoaW5wdXQgaHlkcmF0aW9uIG9uIHRoZSBzdWNjZXNzIHBhdGgsIG9yIG9uZSBvZiB0aGUgZWFybHktcmV0dXJuXG4gICAgLy8gZGVoeWRyYXRlU3RlcEVycm9yIHBhdGhzIGlmIHN0ZXBfc3RhcnRlZCBmYWlscykgdHJpZ2dlcnMgdGhlIGFjdHVhbFxuICAgIC8vIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uOyBzdWJzZXF1ZW50IGNhbGxlcnMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW5JZCk7XG5cbiAgICBjb25zdCBzdGVwRm4gPSBnZXRTdGVwRnVuY3Rpb24oc3RlcE5hbWUpO1xuICAgIGlmICghc3RlcEZuIHx8IHR5cGVvZiBzdGVwRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFN0ZXAgZnVuY3Rpb24gbm90IHJlZ2lzdGVyZWQg4oCUIGZhaWwgdGhlIHN0ZXAgaW1tZWRpYXRlbHkgKG5vdCB0aGUgcnVuKS5cbiAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgVjEgc3RlcCBoYW5kbGVyIHBhdHRlcm46IGNyZWF0ZSBzdGVwX2ZhaWxlZCBldmVudCBzb1xuICAgICAgLy8gdGhlIHdvcmtmbG93IGNhbiBoYW5kbGUgaXQgZ3JhY2VmdWxseSB2aWEgdHJ5L2NhdGNoIGluIHVzZXIgY29kZS5cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LiBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgYnVpbGQgb3IgYnVuZGxpbmcgaXNzdWUgdGhhdCBjYXVzZWQgdGhlIHN0ZXAgdG8gbm90IGJlIGluY2x1ZGVkIGluIHRoZSBkZXBsb3ltZW50LmA7XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdTdGVwIGZ1bmN0aW9uIG5vdCByZWdpc3RlcmVkLCBmYWlsaW5nIHN0ZXAnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGVwSWQsXG4gICAgICB9KTtcbiAgICAgIC8vIE9uIHRoZSBsYXp5IGlubGluZSBwYXRoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhpcyBzdGVwJ3NcbiAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgLCBleHBlY3RpbmcgZXhlY3V0ZVN0ZXAgdG8gbWF0ZXJpYWxpemUgdGhlIHN0ZXAgdmlhIGFcbiAgICAgIC8vIGxhenkgYHN0ZXBfc3RhcnRlZGAgY2FycnlpbmcgaXRzIGlucHV0LiBXZSBuZXZlciBnZXQgdGhhdCBmYXIgZm9yIGFuXG4gICAgICAvLyB1bnJlZ2lzdGVyZWQgc3RlcCwgc28gdGhlIHN0ZXAgZW50aXR5IGRvZXMgbm90IGV4aXN0IHlldCDigJQgd3JpdGluZ1xuICAgICAgLy8gYHN0ZXBfZmFpbGVkYCBzdHJhaWdodCBhd2F5IHdvdWxkIGhpdCB0aGUgd29ybGQncyBcInN0ZXAgbXVzdCBleGlzdFwiXG4gICAgICAvLyBvcmRlcmluZyBndWFyZCBhbmQgd2VkZ2UgdGhlIHJ1bi4gU2VuZCB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCBmaXJzdFxuICAgICAgLy8gKGl0IGNyZWF0ZXMgdGhlIHN0ZXAgKyBzeW50aGV0aWMgYHN0ZXBfY3JlYXRlZGAgYXRvbWljYWxseSBhbmQga2VlcHNcbiAgICAgIC8vIHJlcGxheSBjb3JyZWN0KSwgdGhlbiBmYWlsIGl0IGJlbG93LiBUaGlzIGFsc28gcHJlc2VydmVzIHRoZVxuICAgICAgLy8gZXhhY3RseS1vbmUtb3duZXIgZ3VhcmFudGVlOiBhIGNvbmN1cnJlbnQgaGFuZGxlciB0aGF0IHdvbiB0aGUgY3JlYXRlXG4gICAgICAvLyBtYWtlcyBvdXIgbGF6eSBgc3RlcF9zdGFydGVkYCByZWplY3Qgd2l0aCBFbnRpdHlDb25mbGljdEVycm9yIOKGkiB3ZVxuICAgICAgLy8gcmV0dXJuIGBza2lwcGVkYCBhbmQgbmV2ZXIgd3JpdGUgdGhlIGZhaWx1cmUgdHdpY2UuXG4gICAgICBpZiAocGFyYW1zLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFR1cmJvOiB0aGlzIGxhenkgYHN0ZXBfc3RhcnRlZGAgbXVzdCBub3QgcHJlY2VkZSB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYC4gT3JkZXIgaXQgYWZ0ZXIgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIChiZXN0LWVmZm9ydCDigJRcbiAgICAgICAgICAvLyBhIGJhcnJpZXIgcmVqZWN0aW9uIG1lYW5zIHRoZSBydW4gZG9lc24ndCBleGlzdCwgYW5kIHRoZSBjcmVhdGVcbiAgICAgICAgICAvLyBiZWxvdyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvcikuIE5vLW9wIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgaWYgKHBhcmFtcy5ydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXIuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAvLyBTdGFtcGVkIGZvciBjb25zaXN0ZW5jeSBldmVuIHRob3VnaCB0aGlzIHN0ZXAgdGVybWluYWwtZmFpbHNcbiAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYmVsb3cg4oCUIHRoZSBsb2cgc2hvdWxkIG5ldmVyIHNob3cgYW4gdW5vd25lZFxuICAgICAgICAgICAgICAvLyBsYXp5IHN0YXJ0LlxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLm93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHsgb3duZXJNZXNzYWdlSWQ6IHBhcmFtcy5vd25lck1lc3NhZ2VJZCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChzdGFydEVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0YXJ0RXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoc3RhcnRFcnIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RhcnRFcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgfVxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG5cbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICB9KTtcblxuICAgIC8vIE1hcHMgYSBgc3RlcF9zdGFydGVkYCByZWplY3Rpb24gdG8gYSB0ZXJtaW5hbCBTdGVwRXhlY3V0aW9uUmVzdWx0LFxuICAgIC8vIHNoYXJlZCBieSB0aGUgYXdhaXQgcGF0aCAoYmVsb3cpIGFuZCB0aGUgb3B0aW1pc3RpYy1zdGFydCByZWNvbmNpbGlhdGlvbi5cbiAgICAvLyBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBlcnJvciBpcyBub3Qgb25lIHdlIHRyYW5zbGF0ZSAoY2FsbGVyIHJldGhyb3dzKS5cbiAgICBjb25zdCBzdGFydEVycm9yVG9SZXN1bHQgPSAoXG4gICAgICBlcnI6IHVua25vd25cbiAgICApOiBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmIChUaHJvdHRsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IE1hdGgubWF4KFxuICAgICAgICAgIDEsXG4gICAgICAgICAgdHlwZW9mIGVyci5yZXRyeUFmdGVyID09PSAnbnVtYmVyJyA/IGVyci5yZXRyeUFmdGVyIDogMVxuICAgICAgICApO1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1Rocm90dGxlZCBvbiBzdGVwX3N0YXJ0ZWQsIGRlZmVycmluZycsIHtcbiAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogcmV0cnlBZnRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0aHJvdHRsZWQnLCB0aW1lb3V0U2Vjb25kczogcmV0cnlBZnRlciB9O1xuICAgICAgfVxuICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bklkfVwiIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgc3RlcCBcIiR7c3RlcElkfVwiOiAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICB9XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgaW4gdGVybWluYWwgc3RhdGUsIHNraXBwaW5nJywge1xuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBwZWQodHJ1ZSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgfVxuICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIGVyci5yZXRyeUFmdGVyID8/IDEpO1xuICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIG5vdCB5ZXQgcmVhY2hlZCcsIHtcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgdGltZW91dFNlY29uZHMsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAncmV0cnknLCB0aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgLy8gT3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQ6IHdoZW4gd2UgaG9sZCB0aGUgc3RlcCBpbnB1dCBsb2NhbGx5IChsYXp5IGlubGluZVxuICAgIC8vIHBhdGgpIGFuZCB0aGUgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQsIGZpcmUgYHN0ZXBfc3RhcnRlZGAgV0lUSE9VVFxuICAgIC8vIGF3YWl0aW5nIGFuZCBydW4gdGhlIGJvZHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlLiBBIGxhenkgc3RlcFxuICAgIC8vIGlzIGFsd2F5cyBicmFuZC1uZXcg4oeSIGF0dGVtcHQgMSwgbm8gcHJpb3IgZXJyb3IsIHN0YXJ0ZWQgbm93IOKAlCBzbyB3ZVxuICAgIC8vIGRvbid0IG5lZWQgdGhlIHNlcnZlciByb3VuZC10cmlwIHRvIGJlZ2luLiBXZSByZWNvbmNpbGUgdGhlIGluLWZsaWdodFxuICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGJlZm9yZSBhbnkgdGVybWluYWwgd3JpdGUgKGByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnRgKTogaWZcbiAgICAvLyBpdCBsb3N0IHRoZSBhdG9taWMgY3JlYXRlLWNsYWltICg0MDkpIG9yIHRoZSBydW4gaXMgZ29uZS90aHJvdHRsZWQsIHdlXG4gICAgLy8gZGlzY2FyZCB0aGUgYm9keSByZXN1bHQuIFJ1bm5pbmcgdGhlIGJvZHkgYmVmb3JlIGNvbmZpcm1pbmcgb3duZXJzaGlwIGNhblxuICAgIC8vIGV4ZWN1dGUgYSBzdGVwIG1vcmUgdGhhbiBvbmNlIHdoZW4gaGFuZGxlcnMgcmFjZSDigJQgaW5saW5lIHN0ZXAgYm9kaWVzXG4gICAgLy8gbXVzdCBiZSBpZGVtcG90ZW50OyBkaXNhYmxlIHZpYSBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wLlxuICAgIC8vXG4gICAgLy8gVHVyYm8gbW9kZSBwYXNzZXMgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCB0byBlbmFibGUgdGhpcyByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIGVudiBmbGFnIChpdHMgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHJlbW92ZXMgdGhlIHJhY2UpLiBCdXQgaXQgc3RpbGxcbiAgICAvLyBkZWZlcnMgdG8gYW4gKmV4cGxpY2l0KiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ9MGA6IGZvcmNlZFxuICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgcnVucyB0aGUgYm9keSBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAvYHJ1bl9zdGFydGVkYCBpc1xuICAgIC8vIGNvbmZpcm1lZCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcHJvcGVydHkgYW4gb3BlcmF0b3Igb3B0cyBvdXQgb2Ygd2l0aCB0aGF0XG4gICAgLy8gZmxhZywgc28gYW4gZXhwbGljaXQgb3B0LW91dCB3aW5zIG92ZXIgdHVyYm8ncyBmb3JjZS5cbiAgICBjb25zdCBvcHRpbWlzdGljU3RhcnQgPVxuICAgICAgcGFyYW1zLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RW5hYmxlZCgpIHx8XG4gICAgICAgIChwYXJhbXMuZm9yY2VPcHRpbWlzdGljU3RhcnQgPT09IHRydWUgJiZcbiAgICAgICAgICAhaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKSkpO1xuXG4gICAgbGV0IHN0ZXA6IFN0ZXA7XG4gICAgLy8gYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgYHN0ZXBfc3RhcnRlZGAgY3JlYXRlIGlzXG4gICAgLy8gaXNzdWVkIChlaXRoZXIgcGF0aCBiZWxvdykg4oCUIGFuY2hvcnMgUlNGUydzIGVuZCBwb2ludC4gU2VlXG4gICAgLy8gU3RlcExhdGVuY3lFdmVudERhdGEucnNmcyBhbmQgdGhlIGNhbGwgc2l0ZXMgYmVsb3cuXG4gICAgbGV0IHN0ZXBTdGFydFBvc3RTZW50QXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHRsZWQgb3V0Y29tZSBvZiB0aGUgaW4tZmxpZ2h0IG9wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAuIEhhbmRsZXJzIGFyZVxuICAgIC8vIGF0dGFjaGVkIHN5bmNocm9ub3VzbHkgKGAudGhlbihvaywgZXJyKWApIHNvIGEgZmFzdCByZWplY3Rpb24gbmV2ZXJcbiAgICAvLyBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gd2hpbGUgdGhlIGJvZHkgcnVucy5cbiAgICBsZXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDpcbiAgICAgIHwgUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgZXJyOiB1bmtub3duIH0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICAvLyBBd2FpdCB0aGUgb3B0aW1pc3RpYyBgc3RlcF9zdGFydGVkYCBvdXRjb21lIGFuZCB0cmFuc2xhdGUgYSBsb3N0IHJhY2UgL1xuICAgIC8vIHRlcm1pbmFsIHJ1biAvIHRocm90dGxlIGludG8gYSByZXN1bHQgdGhhdCBzaG9ydC1jaXJjdWl0cyB0aGUgYm9keVxuICAgIC8vIG91dHB1dC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB3ZSBvd24gdGhlIHN0ZXAgYW5kIG1heSB3cml0ZSBpdHMgdGVybWluYWxcbiAgICAvLyBldmVudC4gQSBub24tdHJhbnNsYXRhYmxlIHJlamVjdGlvbiBpcyByZXRocm93biAoc28gYSB0cmFuc2llbnRcbiAgICAvLyBzdGVwX3N0YXJ0ZWQgZmFpbHVyZSBwcm9wYWdhdGVzIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZWRlbGl2ZXJ5LFxuICAgIC8vIGV4YWN0bHkgYXMgb24gdGhlIGF3YWl0IHBhdGgpLiBJZGVtcG90ZW50IOKAlCBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gICAgY29uc3QgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0ID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIW9wdGltaXN0aWNTdGFydFNldHRsZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDtcbiAgICAgIGlmIChzZXR0bGVkLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KHNldHRsZWQuZXJyKTtcbiAgICAgIGlmICghbWFwcGVkKSB0aHJvdyBzZXR0bGVkLmVycjtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfTtcblxuICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgIC8vIENoYWluIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG9uIHRoZSBydW4tcmVhZHkgYmFycmllciAodHVyYm8gbW9kZSk6XG4gICAgICAvLyB0aGUgc3RlcCBjYW4ndCBiZSBjcmVhdGVkIGJlZm9yZSBpdHMgcnVuIGV4aXN0cywgYnV0IHRoZSBib2R5IGJlbG93XG4gICAgICAvLyBydW5zIGltbWVkaWF0ZWx5IGFnYWluc3Qgc3ludGhlc2l6ZWQgc3RhdGUsIHNvIHRoZSBgcnVuX3N0YXJ0ZWRgXG4gICAgICAvLyByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5IHJhdGhlciB0aGFuIGJsb2NraW5nIGl0LiBPdXRzaWRlIHR1cmJvIHRoZVxuICAgICAgLy8gYmFycmllciBpcyB1bmRlZmluZWQgYW5kIHRoaXMgaXMgYSBwbGFpbiBjcmVhdGUuXG4gICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IChwYXJhbXMucnVuUmVhZHlCYXJyaWVyID8/IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gVGFrZW4gcmlnaHQgYmVmb3JlIHRoZSBjcmVhdGUgZmlyZXMsIG5vdCBiZWZvcmUgdGhlIGJhcnJpZXIg4oCUXG4gICAgICAgICAgLy8gUlNGUyBtZWFzdXJlcyB0aGUgcnVuX3N0YXJ0ZWQtdG8tUE9TVCBzdHJldGNoLCBhbmQgdGhlIGJhcnJpZXJcbiAgICAgICAgICAvLyB3YWl0IElTIHBhcnQgb2YgdGhhdCBzdHJldGNoIHVuZGVyIHR1cmJvLlxuICAgICAgICAgIHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmV0dXJuIHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogcGFyYW1zLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgc3RhbXAg4oCUIHNlZSBTdGVwRXhlY3V0b3JQYXJhbXMub3duZXJNZXNzYWdlSWQuXG4gICAgICAgICAgICAgIC4uLihwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8geyBvd25lck1lc3NhZ2VJZDogcGFyYW1zLm93bmVyTWVzc2FnZUlkIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBvcHRpbWlzdGljU3RhcnRTZXR0bGVkID0gc3RhcnRlZFByb21pc2UudGhlbihcbiAgICAgICAgKCkgPT4gKHsgb2s6IHRydWUgYXMgY29uc3QgfSksXG4gICAgICAgIChlcnIpID0+ICh7IG9rOiBmYWxzZSBhcyBjb25zdCwgZXJyIH0pXG4gICAgICApO1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIHN0ZXAgPSB7XG4gICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3RlcF9zdGFydGVkIHZhbGlkYXRlcyBzdGF0ZSBhbmQgcmV0dXJucyB0aGUgc3RlcCBlbnRpdHkuIE9uIHRoZSBsYXp5XG4gICAgICAvLyBpbmxpbmUgcGF0aCB3ZSBhbHNvIGNhcnJ5IHRoZSBzdGVwIGBpbnB1dGAgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlXG4gICAgICAvLyBzdGVwIG9uIHRoZSBmbHkgKG5vIHNlcGFyYXRlIHN0ZXBfY3JlYXRlZCByb3VuZC10cmlwKS4gVGhlIHdvcmxkJ3NcbiAgICAgIC8vIGF0b21pYyBjcmVhdGUtY2xhaW0gbWFrZXMgdGhpcyBleGFjdGx5LW9uZS1vd25lcjogYSBjb25jdXJyZW50IGxvc2VyXG4gICAgICAvLyBnZXRzIEVudGl0eUNvbmZsaWN0RXJyb3IsIG1hcHBlZCB0byBgeyB0eXBlOiAnc2tpcHBlZCcgfWAsIHNvIGl0IG5ldmVyXG4gICAgICAvLyBydW5zIHRoZSBib2R5LiBXaGVuIGBsYXp5U3RlcElucHV0YCBpcyBhYnNlbnQgdGhpcyBpcyB0aGUgbGVnYWN5XG4gICAgICAvLyBzdGVwX3N0YXJ0ZWQgKHN0ZXAgYWxyZWFkeSBjcmVhdGVkLCBubyBwYXlsb2FkKS5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgc3RhbXA6IHByZXNlbnQgb24gdGhlIGxhenkgcGF0aHMgQU5EIG9uIHRoZVxuICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBiYXJlIHN0YXJ0IChhIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlXG4gICAgICAgIC8vIHJlLWV4ZWN1dGluZyBpdHMgc3RlcCBtdXN0IHJlLXN0YW1wIOKAlCBvd25lcnNoaXAgZGVyaXZlcyBmcm9tIHRoZVxuICAgICAgICAvLyBsYXRlc3Qgc3RhcnQsIHNvIGFuIHVuc3RhbXBlZCByZWNvdmVyeSBzdGFydCB3b3VsZCByZWFkIGFzXG4gICAgICAgIC8vIFwidW5vd25lZFwiIHRvIGEgbGF0ZXIgd2FrZSkuIFRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCBwYXNzZXMgbm9cbiAgICAgICAgLy8gb3duZXJNZXNzYWdlSWQsIHNvIGl0cyBiYXJlIHN0YXJ0IGNsZWFycyBvd25lcnNoaXAgYXMgaW50ZW5kZWQuXG4gICAgICAgIGNvbnN0IG93bmVyc2hpcFN0YW1wID1cbiAgICAgICAgICBwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgZXZlbnREYXRhOlxuICAgICAgICAgICAgcGFyYW1zLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgICAgLi4ub3duZXJzaGlwU3RhbXAsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHsgc3RlcE5hbWUsIC4uLm93bmVyc2hpcFN0YW1wIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghc3RhcnRSZXN1bHQuc3RlcCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBzdGVwX3N0YXJ0ZWQgZXZlbnQgZm9yIFwiJHtzdGVwSWR9XCIgZGlkIG5vdCByZXR1cm4gc3RlcCBlbnRpdHlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RhcnRSZXN1bHQuc3RlcDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBzdGFydEVycm9yVG9SZXN1bHQoZXJyKTtcbiAgICAgICAgaWYgKG1hcHBlZCkgcmV0dXJuIG1hcHBlZDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgZXhlY3V0aW9uIGRldGFpbHMnLCB7XG4gICAgICBzdGVwTmFtZSxcbiAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICBzdGF0dXM6IHN0ZXAuc3RhdHVzLFxuICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgIH0pO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gICAgLy8gQ2hlY2sgbWF4IHJldHJpZXMgQUZURVIgc3RlcF9zdGFydGVkIChhdHRlbXB0IHdhcyBqdXN0IGluY3JlbWVudGVkKS5cbiAgICAvLyBPbmx5IGVuZm9yY2Ugd2hlbiB0aGUgc3RlcCBoYXMgYSBwcmV2aW91cyBlcnJvciDigJQgdGhpcyBkaXN0aW5ndWlzaGVzXG4gICAgLy8gYWN0dWFsIHJldHJpZXMgKGZhaWxlZCDihpIgcmV0cnkpIGZyb20gY29uY3VycmVudCBzdGFydHMgKFYyIGlubGluZVxuICAgIC8vIGV4ZWN1dGlvbiBsb29wIGNhbiBjYXVzZSBtdWx0aXBsZSBoYW5kbGVycyB0byBzdGVwX3N0YXJ0ZWQgdGhlIHNhbWVcbiAgICAvLyBzdGVwIHNpbXVsdGFuZW91c2x5LCBpbmZsYXRpbmcgdGhlIGF0dGVtcHQgY291bnRlciB3aXRob3V0IGFueSBmYWlsdXJlKS5cbiAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEgJiYgc3RlcC5lcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICByZXRyeUNvdW50LFxuICAgICAgfSk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpb3IgYXR0ZW1wdCdzIHNlcmlhbGl6ZWQgZXJyb3IgYXMgdGhlIGNhdXNlIHNvIHRoZVxuICAgICAgLy8gdW5kZXJseWluZyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlIGZyb20gYHN0ZXAuZXJyb3IuY2F1c2VgIGFmdGVyXG4gICAgICAvLyBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGUgc3RlcF9yZXRyeWluZ1xuICAgICAgLy8gZXZlbnQgaGlzdG9yeS4gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBvZiB0aGUgcHJpb3IgYHN0ZXAuZXJyb3JgXG4gICAgICAvLyB0aHJvd3MsIGZhbGwgYmFjayB0byBhIEZhdGFsRXJyb3Igd2l0aG91dCBjYXVzZS5cbiAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBhd2FpdCBoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUg4oCUIGJlc3QtZWZmb3J0IGNhdXNlIGF0dGFjaG1lbnQuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgLy8gT3BzIHRoYXQgbXVzdCBiZSBkdXJhYmx5IGNvbW1pdHRlZCBiZWZvcmUgc3RlcCBjb21wbGV0aW9uIChlLmcuIGFcbiAgICAvLyBzdGVwLWluaXRpYXRlZCBhYm9ydCdzIGhvb2tfcmVjZWl2ZWQgZXZlbnQpLiBTZWUgU3RlcENvbnRleHQuIERlY2xhcmVkXG4gICAgLy8gb3V0c2lkZSB0aGUgdHJ5IHNvIHRoZSBmYWlsdXJlIHBhdGggYmVsb3cgY2FuIGFsc28gZHJhaW4gdGhlbS5cbiAgICBjb25zdCBwcmVDb21wbGV0aW9uT3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGxldCBvcHNTZXR0bGVkID0gdHJ1ZTtcblxuICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IHRvIGF0dGFjaCB0byB0aGlzIHN0ZXAncyB0ZXJtaW5hbCBldmVudC4gQ29tcHV0ZWRcbiAgICAvLyByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnM7IGRlY2xhcmVkIGhlcmUgc28gdGhlIGZhaWx1cmUgcGF0aCAodGhlXG4gICAgLy8gY2F0Y2ggYmVsb3cpIGNhbiBhdHRhY2ggaXQgdG8gc3RlcF9mYWlsZWQgdG9vLlxuICAgIGxldCBsYXRlbmN5RXZlbnREYXRhOiBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEJhY2tmaWxsIFJTRlMgb250byB0aGUgYWxyZWFkeS1jb21wdXRlZCB0ZWxlbWV0cnkgb25jZSB0aGUgb3B0aW1pc3RpY1xuICAgIC8vIHR1cmJvIHN0YXJ0IGhhcyBzZXR0bGVkLiBPbiB0aGF0IHBhdGggdGhlIHN0ZXAtc3RhcnQgUE9TVCBmaXJlcyBpbnNpZGVcbiAgICAvLyB0aGUgcnVuLXJlYWR5IGJhcnJpZXIncyBgLnRoZW5gLCBzbyBgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zYCDigJQgYW5kXG4gICAgLy8gdGhlcmVmb3JlIFJTRlMg4oCUIGlzIHVzdWFsbHkgc3RpbGwgdW5zZXQgd2hlbiBgbGF0ZW5jeUV2ZW50RGF0YWAgaXNcbiAgICAvLyBmaXJzdCBjb21wdXRlZCBqdXN0IGJlZm9yZSB1c2VyIGNvZGUgKHRoZSBiYXJyaWVyIGlzIHN0aWxsIGluIGZsaWdodFxuICAgIC8vIGZvciBhbnkgbm9uLXRyaXZpYWwgYHJ1bl9zdGFydGVkYCByb3VuZC10cmlwLCB3aGljaCBpcyBleGFjdGx5IHRoZVxuICAgIC8vIHNsb3ctcnVuX3N0YXJ0ZWQgY2FzZSBSU0ZTIGV4aXN0cyB0byBtZWFzdXJlKS4gQnkgdGhlIHRpbWVcbiAgICAvLyBgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KClgIGhhcyBhd2FpdGVkIHRoZSBiYXJyaWVyIHRoZSBQT1NUIHRpbWVzdGFtcFxuICAgIC8vIGlzIGtub3duLCBzbyB3ZSBwYXRjaCBSU0ZTIGluIGJlZm9yZSB0aGUgdGVybWluYWwgZXZlbnQgaXMgd3JpdHRlbi5cbiAgICAvLyBXaXRob3V0IHRoaXMsIHNsb3ctcnVuX3N0YXJ0ZWQgc2FtcGxlcyBhcmUgZHJvcHBlZCwgYmlhc2luZyBSU0ZTXG4gICAgLy8gcGVyY2VudGlsZXMgbG93IChtaXNzaW5nLW5vdC1hdC1yYW5kb20pLiBSZWNvbXB1dGVzIG9ubHkgUlNGUyDigJRcbiAgICAvLyBUVEZTL1NUU08gc3RheSBhbmNob3JlZCB0byBgZXhlY3V0aW9uU3RhcnRUaW1lYCBhcyBjb21wdXRlZCBhYm92ZS5cbiAgICBjb25zdCBiYWNrZmlsbE9wdGltaXN0aWNSc2ZzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFsYXRlbmN5RXZlbnREYXRhIHx8IGxhdGVuY3lFdmVudERhdGEucnNmcyAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3JNcyA9IHBhcmFtcy5sYXRlbmN5VHJhY2tpbmc/LnJzZnNBbmNob3JNcztcbiAgICAgIGlmIChhbmNob3JNcyA9PT0gdW5kZWZpbmVkIHx8IHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBsYXRlbmN5RXZlbnREYXRhLnJzZnMgPSBNYXRoLm1heCgwLCBzdGVwU3RhcnRQb3N0U2VudEF0TXMgLSBhbmNob3JNcyk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUnNmc01zKGxhdGVuY3lFdmVudERhdGEucnNmcyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYFN0ZXAgXCIke3N0ZXBJZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGVwU3RhcnRlZEF0ID0gc3RlcC5zdGFydGVkQXQ7XG4gICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIGVuY3J5cHRpb24ga2V5IHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgcmVzb2x2ZVxuICAgICAgLy8gdGhyb3VnaCB0aGUgbWVtb2l6ZWQgYWNjZXNzb3IgZGVjbGFyZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHRyYWNlLlxuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHBhcmFtcy5lbmNyeXB0aW9uS2V5ID8/IChhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCkpO1xuICAgICAgY29uc3QgaHlkcmF0ZWRJbnB1dCA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAnc3RlcC5oeWRyYXRlJyxcbiAgICAgICAge30sXG4gICAgICAgIGFzeW5jIChoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHBhcmFtcy53b3JrZmxvd0RlcGxveW1lbnRJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBcmd1bWVudHNDb3VudChoeWRyYXRlZC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFyZ3MgPSBoeWRyYXRlZElucHV0LmFyZ3M7XG4gICAgICBjb25zdCB0aGlzVmFsID0gaHlkcmF0ZWRJbnB1dC50aGlzVmFsID8/IG51bGw7XG4gICAgICBjb25zdCB3b3JrZmxvd0Jhc2VVcmwgPSBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwoXG4gICAgICAgIGlzVmVyY2VsXG4gICAgICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHsoYXdhaXQgZ2V0UG9ydExhenkoKSkgPz8gMzAwMH1gXG4gICAgICApO1xuXG4gICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgIC8vIFdyYXAgb25seSBzdGVwRm4uYXBwbHkoKSAodXNlciBzdGVwIGNvZGUpIHNvIGNsZWFudXAgYmVsb3cgcnVucyBvblxuICAgICAgLy8gQk9USCBzdWNjZXNzIGFuZCBmYWlsdXJlLiBBIHVzZXItY29kZSB0aHJvdyBpcyBjYXB0dXJlZCBoZXJlIGFuZFxuICAgICAgLy8gcmUtcmFpc2VkIGFmdGVyIGNhbmNlbEFib3J0UmVhZGVycywgc28gaXQgc3RpbGwgZmxvd3MgdG8gdGhlIG91dGVyXG4gICAgICAvLyBjYXRjaCAoc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZykg4oCUIGJ1dCB0aGUgYWJvcnQtc3RyZWFtIHJlYWRlciBpc1xuICAgICAgLy8gdG9ybiBkb3duIGZpcnN0LiBXaXRob3V0IHRoaXMsIGEgdGhyb3dpbmcvcmV0cnlpbmcgc2lnbmFsLWJlYXJpbmdcbiAgICAgIC8vIHN0ZXAgd291bGQgbGVhayBhIHJlYWwtdGltZSBhYm9ydCByZWFkZXIgcGVyIGF0dGVtcHQuXG4gICAgICBsZXQgdXNlckNvZGVFcnJvcjogdW5rbm93bjtcbiAgICAgIGxldCB1c2VyQ29kZUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbGF0ZW5jeUV2ZW50RGF0YSA9IGNvbXB1dGVTdGVwTGF0ZW5jeUV2ZW50RGF0YSh7XG4gICAgICAgIHRyYWNraW5nOiBwYXJhbXMubGF0ZW5jeVRyYWNraW5nLFxuICAgICAgICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBleGVjdXRpb25TdGFydFRpbWUsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIGxhenlTdGVwU3RhcnQ6IHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgIG9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zLFxuICAgICAgfSk7XG4gICAgICBpZiAobGF0ZW5jeUV2ZW50RGF0YSkge1xuICAgICAgICAvLyBNaXJyb3IgdGhlIGxhdGVuY3kgdGVsZW1ldHJ5IG9udG8gdGhlIHN0ZXAgc3BhbiBzbyB0cmFjZXMgc2hvd1xuICAgICAgICAvLyBUVEZTL1NUU08vUlNGUyBhbG9uZ3NpZGUgdGhlIGZsYW1lIGdyYXBoLCBub3QganVzdCBEYXRhZG9nIG1ldHJpY3MuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLnR0ZnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcFR0ZnNNcyhsYXRlbmN5RXZlbnREYXRhLnR0ZnMpXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS5zdHNvICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBTdHNvTXMobGF0ZW5jeUV2ZW50RGF0YS5zdHNvKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEucnNmcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwUnNmc01zKGxhdGVuY3lFdmVudERhdGEucnNmcylcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLmZpbmFsU2NoZWR1bGluZ1JlcGxheSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwRmluYWxTY2hlZHVsaW5nUmVwbGF5TXMoXG4gICAgICAgICAgICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5maW5hbFNjaGVkdWxpbmdSZXBsYXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBMYXRlbmN5T3B0aW1pemF0aW9ucyhcbiAgICAgICAgICAgIGxhdGVuY3lFdmVudERhdGEub3B0aW1pemF0aW9ucyA/PyBbXVxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZXhlY3V0ZScsIHt9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRleHRTdG9yYWdlLnJ1bihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBTdGFydGVkQXQ6IG5ldyBEYXRlKCtzdGVwU3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyBEYXRlKCt3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgdXJsOiB3b3JrZmxvd0Jhc2VVcmwsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHJvb3RSdW5JZDogcGFyYW1zLnJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICBwcmVDb21wbGV0aW9uT3BzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoaXMgYm9keSBiZWZvcmUgYHJ1bl9zdGFydGVkYCBpc1xuICAgICAgICAgICAgICAvLyBkdXJhYmxlLiBFeHBvc2UgdGhlIGJhcnJpZXIgc28gYSBkaXJlY3Qgc3RlcC1ib2R5IHdvcmxkIHdyaXRlXG4gICAgICAgICAgICAgIC8vIChlLmcuIGBzZXRBdHRyaWJ1dGVzYCkgY2FuIG9yZGVyIGl0c2VsZiBhZnRlciB0aGVcbiAgICAgICAgICAgICAgLy8gcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG9uIHRoZSBhd2FpdCBwYXRoIChydW4gYWxyZWFkeSBkdXJhYmxlKS5cbiAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyOiBvcHRpbWlzdGljU3RhcnRcbiAgICAgICAgICAgICAgICA/IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiBzdGVwRm4uYXBwbHkodGhpc1ZhbCwgYXJncylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB1c2VyQ29kZUVycm9yID0gZXJyO1xuICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleGVjdXRpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gZXhlY3V0aW9uU3RhcnRUaW1lO1xuXG4gICAgICAvLyBUZWFyIGRvd24gYW55IGFib3J0LXN0cmVhbSByZWFkZXJzIG9wZW5lZCB3aGlsZSBoeWRyYXRpbmcgdGhlIHN0ZXAnc1xuICAgICAgLy8gYXJndW1lbnRzIChhIHNlcmlhbGl6ZWQgQWJvcnRTaWduYWwgb3BlbnMgYSByZWFsLXRpbWUgYWJvcnQgcmVhZGVyIGZvclxuICAgICAgLy8gdGhlIHN0ZXAncyBkdXJhdGlvbikuIFdpdGhvdXQgdGhpcyB0aGUgcmVhZGVyJ3MgYHJlYWQoKWAgcHJvbWlzZSBuZXZlclxuICAgICAgLy8gc2V0dGxlcywgc28gdGhlIGBvcHNgIGZsdXNoIGJlbG93IGFsd2F5cyBsb3NlcyB0aGUgNTAwbXMgcmFjZSBhbmQgdGhlXG4gICAgICAvLyBzdGVwIHJlcG9ydHMgYGhhc1BlbmRpbmdPcHNgIOKAlCBmb3JjaW5nIHRoZSBpbmxpbmUgbG9vcCB0byBxdWV1ZSBhXG4gICAgICAvLyBjb250aW51YXRpb24gYW5kIHBheWluZyBhIGZ1bGwgcm91bmQtdHJpcCBwZXIgc2lnbmFsLWJlYXJpbmcgc3RlcC5cbiAgICAgIC8vIFRoZSBub24taW5saW5lIGBzdGVwLWhhbmRsZXJgIHBhdGggYWxyZWFkeSBkb2VzIHRoaXMgYWZ0ZXIgdXNlciBjb2RlLlxuICAgICAgLy8gUnVucyB1bmNvbmRpdGlvbmFsbHkgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgc28gYSB0aHJvd2luZyBzdGVwIGRvZXNuJ3RcbiAgICAgIC8vIGxlYWsgdGhlIHJlYWRlci5cbiAgICAgIGNhbmNlbEFib3J0UmVhZGVycyguLi5hcmdzLCB0aGlzVmFsLCBoeWRyYXRlZElucHV0LmNsb3N1cmVWYXJzKTtcblxuICAgICAgLy8gUmUtcmFpc2UgYSB1c2VyLWNvZGUgZmFpbHVyZSBub3cgdGhhdCBjbGVhbnVwIGhhcyBydW47IHRoZSBvdXRlclxuICAgICAgLy8gY2F0Y2ggbWFwcyBpdCB0byBzdGVwX2ZhaWxlZC9zdGVwX3JldHJ5aW5nLlxuICAgICAgaWYgKHVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgIHRocm93IHVzZXJDb2RlRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVFeGVjdXRpb25UaW1lTXMoZXhlY3V0aW9uVGltZU1zKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0cmFjZSgnc3RlcC5kZWh5ZHJhdGUnLCB7fSwgYXN5bmMgKGRlaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZGVoeWRyYXRlZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgICAgIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgcmV0dXJuZWQgc3RyZWFtIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBhZnRlciB0aGUgYm9keSBidXQgd2l0aGluIHRoaXMgc2FtZSBvcCBmbHVzaCwgc28gZ2F0ZSBpdHMgZmlyc3RcbiAgICAgICAgICAvLyB3cml0ZSBvbiB0aGUgcnVuLXJlYWR5IGJhcnJpZXIuIFVuZGVmaW5lZCBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgICAgICAgICBvcHRpbWlzdGljU3RhcnQgPyBwYXJhbXMucnVuUmVhZHlCYXJyaWVyIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBkZWh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVTZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiBkZWh5ZHJhdGVkKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZWh5ZHJhdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEZsdXNoIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzLCBldGMuKSB3aXRoIGEgc2hvcnQgaW5saW5lIHdhaXQuXG4gICAgICAvLyBOb3cgdGhhdCBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtIGZsdXNoZXMgc3luY2hyb25vdXNseSBvblxuICAgICAgLy8gZWFjaCB3cml0ZSAobm90IHZpYSBzZXRUaW1lb3V0KSwgdGhlIGZsdXNoYWJsZVBpcGUncyBwZW5kaW5nT3BzXG4gICAgICAvLyBhY2N1cmF0ZWx5IHJlZmxlY3RzIHdoZXRoZXIgZGF0YSBoYXMgcmVhY2hlZCB0aGUgc2VydmVyLiBNb3N0IG9wc1xuICAgICAgLy8gc2V0dGxlIHdpdGhpbiB+MjAwbXMgKDEwMG1zIGxvY2stcmVsZWFzZSBwb2xsaW5nICsgSFRUUCBmbHVzaCkuXG4gICAgICAvLyBJZiBvcHMgZG9uJ3Qgc2V0dGxlIGluIDUwMG1zIChlLmcuLCBXcml0YWJsZVN0cmVhbSBrZXB0IG9wZW5cbiAgICAgIC8vIGFjcm9zcyBzdGVwcyksIHdhaXRVbnRpbCBoYW5kbGVzIHRoZSByZXN0LlxuICAgICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG9wc1Byb21pc2UgPSBQcm9taXNlLmFsbChvcHMpO1xuICAgICAgICAvLyBUaGUgcmFjZSBiZWxvdyBzdXJmYWNlcyBmYWlsdXJlcyBpbmxpbmUgd2hlbiBvcHMgc2V0dGxlIHF1aWNrbHk7XG4gICAgICAgIC8vIGlmIHRoZSA1MDBtcyB0aW1lb3V0IHdpbnMsIHRoZSBmYWlsdXJlIGlzIG9ubHkgb2JzZXJ2ZWQgaGVyZS4gVGhlXG4gICAgICAgIC8vIHByb21pc2UgaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZFxuICAgICAgICAvLyB3YWl0VW50aWwgcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSxcbiAgICAgICAgLy8gc28gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgIHNhZmVXYWl0VW50aWwob3BzUHJvbWlzZSwgKGVycikgPT4ge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCBmbHVzaCBvZiBzdGVwIHN0cmVhbSBvcHMgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHNTZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBvcHNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhwZWN0ZWQgY2xpZW50IGRpc2Nvbm5lY3QgZXJyb3JzIChlLmcuLCBicm93c2VyXG4gICAgICAgICAgICAgIC8vIHJlZnJlc2ggZHVyaW5nIHN0cmVhbWluZylcbiAgICAgICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSByZXR1cm4gdHJ1ZSBhcyBjb25zdDtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IFByb21pc2U8ZmFsc2U+KChyKSA9PiBzZXRUaW1lb3V0KCgpID0+IHIoZmFsc2UpLCA1MDApKSxcbiAgICAgICAgXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9wdGltaXN0aWMgc3RhcnQ6IHRoZSBib2R5IHJhbiBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAgd2FzIGNvbmZpcm1lZC5cbiAgICAgIC8vIFJlY29uY2lsZSBpdCBub3cg4oCUIGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIGRpc2NhcmQgdGhpcyByZXN1bHQgYW5kIGRvbid0IHdyaXRlIHN0ZXBfY29tcGxldGVkLlxuICAgICAgLy8gUmVjb25jaWxlIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzOiBhIGRpc2NhcmRlZCByZXN1bHQgbWVhbnNcbiAgICAgIC8vIHRoZSB3aW5uaW5nIGhhbmRsZXIgb3ducyB0aGUgb3V0Y29tZSAoYW5kIHJlLWZpcmVzIGFueSBhYm9ydFxuICAgICAgLy8gaWRlbXBvdGVudGx5KSwgc28gdGhlcmUncyBubyBwb2ludCBwYXlpbmcgdGhlIGFib3J0LWNvbW1pdCBsYXRlbmN5LlxuICAgICAgaWYgKG9wdGltaXN0aWNTdGFydCkge1xuICAgICAgICBjb25zdCByZWNvbmNpbGUgPSBhd2FpdCByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQoKTtcbiAgICAgICAgaWYgKHJlY29uY2lsZSkgcmV0dXJuIHJlY29uY2lsZTtcbiAgICAgICAgLy8gQmFycmllciByZXNvbHZlZCDigJQgdGhlIHN0ZXAtc3RhcnQgUE9TVCB0aW1lc3RhbXAgaXMgbm93IGtub3duLCBzb1xuICAgICAgICAvLyBSU0ZTIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgYmVsb3cuXG4gICAgICAgIGJhY2tmaWxsT3B0aW1pc3RpY1JzZnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tbWl0IG11c3QtYmUtZHVyYWJsZSBvcHMgKGUuZy4gYSBzdGVwLWluaXRpYXRlZCBhYm9ydCdzXG4gICAgICAvLyBob29rX3JlY2VpdmVkIGV2ZW50KSBiZWZvcmUgd3JpdGluZyBzdGVwX2NvbXBsZXRlZCwgc28gYW55IHdvcmtmbG93XG4gICAgICAvLyBjb250aW51YXRpb24gdHJpZ2dlcmVkIGJ5IHRoYXQgZXZlbnQgb2JzZXJ2ZXMgdGhlIGFib3J0IHJhdGhlciB0aGFuXG4gICAgICAvLyByYWNpbmcgaXQuIFRoZXNlIG9wcyBzd2FsbG93IHRoZWlyIG93biBlcnJvcnMsIHNvIGF3YWl0aW5nIG9ubHlcbiAgICAgIC8vIGVuZm9yY2VzIG9yZGVyaW5nICh0aGUgYC5jYXRjaCgpYCBkZWZlbmRzIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb25cbiAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFRyYWRlb2ZmOiBjb3JyZWN0bmVzcyByZXF1aXJlcyB0aGUgaG9vayBiZSBkdXJhYmxlIGJlZm9yZSBjb21wbGV0aW9uLFxuICAgICAgLy8gc28g4oCUIHVubGlrZSB0aGUgYmFja2dyb3VuZCBgb3BzYCBmbHVzaCBhYm92ZSDigJQgdGhpcyBjYW5ub3QgYmUgY2FwcGVkXG4gICAgICAvLyB3aXRoIGEgcmVzb2x2ZS1vbi10aW1lb3V0IHJhY2UuIEEgc2xvdyByZXN1bWUgdGhlcmVmb3JlIGFkZHMgaXRzXG4gICAgICAvLyBsYXRlbmN5IHRvIGEgc3RlcCB0aGF0IGFib3J0cyBhIGNvbnRyb2xsZXIsIGFuZCBhIHRydWUgaGFuZyBob2xkc1xuICAgICAgLy8gY29tcGxldGlvbiB1bnRpbCB0aGUgcGxhdGZvcm0vcXVldWUgZXhlY3V0aW9uIHRpbWVvdXQgZmlyZXM7IHRoZSBxdWV1ZVxuICAgICAgLy8gdGhlbiByZWRlbGl2ZXJzIGFuZCB0aGUgc3RlcCByZXRyaWVzLCByZS1maXJpbmcgdGhlIGFib3J0IGlkZW1wb3RlbnRseS5cbiAgICAgIGlmIChwcmVDb21wbGV0aW9uT3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJlQ29tcGxldGlvbk9wcykuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgLy8gT3B0aW1pc3RpYyBzdGFydDogdGhlIGJvZHkgdGhyZXcgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgIHdhcyBjb25maXJtZWQuXG4gICAgICAvLyBSZWNvbmNpbGUgZmlyc3Qg4oCUIGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIHRoZSBib2R5IGVycm9yIGlzIG1vb3Q7IGRpc2NhcmQgaXQgYW5kIGRvbid0IHdyaXRlIGFcbiAgICAgIC8vIHRlcm1pbmFsIGV2ZW50ICh0aGUgd2lubmluZyBoYW5kbGVyIG93bnMgdGhlIG91dGNvbWUpLiBSZWNvbmNpbGVcbiAgICAgIC8vIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHN1Y2Nlc3NcbiAgICAgIC8vIHBhdGg6IGEgZGlzY2FyZGVkIG91dGNvbWUgZG9lc24ndCBuZWVkIHRoZSBhYm9ydCBjb21taXR0ZWQgaGVyZS5cbiAgICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVjb25jaWxlID0gYXdhaXQgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KCk7XG4gICAgICAgIGlmIChyZWNvbmNpbGUpIHJldHVybiByZWNvbmNpbGU7XG4gICAgICAgIC8vIEJhcnJpZXIgcmVzb2x2ZWQg4oCUIGF0dGFjaCBSU0ZTIHRvIHRoZSBzdGVwX2ZhaWxlZCBldmVudChzKSBiZWxvdy5cbiAgICAgICAgYmFja2ZpbGxPcHRpbWlzdGljUnNmcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmRlciBhbnkgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGFoZWFkIG9mIHN0ZXBfZmFpbGVkIHRvbyDigJQgYSBzdGVwIHRoYXQgYWJvcnRzIGFuZFxuICAgICAgLy8gdGhlbiB0aHJvd3MgbXVzdCBzdGlsbCBoYXZlIHRoZSBhYm9ydCByZWNvcmRlZCBiZWZvcmUgdGhlIGZhaWx1cmVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBvYnNlcnZlcyBpdC4gU2FtZSBsYXRlbmN5IHRyYWRlb2ZmIGFuZCBuby1yZWplY3QgY29udHJhY3RcbiAgICAgIC8vIGFzIHRoZSBzdWNjZXNzIHBhdGggYWJvdmUuIFNlZSBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzLlxuICAgICAgaWYgKHByZUNvbXBsZXRpb25PcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcmVDb21wbGV0aW9uT3BzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUVyciA9IHByb21vdGVBYm9ydEVycm9yVG9GYXRhbChlcnIpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IoZWZmZWN0aXZlRXJyKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKGVmZmVjdGl2ZUVycikgfHwgJyc7XG5cbiAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/LihlZmZlY3RpdmVFcnIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck5hbWUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTWVzc2FnZShub3JtYWxpemVkRXJyb3IubWVzc2FnZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JDYXRlZ29yeShcbiAgICAgICAgICBpc0ZhdGFsXG4gICAgICAgICAgICA/ICdmYXRhbCdcbiAgICAgICAgICAgIDogUmV0cnlhYmxlRXJyb3IuaXMoZWZmZWN0aXZlRXJyKVxuICAgICAgICAgICAgICA/ICdyZXRyeWFibGUnXG4gICAgICAgICAgICAgIDogJ3RyYW5zaWVudCdcbiAgICAgICAgKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yUmV0cnlhYmxlKCFpc0ZhdGFsKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRmF0YWwpIHtcbiAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAnRW5jb3VudGVyZWQgRmF0YWxFcnJvciB3aGlsZSBleGVjdXRpbmcgc3RlcCwgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93JyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQsIHN0ZXBOYW1lLCBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2sgfVxuICAgICAgICApO1xuICAgICAgICAvLyBBcHBseSB0aGUgbm9ybWFsaXplZCBzdGFjayB0byB0aGUgdGhyb3duIHZhbHVlIHNvIHRoZSBzZXJpYWxpemVkXG4gICAgICAgIC8vIGVycm9yIHByZXNlcnZlcyBpdCBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCB3b3Jrc1xuICAgICAgICAvLyBhY3Jvc3MgVk0gcmVhbG1zIChhIHdvcmtmbG93LXRocm93biBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgICAgLy8gVk0ncyBFcnJvciBjbGFzcywgbm90IHRoZSBob3N0J3MpLlxuICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcihlZmZlY3RpdmVFcnIpICYmIG5vcm1hbGl6ZWRTdGFjaykge1xuICAgICAgICAgIChlZmZlY3RpdmVFcnIgYXMgRXJyb3IpLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh3b3JrZmxvd1J1bklkLCB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlRXJyLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLi4ubGF0ZW5jeUV2ZW50RGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBOb24tZmF0YWwgZXJyb3I6IGNoZWNrIGlmIHJldHJpZXMgcmVtYWluaW5nXG4gICAgICBjb25zdCBjdXJyZW50QXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChjdXJyZW50QXR0ZW1wdCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY3VycmVudEF0dGVtcHQgPj0gbWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgLy8gTWF4IHJldHJpZXMgcmVhY2hlZFxuICAgICAgICBjb25zdCByZXRyeUNvdW50ID0gc3RlcC5hdHRlbXB0IC0gMTtcbiAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAnTWF4IHJldHJpZXMgcmVhY2hlZCwgYnViYmxpbmcgZXJyb3IgdG8gcGFyZW50IHdvcmtmbG93JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBhdHRlbXB0OiBzdGVwLmF0dGVtcHQsXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgZXJyb3JTdGFjazogbm9ybWFsaXplZFN0YWNrLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgXCIke3N0ZXBOYW1lfVwiIGZhaWxlZCBhZnRlciAke21heFJldHJpZXN9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgbWF4UmV0cmllcyl9OiAke25vcm1hbGl6ZWRFcnJvci5tZXNzYWdlfWA7XG4gICAgICAgIC8vIFdyYXAgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBhcyBgY2F1c2VgIG9uIGEgZnJlc2ggRmF0YWxFcnJvclxuICAgICAgICAvLyBzbyB0aGUgd3JhcHBpbmcgbWVzc2FnZSArIHJldHJ5LWNvdW50IGZyYW1pbmcgaXMgdGhlIHVzZXItZmFjaW5nXG4gICAgICAgIC8vIGVycm9yIHdoaWxlIHRoZSBvcmlnaW5hbCBmYWlsdXJlIHJlbWFpbnMgcmVjb3ZlcmFibGUgZnJvbVxuICAgICAgICAvLyBgZXJyLmNhdXNlYCBhZnRlciBoeWRyYXRpb24uXG4gICAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICh3cmFwcGVkRXJyb3IgYXMgRXJyb3IpLmNhdXNlID0gZXJyO1xuICAgICAgICBpZiAobm9ybWFsaXplZFN0YWNrKSB3cmFwcGVkRXJyb3Iuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh3b3JrZmxvd1J1bklkLCB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLi4ubGF0ZW5jeUV2ZW50RGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllcyByZW1haW5pbmdcbiAgICAgIGlmIChSZXRyeWFibGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHN0ZXBMb2dnZXIuaW5mbygnRW5jb3VudGVyZWQgUmV0cnlhYmxlRXJyb3IsIHN0ZXAgd2lsbCBiZSByZXRyaWVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgYXR0ZW1wdDogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSB0aGUgbm9ybWFsaXplZCBzdGFjayB0byB0aGUgdGhyb3duIHZhbHVlIHNvIGl0IHN1cnZpdmVzXG4gICAgICAvLyBzZXJpYWxpemF0aW9uLiBTZWUgdGhlIEZhdGFsRXJyb3Igc2l0ZSBhYm92ZSBmb3Igd2h5IHdlIHVzZVxuICAgICAgLy8gYHR5cGVzLmlzTmF0aXZlRXJyb3JgIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYC5cbiAgICAgIGlmICh0eXBlcy5pc05hdGl2ZUVycm9yKGVycikgJiYgbm9ybWFsaXplZFN0YWNrKSB7XG4gICAgICAgIChlcnIgYXMgRXJyb3IpLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh3b3JrZmxvd1J1bklkLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIC4uLihSZXRyeWFibGVFcnJvci5pcyhlcnIpICYmIHsgcmV0cnlBZnRlcjogZXJyLnJldHJ5QWZ0ZXIgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCByZXRyeWluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwUmV0cnlFcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBSZXRyeUVycjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heChcbiAgICAgICAgMSxcbiAgICAgICAgUmV0cnlhYmxlRXJyb3IuaXMoZXJyKVxuICAgICAgICAgID8gTWF0aC5jZWlsKCgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwKVxuICAgICAgICAgIDogMVxuICAgICAgKTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlXaWxsUmV0cnkodHJ1ZSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3JldHJ5JywgdGltZW91dFNlY29uZHMgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgb3V0c2lkZSB0aGUgc3RlcCBleGVjdXRpb24gZmFpbHVyZSBwYXRoOlxuICAgIC8vIHBlcnNpc3RlbmNlIGZhaWx1cmVzIGFyZSBpbmZyYXN0cnVjdHVyZSBlcnJvcnMgYW5kIHNob3VsZCByZWRlbGl2ZXIgdGhlXG4gICAgLy8gcXVldWUgbWVzc2FnZSwgbm90IGJlY29tZSB1c2VyIHN0ZXBfcmV0cnlpbmcvc3RlcF9mYWlsZWQgZXZlbnRzLlxuICAgIGxldCBjb21wbGV0ZWRSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygd29ybGQuZXZlbnRzLmNyZWF0ZT4+O1xuICAgIHRyeSB7XG4gICAgICBjb21wbGV0ZWRSZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0IGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgc2luY2VDdXJzb3I6IHBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgc3RlcCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGNvbnN0IGlubGluZURlbHRhID0gZXh0cmFjdElubGluZURlbHRhKFxuICAgICAgY29tcGxldGVkUmVzdWx0LFxuICAgICAgcGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZFxuICAgICk7XG5cbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgcmVzdWx0KSxcbiAgICB9KTtcblxuICAgIGlmIChvcHMubGVuZ3RoID4gMCkge1xuICAgICAgc3RlcExvZ2dlci5kZWJ1ZygnU3RlcCBoYXMgcGVuZGluZyBvcHMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBvcHNDb3VudDogb3BzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBoYXNQZW5kaW5nT3BzIHNpZ25hbHMgdGhlIFYyIGhhbmRsZXIgdG8gYnJlYWsgdGhlIGxvb3BcbiAgICAvLyBhbmQgcXVldWUgYSBjb250aW51YXRpb24gc28gd2FpdFVudGlsIGNhbiBmbHVzaCB0aGVtLlxuICAgIHJldHVybiB7IHR5cGU6ICdjb21wbGV0ZWQnLCBoYXNQZW5kaW5nT3BzOiAhb3BzU2V0dGxlZCwgaW5saW5lRGVsdGEgfTtcbiAgfSk7XG59XG4iXX0=
|
|
937
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1QsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUNBQWlDLEdBQ2xDLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsd0JBQXdCLEdBQ3pCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIseUNBQXlDLEdBQzFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pE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QUFDLGNBQWMsQ0FBQyxPQUFPLE1BQU0sQ0FBQztTQUMzQyxDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkIsVUFBVSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRTtnQkFDdkMsYUFBYTtnQkFDYixRQUFRO2dCQUNSLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsK0RBQStEO1FBQy9ELHdEQUF3RDtRQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgVGhyb3R0bGVFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV29ya2Zsb3dCYXNlVXJsLFxuICBwbHVyYWxpemUsXG4gIHN0ZXBEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFNlcmlhbGl6ZWREYXRhLCBTdGVwLCBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIsIHN0ZXBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RXJyb3JOYW1lLFxuICBnZXRFcnJvclN0YWNrLFxuICBub3JtYWxpemVVbmtub3duRXJyb3IsXG4gIHByb21vdGVBYm9ydEVycm9yVG9GYXRhbCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQge1xuICBpc09wdGltaXN0aWNJbmxpbmVTdGFydEVuYWJsZWQsXG4gIGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RXhwbGljaXRseURpc2FibGVkLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRQb3J0TGF6eSB9IGZyb20gJy4vZ2V0LXBvcnQtbGF6eS5qcyc7XG5pbXBvcnQgeyBtZW1vaXplRW5jcnlwdGlvbktleSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQge1xuICBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEsXG4gIHR5cGUgU3RlcExhdGVuY3lFdmVudERhdGEsXG4gIHR5cGUgU3RlcExhdGVuY3lUcmFja2luZyxcbn0gZnJvbSAnLi9zdGVwLWxhdGVuY3kuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEV4dHJhY3QgdGhlIGlubGluZSBkZWx0YSBmcm9tIGEgc3RlcC10ZXJtaW5hbCBgZXZlbnRzLmNyZWF0ZWAgcmVzdWx0LFxuICogaWYgdGhlIFdvcmxkIHBvcHVsYXRlZCBvbmUuIEEgZGVsdGEgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGNhbGxlclxuICogcmVxdWVzdGVkIGl0IChgc2luY2VDdXJzb3JgIHdhcyBwYXNzZWQpIGFuZCB0aGUgV29ybGQgcmV0dXJuZWQgYm90aFxuICogYGV2ZW50c2AgYW5kIGEgYGN1cnNvcmA7IG90aGVyd2lzZSB3ZSByZXR1cm4gdW5kZWZpbmVkIGFuZCB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgaW5jcmVtZW50YWwgYGV2ZW50cy5saXN0YC4gYGhhc01vcmVgIGRlZmF1bHRzXG4gKiB0byBmYWxzZSAoc2luZ2xlIHBhZ2UpIHdoZW4gdGhlIFdvcmxkIG9taXRzIGl0LlxuICovXG5mdW5jdGlvbiBleHRyYWN0SW5saW5lRGVsdGEoXG4gIHJlc3VsdDogeyBldmVudHM/OiBFdmVudFtdOyBjdXJzb3I/OiBzdHJpbmcgfCBudWxsOyBoYXNNb3JlPzogYm9vbGVhbiB9LFxuICByZXF1ZXN0ZWQ6IGJvb2xlYW5cbik6IElubGluZUV2ZW50RGVsdGEgfCB1bmRlZmluZWQge1xuICBpZiAoIXJlcXVlc3RlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFyZXN1bHQuZXZlbnRzIHx8IHJlc3VsdC5jdXJzb3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yLFxuICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlID8/IGZhbHNlLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBFeGVjdXRvclBhcmFtcyB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgd29ya2Zsb3dSdW5JZDogc3RyaW5nO1xuICAvKiogRGVwbG95bWVudCB0aGF0IG93bnMgdGhlIHdvcmtmbG93IHJ1biwgZm9yIGZvcndhcmRlZCB3cml0YWJsZSBzdHJlYW1zLiAqL1xuICB3b3JrZmxvd0RlcGxveW1lbnRJZD86IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHdvcmtmbG93U3RhcnRlZEF0OiBudW1iZXI7XG4gIC8qKiBSb290IHJ1biBpZCBvZiB0aGlzIHJ1bidzIGxpbmVhZ2UsIGNhcnJpZWQgaW50byB0aGUgc3RlcCBjb250ZXh0LiAqL1xuICByb290UnVuSWQ/OiBzdHJpbmc7XG4gIHN0ZXBJZDogc3RyaW5nO1xuICBzdGVwTmFtZTogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5PzogUGF5bG9hZEtleTtcbiAgLyoqXG4gICAqIFRoZSB3b3JrZmxvdyBydW4ncyBzcGVjVmVyc2lvbiwgdXNlZCB0byBnYXRlIHBheWxvYWQgY29tcHJlc3Npb24uXG4gICAqIFN0ZXAgb3V0cHV0cy9lcnJvcnMgYXJlIG9ubHkgY29tcHJlc3NlZCB3aGVuIHRoZSBydW4gaXMgbWFya2VkIGFzXG4gICAqIGNvbXByZXNzaW9uLWNhcGFibGUgKHNwZWNWZXJzaW9uID49IDUpLlxuICAgKi9cbiAgcnVuU3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBMYXp5IHN0ZXAgc3RhcnQ6IHRoZSBhbHJlYWR5LWRlaHlkcmF0ZWQgc3RlcCBpbnB1dC4gV2hlbiBwcm92aWRlZCwgdGhlXG4gICAqIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50IGNhcnJpZXMgdGhpcyBpbnB1dCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCBvblxuICAgKiB0aGUgZmx5IChubyBzZXBhcmF0ZSBgc3RlcF9jcmVhdGVkYCByb3VuZC10cmlwKS4gU2V0IGJ5IHRoZSBvd25lZC1pbmxpbmVcbiAgICogcGF0aCBmb3IgdGhlIHN0ZXAgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgdGhlIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZC5cbiAgICogVGhlIHdvcmxkJ3MgYXRvbWljIGNyZWF0ZS1jbGFpbSBpcyB0aGUgZXhhY3RseS1vbmUtb3duZXIgZ2F0ZTogbG9zaW5nIGl0XG4gICAqIHN1cmZhY2VzIGFzIGBFbnRpdHlDb25mbGljdEVycm9yYCDihpIgYHsgdHlwZTogJ3NraXBwZWQnIH1gLCBzbyBhIGhhbmRsZXJcbiAgICogdGhhdCBkaWQgbm90IHdpbiB0aGUgY3JlYXRlIG5ldmVyIHJ1bnMgdGhlIGJvZHkuIE9taXR0ZWQgb24gZXZlcnkgb3RoZXJcbiAgICogcGF0aCwgd2hlcmUgdGhlIHN0ZXAgYWxyZWFkeSBoYXMgYSBgc3RlcF9jcmVhdGVkYCBhbmQgYHN0ZXBfc3RhcnRlZGBcbiAgICogY2FycmllcyBubyBwYXlsb2FkICh0aGUgbGVnYWN5IGNvbnRyYWN0KS5cbiAgICovXG4gIGxhenlTdGVwSW5wdXQ/OiBTZXJpYWxpemVkRGF0YTtcbiAgLyoqXG4gICAqIElubGluZSBzdGVwIG93bmVyc2hpcDogdGhlIHF1ZXVlIG1lc3NhZ2UgSUQgb2YgdGhlIGludm9jYXRpb24gdGhpc1xuICAgKiBleGVjdXRlU3RlcCBjYWxsIHJ1bnMgaW4gKGZyb20gdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhKS4gV2hlbiBzZXQsIHRoZVxuICAgKiBgc3RlcF9zdGFydGVkYCB0aGlzIGNhbGwgc2VuZHMgaXMgc3RhbXBlZCB3aXRoIGl0IOKAlCBvbiB0aGUgbGF6eSBwYXRoc1xuICAgKiAod2hlcmUgYGxhenlTdGVwSW5wdXRgIGlzIHByZXNlbnQpIGFuZCBvbiB0aGUgb3duZWQtcmVjb3ZlcnlcbiAgICogcGF5bG9hZC1sZXNzIHN0YXJ0ICh3aGVyZSBpdCBpcyBub3Q7IHRoZSByZS1zdGFtcCBrZWVwcyBhIHJlY292ZXJlZFxuICAgKiBzdGVwIHJlYWRhYmxlIGFzIG93bmVkIGJ5IHRoaXMgbWVzc2FnZSwgc2luY2Ugb3duZXJzaGlwIGRlcml2ZXMgZnJvbVxuICAgKiB0aGUgTEFURVNUIHN0YXJ0IOKAlCBzbyBhIHJlY292ZXJ5IHN0YXJ0IGlzIG5ldmVyIGJhcmUpLiBXYWtlXG4gICAqIHJlcGxheXMgdGhhdCBvYnNlcnZlIGFuIGFjdGl2ZWx5LW93bmVkIHN0ZXAgc3VwcHJlc3MgdGhlIGltbWVkaWF0ZVxuICAgKiByZXF1ZXVlIGFuZCBlbnF1ZXVlIGEgZGVsYXllZCBiYWNrc3RvcCBpbnN0ZWFkLiBPbWl0dGVkIG9uIHRoZVxuICAgKiBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCwgd2hvc2UgYmFyZSBzdGFydCBpbnRlbnRpb25hbGx5IGNsZWFycyBvd25lcnNoaXBcbiAgICogKHRoZSBzdGVwIGlzIHF1ZXVlLW93bmVkIGZyb20gdGhhdCBwb2ludCkuXG4gICAqL1xuICBvd25lck1lc3NhZ2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb24gKG9wdC1pbikuIFdoZW4gcHJvdmlkZWQsIHRoZSBjdXJzb3Igb2YgdGhlXG4gICAqIGV2ZW50IGxvZyBhcyBvYnNlcnZlZCBieSB0aGUgY2FsbGVyICpiZWZvcmUqIHRoaXMgc3RlcCdzIGV2ZW50cyB3ZXJlXG4gICAqIHdyaXR0ZW4uIEl0IGlzIHRocmVhZGVkIGludG8gdGhlIHN0ZXAtdGVybWluYWwgYGV2ZW50cy5jcmVhdGVgIHNvIGFcbiAgICogc3VwcG9ydGluZyBXb3JsZCBjYW4gcmV0dXJuIHRoZSBkZWx0YSBvZiBldmVudHMgd3JpdHRlbiBzaW5jZSAoc2VlXG4gICAqIHtAbGluayBpbXBvcnQoJ0B3b3JrZmxvdy93b3JsZCcpLkNyZWF0ZUV2ZW50UGFyYW1zLnNpbmNlQ3Vyc29yfSkuXG4gICAqIE9ubHkgc2V0IHRoaXMgd2hlbiBgY29ycmVsYXRpb25JZGAtYmFzZWQgb3duZXJzaGlwIGd1YXJhbnRlZXMgdGhpc1xuICAgKiBoYW5kbGVyIGlzIHRoZSBzb2xlIGlubGluZSB3cml0ZXIgZm9yIHRoZSBydW4gb24gdGhpcyBpdGVyYXRpb24uXG4gICAqL1xuICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yPzogc3RyaW5nO1xuICAvKipcbiAgICogUHJlY29uZGl0aW9uLWd1YXJkIHNuYXBzaG90IChlcG9jaCBtcyBvZiB0aGUgbGF0ZXN0IGV2ZW50IHRoZSBjYWxsZXInc1xuICAgKiByZXBsYXkgbG9hZGVkKSB0byBhdHRhY2ggdG8gdGhpcyBzdGVwJ3MgYHN0ZXBfc3RhcnRlZGAgY2xhaW0uIE9uIHRoZSBsYXp5XG4gICAqIGlubGluZSBwYXRoIHRoZSBjbGFpbSBpcyB0aGUgc3RlcCdzIEZJUlNUIGR1cmFibGUgd3JpdGUgKGl0c1xuICAgKiBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCksIHNvIHdpdGhvdXQgdGhpcyB0aGUgY2xhaW0gd291bGQgYnlwYXNzIHRoZVxuICAgKiBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IGd1YXJkIGVudGlyZWx5OiBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBzdGFsZSB2aWV3XG4gICAqIGNvdWxkIGNsYWltIOKAlCBhbmQgdGhlbiBjb21taXQg4oCUIGEgc3RlcCBzY2hlZHVsZWQgd2l0aG91dCBvYnNlcnZpbmcgYW5cbiAgICogb3V0LW9mLWJhbmQgZXZlbnQuIEEgZ3VhcmQtZW5mb3JjaW5nIFdvcmxkIHJlamVjdHMgYSBzdGFsZSBjbGFpbSB3aXRoXG4gICAqIGBQcmVjb25kaXRpb25GYWlsZWRFcnJvcmAgKDQxMik7IGV4ZWN1dGVTdGVwIGRvZXMgTk9UIHRyYW5zbGF0ZSB0aGF0XG4gICAqIHJlamVjdGlvbiAocmUtY2xhaW1pbmcgaW4gcGxhY2Ugd291bGQgc3RpbGwgY29tbWl0IHRoZSBzdGFsZSBzY2hlZHVsZSksXG4gICAqIHNvIGl0IHByb3BhZ2F0ZXMgZm9yIHRoZSBjYWxsZXIgdG8gYWJhbmRvbiB0aGUgYmF0Y2ggYW5kIGZvcmNlIGEgZnJlc2hcbiAgICogcmVwbGF5LiBVbmRlZmluZWQgd2hlbiB0aGUgZ3VhcmQgaXMgZGlzYWJsZWQgb3IgdGhlIGNhbGxlciBoYXMgbm9cbiAgICogc25hcHNob3Q7IFdvcmxkcyB0aGF0IGRvbid0IGVuZm9yY2UgdGhlIGd1YXJkIGlnbm9yZSBpdC5cbiAgICovXG4gIHN0YXRlVXBkYXRlZEF0PzogbnVtYmVyO1xuICAvKipcbiAgICogU3VwcHJlc3Mgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXMgc3RlcCByZWdhcmRsZXNzIG9mXG4gICAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAgLyBgZm9yY2VPcHRpbWlzdGljU3RhcnRgOiB0YWtlIHRoZVxuICAgKiBhd2FpdC10aGVuLXJ1biBwYXRoIHNvIHRoZSBib2R5IG9ubHkgcnVucyBhZnRlciB0aGUgYHN0ZXBfc3RhcnRlZGAgY2xhaW1cbiAgICogc3VjY2VlZHMuIFNldCBieSB0aGUgcnVudGltZSBmb3IgZ3VhcmQtZW5mb3JjZWQgYmF0Y2hlcyB0aGF0IGFyZVxuICAgKiBzdGFsZS1zZW5zaXRpdmUgKGFuIG9wZW4gaG9vayBtZWFucyBhbiBvdXQtb2YtYmFuZCBldmVudCBjYW4gbWFrZSB0aGVcbiAgICogc2NoZWR1bGluZyB2aWV3IHN0YWxlKTogdGhlIGd1YXJkJ3MgNDEyIGZlbmNlIGNhbiByZWplY3QgYSBzdGFsZSBjbGFpbSdzXG4gICAqIGR1cmFibGUgd3JpdGVzLCBidXQgaXQgY2Fubm90IHVuLXJ1biBhIGJvZHkgdGhhdCBvcHRpbWlzdGljIHN0YXJ0IGJlZ2FuXG4gICAqIGJlZm9yZSB0aGUgY2xhaW0gc2V0dGxlZCDigJQgYXdhaXRpbmcgdGhlIGNsYWltIGV4dGVuZHMgdGhlIGZlbmNlIHRvIHVzZXJcbiAgICogY29kZS4gV2lucyBvdmVyIGBmb3JjZU9wdGltaXN0aWNTdGFydGAgYW5kIHRoZSBlbnYgZmxhZy5cbiAgICovXG4gIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogYFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYC4gU2V0IGJ5IHR1cmJvIG1vZGUgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5XG4gICAqIG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uLCB3aGVyZSBmb3JjaW5nIGl0IGlzIHNhZmU6IHRoZXJlIGlzIG5vIGNvbmN1cnJlbnRcbiAgICogcGVlciBoYW5kbGVyIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSwgc28gdGhlIGJvZHkgcnVucyBleGFjdGx5IG9uY2UuIE9ubHlcbiAgICogbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBsYXp5U3RlcElucHV0YCAoYSBicmFuZC1uZXcgbGF6eSBzdGVwKS5cbiAgICovXG4gIGZvcmNlT3B0aW1pc3RpY1N0YXJ0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAqIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiBzZXQsIHRoZSBsYXp5L29wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAgaXNcbiAgICogY2hhaW5lZCBvbiBpdCBzbyB0aGUgc3RlcCBpcyBuZXZlciBjcmVhdGVkIGJlZm9yZSBpdHMgcnVuIGV4aXN0cy4gVGhlIGJvZHlcbiAgICogc3RpbGwgcnVucyBpbW1lZGlhdGVseSBhZ2FpbnN0IGxvY2FsbHktc3ludGhlc2l6ZWQgc3RhdGUg4oCUIG9ubHkgdGhlIG5ldHdvcmtcbiAgICogd3JpdGUgd2FpdHMg4oCUIHNvIHRoZSBgcnVuX3N0YXJ0ZWRgIHJvdW5kLXRyaXAgb3ZlcmxhcHMgdGhlIGJvZHkuIGB1bmRlZmluZWRgXG4gICAqIG91dHNpZGUgdHVyYm8sIHdoZXJlIGBydW5fc3RhcnRlZGAgd2FzIGFscmVhZHkgYXdhaXRlZCB1cCBmcm9udC5cbiAgICovXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj47XG4gIC8qKlxuICAgKiBMYXRlbmN5IHRlbGVtZXRyeSAoVFRGUyAvIFNUU08pOiBlbGlnaWJpbGl0eSBhbmQgYW5jaG9yIHRpbWVzdGFtcHMgZGVjaWRlZFxuICAgKiBieSB0aGUgb3JjaGVzdHJhdG9yLiBXaGVuIHNldCwgdGhpcyBleGVjdXRvciBjb21wdXRlcyB0aGUgZmluYWwgdmFsdWVzXG4gICAqIGFnYWluc3QgdGhlIHdhbGwgY2xvY2sgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHVzZXIgY29kZSBydW5zIGFuZFxuICAgKiBhdHRhY2hlcyB0aGVtIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuIFNldCBvbmx5IGZvciB0aGUgZmlyc3Qgc3RlcCBvZlxuICAgKiBhbiBpbmxpbmUgYmF0Y2gsIGFuZCBvbmx5IG9uIGZpcnN0LWF0dGVtcHQgZXhlY3V0aW9ucyB0aGF0IHF1YWxpZnkg4oCUIHNlZVxuICAgKiBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cy5cbiAgICovXG4gIGxhdGVuY3lUcmFja2luZz86IFN0ZXBMYXRlbmN5VHJhY2tpbmc7XG4gIC8qKlxuICAgKiBBdXRob3JpdGF0aXZlIGF0dGVtcHQgbnVtYmVyIGZvciB0aGlzIGV4ZWN1dGlvbiwgdXNlZCB0byBib3VuZCByZXRyaWVzXG4gICAqIGFnYWluc3QgYG1heFJldHJpZXNgIEJFRk9SRSB0aGUgYm9keSBydW5zLiBJbiBvcmRlciB0byBhbHNvIGNhdGNoXG4gICAqIHN0ZXAgdGltZW91dHMgKHdoaWNoIHdlIGNhbid0IGhhdmUgY2F0Y2ggaGFuZGxlcnMgZm9yKSwgd2UgZGV0ZXJtaW5lXG4gICAqIHRoZSBhdHRlbXB0IGNvdW50IGJhc2VkIGFzIGZvbGxvd3M6XG4gICAqIC0gSW5saW5lIChjb21iaW5lZCBoYW5kbGVyKTogdGhlIG51bWJlciBvZiBgc3RlcF9zdGFydGVkYCBldmVudHMgYWxyZWFkeVxuICAgKiAgIGluIHRoZSBldmVudCBsb2cgZm9yIHRoaXMgc3RlcCwgcGx1cyBvbmUgZm9yIHRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1bi5cbiAgICogLSBCYWNrZ3JvdW5kIChxdWV1ZS1kaXNwYXRjaGVkKTogdGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50XG4gICAqICAgKGBtZXRhZGF0YS5hdHRlbXB0YCksIHdoaWNoIGluY3JlbWVudHMgb24gZXZlcnkgcmVkZWxpdmVyeS5cbiAgICovXG4gIGF1dGhvcml0YXRpdmVBdHRlbXB0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIElubGluZS1kZWx0YSByZXR1cm5lZCBieSBhIHN0ZXAtdGVybWluYWwgd3JpdGUgd2hlbiB0aGUgY2FsbGVyIHBhc3NlZFxuICoge0BsaW5rIFN0ZXBFeGVjdXRvclBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yfSBhbmQgdGhlIFdvcmxkIHN1cHBvcnRzXG4gKiB0aGUgb3B0aW1pemF0aW9uLiBgZXZlbnRzYCBhcmUgdGhlIGV2ZW50cyB3cml0dGVuIHN0cmljdGx5IGFmdGVyIHRoYXRcbiAqIGN1cnNvciAodGhpcyBzdGVwJ3MgZXZlbnRzIHBsdXMgYW55dGhpbmcgaW50ZXJsZWF2ZWQgaW4tYmFuZCksIGBjdXJzb3JgXG4gKiBpcyB0aGUgcG9zaXRpb24gcGFzdCB0aGUgbGFzdCBvbmUsIGFuZCBgaGFzTW9yZWAgc2lnbmFscyBhIGZ1cnRoZXIgcGFnZVxuICogKHRoZSBjYWxsZXIgdGhlbiBmYWxscyBiYWNrIHRvIGEgZnVsbCBpbmNyZW1lbnRhbCBmZXRjaCkuIEFic2VudCB3aGVuXG4gKiB0aGUgV29ybGQgZGlkIG5vdCByZXR1cm4gYSBkZWx0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVFdmVudERlbHRhIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gIGhhc01vcmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgc3RlcCBleGVjdXRpb24gYXR0ZW1wdC4gVGhlIGNhbGxlciBkZWNpZGVzIHdoYXQgdG8gZG9cbiAqIGJhc2VkIG9uIHRoZSByZXN1bHQgdHlwZSAoZS5nLiwgcXVldWUgd29ya2Zsb3cgY29udGludWF0aW9uLCByZXBsYXkgaW5saW5lLCBldGMuKS5cbiAqXG4gKiBgaW5saW5lRGVsdGFgIGlzIGF0dGFjaGVkIHRvIGEgYGNvbXBsZXRlZGAgcmVzdWx0IHdoZW4gdGhlIGNhbGxlclxuICogcmVxdWVzdGVkIGl0IHZpYSB7QGxpbmsgU3RlcEV4ZWN1dG9yUGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3J9IGFuZFxuICogdGhlIFdvcmxkIHJldHVybmVkIG9uZS4gU3RlcCBmYWlsdXJlcyBhcmUgcmFyZSBhbmQgbm90IHRoZSBpbmxpbmVcbiAqIG9wdGltaXphdGlvbidzIHRhcmdldCwgc28gdGhlIGBmYWlsZWRgIHBhdGggbGVhdmVzIGl0IHRvIHRoZSBub3JtYWxcbiAqIGluY3JlbWVudGFsIGZldGNoLlxuICovXG5leHBvcnQgdHlwZSBTdGVwRXhlY3V0aW9uUmVzdWx0ID1cbiAgfCB7XG4gICAgICB0eXBlOiAnY29tcGxldGVkJztcbiAgICAgIGhhc1BlbmRpbmdPcHM/OiBib29sZWFuO1xuICAgICAgaW5saW5lRGVsdGE/OiBJbmxpbmVFdmVudERlbHRhO1xuICAgIH1cbiAgfCB7IHR5cGU6ICdmYWlsZWQnIH1cbiAgfCB7IHR5cGU6ICdyZXRyeSc7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfVxuICB8IHsgdHlwZTogJ3NraXBwZWQnIH1cbiAgfCB7IHR5cGU6ICdnb25lJyB9XG4gIHwgeyB0eXBlOiAndGhyb3R0bGVkJzsgdGltZW91dFNlY29uZHM6IG51bWJlciB9O1xuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc2luZ2xlIHN0ZXA6IGNyZWF0ZXMgc3RlcF9zdGFydGVkIGV2ZW50LCBoeWRyYXRlcyBpbnB1dCxcbiAqIHJ1bnMgdGhlIHN0ZXAgZnVuY3Rpb24sIGNyZWF0ZXMgc3RlcF9jb21wbGV0ZWQvc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZyBldmVudHMuXG4gKlxuICogRG9lcyBOT1QgcXVldWUgd29ya2Zsb3cgY29udGludWF0aW9uIG1lc3NhZ2VzIOKAlCB0aGUgY2FsbGVyIGRlY2lkZXMgd2hhdCB0byBkbyBuZXh0LlxuICogVXNlZCBieSB0aGUgY29tYmluZWQgd29ya2Zsb3cgaGFuZGxlciBmb3Igc3RlcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlU3RlcChcbiAgcGFyYW1zOiBTdGVwRXhlY3V0b3JQYXJhbXNcbik6IFByb21pc2U8U3RlcEV4ZWN1dGlvblJlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgd29ybGQsXG4gICAgd29ya2Zsb3dSdW5JZCxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgc3RlcElkLFxuICAgIHN0ZXBOYW1lLFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcbiAgLy8gR2F0ZSBwYXlsb2FkIGNvbXByZXNzaW9uIG9uIHRoZSBydW4ncyBzcGVjVmVyc2lvbi5cbiAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgIChwYXJhbXMucnVuU3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuXG4gIGNvbnN0IHNwYW5OYW1lID0gYHN0ZXAuZXhlY3V0ZSAke3N0ZXBEaXNwbGF5TmFtZShzdGVwTmFtZSl9YDtcbiAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCB7fSwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZCh3b3JrZmxvd1J1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICB9KTtcblxuICAgIC8vIE1lbW9pemVkIGFjY2Vzc29yIGZvciB0aGUgcGVyLXJ1biBlbmNyeXB0aW9uIGtleS4gVGhlIGZpcnN0IGNhbGxlclxuICAgIC8vIChpbnB1dCBoeWRyYXRpb24gb24gdGhlIHN1Y2Nlc3MgcGF0aCwgb3Igb25lIG9mIHRoZSBlYXJseS1yZXR1cm5cbiAgICAvLyBkZWh5ZHJhdGVTdGVwRXJyb3IgcGF0aHMgaWYgc3RlcF9zdGFydGVkIGZhaWxzKSB0cmlnZ2VycyB0aGUgYWN0dWFsXG4gICAgLy8gZmV0Y2ggLyBIS0RGIGRlcml2YXRpb247IHN1YnNlcXVlbnQgY2FsbGVycyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuXG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcblxuICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwTmFtZSk7XG4gICAgaWYgKCFzdGVwRm4gfHwgdHlwZW9mIHN0ZXBGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCDigJQgZmFpbCB0aGUgc3RlcCBpbW1lZGlhdGVseSAobm90IHRoZSBydW4pLlxuICAgICAgLy8gQ3JlYXRlIGEgc3RlcF9mYWlsZWQgZXZlbnQgc29cbiAgICAgIC8vIHRoZSB3b3JrZmxvdyBjYW4gaGFuZGxlIGl0IGdyYWNlZnVsbHkgdmlhIHRyeS9jYXRjaCBpbiB1c2VyIGNvZGUuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgZGVwbG95bWVudC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIGJ1aWxkIG9yIGJ1bmRsaW5nIGlzc3VlIHRoYXQgY2F1c2VkIHRoZSBzdGVwIHRvIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGVwbG95bWVudC5gO1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgc3RlcElkLFxuICAgICAgfSk7XG4gICAgICAvLyBPbiB0aGUgbGF6eSBpbmxpbmUgcGF0aCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoaXMgc3RlcCdzXG4gICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgZXhwZWN0aW5nIGV4ZWN1dGVTdGVwIHRvIG1hdGVyaWFsaXplIHRoZSBzdGVwIHZpYSBhXG4gICAgICAvLyBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGNhcnJ5aW5nIGl0cyBpbnB1dC4gV2UgbmV2ZXIgZ2V0IHRoYXQgZmFyIGZvciBhblxuICAgICAgLy8gdW5yZWdpc3RlcmVkIHN0ZXAsIHNvIHRoZSBzdGVwIGVudGl0eSBkb2VzIG5vdCBleGlzdCB5ZXQg4oCUIHdyaXRpbmdcbiAgICAgIC8vIGBzdGVwX2ZhaWxlZGAgc3RyYWlnaHQgYXdheSB3b3VsZCBoaXQgdGhlIHdvcmxkJ3MgXCJzdGVwIG11c3QgZXhpc3RcIlxuICAgICAgLy8gb3JkZXJpbmcgZ3VhcmQgYW5kIHdlZGdlIHRoZSBydW4uIFNlbmQgdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgZmlyc3RcbiAgICAgIC8vIChpdCBjcmVhdGVzIHRoZSBzdGVwICsgc3ludGhldGljIGBzdGVwX2NyZWF0ZWRgIGF0b21pY2FsbHkgYW5kIGtlZXBzXG4gICAgICAvLyByZXBsYXkgY29ycmVjdCksIHRoZW4gZmFpbCBpdCBiZWxvdy4gVGhpcyBhbHNvIHByZXNlcnZlcyB0aGVcbiAgICAgIC8vIGV4YWN0bHktb25lLW93bmVyIGd1YXJhbnRlZTogYSBjb25jdXJyZW50IGhhbmRsZXIgdGhhdCB3b24gdGhlIGNyZWF0ZVxuICAgICAgLy8gbWFrZXMgb3VyIGxhenkgYHN0ZXBfc3RhcnRlZGAgcmVqZWN0IHdpdGggRW50aXR5Q29uZmxpY3RFcnJvciDihpIgd2VcbiAgICAgIC8vIHJldHVybiBgc2tpcHBlZGAgYW5kIG5ldmVyIHdyaXRlIHRoZSBmYWlsdXJlIHR3aWNlLlxuICAgICAgaWYgKHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUdXJibzogdGhpcyBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG11c3Qgbm90IHByZWNlZGUgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAuIE9yZGVyIGl0IGFmdGVyIHRoZSBydW4tcmVhZHkgYmFycmllciAoYmVzdC1lZmZvcnQg4oCUXG4gICAgICAgICAgLy8gYSBiYXJyaWVyIHJlamVjdGlvbiBtZWFucyB0aGUgcnVuIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGUgY3JlYXRlXG4gICAgICAgICAgLy8gYmVsb3cgc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IpLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgIGlmIChwYXJhbXMucnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICBhd2FpdCBwYXJhbXMucnVuUmVhZHlCYXJyaWVyLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh3b3JrZmxvd1J1bklkLCB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgLy8gU3RhbXBlZCBmb3IgY29uc2lzdGVuY3kgZXZlbiB0aG91Z2ggdGhpcyBzdGVwIHRlcm1pbmFsLWZhaWxzXG4gICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJlbG93IOKAlCB0aGUgbG9nIHNob3VsZCBuZXZlciBzaG93IGFuIHVub3duZWRcbiAgICAgICAgICAgICAgLy8gbGF6eSBzdGFydC5cbiAgICAgICAgICAgICAgLi4uKHBhcmFtcy5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RhcnRFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGFydEVycikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKHN0YXJ0RXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHN0YXJ0RXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXMgPz8gREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgfSk7XG5cbiAgICAvLyBtYXhSZXRyaWVzIGVuZm9yY2VkIGJlZm9yZSBzdGFydGluZyBhbm90aGVyIGF0dGVtcHQuIFRpbWVvdXRzIGNhbiBraWxsXG4gICAgLy8gYSBzdGVwIGV4ZWN1dGlvbiB3aXRob3V0IGFueSB3YXkgdG8gY2F0Y2ggdGhlIGVycm9yLCBzbyB0aGUgcG9zdC1ib2R5L2Vycm9yXG4gICAgLy8gZ3VhcmRzIGJlbG93IG1pZ2h0IG1pc3MgaXQuIEhlbmNlLCB3ZSB1c2UgYGF1dGhvcml0YXRpdmVBdHRlbXB0YCBjb3VudFxuICAgIC8vIGFzIGFuIGFkZGl0aW9uYWwgZ3VhcmQgYmFzZWQgb24gc3RlcF9zdGFydGVkIGNvdW50IG9yIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50XG4gICAgLy8gb24gYmFja2dyb3VuZGVkIHN0ZXBzLlxuICAgIC8vIFRocm93bi1lcnJvciBleGhhdXN0aW9uIHN0aWxsIHRlcm1pbmF0ZXMgb25lIGF0dGVtcHQgZWFybGllciB2aWEgdGhlIHBvc3QtYm9keVxuICAgIC8vIGd1YXJkICh3aXRoIHRoZSB0aHJvd24gZXJyb3IgYXMgY2F1c2UpLCBhbmQgdGhpcyBjaGVjayBkb2VzIG5vdCBhZmZlY3QgdGhhdC5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuYXV0aG9yaXRhdGl2ZUF0dGVtcHQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmF1dGhvcml0YXRpdmVBdHRlbXB0ID4gbWF4UmV0cmllcyArIDFcbiAgICApIHtcbiAgICAgIGNvbnN0IHJldHJ5Q291bnQgPSBtYXhSZXRyaWVzO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgXCIke3N0ZXBOYW1lfVwiIGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWA7XG4gICAgICBzdGVwTG9nZ2VyLmVycm9yKCdTdGVwIGV4Y2VlZGVkIG1heCByZXRyaWVzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgc3RlcElkLFxuICAgICAgICBhdHRlbXB0OiBwYXJhbXMuYXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgIG1heFJldHJpZXMsXG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSAoYSBjb25jdXJyZW50IGhhbmRsZXIgb3IgYW5cbiAgICAgICAgICAvLyBlYXJsaWVyIGRlbGl2ZXJ5IGZhaWxlZC9jb21wbGV0ZWQgaXQpIOKAlCBub3RoaW5nIHRvIGRvLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAgZm9yIGV4Y2VlZGVkIHJldHJpZXMsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgLy8gTWFwcyBhIGBzdGVwX3N0YXJ0ZWRgIHJlamVjdGlvbiB0byBhIHRlcm1pbmFsIFN0ZXBFeGVjdXRpb25SZXN1bHQsXG4gICAgLy8gc2hhcmVkIGJ5IHRoZSBhd2FpdCBwYXRoIChiZWxvdykgYW5kIHRoZSBvcHRpbWlzdGljLXN0YXJ0IHJlY29uY2lsaWF0aW9uLlxuICAgIC8vIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGVycm9yIGlzIG5vdCBvbmUgd2UgdHJhbnNsYXRlIChjYWxsZXIgcmV0aHJvd3MpLlxuICAgIGNvbnN0IHN0YXJ0RXJyb3JUb1Jlc3VsdCA9IChcbiAgICAgIGVycjogdW5rbm93blxuICAgICk6IFN0ZXBFeGVjdXRpb25SZXN1bHQgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgaWYgKFRocm90dGxlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgMSxcbiAgICAgICAgICB0eXBlb2YgZXJyLnJldHJ5QWZ0ZXIgPT09ICdudW1iZXInID8gZXJyLnJldHJ5QWZ0ZXIgOiAxXG4gICAgICAgICk7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnVGhyb3R0bGVkIG9uIHN0ZXBfc3RhcnRlZCwgZGVmZXJyaW5nJywge1xuICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeUFmdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3Rocm90dGxlZCcsIHRpbWVvdXRTZWNvbmRzOiByZXRyeUFmdGVyIH07XG4gICAgICB9XG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3dvcmtmbG93UnVuSWR9XCIgaGFzIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwIFwiJHtzdGVwSWR9XCI6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgc2tpcHBpbmcnLCB7XG4gICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcHBlZCh0cnVlKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBSZWFzb24oJ2NvbXBsZXRlZCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAoVG9vRWFybHlFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHlldCByZWFjaGVkJywge1xuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXRyeScsIHRpbWVvdXRTZWNvbmRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvLyBPcHRpbWlzdGljIGlubGluZSBzdGFydDogd2hlbiB3ZSBob2xkIHRoZSBzdGVwIGlucHV0IGxvY2FsbHkgKGxhenkgaW5saW5lXG4gICAgLy8gcGF0aCkgYW5kIHRoZSBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZCwgZmlyZSBgc3RlcF9zdGFydGVkYCBXSVRIT1VUXG4gICAgLy8gYXdhaXRpbmcgYW5kIHJ1biB0aGUgYm9keSBhZ2FpbnN0IGxvY2FsbHktc3ludGhlc2l6ZWQgc3RhdGUuIEEgbGF6eSBzdGVwXG4gICAgLy8gaXMgYWx3YXlzIGJyYW5kLW5ldyDih5IgYXR0ZW1wdCAxLCBubyBwcmlvciBlcnJvciwgc3RhcnRlZCBub3cg4oCUIHNvIHdlXG4gICAgLy8gZG9uJ3QgbmVlZCB0aGUgc2VydmVyIHJvdW5kLXRyaXAgdG8gYmVnaW4uIFdlIHJlY29uY2lsZSB0aGUgaW4tZmxpZ2h0XG4gICAgLy8gYHN0ZXBfc3RhcnRlZGAgYmVmb3JlIGFueSB0ZXJtaW5hbCB3cml0ZSAoYHJlY29uY2lsZU9wdGltaXN0aWNTdGFydGApOiBpZlxuICAgIC8vIGl0IGxvc3QgdGhlIGF0b21pYyBjcmVhdGUtY2xhaW0gKDQwOSkgb3IgdGhlIHJ1biBpcyBnb25lL3Rocm90dGxlZCwgd2VcbiAgICAvLyBkaXNjYXJkIHRoZSBib2R5IHJlc3VsdC4gUnVubmluZyB0aGUgYm9keSBiZWZvcmUgY29uZmlybWluZyBvd25lcnNoaXAgY2FuXG4gICAgLy8gZXhlY3V0ZSBhIHN0ZXAgbW9yZSB0aGFuIG9uY2Ugd2hlbiBoYW5kbGVycyByYWNlIOKAlCBpbmxpbmUgc3RlcCBib2RpZXNcbiAgICAvLyBtdXN0IGJlIGlkZW1wb3RlbnQ7IGRpc2FibGUgdmlhIFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUPTAuXG4gICAgLy9cbiAgICAvLyBUdXJibyBtb2RlIHBhc3NlcyBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIHRvIGVuYWJsZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgLy8gZW52IGZsYWcgKGl0cyBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgcmVtb3ZlcyB0aGUgcmFjZSkuIEJ1dCBpdCBzdGlsbFxuICAgIC8vIGRlZmVycyB0byBhbiAqZXhwbGljaXQqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wYDogZm9yY2VkXG4gICAgLy8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoZSBib2R5IGJlZm9yZSBgc3RlcF9zdGFydGVkYC9gcnVuX3N0YXJ0ZWRgIGlzXG4gICAgLy8gY29uZmlybWVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9wZXJ0eSBhbiBvcGVyYXRvciBvcHRzIG91dCBvZiB3aXRoIHRoYXRcbiAgICAvLyBmbGFnLCBzbyBhbiBleHBsaWNpdCBvcHQtb3V0IHdpbnMgb3ZlciB0dXJibydzIGZvcmNlLlxuICAgIGNvbnN0IG9wdGltaXN0aWNTdGFydCA9XG4gICAgICBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAvLyBTdGFsZS1zZW5zaXRpdmUgZ3VhcmRlZCBiYXRjaGVzIGF3YWl0IHRoZSBjbGFpbSBzbyB0aGUgNDEyIGZlbmNlXG4gICAgICAvLyBjb3ZlcnMgdGhlIGJvZHksIG5vdCBqdXN0IGR1cmFibGUgd3JpdGVzIOKAlCBzZWVcbiAgICAgIC8vIFN0ZXBFeGVjdXRvclBhcmFtcy5zdXBwcmVzc09wdGltaXN0aWNTdGFydC5cbiAgICAgIHBhcmFtcy5zdXBwcmVzc09wdGltaXN0aWNTdGFydCAhPT0gdHJ1ZSAmJlxuICAgICAgKGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RW5hYmxlZCgpIHx8XG4gICAgICAgIChwYXJhbXMuZm9yY2VPcHRpbWlzdGljU3RhcnQgPT09IHRydWUgJiZcbiAgICAgICAgICAhaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKSkpO1xuXG4gICAgbGV0IHN0ZXA6IFN0ZXA7XG4gICAgLy8gYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgYHN0ZXBfc3RhcnRlZGAgY3JlYXRlIGlzXG4gICAgLy8gaXNzdWVkIChlaXRoZXIgcGF0aCBiZWxvdykg4oCUIGFuY2hvcnMgUlNGUydzIGVuZCBwb2ludC4gU2VlXG4gICAgLy8gU3RlcExhdGVuY3lFdmVudERhdGEucnNmcyBhbmQgdGhlIGNhbGwgc2l0ZXMgYmVsb3cuXG4gICAgbGV0IHN0ZXBTdGFydFBvc3RTZW50QXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHRsZWQgb3V0Y29tZSBvZiB0aGUgaW4tZmxpZ2h0IG9wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAuIEhhbmRsZXJzIGFyZVxuICAgIC8vIGF0dGFjaGVkIHN5bmNocm9ub3VzbHkgKGAudGhlbihvaywgZXJyKWApIHNvIGEgZmFzdCByZWplY3Rpb24gbmV2ZXJcbiAgICAvLyBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gd2hpbGUgdGhlIGJvZHkgcnVucy5cbiAgICBsZXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDpcbiAgICAgIHwgUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgZXJyOiB1bmtub3duIH0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICAvLyBBd2FpdCB0aGUgb3B0aW1pc3RpYyBgc3RlcF9zdGFydGVkYCBvdXRjb21lIGFuZCB0cmFuc2xhdGUgYSBsb3N0IHJhY2UgL1xuICAgIC8vIHRlcm1pbmFsIHJ1biAvIHRocm90dGxlIGludG8gYSByZXN1bHQgdGhhdCBzaG9ydC1jaXJjdWl0cyB0aGUgYm9keVxuICAgIC8vIG91dHB1dC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB3ZSBvd24gdGhlIHN0ZXAgYW5kIG1heSB3cml0ZSBpdHMgdGVybWluYWxcbiAgICAvLyBldmVudC4gQSBub24tdHJhbnNsYXRhYmxlIHJlamVjdGlvbiBpcyByZXRocm93biAoc28gYSB0cmFuc2llbnRcbiAgICAvLyBzdGVwX3N0YXJ0ZWQgZmFpbHVyZSBwcm9wYWdhdGVzIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZWRlbGl2ZXJ5LFxuICAgIC8vIGV4YWN0bHkgYXMgb24gdGhlIGF3YWl0IHBhdGgpLiBJZGVtcG90ZW50IOKAlCBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gICAgY29uc3QgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0ID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIW9wdGltaXN0aWNTdGFydFNldHRsZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDtcbiAgICAgIGlmIChzZXR0bGVkLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KHNldHRsZWQuZXJyKTtcbiAgICAgIGlmICghbWFwcGVkKSB0aHJvdyBzZXR0bGVkLmVycjtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfTtcblxuICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgIC8vIENoYWluIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG9uIHRoZSBydW4tcmVhZHkgYmFycmllciAodHVyYm8gbW9kZSk6XG4gICAgICAvLyB0aGUgc3RlcCBjYW4ndCBiZSBjcmVhdGVkIGJlZm9yZSBpdHMgcnVuIGV4aXN0cywgYnV0IHRoZSBib2R5IGJlbG93XG4gICAgICAvLyBydW5zIGltbWVkaWF0ZWx5IGFnYWluc3Qgc3ludGhlc2l6ZWQgc3RhdGUsIHNvIHRoZSBgcnVuX3N0YXJ0ZWRgXG4gICAgICAvLyByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5IHJhdGhlciB0aGFuIGJsb2NraW5nIGl0LiBPdXRzaWRlIHR1cmJvIHRoZVxuICAgICAgLy8gYmFycmllciBpcyB1bmRlZmluZWQgYW5kIHRoaXMgaXMgYSBwbGFpbiBjcmVhdGUuXG4gICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IChwYXJhbXMucnVuUmVhZHlCYXJyaWVyID8/IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gVGFrZW4gcmlnaHQgYmVmb3JlIHRoZSBjcmVhdGUgZmlyZXMsIG5vdCBiZWZvcmUgdGhlIGJhcnJpZXIg4oCUXG4gICAgICAgICAgLy8gUlNGUyBtZWFzdXJlcyB0aGUgcnVuX3N0YXJ0ZWQtdG8tUE9TVCBzdHJldGNoLCBhbmQgdGhlIGJhcnJpZXJcbiAgICAgICAgICAvLyB3YWl0IElTIHBhcnQgb2YgdGhhdCBzdHJldGNoIHVuZGVyIHR1cmJvLlxuICAgICAgICAgIHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmV0dXJuIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YW1wIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLm93bmVyTWVzc2FnZUlkLlxuICAgICAgICAgICAgICAgIC4uLihwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gR3VhcmQgdGhlIGNsYWltIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLnN0YXRlVXBkYXRlZEF0LiBBIHN0YWxlXG4gICAgICAgICAgICAvLyAoNDEyKSByZWplY3Rpb24gc3VyZmFjZXMgdmlhIHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCBhcyBhXG4gICAgICAgICAgICAvLyBub24tdHJhbnNsYXRhYmxlIGVycm9yOiB0aGUgYm9keSByZXN1bHQgaXMgZGlzY2FyZGVkIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIHJlamVjdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICBwYXJhbXMuc3RhdGVVcGRhdGVkQXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHsgc3RhdGVVcGRhdGVkQXQ6IHBhcmFtcy5zdGF0ZVVwZGF0ZWRBdCB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIG9wdGltaXN0aWNTdGFydFNldHRsZWQgPSBzdGFydGVkUHJvbWlzZS50aGVuKFxuICAgICAgICAoKSA9PiAoeyBvazogdHJ1ZSBhcyBjb25zdCB9KSxcbiAgICAgICAgKGVycikgPT4gKHsgb2s6IGZhbHNlIGFzIGNvbnN0LCBlcnIgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgc3RlcCA9IHtcbiAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICBpbnB1dDogcGFyYW1zLmxhenlTdGVwSW5wdXQsXG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eS4gT24gdGhlIGxhenlcbiAgICAgIC8vIGlubGluZSBwYXRoIHdlIGFsc28gY2FycnkgdGhlIHN0ZXAgYGlucHV0YCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGVcbiAgICAgIC8vIHN0ZXAgb24gdGhlIGZseSAobm8gc2VwYXJhdGUgc3RlcF9jcmVhdGVkIHJvdW5kLXRyaXApLiBUaGUgd29ybGQnc1xuICAgICAgLy8gYXRvbWljIGNyZWF0ZS1jbGFpbSBtYWtlcyB0aGlzIGV4YWN0bHktb25lLW93bmVyOiBhIGNvbmN1cnJlbnQgbG9zZXJcbiAgICAgIC8vIGdldHMgRW50aXR5Q29uZmxpY3RFcnJvciwgbWFwcGVkIHRvIGB7IHR5cGU6ICdza2lwcGVkJyB9YCwgc28gaXQgbmV2ZXJcbiAgICAgIC8vIHJ1bnMgdGhlIGJvZHkuIFdoZW4gYGxhenlTdGVwSW5wdXRgIGlzIGFic2VudCB0aGlzIGlzIHRoZSBsZWdhY3lcbiAgICAgIC8vIHN0ZXBfc3RhcnRlZCAoc3RlcCBhbHJlYWR5IGNyZWF0ZWQsIG5vIHBheWxvYWQpLlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBzdGFtcDogcHJlc2VudCBvbiB0aGUgbGF6eSBwYXRocyBBTkQgb24gdGhlXG4gICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHBheWxvYWQtbGVzcyBzdGFydCAoYSByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmdcbiAgICAgICAgLy8gbWVzc2FnZSByZS1leGVjdXRpbmcgaXRzIHN0ZXAgbXVzdCByZS1zdGFtcCDigJQgb3duZXJzaGlwIGRlcml2ZXNcbiAgICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHN0YXJ0LCBzbyBhbiB1bnN0YW1wZWQgcmVjb3Zlcnkgc3RhcnQgd291bGQgcmVhZFxuICAgICAgICAvLyBhcyBcInVub3duZWRcIiB0byBhIGxhdGVyIHdha2UpLiBPbmx5IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aFxuICAgICAgICAvLyBwYXNzZXMgbm8gb3duZXJNZXNzYWdlSWQ6IGl0cyBzdGFydCBpcyB0aGUgYmFyZSBvbmUsIGNsZWFyaW5nXG4gICAgICAgIC8vIG93bmVyc2hpcCBhcyBpbnRlbmRlZC5cbiAgICAgICAgY29uc3Qgb3duZXJzaGlwU3RhbXAgPVxuICAgICAgICAgIHBhcmFtcy5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgb3duZXJNZXNzYWdlSWQ6IHBhcmFtcy5vd25lck1lc3NhZ2VJZCB9XG4gICAgICAgICAgICA6IHt9O1xuICAgICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBzdGFydFJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgZXZlbnREYXRhOlxuICAgICAgICAgICAgICBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgLi4ub3duZXJzaGlwU3RhbXAsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7IHN0ZXBOYW1lLCAuLi5vd25lcnNoaXBTdGFtcCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gR3VhcmQgdGhlIGNsYWltIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLnN0YXRlVXBkYXRlZEF0LiBBIHN0YWxlXG4gICAgICAgICAgLy8gKDQxMikgcmVqZWN0aW9uIGlzIGludGVudGlvbmFsbHkgTk9UIHRyYW5zbGF0ZWQgYnlcbiAgICAgICAgICAvLyBzdGFydEVycm9yVG9SZXN1bHQgYmVsb3csIHNvIGl0IHByb3BhZ2F0ZXMgdG8gdGhlIGNhbGxlciBmb3IgYVxuICAgICAgICAgIC8vIGZyZXNoIHJlcGxheS5cbiAgICAgICAgICBwYXJhbXMuc3RhdGVVcGRhdGVkQXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHN0YXRlVXBkYXRlZEF0OiBwYXJhbXMuc3RhdGVVcGRhdGVkQXQgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXN0YXJ0UmVzdWx0LnN0ZXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgc3RlcF9zdGFydGVkIGV2ZW50IGZvciBcIiR7c3RlcElkfVwiIGRpZCBub3QgcmV0dXJuIHN0ZXAgZW50aXR5YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc3RlcCA9IHN0YXJ0UmVzdWx0LnN0ZXA7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KGVycik7XG4gICAgICAgIGlmIChtYXBwZWQpIHJldHVybiBtYXBwZWQ7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIGV4ZWN1dGlvbiBkZXRhaWxzJywge1xuICAgICAgc3RlcE5hbWUsXG4gICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICB9KTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoc3RlcC5zdGF0dXMpLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZCkuXG4gICAgLy8gT25seSBlbmZvcmNlIHdoZW4gdGhlIHN0ZXAgaGFzIGEgcHJldmlvdXMgZXJyb3Ig4oCUIHRoaXMgZGlzdGluZ3Vpc2hlc1xuICAgIC8vIGFjdHVhbCByZXRyaWVzIChmYWlsZWQg4oaSIHJldHJ5KSBmcm9tIGNvbmN1cnJlbnQgaW5saW5lIHN0YXJ0c1xuICAgIC8vIGV4ZWN1dGlvbiBsb29wIGNhbiBjYXVzZSBtdWx0aXBsZSBoYW5kbGVycyB0byBzdGVwX3N0YXJ0ZWQgdGhlIHNhbWVcbiAgICAvLyBzdGVwIHNpbXVsdGFuZW91c2x5LCBpbmZsYXRpbmcgdGhlIGF0dGVtcHQgY291bnRlciB3aXRob3V0IGFueSBmYWlsdXJlKS5cbiAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEgJiYgc3RlcC5lcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICByZXRyeUNvdW50LFxuICAgICAgfSk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpb3IgYXR0ZW1wdCdzIHNlcmlhbGl6ZWQgZXJyb3IgYXMgdGhlIGNhdXNlIHNvIHRoZVxuICAgICAgLy8gdW5kZXJseWluZyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlIGZyb20gYHN0ZXAuZXJyb3IuY2F1c2VgIGFmdGVyXG4gICAgICAvLyBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGUgc3RlcF9yZXRyeWluZ1xuICAgICAgLy8gZXZlbnQgaGlzdG9yeS4gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBvZiB0aGUgcHJpb3IgYHN0ZXAuZXJyb3JgXG4gICAgICAvLyB0aHJvd3MsIGZhbGwgYmFjayB0byBhIEZhdGFsRXJyb3Igd2l0aG91dCBjYXVzZS5cbiAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBhd2FpdCBoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUg4oCUIGJlc3QtZWZmb3J0IGNhdXNlIGF0dGFjaG1lbnQuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgLy8gT3BzIHRoYXQgbXVzdCBiZSBkdXJhYmx5IGNvbW1pdHRlZCBiZWZvcmUgc3RlcCBjb21wbGV0aW9uIChlLmcuIGFcbiAgICAvLyBzdGVwLWluaXRpYXRlZCBhYm9ydCdzIGhvb2tfcmVjZWl2ZWQgZXZlbnQpLiBTZWUgU3RlcENvbnRleHQuIERlY2xhcmVkXG4gICAgLy8gb3V0c2lkZSB0aGUgdHJ5IHNvIHRoZSBmYWlsdXJlIHBhdGggYmVsb3cgY2FuIGFsc28gZHJhaW4gdGhlbS5cbiAgICBjb25zdCBwcmVDb21wbGV0aW9uT3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGxldCBvcHNTZXR0bGVkID0gdHJ1ZTtcblxuICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IHRvIGF0dGFjaCB0byB0aGlzIHN0ZXAncyB0ZXJtaW5hbCBldmVudC4gQ29tcHV0ZWRcbiAgICAvLyByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnM7IGRlY2xhcmVkIGhlcmUgc28gdGhlIGZhaWx1cmUgcGF0aCAodGhlXG4gICAgLy8gY2F0Y2ggYmVsb3cpIGNhbiBhdHRhY2ggaXQgdG8gc3RlcF9mYWlsZWQgdG9vLlxuICAgIGxldCBsYXRlbmN5RXZlbnREYXRhOiBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEJhY2tmaWxsIFJTRlMgb250byB0aGUgYWxyZWFkeS1jb21wdXRlZCB0ZWxlbWV0cnkgb25jZSB0aGUgb3B0aW1pc3RpY1xuICAgIC8vIHR1cmJvIHN0YXJ0IGhhcyBzZXR0bGVkLiBPbiB0aGF0IHBhdGggdGhlIHN0ZXAtc3RhcnQgUE9TVCBmaXJlcyBpbnNpZGVcbiAgICAvLyB0aGUgcnVuLXJlYWR5IGJhcnJpZXIncyBgLnRoZW5gLCBzbyBgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zYCDigJQgYW5kXG4gICAgLy8gdGhlcmVmb3JlIFJTRlMg4oCUIGlzIHVzdWFsbHkgc3RpbGwgdW5zZXQgd2hlbiBgbGF0ZW5jeUV2ZW50RGF0YWAgaXNcbiAgICAvLyBmaXJzdCBjb21wdXRlZCBqdXN0IGJlZm9yZSB1c2VyIGNvZGUgKHRoZSBiYXJyaWVyIGlzIHN0aWxsIGluIGZsaWdodFxuICAgIC8vIGZvciBhbnkgbm9uLXRyaXZpYWwgYHJ1bl9zdGFydGVkYCByb3VuZC10cmlwLCB3aGljaCBpcyBleGFjdGx5IHRoZVxuICAgIC8vIHNsb3ctcnVuX3N0YXJ0ZWQgY2FzZSBSU0ZTIGV4aXN0cyB0byBtZWFzdXJlKS4gQnkgdGhlIHRpbWVcbiAgICAvLyBgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KClgIGhhcyBhd2FpdGVkIHRoZSBiYXJyaWVyIHRoZSBQT1NUIHRpbWVzdGFtcFxuICAgIC8vIGlzIGtub3duLCBzbyB3ZSBwYXRjaCBSU0ZTIGluIGJlZm9yZSB0aGUgdGVybWluYWwgZXZlbnQgaXMgd3JpdHRlbi5cbiAgICAvLyBXaXRob3V0IHRoaXMsIHNsb3ctcnVuX3N0YXJ0ZWQgc2FtcGxlcyBhcmUgZHJvcHBlZCwgYmlhc2luZyBSU0ZTXG4gICAgLy8gcGVyY2VudGlsZXMgbG93IChtaXNzaW5nLW5vdC1hdC1yYW5kb20pLiBSZWNvbXB1dGVzIG9ubHkgUlNGUyDigJRcbiAgICAvLyBUVEZTL1NUU08gc3RheSBhbmNob3JlZCB0byBgZXhlY3V0aW9uU3RhcnRUaW1lYCBhcyBjb21wdXRlZCBhYm92ZS5cbiAgICBjb25zdCBiYWNrZmlsbE9wdGltaXN0aWNSc2ZzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFsYXRlbmN5RXZlbnREYXRhIHx8IGxhdGVuY3lFdmVudERhdGEucnNmcyAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3JNcyA9IHBhcmFtcy5sYXRlbmN5VHJhY2tpbmc/LnJzZnNBbmNob3JNcztcbiAgICAgIGlmIChhbmNob3JNcyA9PT0gdW5kZWZpbmVkIHx8IHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBsYXRlbmN5RXZlbnREYXRhLnJzZnMgPSBNYXRoLm1heCgwLCBzdGVwU3RhcnRQb3N0U2VudEF0TXMgLSBhbmNob3JNcyk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUnNmc01zKGxhdGVuY3lFdmVudERhdGEucnNmcyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYFN0ZXAgXCIke3N0ZXBJZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGVwU3RhcnRlZEF0ID0gc3RlcC5zdGFydGVkQXQ7XG4gICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIGVuY3J5cHRpb24ga2V5IHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgcmVzb2x2ZVxuICAgICAgLy8gdGhyb3VnaCB0aGUgbWVtb2l6ZWQgYWNjZXNzb3IgZGVjbGFyZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHRyYWNlLlxuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHBhcmFtcy5lbmNyeXB0aW9uS2V5ID8/IChhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCkpO1xuICAgICAgY29uc3QgaHlkcmF0ZWRJbnB1dCA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAnc3RlcC5oeWRyYXRlJyxcbiAgICAgICAge30sXG4gICAgICAgIGFzeW5jIChoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHBhcmFtcy53b3JrZmxvd0RlcGxveW1lbnRJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBcmd1bWVudHNDb3VudChoeWRyYXRlZC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFyZ3MgPSBoeWRyYXRlZElucHV0LmFyZ3M7XG4gICAgICBjb25zdCB0aGlzVmFsID0gaHlkcmF0ZWRJbnB1dC50aGlzVmFsID8/IG51bGw7XG4gICAgICBjb25zdCB3b3JrZmxvd0Jhc2VVcmwgPSBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwoXG4gICAgICAgIGlzVmVyY2VsXG4gICAgICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHsoYXdhaXQgZ2V0UG9ydExhenkoKSkgPz8gMzAwMH1gXG4gICAgICApO1xuXG4gICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgIC8vIFdyYXAgb25seSBzdGVwRm4uYXBwbHkoKSAodXNlciBzdGVwIGNvZGUpIHNvIGNsZWFudXAgYmVsb3cgcnVucyBvblxuICAgICAgLy8gQk9USCBzdWNjZXNzIGFuZCBmYWlsdXJlLiBBIHVzZXItY29kZSB0aHJvdyBpcyBjYXB0dXJlZCBoZXJlIGFuZFxuICAgICAgLy8gcmUtcmFpc2VkIGFmdGVyIGNhbmNlbEFib3J0UmVhZGVycywgc28gaXQgc3RpbGwgZmxvd3MgdG8gdGhlIG91dGVyXG4gICAgICAvLyBjYXRjaCAoc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZykg4oCUIGJ1dCB0aGUgYWJvcnQtc3RyZWFtIHJlYWRlciBpc1xuICAgICAgLy8gdG9ybiBkb3duIGZpcnN0LiBXaXRob3V0IHRoaXMsIGEgdGhyb3dpbmcvcmV0cnlpbmcgc2lnbmFsLWJlYXJpbmdcbiAgICAgIC8vIHN0ZXAgd291bGQgbGVhayBhIHJlYWwtdGltZSBhYm9ydCByZWFkZXIgcGVyIGF0dGVtcHQuXG4gICAgICBsZXQgdXNlckNvZGVFcnJvcjogdW5rbm93bjtcbiAgICAgIGxldCB1c2VyQ29kZUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbGF0ZW5jeUV2ZW50RGF0YSA9IGNvbXB1dGVTdGVwTGF0ZW5jeUV2ZW50RGF0YSh7XG4gICAgICAgIHRyYWNraW5nOiBwYXJhbXMubGF0ZW5jeVRyYWNraW5nLFxuICAgICAgICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBleGVjdXRpb25TdGFydFRpbWUsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIGxhenlTdGVwU3RhcnQ6IHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgIG9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zLFxuICAgICAgfSk7XG4gICAgICBpZiAobGF0ZW5jeUV2ZW50RGF0YSkge1xuICAgICAgICAvLyBNaXJyb3IgdGhlIGxhdGVuY3kgdGVsZW1ldHJ5IG9udG8gdGhlIHN0ZXAgc3BhbiBzbyB0cmFjZXMgc2hvd1xuICAgICAgICAvLyBUVEZTL1NUU08vUlNGUyBhbG9uZ3NpZGUgdGhlIGZsYW1lIGdyYXBoLCBub3QganVzdCBEYXRhZG9nIG1ldHJpY3MuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLnR0ZnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcFR0ZnNNcyhsYXRlbmN5RXZlbnREYXRhLnR0ZnMpXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS5zdHNvICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBTdHNvTXMobGF0ZW5jeUV2ZW50RGF0YS5zdHNvKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEucnNmcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwUnNmc01zKGxhdGVuY3lFdmVudERhdGEucnNmcylcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLmZpbmFsU2NoZWR1bGluZ1JlcGxheSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwRmluYWxTY2hlZHVsaW5nUmVwbGF5TXMoXG4gICAgICAgICAgICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5maW5hbFNjaGVkdWxpbmdSZXBsYXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBMYXRlbmN5T3B0aW1pemF0aW9ucyhcbiAgICAgICAgICAgIGxhdGVuY3lFdmVudERhdGEub3B0aW1pemF0aW9ucyA/PyBbXVxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZXhlY3V0ZScsIHt9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRleHRTdG9yYWdlLnJ1bihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBTdGFydGVkQXQ6IG5ldyBEYXRlKCtzdGVwU3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyBEYXRlKCt3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgdXJsOiB3b3JrZmxvd0Jhc2VVcmwsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHJvb3RSdW5JZDogcGFyYW1zLnJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICBwcmVDb21wbGV0aW9uT3BzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoaXMgYm9keSBiZWZvcmUgYHJ1bl9zdGFydGVkYCBpc1xuICAgICAgICAgICAgICAvLyBkdXJhYmxlLiBFeHBvc2UgdGhlIGJhcnJpZXIgc28gYSBkaXJlY3Qgc3RlcC1ib2R5IHdvcmxkIHdyaXRlXG4gICAgICAgICAgICAgIC8vIChlLmcuIGBzZXRBdHRyaWJ1dGVzYCkgY2FuIG9yZGVyIGl0c2VsZiBhZnRlciB0aGVcbiAgICAgICAgICAgICAgLy8gcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG9uIHRoZSBhd2FpdCBwYXRoIChydW4gYWxyZWFkeSBkdXJhYmxlKS5cbiAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyOiBvcHRpbWlzdGljU3RhcnRcbiAgICAgICAgICAgICAgICA/IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiBzdGVwRm4uYXBwbHkodGhpc1ZhbCwgYXJncylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB1c2VyQ29kZUVycm9yID0gZXJyO1xuICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleGVjdXRpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gZXhlY3V0aW9uU3RhcnRUaW1lO1xuXG4gICAgICAvLyBUZWFyIGRvd24gYW55IGFib3J0LXN0cmVhbSByZWFkZXJzIG9wZW5lZCB3aGlsZSBoeWRyYXRpbmcgdGhlIHN0ZXAnc1xuICAgICAgLy8gYXJndW1lbnRzIChhIHNlcmlhbGl6ZWQgQWJvcnRTaWduYWwgb3BlbnMgYSByZWFsLXRpbWUgYWJvcnQgcmVhZGVyIGZvclxuICAgICAgLy8gdGhlIHN0ZXAncyBkdXJhdGlvbikuIFdpdGhvdXQgdGhpcyB0aGUgcmVhZGVyJ3MgYHJlYWQoKWAgcHJvbWlzZSBuZXZlclxuICAgICAgLy8gc2V0dGxlcywgc28gdGhlIGBvcHNgIGZsdXNoIGJlbG93IGFsd2F5cyBsb3NlcyB0aGUgNTAwbXMgcmFjZSBhbmQgdGhlXG4gICAgICAvLyBzdGVwIHJlcG9ydHMgYGhhc1BlbmRpbmdPcHNgIOKAlCBmb3JjaW5nIHRoZSBpbmxpbmUgbG9vcCB0byBxdWV1ZSBhXG4gICAgICAvLyBjb250aW51YXRpb24gYW5kIHBheWluZyBhIGZ1bGwgcm91bmQtdHJpcCBwZXIgc2lnbmFsLWJlYXJpbmcgc3RlcC5cbiAgICAgIC8vIFJ1bnMgdW5jb25kaXRpb25hbGx5IChzdWNjZXNzIG9yIGZhaWx1cmUpIHNvIGEgdGhyb3dpbmcgc3RlcCBkb2Vzbid0XG4gICAgICAvLyBsZWFrIHRoZSByZWFkZXIuXG4gICAgICBjYW5jZWxBYm9ydFJlYWRlcnMoLi4uYXJncywgdGhpc1ZhbCwgaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyk7XG5cbiAgICAgIC8vIFJlLXJhaXNlIGEgdXNlci1jb2RlIGZhaWx1cmUgbm93IHRoYXQgY2xlYW51cCBoYXMgcnVuOyB0aGUgb3V0ZXJcbiAgICAgIC8vIGNhdGNoIG1hcHMgaXQgdG8gc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZy5cbiAgICAgIGlmICh1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICB0aHJvdyB1c2VyQ29kZUVycm9yO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRXhlY3V0aW9uVGltZU1zKGV4ZWN1dGlvblRpbWVNcyksXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZGVoeWRyYXRlJywge30sIGFzeW5jIChkZWh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBjb21wcmVzc2lvbixcbiAgICAgICAgICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIHJldHVybmVkIHN0cmVhbSBpcyBwaXBlZCB0byB0aGUgc2VydmVyXG4gICAgICAgICAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGlzIHNhbWUgb3AgZmx1c2gsIHNvIGdhdGUgaXRzIGZpcnN0XG4gICAgICAgICAgLy8gd3JpdGUgb24gdGhlIHJ1bi1yZWFkeSBiYXJyaWVyLiBVbmRlZmluZWQgb24gdGhlIGF3YWl0IHBhdGguXG4gICAgICAgICAgb3B0aW1pc3RpY1N0YXJ0ID8gcGFyYW1zLnJ1blJlYWR5QmFycmllciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgZGVoeWRyYXRlU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlU2VyaWFsaXplVGltZU1zKGR1cmF0aW9uTXMpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgZGVoeWRyYXRlZCksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGVoeWRyYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGbHVzaCBwZW5kaW5nIG9wcyAoc3RyZWFtIHdyaXRlcywgZXRjLikgd2l0aCBhIHNob3J0IGlubGluZSB3YWl0LlxuICAgICAgLy8gV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbSBhY2tzIHdyaXRlcyBvbiBidWZmZXIgZW50cnlcbiAgICAgIC8vIChncm91cC1jb21taXQgYmF0Y2hpbmcpOyBkdXJhYmlsaXR5IGlzIGVuZm9yY2VkIGJ5IGl0cyBkcmFpblxuICAgICAgLy8gYmFycmllciwgd2hpY2ggdGhlIGZsdXNoYWJsZSBzdGF0ZSdzIGNvbXBsZXRpb24gYXdhaXRzIGFmdGVyXG4gICAgICAvLyBsb2NrIHJlbGVhc2UuIE1vc3Qgb3BzIHNldHRsZSB3aXRoaW4gfjIwMG1zIChsb2NrLXJlbGVhc2VcbiAgICAgIC8vIHBvbGxpbmcgKyBvbmUgYmF0Y2hlZCBIVFRQIGZsdXNoKS5cbiAgICAgIC8vIElmIG9wcyBkb24ndCBzZXR0bGUgaW4gNTAwbXMgKGUuZy4sIFdyaXRhYmxlU3RyZWFtIGtlcHQgb3BlblxuICAgICAgLy8gYWNyb3NzIHN0ZXBzKSwgd2FpdFVudGlsIGhhbmRsZXMgdGhlIHJlc3QuXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgb3BzUHJvbWlzZSA9IFByb21pc2UuYWxsKG9wcyk7XG4gICAgICAgIC8vIFRoZSByYWNlIGJlbG93IHN1cmZhY2VzIGZhaWx1cmVzIGlubGluZSB3aGVuIG9wcyBzZXR0bGUgcXVpY2tseTtcbiAgICAgICAgLy8gaWYgdGhlIDUwMG1zIHRpbWVvdXQgd2lucywgdGhlIGZhaWx1cmUgaXMgb25seSBvYnNlcnZlZCBoZXJlLiBUaGVcbiAgICAgICAgLy8gcHJvbWlzZSBoYW5kZWQgdG8gd2FpdFVudGlsIG11c3QgbmV2ZXIgcmVqZWN0IChhbiB1bmNvbnN1bWVkXG4gICAgICAgIC8vIHdhaXRVbnRpbCByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLFxuICAgICAgICAvLyBzbyB1bmV4cGVjdGVkIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgICAgc2FmZVdhaXRVbnRpbChvcHNQcm9taXNlLCAoZXJyKSA9PiB7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdCYWNrZ3JvdW5kIGZsdXNoIG9mIHN0ZXAgc3RyZWFtIG9wcyBmYWlsZWQnLCB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9wc1NldHRsZWQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgIG9wc1Byb21pc2UudGhlbihcbiAgICAgICAgICAgICgpID0+IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBleHBlY3RlZCBjbGllbnQgZGlzY29ubmVjdCBlcnJvcnMgKGUuZy4sIGJyb3dzZXJcbiAgICAgICAgICAgICAgLy8gcmVmcmVzaCBkdXJpbmcgc3RyZWFtaW5nKVxuICAgICAgICAgICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICAgICAgICAgIGVycj8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8IGVycj8ubmFtZSA9PT0gJ1Jlc3BvbnNlQWJvcnRlZCc7XG4gICAgICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHJldHVybiB0cnVlIGFzIGNvbnN0O1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTxmYWxzZT4oKHIpID0+IHNldFRpbWVvdXQoKCkgPT4gcihmYWxzZSksIDUwMCkpLFxuICAgICAgICBdKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3B0aW1pc3RpYyBzdGFydDogdGhlIGJvZHkgcmFuIGJlZm9yZSBgc3RlcF9zdGFydGVkYCB3YXMgY29uZmlybWVkLlxuICAgICAgLy8gUmVjb25jaWxlIGl0IG5vdyDigJQgaWYgd2UgbG9zdCB0aGUgY3JlYXRlLWNsYWltIChvciB0aGUgcnVuIGlzXG4gICAgICAvLyBnb25lL3Rocm90dGxlZCkgZGlzY2FyZCB0aGlzIHJlc3VsdCBhbmQgZG9uJ3Qgd3JpdGUgc3RlcF9jb21wbGV0ZWQuXG4gICAgICAvLyBSZWNvbmNpbGUgYmVmb3JlIGRyYWluaW5nIHByZUNvbXBsZXRpb25PcHM6IGEgZGlzY2FyZGVkIHJlc3VsdCBtZWFuc1xuICAgICAgLy8gdGhlIHdpbm5pbmcgaGFuZGxlciBvd25zIHRoZSBvdXRjb21lIChhbmQgcmUtZmlyZXMgYW55IGFib3J0XG4gICAgICAvLyBpZGVtcG90ZW50bHkpLCBzbyB0aGVyZSdzIG5vIHBvaW50IHBheWluZyB0aGUgYWJvcnQtY29tbWl0IGxhdGVuY3kuXG4gICAgICBpZiAob3B0aW1pc3RpY1N0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHJlY29uY2lsZSA9IGF3YWl0IHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCgpO1xuICAgICAgICBpZiAocmVjb25jaWxlKSByZXR1cm4gcmVjb25jaWxlO1xuICAgICAgICAvLyBCYXJyaWVyIHJlc29sdmVkIOKAlCB0aGUgc3RlcC1zdGFydCBQT1NUIHRpbWVzdGFtcCBpcyBub3cga25vd24sIHNvXG4gICAgICAgIC8vIFJTRlMgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBzdGVwX2NvbXBsZXRlZCBldmVudCBiZWxvdy5cbiAgICAgICAgYmFja2ZpbGxPcHRpbWlzdGljUnNmcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21taXQgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGJlZm9yZSB3cml0aW5nIHN0ZXBfY29tcGxldGVkLCBzbyBhbnkgd29ya2Zsb3dcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiB0cmlnZ2VyZWQgYnkgdGhhdCBldmVudCBvYnNlcnZlcyB0aGUgYWJvcnQgcmF0aGVyIHRoYW5cbiAgICAgIC8vIHJhY2luZyBpdC4gVGhlc2Ugb3BzIHN3YWxsb3cgdGhlaXIgb3duIGVycm9ycywgc28gYXdhaXRpbmcgb25seVxuICAgICAgLy8gZW5mb3JjZXMgb3JkZXJpbmcgKHRoZSBgLmNhdGNoKClgIGRlZmVuZHMgdGhlIG5vLXJlamVjdCBjb250cmFjdCBvblxuICAgICAgLy8gU3RlcENvbnRleHQucHJlQ29tcGxldGlvbk9wcykuXG4gICAgICAvL1xuICAgICAgLy8gVHJhZGVvZmY6IGNvcnJlY3RuZXNzIHJlcXVpcmVzIHRoZSBob29rIGJlIGR1cmFibGUgYmVmb3JlIGNvbXBsZXRpb24sXG4gICAgICAvLyBzbyDigJQgdW5saWtlIHRoZSBiYWNrZ3JvdW5kIGBvcHNgIGZsdXNoIGFib3ZlIOKAlCB0aGlzIGNhbm5vdCBiZSBjYXBwZWRcbiAgICAgIC8vIHdpdGggYSByZXNvbHZlLW9uLXRpbWVvdXQgcmFjZS4gQSBzbG93IHJlc3VtZSB0aGVyZWZvcmUgYWRkcyBpdHNcbiAgICAgIC8vIGxhdGVuY3kgdG8gYSBzdGVwIHRoYXQgYWJvcnRzIGEgY29udHJvbGxlciwgYW5kIGEgdHJ1ZSBoYW5nIGhvbGRzXG4gICAgICAvLyBjb21wbGV0aW9uIHVudGlsIHRoZSBwbGF0Zm9ybS9xdWV1ZSBleGVjdXRpb24gdGltZW91dCBmaXJlczsgdGhlIHF1ZXVlXG4gICAgICAvLyB0aGVuIHJlZGVsaXZlcnMgYW5kIHRoZSBzdGVwIHJldHJpZXMsIHJlLWZpcmluZyB0aGUgYWJvcnQgaWRlbXBvdGVudGx5LlxuICAgICAgaWYgKHByZUNvbXBsZXRpb25PcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcmVDb21wbGV0aW9uT3BzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAvLyBPcHRpbWlzdGljIHN0YXJ0OiB0aGUgYm9keSB0aHJldyBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAgd2FzIGNvbmZpcm1lZC5cbiAgICAgIC8vIFJlY29uY2lsZSBmaXJzdCDigJQgaWYgd2UgbG9zdCB0aGUgY3JlYXRlLWNsYWltIChvciB0aGUgcnVuIGlzXG4gICAgICAvLyBnb25lL3Rocm90dGxlZCkgdGhlIGJvZHkgZXJyb3IgaXMgbW9vdDsgZGlzY2FyZCBpdCBhbmQgZG9uJ3Qgd3JpdGUgYVxuICAgICAgLy8gdGVybWluYWwgZXZlbnQgKHRoZSB3aW5uaW5nIGhhbmRsZXIgb3ducyB0aGUgb3V0Y29tZSkuIFJlY29uY2lsZVxuICAgICAgLy8gYmVmb3JlIGRyYWluaW5nIHByZUNvbXBsZXRpb25PcHMgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgc3VjY2Vzc1xuICAgICAgLy8gcGF0aDogYSBkaXNjYXJkZWQgb3V0Y29tZSBkb2Vzbid0IG5lZWQgdGhlIGFib3J0IGNvbW1pdHRlZCBoZXJlLlxuICAgICAgaWYgKG9wdGltaXN0aWNTdGFydCkge1xuICAgICAgICBjb25zdCByZWNvbmNpbGUgPSBhd2FpdCByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQoKTtcbiAgICAgICAgaWYgKHJlY29uY2lsZSkgcmV0dXJuIHJlY29uY2lsZTtcbiAgICAgICAgLy8gQmFycmllciByZXNvbHZlZCDigJQgYXR0YWNoIFJTRlMgdG8gdGhlIHN0ZXBfZmFpbGVkIGV2ZW50KHMpIGJlbG93LlxuICAgICAgICBiYWNrZmlsbE9wdGltaXN0aWNSc2ZzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9yZGVyIGFueSBtdXN0LWJlLWR1cmFibGUgb3BzIChlLmcuIGEgc3RlcC1pbml0aWF0ZWQgYWJvcnQnc1xuICAgICAgLy8gaG9va19yZWNlaXZlZCBldmVudCkgYWhlYWQgb2Ygc3RlcF9mYWlsZWQgdG9vIOKAlCBhIHN0ZXAgdGhhdCBhYm9ydHMgYW5kXG4gICAgICAvLyB0aGVuIHRocm93cyBtdXN0IHN0aWxsIGhhdmUgdGhlIGFib3J0IHJlY29yZGVkIGJlZm9yZSB0aGUgZmFpbHVyZVxuICAgICAgLy8gY29udGludWF0aW9uIG9ic2VydmVzIGl0LiBTYW1lIGxhdGVuY3kgdHJhZGVvZmYgYW5kIG5vLXJlamVjdCBjb250cmFjdFxuICAgICAgLy8gYXMgdGhlIHN1Y2Nlc3MgcGF0aCBhYm92ZS4gU2VlIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMuXG4gICAgICBpZiAocHJlQ29tcGxldGlvbk9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByZUNvbXBsZXRpb25PcHMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWZmZWN0aXZlRXJyID0gcHJvbW90ZUFib3J0RXJyb3JUb0ZhdGFsKGVycik7XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9IGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcihlZmZlY3RpdmVFcnIpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YWNrID1cbiAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2soZWZmZWN0aXZlRXJyKSB8fCAnJztcblxuICAgICAgaWYgKGVmZmVjdGl2ZUVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKGVmZmVjdGl2ZUVycik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzRmF0YWwgPSBGYXRhbEVycm9yLmlzKGVmZmVjdGl2ZUVycik7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTmFtZShnZXRFcnJvck5hbWUoZWZmZWN0aXZlRXJyKSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRXJyb3JNZXNzYWdlKG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShnZXRFcnJvck5hbWUoZWZmZWN0aXZlRXJyKSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvckNhdGVnb3J5KFxuICAgICAgICAgIGlzRmF0YWxcbiAgICAgICAgICAgID8gJ2ZhdGFsJ1xuICAgICAgICAgICAgOiBSZXRyeWFibGVFcnJvci5pcyhlZmZlY3RpdmVFcnIpXG4gICAgICAgICAgICAgID8gJ3JldHJ5YWJsZSdcbiAgICAgICAgICAgICAgOiAndHJhbnNpZW50J1xuICAgICAgICApLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JSZXRyeWFibGUoIWlzRmF0YWwpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgc3RlcCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGYXRhbCkge1xuICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICdFbmNvdW50ZXJlZCBGYXRhbEVycm9yIHdoaWxlIGV4ZWN1dGluZyBzdGVwLCBidWJibGluZyB1cCB0byBwYXJlbnQgd29ya2Zsb3cnLFxuICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZCwgc3RlcE5hbWUsIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIEFwcGx5IHRoZSBub3JtYWxpemVkIHN0YWNrIHRvIHRoZSB0aHJvd24gdmFsdWUgc28gdGhlIHNlcmlhbGl6ZWRcbiAgICAgICAgLy8gZXJyb3IgcHJlc2VydmVzIGl0IGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIHdvcmtzXG4gICAgICAgIC8vIGFjcm9zcyBWTSByZWFsbXMgKGEgd29ya2Zsb3ctdGhyb3duIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIHRoZVxuICAgICAgICAvLyBWTSdzIEVycm9yIGNsYXNzLCBub3QgdGhlIGhvc3QncykuXG4gICAgICAgIGlmICh0eXBlcy5pc05hdGl2ZUVycm9yKGVmZmVjdGl2ZUVycikgJiYgbm9ybWFsaXplZFN0YWNrKSB7XG4gICAgICAgICAgKGVmZmVjdGl2ZUVyciBhcyBFcnJvcikuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVFcnIsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgIH1cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgICB9XG5cbiAgICAgIC8vIE5vbi1mYXRhbCBlcnJvcjogY2hlY2sgaWYgcmV0cmllcyByZW1haW5pbmdcbiAgICAgIGNvbnN0IGN1cnJlbnRBdHRlbXB0ID0gc3RlcC5hdHRlbXB0O1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBdHRlbXB0KGN1cnJlbnRBdHRlbXB0KSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJyZW50QXR0ZW1wdCA+PSBtYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAvLyBNYXggcmV0cmllcyByZWFjaGVkXG4gICAgICAgIGNvbnN0IHJldHJ5Q291bnQgPSBzdGVwLmF0dGVtcHQgLSAxO1xuICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICdNYXggcmV0cmllcyByZWFjaGVkLCBidWJibGluZyBlcnJvciB0byBwYXJlbnQgd29ya2Zsb3cnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCBtYXhSZXRyaWVzKX06ICR7bm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgLy8gV3JhcCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIGFzIGBjYXVzZWAgb24gYSBmcmVzaCBGYXRhbEVycm9yXG4gICAgICAgIC8vIHNvIHRoZSB3cmFwcGluZyBtZXNzYWdlICsgcmV0cnktY291bnQgZnJhbWluZyBpcyB0aGUgdXNlci1mYWNpbmdcbiAgICAgICAgLy8gZXJyb3Igd2hpbGUgdGhlIG9yaWdpbmFsIGZhaWx1cmUgcmVtYWlucyByZWNvdmVyYWJsZSBmcm9tXG4gICAgICAgIC8vIGBlcnIuY2F1c2VgIGFmdGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBlcnI7XG4gICAgICAgIGlmIChub3JtYWxpemVkU3RhY2spIHdyYXBwZWRFcnJvci5zdGFjayA9IG5vcm1hbGl6ZWRTdGFjaztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgIH1cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ0VuY291bnRlcmVkIEVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHRoZSBub3JtYWxpemVkIHN0YWNrIHRvIHRoZSB0aHJvd24gdmFsdWUgc28gaXQgc3Vydml2ZXNcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24uIFNlZSB0aGUgRmF0YWxFcnJvciBzaXRlIGFib3ZlIGZvciB3aHkgd2UgdXNlXG4gICAgICAvLyBgdHlwZXMuaXNOYXRpdmVFcnJvcmAgaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgLlxuICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IoZXJyKSAmJiBub3JtYWxpemVkU3RhY2spIHtcbiAgICAgICAgKGVyciBhcyBFcnJvcikuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgLi4uKFJldHJ5YWJsZUVycm9yLmlzKGVycikgJiYgeyByZXRyeUFmdGVyOiBlcnIucmV0cnlBZnRlciB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKHN0ZXBSZXRyeUVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwUmV0cnlFcnIpKSB7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1RyaWVkIHJldHJ5aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBSZXRyeUVyci5tZXNzYWdlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgc3RlcFJldHJ5RXJyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KFxuICAgICAgICAxLFxuICAgICAgICBSZXRyeWFibGVFcnJvci5pcyhlcnIpXG4gICAgICAgICAgPyBNYXRoLmNlaWwoKCtlcnIucmV0cnlBZnRlci5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDApXG4gICAgICAgICAgOiAxXG4gICAgICApO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzKHRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVdpbGxSZXRyeSh0cnVlKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncmV0cnknLCB0aW1lb3V0U2Vjb25kcyB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdGVwX2NvbXBsZXRlZCBldmVudCBvdXRzaWRlIHRoZSBzdGVwIGV4ZWN1dGlvbiBmYWlsdXJlIHBhdGg6XG4gICAgLy8gcGVyc2lzdGVuY2UgZmFpbHVyZXMgYXJlIGluZnJhc3RydWN0dXJlIGVycm9ycyBhbmQgc2hvdWxkIHJlZGVsaXZlciB0aGVcbiAgICAvLyBxdWV1ZSBtZXNzYWdlLCBub3QgYmVjb21lIHVzZXIgc3RlcF9yZXRyeWluZy9zdGVwX2ZhaWxlZCBldmVudHMuXG4gICAgbGV0IGNvbXBsZXRlZFJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB3b3JsZC5ldmVudHMuY3JlYXRlPj47XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBsZXRlZFJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgIC4uLmxhdGVuY3lFdmVudERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBzaW5jZUN1cnNvcjogcGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3IgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgfVxuICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHN0ZXBMb2dnZXIuaW5mbygnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgY29uc3QgaW5saW5lRGVsdGEgPSBleHRyYWN0SW5saW5lRGVsdGEoXG4gICAgICBjb21wbGV0ZWRSZXN1bHQsXG4gICAgICBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkXG4gICAgKTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiByZXN1bHQpLFxuICAgIH0pO1xuXG4gICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGVwTG9nZ2VyLmRlYnVnKCdTdGVwIGhhcyBwZW5kaW5nIG9wcycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIG9wc0NvdW50OiBvcHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGhhc1BlbmRpbmdPcHMgc2lnbmFscyB0aGUgY29tYmluZWQgaGFuZGxlciB0byBicmVhayB0aGUgbG9vcFxuICAgIC8vIGFuZCBxdWV1ZSBhIGNvbnRpbnVhdGlvbiBzbyB3YWl0VW50aWwgY2FuIGZsdXNoIHRoZW0uXG4gICAgcmV0dXJuIHsgdHlwZTogJ2NvbXBsZXRlZCcsIGhhc1BlbmRpbmdPcHM6ICFvcHNTZXR0bGVkLCBpbmxpbmVEZWx0YSB9O1xuICB9KTtcbn1cbiJdfQ==
|