@workflow/core 5.0.0-beta.44 → 5.0.0-beta.46
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/attribute-changes.d.ts +3 -5
- package/dist/attribute-changes.d.ts.map +1 -1
- package/dist/attribute-changes.js +2 -2
- package/dist/capabilities.d.ts +2 -2
- package/dist/capabilities.js +4 -4
- package/dist/events-consumer.d.ts +1 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +3 -2
- package/dist/flushable-stream.js +2 -2
- package/dist/global.d.ts +3 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -5
- package/dist/private.d.ts +9 -7
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +11 -1
- package/dist/runtime/helpers.d.ts +3 -3
- package/dist/runtime/helpers.js +1 -1
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +8 -1
- package/dist/runtime/quickjs-runtime.js +7 -1
- package/dist/runtime/resume-hook.d.ts +27 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +182 -182
- package/dist/runtime/resume-latency.d.ts +16 -6
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -2
- package/dist/runtime/run.d.ts +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -2
- package/dist/runtime/start.js +3 -3
- package/dist/runtime/step-latency.d.ts +31 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +19 -13
- package/dist/runtime/suspension-handler.d.ts +9 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +41 -41
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +133 -66
- package/dist/serialization/hardened.d.ts +5 -4
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +7 -1
- package/dist/serialization-format.js +2 -2
- package/dist/serialization.d.ts +5 -6
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +19 -12
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +3 -11
- package/dist/telemetry/semantic-conventions.d.ts +14 -5
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +13 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
- package/dist/workflow/attribute-dispatcher.js +3 -6
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +6 -15
- package/dist/workflow.js +7 -8
- package/package.json +4 -4
package/dist/runtime.js
CHANGED
|
@@ -25,7 +25,7 @@ import { DEFAULT_STEP_MAX_RETRIES, executeStep, } from './runtime/step-executor.
|
|
|
25
25
|
import { computeStepLatencyTracking } from './runtime/step-latency.js';
|
|
26
26
|
import { backstopIdempotencyKey, hasPendingStepOwnedByMessage, isStepOwnershipActive, stepLeaseRemainingSeconds, } from './runtime/step-ownership.js';
|
|
27
27
|
import { runStepSingleFlight } from './runtime/step-single-flight.js';
|
|
28
|
-
import { handleSuspension } from './runtime/suspension-handler.js';
|
|
28
|
+
import { handleSuspension, } from './runtime/suspension-handler.js';
|
|
29
29
|
import { useQuickJSVm } from './runtime/vm-mode.js';
|
|
30
30
|
import { getWaitContinuationDispatch } from './runtime/wait-continuation.js';
|
|
31
31
|
import { getWorld } from './runtime/world.js';
|
|
@@ -267,11 +267,8 @@ function rootRunIdFrom(attributes, runId) {
|
|
|
267
267
|
* `wait_completed`, which the wait timer can resolve with
|
|
268
268
|
* `wait_completed`).
|
|
269
269
|
*
|
|
270
|
-
*
|
|
271
|
-
* optimistic start
|
|
272
|
-
* concurrently after that write. With no open hook or wait, only cancellation
|
|
273
|
-
* can do so, and observing it one replay late is safe because the next entity
|
|
274
|
-
* write is rejected.
|
|
270
|
+
* Open waits block VM retention and inline deltas. Open hooks and waits block
|
|
271
|
+
* turbo's optimistic start; hooks also require a `step_started` claim.
|
|
275
272
|
*
|
|
276
273
|
* Step-body `attr_set` writes are NOT a concern: they land before the
|
|
277
274
|
* step's terminal write and are therefore already inside the returned
|
|
@@ -298,6 +295,83 @@ function openHookAndWaitState(events) {
|
|
|
298
295
|
}
|
|
299
296
|
return { openHook: hooks.size > 0, openWait: waits.size > 0 };
|
|
300
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* The complete retained-VM policy for a suspension boundary.
|
|
300
|
+
*
|
|
301
|
+
* Every item type accepted here must use the suspension-generation guard when
|
|
302
|
+
* signaling. Otherwise a signal scheduled at boundary N could suspend the VM
|
|
303
|
+
* after it has already resumed into boundary N+1. Waits are not guarded, so
|
|
304
|
+
* they remain unretainable. A step or attribute write is required to drive the
|
|
305
|
+
* next inline iteration; hook-only suspensions park normally.
|
|
306
|
+
*
|
|
307
|
+
* Retaining across an open hook also permits a hook-woken cold replay to race
|
|
308
|
+
* this invocation. That is safe only because each loaded log is a monotone,
|
|
309
|
+
* hole-free prefix; replaying a longer prefix preserves all earlier
|
|
310
|
+
* correlation-ID draws; `step_started` atomically chooses one owner; and an
|
|
311
|
+
* open hook suppresses optimistic step-body execution until that claim wins.
|
|
312
|
+
* The generation guard keeps losing same-boundary suspension signals stale,
|
|
313
|
+
* while a stale-snapshot/412 restart discards the retained session and replays
|
|
314
|
+
* from the authoritative log. A World that exposes a non-prefix view would
|
|
315
|
+
* violate this policy's precondition and could bind one ordinal to two logical
|
|
316
|
+
* branches before the step-ownership claim has a chance to arbitrate them.
|
|
317
|
+
*
|
|
318
|
+
* Quiescence assumes workflow code stays inside the sandbox's determinism
|
|
319
|
+
* contract. Escaping to the host realm (for example, recovering a host
|
|
320
|
+
* `Function` constructor to schedule real timers) already makes ordinary cold
|
|
321
|
+
* replay nondeterministic and is not defended here.
|
|
322
|
+
*
|
|
323
|
+
* `hasOpenWait` is lazy because checking it scans the loaded event log. Keep it
|
|
324
|
+
* last so cheap rejection reasons avoid that work.
|
|
325
|
+
*/
|
|
326
|
+
function getRetentionDecision({ suspension, serializationBlockerCount, hasOpenWait, }) {
|
|
327
|
+
if (!isVmRetentionEnabled()) {
|
|
328
|
+
return { retain: false, reason: 'disabled' };
|
|
329
|
+
}
|
|
330
|
+
if (serializationBlockerCount > 0) {
|
|
331
|
+
return {
|
|
332
|
+
retain: false,
|
|
333
|
+
reason: 'serialization_executed_workflow_code',
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
if (suspension.stepCount === 0 && suspension.attributeCount === 0) {
|
|
337
|
+
return { retain: false, reason: 'no_replay_driver' };
|
|
338
|
+
}
|
|
339
|
+
if (!suspension.items.every((item) => {
|
|
340
|
+
switch (item.type) {
|
|
341
|
+
case 'step':
|
|
342
|
+
case 'hook':
|
|
343
|
+
case 'attribute':
|
|
344
|
+
return true;
|
|
345
|
+
case 'wait':
|
|
346
|
+
return false;
|
|
347
|
+
default:
|
|
348
|
+
item;
|
|
349
|
+
throw new Error('Unknown workflow suspension item');
|
|
350
|
+
}
|
|
351
|
+
})) {
|
|
352
|
+
return { retain: false, reason: 'unsupported_suspension_item' };
|
|
353
|
+
}
|
|
354
|
+
if (hasOpenWait()) {
|
|
355
|
+
return { retain: false, reason: 'open_wait' };
|
|
356
|
+
}
|
|
357
|
+
return { retain: true };
|
|
358
|
+
}
|
|
359
|
+
const SERIALIZATION_BLOCKER_LOG_DETAIL_LIMIT = 160;
|
|
360
|
+
/** Keep retention diagnostics useful without emitting unbounded guest data. */
|
|
361
|
+
function serializationBlockerLogMetadata(blockers, count) {
|
|
362
|
+
return {
|
|
363
|
+
serializationBlockerCount: count,
|
|
364
|
+
serializationBlockers: blockers.map(({ source, correlationId, kind, detail }) => ({
|
|
365
|
+
source,
|
|
366
|
+
correlationId,
|
|
367
|
+
kind,
|
|
368
|
+
detail: detail && detail.length > SERIALIZATION_BLOCKER_LOG_DETAIL_LIMIT
|
|
369
|
+
? `${detail.slice(0, SERIALIZATION_BLOCKER_LOG_DETAIL_LIMIT)}…`
|
|
370
|
+
: detail,
|
|
371
|
+
})),
|
|
372
|
+
serializationBlockersTruncated: count > blockers.length,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
301
375
|
function nextEventLogLoad(log) {
|
|
302
376
|
if (log.cursor === null) {
|
|
303
377
|
return { type: 'loadAll' };
|
|
@@ -312,40 +386,6 @@ function appendEventLog(log, appended) {
|
|
|
312
386
|
appendUniqueEvents(log.events, appended.events);
|
|
313
387
|
log.cursor = appended.cursor ?? log.cursor;
|
|
314
388
|
}
|
|
315
|
-
/**
|
|
316
|
-
* The whole retention predicate: keep the session only for a pure step
|
|
317
|
-
* boundary (every suspension item is a step: any other item type, present
|
|
318
|
-
* or future, is unretainable by default) whose new step inputs serialized
|
|
319
|
-
* without executing workflow code, with no out-of-band continuation source:
|
|
320
|
-
* attributes require replay; hooks and waits can wake another invocation.
|
|
321
|
-
* `WORKFLOW_RETAINED_VM=0` disables retention entirely.
|
|
322
|
-
*
|
|
323
|
-
* The open hook/wait scan is O(events), so it is taken through a lazy getter
|
|
324
|
-
* and consulted last, after every cheap check has passed.
|
|
325
|
-
*
|
|
326
|
-
* INVARIANT this predicate leans on: every suspension signaler that does NOT
|
|
327
|
-
* carry the step-consumer generation guard (sleep, hook, attribute, see
|
|
328
|
-
* `suspensionGeneration` in private.ts) must be unretainable here, either via
|
|
329
|
-
* a non-step queue item or the open hook/wait scan. A new signaler that
|
|
330
|
-
* satisfies neither would let a stale signal be accepted as a fresh
|
|
331
|
-
* suspension on a resumed session.
|
|
332
|
-
*
|
|
333
|
-
* Quiescence assumes workflow code stays inside the sandbox's determinism
|
|
334
|
-
* contract. Escaping to the host realm (e.g. recovering the host `Function`
|
|
335
|
-
* constructor from an exposed host class to schedule real timers) makes a
|
|
336
|
-
* workflow nondeterministic under ordinary replay too, and is not defended
|
|
337
|
-
* here.
|
|
338
|
-
*/
|
|
339
|
-
function canRetainWorkflowSession(suspension, stepInputsSafe, openHookWait) {
|
|
340
|
-
if (!isVmRetentionEnabled() ||
|
|
341
|
-
!stepInputsSafe ||
|
|
342
|
-
suspension.steps.length === 0 ||
|
|
343
|
-
!suspension.steps.every((item) => item.type === 'step')) {
|
|
344
|
-
return false;
|
|
345
|
-
}
|
|
346
|
-
const { openHook, openWait } = openHookWait.value;
|
|
347
|
-
return !openHook && !openWait;
|
|
348
|
-
}
|
|
349
389
|
/**
|
|
350
390
|
* Maximum inline-execution duration for a single handler invocation.
|
|
351
391
|
*
|
|
@@ -2039,6 +2079,10 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2039
2079
|
return;
|
|
2040
2080
|
}
|
|
2041
2081
|
let replayStart = 0;
|
|
2082
|
+
// Whether this pass was served by a retained VM session.
|
|
2083
|
+
// Set at the resume/replay decision below, before
|
|
2084
|
+
// `retainedSession` is reassigned for the next iteration.
|
|
2085
|
+
let servedByRetainedSession = false;
|
|
2042
2086
|
try {
|
|
2043
2087
|
// --- QuickJS VM engine dispatch ---
|
|
2044
2088
|
// The QuickJS engine (opt-in via WORKFLOW_VM=quickjs
|
|
@@ -2333,6 +2377,15 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2333
2377
|
let workflowResult = retainedSession
|
|
2334
2378
|
? await resumeWorkflow(retainedSession, eventLog.events)
|
|
2335
2379
|
: { type: 'replay' };
|
|
2380
|
+
// A retained resume can still report back `{ type:
|
|
2381
|
+
// 'replay' }` (internal cache miss), in which case this
|
|
2382
|
+
// pass falls through to a full replay below and is not
|
|
2383
|
+
// a retained pass. The `workflow.run` span cannot say
|
|
2384
|
+
// this: it is tagged `retained` when it opens, before
|
|
2385
|
+
// the resume result is known.
|
|
2386
|
+
servedByRetainedSession =
|
|
2387
|
+
retainedSession !== null &&
|
|
2388
|
+
workflowResult.type !== 'replay';
|
|
2336
2389
|
if (workflowResult.type === 'replay') {
|
|
2337
2390
|
retainedSession = null;
|
|
2338
2391
|
workflowResult = await replayWorkflow({
|
|
@@ -2579,26 +2632,23 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2579
2632
|
replayPayloadCache.resetScan();
|
|
2580
2633
|
}
|
|
2581
2634
|
// Open hooks/waits in the log as loaded for this
|
|
2582
|
-
// replay.
|
|
2583
|
-
//
|
|
2584
|
-
//
|
|
2585
|
-
//
|
|
2586
|
-
//
|
|
2587
|
-
// lazily, at most once, and shared between the
|
|
2588
|
-
// retention decision here and the delta/turbo gates
|
|
2589
|
-
// below, since the attr-detour and hook-conflict paths
|
|
2590
|
-
// return/continue before the gates and usually
|
|
2591
|
-
// short-circuit before ever scanning the log.
|
|
2635
|
+
// replay. Computed lazily, at most once, and shared
|
|
2636
|
+
// between the retention decision here and the
|
|
2637
|
+
// delta/turbo gates below — the attr-detour and
|
|
2638
|
+
// hook-conflict paths return/continue before the
|
|
2639
|
+
// gates and usually short-circuit before scanning.
|
|
2592
2640
|
const openHookWait = once(() => {
|
|
2593
2641
|
assert(eventLog.type === 'ready');
|
|
2594
2642
|
return openHookAndWaitState(eventLog.events);
|
|
2595
2643
|
});
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2644
|
+
const retentionDecision = retainedSession
|
|
2645
|
+
? getRetentionDecision({
|
|
2646
|
+
suspension: err,
|
|
2647
|
+
serializationBlockerCount: suspensionResult.serializationBlockerCount,
|
|
2648
|
+
hasOpenWait: () => openHookWait.value.openWait,
|
|
2649
|
+
})
|
|
2650
|
+
: undefined;
|
|
2651
|
+
if (retentionDecision?.retain === false) {
|
|
2602
2652
|
retainedSession = null;
|
|
2603
2653
|
}
|
|
2604
2654
|
preStepBlockingMs += suspensionResult.hookCreationMs;
|
|
@@ -2614,20 +2664,36 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2614
2664
|
hasHookConflict: suspensionResult.hasHookConflict,
|
|
2615
2665
|
hasAwaitedHookCreation: suspensionResult.hasAwaitedHookCreation,
|
|
2616
2666
|
hasAttributeEvents: suspensionResult.hasAttributeEvents,
|
|
2667
|
+
...(retentionDecision
|
|
2668
|
+
? {
|
|
2669
|
+
workflowVmRetention: retentionDecision.retain
|
|
2670
|
+
? 'retained'
|
|
2671
|
+
: 'replay',
|
|
2672
|
+
}
|
|
2673
|
+
: {}),
|
|
2674
|
+
...(retentionDecision?.retain === false
|
|
2675
|
+
? {
|
|
2676
|
+
workflowVmRetentionReason: retentionDecision.reason,
|
|
2677
|
+
}
|
|
2678
|
+
: {}),
|
|
2679
|
+
...(suspensionResult.serializationBlockerCount > 0
|
|
2680
|
+
? serializationBlockerLogMetadata(suspensionResult.serializationBlockers, suspensionResult.serializationBlockerCount)
|
|
2681
|
+
: {}),
|
|
2617
2682
|
});
|
|
2618
2683
|
// Hook conflict: break loop, re-invoke via queue
|
|
2619
2684
|
if (suspensionResult.hasHookConflict) {
|
|
2620
2685
|
return await reinvoke(0);
|
|
2621
2686
|
}
|
|
2622
|
-
// Native workflow attribute events are resolved
|
|
2623
|
-
//
|
|
2624
|
-
//
|
|
2625
|
-
//
|
|
2626
|
-
// step processing for this
|
|
2627
|
-
// races first:
|
|
2628
|
-
// step()]), the
|
|
2629
|
-
// to win without executing the
|
|
2630
|
-
// happens in-process rather
|
|
2687
|
+
// Native workflow attribute events are resolved by the
|
|
2688
|
+
// next execution pass: it reloads the log (now holding
|
|
2689
|
+
// the just-committed attr_set), then either resumes the
|
|
2690
|
+
// retained VM or performs a cold replay to resolve the
|
|
2691
|
+
// setAttributes promise. Skip step processing for this
|
|
2692
|
+
// pass so that the durable event decides races first:
|
|
2693
|
+
// in Promise.race([setAttributes(), step()]), the
|
|
2694
|
+
// attribute must be able to win without executing the
|
|
2695
|
+
// losing step. The next pass happens in-process rather
|
|
2696
|
+
// than via a queue
|
|
2631
2697
|
// re-invocation: unlike hooks and waits, an attr_set
|
|
2632
2698
|
// introduces no out-of-band invocation source that the
|
|
2633
2699
|
// handler would need to yield the message for, so
|
|
@@ -3181,6 +3247,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
3181
3247
|
suspensionResult.waitTimeout !== undefined,
|
|
3182
3248
|
suspensionCreatedHooks: err.hookCount > 0 || suspensionResult.hasHookEvents,
|
|
3183
3249
|
turbo,
|
|
3250
|
+
retained: servedByRetainedSession,
|
|
3184
3251
|
});
|
|
3185
3252
|
// Slot snapshot for the inline step_started claims: the
|
|
3186
3253
|
// lazy claim is the first durable write of a hot-path
|
|
@@ -3792,4 +3859,4 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
3792
3859
|
});
|
|
3793
3860
|
});
|
|
3794
3861
|
}
|
|
3795
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUVyQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUVqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFl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YSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksUUFBUSxZQUFZLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLEVBQUUsYUFBYSxDQUNqQixTQUFTLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNsRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlLCBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgaXNTZWFsZWROb29wRXZlbnQsXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIFJPT1RfUlVOX0lEX0FUVFJJQlVURSxcbiAgdHlwZSBSdW5JbnB1dCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcbmltcG9ydCB7IGRlY29kZVRpbWUgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7XG4gIGNsYXNzaWZ5UnVuRXJyb3IsXG4gIGlzUmV0cnlhYmxlV29ybGRFcnJvcixcbiAgaXNXb3JsZENvbnRyYWN0RXJyb3IsXG59IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgdHlwZSBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgUmVwbGF5UGF5bG9hZENhY2hlIH0gZnJvbSAnLi9yZXBsYXktcGF5bG9hZC1jYWNoZS5qcyc7XG5pbXBvcnQgeyBDT01QVVRFX0lOU1RBTkNFX0lEIH0gZnJvbSAnLi9ydW50aW1lL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4RXZlbnRzT3ZlcnJpZGUsXG4gIGdldE1heFF1ZXVlRGVsaXZlcmllcyxcbiAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMsXG4gIGdldFByZWNvbmRpdGlvbk1heFJlaW52b2NhdGlvbnMsXG4gIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzLFxuICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcyxcbiAgaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkLFxuICBpc1R1cmJvRW5hYmxlZCxcbiAgaXNWbVJldGVudGlvbkVuYWJsZWQsXG59IGZyb20gJy4vcnVudGltZS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY291bnRTdGVwU3RhcnRlZEV2ZW50cyB9IGZyb20gJy4vcnVudGltZS9jb3VudC1zdGVwLXN0YXJ0ZWQtZXZlbnRzLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRGVwbG95bWVudEFmZmluaXR5T3V0Y29tZSxcbiAgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHksXG4gIHR5cGUgUmVlbnF1ZXVlQXJncyxcbn0gZnJvbSAnLi9ydW50aW1lL2RlcGxveW1lbnQtZ3VhcmQuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgaW5zZXJ0RXZlbnRCeUV2ZW50SWQsXG4gIGlzU2xvdEdhcENoZWNrRW5hYmxlZCxcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbG9hZFdvcmtmbG93UnVuRXZlbnRzLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgdHlwZSBTbG90U25hcHNob3RQYXJhbXMsXG4gIHNldHRsZUV2ZW50U2xvdEdhcCxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbiAgd2l0aEhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5pbXBvcnQge1xuICBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQsXG4gIFJlcGxheUJ1ZGdldCxcbn0gZnJvbSAnLi9ydW50aW1lL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlciB9IGZyb20gJy4vcnVudGltZS9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHtcbiAgcmVzdW1lVGltaW5nRm9yTWVzc2FnZSxcbiAgcmVzdW1lVHJhY2tpbmdGcm9tTWVzc2FnZSxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1sYXRlbmN5LmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG4gIHR5cGUgUHJlY2xhaW1lZElubGluZVN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyB9IGZyb20gJy4vcnVudGltZS9zdGVwLWxhdGVuY3kuanMnO1xuaW1wb3J0IHtcbiAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSxcbiAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZSxcbiAgaXNTdGVwT3duZXJzaGlwQWN0aXZlLFxuICBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzLFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1vd25lcnNoaXAuanMnO1xuaW1wb3J0IHsgcnVuU3RlcFNpbmdsZUZsaWdodCB9IGZyb20gJy4vcnVudGltZS9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdXNlUXVpY2tKU1ZtIH0gZnJvbSAnLi9ydW50aW1lL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkLCB0eXBlIFdvcmxkSGFuZGxlcnMgfSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlUnVuRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrIH0gZnJvbSAnLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBidWlsZEludm9jYXRpb25TcGFuTGlua3MsXG4gIGdldE5leHRUcmFjZUNhcnJpZXIsXG4gIGdldFNwYW5LaW5kLFxuICBnZXRXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaXNVc2FibGVUcmFjZUNhcnJpZXIsXG4gIHRyYWNlLFxuICB3aXRoVHJhY2VDb250ZXh0LFxuICB3aXRoV29ya2Zsb3dCYWdnYWdlLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRFcnJvck5hbWUsIGdldEVycm9yU3RhY2ssIG5vcm1hbGl6ZVVua25vd25FcnJvciB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRXb3JrZmxvd1N1c3BlbnNpb25NZXNzYWdlIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7XG4gIHJlcGxheVdvcmtmbG93LFxuICByZXN1bWVXb3JrZmxvdyxcbiAgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCxcbiAgdHlwZSBXb3JrZmxvd1Nlc3Npb24sXG59IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja09wdGlvbnMsXG4gIHR5cGUgSGVhbHRoQ2hlY2tSZXN1bHQsXG4gIGhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBnZXRIb29rQnlUb2tlbixcbiAgdHlwZSBSZXN1bWVkSG9vayxcbiAgcmVzdW1lSG9vayxcbiAgcmVzdW1lV2ViaG9vayxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJztcbmV4cG9ydCB7XG4gIGdldFJ1bixcbiAgUnVuLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW0sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJy4vcnVudGltZS9ydW4uanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDYW5jZWxSdW5PcHRpb25zLFxuICBjYW5jZWxSdW4sXG4gIGNhbmNlbFJ1bnMsXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgdHlwZSBSZWVucXVldWVSdW5PcHRpb25zLFxuICByZWFkU3RyZWFtLFxuICByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyxcbiAgcmVlbnF1ZXVlUnVuLFxuICB0eXBlIFN0b3BTbGVlcE9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwUmVzdWx0LFxuICB3YWtlVXBSdW4sXG59IGZyb20gJy4vcnVudGltZS9ydW5zLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgU3RhcnRPcHRpb25zLFxuICB0eXBlIFN0YXJ0T3B0aW9uc0Jhc2UsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkLFxuICBzdGFydCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0YXJ0LmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBjcmVhdGVXb3JsZEZyb21Nb2R1bGUsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBzZXRXb3JsZCxcbiAgdHlwZSBXb3JsZEZhY3RvcnlNb2R1bGUsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbi8qKlxuICogQXBwbHkgdGhlIG9wdGlvbmFsIGNsaWVudC1zaWRlIGV2ZW50LWxpbWl0IG92ZXJyaWRlLlxuICogYFdPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREVgLCB3aGVuIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIsIGNsYW1wcyB0aGVcbiAqIHNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgdG8gYSBzbWFsbGVyIHZhbHVlIHNvIGVuZm9yY2VtZW50IGNhblxuICogYmUgZXhlcmNpc2VkIHdpdGhvdXQgYSBzZXJ2ZXItc2lkZSBjaGFuZ2UuIENsYW1wLWRvd24gb25seTogaXQgbmV2ZXIgcmFpc2VzXG4gKiB0aGUgc2VydmVyJ3MgbGltaXQsIGFuZCBpdCB0YWtlcyBlZmZlY3QgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBub25lLlxuICogVW5zZXQg4oeSIHNlcnZlciB2YWx1ZSBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGNsYW1wTWF4RXZlbnRzKHNlcnZlclZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdmVycmlkZSA9IGdldE1heEV2ZW50c092ZXJyaWRlKCk7XG4gIGlmIChvdmVycmlkZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc2VydmVyVmFsdWU7XG4gIHJldHVybiBzZXJ2ZXJWYWx1ZSA9PT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUgOiBNYXRoLm1pbihzZXJ2ZXJWYWx1ZSwgb3ZlcnJpZGUpO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIHF1ZXVlIGRlbGl2ZXJ5IHdob3NlIHJ1biB3YXMgY3JlYXRlZCBpbiBhIGRpZmZlcmVudCBlbnZpcm9ubWVudCB0aGFuXG4gKiB0aGlzIGRlcGxveW1lbnQgcnVucyBpbi5cbiAqXG4gKiBgc3RhcnQoKWAgcGVyZm9ybXMgdHdvIHdyaXRlcyB0aGF0IG11c3QgbGFuZCBpbiB0aGUgc2FtZSB0ZW5hbnQ6IHRoZVxuICogYHJ1bl9jcmVhdGVkYCBldmVudCwgYXR0cmlidXRlZCB0byB3aGF0ZXZlciBlbnZpcm9ubWVudCB0aGUgKmNhbGxlcipcbiAqIGF1dGhlbnRpY2F0ZXMgYXMsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSwgcGlubmVkIHRvIGEgKmRlcGxveW1lbnQqLiBBXG4gKiBtaXNjb25maWd1cmVkIGNhbGxlciBjYW4gc3BsaXQgdGhlbSwgd3JpdGluZyB0aGUgcnVuIHRvIG9uZSBlbnZpcm9ubWVudFxuICogd2hpbGUgYWRkcmVzc2luZyB0aGUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlci4gVGhlIGNvbnN1bWVyIHRoZW5cbiAqIGZpbmRzIG5vIHJ1biB1bmRlciBpdHMgb3duIHRlbmFudCBhbmQgdGhlIGJhY2tlbmQncyByZXNpbGllbnQgc3RhcnRcbiAqIChgcnVuX3N0YXJ0ZWRgIGNyZWF0ZXMgdGhlIHJ1biB3aGVuIGBydW5fY3JlYXRlZGAgd2FzIG5ldmVyIHNlZW4pIG1pbnRzIGFcbiAqIFNFQ09ORCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiB0aGlzIGVudmlyb25tZW50LiBCb3RoIGNvcGllcyBhcmUgcmVhbDogdGhlXG4gKiBjcmVhdG9yJ3Mgc2l0cyBwZW5kaW5nIGZvcmV2ZXIsIHRoaXMgb25lIGV4ZWN1dGVzLCBhbmQgZXZlcnkgc3Vic2VxdWVudFxuICogY3Jvc3MtdGVuYW50IHF1ZXVlIGFjayBmYWlscyB0byBmaW5kIGl0cyBtZXNzYWdlLlxuICpcbiAqIE5vdGhpbmcgZXh0ZXJuYWwgaXMgbmVlZGVkIHRvIGNhdGNoIHRoaXM6IHRoZSBjcmVhdG9yJ3MgZW52aXJvbm1lbnQgcmlkZXMgdGhlXG4gKiBtZXNzYWdlIGluIGBydW5JbnB1dC5lbnZpcm9ubWVudGAgYW5kIHRoaXMgcHJvY2VzcyBhbHJlYWR5IGtub3dzIGl0cyBvd24uIFNvXG4gKiBjb21wYXJlIHRoZW0gYW5kIHN0b3AgQkVGT1JFIGBydW5fc3RhcnRlZGAsIHRoZSB3cml0ZSB0aGF0IHdvdWxkIGNyZWF0ZSB0aGVcbiAqIGZvcmsuIFJlZnVzaW5nIGFmdGVyIGl0IHdvdWxkIGJlIHRvbyBsYXRlLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGNhbGxlciBtdXN0IGFiYW5kb24gdGhlIGRlbGl2ZXJ5LiBTa2lwcGVkIHdoZW5ldmVyXG4gKiBlaXRoZXIgc2lkZSBpcyB1bmtub3duLCB3aGljaCBrZWVwcyBldmVyeSBleGlzdGluZyBzZXR1cCBvbiBpdHMgY3VycmVudFxuICogYmVoYXZpb3I6IHdvcmxkcyB3aXRoIG5vIGVudmlyb25tZW50IGRpbWVuc2lvbiAoYHdvcmxkLWxvY2FsYCxcbiAqIGB3b3JsZC1wb3N0Z3Jlc2ApIGRvbid0IGltcGxlbWVudCBgZ2V0RW52aXJvbm1lbnRgLCBhbmQgcnVucyBzdGFydGVkIGJ5IGFuXG4gKiBvbGRlciBTREsgY2Fycnkgbm8gYGVudmlyb25tZW50YCBmaWVsZC5cbiAqL1xuZnVuY3Rpb24gcmVmdXNlQ3Jvc3NFbnZpcm9ubWVudERlbGl2ZXJ5KHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNyZWF0b3JFbnZpcm9ubWVudCA9IHJ1bklucHV0Py5lbnZpcm9ubWVudDtcbiAgaWYgKCFjcmVhdG9yRW52aXJvbm1lbnQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjdXJyZW50RW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG4gIGlmICghY3VycmVudEVudmlyb25tZW50IHx8IGN1cnJlbnRFbnZpcm9ubWVudCA9PT0gY3JlYXRvckVudmlyb25tZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgIGBSZWZ1c2luZyB0byBydW4gdGhpcyB3b3JrZmxvdzogaXQgd2FzIGNyZWF0ZWQgaW4gdGhlIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYCArXG4gICAgICBgZW52aXJvbm1lbnQgYnV0IHRoaXMgZGVwbG95bWVudCBydW5zIGluIFwiJHtjdXJyZW50RW52aXJvbm1lbnR9XCIuIGAgK1xuICAgICAgJ0V4ZWN1dGluZyBpdCBoZXJlIHdvdWxkIGNyZWF0ZSBhIHNlY29uZCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiAnICtcbiAgICAgICdib3RoIGVudmlyb25tZW50cyDigJQgb25lIHBlbmRpbmcgZm9yZXZlciwgb25lIHJ1bm5pbmcg4oCUIHNvIHRoZSBxdWV1ZSAnICtcbiAgICAgICdtZXNzYWdlIGlzIGJlaW5nIGRpc2NhcmRlZCB3aXRob3V0IGV4ZWN1dGluZyBhbmQgd2l0aG91dCByZXRyeWluZy4gJyArXG4gICAgICAnVGhlIGNsaWVudCB0aGF0IGNhbGxlZCBzdGFydCgpIHdyb3RlIHRoZSBydW4gdG8gaXRzIG93biBlbnZpcm9ubWVudCAnICtcbiAgICAgICdidXQgYWRkcmVzc2VkIHRoZSBxdWV1ZSBtZXNzYWdlIHRvIGEgZGVwbG95bWVudCBpbiBhbm90aGVyIG9uZS4gQ2hlY2sgJyArXG4gICAgICAndGhhdCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjbGllbnQgYXV0aGVudGljYXRlcyBhcyAoV09SS0ZMT1dfVkVSQ0VMX0VOViAnICtcbiAgICAgIFwiZm9yIENMSSBhbmQgQ0kgY2xpZW50cywgb3IgdGhlIE9JREMgdG9rZW4ncyBlbnZpcm9ubWVudCBpbnNpZGUgYSBcIiArXG4gICAgICAnZGVwbG95bWVudCkgbWF0Y2hlcyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGRlcGxveW1lbnQgaXQgdGFyZ2V0cy4gVGhlICcgK1xuICAgICAgYHJ1biBpdCBjcmVhdGVkIGlzIHN0aWxsIHBlbmRpbmcgaW4gXCIke2NyZWF0b3JFbnZpcm9ubWVudH1cIiBhbmQgd2lsbCBgICtcbiAgICAgICdub3QgcnVuLicsXG4gICAge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBjcmVhdG9yRW52aXJvbm1lbnQsXG4gICAgICBjdXJyZW50RW52aXJvbm1lbnQsXG4gICAgICBwaW5uZWREZXBsb3ltZW50SWQ6IHJ1bklucHV0Py5kZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMb2cgd2hlbiBhIGBzdGFydCgpYC1lbnF1ZXVlZCBtZXNzYWdlIHBpbm5lZCB0byBvbmUgZGVwbG95bWVudCBpcyBkZWxpdmVyZWRcbiAqIHRvIGEgZGlmZmVyZW50IG9uZS5cbiAqXG4gKiBBIGZpcnN0LWRlbGl2ZXJ5IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXQuZGVwbG95bWVudElkYCAodGhlIGRlcGxveW1lbnRcbiAqIGBzdGFydCgpYCBhZGRyZXNzZWQgaXQgdG8pLCBzbyBjb21wYXJpbmcgdGhhdCBhZ2FpbnN0IHRoaXMgaGFuZGxlcidzIG93blxuICogZGVwbG95bWVudCBkZXRlY3RzIG1pcy1kZWxpdmVyeSBkaXJlY3RseS4gVGhpcyBpcyBhIERJQUdOT1NUSUMsIG5vdCBhIGdhdGU6XG4gKiBpdCB3YXJucyBhbmQgbGV0cyB0aGUgaW52b2NhdGlvbiBwcm9jZWVkLCBkZWxpYmVyYXRlbHkuXG4gKlxuICogV2h5IHRoaXMgb25lIG9ubHkgd2FybnMgd2hpbGUgaXRzIGVudmlyb25tZW50IHNpYmxpbmcgYWJvdmUgcmVmdXNlczogYVxuICogZGlmZmVyaW5nIGRlcGxveW1lbnQgaWQgaXMgbm90IGJ5IGl0c2VsZiBldmlkZW5jZSBvZiB0aGUgZm9yayB3ZSBjYXJlIGFib3V0LlxuICogVGhlIGVudmlyb25tZW50IHBhaXIgaXMgZXhhY3QgKHR3byBuYW1lZCBlbnZpcm9ubWVudHMgdGhhdCBkaXNhZ3JlZSkgYW5kIGl0XG4gKiBpcyB0aGUgZGltZW5zaW9uIHRoZSBydW4ncyB0ZW5hbnQgaXMga2V5ZWQgb24uIERlcGxveW1lbnQgaWRzIGRpc2FncmVlIGZvclxuICogYmVuaWduIHJlYXNvbnMgdG9vOiBgd29ybGQtbG9jYWxgIGRlcml2ZXMgaXRzIGlkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlXG4gKiB2ZXJzaW9uIChgZHBsX2xvY2FsQDx2ZXJzaW9uPmApLCBzbyB1cGdyYWRpbmcgdGhlIFNESyBtaWQtcnVuIGNoYW5nZXMgaXQgd2l0aFxuICogbm90aGluZyB3cm9uZy4gUmVmdXNpbmcgb24gdGhhdCBzaWduYWwgd291bGQgc3RyYW5kIGNvcnJlY3QgcnVucywgYW5kXG4gKiByZWZ1c2luZyBiZWZvcmUgYHJ1bl9zdGFydGVkYCBsZWF2ZXMgbm8gc2VydmVyLXNpZGUgcmVjb3JkIHRvIGV4cGxhaW4gd2h5LlxuICogQW55b25lIHRlbXB0ZWQgdG8gcHJvbW90ZSB0aGlzIHRvIGEgaGFyZCBmYWlsdXJlIGhhcyB0byBoYW5kbGUgdGhhdCBmaXJzdC5cbiAqXG4gKiBTa2lwcGVkIHVubGVzcyBCT1RIIGlkcyBhcmUga25vd246IGBnZXREZXBsb3ltZW50SWQoKWAgdGhyb3dzIGluIHdvcmxkcyB0aGF0XG4gKiByZXF1aXJlIGEgZGVwbG95bWVudCBhbmQgaGF2ZSBub25lLCBhbmQgYSByZS1lbnF1ZXVlZCBtZXNzYWdlIGNhcnJpZXMgbm9cbiAqIGBydW5JbnB1dGAgYXQgYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IHJ1bklucHV0Py5kZXBsb3ltZW50SWQ7XG4gIGlmICghcGlubmVkRGVwbG95bWVudElkKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFdvcmxkcyB0aGF0IHJlcXVpcmUgYSBkZXBsb3ltZW50IGlkIHRocm93IHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiBUaGF0IGlzXG4gICAgLy8gbm90IGEgbWlzbWF0Y2g6IHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWN1cnJlbnREZXBsb3ltZW50SWQgfHwgY3VycmVudERlcGxveW1lbnRJZCA9PT0gcGlubmVkRGVwbG95bWVudElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICdRdWV1ZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgdG8gYSBkZXBsb3ltZW50IGl0IHdhcyBub3QgcGlubmVkIHRvLiAnICtcbiAgICAgICdUaGUgcnVuIHdhcyBjcmVhdGVkIHRhcmdldGluZyBhIGRpZmZlcmVudCBkZXBsb3ltZW50LCBzbyB0aGlzICcgK1xuICAgICAgJ2ludm9jYXRpb24gbWF5IGJlIHJlcGxheWluZyBhZ2FpbnN0IGNvZGUgdGhlIHJ1biB3YXMgbm90IHN0YXJ0ZWQgb24uICcgK1xuICAgICAgJ0NvbnRpbnVpbmcg4oCUIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIFdvcmtmbG93IFNESyB2ZXJzaW9uIGNoYW5nZWQgJyArXG4gICAgICAnbWlkLXJ1biBpbiBsb2NhbCBkZXZlbG9wbWVudCwgd2hlcmUgdGhlIGRlcGxveW1lbnQgaWQgaXMgZGVyaXZlZCBmcm9tICcgK1xuICAgICAgJ3RoYXQgdmVyc2lvbi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgcGlubmVkRGVwbG95bWVudElkLFxuICAgICAgY3VycmVudERlcGxveW1lbnRJZCxcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHN0ZXAgZXhlY3V0aW9uIHJlamVjdGVkIGJlY2F1c2UgdGhlIHN0ZXAgZW50aXR5IGRvZXMgbm90IGV4aXN0LFxuICogdGhlIHNpZ25hdHVyZSBvZiBhIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIG1lc3NhZ2Ugd2hvc2UgZGVsaXZlcnkgYmVhdCAob3JcbiAqIG91dGxpdmVkIGEgdHJhbnNpZW50IGZhaWx1cmUgb2YpIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGBzdGVwX2NyZWF0ZWRgXG4gKiB3cml0ZS4gRXZlcnkgV29ybGQgc3VyZmFjZXMgaXQgYXMgYSBgV29ya2Zsb3dXb3JsZEVycm9yYCBuYW1pbmcgdGhlIG1pc3NpbmdcbiAqIHN0ZXA6IHdvcmxkLXZlcmNlbCBtYXBzIHRoZSBiYWNrZW5kJ3MgNDA0IHRvXG4gKiBgd29ya2Zsb3cgc3RlcCBzdGVwX+KApiBub3QgZm91bmRgLCB3b3JsZC1sb2NhbCBhbmQgd29ybGQtcG9zdGdyZXMgdGhyb3dcbiAqIGBTdGVwIFwic3RlcF/igKZcIiBub3QgZm91bmRgIGRpcmVjdGx5LiBUaGUgbWVzc2FnZSBtYXRjaCBpcyBkZWxpYmVyYXRlbHkgbG9vc2VcbiAqIGFjcm9zcyB0aG9zZSBzaGFwZXM7IHRoZSBzdGF0dXMgY2hlY2sgbmFycm93cyB0aGUgcmVtb3RlIGNhc2Ugd2l0aG91dFxuICogZXhjbHVkaW5nIHRoZSBsb2NhbCBvbmVzICh3aGljaCBjYXJyeSBubyBzdGF0dXMpLlxuICpcbiAqIFVzZWQgb25seSB3aGVuIHRoZSBtZXNzYWdlIGNhcnJpZXMgYHN0ZXBJbnB1dGAsIHNpbmNlIGEgYmFyZSBkaXNwYXRjaFxuICogd2l0aG91dCBhIHBheWxvYWQgaGFzIG5vdGhpbmcgdG8gcmVjb3ZlciBmcm9tLCBhbmQgdGhlIGVycm9yIGtlZXBzXG4gKiBwcm9wYWdhdGluZyBmb3IgcXVldWUtZHJpdmVuIHJlY292ZXJ5IGV4YWN0bHkgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBpc1N0ZXBNaXNzaW5nRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHJldHVybiBmYWxzZTtcbiAgaWYgKGVyci5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBlcnIuc3RhdHVzICE9PSA0MDQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9zdGVwL2kudGVzdChlcnIubWVzc2FnZSkgJiYgL25vdCBmb3VuZC9pLnRlc3QoZXJyLm1lc3NhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBIb3cgbWFueSBvZiBgaWRzYCBhcmUgYWJzZW50IGZyb20gYHByZXNlbnRgLiAqL1xuZnVuY3Rpb24gY291bnRNaXNzaW5nSWRzKGlkczogSXRlcmFibGU8c3RyaW5nPiwgcHJlc2VudDogU2V0PHN0cmluZz4pOiBudW1iZXIge1xuICBsZXQgbWlzc2luZyA9IDA7XG4gIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgaWYgKCFwcmVzZW50LmhhcyhpZCkpIG1pc3NpbmcrKztcbiAgfVxuICByZXR1cm4gbWlzc2luZztcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gcm9vdFJ1bklkRnJvbShcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZXM/LltST09UX1JVTl9JRF9BVFRSSUJVVEVdID8/IHJ1bklkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYSBob29rIGFuZC9vciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5LCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgVk0gcmV0ZW50aW9uLCB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCwgYW5kIHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0LiBBIHRlcm1pbmFsLXN0ZXAgZGVsdGEgY2FuIG9taXQgYW4gZXZlbnQgYXBwZW5kZWRcbiAqIGNvbmN1cnJlbnRseSBhZnRlciB0aGF0IHdyaXRlLiBXaXRoIG5vIG9wZW4gaG9vayBvciB3YWl0LCBvbmx5IGNhbmNlbGxhdGlvblxuICogY2FuIGRvIHNvLCBhbmQgb2JzZXJ2aW5nIGl0IG9uZSByZXBsYXkgbGF0ZSBpcyBzYWZlIGJlY2F1c2UgdGhlIG5leHQgZW50aXR5XG4gKiB3cml0ZSBpcyByZWplY3RlZC5cbiAqXG4gKiBTdGVwLWJvZHkgYGF0dHJfc2V0YCB3cml0ZXMgYXJlIE5PVCBhIGNvbmNlcm46IHRoZXkgbGFuZCBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYW5kIGFyZSB0aGVyZWZvcmUgYWxyZWFkeSBpbnNpZGUgdGhlIHJldHVybmVkXG4gKiBkZWx0YS5cbiAqL1xuZnVuY3Rpb24gb3Blbkhvb2tBbmRXYWl0U3RhdGUoZXZlbnRzOiBFdmVudFtdKToge1xuICBvcGVuSG9vazogYm9vbGVhbjtcbiAgb3BlbldhaXQ6IGJvb2xlYW47XG59IHtcbiAgY29uc3QgaG9va3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgd2FpdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnaG9va19jcmVhdGVkJzpcbiAgICAgICAgaG9va3MuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvb2tfZGlzcG9zZWQnOlxuICAgICAgICBob29rcy5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzpcbiAgICAgICAgd2FpdHMuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhaXRfY29tcGxldGVkJzpcbiAgICAgICAgd2FpdHMuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgb3Blbkhvb2s6IGhvb2tzLnNpemUgPiAwLCBvcGVuV2FpdDogd2FpdHMuc2l6ZSA+IDAgfTtcbn1cblxudHlwZSBSZXBsYXlFdmVudExvZyA9XG4gIHwgeyB0eXBlOiAnbG9hZEFsbCcgfVxuICB8ICh7IHR5cGU6ICdyZWFkeScgfSAmIExvYWRlZEV2ZW50TG9nKVxuICB8ICh7IHR5cGU6ICdsb2FkQWZ0ZXInOyBjdXJzb3I6IHN0cmluZyB9ICYgTG9hZGVkRXZlbnRMb2cpO1xuXG5mdW5jdGlvbiBuZXh0RXZlbnRMb2dMb2FkKGxvZzogTG9hZGVkRXZlbnRMb2cpOiBSZXBsYXlFdmVudExvZyB7XG4gIGlmIChsb2cuY3Vyc29yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbG9hZEFmdGVyJyxcbiAgICBldmVudHM6IGxvZy5ldmVudHMsXG4gICAgY3Vyc29yOiBsb2cuY3Vyc29yLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRFdmVudExvZyhsb2c6IExvYWRlZEV2ZW50TG9nLCBhcHBlbmRlZDogTG9hZGVkRXZlbnRMb2cpOiB2b2lkIHtcbiAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvZy5ldmVudHMsIGFwcGVuZGVkLmV2ZW50cyk7XG4gIGxvZy5jdXJzb3IgPSBhcHBlbmRlZC5jdXJzb3IgPz8gbG9nLmN1cnNvcjtcbn1cblxuLyoqXG4gKiBUaGUgd2hvbGUgcmV0ZW50aW9uIHByZWRpY2F0ZToga2VlcCB0aGUgc2Vzc2lvbiBvbmx5IGZvciBhIHB1cmUgc3RlcFxuICogYm91bmRhcnkgKGV2ZXJ5IHN1c3BlbnNpb24gaXRlbSBpcyBhIHN0ZXA6IGFueSBvdGhlciBpdGVtIHR5cGUsIHByZXNlbnRcbiAqIG9yIGZ1dHVyZSwgaXMgdW5yZXRhaW5hYmxlIGJ5IGRlZmF1bHQpIHdob3NlIG5ldyBzdGVwIGlucHV0cyBzZXJpYWxpemVkXG4gKiB3aXRob3V0IGV4ZWN1dGluZyB3b3JrZmxvdyBjb2RlLCB3aXRoIG5vIG91dC1vZi1iYW5kIGNvbnRpbnVhdGlvbiBzb3VyY2U6XG4gKiBhdHRyaWJ1dGVzIHJlcXVpcmUgcmVwbGF5OyBob29rcyBhbmQgd2FpdHMgY2FuIHdha2UgYW5vdGhlciBpbnZvY2F0aW9uLlxuICogYFdPUktGTE9XX1JFVEFJTkVEX1ZNPTBgIGRpc2FibGVzIHJldGVudGlvbiBlbnRpcmVseS5cbiAqXG4gKiBUaGUgb3BlbiBob29rL3dhaXQgc2NhbiBpcyBPKGV2ZW50cyksIHNvIGl0IGlzIHRha2VuIHRocm91Z2ggYSBsYXp5IGdldHRlclxuICogYW5kIGNvbnN1bHRlZCBsYXN0LCBhZnRlciBldmVyeSBjaGVhcCBjaGVjayBoYXMgcGFzc2VkLlxuICpcbiAqIElOVkFSSUFOVCB0aGlzIHByZWRpY2F0ZSBsZWFucyBvbjogZXZlcnkgc3VzcGVuc2lvbiBzaWduYWxlciB0aGF0IGRvZXMgTk9UXG4gKiBjYXJyeSB0aGUgc3RlcC1jb25zdW1lciBnZW5lcmF0aW9uIGd1YXJkIChzbGVlcCwgaG9vaywgYXR0cmlidXRlLCBzZWVcbiAqIGBzdXNwZW5zaW9uR2VuZXJhdGlvbmAgaW4gcHJpdmF0ZS50cykgbXVzdCBiZSB1bnJldGFpbmFibGUgaGVyZSwgZWl0aGVyIHZpYVxuICogYSBub24tc3RlcCBxdWV1ZSBpdGVtIG9yIHRoZSBvcGVuIGhvb2svd2FpdCBzY2FuLiBBIG5ldyBzaWduYWxlciB0aGF0XG4gKiBzYXRpc2ZpZXMgbmVpdGhlciB3b3VsZCBsZXQgYSBzdGFsZSBzaWduYWwgYmUgYWNjZXB0ZWQgYXMgYSBmcmVzaFxuICogc3VzcGVuc2lvbiBvbiBhIHJlc3VtZWQgc2Vzc2lvbi5cbiAqXG4gKiBRdWllc2NlbmNlIGFzc3VtZXMgd29ya2Zsb3cgY29kZSBzdGF5cyBpbnNpZGUgdGhlIHNhbmRib3gncyBkZXRlcm1pbmlzbVxuICogY29udHJhY3QuIEVzY2FwaW5nIHRvIHRoZSBob3N0IHJlYWxtIChlLmcuIHJlY292ZXJpbmcgdGhlIGhvc3QgYEZ1bmN0aW9uYFxuICogY29uc3RydWN0b3IgZnJvbSBhbiBleHBvc2VkIGhvc3QgY2xhc3MgdG8gc2NoZWR1bGUgcmVhbCB0aW1lcnMpIG1ha2VzIGFcbiAqIHdvcmtmbG93IG5vbmRldGVybWluaXN0aWMgdW5kZXIgb3JkaW5hcnkgcmVwbGF5IHRvbywgYW5kIGlzIG5vdCBkZWZlbmRlZFxuICogaGVyZS5cbiAqL1xuZnVuY3Rpb24gY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uKFxuICBzdXNwZW5zaW9uOiBXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHN0ZXBJbnB1dHNTYWZlOiBib29sZWFuLFxuICBvcGVuSG9va1dhaXQ6IHsgdmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIG9wZW5Ib29rQW5kV2FpdFN0YXRlPiB9XG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgICFpc1ZtUmV0ZW50aW9uRW5hYmxlZCgpIHx8XG4gICAgIXN0ZXBJbnB1dHNTYWZlIHx8XG4gICAgc3VzcGVuc2lvbi5zdGVwcy5sZW5ndGggPT09IDAgfHxcbiAgICAhc3VzcGVuc2lvbi5zdGVwcy5ldmVyeSgoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnc3RlcCcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IG9wZW5Ib29rLCBvcGVuV2FpdCB9ID0gb3Blbkhvb2tXYWl0LnZhbHVlO1xuICByZXR1cm4gIW9wZW5Ib29rICYmICFvcGVuV2FpdDtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGlubGluZS1leGVjdXRpb24gZHVyYXRpb24gZm9yIGEgc2luZ2xlIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqXG4gKiBPcmRlciBvZiBwcmVjZWRlbmNlOlxuICogMS4gYFdPUktGTE9XX1YyX1RJTUVPVVRfTVNgIGVudiB2YXJcbiAqIDIuIFRpZXJlZCBidWRnZXQgZGVyaXZlZCBmcm9tIGB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmUoKWBcbiAqIDMuIERlZmF1bHQgb2YgMiBtaW51dGVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaW52b2NhdGlvblN0YXJ0VGltZTogbnVtYmVyXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByYXdFbnZPdmVycmlkZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1YyX1RJTUVPVVRfTVM7XG4gIGlmIChyYXdFbnZPdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmIHJhd0Vudk92ZXJyaWRlICE9PSAnJykge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXdFbnZPdmVycmlkZSk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcnVudGltZURlYWRsaW5lID0gYXdhaXQgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lPy4oKTtcbiAgaWYgKHJ1bnRpbWVEZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVhZGxpbmVNcyA9IHJ1bnRpbWVEZWFkbGluZS5nZXRUaW1lKCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oZGVhZGxpbmVNcykpIHtcbiAgICAgIGNvbnN0IG1heER1cmF0aW9uTXMgPSBNYXRoLmZsb29yKGRlYWRsaW5lTXMgLSBpbnZvY2F0aW9uU3RhcnRUaW1lKTtcbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcyNW0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzEwbScpO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMTBtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCc1bScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtcygnMm0nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHJvdXRlIHdoaWNoIGhhbmRsZXMgd29ya2Zsb3cgZXhlY3V0aW9uIHJlcXVlc3RzLFxuICogZXhlY3V0aW5nIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBmdW5jdGlvbiBpbnZvY2F0aW9uc1xuICogYW5kIHF1ZXVlIG92ZXJoZWFkLlxuICpcbiAqIFRoZSBoYW5kbGVyIGxvb3BzOiByZXBsYXkgd29ya2Zsb3cg4oaSIGV4ZWN1dGUgc3RlcCBpbmxpbmUg4oaSIHJlcGxheSDihpIgLi4uXG4gKiB1bnRpbCB0aGUgd29ya2Zsb3cgY29tcGxldGVzLCB0aW1lcyBvdXQsIG9yIGVuY291bnRlcnMgbm9uLXN0ZXAgc3VzcGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGFsbCB3b3JrZmxvdyBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhIFZlcmNlbCBBUEkgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93RW50cnlwb2ludChcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBzZXRXb3JrZmxvd0Jhc2VQYXRoKG9wdGlvbnM/LmJhc2VQYXRoKTtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIFQyIG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93IChzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyk6XG4gICAgICAgIC8vIHRoZSBpbnN0YW50IHRoaXMgY29uc3VtZXIgYmVnYW4sIGJlZm9yZSBtZXNzYWdlIHBhcnNpbmcuIE9ubHkgdXNlZFxuICAgICAgICAvLyB3aGVuIHRoZSBtZXNzYWdlIHR1cm5zIG91dCB0byBjYXJyeSByZXN1bWUgdGltaW5nOyB0YWtpbmcgaXRcbiAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5IGtlZXBzIGl0IGhvbmVzdCBmb3IgdGhlIGRlbGl2ZXJpZXMgdGhhdCBkby5cbiAgICAgICAgY29uc3QgaGFuZGxlckVudGVyZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICAgIHN0ZXBJbnB1dCxcbiAgICAgICAgICBob29rUmVzdW1lVGltaW5nLFxuICAgICAgICAgIHdhaXRDb250aW51YXRpb24sXG4gICAgICAgIH0gPSBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuXG4gICAgICAgIC8vIC0tLSBIb29rLXJlc3VtZSBUVFIgdGVsZW1ldHJ5IChydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKSAtLS1cbiAgICAgICAgLy8gVGhyZWFkZWQgdGhyb3VnaCB0aGlzIGludm9jYXRpb24gYW5kIENPTlNVTUVEIGJ5IHRoZSBmaXJzdCBkdXJhYmxlXG4gICAgICAgIC8vIHN0ZXAgdGhhdCBmb2xsb3dzIHRoZSByZXN1bXB0aW9uLCBjbGVhcmVkIGF0IHRoYXQgcG9pbnQgc28gYSBsYXRlclxuICAgICAgICAvLyBzdGVwLCBhIHJldHJ5LCBvciBhIHJlZGVsaXZlcnkgbmV2ZXIgcmUtcmVwb3J0cyB0aGUgc2FtZSByZXN1bWUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFR3byBkZWxpdmVyeSBzaGFwZXMgY2FycnkgdGltaW5nOlxuICAgICAgICAvLyAgLSB0aGUgcmVzdW1lJ3Mgb3duIGludm9jYXRpb24gKG5vIGBzdGVwSWRgKTogdGhlIHByb2R1Y2VyJ3MgVDAvVDFcbiAgICAgICAgLy8gICAgcmlkZSB0aGUgbWVzc2FnZSBhbmQgdGhpcyBoYW5kbGVyJ3MgZW50cnkgaXMgVDIuXG4gICAgICAgIC8vICAtIGEgc3RlcCB0aGlzIGludm9jYXRpb24gaGFuZGVkIHRvIGFub3RoZXIgaW52b2NhdGlvbiAoYHN0ZXBJZGBcbiAgICAgICAgLy8gICAgcHJlc2VudCk6IHRoZSByZXN1bWluZyBpbnZvY2F0aW9uIGFscmVhZHkgc3RhbXBlZCBUMi4uVDQgb250b1xuICAgICAgICAvLyAgICB0aGUgbWVzc2FnZSwgc28gdGhleSBhcmUgcmVhZCBiYWNrIHZlcmJhdGltLlxuICAgICAgICBsZXQgcmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZ0Zyb21NZXNzYWdlKFxuICAgICAgICAgIGhvb2tSZXN1bWVUaW1pbmcsXG4gICAgICAgICAgaW5jb21pbmdTdGVwSWQgIT09IHVuZGVmaW5lZCA/ICdkaXNwYXRjaGVkJyA6ICdpbmxpbmUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bWVUcmFja2luZyAmJiBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdW1lVHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcyA9IGhhbmRsZXJFbnRlcmVkQXRNcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzdW1lVHJhY2tpbmcgJiZcbiAgICAgICAgICAhTnVtYmVyLmlzRmluaXRlKHJlc3VtZVRyYWNraW5nLmNvbnN1bWVyU3RhcnRlZEF0TXMpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEEgc3RlcCBtZXNzYWdlIGZyb20gYSBwcm9kdWNlciB0aGF0IGZvcndhcmRlZCB0aW1pbmcgd2l0aG91dCB0aGVcbiAgICAgICAgICAvLyBjb25zdW1lciBib3VuZGFyaWVzLiBOb3RoaW5nIGFkZGl0aXZlIGNhbiBiZSByZXBvcnRlZC5cbiAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBgc3RhcnQoKWAgYWx3YXlzIGF0dGFjaGVzIGEgdHJhY2UgY2FycmllciwgYnV0XG4gICAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gb3Igbm8gc3BhbiBpcyBhY3RpdmUsIHNvIHRyZWF0IGFuIGVtcHR5IGNhcnJpZXIgdGhlIHNhbWUgYXMgYW5cbiAgICAgICAgLy8gYWJzZW50IG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ1RyYWNlQ2FycmllcilcbiAgICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHdvcmtmbG93UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBydW5hd2F5IHdvcmtmbG93cyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAvLyBTY29wZWQgbG9nZ2VyIGZvciB0aGlzIHJ1bjogYXR0YWNoZXMgcnVuSWQvd29ya2Zsb3dOYW1lIHRvIGV2ZXJ5XG4gICAgICAgIC8vIGxvZyBsaW5lIGFuZCBjaGlsZCBsb2dnZXJzIGJlbG93LCBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgICAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgICAgICAgY29uc3QgbWF4UXVldWVEZWxpdmVyaWVzID0gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb25cbiAgICAgICAgLy8gKHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMpIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciwgd2hlcmUgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzLlxuICAgICAgICAvLyBTZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVGhlIHJlcGxheSBidWRnZXQgY292ZXJzIG9yY2hlc3RyYXRpb24gd29yayBiZXR3ZWVuIHN0ZXBzLCBub3QgaW5saW5lXG4gICAgICAgIC8vIHN0ZXAgYm9kaWVzLiBJdCBpcyBjaGVja2VkIGJldHdlZW4gbG9vcCBpdGVyYXRpb25zOyBzdGVwIGJvZGllcyB1c2VcbiAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHRpbWVvdXQgYW5kIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgZ3VhcmQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dDogcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBCb3RoIGNoZWNrcyBiZWxvdyBsb29rIGF0IGBydW5JbnB1dGAsIHNvIGJvdGggYXJlIG5vLW9wcyBvbiBhXG4gICAgICAgICAgICAgIC8vIHJlLWVucXVldWVkIG1lc3NhZ2UgKHdoaWNoIGNhcnJpZXMgbm9uZSk6IHRoZXkgb25seSBldmVyIHJ1biBvblxuICAgICAgICAgICAgICAvLyBhIGZpcnN0IGRlbGl2ZXJ5LCB0aGUgb25lIHRoYXQgY291bGQgY3JlYXRlIHRoZSBydW4uXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFJldHVybmluZyBhY2tzIHRoZSBtZXNzYWdlLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBtaXNtYXRjaCBpc1xuICAgICAgICAgICAgICAvLyBiYWtlZCBpbnRvIHRoaXMgbWVzc2FnZSwgc28gZXZlcnkgcmVkZWxpdmVyeSB3b3VsZCByZWFjaCB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB2ZXJkaWN0LCBhbmQgdGhyb3dpbmcgd291bGQgaG90LWxvb3AgdGhlIGhhbmRsZXIgdW50aWxcbiAgICAgICAgICAgICAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgd2l0aCB0aGUgc2FtZSBlcnJvciBlYWNoIHRpbWUuIEl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgLy8gaG93IHRoZSBydW5fc3RhcnRlZCBwYXRoIGFscmVhZHkgZGlzY2FyZHMgZGVsaXZlcmllcyB3aG9zZVxuICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGNhbm5vdCBjaGFuZ2UgKEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvcikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljIG9ubHkuIFNlZSB0aGUgaGVscGVyIGZvciB3aHkgdGhpcyB3YXJucyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgIC8vIHJlZnVzaW5nIHRoZSBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICBhd2FpdCB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vSW5saW5lUmVwbGF5QWZ0ZXJNcyA9IGF3YWl0IGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9IHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcihyZXBsYXlEaXZlcmdlbmNlLmNvdW50KVxuICAgICAgICAgICAgICAgICAgICA6IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IHdyaXRlIHRoaXMgbG9vcCBtYWtlcyBjYXJyaWVzIHRoZSBjdXJzb3Igb2YgdGhlIGxvZ1xuICAgICAgICAgICAgICAgICAgLy8gaXQgd2FzIGNvbXB1dGVkIGFnYWluc3QsIGFuZCBmb2xkcyBhIGNvbXBsZXRlIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWx0YSBpbnRvIHRoYXQgbG9nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlRXZlbnQgPSBhc3luYyA8VCBleHRlbmRzIENyZWF0ZUV2ZW50UmVxdWVzdD4oXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2luY2VDdXJzb3IgPSBkZWx0YVJlcXVlc3RDdXJzb3IoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2l0aFNuYXBzaG90ID0geyAuLi5zbG90U25hcHNob3QoKSwgLi4ucGFyYW1zIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHNpbmNlQ3Vyc29yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gd2l0aFNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ud2l0aFNuYXBzaG90LCBzaW5jZUN1cnNvciB9LFxuICAgICAgICAgICAgICAgICAgICAgIChwKSA9PiB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCBkYXRhLCBwKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGFic29yYkNyZWF0ZURlbHRhKHNpbmNlQ3Vyc29yLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBzbG90IHNuYXBzaG90IGZvciBhIHdyaXRlIGlzc3VlZCBmcm9tIHRoaXMgbG9vcDogaG93XG4gICAgICAgICAgICAgICAgICAgKiBtdWNoIG9mIHRoZSBydW4ncyBsb2cgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCB3YXMgbWFkZVxuICAgICAgICAgICAgICAgICAgICogYWdhaW5zdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVyeSB3cml0ZSBnb2VzIHRocm91Z2ggaGVyZSwgaW5jbHVkaW5nIHRoZSBvbmVzIHRoYXQgYXNrXG4gICAgICAgICAgICAgICAgICAgKiBmb3IgYW4gaW5saW5lIGRlbHRhLiBUaGUgdHdvIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZFxuICAgICAgICAgICAgICAgICAgICogYSBXb3JsZCBpcyBmcmVlIHRvIHNlcnZlIGJvdGg6IHRoZSBjdXJzb3Igc2F5cyB3aGVyZSB0b1xuICAgICAgICAgICAgICAgICAgICogc3RhcnQgbGlzdGluZyBmcm9tLCB0aGUgc2xvdCBzYXlzIHdoaWNoIGV2ZW50cyB0aGlzIHdyaXRlclxuICAgICAgICAgICAgICAgICAgICogaGFkIGFscmVhZHkgZGVjaWRlZCB3aXRob3V0LiBXb3JsZHMgdGhhdCB0cmVhdCB0aGUgZGVsdGEgYXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBiZXR0ZXIgYW5zd2VyIGlnbm9yZSB0aGUgc2xvdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUYWtlbiBmcm9tIHdoYXRldmVyIGlzIGxvYWRlZCwgaW5jbHVkaW5nIHRoZSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICogYGxvYWRBZnRlcmAgc3RhdGUuIFVuZGVyc3RhdGluZyBpcyBzYWZlOiB0aGUgV29ybGQgcmVwb3J0c1xuICAgICAgICAgICAgICAgICAgICogYmFjayBhIHdpZGVyIHNwYW4gdGhhbiBzdHJpY3RseSBuZWVkZWQsIGFuZFxuICAgICAgICAgICAgICAgICAgICogYG1lcmdlUmVwb3J0ZWRFdmVudHNgIGRyb3BzIHdoYXQgdGhlIGxvZyBhbHJlYWR5IGhvbGRzLlxuICAgICAgICAgICAgICAgICAgICogT3ZlcnN0YXRpbmcgaXMgbm90LCBzbyB0aGVyZSBpcyBubyBndWVzc2luZyB3aGVuIG5vdGhpbmcgaXNcbiAgICAgICAgICAgICAgICAgICAqIGxvYWRlZCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNsb3RTbmFwc2hvdCA9ICgpOiBTbG90U25hcHNob3RQYXJhbXMgPT5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBbGwnXG4gICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgIDogc2xvdFNuYXBzaG90UGFyYW1zKGV2ZW50TG9nLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGN1cnNvciB0byBhc2sgZm9yIGFuIGlubGluZSBkZWx0YSBhZ2FpbnN0LCBvclxuICAgICAgICAgICAgICAgICAgICogdW5kZWZpbmVkIHRvIG5vdCBhc2suXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVHVyYm8gaXMgZXhjbHVkZWQgb24gcHVycG9zZTogaXQgZXhpc3RzIHRvIG1ha2UgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgKiBpbnZvY2F0aW9uJ3Mgd3JpdGVzIGFzIGNoZWFwIGFzIHBvc3NpYmxlLCBhbmQgaXQgaGFzIG5vXG4gICAgICAgICAgICAgICAgICAgKiBsb2FkZWQgbG9nIHRvIGV4dGVuZC4gUnVuLXRlcm1pbmFsIHdyaXRlcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAqIGJlY2F1c2Ugbm90aGluZyByZWFkcyB0aGUgbG9nIGFmdGVyd2FyZHMsIHNvIHRoZSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogd291bGQgYmUgd29yayB0aGUgV29ybGQgZG9lcyBmb3Igbm8gb25lLiBBIGNhbGxlciB0aGF0XG4gICAgICAgICAgICAgICAgICAgKiBzZXQgaXRzIG93biBgc2luY2VDdXJzb3JgIChvciBhc2tlZCBmb3IgdGhlIGBydW5fc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAqIC8gYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQsIHdoaWNoIG93bnMgdGhlIHNhbWUgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAqIGZpZWxkcykga2VlcHMgd2hhdCBpdCBhc2tlZCBmb3IuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhUmVxdWVzdEN1cnNvciA9IChcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IENyZWF0ZUV2ZW50UGFyYW1zIHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgdHVyYm8gfHxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAncmVhZHknIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPy5zaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPy5wcmVsb2FkRXZlbnRzID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaXNUZXJtaW5hbFJ1bkV2ZW50VHlwZShkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRMb2cuY3Vyc29yID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRm9sZCBhbiBpbmxpbmUgZGVsdGEgcmV0dXJuZWQgYnkgYGV2ZW50cy5jcmVhdGVgIGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1tZW1vcnkgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBkZWx0YSBpcyB3aGF0IGBldmVudHMubGlzdCh7IGN1cnNvcjogc2VudEN1cnNvciB9KWBcbiAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGhhdmUgcmV0dXJuZWQgcmlnaHQgYWZ0ZXIgdGhlIHdyaXRlLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgKiBiYWNrIGJvdGggb3VyIG93biBldmVudCBhbmQgYW55dGhpbmcgYW5vdGhlciB3cml0ZXJcbiAgICAgICAgICAgICAgICAgICAqIGFwcGVuZGVkIGluIGJhbmQuIEFic29yYmluZyBpdCBoZXJlIG1lYW5zIHRoZSBuZXh0IHJlYWRlclxuICAgICAgICAgICAgICAgICAgICogYWxyZWFkeSBoYXMgdGhlIGxvZyBhbmQgdGhlIGxvb3AncyBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICogYGV2ZW50cy5saXN0YCBmaW5kcyBub3RoaW5nIGxlZnQgdG8gZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRGVsaWJlcmF0ZWx5IG5vdCBgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnRgLCBldmVuIHRob3VnaCB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGBoYXNNb3JlYCBoYWxmIG9mIHRoZSB0d28gcG9saWNpZXMgY29pbmNpZGVzLiBBIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiBleHRlbmRzIHRoZSB0YWlsIGFuZCBjYXJyaWVzIGEgY3Vyc29yIHRoYXQgaGFzIHRvIG1vdmUgd2l0aFxuICAgICAgICAgICAgICAgICAgICogaXQsIHNvIGl0IGFwcGVuZHMgd2l0aG91dCByZS1zb3J0aW5nIGFuZCBuZWVkcyB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiBndWFyZCBiZWxvdzsgYSBza2lwcGVkLXNsb3QgcmVwb3J0IGlzIGEgd2luZG93IHN0cmljdGx5XG4gICAgICAgICAgICAgICAgICAgKiBiZWxvdyB0aGUgd3JpdGUsIGNhcnJpZXMgbm8gY3Vyc29yLCBhbmQgaGFzIHRvIGJlIHNvcnRlZFxuICAgICAgICAgICAgICAgICAgICogYmFjayBpbnRvIHBsYWNlLiBTaGFyaW5nIGFuIGltcGxlbWVudGF0aW9uIHdvdWxkIG1lYW4gb25lXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGVtIGRvaW5nIHRoZSBvdGhlcidzIHdvcmsuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRGVjbGluaW5nIGlzIGFsd2F5cyBzYWZlIChhbiB1bmFic29yYmVkIGRlbHRhIGlzIGEgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBuZXh0IGBldmVudHMubGlzdGAgcmV0dXJucyksIHNvIHRoZSBndWFyZHMgYXJlIGZyZWUgdG9cbiAgICAgICAgICAgICAgICAgICAqIGJlIHN0cmljdDpcbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiAtIGBoYXNNb3JlYCBtZWFucyB0aGUgV29ybGQgdHJ1bmNhdGVkIHRoZSBwYWdlLiBUYWtpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAqICAgd2hpbGUgYWR2YW5jaW5nIHRoZSBjdXJzb3IgdG8gdGhlIHBhZ2UgZW5kIHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgKiAgIGZpbmUsIGJ1dCB0YWtpbmcgaXQgYW5kIE5PVCBhZHZhbmNpbmcgd291bGQgZHVwbGljYXRlLFxuICAgICAgICAgICAgICAgICAgICogICBhbmQgdGhlIHRydW5jYXRlZCBjYXNlIGlzIHJhcmUgZW5vdWdoIG5vdCB0byBzcGVjaWFsLWNhc2UuXG4gICAgICAgICAgICAgICAgICAgKiAtIFRoZSBjdXJzb3IgbXVzdCBiZSBleGFjdGx5IHdoZXJlIGl0IHdhcyB3aGVuIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdlbnQgb3V0LiBDb25jdXJyZW50IHdyaXRlcyBlYWNoIGRpZmYgYWdhaW5zdCB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiAgIHRoZXkgc2F3LCBhbmQgYGFwcGVuZFVuaXF1ZUV2ZW50c2AgZGVsaWJlcmF0ZWx5IGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgKiAgIHJlLXNvcnQsIHNvIGFic29yYmluZyBhIHNlY29uZCBkZWx0YSBjb21wdXRlZCBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAgKiAgIG9sZGVyIGN1cnNvciBjb3VsZCBhcHBlbmQgZXZlbnRzIGJlaGluZCBvbmVzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAqICAgdGFrZW4uIEZpcnN0IHJlc3BvbnNlIGJhY2sgd2luczsgdGhlIHJlc3QgYXJlIGRyb3BwZWQuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29yYkNyZWF0ZURlbHRhID0gKFxuICAgICAgICAgICAgICAgICAgICBzZW50Q3Vyc29yOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogRXZlbnRSZXN1bHRcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvciAhPT0gc2VudEN1cnNvciB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gYHJlYWR5YCBjYW4gcmVwbGF5IG9uY2Ugd2l0aG91dCBhIHJlYWQuIFRoZSBvdGhlciBzdGF0ZXNcbiAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaWJlIHRoZSBuZXh0IGxvYWQgZXhhY3RseS5cbiAgICAgICAgICAgICAgICAgIGxldCBldmVudExvZzogUmVwbGF5RXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgc3RhdGU6IHNldCBieSBlaXRoZXIgdGhlIGJhY2tncm91bmQgc3RlcCBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBvciB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gU2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZyBmcm9tIHRoZSBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UuIFVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQgKG9sZGVyIHNlcnZlcnMsIHR1cmJvKS5cbiAgICAgICAgICAgICAgICAgIGxldCBtYXhFdmVudHNMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93U3RhcnRlZEF0ID0gLTE7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZS4gU2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESzogYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlLiBTZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy4gQWNjdW11bGF0b3JzIGhlcmUgc3Vydml2ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydCAoYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24sIG9yXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlLWV2ZW50IHJlc3RhcnQgYmVsb3cpLCBzbyBhIHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBvdmVyLWNvdW50cyBieSB0aGUgYWJhbmRvbmVkIHBhc3MncyBob29rIHRpbWUsXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzbGlnaHQgb3Zlci1jb3VudCBlaXRoZXIgcmVzdGFydCBoYXMgYWx3YXlzIGhhZC5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCwgc2luY2UgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgaXQgaXMgcHJvdmFibHkgc2FmZSB0bzogYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCwgc2tpcCB0aGUgaW5pdGlhbCBldmVudC1sb2cgbG9hZCAobm90aGluZyBoYXNcbiAgICAgICAgICAgICAgICAgIC8vIGJlZW4gd3JpdHRlbiB5ZXQpLCBhbmQgZm9yY2Ugb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgKG5vXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHBlZXIgaGFuZGxlciBleGlzdHMgdG8gcmFjZSB0aGUgY3JlYXRlLWNsYWltKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBydW5JbnB1dGAgaXMgb25seSBwcmVzZW50IG9uIHRoZSBzdGFydCgpLWVucXVldWVkIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYGF0dGVtcHQgPT09IDFgICgxLWJhc2VkKSBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnk7IGBpbmNvbWluZ1N0ZXBJZGAgd291bGQgbWFyayBhIGJhY2tncm91bmQtc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIGEgcmVjb3ZlcnkgcmVwbGF5LCBib3RoXG4gICAgICAgICAgICAgICAgICAvLyBpbmVsaWdpYmxlLiBUaGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXMgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgZW5kcyBvbmNlIGEgaG9vayBvciB3YWl0IGlzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGludHJvZHVjZSByZXN1bWUgaW52b2NhdGlvbnMpLCBzbyB0dXJibyBleGl0cyBhdCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBwb2ludCAoc2VlIGBmb3JjZU9wdGltaXN0aWNTdGFydGApLiBXb3JrZmxvdyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBpbnRyb2R1Y2Ugbm8gc3VjaCBpbnZvY2F0aW9uIHNvdXJjZTogdGhleSByZXNvbHZlXG4gICAgICAgICAgICAgICAgICAvLyB2aWEgYW4gaW4tcHJvY2VzcyByZXBsYXkgYW5kIGRvbid0IGVuZCB0dXJiby5cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGBtZXRhZGF0YS5hdHRlbXB0ID09PSAxYCBpcyBhbHNvIGxvYWQtYmVhcmluZyBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIG93bmVyc2hpcDogb3duZWQtcmVjb3Zlcnkgc3RlcHMgKGEgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gc3RhbXBlZCBieSBhIFBSRVZJT1VTIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSkgY2FuIG9ubHlcbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0IG9uIGF0dGVtcHQg4omlIDIsIHNvIHR1cmJvIGFuZCBvd25lZCByZWNvdmVyeSBhcmVcbiAgICAgICAgICAgICAgICAgIC8vIG11dHVhbGx5IGV4Y2x1c2l2ZS4gVGhlIHR1cmJvIGByZWludm9rZSgpYCBwYXRocyAoaG9va1xuICAgICAgICAgICAgICAgICAgLy8gY29uZmxpY3QsIHRocm90dGxlIGJhY2tvZmYpIGFjayB0aGlzIG1lc3NhZ2UgYW5kIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkLCBzYWZlIG9ubHkgYmVjYXVzZSBub1xuICAgICAgICAgICAgICAgICAgLy8gbm9uLXRlcm1pbmFsIHN0ZXAgY2FuIGJlIGlubGluZS1vd25lZCBieSB0aGUgYWNrZWQgaWRcbiAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHVyYm8gaXMgb24uIElmIHR1cmJvIGV2ZXIgZW5nYWdlcyBvbiByZWRlbGl2ZXJpZXMsXG4gICAgICAgICAgICAgICAgICAvLyB0aG9zZSBwYXRocyBtdXN0IGZpcnN0IGNoZWNrIGZvciBvd25lZCBwZW5kaW5nIHN0ZXBzIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGB7IHRpbWVvdXRTZWNvbmRzIH1gIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0dXJibyA9XG4gICAgICAgICAgICAgICAgICAgIGlzVHVyYm9FbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hdHRlbXB0ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJlcGxheURpdmVyZ2VuY2U7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5Xb3JrZmxvd1R1cmJvKHR1cmJvKSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgb25seTogcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQgKG9yIHJlamVjdHMgaWYgaXQgZmFpbGVkKS4gVGhyZWFkZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludG8gaGFuZGxlU3VzcGVuc2lvbiBhbmQgZXhlY3V0ZVN0ZXAgc28gbm8gc3RlcC9ob29rL3dhaXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHJhY2VzIGFoZWFkIG9mIHRoZSBydW4ncyBjcmVhdGlvbi4gVW5kZWZpbmVkIG91dHNpZGVcbiAgICAgICAgICAgICAgICAgIC8vIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAgICAgICAgICAgICAgICBsZXQgcnVuUmVhZHlCYXJyaWVyOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBPcmRlciBhIHRlcm1pbmFsIHJ1biB3cml0ZSAocnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQpIGFmdGVyXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIGluIHR1cmJvIG1vZGUsIHNpbmNlIGEgbm8tc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2FuIG90aGVyd2lzZSByZWFjaCBydW5fY29tcGxldGVkIGJlZm9yZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAvLyBleGlzdHMuIEJlc3QtZWZmb3J0OiBhIGJhcnJpZXIgcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIG9yZGVyaW5nIG9ubHk7IGlmIHJ1bl9zdGFydGVkIHRydWx5IGZhaWxlZCB0aGUgdGVybWluYWwgd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIHN1cmZhY2VzIHRoZSByZWFsIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgY29uc3QgYXdhaXRSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blJlYWR5QmFycmllcikge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW5SZWFkeUJhcnJpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIG9yY2hlc3RyYXRvci4gT3V0c2lkZSB0dXJibyB0aGlzIHJldHVybnNcbiAgICAgICAgICAgICAgICAgIC8vIGB7IHRpbWVvdXRTZWNvbmRzIH1gLCB3aGljaCBtYWtlcyB0aGUgcXVldWUgcmVzY2hlZHVsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgZGVsaXZlcnkncyBtZXNzYWdlLiBJbiB0dXJibyB0aGF0IGlzIGEgdHJhcDogdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgLCBhbmQgb24gYXN5bmMgcXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyAoZS5nLiBncmFwaGlsZS13b3JrZXIpIGEgcmVzY2hlZHVsZSBjb21lcyBiYWNrIGFzIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDEsIHNvIHR1cmJvIHJlLWVuZ2FnZXMsIHNraXBzIHRoZSBldmVudC1sb2cgbG9hZFxuICAgICAgICAgICAgICAgICAgLy8gYWdhaW4sIHJlcGxheXMgYWdhaW5zdCBhbiBlbXB0eSBsb2csIG5ldmVyIG9ic2VydmVzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9vayBldmVudCB0aGlzIGludm9jYXRpb24ganVzdCB3cm90ZSwgYW5kIHJlLXN1c3BlbmRzXG4gICAgICAgICAgICAgICAgICAvLyBmb3JldmVyICh0aGUgcnVuIHdlZGdlcykuIFVuZGVyIHR1cmJvIHdlIGluc3RlYWQgZW5xdWV1ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgY29udGludWF0aW9uIHRoYXQgY2FycmllcyBOTyBgcnVuSW5wdXRgLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5leHQgZGVsaXZlcnkgaXMgYSBub3JtYWwgKG5vbi10dXJibykgbG9hZC1hbmQtcmVwbGF5IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVzIHRoZSBjb21taXR0ZWQgZXZlbnRzIGFuZCBtYWtlcyBwcm9ncmVzczsgd2UgdGhlblxuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBxdWV1ZSB0cmVhdHMgdGhpcyBkZWxpdmVyeSBhcyBkb25lXG4gICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhbHNvIHJlc2NoZWR1bGluZyBpdC5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgaW52YXJpYW50IGd1YXJkOiBjb3JyZWxhdGlvbiBJRHMgb2ZcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIHdob3NlIGJvZGllcyB0aGlzIGludm9jYXRpb24gaXMgZXhlY3V0aW5nIHVuZGVyIGFuXG4gICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgc3RhbXAgKGxhenkgaW5saW5lICsgb3duZWQgcmVjb3ZlcnkpLCB3aGlsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGJvZHkgaXMgaW4gZmxpZ2h0LiBDcmFzaCByZWNvdmVyeSBkZXBlbmRzIG9uIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgTk9UIGJlaW5nIGFja2VkIHdoaWxlIHN1Y2ggYSBzdGVwIGlzIG5vbi10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gKGFjayA9IGhhbmRsZXIgcmV0dXJuIG9yIHJlaW52b2tlLCB3aGljaCBhY2tzICsgZW5xdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgTkVXIG1lc3NhZ2UgaWQ6IHRoZSByZWRlbGl2ZXJ5IG9mIHRoZSBvbGQgaWQgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHdoYXQgcmUtZXhlY3V0ZXMgYW4gb3JwaGFuZWQgb3duZWQgc3RlcCkuIEFsbCBleGVjdXRlU3RlcFxuICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgYXJlIGF3YWl0ZWQgYmVmb3JlIGFueSBhY2sgcGF0aCBydW5zLCBzbyB0aGlzIHNldFxuICAgICAgICAgICAgICAgICAgLy8gaXMgZW1wdHkgYXQgZXZlcnkgYWNrIGJ5IGNvbnN0cnVjdGlvbjsgdGhlIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggZnV0dXJlIHJlZmFjdG9ycyB0aGF0IGJyZWFrIHRoYXQgb3JkZXJpbmcuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbkZsaWdodE93bmVkU3RlcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzID0gKFxuICAgICAgICAgICAgICAgICAgICBhY2tQYXRoOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5GbGlnaHRPd25lZFN0ZXBzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhcmlhbnQgdmlvbGF0aW9uOiBhY2tpbmcgdGhlIHdvcmtmbG93IG1lc3NhZ2Ugd2hpbGUgb3duZWQgaW5saW5lIHN0ZXBzIGFyZSBzdGlsbCBleGVjdXRpbmcg4oCUIGNyYXNoIHJlY292ZXJ5IGZvciB0aGVzZSBzdGVwcyBpcyBicm9rZW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogWy4uLmluRmxpZ2h0T3duZWRTdGVwc10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gQSBwbGFpbiBvcmNoZXN0cmF0b3ItcmVwbGF5IG1lc3NhZ2UuIE9taXRzIGBydW5JbnB1dGAgKGl0XG4gICAgICAgICAgICAgICAgICAvLyByZS1lbmdhZ2VzIHR1cmJvIG9uIHRoZSBuZXh0IGRlbGl2ZXJ5IGFuZCB3ZWRnZXMgdGhlIHJ1bixcbiAgICAgICAgICAgICAgICAgIC8vIHNlZSBgcmVpbnZva2VgIGJlbG93KSBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIC9cbiAgICAgICAgICAgICAgICAgIC8vIGBzZXJ2ZXJFcnJvclJldHJ5Q291bnRgICh0aGlzIGRlbGl2ZXJ5IGNoYWluJ3MgYnVkZ2V0cykuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlNZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCk6IFByb21pc2U8V29ya2Zsb3dJbnZva2VQYXlsb2FkPiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2UgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogRXh0cmEgZmllbGRzIHRvIGNhcnJ5IG9uIHRoZSBuZXcgbWVzc2FnZS4gT25seSByZWFjaGVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiBuZXh0IGludm9jYXRpb24gb24gdGhlIHR1cmJvIHBhdGg6IHdpdGhvdXQgdHVyYm8gbm9cbiAgICAgICAgICAgICAgICAgICAgICogbWVzc2FnZSBpcyBlbnF1ZXVlZCBhdCBhbGw6IHRoZSBoYW5kbGVyIHJldHVybnMgYVxuICAgICAgICAgICAgICAgICAgICAgKiB2aXNpYmlsaXR5IHRpbWVvdXQgYW5kIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIHRoZSBDVVJSRU5UXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UsIHdob3NlIGJvZHkgKGFuZCB0aGVyZWZvcmUgYW55IGNvdW50ZXIgb24gaXQpXG4gICAgICAgICAgICAgICAgICAgICAqIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZXh0cmFQYXlsb2FkPzogUGFydGlhbDxXb3JrZmxvd0ludm9rZVBheWxvYWQ+XG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzKCdyZWludm9rZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXR1cmJvKSByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogZGVsYXlTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgeyAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSwgLi4uZXh0cmFQYXlsb2FkIH0sXG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzID4gMCA/IHsgZGVsYXlTZWNvbmRzIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbiAoNDEyKSByZWNvdmVyeTogaG93IG1hbnkgdGltZXMgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAvLyBoYXMgdGhyb3duIGF3YXkgaXRzIHJlcGxheSBhbmQgc3RhcnRlZCBvdmVyIGluLXByb2Nlc3MuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlY29uZGl0aW9uUmVzdGFydHMgPSAwO1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVudCBpZHMgdGhlIGRpc2NhcmRlZCByZXBsYXkgaGVsZCwga2VwdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICogbG9hZCByZXNvbHZlcyBzbyBhIHJlc3RhcnQgY2FuIHJlcG9ydCB3aGF0IGl0cyByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAqIGFjdHVhbGx5IGZvdW5kLiBXaXRob3V0IHRoaXMgYSA0MTIgb25seSBldmVyIHRlbGxzIHlvdSB0aGF0XG4gICAgICAgICAgICAgICAgICAgKiBhIHJlc3RhcnQgaGFwcGVuZWQsIHdoaWNoIGNvbmZsYXRlcyB0d28gZGlzdGluY3RcbiAgICAgICAgICAgICAgICAgICAqIHNpdHVhdGlvbnM6IGEgbG9nIHRoYXQgZ3JldyAoZXhwZWN0ZWQsIHRoZSBmZW5jZSBkaWQgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBqb2IpIGFuZCBhIGxvZyB0aGF0IGNhbWUgYmFjayBpZGVudGljYWwsIHdoaWNoIG1lYW5zIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tlbmQgZGlzYWdyZWUgYWJvdXQgdGhlIGNvdW50IGZvciB0aGUgc2FtZSBzZXQgb2ZcbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50cyBhbmQgdGhlIHJlc3RhcnQgd2lsbCByZS1kZXJpdmUgdGhlIHNhbWUgc25hcHNob3QgYW5kXG4gICAgICAgICAgICAgICAgICAgKiBiZSByZWplY3RlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZToge1xuICAgICAgICAgICAgICAgICAgICBpZHM6IFNldDxzdHJpbmc+O1xuICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpbmxpbmUtZGVsdGEnIHwgJ2Z1bGwtcmVsb2FkJztcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogUmVwb3J0IHdoYXQgYSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0J3MgcmVsb2FkIGZvdW5kLCBvbmNlXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgbG9nIHRoaXMgcmVwbGF5IHdpbGwgYWN0dWFsbHkgY29uc3VtZSBpcyBpbiBoYW5kLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIGBncmV3YCBpcyB0aGUgZXhwZWN0ZWQgY2FzZSBhbmQgZ2l2ZXMgNDEyIHZvbHVtZSBhXG4gICAgICAgICAgICAgICAgICAgKiBkZW5vbWluYXRvci4gYHVuY2hhbmdlZGAgbWVhbnMgdGhlIHJlbG9hZCBkaXNhZ3JlZWQgd2l0aFxuICAgICAgICAgICAgICAgICAgICogdGhlIHJlamVjdGlvbiwgc28gdGhpcyByZXBsYXkgcmUtZGVyaXZlcyB0aGUgc2FtZSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICogYW5kIGlzIHJlamVjdGVkIGFnYWluIHVudGlsIHRoZSBidWRnZXQgaXMgc3BlbnQuIGBzaHJhbmtgXG4gICAgICAgICAgICAgICAgICAgKiBzaG91bGQgYmUgaW1wb3NzaWJsZTogZXZlcnkgbG9hZCBwYXRoIG9ubHkgYWRkcyB0byBhIHJ1bidzXG4gICAgICAgICAgICAgICAgICAgKiBsb2cuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQgPSAoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50czogRXZlbnRbXVxuICAgICAgICAgICAgICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VsaW5lID0gcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VsaW5lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkZWRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRlZCA9IGNvdW50TWlzc2luZ0lkcyhyZWxvYWRlZElkcywgYmFzZWxpbmUuaWRzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGNvdW50TWlzc2luZ0lkcyhiYXNlbGluZS5pZHMsIHJlbG9hZGVkSWRzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0Y29tZSA9XG4gICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCA+IDAgPyAnc2hyYW5rJyA6IGFkZGVkID4gMCA/ICdncmV3JyA6ICd1bmNoYW5nZWQnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnUmVzdGFydGVkIHJlcGxheSByZWxvYWRlZCBpdHMgZXZlbnQgbG9nIGFmdGVyIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNCZWZvcmU6IGJhc2VsaW5lLmlkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQWZ0ZXI6IHJlbG9hZGVkSWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0czogYmFzZWxpbmUucmVzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogYmFzZWxpbmUucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBiYXNlbGluZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlY292ZXIgZnJvbSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBieSByZXN0YXJ0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGluc2lkZSB0aGlzIGludm9jYXRpb24sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICogcGVyLWludm9jYXRpb24gYnVkZ2V0IGlzIHNwZW50ICh0aGUgY2FsbGVyIHRoZW4gZmFsbHMgYmFja1xuICAgICAgICAgICAgICAgICAgICogdG8gYSBmcmVzaCBpbnZvY2F0aW9uKS5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBBIDQxMiBtZWFucyB0aGUgbG9nIHRoaXMgcmVwbGF5IGRlcml2ZWQgaXRzIGV2ZW50cyBmcm9tIHdhc1xuICAgICAgICAgICAgICAgICAgICogbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBoYWQgYWxyZWFkeSByZWNvcmRlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgKiByZWplY3RlZCB3cml0ZSBjYW5ub3QgYmUgcmV0cmllZDogY29ycmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgICAgKiBhcmUgcG9zaXRpb25hbCBvcmRpbmFscyBvZiBvbmUgc2VlZGVkIHNlcXVlbmNlLCBzbyBhIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBtaW50cyBhIGRpZmZlcmVudCBpZCBmb3IgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAqIGxvZ2ljYWwgZXZlbnQsIGFuZCByZS1wb3N0aW5nIHRoaXMgb25lIHdvdWxkIHBlcnNpc3QgYW5cbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IGV2ZXIgcHJvZHVjZXMuIFRoZSB3aG9sZSByZXBsYXkgaGFzXG4gICAgICAgICAgICAgICAgICAgKiB0byBiZSByZS1kZXJpdmVkLCB3aGljaCB0aGUgbG9vcCBkb2VzIGJ5IGRpc2NhcmRpbmcgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBjYWNoZWQgbG9nLCBzaW5jZSBgcnVuV29ya2Zsb3dgIHRoZW4gYnVpbGRzIGEgZnJlc2ggVk0sXG4gICAgICAgICAgICAgICAgICAgKiBzZWVkIGFuZCBjb3JyZWxhdGlvbi1pZCBzZXF1ZW5jZSBmcm9tIHRoZSByZWxvYWRlZCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRSZXBsYXlJblByb2Nlc3MgPSAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcj86IHVua25vd24sXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBTZXQgZmFsc2Ugd2hlbiB3cml0ZXMgdGhpcyBpbnZvY2F0aW9uIG1hZGUgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIHJlamVjdGVkIG9uZSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSA0MTInc1xuICAgICAgICAgICAgICAgICAgICAgKiBkZWx0YTogdGhlIFdvcmxkIGNvbXB1dGVkIHRoYXQgZGVsdGEgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgcmVxdWVzdCdzIHNuYXBzaG90LCBzbyBpdCBjYW5ub3QgY29udGFpbiBhblxuICAgICAgICAgICAgICAgICAgICAgKiBldmVudCBhIHNpYmxpbmcgY29tbWl0dGVkIGFmdGVyd2FyZHMsIGFuZCBtZXJnaW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHJlc3RhcnQgdGhlIHJlcGxheSBvbiBhIGxvZyB0aGF0IGlzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAqIGluY29tcGxldGUuIE9ubHkgYSBmdWxsIHJlbG9hZCBpcyBhdXRob3JpdGF0aXZlIHRoZW4uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICB7IGFsbG93RGVsdGEgPSB0cnVlIH06IHsgYWxsb3dEZWx0YT86IGJvb2xlYW4gfSA9IHt9XG4gICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzID49XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgc3RhbGUtc25hcHNob3QgcmVzdGFydCBpbnZhbGlkYXRlcyB0aGUgcGFya2VkIFZNOlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIGl0IGNvbnN1bWVkIHdhcyBtaXNzaW5nIGV2ZW50cywgc28gb25seSBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIGlzIGF1dGhvcml0YXRpdmUuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjb3ZlcnMgdGhlIHN1c3BlbnNpb24tY3JlYXRlIDQxMiwgd2hpY2ggZmlyZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZXRlbnRpb24gZGVjaXNpb24gKGtpbGwgc3dpdGNoICsgc3RlcC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAvLyBnYXRlKSBldmVyIHJhbiwgYW5kIHRoZSBydW5fY29tcGxldGVkIDQxMiwgd2hlcmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc2Vzc2lvbiBtdXN0IG5vdCBiZSByZXN1bWVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIFdvcmxkIE1BWSByZXR1cm4gdGhlIGV2ZW50cyB3ZSB3ZXJlIG1pc3Npbmcgb24gdGhlIDQxMi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ1c3QgaXQgb25seSBvbiB0aGUgRklSU1QgcmVzdGFydDogaXRzIGNvbXBsZXRlbmVzcyBwcm9vZlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWFucyBvbiB0aGUgYmFja2VuZCdzIG93biBib29ra2VlcGluZywgc28gaWYgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlci1jb3VudHMsIGEgXCJjb21wbGV0ZVwiIGRlbHRhIGNhbiBzdGlsbCBsZWF2ZSBhIGhvbGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIGl0IHRvIG9uZSBhdHRlbXB0IGNhcHMgdGhhdCBhdCBhIHNpbmdsZSB3YXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydDsgZXZlcnkgbGF0ZXIgcmVzdGFydCBkb2VzIHRoZSBhdXRob3JpdGF0aXZlIGxvYWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhICYmIHByZWNvbmRpdGlvblJlc3RhcnRzID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoZXJyb3IsIHJ1bklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbHRhIGlzIG9ubHkgdXNhYmxlIGlmIHRoZXJlIGlzIGEgbG9hZGVkIGxvZyB0byBtZXJnZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnRvOyB3aXRob3V0IG9uZSB0aGUgcmVzdGFydCBtdXN0IGxvYWQgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlZERlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YSAhPT0gbnVsbCAmJiBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPVxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICYmIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTVVTVCBiZSBhIGZ1bGwsIGN1cnNvci1sZXNzIHJlbG9hZC4gVGhlIGN1cnNvciBsaXN0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQgZnJvbSB0aGUgaGlnaGVzdCBldmVudCBpZCB0aGlzIHJlcGxheSBob2xkcyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hhdCBhIHN0YWxlIHNuYXBzaG90IGlzIG1pc3Npbmcgc2l0cyBiZWxvdyBpdDogYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3QgYWxsb2NhdGVkIGluc2lkZSBhIGNvbmN1cnJlbnQgY29tbWl0IHRha2VzIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGlzIHJlcGxheSBoYWQgYWxyZWFkeSByZWFkIHBhc3QuIEFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgbG9hZCBzdGFydHMgYWJvdmUgdGhlIGhvbGUgYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3RlZCBsb2cgaW5zZXJ0cyB0aGUgbWlzc2luZyBldmVudHMgQkVMT1cgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGFscmVhZHkgc2Nhbm5lZCBmb3IgcGF5bG9hZCBwcmV3YXJtaW5nLCBzaGlmdGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGxhdGVyIHBvc2l0aW9uLiBPbmx5IGEgZnVsbCByZXNjYW4gc2VlcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZS5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlOyByZXN0YXJ0aW5nIHJlcGxheSBpbi1wcm9jZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXNlZERlbHRhID8gJ2lubGluZS1kZWx0YScgOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZXN0YXJ0cyc6IHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEVzY2FsYXRlIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRoYXQgc3Vydml2ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1wcm9jZXNzIHJlc3RhcnQgYnVkZ2V0IHRvIGEgZnJlc2ggaW52b2NhdGlvbiwgb3IgZ2l2ZSB1cFxuICAgICAgICAgICAgICAgICAgICogb24gdGhlIHJ1biB3aGVuIHRoZSBwZXItcnVuIGJ1ZGdldCBpcyBhbHNvIHNwZW50LlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBpbi1wcm9jZXNzIGJ1ZGdldCBpcyBhIGNsb3N1cmUgdmFyaWFibGUgYW5kIHRoZSBxdWV1ZSdzXG4gICAgICAgICAgICAgICAgICAgKiBkZWxpdmVyeSBjb3VudCByZXN0YXJ0cyBhdCAxIHdoZW5ldmVyIGEgbmV3IG1lc3NhZ2UgaXNcbiAgICAgICAgICAgICAgICAgICAqIGVucXVldWVkLCBzbyBhIHJ1biB0aGF0IGlzIHBlcm1hbmVudGx5IHVuYWJsZSB0byBjYXRjaCB1cFxuICAgICAgICAgICAgICAgICAgICogd2l0aCBpdHMgb3duIGV2ZW50IGxvZyB3b3VsZCBvdGhlcndpc2UgY3ljbGUgcmVzdGFydHMg4oaSXG4gICAgICAgICAgICAgICAgICAgKiByZS1pbnZva2Ug4oaSIHJlc3RhcnRzIHdpdGggbm8gcnVuLWxldmVsIGJvdW5kLiBUaGUgY2hhaW4gaXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSBjb3VudGVkIG9uIHRoZSBtZXNzYWdlIGl0c2VsZiwgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgZGl2ZXJnZW5jZXMgYXJlLCBhbmQgZmFpbHMgdGhlIHJ1biBvbmNlIGV4aGF1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgY291bnRlciBvbmx5IGFkdmFuY2VzIG9uIGhvcHMgdGhhdCBlbnF1ZXVlIGEgbmV3IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAqIChzZWUgYHJlaW52b2tlYCkuIEEgcmVkZWxpdmVyeS1iYXNlZCBob3Aga2VlcHMgdGhlIHNhbWUgYm9keVxuICAgICAgICAgICAgICAgICAgICogYW5kIHNvIHRoZSBzYW1lIGNvdW50LCBidXQgaXQgYWxzbyBrZWVwcyBhZHZhbmNpbmdcbiAgICAgICAgICAgICAgICAgICAqIGBtZXRhZGF0YS5hdHRlbXB0YCwgd2hpY2ggdGhlIG1heC1kZWxpdmVyeSBjaGVjayBhdCB0aGUgdG9wXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaGFuZGxlciBhbHJlYWR5IGJvdW5kcywgYW5kIHRoZSBkZWxheSBiZWxvdyBpcyB3aGF0XG4gICAgICAgICAgICAgICAgICAgKiBtYWtlcyB0aGF0IGJ1ZGdldCBzcGFuIHJlYWwgdGltZSByYXRoZXIgdGhhbiBiZWluZyBidXJuZWQgaW5cbiAgICAgICAgICAgICAgICAgICAqIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVua25vd25cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8XG4gICAgICAgICAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHwgeyByZWludm9rZWQ6IGZhbHNlOyBlcnJvcjogRXJyb3IgfVxuICAgICAgICAgICAgICAgICAgPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGVtcHQgPSAocHJlY29uZGl0aW9uUmVpbnZvY2F0aW9ucyA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlaW52b2NhdGlvbnMgPSBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gbWF4UmVpbnZvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIHdhcyByZWplY3RlZCBhcyBzdGFsZSBhZnRlciAke21heFJlaW52b2NhdGlvbnN9IHJlLWludm9jYXRpb25zIG9mICR7Z2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKX0gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydHMgZWFjaDogdGhpcyBydW4gY2Fubm90IG9ic2VydmUgaXRzIG93biBldmVudCBsb2cgY29tcGxldGVseSBlbm91Z2ggdG8gbWFrZSBwcm9ncmVzcy4gTGFzdCByZWplY3Rpb24gKCR7cmVhc29ufSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlIGFmdGVyIGluLXByb2Nlc3MgcmVzdGFydHM7IHJlLWludm9raW5nIHJ1biBmb3IgYSBmcmVzaCByZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWludm9jYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZWludm9jYXRpb25zJzogYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQsIHVubGlrZSB0aGUgb3RoZXIgcmVpbnZva2UoKSBjYWxsZXJzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXN0YXJ0cyBhbHJlYWR5IHJlbG9hZGVkIHRoZSBsb2cgc2V2ZXJhbCB0aW1lc1xuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGNhdGNoaW5nIHVwLCBzbyB0aGUgd3JpdGVycyB0aGlzIHJlcGxheSBpcyByYWNpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZS4gUmV0cnlpbmcgaW5zdGFudGx5IGJ1cm5zIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGJ1ZGdldCBhdCBmdWxsIHNwZWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHJlaW52b2tlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgZ3VhcmQsIHNoYXJlZCBieSB0aGUgdHdvIHBhdGhzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYSBydW46IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbnMgYW5kIGZsb3cgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRGVwbG95bWVudCA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBQaWNrPFxuICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICdydW5JZCcgfCAnZGVwbG95bWVudElkJyB8ICdzcGVjVmVyc2lvbidcbiAgICAgICAgICAgICAgICAgICAgPixcbiAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlUGF5bG9hZDogKCkgPT4gUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdG9wPzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0Y29tZSwgc3BhbkF0dHJpYnV0ZXMgfSA9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50OiBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWVucXVldWU6IGFzeW5jICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH06IFJlZW5xdWV1ZUFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVlbnF1ZXVlUGF5bG9hZCgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRlcGxveW1lbnRJZCwgc3BlY1ZlcnNpb24sIGRlbGF5U2Vjb25kcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkF0dHJpYnV0ZXMpIHNwYW4/LnNldEF0dHJpYnV0ZXMoc3BhbkF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0Y29tZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybjogdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgcHJvZHVjZXIgcGFyYWxsZWxpemVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIHdpdGggdGhpcyBxdWV1ZSBwdWJsaXNoLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGVudGl0eSBtYXkgbm90IGV4aXN0IHlldCB3aGVuIHRoaXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlczogdGhlIGRlbGl2ZXJ5IGJlYXQgdGhlIHdyaXRlLCBvciB0aGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdHJhbnNpZW50bHkgYW5kIHRoaXMgbWVzc2FnZSBjYXJyaWVzIHRoZSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgaW5wdXQuIElkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgbWVzc2FnZSdzIGBzdGVwSW5wdXRgLCBrZXllZCBieSB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb24gaWQsIHNvIHRoZSBwcm9kdWNlcidzIHdyaXRlIGFuZCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZW5zdXJlIGNvbnZlcmdlIG9uIGV4YWN0bHkgb25lIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSW52b2tlZCBmcm9tIHR3byBwbGFjZXM6XG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBJTi1CQU5EICh0aGUgbG9hZC1iZWFyaW5nIHBhdGgpOiB3aGVuIHRoZSBiYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHN0ZXBfc3RhcnRlZGAgYmVsb3cgcmVqZWN0cyB3aXRoIFwic3RlcCBub3QgZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgZXhlY3V0b3IgY2F0Y2ggbWF0ZXJpYWxpemVzIHRoZSBzdGVwIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHJpZXMgb25jZSwgYWxsIHdpdGhpbiB0aGlzIGRlbGl2ZXJ5LiBUaGlzIG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBub3QgcmVseSBvbiBkZWxpdmVyeSBhdHRlbXB0czogd29ybGQtdmVyY2VsJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmYWlsdXJlLXJldHJ5IHBhdGggcmUtZW5xdWV1ZXMgYSBGUkVTSCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGF0dGVtcHQgcmVzZXRzIHRvIDEpLCBzbyBhbiBhdHRlbXB0LWdhdGVkIHJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgdW5yZWFjaGFibGUgb24gdGhlIHJldHJ5IGNoYWluIGFuZCB0aGUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdvdWxkIHN0YWxsIHVudGlsIHRoZSBPUklHSU5BTCBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB+MzAwcyB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkZWxpdmVyeSwgbWVhc3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBleGFjdGx5IHNvIGluIHRoZSBkdXJhYmVuY2ggcGFyYWxsZWwgc3dlZXBzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgcGF0aCBleGlzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vICAtIEVBR0VSTFkgb24gYSBnZW51aW5lIHJlZGVsaXZlcnkgKGF0dGVtcHQgPiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpbiBwYXJhbGxlbCB3aXRoIHRoZSBydW4gZmV0Y2ggYmVsb3csIHNpbmNlIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWRlbGl2ZXJlZCBkaXNwYXRjaCBhbHJlYWR5IGhhZCBpdHMgY3JlYXRlIHJhY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXNvbHZlZCBlaXRoZXIgd2F5LCBzbyB0aGlzIHNhdmVzIHRoZSBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGFydCByb3VuZC10cmlwIGF0IG5vIHdhbGwtdGltZSBjb3N0LiBGaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlbGl2ZXJpZXMgc2tpcCBpdDogdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgYWxtb3N0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgYWx3YXlzIGxhbmRzLCBhbmQgYW4gZWFnZXIgZW5zdXJlIHdvdWxkIGJ1cm4gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbmRpdGlvbmFsIHdyaXRlIHBlciBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICAgICAgJ29rJyB8ICdnb25lJ1xuICAgICAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwSW5wdXQpIHJldHVybiAnb2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWQgVWludDhBcnJheSBieSBTdGVwRGlzcGF0Y2hJbnB1dFNjaGVtYTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBub24tYmluYXJ5IChtYW5nbGVkKSBwYXlsb2FkIGZhaWxzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBhcnNlIGFib3ZlIGFuZCBuZXZlciByZWFjaGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBzdGVwSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFya3MgdGhpcyBjcmVhdGUgYXMgYSBkaXNwYXRjaCByZS1lbnN1cmUgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZ3VhcmQtZW5mb3JjaW5nIGJhY2tlbmQgY2FuIHJlZnVzZSBpdCB3aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZXIncyB3cml0ZSB3YXMgNDEyLXJlamVjdGVkICh0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHdhcyByZXZva2VkKS4gU3VyZmFjZXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvciDihpIgJ2dvbmUnIGJlbG93LCBhY2tpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLiBXb3JsZHMgd2l0aG91dCB0aGUgZ3VhcmQgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhU3RlcERpc3BhdGNoOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkZWxpdmVyeSBtYXRlcmlhbGl6ZWQgdGhlIHN0ZXAsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW9uIG9mIHRoZSBwcm9kdWNlcidzIHJlY292ZXJ5IHBhdGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlLlN0ZXBSZXNpbGllbnREaXNwYXRjaE1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01hdGVyaWFsaXplZCBzdGVwX2NyZWF0ZWQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSDigJQgdGhlIHByb2R1Y2VyXFx1MjAxOXMgZGlyZWN0IHdyaXRlIGRpZCBub3QgbGFuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21tb24gY2FzZTogdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgKG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCByZS1lbnN1cmUpIGFscmVhZHkgbGFuZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSByZXR1cm4gJ29rJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGV4ZWN1dGU6IHRoZSBydW4gd2VudCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobWF0Y2hlcyB0aGUgcnVuLXN0YXR1cyBjaGVjayBiZWxvdyksIG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQtZW5mb3JjaW5nIGJhY2tlbmQgcmV2b2tlZCB0aGlzIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICg0MTAgYHN0ZXAtZGlzcGF0Y2gtcmV2b2tlZGAsIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHdhcyA0MTItcmVqZWN0ZWQgYW5kIHRoZSByZXBsYXkgcmVzdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSBjb3JyZWN0ZWQgc2NoZWR1bGUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHJldHVybiAnZ29uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudDogcmV0aHJvdyBzbyB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRlciBhdHRlbXB0IGNvbnZlcmdlcyBpbnN0ZWFkIG9mIGV4ZWN1dGluZyAoYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2luZykgYSBzdGVwIHRoYXQgbWF5IG5vdCBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbYmdSdW4sIGVuc3VyZU91dGNvbWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElucHV0ICYmIG1ldGFkYXRhLmF0dGVtcHQgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gZW5zdXJlU3RlcEZyb21NZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ29rJyBhcyBjb25zdCksXG4gICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3VyZU91dGNvbWUgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGF0dXM6IGJnUnVuLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgcXVldWVkIHN0ZXAgZXhlY3V0aW9uLCBmaXJzdCBkaXNwYXRjaCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJpZXMvcmV0cmllcyBhbGlrZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgZ3VhcmREZXBsb3ltZW50KGJnUnVuLCBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcnJ5IHRoZSByZXN1bWUgdGltaW5nIHZlcmJhdGltIHNvIHRoZSByZS1yb3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9wIHN0YXlzIGluc2lkZSBgc3RlcF9kaXNwYXRjaGAgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFuaXNoaW5nIGZyb20gdGhlIFRUUiBkZWNvbXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va1Jlc3VtZVRpbWluZyA/IHsgaG9va1Jlc3VtZVRpbWluZyB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1N0YXJ0ZWRBdCA9IGJnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyArYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSBjZWlsaW5nIGZvciBhIGJhY2tncm91bmRlZCBzdGVwLiBgbWV0YWRhdGEuYXR0ZW1wdGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50KSBpcyBhIGNoZWFwIHVwcGVyIGJvdW5kLCBidXQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyLWNvdW50czogYSBUaHJvdHRsZUVycm9yIC8gVG9vRWFybHlFcnJvciAob3IgYW55XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSB0aGF0IG5ldmVyIHJhbiB0aGUgYm9keSkgc3RpbGwgYWR2YW5jZXMgaXQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1c3RpbmcgaXQgZGlyZWN0bHkgY291bGQgZmFpbCBhIHN0ZXAgYXMgXCJleGNlZWRlZCBtYXhcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzXCIgYmVmb3JlIHRoZSBib2R5IGV2ZXIgcmFuIChhIHVzZXItdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdW5kZXIgdHJhbnNpZW50IGJhY2tlbmQgcHJlc3N1cmUpLiBVc2UgaXQgb25seVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFzdCBnYXRlOiB3aGlsZSBpdCBpcyBhdCBvciB1bmRlciB0aGUgY2VpbGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGNhbm5vdCBiZSBleGhhdXN0ZWQsIHNvIHByb2NlZWQgd2l0aG91dCB0b3VjaGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cuIE9ubHkgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIGRvIHdlIGxvYWQgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cgYW5kIGRlcml2ZSB0aGUgYXV0aG9yaXRhdGl2ZSBhdHRlbXB0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkZWQgYHN0ZXBfc3RhcnRlZGAgY291bnQsIHNjb3BlZCB0byB0aGUgbGlmZWN5Y2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0b3RhbCAoYmFyZSBzdGFydHMgcGx1cyB0aGUgbGFyZ2VzdCBzaW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcidzIHN0YXJ0cyk6IHRocm90dGxlL3Rvby1lYXJseSByZWRlbGl2ZXJpZXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGFydCBhdCBhbGwsIHJhY2luZyBpbnZvY2F0aW9ucycgb25lLW9mZiBzdGFtcGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlcyBkb24ndCBhY2N1bXVsYXRlIChjb3VudGluZyB0aGVtIGZhbHNlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGhhdXN0ZWQgaGVhbHRoeSBzdGVwcywgc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhdHRlbXB0cyBidXJuZWQgdW5kZXIgYSBwcmlvciBpbmxpbmUtb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2Ugc3RpbGwgY291bnQsIHNvIGEgc3RlcCB0aGF0IHRpbWVzIG91dCB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkIHJlY292ZXJ5IGFuZCB0aGVuIHRyYW5zaXRpb25zIHRvIHF1ZXVlZC9iYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllcyB0cmlwcyB0aGUgY29tYmluZWQgY2VpbGluZy4gVGhpcyBzdGlsbCBib3VuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cywgd2hpY2ggd3JpdGUgbm8gZXJyb3IgZm9yIHRoZSBwb3N0LWJvZHkgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9IG1ldGFkYXRhLmF0dGVtcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdNYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0ZXBGdW5jdGlvbihpbmNvbWluZ1N0ZXBOYW1lKT8ubWF4UmV0cmllcyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gYmdNYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAndG90YWxBdHRlbXB0cycgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUVFI6IHRoaXMgZGVsaXZlcnkgSVMgdGhlIGRpc3BhdGNoZWQgbmV4dCBzdGVwIG9mIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bXB0aW9uLiBDb25zdW1lIHRoZSB0cmFja2luZyBoZXJlIHNvIHRoZSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGhpcyBoYW5kbGVyIG1heSBmYWxsIHRocm91Z2ggdG8gY2Fubm90XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGl0IGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZztcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVuczpcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLWZsaWdodDogYSBkZWxheWVkIGJhY2tzdG9wIChvciByZXRyeSkgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFycml2ZSB3aGlsZSBhbm90aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHNhbWUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbWlkLWJvZHkgaW4gdGhpcyBwcm9jZXNzLCBtb3N0IGltcG9ydGFudGx5IG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCBubyBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBvd25lcnNoaXAgbGVhc2UgaXMgbm90IGEgZGVhdGggcHJvb2YuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50LCB0aGVuIGFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXhlY3V0aW5nLiBObyBvd25lck1lc3NhZ2VJZCBoZXJlOiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIG9mIGEgcXVldWUtZHJpdmVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBjbGVhcnMgaW5saW5lIG93bmVyc2hpcCAodGhlIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlLW93bmVkIGZyb20gdGhpcyBwb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlUXVldWVkU3RlcCA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogYmdTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShiZ1J1bi5hdHRyaWJ1dGVzLCBydW5JZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogYmdSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZzogdGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50IGFzIGEgZmFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdhdGUsIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlY29yZGVkIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyAoc2VlIGFib3ZlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDogYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYmdSZXN1bWVUcmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHJlc3VtZVRyYWNraW5nOiBiZ1Jlc3VtZVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQgPSBhd2FpdCBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWV1ZWRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbi1iYW5kIHJlc2lsaWVudCByZWNvdmVyeTogYSBtaXNzaW5nIHN0ZXAgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RlcElucHV0LWNhcnJ5aW5nIG1lc3NhZ2UgbWVhbnMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb3V0cmFuIChvciBvdXRsaXZlZCBhIHRyYW5zaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBvZikgdGhlIHByb2R1Y2VyJ3MgcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCB3cml0ZS4gTWF0ZXJpYWxpemUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBwYXlsb2FkIGFuZCByZXRyeSBPTkNFLCB3aXRoaW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkuIFNlZSBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UgZm9yIHdoeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW5ub3Qgd2FpdCBmb3IgYSByZWRlbGl2ZXJ5LiBBIHNlY29uZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBwcm9wYWdhdGVzIGFzIGJlZm9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcElucHV0IHx8ICFpc1N0ZXBNaXNzaW5nRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSgpKSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyBhcyBjb25zdCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWV1ZWRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHN0ZXAgaGFkIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzKSwgYnJlYWsgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRVbnRpbCBmbHVzaCB0aGVtLCBzbyBjYW4ndCBjb250aW51ZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdza2lwcGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMgdG8gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnNvci1iYXNlZCBsb2FkaW5nIHNvIHRoZSBtYWluIGxvb3AgY2FuIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IGZyb20gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQobG9hZGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgc3RlcHM6IGFueSBzdGVwX2NyZWF0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtYXRjaGluZyBzdGVwX2NvbXBsZXRlZCBvciBzdGVwX2ZhaWxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwVGVybWluYWxJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBUZXJtaW5hbElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc3RlcENyZWF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwVGVybWluYWxJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwSWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdTdGVwSWRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcGVuZGluZyBzdGVwIHRoYXQgVEhJUyBtZXNzYWdlIGlubGluZS1vd25zIChhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSBzdGFtcGVkIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYW5kIHRoZW4gY3Jhc2hlZCBtaWQtYm9keSkgbXVzdCBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyZWQgaGVyZTogb25seSB0aGUgb3duaW5nIG1lc3NhZ2UgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWV4ZWN1dGUgaXQgYmVmb3JlIHRoZSBvd25lcnNoaXAgbGVhc2UgZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdha2UgcmVwbGF5cyBtZXJlbHkgZW5zdXJlIGEgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcC4gRmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIGxvb3AsIHdob3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRhYmxlIHJvdXRlcyBpdCB0byBvd25lZCByZWNvdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZTsgZmFsbGluZyB0aHJvdWdoIHRvIHJlY292ZXIgYW4gaW5saW5lIHN0ZXAgb3duZWQgYnkgdGhpcyBtZXNzYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWluZzogdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZSB3aWxsIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBkb25lIGFuZCByZXBsYXkgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmUgYnV0IG90aGVyIHN0ZXBzIHBlbmRpbmcsIHJldHVybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc3RlcHMgZG9uZTogZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIHJlcGxheSBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHNoYXJlZCBzdGF0ZSBzbyB0aGUgbG9vcCBjYW4gY29udGludWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmUgYWZ0ZXIgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gbG9hZGVkLmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlJbnB1dDogdW5rbm93bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5DcmVhdGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBydW5DcmVhdGVkRXZlbnQuZXZlbnREYXRhLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FjeVNwZWNWZXJzaW9uKGJnUnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBubyBcInJ1bl9jcmVhdGVkXCIgZXZlbnRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWdhY3kgcnVucyBwcmVkYXRlIHRoZSBldmVudC1zb3VyY2VkIHJ1bl9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFyaWFudCwgc28gcmV0YWluIHRoZSByZXNvbHZlZCBHRVQgb25seSBmb3IgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVnYWN5UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ2FsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVnYWN5UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gbGVnYWN5UnVuLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJnUnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcmVwbGF5SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9IGJnU3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgcHJlLWNoZWNrIGZvciB0aGUgbGF6eSBob29rIGZhc3RcbiAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cuIE5ldyBsYXp5LXJlc3VtZSBtZXNzYWdlcyBjYXJyeSB0aGUgcnVuJ3NcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50IChgaG9va0lucHV0LmRlcGxveW1lbnRJZGApLCBzbyBhXG4gICAgICAgICAgICAgICAgICAvLyBtaXNyb3V0ZWQgZGVsaXZlcnkgaXMgZGV0ZWN0YWJsZSB3aXRoIGEgY2hlYXAgYW1iaWVudFxuICAgICAgICAgICAgICAgICAgLy8gZGVwbG95bWVudC1pZCBjb21wYXJpc29uIEJFRk9SRSB0aGUgZmFzdCBwYXRoJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUsIHNvIHRoZSBjb3JyZWN0bHktcm91dGVkIGNvbW1vbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyBwYXlzIG5vIHJ1biBmZXRjaCBhbmQgbm8gbGF0ZW5jeS4gT25seSBhIGRldGVjdGVkXG4gICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1biBhbmQgaGFuZHMgaXQgdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGlzdGluZyBndWFyZCAod2hpY2ggb3ducyByZS1yb3V0ZS9mYWlsIHBvbGljeSk7XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmUtcm91dGVkIG1lc3NhZ2Uga2VlcHMgdGhlIGNvbXBsZXRlIGBob29rSW5wdXRgLFxuICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgbWF5IGhvbGQgdGhlIG9ubHkgY29weSBvZiB0aGUgcmVzdW1lIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwaW5uZWQgb3IgYW1iaWVudCBpZCBpcyB1bmF2YWlsYWJsZSAob2xkZXJcbiAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyIG1lc3NhZ2UsIGEgd29ybGQgd2l0aG91dCBkZXBsb3ltZW50IGFmZmluaXR5LFxuICAgICAgICAgICAgICAgICAgLy8gb3IgYSBnZXREZXBsb3ltZW50SWQgZmFpbHVyZSksIGJlaGF2aW9yIGlzIHVuY2hhbmdlZDpcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdXRob3JpdGF0aXZlIGd1YXJkIGFmdGVyIHJ1biBzZXR1cCAod2hpY2ggcmVtYWluc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcCBleGVjdXRpb24pIHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhlIGRlbGl2ZXJ5OyB0aGUgZmFzdCBwYXRoJ3Mgd3JpdGUgaXMgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgLy8gcGVyIChydW5JZCwgcmVzdW1lSWQpLCBzbyBhIHByZS1ndWFyZCB3cml0ZSBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAvLyBvbGRlciBtZXNzYWdlIHN0YXlzIGNvbnZlcmdlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQ/LmRlcGxveW1lbnRJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgZWxpZ2liaWxpdHkgYXMgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHk6IHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHMgdGhlIGlkcyBsZWdpdGltYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyIChlLmcuIGRwbF9sb2NhbEA8dmVyc2lvbj4pIGFuZCBjb21wYXJpbmcgdGhlbVxuICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCB0cmlnZ2VyIHNwdXJpb3VzIHJ1biBmZXRjaGVzLlxuICAgICAgICAgICAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXM/LmRlcGxveW1lbnRBZmZpbml0eSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IGhvb2tJbnB1dC5kZXBsb3ltZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkICE9PSBwaW5uZWREZXBsb3ltZW50SWRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3J3YXJkZWQgVU5NT0RJRklFRCAoaW4gcGFydGljdWxhciB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBkZWxpdmVyeSdzIGVudHJ5IHRpbWUpIHNvIHRoZSBtaXNyb3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBob3AgaXMgYXR0cmlidXRlZCB0byBgcXVldWVfZGVsaXZlcnlgIGFuZCBUMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZHMgdXAgYmVpbmcgdGhlIGZpbmFsIGNvbnN1bWVyJ3MgZW50cnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0UnVuUmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBMYXp5IGhvb2sgcmVzdW1lIGZhc3QgcGF0aCAtLS1cbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBob29rIGRlbGl2ZXJ5IChyZXN1bWVJZCArIGRpZ2VzdCBvbiB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UpIGhvaXN0cyB0aGUgY29uc3VtZXIncyBpZGVtcG90ZW50IGhvb2tfcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlLWVuc3VyZSBhYm92ZSBydW5fc3RhcnRlZCBhbmQgYXNrcyB0aGUgV29ybGQgdG8gcmV0dXJuXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCByZXBsYXkgbG9nIHdpdGggdGhlIHdyaXRlIChwcmVsb2FkRXZlbnRzKS4gQVxuICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBXb3JsZCBhbnN3ZXJzIHdpdGggdGhlIHJlY29uc3RydWN0ZWQgcnVuLCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlIHJlcGxheSBsb2csIGFuZCB0aGUgcnVuJ3MgZXZlbnQgY2VpbGluZzpcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgdGhlIGdlbmVyaWMgc2V0dXAgYmVsb3cgd291bGQgc3BlbmQgYVxuICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgUE9TVCBhbmQgYW4gZXZlbnRzLmxpc3Qgb24uIEFueSBvdGhlciByZXN1bHRcbiAgICAgICAgICAgICAgICAgIC8vIChvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVzIHRoZSBwYXJhbSwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZCB0aGF0IGZhaWxzIHZhbGlkYXRpb24sIGluY2x1ZGluZyBhIGJvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGhhc01vcmUgcGFnZSkgZmFsbHMgYmFjayB0byB0aGF0IGdlbmVyaWMgc2V0dXA7IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3cml0ZSBpdHNlbGYgaGFzIHN0aWxsIHN1Y2NlZWRlZCBlaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSwgc28gdGhlIHJlLWVuc3VyZSBibG9jayBiZWxvdyBpcyBza2lwcGVkIHZpYVxuICAgICAgICAgICAgICAgICAgLy8gYGhvb2tFbnN1cmVkYC4gTmV2ZXIgdGFrZW4gb24gdHVyYm8gKHR1cmJvIGRlbGl2ZXJpZXNcbiAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IHJ1bklucHV0LCBub3QgaG9va0lucHV0KSBvciBhZnRlciB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIGFscmVhZHkgbG9hZGVkIHRoZSBydW4uXG4gICAgICAgICAgICAgICAgICBsZXQgaG9va0Vuc3VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtmbG93UnVuICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dCAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucGF5bG9hZERpZ2VzdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9va1Jlc3VtZUlucHV0ID0gaG9va0lucHV0O1xuICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgIC8vIG9jY3VycmVkLCBzYW1lIGRlcml2YXRpb24gYXMgdGhlIHJlLWVuc3VyZSBiZWxvdyAodGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZUlkIGlzIGEgVUxJRCBtaW50ZWQgYnkgcmVzdW1lSG9vaygpIGF0IHJlc3VtZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aW1lKS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZShob29rUmVzdW1lSW5wdXQucmVzdW1lSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50KCd3b3JrZmxvdy5ob29rX3JlY2VpdmVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rX3JlY2VpdmVkLnByZWxvYWRfZXZlbnRzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9va1Jlc3VtZUlucHV0Lmhvb2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tSZXN1bWVJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBob29rUmVzdW1lSW5wdXQucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lSWQ6IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRFdmVudHM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBob29rRW5zdXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdW5saWtlIHRoZSByZS1lbnN1cmUgYmVsb3csIHRoaXMgaG9pc3RlZCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgTk9UIHNldCBIb29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkOiBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgb24gZXZlcnkgZmFzdC1wYXRoIHJlc3VtZSwgaW5jbHVkaW5nIHRoZSBjb21tb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIHdoZXJlIHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZSBhbHJlYWR5IGxhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGNhbGwgbWVyZWx5IGNvbnZlcmdlZCBvbiBpdCwgc28gaXQgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlY292ZXJ5IHNpZ25hbC4gd29ya2Zsb3cucmVzdW1lX3NldHVwX3NvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChiZWxvdykgZGVzY3JpYmVzIHRoaXMgcGF0aCBpbnN0ZWFkLlxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZWxvYWQgaXMgdXNhYmxlIGFzIHJlcGxheSBpbnB1dCBvbmx5IHdoZW4gaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZW1vbnN0cmFibHkgdGhlIGNvbXBsZXRlIHBpY3R1cmU6IGEgcmVjb25zdHJ1Y3RlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgc3RhcnQgdGltZSwgYSBub24tZW1wdHkgQ09NUExFVEUgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGhhc01vcmUgZmFsc2UsIHNpbmNlIHRoaXMgcGF0aCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3ItY29udGludWF0aW9uIG1hY2hpbmVyeSwgc28gYSBib3VuZGVkIHBhZ2UgbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZSB0cnVzdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmVyJ3MgZXZlbnQgY2VpbGluZyAodGhpcyByZXNwb25zZSBwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkJ3Mgcm9sZSwgc28gYSBtaXNzaW5nIGNlaWxpbmcgd291bGQgbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudC1saW1pdCBlbmZvcmNlbWVudCBkaXNhYmxlZCBmb3IgdGhlIHJ1biksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBydW4gbGlmZWN5Y2xlIGV2ZW50cywgdGhlIGNhbm9uaWNhbCBldmVudCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgY29udmVyZ2VkIG9uLCBhbmQgdGhlIGhvb2tfcmVjZWl2ZWQgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUSElTIHJlc3VtZSAoc28gd2UgbmV2ZXIgcmVwbGF5IGFnYWluc3QgYSBsb2cgdGhhdCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgdGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZGVsaXZlcnkpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzYWJsZVJlcGxheVByZWxvYWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1biAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucnVuLnN0YXJ0ZWRBdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jdXJzb3IgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc01vcmUgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0Lm1heEV2ZW50cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXN1bWVJZCA9PT0gaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlUmVwbGF5UHJlbG9hZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bj8uc3RhcnRlZEF0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjb25zdHJ1Y3RlZCBydW4gYWx3YXlzIHJlYWRzICdydW5uaW5nJywgYnV0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50IGNvbW1pdHRlZCBjb25jdXJyZW50bHkgcmlkZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgaXRzZWxmLiBUaGUgbm9kZSByZXBsYXkgbG9vcCB3b3VsZCBjYXRjaCBpdCwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIGRpc3BhdGNoZXMgYmVmb3JlIHRoYXQgY2hlY2ssIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWxpdmVyeSBoZXJlLCBiZWZvcmUgYW55IGVuZ2luZSBydW5zLiBTYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lIGFzIHRoZSBydW5fc3RhcnRlZCBwYXRoJ3Mgbm9uLXJ1bm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXR1cyBjaGVjay5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsRXZlbnQgPSByZXN1bHQuZXZlbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZWxvYWQgc3RpbGwgaW5pdGlhbGl6ZWQgdGhpcyBkZWxpdmVyeSAoaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaG93IHRoZSB0ZXJtaW5hbCBzdGF0ZSB3YXMgb2JzZXJ2ZWQpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAtc291cmNlIGFuZCB0aGUgcnVuJ3MgYWN0dWFsIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXR1cyBhcmUgcmVjb3JkZWQgYmVmb3JlIGNvbnN1bWluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFdmVudC5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGVybWluYWxFdmVudC5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdjYW5jZWxsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfc3RyZWFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBsYXp5IGhvb2sgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGVybWluYWxFdmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTLCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBwbGF5cyBydW5fc3RhcnRlZCdzIHJvbGUgb24gdGhpcyBwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPSAnaG9va19wcmVsb2FkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIHdyaXRlLCBubyB1c2FibGUgcHJlbG9hZCAoQ0JPUiByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbiBvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0LWluLCBhIGJvdW5kZWQgaGFzTW9yZSBwYWdlLCBvciBhIHByZWxvYWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHZhbGlkYXRpb24pOiB0YWtlIHRoZSBnZW5lcmljIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBiZWxvdy4gSXRzIHByZWxvYWQgaXMgbG9hZGVkIGFmdGVyIHRoaXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCwgc28gdGhlIGNhbm9uaWNhbCBob29rX3JlY2VpdmVkIGlzIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHdoYXRldmVyIGxvZyB0aGF0IHNldHVwIHJlYWRzLCBzbyBubyBzcGxpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfZmFsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGNsYXNzaWZpY2F0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcnVuIHdlbnQgdGVybWluYWw7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBjb25zdW1lIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSAoRW50aXR5Q29uZmxpY3QsIGEgdHJ1bmNhdGVkIHByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbSwgdHJhbnNwb3J0IGZhaWx1cmVzKTogdHJhbnNpZW50LiBSZXRocm93IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgdGhlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIChydW5JZCwgcmVzdW1lSWQpIGNsYWltIGNvbnZlcmdlcyBvbiByZXRyeS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gb3IgYnkgdGhlIGxhenkgaG9vayBmYXN0IHBhdGggYWJvdmUuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5OiB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbjogc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cywgc28gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGV2ZW50LWxvZyBwcmVsb2FkLiBUaGF0IHRyaW1zIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgcmVxdWVzdCB0aGUgY2hhaW5lZCBmaXJzdCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRzIG9uIChzaG9ydGVuaW5nIHRpbWUtdG8tc2Vjb25kLXN0ZXApIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhc3RlZCBsaXN0K3Jlc29sdmUgaXQgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCwgc2tpcFByZWxvYWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyID0gc3RhcnRlZFByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gYmFja2dyb3VuZHMgcnVuX3N0YXJ0ZWQsIHNvIHRoZSBub24tdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ25tZW50IGJlbG93IG5ldmVyIHJ1bnMuIFRocmVhZCB0aGUgcGVyLXJ1biBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgb2ZmIHRoZSBiYWNrZ3JvdW5kZWQgcmVzcG9uc2UgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBndWFyZCByZS1jaGVja3MgbWF4RXZlbnRzTGltaXQgZXZlcnkgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiwgc28gYSB2YWx1ZSB0aGF0IGxhbmRzIHNob3J0bHkgYWZ0ZXIgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBlbmZvcmNlcyB3ZWxsIGJlZm9yZSBhIHJ1bmF3YXkgbG9nIGFwcHJvYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2VpbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICB2b2lkIHN0YXJ0ZWRQcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHIubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQpIG1heEV2ZW50c0xpbWl0ID0gbGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBhbiBlYXJseSBmYWlsdXJlIGZyb20gc3VyZmFjaW5nIGFzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmhhbmRsZWRSZWplY3Rpb247IHJ1blJlYWR5QmFycmllciBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdDogbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvZyB5ZXQgb24gYSBmaXJzdCBkZWxpdmVyeSAocnVuX3N0YXJ0ZWQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQpLiBBbiBlbXB0eSBwcmVsb2FkIHJvdXRlcyBpdGVyYXRpb24gMSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vLWxvYWQgcHJlbG9hZGVkIGJyYW5jaDsgaXRlcmF0aW9uIDIgdGhlbiB0YWtlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwb3N0LXByZWxvYWRlZCBmdWxsIHJlbG9hZCB0byBwaWNrIHVwIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBhIHNwdXJpb3VzIFwiY3Vyc29yIG1pc3NpbmdcIiB3YXJuaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cywgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGBydW5TdGFydGVkUmVjZWl2ZWRBdE1zYCBkZWNsYXJhdGlvbiBhYm92ZTpcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBzeW50aGVzaXplcyB0aGUgcnVuIGJlZm9yZSB0aGUgcmVhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZHMsIHNvIGFuY2hvciBSU0ZTIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCBhbiBhY3R1YWwgcmVzcG9uc2UgaW5zdGFudC5cbiAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChydW5TdGFydGVkRXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTLCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgYm90aCB0aGUgcGxhaW4gc2VxdWVudGlhbCByZXN1bWUgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBmYXN0IHBhdGgncyBmYWxsYmFjayAod2hvc2UgaG9pc3RlZCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgbm8gdXNhYmxlIHByZWxvYWQgYW5kIGxlZnQgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2V0LCBzbyBpdCBsYW5kcyBoZXJlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bWVUcmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5zZXR1cFNvdXJjZSA9ICdydW5fc3RhcnRlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXZlbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogWy4uLnJlc3VsdC5ldmVudHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvciA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHJlc3VsdC5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0RXZlbnRMb2dMb2FkKGxvYWRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ubG9hZGVkLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5ydW4uc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmb3IgYGNhbmNlbGAsIHdlIGFjdHVhbGx5IHdhbnQgdG8gcHJvcGFnYXRlIGEgV29ya2Zsb3dDYW5jZWxsZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSB3b3JrZmxvdyBjb250ZXh0IHNvIHRoZSB1c2VyIGNhbiBncmFjZWZ1bGx5IGV4aXQuIHRoaXMgaXMgU0lHVEVSTVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVybW9yZSwgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBvciBhIHdheSB0byBmb3JjZSBjYW5jZWwgU0lHS0lMTFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGFjdHVhbGx5IGV4aXQgaGVyZSB3aXRob3V0IHJlcGxheWluZyB0aGUgd29ya2Zsb3cgYXQgYWxsLCBpbiB0aGUgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBpcyBpdHNlbGYgZmFpbGluZy5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gd2FzIGNvbmN1cnJlbnRseSBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsZWQgZHVyaW5nIHNldHVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3I6IHJ1biBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG4gICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIG11c3QgYmUgbG9hZGVkIGJlZm9yZSByZXBsYXknXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gTmVpdGhlciBzZXR1cCBicmFuY2ggcmFuLCBzbyB0aGUgcnVuIGFycml2ZWQgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgLy8gbG9hZGVkIGFuZCBzZXR1cCB3YXMgYSBwbGFpbiBldmVudCBsb2FkLiBPbmx5IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZC1zdGVwIGZhbGwtdGhyb3VnaCByZWFjaGVzIGhlcmUgd2l0aCBhIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZGVkIHRvZGF5LCBhbmQgaXQgY29uc3VtZXMgdGhlIHRyYWNraW5nIGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gdGhpcyBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgcmF0aGVyIHRoYW4gYSBsaXZlXG4gICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQga2VlcHMgdGhlIGRpbWVuc2lvbiB0b3RhbCBpZiBvbmUgaXMgZXZlciBhZGRlZC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ2V2ZW50X2xvYWQnO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgZmxvdyByZXBsYXkgKGluaXRpYWwgc3RhcnQsIHN0ZXAgY29tcGxldGlvbnMsXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHJlc3VtcHRpb25zLCB3YWl0IGNvbXBsZXRpb25zKSBhbmQgc3RvcHMgYmVmb3JlIGFueVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSBvciBpbmxpbmUgc3RlcCBleGVjdXRlcyB3aGVuIHRoZSBydW4gaXMgbm90XG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgaGVyZSAoc2VlIGBndWFyZERlcGxveW1lbnRBZmZpbml0eWApLiBUaGlzIHJlbWFpbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBBVVRIT1JJVEFUSVZFIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBgYXdhaXRSdW5SZWFkeWAgb3JkZXJzIHR1cmJvJ3MgYHJ1bl9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGVpdGhlciBzdG9wcGluZyBhY3Rpb24uXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBob29rIHJlc3VtZXMgYXJlIGFkZGl0aW9uYWxseSBwcmUtY2hlY2tlZCBhYm92ZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGZhc3QgcGF0aDogYSBuZXcgbWVzc2FnZSdzIGBob29rSW5wdXQuZGVwbG95bWVudElkYCBpc1xuICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZWQgYWdhaW5zdCB0aGUgYW1iaWVudCBkZXBsb3ltZW50IGlkIGZvciBmcmVlLCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYSBkZXRlY3RlZCBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1bixcbiAgICAgICAgICAgICAgICAgIC8vIHNvIGEgbWlzcm91dGVkIG1vZGVybiByZXN1bWUgcmUtcm91dGVzIHdpdGggemVybyBldmVudFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzLiBPbGRlciBtZXNzYWdlcyAobm8gYGhvb2tJbnB1dC5kZXBsb3ltZW50SWRgKSByZWFjaFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZhc3QgcGF0aCdzIGlkZW1wb3RlbnQgaG9va19yZWNlaXZlZCB3cml0ZSBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQ7IHRoYXQgd3JpdGUgY29udmVyZ2VzIHBlciAocnVuSWQsIHJlc3VtZUlkKSBvbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50LCBzbyBpdCBpcyBzYWZlIGJ1dCBpbmN1cnMgdGhlIHdyaXRlLiBFaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgcmUtcm91dGVkIG1lc3NhZ2UgbXVzdCBjYXJyeSBgaG9va0lucHV0YCwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHdob3NlIHByb2R1Y2VyIHdyaXRlIGhhZCBub3QgeWV0IGxhbmRlZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgLy8gbG9zdC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va0lucHV0ID8geyBob29rSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgcHJlLWNoZWNrIHJlLXJvdXRlIGFib3ZlOiBmb3J3YXJkZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVkLCBzbyB0aGUgZXh0cmEgaG9wIGlzIHF1ZXVlIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBMYXp5IGhvb2sgcmVzdW1lOiB0aGUgcHJvZHVjZXIgKHJlc3VtZUhvb2sgZmFzdCBwYXRoKVxuICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgd2l0aCB0aGlzIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaXNoLCBzbyB0aGUgZXZlbnQgbWF5IG5vdCBiZSBwZXJzaXN0ZWQgeWV0LiBJZGVtcG90ZW50bHlcbiAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCBiZWZvcmUgcmVwbGF5LCBrZXllZCBieSBgcmVzdW1lSWRgIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcHJvZHVjZXIgd3JpdGUgY29udmVyZ2VzIG9uIGV4YWN0bHkgb25lIGV2ZW50XG4gICAgICAgICAgICAgICAgICAvLyAodGhlIHNlcnZlciByZXNvbHZlcyBhIG1hdGNoaW5nIGNsYWltIGFzIHN1Y2Nlc3MsIG5vdCBhblxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IpLiBgaG9va0lucHV0YCBuZXZlciByaWRlcyBhIHR1cmJvIGZpcnN0LWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyAodGhhdCBwYXRoIGNhcnJpZXMgYHJ1bklucHV0YCwgbm90IGBob29rSW5wdXRgKSwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gb25seSBydW5zIG9uIHRoZSBub3JtYWwgbG9hZC1hbmQtcmVwbGF5IHBhdGguIFNraXBwZWRcbiAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHdoZW4gdGhlIGZhc3QgcGF0aCBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBldmVudCAoYGhvb2tFbnN1cmVkYCksIHN1Y2Nlc3NmdWxseSBvciB2aWEgaXRzIGZhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgcnVuX3N0YXJ0ZWQgcHJlbG9hZCB3YXMgbG9hZGVkIGFmdGVyIHRoZSB3cml0ZSBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoaG9va0lucHV0ICYmICFob29rRW5zdXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZXJmIChPcHRpb24gQSk6IGlmIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFscmVhZHkgbGFuZGVkIGluIHRoZSBydW5fc3RhcnRlZCBwcmVsb2FkLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIGV2ZW50IGlzIGluIHRoZSBsb2cgYW5kIHRoZSByZS1lbnN1cmUgcm91bmQgdHJpcFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBwdXJlIG92ZXJoZWFkLiBTa2lwIGl0IHdoZW4gdGhlIHByZWxvYWQgYWxyZWFkeSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgYGhvb2tfcmVjZWl2ZWRgIHdpdGggdGhpcyByZXN1bWUncyBwZXJzaXN0ZWQgYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAvLyAodW5pcXVlIHBlciByZXN1bWUsIHNvIHdlIG5ldmVyIHNraXAgb24gYW4gdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQpLiBCZXN0LWVmZm9ydDogdGhlIHdpbiBsYW5kcyBvbmx5IHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyJ3Mgd3JpdGUgYmVhdCB0aGlzIGNvbnN1bWVyJ3MgbG9hZDsgb3RoZXJ3aXNlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgaWRlbXBvdGVudCByZS1lbnN1cmUgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdW5yZWFjaGFibGUgZm9yIGF0b21pYyBsYXp5IHJlc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHJlc3VtZUlkICsgZGlnZXN0KTogdGhvc2Ugc2V0IGBob29rRW5zdXJlZGAgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgZmFzdCBwYXRoIGFib3ZlIChvbiBzdWNjZXNzIEFORCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2spLCBzbyB0aGlzIGJsb2NrIChhbmQgdGhlIHNraXAgY2hlY2spIG5vdyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcyBob29rSW5wdXQgc2hhcGVzIHdpdGhvdXQgdGhlIGZ1bGwgaWRlbXBvdGVuY3lcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVByZWxvYWRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nOiBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgbGVhdmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkLCBzbyB0aGUgV29ybGQgZmFsbHMgYmFjayB0byBgY3JlYXRlZEF0YC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJyZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShkZWNvZGVUaW1lKGhvb2tJbnB1dC5yZXN1bWVJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5zdXJlZEV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0lucHV0LnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va0lucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDogaG9va0lucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lci1zaWRlIGNvbXBsZXRpb24gb2YgdGhlIHJlY292ZXJ5IHBhdGg6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBtYXRlcmlhbGl6ZWQgdGhlIGV2ZW50IGJlY2F1c2UgdGhlIHByb2R1Y2VyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCB3cml0ZSBoYWQgbm90IGxhbmRlZCBpbiB0aGUgcHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBldmVudCAod2hldGhlciB0aGlzIGNhbGwgY29tbWl0dGVkIGl0IG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJnZWQgb24gdGhlIHByb2R1Y2VyJ3MgY29uY3VycmVudCB3cml0ZSksIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIGFuZCwgd29yc2UsIHdvdWxkIGFjayBhIGRlbGl2ZXJ5IHRoYXQgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNhcnJ5IHRoZSBvbmx5IGNvcHkgb2YgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEVudGl0eUNvbmZsaWN0IChhbmQgYW55IG90aGVyIHVuZXhwZWN0ZWQgZXJyb3IpOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmVzdW1lSWQgY29uc3RyYWludCBleGlzdHMgYnV0IHRoZSBtYXRjaGluZyBldmVudCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBub3QgeWV0IG9ic2VydmFibGU6IHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIHdyaXRlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0aWxsIGluIGZsaWdodCwgb3IgYSByZWRyaXZlIHJhY2VkIHRoZSBjbGFpbS4gVGhpcyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0cmFuc2llbnQ6IHJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgYXR0ZW1wdCBjb252ZXJnZXMgb24gdGhlIGNvbW1pdHRlZCBldmVudCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlcGxheWluZyAoYW5kIGFja2luZykgd2l0aG91dCB0aGUgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlIHByZWxvYWRlZCB0aGUgbG9nIEJFRk9SRSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlLCBzbyBpdCBjYW5ub3QgaW5jbHVkZSB0aGUgaG9va19yZWNlaXZlZC4gUmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBkaXNjYXJkIHRoZSBwcmVsb2FkICh3aGljaCB3b3VsZCBjb3N0IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZCB0cmlwIG9uIHRoZSBmaXJzdCByZXBsYXkgaXRlcmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaW4gdGhlIGNhbm9uaWNhbCBldmVudCByZWNvbnN0cnVjdGVkIGFib3ZlLiBJdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYSBzdGFibGUgZXZlbnRJZCwgc28gYGluc2VydEV2ZW50QnlFdmVudElkYCBrZWVwc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluIGFzY2VuZGluZyBldmVudElkIG9yZGVyIGFuZCBpcyBpZGVtcG90ZW50IGlmIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5IHdoZW4gdGhlIFdvcmxkIHJldHVybnMgbm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB3ZSBmYWxsIGJhY2sgdG8gcmVsb2FkaW5nIHRoZSBjb21wbGV0ZSBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJyAmJiBlbnN1cmVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEV2ZW50QnlFdmVudElkKGV2ZW50TG9nLmV2ZW50cywgZW5zdXJlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAocmUtZW5zdXJlIG5lZWRlZClcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggd29ya2Zsb3cgZXhlY3V0aW9uIChpbnB1dFxuICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0aW9uIC8gaG9vayBwYXlsb2FkIGRlY3J5cHRpb24pIGFuZCB0aGUgcnVuX2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgLy8gZGVoeWRyYXRlIHBhdGggYmVsb3cgbmVlZCBpdC4gTWVtb2l6ZWQgYWNjZXNzb3I6IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBjYWxsIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgVk0taW5kZXBlbmRlbnQgcHJlcGFyZWQgcGF5bG9hZHNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbW11dGFibGUgZmluYWwgdmFsdWVzLiBJdCBzdXJ2aXZlcyB0aGUgZnJlc2ggd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgIC8vIFZNIGNyZWF0ZWQgYnkgZWFjaCBpbmxpbmUgcmVwbGF5LCBidXQgbmV2ZXIgY3Jvc3NlcyBydW5zIG9yXG4gICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpdmUgVk0gcGFya2VkIGF0IHRoZSBwcmV2aW91cyBib3VuZGFyeSwgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHJldGVudGlvbiBkZWNpc2lvbiBrZXB0IGl0LiBudWxsIOKGkiB0aGlzIGl0ZXJhdGlvbiBjb2xkLVxuICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cy4gSW52b2NhdGlvbi1zY29wZWQ6IGRpZXMgd2l0aCB0aGlzIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgbGV0IHJldGFpbmVkU2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE1haW4gcmVwbGF5IGxvb3BcbiAgICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL25vQ29uc3RhbnRDb25kaXRpb246IGludGVudGlvbmFsIGxvb3BcbiAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24rKztcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXktYnVkZ2V0IGNoZWNrOiBiYWlsIG91dCAocmV0cnkgb3IgZmFpbCkgaWZcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN0ZXAgdGltZSB3aXRoaW4gdGhpcyBpbnZvY2F0aW9uIGhhcyBleGNlZWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZmlndXJlZCBidWRnZXQuIFN0ZXAgYm9kaWVzIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHJlcGxheUJ1ZGdldC5wYXVzZSgpL3Jlc3VtZSgpIGJyYWNrZXQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gYGV4ZWN1dGVTdGVwYCBjYWxsLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGF5QnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRNczogcmVwbGF5QnVkZ2V0LmNvbmZpZ3VyZWRMaW1pdE1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvdFNuYXBzaG90OiBzbG90U25hcHNob3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHRoZSB0ZXJtaW5hbCBhdHRlbXB0IHJldHVybnMsIGFmdGVyIHJ1bl9mYWlsZWQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlLiBFYXJsaWVyIGF0dGVtcHRzIHJlamVjdCBmb3IgcXVldWUgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aW1lb3V0IGJlZm9yZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lID49XG4gICAgICAgICAgICAgICAgICAgICAgbm9JbmxpbmVSZXBsYXlBZnRlck1zXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdWMiB0aW1lb3V0IHJlYWNoZWQsIHJlLXNjaGVkdWxpbmcgd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0gUXVpY2tKUyBWTSBlbmdpbmUgZGlzcGF0Y2ggLS0tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFF1aWNrSlMgZW5naW5lIChvcHQtaW4gdmlhIFdPUktGTE9XX1ZNPXF1aWNranNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvciBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm0pIGlzIGEgc2VsZi1jb250YWluZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbHRlcm5hdGl2ZSB0byB0aGUgbm9kZTp2bSBpbmxpbmUtcmVwbGF5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGZ1bGwgZXZlbnQgcmVwbGF5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSB3b3JrZmxvdyBjb2RlIGluIGEgUXVpY2tKUyBXQVNNIFZNLCBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyB2aWEgdGhlIHNhbWUgY29tYmluZWQgcm91dGUgKHNvIHRoZXkgaGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXAgYmVsb3cgb24gcmUtZW50cnkpLCBhbmQgbWFuYWdlcyBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQgbGlmZWN5Y2xlIGZvciB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWVzLiBXaGVuIHRoZSBRdWlja0pTIGVuZ2luZSBpcyBpbiBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IElOU0lERSB0aGlzIHRyeTogZW5naW5lIGZhaWx1cmVzIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgdGhlIGVudHJ5cG9pbnQgKE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBXQVNNIE9PTSBhdCB0aGUgbWVtb3J5IGNlaWxpbmcsIGEgYnVuZGxlLWV2YWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlKSBtdXN0IHJlYWNoIHRoaXMgbG9vcCdzIGNhdGNoIHNvIHRoZXkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZmllZCBhbmQgcmVjb3JkZWQgYXMgcnVuX2ZhaWxlZDogb3V0c2lkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdGhleSB3b3VsZCBuYWNrIHRoZSBtZXNzYWdlIGFuZCBidXJuIGFsbCBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcyBiZWZvcmUgZHlpbmcgYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNQVhfREVMSVZFUklFU19FWENFRURFRC4gVHJhbnNpZW50IHdvcmxkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJldGhyb3cgb3V0IG9mIHRoZSBjYXRjaCBmb3IgcmVkZWxpdmVyeSwgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIG5vZGUtZW5naW5lIHJlcGxheSBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUXVpY2tKU1ZtKHdvcmtmbG93UnVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnVXNpbmcgUXVpY2tKUyBWTSBlbmdpbmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrSlMgZW50cnlwb2ludCBmZXRjaGVzIHRoZSBldmVudCBsb2cgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgZXZlbnRzIGRpcmVjdGx5LCBzbyB3YWl0IGZvciB0aGUgcnVuIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmx5IHN0YXJ0ZWQgZmlyc3Q6IGl0IGRvZXMgbm90IHRocmVhZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHJ1blJlYWR5QmFycmllciB0aGUgd2F5IGhhbmRsZVN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkLCBldmVudExvZy5jdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbXBvcnQ6IHRoZSBRdWlja0pTIGVudHJ5cG9pbnQncyBpbXBvcnQgY2hhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkcyB0aGUgYmFzZTY0IFdBU00gYmluYXJ5ICsgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH4xLjMgTUIgZGVjb2RlZCBhdCBtb2R1bGUgc2NvcGUpLiBMb2FkaW5nIGl0IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoYXQgb3V0IG9mIG5vZGUtZW5naW5lIGRlcGxveW1lbnRzIGVudGlyZWx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb25seSB0aGUgb3B0LWluIHBhdGggcGF5cywgb24gZmlyc3QgZGlzcGF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJ1bldvcmtmbG93V2l0aFF1aWNrSlMgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJy4vcnVudGltZS9xdWlja2pzLWVudHJ5cG9pbnQuanMnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVpY2tqc1Jlc3VsdCA9IGF3YWl0IHJ1bldvcmtmbG93V2l0aFF1aWNrSlMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAncmVhZHknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlOiBldmVudExvZy50eXBlID09PSAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U3Bhbjogc3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0cyB0aGUgZW50cnlwb2ludCByZWNvZ25pemUgaXRzZWxmIGFzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gZm9yIGEgc3BlY2lmaWMgd2FpdCwgc28gYSBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFycml2ZXMgYmVmb3JlIGl0cyB3YWl0IGVsYXBzZXMgcmUtYXJtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIGZyZXNoIGtleSBpbnN0ZWFkIG9mIGxvc2luZyB0aGUgdGltZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRDb250aW51YXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1zdGVwIG93bmVyc2hpcCBwbHVtYmluZzogcmVkZWxpdmVyaWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBkcml2ZSBjcmFzaCByZWNvdmVyeSBmb3Igc3RlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybGllciBpbnZvY2F0aW9uIGNsYWltZWQgaW5saW5lIChzZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wIHBhc3MgaW4gdGhlIGVudHJ5cG9pbnQncyBsb29wKSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlkIGlzIHN0YW1wZWQgYXMgYG93bmVyTWVzc2FnZUlkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWlja2pzUmVzdWx0Py50aW1lb3V0U2Vjb25kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBgcmVpbnZva2VgIHJhdGhlciB0aGFuIHJldHVybmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCBkaXJlY3RseTogdW5kZXIgdHVyYm8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2hlZHVsZSB3b3VsZCByZS1lbmdhZ2UgdHVyYm8gb24gcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocmVwbGF5aW5nIGFnYWluc3QgYSBzdGFsZSBwcmVsb2FkZWQgbG9nIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWRnaW5nIHRoZSBydW4sIHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKS4gcmVpbnZva2UgZW5xdWV1ZXMgYW4gZXhwbGljaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIHdpdGhvdXQgYHJ1bklucHV0YCBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZShxdWlja2pzUmVzdWx0LnRpbWVvdXRTZWNvbmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLnBhZ2UsIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJlY29uZGl0aW9uUmVzdGFydFJlbG9hZChldmVudExvZy5ldmVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbmN1cnJlbnQgY29tcGxldGlvbiB2aWEgdGhlIGV2ZW50IGxvZzogaWZcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgaGFuZGxlciB3cm90ZSBhIHRlcm1pbmFsIHJ1biBldmVudCwgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyByZXBsYXkgd29yay4gVGhlIHJ1biBlbnRpdHkncyBzdGF0dXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gdGhlc2UgZXZlbnRzLCBzbyBjaGVja2luZyB0aGUgbG9nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlcyB1cyB0aGUgc2FtZSBzaWduYWwgYXMgYSBydW5zLmdldCgpIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBleHRyYSByZXF1ZXN0IHBlciBsb29wIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50TG9nLmV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRzVG9Db21wbGV0ZSA9IGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTogZSBpcyBFeHRyYWN0PFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID4gJiB7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+PSAoZS5ldmVudERhdGEucmVzdW1lQXQgYXMgRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdDogZS5ldmVudERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiB3YWl0c1RvQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjcmVhdGVFdmVudCh3YWl0RXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdW1wLWFuZC1yZXBvcnQ6IGZvbGQgd2hhdCB0aGlzIHdyaXRlIHNraXBwZWQgb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBsb2csIHdoaWNoIGlzIHdoYXQgYGNyZWF0ZUV2ZW50YCByZWFkcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xvdCBzbmFwc2hvdCBvZmYsIHNvIGVhY2ggcmVtYWluaW5nIHdhaXQgYXNrcyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzbG90IGFib3ZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHJ1bmNhdGVkIGNhc2UgbWF0dGVycyB0d2ljZSBvdmVyIGhlcmUuIEJleW9uZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gYWNjb3VudGluZyBgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdHMgaXQgZm9yLCB0aGUgbWlzc2luZy1jb21wbGV0aW9uIGNoZWNrIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2lkZXMgZnJvbSB0aGlzIGxvZyB3aGV0aGVyIHRoZSBoYW5kbGVyIHN0aWxsIGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBmZXRjaCwgc28gYSBwYXJ0aWFsIHBhZ2Ugd291bGQgbWFrZSB0aGUgbG9nIGxvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBpdCBob2xkcyBhIGNvbXBsZXRpb24gd2hvc2UgcGFnZSBpcyB1bnJlYWQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIGZldGNoIG9uIGEgc25hcHNob3Qgc2hvcnQgb2YgdGhlIFdvcmxkJ3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFic29yYlNraXBwZWRTbG90UmVwb3J0KGV2ZW50TG9nLmV2ZW50cywgY3JlYXRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0IGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IGlzIGNvbW1pdHRlZCwgYW5kIHRoaXMgcmVwbGF5IGhhcyB0byBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgb3duIHdhaXRfY29tcGxldGVkIGJlZm9yZSBpdCBjYW4gYWR2YW5jZSBwYXN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNsZWVwLiBFYWNoIHdyaXRlIGFza2VkIHRoZSBXb3JsZCBmb3IgdGhlIGRlbHRhIHNpbmNlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3VyIGN1cnNvciBhbmQgZm9sZGVkIGl0IGluIChzZWUgY3JlYXRlRXZlbnQpLCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBXb3JsZCBoYXMgYWxyZWFkeSBoYW5kZWQgdGhvc2UgZXZlbnRzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGRvLiBPbmx5IGZldGNoIGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW9ucyBzdGlsbCBtaXNzaW5nIGxvY2FsbHk6IGEgV29ybGQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZXMgYHNpbmNlQ3Vyc29yYCwgYSB0cnVuY2F0ZWQgZGVsdGEsIGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFic29yYiB0aGF0IGxvc3QgdGhlIGN1cnNvciByYWNlLCBvciBhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IsIHdob3NlIHJlamVjdGlvbiBjYXJyaWVzIG5vIGRlbHRhLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlcldyaXRlcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdXYWl0Q29tcGxldGlvbnMgPSB3YWl0c1RvQ29tcGxldGUuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHdhaXRFdmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHNBZnRlcldyaXRlcy5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2luZ1dhaXRDb21wbGV0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGNvbmN1cnJlbnQgZHVyYWJsZSBldmVudHMsIHN1Y2ggYXMgaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlaXIgb3JkZXJpbmcgcmVsYXRpdmUgdG8gd2FpdF9jb21wbGV0ZWQuIEZhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCBmb3Igb2xkZXIgd29ybGRzIHRoYXQgY2Fubm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIHVzIGEgc3RhYmxlIGN1cnNvciwgb3IgaWYgdGhlIGN1cnNvciBkZWx0YSBkb2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgaW5jbHVkZSB0aGUgd2FpdCBjb21wbGV0aW9uIHRoaXMgaGFuZGxlciBqdXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYXdBbGxXYWl0Q29tcGxldGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdXYWl0Q29tcGxldGlvbnMuZXZlcnkoKHdhaXRFdmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvci5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QWxsV2FpdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJlcGxheSByZWFkcyB0aGUgbG9nIGFzIHRoZSBjb21wbGV0ZSByZWNvcmQgb2Ygd2hhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBoYXBwZW5lZCwgc28gYSBwb3NpdGlvbiBub3RoaW5nIG9jY3VwaWVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBldmVudCB0aGF0IG5ldmVyIG9jY3VycmVkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBicmFuY2ggaXQgd291bGQgaGF2ZSBkZWNpZGVkIGdldHMgZGVjaWRlZCB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YXkuIEZhaWxpbmcgaGVyZSBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcnVuIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRzIGl0cyBvd24gY29ycnVwdGlvbiBhbmQgb25lIHRoYXQgc2lsZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIHRoZSB3cm9uZyBhbnN3ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGhvbGUgdGhhdCBpcyBtZXJlbHkgYSB3cml0ZSBtaWQtY29tbWl0IGZpbGxzIGluIG9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biwgc28gc2V0dGxlRXZlbnRTbG90R2FwIHJlLXJlYWRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNsdWRpbmcsIGFuZCBhZG9wdHMgd2hpY2hldmVyIGxvZyBpdCBzZXR0bGVkIG9uLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Nsb3RHYXBDaGVja0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IHNldHRsZUV2ZW50U2xvdEdhcChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBldmVudExvZy5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5zZXR0bGVkLmxvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRsZWQuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGxvZyBmb3IgcnVuICR7cnVuSWR9IGhhcyBhIGhvbGUgYXQgc2xvdCAke3NldHRsZWQuZ2FwLmZpcnN0TWlzc2luZ1Nsb3R9OiAke3NldHRsZWQuZ2FwLm1pc3NpbmdDb3VudH0gb2YgdGhlICR7c2V0dGxlZC5nYXAubWF4U2xvdH0gc2xvdHMgdXAgdG8gdGhlIGxvZydzIG1heGltdW0gaG9sZCBubyBldmVudC5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRMb2cuZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudC1saW1pdCBndWFyZDogZmFpbCBhIHJ1bmF3YXkgcnVuIG9uY2UgaXRzIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZXMgdGhlIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nICh1bmRlZmluZWQg4oeSIG5vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5mb3JjZW1lbnQpLiBUaGUgdGhyb3cgaXMgY2F1Z2h0IGJlbG93IGFuZCB3cml0dGVuIGFzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2ZhaWxlZCAvIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VhbGVkLWxvZyBub29wcyBhcmUgZXhjbHVkZWQ6IHRoZSBjZWlsaW5nIGV4aXN0cyB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgYSBydW5hd2F5IFdPUktGTE9XLCBhbmQgYSBub29wIGlzIHdyaXR0ZW4gYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCB0byBzZWFsIGEgcG9zaXRpb24gd2hvc2Ugd3JpdGVyIGRpZWQuIENvdW50aW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSB3b3VsZCBzcGVuZCB0aGUgdXNlcidzIGV2ZW50IGJ1ZGdldCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZW5kJ3MgYm9va2tlZXBpbmcsIGFuZCB3b3VsZCBtYWtlIHRoZSBsaW1pdCBhIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhpdHMgZGVwZW5kIG9uIGhvdyBtdWNoIHdyaXRlIGNvbnRlbnRpb24gaXQgaGFwcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0byBzZWUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1heEV2ZW50c0xpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93RXZlbnRDb3VudCA9IGV2ZW50TG9nLmV2ZW50cy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuLCBlKSA9PiAoaXNTZWFsZWROb29wRXZlbnQoZSkgPyBuIDogbiArIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93RXZlbnRDb3VudCA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0V2ZW50Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeToganVkZ2UgVFRGUyBlbGlnaWJpbGl0eSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBmaXJzdCBzbmFwc2hvdC4gV2FpdHMgY29tcGxldGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYWxyZWFkeSBkaXNxdWFsaWZ5IHZpYSB0aGUgZXZlbnQtdHlwZSBjaGVjaywgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW5nIGFmdGVyIHRoZSB3YWl0IHBhc3MgaXMgZXF1aXZhbGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyX3NldCBpcyBwZXJtaXR0ZWQ6IGEgcmVkZWxpdmVyeSBjYW4gbGFuZCBhZnRlciBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkIHByZS1zdGVwIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN1YnRyYWN0ZWQgdmlhIHByZVN0ZXBBdHRyU3RhcnRNcyByZWdhcmRsZXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdCAoc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub29wIGlzIHBlcm1pdHRlZCBmb3IgdGhlIHNhbWUgcmVhc29uIGF0dHJfc2V0IGlzOiBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBldmlkZW5jZSB0aGUgcnVuIGhhZCBhbHJlYWR5IG1hZGUgcHJvZ3Jlc3MuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFsIHNheXMgYSBjb25jdXJyZW50IHdyaXRlciBkaWVkLCB3aGljaCBzYXlzIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCB0aGlzIGludm9jYXRpb24sIGFuZCBleGNsdWRpbmcgaXQgd291bGQgc2lsZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGV2ZXJ5IGNvbnRlbmRlZCBydW4gb3V0IG9mIHRoZSBUVEZTIGRhdGFzZXQgLS1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBydW5zIHdvcnRoIG1lYXN1cmluZy5cbiAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID8/PSBldmVudExvZy5ldmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWFsZWROb29wRXZlbnQoZSlcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRMb2cuZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIFQzLiBgPz89YCBzbyBpdCBtYXJrcyB0aGUgRklSU1QgcmVwbGF5IHBhc3Mgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb246IGEgcmVzdW1lIHRoYXQgbmVlZHMgbW9yZSB0aGFuIG9uZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgdG8gcmVhY2ggaXRzIHN0ZXAgKGUuZy4gYSBwcmUtc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVzYCBkZXRvdXIpIHJlcG9ydHMgdGhlIGV4dHJhIHBhc3Nlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSBgcmVwbGF5YCwga2VlcGluZyB0aGUgcGhhc2VzIGFkZGl0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bWVUcmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcucmVwbGF5U3RhcnRlZEF0TXMgPz89IHJlcGxheVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBldmVyeSBtaXNzaW5nIGRlY3J5cHQvZGVjb21wcmVzcyBvcGVyYXRpb24gdXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9udCAoYWxyZWFkeS1wcmVwYXJlZCBwYXlsb2FkcyBhcmUgc2tpcHBlZCkuIFdlYlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENyeXB0byB3b3JrIG92ZXJsYXBzIFZNIHNldHVwIG9uIHRoZSByZXBsYXkgcGF0aCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXBwZW5kZWQgZXZlbnRzJyBjb25zdW1wdGlvbiBvbiB0aGUgcmVzdW1lIHBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZXJzIHN0aWxsIGRlc2VyaWFsaXplIGFuZCByZXNvbHZlIGluIGV2ZW50IG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWRQcmV3YXJtID0gcmVwbGF5UGF5bG9hZENhY2hlLnByZXdhcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UmVzdWx0OiBXb3JrZmxvd1Jlc3VtZVJlc3VsdCA9IHJldGFpbmVkU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCByZXN1bWVXb3JrZmxvdyhyZXRhaW5lZFNlc3Npb24sIGV2ZW50TG9nLmV2ZW50cylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyB0eXBlOiAncmVwbGF5JyB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UmVzdWx0LnR5cGUgPT09ICdyZXBsYXknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSZXN1bHQgPSBhd2FpdCByZXBsYXlXb3JrZmxvdyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiB0aGUgZW5kLW9mLXJ1biBkcmFpbiBpbnNpZGUgd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uIGNvbW1pdHMgZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyBiZWZvcmUgdGhlIHRlcm1pbmFsIGBhd2FpdFJ1blJlYWR5KClgIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGF5bG9hZFByZXdhcm07XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcmsgdGhlIGxpdmUgc2Vzc2lvbjsgdGhlIHN1c3BlbnNpb24gY2F0Y2ggYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIHRoZSBvbmUgcmV0ZW50aW9uIGRlY2lzaW9uOiBrZWVwIGl0IGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9yIGRpc2NhcmQgaXQgZm9yIGEgZnJlc2ggcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gd29ya2Zsb3dSZXN1bHQuc2Vzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHdvcmtmbG93UmVzdWx0LnN1c3BlbnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gd29ya2Zsb3dSZXN1bHQub3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTW9kZTogcmV0YWluZWRTZXNzaW9uID8gJ3JldGFpbmVkJyA6ICdyZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZC4gRG8gTk9UIHJlbG9hZC1hbmQtcmV0cnkgdGhlIGNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHBsYWNlOiBgcmVzdWx0YCB3YXMgY29tcHV0ZWQgYnkgdGhpcyByZXBsYXksIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFsZSAoNDEyKSByZWplY3Rpb24gbXVzdCBmb3JjZSBhICpmcmVzaCByZXBsYXkqICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBvYnNlcnZlIHRoZSBuZXcgZXZlbnQgYW5kIHByb2R1Y2UgYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQpLCBub3QgcmUtY29tbWl0IHRoZSBzdGFsZSByZXN1bHQuIFRoZSBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRzIHRoZSByZXBsYXkgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgd29ya2Zsb3ctZXhlY3V0aW9uIGR1cmF0aW9uIGZvciBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIG9ubHk6IGFuY2hvcnMgdGhlIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgZmllbGQgYmVsb3cgKHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcykuIFRoaXMgaXMgdGhlIEZJTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcGFzcywgdGhlIG9uZSB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXA6IHZhbGlkIHJzZnMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXMoKWAgZGV0b3VyIHJlcGxheXMgdHdpY2UpLCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkuIFRoaXMgdmFsdWUgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgZWFybGllciBwYXNzZXMsIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGhlIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIjogcnNmcyBjb3ZlcnMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIHdpbmRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBjb3ZlcnMgb25seSB0aGlzIGxhc3QgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmVkIGhlcmUsIGJlZm9yZSBgaGFuZGxlU3VzcGVuc2lvbmAncyBhd2FpdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJL08sIHNvIGl0IGV4Y2x1ZGVzIHRoYXQgSS9PLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi9pbnZvY2F0aW9uIHNwYW4sIGJ1dCBpcyBjb2xsZWN0ZWQgYXMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlciBjYW4gZW1pdCBpdCBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH43JSksIGFuZCBjbGllbnQgc3BhbnMgY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi4gT24gYSByZXRhaW5lZC1WTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHRoaXMgbWVhc3VyZXMgdGhlIHJlc3VtZSAodHlwaWNhbGx5IH4wbXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgcmVwbGF5LCBzbyB0aGUgZmllbGQncyBkaXN0cmlidXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbW9kYWwgb25jZSByZXRlbnRpb24gaXMgYWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuZGVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlEdXJhdGlvbk1zID0gc3VzcGVuZGVkQXRNcyAtIHJlcGxheVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIFQ0OiB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgaGFzIGJlZW4gZW5jb3VudGVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHYXRlZCBvbiB0aGUgc3VzcGVuc2lvbiBhY3R1YWxseSBzY2hlZHVsaW5nIHN0ZXBzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdXNwZW5zaW9uIHRoYXQgb25seSBjcmVhdGVzIGhvb2tzL3dhaXRzIGhhcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZWQgYSBzdGVwLCBhbmQgYSBsYXRlciBwYXNzIG1heS4gVGFrZW4gZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgaW5zdGFudCBhcyBgcmVwbGF5RHVyYXRpb25Nc2Agc28gVDQgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBwcmVjZWRlIFQzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nICYmIGVyci5zdGVwQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zID8/PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZEF0TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBvZiB0aGUgbG9hZGVkIGV2ZW50IGxvZywgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBob2xkaW5nIGFuIGV2ZW50IHRoaXMgcmVwbGF5IG5ldmVyIHNhdyByZWplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd3JpdGUgKDQxMikgaW5zdGVhZCBvZiBhY2NlcHRpbmcgYSBkaXZlcmdlbnQgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBoYW5kbGVkIGhlcmUsIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXksIG5ldmVyIGJ5IHJlLXBvc3RpbmcgdGhlIHNhbWUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgc3VzcGVuZGVkIGJlZm9yZSBpdHMgZXZlbnQgbG9nIHdhcyBsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1c3BlbnNpb25SZXN1bHQ6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGhhbmRsZVN1c3BlbnNpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdCA9IGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb246IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiBsZXRzIGVsaWdpYmxlIG5ld2x5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCBzdGVwcyBwdWJsaXNoIHRoZWlyIHN0ZXAtZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSAoY2FycnlpbmcgYHN0ZXBJbnB1dGApIGluIHBhcmFsbGVsIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlLiBTdGVwcyBxdWV1ZWQgdGhlcmUgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBpbiBgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGJ5IHRoZSBkaXNwYXRjaCBwYXNzIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEaXNwYXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVOYW1lOiBnZXRXb3JrZmxvd1F1ZXVlTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFjZUNhcnJpZXI6IG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgcHJlLWNsYWltczogbGV0cyB0aGUgYmF0Y2hlZCBmYW4tb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZCB0aGUgbGF6eS1pbmxpbmUgc3RlcHMnIHN0ZXBfY3JlYXRlZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIHBhaXJzIChzdGFtcGVkIHdpdGggdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UncyBvd25lcnNoaXApIGludG8gdGhlIG9uZSBjb21taXQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvZGllcyBiZWxvdyBzdGFydCBzdHJhaWdodCBvZmYgaXQuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LmlubGluZUNsYWltcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgZm9sZCByZXR1cm4gb25jZSB0aGUgcGFpciBjaHVuayBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQ6IHRyYWlsaW5nIGNodW5rcyBhbmQgdGhlIHBlci1jaHVua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMgcmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBkZWZlcnJlZEJhdGNoV29ya2AsIHdoaWNoIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpvaW5zIGJlZm9yZSBpdCBjYW4gYWNrIChiZWxvdywgbmV4dCB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBqb2luKSwgc28gdGhlIGR1cmFiaWxpdHkgY29udHJhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bmNoYW5nZWQgd2hpbGUgdGhlIGJvZGllcyBzdGFydCBlYXJsaWVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVmZXJyZWRCYXRjaFdvcms6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3VzcGVuc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3VzcGVuc2lvbiBjcmVhdGUgd2FzIHJlamVjdGVkIGFzIHN0YWxlOiByZS1kZXJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZyBpbiB0aGlzIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uY2UgdGhlIGluLXByb2Nlc3MgYnVkZ2V0IGlzIHNwZW50LCBmYWxsIGJhY2sgdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgaW1tZWRpYXRlIHJlLWludm9jYXRpb24gKGEgcmV0aHJvdyByZWxpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVkZWxpdmVyeSBvZiBhIG1lc3NhZ2UgdGhlIHR1cmJvIHBhdGggYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tlZCwgc28gdGhlIHJ1biB3b3VsZCBzdGFsbCBmb3IgdGhlIHF1ZXVlJ3MgfjMwMHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2aXNpYmlsaXR5IHRpbWVvdXQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3VzcGVuc2lvbkVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VzcGVuc2lvbi1jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBidWRnZXQgc3BlbnQ6IGZhaWwgdGhlIHJ1biByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmQgaXQgYmFjayB0byB0aGUgcXVldWUgdG8gc3BpbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmF0YWxFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGZhaWx1cmVzIHByb3BhZ2F0ZSB0byB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHNvIHRoZSBtZXNzYWdlIGlzIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN1c3BlbnNpb25FcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24tcmV0cnlhYmxlIGZhaWx1cmUgd2hpbGUgY29tbWl0dGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbidzIGV2ZW50cywgZS5nLiBhbiBhdHRyaWJ1dGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkIHJlamVjdGVkIGFzIGludmFsaWQgKHRoZSBjdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlci1ydW4gY2FwIGNhbiBvbmx5IGJlIGNoZWNrZWQgV29ybGQtc2lkZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGVsaXZlcnkgd291bGQgcmVwbGF5IHRoZSB3b3JrZmxvdyBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHdyaXRlIGFuZCB0aGUgc2FtZSByZWplY3Rpb24sIHNvIGZhaWwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHdlZGdpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgaW4gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihzdXNwZW5zaW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb24tcmV0cnlhYmxlIGVycm9yIHdoaWxlIGNvbW1pdHRpbmcgd29ya2Zsb3cgc3VzcGVuc2lvbjsgZmFpbGluZyBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdXNwZW5zaW9uRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoc3VzcGVuc2lvbkVycm9yLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQucmVwb3J0ZWRFdmVudENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdW1wLWFuZC1yZXBvcnQgbWVyZ2VkIGV2ZW50cyBCRUxPVyB0aGUgdGFpbCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtc29ydGVkIHRoZSBhcnJheSB0byBzbG90IG9yZGVyLCBzaGlmdGluZyBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGUgcHJld2FybSBzY2FuIGhhZCBhbHJlYWR5IHJlY29yZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3Vyc29yIGlzIGRlbGliZXJhdGVseSBsZWZ0IGFsb25lOiB0aGUgcmVwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGEgbG93ZXIgYm91bmQgb24gd2hhdCB3YXMgc2tpcHBlZCwgc28gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgcmVhZCBzdGlsbCBoYXMgdG8gY292ZXIgdGhlIHNhbWUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZS5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBpbiB0aGUgbG9nIGFzIGxvYWRlZCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVCBpbiBpdDogdGhleSBuZXZlciByZWFjaCByZXRlbnRpb24gYW55d2F5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBhIHN1c3BlbnNpb24gY29udGFpbmluZyBhIG5vbi1zdGVwIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxzIGNhblJldGFpbldvcmtmbG93U2Vzc2lvbidzIHR5cGUgY2hlY2sgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2NhbiBpcyBjb25zdWx0ZWQuIENvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXppbHksIGF0IG1vc3Qgb25jZSwgYW5kIHNoYXJlZCBiZXR3ZWVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGhlcmUgYW5kIHRoZSBkZWx0YS90dXJibyBnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3csIHNpbmNlIHRoZSBhdHRyLWRldG91ciBhbmQgaG9vay1jb25mbGljdCBwYXRoc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuL2NvbnRpbnVlIGJlZm9yZSB0aGUgZ2F0ZXMgYW5kIHVzdWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgYmVmb3JlIGV2ZXIgc2Nhbm5pbmcgdGhlIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Ib29rV2FpdCA9IG9uY2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuSG9va0FuZFdhaXRTdGF0ZShldmVudExvZy5ldmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzaW5nbGUgcmV0ZW50aW9uIGRlY2lzaW9uOiBrZWVwIHRoZSBwYXJrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlc3Npb24gb25seSBhY3Jvc3MgYSBwdXJlIHN0ZXAgYm91bmRhcnkgd2l0aCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0LW9mLWJhbmQgY29udGludWF0aW9uIHNvdXJjZSBhbmQgcHJvdmFibHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3NpdmUgc3RlcCBpbnB1dHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnJldGFpbmVkU3RlcElucHV0c1NhZmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkhvb2tXYWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMgKz0gc3VzcGVuc2lvblJlc3VsdC5ob29rQ3JlYXRpb25NcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPSBwcmVTdGVwQmxvY2tpbmdNcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gaGFuZGxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25NczogRGF0ZS5ub3coKSAtIHN1c3BlbnNpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzOiBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0Py5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cmlidXRlRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2sgY29uZmxpY3Q6IGJyZWFrIGxvb3AsIHJlLWludm9rZSB2aWEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIGFyZSByZXNvbHZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCByZXBsYXk6IHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIHJlbG9hZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgKG5vdyBob2xkaW5nIHRoZSBqdXN0LWNvbW1pdHRlZCBhdHRyX3NldCkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLCByZXNvbHZpbmcgdGhlIHNldEF0dHJpYnV0ZXMgcHJvbWlzZS4gU2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwcm9jZXNzaW5nIGZvciB0aGlzIHBhc3Mgc28gdGhhdCByZXBsYXkgZGVjaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFjZXMgZmlyc3Q6IGluIFByb21pc2UucmFjZShbc2V0QXR0cmlidXRlcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCgpXSksIHRoZSBkdXJhYmxlIGF0dHJpYnV0ZSBldmVudCBtdXN0IGJlIGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdpbiB3aXRob3V0IGV4ZWN1dGluZyB0aGUgbG9zaW5nIHN0ZXAuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHBlbnMgaW4tcHJvY2VzcyByYXRoZXIgdGhhbiB2aWEgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdW5saWtlIGhvb2tzIGFuZCB3YWl0cywgYW4gYXR0cl9zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvZHVjZXMgbm8gb3V0LW9mLWJhbmQgaW52b2NhdGlvbiBzb3VyY2UgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd291bGQgbmVlZCB0byB5aWVsZCB0aGUgbWVzc2FnZSBmb3IsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXlpbmcgYSBkZWxpdmVyeSByb3VuZC10cmlwIGhlcmUgd291bGQgb25seSBhZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgYmVmb3JlIHRoZSB3b3JrZmxvdydzIG5leHQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHMgd2hvc2UgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemUgd2VyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxpemVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgYXMgc3RlcF9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyArIHN0ZXBfZmFpbGVkIChzZWUgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXApLiBOb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gbWVzc2FnZSBpcyBkaXNwYXRjaGVkIGZvciB0aGVtLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBzdWNoIGEgc3RlcCBpcyB0aGUgb25seSBwZW5kaW5nIHdvcmsgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZXZlciByZS1pbnZva2UgdGhlIHJ1biwgc28gcmVwbGF5IGluLXByb2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIHJlbG9hZGVkIGxvZyBpbnN0ZWFkLiBUaGUgcmVwbGF5IHJlamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwJ3MgcHJvbWlzZSB3aXRoIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuY2F1Z2h0LCBpdCBwcm9wYWdhdGVzIG91dCBvZiB0aGUgd29ya2Zsb3cgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gYXMgYSBVU0VSX0VSUk9SLiBIZWFsdGh5IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIGFyZSBub3QgZGlzcGF0Y2hlZCB0aGlzIHBhc3M6IHRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXN1c3BlbmRzIG92ZXIgdGhlaXIgYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudHMgYW5kIHRoZSBuZXh0IHBhc3MgZGlzcGF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBhcyB1c3VhbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5mYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKb2luIHRoZSBiYXRjaGVkIGZhbi1vdXQncyB0cmFpbGluZyBjaHVuayBjb21taXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzIGJlZm9yZSBjb250aW51aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdGx5IGxpa2UgdGhlIHR3byBqb2lucyBvbiB0aGUgZGlzcGF0Y2ggcGF0aHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3c6IHRoaXMgaW52b2NhdGlvbiBtdXN0IG5vdCBwcm9jZWVkIChhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBhY2spIGJlZm9yZSBldmVyeSBjcmVhdGUgYW5kIHB1Ymxpc2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbGF1bmNoZWQgaXMgZHVyYWJsZS4gQSByZWplY3Rpb24gcHJvcGFnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIHRoZWlyczogdHJhbnNpZW50IHdvcmxkIGVycm9ycyByZXRocm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBmb3IgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3VzcGVuc2lvblJlc3VsdC5kZWZlcnJlZEJhdGNoV29yaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIHN0ZXBzIHdob3NlIHBhaXItZm9sZGVkIHN0ZXBfc3RhcnRlZCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgYWxyZWFkeSBjb21taXR0ZWQgKGBpbmxpbmVDbGFpbXNgKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBleGVjdXRlZCBvbiB0aGlzIHBhc3M6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgcmVwbGF5IGJlbG93IHJlLXN1c3BlbmRzIG92ZXIgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyBzdGVwcywgYW5kIG93bmVkIHJlY292ZXJ5ICh0aGUgY2xhaW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IHRoaXMgbWVzc2FnZSdzIG93bmVyTWVzc2FnZUlkKSByZS1leGVjdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRoZXJlLiBJdHMgXCJwcmV2aW91cyBkZWxpdmVyeSBjcmFzaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pZC1ib2R5XCIgbG9nIGlzIGEgbWlzbm9tZXIgb24gdGhpcyBwYXRoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGNyYXNoZWQsIHRoZSBib2RpZXMgd2VyZSBuZXZlciBzdGFydGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmFpbGVkIGRlaHlkcmF0aW9uIG1heSBoYXZlIGV4ZWN1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93LW93bmVkIGNvZGUgKGdldHRlcnMvcHJveGllcykgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93aW5nOyBkZW1vdGUgdG8gYSBjb2xkIHJlcGxheSByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYSBWTSB0aGF0IG1heSBoYXZlIGRpdmVyZ2VkLiBUaGlzIGlzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFyZSB0ZXJtaW5hbC1lcnJvciBwYXRoLCBzbyB0aGUgcmVwbGF5IGNvc3QgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXJyZWxldmFudCBuZXh0IHRvIHRoZSBkaXZlcmdlbmNlIHJpc2suXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSAoaW4gcGFyYWxsZWwpIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHJlcGxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwLCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkIGZvciByZS1pbnZvY2F0aW9uLCB3aGljaCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlciB3aGlsZSBxdWV1ZWQgc3RlcHMgcnVuIGluIHBhcmFsbGVsIGludm9jYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUlubGluZVN0ZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5sYXp5SW5saW5lU3RlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZpZWQgcXVldWUgZGlzcGF0Y2ggZm9yIGV2ZXJ5dGhpbmcgd2UgYXJlIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLWV4ZWN1dGluZy4gU3RlcHMgYXJlIHF1ZXVlZCB3aXRoIHN0ZXBJZCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyIHJ1bnMgdGhlbTsgdGhlIHdhaXQgdGltZXIgaXMgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGdlbmVyaWMgY29udGludWF0aW9uIHRoYXQgZmlyZXMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGVsYXBzZXMgYW5kIGxldHMgdGhlIG5leHQgcmVwbGF5IG9ic2VydmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlIGVsYXBzZWQgd2FpdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlIChwZXIgcGVuZGluZyBzdGVwIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduYXRlZCBsYXp5LWlubGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgPT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhlY3V0ZSBpbiBUSElTIGludm9jYXRpb24gKG93bmVkIHJlY292ZXJ5OiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkZWxpdmVyeSBvZiB0aGUgb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBpdCBjcmFzaGVkIG9uLCB2aWEgYSBwYXlsb2FkLWxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBlZCB3aXRoIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG93bmVyTWVzc2FnZUlkLCBub3QgYSBiYXJlIHN0YXJ0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyICE9PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVuc3VyZSBhIERFTEFZRUQgYmFja3N0b3Agd2FrZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZGVsYXlTZWNvbmRzID0gb3duZXJzaGlwIGxlYXNlIHJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnN0ZWFkIG9mIGVucXVldWVpbmcgdGhlIHN0ZXAuIFRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnZvY2F0aW9uIGlzIChsaWtlbHkpIHN0aWxsIHJ1bm5pbmcgdGhlIGJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW4gaW1tZWRpYXRlIHN0ZXAgbWVzc2FnZSB3b3VsZCBiYXJlLXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJ1bm5pbmcgc3RlcCBhbmQgZXhlY3V0ZSBpdCBhIHNlY29uZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHdvcmtmbG93IzI3ODApLiBUaGUgYmFja3N0b3AgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb250aW51YXRpb24sIE5PVCBhIHN0ZXAgbWVzc2FnZTogd2hlbiBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGZpcmVzLCB0aGlzIHNhbWUgZGVjaXNpb24gdGFibGUgaGFuZGxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdoYXRldmVyIHN0YXRlIHRoZSBzdGVwIGlzIGluIGJ5IHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAodGVybWluYWwg4oaSIG5vdGhpbmcgcGVuZGluZzsgcXVldWUtb3duZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3JldHJ5aW5nIOKGkiBub3JtYWwga2V5ZWQgZGlzcGF0Y2g7IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGVhZCB3aXRoIGxlYXNlIGV4cGlyZWQg4oaSIGltbWVkaWF0ZSBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmVzZXJ2aW5nIHN0ZXAtbGV2ZWwgZmFpbHVyZSBzZW1hbnRpY3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9pc29uIHN0ZXBzOyBsZWFzZSByZWZyZXNoZWQgYnkgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWNvdmVyeSDihpIgcmUtYXJtKS4gVGhlIGJhY2tzdG9wJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpZGVtcG90ZW5jeUtleSBpcyBzY29wZWQgdG8gdGhlIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEVQT0NIIChsYXRlc3Qgc3RlcF9zdGFydGVkIHRpbWVzdGFtcCksIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGp1c3QgdGhlIGNvcnJlbGF0aW9uIElELCBhbmQgbXVzdCBuZXZlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24ga2V5LiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5IGZvciBib3RoIGludmFyaWFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZml4ZWQga2V5cyBlaXRoZXIgYWJzb3JiIHRoZSByZXRyeSBoYW5kb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3IgZGVkdXBlIHRoZSByZWZyZXNoZWQtbGVhc2UgcmUtYXJtIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgaW4tZmxpZ2h0IGJhY2tzdG9wIGl0c2VsZikuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gTm90IG93bmVkIChuZXZlciBzdGFtcGVkIC8gZWFnZXIgLyBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsYXBzZWQgYXQgc3RlcF9yZXRyeWluZyAvIGxlYXNlIGV4cGlyZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGtpbGwtc3dpdGNoZWQpIOKGkiBpbW1lZGlhdGUgZW5xdWV1ZSwgZXhhY3RseSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlZm9yZS4gVGhpcyBjb3ZlcnMgY3Jhc2ggcmVjb3Zlcnk6IGlmIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZCBidXQgY3Jhc2hlZCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBxdWV1ZWluZywgYSBsYXRlciBoYW5kbGVyIHF1ZXVlcyBpdDsgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcC1pZGVudGl0eS1zY29wZWQgaWRlbXBvdGVuY3lLZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3Nlcy4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZU93bmVyc2hpcCA9IGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hOb3dNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZFJlY292ZXJ5U3RlcHM6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtW10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrc3RvcFdha2VzQXJtZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIGhhbmQtb2ZmLiBUaGUgbWVhc3VyZW1lbnQgbWF5IG9ubHkgZ28gdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkgQVRURU1QVCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBzdGVwLCBhbmQgdGhlIGxvb3AgYmVsb3cgaXMgd2hhdCBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aG9zZSBhcmUsIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjbGFzc2lmaWNhdGlvbiwgbmV2ZXIgYWhlYWQgb2YgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIGtlZXBzIHRoZSB0cmFja2luZyB3aGVuZXZlciBpdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gc29tZXRoaW5nIGl0c2VsZjogYSBkZWZlcnJlZCBsYXp5LWlubGluZSBzdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCAoYSByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0aW5nIHRoZSBzdGVwIGl0IGNyYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uKS4gQm90aCBsYW5kIGluIGBpbmxpbmVFeGVjdXRpb25zYCBiZWxvdyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgaXQgdGhlcmUuIE9ubHkgd2hlbiBuZWl0aGVyIGV4aXN0cyBpcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHRoZSBGSVJTVCBzdGVwIHRoaXMgaW52b2NhdGlvbiBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5xdWV1ZXMgYXMgYSBzdGVwIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGVwIGNvbnZlcnRlZCBpbnRvIGEgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgYW4gYXR0ZW1wdCAodGhlIHdha2UgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiwgYW5kIHdoaWNoZXZlciBpbnZvY2F0aW9uIGV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHN0ZXAgaXMgYSBkaWZmZXJlbnQgZGVsaXZlcnkpLCBzbyBpdCBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGFrZSB0aGUgc2FtcGxlLiBJZiBldmVyeSBwZW5kaW5nIHN0ZXAgYmVjb21lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBiYWNrc3RvcCwgbm90aGluZyBoZXJlIGF0dGVtcHRzIHRoZSBzdGVwIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtcHRpb24gZ29lcyB1bnJlcG9ydGVkLCB3aGljaCBpcyB0aGUgaG9uZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lIHJhdGhlciB0aGFuIGEgdG90YWwgYXR0cmlidXRlZCB0byB3b3JrIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG5ldmVyIGRpZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHYXRlZCBvbiB0aGVyZSBiZWluZyBhIG1lYXN1cmVtZW50IHRvIHBsYWNlIGF0IGFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGAmJmAgc2hvcnQtY2lyY3VpdHMsIHNvIGEgZGVsaXZlcnkgY2Fycnlpbmcgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNraW5nIChldmVyeSBub24tcmVzdW1lIGRlbGl2ZXJ5LCBhbmQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBwYXN0IHRoZSBzdGVwIHRoYXQgY29uc3VtZWQgaXQpIG5ldmVyIHBheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcGVuZGluZy1zdGVwIHNjYW4uIFRoYXQgbWF0dGVycyBvbiB3aWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYW4tb3V0cywgd2hlcmUgYHBlbmRpbmdTdGVwc2AgcnVucyB0byBodW5kcmVkcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYW5kT2ZmUmVzdW1lVGltaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFwZW5kaW5nU3RlcHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RlcCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUoc3RlcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHB1Ymxpc2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzaWxpZW50IGRpc3BhdGNoIChjcmVhdGUgKyBxdWV1ZSBpbiBwYXJhbGxlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBjYXJyeWluZyBgc3RlcElucHV0YCkuIEEgcmUtcHVibGlzaCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGRlZHVwZSBvbiB0aGUgaWRlbXBvdGVuY3kga2V5IGFueXdheSwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIHdhc3RlZCByb3VuZC10cmlwLiBPd25lcnNoaXAgbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGllcyB0byB0aGVzZTogdGhleSB3ZXJlIGNyZWF0ZWQgdGhpcyBwYXNzLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVwX3N0YXJ0ZWQgc3RhbXAgY2FuIGV4aXN0IHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQucXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiYgaXNTdGVwT3duZXJzaGlwQWN0aXZlKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVkIHJlY292ZXJ5OiB0aGlzIGRlbGl2ZXJ5IElTIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlOyByZS1leGVjdXRlIHRoZSBzdGVwIGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGluc3RlYWQgb2YgcXVldWVpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCBiYWNrc3RvcCB3YWtlIHdoaWxlIGFub3RoZXIgaW52b2NhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBsZWFzZSBpcyBsaXZlOyBpbW1lZGlhdGUgc3RlcCBlbnF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSAobGVhc2UgZXhwaXJlZCDih5IgcmVtYWluaW5nIDAg4oeSIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kYXksIHdoaWNoIGlzIGFsc28gdGhlIGRlZ3JhZGVkIG1vZGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkcyB3aXRoIHVuc3RhYmxlIG1lc3NhZ2UgSURzLCB3aGVyZSB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWJvdmUgbmV2ZXIgbWF0Y2hlcyB0aGVyZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tzdG9wRGVsYXlTZWNvbmRzID0gb3duZXJzaGlwQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKHN0ZXAsIGRpc3BhdGNoTm93TXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3N0b3BEZWxheVNlY29uZHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQZW5kaW5nIHN0ZXAgaXMgaW5saW5lLW93bmVkIGJ5IGEgbGl2ZSBpbnZvY2F0aW9uOyBlbnN1cmluZyBkZWxheWVkIGJhY2tzdG9wIHdha2UgaW5zdGVhZCBvZiBpbW1lZGlhdGUgcmVxdWV1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IHN0ZXAub3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogYmFja3N0b3BJZGVtcG90ZW5jeUtleShzdGVwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdGVwIElTIGJlaW5nIGF0dGVtcHRlZCwgYnkgdGhlIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBwaWNrcyB0aGUgbWVzc2FnZSB1cC4gQ29uc3VtZSB0aGUgdHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSwgZm9yIHRoZSBmaXJzdCBzdWNoIHN0ZXAgYW5kIG5vIG90aGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwUmVzdW1lVGltaW5nID0gaGFuZE9mZlJlc3VtZVRpbWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdW1lVGltaW5nRm9yTWVzc2FnZShyZXN1bWVUcmFja2luZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bWVUaW1pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kT2ZmUmVzdW1lVGltaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oc3RlcFJlc3VtZVRpbWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBob29rUmVzdW1lVGltaW5nOiBzdGVwUmVzdW1lVGltaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAtaWRlbnRpdHktc2NvcGVkOiBkZWR1cGVzIGFnYWluc3QgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgZGlzcGF0Y2ggb2YgVEhJUyBzdGVwIChjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzLCBjcmFzaC1yZWNvdmVyeSByZS1kaXNwYXRjaCwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlcidzIHJlc2lsaWVudCBwdWJsaXNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGFic29yYmluZyBhIGRpc3BhdGNoIG9mIGEgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgdW5kZXIgYSByZWFzc2lnbmVkIGNvcnJlbGF0aW9uIGlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGVwTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBoaWdoZXIgdGhhbiB0aGUgaW5jb21pbmcgY29udGludWF0aW9uJ3Mgd2hlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb24gSVMgdGhlIGNvbnRpbnVhdGlvbiBmb3IgdGhpcyBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW5kIHRoZSB3YWl0IGlzIHN0aWxsIHBlbmRpbmc6IHRoYXQgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlbnQgdGhlIGtleSwgc28gcmUtYXJtaW5nIHVuZGVyIGl0IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgYnkgdGhlIHdvcmxkJ3MgZGVkdXBlIHdpbmRvdyBhbmQgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgbG9zZSBpdHMgb25seSB0aW1lci4gRXZlcnkgb3RoZXIgY2FzZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDAgYW5kIGtleXMgYXMgYmVmb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0QXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdENvbnRpbnVhdGlvbj8uY29ycmVsYXRpb25JZCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gd2FpdENvbnRpbnVhdGlvbi5hdHRlbXB0ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Q29udGludWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiB3YWl0QXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QXR0ZW1wdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaCBwdWJsaXNoZXMgYW5kIHRoZSBpbmxpbmUgYm9kaWVzIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gQ09OQ1VSUkVOVExZOiB0aGUgc3VzcGVuc2lvbiBjb21taXQgYWxyZWFkeSBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBkaXNwYXRjaGVkIHN0ZXAgZHVyYWJsZSAoYW5kLCB3aGVuIHRoZSBmb2xkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmdhZ2VkLCBzZXR0bGVkIHRoZSBpbmxpbmUgcGFpcnMnIGNsYWltcyksIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25seSBvcmRlcmluZyBib3RoIHNpZGVzIG5lZWQsIHNvIG5laXRoZXIgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgb3RoZXIuIFRoZSBqb2lucyBiZWxvdyAoYmVmb3JlIHN0ZXAgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHJlYWQsIGFuZCBvbiB0aGUgbm8taW5saW5lIGVhcmx5IHJldHVybnMpIGtlZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYWlsdXJlIGNvbnRyYWN0OiBhIGRpc3BhdGNoIHJlamVjdGlvbiBzdGlsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHMgdGhpcyBkZWxpdmVyeSwgYWZ0ZXIgaW4tZmxpZ2h0IGJvZGllcyBzZXR0bGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzU2V0dGxlZCA9IFByb21pc2UuYWxsKGRpc3BhdGNoZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSByZWplY3Rpb24gbXVzdCBub3Qgc3VyZmFjZSBhcyBhbiB1bmhhbmRsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdGlvbiB3aGlsZSB0aGUgYm9kaWVzIHJ1biAob3IgaWYgc2V0dXAgYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBhbmQgdGhlIGpvaW4gdGhyb3dzIGZpcnN0KTsgYXdhaXRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBwcm9taXNlIGJlbG93IHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlc1NldHRsZWQuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2V0IG9mIHN0ZXBzIFRISVMgaW52b2NhdGlvbiBleGVjdXRlczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlcnJlZCBsYXp5LWlubGluZSBiYXRjaCBwbHVzIGFueSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgKHRoaXMgbWVzc2FnZSdzIHJlZGVsaXZlcnkgcmUtZXhlY3V0aW5nIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgaXQgY3Jhc2hlZCBvbjogbm8gbGF6eVN0ZXBJbnB1dDsgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoeWRyYXRlcyBmcm9tIHRoZSBzdGVwIGVudGl0eSBsaWtlIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQgdGhlIHBheWxvYWQtbGVzcyBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAuIFVubGlrZSB0aGUgYmFja2dyb3VuZCBwYXRoJ3Mgc3RhcnQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBiYXJlOiBpdCBjYXJyaWVzIHRoaXMgbWVzc2FnZSdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lck1lc3NhZ2VJZCwgd2hpY2ggaXMgYWxzbyB3aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3ZlcnkgcmV0cnkgY2VpbGluZyBjb3VudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lRXhlY3V0aW9uczogQXJyYXk8e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ/OiAodHlwZW9mIGxhenlJbmxpbmVTdGVwcylbbnVtYmVyXVsnZGVoeWRyYXRlZElucHV0J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNsYWltZWRTdGFydD86IFByZWNsYWltZWRJbmxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5sYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlLWNsYWltZWQgYnkgdGhlIHN1c3BlbnNpb24gYmF0Y2g6IHRoZSBwYWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzZXR0bGVkIHRoaXMgc3RlcCdzIGNyZWF0ZSArIGNsYWltLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBydW5zIChvciBza2lwcykgdGhlIGJvZHkgb2ZmIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGluc3RlYWQgb2Ygc2VuZGluZyBhIGxhenkgc3RhcnQgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFpbSA9IHN1c3BlbnNpb25SZXN1bHQuaW5saW5lQ2xhaW1zLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2xhaW1lZFN0YXJ0OiBjbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMuZGVoeWRyYXRlZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3duZWRSZWNvdmVyeVN0ZXBzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lcnNoaXAgdGVsZW1ldHJ5IChkZXNpZ24gZG9jIFBoYXNlIDcpOiBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIHNvIHByb2R1Y3Rpb24gdHJhY2VzIHNob3cgd2hlbiBjcmFzaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnkgcmFuIG9yIGEgd2FrZSB3YXMgY29udmVydGVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AsIGFuZCBhIHdhcm4gKGFsd2F5cyBwcmludGVkLCB1bmxpa2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnL2luZm8pIGZvciBvd25lZCByZWNvdmVyeSwgc2luY2UgaXQgbWVhbnMgYSBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIGRpZWQgbWlkLXN0ZXAtYm9keS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dPd25lZFJlY292ZXJ5U3RlcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYmFja3N0b3BXYWtlc0FybWVkID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dCYWNrc3RvcFdha2VzQXJtZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlLWV4ZWN1dGluZyBpbmxpbmUgc3RlcHMgb3duZWQgYnkgdGhpcyBxdWV1ZSBtZXNzYWdlIOKAlCBhIHByZXZpb3VzIGRlbGl2ZXJ5IGNyYXNoZWQgbWlkLWJvZHkgYW5kIHRoaXMgcmVkZWxpdmVyeSBpcyByZWNvdmVyaW5nIHRoZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogb3duZWRSZWNvdmVyeVN0ZXBzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZXhlY3V0ZSBpbmxpbmU6IGV2ZXJ5dGhpbmcgaGFzIGJlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCAob3Igbm8gd29yayBuZWVkcyBzY2hlZHVsaW5nKS4gRXhpdCBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgZHJpdmUgc3Vic2VxdWVudCByZXBsYXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgcnVucyBjb25jdXJyZW50bHkgd2l0aCB0aGUgZGlzcGF0Y2hlcyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhdGgsIHNvIGpvaW4gdGhlbSAoYW5kIHRoZSBmb2xkJ3MgZGVmZXJyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2h1bmsgY29tbWl0cy9wdWJsaXNoZXMpIGhlcmUgc28gYSBmYWlsdXJlIGZhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWxpdmVyeSBleGFjdGx5IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzU2V0dGxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB0aGUgcmVwbGF5IGNvbnN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyLiBXaXRob3V0IGl0IChubyBpbmxpbmUgc3RlcCwgYWxsIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIG9yIG5vbmUgcGVuZGluZykgdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGFyZSBjb25zdWx0ZWQgYnkgYWxsIHRocmVlIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdzsgcmVzb2x2ZSB0aGUgbWVtb2l6ZWQgc2NhbiBvbmNlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXRTdGF0ZSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0KSBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdCAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgV29ybGQgbWF5IHJldHVybiBub25lIG9uIHRoZSBpbml0aWFsIGxvYWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhpcyBpcyB0aGUgY2xlYW4gc2luZ2xlLXN0ZXAgc2VxdWVudGlhbCBjYXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBzdXNwZW5zaW9uIHByb2R1Y2VkIGV4YWN0bHkgb25lIHN0ZXAgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YWl0cyAoYGVyci57c3RlcCx3YWl0fUNvdW50YCksIHRoYXQgb25lIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBsb25lIHBlbmRpbmcgc3RlcCAoYHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDFgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIHRoZSBsb25lIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDFgOiBubyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2libGluZ3MgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMsIGFuZCBubyBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW5saW5lIHN0ZXAgd3JpdGluZyBpdHMgb3duIGV2ZW50cyBvdXQgb2YgYmFuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBObyBwZW5kaW5nIHdhaXQgdGltZXIgZnJvbSBUSElTIHN1c3BlbnNpb24sIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3BlbiB3YWl0IGluIHRoZSBjdW11bGF0aXZlIGxvZy4gQSBgd2FpdF9jb21wbGV0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhIHJlc29sdXRpb24gdGhlIHJlcGxheSBpcyB3YWl0aW5nIG9uIHJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhhbiBhbiBldmVudCBpdCBjYW4gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzbyBjb25zdW1pbmcgYSBkZWx0YSB0aGF0IHByZWRhdGVzIGl0IHdvdWxkIHNldHRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIHNsZWVwIGZyb20gYSB2aWV3IHRoYXQgZG9lcyBub3QgY29udGFpbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbXBsZXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBBbiBvcGVuIChvciB0aGlzLXN1c3BlbnNpb24tY3JlYXRlZCkgaG9vayBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmluZSwgYW5kIHRoYXQgaXMgdGhlIGdhdGUgdGhpcyB1c2VkIHRvIGNhcnJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgVGhlIGRlbHRhIHNuYXBzaG90cyB0aGUgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uIHRoZSBuZXh0IHJlcGxheSwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIGBob29rX3JlY2VpdmVkYCBsYW5kaW5nIGluIHRoYXQgd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhYnNlbnQgZnJvbSB0aGUgZGVsdGEgYW5kIG9ic2VydmVkIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlcmF0aW9uIGxhdGVyIHRoYW4gYSByZWFsIGZldGNoIHdvdWxkIG9ic2VydmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LiBUaGF0IHN0YWxlbmVzcyBpcyBxdWFsaXRhdGl2ZWx5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFkLXRvLXdyaXRlIHJhY2UgdGhlIGZldGNoIHBhdGggYWxyZWFkeSBoYXMgKGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBldmVudCBjYW4gbGFuZCByaWdodCBhZnRlciBgZXZlbnRzLmxpc3RgIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCBiZWZvcmUgdGhlIHN1c3BlbnNpb24ncyB3cml0ZXMpLCBhbmQgaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJvdW5kZWQgYnkgdGhlIHNhbWUgdGhpbmc6IHdoYXQgYSBzdGFsZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGhvbGRzIGlzIGEgKnByZWZpeCogb2YgdGhlIGxvZywgbmV2ZXIgYSBob2xlIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdCwgYW5kIHJlcGxheWluZyBhIHByZWZpeCB0d2ljZSByZWFjaGVzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkZWNpc2lvbnMuIEl0cyBuZXh0IHdyaXRlIGlzIGFsbG9jYXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2hhdGV2ZXIgaXQgbWlzc2VkIGFuZCBjb21lcyBiYWNrIGNhcnJ5aW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHJlcG9ydFNraXBwZWRTbG90c2Agb24gdGhlIGxvY2FsIHdvcmxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbW1pdC10aW1lIGFsbG9jYXRpb24gb24gdGhlIFZlcmNlbCBvbmUpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlcGxheSBjb3JyZWN0cyBpdHNlbGYgb24gdGhlIHdyaXRlIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvbiBhIHJlYWQuIEEgV29ybGQgTUFZIGluc3RlYWQgcmVmdXNlIHRoZSB3cml0ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RhbGUgKDQxMiksIHdoaWNoIHRoZSBydW50aW1lIGhhbmRsZXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdheTsgbm90aGluZyByZXF1aXJlcyBpdCB0by4gSG9va3MgY3JlYXRlZCBieSBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdXNwZW5zaW9uIGFyZSBpbnNpZGUgdGhlIGRlbHRhICh0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYGhvb2tfY3JlYXRlZGAgbGFuZHMgYmVmb3JlIHRoZSBzdGVwLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSksIHNvIG9ubHkgdGhlaXIgYGhvb2tfcmVjZWl2ZWRgIHJlc3BvbnNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYXJlIHN1YmplY3QgdG8gdGhlIHNhbWUgd2luZG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2l0aCBubyBob29rIG9yIHdhaXQgb3BlbiBhdCBhbGwsIHRoZSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvdXQtb2YtYmFuZCB3cml0ZXIgaXMgY2FuY2VsbGF0aW9uLCB3aGljaCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0byBvYnNlcnZlIG9uZSBpdGVyYXRpb24gbGF0ZS4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvcGVuSG9va0FuZFdhaXRTdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgc3RlcCBydW5zIGlubGluZSwgZWFjaCB3cml0ZXMgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd24gZXZlbnRzIGFuZCB0aGUgcGVyLXdyaXRlIGRlbHRhIHdvdWxkIGJlIHBhcnRpYWwsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsdGEgaXMgbm90IHJlcXVlc3RlZCAodGhlIGdhdGUgYmVsb3cgaXMgZmFsc2UgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aS1zdGVwKSBhbmQgdGhlIG5leHQgaXRlcmF0aW9uIGRvZXMgYSBub3JtYWwgZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5saW5lRGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnRMb2cuY3Vyc29yID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFsZS1zZW5zaXRpdmUgYmF0Y2g6IGEgaG9vayBpcyBvcGVuIGluIHRoZSBydW4gKG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY3JlYXRlZCBieSB0aGlzIHN1c3BlbnNpb24sIHNvIGl0cyBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gbGFuZCBhbnkgbW9tZW50KSwgc28gYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZCBmcm9tIHN0YWxlLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgd2hlbiBzZXZlcmFsIGludm9jYXRpb25zIHJhY2UgZm9yIG9uZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltLiBPcHRpbWlzdGljIHN0YXJ0IGJlZ2lucyB0aGUgYm9keSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSBzZXR0bGVzLCBzbyB0aGUgd3JpdGVyIHRoYXQgTE9TRVMgdGhlIGNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoYEVudGl0eUNvbmZsaWN0RXJyb3JgIOKGkiBgc2tpcHBlZGApIGhhcyBhbHJlYWR5IHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBjb2RlIGl0IGRvZXMgbm90IG93bi4gU3VwcHJlc3MgaXQgZm9yIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaGVzLCBzbyB0aGUgYm9keSBydW5zIG9ubHkgYWZ0ZXIgdGhlIGNsYWltIGNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgd29uLiBDb3N0cyBvbmUgY2xhaW0gcm91bmQtdHJpcCBwZXIgc3RlcCB3aGlsZSBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rIGlzIG9wZW4sIGFuZCBidXlzIHRoZSBzYW1lIHRoaW5nIG9uIGV2ZXJ5IFdvcmxkOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdGVwIGJvZHkgZXhlY3V0ZXMgb25jZSBwZXIgY2xhaW0sIG5vdCBvbmNlIHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFjZXIuIChBIFdvcmxkIHRoYXQgcmVmdXNlcyB0aGUgY2xhaW0gYXMgc3RhbGUgKDQxMilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldHMgdGhlIHNhbWUgcHJvdGVjdGlvbiB0aHJvdWdoIHRoZSBzYW1lIGF3YWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uZSBvZiB0aGUgc2hpcHBlZCBvbmVzIGRvZXMgdGhhdCBmb3IgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xvdC1udW1iZXJlZCBydW4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgZm9yY2VzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCwgYnV0IG9ubHkgd2hpbGUgdGhlIHJ1biBpcyBzdGlsbCBcImNsZWFuXCIgKGEgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9uKS4gVGhlIG1vbWVudCBhIGhvb2sgb3Igd2FpdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCwgbGF0ZXIgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zIGJlY29tZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUsIHNvIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2VkIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBubyBsb25nZXIgaG9sZHM6IHR1cmJvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyBhbmQgdGhlIHN0ZXBzIHRha2UgdGhlIG5vcm1hbCAoZW52LWdhdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQtdGhlbi1ydW4gcGF0aC4gVGhlIGhvb2stY29uZmxpY3QgY2FzZSBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBlYXJseSBhYm92ZSwgdGhlIGF0dHIgY2FzZSBjb250aW51ZWQgaW50byBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVzaCByZXBsYXkgKHNvIGEgYmF0Y2gtc2NoZWR1bGluZyBzdXNwZW5zaW9uIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGF0dHIgZXZlbnRzKSwgYW5kIHRoZSBhd2FpdGVkLWhvb2sgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdGllZCBsYXp5SW5saW5lU3RlcHM7IHRoZSBjaGVja3MgYmVsb3cgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlbnNpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGBzdXNwZW5zaW9uUmVzdWx0LipgIGZsYWdzIG9ubHkgcmVmbGVjdCB3aGF0IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIGNyZWF0ZWQsIHNvIHRoZXkgZG8gbm90IGNhdGNoIGEgaG9vay93YWl0IG9wZW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYW4gZWFybGllciBpdGVyYXRpb24gb2YgdGhlIHNhbWUgZGVsaXZlcnkgKGUuZy4gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rKC4uLilgIHRoYXQgZG9lc24ndCBibG9jayB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93LCBsZXR0aW5nIHRoZSByZXBsYXkgbG9vcCBjb250aW51ZSB0byBsYXRlciBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb25zKS4gT25jZSBhbnkgaG9vayBvciB3YWl0IGlzIG9wZW4gaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdW11bGF0aXZlIGxvZywgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zIGFyZSBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBydW4sIHNvIHR1cmJvIG11c3QgbGF0Y2ggb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJtYW5lbnRseSwgY2hlY2tlZCBoZXJlIHZpYSBgb3Blbkhvb2tBbmRXYWl0U3RhdGVgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBjdW11bGF0aXZlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgV09SS0ZMT1dfU0VRVUVOVElBTF9SRVBMQVlTPTFgIChwZXItcnVuIGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvcGljcyBjb25zdW1lZCB3aXRoIGBtYXhDb25jdXJyZW5jeTogMWApIHdvdWxkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmluY2lwbGUgd2FpdmUgdGhpcyBsYXRjaDogc2VyaWFsaXplZCBvcmNoZXN0cmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIHJlc3RvcmUgdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBkZWxpdmVyeS4gVGhlIHdhaXZlciBpcyBpbnRlbnRpb25hbGx5IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZW46IHRoZSBlbnYgdmFyIGlzIGEgcnVudGltZS1wcm9jZXNzIHNldHRpbmcgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IHByb3ZlIHRoZSBCVUlMVCBmbG93IHRyaWdnZXIgYWN0dWFsbHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYG1heENvbmN1cnJlbmN5OiAxYCAoaXQgbXVzdCBiZSBzZXQgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vLCBhbmQgc29tZSBpbnRlZ3JhdGlvbnMgd3JpdGUgdGhlaXIgb3duIHRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZyksIGFuZCBgY2FwYWJpbGl0aWVzLm1heENvbmN1cnJlbmN5YCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlcyBxdWV1ZSBzdXBwb3J0LCBub3QgZGVwbG95ZWQgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVudGlsIHRoZSBidWlsZCBlbWl0cyBhIHZlcmlmaWFibGUgc2lnbmFsIHRoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBsb3llZCB0cmlnZ2VyIGlzIHNlcmlhbGl6ZWQsIHRoZSBjb25zZXJ2YXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGNoIHN0YXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yY2VPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJibyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3BlbldhaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBzdGVwcyBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVkZ2V0IGlzIHBhdXNlZCBmb3IgdGhlIHdob2xlIGJhdGNoIChzdGVwIGR1cmF0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uIG1heER1cmF0aW9uLCBub3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGltZW91dCkgc28gdGhlIGJ1ZGdldCBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBkb2Vzbid0IGNoYXJnZSB0aGUgc3RlcCBib2RpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeTogZGVjaWRlIHdoZXRoZXIgdGhpcyBiYXRjaCdzIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHF1YWxpZmllcyBmb3IgVFRGUy9TVFNPIG1lYXN1cmVtZW50LiBPbmx5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gncyBmaXJzdCBzdGVwIGNhcnJpZXMgdGhlIHRyYWNraW5nIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsIGJhdGNoIGVtaXRzIG9uZSBzYW1wbGUgcGVyIHNjaGVkdWxpbmcgZ2FwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG9uZSBwZXIgc2libGluZy4gVHVyYm8ncyBzeW50aGVzaXplZCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGhhcyBhIGxvY2FsLWNsb2NrIGNyZWF0ZWRBdCwgc28gdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIG9ubHkgdGhlIHJ1bi1pZCBVTElEIHRpbWVzdGFtcCBpcyB0cnVzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF0ZW5jeVRyYWNraW5nID0gY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5DcmVhdGVkQXRNczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZENyZWF0ZWRBdChydW5JZCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHVyYm8gPyB1bmRlZmluZWQgOiArd29ya2Zsb3dSdW4uY3JlYXRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IHJlcGxheUR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3VzcGVuc2lvbidzIG93biBob29rL3dhaXQgd3JpdGVzIGFyZSBub3QgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvYWRlZCBldmVudCBsb2cgeWV0LCBzbyByZXBvcnQgdGhlbSBleHBsaWNpdGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uSGFzV2FpdHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA+IDAgfHwgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJibyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTbG90IHNuYXBzaG90IGZvciB0aGUgaW5saW5lIHN0ZXBfc3RhcnRlZCBjbGFpbXM6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBjbGFpbSBpcyB0aGUgZmlyc3QgZHVyYWJsZSB3cml0ZSBvZiBhIGhvdC1wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChpdHMgc3RlcF9jcmVhdGVkIGlzIGRlZmVycmVkKSwgc28gd2l0aG91dCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBpdCB3b3VsZCBuYW1lIG5vIHBvc2l0aW9uIGF0IGFsbCBhbmQgYSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGNvdWxkIGNsYWltIChhbmQgY29tbWl0KSBhIHN0ZXAgc2NoZWR1bGVkIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSB2aWV3IHRoYXQgbWlzc2VzIGFuIGV2ZW50IGl0IG5ldmVyIGxvYWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWtlbiBoZXJlIHJhdGhlciB0aGFuIGluc2lkZSB0aGUgZXhlY3V0b3IgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgdmlldyB0aGUgc2NoZWR1bGluZyBkZWNpc2lvbiB3YXMgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWdhaW5zdC4gVGhlIGV4ZWN1dG9yIGFkdmFuY2VzIGZyb20gaXQgYXMgaXRzIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGxhbmQ7IHNlZSBgc2xvdFNuYXBzaG90YCBpbiBzdGVwLWV4ZWN1dG9yLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkU2xvdFNuYXBzaG90ID0gc2xvdFNuYXBzaG90UGFyYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmF0Y2hlZCBmYW4tb3V0J3Mgb3duIGV2ZW50cyBhcmUgbm90IGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGVkIGxvZyB5ZXQgKHRoZSBuZXh0IGl0ZXJhdGlvbiByZWxvYWRzKSwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb24gd3JvdGUgdGhlbSwgc28gZm9sZCB0aGUgYmF0Y2gnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VpbGluZyBpbiwgb3IgZXZlcnkgaW5saW5lIHRlcm1pbmFsIHdyaXRlIHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuYW1lIGEgcHJlLWJhdGNoIHBvc2l0aW9uIGFuZCBiZSBhbnN3ZXJlZCB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQtc2xvdCByZXBvcnQgZWNob2luZyB0aGUgZXZlbnRzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24ganVzdCBjb21taXR0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaFNsb3RDZWlsaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5iYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ2xhaW1TbmFwc2hvdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoU2xvdENlaWxpbmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaFNsb3RDZWlsaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZGVkU2xvdFNuYXBzaG90LmV2ZW50Q291bnQgPz8gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgZXZlbnRDb3VudDogYmF0Y2hTbG90Q2VpbGluZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2FkZWRTbG90U25hcHNob3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRUUjogY29uc3VtZWQgYnkgdGhpcyBiYXRjaC4gRXZlcnkgc3RlcCBpcyBoYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTQU1FIHRyYWNraW5nIG9iamVjdCBhbmQgaXRzIG9uZS1zaG90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVwb3J0ZWRgIGxhdGNoIHBpY2tzIHRoZSBzaW5nbGUgc3RlcCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSByZWFjaGVzIHVzZXIgY29kZSwgc28gdGhlIHNhbXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vydml2ZXMgdGhlIGJhdGNoJ3MgZmlyc3Qgc3RlcCBsb3NpbmcgaXRzIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIHRvIGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdoaWxlIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpYmxpbmcgcnVucywgd2l0aG91dCBhIHBhcmFsbGVsIGJhdGNoIHJlcG9ydGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBwZXIgc2libGluZy4gQ2xlYXJlZCBoZXJlIHNvIGEgbGF0ZXIgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uJ3Mgc3RlcHMgKGFuZCBhbnkgaW4tcHJvY2VzcyByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQpIGNhbm5vdCByZXBvcnQgdGhlIHNhbWUgcmVzdW1wdGlvbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoUmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0czogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA+W107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwRXhlY3V0aW9uUHJvbWlzZXMgPSBpbmxpbmVFeGVjdXRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHN0ZXBJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290UnVuSWQ6IHJvb3RSdW5JZEZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCBudW1iZXIgPSBwcmlvciBzdGVwX3N0YXJ0ZWQgY291bnQgKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGlzIGV4ZWN1dGlvbidzIHN0YXJ0KSwgY291bnRpbmcgb25seSBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UncyBvd24gc3RhcnRzOiB0aGUgb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VpbGluZyBib3VuZHMgaG93IG1hbnkgdGltZXMgdGhpcyBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZS1ydW5zIGEgc3RlcCBpdCBjcmFzaGVkL3RpbWVkIG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiwgYW5kIGVhY2ggb2YgdGhvc2UgKHJlKXN0YXJ0cyBzdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWV0YWRhdGEubWVzc2FnZUlkLiBTdGFydHMgd3JpdHRlbiBieSByYWNpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbnMgKHN0YWxlL3dha2UgcmVwbGF5cywgYSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgZGlzcGF0Y2hlZCBvZmYgYSBsb3N0IGNyZWF0ZS1jbGFpbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fycnkgb3RoZXIgSURzIChvciBub25lKSBhbmQgbXVzdCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQsIG9yIHRoZSBjZWlsaW5nIGZhbHNlbHkgZXhoYXVzdHMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFsdGh5IHN0ZXAgKHNlZSBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBsYXp5IHN0ZXAgaXMgYnJhbmQtbmV3IGJ5IGNvbnN0cnVjdGlvbiAoaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXJzIHRoZSBiYXRjaCBvbmx5IHdoZW4gaXQgaGFzIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCB5ZXQpLCBzbyBpdCBoYXMgemVybyBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgYW5kIGlzIGFsd2F5cyBhdHRlbXB0IDEsIHNvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyBzY2FuIGVudGlyZWx5LiBPbmx5IGFuIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXJ1biBjYW4gaGF2ZSBwcmlvciBzdGFydHMsIGFuZCB0aGF0IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdW5jb21tb24sIHNvIHJlc2VydmUgdGhlIE8obikgc2NhbiBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gd2Fsa2luZyB0aGUgZ3Jvd2luZyBsb2cgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGlubGluZSBzdGVwICh3aGljaCB3b3VsZCBiZSBPKG7CsilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIGEgbG9uZyBzZXF1ZW50aWFsIHdvcmtmbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByZWNsYWltZWRTdGFydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvd25lZEJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIHN0YXJ0OiBzZW5kIHRoZSBkZWZlcnJlZCBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgb24gc3RlcF9zdGFydGVkIHNvIHRoZSB3b3JsZCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIG9uIHRoZSBmbHkuIEFic2VudCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcHMsIHdob3NlIGlucHV0IGh5ZHJhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4aXN0aW5nIHN0ZXAgZW50aXR5LCBhbmQgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZS1jbGFpbWVkIHN0ZXBzLCB3aG9zZSBwYWlyIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmllZCBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmUtY2xhaW1lZCBpbmxpbmUgc3RhcnQ6IHRoZSBzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIHNldHRsZWQgdGhpcyBzdGVwJ3MgY3JlYXRlICsgY2xhaW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBydW5zIChvciBza2lwcykgdGhlIGJvZHkgb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdmVyZGljdCB3aXRoIG5vIHN0YXJ0IHdyaXRlIG9mIGl0cyBvd24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNsYWltZWRTdGFydDogcy5wcmVjbGFpbWVkU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBvd25lcnNoaXA6IHN0YW1wIChvciByZS1zdGFtcCkgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgcXVldWUgbWVzc2FnZSBJRCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkLCBzbyB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGluIGZsaWdodCBoZXJlIGFuZCBzdXBwcmVzcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHJlcXVldWUgKHdvcmtmbG93IzI3ODApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogZm9yY2Ugb3B0aW1pc3RpYyBzdGFydCBhbmQgaG9sZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBzdGVwX3N0YXJ0ZWQgdW50aWwgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBsYW5kcyAodGhlIGJvZHkgc3RpbGwgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSkuIEJvdGggYXJlIHVuZGVmaW5lZC9mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQtZW5mb3JjZWQgYmF0Y2hlcyB3aXRoIGFuIG9wZW4gaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB0aGUgY2xhaW0gYmVmb3JlIHJ1bm5pbmcgdGhlIGJvZHksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgNDEyLWZlbmNlZCBzdGVwIG5ldmVyIGV4ZWN1dGVzIHVzZXIgY29kZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0IGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc09wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90U25hcHNob3Q6IGlubGluZUNsYWltU25hcHNob3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdGVwSW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wcmVjbGFpbWVkU3RhcnQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IGxhdGVuY3lUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYXRjaFJlc3VtZVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHJlc3VtZVRyYWNraW5nOiBiYXRjaFJlc3VtZVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhcmlhbnQgYm9va2tlZXBpbmc6IHRoaXMgaW52b2NhdGlvbiBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYm9kaWVzIHVudGlsIHRoZXkgc2V0dGxlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuYWRkKHMuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBhbmQgcHJlLWNsYWltZWQgc3RlcHMgYXJlIGJyYW5kLW5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGVpciBjcmVhdGUtY2xhaW0gaXMgdGhlIGV4YWN0bHktb25jZSBnYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCBhbHJlYWR5IGV4aXN0cyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgZGVsYXllZCBiYWNrc3RvcCBtZXNzYWdlIG1heSBmaXJlIG1pZC1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzYW1lIHByb2Nlc3MsIHNvIHJvdXRlIHRob3NlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4tcHJvY2VzcyBzaW5nbGUtZmxpZ2h0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByZWNsYWltZWRTdGFydCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZC5maW5hbGx5KCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuZGVsZXRlKHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGpvaW5zIGJlbG93IHNpdCBCRVRXRUVOIHRoZXNlIHByb21pc2VzJyBjcmVhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBgUHJvbWlzZS5hbGxgIHRoYXQgcmVhZHMgdGhlbSwgc28gYSBib2R5IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdHMgd2hpbGUgYSBwdWJsaXNoIG9yIGEgdHJhaWxpbmcgY2h1bmsgY29tbWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBpbiBmbGlnaHQgd291bGQgaGF2ZSBubyBoYW5kbGVyIGF0dGFjaGVkIGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWljcm90YXNrIGNoZWNrcG9pbnQ6IGFuIGB1bmhhbmRsZWRSZWplY3Rpb25gLCBmYXRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgTm9kZSdzIGRlZmF1bHQgYC0tdW5oYW5kbGVkLXJlamVjdGlvbnM9dGhyb3dgLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSA0MTIgc3RhbGUtY2xhaW0gcmVqZWN0aW9uIHJhY2VzIGV4YWN0bHkgdGhhdCB3aW5kb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggbm93OyBldmVyeSByZWplY3Rpb24gaXMgc3RpbGwgb2JzZXJ2ZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdHMgYmVsb3csIHdoaWNoIGFyZSB3aGF0IGRlY2lkZSB0aGUgb3V0Y29tZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiBzdGVwRXhlY3V0aW9uUHJvbWlzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKb2luIHRoZSBkaXNwYXRjaCBwdWJsaXNoZXMgbGF1bmNoZWQgYWJvdmUgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xkJ3MgZGVmZXJyZWQgYmF0Y2ggd29yayAodHJhaWxpbmcgY2h1bmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0cyArIHBlci1jaHVuayBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzKTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvZGllcyBhcmUgYWxyZWFkeSBydW5uaW5nIGluIHBhcmFsbGVsIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCwgYW5kIHRoaXMgaW52b2NhdGlvbiBtdXN0IG5vdCBhY2sgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGNyZWF0ZSBhbmQgcHVibGlzaCBpcyBkdXJhYmxlLiBBIGZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgaXRzIG9sZCBjb250cmFjdCAoZmFpbCB0aGlzIGRlbGl2ZXJ5IHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHJlZGVsaXZlcnMpLCBidXQgdGhlIGluLWZsaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib2RpZXMgbXVzdCBzZXR0bGUgZmlyc3Q6IGFuIG93bmVkIGJvZHkgbGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nIHBhc3QgdGhpcyBoYW5kbGVyIHdvdWxkIHJhY2UgaXRzIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXNTZXR0bGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5kZWZlcnJlZEJhdGNoV29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZGlzcGF0Y2hFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc3RlcEV4ZWN1dGlvblByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBkaXNwYXRjaEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YWxlICg0MTIpIHJlamVjdGlvbiBvZiBhbiBpbmxpbmUgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltOiB0aGUgbG9hZGVkIHZpZXcgdGhpcyBiYXRjaCB3YXMgc2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gaXMgbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBhbHJlYWR5IGhhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIGNsYWltIHdhcyBmZW5jZWQgYnkgdGhlIGd1YXJkIGFuZCBubyBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3ZXJlIHdyaXR0ZW4uIEFiYW5kb24gdGhlIGJhdGNoIChhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBib2R5IHJlc3VsdCBpcyBkaXNjYXJkZWQgYnkgZXhlY3V0ZVN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbmNpbGlhdGlvbikgYW5kIHJlc3RhcnQgdGhlIHJlcGxheSBzbyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgbWlzc2luZyBldmVudC4gV2FpdCBmb3IgdGhlIHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9ucyB0byBzZXR0bGUgZmlyc3Qgc28gbm8gb3duZWQgYm9keSBpcyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgd2hlbiB0aGUgcmVzdGFydCAob3IgdGhlIGFjayBwYXRoKSBydW5zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3RlcEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvblByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHNpYmxpbmcgd2hvc2UgY2xhaW0gd2FzIGFjY2VwdGVkIHdyb3RlIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgb2YgaXRzIG93biwgcG9zc2libHkgYWZ0ZXIgdGhlIFdvcmxkIGJ1aWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyA0MTIncyBkZWx0YSwgc28gdGhhdCBkZWx0YSBjYW4gbm8gbG9uZ2VyIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lZCB0byBjb21wbGV0ZSB0aGUgbG9nLCBhbmQgdGhlIHJlc3RhcnQgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVsb2FkIGl0IGluIGZ1bGwuIGBza2lwcGVkYCAodGhlIHN0ZXAgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0ZWQpLCBgZ29uZWAgYW5kIGB0aHJvdHRsZWRgIChjbGFpbSByZWplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSBub3RoaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdXcm90ZSA9IHNldHRsZWQuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAncmV0cnknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcygnaW5saW5lLWNsYWltJywgc3RlcEVyciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhOiAhc2libGluZ1dyb3RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyByZXR1cm4gKG9yIHRocm93KSBjb21wbGV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmxpbmUtY2xhaW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSBiYXRjaCByZXN1bHRzLiBgcmV0cnlgIHN0ZXBzICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBleGlzdCwgc2luY2UgdGhlaXIgYHN0ZXBfc3RhcnRlZGAgc3VjY2VlZGVkKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXF1ZXVlZCBwZXItc3RlcCBhcyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheTsgYHRocm90dGxlZGAgc3RlcHMgKHJlamVjdGVkIG9uIHRoZSBjcmVhdGUtY2xhaW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBuZXZlciBjcmVhdGVkKSBpbnN0ZWFkIGRlZmVyIHJlZGVsaXZlcnkgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2Ugc28gdGhleSByZS1ydW4gaW5saW5lIHdpdGggaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlcGxheTsgY29tcGxldGVkL2ZhaWxlZCBzdGVwcyBhbHJlYWR5IHdyb3RlIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudHMuIFdlIG9ubHkgbG9vcCBiYWNrIHRvIHJlcGxheSB3aGVuIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUsIG90aGVyd2lzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXBlbmRpbmcgc3RlcHMgd2lsbCBiZSByZS1ydW4gYnkgdGhlaXIgcXVldWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlcyBhbmQgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXMgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAodHlwZW9mIGlubGluZUV4ZWN1dGlvbnMpW251bWJlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW55UGVuZGluZ09wcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0aHJvdHRsZWQgaW5saW5lIHN0ZXAgZGVsYXlzIHJlZGVsaXZlcnkgb2YgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYmVpbmcgcmUtcXVldWVkIGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcC4gQ3J1Y2lhbGx5LCBhIGB0aHJvdHRsZWRgIHJlc3VsdCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgd2FzIHJlamVjdGVkIG9uIHRoZSBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSwgc28gdGhlIHN0ZXAgd2FzIE5FVkVSIGNyZWF0ZWQgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgbm8gc3RlcCBlbnRpdHkpLiBSZS1xdWV1aW5nIGl0IGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcCB3b3VsZCBzZW5kIGEgYmFyZSBgc3RlcF9zdGFydGVkYCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0KSwgd2hpY2ggdGhlIHdvcmxkIHJlamVjdHMgd2l0aCBgU3RlcCBcIjxpZD5cIiBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kYCBiZWNhdXNlIGl0IGNhbm5vdCBsYXppbHkgY3JlYXRlIHRoZSBzdGVwIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbnB1dDsgdGhhdCBlcnJvciBpc24ndCB0cmFuc2xhdGFibGUsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZWRlbGl2ZXJzIHVudGlsIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGFuZCBydW4pIGZhaWwuIERlZmVycmluZyByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIGluc3RlYWQgcmUtYXR0ZW1wdHMgdGhlIHRocm90dGxlZCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgV0lUSCBpdHMgaW5wdXQgb24gcmVwbGF5LiBXZSB0cmFjayB0aGUgbG9uZ2VzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja29mZiBzbyBhIGJhdGNoIHdpdGggbXVsdGlwbGUgdGhyb3R0bGVzIHdhaXRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4LiBOb3RlOiBgcmV0cnlgIHJlc3VsdHMgYXJlIHNhZmUgdG8gcmUtcXVldWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgYmVjYXVzZSBhIHJldHJ5IGltcGxpZXMgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB0aGUgc3RlcCBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaW5saW5lRXhlY3V0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiByLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlQZW5kaW5nT3BzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXIgcmVkZWxpdmVyeSBvZiB0aGUgb3JjaGVzdHJhdG9yIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdHRsZSBiYWNrb2ZmLiBPbiByZXBsYXkgZXZlcnkgbm9uLXRlcm1pbmFsIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcmUtZGlzcGF0Y2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtdGhyb3R0bGVkIHN0ZXBzIHJ1biBpbmxpbmUgYWdhaW4gV0lUSCB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCAodGhlaXIgYHN0ZXBfY3JlYXRlZGAgaXMgZGVmZXJyZWQgYW5ldyksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgYHJldHJ5YCBzdGVwcyBpbiB0aGlzIGJhdGNoIGFyZSBxdWV1ZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93biByZXRyeUFmdGVyIGhvbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmFsIHN0ZXBzIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVkIGZyb20gdGhlaXIgZXZlbnRzIGFuZCBub3QgcmUtcnVuLiBCZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXkgZHJpdmVzIGFsbCByZW1haW5pbmcgd29yaywgd2UgbXVzdCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyByZS1xdWV1ZSBgdG9SZXRyeWAgaGVyZSwgc2luY2UgdGhhdCB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGUtZGlzcGF0Y2ggdGhvc2Ugc3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmV0dXJucyBCRUZPUkUgdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3csIHNvIGEgYmF0Y2ggdGhhdCBtaXhlcyBhIHRocm90dGxlIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc3RlcCB0aGF0IGxlZnQgdW5mbHVzaGVkIG9wcyBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGUgZXhwbGljaXQgZmx1c2ggY29udGludWF0aW9uLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGhyb3R0bGUgYmFja29mZiAoPj0gMXMpIGFsd2F5cyBleGNlZWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1pbnZvY2F0aW9uIGZsdXNoIHdpbmRvdyAoPD0gNTAwbXMgKyB3YWl0VW50aWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBvcHMgc2V0dGxlIGJlZm9yZSB0aGUgcG9zdC1iYWNrb2ZmIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cyBhbmQgcmVhZHMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHRocm90dGxlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUcmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkubWFwKCh7IHN0ZXAsIGRlbGF5U2Vjb25kcyB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXRyeVRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgdGhlIGRlbGF5ZWQgcmV0cnkgb24gdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGtleSBzbyBpdCBkZWR1cGVzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgcmUtZGlzcGF0Y2ggdGhlIHN1c3BlbnNpb24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1zIG9uIHJlcGxheSAoaXQgdXNlcyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYSBtaXhlZCBiYXRjaCB3aGVyZSBvbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb21wbGV0ZWRgIHdpdGggdW5mbHVzaGVkIGJhY2tncm91bmQgb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBhbnlQZW5kaW5nT3BzYCkgYW5kIGFub3RoZXIgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHdvdWxkIGRvdWJsZS1kaXNwYXRjaCB0aGUgcmV0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2ggYmVsb3cgcXVldWVzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHBsYWluIGNvbnRpbnVhdGlvbiwgd2hvc2UgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlcyB0aGUgc3RpbGwtYHJldHJ5aW5nYCBzdGVwIGFzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcyBpdCAqaW1tZWRpYXRlbHkqIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICp3aXRoKiBhIGtleS4gU2luY2UgdGhpcyBkZWxheWVkIHJldHJ5IGhhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGtleSwgdGhlIHR3byBtZXNzYWdlcyB3b3VsZG4ndCBkZWR1cGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgd291bGQgcnVuIHR3aWNlLCB0aGUgY29uZmlndXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJhY2tvZmYgd291bGQgYmUgaWdub3JlZCAocGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgRXJyb3JgIHJldHJpZXMgcGVyc2lzdCBubyBgcmV0cnlBZnRlcmAsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGhhcyBubyBgVG9vRWFybHlgIGd1YXJkKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJvZHkgY291bGQgcnVuIGVhcmx5L2NvbmN1cnJlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFyaW5nIHRoZSBrZXkgbGV0cyB0aGUgZWFybGllciBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB3aW4sIGhvbm9yaW5nIHRoZSBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc3RlcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgcGVuZGluZyBiYWNrZ3JvdW5kIG9wZXJhdGlvbnMgZmx1c2ggYmVmb3JlIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcmVhZHMgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbnlQZW5kaW5nT3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JyZWFraW5nIGxvb3A6IGlubGluZSBzdGVwIGhhcyBwZW5kaW5nIG9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgaW5saW5lIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIHZpYSB0aGVpciBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgbWVzc2FnZXM7IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYWxsIHN0ZXBzIGFyZSB0ZXJtaW5hbC4gRG9uJ3QgbG9vcCBoZXJlOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgc3RlcHMgaGF2ZSBubyB0ZXJtaW5hbCBldmVudCB0byBvYnNlcnZlIHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgaW5saW5lIHN0ZXBzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSwgc28gbG9vcCBiYWNrIHRvIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSB3b3JrZmxvdyBvYnNlcnZlcyB0aGUgdGVybWluYWwgZXZlbnRzIG9uIHJlcGxheSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgYW55IGlubGluZSBkZWx0YS4gSWYgaXQgaXMgcGFydGlhbCwgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gaXRzIGN1cnNvciBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhlIHBhZ2UgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25seSA9IHN0ZXBSZXN1bHRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob25seS50eXBlID09PSAnY29tcGxldGVkJyAmJiBvbmx5LmlubGluZURlbHRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIG9ubHkuaW5saW5lRGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gb25seS5pbmxpbmVEZWx0YS5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBuZXh0RXZlbnRMb2dMb2FkKGV2ZW50TG9nKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIG9mIGEgZ3VhcmRlZCB3cml0ZSBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBieSB0aGUgcmVwbGF5IGxvb3A6IHRoZSByZXN1bHQtYmVhcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9jb21wbGV0ZWRgLCBvciB0aGUgYHdhaXRfY29tcGxldGVkYCBvZiB0aGUgd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy4gQm90aCByZWFjaCB0aGlzIG9uZSBjYXRjaCBhbmQgdGhlIHJlamVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgc2F5IHdoaWNoLCBoZW5jZSB0aGUgbmV1dHJhbCBsYWJlbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgbWF5IGJlIHJlLXBvc3RlZCBpbiBwbGFjZTogdGhlIGNvcnJlbGF0aW9uIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgKGZvciBydW5fY29tcGxldGVkKSB0aGUgcmVzdWx0IGl0c2VsZiBjYW1lIGZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwbGF5LCBhbmQgYSBjb3JyZWN0ZWQgbG9nIG1heSBwcm9kdWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgb25lcy4gRG9uJ3QgZmFpbCB0aGUgcnVuOiByZXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGluIHRoaXMgaW52b2NhdGlvbiwgYW5kIG9ubHkgb25jZSB0aGF0IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3BlbnQgc2NoZWR1bGUgYW4gZXhwbGljaXQgcmUtaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGhyb3dpbmcgaW5zdGVhZCB3b3VsZCByZWx5IG9uIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIG1lc3NhZ2UsIHdoaWNoIHRoZSB0dXJibyBwYXRoIGhhcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tlZC4gRW1waXJpY2FsbHkgdGhlIHJ1biB0aGVuIHN0YWxscyBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSdzIH4zMDBzIGRlZmF1bHQgdmlzaWJpbGl0eSB0aW1lb3V0IGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ3JlcGxheS13cml0ZScsIGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0aW9uID0gYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBsYXktd3JpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBidWRnZXQgc3BlbnQuIEZhbGwgdGhyb3VnaCB0byB0aGUgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCBiZWxvdyBpbnN0ZWFkIG9mIHJldGhyb3dpbmc6IHRoaXMgY2F0Y2ggb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHRoZSBydW4sIGFuZCBhIHJldGhyb3cgd291bGQgZXNjYXBlIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBoYW5kbGVyIGFuZCBiZSByZWRlbGl2ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudCBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlcyB0YWxraW5nIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGQgKHdvcmtmbG93LXNlcnZlciksIHN1Y2ggYXMgYW4gZXhoYXVzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeUFnZW50IChVTkRfRVJSX1JFUV9SRVRSWSBmcm9tIGEgc3VzdGFpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA0MjkvNTAzIHN0b3JtKSwgYSBkcm9wcGVkIHNvY2tldCwgYSBjb25uZWN0L0ROU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSwgb3IgYSBjbGllbnQgdGltZW91dCwgbXVzdCBOT1QgZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi4gUmV0aHJvdyBzbyB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgYSBmcmVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiByZXRyaWVzIHRoZSByZXBsYXkgb25jZSB0aGUgYmFja2VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnMuIFRoZSBAdmVyY2VsL3F1ZXVlIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpZXMgYSBmYXN0ICgxc+KGkjYwcykgYmFja29mZiBieSBkZWxpdmVyeSBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkaW5nIHRoZSB+NW1pbiBkZWZhdWx0IHZpc2liaWxpdHktdGltZW91dCByZWRyaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIG5ldmVyIGtpbGxpbmcgdGhlIHByb2Nlc3MgdmlhIHJ1bl9mYWlsZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmFuc2llbnQgd29ybGQgZXJyb3IgZHVyaW5nIHJlcGxheTsgcmVkZWxpdmVyaW5nIHZpYSBxdWV1ZSBpbnN0ZWFkIG9mIGZhaWxpbmcgdGhlIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVjb3ZlcnlSZXBsYXlzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZlcmdlbmNlQ291bnQgPD0gbWF4UmVjb3ZlcnlSZXBsYXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkOyBxdWV1ZWluZyBhIHJlY292ZXJ5IHJlcGxheSBiZWZvcmUgZGVjbGFyaW5nIHRoZSBldmVudCBsb2cgY29ycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JEaXZlcmdlbmNlRXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSA9IGRpdmVyZ2VuY2VDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7bWF4UmVjb3ZlcnlSZXBsYXlzfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5U3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtOiBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIGZyb20gdGhpcyBsb29wIGl0IGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90IHNuYXBzaG90LCBzbyBhIFdvcmxkIHRoYXQgZmVuY2VzIGNhbiByZWplY3QgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhIHNsb3QtYWxsb2NhdGluZyBvbmUgcmVwb3J0cyBiYWNrIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHJlcGxheSBoYWQgbm90IHNlZW4uIEZhaWwtb3BlbiBvbiBwdXJwb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBuZWl0aGVyIGFwcGxpZXM6IGEgc3B1cmlvdXMgZmFpbHVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgKHRoZSBydW4gY2FuIGJlIHJlLXJ1biBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGFzaGJvYXJkKSwgd2hlcmVhcyBhIHNwdXJpb3VzICpjb21wbGV0aW9uKiBjb21taXRzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIHJlc3VsdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgbGV0IGNhY2hlZEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnZvY2F0aW9uQ291bnQgPSAwO1xuICBjb25zdCBlbnRyeXBvaW50Q3JlYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm91dGVNb2R1bGVCb2R5SW5pdE1zID1cbiAgICB0eXBlb2Ygb3B0aW9ucz8ucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID09PSAnbnVtYmVyJ1xuICAgICAgPyBlbnRyeXBvaW50Q3JlYXRlZEF0IC0gb3B0aW9ucy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB3aXRoSGVhbHRoQ2hlY2soYXN5bmMgKHJlcSkgPT4ge1xuICAgIGludm9jYXRpb25Db3VudCArPSAxO1xuICAgIGNvbnN0IGhhbmRsZXJDYWNoZWQgPSBjYWNoZWRIYW5kbGVyICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnU0VSVkVSJyk7XG5cbiAgICByZXR1cm4gdHJhY2UoXG4gICAgICAnd29ya2Zsb3cucm91dGUuZmxvdycsXG4gICAgICB7XG4gICAgICAgIGtpbmQ6IHNwYW5LaW5kLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVUeXBlKCdmbG93JyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkZhYXNJbnN0YW5jZShDT01QVVRFX0lOU1RBTkNFX0lEKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUhhbmRsZXJDYWNoZWQoaGFuZGxlckNhY2hlZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQoaW52b2NhdGlvbkNvdW50KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUVudHJ5cG9pbnRBZ2VNcyhcbiAgICAgICAgICAgIERhdGUubm93KCkgLSBlbnRyeXBvaW50Q3JlYXRlZEF0XG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4ocm91dGVNb2R1bGVCb2R5SW5pdE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogQXR0cmlidXRlLldvcmtmbG93Um91dGVNb2R1bGVCb2R5SW5pdE1zKHJvdXRlTW9kdWxlQm9keUluaXRNcykpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUmVxdWVzdE1ldGhvZChyZXEubWV0aG9kKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJvdXRlKCcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGVkSGFuZGxlcikge1xuICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuaW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoZSBmdWxsIHJ1bnRpbWUgV29ybGQsIG5vdCBgZ2V0V29ybGRIYW5kbGVycygpYC4gVGhhdCBhY2Nlc3NvclxuICAgICAgICAgICAgLy8gb3ducyBhIHNlY29uZCwgYnVpbGQtdGltZS1zYWZlIGNhY2hlLCBzbyBjYWxsaW5nIGl0IGhlcmUgYnVpbHQgYVxuICAgICAgICAgICAgLy8gc2Vjb25kIFdvcmxkIGluIHRoZSBzYW1lIHByb2Nlc3M6IGR1cGxpY2F0ZSBjb25uZWN0aW9uIHBvb2xzIGFuZFxuICAgICAgICAgICAgLy8gcXVldWUgd29ya2VycyBmb3IgYSBzdGF0ZWZ1bCBXb3JsZCwgcGx1cyBhIHNlY29uZCBjb3B5IG9mIHRoYXRcbiAgICAgICAgICAgIC8vIHdvcmxkIHBhY2thZ2UncyBtb2R1bGVzIG9uY2UgaXQgaXMgYnVuZGxlZCwgd2hpY2ggaXMgd2hhdFxuICAgICAgICAgICAgLy8gc2lsZW50bHkgZGVtb3RlZCB0aGUgZXZlbnRzIFdlYlNvY2tldCB0cmFuc3BvcnQgdG8gSFRUUC4gIzM2NjUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIHNwYW4ga2VlcHMgaXRzIG9yaWdpbmFsIG5hbWUuIEl0IGlzIGEgZGlzdGluY3Qgc3BhbiBmcm9tIHRoZVxuICAgICAgICAgICAgLy8gcGVyLXJlcXVlc3QgYHdvcmtmbG93LnJvdXRlLmdldF93b3JsZGAgYXQgdGhlIHRvcCBvZiB0aGUgZmxvd1xuICAgICAgICAgICAgLy8gcm91dGUsIGFuZCByZW5hbWluZyBpdCB3b3VsZCBjb2xsaWRlIHdpdGggdGhhdCBvbmUuXG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIod29ybGRIYW5kbGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlZEhhbmRsZXIocmVxKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgQXR0cmlidXRlLkh0dHBSZXNwb25zZVN0YXR1c0NvZGUocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19
|
|
3862
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUVyQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUVqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFl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QUFNLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsWUFBWSxRQUFRLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxFQUFFLGFBQWEsQ0FDakIsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDbEQsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQvc3RyaWN0JztcbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgb25jZSwgc2V0V29ya2Zsb3dCYXNlUGF0aCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVdvcmtmbG93TmFtZSxcbiAgd29ya2Zsb3dEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBDcmVhdGVFdmVudFBhcmFtcyxcbiAgdHlwZSBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHR5cGUgRXZlbnQsXG4gIHR5cGUgRXZlbnRSZXN1bHQsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzU2VhbGVkTm9vcEV2ZW50LFxuICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgeyBkZWNvZGVUaW1lIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vcnVudGltZS9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1heEV2ZW50c092ZXJyaWRlLFxuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzLFxuICBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zLFxuICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG4gIGlzVm1SZXRlbnRpb25FbmFibGVkLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMgfSBmcm9tICcuL3J1bnRpbWUvY291bnQtc3RlcC1zdGFydGVkLWV2ZW50cy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIERlcGxveW1lbnRBZmZpbml0eU91dGNvbWUsXG4gIGd1YXJkRGVwbG95bWVudEFmZmluaXR5LFxuICB0eXBlIFJlZW5xdWV1ZUFyZ3MsXG59IGZyb20gJy4vcnVudGltZS9kZXBsb3ltZW50LWd1YXJkLmpzJztcbmltcG9ydCB7XG4gIGFic29yYlNraXBwZWRTbG90UmVwb3J0LFxuICBhcHBlbmRVbmlxdWVFdmVudHMsXG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGluc2VydEV2ZW50QnlFdmVudElkLFxuICBpc1Nsb3RHYXBDaGVja0VuYWJsZWQsXG4gIHR5cGUgTG9hZGVkRXZlbnRMb2csXG4gIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBwcmVjb25kaXRpb25FdmVudERlbHRhLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHR5cGUgU2xvdFNuYXBzaG90UGFyYW1zLFxuICBzZXR0bGVFdmVudFNsb3RHYXAsXG4gIHNsb3RTbmFwc2hvdFBhcmFtcyxcbiAgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXksXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LXJlY292ZXJ5LXJlcG9ydGVyLmpzJztcbmltcG9ydCB7XG4gIHJlc3VtZVRpbWluZ0Zvck1lc3NhZ2UsXG4gIHJlc3VtZVRyYWNraW5nRnJvbU1lc3NhZ2UsXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtbGF0ZW5jeS5qcyc7XG5pbXBvcnQgeyBydW5JZENyZWF0ZWRBdCB9IGZyb20gJy4vcnVudGltZS9ydW4taWQtdGltZS5qcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMsXG4gIGV4ZWN1dGVTdGVwLFxuICB0eXBlIFByZWNsYWltZWRJbmxpbmVTdGFydCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcgfSBmcm9tICcuL3J1bnRpbWUvc3RlcC1sYXRlbmN5LmpzJztcbmltcG9ydCB7XG4gIGJhY2tzdG9wSWRlbXBvdGVuY3lLZXksXG4gIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UsXG4gIGlzU3RlcE93bmVyc2hpcEFjdGl2ZSxcbiAgc3RlcExlYXNlUmVtYWluaW5nU2Vjb25kcyxcbn0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtb3duZXJzaGlwLmpzJztcbmltcG9ydCB7IHJ1blN0ZXBTaW5nbGVGbGlnaHQgfSBmcm9tICcuL3J1bnRpbWUvc3RlcC1zaW5nbGUtZmxpZ2h0LmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVN1c3BlbnNpb24sXG4gIHR5cGUgU3VzcGVuc2lvblNlcmlhbGl6YXRpb25CbG9ja2VyLFxufSBmcm9tICcuL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHVzZVF1aWNrSlNWbSB9IGZyb20gJy4vcnVudGltZS92bS1tb2RlLmpzJztcbmltcG9ydCB7IGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB9IGZyb20gJy4vcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCwgdHlwZSBXb3JsZEhhbmRsZXJzIH0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjayB9IGZyb20gJy4vc291cmNlLW1hcC5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQge1xuICByZXBsYXlXb3JrZmxvdyxcbiAgcmVzdW1lV29ya2Zsb3csXG4gIHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQsXG4gIHR5cGUgV29ya2Zsb3dTZXNzaW9uLFxufSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHR5cGUgUmVzdW1lZEhvb2ssXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgY2FuY2VsUnVuLFxuICBjYW5jZWxSdW5zLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHR5cGUgUmVlbnF1ZXVlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgY3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBvcHRpb25hbCBjbGllbnQtc2lkZSBldmVudC1saW1pdCBvdmVycmlkZS5cbiAqIGBXT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFYCwgd2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCBjbGFtcHMgdGhlXG4gKiBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIHRvIGEgc21hbGxlciB2YWx1ZSBzbyBlbmZvcmNlbWVudCBjYW5cbiAqIGJlIGV4ZXJjaXNlZCB3aXRob3V0IGEgc2VydmVyLXNpZGUgY2hhbmdlLiBDbGFtcC1kb3duIG9ubHk6IGl0IG5ldmVyIHJhaXNlc1xuICogdGhlIHNlcnZlcidzIGxpbWl0LCBhbmQgaXQgdGFrZXMgZWZmZWN0IGV2ZW4gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgbm9uZS5cbiAqIFVuc2V0IOKHkiBzZXJ2ZXIgdmFsdWUgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBjbGFtcE1heEV2ZW50cyhzZXJ2ZXJWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBnZXRNYXhFdmVudHNPdmVycmlkZSgpO1xuICBpZiAob3ZlcnJpZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHNlcnZlclZhbHVlO1xuICByZXR1cm4gc2VydmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlIDogTWF0aC5taW4oc2VydmVyVmFsdWUsIG92ZXJyaWRlKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgYSBxdWV1ZSBkZWxpdmVyeSB3aG9zZSBydW4gd2FzIGNyZWF0ZWQgaW4gYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdGhhblxuICogdGhpcyBkZXBsb3ltZW50IHJ1bnMgaW4uXG4gKlxuICogYHN0YXJ0KClgIHBlcmZvcm1zIHR3byB3cml0ZXMgdGhhdCBtdXN0IGxhbmQgaW4gdGhlIHNhbWUgdGVuYW50OiB0aGVcbiAqIGBydW5fY3JlYXRlZGAgZXZlbnQsIGF0dHJpYnV0ZWQgdG8gd2hhdGV2ZXIgZW52aXJvbm1lbnQgdGhlICpjYWxsZXIqXG4gKiBhdXRoZW50aWNhdGVzIGFzLCBhbmQgdGhlIHF1ZXVlIG1lc3NhZ2UsIHBpbm5lZCB0byBhICpkZXBsb3ltZW50Ki4gQVxuICogbWlzY29uZmlndXJlZCBjYWxsZXIgY2FuIHNwbGl0IHRoZW0sIHdyaXRpbmcgdGhlIHJ1biB0byBvbmUgZW52aXJvbm1lbnRcbiAqIHdoaWxlIGFkZHJlc3NpbmcgdGhlIG1lc3NhZ2UgdG8gYSBkZXBsb3ltZW50IGluIGFub3RoZXIuIFRoZSBjb25zdW1lciB0aGVuXG4gKiBmaW5kcyBubyBydW4gdW5kZXIgaXRzIG93biB0ZW5hbnQgYW5kIHRoZSBiYWNrZW5kJ3MgcmVzaWxpZW50IHN0YXJ0XG4gKiAoYHJ1bl9zdGFydGVkYCBjcmVhdGVzIHRoZSBydW4gd2hlbiBgcnVuX2NyZWF0ZWRgIHdhcyBuZXZlciBzZWVuKSBtaW50cyBhXG4gKiBTRUNPTkQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gQm90aCBjb3BpZXMgYXJlIHJlYWw6IHRoZVxuICogY3JlYXRvcidzIHNpdHMgcGVuZGluZyBmb3JldmVyLCB0aGlzIG9uZSBleGVjdXRlcywgYW5kIGV2ZXJ5IHN1YnNlcXVlbnRcbiAqIGNyb3NzLXRlbmFudCBxdWV1ZSBhY2sgZmFpbHMgdG8gZmluZCBpdHMgbWVzc2FnZS5cbiAqXG4gKiBOb3RoaW5nIGV4dGVybmFsIGlzIG5lZWRlZCB0byBjYXRjaCB0aGlzOiB0aGUgY3JlYXRvcidzIGVudmlyb25tZW50IHJpZGVzIHRoZVxuICogbWVzc2FnZSBpbiBgcnVuSW5wdXQuZW52aXJvbm1lbnRgIGFuZCB0aGlzIHByb2Nlc3MgYWxyZWFkeSBrbm93cyBpdHMgb3duLiBTb1xuICogY29tcGFyZSB0aGVtIGFuZCBzdG9wIEJFRk9SRSBgcnVuX3N0YXJ0ZWRgLCB0aGUgd3JpdGUgdGhhdCB3b3VsZCBjcmVhdGUgdGhlXG4gKiBmb3JrLiBSZWZ1c2luZyBhZnRlciBpdCB3b3VsZCBiZSB0b28gbGF0ZS5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBjYWxsZXIgbXVzdCBhYmFuZG9uIHRoZSBkZWxpdmVyeS4gU2tpcHBlZCB3aGVuZXZlclxuICogZWl0aGVyIHNpZGUgaXMgdW5rbm93biwgd2hpY2gga2VlcHMgZXZlcnkgZXhpc3Rpbmcgc2V0dXAgb24gaXRzIGN1cnJlbnRcbiAqIGJlaGF2aW9yOiB3b3JsZHMgd2l0aCBubyBlbnZpcm9ubWVudCBkaW1lbnNpb24gKGB3b3JsZC1sb2NhbGAsXG4gKiBgd29ybGQtcG9zdGdyZXNgKSBkb24ndCBpbXBsZW1lbnQgYGdldEVudmlyb25tZW50YCwgYW5kIHJ1bnMgc3RhcnRlZCBieSBhblxuICogb2xkZXIgU0RLIGNhcnJ5IG5vIGBlbnZpcm9ubWVudGAgZmllbGQuXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gIHdvcmxkLFxuICBydW5JbnB1dCxcbiAgcnVuSWQsXG4gIHJ1bkxvZ2dlcixcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW5JbnB1dDogUnVuSW5wdXQgfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJ1bkxvZ2dlcjogTG9nZ2VyO1xufSk6IGJvb2xlYW4ge1xuICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSBydW5JbnB1dD8uZW52aXJvbm1lbnQ7XG4gIGlmICghY3JlYXRvckVudmlyb25tZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY3VycmVudEVudmlyb25tZW50ID0gd29ybGQuZ2V0RW52aXJvbm1lbnQ/LigpO1xuICBpZiAoIWN1cnJlbnRFbnZpcm9ubWVudCB8fCBjdXJyZW50RW52aXJvbm1lbnQgPT09IGNyZWF0b3JFbnZpcm9ubWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICBgUmVmdXNpbmcgdG8gcnVuIHRoaXMgd29ya2Zsb3c6IGl0IHdhcyBjcmVhdGVkIGluIHRoZSBcIiR7Y3JlYXRvckVudmlyb25tZW50fVwiIGAgK1xuICAgICAgYGVudmlyb25tZW50IGJ1dCB0aGlzIGRlcGxveW1lbnQgcnVucyBpbiBcIiR7Y3VycmVudEVudmlyb25tZW50fVwiLiBgICtcbiAgICAgICdFeGVjdXRpbmcgaXQgaGVyZSB3b3VsZCBjcmVhdGUgYSBzZWNvbmQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gJyArXG4gICAgICAnYm90aCBlbnZpcm9ubWVudHMg4oCUIG9uZSBwZW5kaW5nIGZvcmV2ZXIsIG9uZSBydW5uaW5nIOKAlCBzbyB0aGUgcXVldWUgJyArXG4gICAgICAnbWVzc2FnZSBpcyBiZWluZyBkaXNjYXJkZWQgd2l0aG91dCBleGVjdXRpbmcgYW5kIHdpdGhvdXQgcmV0cnlpbmcuICcgK1xuICAgICAgJ1RoZSBjbGllbnQgdGhhdCBjYWxsZWQgc3RhcnQoKSB3cm90ZSB0aGUgcnVuIHRvIGl0cyBvd24gZW52aXJvbm1lbnQgJyArXG4gICAgICAnYnV0IGFkZHJlc3NlZCB0aGUgcXVldWUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlciBvbmUuIENoZWNrICcgK1xuICAgICAgJ3RoYXQgdGhlIGVudmlyb25tZW50IHRoYXQgY2xpZW50IGF1dGhlbnRpY2F0ZXMgYXMgKFdPUktGTE9XX1ZFUkNFTF9FTlYgJyArXG4gICAgICBcImZvciBDTEkgYW5kIENJIGNsaWVudHMsIG9yIHRoZSBPSURDIHRva2VuJ3MgZW52aXJvbm1lbnQgaW5zaWRlIGEgXCIgK1xuICAgICAgJ2RlcGxveW1lbnQpIG1hdGNoZXMgdGhlIGVudmlyb25tZW50IG9mIHRoZSBkZXBsb3ltZW50IGl0IHRhcmdldHMuIFRoZSAnICtcbiAgICAgIGBydW4gaXQgY3JlYXRlZCBpcyBzdGlsbCBwZW5kaW5nIGluIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYW5kIHdpbGwgYCArXG4gICAgICAnbm90IHJ1bi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY3JlYXRvckVudmlyb25tZW50LFxuICAgICAgY3VycmVudEVudmlyb25tZW50LFxuICAgICAgcGlubmVkRGVwbG95bWVudElkOiBydW5JbnB1dD8uZGVwbG95bWVudElkLFxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogTG9nIHdoZW4gYSBgc3RhcnQoKWAtZW5xdWV1ZWQgbWVzc2FnZSBwaW5uZWQgdG8gb25lIGRlcGxveW1lbnQgaXMgZGVsaXZlcmVkXG4gKiB0byBhIGRpZmZlcmVudCBvbmUuXG4gKlxuICogQSBmaXJzdC1kZWxpdmVyeSBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0LmRlcGxveW1lbnRJZGAgKHRoZSBkZXBsb3ltZW50XG4gKiBgc3RhcnQoKWAgYWRkcmVzc2VkIGl0IHRvKSwgc28gY29tcGFyaW5nIHRoYXQgYWdhaW5zdCB0aGlzIGhhbmRsZXIncyBvd25cbiAqIGRlcGxveW1lbnQgZGV0ZWN0cyBtaXMtZGVsaXZlcnkgZGlyZWN0bHkuIFRoaXMgaXMgYSBESUFHTk9TVElDLCBub3QgYSBnYXRlOlxuICogaXQgd2FybnMgYW5kIGxldHMgdGhlIGludm9jYXRpb24gcHJvY2VlZCwgZGVsaWJlcmF0ZWx5LlxuICpcbiAqIFdoeSB0aGlzIG9uZSBvbmx5IHdhcm5zIHdoaWxlIGl0cyBlbnZpcm9ubWVudCBzaWJsaW5nIGFib3ZlIHJlZnVzZXM6IGFcbiAqIGRpZmZlcmluZyBkZXBsb3ltZW50IGlkIGlzIG5vdCBieSBpdHNlbGYgZXZpZGVuY2Ugb2YgdGhlIGZvcmsgd2UgY2FyZSBhYm91dC5cbiAqIFRoZSBlbnZpcm9ubWVudCBwYWlyIGlzIGV4YWN0ICh0d28gbmFtZWQgZW52aXJvbm1lbnRzIHRoYXQgZGlzYWdyZWUpIGFuZCBpdFxuICogaXMgdGhlIGRpbWVuc2lvbiB0aGUgcnVuJ3MgdGVuYW50IGlzIGtleWVkIG9uLiBEZXBsb3ltZW50IGlkcyBkaXNhZ3JlZSBmb3JcbiAqIGJlbmlnbiByZWFzb25zIHRvbzogYHdvcmxkLWxvY2FsYCBkZXJpdmVzIGl0cyBpZCBmcm9tIHRoZSBpbnN0YWxsZWQgcGFja2FnZVxuICogdmVyc2lvbiAoYGRwbF9sb2NhbEA8dmVyc2lvbj5gKSwgc28gdXBncmFkaW5nIHRoZSBTREsgbWlkLXJ1biBjaGFuZ2VzIGl0IHdpdGhcbiAqIG5vdGhpbmcgd3JvbmcuIFJlZnVzaW5nIG9uIHRoYXQgc2lnbmFsIHdvdWxkIHN0cmFuZCBjb3JyZWN0IHJ1bnMsIGFuZFxuICogcmVmdXNpbmcgYmVmb3JlIGBydW5fc3RhcnRlZGAgbGVhdmVzIG5vIHNlcnZlci1zaWRlIHJlY29yZCB0byBleHBsYWluIHdoeS5cbiAqIEFueW9uZSB0ZW1wdGVkIHRvIHByb21vdGUgdGhpcyB0byBhIGhhcmQgZmFpbHVyZSBoYXMgdG8gaGFuZGxlIHRoYXQgZmlyc3QuXG4gKlxuICogU2tpcHBlZCB1bmxlc3MgQk9USCBpZHMgYXJlIGtub3duOiBgZ2V0RGVwbG95bWVudElkKClgIHRocm93cyBpbiB3b3JsZHMgdGhhdFxuICogcmVxdWlyZSBhIGRlcGxveW1lbnQgYW5kIGhhdmUgbm9uZSwgYW5kIGEgcmUtZW5xdWV1ZWQgbWVzc2FnZSBjYXJyaWVzIG5vXG4gKiBgcnVuSW5wdXRgIGF0IGFsbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2Fybk9uRGVwbG95bWVudFBpbm5pbmdNaXNtYXRjaCh7XG4gIHdvcmxkLFxuICBydW5JbnB1dCxcbiAgcnVuSWQsXG4gIHJ1bkxvZ2dlcixcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW5JbnB1dDogUnVuSW5wdXQgfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJ1bkxvZ2dlcjogTG9nZ2VyO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaW5uZWREZXBsb3ltZW50SWQgPSBydW5JbnB1dD8uZGVwbG95bWVudElkO1xuICBpZiAoIXBpbm5lZERlcGxveW1lbnRJZCkgcmV0dXJuO1xuXG4gIGxldCBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBXb3JsZHMgdGhhdCByZXF1aXJlIGEgZGVwbG95bWVudCBpZCB0aHJvdyB3aGVuIHRoZXJlIGlzbid0IG9uZS4gVGhhdCBpc1xuICAgIC8vIG5vdCBhIG1pc21hdGNoOiB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFjdXJyZW50RGVwbG95bWVudElkIHx8IGN1cnJlbnREZXBsb3ltZW50SWQgPT09IHBpbm5lZERlcGxveW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnUXVldWUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkIHRvIGEgZGVwbG95bWVudCBpdCB3YXMgbm90IHBpbm5lZCB0by4gJyArXG4gICAgICAnVGhlIHJ1biB3YXMgY3JlYXRlZCB0YXJnZXRpbmcgYSBkaWZmZXJlbnQgZGVwbG95bWVudCwgc28gdGhpcyAnICtcbiAgICAgICdpbnZvY2F0aW9uIG1heSBiZSByZXBsYXlpbmcgYWdhaW5zdCBjb2RlIHRoZSBydW4gd2FzIG5vdCBzdGFydGVkIG9uLiAnICtcbiAgICAgICdDb250aW51aW5nIOKAlCB0aGlzIGlzIGV4cGVjdGVkIGlmIHRoZSBXb3JrZmxvdyBTREsgdmVyc2lvbiBjaGFuZ2VkICcgK1xuICAgICAgJ21pZC1ydW4gaW4gbG9jYWwgZGV2ZWxvcG1lbnQsIHdoZXJlIHRoZSBkZXBsb3ltZW50IGlkIGlzIGRlcml2ZWQgZnJvbSAnICtcbiAgICAgICd0aGF0IHZlcnNpb24uJyxcbiAgICB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIHBpbm5lZERlcGxveW1lbnRJZCxcbiAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB8IG51bGwge1xuICBpZiAoV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUjtcbiAgfVxuXG4gIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBzdGVwIGV4ZWN1dGlvbiByZWplY3RlZCBiZWNhdXNlIHRoZSBzdGVwIGVudGl0eSBkb2VzIG5vdCBleGlzdCxcbiAqIHRoZSBzaWduYXR1cmUgb2YgYSByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCBtZXNzYWdlIHdob3NlIGRlbGl2ZXJ5IGJlYXQgKG9yXG4gKiBvdXRsaXZlZCBhIHRyYW5zaWVudCBmYWlsdXJlIG9mKSB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCBgc3RlcF9jcmVhdGVkYFxuICogd3JpdGUuIEV2ZXJ5IFdvcmxkIHN1cmZhY2VzIGl0IGFzIGEgYFdvcmtmbG93V29ybGRFcnJvcmAgbmFtaW5nIHRoZSBtaXNzaW5nXG4gKiBzdGVwOiB3b3JsZC12ZXJjZWwgbWFwcyB0aGUgYmFja2VuZCdzIDQwNCB0b1xuICogYHdvcmtmbG93IHN0ZXAgc3RlcF/igKYgbm90IGZvdW5kYCwgd29ybGQtbG9jYWwgYW5kIHdvcmxkLXBvc3RncmVzIHRocm93XG4gKiBgU3RlcCBcInN0ZXBf4oCmXCIgbm90IGZvdW5kYCBkaXJlY3RseS4gVGhlIG1lc3NhZ2UgbWF0Y2ggaXMgZGVsaWJlcmF0ZWx5IGxvb3NlXG4gKiBhY3Jvc3MgdGhvc2Ugc2hhcGVzOyB0aGUgc3RhdHVzIGNoZWNrIG5hcnJvd3MgdGhlIHJlbW90ZSBjYXNlIHdpdGhvdXRcbiAqIGV4Y2x1ZGluZyB0aGUgbG9jYWwgb25lcyAod2hpY2ggY2Fycnkgbm8gc3RhdHVzKS5cbiAqXG4gKiBVc2VkIG9ubHkgd2hlbiB0aGUgbWVzc2FnZSBjYXJyaWVzIGBzdGVwSW5wdXRgLCBzaW5jZSBhIGJhcmUgZGlzcGF0Y2hcbiAqIHdpdGhvdXQgYSBwYXlsb2FkIGhhcyBub3RoaW5nIHRvIHJlY292ZXIgZnJvbSwgYW5kIHRoZSBlcnJvciBrZWVwc1xuICogcHJvcGFnYXRpbmcgZm9yIHF1ZXVlLWRyaXZlbiByZWNvdmVyeSBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gaXNTdGVwTWlzc2luZ0Vycm9yKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIVdvcmtmbG93V29ybGRFcnJvci5pcyhlcnIpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChlcnIuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgZXJyLnN0YXR1cyAhPT0gNDA0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvc3RlcC9pLnRlc3QoZXJyLm1lc3NhZ2UpICYmIC9ub3QgZm91bmQvaS50ZXN0KGVyci5tZXNzYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gIHdvcmxkLFxuICB3b3JrZmxvd1J1bixcbiAgcnVuSWQsXG4gIHJlcXVlc3RJZCxcbiAgZXJyLFxuICBlcnJvckNvZGUsXG4gIGxvZ01lc3NhZ2UsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICByZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZXJyOiB1bmtub3duO1xuICBlcnJvckNvZGU6IFJ1bkVycm9yQ29kZTtcbiAgbG9nTWVzc2FnZTogc3RyaW5nO1xufSkge1xuICBydW50aW1lTG9nZ2VyLmVycm9yKGxvZ01lc3NhZ2UsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBlcnJvckNvZGUsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuID8/IHJ1bklkKTtcbiAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgcnVuSWQsXG4gICAgICB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgKSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAnRmF0YWwgd29ybGQgY29udHJhY3QgZXJyb3Igd2hpbGUgcmVjb3JkaW5nIHdvcmtmbG93IGZhaWx1cmUnLFxuICAgICAgICB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IsXG4gICAgICAgICAgZXJyb3I6IGZhaWxFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGZhaWxFcnIubWVzc2FnZSA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZmFpbEVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzOiBFdmVudFtdLCBydW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRlcm1pbmFsIHJ1biBldmVudHMgYXJlIGFsd2F5cyBsYXN0IGJ5IGNvbnN0cnVjdGlvbiAobm8gZXZlbnQgY3JlYXRpb25cbiAgLy8gc3VjY2VlZHMgYWdhaW5zdCBhIHRlcm1pbmFsIHJ1biksIGJ1dCBzY2FuIHRoZSBmdWxsIGFycmF5IGZvclxuICAvLyBkZWZlbnNlLWluLWRlcHRoOiBhIFdvcmxkL2JhY2tlbmQgb3JkZXJpbmcgYnVnIHNob3VsZG4ndCBtYWtlIHVzIG1pc3MgYW5cbiAgLy8gYWN0dWFsIHRlcm1pbmF0aW9uIHNpZ25hbC5cbiAgY29uc3QgdGVybWluYWxSdW5FdmVudCA9IGV2ZW50cy5maW5kKFxuICAgIChlKSA9PlxuICAgICAgZS5ydW5JZCA9PT0gcnVuSWQgJiZcbiAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJylcbiAgKTtcblxuICBpZiAoIXRlcm1pbmFsUnVuRXZlbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdSdW4gcmVhY2hlZCB0ZXJtaW5hbCBldmVudCwgZXhpdGluZycsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBldmVudFR5cGU6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRJZCxcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogSG93IG1hbnkgb2YgYGlkc2AgYXJlIGFic2VudCBmcm9tIGBwcmVzZW50YC4gKi9cbmZ1bmN0aW9uIGNvdW50TWlzc2luZ0lkcyhpZHM6IEl0ZXJhYmxlPHN0cmluZz4sIHByZXNlbnQ6IFNldDxzdHJpbmc+KTogbnVtYmVyIHtcbiAgbGV0IG1pc3NpbmcgPSAwO1xuICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgIGlmICghcHJlc2VudC5oYXMoaWQpKSBtaXNzaW5nKys7XG4gIH1cbiAgcmV0dXJuIG1pc3Npbmc7XG59XG5cbi8qKlxuICogVGhlIGxpbmVhZ2Ugcm9vdCBvZiBhIGxvYWRlZCBydW46IGl0cyBgJHJvb3RSdW5JZGAgYXR0cmlidXRlLCBvciBpdHMgb3duIGlkXG4gKiB3aGVuIGl0IGlzIGl0c2VsZiBhIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHJvb3RSdW5JZEZyb20oXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsXG4gIHJ1bklkOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBhdHRyaWJ1dGVzPy5bUk9PVF9SVU5fSURfQVRUUklCVVRFXSA/PyBydW5JZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBydW4gaGFzIGEgaG9vayBhbmQvb3Igd2FpdCB0aGF0IGFuIG91dC1vZi1iYW5kIHdyaXRlciBjb3VsZFxuICogYXBwZW5kIGFuIGV2ZW50IGZvciBiZXR3ZWVuIGFuIGlubGluZSBzdGVwJ3MgYHN0ZXBfY29tcGxldGVkYCB3cml0ZSBhbmRcbiAqIHRoZSBuZXh0IHJlcGxheSwgbmFtZWx5IGFuIG9wZW4gaG9vayAoYSBgaG9va19jcmVhdGVkYCBub3QgeWV0XG4gKiBgaG9va19kaXNwb3NlZGAsIHdoaWNoIGEgd2ViaG9vayByZWNlaXZlciBjYW4gcmVzb2x2ZSB3aXRoXG4gKiBgaG9va19yZWNlaXZlZGApIG9yIGFuIG9wZW4gd2FpdCAoYSBgd2FpdF9jcmVhdGVkYCBub3QgeWV0XG4gKiBgd2FpdF9jb21wbGV0ZWRgLCB3aGljaCB0aGUgd2FpdCB0aW1lciBjYW4gcmVzb2x2ZSB3aXRoXG4gKiBgd2FpdF9jb21wbGV0ZWRgKS5cbiAqXG4gKiBPcGVuIHdhaXRzIGJsb2NrIFZNIHJldGVudGlvbiBhbmQgaW5saW5lIGRlbHRhcy4gT3BlbiBob29rcyBhbmQgd2FpdHMgYmxvY2tcbiAqIHR1cmJvJ3Mgb3B0aW1pc3RpYyBzdGFydDsgaG9va3MgYWxzbyByZXF1aXJlIGEgYHN0ZXBfc3RhcnRlZGAgY2xhaW0uXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50czogRXZlbnRbXSk6IHtcbiAgb3Blbkhvb2s6IGJvb2xlYW47XG4gIG9wZW5XYWl0OiBib29sZWFuO1xufSB7XG4gIGNvbnN0IGhvb2tzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHdhaXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ2hvb2tfY3JlYXRlZCc6XG4gICAgICAgIGhvb2tzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdob29rX2Rpc3Bvc2VkJzpcbiAgICAgICAgaG9va3MuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhaXRfY3JlYXRlZCc6XG4gICAgICAgIHdhaXRzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3YWl0X2NvbXBsZXRlZCc6XG4gICAgICAgIHdhaXRzLmRlbGV0ZShldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG9wZW5Ib29rOiBob29rcy5zaXplID4gMCwgb3BlbldhaXQ6IHdhaXRzLnNpemUgPiAwIH07XG59XG5cbnR5cGUgUmV0ZW50aW9uRGVjaXNpb24gPVxuICB8IHsgcmV0YWluOiB0cnVlIH1cbiAgfCB7XG4gICAgICByZXRhaW46IGZhbHNlO1xuICAgICAgcmVhc29uOlxuICAgICAgICB8ICdkaXNhYmxlZCdcbiAgICAgICAgfCAnc2VyaWFsaXphdGlvbl9leGVjdXRlZF93b3JrZmxvd19jb2RlJ1xuICAgICAgICB8ICdub19yZXBsYXlfZHJpdmVyJ1xuICAgICAgICB8ICd1bnN1cHBvcnRlZF9zdXNwZW5zaW9uX2l0ZW0nXG4gICAgICAgIHwgJ29wZW5fd2FpdCc7XG4gICAgfTtcblxuLyoqXG4gKiBUaGUgY29tcGxldGUgcmV0YWluZWQtVk0gcG9saWN5IGZvciBhIHN1c3BlbnNpb24gYm91bmRhcnkuXG4gKlxuICogRXZlcnkgaXRlbSB0eXBlIGFjY2VwdGVkIGhlcmUgbXVzdCB1c2UgdGhlIHN1c3BlbnNpb24tZ2VuZXJhdGlvbiBndWFyZCB3aGVuXG4gKiBzaWduYWxpbmcuIE90aGVyd2lzZSBhIHNpZ25hbCBzY2hlZHVsZWQgYXQgYm91bmRhcnkgTiBjb3VsZCBzdXNwZW5kIHRoZSBWTVxuICogYWZ0ZXIgaXQgaGFzIGFscmVhZHkgcmVzdW1lZCBpbnRvIGJvdW5kYXJ5IE4rMS4gV2FpdHMgYXJlIG5vdCBndWFyZGVkLCBzb1xuICogdGhleSByZW1haW4gdW5yZXRhaW5hYmxlLiBBIHN0ZXAgb3IgYXR0cmlidXRlIHdyaXRlIGlzIHJlcXVpcmVkIHRvIGRyaXZlIHRoZVxuICogbmV4dCBpbmxpbmUgaXRlcmF0aW9uOyBob29rLW9ubHkgc3VzcGVuc2lvbnMgcGFyayBub3JtYWxseS5cbiAqXG4gKiBSZXRhaW5pbmcgYWNyb3NzIGFuIG9wZW4gaG9vayBhbHNvIHBlcm1pdHMgYSBob29rLXdva2VuIGNvbGQgcmVwbGF5IHRvIHJhY2VcbiAqIHRoaXMgaW52b2NhdGlvbi4gVGhhdCBpcyBzYWZlIG9ubHkgYmVjYXVzZSBlYWNoIGxvYWRlZCBsb2cgaXMgYSBtb25vdG9uZSxcbiAqIGhvbGUtZnJlZSBwcmVmaXg7IHJlcGxheWluZyBhIGxvbmdlciBwcmVmaXggcHJlc2VydmVzIGFsbCBlYXJsaWVyXG4gKiBjb3JyZWxhdGlvbi1JRCBkcmF3czsgYHN0ZXBfc3RhcnRlZGAgYXRvbWljYWxseSBjaG9vc2VzIG9uZSBvd25lcjsgYW5kIGFuXG4gKiBvcGVuIGhvb2sgc3VwcHJlc3NlcyBvcHRpbWlzdGljIHN0ZXAtYm9keSBleGVjdXRpb24gdW50aWwgdGhhdCBjbGFpbSB3aW5zLlxuICogVGhlIGdlbmVyYXRpb24gZ3VhcmQga2VlcHMgbG9zaW5nIHNhbWUtYm91bmRhcnkgc3VzcGVuc2lvbiBzaWduYWxzIHN0YWxlLFxuICogd2hpbGUgYSBzdGFsZS1zbmFwc2hvdC80MTIgcmVzdGFydCBkaXNjYXJkcyB0aGUgcmV0YWluZWQgc2Vzc2lvbiBhbmQgcmVwbGF5c1xuICogZnJvbSB0aGUgYXV0aG9yaXRhdGl2ZSBsb2cuIEEgV29ybGQgdGhhdCBleHBvc2VzIGEgbm9uLXByZWZpeCB2aWV3IHdvdWxkXG4gKiB2aW9sYXRlIHRoaXMgcG9saWN5J3MgcHJlY29uZGl0aW9uIGFuZCBjb3VsZCBiaW5kIG9uZSBvcmRpbmFsIHRvIHR3byBsb2dpY2FsXG4gKiBicmFuY2hlcyBiZWZvcmUgdGhlIHN0ZXAtb3duZXJzaGlwIGNsYWltIGhhcyBhIGNoYW5jZSB0byBhcmJpdHJhdGUgdGhlbS5cbiAqXG4gKiBRdWllc2NlbmNlIGFzc3VtZXMgd29ya2Zsb3cgY29kZSBzdGF5cyBpbnNpZGUgdGhlIHNhbmRib3gncyBkZXRlcm1pbmlzbVxuICogY29udHJhY3QuIEVzY2FwaW5nIHRvIHRoZSBob3N0IHJlYWxtIChmb3IgZXhhbXBsZSwgcmVjb3ZlcmluZyBhIGhvc3RcbiAqIGBGdW5jdGlvbmAgY29uc3RydWN0b3IgdG8gc2NoZWR1bGUgcmVhbCB0aW1lcnMpIGFscmVhZHkgbWFrZXMgb3JkaW5hcnkgY29sZFxuICogcmVwbGF5IG5vbmRldGVybWluaXN0aWMgYW5kIGlzIG5vdCBkZWZlbmRlZCBoZXJlLlxuICpcbiAqIGBoYXNPcGVuV2FpdGAgaXMgbGF6eSBiZWNhdXNlIGNoZWNraW5nIGl0IHNjYW5zIHRoZSBsb2FkZWQgZXZlbnQgbG9nLiBLZWVwIGl0XG4gKiBsYXN0IHNvIGNoZWFwIHJlamVjdGlvbiByZWFzb25zIGF2b2lkIHRoYXQgd29yay5cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0ZW50aW9uRGVjaXNpb24oe1xuICBzdXNwZW5zaW9uLFxuICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50LFxuICBoYXNPcGVuV2FpdCxcbn06IHtcbiAgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OiBudW1iZXI7XG4gIGhhc09wZW5XYWl0OiAoKSA9PiBib29sZWFuO1xufSk6IFJldGVudGlvbkRlY2lzaW9uIHtcbiAgaWYgKCFpc1ZtUmV0ZW50aW9uRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIHsgcmV0YWluOiBmYWxzZSwgcmVhc29uOiAnZGlzYWJsZWQnIH07XG4gIH1cbiAgaWYgKHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQgPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJldGFpbjogZmFsc2UsXG4gICAgICByZWFzb246ICdzZXJpYWxpemF0aW9uX2V4ZWN1dGVkX3dvcmtmbG93X2NvZGUnLFxuICAgIH07XG4gIH1cbiAgaWYgKHN1c3BlbnNpb24uc3RlcENvdW50ID09PSAwICYmIHN1c3BlbnNpb24uYXR0cmlidXRlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4geyByZXRhaW46IGZhbHNlLCByZWFzb246ICdub19yZXBsYXlfZHJpdmVyJyB9O1xuICB9XG4gIGlmIChcbiAgICAhc3VzcGVuc2lvbi5pdGVtcy5ldmVyeSgoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RlcCc6XG4gICAgICAgIGNhc2UgJ2hvb2snOlxuICAgICAgICBjYXNlICdhdHRyaWJ1dGUnOlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICd3YWl0JzpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaXRlbSBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHdvcmtmbG93IHN1c3BlbnNpb24gaXRlbScpO1xuICAgICAgfVxuICAgIH0pXG4gICkge1xuICAgIHJldHVybiB7IHJldGFpbjogZmFsc2UsIHJlYXNvbjogJ3Vuc3VwcG9ydGVkX3N1c3BlbnNpb25faXRlbScgfTtcbiAgfVxuICBpZiAoaGFzT3BlbldhaXQoKSkge1xuICAgIHJldHVybiB7IHJldGFpbjogZmFsc2UsIHJlYXNvbjogJ29wZW5fd2FpdCcgfTtcbiAgfVxuICByZXR1cm4geyByZXRhaW46IHRydWUgfTtcbn1cblxuY29uc3QgU0VSSUFMSVpBVElPTl9CTE9DS0VSX0xPR19ERVRBSUxfTElNSVQgPSAxNjA7XG5cbi8qKiBLZWVwIHJldGVudGlvbiBkaWFnbm9zdGljcyB1c2VmdWwgd2l0aG91dCBlbWl0dGluZyB1bmJvdW5kZWQgZ3Vlc3QgZGF0YS4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6YXRpb25CbG9ja2VyTG9nTWV0YWRhdGEoXG4gIGJsb2NrZXJzOiBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXJbXSxcbiAgY291bnQ6IG51bWJlclxuKSB7XG4gIHJldHVybiB7XG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudDogY291bnQsXG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJzOiBibG9ja2Vycy5tYXAoXG4gICAgICAoeyBzb3VyY2UsIGNvcnJlbGF0aW9uSWQsIGtpbmQsIGRldGFpbCB9KSA9PiAoe1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGRldGFpbDpcbiAgICAgICAgICBkZXRhaWwgJiYgZGV0YWlsLmxlbmd0aCA+IFNFUklBTElaQVRJT05fQkxPQ0tFUl9MT0dfREVUQUlMX0xJTUlUXG4gICAgICAgICAgICA/IGAke2RldGFpbC5zbGljZSgwLCBTRVJJQUxJWkFUSU9OX0JMT0NLRVJfTE9HX0RFVEFJTF9MSU1JVCl94oCmYFxuICAgICAgICAgICAgOiBkZXRhaWwsXG4gICAgICB9KVxuICAgICksXG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJzVHJ1bmNhdGVkOiBjb3VudCA+IGJsb2NrZXJzLmxlbmd0aCxcbiAgfTtcbn1cblxudHlwZSBSZXBsYXlFdmVudExvZyA9XG4gIHwgeyB0eXBlOiAnbG9hZEFsbCcgfVxuICB8ICh7IHR5cGU6ICdyZWFkeScgfSAmIExvYWRlZEV2ZW50TG9nKVxuICB8ICh7IHR5cGU6ICdsb2FkQWZ0ZXInOyBjdXJzb3I6IHN0cmluZyB9ICYgTG9hZGVkRXZlbnRMb2cpO1xuXG5mdW5jdGlvbiBuZXh0RXZlbnRMb2dMb2FkKGxvZzogTG9hZGVkRXZlbnRMb2cpOiBSZXBsYXlFdmVudExvZyB7XG4gIGlmIChsb2cuY3Vyc29yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbG9hZEFmdGVyJyxcbiAgICBldmVudHM6IGxvZy5ldmVudHMsXG4gICAgY3Vyc29yOiBsb2cuY3Vyc29yLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRFdmVudExvZyhsb2c6IExvYWRlZEV2ZW50TG9nLCBhcHBlbmRlZDogTG9hZGVkRXZlbnRMb2cpOiB2b2lkIHtcbiAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvZy5ldmVudHMsIGFwcGVuZGVkLmV2ZW50cyk7XG4gIGxvZy5jdXJzb3IgPSBhcHBlbmRlZC5jdXJzb3IgPz8gbG9nLmN1cnNvcjtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGlubGluZS1leGVjdXRpb24gZHVyYXRpb24gZm9yIGEgc2luZ2xlIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqXG4gKiBPcmRlciBvZiBwcmVjZWRlbmNlOlxuICogMS4gYFdPUktGTE9XX1YyX1RJTUVPVVRfTVNgIGVudiB2YXJcbiAqIDIuIFRpZXJlZCBidWRnZXQgZGVyaXZlZCBmcm9tIGB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmUoKWBcbiAqIDMuIERlZmF1bHQgb2YgMiBtaW51dGVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaW52b2NhdGlvblN0YXJ0VGltZTogbnVtYmVyXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByYXdFbnZPdmVycmlkZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1YyX1RJTUVPVVRfTVM7XG4gIGlmIChyYXdFbnZPdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmIHJhd0Vudk92ZXJyaWRlICE9PSAnJykge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXdFbnZPdmVycmlkZSk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcnVudGltZURlYWRsaW5lID0gYXdhaXQgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lPy4oKTtcbiAgaWYgKHJ1bnRpbWVEZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVhZGxpbmVNcyA9IHJ1bnRpbWVEZWFkbGluZS5nZXRUaW1lKCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oZGVhZGxpbmVNcykpIHtcbiAgICAgIGNvbnN0IG1heER1cmF0aW9uTXMgPSBNYXRoLmZsb29yKGRlYWRsaW5lTXMgLSBpbnZvY2F0aW9uU3RhcnRUaW1lKTtcbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcyNW0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzEwbScpO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMTBtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCc1bScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtcygnMm0nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHJvdXRlIHdoaWNoIGhhbmRsZXMgd29ya2Zsb3cgZXhlY3V0aW9uIHJlcXVlc3RzLFxuICogZXhlY3V0aW5nIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBmdW5jdGlvbiBpbnZvY2F0aW9uc1xuICogYW5kIHF1ZXVlIG92ZXJoZWFkLlxuICpcbiAqIFRoZSBoYW5kbGVyIGxvb3BzOiByZXBsYXkgd29ya2Zsb3cg4oaSIGV4ZWN1dGUgc3RlcCBpbmxpbmUg4oaSIHJlcGxheSDihpIgLi4uXG4gKiB1bnRpbCB0aGUgd29ya2Zsb3cgY29tcGxldGVzLCB0aW1lcyBvdXQsIG9yIGVuY291bnRlcnMgbm9uLXN0ZXAgc3VzcGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGFsbCB3b3JrZmxvdyBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhIFZlcmNlbCBBUEkgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93RW50cnlwb2ludChcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBzZXRXb3JrZmxvd0Jhc2VQYXRoKG9wdGlvbnM/LmJhc2VQYXRoKTtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIFQyIG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93IChzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyk6XG4gICAgICAgIC8vIHRoZSBpbnN0YW50IHRoaXMgY29uc3VtZXIgYmVnYW4sIGJlZm9yZSBtZXNzYWdlIHBhcnNpbmcuIE9ubHkgdXNlZFxuICAgICAgICAvLyB3aGVuIHRoZSBtZXNzYWdlIHR1cm5zIG91dCB0byBjYXJyeSByZXN1bWUgdGltaW5nOyB0YWtpbmcgaXRcbiAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5IGtlZXBzIGl0IGhvbmVzdCBmb3IgdGhlIGRlbGl2ZXJpZXMgdGhhdCBkby5cbiAgICAgICAgY29uc3QgaGFuZGxlckVudGVyZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICAgIHN0ZXBJbnB1dCxcbiAgICAgICAgICBob29rUmVzdW1lVGltaW5nLFxuICAgICAgICAgIHdhaXRDb250aW51YXRpb24sXG4gICAgICAgIH0gPSBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuXG4gICAgICAgIC8vIC0tLSBIb29rLXJlc3VtZSBUVFIgdGVsZW1ldHJ5IChydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKSAtLS1cbiAgICAgICAgLy8gVGhyZWFkZWQgdGhyb3VnaCB0aGlzIGludm9jYXRpb24gYW5kIENPTlNVTUVEIGJ5IHRoZSBmaXJzdCBkdXJhYmxlXG4gICAgICAgIC8vIHN0ZXAgdGhhdCBmb2xsb3dzIHRoZSByZXN1bXB0aW9uLCBjbGVhcmVkIGF0IHRoYXQgcG9pbnQgc28gYSBsYXRlclxuICAgICAgICAvLyBzdGVwLCBhIHJldHJ5LCBvciBhIHJlZGVsaXZlcnkgbmV2ZXIgcmUtcmVwb3J0cyB0aGUgc2FtZSByZXN1bWUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFR3byBkZWxpdmVyeSBzaGFwZXMgY2FycnkgdGltaW5nOlxuICAgICAgICAvLyAgLSB0aGUgcmVzdW1lJ3Mgb3duIGludm9jYXRpb24gKG5vIGBzdGVwSWRgKTogdGhlIHByb2R1Y2VyJ3MgVDAvVDFcbiAgICAgICAgLy8gICAgcmlkZSB0aGUgbWVzc2FnZSBhbmQgdGhpcyBoYW5kbGVyJ3MgZW50cnkgaXMgVDIuXG4gICAgICAgIC8vICAtIGEgc3RlcCB0aGlzIGludm9jYXRpb24gaGFuZGVkIHRvIGFub3RoZXIgaW52b2NhdGlvbiAoYHN0ZXBJZGBcbiAgICAgICAgLy8gICAgcHJlc2VudCk6IHRoZSByZXN1bWluZyBpbnZvY2F0aW9uIGFscmVhZHkgc3RhbXBlZCBUMi4uVDQgb250b1xuICAgICAgICAvLyAgICB0aGUgbWVzc2FnZSwgc28gdGhleSBhcmUgcmVhZCBiYWNrIHZlcmJhdGltLlxuICAgICAgICBsZXQgcmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZ0Zyb21NZXNzYWdlKFxuICAgICAgICAgIGhvb2tSZXN1bWVUaW1pbmcsXG4gICAgICAgICAgaW5jb21pbmdTdGVwSWQgIT09IHVuZGVmaW5lZCA/ICdkaXNwYXRjaGVkJyA6ICdpbmxpbmUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bWVUcmFja2luZyAmJiBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdW1lVHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcyA9IGhhbmRsZXJFbnRlcmVkQXRNcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzdW1lVHJhY2tpbmcgJiZcbiAgICAgICAgICAhTnVtYmVyLmlzRmluaXRlKHJlc3VtZVRyYWNraW5nLmNvbnN1bWVyU3RhcnRlZEF0TXMpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEEgc3RlcCBtZXNzYWdlIGZyb20gYSBwcm9kdWNlciB0aGF0IGZvcndhcmRlZCB0aW1pbmcgd2l0aG91dCB0aGVcbiAgICAgICAgICAvLyBjb25zdW1lciBib3VuZGFyaWVzLiBOb3RoaW5nIGFkZGl0aXZlIGNhbiBiZSByZXBvcnRlZC5cbiAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBgc3RhcnQoKWAgYWx3YXlzIGF0dGFjaGVzIGEgdHJhY2UgY2FycmllciwgYnV0XG4gICAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gb3Igbm8gc3BhbiBpcyBhY3RpdmUsIHNvIHRyZWF0IGFuIGVtcHR5IGNhcnJpZXIgdGhlIHNhbWUgYXMgYW5cbiAgICAgICAgLy8gYWJzZW50IG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ1RyYWNlQ2FycmllcilcbiAgICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHdvcmtmbG93UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBydW5hd2F5IHdvcmtmbG93cyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAvLyBTY29wZWQgbG9nZ2VyIGZvciB0aGlzIHJ1bjogYXR0YWNoZXMgcnVuSWQvd29ya2Zsb3dOYW1lIHRvIGV2ZXJ5XG4gICAgICAgIC8vIGxvZyBsaW5lIGFuZCBjaGlsZCBsb2dnZXJzIGJlbG93LCBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgICAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgICAgICAgY29uc3QgbWF4UXVldWVEZWxpdmVyaWVzID0gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb25cbiAgICAgICAgLy8gKHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMpIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciwgd2hlcmUgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzLlxuICAgICAgICAvLyBTZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVGhlIHJlcGxheSBidWRnZXQgY292ZXJzIG9yY2hlc3RyYXRpb24gd29yayBiZXR3ZWVuIHN0ZXBzLCBub3QgaW5saW5lXG4gICAgICAgIC8vIHN0ZXAgYm9kaWVzLiBJdCBpcyBjaGVja2VkIGJldHdlZW4gbG9vcCBpdGVyYXRpb25zOyBzdGVwIGJvZGllcyB1c2VcbiAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHRpbWVvdXQgYW5kIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgZ3VhcmQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dDogcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBCb3RoIGNoZWNrcyBiZWxvdyBsb29rIGF0IGBydW5JbnB1dGAsIHNvIGJvdGggYXJlIG5vLW9wcyBvbiBhXG4gICAgICAgICAgICAgIC8vIHJlLWVucXVldWVkIG1lc3NhZ2UgKHdoaWNoIGNhcnJpZXMgbm9uZSk6IHRoZXkgb25seSBldmVyIHJ1biBvblxuICAgICAgICAgICAgICAvLyBhIGZpcnN0IGRlbGl2ZXJ5LCB0aGUgb25lIHRoYXQgY291bGQgY3JlYXRlIHRoZSBydW4uXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFJldHVybmluZyBhY2tzIHRoZSBtZXNzYWdlLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBtaXNtYXRjaCBpc1xuICAgICAgICAgICAgICAvLyBiYWtlZCBpbnRvIHRoaXMgbWVzc2FnZSwgc28gZXZlcnkgcmVkZWxpdmVyeSB3b3VsZCByZWFjaCB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB2ZXJkaWN0LCBhbmQgdGhyb3dpbmcgd291bGQgaG90LWxvb3AgdGhlIGhhbmRsZXIgdW50aWxcbiAgICAgICAgICAgICAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgd2l0aCB0aGUgc2FtZSBlcnJvciBlYWNoIHRpbWUuIEl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgLy8gaG93IHRoZSBydW5fc3RhcnRlZCBwYXRoIGFscmVhZHkgZGlzY2FyZHMgZGVsaXZlcmllcyB3aG9zZVxuICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGNhbm5vdCBjaGFuZ2UgKEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvcikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljIG9ubHkuIFNlZSB0aGUgaGVscGVyIGZvciB3aHkgdGhpcyB3YXJucyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgIC8vIHJlZnVzaW5nIHRoZSBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICBhd2FpdCB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vSW5saW5lUmVwbGF5QWZ0ZXJNcyA9IGF3YWl0IGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9IHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcihyZXBsYXlEaXZlcmdlbmNlLmNvdW50KVxuICAgICAgICAgICAgICAgICAgICA6IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IHdyaXRlIHRoaXMgbG9vcCBtYWtlcyBjYXJyaWVzIHRoZSBjdXJzb3Igb2YgdGhlIGxvZ1xuICAgICAgICAgICAgICAgICAgLy8gaXQgd2FzIGNvbXB1dGVkIGFnYWluc3QsIGFuZCBmb2xkcyBhIGNvbXBsZXRlIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWx0YSBpbnRvIHRoYXQgbG9nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlRXZlbnQgPSBhc3luYyA8VCBleHRlbmRzIENyZWF0ZUV2ZW50UmVxdWVzdD4oXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2luY2VDdXJzb3IgPSBkZWx0YVJlcXVlc3RDdXJzb3IoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2l0aFNuYXBzaG90ID0geyAuLi5zbG90U25hcHNob3QoKSwgLi4ucGFyYW1zIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHNpbmNlQ3Vyc29yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gd2l0aFNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ud2l0aFNuYXBzaG90LCBzaW5jZUN1cnNvciB9LFxuICAgICAgICAgICAgICAgICAgICAgIChwKSA9PiB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCBkYXRhLCBwKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGFic29yYkNyZWF0ZURlbHRhKHNpbmNlQ3Vyc29yLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBzbG90IHNuYXBzaG90IGZvciBhIHdyaXRlIGlzc3VlZCBmcm9tIHRoaXMgbG9vcDogaG93XG4gICAgICAgICAgICAgICAgICAgKiBtdWNoIG9mIHRoZSBydW4ncyBsb2cgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCB3YXMgbWFkZVxuICAgICAgICAgICAgICAgICAgICogYWdhaW5zdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVyeSB3cml0ZSBnb2VzIHRocm91Z2ggaGVyZSwgaW5jbHVkaW5nIHRoZSBvbmVzIHRoYXQgYXNrXG4gICAgICAgICAgICAgICAgICAgKiBmb3IgYW4gaW5saW5lIGRlbHRhLiBUaGUgdHdvIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZFxuICAgICAgICAgICAgICAgICAgICogYSBXb3JsZCBpcyBmcmVlIHRvIHNlcnZlIGJvdGg6IHRoZSBjdXJzb3Igc2F5cyB3aGVyZSB0b1xuICAgICAgICAgICAgICAgICAgICogc3RhcnQgbGlzdGluZyBmcm9tLCB0aGUgc2xvdCBzYXlzIHdoaWNoIGV2ZW50cyB0aGlzIHdyaXRlclxuICAgICAgICAgICAgICAgICAgICogaGFkIGFscmVhZHkgZGVjaWRlZCB3aXRob3V0LiBXb3JsZHMgdGhhdCB0cmVhdCB0aGUgZGVsdGEgYXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBiZXR0ZXIgYW5zd2VyIGlnbm9yZSB0aGUgc2xvdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUYWtlbiBmcm9tIHdoYXRldmVyIGlzIGxvYWRlZCwgaW5jbHVkaW5nIHRoZSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICogYGxvYWRBZnRlcmAgc3RhdGUuIFVuZGVyc3RhdGluZyBpcyBzYWZlOiB0aGUgV29ybGQgcmVwb3J0c1xuICAgICAgICAgICAgICAgICAgICogYmFjayBhIHdpZGVyIHNwYW4gdGhhbiBzdHJpY3RseSBuZWVkZWQsIGFuZFxuICAgICAgICAgICAgICAgICAgICogYG1lcmdlUmVwb3J0ZWRFdmVudHNgIGRyb3BzIHdoYXQgdGhlIGxvZyBhbHJlYWR5IGhvbGRzLlxuICAgICAgICAgICAgICAgICAgICogT3ZlcnN0YXRpbmcgaXMgbm90LCBzbyB0aGVyZSBpcyBubyBndWVzc2luZyB3aGVuIG5vdGhpbmcgaXNcbiAgICAgICAgICAgICAgICAgICAqIGxvYWRlZCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNsb3RTbmFwc2hvdCA9ICgpOiBTbG90U25hcHNob3RQYXJhbXMgPT5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBbGwnXG4gICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgIDogc2xvdFNuYXBzaG90UGFyYW1zKGV2ZW50TG9nLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGN1cnNvciB0byBhc2sgZm9yIGFuIGlubGluZSBkZWx0YSBhZ2FpbnN0LCBvclxuICAgICAgICAgICAgICAgICAgICogdW5kZWZpbmVkIHRvIG5vdCBhc2suXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVHVyYm8gaXMgZXhjbHVkZWQgb24gcHVycG9zZTogaXQgZXhpc3RzIHRvIG1ha2UgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgKiBpbnZvY2F0aW9uJ3Mgd3JpdGVzIGFzIGNoZWFwIGFzIHBvc3NpYmxlLCBhbmQgaXQgaGFzIG5vXG4gICAgICAgICAgICAgICAgICAgKiBsb2FkZWQgbG9nIHRvIGV4dGVuZC4gUnVuLXRlcm1pbmFsIHdyaXRlcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAqIGJlY2F1c2Ugbm90aGluZyByZWFkcyB0aGUgbG9nIGFmdGVyd2FyZHMsIHNvIHRoZSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogd291bGQgYmUgd29yayB0aGUgV29ybGQgZG9lcyBmb3Igbm8gb25lLiBBIGNhbGxlciB0aGF0XG4gICAgICAgICAgICAgICAgICAgKiBzZXQgaXRzIG93biBgc2luY2VDdXJzb3JgIChvciBhc2tlZCBmb3IgdGhlIGBydW5fc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAqIC8gYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQsIHdoaWNoIG93bnMgdGhlIHNhbWUgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAqIGZpZWxkcykga2VlcHMgd2hhdCBpdCBhc2tlZCBmb3IuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhUmVxdWVzdEN1cnNvciA9IChcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IENyZWF0ZUV2ZW50UGFyYW1zIHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgdHVyYm8gfHxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAncmVhZHknIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPy5zaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPy5wcmVsb2FkRXZlbnRzID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaXNUZXJtaW5hbFJ1bkV2ZW50VHlwZShkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRMb2cuY3Vyc29yID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRm9sZCBhbiBpbmxpbmUgZGVsdGEgcmV0dXJuZWQgYnkgYGV2ZW50cy5jcmVhdGVgIGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1tZW1vcnkgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBkZWx0YSBpcyB3aGF0IGBldmVudHMubGlzdCh7IGN1cnNvcjogc2VudEN1cnNvciB9KWBcbiAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGhhdmUgcmV0dXJuZWQgcmlnaHQgYWZ0ZXIgdGhlIHdyaXRlLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgKiBiYWNrIGJvdGggb3VyIG93biBldmVudCBhbmQgYW55dGhpbmcgYW5vdGhlciB3cml0ZXJcbiAgICAgICAgICAgICAgICAgICAqIGFwcGVuZGVkIGluIGJhbmQuIEFic29yYmluZyBpdCBoZXJlIG1lYW5zIHRoZSBuZXh0IHJlYWRlclxuICAgICAgICAgICAgICAgICAgICogYWxyZWFkeSBoYXMgdGhlIGxvZyBhbmQgdGhlIGxvb3AncyBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICogYGV2ZW50cy5saXN0YCBmaW5kcyBub3RoaW5nIGxlZnQgdG8gZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRGVsaWJlcmF0ZWx5IG5vdCBgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnRgLCBldmVuIHRob3VnaCB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGBoYXNNb3JlYCBoYWxmIG9mIHRoZSB0d28gcG9saWNpZXMgY29pbmNpZGVzLiBBIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiBleHRlbmRzIHRoZSB0YWlsIGFuZCBjYXJyaWVzIGEgY3Vyc29yIHRoYXQgaGFzIHRvIG1vdmUgd2l0aFxuICAgICAgICAgICAgICAgICAgICogaXQsIHNvIGl0IGFwcGVuZHMgd2l0aG91dCByZS1zb3J0aW5nIGFuZCBuZWVkcyB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiBndWFyZCBiZWxvdzsgYSBza2lwcGVkLXNsb3QgcmVwb3J0IGlzIGEgd2luZG93IHN0cmljdGx5XG4gICAgICAgICAgICAgICAgICAgKiBiZWxvdyB0aGUgd3JpdGUsIGNhcnJpZXMgbm8gY3Vyc29yLCBhbmQgaGFzIHRvIGJlIHNvcnRlZFxuICAgICAgICAgICAgICAgICAgICogYmFjayBpbnRvIHBsYWNlLiBTaGFyaW5nIGFuIGltcGxlbWVudGF0aW9uIHdvdWxkIG1lYW4gb25lXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGVtIGRvaW5nIHRoZSBvdGhlcidzIHdvcmsuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRGVjbGluaW5nIGlzIGFsd2F5cyBzYWZlIChhbiB1bmFic29yYmVkIGRlbHRhIGlzIGEgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBuZXh0IGBldmVudHMubGlzdGAgcmV0dXJucyksIHNvIHRoZSBndWFyZHMgYXJlIGZyZWUgdG9cbiAgICAgICAgICAgICAgICAgICAqIGJlIHN0cmljdDpcbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiAtIGBoYXNNb3JlYCBtZWFucyB0aGUgV29ybGQgdHJ1bmNhdGVkIHRoZSBwYWdlLiBUYWtpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAqICAgd2hpbGUgYWR2YW5jaW5nIHRoZSBjdXJzb3IgdG8gdGhlIHBhZ2UgZW5kIHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgKiAgIGZpbmUsIGJ1dCB0YWtpbmcgaXQgYW5kIE5PVCBhZHZhbmNpbmcgd291bGQgZHVwbGljYXRlLFxuICAgICAgICAgICAgICAgICAgICogICBhbmQgdGhlIHRydW5jYXRlZCBjYXNlIGlzIHJhcmUgZW5vdWdoIG5vdCB0byBzcGVjaWFsLWNhc2UuXG4gICAgICAgICAgICAgICAgICAgKiAtIFRoZSBjdXJzb3IgbXVzdCBiZSBleGFjdGx5IHdoZXJlIGl0IHdhcyB3aGVuIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdlbnQgb3V0LiBDb25jdXJyZW50IHdyaXRlcyBlYWNoIGRpZmYgYWdhaW5zdCB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiAgIHRoZXkgc2F3LCBhbmQgYGFwcGVuZFVuaXF1ZUV2ZW50c2AgZGVsaWJlcmF0ZWx5IGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgKiAgIHJlLXNvcnQsIHNvIGFic29yYmluZyBhIHNlY29uZCBkZWx0YSBjb21wdXRlZCBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAgKiAgIG9sZGVyIGN1cnNvciBjb3VsZCBhcHBlbmQgZXZlbnRzIGJlaGluZCBvbmVzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAqICAgdGFrZW4uIEZpcnN0IHJlc3BvbnNlIGJhY2sgd2luczsgdGhlIHJlc3QgYXJlIGRyb3BwZWQuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29yYkNyZWF0ZURlbHRhID0gKFxuICAgICAgICAgICAgICAgICAgICBzZW50Q3Vyc29yOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogRXZlbnRSZXN1bHRcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvciAhPT0gc2VudEN1cnNvciB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gYHJlYWR5YCBjYW4gcmVwbGF5IG9uY2Ugd2l0aG91dCBhIHJlYWQuIFRoZSBvdGhlciBzdGF0ZXNcbiAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaWJlIHRoZSBuZXh0IGxvYWQgZXhhY3RseS5cbiAgICAgICAgICAgICAgICAgIGxldCBldmVudExvZzogUmVwbGF5RXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgc3RhdGU6IHNldCBieSBlaXRoZXIgdGhlIGJhY2tncm91bmQgc3RlcCBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBvciB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gU2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZyBmcm9tIHRoZSBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UuIFVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQgKG9sZGVyIHNlcnZlcnMsIHR1cmJvKS5cbiAgICAgICAgICAgICAgICAgIGxldCBtYXhFdmVudHNMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93U3RhcnRlZEF0ID0gLTE7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZS4gU2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESzogYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlLiBTZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy4gQWNjdW11bGF0b3JzIGhlcmUgc3Vydml2ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydCAoYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24sIG9yXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlLWV2ZW50IHJlc3RhcnQgYmVsb3cpLCBzbyBhIHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBvdmVyLWNvdW50cyBieSB0aGUgYWJhbmRvbmVkIHBhc3MncyBob29rIHRpbWUsXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzbGlnaHQgb3Zlci1jb3VudCBlaXRoZXIgcmVzdGFydCBoYXMgYWx3YXlzIGhhZC5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCwgc2luY2UgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgaXQgaXMgcHJvdmFibHkgc2FmZSB0bzogYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCwgc2tpcCB0aGUgaW5pdGlhbCBldmVudC1sb2cgbG9hZCAobm90aGluZyBoYXNcbiAgICAgICAgICAgICAgICAgIC8vIGJlZW4gd3JpdHRlbiB5ZXQpLCBhbmQgZm9yY2Ugb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgKG5vXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHBlZXIgaGFuZGxlciBleGlzdHMgdG8gcmFjZSB0aGUgY3JlYXRlLWNsYWltKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBydW5JbnB1dGAgaXMgb25seSBwcmVzZW50IG9uIHRoZSBzdGFydCgpLWVucXVldWVkIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYGF0dGVtcHQgPT09IDFgICgxLWJhc2VkKSBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnk7IGBpbmNvbWluZ1N0ZXBJZGAgd291bGQgbWFyayBhIGJhY2tncm91bmQtc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIGEgcmVjb3ZlcnkgcmVwbGF5LCBib3RoXG4gICAgICAgICAgICAgICAgICAvLyBpbmVsaWdpYmxlLiBUaGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXMgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgZW5kcyBvbmNlIGEgaG9vayBvciB3YWl0IGlzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGludHJvZHVjZSByZXN1bWUgaW52b2NhdGlvbnMpLCBzbyB0dXJibyBleGl0cyBhdCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBwb2ludCAoc2VlIGBmb3JjZU9wdGltaXN0aWNTdGFydGApLiBXb3JrZmxvdyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBpbnRyb2R1Y2Ugbm8gc3VjaCBpbnZvY2F0aW9uIHNvdXJjZTogdGhleSByZXNvbHZlXG4gICAgICAgICAgICAgICAgICAvLyB2aWEgYW4gaW4tcHJvY2VzcyByZXBsYXkgYW5kIGRvbid0IGVuZCB0dXJiby5cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGBtZXRhZGF0YS5hdHRlbXB0ID09PSAxYCBpcyBhbHNvIGxvYWQtYmVhcmluZyBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIG93bmVyc2hpcDogb3duZWQtcmVjb3Zlcnkgc3RlcHMgKGEgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gc3RhbXBlZCBieSBhIFBSRVZJT1VTIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSkgY2FuIG9ubHlcbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0IG9uIGF0dGVtcHQg4omlIDIsIHNvIHR1cmJvIGFuZCBvd25lZCByZWNvdmVyeSBhcmVcbiAgICAgICAgICAgICAgICAgIC8vIG11dHVhbGx5IGV4Y2x1c2l2ZS4gVGhlIHR1cmJvIGByZWludm9rZSgpYCBwYXRocyAoaG9va1xuICAgICAgICAgICAgICAgICAgLy8gY29uZmxpY3QsIHRocm90dGxlIGJhY2tvZmYpIGFjayB0aGlzIG1lc3NhZ2UgYW5kIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkLCBzYWZlIG9ubHkgYmVjYXVzZSBub1xuICAgICAgICAgICAgICAgICAgLy8gbm9uLXRlcm1pbmFsIHN0ZXAgY2FuIGJlIGlubGluZS1vd25lZCBieSB0aGUgYWNrZWQgaWRcbiAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHVyYm8gaXMgb24uIElmIHR1cmJvIGV2ZXIgZW5nYWdlcyBvbiByZWRlbGl2ZXJpZXMsXG4gICAgICAgICAgICAgICAgICAvLyB0aG9zZSBwYXRocyBtdXN0IGZpcnN0IGNoZWNrIGZvciBvd25lZCBwZW5kaW5nIHN0ZXBzIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGB7IHRpbWVvdXRTZWNvbmRzIH1gIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0dXJibyA9XG4gICAgICAgICAgICAgICAgICAgIGlzVHVyYm9FbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hdHRlbXB0ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJlcGxheURpdmVyZ2VuY2U7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5Xb3JrZmxvd1R1cmJvKHR1cmJvKSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgb25seTogcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQgKG9yIHJlamVjdHMgaWYgaXQgZmFpbGVkKS4gVGhyZWFkZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludG8gaGFuZGxlU3VzcGVuc2lvbiBhbmQgZXhlY3V0ZVN0ZXAgc28gbm8gc3RlcC9ob29rL3dhaXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHJhY2VzIGFoZWFkIG9mIHRoZSBydW4ncyBjcmVhdGlvbi4gVW5kZWZpbmVkIG91dHNpZGVcbiAgICAgICAgICAgICAgICAgIC8vIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAgICAgICAgICAgICAgICBsZXQgcnVuUmVhZHlCYXJyaWVyOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBPcmRlciBhIHRlcm1pbmFsIHJ1biB3cml0ZSAocnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQpIGFmdGVyXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIGluIHR1cmJvIG1vZGUsIHNpbmNlIGEgbm8tc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2FuIG90aGVyd2lzZSByZWFjaCBydW5fY29tcGxldGVkIGJlZm9yZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAvLyBleGlzdHMuIEJlc3QtZWZmb3J0OiBhIGJhcnJpZXIgcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIG9yZGVyaW5nIG9ubHk7IGlmIHJ1bl9zdGFydGVkIHRydWx5IGZhaWxlZCB0aGUgdGVybWluYWwgd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIHN1cmZhY2VzIHRoZSByZWFsIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgY29uc3QgYXdhaXRSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blJlYWR5QmFycmllcikge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW5SZWFkeUJhcnJpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIG9yY2hlc3RyYXRvci4gT3V0c2lkZSB0dXJibyB0aGlzIHJldHVybnNcbiAgICAgICAgICAgICAgICAgIC8vIGB7IHRpbWVvdXRTZWNvbmRzIH1gLCB3aGljaCBtYWtlcyB0aGUgcXVldWUgcmVzY2hlZHVsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgZGVsaXZlcnkncyBtZXNzYWdlLiBJbiB0dXJibyB0aGF0IGlzIGEgdHJhcDogdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgLCBhbmQgb24gYXN5bmMgcXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyAoZS5nLiBncmFwaGlsZS13b3JrZXIpIGEgcmVzY2hlZHVsZSBjb21lcyBiYWNrIGFzIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDEsIHNvIHR1cmJvIHJlLWVuZ2FnZXMsIHNraXBzIHRoZSBldmVudC1sb2cgbG9hZFxuICAgICAgICAgICAgICAgICAgLy8gYWdhaW4sIHJlcGxheXMgYWdhaW5zdCBhbiBlbXB0eSBsb2csIG5ldmVyIG9ic2VydmVzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9vayBldmVudCB0aGlzIGludm9jYXRpb24ganVzdCB3cm90ZSwgYW5kIHJlLXN1c3BlbmRzXG4gICAgICAgICAgICAgICAgICAvLyBmb3JldmVyICh0aGUgcnVuIHdlZGdlcykuIFVuZGVyIHR1cmJvIHdlIGluc3RlYWQgZW5xdWV1ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgY29udGludWF0aW9uIHRoYXQgY2FycmllcyBOTyBgcnVuSW5wdXRgLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5leHQgZGVsaXZlcnkgaXMgYSBub3JtYWwgKG5vbi10dXJibykgbG9hZC1hbmQtcmVwbGF5IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVzIHRoZSBjb21taXR0ZWQgZXZlbnRzIGFuZCBtYWtlcyBwcm9ncmVzczsgd2UgdGhlblxuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBxdWV1ZSB0cmVhdHMgdGhpcyBkZWxpdmVyeSBhcyBkb25lXG4gICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhbHNvIHJlc2NoZWR1bGluZyBpdC5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgaW52YXJpYW50IGd1YXJkOiBjb3JyZWxhdGlvbiBJRHMgb2ZcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIHdob3NlIGJvZGllcyB0aGlzIGludm9jYXRpb24gaXMgZXhlY3V0aW5nIHVuZGVyIGFuXG4gICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgc3RhbXAgKGxhenkgaW5saW5lICsgb3duZWQgcmVjb3ZlcnkpLCB3aGlsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGJvZHkgaXMgaW4gZmxpZ2h0LiBDcmFzaCByZWNvdmVyeSBkZXBlbmRzIG9uIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgTk9UIGJlaW5nIGFja2VkIHdoaWxlIHN1Y2ggYSBzdGVwIGlzIG5vbi10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gKGFjayA9IGhhbmRsZXIgcmV0dXJuIG9yIHJlaW52b2tlLCB3aGljaCBhY2tzICsgZW5xdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgTkVXIG1lc3NhZ2UgaWQ6IHRoZSByZWRlbGl2ZXJ5IG9mIHRoZSBvbGQgaWQgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHdoYXQgcmUtZXhlY3V0ZXMgYW4gb3JwaGFuZWQgb3duZWQgc3RlcCkuIEFsbCBleGVjdXRlU3RlcFxuICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgYXJlIGF3YWl0ZWQgYmVmb3JlIGFueSBhY2sgcGF0aCBydW5zLCBzbyB0aGlzIHNldFxuICAgICAgICAgICAgICAgICAgLy8gaXMgZW1wdHkgYXQgZXZlcnkgYWNrIGJ5IGNvbnN0cnVjdGlvbjsgdGhlIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggZnV0dXJlIHJlZmFjdG9ycyB0aGF0IGJyZWFrIHRoYXQgb3JkZXJpbmcuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbkZsaWdodE93bmVkU3RlcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzID0gKFxuICAgICAgICAgICAgICAgICAgICBhY2tQYXRoOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5GbGlnaHRPd25lZFN0ZXBzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhcmlhbnQgdmlvbGF0aW9uOiBhY2tpbmcgdGhlIHdvcmtmbG93IG1lc3NhZ2Ugd2hpbGUgb3duZWQgaW5saW5lIHN0ZXBzIGFyZSBzdGlsbCBleGVjdXRpbmcg4oCUIGNyYXNoIHJlY292ZXJ5IGZvciB0aGVzZSBzdGVwcyBpcyBicm9rZW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogWy4uLmluRmxpZ2h0T3duZWRTdGVwc10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gQSBwbGFpbiBvcmNoZXN0cmF0b3ItcmVwbGF5IG1lc3NhZ2UuIE9taXRzIGBydW5JbnB1dGAgKGl0XG4gICAgICAgICAgICAgICAgICAvLyByZS1lbmdhZ2VzIHR1cmJvIG9uIHRoZSBuZXh0IGRlbGl2ZXJ5IGFuZCB3ZWRnZXMgdGhlIHJ1bixcbiAgICAgICAgICAgICAgICAgIC8vIHNlZSBgcmVpbnZva2VgIGJlbG93KSBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIC9cbiAgICAgICAgICAgICAgICAgIC8vIGBzZXJ2ZXJFcnJvclJldHJ5Q291bnRgICh0aGlzIGRlbGl2ZXJ5IGNoYWluJ3MgYnVkZ2V0cykuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlNZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCk6IFByb21pc2U8V29ya2Zsb3dJbnZva2VQYXlsb2FkPiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2UgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogRXh0cmEgZmllbGRzIHRvIGNhcnJ5IG9uIHRoZSBuZXcgbWVzc2FnZS4gT25seSByZWFjaGVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiBuZXh0IGludm9jYXRpb24gb24gdGhlIHR1cmJvIHBhdGg6IHdpdGhvdXQgdHVyYm8gbm9cbiAgICAgICAgICAgICAgICAgICAgICogbWVzc2FnZSBpcyBlbnF1ZXVlZCBhdCBhbGw6IHRoZSBoYW5kbGVyIHJldHVybnMgYVxuICAgICAgICAgICAgICAgICAgICAgKiB2aXNpYmlsaXR5IHRpbWVvdXQgYW5kIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIHRoZSBDVVJSRU5UXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UsIHdob3NlIGJvZHkgKGFuZCB0aGVyZWZvcmUgYW55IGNvdW50ZXIgb24gaXQpXG4gICAgICAgICAgICAgICAgICAgICAqIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZXh0cmFQYXlsb2FkPzogUGFydGlhbDxXb3JrZmxvd0ludm9rZVBheWxvYWQ+XG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzKCdyZWludm9rZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXR1cmJvKSByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogZGVsYXlTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgeyAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSwgLi4uZXh0cmFQYXlsb2FkIH0sXG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzID4gMCA/IHsgZGVsYXlTZWNvbmRzIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbiAoNDEyKSByZWNvdmVyeTogaG93IG1hbnkgdGltZXMgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAvLyBoYXMgdGhyb3duIGF3YXkgaXRzIHJlcGxheSBhbmQgc3RhcnRlZCBvdmVyIGluLXByb2Nlc3MuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlY29uZGl0aW9uUmVzdGFydHMgPSAwO1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVudCBpZHMgdGhlIGRpc2NhcmRlZCByZXBsYXkgaGVsZCwga2VwdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICogbG9hZCByZXNvbHZlcyBzbyBhIHJlc3RhcnQgY2FuIHJlcG9ydCB3aGF0IGl0cyByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAqIGFjdHVhbGx5IGZvdW5kLiBXaXRob3V0IHRoaXMgYSA0MTIgb25seSBldmVyIHRlbGxzIHlvdSB0aGF0XG4gICAgICAgICAgICAgICAgICAgKiBhIHJlc3RhcnQgaGFwcGVuZWQsIHdoaWNoIGNvbmZsYXRlcyB0d28gZGlzdGluY3RcbiAgICAgICAgICAgICAgICAgICAqIHNpdHVhdGlvbnM6IGEgbG9nIHRoYXQgZ3JldyAoZXhwZWN0ZWQsIHRoZSBmZW5jZSBkaWQgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBqb2IpIGFuZCBhIGxvZyB0aGF0IGNhbWUgYmFjayBpZGVudGljYWwsIHdoaWNoIG1lYW5zIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tlbmQgZGlzYWdyZWUgYWJvdXQgdGhlIGNvdW50IGZvciB0aGUgc2FtZSBzZXQgb2ZcbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50cyBhbmQgdGhlIHJlc3RhcnQgd2lsbCByZS1kZXJpdmUgdGhlIHNhbWUgc25hcHNob3QgYW5kXG4gICAgICAgICAgICAgICAgICAgKiBiZSByZWplY3RlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZToge1xuICAgICAgICAgICAgICAgICAgICBpZHM6IFNldDxzdHJpbmc+O1xuICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpbmxpbmUtZGVsdGEnIHwgJ2Z1bGwtcmVsb2FkJztcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogUmVwb3J0IHdoYXQgYSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0J3MgcmVsb2FkIGZvdW5kLCBvbmNlXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgbG9nIHRoaXMgcmVwbGF5IHdpbGwgYWN0dWFsbHkgY29uc3VtZSBpcyBpbiBoYW5kLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIGBncmV3YCBpcyB0aGUgZXhwZWN0ZWQgY2FzZSBhbmQgZ2l2ZXMgNDEyIHZvbHVtZSBhXG4gICAgICAgICAgICAgICAgICAgKiBkZW5vbWluYXRvci4gYHVuY2hhbmdlZGAgbWVhbnMgdGhlIHJlbG9hZCBkaXNhZ3JlZWQgd2l0aFxuICAgICAgICAgICAgICAgICAgICogdGhlIHJlamVjdGlvbiwgc28gdGhpcyByZXBsYXkgcmUtZGVyaXZlcyB0aGUgc2FtZSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICogYW5kIGlzIHJlamVjdGVkIGFnYWluIHVudGlsIHRoZSBidWRnZXQgaXMgc3BlbnQuIGBzaHJhbmtgXG4gICAgICAgICAgICAgICAgICAgKiBzaG91bGQgYmUgaW1wb3NzaWJsZTogZXZlcnkgbG9hZCBwYXRoIG9ubHkgYWRkcyB0byBhIHJ1bidzXG4gICAgICAgICAgICAgICAgICAgKiBsb2cuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQgPSAoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50czogRXZlbnRbXVxuICAgICAgICAgICAgICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VsaW5lID0gcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VsaW5lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkZWRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRlZCA9IGNvdW50TWlzc2luZ0lkcyhyZWxvYWRlZElkcywgYmFzZWxpbmUuaWRzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGNvdW50TWlzc2luZ0lkcyhiYXNlbGluZS5pZHMsIHJlbG9hZGVkSWRzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0Y29tZSA9XG4gICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCA+IDAgPyAnc2hyYW5rJyA6IGFkZGVkID4gMCA/ICdncmV3JyA6ICd1bmNoYW5nZWQnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnUmVzdGFydGVkIHJlcGxheSByZWxvYWRlZCBpdHMgZXZlbnQgbG9nIGFmdGVyIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNCZWZvcmU6IGJhc2VsaW5lLmlkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQWZ0ZXI6IHJlbG9hZGVkSWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0czogYmFzZWxpbmUucmVzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogYmFzZWxpbmUucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBiYXNlbGluZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlY292ZXIgZnJvbSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBieSByZXN0YXJ0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGluc2lkZSB0aGlzIGludm9jYXRpb24sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICogcGVyLWludm9jYXRpb24gYnVkZ2V0IGlzIHNwZW50ICh0aGUgY2FsbGVyIHRoZW4gZmFsbHMgYmFja1xuICAgICAgICAgICAgICAgICAgICogdG8gYSBmcmVzaCBpbnZvY2F0aW9uKS5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBBIDQxMiBtZWFucyB0aGUgbG9nIHRoaXMgcmVwbGF5IGRlcml2ZWQgaXRzIGV2ZW50cyBmcm9tIHdhc1xuICAgICAgICAgICAgICAgICAgICogbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBoYWQgYWxyZWFkeSByZWNvcmRlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgKiByZWplY3RlZCB3cml0ZSBjYW5ub3QgYmUgcmV0cmllZDogY29ycmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgICAgKiBhcmUgcG9zaXRpb25hbCBvcmRpbmFscyBvZiBvbmUgc2VlZGVkIHNlcXVlbmNlLCBzbyBhIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBtaW50cyBhIGRpZmZlcmVudCBpZCBmb3IgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAqIGxvZ2ljYWwgZXZlbnQsIGFuZCByZS1wb3N0aW5nIHRoaXMgb25lIHdvdWxkIHBlcnNpc3QgYW5cbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IGV2ZXIgcHJvZHVjZXMuIFRoZSB3aG9sZSByZXBsYXkgaGFzXG4gICAgICAgICAgICAgICAgICAgKiB0byBiZSByZS1kZXJpdmVkLCB3aGljaCB0aGUgbG9vcCBkb2VzIGJ5IGRpc2NhcmRpbmcgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBjYWNoZWQgbG9nLCBzaW5jZSBgcnVuV29ya2Zsb3dgIHRoZW4gYnVpbGRzIGEgZnJlc2ggVk0sXG4gICAgICAgICAgICAgICAgICAgKiBzZWVkIGFuZCBjb3JyZWxhdGlvbi1pZCBzZXF1ZW5jZSBmcm9tIHRoZSByZWxvYWRlZCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRSZXBsYXlJblByb2Nlc3MgPSAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcj86IHVua25vd24sXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBTZXQgZmFsc2Ugd2hlbiB3cml0ZXMgdGhpcyBpbnZvY2F0aW9uIG1hZGUgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIHJlamVjdGVkIG9uZSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSA0MTInc1xuICAgICAgICAgICAgICAgICAgICAgKiBkZWx0YTogdGhlIFdvcmxkIGNvbXB1dGVkIHRoYXQgZGVsdGEgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgcmVxdWVzdCdzIHNuYXBzaG90LCBzbyBpdCBjYW5ub3QgY29udGFpbiBhblxuICAgICAgICAgICAgICAgICAgICAgKiBldmVudCBhIHNpYmxpbmcgY29tbWl0dGVkIGFmdGVyd2FyZHMsIGFuZCBtZXJnaW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHJlc3RhcnQgdGhlIHJlcGxheSBvbiBhIGxvZyB0aGF0IGlzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAqIGluY29tcGxldGUuIE9ubHkgYSBmdWxsIHJlbG9hZCBpcyBhdXRob3JpdGF0aXZlIHRoZW4uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICB7IGFsbG93RGVsdGEgPSB0cnVlIH06IHsgYWxsb3dEZWx0YT86IGJvb2xlYW4gfSA9IHt9XG4gICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzID49XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgc3RhbGUtc25hcHNob3QgcmVzdGFydCBpbnZhbGlkYXRlcyB0aGUgcGFya2VkIFZNOlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIGl0IGNvbnN1bWVkIHdhcyBtaXNzaW5nIGV2ZW50cywgc28gb25seSBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIGlzIGF1dGhvcml0YXRpdmUuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjb3ZlcnMgdGhlIHN1c3BlbnNpb24tY3JlYXRlIDQxMiwgd2hpY2ggZmlyZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZXRlbnRpb24gZGVjaXNpb24gKGtpbGwgc3dpdGNoICsgc3RlcC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAvLyBnYXRlKSBldmVyIHJhbiwgYW5kIHRoZSBydW5fY29tcGxldGVkIDQxMiwgd2hlcmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc2Vzc2lvbiBtdXN0IG5vdCBiZSByZXN1bWVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIFdvcmxkIE1BWSByZXR1cm4gdGhlIGV2ZW50cyB3ZSB3ZXJlIG1pc3Npbmcgb24gdGhlIDQxMi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ1c3QgaXQgb25seSBvbiB0aGUgRklSU1QgcmVzdGFydDogaXRzIGNvbXBsZXRlbmVzcyBwcm9vZlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWFucyBvbiB0aGUgYmFja2VuZCdzIG93biBib29ra2VlcGluZywgc28gaWYgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlci1jb3VudHMsIGEgXCJjb21wbGV0ZVwiIGRlbHRhIGNhbiBzdGlsbCBsZWF2ZSBhIGhvbGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIGl0IHRvIG9uZSBhdHRlbXB0IGNhcHMgdGhhdCBhdCBhIHNpbmdsZSB3YXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydDsgZXZlcnkgbGF0ZXIgcmVzdGFydCBkb2VzIHRoZSBhdXRob3JpdGF0aXZlIGxvYWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhICYmIHByZWNvbmRpdGlvblJlc3RhcnRzID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoZXJyb3IsIHJ1bklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbHRhIGlzIG9ubHkgdXNhYmxlIGlmIHRoZXJlIGlzIGEgbG9hZGVkIGxvZyB0byBtZXJnZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnRvOyB3aXRob3V0IG9uZSB0aGUgcmVzdGFydCBtdXN0IGxvYWQgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlZERlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YSAhPT0gbnVsbCAmJiBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPVxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICYmIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTVVTVCBiZSBhIGZ1bGwsIGN1cnNvci1sZXNzIHJlbG9hZC4gVGhlIGN1cnNvciBsaXN0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQgZnJvbSB0aGUgaGlnaGVzdCBldmVudCBpZCB0aGlzIHJlcGxheSBob2xkcyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hhdCBhIHN0YWxlIHNuYXBzaG90IGlzIG1pc3Npbmcgc2l0cyBiZWxvdyBpdDogYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3QgYWxsb2NhdGVkIGluc2lkZSBhIGNvbmN1cnJlbnQgY29tbWl0IHRha2VzIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGlzIHJlcGxheSBoYWQgYWxyZWFkeSByZWFkIHBhc3QuIEFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgbG9hZCBzdGFydHMgYWJvdmUgdGhlIGhvbGUgYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3RlZCBsb2cgaW5zZXJ0cyB0aGUgbWlzc2luZyBldmVudHMgQkVMT1cgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGFscmVhZHkgc2Nhbm5lZCBmb3IgcGF5bG9hZCBwcmV3YXJtaW5nLCBzaGlmdGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGxhdGVyIHBvc2l0aW9uLiBPbmx5IGEgZnVsbCByZXNjYW4gc2VlcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZS5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlOyByZXN0YXJ0aW5nIHJlcGxheSBpbi1wcm9jZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXNlZERlbHRhID8gJ2lubGluZS1kZWx0YScgOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZXN0YXJ0cyc6IHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEVzY2FsYXRlIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRoYXQgc3Vydml2ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1wcm9jZXNzIHJlc3RhcnQgYnVkZ2V0IHRvIGEgZnJlc2ggaW52b2NhdGlvbiwgb3IgZ2l2ZSB1cFxuICAgICAgICAgICAgICAgICAgICogb24gdGhlIHJ1biB3aGVuIHRoZSBwZXItcnVuIGJ1ZGdldCBpcyBhbHNvIHNwZW50LlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBpbi1wcm9jZXNzIGJ1ZGdldCBpcyBhIGNsb3N1cmUgdmFyaWFibGUgYW5kIHRoZSBxdWV1ZSdzXG4gICAgICAgICAgICAgICAgICAgKiBkZWxpdmVyeSBjb3VudCByZXN0YXJ0cyBhdCAxIHdoZW5ldmVyIGEgbmV3IG1lc3NhZ2UgaXNcbiAgICAgICAgICAgICAgICAgICAqIGVucXVldWVkLCBzbyBhIHJ1biB0aGF0IGlzIHBlcm1hbmVudGx5IHVuYWJsZSB0byBjYXRjaCB1cFxuICAgICAgICAgICAgICAgICAgICogd2l0aCBpdHMgb3duIGV2ZW50IGxvZyB3b3VsZCBvdGhlcndpc2UgY3ljbGUgcmVzdGFydHMg4oaSXG4gICAgICAgICAgICAgICAgICAgKiByZS1pbnZva2Ug4oaSIHJlc3RhcnRzIHdpdGggbm8gcnVuLWxldmVsIGJvdW5kLiBUaGUgY2hhaW4gaXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSBjb3VudGVkIG9uIHRoZSBtZXNzYWdlIGl0c2VsZiwgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgZGl2ZXJnZW5jZXMgYXJlLCBhbmQgZmFpbHMgdGhlIHJ1biBvbmNlIGV4aGF1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgY291bnRlciBvbmx5IGFkdmFuY2VzIG9uIGhvcHMgdGhhdCBlbnF1ZXVlIGEgbmV3IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAqIChzZWUgYHJlaW52b2tlYCkuIEEgcmVkZWxpdmVyeS1iYXNlZCBob3Aga2VlcHMgdGhlIHNhbWUgYm9keVxuICAgICAgICAgICAgICAgICAgICogYW5kIHNvIHRoZSBzYW1lIGNvdW50LCBidXQgaXQgYWxzbyBrZWVwcyBhZHZhbmNpbmdcbiAgICAgICAgICAgICAgICAgICAqIGBtZXRhZGF0YS5hdHRlbXB0YCwgd2hpY2ggdGhlIG1heC1kZWxpdmVyeSBjaGVjayBhdCB0aGUgdG9wXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaGFuZGxlciBhbHJlYWR5IGJvdW5kcywgYW5kIHRoZSBkZWxheSBiZWxvdyBpcyB3aGF0XG4gICAgICAgICAgICAgICAgICAgKiBtYWtlcyB0aGF0IGJ1ZGdldCBzcGFuIHJlYWwgdGltZSByYXRoZXIgdGhhbiBiZWluZyBidXJuZWQgaW5cbiAgICAgICAgICAgICAgICAgICAqIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVua25vd25cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8XG4gICAgICAgICAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHwgeyByZWludm9rZWQ6IGZhbHNlOyBlcnJvcjogRXJyb3IgfVxuICAgICAgICAgICAgICAgICAgPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGVtcHQgPSAocHJlY29uZGl0aW9uUmVpbnZvY2F0aW9ucyA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlaW52b2NhdGlvbnMgPSBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gbWF4UmVpbnZvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIHdhcyByZWplY3RlZCBhcyBzdGFsZSBhZnRlciAke21heFJlaW52b2NhdGlvbnN9IHJlLWludm9jYXRpb25zIG9mICR7Z2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKX0gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydHMgZWFjaDogdGhpcyBydW4gY2Fubm90IG9ic2VydmUgaXRzIG93biBldmVudCBsb2cgY29tcGxldGVseSBlbm91Z2ggdG8gbWFrZSBwcm9ncmVzcy4gTGFzdCByZWplY3Rpb24gKCR7cmVhc29ufSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlIGFmdGVyIGluLXByb2Nlc3MgcmVzdGFydHM7IHJlLWludm9raW5nIHJ1biBmb3IgYSBmcmVzaCByZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWludm9jYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZWludm9jYXRpb25zJzogYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQsIHVubGlrZSB0aGUgb3RoZXIgcmVpbnZva2UoKSBjYWxsZXJzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXN0YXJ0cyBhbHJlYWR5IHJlbG9hZGVkIHRoZSBsb2cgc2V2ZXJhbCB0aW1lc1xuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGNhdGNoaW5nIHVwLCBzbyB0aGUgd3JpdGVycyB0aGlzIHJlcGxheSBpcyByYWNpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZS4gUmV0cnlpbmcgaW5zdGFudGx5IGJ1cm5zIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGJ1ZGdldCBhdCBmdWxsIHNwZWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHJlaW52b2tlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgZ3VhcmQsIHNoYXJlZCBieSB0aGUgdHdvIHBhdGhzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYSBydW46IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbnMgYW5kIGZsb3cgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRGVwbG95bWVudCA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBQaWNrPFxuICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICdydW5JZCcgfCAnZGVwbG95bWVudElkJyB8ICdzcGVjVmVyc2lvbidcbiAgICAgICAgICAgICAgICAgICAgPixcbiAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlUGF5bG9hZDogKCkgPT4gUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdG9wPzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0Y29tZSwgc3BhbkF0dHJpYnV0ZXMgfSA9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50OiBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWVucXVldWU6IGFzeW5jICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH06IFJlZW5xdWV1ZUFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVlbnF1ZXVlUGF5bG9hZCgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRlcGxveW1lbnRJZCwgc3BlY1ZlcnNpb24sIGRlbGF5U2Vjb25kcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkF0dHJpYnV0ZXMpIHNwYW4/LnNldEF0dHJpYnV0ZXMoc3BhbkF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0Y29tZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybjogdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgcHJvZHVjZXIgcGFyYWxsZWxpemVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIHdpdGggdGhpcyBxdWV1ZSBwdWJsaXNoLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGVudGl0eSBtYXkgbm90IGV4aXN0IHlldCB3aGVuIHRoaXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlczogdGhlIGRlbGl2ZXJ5IGJlYXQgdGhlIHdyaXRlLCBvciB0aGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdHJhbnNpZW50bHkgYW5kIHRoaXMgbWVzc2FnZSBjYXJyaWVzIHRoZSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgaW5wdXQuIElkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgbWVzc2FnZSdzIGBzdGVwSW5wdXRgLCBrZXllZCBieSB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb24gaWQsIHNvIHRoZSBwcm9kdWNlcidzIHdyaXRlIGFuZCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZW5zdXJlIGNvbnZlcmdlIG9uIGV4YWN0bHkgb25lIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSW52b2tlZCBmcm9tIHR3byBwbGFjZXM6XG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBJTi1CQU5EICh0aGUgbG9hZC1iZWFyaW5nIHBhdGgpOiB3aGVuIHRoZSBiYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHN0ZXBfc3RhcnRlZGAgYmVsb3cgcmVqZWN0cyB3aXRoIFwic3RlcCBub3QgZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgZXhlY3V0b3IgY2F0Y2ggbWF0ZXJpYWxpemVzIHRoZSBzdGVwIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHJpZXMgb25jZSwgYWxsIHdpdGhpbiB0aGlzIGRlbGl2ZXJ5LiBUaGlzIG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBub3QgcmVseSBvbiBkZWxpdmVyeSBhdHRlbXB0czogd29ybGQtdmVyY2VsJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmYWlsdXJlLXJldHJ5IHBhdGggcmUtZW5xdWV1ZXMgYSBGUkVTSCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGF0dGVtcHQgcmVzZXRzIHRvIDEpLCBzbyBhbiBhdHRlbXB0LWdhdGVkIHJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgdW5yZWFjaGFibGUgb24gdGhlIHJldHJ5IGNoYWluIGFuZCB0aGUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdvdWxkIHN0YWxsIHVudGlsIHRoZSBPUklHSU5BTCBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB+MzAwcyB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkZWxpdmVyeSwgbWVhc3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBleGFjdGx5IHNvIGluIHRoZSBkdXJhYmVuY2ggcGFyYWxsZWwgc3dlZXBzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgcGF0aCBleGlzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vICAtIEVBR0VSTFkgb24gYSBnZW51aW5lIHJlZGVsaXZlcnkgKGF0dGVtcHQgPiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpbiBwYXJhbGxlbCB3aXRoIHRoZSBydW4gZmV0Y2ggYmVsb3csIHNpbmNlIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWRlbGl2ZXJlZCBkaXNwYXRjaCBhbHJlYWR5IGhhZCBpdHMgY3JlYXRlIHJhY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXNvbHZlZCBlaXRoZXIgd2F5LCBzbyB0aGlzIHNhdmVzIHRoZSBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGFydCByb3VuZC10cmlwIGF0IG5vIHdhbGwtdGltZSBjb3N0LiBGaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlbGl2ZXJpZXMgc2tpcCBpdDogdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgYWxtb3N0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgYWx3YXlzIGxhbmRzLCBhbmQgYW4gZWFnZXIgZW5zdXJlIHdvdWxkIGJ1cm4gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbmRpdGlvbmFsIHdyaXRlIHBlciBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICAgICAgJ29rJyB8ICdnb25lJ1xuICAgICAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwSW5wdXQpIHJldHVybiAnb2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZWQgVWludDhBcnJheSBieSBTdGVwRGlzcGF0Y2hJbnB1dFNjaGVtYTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBub24tYmluYXJ5IChtYW5nbGVkKSBwYXlsb2FkIGZhaWxzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBhcnNlIGFib3ZlIGFuZCBuZXZlciByZWFjaGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBzdGVwSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFya3MgdGhpcyBjcmVhdGUgYXMgYSBkaXNwYXRjaCByZS1lbnN1cmUgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZ3VhcmQtZW5mb3JjaW5nIGJhY2tlbmQgY2FuIHJlZnVzZSBpdCB3aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZXIncyB3cml0ZSB3YXMgNDEyLXJlamVjdGVkICh0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHdhcyByZXZva2VkKS4gU3VyZmFjZXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvciDihpIgJ2dvbmUnIGJlbG93LCBhY2tpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLiBXb3JsZHMgd2l0aG91dCB0aGUgZ3VhcmQgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhU3RlcERpc3BhdGNoOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkZWxpdmVyeSBtYXRlcmlhbGl6ZWQgdGhlIHN0ZXAsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW9uIG9mIHRoZSBwcm9kdWNlcidzIHJlY292ZXJ5IHBhdGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlLlN0ZXBSZXNpbGllbnREaXNwYXRjaE1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01hdGVyaWFsaXplZCBzdGVwX2NyZWF0ZWQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSDigJQgdGhlIHByb2R1Y2VyXFx1MjAxOXMgZGlyZWN0IHdyaXRlIGRpZCBub3QgbGFuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21tb24gY2FzZTogdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgKG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCByZS1lbnN1cmUpIGFscmVhZHkgbGFuZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSByZXR1cm4gJ29rJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGV4ZWN1dGU6IHRoZSBydW4gd2VudCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobWF0Y2hlcyB0aGUgcnVuLXN0YXR1cyBjaGVjayBiZWxvdyksIG9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQtZW5mb3JjaW5nIGJhY2tlbmQgcmV2b2tlZCB0aGlzIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICg0MTAgYHN0ZXAtZGlzcGF0Y2gtcmV2b2tlZGAsIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHdhcyA0MTItcmVqZWN0ZWQgYW5kIHRoZSByZXBsYXkgcmVzdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSBjb3JyZWN0ZWQgc2NoZWR1bGUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHJldHVybiAnZ29uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudDogcmV0aHJvdyBzbyB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRlciBhdHRlbXB0IGNvbnZlcmdlcyBpbnN0ZWFkIG9mIGV4ZWN1dGluZyAoYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2luZykgYSBzdGVwIHRoYXQgbWF5IG5vdCBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbYmdSdW4sIGVuc3VyZU91dGNvbWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElucHV0ICYmIG1ldGFkYXRhLmF0dGVtcHQgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gZW5zdXJlU3RlcEZyb21NZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ29rJyBhcyBjb25zdCksXG4gICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3VyZU91dGNvbWUgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGF0dXM6IGJnUnVuLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgcXVldWVkIHN0ZXAgZXhlY3V0aW9uLCBmaXJzdCBkaXNwYXRjaCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJpZXMvcmV0cmllcyBhbGlrZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgZ3VhcmREZXBsb3ltZW50KGJnUnVuLCBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcnJ5IHRoZSByZXN1bWUgdGltaW5nIHZlcmJhdGltIHNvIHRoZSByZS1yb3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9wIHN0YXlzIGluc2lkZSBgc3RlcF9kaXNwYXRjaGAgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFuaXNoaW5nIGZyb20gdGhlIFRUUiBkZWNvbXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va1Jlc3VtZVRpbWluZyA/IHsgaG9va1Jlc3VtZVRpbWluZyB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1N0YXJ0ZWRBdCA9IGJnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyArYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSBjZWlsaW5nIGZvciBhIGJhY2tncm91bmRlZCBzdGVwLiBgbWV0YWRhdGEuYXR0ZW1wdGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50KSBpcyBhIGNoZWFwIHVwcGVyIGJvdW5kLCBidXQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyLWNvdW50czogYSBUaHJvdHRsZUVycm9yIC8gVG9vRWFybHlFcnJvciAob3IgYW55XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSB0aGF0IG5ldmVyIHJhbiB0aGUgYm9keSkgc3RpbGwgYWR2YW5jZXMgaXQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1c3RpbmcgaXQgZGlyZWN0bHkgY291bGQgZmFpbCBhIHN0ZXAgYXMgXCJleGNlZWRlZCBtYXhcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzXCIgYmVmb3JlIHRoZSBib2R5IGV2ZXIgcmFuIChhIHVzZXItdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdW5kZXIgdHJhbnNpZW50IGJhY2tlbmQgcHJlc3N1cmUpLiBVc2UgaXQgb25seVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFzdCBnYXRlOiB3aGlsZSBpdCBpcyBhdCBvciB1bmRlciB0aGUgY2VpbGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGNhbm5vdCBiZSBleGhhdXN0ZWQsIHNvIHByb2NlZWQgd2l0aG91dCB0b3VjaGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cuIE9ubHkgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIGRvIHdlIGxvYWQgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cgYW5kIGRlcml2ZSB0aGUgYXV0aG9yaXRhdGl2ZSBhdHRlbXB0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkZWQgYHN0ZXBfc3RhcnRlZGAgY291bnQsIHNjb3BlZCB0byB0aGUgbGlmZWN5Y2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0b3RhbCAoYmFyZSBzdGFydHMgcGx1cyB0aGUgbGFyZ2VzdCBzaW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcidzIHN0YXJ0cyk6IHRocm90dGxlL3Rvby1lYXJseSByZWRlbGl2ZXJpZXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGFydCBhdCBhbGwsIHJhY2luZyBpbnZvY2F0aW9ucycgb25lLW9mZiBzdGFtcGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlcyBkb24ndCBhY2N1bXVsYXRlIChjb3VudGluZyB0aGVtIGZhbHNlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGhhdXN0ZWQgaGVhbHRoeSBzdGVwcywgc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhdHRlbXB0cyBidXJuZWQgdW5kZXIgYSBwcmlvciBpbmxpbmUtb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2Ugc3RpbGwgY291bnQsIHNvIGEgc3RlcCB0aGF0IHRpbWVzIG91dCB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkIHJlY292ZXJ5IGFuZCB0aGVuIHRyYW5zaXRpb25zIHRvIHF1ZXVlZC9iYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllcyB0cmlwcyB0aGUgY29tYmluZWQgY2VpbGluZy4gVGhpcyBzdGlsbCBib3VuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cywgd2hpY2ggd3JpdGUgbm8gZXJyb3IgZm9yIHRoZSBwb3N0LWJvZHkgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9IG1ldGFkYXRhLmF0dGVtcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdNYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0ZXBGdW5jdGlvbihpbmNvbWluZ1N0ZXBOYW1lKT8ubWF4UmV0cmllcyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gYmdNYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAndG90YWxBdHRlbXB0cycgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUVFI6IHRoaXMgZGVsaXZlcnkgSVMgdGhlIGRpc3BhdGNoZWQgbmV4dCBzdGVwIG9mIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bXB0aW9uLiBDb25zdW1lIHRoZSB0cmFja2luZyBoZXJlIHNvIHRoZSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGhpcyBoYW5kbGVyIG1heSBmYWxsIHRocm91Z2ggdG8gY2Fubm90XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGl0IGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZztcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVuczpcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLWZsaWdodDogYSBkZWxheWVkIGJhY2tzdG9wIChvciByZXRyeSkgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFycml2ZSB3aGlsZSBhbm90aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHNhbWUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbWlkLWJvZHkgaW4gdGhpcyBwcm9jZXNzLCBtb3N0IGltcG9ydGFudGx5IG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCBubyBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBvd25lcnNoaXAgbGVhc2UgaXMgbm90IGEgZGVhdGggcHJvb2YuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50LCB0aGVuIGFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXhlY3V0aW5nLiBObyBvd25lck1lc3NhZ2VJZCBoZXJlOiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIG9mIGEgcXVldWUtZHJpdmVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBjbGVhcnMgaW5saW5lIG93bmVyc2hpcCAodGhlIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlLW93bmVkIGZyb20gdGhpcyBwb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlUXVldWVkU3RlcCA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogYmdTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShiZ1J1bi5hdHRyaWJ1dGVzLCBydW5JZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogYmdSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZzogdGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50IGFzIGEgZmFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdhdGUsIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlY29yZGVkIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyAoc2VlIGFib3ZlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDogYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYmdSZXN1bWVUcmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHJlc3VtZVRyYWNraW5nOiBiZ1Jlc3VtZVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQgPSBhd2FpdCBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWV1ZWRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbi1iYW5kIHJlc2lsaWVudCByZWNvdmVyeTogYSBtaXNzaW5nIHN0ZXAgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RlcElucHV0LWNhcnJ5aW5nIG1lc3NhZ2UgbWVhbnMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb3V0cmFuIChvciBvdXRsaXZlZCBhIHRyYW5zaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBvZikgdGhlIHByb2R1Y2VyJ3MgcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCB3cml0ZS4gTWF0ZXJpYWxpemUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBwYXlsb2FkIGFuZCByZXRyeSBPTkNFLCB3aXRoaW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkuIFNlZSBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UgZm9yIHdoeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW5ub3Qgd2FpdCBmb3IgYSByZWRlbGl2ZXJ5LiBBIHNlY29uZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBwcm9wYWdhdGVzIGFzIGJlZm9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcElucHV0IHx8ICFpc1N0ZXBNaXNzaW5nRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSgpKSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyBhcyBjb25zdCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWV1ZWRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHN0ZXAgaGFkIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzKSwgYnJlYWsgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRVbnRpbCBmbHVzaCB0aGVtLCBzbyBjYW4ndCBjb250aW51ZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdza2lwcGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMgdG8gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnNvci1iYXNlZCBsb2FkaW5nIHNvIHRoZSBtYWluIGxvb3AgY2FuIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IGZyb20gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQobG9hZGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgc3RlcHM6IGFueSBzdGVwX2NyZWF0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtYXRjaGluZyBzdGVwX2NvbXBsZXRlZCBvciBzdGVwX2ZhaWxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwVGVybWluYWxJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBUZXJtaW5hbElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc3RlcENyZWF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwVGVybWluYWxJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwSWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdTdGVwSWRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcGVuZGluZyBzdGVwIHRoYXQgVEhJUyBtZXNzYWdlIGlubGluZS1vd25zIChhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSBzdGFtcGVkIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYW5kIHRoZW4gY3Jhc2hlZCBtaWQtYm9keSkgbXVzdCBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyZWQgaGVyZTogb25seSB0aGUgb3duaW5nIG1lc3NhZ2UgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWV4ZWN1dGUgaXQgYmVmb3JlIHRoZSBvd25lcnNoaXAgbGVhc2UgZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdha2UgcmVwbGF5cyBtZXJlbHkgZW5zdXJlIGEgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcC4gRmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIGxvb3AsIHdob3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRhYmxlIHJvdXRlcyBpdCB0byBvd25lZCByZWNvdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZTsgZmFsbGluZyB0aHJvdWdoIHRvIHJlY292ZXIgYW4gaW5saW5lIHN0ZXAgb3duZWQgYnkgdGhpcyBtZXNzYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWluZzogdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZSB3aWxsIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBkb25lIGFuZCByZXBsYXkgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmUgYnV0IG90aGVyIHN0ZXBzIHBlbmRpbmcsIHJldHVybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc3RlcHMgZG9uZTogZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIHJlcGxheSBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHNoYXJlZCBzdGF0ZSBzbyB0aGUgbG9vcCBjYW4gY29udGludWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmUgYWZ0ZXIgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gbG9hZGVkLmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlJbnB1dDogdW5rbm93bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5DcmVhdGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBydW5DcmVhdGVkRXZlbnQuZXZlbnREYXRhLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FjeVNwZWNWZXJzaW9uKGJnUnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBubyBcInJ1bl9jcmVhdGVkXCIgZXZlbnRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWdhY3kgcnVucyBwcmVkYXRlIHRoZSBldmVudC1zb3VyY2VkIHJ1bl9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFyaWFudCwgc28gcmV0YWluIHRoZSByZXNvbHZlZCBHRVQgb25seSBmb3IgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVnYWN5UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ2FsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVnYWN5UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gbGVnYWN5UnVuLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJnUnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcmVwbGF5SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9IGJnU3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgcHJlLWNoZWNrIGZvciB0aGUgbGF6eSBob29rIGZhc3RcbiAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cuIE5ldyBsYXp5LXJlc3VtZSBtZXNzYWdlcyBjYXJyeSB0aGUgcnVuJ3NcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50IChgaG9va0lucHV0LmRlcGxveW1lbnRJZGApLCBzbyBhXG4gICAgICAgICAgICAgICAgICAvLyBtaXNyb3V0ZWQgZGVsaXZlcnkgaXMgZGV0ZWN0YWJsZSB3aXRoIGEgY2hlYXAgYW1iaWVudFxuICAgICAgICAgICAgICAgICAgLy8gZGVwbG95bWVudC1pZCBjb21wYXJpc29uIEJFRk9SRSB0aGUgZmFzdCBwYXRoJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUsIHNvIHRoZSBjb3JyZWN0bHktcm91dGVkIGNvbW1vbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyBwYXlzIG5vIHJ1biBmZXRjaCBhbmQgbm8gbGF0ZW5jeS4gT25seSBhIGRldGVjdGVkXG4gICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1biBhbmQgaGFuZHMgaXQgdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGlzdGluZyBndWFyZCAod2hpY2ggb3ducyByZS1yb3V0ZS9mYWlsIHBvbGljeSk7XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmUtcm91dGVkIG1lc3NhZ2Uga2VlcHMgdGhlIGNvbXBsZXRlIGBob29rSW5wdXRgLFxuICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgbWF5IGhvbGQgdGhlIG9ubHkgY29weSBvZiB0aGUgcmVzdW1lIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwaW5uZWQgb3IgYW1iaWVudCBpZCBpcyB1bmF2YWlsYWJsZSAob2xkZXJcbiAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyIG1lc3NhZ2UsIGEgd29ybGQgd2l0aG91dCBkZXBsb3ltZW50IGFmZmluaXR5LFxuICAgICAgICAgICAgICAgICAgLy8gb3IgYSBnZXREZXBsb3ltZW50SWQgZmFpbHVyZSksIGJlaGF2aW9yIGlzIHVuY2hhbmdlZDpcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdXRob3JpdGF0aXZlIGd1YXJkIGFmdGVyIHJ1biBzZXR1cCAod2hpY2ggcmVtYWluc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcCBleGVjdXRpb24pIHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhlIGRlbGl2ZXJ5OyB0aGUgZmFzdCBwYXRoJ3Mgd3JpdGUgaXMgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgLy8gcGVyIChydW5JZCwgcmVzdW1lSWQpLCBzbyBhIHByZS1ndWFyZCB3cml0ZSBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAvLyBvbGRlciBtZXNzYWdlIHN0YXlzIGNvbnZlcmdlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQ/LmRlcGxveW1lbnRJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgZWxpZ2liaWxpdHkgYXMgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHk6IHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHMgdGhlIGlkcyBsZWdpdGltYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyIChlLmcuIGRwbF9sb2NhbEA8dmVyc2lvbj4pIGFuZCBjb21wYXJpbmcgdGhlbVxuICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCB0cmlnZ2VyIHNwdXJpb3VzIHJ1biBmZXRjaGVzLlxuICAgICAgICAgICAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXM/LmRlcGxveW1lbnRBZmZpbml0eSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IGhvb2tJbnB1dC5kZXBsb3ltZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkICE9PSBwaW5uZWREZXBsb3ltZW50SWRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3J3YXJkZWQgVU5NT0RJRklFRCAoaW4gcGFydGljdWxhciB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBkZWxpdmVyeSdzIGVudHJ5IHRpbWUpIHNvIHRoZSBtaXNyb3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBob3AgaXMgYXR0cmlidXRlZCB0byBgcXVldWVfZGVsaXZlcnlgIGFuZCBUMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZHMgdXAgYmVpbmcgdGhlIGZpbmFsIGNvbnN1bWVyJ3MgZW50cnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0UnVuUmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBMYXp5IGhvb2sgcmVzdW1lIGZhc3QgcGF0aCAtLS1cbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBob29rIGRlbGl2ZXJ5IChyZXN1bWVJZCArIGRpZ2VzdCBvbiB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UpIGhvaXN0cyB0aGUgY29uc3VtZXIncyBpZGVtcG90ZW50IGhvb2tfcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlLWVuc3VyZSBhYm92ZSBydW5fc3RhcnRlZCBhbmQgYXNrcyB0aGUgV29ybGQgdG8gcmV0dXJuXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCByZXBsYXkgbG9nIHdpdGggdGhlIHdyaXRlIChwcmVsb2FkRXZlbnRzKS4gQVxuICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBXb3JsZCBhbnN3ZXJzIHdpdGggdGhlIHJlY29uc3RydWN0ZWQgcnVuLCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlIHJlcGxheSBsb2csIGFuZCB0aGUgcnVuJ3MgZXZlbnQgY2VpbGluZzpcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgdGhlIGdlbmVyaWMgc2V0dXAgYmVsb3cgd291bGQgc3BlbmQgYVxuICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgUE9TVCBhbmQgYW4gZXZlbnRzLmxpc3Qgb24uIEFueSBvdGhlciByZXN1bHRcbiAgICAgICAgICAgICAgICAgIC8vIChvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVzIHRoZSBwYXJhbSwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZCB0aGF0IGZhaWxzIHZhbGlkYXRpb24sIGluY2x1ZGluZyBhIGJvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGhhc01vcmUgcGFnZSkgZmFsbHMgYmFjayB0byB0aGF0IGdlbmVyaWMgc2V0dXA7IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3cml0ZSBpdHNlbGYgaGFzIHN0aWxsIHN1Y2NlZWRlZCBlaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSwgc28gdGhlIHJlLWVuc3VyZSBibG9jayBiZWxvdyBpcyBza2lwcGVkIHZpYVxuICAgICAgICAgICAgICAgICAgLy8gYGhvb2tFbnN1cmVkYC4gTmV2ZXIgdGFrZW4gb24gdHVyYm8gKHR1cmJvIGRlbGl2ZXJpZXNcbiAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IHJ1bklucHV0LCBub3QgaG9va0lucHV0KSBvciBhZnRlciB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIGFscmVhZHkgbG9hZGVkIHRoZSBydW4uXG4gICAgICAgICAgICAgICAgICBsZXQgaG9va0Vuc3VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtmbG93UnVuICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dCAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucGF5bG9hZERpZ2VzdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9va1Jlc3VtZUlucHV0ID0gaG9va0lucHV0O1xuICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgIC8vIG9jY3VycmVkLCBzYW1lIGRlcml2YXRpb24gYXMgdGhlIHJlLWVuc3VyZSBiZWxvdyAodGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZUlkIGlzIGEgVUxJRCBtaW50ZWQgYnkgcmVzdW1lSG9vaygpIGF0IHJlc3VtZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aW1lKS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZShob29rUmVzdW1lSW5wdXQucmVzdW1lSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50KCd3b3JrZmxvdy5ob29rX3JlY2VpdmVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rX3JlY2VpdmVkLnByZWxvYWRfZXZlbnRzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9va1Jlc3VtZUlucHV0Lmhvb2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tSZXN1bWVJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBob29rUmVzdW1lSW5wdXQucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lSWQ6IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRFdmVudHM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBob29rRW5zdXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdW5saWtlIHRoZSByZS1lbnN1cmUgYmVsb3csIHRoaXMgaG9pc3RlZCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgTk9UIHNldCBIb29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkOiBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgb24gZXZlcnkgZmFzdC1wYXRoIHJlc3VtZSwgaW5jbHVkaW5nIHRoZSBjb21tb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIHdoZXJlIHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZSBhbHJlYWR5IGxhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGNhbGwgbWVyZWx5IGNvbnZlcmdlZCBvbiBpdCwgc28gaXQgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlY292ZXJ5IHNpZ25hbC4gd29ya2Zsb3cucmVzdW1lX3NldHVwX3NvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChiZWxvdykgZGVzY3JpYmVzIHRoaXMgcGF0aCBpbnN0ZWFkLlxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZWxvYWQgaXMgdXNhYmxlIGFzIHJlcGxheSBpbnB1dCBvbmx5IHdoZW4gaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZW1vbnN0cmFibHkgdGhlIGNvbXBsZXRlIHBpY3R1cmU6IGEgcmVjb25zdHJ1Y3RlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgc3RhcnQgdGltZSwgYSBub24tZW1wdHkgQ09NUExFVEUgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGhhc01vcmUgZmFsc2UsIHNpbmNlIHRoaXMgcGF0aCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3ItY29udGludWF0aW9uIG1hY2hpbmVyeSwgc28gYSBib3VuZGVkIHBhZ2UgbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZSB0cnVzdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmVyJ3MgZXZlbnQgY2VpbGluZyAodGhpcyByZXNwb25zZSBwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkJ3Mgcm9sZSwgc28gYSBtaXNzaW5nIGNlaWxpbmcgd291bGQgbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudC1saW1pdCBlbmZvcmNlbWVudCBkaXNhYmxlZCBmb3IgdGhlIHJ1biksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBydW4gbGlmZWN5Y2xlIGV2ZW50cywgdGhlIGNhbm9uaWNhbCBldmVudCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgY29udmVyZ2VkIG9uLCBhbmQgdGhlIGhvb2tfcmVjZWl2ZWQgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUSElTIHJlc3VtZSAoc28gd2UgbmV2ZXIgcmVwbGF5IGFnYWluc3QgYSBsb2cgdGhhdCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgdGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZGVsaXZlcnkpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzYWJsZVJlcGxheVByZWxvYWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1biAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucnVuLnN0YXJ0ZWRBdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jdXJzb3IgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc01vcmUgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0Lm1heEV2ZW50cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXN1bWVJZCA9PT0gaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlUmVwbGF5UHJlbG9hZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bj8uc3RhcnRlZEF0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjb25zdHJ1Y3RlZCBydW4gYWx3YXlzIHJlYWRzICdydW5uaW5nJywgYnV0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50IGNvbW1pdHRlZCBjb25jdXJyZW50bHkgcmlkZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgaXRzZWxmLiBUaGUgbm9kZSByZXBsYXkgbG9vcCB3b3VsZCBjYXRjaCBpdCwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIGRpc3BhdGNoZXMgYmVmb3JlIHRoYXQgY2hlY2ssIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWxpdmVyeSBoZXJlLCBiZWZvcmUgYW55IGVuZ2luZSBydW5zLiBTYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lIGFzIHRoZSBydW5fc3RhcnRlZCBwYXRoJ3Mgbm9uLXJ1bm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXR1cyBjaGVjay5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsRXZlbnQgPSByZXN1bHQuZXZlbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZWxvYWQgc3RpbGwgaW5pdGlhbGl6ZWQgdGhpcyBkZWxpdmVyeSAoaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaG93IHRoZSB0ZXJtaW5hbCBzdGF0ZSB3YXMgb2JzZXJ2ZWQpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAtc291cmNlIGFuZCB0aGUgcnVuJ3MgYWN0dWFsIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXR1cyBhcmUgcmVjb3JkZWQgYmVmb3JlIGNvbnN1bWluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFdmVudC5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGVybWluYWxFdmVudC5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdjYW5jZWxsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfc3RyZWFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBsYXp5IGhvb2sgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGVybWluYWxFdmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTLCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBwbGF5cyBydW5fc3RhcnRlZCdzIHJvbGUgb24gdGhpcyBwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPSAnaG9va19wcmVsb2FkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIHdyaXRlLCBubyB1c2FibGUgcHJlbG9hZCAoQ0JPUiByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbiBvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0LWluLCBhIGJvdW5kZWQgaGFzTW9yZSBwYWdlLCBvciBhIHByZWxvYWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHZhbGlkYXRpb24pOiB0YWtlIHRoZSBnZW5lcmljIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBiZWxvdy4gSXRzIHByZWxvYWQgaXMgbG9hZGVkIGFmdGVyIHRoaXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCwgc28gdGhlIGNhbm9uaWNhbCBob29rX3JlY2VpdmVkIGlzIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHdoYXRldmVyIGxvZyB0aGF0IHNldHVwIHJlYWRzLCBzbyBubyBzcGxpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfZmFsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGNsYXNzaWZpY2F0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcnVuIHdlbnQgdGVybWluYWw7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBjb25zdW1lIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSAoRW50aXR5Q29uZmxpY3QsIGEgdHJ1bmNhdGVkIHByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbSwgdHJhbnNwb3J0IGZhaWx1cmVzKTogdHJhbnNpZW50LiBSZXRocm93IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgdGhlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIChydW5JZCwgcmVzdW1lSWQpIGNsYWltIGNvbnZlcmdlcyBvbiByZXRyeS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gb3IgYnkgdGhlIGxhenkgaG9vayBmYXN0IHBhdGggYWJvdmUuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5OiB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbjogc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cywgc28gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGV2ZW50LWxvZyBwcmVsb2FkLiBUaGF0IHRyaW1zIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgcmVxdWVzdCB0aGUgY2hhaW5lZCBmaXJzdCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRzIG9uIChzaG9ydGVuaW5nIHRpbWUtdG8tc2Vjb25kLXN0ZXApIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhc3RlZCBsaXN0K3Jlc29sdmUgaXQgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCwgc2tpcFByZWxvYWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyID0gc3RhcnRlZFByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gYmFja2dyb3VuZHMgcnVuX3N0YXJ0ZWQsIHNvIHRoZSBub24tdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ25tZW50IGJlbG93IG5ldmVyIHJ1bnMuIFRocmVhZCB0aGUgcGVyLXJ1biBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgb2ZmIHRoZSBiYWNrZ3JvdW5kZWQgcmVzcG9uc2UgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBndWFyZCByZS1jaGVja3MgbWF4RXZlbnRzTGltaXQgZXZlcnkgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiwgc28gYSB2YWx1ZSB0aGF0IGxhbmRzIHNob3J0bHkgYWZ0ZXIgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBlbmZvcmNlcyB3ZWxsIGJlZm9yZSBhIHJ1bmF3YXkgbG9nIGFwcHJvYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2VpbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICB2b2lkIHN0YXJ0ZWRQcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHIubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQpIG1heEV2ZW50c0xpbWl0ID0gbGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBhbiBlYXJseSBmYWlsdXJlIGZyb20gc3VyZmFjaW5nIGFzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmhhbmRsZWRSZWplY3Rpb247IHJ1blJlYWR5QmFycmllciBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdDogbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvZyB5ZXQgb24gYSBmaXJzdCBkZWxpdmVyeSAocnVuX3N0YXJ0ZWQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQpLiBBbiBlbXB0eSBwcmVsb2FkIHJvdXRlcyBpdGVyYXRpb24gMSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vLWxvYWQgcHJlbG9hZGVkIGJyYW5jaDsgaXRlcmF0aW9uIDIgdGhlbiB0YWtlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwb3N0LXByZWxvYWRlZCBmdWxsIHJlbG9hZCB0byBwaWNrIHVwIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBhIHNwdXJpb3VzIFwiY3Vyc29yIG1pc3NpbmdcIiB3YXJuaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cywgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGBydW5TdGFydGVkUmVjZWl2ZWRBdE1zYCBkZWNsYXJhdGlvbiBhYm92ZTpcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBzeW50aGVzaXplcyB0aGUgcnVuIGJlZm9yZSB0aGUgcmVhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZHMsIHNvIGFuY2hvciBSU0ZTIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCBhbiBhY3R1YWwgcmVzcG9uc2UgaW5zdGFudC5cbiAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChydW5TdGFydGVkRXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTLCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgYm90aCB0aGUgcGxhaW4gc2VxdWVudGlhbCByZXN1bWUgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBmYXN0IHBhdGgncyBmYWxsYmFjayAod2hvc2UgaG9pc3RlZCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgbm8gdXNhYmxlIHByZWxvYWQgYW5kIGxlZnQgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2V0LCBzbyBpdCBsYW5kcyBoZXJlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bWVUcmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5zZXR1cFNvdXJjZSA9ICdydW5fc3RhcnRlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXZlbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogWy4uLnJlc3VsdC5ldmVudHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvciA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHJlc3VsdC5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0RXZlbnRMb2dMb2FkKGxvYWRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ubG9hZGVkLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5ydW4uc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmb3IgYGNhbmNlbGAsIHdlIGFjdHVhbGx5IHdhbnQgdG8gcHJvcGFnYXRlIGEgV29ya2Zsb3dDYW5jZWxsZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSB3b3JrZmxvdyBjb250ZXh0IHNvIHRoZSB1c2VyIGNhbiBncmFjZWZ1bGx5IGV4aXQuIHRoaXMgaXMgU0lHVEVSTVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVybW9yZSwgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBvciBhIHdheSB0byBmb3JjZSBjYW5jZWwgU0lHS0lMTFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGFjdHVhbGx5IGV4aXQgaGVyZSB3aXRob3V0IHJlcGxheWluZyB0aGUgd29ya2Zsb3cgYXQgYWxsLCBpbiB0aGUgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBpcyBpdHNlbGYgZmFpbGluZy5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gd2FzIGNvbmN1cnJlbnRseSBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsZWQgZHVyaW5nIHNldHVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3I6IHJ1biBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG4gICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIG11c3QgYmUgbG9hZGVkIGJlZm9yZSByZXBsYXknXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gTmVpdGhlciBzZXR1cCBicmFuY2ggcmFuLCBzbyB0aGUgcnVuIGFycml2ZWQgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgLy8gbG9hZGVkIGFuZCBzZXR1cCB3YXMgYSBwbGFpbiBldmVudCBsb2FkLiBPbmx5IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZC1zdGVwIGZhbGwtdGhyb3VnaCByZWFjaGVzIGhlcmUgd2l0aCBhIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZGVkIHRvZGF5LCBhbmQgaXQgY29uc3VtZXMgdGhlIHRyYWNraW5nIGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gdGhpcyBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgcmF0aGVyIHRoYW4gYSBsaXZlXG4gICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQga2VlcHMgdGhlIGRpbWVuc2lvbiB0b3RhbCBpZiBvbmUgaXMgZXZlciBhZGRlZC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcuc2V0dXBTb3VyY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ2V2ZW50X2xvYWQnO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgZmxvdyByZXBsYXkgKGluaXRpYWwgc3RhcnQsIHN0ZXAgY29tcGxldGlvbnMsXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHJlc3VtcHRpb25zLCB3YWl0IGNvbXBsZXRpb25zKSBhbmQgc3RvcHMgYmVmb3JlIGFueVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSBvciBpbmxpbmUgc3RlcCBleGVjdXRlcyB3aGVuIHRoZSBydW4gaXMgbm90XG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgaGVyZSAoc2VlIGBndWFyZERlcGxveW1lbnRBZmZpbml0eWApLiBUaGlzIHJlbWFpbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBBVVRIT1JJVEFUSVZFIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBgYXdhaXRSdW5SZWFkeWAgb3JkZXJzIHR1cmJvJ3MgYHJ1bl9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGVpdGhlciBzdG9wcGluZyBhY3Rpb24uXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBob29rIHJlc3VtZXMgYXJlIGFkZGl0aW9uYWxseSBwcmUtY2hlY2tlZCBhYm92ZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGZhc3QgcGF0aDogYSBuZXcgbWVzc2FnZSdzIGBob29rSW5wdXQuZGVwbG95bWVudElkYCBpc1xuICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZWQgYWdhaW5zdCB0aGUgYW1iaWVudCBkZXBsb3ltZW50IGlkIGZvciBmcmVlLCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYSBkZXRlY3RlZCBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1bixcbiAgICAgICAgICAgICAgICAgIC8vIHNvIGEgbWlzcm91dGVkIG1vZGVybiByZXN1bWUgcmUtcm91dGVzIHdpdGggemVybyBldmVudFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzLiBPbGRlciBtZXNzYWdlcyAobm8gYGhvb2tJbnB1dC5kZXBsb3ltZW50SWRgKSByZWFjaFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZhc3QgcGF0aCdzIGlkZW1wb3RlbnQgaG9va19yZWNlaXZlZCB3cml0ZSBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQ7IHRoYXQgd3JpdGUgY29udmVyZ2VzIHBlciAocnVuSWQsIHJlc3VtZUlkKSBvbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50LCBzbyBpdCBpcyBzYWZlIGJ1dCBpbmN1cnMgdGhlIHdyaXRlLiBFaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgcmUtcm91dGVkIG1lc3NhZ2UgbXVzdCBjYXJyeSBgaG9va0lucHV0YCwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHdob3NlIHByb2R1Y2VyIHdyaXRlIGhhZCBub3QgeWV0IGxhbmRlZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgLy8gbG9zdC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va0lucHV0ID8geyBob29rSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgcHJlLWNoZWNrIHJlLXJvdXRlIGFib3ZlOiBmb3J3YXJkZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVkLCBzbyB0aGUgZXh0cmEgaG9wIGlzIHF1ZXVlIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBMYXp5IGhvb2sgcmVzdW1lOiB0aGUgcHJvZHVjZXIgKHJlc3VtZUhvb2sgZmFzdCBwYXRoKVxuICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgd2l0aCB0aGlzIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaXNoLCBzbyB0aGUgZXZlbnQgbWF5IG5vdCBiZSBwZXJzaXN0ZWQgeWV0LiBJZGVtcG90ZW50bHlcbiAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCBiZWZvcmUgcmVwbGF5LCBrZXllZCBieSBgcmVzdW1lSWRgIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcHJvZHVjZXIgd3JpdGUgY29udmVyZ2VzIG9uIGV4YWN0bHkgb25lIGV2ZW50XG4gICAgICAgICAgICAgICAgICAvLyAodGhlIHNlcnZlciByZXNvbHZlcyBhIG1hdGNoaW5nIGNsYWltIGFzIHN1Y2Nlc3MsIG5vdCBhblxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IpLiBgaG9va0lucHV0YCBuZXZlciByaWRlcyBhIHR1cmJvIGZpcnN0LWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyAodGhhdCBwYXRoIGNhcnJpZXMgYHJ1bklucHV0YCwgbm90IGBob29rSW5wdXRgKSwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gb25seSBydW5zIG9uIHRoZSBub3JtYWwgbG9hZC1hbmQtcmVwbGF5IHBhdGguIFNraXBwZWRcbiAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHdoZW4gdGhlIGZhc3QgcGF0aCBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBldmVudCAoYGhvb2tFbnN1cmVkYCksIHN1Y2Nlc3NmdWxseSBvciB2aWEgaXRzIGZhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgcnVuX3N0YXJ0ZWQgcHJlbG9hZCB3YXMgbG9hZGVkIGFmdGVyIHRoZSB3cml0ZSBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoaG9va0lucHV0ICYmICFob29rRW5zdXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZXJmIChPcHRpb24gQSk6IGlmIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFscmVhZHkgbGFuZGVkIGluIHRoZSBydW5fc3RhcnRlZCBwcmVsb2FkLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIGV2ZW50IGlzIGluIHRoZSBsb2cgYW5kIHRoZSByZS1lbnN1cmUgcm91bmQgdHJpcFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBwdXJlIG92ZXJoZWFkLiBTa2lwIGl0IHdoZW4gdGhlIHByZWxvYWQgYWxyZWFkeSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgYGhvb2tfcmVjZWl2ZWRgIHdpdGggdGhpcyByZXN1bWUncyBwZXJzaXN0ZWQgYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAvLyAodW5pcXVlIHBlciByZXN1bWUsIHNvIHdlIG5ldmVyIHNraXAgb24gYW4gdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQpLiBCZXN0LWVmZm9ydDogdGhlIHdpbiBsYW5kcyBvbmx5IHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyJ3Mgd3JpdGUgYmVhdCB0aGlzIGNvbnN1bWVyJ3MgbG9hZDsgb3RoZXJ3aXNlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgaWRlbXBvdGVudCByZS1lbnN1cmUgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdW5yZWFjaGFibGUgZm9yIGF0b21pYyBsYXp5IHJlc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHJlc3VtZUlkICsgZGlnZXN0KTogdGhvc2Ugc2V0IGBob29rRW5zdXJlZGAgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgZmFzdCBwYXRoIGFib3ZlIChvbiBzdWNjZXNzIEFORCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2spLCBzbyB0aGlzIGJsb2NrIChhbmQgdGhlIHNraXAgY2hlY2spIG5vdyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcyBob29rSW5wdXQgc2hhcGVzIHdpdGhvdXQgdGhlIGZ1bGwgaWRlbXBvdGVuY3lcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVByZWxvYWRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nOiBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgbGVhdmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkLCBzbyB0aGUgV29ybGQgZmFsbHMgYmFjayB0byBgY3JlYXRlZEF0YC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJyZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShkZWNvZGVUaW1lKGhvb2tJbnB1dC5yZXN1bWVJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5zdXJlZEV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0lucHV0LnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va0lucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDogaG9va0lucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lci1zaWRlIGNvbXBsZXRpb24gb2YgdGhlIHJlY292ZXJ5IHBhdGg6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBtYXRlcmlhbGl6ZWQgdGhlIGV2ZW50IGJlY2F1c2UgdGhlIHByb2R1Y2VyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCB3cml0ZSBoYWQgbm90IGxhbmRlZCBpbiB0aGUgcHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBldmVudCAod2hldGhlciB0aGlzIGNhbGwgY29tbWl0dGVkIGl0IG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJnZWQgb24gdGhlIHByb2R1Y2VyJ3MgY29uY3VycmVudCB3cml0ZSksIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIGFuZCwgd29yc2UsIHdvdWxkIGFjayBhIGRlbGl2ZXJ5IHRoYXQgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNhcnJ5IHRoZSBvbmx5IGNvcHkgb2YgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEVudGl0eUNvbmZsaWN0IChhbmQgYW55IG90aGVyIHVuZXhwZWN0ZWQgZXJyb3IpOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmVzdW1lSWQgY29uc3RyYWludCBleGlzdHMgYnV0IHRoZSBtYXRjaGluZyBldmVudCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBub3QgeWV0IG9ic2VydmFibGU6IHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIHdyaXRlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0aWxsIGluIGZsaWdodCwgb3IgYSByZWRyaXZlIHJhY2VkIHRoZSBjbGFpbS4gVGhpcyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0cmFuc2llbnQ6IHJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgYXR0ZW1wdCBjb252ZXJnZXMgb24gdGhlIGNvbW1pdHRlZCBldmVudCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlcGxheWluZyAoYW5kIGFja2luZykgd2l0aG91dCB0aGUgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlIHByZWxvYWRlZCB0aGUgbG9nIEJFRk9SRSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlLCBzbyBpdCBjYW5ub3QgaW5jbHVkZSB0aGUgaG9va19yZWNlaXZlZC4gUmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBkaXNjYXJkIHRoZSBwcmVsb2FkICh3aGljaCB3b3VsZCBjb3N0IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZCB0cmlwIG9uIHRoZSBmaXJzdCByZXBsYXkgaXRlcmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaW4gdGhlIGNhbm9uaWNhbCBldmVudCByZWNvbnN0cnVjdGVkIGFib3ZlLiBJdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYSBzdGFibGUgZXZlbnRJZCwgc28gYGluc2VydEV2ZW50QnlFdmVudElkYCBrZWVwc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluIGFzY2VuZGluZyBldmVudElkIG9yZGVyIGFuZCBpcyBpZGVtcG90ZW50IGlmIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5IHdoZW4gdGhlIFdvcmxkIHJldHVybnMgbm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB3ZSBmYWxsIGJhY2sgdG8gcmVsb2FkaW5nIHRoZSBjb21wbGV0ZSBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJyAmJiBlbnN1cmVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEV2ZW50QnlFdmVudElkKGV2ZW50TG9nLmV2ZW50cywgZW5zdXJlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAocmUtZW5zdXJlIG5lZWRlZClcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggd29ya2Zsb3cgZXhlY3V0aW9uIChpbnB1dFxuICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0aW9uIC8gaG9vayBwYXlsb2FkIGRlY3J5cHRpb24pIGFuZCB0aGUgcnVuX2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgLy8gZGVoeWRyYXRlIHBhdGggYmVsb3cgbmVlZCBpdC4gTWVtb2l6ZWQgYWNjZXNzb3I6IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBjYWxsIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgVk0taW5kZXBlbmRlbnQgcHJlcGFyZWQgcGF5bG9hZHNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbW11dGFibGUgZmluYWwgdmFsdWVzLiBJdCBzdXJ2aXZlcyB0aGUgZnJlc2ggd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgIC8vIFZNIGNyZWF0ZWQgYnkgZWFjaCBpbmxpbmUgcmVwbGF5LCBidXQgbmV2ZXIgY3Jvc3NlcyBydW5zIG9yXG4gICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpdmUgVk0gcGFya2VkIGF0IHRoZSBwcmV2aW91cyBib3VuZGFyeSwgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHJldGVudGlvbiBkZWNpc2lvbiBrZXB0IGl0LiBudWxsIOKGkiB0aGlzIGl0ZXJhdGlvbiBjb2xkLVxuICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cy4gSW52b2NhdGlvbi1zY29wZWQ6IGRpZXMgd2l0aCB0aGlzIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgbGV0IHJldGFpbmVkU2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE1haW4gcmVwbGF5IGxvb3BcbiAgICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL25vQ29uc3RhbnRDb25kaXRpb246IGludGVudGlvbmFsIGxvb3BcbiAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24rKztcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXktYnVkZ2V0IGNoZWNrOiBiYWlsIG91dCAocmV0cnkgb3IgZmFpbCkgaWZcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN0ZXAgdGltZSB3aXRoaW4gdGhpcyBpbnZvY2F0aW9uIGhhcyBleGNlZWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZmlndXJlZCBidWRnZXQuIFN0ZXAgYm9kaWVzIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHJlcGxheUJ1ZGdldC5wYXVzZSgpL3Jlc3VtZSgpIGJyYWNrZXQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gYGV4ZWN1dGVTdGVwYCBjYWxsLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGF5QnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRNczogcmVwbGF5QnVkZ2V0LmNvbmZpZ3VyZWRMaW1pdE1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvdFNuYXBzaG90OiBzbG90U25hcHNob3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHRoZSB0ZXJtaW5hbCBhdHRlbXB0IHJldHVybnMsIGFmdGVyIHJ1bl9mYWlsZWQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlLiBFYXJsaWVyIGF0dGVtcHRzIHJlamVjdCBmb3IgcXVldWUgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aW1lb3V0IGJlZm9yZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lID49XG4gICAgICAgICAgICAgICAgICAgICAgbm9JbmxpbmVSZXBsYXlBZnRlck1zXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdWMiB0aW1lb3V0IHJlYWNoZWQsIHJlLXNjaGVkdWxpbmcgd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIHBhc3Mgd2FzIHNlcnZlZCBieSBhIHJldGFpbmVkIFZNIHNlc3Npb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBhdCB0aGUgcmVzdW1lL3JlcGxheSBkZWNpc2lvbiBiZWxvdywgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgIC8vIGByZXRhaW5lZFNlc3Npb25gIGlzIHJlYXNzaWduZWQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlcnZlZEJ5UmV0YWluZWRTZXNzaW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLS0tIFF1aWNrSlMgVk0gZW5naW5lIGRpc3BhdGNoIC0tLVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBRdWlja0pTIGVuZ2luZSAob3B0LWluIHZpYSBXT1JLRkxPV19WTT1xdWlja2pzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd1ZtKSBpcyBhIHNlbGYtY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdG8gdGhlIG5vZGU6dm0gaW5saW5lLXJlcGxheSBsb2dpY1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheSwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgd29ya2Zsb3cgY29kZSBpbiBhIFF1aWNrSlMgV0FTTSBWTSwgcXVldWVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgdmlhIHRoZSBzYW1lIGNvbWJpbmVkIHJvdXRlIChzbyB0aGV5IGhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwIGJlbG93IG9uIHJlLWVudHJ5KSwgYW5kIG1hbmFnZXMgaXRzIG93blxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkIGxpZmVjeWNsZSBmb3Igd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lcy4gV2hlbiB0aGUgUXVpY2tKUyBlbmdpbmUgaXMgaW4gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBJTlNJREUgdGhpcyB0cnk6IGVuZ2luZSBmYWlsdXJlcyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlIHRoZSBlbnRyeXBvaW50IChNYXhFdmVudHNFeGNlZWRlZEVycm9yLCBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV0FTTSBPT00gYXQgdGhlIG1lbW9yeSBjZWlsaW5nLCBhIGJ1bmRsZS1ldmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSkgbXVzdCByZWFjaCB0aGlzIGxvb3AncyBjYXRjaCBzbyB0aGV5IGFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzaWZpZWQgYW5kIHJlY29yZGVkIGFzIHJ1bl9mYWlsZWQ6IG91dHNpZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRoZXkgd291bGQgbmFjayB0aGUgbWVzc2FnZSBhbmQgYnVybiBhbGwgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJpZXMgYmVmb3JlIGR5aW5nIGFzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTUFYX0RFTElWRVJJRVNfRVhDRUVERUQuIFRyYW5zaWVudCB3b3JsZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZXRocm93IG91dCBvZiB0aGUgY2F0Y2ggZm9yIHJlZGVsaXZlcnksIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBub2RlLWVuZ2luZSByZXBsYXkgZmFpbHVyZXMuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVF1aWNrSlNWbSh3b3JrZmxvd1J1bikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1VzaW5nIFF1aWNrSlMgVk0gZW5naW5lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5kZXIgdHVyYm8sIHJ1bl9zdGFydGVkIGlzIGJhY2tncm91bmRlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIGVudHJ5cG9pbnQgZmV0Y2hlcyB0aGUgZXZlbnQgbG9nIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGV2ZW50cyBkaXJlY3RseSwgc28gd2FpdCBmb3IgdGhlIHJ1biB0byBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJseSBzdGFydGVkIGZpcnN0OiBpdCBkb2VzIG5vdCB0aHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBydW5SZWFkeUJhcnJpZXIgdGhlIHdheSBoYW5kbGVTdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCwgZXZlbnRMb2cuY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW1wb3J0OiB0aGUgUXVpY2tKUyBlbnRyeXBvaW50J3MgaW1wb3J0IGNoYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZHMgdGhlIGJhc2U2NCBXQVNNIGJpbmFyeSArIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh+MS4zIE1CIGRlY29kZWQgYXQgbW9kdWxlIHNjb3BlKS4gTG9hZGluZyBpdCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGF0IG91dCBvZiBub2RlLWVuZ2luZSBkZXBsb3ltZW50cyBlbnRpcmVseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9ubHkgdGhlIG9wdC1pbiBwYXRoIHBheXMsIG9uIGZpcnN0IGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBydW5Xb3JrZmxvd1dpdGhRdWlja0pTIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcuL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LmpzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1aWNranNSZXN1bHQgPSBhd2FpdCBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZTogZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNwYW46IHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldHMgdGhlIGVudHJ5cG9pbnQgcmVjb2duaXplIGl0c2VsZiBhcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIGZvciBhIHNwZWNpZmljIHdhaXQsIHNvIGEgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcnJpdmVzIGJlZm9yZSBpdHMgd2FpdCBlbGFwc2VzIHJlLWFybXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBmcmVzaCBrZXkgaW5zdGVhZCBvZiBsb3NpbmcgdGhlIHRpbWVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Q29udGludWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtc3RlcCBvd25lcnNoaXAgcGx1bWJpbmc6IHJlZGVsaXZlcmllcyBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lc3NhZ2UgZHJpdmUgY3Jhc2ggcmVjb3ZlcnkgZm9yIHN0ZXBzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcmxpZXIgaW52b2NhdGlvbiBjbGFpbWVkIGlubGluZSAoc2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcCBwYXNzIGluIHRoZSBlbnRyeXBvaW50J3MgbG9vcCksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBpZCBpcyBzdGFtcGVkIGFzIGBvd25lck1lc3NhZ2VJZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5saW5lIGxhenkgc3RlcCBjbGFpbXMgc28gd2FrZSByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIHRoZSBpbi1mbGlnaHQgYm9keSBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVldWVpbmcgdGhlIHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpY2tqc1Jlc3VsdD8udGltZW91dFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYHJlaW52b2tlYCByYXRoZXIgdGhhbiByZXR1cm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAgZGlyZWN0bHk6IHVuZGVyIHR1cmJvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIG9uIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHJlcGxheWluZyBhZ2FpbnN0IGEgc3RhbGUgcHJlbG9hZGVkIGxvZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VkZ2luZyB0aGUgcnVuLCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSkuIHJlaW52b2tlIGVucXVldWVzIGFuIGV4cGxpY2l0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiB3aXRob3V0IGBydW5JbnB1dGAgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UocXVpY2tqc1Jlc3VsdC50aW1lb3V0U2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5wYWdlLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQoZXZlbnRMb2cuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudExvZy5ldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY3JlYXRlRXZlbnQod2FpdEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVtcC1hbmQtcmVwb3J0OiBmb2xkIHdoYXQgdGhpcyB3cml0ZSBza2lwcGVkIG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgbG9nLCB3aGljaCBpcyB3aGF0IGBjcmVhdGVFdmVudGAgcmVhZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3Qgc25hcHNob3Qgb2ZmLCBzbyBlYWNoIHJlbWFpbmluZyB3YWl0IGFza3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc2xvdCBhYm92ZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRydW5jYXRlZCBjYXNlIG1hdHRlcnMgdHdpY2Ugb3ZlciBoZXJlLiBCZXlvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGFjY291bnRpbmcgYGFic29yYlNraXBwZWRTbG90UmVwb3J0YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3RzIGl0IGZvciwgdGhlIG1pc3NpbmctY29tcGxldGlvbiBjaGVjayBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNpZGVzIGZyb20gdGhpcyBsb2cgd2hldGhlciB0aGUgaGFuZGxlciBzdGlsbCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZmV0Y2gsIHNvIGEgcGFydGlhbCBwYWdlIHdvdWxkIG1ha2UgdGhlIGxvZyBsb29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2UgaXQgaG9sZHMgYSBjb21wbGV0aW9uIHdob3NlIHBhZ2UgaXMgdW5yZWFkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBmZXRjaCBvbiBhIHNuYXBzaG90IHNob3J0IG9mIHRoZSBXb3JsZCdzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChldmVudExvZy5ldmVudHMsIGNyZWF0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FpdCBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCBpcyBjb21taXR0ZWQsIGFuZCB0aGlzIHJlcGxheSBoYXMgdG8gc2VlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biB3YWl0X2NvbXBsZXRlZCBiZWZvcmUgaXQgY2FuIGFkdmFuY2UgcGFzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcC4gRWFjaCB3cml0ZSBhc2tlZCB0aGUgV29ybGQgZm9yIHRoZSBkZWx0YSBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG91ciBjdXJzb3IgYW5kIGZvbGRlZCBpdCBpbiAoc2VlIGNyZWF0ZUV2ZW50KSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgaGFzIGFscmVhZHkgaGFuZGVkIHRob3NlIGV2ZW50cyBiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkby4gT25seSBmZXRjaCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGlvbnMgc3RpbGwgbWlzc2luZyBsb2NhbGx5OiBhIFdvcmxkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVzIGBzaW5jZUN1cnNvcmAsIGEgdHJ1bmNhdGVkIGRlbHRhLCBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhYnNvcmIgdGhhdCBsb3N0IHRoZSBjdXJzb3IgcmFjZSwgb3IgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aG9zZSByZWplY3Rpb24gY2FycmllcyBubyBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW5nV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdXYWl0Q29tcGxldGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBvbmx5IGV2ZW50cyBhZnRlciB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBjb25jdXJyZW50IGR1cmFibGUgZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZWlyIG9yZGVyaW5nIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGEgZnVsbCByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSB1cyBhIHN0YWJsZSBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGluY2x1ZGUgdGhlIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLmN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nV2FpdENvbXBsZXRpb25zLmV2ZXJ5KCh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhd0FsbFdhaXRDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYXMgaGFwcGVuZWQsIHNvIGEgcG9zaXRpb24gbm90aGluZyBvY2N1cGllcyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gZXZlbnQgdGhhdCBuZXZlciBvY2N1cnJlZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2F5LiBGYWlsaW5nIGhlcmUgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHJ1biB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0cyBpdHMgb3duIGNvcnJ1cHRpb24gYW5kIG9uZSB0aGF0IHNpbGVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgd3JvbmcgYW5zd2VyLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBob2xlIHRoYXQgaXMgbWVyZWx5IGEgd3JpdGUgbWlkLWNvbW1pdCBmaWxscyBpbiBvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24sIHNvIHNldHRsZUV2ZW50U2xvdEdhcCByZS1yZWFkcyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jbHVkaW5nLCBhbmQgYWRvcHRzIHdoaWNoZXZlciBsb2cgaXQgc2V0dGxlZCBvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTbG90R2FwQ2hlY2tFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBzZXR0bGVFdmVudFNsb3RHYXAocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uc2V0dGxlZC5sb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0bGVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBsb2cgZm9yIHJ1biAke3J1bklkfSBoYXMgYSBob2xlIGF0IHNsb3QgJHtzZXR0bGVkLmdhcC5maXJzdE1pc3NpbmdTbG90fTogJHtzZXR0bGVkLmdhcC5taXNzaW5nQ291bnR9IG9mIHRoZSAke3NldHRsZWQuZ2FwLm1heFNsb3R9IHNsb3RzIHVwIHRvIHRoZSBsb2cncyBtYXhpbXVtIGhvbGQgbm8gZXZlbnQuYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRpbmcgZWxhcHNlZCB3YWl0cyByZWZyZXNoZXMgdGhlIGV2ZW50IHNuYXBzaG90LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIG1heSBoYXZlIHdyaXR0ZW4gdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGFmdGVyIHRoZSBpbml0aWFsIHNuYXBzaG90IGJ1dCBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gT25jZSB0aGUgZXZlbnQgbG9nIHJlY29yZHMgdGhhdCBvdXRjb21lLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgaXMgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50TG9nLmV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2dcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVzIHRoZSBzZXJ2ZXItc3VwcGxpZWQgY2VpbGluZyAodW5kZWZpbmVkIOKHkiBub1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZm9yY2VtZW50KS4gVGhlIHRocm93IGlzIGNhdWdodCBiZWxvdyBhbmQgd3JpdHRlbiBhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9mYWlsZWQgLyBNQVhfRVZFTlRTX0VYQ0VFREVELlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlYWxlZC1sb2cgbm9vcHMgYXJlIGV4Y2x1ZGVkOiB0aGUgY2VpbGluZyBleGlzdHMgdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIGEgcnVuYXdheSBXT1JLRkxPVywgYW5kIGEgbm9vcCBpcyB3cml0dGVuIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgdG8gc2VhbCBhIHBvc2l0aW9uIHdob3NlIHdyaXRlciBkaWVkLiBDb3VudGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gd291bGQgc3BlbmQgdGhlIHVzZXIncyBldmVudCBidWRnZXQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCdzIGJvb2trZWVwaW5nLCBhbmQgd291bGQgbWFrZSB0aGUgbGltaXQgYSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoaXRzIGRlcGVuZCBvbiBob3cgbXVjaCB3cml0ZSBjb250ZW50aW9uIGl0IGhhcHBlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZmxvd0V2ZW50Q291bnQgPSBldmVudExvZy5ldmVudHMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAobiwgZSkgPT4gKGlzU2VhbGVkTm9vcEV2ZW50KGUpID8gbiA6IG4gKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd0V2ZW50Q291bnQgPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dFdmVudENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGp1ZGdlIFRURlMgZWxpZ2liaWxpdHkgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgZmlyc3Qgc25hcHNob3QuIFdhaXRzIGNvbXBsZXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGFscmVhZHkgZGlzcXVhbGlmeSB2aWEgdGhlIGV2ZW50LXR5cGUgY2hlY2ssIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGluZyBhZnRlciB0aGUgd2FpdCBwYXNzIGlzIGVxdWl2YWxlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBwcmUtc3RlcCBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdWJ0cmFjdGVkIHZpYSBwcmVTdGVwQXR0clN0YXJ0TXMgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm9vcCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiBhdHRyX3NldCBpczogaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgZXZpZGVuY2UgdGhlIHJ1biBoYWQgYWxyZWFkeSBtYWRlIHByb2dyZXNzLiBBXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2VhbCBzYXlzIGEgY29uY3VycmVudCB3cml0ZXIgZGllZCwgd2hpY2ggc2F5cyBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdXQgdGhpcyBpbnZvY2F0aW9uLCBhbmQgZXhjbHVkaW5nIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBldmVyeSBjb250ZW5kZWQgcnVuIG91dCBvZiB0aGUgVFRGUyBkYXRhc2V0IC0tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhhY3RseSB0aGUgcnVucyB3b3J0aCBtZWFzdXJpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA/Pz0gZXZlbnRMb2cuZXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VhbGVkTm9vcEV2ZW50KGUpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHdvcmtmbG93IGV4ZWN1dGlvbicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50TG9nLmV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Nb2RlOiByZXRhaW5lZFNlc3Npb24gPyAncmV0YWluZWQnIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRUUiBUMy4gYD8/PWAgc28gaXQgbWFya3MgdGhlIEZJUlNUIHJlcGxheSBwYXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbnZvY2F0aW9uOiBhIHJlc3VtZSB0aGF0IG5lZWRzIG1vcmUgdGhhbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRvIHJlYWNoIGl0cyBzdGVwIChlLmcuIGEgcHJlLXN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc2V0QXR0cmlidXRlc2AgZGV0b3VyKSByZXBvcnRzIHRoZSBleHRyYSBwYXNzZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYHJlcGxheWAsIGtlZXBpbmcgdGhlIHBoYXNlcyBhZGRpdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnJlcGxheVN0YXJ0ZWRBdE1zID8/PSByZXBsYXlTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIHVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgKGFscmVhZHktcHJlcGFyZWQgcGF5bG9hZHMgYXJlIHNraXBwZWQpLiBXZWJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDcnlwdG8gd29yayBvdmVybGFwcyBWTSBzZXR1cCBvbiB0aGUgcmVwbGF5IHBhdGggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcGVuZGVkIGV2ZW50cycgY29uc3VtcHRpb24gb24gdGhlIHJlc3VtZSBwYXRoO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWVycyBzdGlsbCBkZXNlcmlhbGl6ZSBhbmQgcmVzb2x2ZSBpbiBldmVudCBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkUHJld2FybSA9IHJlcGxheVBheWxvYWRDYWNoZS5wcmV3YXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1Jlc3VsdDogV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgcmVzdW1lV29ya2Zsb3cocmV0YWluZWRTZXNzaW9uLCBldmVudExvZy5ldmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJldGFpbmVkIHJlc3VtZSBjYW4gc3RpbGwgcmVwb3J0IGJhY2sgYHsgdHlwZTpcbiAgICAgICAgICAgICAgICAgICAgICAvLyAncmVwbGF5JyB9YCAoaW50ZXJuYWwgY2FjaGUgbWlzcyksIGluIHdoaWNoIGNhc2UgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgZmFsbHMgdGhyb3VnaCB0byBhIGZ1bGwgcmVwbGF5IGJlbG93IGFuZCBpcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJldGFpbmVkIHBhc3MuIFRoZSBgd29ya2Zsb3cucnVuYCBzcGFuIGNhbm5vdCBzYXlcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzOiBpdCBpcyB0YWdnZWQgYHJldGFpbmVkYCB3aGVuIGl0IG9wZW5zLCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdW1lIHJlc3VsdCBpcyBrbm93bi5cbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZWRCeVJldGFpbmVkU2Vzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UmVzdWx0LnR5cGUgIT09ICdyZXBsYXknO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UmVzdWx0LnR5cGUgPT09ICdyZXBsYXknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSZXN1bHQgPSBhd2FpdCByZXBsYXlXb3JrZmxvdyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiB0aGUgZW5kLW9mLXJ1biBkcmFpbiBpbnNpZGUgd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uIGNvbW1pdHMgZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyBiZWZvcmUgdGhlIHRlcm1pbmFsIGBhd2FpdFJ1blJlYWR5KClgIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGF5bG9hZFByZXdhcm07XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcmsgdGhlIGxpdmUgc2Vzc2lvbjsgdGhlIHN1c3BlbnNpb24gY2F0Y2ggYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIHRoZSBvbmUgcmV0ZW50aW9uIGRlY2lzaW9uOiBrZWVwIGl0IGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9yIGRpc2NhcmQgaXQgZm9yIGEgZnJlc2ggcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gd29ya2Zsb3dSZXN1bHQuc2Vzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHdvcmtmbG93UmVzdWx0LnN1c3BlbnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gd29ya2Zsb3dSZXN1bHQub3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTW9kZTogcmV0YWluZWRTZXNzaW9uID8gJ3JldGFpbmVkJyA6ICdyZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZC4gRG8gTk9UIHJlbG9hZC1hbmQtcmV0cnkgdGhlIGNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHBsYWNlOiBgcmVzdWx0YCB3YXMgY29tcHV0ZWQgYnkgdGhpcyByZXBsYXksIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFsZSAoNDEyKSByZWplY3Rpb24gbXVzdCBmb3JjZSBhICpmcmVzaCByZXBsYXkqICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBvYnNlcnZlIHRoZSBuZXcgZXZlbnQgYW5kIHByb2R1Y2UgYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQpLCBub3QgcmUtY29tbWl0IHRoZSBzdGFsZSByZXN1bHQuIFRoZSBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRzIHRoZSByZXBsYXkgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgd29ya2Zsb3ctZXhlY3V0aW9uIGR1cmF0aW9uIGZvciBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIG9ubHk6IGFuY2hvcnMgdGhlIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgZmllbGQgYmVsb3cgKHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcykuIFRoaXMgaXMgdGhlIEZJTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcGFzcywgdGhlIG9uZSB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXA6IHZhbGlkIHJzZnMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXMoKWAgZGV0b3VyIHJlcGxheXMgdHdpY2UpLCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkuIFRoaXMgdmFsdWUgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgZWFybGllciBwYXNzZXMsIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGhlIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIjogcnNmcyBjb3ZlcnMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIHdpbmRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBjb3ZlcnMgb25seSB0aGlzIGxhc3QgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmVkIGhlcmUsIGJlZm9yZSBgaGFuZGxlU3VzcGVuc2lvbmAncyBhd2FpdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJL08sIHNvIGl0IGV4Y2x1ZGVzIHRoYXQgSS9PLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi9pbnZvY2F0aW9uIHNwYW4sIGJ1dCBpcyBjb2xsZWN0ZWQgYXMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlciBjYW4gZW1pdCBpdCBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH43JSksIGFuZCBjbGllbnQgc3BhbnMgY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi4gT24gYSByZXRhaW5lZC1WTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHRoaXMgbWVhc3VyZXMgdGhlIHJlc3VtZSAodHlwaWNhbGx5IH4wbXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgcmVwbGF5LCBzbyB0aGUgZmllbGQncyBkaXN0cmlidXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbW9kYWwgb25jZSByZXRlbnRpb24gaXMgYWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuZGVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlEdXJhdGlvbk1zID0gc3VzcGVuZGVkQXRNcyAtIHJlcGxheVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIFQ0OiB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgaGFzIGJlZW4gZW5jb3VudGVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHYXRlZCBvbiB0aGUgc3VzcGVuc2lvbiBhY3R1YWxseSBzY2hlZHVsaW5nIHN0ZXBzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdXNwZW5zaW9uIHRoYXQgb25seSBjcmVhdGVzIGhvb2tzL3dhaXRzIGhhcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZWQgYSBzdGVwLCBhbmQgYSBsYXRlciBwYXNzIG1heS4gVGFrZW4gZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgaW5zdGFudCBhcyBgcmVwbGF5RHVyYXRpb25Nc2Agc28gVDQgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBwcmVjZWRlIFQzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nICYmIGVyci5zdGVwQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zID8/PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZEF0TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBvZiB0aGUgbG9hZGVkIGV2ZW50IGxvZywgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBob2xkaW5nIGFuIGV2ZW50IHRoaXMgcmVwbGF5IG5ldmVyIHNhdyByZWplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd3JpdGUgKDQxMikgaW5zdGVhZCBvZiBhY2NlcHRpbmcgYSBkaXZlcmdlbnQgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBoYW5kbGVkIGhlcmUsIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXksIG5ldmVyIGJ5IHJlLXBvc3RpbmcgdGhlIHNhbWUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgc3VzcGVuZGVkIGJlZm9yZSBpdHMgZXZlbnQgbG9nIHdhcyBsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1c3BlbnNpb25SZXN1bHQ6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGhhbmRsZVN1c3BlbnNpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdCA9IGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb246IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiBsZXRzIGVsaWdpYmxlIG5ld2x5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCBzdGVwcyBwdWJsaXNoIHRoZWlyIHN0ZXAtZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSAoY2FycnlpbmcgYHN0ZXBJbnB1dGApIGluIHBhcmFsbGVsIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlLiBTdGVwcyBxdWV1ZWQgdGhlcmUgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBpbiBgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGJ5IHRoZSBkaXNwYXRjaCBwYXNzIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEaXNwYXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVOYW1lOiBnZXRXb3JrZmxvd1F1ZXVlTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFjZUNhcnJpZXI6IG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgcHJlLWNsYWltczogbGV0cyB0aGUgYmF0Y2hlZCBmYW4tb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZCB0aGUgbGF6eS1pbmxpbmUgc3RlcHMnIHN0ZXBfY3JlYXRlZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIHBhaXJzIChzdGFtcGVkIHdpdGggdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UncyBvd25lcnNoaXApIGludG8gdGhlIG9uZSBjb21taXQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvZGllcyBiZWxvdyBzdGFydCBzdHJhaWdodCBvZmYgaXQuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LmlubGluZUNsYWltcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgZm9sZCByZXR1cm4gb25jZSB0aGUgcGFpciBjaHVuayBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQ6IHRyYWlsaW5nIGNodW5rcyBhbmQgdGhlIHBlci1jaHVua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMgcmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBkZWZlcnJlZEJhdGNoV29ya2AsIHdoaWNoIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpvaW5zIGJlZm9yZSBpdCBjYW4gYWNrIChiZWxvdywgbmV4dCB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBqb2luKSwgc28gdGhlIGR1cmFiaWxpdHkgY29udHJhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bmNoYW5nZWQgd2hpbGUgdGhlIGJvZGllcyBzdGFydCBlYXJsaWVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVmZXJyZWRCYXRjaFdvcms6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3VzcGVuc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3VzcGVuc2lvbiBjcmVhdGUgd2FzIHJlamVjdGVkIGFzIHN0YWxlOiByZS1kZXJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZyBpbiB0aGlzIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uY2UgdGhlIGluLXByb2Nlc3MgYnVkZ2V0IGlzIHNwZW50LCBmYWxsIGJhY2sgdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgaW1tZWRpYXRlIHJlLWludm9jYXRpb24gKGEgcmV0aHJvdyByZWxpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVkZWxpdmVyeSBvZiBhIG1lc3NhZ2UgdGhlIHR1cmJvIHBhdGggYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tlZCwgc28gdGhlIHJ1biB3b3VsZCBzdGFsbCBmb3IgdGhlIHF1ZXVlJ3MgfjMwMHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2aXNpYmlsaXR5IHRpbWVvdXQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3VzcGVuc2lvbkVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VzcGVuc2lvbi1jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBidWRnZXQgc3BlbnQ6IGZhaWwgdGhlIHJ1biByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmQgaXQgYmFjayB0byB0aGUgcXVldWUgdG8gc3BpbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmF0YWxFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGZhaWx1cmVzIHByb3BhZ2F0ZSB0byB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHNvIHRoZSBtZXNzYWdlIGlzIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN1c3BlbnNpb25FcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24tcmV0cnlhYmxlIGZhaWx1cmUgd2hpbGUgY29tbWl0dGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbidzIGV2ZW50cywgZS5nLiBhbiBhdHRyaWJ1dGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkIHJlamVjdGVkIGFzIGludmFsaWQgKHRoZSBjdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlci1ydW4gY2FwIGNhbiBvbmx5IGJlIGNoZWNrZWQgV29ybGQtc2lkZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGVsaXZlcnkgd291bGQgcmVwbGF5IHRoZSB3b3JrZmxvdyBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHdyaXRlIGFuZCB0aGUgc2FtZSByZWplY3Rpb24sIHNvIGZhaWwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHdlZGdpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgaW4gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihzdXNwZW5zaW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb24tcmV0cnlhYmxlIGVycm9yIHdoaWxlIGNvbW1pdHRpbmcgd29ya2Zsb3cgc3VzcGVuc2lvbjsgZmFpbGluZyBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdXNwZW5zaW9uRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoc3VzcGVuc2lvbkVycm9yLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQucmVwb3J0ZWRFdmVudENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdW1wLWFuZC1yZXBvcnQgbWVyZ2VkIGV2ZW50cyBCRUxPVyB0aGUgdGFpbCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtc29ydGVkIHRoZSBhcnJheSB0byBzbG90IG9yZGVyLCBzaGlmdGluZyBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGUgcHJld2FybSBzY2FuIGhhZCBhbHJlYWR5IHJlY29yZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3Vyc29yIGlzIGRlbGliZXJhdGVseSBsZWZ0IGFsb25lOiB0aGUgcmVwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGEgbG93ZXIgYm91bmQgb24gd2hhdCB3YXMgc2tpcHBlZCwgc28gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgcmVhZCBzdGlsbCBoYXMgdG8gY292ZXIgdGhlIHNhbWUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZS5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBpbiB0aGUgbG9nIGFzIGxvYWRlZCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBDb21wdXRlZCBsYXppbHksIGF0IG1vc3Qgb25jZSwgYW5kIHNoYXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGUgcmV0ZW50aW9uIGRlY2lzaW9uIGhlcmUgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEvdHVyYm8gZ2F0ZXMgYmVsb3cg4oCUIHRoZSBhdHRyLWRldG91ciBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvb2stY29uZmxpY3QgcGF0aHMgcmV0dXJuL2NvbnRpbnVlIGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdhdGVzIGFuZCB1c3VhbGx5IHNob3J0LWNpcmN1aXQgYmVmb3JlIHNjYW5uaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0ID0gb25jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50TG9nLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ZW50aW9uRGVjaXNpb24gPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRSZXRlbnRpb25EZWNpc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuV2FpdDogKCkgPT4gb3Blbkhvb2tXYWl0LnZhbHVlLm9wZW5XYWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldGVudGlvbkRlY2lzaW9uPy5yZXRhaW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyArPSBzdXNwZW5zaW9uUmVzdWx0Lmhvb2tDcmVhdGlvbk1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9IHByZVN0ZXBCbG9ja2luZ01zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXRlbnRpb25EZWNpc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1ZtUmV0ZW50aW9uOiByZXRlbnRpb25EZWNpc2lvbi5yZXRhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZXRhaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdyZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmV0ZW50aW9uRGVjaXNpb24/LnJldGFpbiA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dWbVJldGVudGlvblJlYXNvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRlbnRpb25EZWNpc2lvbi5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXJpYWxpemF0aW9uQmxvY2tlckxvZ01ldGFkYXRhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnNlcmlhbGl6YXRpb25CbG9ja2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5zZXJpYWxpemF0aW9uQmxvY2tlckNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9vayBjb25mbGljdDogYnJlYWsgbG9vcCwgcmUtaW52b2tlIHZpYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBleGVjdXRpb24gcGFzczogaXQgcmVsb2FkcyB0aGUgbG9nIChub3cgaG9sZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGp1c3QtY29tbWl0dGVkIGF0dHJfc2V0KSwgdGhlbiBlaXRoZXIgcmVzdW1lcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldGFpbmVkIFZNIG9yIHBlcmZvcm1zIGEgY29sZCByZXBsYXkgdG8gcmVzb2x2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldEF0dHJpYnV0ZXMgcHJvbWlzZS4gU2tpcCBzdGVwIHByb2Nlc3NpbmcgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3Mgc28gdGhhdCB0aGUgZHVyYWJsZSBldmVudCBkZWNpZGVzIHJhY2VzIGZpcnN0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gUHJvbWlzZS5yYWNlKFtzZXRBdHRyaWJ1dGVzKCksIHN0ZXAoKV0pLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBtdXN0IGJlIGFibGUgdG8gd2luIHdpdGhvdXQgZXhlY3V0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zaW5nIHN0ZXAuIFRoZSBuZXh0IHBhc3MgaGFwcGVucyBpbi1wcm9jZXNzIHJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiB2aWEgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdW5saWtlIGhvb2tzIGFuZCB3YWl0cywgYW4gYXR0cl9zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvZHVjZXMgbm8gb3V0LW9mLWJhbmQgaW52b2NhdGlvbiBzb3VyY2UgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd291bGQgbmVlZCB0byB5aWVsZCB0aGUgbWVzc2FnZSBmb3IsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXlpbmcgYSBkZWxpdmVyeSByb3VuZC10cmlwIGhlcmUgd291bGQgb25seSBhZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgYmVmb3JlIHRoZSB3b3JrZmxvdydzIG5leHQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHMgd2hvc2UgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemUgd2VyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxpemVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgYXMgc3RlcF9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyArIHN0ZXBfZmFpbGVkIChzZWUgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXApLiBOb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gbWVzc2FnZSBpcyBkaXNwYXRjaGVkIGZvciB0aGVtLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBzdWNoIGEgc3RlcCBpcyB0aGUgb25seSBwZW5kaW5nIHdvcmsgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZXZlciByZS1pbnZva2UgdGhlIHJ1biwgc28gcmVwbGF5IGluLXByb2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIHJlbG9hZGVkIGxvZyBpbnN0ZWFkLiBUaGUgcmVwbGF5IHJlamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwJ3MgcHJvbWlzZSB3aXRoIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuY2F1Z2h0LCBpdCBwcm9wYWdhdGVzIG91dCBvZiB0aGUgd29ya2Zsb3cgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gYXMgYSBVU0VSX0VSUk9SLiBIZWFsdGh5IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIGFyZSBub3QgZGlzcGF0Y2hlZCB0aGlzIHBhc3M6IHRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXN1c3BlbmRzIG92ZXIgdGhlaXIgYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudHMgYW5kIHRoZSBuZXh0IHBhc3MgZGlzcGF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBhcyB1c3VhbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5mYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKb2luIHRoZSBiYXRjaGVkIGZhbi1vdXQncyB0cmFpbGluZyBjaHVuayBjb21taXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzIGJlZm9yZSBjb250aW51aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdGx5IGxpa2UgdGhlIHR3byBqb2lucyBvbiB0aGUgZGlzcGF0Y2ggcGF0aHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3c6IHRoaXMgaW52b2NhdGlvbiBtdXN0IG5vdCBwcm9jZWVkIChhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBhY2spIGJlZm9yZSBldmVyeSBjcmVhdGUgYW5kIHB1Ymxpc2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbGF1bmNoZWQgaXMgZHVyYWJsZS4gQSByZWplY3Rpb24gcHJvcGFnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIHRoZWlyczogdHJhbnNpZW50IHdvcmxkIGVycm9ycyByZXRocm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBmb3IgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3VzcGVuc2lvblJlc3VsdC5kZWZlcnJlZEJhdGNoV29yaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIHN0ZXBzIHdob3NlIHBhaXItZm9sZGVkIHN0ZXBfc3RhcnRlZCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgYWxyZWFkeSBjb21taXR0ZWQgKGBpbmxpbmVDbGFpbXNgKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBleGVjdXRlZCBvbiB0aGlzIHBhc3M6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgcmVwbGF5IGJlbG93IHJlLXN1c3BlbmRzIG92ZXIgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyBzdGVwcywgYW5kIG93bmVkIHJlY292ZXJ5ICh0aGUgY2xhaW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IHRoaXMgbWVzc2FnZSdzIG93bmVyTWVzc2FnZUlkKSByZS1leGVjdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRoZXJlLiBJdHMgXCJwcmV2aW91cyBkZWxpdmVyeSBjcmFzaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pZC1ib2R5XCIgbG9nIGlzIGEgbWlzbm9tZXIgb24gdGhpcyBwYXRoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGNyYXNoZWQsIHRoZSBib2RpZXMgd2VyZSBuZXZlciBzdGFydGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmFpbGVkIGRlaHlkcmF0aW9uIG1heSBoYXZlIGV4ZWN1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93LW93bmVkIGNvZGUgKGdldHRlcnMvcHJveGllcykgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93aW5nOyBkZW1vdGUgdG8gYSBjb2xkIHJlcGxheSByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYSBWTSB0aGF0IG1heSBoYXZlIGRpdmVyZ2VkLiBUaGlzIGlzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFyZSB0ZXJtaW5hbC1lcnJvciBwYXRoLCBzbyB0aGUgcmVwbGF5IGNvc3QgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXJyZWxldmFudCBuZXh0IHRvIHRoZSBkaXZlcmdlbmNlIHJpc2suXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSAoaW4gcGFyYWxsZWwpIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHJlcGxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwLCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkIGZvciByZS1pbnZvY2F0aW9uLCB3aGljaCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlciB3aGlsZSBxdWV1ZWQgc3RlcHMgcnVuIGluIHBhcmFsbGVsIGludm9jYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUlubGluZVN0ZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5sYXp5SW5saW5lU3RlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZpZWQgcXVldWUgZGlzcGF0Y2ggZm9yIGV2ZXJ5dGhpbmcgd2UgYXJlIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLWV4ZWN1dGluZy4gU3RlcHMgYXJlIHF1ZXVlZCB3aXRoIHN0ZXBJZCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyIHJ1bnMgdGhlbTsgdGhlIHdhaXQgdGltZXIgaXMgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGdlbmVyaWMgY29udGludWF0aW9uIHRoYXQgZmlyZXMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGVsYXBzZXMgYW5kIGxldHMgdGhlIG5leHQgcmVwbGF5IG9ic2VydmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlIGVsYXBzZWQgd2FpdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlIChwZXIgcGVuZGluZyBzdGVwIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduYXRlZCBsYXp5LWlubGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgPT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhlY3V0ZSBpbiBUSElTIGludm9jYXRpb24gKG93bmVkIHJlY292ZXJ5OiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkZWxpdmVyeSBvZiB0aGUgb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBpdCBjcmFzaGVkIG9uLCB2aWEgYSBwYXlsb2FkLWxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBlZCB3aXRoIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG93bmVyTWVzc2FnZUlkLCBub3QgYSBiYXJlIHN0YXJ0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyICE9PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVuc3VyZSBhIERFTEFZRUQgYmFja3N0b3Agd2FrZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZGVsYXlTZWNvbmRzID0gb3duZXJzaGlwIGxlYXNlIHJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnN0ZWFkIG9mIGVucXVldWVpbmcgdGhlIHN0ZXAuIFRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnZvY2F0aW9uIGlzIChsaWtlbHkpIHN0aWxsIHJ1bm5pbmcgdGhlIGJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW4gaW1tZWRpYXRlIHN0ZXAgbWVzc2FnZSB3b3VsZCBiYXJlLXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJ1bm5pbmcgc3RlcCBhbmQgZXhlY3V0ZSBpdCBhIHNlY29uZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHdvcmtmbG93IzI3ODApLiBUaGUgYmFja3N0b3AgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb250aW51YXRpb24sIE5PVCBhIHN0ZXAgbWVzc2FnZTogd2hlbiBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGZpcmVzLCB0aGlzIHNhbWUgZGVjaXNpb24gdGFibGUgaGFuZGxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdoYXRldmVyIHN0YXRlIHRoZSBzdGVwIGlzIGluIGJ5IHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAodGVybWluYWwg4oaSIG5vdGhpbmcgcGVuZGluZzsgcXVldWUtb3duZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3JldHJ5aW5nIOKGkiBub3JtYWwga2V5ZWQgZGlzcGF0Y2g7IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGVhZCB3aXRoIGxlYXNlIGV4cGlyZWQg4oaSIGltbWVkaWF0ZSBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmVzZXJ2aW5nIHN0ZXAtbGV2ZWwgZmFpbHVyZSBzZW1hbnRpY3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9pc29uIHN0ZXBzOyBsZWFzZSByZWZyZXNoZWQgYnkgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWNvdmVyeSDihpIgcmUtYXJtKS4gVGhlIGJhY2tzdG9wJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpZGVtcG90ZW5jeUtleSBpcyBzY29wZWQgdG8gdGhlIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEVQT0NIIChsYXRlc3Qgc3RlcF9zdGFydGVkIHRpbWVzdGFtcCksIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGp1c3QgdGhlIGNvcnJlbGF0aW9uIElELCBhbmQgbXVzdCBuZXZlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24ga2V5LiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5IGZvciBib3RoIGludmFyaWFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZml4ZWQga2V5cyBlaXRoZXIgYWJzb3JiIHRoZSByZXRyeSBoYW5kb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3IgZGVkdXBlIHRoZSByZWZyZXNoZWQtbGVhc2UgcmUtYXJtIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgaW4tZmxpZ2h0IGJhY2tzdG9wIGl0c2VsZikuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gTm90IG93bmVkIChuZXZlciBzdGFtcGVkIC8gZWFnZXIgLyBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsYXBzZWQgYXQgc3RlcF9yZXRyeWluZyAvIGxlYXNlIGV4cGlyZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGtpbGwtc3dpdGNoZWQpIOKGkiBpbW1lZGlhdGUgZW5xdWV1ZSwgZXhhY3RseSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlZm9yZS4gVGhpcyBjb3ZlcnMgY3Jhc2ggcmVjb3Zlcnk6IGlmIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZCBidXQgY3Jhc2hlZCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBxdWV1ZWluZywgYSBsYXRlciBoYW5kbGVyIHF1ZXVlcyBpdDsgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcC1pZGVudGl0eS1zY29wZWQgaWRlbXBvdGVuY3lLZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3Nlcy4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZU93bmVyc2hpcCA9IGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hOb3dNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZFJlY292ZXJ5U3RlcHM6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtW10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrc3RvcFdha2VzQXJtZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIGhhbmQtb2ZmLiBUaGUgbWVhc3VyZW1lbnQgbWF5IG9ubHkgZ28gdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkgQVRURU1QVCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBzdGVwLCBhbmQgdGhlIGxvb3AgYmVsb3cgaXMgd2hhdCBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aG9zZSBhcmUsIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjbGFzc2lmaWNhdGlvbiwgbmV2ZXIgYWhlYWQgb2YgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIGtlZXBzIHRoZSB0cmFja2luZyB3aGVuZXZlciBpdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gc29tZXRoaW5nIGl0c2VsZjogYSBkZWZlcnJlZCBsYXp5LWlubGluZSBzdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCAoYSByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0aW5nIHRoZSBzdGVwIGl0IGNyYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uKS4gQm90aCBsYW5kIGluIGBpbmxpbmVFeGVjdXRpb25zYCBiZWxvdyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgaXQgdGhlcmUuIE9ubHkgd2hlbiBuZWl0aGVyIGV4aXN0cyBpcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHRoZSBGSVJTVCBzdGVwIHRoaXMgaW52b2NhdGlvbiBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5xdWV1ZXMgYXMgYSBzdGVwIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGVwIGNvbnZlcnRlZCBpbnRvIGEgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgYW4gYXR0ZW1wdCAodGhlIHdha2UgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiwgYW5kIHdoaWNoZXZlciBpbnZvY2F0aW9uIGV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHN0ZXAgaXMgYSBkaWZmZXJlbnQgZGVsaXZlcnkpLCBzbyBpdCBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGFrZSB0aGUgc2FtcGxlLiBJZiBldmVyeSBwZW5kaW5nIHN0ZXAgYmVjb21lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBiYWNrc3RvcCwgbm90aGluZyBoZXJlIGF0dGVtcHRzIHRoZSBzdGVwIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtcHRpb24gZ29lcyB1bnJlcG9ydGVkLCB3aGljaCBpcyB0aGUgaG9uZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lIHJhdGhlciB0aGFuIGEgdG90YWwgYXR0cmlidXRlZCB0byB3b3JrIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG5ldmVyIGRpZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHYXRlZCBvbiB0aGVyZSBiZWluZyBhIG1lYXN1cmVtZW50IHRvIHBsYWNlIGF0IGFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGAmJmAgc2hvcnQtY2lyY3VpdHMsIHNvIGEgZGVsaXZlcnkgY2Fycnlpbmcgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNraW5nIChldmVyeSBub24tcmVzdW1lIGRlbGl2ZXJ5LCBhbmQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBwYXN0IHRoZSBzdGVwIHRoYXQgY29uc3VtZWQgaXQpIG5ldmVyIHBheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcGVuZGluZy1zdGVwIHNjYW4uIFRoYXQgbWF0dGVycyBvbiB3aWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYW4tb3V0cywgd2hlcmUgYHBlbmRpbmdTdGVwc2AgcnVucyB0byBodW5kcmVkcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYW5kT2ZmUmVzdW1lVGltaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFwZW5kaW5nU3RlcHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RlcCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUoc3RlcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHB1Ymxpc2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzaWxpZW50IGRpc3BhdGNoIChjcmVhdGUgKyBxdWV1ZSBpbiBwYXJhbGxlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBjYXJyeWluZyBgc3RlcElucHV0YCkuIEEgcmUtcHVibGlzaCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGRlZHVwZSBvbiB0aGUgaWRlbXBvdGVuY3kga2V5IGFueXdheSwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIHdhc3RlZCByb3VuZC10cmlwLiBPd25lcnNoaXAgbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGllcyB0byB0aGVzZTogdGhleSB3ZXJlIGNyZWF0ZWQgdGhpcyBwYXNzLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVwX3N0YXJ0ZWQgc3RhbXAgY2FuIGV4aXN0IHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQucXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiYgaXNTdGVwT3duZXJzaGlwQWN0aXZlKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVkIHJlY292ZXJ5OiB0aGlzIGRlbGl2ZXJ5IElTIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlOyByZS1leGVjdXRlIHRoZSBzdGVwIGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGluc3RlYWQgb2YgcXVldWVpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCBiYWNrc3RvcCB3YWtlIHdoaWxlIGFub3RoZXIgaW52b2NhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBsZWFzZSBpcyBsaXZlOyBpbW1lZGlhdGUgc3RlcCBlbnF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSAobGVhc2UgZXhwaXJlZCDih5IgcmVtYWluaW5nIDAg4oeSIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kYXksIHdoaWNoIGlzIGFsc28gdGhlIGRlZ3JhZGVkIG1vZGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkcyB3aXRoIHVuc3RhYmxlIG1lc3NhZ2UgSURzLCB3aGVyZSB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWJvdmUgbmV2ZXIgbWF0Y2hlcyB0aGVyZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tzdG9wRGVsYXlTZWNvbmRzID0gb3duZXJzaGlwQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKHN0ZXAsIGRpc3BhdGNoTm93TXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3N0b3BEZWxheVNlY29uZHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQZW5kaW5nIHN0ZXAgaXMgaW5saW5lLW93bmVkIGJ5IGEgbGl2ZSBpbnZvY2F0aW9uOyBlbnN1cmluZyBkZWxheWVkIGJhY2tzdG9wIHdha2UgaW5zdGVhZCBvZiBpbW1lZGlhdGUgcmVxdWV1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IHN0ZXAub3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogYmFja3N0b3BJZGVtcG90ZW5jeUtleShzdGVwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdGVwIElTIGJlaW5nIGF0dGVtcHRlZCwgYnkgdGhlIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBwaWNrcyB0aGUgbWVzc2FnZSB1cC4gQ29uc3VtZSB0aGUgdHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSwgZm9yIHRoZSBmaXJzdCBzdWNoIHN0ZXAgYW5kIG5vIG90aGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwUmVzdW1lVGltaW5nID0gaGFuZE9mZlJlc3VtZVRpbWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdW1lVGltaW5nRm9yTWVzc2FnZShyZXN1bWVUcmFja2luZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bWVUaW1pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kT2ZmUmVzdW1lVGltaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oc3RlcFJlc3VtZVRpbWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBob29rUmVzdW1lVGltaW5nOiBzdGVwUmVzdW1lVGltaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAtaWRlbnRpdHktc2NvcGVkOiBkZWR1cGVzIGFnYWluc3QgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgZGlzcGF0Y2ggb2YgVEhJUyBzdGVwIChjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzLCBjcmFzaC1yZWNvdmVyeSByZS1kaXNwYXRjaCwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlcidzIHJlc2lsaWVudCBwdWJsaXNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGFic29yYmluZyBhIGRpc3BhdGNoIG9mIGEgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgdW5kZXIgYSByZWFzc2lnbmVkIGNvcnJlbGF0aW9uIGlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGVwTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBoaWdoZXIgdGhhbiB0aGUgaW5jb21pbmcgY29udGludWF0aW9uJ3Mgd2hlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb24gSVMgdGhlIGNvbnRpbnVhdGlvbiBmb3IgdGhpcyBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW5kIHRoZSB3YWl0IGlzIHN0aWxsIHBlbmRpbmc6IHRoYXQgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlbnQgdGhlIGtleSwgc28gcmUtYXJtaW5nIHVuZGVyIGl0IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgYnkgdGhlIHdvcmxkJ3MgZGVkdXBlIHdpbmRvdyBhbmQgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgbG9zZSBpdHMgb25seSB0aW1lci4gRXZlcnkgb3RoZXIgY2FzZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDAgYW5kIGtleXMgYXMgYmVmb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0QXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdENvbnRpbnVhdGlvbj8uY29ycmVsYXRpb25JZCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gd2FpdENvbnRpbnVhdGlvbi5hdHRlbXB0ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Q29udGludWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiB3YWl0QXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QXR0ZW1wdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaCBwdWJsaXNoZXMgYW5kIHRoZSBpbmxpbmUgYm9kaWVzIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gQ09OQ1VSUkVOVExZOiB0aGUgc3VzcGVuc2lvbiBjb21taXQgYWxyZWFkeSBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBkaXNwYXRjaGVkIHN0ZXAgZHVyYWJsZSAoYW5kLCB3aGVuIHRoZSBmb2xkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmdhZ2VkLCBzZXR0bGVkIHRoZSBpbmxpbmUgcGFpcnMnIGNsYWltcyksIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25seSBvcmRlcmluZyBib3RoIHNpZGVzIG5lZWQsIHNvIG5laXRoZXIgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgb3RoZXIuIFRoZSBqb2lucyBiZWxvdyAoYmVmb3JlIHN0ZXAgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHJlYWQsIGFuZCBvbiB0aGUgbm8taW5saW5lIGVhcmx5IHJldHVybnMpIGtlZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYWlsdXJlIGNvbnRyYWN0OiBhIGRpc3BhdGNoIHJlamVjdGlvbiBzdGlsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHMgdGhpcyBkZWxpdmVyeSwgYWZ0ZXIgaW4tZmxpZ2h0IGJvZGllcyBzZXR0bGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzU2V0dGxlZCA9IFByb21pc2UuYWxsKGRpc3BhdGNoZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSByZWplY3Rpb24gbXVzdCBub3Qgc3VyZmFjZSBhcyBhbiB1bmhhbmRsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdGlvbiB3aGlsZSB0aGUgYm9kaWVzIHJ1biAob3IgaWYgc2V0dXAgYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBhbmQgdGhlIGpvaW4gdGhyb3dzIGZpcnN0KTsgYXdhaXRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBwcm9taXNlIGJlbG93IHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlc1NldHRsZWQuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2V0IG9mIHN0ZXBzIFRISVMgaW52b2NhdGlvbiBleGVjdXRlczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlcnJlZCBsYXp5LWlubGluZSBiYXRjaCBwbHVzIGFueSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgKHRoaXMgbWVzc2FnZSdzIHJlZGVsaXZlcnkgcmUtZXhlY3V0aW5nIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgaXQgY3Jhc2hlZCBvbjogbm8gbGF6eVN0ZXBJbnB1dDsgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoeWRyYXRlcyBmcm9tIHRoZSBzdGVwIGVudGl0eSBsaWtlIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQgdGhlIHBheWxvYWQtbGVzcyBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAuIFVubGlrZSB0aGUgYmFja2dyb3VuZCBwYXRoJ3Mgc3RhcnQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBiYXJlOiBpdCBjYXJyaWVzIHRoaXMgbWVzc2FnZSdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lck1lc3NhZ2VJZCwgd2hpY2ggaXMgYWxzbyB3aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3ZlcnkgcmV0cnkgY2VpbGluZyBjb3VudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lRXhlY3V0aW9uczogQXJyYXk8e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ/OiAodHlwZW9mIGxhenlJbmxpbmVTdGVwcylbbnVtYmVyXVsnZGVoeWRyYXRlZElucHV0J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNsYWltZWRTdGFydD86IFByZWNsYWltZWRJbmxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5sYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlLWNsYWltZWQgYnkgdGhlIHN1c3BlbnNpb24gYmF0Y2g6IHRoZSBwYWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzZXR0bGVkIHRoaXMgc3RlcCdzIGNyZWF0ZSArIGNsYWltLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBydW5zIChvciBza2lwcykgdGhlIGJvZHkgb2ZmIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGluc3RlYWQgb2Ygc2VuZGluZyBhIGxhenkgc3RhcnQgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFpbSA9IHN1c3BlbnNpb25SZXN1bHQuaW5saW5lQ2xhaW1zLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2xhaW1lZFN0YXJ0OiBjbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMuZGVoeWRyYXRlZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3duZWRSZWNvdmVyeVN0ZXBzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lcnNoaXAgdGVsZW1ldHJ5IChkZXNpZ24gZG9jIFBoYXNlIDcpOiBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIHNvIHByb2R1Y3Rpb24gdHJhY2VzIHNob3cgd2hlbiBjcmFzaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnkgcmFuIG9yIGEgd2FrZSB3YXMgY29udmVydGVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AsIGFuZCBhIHdhcm4gKGFsd2F5cyBwcmludGVkLCB1bmxpa2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnL2luZm8pIGZvciBvd25lZCByZWNvdmVyeSwgc2luY2UgaXQgbWVhbnMgYSBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIGRpZWQgbWlkLXN0ZXAtYm9keS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dPd25lZFJlY292ZXJ5U3RlcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYmFja3N0b3BXYWtlc0FybWVkID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dCYWNrc3RvcFdha2VzQXJtZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlLWV4ZWN1dGluZyBpbmxpbmUgc3RlcHMgb3duZWQgYnkgdGhpcyBxdWV1ZSBtZXNzYWdlIOKAlCBhIHByZXZpb3VzIGRlbGl2ZXJ5IGNyYXNoZWQgbWlkLWJvZHkgYW5kIHRoaXMgcmVkZWxpdmVyeSBpcyByZWNvdmVyaW5nIHRoZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogb3duZWRSZWNvdmVyeVN0ZXBzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZXhlY3V0ZSBpbmxpbmU6IGV2ZXJ5dGhpbmcgaGFzIGJlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCAob3Igbm8gd29yayBuZWVkcyBzY2hlZHVsaW5nKS4gRXhpdCBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgZHJpdmUgc3Vic2VxdWVudCByZXBsYXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgcnVucyBjb25jdXJyZW50bHkgd2l0aCB0aGUgZGlzcGF0Y2hlcyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhdGgsIHNvIGpvaW4gdGhlbSAoYW5kIHRoZSBmb2xkJ3MgZGVmZXJyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2h1bmsgY29tbWl0cy9wdWJsaXNoZXMpIGhlcmUgc28gYSBmYWlsdXJlIGZhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWxpdmVyeSBleGFjdGx5IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzU2V0dGxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB0aGUgcmVwbGF5IGNvbnN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyLiBXaXRob3V0IGl0IChubyBpbmxpbmUgc3RlcCwgYWxsIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIG9yIG5vbmUgcGVuZGluZykgdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGFyZSBjb25zdWx0ZWQgYnkgYWxsIHRocmVlIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdzsgcmVzb2x2ZSB0aGUgbWVtb2l6ZWQgc2NhbiBvbmNlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXRTdGF0ZSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0KSBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdCAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgV29ybGQgbWF5IHJldHVybiBub25lIG9uIHRoZSBpbml0aWFsIGxvYWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhpcyBpcyB0aGUgY2xlYW4gc2luZ2xlLXN0ZXAgc2VxdWVudGlhbCBjYXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBzdXNwZW5zaW9uIHByb2R1Y2VkIGV4YWN0bHkgb25lIHN0ZXAgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YWl0cyAoYGVyci57c3RlcCx3YWl0fUNvdW50YCksIHRoYXQgb25lIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBsb25lIHBlbmRpbmcgc3RlcCAoYHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDFgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIHRoZSBsb25lIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDFgOiBubyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2libGluZ3MgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMsIGFuZCBubyBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW5saW5lIHN0ZXAgd3JpdGluZyBpdHMgb3duIGV2ZW50cyBvdXQgb2YgYmFuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBObyBwZW5kaW5nIHdhaXQgdGltZXIgZnJvbSBUSElTIHN1c3BlbnNpb24sIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3BlbiB3YWl0IGluIHRoZSBjdW11bGF0aXZlIGxvZy4gQSBgd2FpdF9jb21wbGV0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhIHJlc29sdXRpb24gdGhlIHJlcGxheSBpcyB3YWl0aW5nIG9uIHJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhhbiBhbiBldmVudCBpdCBjYW4gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzbyBjb25zdW1pbmcgYSBkZWx0YSB0aGF0IHByZWRhdGVzIGl0IHdvdWxkIHNldHRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIHNsZWVwIGZyb20gYSB2aWV3IHRoYXQgZG9lcyBub3QgY29udGFpbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbXBsZXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBBbiBvcGVuIChvciB0aGlzLXN1c3BlbnNpb24tY3JlYXRlZCkgaG9vayBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmluZSwgYW5kIHRoYXQgaXMgdGhlIGdhdGUgdGhpcyB1c2VkIHRvIGNhcnJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgVGhlIGRlbHRhIHNuYXBzaG90cyB0aGUgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uIHRoZSBuZXh0IHJlcGxheSwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIGBob29rX3JlY2VpdmVkYCBsYW5kaW5nIGluIHRoYXQgd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhYnNlbnQgZnJvbSB0aGUgZGVsdGEgYW5kIG9ic2VydmVkIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlcmF0aW9uIGxhdGVyIHRoYW4gYSByZWFsIGZldGNoIHdvdWxkIG9ic2VydmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LiBUaGF0IHN0YWxlbmVzcyBpcyBxdWFsaXRhdGl2ZWx5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFkLXRvLXdyaXRlIHJhY2UgdGhlIGZldGNoIHBhdGggYWxyZWFkeSBoYXMgKGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBldmVudCBjYW4gbGFuZCByaWdodCBhZnRlciBgZXZlbnRzLmxpc3RgIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCBiZWZvcmUgdGhlIHN1c3BlbnNpb24ncyB3cml0ZXMpLCBhbmQgaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJvdW5kZWQgYnkgdGhlIHNhbWUgdGhpbmc6IHdoYXQgYSBzdGFsZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGhvbGRzIGlzIGEgKnByZWZpeCogb2YgdGhlIGxvZywgbmV2ZXIgYSBob2xlIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdCwgYW5kIHJlcGxheWluZyBhIHByZWZpeCB0d2ljZSByZWFjaGVzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkZWNpc2lvbnMuIEl0cyBuZXh0IHdyaXRlIGlzIGFsbG9jYXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2hhdGV2ZXIgaXQgbWlzc2VkIGFuZCBjb21lcyBiYWNrIGNhcnJ5aW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHJlcG9ydFNraXBwZWRTbG90c2Agb24gdGhlIGxvY2FsIHdvcmxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbW1pdC10aW1lIGFsbG9jYXRpb24gb24gdGhlIFZlcmNlbCBvbmUpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlcGxheSBjb3JyZWN0cyBpdHNlbGYgb24gdGhlIHdyaXRlIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvbiBhIHJlYWQuIEEgV29ybGQgTUFZIGluc3RlYWQgcmVmdXNlIHRoZSB3cml0ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RhbGUgKDQxMiksIHdoaWNoIHRoZSBydW50aW1lIGhhbmRsZXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdheTsgbm90aGluZyByZXF1aXJlcyBpdCB0by4gSG9va3MgY3JlYXRlZCBieSBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdXNwZW5zaW9uIGFyZSBpbnNpZGUgdGhlIGRlbHRhICh0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYGhvb2tfY3JlYXRlZGAgbGFuZHMgYmVmb3JlIHRoZSBzdGVwLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSksIHNvIG9ubHkgdGhlaXIgYGhvb2tfcmVjZWl2ZWRgIHJlc3BvbnNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYXJlIHN1YmplY3QgdG8gdGhlIHNhbWUgd2luZG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2l0aCBubyBob29rIG9yIHdhaXQgb3BlbiBhdCBhbGwsIHRoZSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvdXQtb2YtYmFuZCB3cml0ZXIgaXMgY2FuY2VsbGF0aW9uLCB3aGljaCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0byBvYnNlcnZlIG9uZSBpdGVyYXRpb24gbGF0ZS4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvcGVuSG9va0FuZFdhaXRTdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgc3RlcCBydW5zIGlubGluZSwgZWFjaCB3cml0ZXMgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd24gZXZlbnRzIGFuZCB0aGUgcGVyLXdyaXRlIGRlbHRhIHdvdWxkIGJlIHBhcnRpYWwsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsdGEgaXMgbm90IHJlcXVlc3RlZCAodGhlIGdhdGUgYmVsb3cgaXMgZmFsc2UgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aS1zdGVwKSBhbmQgdGhlIG5leHQgaXRlcmF0aW9uIGRvZXMgYSBub3JtYWwgZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5saW5lRGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnRMb2cuY3Vyc29yID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFsZS1zZW5zaXRpdmUgYmF0Y2g6IGEgaG9vayBpcyBvcGVuIGluIHRoZSBydW4gKG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY3JlYXRlZCBieSB0aGlzIHN1c3BlbnNpb24sIHNvIGl0cyBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gbGFuZCBhbnkgbW9tZW50KSwgc28gYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZCBmcm9tIHN0YWxlLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgd2hlbiBzZXZlcmFsIGludm9jYXRpb25zIHJhY2UgZm9yIG9uZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltLiBPcHRpbWlzdGljIHN0YXJ0IGJlZ2lucyB0aGUgYm9keSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSBzZXR0bGVzLCBzbyB0aGUgd3JpdGVyIHRoYXQgTE9TRVMgdGhlIGNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoYEVudGl0eUNvbmZsaWN0RXJyb3JgIOKGkiBgc2tpcHBlZGApIGhhcyBhbHJlYWR5IHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBjb2RlIGl0IGRvZXMgbm90IG93bi4gU3VwcHJlc3MgaXQgZm9yIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaGVzLCBzbyB0aGUgYm9keSBydW5zIG9ubHkgYWZ0ZXIgdGhlIGNsYWltIGNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgd29uLiBDb3N0cyBvbmUgY2xhaW0gcm91bmQtdHJpcCBwZXIgc3RlcCB3aGlsZSBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rIGlzIG9wZW4sIGFuZCBidXlzIHRoZSBzYW1lIHRoaW5nIG9uIGV2ZXJ5IFdvcmxkOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdGVwIGJvZHkgZXhlY3V0ZXMgb25jZSBwZXIgY2xhaW0sIG5vdCBvbmNlIHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFjZXIuIChBIFdvcmxkIHRoYXQgcmVmdXNlcyB0aGUgY2xhaW0gYXMgc3RhbGUgKDQxMilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldHMgdGhlIHNhbWUgcHJvdGVjdGlvbiB0aHJvdWdoIHRoZSBzYW1lIGF3YWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uZSBvZiB0aGUgc2hpcHBlZCBvbmVzIGRvZXMgdGhhdCBmb3IgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xvdC1udW1iZXJlZCBydW4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgZm9yY2VzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCwgYnV0IG9ubHkgd2hpbGUgdGhlIHJ1biBpcyBzdGlsbCBcImNsZWFuXCIgKGEgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9uKS4gVGhlIG1vbWVudCBhIGhvb2sgb3Igd2FpdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCwgbGF0ZXIgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zIGJlY29tZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUsIHNvIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2VkIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBubyBsb25nZXIgaG9sZHM6IHR1cmJvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyBhbmQgdGhlIHN0ZXBzIHRha2UgdGhlIG5vcm1hbCAoZW52LWdhdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQtdGhlbi1ydW4gcGF0aC4gVGhlIGhvb2stY29uZmxpY3QgY2FzZSBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBlYXJseSBhYm92ZSwgdGhlIGF0dHIgY2FzZSBjb250aW51ZWQgaW50byBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVzaCByZXBsYXkgKHNvIGEgYmF0Y2gtc2NoZWR1bGluZyBzdXNwZW5zaW9uIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGF0dHIgZXZlbnRzKSwgYW5kIHRoZSBhd2FpdGVkLWhvb2sgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdGllZCBsYXp5SW5saW5lU3RlcHM7IHRoZSBjaGVja3MgYmVsb3cgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlbnNpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGBzdXNwZW5zaW9uUmVzdWx0LipgIGZsYWdzIG9ubHkgcmVmbGVjdCB3aGF0IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIGNyZWF0ZWQsIHNvIHRoZXkgZG8gbm90IGNhdGNoIGEgaG9vay93YWl0IG9wZW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYW4gZWFybGllciBpdGVyYXRpb24gb2YgdGhlIHNhbWUgZGVsaXZlcnkgKGUuZy4gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rKC4uLilgIHRoYXQgZG9lc24ndCBibG9jayB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93LCBsZXR0aW5nIHRoZSByZXBsYXkgbG9vcCBjb250aW51ZSB0byBsYXRlciBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb25zKS4gT25jZSBhbnkgaG9vayBvciB3YWl0IGlzIG9wZW4gaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdW11bGF0aXZlIGxvZywgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zIGFyZSBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBydW4sIHNvIHR1cmJvIG11c3QgbGF0Y2ggb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJtYW5lbnRseSwgY2hlY2tlZCBoZXJlIHZpYSBgb3Blbkhvb2tBbmRXYWl0U3RhdGVgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBjdW11bGF0aXZlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgV09SS0ZMT1dfU0VRVUVOVElBTF9SRVBMQVlTPTFgIChwZXItcnVuIGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvcGljcyBjb25zdW1lZCB3aXRoIGBtYXhDb25jdXJyZW5jeTogMWApIHdvdWxkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmluY2lwbGUgd2FpdmUgdGhpcyBsYXRjaDogc2VyaWFsaXplZCBvcmNoZXN0cmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIHJlc3RvcmUgdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBkZWxpdmVyeS4gVGhlIHdhaXZlciBpcyBpbnRlbnRpb25hbGx5IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZW46IHRoZSBlbnYgdmFyIGlzIGEgcnVudGltZS1wcm9jZXNzIHNldHRpbmcgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IHByb3ZlIHRoZSBCVUlMVCBmbG93IHRyaWdnZXIgYWN0dWFsbHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYG1heENvbmN1cnJlbmN5OiAxYCAoaXQgbXVzdCBiZSBzZXQgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vLCBhbmQgc29tZSBpbnRlZ3JhdGlvbnMgd3JpdGUgdGhlaXIgb3duIHRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZyksIGFuZCBgY2FwYWJpbGl0aWVzLm1heENvbmN1cnJlbmN5YCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlcyBxdWV1ZSBzdXBwb3J0LCBub3QgZGVwbG95ZWQgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVudGlsIHRoZSBidWlsZCBlbWl0cyBhIHZlcmlmaWFibGUgc2lnbmFsIHRoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBsb3llZCB0cmlnZ2VyIGlzIHNlcmlhbGl6ZWQsIHRoZSBjb25zZXJ2YXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGNoIHN0YXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yY2VPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJibyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3BlbldhaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBzdGVwcyBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVkZ2V0IGlzIHBhdXNlZCBmb3IgdGhlIHdob2xlIGJhdGNoIChzdGVwIGR1cmF0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uIG1heER1cmF0aW9uLCBub3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGltZW91dCkgc28gdGhlIGJ1ZGdldCBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBkb2Vzbid0IGNoYXJnZSB0aGUgc3RlcCBib2RpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeTogZGVjaWRlIHdoZXRoZXIgdGhpcyBiYXRjaCdzIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHF1YWxpZmllcyBmb3IgVFRGUy9TVFNPIG1lYXN1cmVtZW50LiBPbmx5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gncyBmaXJzdCBzdGVwIGNhcnJpZXMgdGhlIHRyYWNraW5nIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsIGJhdGNoIGVtaXRzIG9uZSBzYW1wbGUgcGVyIHNjaGVkdWxpbmcgZ2FwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG9uZSBwZXIgc2libGluZy4gVHVyYm8ncyBzeW50aGVzaXplZCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGhhcyBhIGxvY2FsLWNsb2NrIGNyZWF0ZWRBdCwgc28gdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIG9ubHkgdGhlIHJ1bi1pZCBVTElEIHRpbWVzdGFtcCBpcyB0cnVzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF0ZW5jeVRyYWNraW5nID0gY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5DcmVhdGVkQXRNczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZENyZWF0ZWRBdChydW5JZCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHVyYm8gPyB1bmRlZmluZWQgOiArd29ya2Zsb3dSdW4uY3JlYXRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IHJlcGxheUR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3VzcGVuc2lvbidzIG93biBob29rL3dhaXQgd3JpdGVzIGFyZSBub3QgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvYWRlZCBldmVudCBsb2cgeWV0LCBzbyByZXBvcnQgdGhlbSBleHBsaWNpdGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uSGFzV2FpdHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA+IDAgfHwgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJibyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQ6IHNlcnZlZEJ5UmV0YWluZWRTZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNsb3Qgc25hcHNob3QgZm9yIHRoZSBpbmxpbmUgc3RlcF9zdGFydGVkIGNsYWltczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IGNsYWltIGlzIHRoZSBmaXJzdCBkdXJhYmxlIHdyaXRlIG9mIGEgaG90LXBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGl0cyBzdGVwX2NyZWF0ZWQgaXMgZGVmZXJyZWQpLCBzbyB3aXRob3V0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGl0IHdvdWxkIG5hbWUgbm8gcG9zaXRpb24gYXQgYWxsIGFuZCBhIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgY291bGQgY2xhaW0gKGFuZCBjb21taXQpIGEgc3RlcCBzY2hlZHVsZWQgb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHZpZXcgdGhhdCBtaXNzZXMgYW4gZXZlbnQgaXQgbmV2ZXIgbG9hZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRha2VuIGhlcmUgcmF0aGVyIHRoYW4gaW5zaWRlIHRoZSBleGVjdXRvciBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSB2aWV3IHRoZSBzY2hlZHVsaW5nIGRlY2lzaW9uIHdhcyBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZ2FpbnN0LiBUaGUgZXhlY3V0b3IgYWR2YW5jZXMgZnJvbSBpdCBhcyBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgbGFuZDsgc2VlIGBzbG90U25hcHNob3RgIGluIHN0ZXAtZXhlY3V0b3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWRTbG90U25hcHNob3QgPSBzbG90U25hcHNob3RQYXJhbXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXRjaGVkIGZhbi1vdXQncyBvd24gZXZlbnRzIGFyZSBub3QgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkZWQgbG9nIHlldCAodGhlIG5leHQgaXRlcmF0aW9uIHJlbG9hZHMpLCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW52b2NhdGlvbiB3cm90ZSB0aGVtLCBzbyBmb2xkIHRoZSBiYXRjaCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjZWlsaW5nIGluLCBvciBldmVyeSBpbmxpbmUgdGVybWluYWwgd3JpdGUgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgYSBwcmUtYmF0Y2ggcG9zaXRpb24gYW5kIGJlIGFuc3dlcmVkIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHBlZC1zbG90IHJlcG9ydCBlY2hvaW5nIHRoZSBldmVudHMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBqdXN0IGNvbW1pdHRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2xvdENlaWxpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDbGFpbVNuYXBzaG90ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTbG90Q2VpbGluZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoU2xvdENlaWxpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkZWRTbG90U25hcHNob3QuZXZlbnRDb3VudCA/PyAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBldmVudENvdW50OiBiYXRjaFNsb3RDZWlsaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvYWRlZFNsb3RTbmFwc2hvdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSOiBjb25zdW1lZCBieSB0aGlzIGJhdGNoLiBFdmVyeSBzdGVwIGlzIGhhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNBTUUgdHJhY2tpbmcgb2JqZWN0IGFuZCBpdHMgb25lLXNob3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZXBvcnRlZGAgbGF0Y2ggcGlja3MgdGhlIHNpbmdsZSBzdGVwIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHJlYWNoZXMgdXNlciBjb2RlLCBzbyB0aGUgc2FtcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXJ2aXZlcyB0aGUgYmF0Y2gncyBmaXJzdCBzdGVwIGxvc2luZyBpdHMgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gdG8gYSBjb25jdXJyZW50IGludm9jYXRpb24gd2hpbGUgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2libGluZyBydW5zLCB3aXRob3V0IGEgcGFyYWxsZWwgYmF0Y2ggcmVwb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHBlciBzaWJsaW5nLiBDbGVhcmVkIGhlcmUgc28gYSBsYXRlciBsb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24ncyBzdGVwcyAoYW5kIGFueSBpbi1wcm9jZXNzIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydCkgY2Fubm90IHJlcG9ydCB0aGUgc2FtZSByZXN1bXB0aW9uIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hSZXN1bWVUcmFja2luZyA9IHJlc3VtZVRyYWNraW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBFeGVjdXRpb25Qcm9taXNlcyA9IGlubGluZUV4ZWN1dGlvbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocywgc3RlcEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IG51bWJlciA9IHByaW9yIHN0ZXBfc3RhcnRlZCBjb3VudCArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoaXMgZXhlY3V0aW9uJ3Mgc3RhcnQpLCBjb3VudGluZyBvbmx5IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSdzIG93biBzdGFydHM6IHRoZSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZWlsaW5nIGJvdW5kcyBob3cgbWFueSB0aW1lcyB0aGlzIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlLXJ1bnMgYSBzdGVwIGl0IGNyYXNoZWQvdGltZWQgb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uLCBhbmQgZWFjaCBvZiB0aG9zZSAocmUpc3RhcnRzIHN0YW1wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YS5tZXNzYWdlSWQuIFN0YXJ0cyB3cml0dGVuIGJ5IHJhY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyAoc3RhbGUvd2FrZSByZXBsYXlzLCBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBkaXNwYXRjaGVkIG9mZiBhIGxvc3QgY3JlYXRlLWNsYWltKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyeSBvdGhlciBJRHMgKG9yIG5vbmUpIGFuZCBtdXN0IG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCwgb3IgdGhlIGNlaWxpbmcgZmFsc2VseSBleGhhdXN0cyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWx0aHkgc3RlcCAoc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uIChpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRlcnMgdGhlIGJhdGNoIG9ubHkgd2hlbiBpdCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIHlldCksIHNvIGl0IGhhcyB6ZXJvIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBhbmQgaXMgYWx3YXlzIGF0dGVtcHQgMSwgc28gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNjYW4gZW50aXJlbHkuIE9ubHkgYW4gb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcnVuIGNhbiBoYXZlIHByaW9yIHN0YXJ0cywgYW5kIHRoYXQgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bmNvbW1vbiwgc28gcmVzZXJ2ZSB0aGUgTyhuKSBzY2FuIGZvciBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB3YWxraW5nIHRoZSBncm93aW5nIGxvZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgaW5saW5lIHN0ZXAgKHdoaWNoIHdvdWxkIGJlIE8obsKyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgYSBsb25nIHNlcXVlbnRpYWwgd29ya2Zsb3cpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJlY2xhaW1lZFN0YXJ0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ293bmVkQnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IHNlbmQgdGhlIGRlZmVycmVkIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBvbiBzdGVwX3N0YXJ0ZWQgc28gdGhlIHdvcmxkIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgb24gdGhlIGZseS4gQWJzZW50IGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBzdGVwcywgd2hvc2UgaW5wdXQgaHlkcmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZXhpc3Rpbmcgc3RlcCBlbnRpdHksIGFuZCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlLWNsYWltZWQgc3RlcHMsIHdob3NlIHBhaXIgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVkIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZS1jbGFpbWVkIGlubGluZSBzdGFydDogdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggc2V0dGxlZCB0aGlzIHN0ZXAncyBjcmVhdGUgKyBjbGFpbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4ZWN1dG9yIHJ1bnMgKG9yIHNraXBzKSB0aGUgYm9keSBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB2ZXJkaWN0IHdpdGggbm8gc3RhcnQgd3JpdGUgb2YgaXRzIG93bi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2xhaW1lZFN0YXJ0OiBzLnByZWNsYWltZWRTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIG93bmVyc2hpcDogc3RhbXAgKG9yIHJlLXN0YW1wKSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBxdWV1ZSBtZXNzYWdlIElEIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQsIHNvIHdha2UgcmVwbGF5cyBzZWUgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgaW4gZmxpZ2h0IGhlcmUgYW5kIHN1cHByZXNzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcmVxdWV1ZSAod29ya2Zsb3cjMjc4MCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBmb3JjZSBvcHRpbWlzdGljIHN0YXJ0IGFuZCBob2xkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IHN0ZXBfc3RhcnRlZCB1bnRpbCB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGxhbmRzICh0aGUgYm9keSBzdGlsbCBydW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5KS4gQm90aCBhcmUgdW5kZWZpbmVkL2ZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZC1lbmZvcmNlZCBiYXRjaGVzIHdpdGggYW4gb3BlbiBob29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoZSBjbGFpbSBiZWZvcmUgcnVubmluZyB0aGUgYm9keSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSA0MTItZmVuY2VkIHN0ZXAgbmV2ZXIgZXhlY3V0ZXMgdXNlciBjb2RlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RTbmFwc2hvdDogaW5saW5lQ2xhaW1TbmFwc2hvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBJbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByZWNsYWltZWRTdGFydCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgbGF0ZW5jeVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJhdGNoUmVzdW1lVHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgcmVzdW1lVHJhY2tpbmc6IGJhdGNoUmVzdW1lVHJhY2tpbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVxdWVzdElubGluZURlbHRhICYmIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOiBldmVudExvZy5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludmFyaWFudCBib29ra2VlcGluZzogdGhpcyBpbnZvY2F0aW9uIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBib2RpZXMgdW50aWwgdGhleSBzZXR0bGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc2VydE5vSW5GbGlnaHRPd25lZFN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0T3duZWRTdGVwcy5hZGQocy5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGFuZCBwcmUtY2xhaW1lZCBzdGVwcyBhcmUgYnJhbmQtbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZWlyIGNyZWF0ZS1jbGFpbSBpcyB0aGUgZXhhY3RseS1vbmNlIGdhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBhbiBvd25lZC1yZWNvdmVyeSBzdGVwIGFscmVhZHkgZXhpc3RzIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBkZWxheWVkIGJhY2tzdG9wIG1lc3NhZ2UgbWF5IGZpcmUgbWlkLWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNhbWUgcHJvY2Vzcywgc28gcm91dGUgdGhvc2UgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1wcm9jZXNzIHNpbmdsZS1mbGlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJlY2xhaW1lZFN0YXJ0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcnVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVkLmZpbmFsbHkoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0T3duZWRTdGVwcy5kZWxldGUocy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgam9pbnMgYmVsb3cgc2l0IEJFVFdFRU4gdGhlc2UgcHJvbWlzZXMnIGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGBQcm9taXNlLmFsbGAgdGhhdCByZWFkcyB0aGVtLCBzbyBhIGJvZHkgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVqZWN0cyB3aGlsZSBhIHB1Ymxpc2ggb3IgYSB0cmFpbGluZyBjaHVuayBjb21taXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGluIGZsaWdodCB3b3VsZCBoYXZlIG5vIGhhbmRsZXIgYXR0YWNoZWQgYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWNyb3Rhc2sgY2hlY2twb2ludDogYW4gYHVuaGFuZGxlZFJlamVjdGlvbmAsIGZhdGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBOb2RlJ3MgZGVmYXVsdCBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIDQxMiBzdGFsZS1jbGFpbSByZWplY3Rpb24gcmFjZXMgZXhhY3RseSB0aGF0IHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBub3c7IGV2ZXJ5IHJlamVjdGlvbiBpcyBzdGlsbCBvYnNlcnZlZCBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0cyBiZWxvdywgd2hpY2ggYXJlIHdoYXQgZGVjaWRlIHRoZSBvdXRjb21lLlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9taXNlIG9mIHN0ZXBFeGVjdXRpb25Qcm9taXNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpvaW4gdGhlIGRpc3BhdGNoIHB1Ymxpc2hlcyBsYXVuY2hlZCBhYm92ZSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvbGQncyBkZWZlcnJlZCBiYXRjaCB3b3JrICh0cmFpbGluZyBjaHVua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXRzICsgcGVyLWNodW5rIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMpOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm9kaWVzIGFyZSBhbHJlYWR5IHJ1bm5pbmcgaW4gcGFyYWxsZWwgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoLCBhbmQgdGhpcyBpbnZvY2F0aW9uIG11c3Qgbm90IGFjayBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgY3JlYXRlIGFuZCBwdWJsaXNoIGlzIGR1cmFibGUuIEEgZmFpbHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyBpdHMgb2xkIGNvbnRyYWN0IChmYWlsIHRoaXMgZGVsaXZlcnkgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1lc3NhZ2UgcmVkZWxpdmVycyksIGJ1dCB0aGUgaW4tZmxpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZGllcyBtdXN0IHNldHRsZSBmaXJzdDogYW4gb3duZWQgYm9keSBsZWZ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcgcGFzdCB0aGlzIGhhbmRsZXIgd291bGQgcmFjZSBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlc1NldHRsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkaXNwYXRjaEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChzdGVwRXhlY3V0aW9uUHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGRpc3BhdGNoRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvblByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhbGUgKDQxMikgcmVqZWN0aW9uIG9mIGFuIGlubGluZSBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW06IHRoZSBsb2FkZWQgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBpcyBtaXNzaW5nIGFuIGV2ZW50IHRoZSBiYWNrZW5kIGFscmVhZHkgaGFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgY2xhaW0gd2FzIGZlbmNlZCBieSB0aGUgZ3VhcmQgYW5kIG5vIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIHdlcmUgd3JpdHRlbi4gQWJhbmRvbiB0aGUgYmF0Y2ggKGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIGJvZHkgcmVzdWx0IGlzIGRpc2NhcmRlZCBieSBleGVjdXRlU3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29uY2lsaWF0aW9uKSBhbmQgcmVzdGFydCB0aGUgcmVwbGF5IHNvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVzIHRoZSBtaXNzaW5nIGV2ZW50LiBXYWl0IGZvciB0aGUgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb25zIHRvIHNldHRsZSBmaXJzdCBzbyBubyBvd25lZCBib2R5IGlzIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCB3aGVuIHRoZSByZXN0YXJ0IChvciB0aGUgYWNrIHBhdGgpIHJ1bnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdGVwRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc2libGluZyB3aG9zZSBjbGFpbSB3YXMgYWNjZXB0ZWQgd3JvdGUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyBvZiBpdHMgb3duLCBwb3NzaWJseSBhZnRlciB0aGUgV29ybGQgYnVpbHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIDQxMidzIGRlbHRhLCBzbyB0aGF0IGRlbHRhIGNhbiBubyBsb25nZXIgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWVkIHRvIGNvbXBsZXRlIHRoZSBsb2csIGFuZCB0aGUgcmVzdGFydCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byByZWxvYWQgaXQgaW4gZnVsbC4gYHNraXBwZWRgICh0aGUgc3RlcCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RlZCksIGBnb25lYCBhbmQgYHRocm90dGxlZGAgKGNsYWltIHJlamVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ1dyb3RlID0gc2V0dGxlZC5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGNvbWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Y29tZS52YWx1ZS50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdyZXRyeScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdpbmxpbmUtY2xhaW0nLCBzdGVwRXJyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVsdGE6ICFzaWJsaW5nV3JvdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsbHkgYmVsb3cgcmVzdW1lcyB0aGUgcmVwbGF5IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsbHkgYmVsb3cgcmVzdW1lcyB0aGUgcmVwbGF5IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGlzIHJldHVybiAob3IgdGhyb3cpIGNvbXBsZXRlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lubGluZS1jbGFpbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXNjYWxhdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIGJhdGNoIHJlc3VsdHMuIGByZXRyeWAgc3RlcHMgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGVpciBgc3RlcF9zdGFydGVkYCBzdWNjZWVkZWQpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcXVldWVkIHBlci1zdGVwIGFzIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5OyBgdGhyb3R0bGVkYCBzdGVwcyAocmVqZWN0ZWQgb24gdGhlIGNyZWF0ZS1jbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG5ldmVyIGNyZWF0ZWQpIGluc3RlYWQgZGVmZXIgcmVkZWxpdmVyeSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSBzbyB0aGV5IHJlLXJ1biBpbmxpbmUgd2l0aCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVwbGF5OyBjb21wbGV0ZWQvZmFpbGVkIHN0ZXBzIGFscmVhZHkgd3JvdGUgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50cy4gV2Ugb25seSBsb29wIGJhY2sgdG8gcmVwbGF5IHdoZW4gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSwgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtcGVuZGluZyBzdGVwcyB3aWxsIGJlIHJlLXJ1biBieSB0aGVpciBxdWV1ZWQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFuZCB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5cyBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6ICh0eXBlb2YgaW5saW5lRXhlY3V0aW9ucylbbnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbnlQZW5kaW5nT3BzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRocm90dGxlZCBpbmxpbmUgc3RlcCBkZWxheXMgcmVkZWxpdmVyeSBvZiBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSByYXRoZXIgdGhhbiBiZWluZyByZS1xdWV1ZWQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwLiBDcnVjaWFsbHksIGEgYHRocm90dGxlZGAgcmVzdWx0IG1lYW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCB3YXMgcmVqZWN0ZWQgb24gdGhlIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltLCBzbyB0aGUgc3RlcCB3YXMgTkVWRVIgY3JlYXRlZCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgLCBubyBzdGVwIGVudGl0eSkuIFJlLXF1ZXVpbmcgaXQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwIHdvdWxkIHNlbmQgYSBiYXJlIGBzdGVwX3N0YXJ0ZWRgIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQpLCB3aGljaCB0aGUgd29ybGQgcmVqZWN0cyB3aXRoIGBTdGVwIFwiPGlkPlwiIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmRgIGJlY2F1c2UgaXQgY2Fubm90IGxhemlseSBjcmVhdGUgdGhlIHN0ZXAgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGlucHV0OyB0aGF0IGVycm9yIGlzbid0IHRyYW5zbGF0YWJsZSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlZGVsaXZlcnMgdW50aWwgTUFYX1FVRVVFX0RFTElWRVJJRVMgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCAoYW5kIHJ1bikgZmFpbC4gRGVmZXJyaW5nIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgaW5zdGVhZCByZS1hdHRlbXB0cyB0aGUgdGhyb3R0bGVkIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBXSVRIIGl0cyBpbnB1dCBvbiByZXBsYXkuIFdlIHRyYWNrIHRoZSBsb25nZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrb2ZmIHNvIGEgYmF0Y2ggd2l0aCBtdWx0aXBsZSB0aHJvdHRsZXMgd2FpdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXguIE5vdGU6IGByZXRyeWAgcmVzdWx0cyBhcmUgc2FmZSB0byByZS1xdWV1ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyBiZWNhdXNlIGEgcmV0cnkgaW1wbGllcyBgc3RlcF9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzdWNjZWVkZWQgYW5kIHRoZSBzdGVwIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aHJvdHRsZVRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5saW5lRXhlY3V0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc3RlcFJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpbmxpbmVFeGVjdXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IHIudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRpbWVvdXRTZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVBlbmRpbmdPcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZlciByZWRlbGl2ZXJ5IG9mIHRoZSBvcmNoZXN0cmF0b3IgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm90dGxlIGJhY2tvZmYuIE9uIHJlcGxheSBldmVyeSBub24tdGVybWluYWwgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZS1kaXNwYXRjaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXI6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC10aHJvdHRsZWQgc3RlcHMgcnVuIGlubGluZSBhZ2FpbiBXSVRIIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0ICh0aGVpciBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCBhbmV3KSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBgcmV0cnlgIHN0ZXBzIGluIHRoaXMgYmF0Y2ggYXJlIHF1ZXVlZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duIHJldHJ5QWZ0ZXIgaG9ub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RlcHMgKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZWQgZnJvbSB0aGVpciBldmVudHMgYW5kIG5vdCByZS1ydW4uIEJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBkcml2ZXMgYWxsIHJlbWFpbmluZyB3b3JrLCB3ZSBtdXN0IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJlLXF1ZXVlIGB0b1JldHJ5YCBoZXJlLCBzaW5jZSB0aGF0IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1kaXNwYXRjaCB0aG9zZSBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEJFRk9SRSB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgc28gYSBiYXRjaCB0aGF0IG1peGVzIGEgdGhyb3R0bGUgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdGVwIHRoYXQgbGVmdCB1bmZsdXNoZWQgb3BzIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBleHBsaWNpdCBmbHVzaCBjb250aW51YXRpb24uIFRoYXQgaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0aHJvdHRsZSBiYWNrb2ZmICg+PSAxcykgYWx3YXlzIGV4Y2VlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLWludm9jYXRpb24gZmx1c2ggd2luZG93ICg8PSA1MDBtcyArIHdhaXRVbnRpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9wcyBzZXR0bGUgYmVmb3JlIHRoZSBwb3N0LWJhY2tvZmYgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzIGFuZCByZWFkcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UodGhyb3R0bGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5tYXAoKHsgc3RlcCwgZGVsYXlTZWNvbmRzIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJldHJ5VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSB0aGUgZGVsYXllZCByZXRyeSBvbiB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2gga2V5IHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCB1c2VzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGVwTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCBwZW5kaW5nIGJhY2tncm91bmQgb3BlcmF0aW9ucyBmbHVzaCBiZWZvcmUgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSByZWFkcyB0aGVpciByZXN1bHRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueVBlbmRpbmdPcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnJlYWtpbmcgbG9vcDogaW5saW5lIHN0ZXAgaGFzIHBlbmRpbmcgb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBsb29wSXRlcmF0aW9uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBpbmxpbmUgc3RlcHMgd2lsbCBiZSByZS1ydW4gdmlhIHRoZWlyIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBtZXNzYWdlczsgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbGwgc3RlcHMgYXJlIHRlcm1pbmFsLiBEb24ndCBsb29wIGhlcmU6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyBzdGVwcyBoYXZlIG5vIHRlcm1pbmFsIGV2ZW50IHRvIG9ic2VydmUgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbmxpbmUgc3RlcHMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpLCBzbyBsb29wIGJhY2sgdG8gcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHdvcmtmbG93IG9ic2VydmVzIHRoZSB0ZXJtaW5hbCBldmVudHMgb24gcmVwbGF5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBhbnkgaW5saW5lIGRlbHRhLiBJZiBpdCBpcyBwYXJ0aWFsLCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBpdHMgY3Vyc29yIGluc3RlYWQgb2YgcmVhZGluZyB0aGUgcGFnZSBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVFeGVjdXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmx5ID0gc3RlcFJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmx5LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmIG9ubHkuaW5saW5lRGVsdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgb25seS5pbmxpbmVEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBvbmx5LmlubGluZURlbHRhLmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gb2YgYSBndWFyZGVkIHdyaXRlIG1hZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGJ5IHRoZSByZXBsYXkgbG9vcDogdGhlIHJlc3VsdC1iZWFyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcnVuX2NvbXBsZXRlZGAsIG9yIHRoZSBgd2FpdF9jb21wbGV0ZWRgIG9mIHRoZSB3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLiBCb3RoIHJlYWNoIHRoaXMgb25lIGNhdGNoIGFuZCB0aGUgcmVqZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBzYXkgd2hpY2gsIGhlbmNlIHRoZSBuZXV0cmFsIGxhYmVsLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVpdGhlciBtYXkgYmUgcmUtcG9zdGVkIGluIHBsYWNlOiB0aGUgY29ycmVsYXRpb24gaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCAoZm9yIHJ1bl9jb21wbGV0ZWQpIHRoZSByZXN1bHQgaXRzZWxmIGNhbWUgZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXBsYXksIGFuZCBhIGNvcnJlY3RlZCBsb2cgbWF5IHByb2R1Y2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBvbmVzLiBEb24ndCBmYWlsIHRoZSBydW46IHJlc3RhcnQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgaW4gdGhpcyBpbnZvY2F0aW9uLCBhbmQgb25seSBvbmNlIHRoYXQgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzcGVudCBzY2hlZHVsZSBhbiBleHBsaWNpdCByZS1pbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0aHJvd2luZyBpbnN0ZWFkIHdvdWxkIHJlbHkgb24gcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgbWVzc2FnZSwgd2hpY2ggdGhlIHR1cmJvIHBhdGggaGFzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkLiBFbXBpcmljYWxseSB0aGUgcnVuIHRoZW4gc3RhbGxzIGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlJ3MgfjMwMHMgZGVmYXVsdCB2aXNpYmlsaXR5IHRpbWVvdXQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm1pbmFsRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdGFydFJlcGxheUluUHJvY2VzcygncmVwbGF5LXdyaXRlJywgZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPSBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGxheS13cml0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudC4gRmFsbCB0aHJvdWdoIHRvIHRoZSB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGJlbG93IGluc3RlYWQgb2YgcmV0aHJvd2luZzogdGhpcyBjYXRjaCBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxpbmcgdGhlIHJ1biwgYW5kIGEgcmV0aHJvdyB3b3VsZCBlc2NhcGUgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIGhhbmRsZXIgYW5kIGJlIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yID0gZXNjYWxhdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGluZnJhc3RydWN0dXJlIGZhaWx1cmVzIHRhbGtpbmcgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZCAod29ya2Zsb3ctc2VydmVyKSwgc3VjaCBhcyBhbiBleGhhdXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5QWdlbnQgKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQyOS81MDMgc3Rvcm0pLCBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlLCBvciBhIGNsaWVudCB0aW1lb3V0LCBtdXN0IE5PVCBmYWlsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuLiBSZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIHJldHJpZXMgdGhlIHJlcGxheSBvbmNlIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVycy4gVGhlIEB2ZXJjZWwvcXVldWUgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGllcyBhIGZhc3QgKDFz4oaSNjBzKSBiYWNrb2ZmIGJ5IGRlbGl2ZXJ5IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWRpbmcgdGhlIH41bWluIGRlZmF1bHQgdmlzaWJpbGl0eS10aW1lb3V0IHJlZHJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbmQgbmV2ZXIga2lsbGluZyB0aGUgcHJvY2VzcyB2aWEgcnVuX2ZhaWxlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyYW5zaWVudCB3b3JsZCBlcnJvciBkdXJpbmcgcmVwbGF5OyByZWRlbGl2ZXJpbmcgdmlhIHF1ZXVlIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ZXJnZW5jZUNvdW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RGl2ZXJnZW5jZT8uY291bnQgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWNvdmVyeVJlcGxheXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpdmVyZ2VuY2VDb3VudCA8PSBtYXhSZWNvdmVyeVJlcGxheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQ7IHF1ZXVlaW5nIGEgcmVjb3ZlcnkgcmVwbGF5IGJlZm9yZSBkZWNsYXJpbmcgdGhlIGV2ZW50IGxvZyBjb3JydXB0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfRElWRVJHRU5DRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvckRpdmVyZ2VuY2VFdmVudElkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U/LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWNvdmVyeVJlcGxheXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlID0gZGl2ZXJnZW5jZUNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yID0gbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJlcGxheSBkaXZlcmdlZCAke2RpdmVyZ2VuY2VDb3VudH0gdGltZXMgYWZ0ZXIgJHttYXhSZWNvdmVyeVJlcGxheXN9IHJlY292ZXJ5IHJlcGxheXM7IGxhdGVzdCBkaXZlcmdlbnQgZXZlbnQgd2FzICR7ZXJyLmV2ZW50SWR9LiBMYXN0IGRpdmVyZ2VuY2U6ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBsYXlTdGFydCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNvZGUgZXJyb3JzIGFuZCB0ZXJtaW5hbCBydW50aW1lIGVycm9ycyBmYWlsIHRoZSBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWxFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IodGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3IubmFtZSB8fCBnZXRFcnJvck5hbWUodGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBub3JtYWxpemVkRXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2sodGVybWluYWxFcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3I6IFdvcmtmbG93UnVudGltZUVycm9yIGluZGljYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gU0RLL3J1bnRpbWUgaXNzdWUsIGFuZCBzZWxlY3RlZCBzdWJjbGFzc2VzIHVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBzcGVjaWZpYyBjb2RlcyBmb3IgYmFja2VuZCB0cmFja2luZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGNsYXNzaWZ5UnVuRXJyb3IodGVybWluYWxFcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIHJ1bm5pbmcgd29ya2Zsb3cnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSB0aGUgc291cmNlLW1hcC1yZW1hcHBlZCBzdGFjayB0byB0aGUgdGhyb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzbyB0aGF0IHRoZSBzZXJpYWxpemVkIGVycm9yIHByZXNlcnZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbnN1bWVycy4gYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgaXMgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgIGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBydW5zIGluIGEgc2VwYXJhdGUgVk0gcmVhbG06IGl0cyBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MgaXMgZGlzdGluY3QgZnJvbSB0aGUgaG9zdCdzLCBzbyBgaW5zdGFuY2VvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3JgIGlzIGBmYWxzZWAgZm9yIFZNLXRocm93biBlcnJvcnMuIFRoZSBWOFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSB0YWcgd29ya3MgYWNyb3NzIHJlYWxtcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pc05hdGl2ZUVycm9yKHRlcm1pbmFsRXJyb3IpICYmIGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlcm1pbmFsRXJyb3IgYXMgRXJyb3IpLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgd29ya2Zsb3cgcnVuIHZpYSBldmVudCAoZXZlbnQtc291cmNlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBzbyBpdHMgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBpZGVudGl0eSBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpa2UgZXZlcnkgb3RoZXIgd3JpdGUgZnJvbSB0aGlzIGxvb3AgaXQgY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3Qgc25hcHNob3QsIHNvIGEgV29ybGQgdGhhdCBmZW5jZXMgY2FuIHJlamVjdCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGEgc2xvdC1hbGxvY2F0aW5nIG9uZSByZXBvcnRzIGJhY2sgd2hhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxpbmcgcmVwbGF5IGhhZCBub3Qgc2Vlbi4gRmFpbC1vcGVuIG9uIHB1cnBvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIG5laXRoZXIgYXBwbGllczogYSBzcHVyaW91cyBmYWlsdXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyYWJsZSAodGhlIHJ1biBjYW4gYmUgcmUtcnVuIGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXNoYm9hcmQpLCB3aGVyZWFzIGEgc3B1cmlvdXMgKmNvbXBsZXRpb24qIGNvbW1pdHMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvbmcgcmVzdWx0LlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgd29ybGQgY29udHJhY3QgZXJyb3Igd2hpbGUgcmVjb3JkaW5nIHdvcmtmbG93IGZhaWx1cmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxFcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmYWlsRXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JOYW1lKGVycm9yTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JUeXBlKGVycm9yTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICBsZXQgY2FjaGVkSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbiAgbGV0IGludm9jYXRpb25Db3VudCA9IDA7XG4gIGNvbnN0IGVudHJ5cG9pbnRDcmVhdGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByb3V0ZU1vZHVsZUJvZHlJbml0TXMgPVxuICAgIHR5cGVvZiBvcHRpb25zPy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQgPT09ICdudW1iZXInXG4gICAgICA/IGVudHJ5cG9pbnRDcmVhdGVkQXQgLSBvcHRpb25zLnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaW52b2NhdGlvbkNvdW50ICs9IDE7XG4gICAgY29uc3QgaGFuZGxlckNhY2hlZCA9IGNhY2hlZEhhbmRsZXIgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGFuS2luZCA9IGF3YWl0IGdldFNwYW5LaW5kKCdTRVJWRVInKTtcblxuICAgIHJldHVybiB0cmFjZShcbiAgICAgICd3b3JrZmxvdy5yb3V0ZS5mbG93JyxcbiAgICAgIHtcbiAgICAgICAga2luZDogc3BhbktpbmQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZVR5cGUoJ2Zsb3cnKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuRmFhc0luc3RhbmNlKENPTVBVVEVfSU5TVEFOQ0VfSUQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSGFuZGxlckNhY2hlZChoYW5kbGVyQ2FjaGVkKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUludm9jYXRpb25Db3VudChpbnZvY2F0aW9uQ291bnQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlRW50cnlwb2ludEFnZU1zKFxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGVudHJ5cG9pbnRDcmVhdGVkQXRcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLihyb3V0ZU1vZHVsZUJvZHlJbml0TXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBBdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlJbml0TXMocm91dGVNb2R1bGVCb2R5SW5pdE1zKSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSZXF1ZXN0TWV0aG9kKHJlcS5tZXRob2QpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUm91dGUoJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93JyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICAgICAgY2FjaGVkSGFuZGxlciA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5pbml0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIGZ1bGwgcnVudGltZSBXb3JsZCwgbm90IGBnZXRXb3JsZEhhbmRsZXJzKClgLiBUaGF0IGFjY2Vzc29yXG4gICAgICAgICAgICAvLyBvd25zIGEgc2Vjb25kLCBidWlsZC10aW1lLXNhZmUgY2FjaGUsIHNvIGNhbGxpbmcgaXQgaGVyZSBidWlsdCBhXG4gICAgICAgICAgICAvLyBzZWNvbmQgV29ybGQgaW4gdGhlIHNhbWUgcHJvY2VzczogZHVwbGljYXRlIGNvbm5lY3Rpb24gcG9vbHMgYW5kXG4gICAgICAgICAgICAvLyBxdWV1ZSB3b3JrZXJzIGZvciBhIHN0YXRlZnVsIFdvcmxkLCBwbHVzIGEgc2Vjb25kIGNvcHkgb2YgdGhhdFxuICAgICAgICAgICAgLy8gd29ybGQgcGFja2FnZSdzIG1vZHVsZXMgb25jZSBpdCBpcyBidW5kbGVkLCB3aGljaCBpcyB3aGF0XG4gICAgICAgICAgICAvLyBzaWxlbnRseSBkZW1vdGVkIHRoZSBldmVudHMgV2ViU29ja2V0IHRyYW5zcG9ydCB0byBIVFRQLiAjMzY2NS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgc3BhbiBrZWVwcyBpdHMgb3JpZ2luYWwgbmFtZS4gSXQgaXMgYSBkaXN0aW5jdCBzcGFuIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBwZXItcmVxdWVzdCBgd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkYCBhdCB0aGUgdG9wIG9mIHRoZSBmbG93XG4gICAgICAgICAgICAvLyByb3V0ZSwgYW5kIHJlbmFtaW5nIGl0IHdvdWxkIGNvbGxpZGUgd2l0aCB0aGF0IG9uZS5cbiAgICAgICAgICAgIGNvbnN0IHdvcmxkSGFuZGxlcnMgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgICAgICAgJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZF9oYW5kbGVycycsXG4gICAgICAgICAgICAgIGFzeW5jICgpID0+IGdldFdvcmxkKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlcih3b3JsZEhhbmRsZXJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FjaGVkSGFuZGxlcihyZXEpO1xuICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICBBdHRyaWJ1dGUuSHR0cFJlc3BvbnNlU3RhdHVzQ29kZShyZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG4iXX0=
|