footprintjs 10.3.0 → 10.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
- package/dist/esm/lib/capture/absentEntries.js +81 -0
- package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/esm/lib/capture/checkpointCapture.js +104 -0
- package/dist/esm/lib/capture/historyData.d.ts +9 -0
- package/dist/esm/lib/capture/historyData.js +79 -0
- package/dist/esm/lib/capture/historyNote.d.ts +4 -0
- package/dist/esm/lib/capture/historyNote.js +52 -0
- package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
- package/dist/esm/lib/capture/historyTarget.js +35 -0
- package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
- package/dist/esm/lib/capture/historyTypes.js +4 -0
- package/dist/esm/lib/capture/nativeCoverage.d.ts +20 -7
- package/dist/esm/lib/capture/nativeCoverage.js +50 -12
- package/dist/esm/lib/capture/noteShape.d.ts +10 -0
- package/dist/esm/lib/capture/noteShape.js +93 -0
- package/dist/esm/lib/capture/readSources.d.ts +43 -0
- package/dist/esm/lib/capture/readSources.js +78 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/esm/lib/engine/types.d.ts +3 -0
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +8 -0
- package/dist/esm/lib/memory/StageContext.js +84 -9
- package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
- package/dist/esm/lib/memory/runPolicy.js +2 -1
- package/dist/esm/lib/pause/record.js +8 -2
- package/dist/esm/lib/pause/types.d.ts +2 -0
- package/dist/esm/lib/pause/types.js +1 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +17 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +33 -4
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +48 -10
- package/dist/esm/lib/runner/attach.js +3 -1
- package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
- package/dist/esm/lib/runner/captureHistory.js +106 -0
- package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/index.d.ts +1 -0
- package/dist/esm/lib/runner/index.js +1 -1
- package/dist/esm/lib/runner/options.js +42 -3
- package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
- package/dist/esm/lib/runner/readStoredCapture.js +36 -0
- package/dist/esm/lib/runner/recordSink.d.ts +11 -0
- package/dist/esm/lib/runner/recordSink.js +47 -4
- package/dist/esm/lib/runner/snapshot.js +2 -2
- package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
- package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
- package/dist/esm/lib/sinks/fileSink.js +8 -2
- package/dist/esm/trace.d.ts +2 -0
- package/dist/esm/trace.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/absentEntries.js +86 -0
- package/dist/lib/capture/checkpointCapture.js +110 -0
- package/dist/lib/capture/historyData.js +85 -0
- package/dist/lib/capture/historyNote.js +56 -0
- package/dist/lib/capture/historyTarget.js +40 -0
- package/dist/lib/capture/historyTypes.js +7 -0
- package/dist/lib/capture/nativeCoverage.js +52 -13
- package/dist/lib/capture/noteShape.js +103 -0
- package/dist/lib/capture/readSources.js +83 -0
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +84 -9
- package/dist/lib/memory/runPolicy.js +2 -1
- package/dist/lib/pause/record.js +8 -2
- package/dist/lib/pause/types.js +1 -1
- package/dist/lib/runner/ExecutionRuntime.js +32 -3
- package/dist/lib/runner/FlowChartExecutor.js +48 -10
- package/dist/lib/runner/attach.js +3 -1
- package/dist/lib/runner/captureHistory.js +110 -0
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/index.js +1 -1
- package/dist/lib/runner/options.js +42 -3
- package/dist/lib/runner/readStoredCapture.js +40 -0
- package/dist/lib/runner/recordSink.js +47 -4
- package/dist/lib/runner/snapshot.js +2 -2
- package/dist/lib/runner/storedCaptureAdmission.js +101 -0
- package/dist/lib/sinks/fileSink.js +8 -2
- package/dist/trace.js +4 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/capture/absentEntries.d.ts +7 -0
- package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/types/lib/capture/historyData.d.ts +9 -0
- package/dist/types/lib/capture/historyNote.d.ts +4 -0
- package/dist/types/lib/capture/historyTarget.d.ts +5 -0
- package/dist/types/lib/capture/historyTypes.d.ts +39 -0
- package/dist/types/lib/capture/nativeCoverage.d.ts +20 -7
- package/dist/types/lib/capture/noteShape.d.ts +10 -0
- package/dist/types/lib/capture/readSources.d.ts +43 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/types/lib/engine/types.d.ts +3 -0
- package/dist/types/lib/memory/StageContext.d.ts +8 -0
- package/dist/types/lib/memory/runPolicy.d.ts +5 -1
- package/dist/types/lib/pause/types.d.ts +2 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +17 -3
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/types/lib/runner/captureHistory.d.ts +8 -0
- package/dist/types/lib/runner/checkpoint.d.ts +2 -0
- package/dist/types/lib/runner/index.d.ts +1 -0
- package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
- package/dist/types/lib/runner/recordSink.d.ts +11 -0
- package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/types/lib/sinks/fileSink.d.ts +2 -1
- package/dist/types/trace.d.ts +2 -0
- package/package.json +2 -2
|
@@ -36,6 +36,7 @@ const redaction_js_1 = require("../memory/redaction.js");
|
|
|
36
36
|
const runPolicy_js_1 = require("../memory/runPolicy.js");
|
|
37
37
|
const types_js_2 = require("../pause/types.js");
|
|
38
38
|
const attach_js_1 = require("./attach.js");
|
|
39
|
+
const captureHistory_js_1 = require("./captureHistory.js");
|
|
39
40
|
const checkpoint_js_1 = require("./checkpoint.js");
|
|
40
41
|
const deadline_js_2 = require("./deadline.js");
|
|
41
42
|
const ExecutionRuntime_js_1 = require("./ExecutionRuntime.js");
|
|
@@ -73,6 +74,7 @@ class FlowChartExecutor {
|
|
|
73
74
|
*/
|
|
74
75
|
_isExecuting = false;
|
|
75
76
|
captureSignal;
|
|
77
|
+
captureHistoryLease;
|
|
76
78
|
failureState = new terminalFailure_js_1.NativeFailureState();
|
|
77
79
|
/** Safe native context for the latest rejected leg; undefined before, during, after success or pause. */
|
|
78
80
|
getFailureContext() {
|
|
@@ -136,6 +138,7 @@ class FlowChartExecutor {
|
|
|
136
138
|
leaf = leaf.next;
|
|
137
139
|
runtime.rootStageContext = leaf.createNext('', effectiveRoot.name, effectiveRoot.id);
|
|
138
140
|
runtime.usePolicy(policy);
|
|
141
|
+
runtime.resumeReadSources(this._currentRunId);
|
|
139
142
|
}
|
|
140
143
|
else {
|
|
141
144
|
const record = overrides?.record;
|
|
@@ -145,7 +148,12 @@ class FlowChartExecutor {
|
|
|
145
148
|
sink: record.link.sink,
|
|
146
149
|
address: { logRunId: this._currentRunId, drillPath: [] },
|
|
147
150
|
...(record.meta && { meta: record.meta }),
|
|
148
|
-
}
|
|
151
|
+
}, this._currentRunId
|
|
152
|
+
? {
|
|
153
|
+
runId: this._currentRunId,
|
|
154
|
+
...(overrides?.resume && { unavailable: 'resumed-source-ownership' }),
|
|
155
|
+
}
|
|
156
|
+
: undefined);
|
|
149
157
|
}
|
|
150
158
|
runtime.rootStageContext.failureState = this.failureState;
|
|
151
159
|
try {
|
|
@@ -176,7 +184,7 @@ class FlowChartExecutor {
|
|
|
176
184
|
...(maxDepth !== undefined && { maxDepth }),
|
|
177
185
|
...(maxIterations !== undefined && { maxIterations }),
|
|
178
186
|
});
|
|
179
|
-
if (args.captureCoverage && this._currentRunId)
|
|
187
|
+
if ((args.captureCoverage || policy.readSources) && this._currentRunId)
|
|
180
188
|
runtime.beginCapture(this._currentRunId);
|
|
181
189
|
return traverser;
|
|
182
190
|
}
|
|
@@ -348,7 +356,10 @@ class FlowChartExecutor {
|
|
|
348
356
|
}));
|
|
349
357
|
}
|
|
350
358
|
this.record = record;
|
|
351
|
-
this.captureSignal =
|
|
359
|
+
this.captureSignal =
|
|
360
|
+
this.flowChartArgs.captureCoverage || this.flowChartArgs.dials.readSources ? armed.signal : undefined;
|
|
361
|
+
// A fresh-executor resume also starts a segment, never a newly observed whole workflow.
|
|
362
|
+
this.traverser.getRuntime().capture?.limit('resumed-segment');
|
|
352
363
|
// Before the traversal on purpose: `onResume` precedes `onRunStart`.
|
|
353
364
|
disposeOnThrow(armed, () => (0, resume_js_1.announceResume)(plan, resumeInput, {
|
|
354
365
|
runId: this._currentRunId,
|
|
@@ -397,7 +408,13 @@ class FlowChartExecutor {
|
|
|
397
408
|
this.observers.deferredTier?.terminalFlush();
|
|
398
409
|
if ((0, types_js_2.isPauseSignal)(error)) {
|
|
399
410
|
const redactionMarks = this.redactionRule.marksForCheckpoint();
|
|
411
|
+
const runtime = this.traverser.getRuntime();
|
|
412
|
+
const capture = runtime.capture?.runId === this._currentRunId ? runtime.capture : undefined;
|
|
413
|
+
// Checkpoint creation cannot depend on a prior servedSnapshot() to notice active redaction.
|
|
414
|
+
if (capture && runtime.rootStageContext.getPolicy().redaction?.isInert() === false)
|
|
415
|
+
capture.limit('redaction-active');
|
|
400
416
|
this.lastCheckpoint = (0, checkpoint_js_1.buildPauseCheckpoint)(error, this.traverser, {
|
|
417
|
+
...(capture && { capture: runtime.captureSnapshot(runtime.executionHistory.length) }),
|
|
401
418
|
runId: this._currentRunId,
|
|
402
419
|
executionCount: this._executionCounter.value,
|
|
403
420
|
visitCounts: this._visitCounts,
|
|
@@ -416,6 +433,15 @@ class FlowChartExecutor {
|
|
|
416
433
|
* the `RecordSinkError`.
|
|
417
434
|
*/
|
|
418
435
|
async settleRecorded(armed, record) {
|
|
436
|
+
try {
|
|
437
|
+
return await this.settleRecordedLeg(armed, record);
|
|
438
|
+
}
|
|
439
|
+
finally {
|
|
440
|
+
this._isExecuting = false;
|
|
441
|
+
armed.dispose();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
async settleRecordedLeg(armed, record) {
|
|
419
445
|
const runtime = this.traverser.getRuntime();
|
|
420
446
|
let outcome;
|
|
421
447
|
let result;
|
|
@@ -450,24 +476,34 @@ class FlowChartExecutor {
|
|
|
450
476
|
this.finishCapture('failed', error);
|
|
451
477
|
throw error;
|
|
452
478
|
}
|
|
453
|
-
finally {
|
|
454
|
-
this._isExecuting = false;
|
|
455
|
-
armed.dispose();
|
|
456
|
-
}
|
|
457
479
|
if (failure) {
|
|
458
480
|
this.failureState.finish(failure.error);
|
|
459
481
|
this.finishCapture('failed', failure.error);
|
|
482
|
+
await this.saveCaptureHistory(runtime, record);
|
|
460
483
|
throw failure.error;
|
|
461
484
|
}
|
|
462
485
|
if (record.fatal) {
|
|
463
486
|
this.failureState.finish(record.fatal);
|
|
464
487
|
this.finishCapture('failed', record.fatal);
|
|
488
|
+
await this.saveCaptureHistory(runtime, record);
|
|
465
489
|
throw record.fatal;
|
|
466
490
|
}
|
|
467
|
-
this.failureState.complete();
|
|
468
491
|
this.finishCapture(outcome === 'paused' ? 'paused' : 'completed');
|
|
492
|
+
await this.saveCaptureHistory(runtime, record);
|
|
493
|
+
if (record.fatal) {
|
|
494
|
+
// The native prefix already ended; a later storage rejection owns no successful stage.
|
|
495
|
+
this.failureState.finish(record.fatal);
|
|
496
|
+
throw record.fatal;
|
|
497
|
+
}
|
|
498
|
+
this.failureState.complete();
|
|
469
499
|
return result;
|
|
470
500
|
}
|
|
501
|
+
saveCaptureHistory(runtime, record) {
|
|
502
|
+
if (!record.captureOptions)
|
|
503
|
+
return Promise.resolve();
|
|
504
|
+
this.captureHistoryLease ??= { pending: false };
|
|
505
|
+
return (0, captureHistory_js_1.persistCaptureHistory)(runtime, record, () => this.getSnapshot(), this.captureHistoryLease);
|
|
506
|
+
}
|
|
471
507
|
finishCapture(status, error) {
|
|
472
508
|
const signal = this.captureSignal;
|
|
473
509
|
this.captureSignal = undefined;
|
|
@@ -479,6 +515,7 @@ class FlowChartExecutor {
|
|
|
479
515
|
if (status === 'completed' && this.traverser.getBreakState().shouldBreak)
|
|
480
516
|
capture.limit('execution-broken');
|
|
481
517
|
capture.end(cancelled ? 'cancelled' : status, status === 'failed' ? this.failureState.result : undefined);
|
|
518
|
+
runtime.readSources?.seal(runtime.executionHistory.length);
|
|
482
519
|
}
|
|
483
520
|
/**
|
|
484
521
|
* What a new root log opens with: names and numbers the run already serves — the run, the chart, the correlation,
|
|
@@ -706,7 +743,8 @@ class FlowChartExecutor {
|
|
|
706
743
|
}));
|
|
707
744
|
// Set once the leg's traverser exists, so a snapshot never pairs one run's state with another's sink stats.
|
|
708
745
|
this.record = record;
|
|
709
|
-
this.captureSignal =
|
|
746
|
+
this.captureSignal =
|
|
747
|
+
this.flowChartArgs.captureCoverage || this.flowChartArgs.dials.readSources ? armed.signal : undefined;
|
|
710
748
|
// After every sync throw, with no await since the guard: race-free.
|
|
711
749
|
this._isExecuting = true;
|
|
712
750
|
if (record)
|
|
@@ -839,4 +877,4 @@ function disposeOnThrow(armed, build) {
|
|
|
839
877
|
throw error;
|
|
840
878
|
}
|
|
841
879
|
}
|
|
842
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUlILDhEQUF3RDtBQUN4RCx3REFBcUQ7QUFFckQsaURBQTZEO0FBRTdELGlEQUFvSDtBQUtwSCxtR0FBNkY7QUFFN0YscUZBQStFO0FBQy9FLGlEQVM0QjtBQUM1QixxRUFBK0Y7QUFFL0YseURBQXVEO0FBQ3ZELHlEQUFtRDtBQUVuRCxnREFBa0Q7QUFJbEQsMkNBQTJDO0FBQzNDLG1EQUF1RDtBQUN2RCwrQ0FBc0Q7QUFFdEQsK0RBQStFO0FBQy9FLDZDQUFxRztBQUNyRyxtREFBb0U7QUFDcEUsMkNBQXVFO0FBQ3ZFLHlDQUEyQztBQUMzQywrQ0FBK0M7QUFDL0MseURBQW1EO0FBRW5ELE1BQWEsaUJBQWlCO0lBQ3BCLFNBQVMsQ0FBbUM7SUFDcEQ7MkZBQ3VGO0lBQy9FLGlCQUFpQixHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2pDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNqRCx5RkFBeUY7SUFDakYsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMzQixtRkFBbUY7SUFDbEUsU0FBUyxHQUFHLElBQUksd0JBQVksRUFBRSxDQUFDO0lBQ3hDLGVBQWUsQ0FBOEI7SUFDckQsaUZBQWlGO0lBQ3pFLGFBQWEsR0FBRyxJQUFJLDRCQUFhLEVBQUUsQ0FBQztJQUNwQyxjQUFjLENBQWtDO0lBQ3hEOzs7OztPQUtHO0lBQ0ssYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM5Qjs7OztPQUlHO0lBQ0ssWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixhQUFhLENBQWU7SUFDNUIsWUFBWSxHQUFHLElBQUksdUNBQWtCLEVBQUUsQ0FBQztJQUVoRCx5R0FBeUc7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LE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsSCxDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QiwyR0FBMkc7QUFDM0csU0FBUyxjQUFjLENBQUksS0FBZSxFQUFFLEtBQWM7SUFDeEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICpcbiAqIFRoZSBleGVjdXRvciBjb21wb3NlcyBmb3VyIG1vZHVsZXMsIG9uZSBqb2IgZWFjaCAoRjkpOiBgYXR0YWNoLnRzYCAod2hvXG4gKiBvYnNlcnZlcyBhIHJ1biksIGByZXN1bWUudHNgIChwbGFuIGFuZCBhbm5vdW5jZSBhIHJlLWVudHJ5KSwgYGNoZWNrcG9pbnQudHNgXG4gKiAodGhlIHBhdXNlIGNoZWNrcG9pbnQpLCBgc25hcHNob3QudHNgICh3aGF0IGBnZXRTbmFwc2hvdCgpYCBzZXJ2ZXMpLiBXaGF0XG4gKiBzdGF5cyBoZXJlIGlzIHRoZSBwZXItcnVuIHN0YXRlIGFuZCB0aGUgcnVuIGxpZmVjeWNsZSB0aGF0IHRocmVhZHMgaXQuXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0OiBkYXRhLCBlbnY6IHsgdHJhY2VJZDogJ3JlcS0xMjMnIH0gfSk7XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlLCBMb2dPdXRjb21lLCBNZXRhIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgYWRtaXRSdW5FbnYgfSBmcm9tICcuLi9hdHRlbXB0L2NvcnJlbGF0aW9uLmpzJztcbmltcG9ydCB7IGlzQ2FuY2VsbGVkIH0gZnJvbSAnLi4vYXR0ZW1wdC9kZWFkbGluZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1bkNvcnJlbGF0aW9uIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgeyB3YXJuRGVhZGxpbmVVbmRlckJ1ZGdldCB9IGZyb20gJy4uL2J1ZGdldC9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGV0YWNoQW5kRm9yZ2V0IGFzIF9kZXRhY2hBbmRGb3JnZXQsIGRldGFjaEFuZEpvaW5MYXRlciBhcyBfZGV0YWNoQW5kSm9pbkxhdGVyIH0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3JSZXN1bHQsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgZGVmYXVsdExvZ2dlcixcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRUcmFja2luZ01vZGUsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgcnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuLi9yZWNvcmRlci9FbWl0UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB7IFJ1bk9ic2VydmVycyB9IGZyb20gJy4vYXR0YWNoLmpzJztcbmltcG9ydCB7IGJ1aWxkUGF1c2VDaGVja3BvaW50IH0gZnJvbSAnLi9jaGVja3BvaW50LmpzJztcbmltcG9ydCB7IHR5cGUgQXJtZWRSdW4sIGFybVJ1biB9IGZyb20gJy4vZGVhZGxpbmUuanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRhY2hSZWNvcmRlck9wdGlvbnMsIE9ic2VydmVyRHJhaW5SZXN1bHQgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcbmltcG9ydCB7IHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IHR5cGUgRXhlY3V0b3JBcmdzLCB0eXBlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucywgcmVzb2x2ZUV4ZWN1dG9yQXJncyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlY29yZEZsdXNoUmVzdWx0LCBSdW5SZWNvcmQgfSBmcm9tICcuL3JlY29yZFNpbmsuanMnO1xuaW1wb3J0IHsgYW5ub3VuY2VSZXN1bWUsIHBsYW5SZXN1bWUsIHNlZWRDb3VudGVycyB9IGZyb20gJy4vcmVzdW1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUnVuSWQgfSBmcm9tICcuL3J1bklkLmpzJztcbmltcG9ydCB7IHNlcnZlZFNuYXBzaG90IH0gZnJvbSAnLi9zbmFwc2hvdC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUlucHV0IH0gZnJvbSAnLi92YWxpZGF0ZUlucHV0LmpzJztcblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT47XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgYW5kIHBlci1zdGFnZSB2aXNpdCBjb3VudHMgKGxvb3BJdGVyYXRpb24pIOKAlCBzaGFyZWQgQllcbiAgICogIFJFRkVSRU5DRSB3aXRoIGV2ZXJ5IHRyYXZlcnNlciBvZiB0aGUgcnVuOyBzdXJ2aXZlIHBhdXNlL3Jlc3VtZSwgcmVzZXQgb24gcnVuKCkuICovXG4gIHByaXZhdGUgX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07XG4gIHByaXZhdGUgX3Zpc2l0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgLyoqIEZyZXNoIHBlciBydW4oKSBhbmQgcGVyIHJlc3VtZSgpIOKAlCBzdGFtcGVkIG9uIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQgKGBydW5JZC50c2ApLiAqL1xuICBwcml2YXRlIF9jdXJyZW50UnVuSWQgPSAnJztcbiAgLyoqIFdobyBvYnNlcnZlcyB0aGUgcnVuIOKAlCBuYXJyYXRpdmUsIGlubGluZSBsaXN0cywgZGVmZXJyZWQgdGllciAoYGF0dGFjaC50c2ApLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG9ic2VydmVycyA9IG5ldyBSdW5PYnNlcnZlcnMoKTtcbiAgcHJpdmF0ZSByZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBydW4ncyBPTkUgcmVkYWN0aW9uIHJ1bGUgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCksIGJ1aWx0IGZyZXNoIHBlciBsZWcuICovXG4gIHByaXZhdGUgcmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gIHByaXZhdGUgbGFzdENoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBgdHJ1ZWAgb25jZSBydW4oKSAob3IgYSByZXN1bWUpIGV4ZWN1dGVkIGhlcmUuIGByZXN1bWUoKWAgYnJhbmNoZXMgb24gaXQ6XG4gICAqIHRydWUg4oaSIHJldXNlIHRoZSBydW50aW1lIChleGVjdXRpb24gdHJlZSwgcmVjb3JkZXJzLCBuYXJyYXRpdmUgYWNjdW11bGF0ZSk7XG4gICAqIGZhbHNlIOKGkiBzZWVkIGEgZnJlc2ggcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYCAoY3Jvc3MtZXhlY3V0b3JcbiAgICogcmVzdW1lKS4gU2VlIGB0ZXN0L2xpYi9wYXVzZS9jcm9zcy1leGVjdXRvci1yZXN1bWUudGVzdC50c2AuXG4gICAqL1xuICBwcml2YXRlIF9oYXNSdW5CZWZvcmUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlLWVudHJhbmN5IGd1YXJkOiBydW4oKS9yZXN1bWUoKSBtdXRhdGUgcGVyLXJ1biBzdGF0ZSAodHJhdmVyc2VyLCBydW5JZCxcbiAgICogY291bnRlcnMsIGNoZWNrcG9pbnQsIHJlY29yZGVycykg4oCUIG9uZSBleGVjdXRvciA9IG9uZSBpbi1mbGlnaHQgZXhlY3V0aW9uLlxuICAgKiBTZWUgZG9jcy9ndWlkZXMvZXhlY3V0aW9uLW1vZGVsLm1kLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjYXB0dXJlU2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgZmFpbHVyZVN0YXRlID0gbmV3IE5hdGl2ZUZhaWx1cmVTdGF0ZSgpO1xuXG4gIC8qKiBTYWZlIG5hdGl2ZSBjb250ZXh0IGZvciB0aGUgbGF0ZXN0IHJlamVjdGVkIGxlZzsgdW5kZWZpbmVkIGJlZm9yZSwgZHVyaW5nLCBhZnRlciBzdWNjZXNzIG9yIHBhdXNlLiAqL1xuICBnZXRGYWlsdXJlQ29udGV4dCgpOiBUZXJtaW5hbEZhaWx1cmVDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlU3RhdGUucmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmbG93Q2hhcnRBcmdzOiBFeGVjdXRvckFyZ3M8VE91dCwgVFNjb3BlPjtcbiAgLyoqXG4gICAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCBvZiB0aGUgY3VycmVudCBydW4gKDEwLjEsIFA2KSDigJQgdGhlIHNpbmsgZXZlcnkgbG9nIG9mIHRoZSBydW4gd3JpdGVzIHRvLCBpdHNcbiAgICogYWNjb3VudGluZyBhbmQgaXRzIGZhaWx1cmUgbW9kZS4gRnJlc2ggcGVyIGBydW4oKWAgYW5kIHBlciBmcmVzaC1leGVjdXRvciByZXN1bWU7IGEgc2FtZS1leGVjdXRvciByZXN1bWUga2VlcHNcbiAgICogaXQsIGFzIGl0IGtlZXBzIHRoZSByb290IGxvZy4gQWJzZW50IHdpdGhvdXQgYSBgc2lua2Agb3B0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmQ6IFJ1blJlY29yZCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0IH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKjItcGFyYW0gZm9ybSoqIChhbHNvIHN1cHBvcnRlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZmxvd0NoYXJ0IC0gVGhlIGNvbXBpbGVkIEZsb3dDaGFydCByZXR1cm5lZCBieSBgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKWBcbiAgICogQHBhcmFtIGZhY3RvcnlPck9wdGlvbnMgLSBBIGBTY29wZUZhY3Rvcnk8VFNjb3BlPmAgT1IgYSBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT5gIG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBmYWN0b3J5T3JPcHRpb25zPzogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPixcbiAgKSB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzID0gcmVzb2x2ZUV4ZWN1dG9yQXJncyhmbG93Q2hhcnQsIGZhY3RvcnlPck9wdGlvbnMpO1xuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVHJhdmVyc2VyKFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlPzogdW5rbm93bixcbiAgICBlbnY/OiBpbXBvcnQoJy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudixcbiAgICBtYXhEZXB0aD86IG51bWJlcixcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyLFxuICAgIG92ZXJyaWRlcz86IHtcbiAgICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICAgIHByZXNlcnZlUmVjb3JkZXJzPzogYm9vbGVhbjtcbiAgICAgIGV4aXN0aW5nUnVudGltZT86IEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT47XG4gICAgICAvKiogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgcmVzdW1lLnRzYCk7IHRoZSB0cmF2ZXJzZXIgc3RpbGwgd2Fsa3MgdGhlIFJFQUwgY2hhcnQuICovXG4gICAgICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAgICAgLyoqIFRoZSByZWRhY3Rpb24gdGhlIHBhdXNlZCBydW4gaGFkIG1hZGUgKG5hbWVzIG9ubHkpIOKAlCB0aGUgcmVzdW1lZCBsZWcncyBydWxlIHN0YXJ0cyBmcm9tIGl0LiAqL1xuICAgICAgcmVkYWN0aW9uTWFya3M/OiBSZWRhY3Rpb25NYXJrcztcbiAgICAgIC8qKiBUaGUgbGVnJ3MgY29ycmVsYXRpb24sIHJlc29sdmVkIGZyb20gaXRzIGVudiBiZWZvcmUgYW55dGhpbmcgbW92ZWQgKGByZXNvbHZlQ29ycmVsYXRpb25gKS4gKi9cbiAgICAgIGNvcnJlbGF0aW9uPzogUnVuQ29ycmVsYXRpb247XG4gICAgICAvKiogVGhlIGxlZydzIHJlY29yZCAoMTAuMSwgUDYpOiBpdHMgc2luaywgYW5kIHRoZSBtZXRhIGEgTkVXIHJvb3QgbG9nIG9wZW5zIHdpdGguICovXG4gICAgICByZWNvcmQ/OiB7IGxpbms6IFJ1blJlY29yZDsgbWV0YT86IE1ldGEgfTtcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm9ic2VydmVycy5zdGFydExlZyhmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UsIG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMgPT09IHRydWUpO1xuXG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUodGhpcy5yZWRhY3Rpb25Qb2xpY3kpO1xuICAgIC8vIEEgcmVzdW1lIGNvbnRpbnVlcyB0aGUgcGF1c2VkIHJ1bidzIHJlZGFjdGlvbjogYSBjb3B5IG1hc2tlZCBiZWZvcmUgdGhlIHBhdXNlIHN0YXlzIG1hc2tlZC5cbiAgICBpZiAob3ZlcnJpZGVzPy5yZWRhY3Rpb25NYXJrcykgdGhpcy5yZWRhY3Rpb25SdWxlLnJlc3RvcmVNYXJrcyhvdmVycmlkZXMucmVkYWN0aW9uTWFya3MpO1xuICAgIC8vIFRoZSByZWNvcmQgaXMgc2VydmVkIHVuZGVyIHRoaXMgbGVnJ3MgcnVsZSDigJQgYmVmb3JlIHRoZSByb290IGxvZyBiZWxvdyBvcGVucyAoaXRzIGJhc2UsIGl0cyBtZXRhKS5cbiAgICBvdmVycmlkZXM/LnJlY29yZD8ubGluay51c2VSdWxlKHRoaXMucmVkYWN0aW9uUnVsZSk7XG4gICAgLy8gT05FIGZhY3Rvcnk6IHRoZSBiYXNlIGZhY3RvcnksIHRoZW4gZXZlcnkgc2NvcGUgbW9kaWZpZXIgKHJlY29yZGVycyxcbiAgICAvLyBkZWZlcnJlZCB0YXAsIHJlZGFjdGlvbikgaW4gYSBmbGF0IHBhc3Mg4oCUIHNlZSBgUnVuT2JzZXJ2ZXJzYC5cbiAgICBjb25zdCBzY29wZUZhY3RvcnkgPSB0aGlzLm9ic2VydmVycy5jb21wb3NlU2NvcGVGYWN0b3J5KFxuICAgICAgYXJncy5zY29wZUZhY3RvcnksXG4gICAgICB0aGlzLnJlZGFjdGlvblBvbGljeSxcbiAgICAgIHRoaXMucmVkYWN0aW9uUnVsZS5tYXJrZWRLZXlzKCksXG4gICAgICBvdmVycmlkZXM/LmNvcnJlbGF0aW9uLFxuICAgICk7XG5cbiAgICAvLyBUaGUgZmlyc3Qgc3RhZ2UgdGhpcyB0cmF2ZXJzYWwgcnVuczogdGhlIHJlc3VtZSdzIGVudHJ5LCBlbHNlIHRoZSBjaGFydCByb290LlxuICAgIGNvbnN0IGVmZmVjdGl2ZVJvb3QgPSBvdmVycmlkZXM/LnJlc3VtZT8uc3RhcnQgPz8gZmMucm9vdDtcbiAgICBjb25zdCBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCA9IG92ZXJyaWRlcz8uaW5pdGlhbENvbnRleHQgPz8gYXJncy5pbml0aWFsQ29udGV4dDtcblxuICAgIC8vIFRoZSBydW4ncyBwb2xpY3kgKEY1KTogdGhlIGRpYWxzLCB0aGUgcnVsZSAoaW5zdGFsbGVkIGV2ZW4gd2l0aG91dCBhXG4gICAgLy8gcG9saWN5IOKAlCBwZXItY2FsbCBgc2V0VmFsdWUoaywgdiwgdHJ1ZSlgIG1hcmtzIGxpdmUgb24gaXQpIGFuZCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyAoYSByZWRhY3RlZCBoZWFwLCBrZXB0IG9ubHkgdW5kZXIgYSBwb2xpY3kpLCBPTkUgZnJvemVuIG9iamVjdCBwZXJcbiAgICAvLyBsZWcgdGhhdCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIGhvbGRzIGJ5IHJlZmVyZW5jZS5cbiAgICBjb25zdCBwb2xpY3kgPSBydW5Qb2xpY3koYXJncy5kaWFscywgdGhpcy5yZWRhY3Rpb25SdWxlLCB0aGlzLnJlZGFjdGlvblBvbGljeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGxldCBydW50aW1lOiBFeGVjdXRpb25SdW50aW1lO1xuICAgIGlmIChvdmVycmlkZXM/LmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgLy8gU2FtZS1leGVjdXRvciByZXN1bWU6IHRoZSB0cmVlIGNvbnRpbnVlcyBmcm9tIHRoZSBsZWFmOyBnZXRTbmFwc2hvdCgpIGtlZXBzIHRoZSBmdWxsIHRyZWUuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICAgIHJ1bnRpbWUudXNlUG9saWN5KHBvbGljeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IG92ZXJyaWRlcz8ucmVjb3JkO1xuICAgICAgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKFxuICAgICAgICBlZmZlY3RpdmVSb290Lm5hbWUsXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QuaWQsXG4gICAgICAgIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICAgIGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0LFxuICAgICAgICBwb2xpY3ksXG4gICAgICAgIC8vIEEgcm9vdCBsb2cgdGhhdCB3cml0ZXMgdG8gdGhlIHNpbmsgb3BlbnMgYXQgYFtydW5JZF1gIOKAlCB0aGUgYWRkcmVzcyB0aGUgZW5naW5lIGJpbmRzIGl0IHRvIGFueXdheS5cbiAgICAgICAgcmVjb3JkICYmIHtcbiAgICAgICAgICBzaW5rOiByZWNvcmQubGluay5zaW5rLFxuICAgICAgICAgIGFkZHJlc3M6IHsgbG9nUnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCwgZHJpbGxQYXRoOiBbXSB9LFxuICAgICAgICAgIC4uLihyZWNvcmQubWV0YSAmJiB7IG1ldGE6IHJlY29yZC5tZXRhIH0pLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlID0gdGhpcy5mYWlsdXJlU3RhdGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIC8vIEFsd2F5cyB0aGUgUkVBTCBjaGFydDsgYSByZXN1bWUgb25seSBtb3ZlcyB3aGVyZSB0aGUgdHJhdmVyc2FsIFNUQVJUUywgb25jZS5cbiAgICAgICAgcm9vdDogZmMucm9vdCxcbiAgICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lPy5zdGFydCAmJiB7IGVudHJ5OiBvdmVycmlkZXMucmVzdW1lLnN0YXJ0IH0pLFxuICAgICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0UGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IG92ZXJyaWRlcy5yZXN1bWUuc3RhcnRQZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWUgJiYgeyByZXN1bWU6IG92ZXJyaWRlcy5yZXN1bWUgfSksXG4gICAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBydW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBhcmdzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgICAgbmFycmF0aXZlRW5hYmxlZDogbmFycmF0aXZlRmxhZyxcbiAgICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICAgIGZsb3dSZWNvcmRlcnM6IHRoaXMub2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgLi4uKG92ZXJyaWRlcz8uY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbjogb3ZlcnJpZGVzLmNvcnJlbGF0aW9uIH0pLFxuICAgICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgICAgICAuLi4obWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGFyZ3MuY2FwdHVyZUNvdmVyYWdlICYmIHRoaXMuX2N1cnJlbnRSdW5JZCkgcnVudGltZS5iZWdpbkNhcHR1cmUodGhpcy5fY3VycmVudFJ1bklkKTtcbiAgICAgIHJldHVybiB0cmF2ZXJzZXI7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgcmVmdXNlZCBsZWcgd2hvc2Ugcm9vdCBsb2cgYWxyZWFkeSBvcGVuZWQgc2F5cyBzbzogaXRzIHJlY29yZCBpcyBjbG9zZWQsIG5ldmVyIGxlZnQgbG9va2luZyBjcmFzaGVkLlxuICAgICAgaWYgKG92ZXJyaWRlcz8ucmVjb3JkICYmICFvdmVycmlkZXMuZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAgIHJ1bnRpbWUuY2xvc2VSZWNvcmQoJ2ZhaWxlZCcsIHsgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCwgZXJyb3I6IHRoaXMuY2xvc2luZ0Vycm9yKGVycm9yKSB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5lbmFibGVOYXJyYXRpdmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUocG9saWN5KTtcbiAgfVxuXG4gIC8qKiBUaGUgYHJlYWRUcmFja2luZ2AgZGlhbCAoc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMucmVhZFRyYWNraW5nfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRSZWFkVHJhY2tpbmcobW9kZTogUmVhZFRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscyA9IHsgLi4udGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzLCByZWFkVHJhY2tpbmc6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYHdyaXRlVHJhY2tpbmdgIGRpYWwgKHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLndyaXRlVHJhY2tpbmd9KS4gQ2FsbCBiZWZvcmUgcnVuKCkuICovXG4gIHNldFdyaXRlVHJhY2tpbmcobW9kZTogV3JpdGVUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMgPSB7IC4uLnRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscywgd3JpdGVUcmFja2luZzogbW9kZSB9O1xuICB9XG5cbiAgLyoqIFRoZSBgY29tbWl0VmFsdWVzYCBkaWFsIChzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5jb21taXRWYWx1ZXN9KS4gQ2FsbCBiZWZvcmUgcnVuKCkuICovXG4gIHNldENvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzID0geyAuLi50aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMsIGNvbW1pdFZhbHVlczogbW9kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5IGZyb20gdGhlXG4gICAqIG1vc3QgcmVjZW50IHJ1bi4gTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIHJldHVybiB0aGlzLnJlZGFjdGlvblJ1bGUucmVwb3J0KCk7XG4gIH1cblxuICAvLyDilIDilIDilIAgUGF1c2UvUmVzdW1lIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGVja3BvaW50IGZyb20gdGhlIG1vc3QgcmVjZW50IHBhdXNlZCBleGVjdXRpb24sIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIHRoZSBsYXN0IHJ1biBjb21wbGV0ZWQgd2l0aG91dCBwYXVzaW5nLlxuICAgKlxuICAgKiBKU09OLXNlcmlhbGl6YWJsZSAoc3RvcmUgaXQgaW4gUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2XigKYpIGFuZCBmdWxseVxuICAgKiBERVRBQ0hFRCBmcm9tIGVuZ2luZSBzdGF0ZSAoYGNoZWNrcG9pbnQudHNgKTogbXV0YXRpbmcgb3IgcGVyc2lzdGluZyBpdFxuICAgKiBjYW5ub3QgYWZmZWN0IHRoZSBleGVjdXRvciwgbm9yIGEgbGF0ZXIgcmVzdW1lIGEgY2hlY2twb2ludCB5b3Ugc3RvcmVkLlxuICAgKiBMRUFOOiB3aGF0IGByZXN1bWUoKWAgcmVhZHMgYW5kIHRoZSBwYXVzZSdzIG93biByZWNvcmQg4oCUIGl0cyBzaXplIGlzIHRoZVxuICAgKiBzdGF0ZSdzLCBuZXZlciB0aGUgcnVuJ3MgbGVuZ3RoLiBUaGUgcnVuJ3MgaGlzdG9yeSAoZXhlY3V0aW9uIHRyZWUsXG4gICAqIGNvbW1pdCBsb2csIHN1YmZsb3cgcmVzdWx0cykgaXMge0BsaW5rIGdldFNuYXBzaG90fSdzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICAgKiBpZiAoZXhlY3V0b3IuaXNQYXVzZWQoKSkge1xuICAgKiAgIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiAgIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldENoZWNrcG9pbnQoKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vc3QgcmVjZW50IHJ1bigpIHdhcyBwYXVzZWQgKGNoZWNrcG9pbnQgYXZhaWxhYmxlKS4gKi9cbiAgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgUk9PVCBsb2cgbm93LiBPKDEpLCBubyBzbmFwc2hvdCBtYXRlcmlhbGl6YXRpb24uXG4gICAqIE5vdCBhbiBlbWl0dGVkIGV2ZW50J3Mgc291cmNlIHBvc2l0aW9uOiBhIGRlZmVycmVkIGNhbGxiYWNrIHJ1bnMgbGF0ZXJcbiAgICogYW5kIGEgc3ViZmxvdyBvd25zIGFub3RoZXIgbG9nLiBVc2UgRW1pdEV2ZW50LnNvdXJjZVBvc2l0aW9uIGZvciB0aGF0LlxuICAgKlxuICAgKiBSZXR1cm5zIDAgYmVmb3JlIGFueSBydW4uIEEgZnJlc2ggcnVuIHJlc2V0cyB0aGUgbG9nOyBhIHNhbWUtZXhlY3V0b3JcbiAgICogcmVzdW1lIGNvbnRpbnVlcyBpdC4gQSBmcmVzaC1leGVjdXRvciByZXN1bWUgc3RhcnRzIGEgbmV3IGxvY2FsIGxvZy5cbiAgICogQWx3YXlzIGVxdWFscyBgZ2V0U25hcHNob3QoKS5jb21taXRMb2cubGVuZ3RoYCAodGhlIGxvZyBpcyB0aGVcbiAgICogYEV2ZW50TG9nYCdzIGBleGVjdXRpb25IaXN0b3J5YDsgdGhlIHNuYXBzaG90IHNlcnZlcyBhIGZyb3plbiBjb3B5KS5cbiAgICovXG4gIGdldENvbW1pdENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBydW50aW1lPy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhdXNlZCBmbG93Y2hhcnQgZnJvbSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIFJlc3RvcmVzIHRoZSBzY29wZSBzdGF0ZSwgcnVucyB0aGUgcGF1c2VkIHN0YWdlJ3MgYHJlc3VtZUZuYCB3aXRoIHRoZSBpbnB1dFxuICAgKiAoYW4gYGludGVycnVwdCgpYCBwYXVzZSByZS1ydW5zIHRoZSBzdGFnZSB3aXRoIHRoZSBhbnN3ZXIpLCB0aGVuIGNvbnRpbnVlc1xuICAgKiB3aXRoIHdoYXRldmVyIHJhbiBhZnRlciB0aGF0IHN0YWdlIG9uIHRoZSBydW4g4oCUIGl0cyBgbmV4dGAsIG9yIGl0c1xuICAgKiBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uLCBhdCBldmVyeSBsZXZlbCBvZiB0aGUgcGF1c2UgcGF0aC4gUGFyYWxsZWxcbiAgICogc2libGluZ3MgdGhhdCBwYXVzZWQgdG9nZXRoZXIgKGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgKSBhcmUgYXNrZWQgaW5cbiAgICogdHVybjsgdGhlIGpvaW4gcnVucyBhZnRlciB0aGUgbGFzdCBhbnN3ZXIuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBjb21lcyBmcm9tIGBnZXRDaGVja3BvaW50KClgIG9yIGZyb20gc3RvcmFnZS4gT24gdGhlIFNBTUVcbiAgICogZXhlY3V0b3IsIG5hcnJhdGl2ZS9yZWNvcmRlciBzdGF0ZSBhY2N1bXVsYXRlcyBhY3Jvc3MgdGhlIHBhdXNlOyBvbiBhXG4gICAqIEZSRVNIIGV4ZWN1dG9yIGl0IHN0YXJ0cyBlbXB0eS4gQSBmcmVzaCBgcnVuSWRgIGVpdGhlciB3YXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJvY2VzcyBBIOKAlCBhZnRlciBhIHBhdXNlLCBwZXJzaXN0IHRoZSBjaGVja3BvaW50OlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBQcm9jZXNzIEIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpIOKAlCByZXN0b3JlIGFuZCByZXN1bWU6XG4gICAqIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKHJlc3RvcmVkLCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJyB8ICdtYXhJdGVyYXRpb25zJyB8ICdkZWFkbGluZScgfCAndGltZW91dE1zJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICB0aGlzLmFzc2VydElkbGUoJ3Jlc3VtZScpO1xuICAgIHRoaXMuZmFpbHVyZVN0YXRlID0gbmV3IE5hdGl2ZUZhaWx1cmVTdGF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICAvLyBFdmVyeSByZWZ1c2FsIGhhcHBlbnMgaW4gdGhlIHBsYW4g4oCUIGJlZm9yZSBhbnkgc3RhdGUgYmVsb3cgaXMgdG91Y2hlZCxcbiAgICAgIC8vIHNvIGEgcmVqZWN0ZWQgY2hlY2twb2ludCBsZWF2ZXMgdGhlIGV4ZWN1dG9yIChhbmQgaXRzIGNoZWNrcG9pbnQpIGFzIGl0IHdhcy5cbiAgICAgIGNvbnN0IHBsYW4gPSBwbGFuUmVzdW1lKHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQsIGNoZWNrcG9pbnQsIHJlc3VtZUlucHV0KTtcbiAgICAgIC8vIFRoZSByZXN1bWVkIGxlZydzIGVudiwgcmVhZCBPTkNFLCBhbmQgaXRzIE9XTiBjb3JyZWxhdGlvbiDigJQgcmVmdXNlZCBoZXJlLCBiZWZvcmUgYW55IHN0YXRlIG1vdmVzLiBOZXZlclxuICAgICAgLy8gdGhlIHBhdXNlZCBsZWcnczogdGhlIGNoZWNrcG9pbnQgY2FycmllcyBub25lLlxuICAgICAgY29uc3QgeyBlbnYsIGNvcnJlbGF0aW9uIH0gPSBhZG1pdFJ1bkVudihvcHRpb25zPy5lbnYpO1xuICAgICAgLy8gTVVTVCBwcmVjZWRlIHRoZSBjb3VudGVyIHJlYWQgaW4gYGFubm91bmNlUmVzdW1lYCBhbmQgdGhlIHRyYXZlcnNlcixcbiAgICAgIC8vIHdoaWNoIHRha2VzIGJvdGggY291bnRlcnMgQlkgUkVGRVJFTkNFLlxuICAgICAgc2VlZENvdW50ZXJzKHBsYW4uY2hlY2twb2ludCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlciwgdGhpcy5fdmlzaXRDb3VudHMpO1xuICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcblxuICAgICAgLy8gU2FtZSBleGVjdXRvcjogcmV1c2UgdGhlIHJ1bnRpbWUuIEZyZXNoIGV4ZWN1dG9yOiBzZWVkIGEgTkVXIG9uZSBmcm9tXG4gICAgICAvLyBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAuIEVpdGhlciB3YXkgYSBORVcgcnVuSWQgKGEgZGlzdGluY3QgbG9naWNhbCBydW4pLlxuICAgICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gdGhpcy5faGFzUnVuQmVmb3JlXG4gICAgICAgID8gKHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cbiAgICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTtcbiAgICAgIC8vIFRoZSByZWNvcmQgKFA2KTogdGhlIHNhbWUgZXhlY3V0b3IgY29udGludWVzIGl0cyByb290IGxvZywgYW5kIGl0cyBzaW5rOyBhIGZyZXNoIG9uZSBvcGVucyBhIG5ldyByb290IGxvZy5cbiAgICAgIGNvbnN0IHNpbmtPcHRpb24gPSB0aGlzLmZsb3dDaGFydEFyZ3Muc2luaztcbiAgICAgIGNvbnN0IHJldXNlZCA9IGV4aXN0aW5nUnVudGltZSAmJiB0aGlzLnJlY29yZCA/IHRoaXMucmVjb3JkIDogdW5kZWZpbmVkO1xuICAgICAgcmV1c2VkPy5iZWdpbkxlZygpO1xuICAgICAgY29uc3QgcmVjb3JkID0gc2lua09wdGlvbiAmJiAocmV1c2VkID8/IG5ldyBSdW5SZWNvcmQoc2lua09wdGlvbikpO1xuICAgICAgY29uc3QgcmVzdW1lZEZyb20gPSBwbGFuLmNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uPy5ydW5JZDtcblxuICAgICAgLy8gQSByZXN1bWVkIGxlZyBoYXMgaXRzIG93biBkZWFkbGluZSAocGVyIGxlZywgbGlrZSB0aGUgbG9vcCBidWRnZXQpOiBvbmx5IHdoYXQgaXMgcGFzc2VkIEhFUkUuIEFybWVkIGZyb20gdGhlXG4gICAgICAvLyBlbnYgYXMgYWRtaXR0ZWQgKGBhZG1pdFJ1bkVudmAsIG9uZSByZWFkKSwgc28gdGhlIGRlYWRsaW5lIGFuZCB0aGUgY29ycmVsYXRpb24gcmVhZCB0aGUgc2FtZSBzbmFwc2hvdC5cbiAgICAgIGNvbnN0IGFybWVkID0gYXJtUnVuKHtcbiAgICAgICAgc2lnbmFsOiBvcHRpb25zPy5zaWduYWwsXG4gICAgICAgIHRpbWVvdXRNczogb3B0aW9ucz8udGltZW91dE1zLFxuICAgICAgICBkZWFkbGluZTogb3B0aW9ucz8uZGVhZGxpbmUsXG4gICAgICAgIGVudixcbiAgICAgICAgLi4uKHJlY29yZD8uc3RvcFNpZ25hbCAmJiB7IHN0b3A6IHJlY29yZC5zdG9wU2lnbmFsIH0pLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnRyYXZlcnNlciA9IGRpc3Bvc2VPblRocm93KGFybWVkLCAoKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZVRyYXZlcnNlcihhcm1lZC5zaWduYWwsIHVuZGVmaW5lZCwgYXJtZWQuZW52LCBvcHRpb25zPy5tYXhEZXB0aCwgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucywge1xuICAgICAgICAgIC8vIENsb25lLWluOiBgaW5pdGlhbENvbnRleHRgIHNlZWRzIHRoZSBmcmVzaCBTaGFyZWRNZW1vcnkgd2l0aCBhXG4gICAgICAgICAgLy8gdG9wLWxldmVsLW9ubHkgbWVyZ2Ug4oCUIG5lc3RlZCBvYmplY3RzIHdvdWxkIGFsaWFzIHRoZSBjYWxsZXIncyBjaGVja3BvaW50LlxuICAgICAgICAgIGluaXRpYWxDb250ZXh0OiBzdHJ1Y3R1cmVkQ2xvbmUocGxhbi5jaGVja3BvaW50LnNoYXJlZFN0YXRlKSxcbiAgICAgICAgICBwcmVzZXJ2ZVJlY29yZGVyczogdHJ1ZSxcbiAgICAgICAgICAuLi4oZXhpc3RpbmdSdW50aW1lID8geyBleGlzdGluZ1J1bnRpbWUgfSA6IHt9KSxcbiAgICAgICAgICByZXN1bWU6IHBsYW4uZW50cnksXG4gICAgICAgICAgLi4uKHBsYW4uY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyAmJiB7IHJlZGFjdGlvbk1hcmtzOiBwbGFuLmNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgfSksXG4gICAgICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAgICAgLi4uKHJlY29yZCAmJiB7XG4gICAgICAgICAgICByZWNvcmQ6IHtcbiAgICAgICAgICAgICAgbGluazogcmVjb3JkLFxuICAgICAgICAgICAgICBtZXRhOiB0aGlzLm9wZW5pbmdNZXRhKGNvcnJlbGF0aW9uLCBhcm1lZC5kZWFkbGluZSwgcmVzdW1lZEZyb20pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gVGhlIHNhbWUgcm9vdCBsb2cgZ29lcyBvbiB1bmRlciB0aGlzIGxlZzogdGhlIGxlZyBpcyBub3RlZCBiZXNpZGUgaXQsIHNvIHRoZSBzdG9yZWQgcmVjb3JkIG5hbWVzIGl0cyBydW5JZC5cbiAgICAgIGlmIChyZWNvcmQgJiYgZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAgIGV4aXN0aW5nUnVudGltZS5ub3RlUmVjb3JkKFxuICAgICAgICAgICdyZXN1bWUnLFxuICAgICAgICAgIHJlY29yZC5zZXJ2ZSh7XG4gICAgICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAgICAgLi4uKHJlc3VtZWRGcm9tICE9PSB1bmRlZmluZWQgJiYgeyByZXN1bWVkRnJvbSB9KSxcbiAgICAgICAgICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICAgICAgICAgICAgLi4uKGFybWVkLmRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZTogYXJtZWQuZGVhZGxpbmUgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICAgIHRoaXMuY2FwdHVyZVNpZ25hbCA9IHRoaXMuZmxvd0NoYXJ0QXJncy5jYXB0dXJlQ292ZXJhZ2UgPyBhcm1lZC5zaWduYWwgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBCZWZvcmUgdGhlIHRyYXZlcnNhbCBvbiBwdXJwb3NlOiBgb25SZXN1bWVgIHByZWNlZGVzIGBvblJ1blN0YXJ0YC5cbiAgICAgIGRpc3Bvc2VPblRocm93KGFybWVkLCAoKSA9PlxuICAgICAgICBhbm5vdW5jZVJlc3VtZShwbGFuLCByZXN1bWVJbnB1dCwge1xuICAgICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgICAgZXhlY3V0aW9uQ291bnQ6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUsXG4gICAgICAgICAgb2JzZXJ2ZXJzOiB0aGlzLm9ic2VydmVycyxcbiAgICAgICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyBTZXQgQUZURVIgYWxsIHN5bmMgdmFsaWRhdGlvbi9sb29rdXAgdGhyb3dzIGFib3ZlIChub3RoaW5nIGNhbiBsZWFrIHRoZVxuICAgICAgLy8gZmxhZyk7IG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHJhY2UtZnJlZS5cbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNldHRsZVJlY29yZGVkKGFybWVkLCByZWNvcmQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgICAgICAvLyBUZXJtaW5hbCBmbHVzaCAoUkZDLTAwMSBCbG9jayA4KSDigJQgc2FtZSBib3VuZGFyeSBjb250cmFjdCBhcyBydW4oKS5cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnY29tcGxldGVkJyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBwYXVzZWQgPSB0aGlzLnBhdXNlZE9yVGhyb3coZXJyb3IpO1xuICAgICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ3BhdXNlZCcpO1xuICAgICAgICByZXR1cm4gcGF1c2VkO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgYXJtZWQuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2goZXJyb3IpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNldHRsZSBvZiBhIGxlZyB0aGF0IHRocmV3OiBmbHVzaCB0aGUgZGVmZXJyZWQgdGllciAodGhlIE9VVEVSTU9TVFxuICAgKiBoYW5kbGVyIOKAlCBhIHBhdXNlIHJlLXRocm93cyB0aHJvdWdoIHN1YmZsb3cgdHJhdmVyc2VycyB3aXRob3V0IGV4aXRcbiAgICogZXZlbnRzLCBzbyBwZXItdHJhdmVyc2VyIGhvb2tzIHdvdWxkIG1pc3MgaXQpLCB0aGVuIHR1cm4gYSBwYXVzZSBpbnRvIGFcbiAgICogZGV0YWNoZWQgY2hlY2twb2ludCAoYGNoZWNrcG9pbnQudHNgKSBhbmQgYSBgUGF1c2VkUmVzdWx0YDsgYW55dGhpbmcgZWxzZVxuICAgKiBpcyByZXRocm93bi5cbiAgICovXG4gIHByaXZhdGUgcGF1c2VkT3JUaHJvdyhlcnJvcjogdW5rbm93bik6IFBhdXNlZFJlc3VsdCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICBjb25zdCByZWRhY3Rpb25NYXJrcyA9IHRoaXMucmVkYWN0aW9uUnVsZS5tYXJrc0ZvckNoZWNrcG9pbnQoKTtcbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSBidWlsZFBhdXNlQ2hlY2twb2ludChlcnJvciwgdGhpcy50cmF2ZXJzZXIsIHtcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnQ6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUsXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgICAgLi4uKHJlZGFjdGlvbk1hcmtzICYmIHsgcmVkYWN0aW9uTWFya3MgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0bGUgb2YgYSBsZWcgdGhhdCB3cml0ZXMgaXRzIHJlY29yZCAoMTAuMSwgUDYpIOKAlCB0aGUgMTAuMCBzZXR0bGUgKGBydW4oKWAgLyBgcmVzdW1lKClgKSwgdGhlbiB0aGUgcm9vdFxuICAgKiBsb2cncyBjbG9zaW5nIGVudHJ5IHdpdGggaG93IHRoZSBsZWcgZW5kZWQsIHRoZW4gKGBmbHVzaDogJ2F1dG8nYCkgdGhlIGFkYXB0ZXIncyBmbHVzaCwgYWxsIGJlZm9yZSB0aGUgbGVnXG4gICAqIGNvdW50cyBhcyBmaW5pc2hlZC4gQSBsZWcgd2l0aG91dCBhIHNpbmsgbmV2ZXIgY29tZXMgaGVyZTogaXRzIHNldHRsZSBoYXMgbm8gZXh0cmEgYXdhaXQuXG4gICAqXG4gICAqIFRoZSBsZWcncyBvd24gZXJyb3IgYWx3YXlzIHdpbnMuIEEgcnVuIHRoYXQgZmluaXNoZWQgYnV0IGxvc3QgYW4gZW50cnkgdW5kZXIgYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGhcbiAgICogdGhlIGBSZWNvcmRTaW5rRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGVSZWNvcmRlZChhcm1lZDogQXJtZWRSdW4sIHJlY29yZDogUnVuUmVjb3JkKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICBsZXQgb3V0Y29tZTogTG9nT3V0Y29tZTtcbiAgICBsZXQgcmVzdWx0OiBFeGVjdXRvclJlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmFpbHVyZTogeyBlcnJvcjogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgICAgb3V0Y29tZSA9ICdvayc7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGF1c2VkT3JUaHJvdyhlcnJvcik7XG4gICAgICAgICAgb3V0Y29tZSA9ICdwYXVzZWQnO1xuICAgICAgICB9IGNhdGNoICh0aHJvd246IHVua25vd24pIHtcbiAgICAgICAgICBmYWlsdXJlID0geyBlcnJvcjogdGhyb3duIH07XG4gICAgICAgICAgb3V0Y29tZSA9ICdmYWlsZWQnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBydW50aW1lLmNsb3NlUmVjb3JkKG91dGNvbWUsIHtcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgLi4uKGZhaWx1cmUgJiYgeyBlcnJvcjogdGhpcy5jbG9zaW5nRXJyb3IoZmFpbHVyZS5lcnJvcikgfSksXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdW5kZWQ6IGEgZmx1c2ggdGhhdCBuZXZlciBzZXR0bGVzIGlzIGEgbG9zcywgbmV2ZXIgYSBydW4gaGVsZCBvcGVuICh0aGUgdGltZSBsZWZ0LCBlbHNlIDMwIHMpLlxuICAgICAgaWYgKHJlY29yZC5mbHVzaE1vZGUgPT09ICdhdXRvJykgYXdhaXQgcmVjb3JkLmZsdXNoKGF1dG9GbHVzaE1zKGFybWVkLmRlYWRsaW5lKSwgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChlcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgYXJtZWQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZSkge1xuICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuZmluaXNoKGZhaWx1cmUuZXJyb3IpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCBmYWlsdXJlLmVycm9yKTtcbiAgICAgIHRocm93IGZhaWx1cmUuZXJyb3I7XG4gICAgfVxuICAgIGlmIChyZWNvcmQuZmF0YWwpIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChyZWNvcmQuZmF0YWwpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCByZWNvcmQuZmF0YWwpO1xuICAgICAgdGhyb3cgcmVjb3JkLmZhdGFsO1xuICAgIH1cbiAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZmluaXNoQ2FwdHVyZShvdXRjb21lID09PSAncGF1c2VkJyA/ICdwYXVzZWQnIDogJ2NvbXBsZXRlZCcpO1xuICAgIHJldHVybiByZXN1bHQgYXMgRXhlY3V0b3JSZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaENhcHR1cmUoc3RhdHVzOiAnY29tcGxldGVkJyB8ICdwYXVzZWQnIHwgJ2ZhaWxlZCcsIGVycm9yPzogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY2FwdHVyZVNpZ25hbDtcbiAgICB0aGlzLmNhcHR1cmVTaWduYWwgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGNhcHR1cmUgPSBydW50aW1lLmNhcHR1cmU7XG4gICAgaWYgKCFjYXB0dXJlIHx8IGNhcHR1cmUucnVuSWQgIT09IHRoaXMuX2N1cnJlbnRSdW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IGNhbmNlbGxlZCA9IHN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgaXNDYW5jZWxsZWQoc2lnbmFsKSAmJiBlcnJvciA9PT0gc2lnbmFsPy5yZWFzb247XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYgdGhpcy50cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLnNob3VsZEJyZWFrKSBjYXB0dXJlLmxpbWl0KCdleGVjdXRpb24tYnJva2VuJyk7XG4gICAgY2FwdHVyZS5lbmQoY2FuY2VsbGVkID8gJ2NhbmNlbGxlZCcgOiBzdGF0dXMsIHN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyB0aGlzLmZhaWx1cmVTdGF0ZS5yZXN1bHQgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYSBuZXcgcm9vdCBsb2cgb3BlbnMgd2l0aDogbmFtZXMgYW5kIG51bWJlcnMgdGhlIHJ1biBhbHJlYWR5IHNlcnZlcyDigJQgdGhlIHJ1biwgdGhlIGNoYXJ0LCB0aGUgY29ycmVsYXRpb24sXG4gICAqIHRoZSBkZWFkbGluZSwgdGhlIGRlY2xhcmVkIGJ1ZGdldCwgYW5kIHRoZSBydW4gYSBmcmVzaC1leGVjdXRvciByZXN1bWUgY29udGludWVzLiBTZXJ2ZWQgYnkgdGhlIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgb3BlbmluZ01ldGEoXG4gICAgY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgcmVzdW1lZEZyb20/OiBzdHJpbmcsXG4gICk6IE1ldGEge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LnJvb3Q7XG4gICAgY29uc3QgYnVkZ2V0TXMgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmJ1aWxkVGltZVN0cnVjdHVyZT8uYnVkZ2V0TXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICBjaGFydDogeyBpZDogcm9vdC5pZCwgbmFtZTogcm9vdC5uYW1lIH0sXG4gICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgIC4uLihkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmUgfSksXG4gICAgICAuLi4oYnVkZ2V0TXMgIT09IHVuZGVmaW5lZCAmJiB7IGJ1ZGdldE1zIH0pLFxuICAgICAgLi4uKHJlc3VtZWRGcm9tICE9PSB1bmRlZmluZWQgJiYgeyByZXN1bWVkRnJvbSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBjbG9zaW5nIGVudHJ5J3MgZXJyb3I6IHRoZSBydW4ncyBTRVJWRUQgZm9ybSBvZiBpdCwgaXRzIG5hbWUsIG1lc3NhZ2UgYW5kIGNvZGUgb25seSAobmV2ZXIgYHJhd2ApLiAqL1xuICBwcml2YXRlIGNsb3NpbmdFcnJvcihlcnJvcjogdW5rbm93bik6IE1ldGEge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnJlZGFjdGlvblJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi4oaW5mby5uYW1lICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lOiBpbmZvLm5hbWUgfSksXG4gICAgICBtZXNzYWdlOiBpbmZvLm1lc3NhZ2UsXG4gICAgICAuLi4oaW5mby5jb2RlICE9PSB1bmRlZmluZWQgJiYgeyBjb2RlOiBpbmZvLmNvZGUgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgcmUtZW50cmFuY3kgZ3VhcmQ6IG9uZSBleGVjdXRvciA9IG9uZSBpbi1mbGlnaHQgZXhlY3V0aW9uLiAqL1xuICBwcml2YXRlIGFzc2VydElkbGUobWV0aG9kOiAncnVuJyB8ICdyZXN1bWUnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzRXhlY3V0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGbG93Q2hhcnRFeGVjdXRvcjogJHttZXRob2R9KCkgY2FsbGVkIHdoaWxlIGFub3RoZXIgcnVuKCkvcmVzdW1lKCkgaXMgaW4gZmxpZ2h0IG9uIHRoaXMgYCArXG4gICAgICAgICAgJ2V4ZWN1dG9yLiBBbiBleGVjdXRvciBob2xkcyBwZXItcnVuIHN0YXRlIChydW5JZCwgcmVjb3JkZXJzLCBjaGVja3BvaW50KSDigJQgY3JlYXRlICcgK1xuICAgICAgICAgICdvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLiBTZWUgZG9jcy9ndWlkZXMvZXhlY3V0aW9uLW1vZGVsLm1kLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBSZWNvcmRlcnMgKHRoZSByZWdpc3RlciBsaXZlcyBpbiBgYXR0YWNoLnRzYCkg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIFNjb3BlUmVjb3JkZXIgdG8gb2JzZXJ2ZSBkYXRhIG9wZXJhdGlvbnMgKHJlYWRzLCB3cml0ZXMsIGNvbW1pdHMpXG4gICAqIG9uIGV2ZXJ5IHN0YWdlIHNjb3BlLiBDYWxsIGJlZm9yZSBydW4oKS4gKipJZGVtcG90ZW50IGJ5IGBpZGAqKiAocmVwbGFjZWQsXG4gICAqIG5ldmVyIGR1cGxpY2F0ZWQpLiBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBtb3ZlcyBpdCBvZmYgdGhlIGhvdCBwYXRoIOKAlFxuICAgKiBkZWxpdmVyZWQgYXQgdGhlIG5leHQgbWljcm90YXNrIGNoZWNrcG9pbnQ7IHJlLWF0dGFjaGluZyBhbiBpZCBvbiB0aGVcbiAgICogb3RoZXIgdGllciBTV0FQUyB0aWVycyAoYGRvY3MvZ3VpZGVzL29ic2VydmVycy1kZWZlcnJlZC5tZGApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCkpO1xuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTsgLy8gcmVwbGFjZXMgc2FtZSBpZFxuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5hdHRhY2hTY29wZShyZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBzY29wZSBSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQg4oCUIGJvdGggZGVsaXZlcnkgdGllcnMuICovXG4gIGRldGFjaFNjb3BlUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmRldGFjaFNjb3BlKGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzIChib3RoIHRpZXJzKS4gKi9cbiAgZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuc2NvcGVMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgRmxvd1JlY29yZGVyIHRvIG9ic2VydmUgY29udHJvbCBmbG93IGV2ZW50cy4gQXV0b21hdGljYWxseVxuICAgKiBlbmFibGVzIG5hcnJhdGl2ZS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLiBJZGVtcG90ZW50IGJ5IGBpZGA7XG4gICAqIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIGFzIGZvciBgYXR0YWNoU2NvcGVSZWNvcmRlcmAuXG4gICAqL1xuICBhdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXI6IEZsb3dSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmF0dGFjaEZsb3cocmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgRmxvd1JlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRCDigJQgYm90aCBkZWxpdmVyeSB0aWVycy4gKi9cbiAgZGV0YWNoRmxvd1JlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5kZXRhY2hGbG93KGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgRmxvd1JlY29yZGVycyAoYm90aCB0aWVycykuICovXG4gIGdldEZsb3dSZWNvcmRlcnMoKTogRmxvd1JlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5mbG93TGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHJlY29yZGVyIHRvIGV2ZXJ5IGNoYW5uZWwgKHNjb3BlLCBmbG93LCBlbWl0KSBpdCBoYXMgT1dOIGBvbipgXG4gICAqIG1ldGhvZHMgZm9yIOKAlCBwcmVmZXJyZWQgb3ZlciBzaW5nbGUtY2hhbm5lbCBjYWxscywgd2hlcmUgZm9yZ2V0dGluZyBvbmVcbiAgICogc2lsZW50bHkgbG9zZXMgZXZlbnRzLiBJZGVtcG90ZW50IGJ5IGBpZGAgYWNyb3NzIGFsbCBjaGFubmVsczsgYSBmbG93XG4gICAqIG1ldGhvZCBlbmFibGVzIHRoZSBuYXJyYXRpdmU7IGBkZWxpdmVyeWAgY29tZXMgZnJvbSB0aGUgb3B0aW9ucyBvciB0aGVcbiAgICogcmVjb3JkZXIncyBvd24gZmllbGQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAqICAgaWQ6ICdhdWRpdCcsXG4gICAqICAgb25Xcml0ZTogKGUpID0+IGxvZygnc2NvcGUgd3JpdGUnLCBlLmtleSksXG4gICAqICAgb25EZWNpc2lvbjogKGUpID0+IGxvZygncm91dGVkIHRvJywgZS5jaG9zZW4pLFxuICAgKiB9O1xuICAgKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyOiBDb21iaW5lZFJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoQ29tYmluZWQocmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gZXZlcnkgY2hhbm5lbCBpdCB3YXMgYXR0YWNoZWQgdG8gKHNhZmUgaWYgbmV2ZXIgYXR0YWNoZWQpLiAqL1xuICBkZXRhY2hDb21iaW5lZFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgZm9yIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAgZXZlbnRzLiBJdCByaWRlc1xuICAgKiB0aGUgc2NvcGUgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC4gSWRlbXBvdGVudCBieSBgaWRgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGV4ZWN1dG9yLmF0dGFjaEVtaXRSZWNvcmRlcih7XG4gICAqICAgaWQ6ICd0b2tlbi1tZXRlcicsXG4gICAqICAgb25FbWl0OiAoZSkgPT4ge1xuICAgKiAgICAgaWYgKGUubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnKSB0cmFja1Rva2VucyhlLnBheWxvYWQpO1xuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaEVtaXRSZWNvcmRlcihyZWNvcmRlcjogRW1pdFJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyIGFzIFNjb3BlUmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbiBgRW1pdFJlY29yZGVyYCBieSBpZC4gU2FmZSB0byBjYWxsIGlmIG5ldmVyIGF0dGFjaGVkLiAqL1xuICBkZXRhY2hFbWl0UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHJlY29yZGVycyAoYm90aCB0aWVycykgdGhhdCBpbXBsZW1lbnQgYG9uRW1pdGAuICovXG4gIGdldEVtaXRSZWNvcmRlcnMoKTogRW1pdFJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLmdldFNjb3BlUmVjb3JkZXJzKCkuZmlsdGVyKFxuICAgICAgKHIpOiByIGlzIEVtaXRSZWNvcmRlciA9PiB0eXBlb2YgKHIgYXMgeyBvbkVtaXQ/OiB1bmtub3duIH0pLm9uRW1pdCA9PT0gJ2Z1bmN0aW9uJyxcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIERldGFjaCAoVDQpIOKUgOKUgOKUgFxuICAvLyBCYXJlLWV4ZWN1dG9yIGVudHJ5IHBvaW50cyBmb3IgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGNoYXJ0cy4gRnJvbSBpbnNpZGUgYVxuICAvLyBzdGFnZSB1c2UgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWAgLyBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYCxcbiAgLy8gd2hpY2ggbWludCByZWZJZHMgZnJvbSB0aGUgY2FsbGluZyBzdGFnZTsgdGhlc2UgdXNlIGBfX2V4ZWN1dG9yX19gLlxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgcmV0dXJuIGEgYERldGFjaEhhbmRsZWBcbiAgICogdGhlIGNhbGxlciBjYW4gYHdhaXQoKWAgb24gKFByb21pc2UpIG9yIHJlYWQgYC5zdGF0dXNgIGZyb20gKHN5bmMpLiBUaGVcbiAgICogZHJpdmVyIGlzIFJFUVVJUkVEIOKAlCB0aGVyZSBpcyBubyBsaWJyYXJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBleGVjID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKHBhcmVudENoYXJ0KTtcbiAgICogY29uc3QgaGFuZGxlID0gZXhlYy5kZXRhY2hBbmRKb2luTGF0ZXIobWljcm90YXNrQmF0Y2hEcml2ZXIsIHRlbGVtZXRyeUNoYXJ0LCB7IGV2ZW50OiAneCcgfSk7XG4gICAqIGF3YWl0IGhhbmRsZS53YWl0KCk7IC8vIG9wdGlvbmFsXG4gICAqIGBgYFxuICAgKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlIHtcbiAgICByZXR1cm4gX2RldGFjaEFuZEpvaW5MYXRlcihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCBESVNDQVJEIHRoZSBoYW5kbGUg4oCUIGZvclxuICAgKiBmaXJlLWFuZC1mb3JnZXQgc2lkZSBlZmZlY3RzLiBBIGNoaWxkJ3MgZXJyb3IgbGFuZHMgb24gdGhlIGRpc2NhcmRlZCBoYW5kbGU7XG4gICAqIGZvciBvYnNlcnZhYmxlIGRldGFjaCBwcmVmZXIgYGRldGFjaEFuZEpvaW5MYXRlcmAgKyBgLndhaXQoKS5jYXRjaCgpYC5cbiAgICovXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBfZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4ZWN1dG9yLW93bmVkIG5hcnJhdGl2ZSB2aWV3OyBgLm1hcChlID0+IGUudGV4dClgIGZvciBmbGF0IHN0cmluZ3MuXG4gICAqIGBlbmFibGVOYXJyYXRpdmUob3B0aW9ucylgIGNvbmZpZ3VyZXMgdGhpcyB2aWV3LiBBdHRhY2hpbmcgYSBmbG93IHJlY29yZGVyXG4gICAqIGFsc28gZW5hYmxlcyBpdCwgYnV0IHRoYXQgcmVjb3JkZXIncyBvcHRpb25zIGFuZCBlbnRyaWVzIHJlbWFpbiBpbmRlcGVuZGVudFxuICAgKiAocmVhZCBhbiBhdHRhY2hlZCBgbmFycmF0aXZlKClgIGluc3RhbmNlIHdpdGggYHJlY29yZGVyLmdldEVudHJpZXMoKWApLlxuICAgKiBTYW1lLWV4ZWN1dG9yIHJlc3VtZSByZXRhaW5zIGhpc3Rvcnk7IGEgZnJlc2ggZXhlY3V0b3IgcmVjb3JkcyBpdHMgcmVzdW1lZFxuICAgKiBsZWcgb25seS4gVGhlIGludGVybmFsIG5hcnJhdG9yIGlzIG5vdCBhbiBhdHRhY2hlZCBzbmFwc2hvdCByZWNvcmRlciByb3cuXG4gICAqL1xuICBnZXROYXJyYXRpdmVFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXJzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGNoYXJ0LiBSZXNvbHZlcyB3aGVuIHRoZSBydW4gZmluaXNoZXMg4oCUIG9yIHBhdXNlcywgaWYgYVxuICAgKiBwYXVzYWJsZSBzdGFnZSByZXR1cm5lZCBkYXRhIChjaGVjayBgaXNQYXVzZWQoKWAgYWZ0ZXJ3YXJkKS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgYHsgaW5wdXQsIGVudiB9YCDigJQgYGlucHV0YCBpcyB0aGUgZnJvemVuIGJ1c2luZXNzIGlucHV0XG4gICAqICAgKHJlYWQgaW4gYSBzdGFnZSB2aWEgYHNjb3BlLiRnZXRBcmdzKClgKTsgYGVudmAgaXMgaW5mcmFzdHJ1Y3R1cmUgY29udGV4dFxuICAgKiAgIGxpa2UgYHsgc2lnbmFsLCB0aW1lb3V0TXMsIHRyYWNlSWQgfWAgKHJlYWQgdmlhIGBzY29wZS4kZ2V0RW52KClgKTsgYGRlYWRsaW5lYCAvIGB0aW1lb3V0TXNgIGdpdmUgdGhlIHJ1blxuICAgKiAgIGl0cyBkZWFkbGluZSAoYGVudi5kZWFkbGluZWAsIGBzY29wZS4kYXR0ZW1wdCgpLnRpbWVMZWZ0TXMoKWApLlxuICAgKlxuICAgKiBBZnRlciBpdCByZXNvbHZlcywgcmVhZCByZXN1bHRzIG9mZiB0aGUgZXhlY3V0b3I6XG4gICAqIC0gYGdldFNuYXBzaG90KClgIOKAlCBmdWxsIHN0YXRlLCBjb21taXQgbG9nLCBleGVjdXRpb24gdHJlZS5cbiAgICogLSBgZ2V0TmFycmF0aXZlRW50cmllcygpYCDigJQgdGhlIHBsYWluLUVuZ2xpc2ggdHJhY2UgKGNhbGwgYGVuYWJsZU5hcnJhdGl2ZSgpYFxuICAgKiAgIG9yIGF0dGFjaCBhIGBuYXJyYXRpdmUoKWAgcmVjb3JkZXIgZmlyc3QpLlxuICAgKiAtIGBpc1BhdXNlZCgpYCDigJQgdHJ1ZSBpZiBhIHN0YWdlIHBhdXNlZDsgdGhlbiB1c2UgYGdldENoZWNrcG9pbnQoKWAgLyBgcmVzdW1lKClgLlxuICAgKlxuICAgKiBPbmUgcnVuIGF0IGEgdGltZSBwZXIgZXhlY3V0b3Ig4oCUIGl0IGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsXG4gICAqIGNoZWNrcG9pbnQpLiBDcmVhdGUgb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi5cbiAgICovXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBBIGZhaWxlZCBlbnRyeSBsZWF2ZXMgbm8gc2lkZSBlZmZlY3RzOiB0aGUgZ3VhcmQgRklSU1QgKHRoZSBpbi1mbGlnaHRcbiAgICAvLyBydW4gc3RheXMgdW50b3VjaGVkKSwgdmFsaWRhdGlvbiBiZWZvcmUgdGhlIHRpbWVvdXQgdGltZXIgZXhpc3RzLlxuICAgIHRoaXMuYXNzZXJ0SWRsZSgncnVuJyk7XG4gICAgdGhpcy5mYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgICAgdmFsaWRhdGVkSW5wdXQgPSB2YWxpZGF0ZUlucHV0KHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEsIHZhbGlkYXRlZElucHV0KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBlbnYsIHJlYWQgT05DRSwgYW5kIHRoZSBydW4ncyBjb3JyZWxhdGlvbiwgYmVmb3JlIGFueXRoaW5nIG1vdmVzOiBhIHJlZnVzZWQgYHRyYWNlcGFyZW50YCBsZWF2ZXMgbm9cbiAgICAgIC8vIHNpZGUgZWZmZWN0LCBhbmQgdGhlIHN0YWdlcyBzZWUgdGhlIHNhbWUgc25hcHNob3QgdGhlIGNvcnJlbGF0aW9uIHdhcyByZWFkIGZyb20gKGBhZG1pdFJ1bkVudmApLlxuICAgICAgY29uc3QgeyBlbnYsIGNvcnJlbGF0aW9uIH0gPSBhZG1pdFJ1bkVudihvcHRpb25zPy5lbnYpO1xuXG4gICAgICAvLyBUaGUgcnVuJ3Mgb25lIHNpZ25hbCBhbmQgaXRzIGRlYWRsaW5lIChgYXJtUnVuYCk6IGBzaWduYWxgLCBgZW52LnNpZ25hbGAsIGBkZWFkbGluZWAgLyBgdGltZW91dE1zYCAvXG4gICAgICAvLyBgZW52LmRlYWRsaW5lYCwgY29tcG9zZWQgZnJvbSB0aGUgQURNSVRURUQgZW52IOKAlCBhbmQgc3RhbXBlZCBvbiB0aGUgZW52IHN0YWdlcyByZWFkLiBBcm1lZCBhZnRlciB0aGVcbiAgICAgIC8vIGFkbWlzc2lvbiwgc28gYSByZWZ1c2VkIGB0cmFjZXBhcmVudGAgbGVhdmVzIG5vIHRpbWVyOyBkaXNwb3NlZCBvbiBldmVyeSBleGl0LlxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsgLy8gcmVhZCBCRUZPUkUgYXJtaW5nLCBzbyBgdGltZW91dE1zYCBlcXVhbCB0byB0aGUgZGVjbGFyZWQgYnVkZ2V0IG5ldmVyIHdhcm5zXG4gICAgICAvLyBUaGUgcnVuJ3MgcmVjb3JkIChQNik6IGEgZnJlc2ggb25lIHBlciBydW4g4oCUIGl0cyBgJ2ZhaWwnYCBzdG9wIGlzIG9uZSBtb3JlIHNvdXJjZSBvZiB0aGUgcnVuJ3Mgc2lnbmFsLlxuICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5mbG93Q2hhcnRBcmdzLnNpbmsgJiYgbmV3IFJ1blJlY29yZCh0aGlzLmZsb3dDaGFydEFyZ3Muc2luayk7XG4gICAgICBjb25zdCBhcm1lZCA9IGFybVJ1bih7XG4gICAgICAgIHNpZ25hbDogb3B0aW9ucz8uc2lnbmFsLFxuICAgICAgICB0aW1lb3V0TXM6IG9wdGlvbnM/LnRpbWVvdXRNcyxcbiAgICAgICAgZGVhZGxpbmU6IG9wdGlvbnM/LmRlYWRsaW5lLFxuICAgICAgICBlbnYsXG4gICAgICAgIC4uLihyZWNvcmQ/LnN0b3BTaWduYWwgJiYgeyBzdG9wOiByZWNvcmQuc3RvcFNpZ25hbCB9KSxcbiAgICAgIH0pO1xuICAgICAgLy8gQSBkZWFkbGluZSBzaG9ydGVyIHRoYW4gdGhlIGNoYXJ0J3MgZGVjbGFyZWQgYC5idWRnZXQobXMpYDogYSBkZXYtbW9kZSB3YXJuaW5nLCBvbmNlIHBlciBjaGFydCAoUDUpLlxuICAgICAgZGlzcG9zZU9uVGhyb3coYXJtZWQsICgpID0+IHdhcm5EZWFkbGluZVVuZGVyQnVkZ2V0KHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQsIGFybWVkLmRlYWRsaW5lLCBzdGFydGVkQXQpKTtcblxuICAgICAgdGhpcy5vYnNlcnZlcnMuY2xlYXJGb3JSdW4oKTsgLy8gbm8gY3Jvc3MtcnVuIGFjY3VtdWxhdGlvblxuICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07XG4gICAgICB0aGlzLl92aXNpdENvdW50cyA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTtcbiAgICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGEgbGF0ZXIgcmVzdW1lKCkgcmV1c2VzIHRoaXMgcnVudGltZVxuICAgICAgdGhpcy50cmF2ZXJzZXIgPSBkaXNwb3NlT25UaHJvdyhhcm1lZCwgKCkgPT5cbiAgICAgICAgdGhpcy5jcmVhdGVUcmF2ZXJzZXIoYXJtZWQuc2lnbmFsLCB2YWxpZGF0ZWRJbnB1dCwgYXJtZWQuZW52LCBvcHRpb25zPy5tYXhEZXB0aCwgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucywge1xuICAgICAgICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICAgICAgICAgIC4uLihyZWNvcmQgJiYgeyByZWNvcmQ6IHsgbGluazogcmVjb3JkLCBtZXRhOiB0aGlzLm9wZW5pbmdNZXRhKGNvcnJlbGF0aW9uLCBhcm1lZC5kZWFkbGluZSkgfSB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gU2V0IG9uY2UgdGhlIGxlZydzIHRyYXZlcnNlciBleGlzdHMsIHNvIGEgc25hcHNob3QgbmV2ZXIgcGFpcnMgb25lIHJ1bidzIHN0YXRlIHdpdGggYW5vdGhlcidzIHNpbmsgc3RhdHMuXG4gICAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICAgIHRoaXMuY2FwdHVyZVNpZ25hbCA9IHRoaXMuZmxvd0NoYXJ0QXJncy5jYXB0dXJlQ292ZXJhZ2UgPyBhcm1lZC5zaWduYWwgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBBZnRlciBldmVyeSBzeW5jIHRocm93LCB3aXRoIG5vIGF3YWl0IHNpbmNlIHRoZSBndWFyZDogcmFjZS1mcmVlLlxuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2V0dGxlUmVjb3JkZWQoYXJtZWQsIHJlY29yZCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpOiBcIm9uZSBiZWF0IGJlaGluZFwiIG5ldmVyIGJlY29tZXMgXCJsb3N0IGF0IGV4aXRcIi5cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnY29tcGxldGVkJyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBwYXVzZWQgPSB0aGlzLnBhdXNlZE9yVGhyb3coZXJyb3IpO1xuICAgICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ3BhdXNlZCcpO1xuICAgICAgICByZXR1cm4gcGF1c2VkO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgYXJtZWQuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2goZXJyb3IpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGRlZmVycmVkLW9ic2VydmVyIGJhY2tsb2csIHRoZW4gYXdhaXQgYXN5bmMgbGlzdGVuZXIgY29tcGxldGlvbnNcbiAgICogdW5kZXIgYSBkZWFkbGluZSDigJQgY2FsbCBiZWZvcmUgYSBzZXJ2ZXJsZXNzIHByb2Nlc3MgZnJlZXplcyBvciBleGl0cy5cbiAgICogWmVyb3Mgd2hlbiBubyBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQ7IGBwZW5kaW5nID4gMGAgcmVwb3J0cyB3aGF0XG4gICAqIHdhcyBzdGlsbCBvdXRzdGFuZGluZyBhdCB0aGUgZGVhZGxpbmUuXG4gICAqL1xuICBkcmFpbk9ic2VydmVycyhvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8T2JzZXJ2ZXJEcmFpblJlc3VsdD4ge1xuICAgIGNvbnN0IHRpZXIgPSB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI7XG4gICAgaWYgKCF0aWVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogMCwgZmFpbGVkOiAwLCBwZW5kaW5nOiAwIH0pO1xuICAgIHJldHVybiB0aWVyLmRyYWluKG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSByZWNvcmQgc2luayAoMTAuMSwgUDYpOiBhd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCDigJQgZm9yIGFuIGV4ZWN1dG9yIGJ1aWx0IHdpdGhcbiAgICogYHNpbms6IHsgYWRhcHRlciwgZmx1c2g6ICdtYW51YWwnIH1gLCBvciBiZWZvcmUgYSBzZXJ2ZXJsZXNzIHByb2Nlc3MgZnJlZXplcy4gYHRpbWVvdXRNc2AgYm91bmRzIHRoZSB3YWl0OyBhXG4gICAqIGZsdXNoIHN0aWxsIHJ1bm5pbmcgdGhlbiBpcyBgcGVuZGluZ2AgKGFuZCBrZWVwcyBydW5uaW5nKS4gQSBmYWlsZWQgZmx1c2ggaXMgY291bnRlZCBvbiBgZ2V0U25hcHNob3QoKS5zaW5rYC5cbiAgICogRG9uZSBhdCBvbmNlIHdpdGhvdXQgYSBzaW5rLCBvciB3aXRoIGFuIGFkYXB0ZXIgdGhhdCBoYXMgbm8gYGZsdXNoYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rOiB7IGFkYXB0ZXI6IGZpbGVTaW5rKHBhdGgpLCBmbHVzaDogJ21hbnVhbCcgfSB9KTtcbiAgICogYXdhaXQgZXhlY3V0b3IucnVuKCk7XG4gICAqIGF3YWl0IGV4ZWN1dG9yLmZsdXNoUmVjb3JkKHsgdGltZW91dE1zOiAyXzAwMCB9KTtcbiAgICogYGBgXG4gICAqL1xuICBmbHVzaFJlY29yZChvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8UmVjb3JkRmx1c2hSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMucmVjb3JkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLmZsdXNoKG9wdHM/LnRpbWVvdXRNcyk7XG4gIH1cblxuICAvLyDilIDilIDilIAgSW50cm9zcGVjdGlvbiDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBgdHJ1ZWAgc2VydmVzIGBzaGFyZWRTdGF0ZWAgKGFuZCBlYWNoIHN1YmZsb3cnc1xuICAgKiAgIGBnbG9iYWxDb250ZXh0YCkgZnJvbSB0aGUgcmVkYWN0ZWQgbWlycm9yIOKAlCB0aGUgc2FmZSB2aWV3IHRvIGV4cG9ydC4gQVxuICAgKiAgIG5vLW9wIHdpdGhvdXQgYSByZWRhY3Rpb24gcG9saWN5LiBUaGUgY29tbWl0IGxvZyBpcyByZWRhY3RlZCBhdCB3cml0ZVxuICAgKiAgIHRpbWUgcmVnYXJkbGVzcy4gRGVmYXVsdCBgZmFsc2VgLlxuICAgKlxuICAgKiAqKlRyZWF0IGBzaGFyZWRTdGF0ZWAgYXMgUkVBRC1PTkxZLioqIEluIHByb2R1Y3Rpb24gaXQgaXMgYSBsaXZlIHZpZXcgb2ZcbiAgICogZW5naW5lIG1lbW9yeTsgaW4gZGV2IG1vZGUgYSBkZWVwLWZyb3plbiBjbG9uZSwgc28gYSBtdXRhdGlvbiB0aHJvd3MuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIHJldHVybiBzZXJ2ZWRTbmFwc2hvdCh0aGlzLnRyYXZlcnNlciwgdGhpcy5vYnNlcnZlcnMsIG9wdGlvbnMsIHRoaXMucmVjb3JkPy5zdGF0cygpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5vYnNlcnZlcnMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldE1hbmlmZXN0KCkgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbCBzcGVjIGZvciBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgc3ViZmxvdy5cbiAgICogUmVxdWlyZXMgYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIgdGhhdCBvYnNlcnZlZCB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgZ2V0U3ViZmxvd1NwZWMoc3ViZmxvd0lkOiBzdHJpbmcpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMub2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cblxuLyoqIEhvdyBsb25nIGEgcnVuJ3Mgb3duIGZsdXNoIG1heSB0YWtlOiB0aGUgcnVuJ3MgdGltZSBsZWZ0IChhdCBsZWFzdCAxIHMpLCBuZXZlciBwYXN0IHtAbGluayBBVVRPX0ZMVVNIX01TfS4gKi9cbmZ1bmN0aW9uIGF1dG9GbHVzaE1zKGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEFVVE9fRkxVU0hfTVMgOiBNYXRoLm1pbihBVVRPX0ZMVVNIX01TLCBNYXRoLm1heCgxXzAwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG59XG5cbi8qKiBUaGUgYm91bmQgb24gYSBydW4ncyBvd24gZmx1c2ggd2hlbiBpdCBoYXMgbm8gZGVhZGxpbmU6IDMwIHMuICovXG5jb25zdCBBVVRPX0ZMVVNIX01TID0gMzBfMDAwO1xuXG4vKiogUnVuIGBidWlsZGA7IGlmIGl0IHRocm93cywgcmVsZWFzZSB0aGUgYXJtZWQgcnVuIGZpcnN0IChubyBkZWFkbGluZSB0aW1lciBvdXRsaXZlcyBhIHJlZnVzZWQgZW50cnkpLiAqL1xuZnVuY3Rpb24gZGlzcG9zZU9uVGhyb3c8VD4oYXJtZWQ6IEFybWVkUnVuLCBidWlsZDogKCkgPT4gVCk6IFQge1xuICB0cnkge1xuICAgIHJldHVybiBidWlsZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFybWVkLmRpc3Bvc2UoKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl19
|
|
880
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUlILDhEQUF3RDtBQUN4RCx3REFBcUQ7QUFFckQsaURBQTZEO0FBRTdELGlEQUFvSDtBQUtwSCxtR0FBNkY7QUFFN0YscUZBQStFO0FBQy9FLGlEQVM0QjtBQUM1QixxRUFBK0Y7QUFFL0YseURBQXVEO0FBQ3ZELHlEQUFtRDtBQUVuRCxnREFBa0Q7QUFJbEQsMkNBQTJDO0FBQzNDLDJEQUFzRjtBQUN0RixtREFBdUQ7QUFDdkQsK0NBQXNEO0FBRXRELCtEQUErRTtBQUMvRSw2Q0FBcUc7QUFDckcsbURBQW9FO0FBQ3BFLDJDQUF1RTtBQUN2RSx5Q0FBMkM7QUFDM0MsK0NBQStDO0FBQy9DLHlEQUFtRDtBQUVuRCxNQUFhLGlCQUFpQjtJQUNwQixTQUFTLENBQW1DO0lBQ3BEOzJGQUN1RjtJQUMvRSxpQkFBaUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNqQyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDakQseUZBQXlGO0lBQ2pGLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDM0IsbUZBQW1GO0lBQ2xFLFNBQVMsR0FBRyxJQUFJLHdCQUFZLEVBQUUsQ0FBQztJQUN4QyxlQUFlLENBQThCO0lBQ3JELGlGQUFpRjtJQUN6RSxhQUFhLEdBQUcsSUFBSSw0QkFBYSxFQUFFLENBQUM7SUFDcEMsY0FBYyxDQUFrQztJQUN4RDs7Ozs7T0FLRztJQUNLLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDOUI7Ozs7T0FJRztJQUNLLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsYUFBYSxDQUFlO0lBQzVCLG1CQUFtQixDQUF1QjtJQUMxQyxZQUFZLEdBQUcsSUFB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QUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsSCxDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QiwyR0FBMkc7QUFDM0csU0FBUyxjQUFjLENBQUksS0FBZSxFQUFFLEtBQWM7SUFDeEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICpcbiAqIFRoZSBleGVjdXRvciBjb21wb3NlcyBmb3VyIG1vZHVsZXMsIG9uZSBqb2IgZWFjaCAoRjkpOiBgYXR0YWNoLnRzYCAod2hvXG4gKiBvYnNlcnZlcyBhIHJ1biksIGByZXN1bWUudHNgIChwbGFuIGFuZCBhbm5vdW5jZSBhIHJlLWVudHJ5KSwgYGNoZWNrcG9pbnQudHNgXG4gKiAodGhlIHBhdXNlIGNoZWNrcG9pbnQpLCBgc25hcHNob3QudHNgICh3aGF0IGBnZXRTbmFwc2hvdCgpYCBzZXJ2ZXMpLiBXaGF0XG4gKiBzdGF5cyBoZXJlIGlzIHRoZSBwZXItcnVuIHN0YXRlIGFuZCB0aGUgcnVuIGxpZmVjeWNsZSB0aGF0IHRocmVhZHMgaXQuXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0OiBkYXRhLCBlbnY6IHsgdHJhY2VJZDogJ3JlcS0xMjMnIH0gfSk7XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlLCBMb2dPdXRjb21lLCBNZXRhIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgYWRtaXRSdW5FbnYgfSBmcm9tICcuLi9hdHRlbXB0L2NvcnJlbGF0aW9uLmpzJztcbmltcG9ydCB7IGlzQ2FuY2VsbGVkIH0gZnJvbSAnLi4vYXR0ZW1wdC9kZWFkbGluZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1bkNvcnJlbGF0aW9uIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgeyB3YXJuRGVhZGxpbmVVbmRlckJ1ZGdldCB9IGZyb20gJy4uL2J1ZGdldC9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGV0YWNoQW5kRm9yZ2V0IGFzIF9kZXRhY2hBbmRGb3JnZXQsIGRldGFjaEFuZEpvaW5MYXRlciBhcyBfZGV0YWNoQW5kSm9pbkxhdGVyIH0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3JSZXN1bHQsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgZGVmYXVsdExvZ2dlcixcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRUcmFja2luZ01vZGUsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgcnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuLi9yZWNvcmRlci9FbWl0UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB7IFJ1bk9ic2VydmVycyB9IGZyb20gJy4vYXR0YWNoLmpzJztcbmltcG9ydCB7IHR5cGUgQ2FwdHVyZUhpc3RvcnlMZWFzZSwgcGVyc2lzdENhcHR1cmVIaXN0b3J5IH0gZnJvbSAnLi9jYXB0dXJlSGlzdG9yeS5qcyc7XG5pbXBvcnQgeyBidWlsZFBhdXNlQ2hlY2twb2ludCB9IGZyb20gJy4vY2hlY2twb2ludC5qcyc7XG5pbXBvcnQgeyB0eXBlIEFybWVkUnVuLCBhcm1SdW4gfSBmcm9tICcuL2RlYWRsaW5lLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0YWNoUmVjb3JkZXJPcHRpb25zLCBPYnNlcnZlckRyYWluUmVzdWx0IH0gZnJvbSAnLi9EZWZlcnJlZE9ic2VydmVyVGllci5qcyc7XG5pbXBvcnQgeyB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyB0eXBlIEV4ZWN1dG9yQXJncywgdHlwZSBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMsIHJlc29sdmVFeGVjdXRvckFyZ3MgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRGbHVzaFJlc3VsdCwgUnVuUmVjb3JkIH0gZnJvbSAnLi9yZWNvcmRTaW5rLmpzJztcbmltcG9ydCB7IGFubm91bmNlUmVzdW1lLCBwbGFuUmVzdW1lLCBzZWVkQ291bnRlcnMgfSBmcm9tICcuL3Jlc3VtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGFuZCBwZXItc3RhZ2UgdmlzaXQgY291bnRzIChsb29wSXRlcmF0aW9uKSDigJQgc2hhcmVkIEJZXG4gICAqICBSRUZFUkVOQ0Ugd2l0aCBldmVyeSB0cmF2ZXJzZXIgb2YgdGhlIHJ1bjsgc3Vydml2ZSBwYXVzZS9yZXN1bWUsIHJlc2V0IG9uIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICBwcml2YXRlIF92aXNpdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBGcmVzaCBwZXIgcnVuKCkgYW5kIHBlciByZXN1bWUoKSDigJQgc3RhbXBlZCBvbiBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IChgcnVuSWQudHNgKS4gKi9cbiAgcHJpdmF0ZSBfY3VycmVudFJ1bklkID0gJyc7XG4gIC8qKiBXaG8gb2JzZXJ2ZXMgdGhlIHJ1biDigJQgbmFycmF0aXZlLCBpbmxpbmUgbGlzdHMsIGRlZmVycmVkIHRpZXIgKGBhdHRhY2gudHNgKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvYnNlcnZlcnMgPSBuZXcgUnVuT2JzZXJ2ZXJzKCk7XG4gIHByaXZhdGUgcmVkYWN0aW9uUG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcnVuJ3MgT05FIHJlZGFjdGlvbiBydWxlIChgbWVtb3J5L3JlZGFjdGlvbi50c2ApLCBidWlsdCBmcmVzaCBwZXIgbGVnLiAqL1xuICBwcml2YXRlIHJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSgpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgcnVuKCkgKG9yIGEgcmVzdW1lKSBleGVjdXRlZCBoZXJlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKiB0cnVlIOKGkiByZXVzZSB0aGUgcnVudGltZSAoZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlIGFjY3VtdWxhdGUpO1xuICAgKiBmYWxzZSDihpIgc2VlZCBhIGZyZXNoIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAgKGNyb3NzLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSkuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZS1lbnRyYW5jeSBndWFyZDogcnVuKCkvcmVzdW1lKCkgbXV0YXRlIHBlci1ydW4gc3RhdGUgKHRyYXZlcnNlciwgcnVuSWQsXG4gICAqIGNvdW50ZXJzLCBjaGVja3BvaW50LCByZWNvcmRlcnMpIOKAlCBvbmUgZXhlY3V0b3IgPSBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbi5cbiAgICogU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC5cbiAgICovXG4gIHByaXZhdGUgX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2FwdHVyZVNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIGNhcHR1cmVIaXN0b3J5TGVhc2U/OiBDYXB0dXJlSGlzdG9yeUxlYXNlO1xuICBwcml2YXRlIGZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcblxuICAvKiogU2FmZSBuYXRpdmUgY29udGV4dCBmb3IgdGhlIGxhdGVzdCByZWplY3RlZCBsZWc7IHVuZGVmaW5lZCBiZWZvcmUsIGR1cmluZywgYWZ0ZXIgc3VjY2VzcyBvciBwYXVzZS4gKi9cbiAgZ2V0RmFpbHVyZUNvbnRleHQoKTogVGVybWluYWxGYWlsdXJlQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZVN0YXRlLnJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczogRXhlY3V0b3JBcmdzPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgb2YgdGhlIGN1cnJlbnQgcnVuICgxMC4xLCBQNikg4oCUIHRoZSBzaW5rIGV2ZXJ5IGxvZyBvZiB0aGUgcnVuIHdyaXRlcyB0bywgaXRzXG4gICAqIGFjY291bnRpbmcgYW5kIGl0cyBmYWlsdXJlIG1vZGUuIEZyZXNoIHBlciBgcnVuKClgIGFuZCBwZXIgZnJlc2gtZXhlY3V0b3IgcmVzdW1lOyBhIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGtlZXBzXG4gICAqIGl0LCBhcyBpdCBrZWVwcyB0aGUgcm9vdCBsb2cuIEFic2VudCB3aXRob3V0IGEgYHNpbmtgIG9wdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkOiBSdW5SZWNvcmQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogKioyLXBhcmFtIGZvcm0qKiAoYWxzbyBzdXBwb3J0ZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZsb3dDaGFydCAtIFRoZSBjb21waWxlZCBGbG93Q2hhcnQgcmV0dXJuZWQgYnkgYGZsb3dDaGFydCguLi4pLmJ1aWxkKClgXG4gICAqIEBwYXJhbSBmYWN0b3J5T3JPcHRpb25zIC0gQSBgU2NvcGVGYWN0b3J5PFRTY29wZT5gIE9SIGEgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+YCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgZmFjdG9yeU9yT3B0aW9ucz86IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT4sXG4gICkge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHJlc29sdmVFeGVjdXRvckFyZ3MoZmxvd0NoYXJ0LCBmYWN0b3J5T3JPcHRpb25zKTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMuanMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYHJlc3VtZS50c2ApOyB0aGUgdHJhdmVyc2VyIHN0aWxsIHdhbGtzIHRoZSBSRUFMIGNoYXJ0LiAqL1xuICAgICAgcmVzdW1lPzogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbiAgICAgIC8qKiBUaGUgcmVkYWN0aW9uIHRoZSBwYXVzZWQgcnVuIGhhZCBtYWRlIChuYW1lcyBvbmx5KSDigJQgdGhlIHJlc3VtZWQgbGVnJ3MgcnVsZSBzdGFydHMgZnJvbSBpdC4gKi9cbiAgICAgIHJlZGFjdGlvbk1hcmtzPzogUmVkYWN0aW9uTWFya3M7XG4gICAgICAvKiogVGhlIGxlZydzIGNvcnJlbGF0aW9uLCByZXNvbHZlZCBmcm9tIGl0cyBlbnYgYmVmb3JlIGFueXRoaW5nIG1vdmVkIChgcmVzb2x2ZUNvcnJlbGF0aW9uYCkuICovXG4gICAgICBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuICAgICAgLyoqIFRoZSBsZWcncyByZWNvcmQgKDEwLjEsIFA2KTogaXRzIHNpbmssIGFuZCB0aGUgbWV0YSBhIE5FVyByb290IGxvZyBvcGVucyB3aXRoLiAqL1xuICAgICAgcmVjb3JkPzogeyBsaW5rOiBSdW5SZWNvcmQ7IG1ldGE/OiBNZXRhIH07XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5vYnNlcnZlcnMuc3RhcnRMZWcoZmMuZW5hYmxlTmFycmF0aXZlID8/IGZhbHNlLCBvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzID09PSB0cnVlKTtcblxuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHRoaXMucmVkYWN0aW9uUG9saWN5KTtcbiAgICAvLyBBIHJlc3VtZSBjb250aW51ZXMgdGhlIHBhdXNlZCBydW4ncyByZWRhY3Rpb246IGEgY29weSBtYXNrZWQgYmVmb3JlIHRoZSBwYXVzZSBzdGF5cyBtYXNrZWQuXG4gICAgaWYgKG92ZXJyaWRlcz8ucmVkYWN0aW9uTWFya3MpIHRoaXMucmVkYWN0aW9uUnVsZS5yZXN0b3JlTWFya3Mob3ZlcnJpZGVzLnJlZGFjdGlvbk1hcmtzKTtcbiAgICAvLyBUaGUgcmVjb3JkIGlzIHNlcnZlZCB1bmRlciB0aGlzIGxlZydzIHJ1bGUg4oCUIGJlZm9yZSB0aGUgcm9vdCBsb2cgYmVsb3cgb3BlbnMgKGl0cyBiYXNlLCBpdHMgbWV0YSkuXG4gICAgb3ZlcnJpZGVzPy5yZWNvcmQ/LmxpbmsudXNlUnVsZSh0aGlzLnJlZGFjdGlvblJ1bGUpO1xuICAgIC8vIE9ORSBmYWN0b3J5OiB0aGUgYmFzZSBmYWN0b3J5LCB0aGVuIGV2ZXJ5IHNjb3BlIG1vZGlmaWVyIChyZWNvcmRlcnMsXG4gICAgLy8gZGVmZXJyZWQgdGFwLCByZWRhY3Rpb24pIGluIGEgZmxhdCBwYXNzIOKAlCBzZWUgYFJ1bk9ic2VydmVyc2AuXG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gdGhpcy5vYnNlcnZlcnMuY29tcG9zZVNjb3BlRmFjdG9yeShcbiAgICAgIGFyZ3Muc2NvcGVGYWN0b3J5LFxuICAgICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3ksXG4gICAgICB0aGlzLnJlZGFjdGlvblJ1bGUubWFya2VkS2V5cygpLFxuICAgICAgb3ZlcnJpZGVzPy5jb3JyZWxhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVGhlIGZpcnN0IHN0YWdlIHRoaXMgdHJhdmVyc2FsIHJ1bnM6IHRoZSByZXN1bWUncyBlbnRyeSwgZWxzZSB0aGUgY2hhcnQgcm9vdC5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSk6IHRoZSBkaWFscywgdGhlIHJ1bGUgKGluc3RhbGxlZCBldmVuIHdpdGhvdXQgYVxuICAgIC8vIHBvbGljeSDigJQgcGVyLWNhbGwgYHNldFZhbHVlKGssIHYsIHRydWUpYCBtYXJrcyBsaXZlIG9uIGl0KSBhbmQgdGhlIG1pcnJvclxuICAgIC8vIGZsYWcgKGEgcmVkYWN0ZWQgaGVhcCwga2VwdCBvbmx5IHVuZGVyIGEgcG9saWN5KSwgT05FIGZyb3plbiBvYmplY3QgcGVyXG4gICAgLy8gbGVnIHRoYXQgZXZlcnkgZnJhbWUgb2YgdGhlIHJ1biBob2xkcyBieSByZWZlcmVuY2UuXG4gICAgY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KGFyZ3MuZGlhbHMsIHRoaXMucmVkYWN0aW9uUnVsZSwgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFNhbWUtZXhlY3V0b3IgcmVzdW1lOiB0aGUgdHJlZSBjb250aW51ZXMgZnJvbSB0aGUgbGVhZjsgZ2V0U25hcHNob3QoKSBrZWVwcyB0aGUgZnVsbCB0cmVlLlxuICAgICAgcnVudGltZSA9IG92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWU7XG4gICAgICBydW50aW1lLnByZXNlcnZlU25hcHNob3RSb290KCk7XG4gICAgICBsZXQgbGVhZiA9IHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICAgIHdoaWxlIChsZWFmLm5leHQpIGxlYWYgPSBsZWFmLm5leHQ7XG4gICAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBsZWFmLmNyZWF0ZU5leHQoJycsIGVmZmVjdGl2ZVJvb3QubmFtZSwgZWZmZWN0aXZlUm9vdC5pZCk7XG4gICAgICBydW50aW1lLnVzZVBvbGljeShwb2xpY3kpO1xuICAgICAgcnVudGltZS5yZXN1bWVSZWFkU291cmNlcyh0aGlzLl9jdXJyZW50UnVuSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZWNvcmQgPSBvdmVycmlkZXM/LnJlY29yZDtcbiAgICAgIHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5uYW1lLFxuICAgICAgICBlZmZlY3RpdmVSb290LmlkLFxuICAgICAgICBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgICBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCxcbiAgICAgICAgcG9saWN5LFxuICAgICAgICAvLyBBIHJvb3QgbG9nIHRoYXQgd3JpdGVzIHRvIHRoZSBzaW5rIG9wZW5zIGF0IGBbcnVuSWRdYCDigJQgdGhlIGFkZHJlc3MgdGhlIGVuZ2luZSBiaW5kcyBpdCB0byBhbnl3YXkuXG4gICAgICAgIHJlY29yZCAmJiB7XG4gICAgICAgICAgc2luazogcmVjb3JkLmxpbmsuc2luayxcbiAgICAgICAgICBhZGRyZXNzOiB7IGxvZ1J1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsIGRyaWxsUGF0aDogW10gfSxcbiAgICAgICAgICAuLi4ocmVjb3JkLm1ldGEgJiYgeyBtZXRhOiByZWNvcmQubWV0YSB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5fY3VycmVudFJ1bklkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgICAgICAgIC4uLihvdmVycmlkZXM/LnJlc3VtZSAmJiB7IHVuYXZhaWxhYmxlOiAncmVzdW1lZC1zb3VyY2Utb3duZXJzaGlwJyBhcyBjb25zdCB9KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSA9IHRoaXMuZmFpbHVyZVN0YXRlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmF2ZXJzZXIgPSBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgICAvLyBBbHdheXMgdGhlIFJFQUwgY2hhcnQ7IGEgcmVzdW1lIG9ubHkgbW92ZXMgd2hlcmUgdGhlIHRyYXZlcnNhbCBTVEFSVFMsIG9uY2UuXG4gICAgICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgICAgIC4uLihvdmVycmlkZXM/LnJlc3VtZT8uc3RhcnQgJiYgeyBlbnRyeTogb3ZlcnJpZGVzLnJlc3VtZS5zdGFydCB9KSxcbiAgICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lPy5zdGFydFBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBvdmVycmlkZXMucmVzdW1lLnN0YXJ0UGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lICYmIHsgcmVzdW1lOiBvdmVycmlkZXMucmVzdW1lIH0pLFxuICAgICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiByZWFkT25seUNvbnRleHRPdmVycmlkZSA/PyBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgICBzaWduYWwsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLm9ic2VydmVycy5mbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLFxuICAgICAgICB2aXNpdENvdW50czogdGhpcy5fdmlzaXRDb3VudHMsXG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIC4uLihvdmVycmlkZXM/LmNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb246IG92ZXJyaWRlcy5jb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICAgICAgLi4uKG1heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnMgfSksXG4gICAgICB9KTtcbiAgICAgIGlmICgoYXJncy5jYXB0dXJlQ292ZXJhZ2UgfHwgcG9saWN5LnJlYWRTb3VyY2VzKSAmJiB0aGlzLl9jdXJyZW50UnVuSWQpIHJ1bnRpbWUuYmVnaW5DYXB0dXJlKHRoaXMuX2N1cnJlbnRSdW5JZCk7XG4gICAgICByZXR1cm4gdHJhdmVyc2VyO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBBIHJlZnVzZWQgbGVnIHdob3NlIHJvb3QgbG9nIGFscmVhZHkgb3BlbmVkIHNheXMgc286IGl0cyByZWNvcmQgaXMgY2xvc2VkLCBuZXZlciBsZWZ0IGxvb2tpbmcgY3Jhc2hlZC5cbiAgICAgIGlmIChvdmVycmlkZXM/LnJlY29yZCAmJiAhb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgICBydW50aW1lLmNsb3NlUmVjb3JkKCdmYWlsZWQnLCB7IHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsIGVycm9yOiB0aGlzLmNsb3NpbmdFcnJvcihlcnJvcikgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBlbmFibGVOYXJyYXRpdmUob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZW5hYmxlTmFycmF0aXZlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIGByZWFkVHJhY2tpbmdgIGRpYWwgKHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLnJlYWRUcmFja2luZ30pLiBDYWxsIGJlZm9yZSBydW4oKS4gKi9cbiAgc2V0UmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMgPSB7IC4uLnRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscywgcmVhZFRyYWNraW5nOiBtb2RlIH07XG4gIH1cblxuICAvKiogVGhlIGB3cml0ZVRyYWNraW5nYCBkaWFsIChzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRXcml0ZVRyYWNraW5nKG1vZGU6IFdyaXRlVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzID0geyAuLi50aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMsIHdyaXRlVHJhY2tpbmc6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYGNvbW1pdFZhbHVlc2AgZGlhbCAoc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMuY29tbWl0VmFsdWVzfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRDb21taXRWYWx1ZXMobW9kZTogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscyA9IHsgLi4udGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzLCBjb21taXRWYWx1ZXM6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3Rpb25SdWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogSlNPTi1zZXJpYWxpemFibGUgKHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdl4oCmKSBhbmQgZnVsbHlcbiAgICogREVUQUNIRUQgZnJvbSBlbmdpbmUgc3RhdGUgKGBjaGVja3BvaW50LnRzYCk6IG11dGF0aW5nIG9yIHBlcnNpc3RpbmcgaXRcbiAgICogY2Fubm90IGFmZmVjdCB0aGUgZXhlY3V0b3IsIG5vciBhIGxhdGVyIHJlc3VtZSBhIGNoZWNrcG9pbnQgeW91IHN0b3JlZC5cbiAgICogTEVBTjogd2hhdCBgcmVzdW1lKClgIHJlYWRzIGFuZCB0aGUgcGF1c2UncyBvd24gcmVjb3JkIOKAlCBpdHMgc2l6ZSBpcyB0aGVcbiAgICogc3RhdGUncywgbmV2ZXIgdGhlIHJ1bidzIGxlbmd0aC4gVGhlIHJ1bidzIGhpc3RvcnkgKGV4ZWN1dGlvbiB0cmVlLFxuICAgKiBjb21taXQgbG9nLCBzdWJmbG93IHJlc3VsdHMpIGlzIHtAbGluayBnZXRTbmFwc2hvdH0ncy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIFJPT1QgbG9nIG5vdy4gTygxKSwgbm8gc25hcHNob3QgbWF0ZXJpYWxpemF0aW9uLlxuICAgKiBOb3QgYW4gZW1pdHRlZCBldmVudCdzIHNvdXJjZSBwb3NpdGlvbjogYSBkZWZlcnJlZCBjYWxsYmFjayBydW5zIGxhdGVyXG4gICAqIGFuZCBhIHN1YmZsb3cgb3ducyBhbm90aGVyIGxvZy4gVXNlIEVtaXRFdmVudC5zb3VyY2VQb3NpdGlvbiBmb3IgdGhhdC5cbiAgICpcbiAgICogUmV0dXJucyAwIGJlZm9yZSBhbnkgcnVuLiBBIGZyZXNoIHJ1biByZXNldHMgdGhlIGxvZzsgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSBjb250aW51ZXMgaXQuIEEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIHN0YXJ0cyBhIG5ldyBsb2NhbCBsb2cuXG4gICAqIEFsd2F5cyBlcXVhbHMgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nLmxlbmd0aGAgKHRoZSBsb2cgaXMgdGhlXG4gICAqIGBFdmVudExvZ2AncyBgZXhlY3V0aW9uSGlzdG9yeWA7IHRoZSBzbmFwc2hvdCBzZXJ2ZXMgYSBmcm96ZW4gY29weSkuXG4gICAqL1xuICBnZXRDb21taXRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVudGltZT8uZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIHJ1bnMgdGhlIHBhdXNlZCBzdGFnZSdzIGByZXN1bWVGbmAgd2l0aCB0aGUgaW5wdXRcbiAgICogKGFuIGBpbnRlcnJ1cHQoKWAgcGF1c2UgcmUtcnVucyB0aGUgc3RhZ2Ugd2l0aCB0aGUgYW5zd2VyKSwgdGhlbiBjb250aW51ZXNcbiAgICogd2l0aCB3aGF0ZXZlciByYW4gYWZ0ZXIgdGhhdCBzdGFnZSBvbiB0aGUgcnVuIOKAlCBpdHMgYG5leHRgLCBvciBpdHNcbiAgICogZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiwgYXQgZXZlcnkgbGV2ZWwgb2YgdGhlIHBhdXNlIHBhdGguIFBhcmFsbGVsXG4gICAqIHNpYmxpbmdzIHRoYXQgcGF1c2VkIHRvZ2V0aGVyIChgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkgYXJlIGFza2VkIGluXG4gICAqIHR1cm47IHRoZSBqb2luIHJ1bnMgYWZ0ZXIgdGhlIGxhc3QgYW5zd2VyLiBTZWUgYFJlc3VtZUVudHJ5YC5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY29tZXMgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvciBmcm9tIHN0b3JhZ2UuIE9uIHRoZSBTQU1FXG4gICAqIGV4ZWN1dG9yLCBuYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgYWNjdW11bGF0ZXMgYWNyb3NzIHRoZSBwYXVzZTsgb24gYVxuICAgKiBGUkVTSCBleGVjdXRvciBpdCBzdGFydHMgZW1wdHkuIEEgZnJlc2ggYHJ1bklkYCBlaXRoZXIgd2F5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFByb2Nlc3MgQSDigJQgYWZ0ZXIgYSBwYXVzZSwgcGVyc2lzdCB0aGUgY2hlY2twb2ludDpcbiAgICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICpcbiAgICogLy8gUHJvY2VzcyBCIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KSDigJQgcmVzdG9yZSBhbmQgcmVzdW1lOlxuICAgKiBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShyZXN0b3JlZCwgeyBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXN1bWUoXG4gICAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgICByZXN1bWVJbnB1dD86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFBpY2s8UnVuT3B0aW9ucywgJ3NpZ25hbCcgfCAnZW52JyB8ICdtYXhEZXB0aCcgfCAnbWF4SXRlcmF0aW9ucycgfCAnZGVhZGxpbmUnIHwgJ3RpbWVvdXRNcyc+LFxuICApOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgdGhpcy5hc3NlcnRJZGxlKCdyZXN1bWUnKTtcbiAgICB0aGlzLmZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcbiAgICB0cnkge1xuICAgICAgLy8gRXZlcnkgcmVmdXNhbCBoYXBwZW5zIGluIHRoZSBwbGFuIOKAlCBiZWZvcmUgYW55IHN0YXRlIGJlbG93IGlzIHRvdWNoZWQsXG4gICAgICAvLyBzbyBhIHJlamVjdGVkIGNoZWNrcG9pbnQgbGVhdmVzIHRoZSBleGVjdXRvciAoYW5kIGl0cyBjaGVja3BvaW50KSBhcyBpdCB3YXMuXG4gICAgICBjb25zdCBwbGFuID0gcGxhblJlc3VtZSh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LCBjaGVja3BvaW50LCByZXN1bWVJbnB1dCk7XG4gICAgICAvLyBUaGUgcmVzdW1lZCBsZWcncyBlbnYsIHJlYWQgT05DRSwgYW5kIGl0cyBPV04gY29ycmVsYXRpb24g4oCUIHJlZnVzZWQgaGVyZSwgYmVmb3JlIGFueSBzdGF0ZSBtb3Zlcy4gTmV2ZXJcbiAgICAgIC8vIHRoZSBwYXVzZWQgbGVnJ3M6IHRoZSBjaGVja3BvaW50IGNhcnJpZXMgbm9uZS5cbiAgICAgIGNvbnN0IHsgZW52LCBjb3JyZWxhdGlvbiB9ID0gYWRtaXRSdW5FbnYob3B0aW9ucz8uZW52KTtcbiAgICAgIC8vIE1VU1QgcHJlY2VkZSB0aGUgY291bnRlciByZWFkIGluIGBhbm5vdW5jZVJlc3VtZWAgYW5kIHRoZSB0cmF2ZXJzZXIsXG4gICAgICAvLyB3aGljaCB0YWtlcyBib3RoIGNvdW50ZXJzIEJZIFJFRkVSRU5DRS5cbiAgICAgIHNlZWRDb3VudGVycyhwbGFuLmNoZWNrcG9pbnQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIHRoaXMuX3Zpc2l0Q291bnRzKTtcbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFNhbWUgZXhlY3V0b3I6IHJldXNlIHRoZSBydW50aW1lLiBGcmVzaCBleGVjdXRvcjogc2VlZCBhIE5FVyBvbmUgZnJvbVxuICAgICAgLy8gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgLiBFaXRoZXIgd2F5IGEgTkVXIHJ1bklkIChhIGRpc3RpbmN0IGxvZ2ljYWwgcnVuKS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nUnVudGltZSA9IHRoaXMuX2hhc1J1bkJlZm9yZVxuICAgICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhbnkgcGF0aCB0aGF0IHJlc3VtZXMgY291bnRzIGFzIGEgcnVuXG4gICAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7XG4gICAgICAvLyBUaGUgcmVjb3JkIChQNik6IHRoZSBzYW1lIGV4ZWN1dG9yIGNvbnRpbnVlcyBpdHMgcm9vdCBsb2csIGFuZCBpdHMgc2luazsgYSBmcmVzaCBvbmUgb3BlbnMgYSBuZXcgcm9vdCBsb2cuXG4gICAgICBjb25zdCBzaW5rT3B0aW9uID0gdGhpcy5mbG93Q2hhcnRBcmdzLnNpbms7XG4gICAgICBjb25zdCByZXVzZWQgPSBleGlzdGluZ1J1bnRpbWUgJiYgdGhpcy5yZWNvcmQgPyB0aGlzLnJlY29yZCA6IHVuZGVmaW5lZDtcbiAgICAgIHJldXNlZD8uYmVnaW5MZWcoKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHNpbmtPcHRpb24gJiYgKHJldXNlZCA/PyBuZXcgUnVuUmVjb3JkKHNpbmtPcHRpb24pKTtcbiAgICAgIGNvbnN0IHJlc3VtZWRGcm9tID0gcGxhbi5jaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbj8ucnVuSWQ7XG5cbiAgICAgIC8vIEEgcmVzdW1lZCBsZWcgaGFzIGl0cyBvd24gZGVhZGxpbmUgKHBlciBsZWcsIGxpa2UgdGhlIGxvb3AgYnVkZ2V0KTogb25seSB3aGF0IGlzIHBhc3NlZCBIRVJFLiBBcm1lZCBmcm9tIHRoZVxuICAgICAgLy8gZW52IGFzIGFkbWl0dGVkIChgYWRtaXRSdW5FbnZgLCBvbmUgcmVhZCksIHNvIHRoZSBkZWFkbGluZSBhbmQgdGhlIGNvcnJlbGF0aW9uIHJlYWQgdGhlIHNhbWUgc25hcHNob3QuXG4gICAgICBjb25zdCBhcm1lZCA9IGFybVJ1bih7XG4gICAgICAgIHNpZ25hbDogb3B0aW9ucz8uc2lnbmFsLFxuICAgICAgICB0aW1lb3V0TXM6IG9wdGlvbnM/LnRpbWVvdXRNcyxcbiAgICAgICAgZGVhZGxpbmU6IG9wdGlvbnM/LmRlYWRsaW5lLFxuICAgICAgICBlbnYsXG4gICAgICAgIC4uLihyZWNvcmQ/LnN0b3BTaWduYWwgJiYgeyBzdG9wOiByZWNvcmQuc3RvcFNpZ25hbCB9KSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy50cmF2ZXJzZXIgPSBkaXNwb3NlT25UaHJvdyhhcm1lZCwgKCkgPT5cbiAgICAgICAgdGhpcy5jcmVhdGVUcmF2ZXJzZXIoYXJtZWQuc2lnbmFsLCB1bmRlZmluZWQsIGFybWVkLmVudiwgb3B0aW9ucz8ubWF4RGVwdGgsIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsIHtcbiAgICAgICAgICAvLyBDbG9uZS1pbjogYGluaXRpYWxDb250ZXh0YCBzZWVkcyB0aGUgZnJlc2ggU2hhcmVkTWVtb3J5IHdpdGggYVxuICAgICAgICAgIC8vIHRvcC1sZXZlbC1vbmx5IG1lcmdlIOKAlCBuZXN0ZWQgb2JqZWN0cyB3b3VsZCBhbGlhcyB0aGUgY2FsbGVyJ3MgY2hlY2twb2ludC5cbiAgICAgICAgICBpbml0aWFsQ29udGV4dDogc3RydWN0dXJlZENsb25lKHBsYW4uY2hlY2twb2ludC5zaGFyZWRTdGF0ZSksXG4gICAgICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAgICAgLi4uKGV4aXN0aW5nUnVudGltZSA/IHsgZXhpc3RpbmdSdW50aW1lIH0gOiB7fSksXG4gICAgICAgICAgcmVzdW1lOiBwbGFuLmVudHJ5LFxuICAgICAgICAgIC4uLihwbGFuLmNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgJiYgeyByZWRhY3Rpb25NYXJrczogcGxhbi5jaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzIH0pLFxuICAgICAgICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICAgICAgICAgIC4uLihyZWNvcmQgJiYge1xuICAgICAgICAgICAgcmVjb3JkOiB7XG4gICAgICAgICAgICAgIGxpbms6IHJlY29yZCxcbiAgICAgICAgICAgICAgbWV0YTogdGhpcy5vcGVuaW5nTWV0YShjb3JyZWxhdGlvbiwgYXJtZWQuZGVhZGxpbmUsIHJlc3VtZWRGcm9tKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIC8vIFRoZSBzYW1lIHJvb3QgbG9nIGdvZXMgb24gdW5kZXIgdGhpcyBsZWc6IHRoZSBsZWcgaXMgbm90ZWQgYmVzaWRlIGl0LCBzbyB0aGUgc3RvcmVkIHJlY29yZCBuYW1lcyBpdHMgcnVuSWQuXG4gICAgICBpZiAocmVjb3JkICYmIGV4aXN0aW5nUnVudGltZSkge1xuICAgICAgICBleGlzdGluZ1J1bnRpbWUubm90ZVJlY29yZChcbiAgICAgICAgICAncmVzdW1lJyxcbiAgICAgICAgICByZWNvcmQuc2VydmUoe1xuICAgICAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgICAgIC4uLihyZXN1bWVkRnJvbSAhPT0gdW5kZWZpbmVkICYmIHsgcmVzdW1lZEZyb20gfSksXG4gICAgICAgICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgICAgIC4uLihhcm1lZC5kZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmU6IGFybWVkLmRlYWRsaW5lIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgICB0aGlzLmNhcHR1cmVTaWduYWwgPVxuICAgICAgICB0aGlzLmZsb3dDaGFydEFyZ3MuY2FwdHVyZUNvdmVyYWdlIHx8IHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscy5yZWFkU291cmNlcyA/IGFybWVkLnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIGFsc28gc3RhcnRzIGEgc2VnbWVudCwgbmV2ZXIgYSBuZXdseSBvYnNlcnZlZCB3aG9sZSB3b3JrZmxvdy5cbiAgICAgICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgRXhlY3V0aW9uUnVudGltZSkuY2FwdHVyZT8ubGltaXQoJ3Jlc3VtZWQtc2VnbWVudCcpO1xuICAgICAgLy8gQmVmb3JlIHRoZSB0cmF2ZXJzYWwgb24gcHVycG9zZTogYG9uUmVzdW1lYCBwcmVjZWRlcyBgb25SdW5TdGFydGAuXG4gICAgICBkaXNwb3NlT25UaHJvdyhhcm1lZCwgKCkgPT5cbiAgICAgICAgYW5ub3VuY2VSZXN1bWUocGxhbiwgcmVzdW1lSW5wdXQsIHtcbiAgICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAgIGV4ZWN1dGlvbkNvdW50OiB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlLFxuICAgICAgICAgIG9ic2VydmVyczogdGhpcy5vYnNlcnZlcnMsXG4gICAgICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IEFGVEVSIGFsbCBzeW5jIHZhbGlkYXRpb24vbG9va3VwIHRocm93cyBhYm92ZSAobm90aGluZyBjYW4gbGVhayB0aGVcbiAgICAgIC8vIGZsYWcpOyBubyBhd2FpdCBiZXR3ZWVuIHRoZSB0b3Atb2YtbWV0aG9kIGNoZWNrIGFuZCBoZXJlLCBzbyByYWNlLWZyZWUuXG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZXR0bGVSZWNvcmRlZChhcm1lZCwgcmVjb3JkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCkg4oCUIHNhbWUgYm91bmRhcnkgY29udHJhY3QgYXMgcnVuKCkuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2NvbXBsZXRlZCcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcGF1c2VkID0gdGhpcy5wYXVzZWRPclRocm93KGVycm9yKTtcbiAgICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdwYXVzZWQnKTtcbiAgICAgICAgcmV0dXJuIHBhdXNlZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgICAgIGFybWVkLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuZmluaXNoKGVycm9yKTtcbiAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0bGUgb2YgYSBsZWcgdGhhdCB0aHJldzogZmx1c2ggdGhlIGRlZmVycmVkIHRpZXIgKHRoZSBPVVRFUk1PU1RcbiAgICogaGFuZGxlciDigJQgYSBwYXVzZSByZS10aHJvd3MgdGhyb3VnaCBzdWJmbG93IHRyYXZlcnNlcnMgd2l0aG91dCBleGl0XG4gICAqIGV2ZW50cywgc28gcGVyLXRyYXZlcnNlciBob29rcyB3b3VsZCBtaXNzIGl0KSwgdGhlbiB0dXJuIGEgcGF1c2UgaW50byBhXG4gICAqIGRldGFjaGVkIGNoZWNrcG9pbnQgKGBjaGVja3BvaW50LnRzYCkgYW5kIGEgYFBhdXNlZFJlc3VsdGA7IGFueXRoaW5nIGVsc2VcbiAgICogaXMgcmV0aHJvd24uXG4gICAqL1xuICBwcml2YXRlIHBhdXNlZE9yVGhyb3coZXJyb3I6IHVua25vd24pOiBQYXVzZWRSZXN1bHQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgY29uc3QgcmVkYWN0aW9uTWFya3MgPSB0aGlzLnJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50KCk7XG4gICAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgICBjb25zdCBjYXB0dXJlID0gcnVudGltZS5jYXB0dXJlPy5ydW5JZCA9PT0gdGhpcy5fY3VycmVudFJ1bklkID8gcnVudGltZS5jYXB0dXJlIDogdW5kZWZpbmVkO1xuICAgICAgLy8gQ2hlY2twb2ludCBjcmVhdGlvbiBjYW5ub3QgZGVwZW5kIG9uIGEgcHJpb3Igc2VydmVkU25hcHNob3QoKSB0byBub3RpY2UgYWN0aXZlIHJlZGFjdGlvbi5cbiAgICAgIGlmIChjYXB0dXJlICYmIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dC5nZXRQb2xpY3koKS5yZWRhY3Rpb24/LmlzSW5lcnQoKSA9PT0gZmFsc2UpXG4gICAgICAgIGNhcHR1cmUubGltaXQoJ3JlZGFjdGlvbi1hY3RpdmUnKTtcbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSBidWlsZFBhdXNlQ2hlY2twb2ludChlcnJvciwgdGhpcy50cmF2ZXJzZXIsIHtcbiAgICAgICAgLi4uKGNhcHR1cmUgJiYgeyBjYXB0dXJlOiBydW50aW1lLmNhcHR1cmVTbmFwc2hvdChydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoKSB9KSxcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnQ6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUsXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgICAgLi4uKHJlZGFjdGlvbk1hcmtzICYmIHsgcmVkYWN0aW9uTWFya3MgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0bGUgb2YgYSBsZWcgdGhhdCB3cml0ZXMgaXRzIHJlY29yZCAoMTAuMSwgUDYpIOKAlCB0aGUgMTAuMCBzZXR0bGUgKGBydW4oKWAgLyBgcmVzdW1lKClgKSwgdGhlbiB0aGUgcm9vdFxuICAgKiBsb2cncyBjbG9zaW5nIGVudHJ5IHdpdGggaG93IHRoZSBsZWcgZW5kZWQsIHRoZW4gKGBmbHVzaDogJ2F1dG8nYCkgdGhlIGFkYXB0ZXIncyBmbHVzaCwgYWxsIGJlZm9yZSB0aGUgbGVnXG4gICAqIGNvdW50cyBhcyBmaW5pc2hlZC4gQSBsZWcgd2l0aG91dCBhIHNpbmsgbmV2ZXIgY29tZXMgaGVyZTogaXRzIHNldHRsZSBoYXMgbm8gZXh0cmEgYXdhaXQuXG4gICAqXG4gICAqIFRoZSBsZWcncyBvd24gZXJyb3IgYWx3YXlzIHdpbnMuIEEgcnVuIHRoYXQgZmluaXNoZWQgYnV0IGxvc3QgYW4gZW50cnkgdW5kZXIgYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGhcbiAgICogdGhlIGBSZWNvcmRTaW5rRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGVSZWNvcmRlZChhcm1lZDogQXJtZWRSdW4sIHJlY29yZDogUnVuUmVjb3JkKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXR0bGVSZWNvcmRlZExlZyhhcm1lZCwgcmVjb3JkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGFybWVkLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHRsZVJlY29yZGVkTGVnKGFybWVkOiBBcm1lZFJ1biwgcmVjb3JkOiBSdW5SZWNvcmQpOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgIGxldCBvdXRjb21lOiBMb2dPdXRjb21lO1xuICAgIGxldCByZXN1bHQ6IEV4ZWN1dG9yUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBmYWlsdXJlOiB7IGVycm9yOiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCkg4oCUIHNhbWUgYm91bmRhcnkgY29udHJhY3QgYXMgcnVuKCkuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgICAgICBvdXRjb21lID0gJ29rJztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXVzZWRPclRocm93KGVycm9yKTtcbiAgICAgICAgICBvdXRjb21lID0gJ3BhdXNlZCc7XG4gICAgICAgIH0gY2F0Y2ggKHRocm93bjogdW5rbm93bikge1xuICAgICAgICAgIGZhaWx1cmUgPSB7IGVycm9yOiB0aHJvd24gfTtcbiAgICAgICAgICBvdXRjb21lID0gJ2ZhaWxlZCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJ1bnRpbWUuY2xvc2VSZWNvcmQob3V0Y29tZSwge1xuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICAuLi4oZmFpbHVyZSAmJiB7IGVycm9yOiB0aGlzLmNsb3NpbmdFcnJvcihmYWlsdXJlLmVycm9yKSB9KSxcbiAgICAgIH0pO1xuICAgICAgLy8gQm91bmRlZDogYSBmbHVzaCB0aGF0IG5ldmVyIHNldHRsZXMgaXMgYSBsb3NzLCBuZXZlciBhIHJ1biBoZWxkIG9wZW4gKHRoZSB0aW1lIGxlZnQsIGVsc2UgMzAgcykuXG4gICAgICBpZiAocmVjb3JkLmZsdXNoTW9kZSA9PT0gJ2F1dG8nKSBhd2FpdCByZWNvcmQuZmx1c2goYXV0b0ZsdXNoTXMoYXJtZWQuZGVhZGxpbmUpLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuZmluaXNoKGVycm9yKTtcbiAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgnZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICB0aGlzLmZhaWx1cmVTdGF0ZS5maW5pc2goZmFpbHVyZS5lcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGZhaWx1cmUuZXJyb3IpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkKTtcbiAgICAgIHRocm93IGZhaWx1cmUuZXJyb3I7XG4gICAgfVxuICAgIGlmIChyZWNvcmQuZmF0YWwpIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChyZWNvcmQuZmF0YWwpO1xuICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdmYWlsZWQnLCByZWNvcmQuZmF0YWwpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkKTtcbiAgICAgIHRocm93IHJlY29yZC5mYXRhbDtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hDYXB0dXJlKG91dGNvbWUgPT09ICdwYXVzZWQnID8gJ3BhdXNlZCcgOiAnY29tcGxldGVkJyk7XG4gICAgYXdhaXQgdGhpcy5zYXZlQ2FwdHVyZUhpc3RvcnkocnVudGltZSwgcmVjb3JkKTtcbiAgICBpZiAocmVjb3JkLmZhdGFsKSB7XG4gICAgICAvLyBUaGUgbmF0aXZlIHByZWZpeCBhbHJlYWR5IGVuZGVkOyBhIGxhdGVyIHN0b3JhZ2UgcmVqZWN0aW9uIG93bnMgbm8gc3VjY2Vzc2Z1bCBzdGFnZS5cbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChyZWNvcmQuZmF0YWwpO1xuICAgICAgdGhyb3cgcmVjb3JkLmZhdGFsO1xuICAgIH1cbiAgICB0aGlzLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgIHJldHVybiByZXN1bHQgYXMgRXhlY3V0b3JSZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNhdmVDYXB0dXJlSGlzdG9yeShydW50aW1lOiBFeGVjdXRpb25SdW50aW1lLCByZWNvcmQ6IFJ1blJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghcmVjb3JkLmNhcHR1cmVPcHRpb25zKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgdGhpcy5jYXB0dXJlSGlzdG9yeUxlYXNlID8/PSB7IHBlbmRpbmc6IGZhbHNlIH07XG4gICAgcmV0dXJuIHBlcnNpc3RDYXB0dXJlSGlzdG9yeShydW50aW1lLCByZWNvcmQsICgpID0+IHRoaXMuZ2V0U25hcHNob3QoKSwgdGhpcy5jYXB0dXJlSGlzdG9yeUxlYXNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2FwdHVyZShzdGF0dXM6ICdjb21wbGV0ZWQnIHwgJ3BhdXNlZCcgfCAnZmFpbGVkJywgZXJyb3I/OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jYXB0dXJlU2lnbmFsO1xuICAgIHRoaXMuY2FwdHVyZVNpZ25hbCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgY2FwdHVyZSA9IHJ1bnRpbWUuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgfHwgY2FwdHVyZS5ydW5JZCAhPT0gdGhpcy5fY3VycmVudFJ1bklkKSByZXR1cm47XG4gICAgY29uc3QgY2FuY2VsbGVkID0gc3RhdHVzID09PSAnZmFpbGVkJyAmJiBpc0NhbmNlbGxlZChzaWduYWwpICYmIGVycm9yID09PSBzaWduYWw/LnJlYXNvbjtcbiAgICBpZiAoc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiB0aGlzLnRyYXZlcnNlci5nZXRCcmVha1N0YXRlKCkuc2hvdWxkQnJlYWspIGNhcHR1cmUubGltaXQoJ2V4ZWN1dGlvbi1icm9rZW4nKTtcbiAgICBjYXB0dXJlLmVuZChjYW5jZWxsZWQgPyAnY2FuY2VsbGVkJyA6IHN0YXR1cywgc3RhdHVzID09PSAnZmFpbGVkJyA/IHRoaXMuZmFpbHVyZVN0YXRlLnJlc3VsdCA6IHVuZGVmaW5lZCk7XG4gICAgcnVudGltZS5yZWFkU291cmNlcz8uc2VhbChydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGEgbmV3IHJvb3QgbG9nIG9wZW5zIHdpdGg6IG5hbWVzIGFuZCBudW1iZXJzIHRoZSBydW4gYWxyZWFkeSBzZXJ2ZXMg4oCUIHRoZSBydW4sIHRoZSBjaGFydCwgdGhlIGNvcnJlbGF0aW9uLFxuICAgKiB0aGUgZGVhZGxpbmUsIHRoZSBkZWNsYXJlZCBidWRnZXQsIGFuZCB0aGUgcnVuIGEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIGNvbnRpbnVlcy4gU2VydmVkIGJ5IHRoZSByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG9wZW5pbmdNZXRhKFxuICAgIGNvcnJlbGF0aW9uOiBSdW5Db3JyZWxhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHJlc3VtZWRGcm9tPzogc3RyaW5nLFxuICApOiBNZXRhIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5yb290O1xuICAgIGNvbnN0IGJ1ZGdldE1zID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5idWlsZFRpbWVTdHJ1Y3R1cmU/LmJ1ZGdldE1zO1xuICAgIHJldHVybiB7XG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgY2hhcnQ6IHsgaWQ6IHJvb3QuaWQsIG5hbWU6IHJvb3QubmFtZSB9LFxuICAgICAgLi4uKGNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb24gfSksXG4gICAgICAuLi4oZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lIH0pLFxuICAgICAgLi4uKGJ1ZGdldE1zICE9PSB1bmRlZmluZWQgJiYgeyBidWRnZXRNcyB9KSxcbiAgICAgIC4uLihyZXN1bWVkRnJvbSAhPT0gdW5kZWZpbmVkICYmIHsgcmVzdW1lZEZyb20gfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xvc2luZyBlbnRyeSdzIGVycm9yOiB0aGUgcnVuJ3MgU0VSVkVEIGZvcm0gb2YgaXQsIGl0cyBuYW1lLCBtZXNzYWdlIGFuZCBjb2RlIG9ubHkgKG5ldmVyIGByYXdgKS4gKi9cbiAgcHJpdmF0ZSBjbG9zaW5nRXJyb3IoZXJyb3I6IHVua25vd24pOiBNZXRhIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5yZWRhY3Rpb25SdWxlLnNlcnZlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgbWVzc2FnZTogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHJlLWVudHJhbmN5IGd1YXJkOiBvbmUgZXhlY3V0b3IgPSBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbi4gKi9cbiAgcHJpdmF0ZSBhc3NlcnRJZGxlKG1ldGhvZDogJ3J1bicgfCAncmVzdW1lJyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmxvd0NoYXJ0RXhlY3V0b3I6ICR7bWV0aG9kfSgpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzIGAgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIAgUmVjb3JkZXJzICh0aGUgcmVnaXN0ZXIgbGl2ZXMgaW4gYGF0dGFjaC50c2ApIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBTY29wZVJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKVxuICAgKiBvbiBldmVyeSBzdGFnZSBzY29wZS4gQ2FsbCBiZWZvcmUgcnVuKCkuICoqSWRlbXBvdGVudCBieSBgaWRgKiogKHJlcGxhY2VkLFxuICAgKiBuZXZlciBkdXBsaWNhdGVkKS4gYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgbW92ZXMgaXQgb2ZmIHRoZSBob3QgcGF0aCDigJRcbiAgICogZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFzayBjaGVja3BvaW50OyByZS1hdHRhY2hpbmcgYW4gaWQgb24gdGhlXG4gICAqIG90aGVyIHRpZXIgU1dBUFMgdGllcnMgKGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHNhbWUgaWRcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoU2NvcGUocmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hTY29wZVJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5kZXRhY2hTY29wZShpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycyAoYm90aCB0aWVycykuICovXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLnNjb3BlTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuIEF1dG9tYXRpY2FsbHlcbiAgICogZW5hYmxlcyBuYXJyYXRpdmUuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gSWRlbXBvdGVudCBieSBgaWRgO1xuICAgKiBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBhcyBmb3IgYGF0dGFjaFNjb3BlUmVjb3JkZXJgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5hdHRhY2hGbG93KHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQg4oCUIGJvdGggZGVsaXZlcnkgdGllcnMuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGV0YWNoRmxvdyhpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuZmxvd0xpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSByZWNvcmRlciB0byBldmVyeSBjaGFubmVsIChzY29wZSwgZmxvdywgZW1pdCkgaXQgaGFzIE9XTiBgb24qYFxuICAgKiBtZXRob2RzIGZvciDigJQgcHJlZmVycmVkIG92ZXIgc2luZ2xlLWNoYW5uZWwgY2FsbHMsIHdoZXJlIGZvcmdldHRpbmcgb25lXG4gICAqIHNpbGVudGx5IGxvc2VzIGV2ZW50cy4gSWRlbXBvdGVudCBieSBgaWRgIGFjcm9zcyBhbGwgY2hhbm5lbHM7IGEgZmxvd1xuICAgKiBtZXRob2QgZW5hYmxlcyB0aGUgbmFycmF0aXZlOyBgZGVsaXZlcnlgIGNvbWVzIGZyb20gdGhlIG9wdGlvbnMgb3IgdGhlXG4gICAqIHJlY29yZGVyJ3Mgb3duIGZpZWxkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmF0dGFjaENvbWJpbmVkKHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYSBjb21iaW5lZCByZWNvcmRlciBmcm9tIGV2ZXJ5IGNoYW5uZWwgaXQgd2FzIGF0dGFjaGVkIHRvIChzYWZlIGlmIG5ldmVyIGF0dGFjaGVkKS4gKi9cbiAgZGV0YWNoQ29tYmluZWRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgICB0aGlzLmRldGFjaEZsb3dSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGZvciBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGV2ZW50cy4gSXQgcmlkZXNcbiAgICogdGhlIHNjb3BlIGxpc3QsIHNvIGBvbkVtaXRgIGZpcmVzIGV4YWN0bHkgb25jZSBwZXIgZXZlbnQuIElkZW1wb3RlbnQgYnkgYGlkYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIoe1xuICAgKiAgIGlkOiAndG9rZW4tbWV0ZXInLFxuICAgKiAgIG9uRW1pdDogKGUpID0+IHtcbiAgICogICAgIGlmIChlLm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykgdHJhY2tUb2tlbnMoZS5wYXlsb2FkKTtcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hFbWl0UmVjb3JkZXIocmVjb3JkZXI6IEVtaXRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCByZWNvcmRlcnMgKGJvdGggdGllcnMpIHRoYXQgaW1wbGVtZW50IGBvbkVtaXRgLiAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTY29wZVJlY29yZGVycygpLmZpbHRlcihcbiAgICAgIChyKTogciBpcyBFbWl0UmVjb3JkZXIgPT4gdHlwZW9mIChyIGFzIHsgb25FbWl0PzogdW5rbm93biB9KS5vbkVtaXQgPT09ICdmdW5jdGlvbicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBEZXRhY2ggKFQ0KSDilIDilIDilIBcbiAgLy8gQmFyZS1leGVjdXRvciBlbnRyeSBwb2ludHMgZm9yIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBjaGFydHMuIEZyb20gaW5zaWRlIGFcbiAgLy8gc3RhZ2UgdXNlIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIC8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAsXG4gIC8vIHdoaWNoIG1pbnQgcmVmSWRzIGZyb20gdGhlIGNhbGxpbmcgc3RhZ2U7IHRoZXNlIHVzZSBgX19leGVjdXRvcl9fYC5cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybiBhIGBEZXRhY2hIYW5kbGVgXG4gICAqIHRoZSBjYWxsZXIgY2FuIGB3YWl0KClgIG9uIChQcm9taXNlKSBvciByZWFkIGAuc3RhdHVzYCBmcm9tIChzeW5jKS4gVGhlXG4gICAqIGRyaXZlciBpcyBSRVFVSVJFRCDigJQgdGhlcmUgaXMgbm8gbGlicmFyeSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgZXhlYyA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihwYXJlbnRDaGFydCk7XG4gICAqIGNvbnN0IGhhbmRsZSA9IGV4ZWMuZGV0YWNoQW5kSm9pbkxhdGVyKG1pY3JvdGFza0JhdGNoRHJpdmVyLCB0ZWxlbWV0cnlDaGFydCwgeyBldmVudDogJ3gnIH0pO1xuICAgKiBhd2FpdCBoYW5kbGUud2FpdCgpOyAvLyBvcHRpb25hbFxuICAgKiBgYGBcbiAgICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIF9kZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgRElTQ0FSRCB0aGUgaGFuZGxlIOKAlCBmb3JcbiAgICogZmlyZS1hbmQtZm9yZ2V0IHNpZGUgZWZmZWN0cy4gQSBjaGlsZCdzIGVycm9yIGxhbmRzIG9uIHRoZSBkaXNjYXJkZWQgaGFuZGxlO1xuICAgKiBmb3Igb2JzZXJ2YWJsZSBkZXRhY2ggcHJlZmVyIGBkZXRhY2hBbmRKb2luTGF0ZXJgICsgYC53YWl0KCkuY2F0Y2goKWAuXG4gICAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgX2RldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRvci1vd25lZCBuYXJyYXRpdmUgdmlldzsgYC5tYXAoZSA9PiBlLnRleHQpYCBmb3IgZmxhdCBzdHJpbmdzLlxuICAgKiBgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnMpYCBjb25maWd1cmVzIHRoaXMgdmlldy4gQXR0YWNoaW5nIGEgZmxvdyByZWNvcmRlclxuICAgKiBhbHNvIGVuYWJsZXMgaXQsIGJ1dCB0aGF0IHJlY29yZGVyJ3Mgb3B0aW9ucyBhbmQgZW50cmllcyByZW1haW4gaW5kZXBlbmRlbnRcbiAgICogKHJlYWQgYW4gYXR0YWNoZWQgYG5hcnJhdGl2ZSgpYCBpbnN0YW5jZSB3aXRoIGByZWNvcmRlci5nZXRFbnRyaWVzKClgKS5cbiAgICogU2FtZS1leGVjdXRvciByZXN1bWUgcmV0YWlucyBoaXN0b3J5OyBhIGZyZXNoIGV4ZWN1dG9yIHJlY29yZHMgaXRzIHJlc3VtZWRcbiAgICogbGVnIG9ubHkuIFRoZSBpbnRlcm5hbCBuYXJyYXRvciBpcyBub3QgYW4gYXR0YWNoZWQgc25hcHNob3QgcmVjb3JkZXIgcm93LlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLm9ic2VydmVycy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBjaGFydC4gUmVzb2x2ZXMgd2hlbiB0aGUgcnVuIGZpbmlzaGVzIOKAlCBvciBwYXVzZXMsIGlmIGFcbiAgICogcGF1c2FibGUgc3RhZ2UgcmV0dXJuZWQgZGF0YSAoY2hlY2sgYGlzUGF1c2VkKClgIGFmdGVyd2FyZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIGB7IGlucHV0LCBlbnYgfWAg4oCUIGBpbnB1dGAgaXMgdGhlIGZyb3plbiBidXNpbmVzcyBpbnB1dFxuICAgKiAgIChyZWFkIGluIGEgc3RhZ2UgdmlhIGBzY29wZS4kZ2V0QXJncygpYCk7IGBlbnZgIGlzIGluZnJhc3RydWN0dXJlIGNvbnRleHRcbiAgICogICBsaWtlIGB7IHNpZ25hbCwgdGltZW91dE1zLCB0cmFjZUlkIH1gIChyZWFkIHZpYSBgc2NvcGUuJGdldEVudigpYCk7IGBkZWFkbGluZWAgLyBgdGltZW91dE1zYCBnaXZlIHRoZSBydW5cbiAgICogICBpdHMgZGVhZGxpbmUgKGBlbnYuZGVhZGxpbmVgLCBgc2NvcGUuJGF0dGVtcHQoKS50aW1lTGVmdE1zKClgKS5cbiAgICpcbiAgICogQWZ0ZXIgaXQgcmVzb2x2ZXMsIHJlYWQgcmVzdWx0cyBvZmYgdGhlIGV4ZWN1dG9yOlxuICAgKiAtIGBnZXRTbmFwc2hvdCgpYCDigJQgZnVsbCBzdGF0ZSwgY29tbWl0IGxvZywgZXhlY3V0aW9uIHRyZWUuXG4gICAqIC0gYGdldE5hcnJhdGl2ZUVudHJpZXMoKWAg4oCUIHRoZSBwbGFpbi1FbmdsaXNoIHRyYWNlIChjYWxsIGBlbmFibGVOYXJyYXRpdmUoKWBcbiAgICogICBvciBhdHRhY2ggYSBgbmFycmF0aXZlKClgIHJlY29yZGVyIGZpcnN0KS5cbiAgICogLSBgaXNQYXVzZWQoKWAg4oCUIHRydWUgaWYgYSBzdGFnZSBwYXVzZWQ7IHRoZW4gdXNlIGBnZXRDaGVja3BvaW50KClgIC8gYHJlc3VtZSgpYC5cbiAgICpcbiAgICogT25lIHJ1biBhdCBhIHRpbWUgcGVyIGV4ZWN1dG9yIOKAlCBpdCBob2xkcyBwZXItcnVuIHN0YXRlIChydW5JZCwgcmVjb3JkZXJzLFxuICAgKiBjaGVja3BvaW50KS4gQ3JlYXRlIG9uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uXG4gICAqL1xuICBhc3luYyBydW4ob3B0aW9ucz86IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgLy8gQSBmYWlsZWQgZW50cnkgbGVhdmVzIG5vIHNpZGUgZWZmZWN0czogdGhlIGd1YXJkIEZJUlNUICh0aGUgaW4tZmxpZ2h0XG4gICAgLy8gcnVuIHN0YXlzIHVudG91Y2hlZCksIHZhbGlkYXRpb24gYmVmb3JlIHRoZSB0aW1lb3V0IHRpbWVyIGV4aXN0cy5cbiAgICB0aGlzLmFzc2VydElkbGUoJ3J1bicpO1xuICAgIHRoaXMuZmFpbHVyZVN0YXRlID0gbmV3IE5hdGl2ZUZhaWx1cmVTdGF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgdmFsaWRhdGVkSW5wdXQgPSBvcHRpb25zPy5pbnB1dDtcbiAgICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgZW52LCByZWFkIE9OQ0UsIGFuZCB0aGUgcnVuJ3MgY29ycmVsYXRpb24sIGJlZm9yZSBhbnl0aGluZyBtb3ZlczogYSByZWZ1c2VkIGB0cmFjZXBhcmVudGAgbGVhdmVzIG5vXG4gICAgICAvLyBzaWRlIGVmZmVjdCwgYW5kIHRoZSBzdGFnZXMgc2VlIHRoZSBzYW1lIHNuYXBzaG90IHRoZSBjb3JyZWxhdGlvbiB3YXMgcmVhZCBmcm9tIChgYWRtaXRSdW5FbnZgKS5cbiAgICAgIGNvbnN0IHsgZW52LCBjb3JyZWxhdGlvbiB9ID0gYWRtaXRSdW5FbnYob3B0aW9ucz8uZW52KTtcblxuICAgICAgLy8gVGhlIHJ1bidzIG9uZSBzaWduYWwgYW5kIGl0cyBkZWFkbGluZSAoYGFybVJ1bmApOiBgc2lnbmFsYCwgYGVudi5zaWduYWxgLCBgZGVhZGxpbmVgIC8gYHRpbWVvdXRNc2AgL1xuICAgICAgLy8gYGVudi5kZWFkbGluZWAsIGNvbXBvc2VkIGZyb20gdGhlIEFETUlUVEVEIGVudiDigJQgYW5kIHN0YW1wZWQgb24gdGhlIGVudiBzdGFnZXMgcmVhZC4gQXJtZWQgYWZ0ZXIgdGhlXG4gICAgICAvLyBhZG1pc3Npb24sIHNvIGEgcmVmdXNlZCBgdHJhY2VwYXJlbnRgIGxlYXZlcyBubyB0aW1lcjsgZGlzcG9zZWQgb24gZXZlcnkgZXhpdC5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7IC8vIHJlYWQgQkVGT1JFIGFybWluZywgc28gYHRpbWVvdXRNc2AgZXF1YWwgdG8gdGhlIGRlY2xhcmVkIGJ1ZGdldCBuZXZlciB3YXJuc1xuICAgICAgLy8gVGhlIHJ1bidzIHJlY29yZCAoUDYpOiBhIGZyZXNoIG9uZSBwZXIgcnVuIOKAlCBpdHMgYCdmYWlsJ2Agc3RvcCBpcyBvbmUgbW9yZSBzb3VyY2Ugb2YgdGhlIHJ1bidzIHNpZ25hbC5cbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZmxvd0NoYXJ0QXJncy5zaW5rICYmIG5ldyBSdW5SZWNvcmQodGhpcy5mbG93Q2hhcnRBcmdzLnNpbmspO1xuICAgICAgY29uc3QgYXJtZWQgPSBhcm1SdW4oe1xuICAgICAgICBzaWduYWw6IG9wdGlvbnM/LnNpZ25hbCxcbiAgICAgICAgdGltZW91dE1zOiBvcHRpb25zPy50aW1lb3V0TXMsXG4gICAgICAgIGRlYWRsaW5lOiBvcHRpb25zPy5kZWFkbGluZSxcbiAgICAgICAgZW52LFxuICAgICAgICAuLi4ocmVjb3JkPy5zdG9wU2lnbmFsICYmIHsgc3RvcDogcmVjb3JkLnN0b3BTaWduYWwgfSksXG4gICAgICB9KTtcbiAgICAgIC8vIEEgZGVhZGxpbmUgc2hvcnRlciB0aGFuIHRoZSBjaGFydCdzIGRlY2xhcmVkIGAuYnVkZ2V0KG1zKWA6IGEgZGV2LW1vZGUgd2FybmluZywgb25jZSBwZXIgY2hhcnQgKFA1KS5cbiAgICAgIGRpc3Bvc2VPblRocm93KGFybWVkLCAoKSA9PiB3YXJuRGVhZGxpbmVVbmRlckJ1ZGdldCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LCBhcm1lZC5kZWFkbGluZSwgc3RhcnRlZEF0KSk7XG5cbiAgICAgIHRoaXMub2JzZXJ2ZXJzLmNsZWFyRm9yUnVuKCk7IC8vIG5vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb25cbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAgICAgdGhpcy5fdmlzaXRDb3VudHMgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7XG4gICAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhIGxhdGVyIHJlc3VtZSgpIHJldXNlcyB0aGlzIHJ1bnRpbWVcbiAgICAgIHRoaXMudHJhdmVyc2VyID0gZGlzcG9zZU9uVGhyb3coYXJtZWQsICgpID0+XG4gICAgICAgIHRoaXMuY3JlYXRlVHJhdmVyc2VyKGFybWVkLnNpZ25hbCwgdmFsaWRhdGVkSW5wdXQsIGFybWVkLmVudiwgb3B0aW9ucz8ubWF4RGVwdGgsIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsIHtcbiAgICAgICAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgICAgICAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkOiB7IGxpbms6IHJlY29yZCwgbWV0YTogdGhpcy5vcGVuaW5nTWV0YShjb3JyZWxhdGlvbiwgYXJtZWQuZGVhZGxpbmUpIH0gfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIC8vIFNldCBvbmNlIHRoZSBsZWcncyB0cmF2ZXJzZXIgZXhpc3RzLCBzbyBhIHNuYXBzaG90IG5ldmVyIHBhaXJzIG9uZSBydW4ncyBzdGF0ZSB3aXRoIGFub3RoZXIncyBzaW5rIHN0YXRzLlxuICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgICB0aGlzLmNhcHR1cmVTaWduYWwgPVxuICAgICAgICB0aGlzLmZsb3dDaGFydEFyZ3MuY2FwdHVyZUNvdmVyYWdlIHx8IHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscy5yZWFkU291cmNlcyA/IGFybWVkLnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEFmdGVyIGV2ZXJ5IHN5bmMgdGhyb3csIHdpdGggbm8gYXdhaXQgc2luY2UgdGhlIGd1YXJkOiByYWNlLWZyZWUuXG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZXR0bGVSZWNvcmRlZChhcm1lZCwgcmVjb3JkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCk6IFwib25lIGJlYXQgYmVoaW5kXCIgbmV2ZXIgYmVjb21lcyBcImxvc3QgYXQgZXhpdFwiLlxuICAgICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgICAgdGhpcy5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5maW5pc2hDYXB0dXJlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMucGF1c2VkT3JUaHJvdyhlcnJvcik7XG4gICAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZmluaXNoQ2FwdHVyZSgncGF1c2VkJyk7XG4gICAgICAgIHJldHVybiBwYXVzZWQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgICBhcm1lZC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZmFpbHVyZVN0YXRlLmZpbmlzaChlcnJvcik7XG4gICAgICB0aGlzLmZpbmlzaENhcHR1cmUoJ2ZhaWxlZCcsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgYmFja2xvZywgdGhlbiBhd2FpdCBhc3luYyBsaXN0ZW5lciBjb21wbGV0aW9uc1xuICAgKiB1bmRlciBhIGRlYWRsaW5lIOKAlCBjYWxsIGJlZm9yZSBhIHNlcnZlcmxlc3MgcHJvY2VzcyBmcmVlemVzIG9yIGV4aXRzLlxuICAgKiBaZXJvcyB3aGVuIG5vIGRlZmVycmVkIG9ic2VydmVyIHdhcyBhdHRhY2hlZDsgYHBlbmRpbmcgPiAwYCByZXBvcnRzIHdoYXRcbiAgICogd2FzIHN0aWxsIG91dHN0YW5kaW5nIGF0IHRoZSBkZWFkbGluZS5cbiAgICovXG4gIGRyYWluT2JzZXJ2ZXJzKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxPYnNlcnZlckRyYWluUmVzdWx0PiB7XG4gICAgY29uc3QgdGllciA9IHRoaXMub2JzZXJ2ZXJzLmRlZmVycmVkVGllcjtcbiAgICBpZiAoIXRpZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBkb25lOiAwLCBmYWlsZWQ6IDAsIHBlbmRpbmc6IDAgfSk7XG4gICAgcmV0dXJuIHRpZXIuZHJhaW4ob3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIHJlY29yZCBzaW5rICgxMC4xLCBQNik6IGF3YWl0IHRoZSBhZGFwdGVyJ3MgYGZsdXNoKClgIOKAlCBmb3IgYW4gZXhlY3V0b3IgYnVpbHQgd2l0aFxuICAgKiBgc2luazogeyBhZGFwdGVyLCBmbHVzaDogJ21hbnVhbCcgfWAsIG9yIGJlZm9yZSBhIHNlcnZlcmxlc3MgcHJvY2VzcyBmcmVlemVzLiBgdGltZW91dE1zYCBib3VuZHMgdGhlIHdhaXQ7IGFcbiAgICogZmx1c2ggc3RpbGwgcnVubmluZyB0aGVuIGlzIGBwZW5kaW5nYCAoYW5kIGtlZXBzIHJ1bm5pbmcpLiBBIGZhaWxlZCBmbHVzaCBpcyBjb3VudGVkIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLlxuICAgKiBEb25lIGF0IG9uY2Ugd2l0aG91dCBhIHNpbmssIG9yIHdpdGggYW4gYWRhcHRlciB0aGF0IGhhcyBubyBgZmx1c2hgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNpbms6IHsgYWRhcHRlcjogZmlsZVNpbmsocGF0aCksIGZsdXNoOiAnbWFudWFsJyB9IH0pO1xuICAgKiBhd2FpdCBleGVjdXRvci5ydW4oKTtcbiAgICogYXdhaXQgZXhlY3V0b3IuZmx1c2hSZWNvcmQoeyB0aW1lb3V0TXM6IDJfMDAwIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGZsdXNoUmVjb3JkKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5yZWNvcmQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBkb25lOiB0cnVlLCBmYWlsZWQ6IGZhbHNlLCBwZW5kaW5nOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuZmx1c2gob3B0cz8udGltZW91dE1zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIGB0cnVlYCBzZXJ2ZXMgYHNoYXJlZFN0YXRlYCAoYW5kIGVhY2ggc3ViZmxvdydzXG4gICAqICAgYGdsb2JhbENvbnRleHRgKSBmcm9tIHRoZSByZWRhY3RlZCBtaXJyb3Ig4oCUIHRoZSBzYWZlIHZpZXcgdG8gZXhwb3J0LiBBXG4gICAqICAgbm8tb3Agd2l0aG91dCBhIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBjb21taXQgbG9nIGlzIHJlZGFjdGVkIGF0IHdyaXRlXG4gICAqICAgdGltZSByZWdhcmRsZXNzLiBEZWZhdWx0IGBmYWxzZWAuXG4gICAqXG4gICAqICoqVHJlYXQgYHNoYXJlZFN0YXRlYCBhcyBSRUFELU9OTFkuKiogSW4gcHJvZHVjdGlvbiBpdCBpcyBhIGxpdmUgdmlldyBvZlxuICAgKiBlbmdpbmUgbWVtb3J5OyBpbiBkZXYgbW9kZSBhIGRlZXAtZnJvemVuIGNsb25lLCBzbyBhIG11dGF0aW9uIHRocm93cy5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHNlcnZlZFNuYXBzaG90KHRoaXMudHJhdmVyc2VyLCB0aGlzLm9ic2VydmVycywgb3B0aW9ucywgdGhpcy5yZWNvcmQ/LnN0YXRzKCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLm9ic2VydmVycy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5vYnNlcnZlcnMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldFNwZWMoc3ViZmxvd0lkKTtcbiAgfVxufVxuXG4vKiogSG93IGxvbmcgYSBydW4ncyBvd24gZmx1c2ggbWF5IHRha2U6IHRoZSBydW4ncyB0aW1lIGxlZnQgKGF0IGxlYXN0IDEgcyksIG5ldmVyIHBhc3Qge0BsaW5rIEFVVE9fRkxVU0hfTVN9LiAqL1xuZnVuY3Rpb24gYXV0b0ZsdXNoTXMoZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBkZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gQVVUT19GTFVTSF9NUyA6IE1hdGgubWluKEFVVE9fRkxVU0hfTVMsIE1hdGgubWF4KDFfMDAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbn1cblxuLyoqIFRoZSBib3VuZCBvbiBhIHJ1bidzIG93biBmbHVzaCB3aGVuIGl0IGhhcyBubyBkZWFkbGluZTogMzAgcy4gKi9cbmNvbnN0IEFVVE9fRkxVU0hfTVMgPSAzMF8wMDA7XG5cbi8qKiBSdW4gYGJ1aWxkYDsgaWYgaXQgdGhyb3dzLCByZWxlYXNlIHRoZSBhcm1lZCBydW4gZmlyc3QgKG5vIGRlYWRsaW5lIHRpbWVyIG91dGxpdmVzIGEgcmVmdXNlZCBlbnRyeSkuICovXG5mdW5jdGlvbiBkaXNwb3NlT25UaHJvdzxUPihhcm1lZDogQXJtZWRSdW4sIGJ1aWxkOiAoKSA9PiBUKTogVCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJ1aWxkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYXJtZWQuZGlzcG9zZSgpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXX0=
|