footprintjs 5.0.0 → 6.0.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/CLAUDE.md +32 -8
- package/dist/advanced.js +2 -3
- package/dist/esm/advanced.js +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +364 -100
- package/dist/esm/lib/builder/index.js +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +158 -0
- package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.js +171 -0
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/engine/errors/errorInfo.js +4 -3
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +11 -2
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +5 -7
- package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +2 -2
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +9 -7
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +7 -1
- package/dist/esm/lib/engine/handlers/index.js +1 -3
- package/dist/esm/lib/engine/handlers/types.js +2 -2
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +12 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +3 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +8 -1
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/runtimeStageId.js +64 -2
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +11 -54
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +144 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +4 -17
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +3 -2
- package/dist/esm/trace.js +3 -2
- package/dist/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +364 -100
- package/dist/lib/builder/index.js +1 -1
- package/dist/lib/builder/structure/StructureRecorder.js +159 -0
- package/dist/lib/builder/structure/StructureRecorderDispatcher.js +175 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/engine/errors/errorInfo.js +4 -3
- package/dist/lib/engine/handlers/ChildrenExecutor.js +11 -2
- package/dist/lib/engine/handlers/DeciderHandler.js +5 -7
- package/dist/lib/engine/handlers/RuntimeStructureManager.js +2 -2
- package/dist/lib/engine/handlers/SelectorHandler.js +9 -7
- package/dist/lib/engine/handlers/SubflowExecutor.js +7 -1
- package/dist/lib/engine/handlers/index.js +2 -5
- package/dist/lib/engine/handlers/types.js +2 -2
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +12 -2
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +3 -3
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +8 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/runtimeStageId.js +66 -3
- package/dist/lib/engine/traversal/FlowchartTraverser.js +11 -54
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +148 -0
- package/dist/lib/runner/FlowChartExecutor.js +4 -17
- package/dist/lib/runner/getSubtreeSnapshot.js +3 -2
- package/dist/trace.js +5 -2
- package/dist/types/advanced.d.ts +4 -4
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +110 -14
- package/dist/types/lib/builder/index.d.ts +2 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +349 -0
- package/dist/types/lib/builder/structure/StructureRecorderDispatcher.d.ts +77 -0
- package/dist/types/lib/builder/types.d.ts +20 -6
- package/dist/types/lib/engine/errors/errorInfo.d.ts +3 -2
- package/dist/types/lib/engine/handlers/DeciderHandler.d.ts +3 -3
- package/dist/types/lib/engine/handlers/RuntimeStructureManager.d.ts +1 -1
- package/dist/types/lib/engine/handlers/SelectorHandler.d.ts +2 -2
- package/dist/types/lib/engine/handlers/index.d.ts +1 -2
- package/dist/types/lib/engine/handlers/types.d.ts +2 -9
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -2
- package/dist/types/lib/engine/narrative/types.d.ts +24 -2
- package/dist/types/lib/engine/runtimeStageId.d.ts +57 -1
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -6
- package/dist/types/lib/engine/types.d.ts +0 -26
- package/dist/types/lib/engine/walkSubflowSpec.d.ts +95 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -16
- package/dist/types/trace.d.ts +3 -1
- package/package.json +1 -1
- package/dist/esm/lib/engine/handlers/ExtractorRunner.js +0 -122
- package/dist/lib/engine/handlers/ExtractorRunner.js +0 -126
- package/dist/types/lib/engine/handlers/ExtractorRunner.d.ts +0 -41
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Barrel export for all engine handler modules.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.RuntimeStructureManager = exports.computeNodeType = exports.
|
|
7
|
+
exports.RuntimeStructureManager = exports.computeNodeType = exports.seedSubflowGlobalStore = exports.getInitialScopeValues = exports.extractParentScopeValues = exports.createSubflowHandlerDeps = exports.applyOutputMapping = exports.SubflowExecutor = exports.DEFAULT_MAX_ITERATIONS = exports.ContinuationResolver = exports.SelectorHandler = exports.DeciderHandler = exports.ChildrenExecutor = exports.NodeResolver = exports.StageRunner = void 0;
|
|
8
8
|
// Stage execution
|
|
9
9
|
var StageRunner_js_1 = require("./StageRunner.js");
|
|
10
10
|
Object.defineProperty(exports, "StageRunner", { enumerable: true, get: function () { return StageRunner_js_1.StageRunner; } });
|
|
@@ -34,11 +34,8 @@ Object.defineProperty(exports, "createSubflowHandlerDeps", { enumerable: true, g
|
|
|
34
34
|
Object.defineProperty(exports, "extractParentScopeValues", { enumerable: true, get: function () { return SubflowInputMapper_js_1.extractParentScopeValues; } });
|
|
35
35
|
Object.defineProperty(exports, "getInitialScopeValues", { enumerable: true, get: function () { return SubflowInputMapper_js_1.getInitialScopeValues; } });
|
|
36
36
|
Object.defineProperty(exports, "seedSubflowGlobalStore", { enumerable: true, get: function () { return SubflowInputMapper_js_1.seedSubflowGlobalStore; } });
|
|
37
|
-
// Traversal extractor coordination
|
|
38
|
-
var ExtractorRunner_js_1 = require("./ExtractorRunner.js");
|
|
39
|
-
Object.defineProperty(exports, "ExtractorRunner", { enumerable: true, get: function () { return ExtractorRunner_js_1.ExtractorRunner; } });
|
|
40
37
|
// Runtime structure management (dynamic pipeline structure tracking)
|
|
41
38
|
var RuntimeStructureManager_js_1 = require("./RuntimeStructureManager.js");
|
|
42
39
|
Object.defineProperty(exports, "computeNodeType", { enumerable: true, get: function () { return RuntimeStructureManager_js_1.computeNodeType; } });
|
|
43
40
|
Object.defineProperty(exports, "RuntimeStructureManager", { enumerable: true, get: function () { return RuntimeStructureManager_js_1.RuntimeStructureManager; } });
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQTBCO0FBQzFCOztHQUVHOzs7QUFFSCxrQkFBa0I7QUFDbEIsbURBQStDO0FBQXRDLDZHQUFBLFdBQVcsT0FBQTtBQUVwQixpREFBaUQ7QUFDakQscURBQWlEO0FBQXhDLCtHQUFBLFlBQVksT0FBQTtBQUtyQiw4QkFBOEI7QUFDOUIsNkRBQXlEO0FBQWhELHVIQUFBLGdCQUFnQixPQUFBO0FBRXpCLHNDQUFzQztBQUN0Qyx5REFBcUQ7QUFBNUMsbUhBQUEsY0FBYyxPQUFBO0FBRXZCLGdDQUFnQztBQUNoQywyREFBdUQ7QUFBOUMscUhBQUEsZUFBZSxPQUFBO0FBRXhCLDhEQUE4RDtBQUM5RCxxRUFBeUY7QUFBaEYsK0hBQUEsb0JBQW9CLE9BQUE7QUFBRSxpSUFBQSxzQkFBc0IsT0FBQTtBQUVyRCwyQ0FBMkM7QUFDM0MsMkRBQXVEO0FBQTlDLHFIQUFBLGVBQWUsT0FBQTtBQUV4QiwrQkFBK0I7QUFDL0IsaUVBTWlDO0FBTC9CLDJIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLGlJQUFBLHdCQUF3QixPQUFBO0FBQ3hCLGlJQUFBLHdCQUF3QixPQUFBO0FBQ3hCLDhIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLCtIQUFBLHNCQUFzQixPQUFBO0FBR3hCLHFFQUFxRTtBQUNyRSwyRUFBd0Y7QUFBL0UsNkhBQUEsZUFBZSxPQUFBO0FBQUUscUlBQUEsdUJBQXVCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuLyoqXG4gKiBCYXJyZWwgZXhwb3J0IGZvciBhbGwgZW5naW5lIGhhbmRsZXIgbW9kdWxlcy5cbiAqL1xuXG4vLyBTdGFnZSBleGVjdXRpb25cbmV4cG9ydCB7IFN0YWdlUnVubmVyIH0gZnJvbSAnLi9TdGFnZVJ1bm5lci5qcyc7XG5cbi8vIE5vZGUgcmVzb2x1dGlvbiBhbmQgc3ViZmxvdyByZWZlcmVuY2UgaGFuZGxpbmdcbmV4cG9ydCB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4vTm9kZVJlc29sdmVyLmpzJztcblxuLy8gSGFuZGxlciBjYWxsYmFjayB0eXBlcyAoY2Fub25pY2FsIOKAlCBhdm9pZHMgY2lyY3VsYXIgZGVwIHdpdGggdHJhdmVyc2VyKVxuZXhwb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFBhcmFsbGVsIGNoaWxkcmVuIGV4ZWN1dGlvblxuZXhwb3J0IHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4vQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5cbi8vIFNpbmdsZS1jaG9pY2UgY29uZGl0aW9uYWwgYnJhbmNoaW5nXG5leHBvcnQgeyBEZWNpZGVySGFuZGxlciB9IGZyb20gJy4vRGVjaWRlckhhbmRsZXIuanMnO1xuXG4vLyBNdWx0aS1jaG9pY2UgZmlsdGVyZWQgZmFuLW91dFxuZXhwb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi9TZWxlY3RvckhhbmRsZXIuanMnO1xuXG4vLyBCYWNrLWVkZ2UgcmVzb2x1dGlvbiArIGl0ZXJhdGlvbiBjb3VudGluZyAod2FzIExvb3BIYW5kbGVyKVxuZXhwb3J0IHsgQ29udGludWF0aW9uUmVzb2x2ZXIsIERFRkFVTFRfTUFYX0lURVJBVElPTlMgfSBmcm9tICcuL0NvbnRpbnVhdGlvblJlc29sdmVyLmpzJztcblxuLy8gU3ViZmxvdyBleGVjdXRpb24gd2l0aCBpc29sYXRlZCBjb250ZXh0c1xuZXhwb3J0IHsgU3ViZmxvd0V4ZWN1dG9yIH0gZnJvbSAnLi9TdWJmbG93RXhlY3V0b3IuanMnO1xuXG4vLyBTdWJmbG93IGlucHV0L291dHB1dCBtYXBwaW5nXG5leHBvcnQge1xuICBhcHBseU91dHB1dE1hcHBpbmcsXG4gIGNyZWF0ZVN1YmZsb3dIYW5kbGVyRGVwcyxcbiAgZXh0cmFjdFBhcmVudFNjb3BlVmFsdWVzLFxuICBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsXG4gIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUsXG59IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcblxuLy8gUnVudGltZSBzdHJ1Y3R1cmUgbWFuYWdlbWVudCAoZHluYW1pYyBwaXBlbGluZSBzdHJ1Y3R1cmUgdHJhY2tpbmcpXG5leHBvcnQgeyBjb21wdXRlTm9kZVR5cGUsIFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi9SdW50aW1lU3RydWN0dXJlTWFuYWdlci5qcyc7XG4iXX0=
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* handlers/types.ts — Shared callback types for all handler modules.
|
|
4
4
|
*
|
|
5
|
-
* Avoids duplicate definitions of ExecuteNodeFn /
|
|
5
|
+
* Avoids duplicate definitions of ExecuteNodeFn / RunStageFn / etc.
|
|
6
6
|
* across ChildrenExecutor, DeciderHandler, ContinuationResolver, SubflowExecutor.
|
|
7
7
|
* All types are callbacks that break circular dependencies with FlowchartTraverser.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBoYW5kbGVycy90eXBlcy50cyDigJQgU2hhcmVkIGNhbGxiYWNrIHR5cGVzIGZvciBhbGwgaGFuZGxlciBtb2R1bGVzLlxuICpcbiAqIEF2b2lkcyBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgRXhlY3V0ZU5vZGVGbiAvIFJ1blN0YWdlRm4gLyBldGMuXG4gKiBhY3Jvc3MgQ2hpbGRyZW5FeGVjdXRvciwgRGVjaWRlckhhbmRsZXIsIENvbnRpbnVhdGlvblJlc29sdmVyLCBTdWJmbG93RXhlY3V0b3IuXG4gKiBBbGwgdHlwZXMgYXJlIGNhbGxiYWNrcyB0aGF0IGJyZWFrIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aXRoIEZsb3djaGFydFRyYXZlcnNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRyYXZlcnNlciBicmVhayBmbGFnIOKAlCBtdXRhYmxlIHN0cnVjdCBwYXNzZWQgdGhyb3VnaCB0aGUgdHJhdmVyc2FsIHJlY3Vyc2lvbi5cbiAqXG4gKiBgc2hvdWxkQnJlYWtgIGZsaXBzIHdoZW4gYW55IHN0YWdlIGNhbGxzIGBzY29wZS4kYnJlYWsoKWAuIFRoZSB0cmF2ZXJzZXJcbiAqIGNoZWNrcyB0aGlzIGJlZm9yZSBzY2hlZHVsaW5nIHRoZSBuZXh0IG5vZGU7IHdoZW4gc2V0LCB0aGUgc3RhY2sgdW53aW5kc1xuICogY2xlYW5seSB3aXRob3V0IHJ1bm5pbmcgc3Vic2VxdWVudCBzdGFnZXMuXG4gKlxuICogYHJlYXNvbmAgaXMgdGhlIG9wdGlvbmFsIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gYCRicmVhayhyZWFzb24pYC4gSXRcbiAqIHRyYXZlbHMgYWxvbmdzaWRlIGBzaG91bGRCcmVha2Agc28gZG93bnN0cmVhbSBjb2RlIChGbG93UmVjb3JkZXIgb25CcmVha1xuICogZXZlbnRzLCBzdWJmbG93LXByb3BhZ2F0aW9uIHRvIHBhcmVudCBzY29wZSkgY2FuIHN1cmZhY2UgdGhlIHJlYXNvbi5cbiAqXG4gKiBBZGRpbmcgZmllbGRzIGhlcmUgaXMgYmFja3dhcmQgY29tcGF0aWJsZSDigJQgZXhpc3RpbmcgY2FsbGVycyBvbmx5IHJlYWRcbiAqIGBzaG91bGRCcmVha2AsIGFuZCBgcmVhc29uYCBpcyBvcHRpb25hbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmVha0ZsYWcge1xuICBzaG91bGRCcmVhazogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG4vKiogUmVjdXJzaXZlIG5vZGUgZXhlY3V0aW9uIOKAlCBhdm9pZHMgY2lyY3VsYXIgZGVwIHdpdGggRmxvd2NoYXJ0VHJhdmVyc2VyLiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZU5vZGVGbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0gKFxuICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgYnJhbmNoUGF0aD86IHN0cmluZyxcbikgPT4gUHJvbWlzZTxhbnk+O1xuXG4vKiogUnVuIGEgc3RhZ2UgZnVuY3Rpb24gd2l0aCBjb21taXQuICovXG5leHBvcnQgdHlwZSBSdW5TdGFnZUZuPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4gPSAoXG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICBicmVha0ZuOiAoKSA9PiB2b2lkLFxuKSA9PiBQcm9taXNlPFRPdXQ+O1xuIl19
|
|
@@ -81,6 +81,11 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
|
|
|
81
81
|
}
|
|
82
82
|
// ── Flow channel (fires after stage execution) ────────────────────────
|
|
83
83
|
onStageExecuted(event) {
|
|
84
|
+
// Non-linear kinds get their narrative entries (and ops flush)
|
|
85
|
+
// from `onDecision` / `onFork` / `onSelected` / `onSubflowEntry`.
|
|
86
|
+
// Skip them here so each stage has exactly one narrative entry.
|
|
87
|
+
if (event.stageType !== 'linear')
|
|
88
|
+
return;
|
|
84
89
|
const stageId = event.traversalContext?.stageId;
|
|
85
90
|
const runtimeStageId = event.traversalContext?.runtimeStageId;
|
|
86
91
|
const sfKey = event.traversalContext?.subflowId ?? '';
|
|
@@ -113,7 +118,12 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
|
|
|
113
118
|
onDecision(event) {
|
|
114
119
|
const stageId = event.traversalContext?.stageId;
|
|
115
120
|
const runtimeStageId = event.traversalContext?.runtimeStageId;
|
|
116
|
-
// Emit the decider stage entry
|
|
121
|
+
// Emit the decider stage entry.
|
|
122
|
+
// Proposal #003 also fires `onStageExecuted(stageType: 'decider')`
|
|
123
|
+
// AFTER this event, but CombinedNarrativeRecorder gates that
|
|
124
|
+
// handler to LINEAR-only so this stays the single emission site
|
|
125
|
+
// for the decider's stage entry + ops flush. Keeps narrative
|
|
126
|
+
// output byte-stable across the v6 transition.
|
|
117
127
|
const sfKey = event.traversalContext?.subflowId ?? '';
|
|
118
128
|
const stageNum = this.incrementStageCounter(sfKey);
|
|
119
129
|
const isFirst = this.consumeFirstStageFlag(sfKey);
|
|
@@ -669,4 +679,4 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
|
|
|
669
679
|
}
|
|
670
680
|
}
|
|
671
681
|
exports.CombinedNarrativeRecorder = CombinedNarrativeRecorder;
|
|
672
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gsNEVBQWlFO0FBRWpFLDRFQUFzRTtBQUN0RSwrRUFBeUU7QUFzRHpFLG1GQUFtRjtBQUVuRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0NBQXdDO0lBQzVFLEVBQUUsQ0FBUztJQUVwQjs7Ozs7T0FLRztJQUNLLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRCxzREFBc0Q7SUFDOUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ2xELHlEQUF5RDtJQUNqRCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDckQsNEVBQTRFO0lBQ3BFLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRTdDLGtCQUFrQixDQUFVO0lBQzVCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVM7SUFDdkIsV0FBVyxDQUE2QztJQUN4RCxRQUFRLENBQXFCO0lBRXJDLFlBQVksT0FBNEQ7UUFDdEUsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksb0JBQW9CLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxJQUFJLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxF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LENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sZUFBZSxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQztJQUM3RyxDQUFDO0lBRU8saUJBQWlCLENBQUMsR0FBc0I7UUFDOUMsT0FBTyxHQUFHLENBQUMsV0FBVztZQUNwQixDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxXQUFXLFNBQVM7WUFDdkQsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsWUFBWSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUM7SUFDeEQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQXVCO1FBQ2hELE9BQU8sd0JBQXdCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUNsRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsR0FBdUI7UUFDaEQsSUFBSSxJQUFJLEdBQUcsd0JBQXdCLEdBQUcsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDO1FBQ3BFLElBQUksR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLHVCQUF1QixHQUFHLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxZQUFZLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQXRxQkQsOERBc3FCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciDigJQgSW5saW5lIG5hcnJhdGl2ZSBidWlsZGVyIHRoYXQgbWVyZ2VzIGZsb3cgKyBkYXRhIGR1cmluZyB0cmF2ZXJzYWwuXG4gKlxuICogRXh0ZW5kcyBTZXF1ZW5jZVJlY29yZGVyPENvbWJpbmVkTmFycmF0aXZlRW50cnk+IGZvciBkdWFsLWluZGV4ZWQgc3RvcmFnZSAob3JkZXJlZCBzZXF1ZW5jZVxuICogKyBPKDEpIHBlci1zdGVwIGxvb2t1cCBieSBydW50aW1lU3RhZ2VJZCkuIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzXG4gKiBmaXJzdC1jbGFzcyBhYnN0cmFjdGlvbiBmb3Igb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93IHN0cmVhbXMuXG4gKlxuICogRXZlbnQgb3JkZXJpbmcgZ3VhcmFudGVlcyB0aGlzIHdvcmtzOlxuICogICAxLiBTY29wZSBldmVudHMgKG9uUmVhZCwgb25Xcml0ZSkgZmlyZSBEVVJJTkcgc3RhZ2UgZXhlY3V0aW9uXG4gKiAgIDIuIEZsb3cgZXZlbnRzIChvblN0YWdlRXhlY3V0ZWQsIG9uRGVjaXNpb24pIGZpcmUgQUZURVIgc3RhZ2UgZXhlY3V0aW9uXG4gKiAgIDMuIEJvdGggY2FycnkgdGhlIHNhbWUgYHN0YWdlTmFtZWAg4oCUIG5vIG1hdGNoaW5nIGFtYmlndWl0eVxuICpcbiAqIFNvIHdlIGJ1ZmZlciBzY29wZSBvcHMgcGVyLXN0YWdlLCB0aGVuIHdoZW4gdGhlIGZsb3cgZXZlbnQgYXJyaXZlcyxcbiAqIGVtaXQgdGhlIHN0YWdlIGVudHJ5ICsgZmx1c2ggdGhlIGJ1ZmZlcmVkIG9wcyBpbiBvbmUgcGFzcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRmxvd0V2ZW50IH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRFdmVudCB9IGZyb20gJy4uLy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTZXF1ZW5jZVJlY29yZGVyIH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvU2VxdWVuY2VSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBzdW1tYXJpemVWYWx1ZSB9IGZyb20gJy4uLy4uL3Njb3BlL3JlY29yZGVycy9zdW1tYXJpemVWYWx1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlYWRFdmVudCwgUmVzdW1lRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi8uLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJyZWFrUmVuZGVyQ29udGV4dCxcbiAgQ29tYmluZWROYXJyYXRpdmVFbnRyeSxcbiAgRGVjaXNpb25SZW5kZXJDb250ZXh0LFxuICBFbWl0UmVuZGVyQ29udGV4dCxcbiAgRXJyb3JSZW5kZXJDb250ZXh0LFxuICBGb3JrUmVuZGVyQ29udGV4dCxcbiAgTG9vcFJlbmRlckNvbnRleHQsXG4gIE5hcnJhdGl2ZVJlbmRlcmVyLFxuICBPcFJlbmRlckNvbnRleHQsXG4gIFNlbGVjdGVkUmVuZGVyQ29udGV4dCxcbiAgU3RhZ2VSZW5kZXJDb250ZXh0LFxuICBTdWJmbG93UmVuZGVyQ29udGV4dCxcbn0gZnJvbSAnLi9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dQYXVzZUV2ZW50LFxuICBGbG93UmVzdW1lRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEJ1ZmZlcmVkT3Age1xuICB0eXBlOiAncmVhZCcgfCAnd3JpdGUnIHwgJ2VtaXQnO1xuICAvKiogRm9yIHJlYWQvd3JpdGU6IHNjb3BlIGtleS4gRm9yIGVtaXQ6IHRoZSBldmVudCBuYW1lLiAqL1xuICBrZXk6IHN0cmluZztcbiAgcmF3VmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xuICAvKiogT25seSBzZXQgZm9yIHR5cGU9J2VtaXQnIOKAlCBjYXJyaWVzIHRoZSBmdWxsIEVtaXRFdmVudCBmb3IgcmVuZGVyaW5nLiAqL1xuICBlbWl0RXZlbnQ/OiBFbWl0RXZlbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMge1xuICBpbmNsdWRlU3RlcE51bWJlcnM/OiBib29sZWFuO1xuICBpbmNsdWRlVmFsdWVzPzogYm9vbGVhbjtcbiAgbWF4VmFsdWVMZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gdmFsdWUgZm9ybWF0dGVyLiBDYWxsZWQgYXQgcmVuZGVyIHRpbWUgKGZsdXNoT3BzKSwgbm90IGNhcHR1cmUgdGltZS5cbiAgICogIFJlY2VpdmVzIHRoZSByYXcgdmFsdWUgYW5kIG1heFZhbHVlTGVuZ3RoLiBEZWZhdWx0cyB0byBzdW1tYXJpemVWYWx1ZSgpLiAqL1xuICBmb3JtYXRWYWx1ZT86ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpID0+IHN0cmluZztcbiAgLyoqIFBsdWdnYWJsZSByZW5kZXJlciBmb3IgY3VzdG9taXppbmcgbmFycmF0aXZlIG91dHB1dC4gVW5pbXBsZW1lbnRlZCBtZXRob2RzXG4gICAqICBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgRW5nbGlzaCByZW5kZXJlci4gU2VlIE5hcnJhdGl2ZVJlbmRlcmVyIGRvY3MuICovXG4gIHJlbmRlcmVyPzogTmFycmF0aXZlUmVuZGVyZXI7XG59XG5cbi8vIOKUgOKUgCBTY29wZVJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzIGZpcnN0LWNsYXNzIGFic3RyYWN0aW9uIGZvclxuICogb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgKSBhbmQgY29udHJvbC1mbG93XG4gKiAoYEZsb3dSZWNvcmRlcmApIHN0cmVhbXMuIE9uZSBgaWRgLCByb3V0ZWQgdG8gYm90aCBjaGFubmVscyB2aWFcbiAqIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKC4uLilgIChvciBlcXVpdmFsZW50bHkgdmlhXG4gKiBgZXhlY3V0b3IuZW5hYmxlTmFycmF0aXZlKC4uLilgIHdoaWNoIGF1dG8tY3JlYXRlcyBhbiBpbnN0YW5jZSkuXG4gKlxuICogRm9yIHNoYXJlZC1tZXRob2QtbmFtZSBldmVudHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKSB0aGVcbiAqIGhhbmRsZXIgYWNjZXB0cyB0aGUgdW5pb24gcGF5bG9hZCB0eXBlOyB3ZSBkaXNjcmltaW5hdGUgdmlhIGBpc0Zsb3dFdmVudGAuXG4gKiBTY29wZSB2YXJpYW50cyBvZiB0aGVzZSBldmVudHMgYXJlIGRlbGliZXJhdGVseSBpZ25vcmVkIGhlcmUg4oCUIHRoZVxuICogbmFycmF0aXZlIG9ubHkgc3VyZmFjZXMgY29udHJvbC1mbG93IGxpZmVjeWNsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGV4dGVuZHMgU2VxdWVuY2VSZWNvcmRlcjxDb21iaW5lZE5hcnJhdGl2ZUVudHJ5PiBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZW5kaW5nIHNjb3BlIG9wcyBrZXllZCBieSBydW50aW1lU3RhZ2VJZC4gRmx1c2hlZCBpbiBvblN0YWdlRXhlY3V0ZWQvb25EZWNpc2lvbi5cbiAgICpcbiAgICogS2V5aW5nIGJ5IHJ1bnRpbWVTdGFnZUlkIChub3Qgc3RhZ2VOYW1lKSBlbnN1cmVzIGNvcnJlY3RuZXNzIHdoZW4gcGFyYWxsZWwgZm9ya1xuICAgKiBicmFuY2hlcyBjb250YWluIHN0YWdlcyB3aXRoIHRoZSBzYW1lIG5hbWUg4oCUIGVhY2ggZXhlY3V0aW9uIHN0ZXAgaGFzIGEgdW5pcXVlIElELlxuICAgKi9cbiAgcHJpdmF0ZSBwZW5kaW5nT3BzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlcmVkT3BbXT4oKTtcbiAgLyoqIFBlci1zdWJmbG93IHN0YWdlIGNvdW50ZXJzLiBLZXkgJycgPSByb290IGZsb3cuICovXG4gIHByaXZhdGUgc3RhZ2VDb3VudGVycyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBQZXItc3ViZmxvdyBmaXJzdC1zdGFnZSBmbGFncy4gS2V5ICcnID0gcm9vdCBmbG93LiAqL1xuICBwcml2YXRlIGZpcnN0U3RhZ2VGbGFncyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAvKiogVmlzaXQgY291bnQgcGVyIHN0YWdlSWQg4oCUIGRldGVjdHMgbG9vcCBpdGVyYXRpb25zIChjb3VudCA+IDEgPSBsb29wKS4gKi9cbiAgcHJpdmF0ZSBzdGFnZVZpc2l0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBwcml2YXRlIGluY2x1ZGVTdGVwTnVtYmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSBpbmNsdWRlVmFsdWVzOiBib29sZWFuO1xuICBwcml2YXRlIG1heFZhbHVlTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgZm9ybWF0VmFsdWU6ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpID0+IHN0cmluZztcbiAgcHJpdmF0ZSByZW5kZXJlcj86IE5hcnJhdGl2ZVJlbmRlcmVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyAmIHsgaWQ/OiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkID8/ICdjb21iaW5lZC1uYXJyYXRpdmUnO1xuICAgIHRoaXMuaW5jbHVkZVN0ZXBOdW1iZXJzID0gb3B0aW9ucz8uaW5jbHVkZVN0ZXBOdW1iZXJzID8/IHRydWU7XG4gICAgdGhpcy5pbmNsdWRlVmFsdWVzID0gb3B0aW9ucz8uaW5jbHVkZVZhbHVlcyA/PyB0cnVlO1xuICAgIHRoaXMubWF4VmFsdWVMZW5ndGggPSBvcHRpb25zPy5tYXhWYWx1ZUxlbmd0aCA/PyA4MDtcbiAgICB0aGlzLmZvcm1hdFZhbHVlID0gb3B0aW9ucz8uZm9ybWF0VmFsdWUgPz8gc3VtbWFyaXplVmFsdWU7XG4gICAgdGhpcy5yZW5kZXJlciA9IG9wdGlvbnM/LnJlbmRlcmVyO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIGNoYW5uZWwgKGZpcmVzIGZpcnN0LCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQua2V5KSByZXR1cm47XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICByYXdWYWx1ZTogZXZlbnQudmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ3dyaXRlJyxcbiAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgcmF3VmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgb3BlcmF0aW9uOiBldmVudC5vcGVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRmxvdyBjaGFubmVsIChmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZDtcbiAgICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHNmS2V5ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkID8/ICcnO1xuICAgIGNvbnN0IHN0YWdlTnVtID0gdGhpcy5pbmNyZW1lbnRTdGFnZUNvdW50ZXIoc2ZLZXkpO1xuICAgIGNvbnN0IGlzRmlyc3QgPSB0aGlzLmNvbnN1bWVGaXJzdFN0YWdlRmxhZyhzZktleSk7XG5cbiAgICAvLyBUcmFjayB2aXNpdCBjb3VudCBwZXIgc3RhZ2VJZCB0byBkZXRlY3QgbG9vcCBpdGVyYXRpb25zXG4gICAgY29uc3QgdmlzaXRLZXkgPSBzdGFnZUlkID8/IGV2ZW50LnN0YWdlTmFtZTtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuc3RhZ2VWaXNpdENvdW50cy5nZXQodmlzaXRLZXkpID8/IDApICsgMTtcbiAgICB0aGlzLnN0YWdlVmlzaXRDb3VudHMuc2V0KHZpc2l0S2V5LCB2aXNpdENvdW50KTtcblxuICAgIGNvbnN0IGN0eDogU3RhZ2VSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZU51bWJlcjogc3RhZ2VOdW0sXG4gICAgICBpc0ZpcnN0LFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgICAgbG9vcEl0ZXJhdGlvbjogdmlzaXRDb3VudCA+IDEgPyB2aXNpdENvdW50IC0gMSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdGFnZT8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3RhZ2UoY3R4KTtcblxuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICB9KTtcbiAgICB0aGlzLmZsdXNoT3BzKHJ1bnRpbWVTdGFnZUlkLCBzZklkLCBzdGFnZUlkLCBldmVudC5zdGFnZU5hbWUpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZDtcbiAgICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuXG4gICAgLy8gRW1pdCB0aGUgZGVjaWRlciBzdGFnZSBlbnRyeSAoZGVjaWRlcnMgZG9uJ3QgZmlyZSBvblN0YWdlRXhlY3V0ZWQpXG4gICAgY29uc3Qgc2ZLZXkgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQgPz8gJyc7XG4gICAgY29uc3Qgc3RhZ2VOdW0gPSB0aGlzLmluY3JlbWVudFN0YWdlQ291bnRlcihzZktleSk7XG4gICAgY29uc3QgaXNGaXJzdCA9IHRoaXMuY29uc3VtZUZpcnN0U3RhZ2VGbGFnKHNmS2V5KTtcblxuICAgIGNvbnN0IHN0YWdlQ3R4OiBTdGFnZVJlbmRlckNvbnRleHQgPSB7XG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBzdGFnZU51bWJlcjogc3RhZ2VOdW0sXG4gICAgICBpc0ZpcnN0LFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VUZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3RhZ2U/LihzdGFnZUN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3RhZ2Uoc3RhZ2VDdHgpO1xuXG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB0ZXh0OiBzdGFnZVRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuZGVjaWRlcixcbiAgICAgIHN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICAgIHRoaXMuZmx1c2hPcHMocnVudGltZVN0YWdlSWQsIGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCwgc3RhZ2VJZCwgZXZlbnQuZGVjaWRlcik7XG5cbiAgICAvLyBFbWl0IHRoZSBjb25kaXRpb24gZW50cnkgYXMgYSBuZXN0ZWQgc3ViLWl0ZW0gKGRlcHRoIDEpIG9mIHRoZSBzdGFnZSBhYm92ZS5cbiAgICBjb25zdCBkZWNpc2lvbkN0eDogRGVjaXNpb25SZW5kZXJDb250ZXh0ID0ge1xuICAgICAgZGVjaWRlcjogZXZlbnQuZGVjaWRlcixcbiAgICAgIGNob3NlbjogZXZlbnQuY2hvc2VuLFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgICAgcmF0aW9uYWxlOiBldmVudC5yYXRpb25hbGUsXG4gICAgICBldmlkZW5jZTogZXZlbnQuZXZpZGVuY2UsXG4gICAgfTtcbiAgICBjb25zdCBjb25kaXRpb25UZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyRGVjaXNpb24/LihkZWNpc2lvbkN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyRGVjaXNpb24oZGVjaXNpb25DdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnY29uZGl0aW9uJyxcbiAgICAgIHRleHQ6IGNvbmRpdGlvblRleHQsXG4gICAgICBkZXB0aDogMSxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuZGVjaWRlcixcbiAgICAgIHN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25OZXh0KCk6IHZvaWQge1xuICAgIC8vIE5vLW9wLiBvblN0YWdlRXhlY3V0ZWQgYWxyZWFkeSBoYXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV4dCBzdGFnZS5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eDogRm9ya1JlbmRlckNvbnRleHQgPSB7IGNoaWxkcmVuOiBldmVudC5jaGlsZHJlbiB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJGb3JrPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJGb3JrKGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdmb3JrJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBTZWxlY3RlZFJlbmRlckNvbnRleHQgPSB7XG4gICAgICBzZWxlY3RlZDogZXZlbnQuc2VsZWN0ZWQsXG4gICAgICB0b3RhbDogZXZlbnQudG90YWwsXG4gICAgICBldmlkZW5jZTogZXZlbnQuZXZpZGVuY2UsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU2VsZWN0ZWQ/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclNlbGVjdGVkKGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdzZWxlY3RvcicsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNmS2V5ID0gZXZlbnQuc3ViZmxvd0lkID8/ICcnO1xuICAgIHRoaXMuc3RhZ2VDb3VudGVycy5kZWxldGUoc2ZLZXkpO1xuICAgIHRoaXMuZmlyc3RTdGFnZUZsYWdzLmRlbGV0ZShzZktleSk7XG5cbiAgICBjb25zdCBjdHg6IFN1YmZsb3dSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgbmFtZTogZXZlbnQubmFtZSxcbiAgICAgIGRpcmVjdGlvbjogJ2VudHJ5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICAgIG1hcHBlZElucHV0OiBldmVudC5tYXBwZWRJbnB1dCxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdWJmbG93Py4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdWJmbG93KGN0eCk7XG4gICAgY29uc3QgcmlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgY29uc3Qgc2lkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZDtcbiAgICBjb25zdCBzZklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc3ViZmxvdycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBzdGFnZUlkOiBzaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmlkLFxuICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgZGlyZWN0aW9uOiAnZW50cnknLFxuICAgIH0pO1xuICAgIC8vIEVtaXQgcGVyLWtleSBzdGVwIGVudHJpZXMgZm9yIG1hcHBlZCBpbnB1dHMuXG4gICAgLy9cbiAgICAvLyBSb3V0ZSBFQUNIIGtleSB0aHJvdWdoIHRoZSBjb25zdW1lcidzIGByZW5kZXJlci5yZW5kZXJPcGAgaG9vayBiZWZvcmVcbiAgICAvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGhhcmRjb2RlZCBgSW5wdXQ6ICR7a2V5fSA9ICR7dmFsdWVTdW1tYXJ5fWBcbiAgICAvLyB0ZW1wbGF0ZS4gV2l0aG91dCB0aGlzIHJvdXRpbmcsIGEgY29uc3VtZXIgdGhhdCBwcm92aWRlZCBhXG4gICAgLy8gZG9tYWluLWF3YXJlIGByZW5kZXJlci5yZW5kZXJPcGAgKHRvIHJlbmRlciBlLmcuIGBwYXJzZWRSZXNwb25zZWBcbiAgICAvLyBvYmplY3RzIHNlbWFudGljYWxseSkgd291bGQgc2VlIGJlYXV0aWZ1bCBvdXRwdXQgZm9yIHNjb3BlIHdyaXRlc1xuICAgIC8vIGJ1dCBnZXQgdGhlIGdlbmVyaWMga2V5LWxpc3QgZmFsbGJhY2sgZm9yIHN1YmZsb3cgaW5wdXRzIOKAlCB0aGVcbiAgICAvLyBsaWJyYXJ5J3MgXCJjb21iaW5lZCBuYXJyYXRpdmVcIiBwcm9taXNlIChvbmUgcmVuZGVyZXIgY29udHJvbHMgdGhlXG4gICAgLy8gd2hvbGUgbmFycmF0aXZlKSB3b3VsZCBzaWxlbnRseSBicmVhay4gV2UgaG9ub3VyIGl0IGhlcmUuXG4gICAgLy9cbiAgICAvLyBUaGUgT3BSZW5kZXJDb250ZXh0IGlzIGJ1aWx0IHdpdGggYHR5cGU6ICd3cml0ZSdgIGJlY2F1c2Ugc2VtYW50aWNhbGx5XG4gICAgLy8gdGhlIHN1YmZsb3cncyBpbml0aWFsIHNjb3BlIElTIGJlaW5nIHdyaXR0ZW4gdmlhIHRoZSBwYXJlbnQnc1xuICAgIC8vIGlucHV0TWFwcGVyLiBgb3BlcmF0aW9uOiAnc2V0J2AgbGlrZXdpc2Ug4oCUIHRoaXMgaXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGZpcnN0IHNpZ2h0IG9mIHRoZSBrZXkuXG4gICAgLy9cbiAgICAvLyBWYWx1ZXMgc2hvd24gd2hlbiBpbmNsdWRlVmFsdWVzPXRydWUg4oCUIGNvbnN1bWVyIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIHJlZGFjdGlvbiBwb2xpY3kgb24gdGhlIHBhcmVudCBzY29wZSAocmVkYWN0ZWQga2V5cyBwcm9kdWNlXG4gICAgLy8gJ1tSRURBQ1RFRF0nIHZpYSBTY29wZUZhY2FkZSkuXG4gICAgaWYgKGV2ZW50Lm1hcHBlZElucHV0ICYmIE9iamVjdC5rZXlzKGV2ZW50Lm1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgc3RlcE51bWJlciA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhldmVudC5tYXBwZWRJbnB1dCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG9wQ3R4OiBPcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgdHlwZTogJ3dyaXRlJyxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcmF3VmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHZhbHVlU3VtbWFyeSxcbiAgICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6ICsrc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiB0aGUgY29uc3VtZXIgc3VwcGxpZWQgYHJlbmRlcmVyLnJlbmRlck9wYCwgdXNlIGl0cyByZXR1cm4gdmFsdWU6XG4gICAgICAgIC8vICAgLSBzdHJpbmcg4oaSIHVzZSBhcyB0aGUgbmFycmF0aXZlIGxpbmVcbiAgICAgICAgLy8gICAtIG51bGwgICDihpIgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGUgdGhpcyBlbnRyeSAoc2FtZSBzZW1hbnRpY3MgYXNcbiAgICAgICAgLy8gICAgICAgICAgICAgIGBmbHVzaE9wc2AgYWJvdmUgYXQgbGluZSB+NTQwKVxuICAgICAgICAvLyAgIC0gdW5kZWZpbmVkIOKGkiByZW5kZXJlciBkb2VzIG5vdCBoYW5kbGUgdGhpcyBvcCDihpIgZmFsbCB0aHJvdWdoXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB0byB0aGUgaGFyZGNvZGVkIHRlbXBsYXRlXG4gICAgICAgIC8vIElmIG5vIHJlbmRlcmVyIGF0IGFsbCwgdXNlIHRoZSBoYXJkY29kZWQgdGVtcGxhdGUuXG4gICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJlcj8ucmVuZGVyT3ApIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21UZXh0ID0gdGhpcy5yZW5kZXJlci5yZW5kZXJPcChvcEN0eCk7XG4gICAgICAgICAgaWYgKGN1c3RvbVRleHQgPT09IG51bGwpIGNvbnRpbnVlOyAvLyBleGNsdWRlZCBvbiBwdXJwb3NlXG4gICAgICAgICAgdGV4dCA9XG4gICAgICAgICAgICBjdXN0b21UZXh0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBjdXN0b21UZXh0XG4gICAgICAgICAgICAgIDogdGhpcy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgICAgID8gYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gXG4gICAgICAgICAgICAgIDogYElucHV0OiAke2tleX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHQgPSB0aGlzLmluY2x1ZGVWYWx1ZXMgPyBgSW5wdXQ6ICR7a2V5fSA9ICR7dmFsdWVTdW1tYXJ5fWAgOiBgSW5wdXQ6ICR7a2V5fWA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICdzdGVwJyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgIHN0YWdlTmFtZTogZXZlbnQubmFtZSxcbiAgICAgICAgICBzdGFnZUlkOiBzaWQsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IHJpZCxcbiAgICAgICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHJhd1ZhbHVlOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJpZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHNpZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3Qgc2ZJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZDtcbiAgICAvLyBOT1RFOiBvdXRwdXQgc3RhdGUgaXMgTk9UIGVtaXR0ZWQgYXMgc3RlcCBlbnRyaWVzIGJlY2F1c2UgaXQgbWF5IGNvbnRhaW5cbiAgICAvLyB1bnJlZGFjdGVkIHZhbHVlcyBmcm9tIHRoZSBzdWJmbG93J3MgaW50ZXJuYWwgc2NvcGUuIFRoZSBzdWJmbG93IGV4aXRcbiAgICAvLyBoZWFkZXIgaXMgc3VmZmljaWVudCDigJQgZHJpbGwgaW50byB0aGUgc3ViZmxvdyBmb3IgZGV0YWlscy5cbiAgICBjb25zdCBjdHg6IFN1YmZsb3dSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgbmFtZTogZXZlbnQubmFtZSxcbiAgICAgIGRpcmVjdGlvbjogJ2V4aXQnLFxuICAgICAgb3V0cHV0U3RhdGU6IGV2ZW50Lm91dHB1dFN0YXRlLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN1YmZsb3c/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3N1YmZsb3cnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5uYW1lLFxuICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHJpZCxcbiAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICAgIGRpcmVjdGlvbjogJ2V4aXQnLFxuICAgIH0pO1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBMb29wUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgaXRlcmF0aW9uOiBldmVudC5pdGVyYXRpb24sXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyTG9vcD8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyTG9vcChjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnbG9vcCcsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbkJyZWFrKGV2ZW50OiBGbG93QnJlYWtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eDogQnJlYWtSZW5kZXJDb250ZXh0ID0geyBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJCcmVhaz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyQnJlYWsoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2JyZWFrJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25QYXVzZShldmVudDogUGF1c2VFdmVudCB8IEZsb3dQYXVzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQm90aCBjaGFubmVscyBmaXJlIG9uUGF1c2Ugd2l0aCBkaWZmZXJlbnQgcGF5bG9hZCBzaGFwZXMuIE5hcnJhdGl2ZSBvbmx5XG4gICAgLy8gc3VyZmFjZXMgdGhlIGNvbnRyb2wtZmxvdyB2YXJpYW50ICh3aGljaCBoYXMgc3RhZ2VOYW1lL3N0YWdlSWQpLiBEYXRhXG4gICAgLy8gY2hhbm5lbCdzIFBhdXNlRXZlbnQgaXMgaWdub3JlZCB0byBhdm9pZCBkdXBsaWNhdGUgZW50cmllcy5cbiAgICBpZiAoIWlzRmxvd0V2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgIGlmICghZXZlbnQuc3RhZ2VOYW1lIHx8ICFldmVudC5zdGFnZUlkKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGBFeGVjdXRpb24gcGF1c2VkIGF0ICR7ZXZlbnQuc3RhZ2VOYW1lfS5gO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAncGF1c2UnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkID8/IGV2ZW50LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUmVzdW1lKGV2ZW50OiBSZXN1bWVFdmVudCB8IEZsb3dSZXN1bWVFdmVudCk6IHZvaWQge1xuICAgIC8vIFNhbWUgaXNGbG93RXZlbnQgZGlzY3JpbWluYW50IGFzIG9uUGF1c2Ug4oCUIGlnbm9yZSBzY29wZSBSZXN1bWVFdmVudC5cbiAgICBpZiAoIWlzRmxvd0V2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgIGlmICghZXZlbnQuc3RhZ2VOYW1lIHx8ICFldmVudC5zdGFnZUlkKSByZXR1cm47XG4gICAgY29uc3Qgc3VmZml4ID0gZXZlbnQuaGFzSW5wdXQgPyAnIHdpdGggaW5wdXQuJyA6ICcuJztcbiAgICBjb25zdCB0ZXh0ID0gYEV4ZWN1dGlvbiByZXN1bWVkIGF0ICR7ZXZlbnQuc3RhZ2VOYW1lfSR7c3VmZml4fWA7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdyZXN1bWUnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkID8/IGV2ZW50LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXJyb3IoZXZlbnQ6IEVycm9yRXZlbnQgfCBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIC8vIE5hcnJhdGl2ZSBvbmx5IHN1cmZhY2VzIHRoZSBjb250cm9sLWZsb3cgdmFyaWFudCBvZiBlcnJvcnMgKGhhc1xuICAgIC8vIHN0YWdlTmFtZSArIG1lc3NhZ2UpLiBTY29wZS1sZXZlbCBFcnJvckV2ZW50IGlzIGNhcHR1cmVkIGVsc2V3aGVyZS5cbiAgICBpZiAoIWlzRmxvd0V2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgZXZlbnQubWVzc2FnZSAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIGxldCB2YWxpZGF0aW9uSXNzdWVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV2ZW50LnN0cnVjdHVyZWRFcnJvcj8uaXNzdWVzPy5sZW5ndGgpIHtcbiAgICAgIHZhbGlkYXRpb25Jc3N1ZXMgPSBldmVudC5zdHJ1Y3R1cmVkRXJyb3IuaXNzdWVzXG4gICAgICAgIC5tYXAoKGlzc3VlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGlzc3VlLnBhdGguam9pbignLicpIDogJyhyb290KSc7XG4gICAgICAgICAgcmV0dXJuIGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3R4OiBFcnJvclJlbmRlckNvbnRleHQgPSB7XG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICB2YWxpZGF0aW9uSXNzdWVzLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckVycm9yPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJFcnJvcihjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRW1pdCBjaGFubmVsIChQaGFzZSAzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVjZWl2ZSBhIGNvbnN1bWVyLWVtaXR0ZWQgZXZlbnQgZnJvbSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBCdWZmZXJlZCBhbG9uZ3NpZGUgYG9uUmVhZGAvYG9uV3JpdGVgIHBlci1zdGFnZSBzbyB0aGF0IHRoZSBmaW5hbFxuICAgKiBuYXJyYXRpdmUgcHJlc2VydmVzIG9yZGVyaW5nOlxuICAgKlxuICAgKiAgIDEuIHN0YWdlIGhlYWRlciAoZW1pdHRlZCBieSBgb25TdGFnZUV4ZWN1dGVkYCAvIGBvbkRlY2lzaW9uYClcbiAgICogICAyLiBidWZmZXJlZCBvcHMgZm9yIHRoYXQgc3RhZ2Ug4oCUIGluIGNhbGwgb3JkZXIg4oCUIGZsdXNoZWQgcmlnaHQgYWZ0ZXJcbiAgICpcbiAgICogV2l0aG91dCBidWZmZXJpbmcsIGVtaXQgZXZlbnRzIHdvdWxkIGZpcmUgQkVGT1JFIHRoZSBzdGFnZSBoZWFkZXJcbiAgICogKHdoaWNoIG9ubHkgbGFuZHMgYXQgYG9uU3RhZ2VFeGVjdXRlZGApLCBwcm9kdWNpbmcgb3V0LW9mLW9yZGVyXG4gICAqIG5hcnJhdGl2ZSBlbnRyaWVzLiBGbHVzaCBoYXBwZW5zIGluIGBmbHVzaE9wc2Agd2hpY2ggcm91dGVzIGBlbWl0YC1cbiAgICogdHlwZWQgYnVmZmVyZWQgb3BzIHRocm91Z2ggYHJlbmRlckVtaXRgIGluc3RlYWQgb2YgYHJlbmRlck9wYC5cbiAgICovXG4gIG9uRW1pdChldmVudDogRW1pdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAga2V5OiBldmVudC5uYW1lLFxuICAgICAgcmF3VmFsdWU6IGV2ZW50LnBheWxvYWQsXG4gICAgICBlbWl0RXZlbnQ6IGV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRW1pdChjdHg6IEVtaXRSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFtlbWl0XSAke2N0eC5uYW1lfTogJHtjdHgucGF5bG9hZFN1bW1hcnl9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBPdXRwdXQgKG5hcnJhdGl2ZS1zcGVjaWZpYykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgZW50cmllcyBncm91cGVkIGJ5IHN1YmZsb3dJZCBmb3Igc3RydWN0dXJlZCBhY2Nlc3MuXG4gICAqIFJvb3QtbGV2ZWwgZW50cmllcyBoYXZlIHN1YmZsb3dJZCA9IHVuZGVmaW5lZC5cbiAgICovXG4gIGdldEVudHJpZXNCeVN1YmZsb3coKTogUmVjb3JkPHN0cmluZywgQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10+ID0geyAnJzogW10gfTtcbiAgICB0aGlzLmZvckVhY2hFbnRyeSgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGVudHJ5LnN1YmZsb3dJZCA/PyAnJztcbiAgICAgIGlmICghcmVzdWx0W2tleV0pIHJlc3VsdFtrZXldID0gW107XG4gICAgICByZXN1bHRba2V5XS5wdXNoKGVudHJ5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIENsZWFycyBhbGwgc3RhdGUuIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBlYWNoIHJ1bi4gKi9cbiAgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xlYXIoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMuY2xlYXIoKTtcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmZpcnN0U3RhZ2VGbGFncy5jbGVhcigpO1xuICAgIHRoaXMuc3RhZ2VWaXNpdENvdW50cy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByaXZhdGUgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGluY3JlbWVudFN0YWdlQ291bnRlcihzdWJmbG93S2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0YWdlQ291bnRlcnMuZ2V0KHN1YmZsb3dLZXkpID8/IDA7XG4gICAgY29uc3QgbmV4dCA9IGN1cnJlbnQgKyAxO1xuICAgIHRoaXMuc3RhZ2VDb3VudGVycy5zZXQoc3ViZmxvd0tleSwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVGaXJzdFN0YWdlRmxhZyhzdWJmbG93S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZmlyc3RTdGFnZUZsYWdzLmhhcyhzdWJmbG93S2V5KSkge1xuICAgICAgdGhpcy5maXJzdFN0YWdlRmxhZ3Muc2V0KHN1YmZsb3dLZXksIGZhbHNlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGJ1ZmZlck9wKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIG9wOiBPbWl0PEJ1ZmZlcmVkT3AsICdzdGVwTnVtYmVyJz4pOiB2b2lkIHtcbiAgICBsZXQgb3BzID0gdGhpcy5wZW5kaW5nT3BzLmdldChydW50aW1lU3RhZ2VJZCk7XG4gICAgaWYgKCFvcHMpIHtcbiAgICAgIG9wcyA9IFtdO1xuICAgICAgdGhpcy5wZW5kaW5nT3BzLnNldChydW50aW1lU3RhZ2VJZCwgb3BzKTtcbiAgICB9XG4gICAgb3BzLnB1c2goeyAuLi5vcCwgc3RlcE51bWJlcjogb3BzLmxlbmd0aCArIDEgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoT3BzKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN1YmZsb3dJZD86IHN0cmluZywgc3RhZ2VJZD86IHN0cmluZywgc3RhZ2VOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHJ1bnRpbWVTdGFnZUlkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBvcHMgPSB0aGlzLnBlbmRpbmdPcHMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIW9wcyB8fCBvcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgLy8g4pSA4pSAIEVtaXQgZXZlbnRzIHRha2UgYSBkaWZmZXJlbnQgcmVuZGVyIHBhdGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICAvL1xuICAgICAgLy8gRW1pdCBldmVudHMgYXJlIGJ1ZmZlcmVkIGFsb25nc2lkZSByZWFkcy93cml0ZXMgKHNvIHRoZXkgYXBwZWFyXG4gICAgICAvLyB1bmRlciB0aGVpciBvd25pbmcgc3RhZ2UncyBoZWFkZXIgaW4gbmFycmF0aXZlIG9yZGVyLCBub3QgaW5saW5lXG4gICAgICAvLyBhdCBjYWxsIHRpbWUpLiBBdCBmbHVzaCwgdGhleSByb3V0ZSB0aHJvdWdoIGByZW5kZXJFbWl0YCBpbnN0ZWFkXG4gICAgICAvLyBvZiBgcmVuZGVyT3BgIOKAlCBjb25zdW1lcnMgd2FudGluZyBjdXN0b20gZW1pdCByZW5kZXJpbmcgaW1wbGVtZW50XG4gICAgICAvLyB0aGUgZGVkaWNhdGVkIGhvb2suIFVuaGFuZGxlZCAvIG1pc3NpbmcgcmVuZGVyZXIgZmFsbHMgYmFjayB0b1xuICAgICAgLy8gdGhlIHNhbWUgY29tcGFjdCBgW2VtaXRdIG5hbWU6IHBheWxvYWRTdW1tYXJ5YCBkZWZhdWx0IHVzZWQgYnlcbiAgICAgIC8vIHRoZSBwcmUtYnVmZmVyaW5nIG9uRW1pdCBwYXRoLlxuICAgICAgaWYgKG9wLnR5cGUgPT09ICdlbWl0JyAmJiBvcC5lbWl0RXZlbnQpIHtcbiAgICAgICAgY29uc3QgZSA9IG9wLmVtaXRFdmVudDtcbiAgICAgICAgY29uc3QgcGF5bG9hZFN1bW1hcnkgPSB0aGlzLmZvcm1hdFZhbHVlKGUucGF5bG9hZCwgdGhpcy5tYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGVtaXRDdHg6IEVtaXRSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICAgIG5hbWU6IGUubmFtZSxcbiAgICAgICAgICBwYXlsb2FkOiBlLnBheWxvYWQsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBlLnN0YWdlTmFtZSxcbiAgICAgICAgICBydW50aW1lU3RhZ2VJZDogZS5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgICBzdWJmbG93UGF0aDogZS5zdWJmbG93UGF0aCxcbiAgICAgICAgICBwaXBlbGluZUlkOiBlLnBpcGVsaW5lSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBlLnRpbWVzdGFtcCxcbiAgICAgICAgICBwYXlsb2FkU3VtbWFyeSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGVtaXRUZXh0OiBzdHJpbmc7XG4gICAgICAgIGlmICh0aGlzLnJlbmRlcmVyPy5yZW5kZXJFbWl0KSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tID0gdGhpcy5yZW5kZXJlci5yZW5kZXJFbWl0KGVtaXRDdHgpO1xuICAgICAgICAgIGlmIChjdXN0b20gPT09IG51bGwpIGNvbnRpbnVlOyAvLyBkZWxpYmVyYXRlbHkgZXhjbHVkZWRcbiAgICAgICAgICBlbWl0VGV4dCA9IGN1c3RvbSAhPT0gdW5kZWZpbmVkID8gY3VzdG9tIDogdGhpcy5kZWZhdWx0UmVuZGVyRW1pdChlbWl0Q3R4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbWl0VGV4dCA9IHRoaXMuZGVmYXVsdFJlbmRlckVtaXQoZW1pdEN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnZW1pdCcsXG4gICAgICAgICAgdGV4dDogZW1pdFRleHQsXG4gICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICAgIHN0YWdlSWQsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCBvcC50eXBlIGlzIG5hcnJvd2VkIHRvICdyZWFkJyB8ICd3cml0ZScgKGVtaXQgYnJhbmNoXG4gICAgICAvLyBhYm92ZSB1c2VzIGBjb250aW51ZWApLiBUeXBlU2NyaXB0IGNhbid0IGZvbGxvdyB0aGF0IG5hcnJvd2luZ1xuICAgICAgLy8gdGhyb3VnaCB0aGUgY29udGludWUsIHNvIHdlIGFzc2VydCBhdCByZW5kZXIgdGltZS5cbiAgICAgIGNvbnN0IG9wVHlwZSA9IG9wLnR5cGUgYXMgJ3JlYWQnIHwgJ3dyaXRlJztcbiAgICAgIGNvbnN0IHZhbHVlU3VtbWFyeSA9IHRoaXMuZm9ybWF0VmFsdWUob3AucmF3VmFsdWUsIHRoaXMubWF4VmFsdWVMZW5ndGgpO1xuICAgICAgY29uc3Qgb3BDdHg6IE9wUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgICAgdHlwZTogb3BUeXBlLFxuICAgICAgICBrZXk6IG9wLmtleSxcbiAgICAgICAgcmF3VmFsdWU6IG9wLnJhd1ZhbHVlLFxuICAgICAgICB2YWx1ZVN1bW1hcnksXG4gICAgICAgIG9wZXJhdGlvbjogb3Aub3BlcmF0aW9uLFxuICAgICAgICBzdGVwTnVtYmVyOiBvcC5zdGVwTnVtYmVyLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlck9wID8gdGhpcy5yZW5kZXJlci5yZW5kZXJPcChvcEN0eCkgOiB0aGlzLmRlZmF1bHRSZW5kZXJPcChvcEN0eCk7XG5cbiAgICAgIGlmICh0ZXh0ID09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICB0aGlzLmVtaXQoe1xuICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgIHRleHQsXG4gICAgICAgIGRlcHRoOiAxLFxuICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzdGVwTnVtYmVyOiBvcC5zdGVwTnVtYmVyLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIGtleTogb3Aua2V5LFxuICAgICAgICByYXdWYWx1ZTogb3AucmF3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdPcHMuZGVsZXRlKHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWZhdWx0IHJlbmRlcmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJTdGFnZShjdHg6IFN0YWdlUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgbGV0IGlubmVyOiBzdHJpbmc7XG4gICAgaWYgKGN0eC5pc0ZpcnN0KSB7XG4gICAgICBpbm5lciA9IGN0eC5kZXNjcmlwdGlvbiA/IGBUaGUgcHJvY2VzcyBiZWdhbjogJHtjdHguZGVzY3JpcHRpb259LmAgOiBgVGhlIHByb2Nlc3MgYmVnYW4gd2l0aCAke2N0eC5zdGFnZU5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChjdHgubG9vcEl0ZXJhdGlvbiAmJiBjdHgubG9vcEl0ZXJhdGlvbiA+IDApIHtcbiAgICAgIGlubmVyID0gY3R4LmRlc2NyaXB0aW9uXG4gICAgICAgID8gYExvb3BlZCBiYWNrOiAke2N0eC5kZXNjcmlwdGlvbn0gKHBhc3MgJHtjdHgubG9vcEl0ZXJhdGlvbn0pLmBcbiAgICAgICAgOiBgTG9vcGVkIGJhY2sgdG8gJHtjdHguc3RhZ2VOYW1lfSAocGFzcyAke2N0eC5sb29wSXRlcmF0aW9ufSkuYDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5uZXIgPSBjdHguZGVzY3JpcHRpb24gPyBgTmV4dCBzdGVwOiAke2N0eC5kZXNjcmlwdGlvbn0uYCA6IGBOZXh0LCBpdCBtb3ZlZCBvbiB0byAke2N0eC5zdGFnZU5hbWV9LmA7XG4gICAgfVxuICAgIHJldHVybiBgU3RhZ2UgJHtjdHguc3RhZ2VOdW1iZXJ9OiAke2lubmVyfWA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJPcChjdHg6IE9wUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RlcFByZWZpeCA9IHRoaXMuaW5jbHVkZVN0ZXBOdW1iZXJzID8gYFN0ZXAgJHtjdHguc3RlcE51bWJlcn06IGAgOiAnJztcbiAgICBpZiAoY3R4LnR5cGUgPT09ICdyZWFkJykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVZhbHVlcyAmJiBjdHgudmFsdWVTdW1tYXJ5XG4gICAgICAgID8gYCR7c3RlcFByZWZpeH1SZWFkICR7Y3R4LmtleX0gPSAke2N0eC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICA6IGAke3N0ZXBQcmVmaXh9UmVhZCAke2N0eC5rZXl9YDtcbiAgICB9XG4gICAgaWYgKGN0eC5vcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICByZXR1cm4gYCR7c3RlcFByZWZpeH1EZWxldGUgJHtjdHgua2V5fWA7XG4gICAgfVxuICAgIGlmIChjdHgub3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVZhbHVlc1xuICAgICAgICA/IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7Y3R4LmtleX0gPSAke2N0eC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICA6IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7Y3R4LmtleX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbmNsdWRlVmFsdWVzID8gYCR7c3RlcFByZWZpeH1Xcml0ZSAke2N0eC5rZXl9ID0gJHtjdHgudmFsdWVTdW1tYXJ5fWAgOiBgJHtzdGVwUHJlZml4fVdyaXRlICR7Y3R4LmtleX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRGVjaXNpb24oY3R4OiBEZWNpc2lvblJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJyYW5jaE5hbWUgPSBjdHguY2hvc2VuO1xuICAgIGxldCBjb25kaXRpb25UZXh0OiBzdHJpbmc7XG4gICAgaWYgKGN0eC5ldmlkZW5jZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGV2aWRlbmNlID0gY3R4LmV2aWRlbmNlIGFzIGFueTtcbiAgICAgIGNvbnN0IG1hdGNoZWRSdWxlID0gZXZpZGVuY2UucnVsZXM/LmZpbmQoKHI6IGFueSkgPT4gci5tYXRjaGVkKTtcbiAgICAgIGlmIChtYXRjaGVkUnVsZSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IG1hdGNoZWRSdWxlLmxhYmVsID8gYCBcIiR7bWF0Y2hlZFJ1bGUubGFiZWx9XCJgIDogJyc7XG4gICAgICAgIGlmIChtYXRjaGVkUnVsZS50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZFJ1bGUuY29uZGl0aW9ucy5tYXAoXG4gICAgICAgICAgICAoYzogYW55KSA9PlxuICAgICAgICAgICAgICBgJHtjLmtleX0gJHtjLmFjdHVhbFN1bW1hcnl9ICR7Yy5vcH0gJHtKU09OLnN0cmluZ2lmeShjLnRocmVzaG9sZCl9ICR7Yy5yZXN1bHQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgZXZhbHVhdGVkIFJ1bGUgJHttYXRjaGVkUnVsZS5ydWxlSW5kZXh9JHtsYWJlbH06ICR7cGFydHMuam9pbihcbiAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgKX0sIGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaGVkUnVsZS5pbnB1dHMubWFwKChpOiBhbnkpID0+IGAke2kua2V5fT0ke2kudmFsdWVTdW1tYXJ5fWApO1xuICAgICAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgZXhhbWluZWQke2xhYmVsfTogJHtwYXJ0cy5qb2luKCcsICcpfSwgYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JlZENvdW50ID0gZXZpZGVuY2UucnVsZXM/LmZpbHRlcigocjogYW55KSA9PiByLm1hdGNoRXJyb3IgIT09IHVuZGVmaW5lZCkubGVuZ3RoID8/IDA7XG4gICAgICAgIGNvbnN0IGVycm9yTm90ZSA9IGVycm9yZWRDb3VudCA+IDAgPyBgICgke2Vycm9yZWRDb3VudH0gcnVsZSR7ZXJyb3JlZENvdW50ID4gMSA/ICdzJyA6ICcnfSB0aHJldyBlcnJvcnMpYCA6ICcnO1xuICAgICAgICBjb25kaXRpb25UZXh0ID0gYE5vIHJ1bGVzIG1hdGNoZWQke2Vycm9yTm90ZX0sIGZlbGwgYmFjayB0byBkZWZhdWx0OiAke2JyYW5jaE5hbWV9LmA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjdHguZGVzY3JpcHRpb24gJiYgY3R4LnJhdGlvbmFsZSkge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCAke2N0eC5kZXNjcmlwdGlvbn06ICR7Y3R4LnJhdGlvbmFsZX0sIHNvIGl0IGNob3NlICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9IGVsc2UgaWYgKGN0eC5kZXNjcmlwdGlvbikge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCAke2N0eC5kZXNjcmlwdGlvbn0gYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9IGVsc2UgaWYgKGN0eC5yYXRpb25hbGUpIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgQSBkZWNpc2lvbiB3YXMgbWFkZTogJHtjdHgucmF0aW9uYWxlfSwgc28gdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBBIGRlY2lzaW9uIHdhcyBtYWRlLCBhbmQgdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9XG4gICAgcmV0dXJuIGBbQ29uZGl0aW9uXTogJHtjb25kaXRpb25UZXh0fWA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJGb3JrKGN0eDogRm9ya1JlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVzID0gY3R4LmNoaWxkcmVuLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGBbUGFyYWxsZWxdOiBGb3JraW5nIGludG8gJHtjdHguY2hpbGRyZW4ubGVuZ3RofSBwYXJhbGxlbCBwYXRoczogJHtuYW1lc30uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclNlbGVjdGVkKGN0eDogU2VsZWN0ZWRSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBpZiAoY3R4LmV2aWRlbmNlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgZXZpZGVuY2UgPSBjdHguZXZpZGVuY2UgYXMgYW55O1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IGV2aWRlbmNlLnJ1bGVzPy5maWx0ZXIoKHI6IGFueSkgPT4gci5tYXRjaGVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZC5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHIubGFiZWwgPyBgIFwiJHtyLmxhYmVsfVwiYCA6ICcnO1xuICAgICAgICBpZiAoci50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IGNvbmRzID0gci5jb25kaXRpb25zXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAoYzogYW55KSA9PlxuICAgICAgICAgICAgICAgIGAke2Mua2V5fSAke2MuYWN0dWFsU3VtbWFyeX0gJHtjLm9wfSAke0pTT04uc3RyaW5naWZ5KGMudGhyZXNob2xkKX0gJHtjLnJlc3VsdCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgcmV0dXJuIGAke3IuYnJhbmNofSR7bGFiZWx9ICgke2NvbmRzfSlgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHIuaW5wdXRzLm1hcCgoaTogYW55KSA9PiBgJHtpLmtleX09JHtpLnZhbHVlU3VtbWFyeX1gKS5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gYCR7ci5icmFuY2h9JHtsYWJlbH0gKCR7aW5wdXRzfSlgO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYFtTZWxlY3RlZF06ICR7Y3R4LnNlbGVjdGVkLmxlbmd0aH0gb2YgJHtjdHgudG90YWx9IHBhdGhzIHNlbGVjdGVkOiAke3BhcnRzLmpvaW4oJzsgJyl9LmA7XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gY3R4LnNlbGVjdGVkLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGBbU2VsZWN0ZWRdOiAke2N0eC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7Y3R4LnRvdGFsfSBwYXRocyBzZWxlY3RlZCBmb3IgZXhlY3V0aW9uOiAke25hbWVzfS5gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHg6IFN1YmZsb3dSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gJ2V4aXQnKSB7XG4gICAgICByZXR1cm4gYEV4aXRpbmcgdGhlICR7Y3R4Lm5hbWV9IHN1YmZsb3cuYDtcbiAgICB9XG4gICAgcmV0dXJuIGN0eC5kZXNjcmlwdGlvbiA/IGBFbnRlcmluZyAke2N0eC5uYW1lfTogJHtjdHguZGVzY3JpcHRpb259LmAgOiBgRW50ZXJpbmcgdGhlICR7Y3R4Lm5hbWV9IHN1YmZsb3cuYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckxvb3AoY3R4OiBMb29wUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGN0eC5kZXNjcmlwdGlvblxuICAgICAgPyBgT24gcGFzcyAke2N0eC5pdGVyYXRpb259OiAke2N0eC5kZXNjcmlwdGlvbn0gYWdhaW4uYFxuICAgICAgOiBgT24gcGFzcyAke2N0eC5pdGVyYXRpb259IHRocm91Z2ggJHtjdHgudGFyZ2V0fS5gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyQnJlYWsoY3R4OiBCcmVha1JlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRXhlY3V0aW9uIHN0b3BwZWQgYXQgJHtjdHguc3RhZ2VOYW1lfS5gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRXJyb3IoY3R4OiBFcnJvclJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0ID0gYEFuIGVycm9yIG9jY3VycmVkIGF0ICR7Y3R4LnN0YWdlTmFtZX06ICR7Y3R4Lm1lc3NhZ2V9LmA7XG4gICAgaWYgKGN0eC52YWxpZGF0aW9uSXNzdWVzKSB7XG4gICAgICB0ZXh0ICs9IGAgVmFsaWRhdGlvbiBpc3N1ZXM6ICR7Y3R4LnZhbGlkYXRpb25Jc3N1ZXN9LmA7XG4gICAgfVxuICAgIHJldHVybiBgW0Vycm9yXTogJHt0ZXh0fWA7XG4gIH1cbn1cbiJdfQ==
|
|
682
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gsNEVBQWlFO0FBRWpFLDRFQUFzRTtBQUN0RSwrRUFBeUU7QUFzRHpFLG1GQUFtRjtBQUVuRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0NBQXdDO0lBQzVFLEVBQUUsQ0FBUztJQUVwQjs7Ozs7T0FLRztJQUNLLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRCxzREFBc0Q7SUFDOUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ2xELHlEQUF5RDtJQUNqRCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDckQsNEVBQTRFO0lBQ3BFLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRTdDLGtCQUFrQixDQUFVO0lBQzVCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVM7SUFDdkIsV0FBVyxDQUE2QztJQUN4RCxRQUFRLENBQXFCO0lBRXJDLFlBQVksT0FBNEQ7UUFDdEUsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksb0JBQW9CLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxJQUFJLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxF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dXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciDigJQgSW5saW5lIG5hcnJhdGl2ZSBidWlsZGVyIHRoYXQgbWVyZ2VzIGZsb3cgKyBkYXRhIGR1cmluZyB0cmF2ZXJzYWwuXG4gKlxuICogRXh0ZW5kcyBTZXF1ZW5jZVJlY29yZGVyPENvbWJpbmVkTmFycmF0aXZlRW50cnk+IGZvciBkdWFsLWluZGV4ZWQgc3RvcmFnZSAob3JkZXJlZCBzZXF1ZW5jZVxuICogKyBPKDEpIHBlci1zdGVwIGxvb2t1cCBieSBydW50aW1lU3RhZ2VJZCkuIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzXG4gKiBmaXJzdC1jbGFzcyBhYnN0cmFjdGlvbiBmb3Igb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93IHN0cmVhbXMuXG4gKlxuICogRXZlbnQgb3JkZXJpbmcgZ3VhcmFudGVlcyB0aGlzIHdvcmtzOlxuICogICAxLiBTY29wZSBldmVudHMgKG9uUmVhZCwgb25Xcml0ZSkgZmlyZSBEVVJJTkcgc3RhZ2UgZXhlY3V0aW9uXG4gKiAgIDIuIEZsb3cgZXZlbnRzIChvblN0YWdlRXhlY3V0ZWQsIG9uRGVjaXNpb24pIGZpcmUgQUZURVIgc3RhZ2UgZXhlY3V0aW9uXG4gKiAgIDMuIEJvdGggY2FycnkgdGhlIHNhbWUgYHN0YWdlTmFtZWAg4oCUIG5vIG1hdGNoaW5nIGFtYmlndWl0eVxuICpcbiAqIFNvIHdlIGJ1ZmZlciBzY29wZSBvcHMgcGVyLXN0YWdlLCB0aGVuIHdoZW4gdGhlIGZsb3cgZXZlbnQgYXJyaXZlcyxcbiAqIGVtaXQgdGhlIHN0YWdlIGVudHJ5ICsgZmx1c2ggdGhlIGJ1ZmZlcmVkIG9wcyBpbiBvbmUgcGFzcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRmxvd0V2ZW50IH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRFdmVudCB9IGZyb20gJy4uLy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTZXF1ZW5jZVJlY29yZGVyIH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvU2VxdWVuY2VSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBzdW1tYXJpemVWYWx1ZSB9IGZyb20gJy4uLy4uL3Njb3BlL3JlY29yZGVycy9zdW1tYXJpemVWYWx1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlYWRFdmVudCwgUmVzdW1lRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi8uLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJyZWFrUmVuZGVyQ29udGV4dCxcbiAgQ29tYmluZWROYXJyYXRpdmVFbnRyeSxcbiAgRGVjaXNpb25SZW5kZXJDb250ZXh0LFxuICBFbWl0UmVuZGVyQ29udGV4dCxcbiAgRXJyb3JSZW5kZXJDb250ZXh0LFxuICBGb3JrUmVuZGVyQ29udGV4dCxcbiAgTG9vcFJlbmRlckNvbnRleHQsXG4gIE5hcnJhdGl2ZVJlbmRlcmVyLFxuICBPcFJlbmRlckNvbnRleHQsXG4gIFNlbGVjdGVkUmVuZGVyQ29udGV4dCxcbiAgU3RhZ2VSZW5kZXJDb250ZXh0LFxuICBTdWJmbG93UmVuZGVyQ29udGV4dCxcbn0gZnJvbSAnLi9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dQYXVzZUV2ZW50LFxuICBGbG93UmVzdW1lRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEJ1ZmZlcmVkT3Age1xuICB0eXBlOiAncmVhZCcgfCAnd3JpdGUnIHwgJ2VtaXQnO1xuICAvKiogRm9yIHJlYWQvd3JpdGU6IHNjb3BlIGtleS4gRm9yIGVtaXQ6IHRoZSBldmVudCBuYW1lLiAqL1xuICBrZXk6IHN0cmluZztcbiAgcmF3VmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xuICAvKiogT25seSBzZXQgZm9yIHR5cGU9J2VtaXQnIOKAlCBjYXJyaWVzIHRoZSBmdWxsIEVtaXRFdmVudCBmb3IgcmVuZGVyaW5nLiAqL1xuICBlbWl0RXZlbnQ/OiBFbWl0RXZlbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMge1xuICBpbmNsdWRlU3RlcE51bWJlcnM/OiBib29sZWFuO1xuICBpbmNsdWRlVmFsdWVzPzogYm9vbGVhbjtcbiAgbWF4VmFsdWVMZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gdmFsdWUgZm9ybWF0dGVyLiBDYWxsZWQgYXQgcmVuZGVyIHRpbWUgKGZsdXNoT3BzKSwgbm90IGNhcHR1cmUgdGltZS5cbiAgICogIFJlY2VpdmVzIHRoZSByYXcgdmFsdWUgYW5kIG1heFZhbHVlTGVuZ3RoLiBEZWZhdWx0cyB0byBzdW1tYXJpemVWYWx1ZSgpLiAqL1xuICBmb3JtYXRWYWx1ZT86ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpID0+IHN0cmluZztcbiAgLyoqIFBsdWdnYWJsZSByZW5kZXJlciBmb3IgY3VzdG9taXppbmcgbmFycmF0aXZlIG91dHB1dC4gVW5pbXBsZW1lbnRlZCBtZXRob2RzXG4gICAqICBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgRW5nbGlzaCByZW5kZXJlci4gU2VlIE5hcnJhdGl2ZVJlbmRlcmVyIGRvY3MuICovXG4gIHJlbmRlcmVyPzogTmFycmF0aXZlUmVuZGVyZXI7XG59XG5cbi8vIOKUgOKUgCBTY29wZVJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzIGZpcnN0LWNsYXNzIGFic3RyYWN0aW9uIGZvclxuICogb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgKSBhbmQgY29udHJvbC1mbG93XG4gKiAoYEZsb3dSZWNvcmRlcmApIHN0cmVhbXMuIE9uZSBgaWRgLCByb3V0ZWQgdG8gYm90aCBjaGFubmVscyB2aWFcbiAqIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKC4uLilgIChvciBlcXVpdmFsZW50bHkgdmlhXG4gKiBgZXhlY3V0b3IuZW5hYmxlTmFycmF0aXZlKC4uLilgIHdoaWNoIGF1dG8tY3JlYXRlcyBhbiBpbnN0YW5jZSkuXG4gKlxuICogRm9yIHNoYXJlZC1tZXRob2QtbmFtZSBldmVudHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKSB0aGVcbiAqIGhhbmRsZXIgYWNjZXB0cyB0aGUgdW5pb24gcGF5bG9hZCB0eXBlOyB3ZSBkaXNjcmltaW5hdGUgdmlhIGBpc0Zsb3dFdmVudGAuXG4gKiBTY29wZSB2YXJpYW50cyBvZiB0aGVzZSBldmVudHMgYXJlIGRlbGliZXJhdGVseSBpZ25vcmVkIGhlcmUg4oCUIHRoZVxuICogbmFycmF0aXZlIG9ubHkgc3VyZmFjZXMgY29udHJvbC1mbG93IGxpZmVjeWNsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGV4dGVuZHMgU2VxdWVuY2VSZWNvcmRlcjxDb21iaW5lZE5hcnJhdGl2ZUVudHJ5PiBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZW5kaW5nIHNjb3BlIG9wcyBrZXllZCBieSBydW50aW1lU3RhZ2VJZC4gRmx1c2hlZCBpbiBvblN0YWdlRXhlY3V0ZWQvb25EZWNpc2lvbi5cbiAgICpcbiAgICogS2V5aW5nIGJ5IHJ1bnRpbWVTdGFnZUlkIChub3Qgc3RhZ2VOYW1lKSBlbnN1cmVzIGNvcnJlY3RuZXNzIHdoZW4gcGFyYWxsZWwgZm9ya1xuICAgKiBicmFuY2hlcyBjb250YWluIHN0YWdlcyB3aXRoIHRoZSBzYW1lIG5hbWUg4oCUIGVhY2ggZXhlY3V0aW9uIHN0ZXAgaGFzIGEgdW5pcXVlIElELlxuICAgKi9cbiAgcHJpdmF0ZSBwZW5kaW5nT3BzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlcmVkT3BbXT4oKTtcbiAgLyoqIFBlci1zdWJmbG93IHN0YWdlIGNvdW50ZXJzLiBLZXkgJycgPSByb290IGZsb3cuICovXG4gIHByaXZhdGUgc3RhZ2VDb3VudGVycyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBQZXItc3ViZmxvdyBmaXJzdC1zdGFnZSBmbGFncy4gS2V5ICcnID0gcm9vdCBmbG93LiAqL1xuICBwcml2YXRlIGZpcnN0U3RhZ2VGbGFncyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAvKiogVmlzaXQgY291bnQgcGVyIHN0YWdlSWQg4oCUIGRldGVjdHMgbG9vcCBpdGVyYXRpb25zIChjb3VudCA+IDEgPSBsb29wKS4gKi9cbiAgcHJpdmF0ZSBzdGFnZVZpc2l0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBwcml2YXRlIGluY2x1ZGVTdGVwTnVtYmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSBpbmNsdWRlVmFsdWVzOiBib29sZWFuO1xuICBwcml2YXRlIG1heFZhbHVlTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgZm9ybWF0VmFsdWU6ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpID0+IHN0cmluZztcbiAgcHJpdmF0ZSByZW5kZXJlcj86IE5hcnJhdGl2ZVJlbmRlcmVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyAmIHsgaWQ/OiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkID8/ICdjb21iaW5lZC1uYXJyYXRpdmUnO1xuICAgIHRoaXMuaW5jbHVkZVN0ZXBOdW1iZXJzID0gb3B0aW9ucz8uaW5jbHVkZVN0ZXBOdW1iZXJzID8/IHRydWU7XG4gICAgdGhpcy5pbmNsdWRlVmFsdWVzID0gb3B0aW9ucz8uaW5jbHVkZVZhbHVlcyA/PyB0cnVlO1xuICAgIHRoaXMubWF4VmFsdWVMZW5ndGggPSBvcHRpb25zPy5tYXhWYWx1ZUxlbmd0aCA/PyA4MDtcbiAgICB0aGlzLmZvcm1hdFZhbHVlID0gb3B0aW9ucz8uZm9ybWF0VmFsdWUgPz8gc3VtbWFyaXplVmFsdWU7XG4gICAgdGhpcy5yZW5kZXJlciA9IG9wdGlvbnM/LnJlbmRlcmVyO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIGNoYW5uZWwgKGZpcmVzIGZpcnN0LCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQua2V5KSByZXR1cm47XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICByYXdWYWx1ZTogZXZlbnQudmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ3dyaXRlJyxcbiAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgcmF3VmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgb3BlcmF0aW9uOiBldmVudC5vcGVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRmxvdyBjaGFubmVsIChmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBOb24tbGluZWFyIGtpbmRzIGdldCB0aGVpciBuYXJyYXRpdmUgZW50cmllcyAoYW5kIG9wcyBmbHVzaClcbiAgICAvLyBmcm9tIGBvbkRlY2lzaW9uYCAvIGBvbkZvcmtgIC8gYG9uU2VsZWN0ZWRgIC8gYG9uU3ViZmxvd0VudHJ5YC5cbiAgICAvLyBTa2lwIHRoZW0gaGVyZSBzbyBlYWNoIHN0YWdlIGhhcyBleGFjdGx5IG9uZSBuYXJyYXRpdmUgZW50cnkuXG4gICAgaWYgKGV2ZW50LnN0YWdlVHlwZSAhPT0gJ2xpbmVhcicpIHJldHVybjtcblxuICAgIGNvbnN0IHN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgY29uc3Qgc2ZLZXkgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQgPz8gJyc7XG4gICAgY29uc3Qgc3RhZ2VOdW0gPSB0aGlzLmluY3JlbWVudFN0YWdlQ291bnRlcihzZktleSk7XG4gICAgY29uc3QgaXNGaXJzdCA9IHRoaXMuY29uc3VtZUZpcnN0U3RhZ2VGbGFnKHNmS2V5KTtcblxuICAgIC8vIFRyYWNrIHZpc2l0IGNvdW50IHBlciBzdGFnZUlkIHRvIGRldGVjdCBsb29wIGl0ZXJhdGlvbnNcbiAgICBjb25zdCB2aXNpdEtleSA9IHN0YWdlSWQgPz8gZXZlbnQuc3RhZ2VOYW1lO1xuICAgIGNvbnN0IHZpc2l0Q291bnQgPSAodGhpcy5zdGFnZVZpc2l0Q291bnRzLmdldCh2aXNpdEtleSkgPz8gMCkgKyAxO1xuICAgIHRoaXMuc3RhZ2VWaXNpdENvdW50cy5zZXQodmlzaXRLZXksIHZpc2l0Q291bnQpO1xuXG4gICAgY29uc3QgY3R4OiBTdGFnZVJlbmRlckNvbnRleHQgPSB7XG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlTnVtYmVyOiBzdGFnZU51bSxcbiAgICAgIGlzRmlyc3QsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICBsb29wSXRlcmF0aW9uOiB2aXNpdENvdW50ID4gMSA/IHZpc2l0Q291bnQgLSAxIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN0YWdlPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdGFnZShjdHgpO1xuXG4gICAgY29uc3Qgc2ZJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgIH0pO1xuICAgIHRoaXMuZmx1c2hPcHMocnVudGltZVN0YWdlSWQsIHNmSWQsIHN0YWdlSWQsIGV2ZW50LnN0YWdlTmFtZSk7XG4gIH1cblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG5cbiAgICAvLyBFbWl0IHRoZSBkZWNpZGVyIHN0YWdlIGVudHJ5LlxuICAgIC8vIFByb3Bvc2FsICMwMDMgYWxzbyBmaXJlcyBgb25TdGFnZUV4ZWN1dGVkKHN0YWdlVHlwZTogJ2RlY2lkZXInKWBcbiAgICAvLyBBRlRFUiB0aGlzIGV2ZW50LCBidXQgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBnYXRlcyB0aGF0XG4gICAgLy8gaGFuZGxlciB0byBMSU5FQVItb25seSBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZW1pc3Npb24gc2l0ZVxuICAgIC8vIGZvciB0aGUgZGVjaWRlcidzIHN0YWdlIGVudHJ5ICsgb3BzIGZsdXNoLiBLZWVwcyBuYXJyYXRpdmVcbiAgICAvLyBvdXRwdXQgYnl0ZS1zdGFibGUgYWNyb3NzIHRoZSB2NiB0cmFuc2l0aW9uLlxuICAgIGNvbnN0IHNmS2V5ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkID8/ICcnO1xuICAgIGNvbnN0IHN0YWdlTnVtID0gdGhpcy5pbmNyZW1lbnRTdGFnZUNvdW50ZXIoc2ZLZXkpO1xuICAgIGNvbnN0IGlzRmlyc3QgPSB0aGlzLmNvbnN1bWVGaXJzdFN0YWdlRmxhZyhzZktleSk7XG5cbiAgICBjb25zdCBzdGFnZUN0eDogU3RhZ2VSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VOdW1iZXI6IHN0YWdlTnVtLFxuICAgICAgaXNGaXJzdCxcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlVGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN0YWdlPy4oc3RhZ2VDdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN0YWdlKHN0YWdlQ3R4KTtcblxuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgdGV4dDogc3RhZ2VUZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBzdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmZsdXNoT3BzKHJ1bnRpbWVTdGFnZUlkLCBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsIHN0YWdlSWQsIGV2ZW50LmRlY2lkZXIpO1xuXG4gICAgLy8gRW1pdCB0aGUgY29uZGl0aW9uIGVudHJ5IGFzIGEgbmVzdGVkIHN1Yi1pdGVtIChkZXB0aCAxKSBvZiB0aGUgc3RhZ2UgYWJvdmUuXG4gICAgY29uc3QgZGVjaXNpb25DdHg6IERlY2lzaW9uUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBjaG9zZW46IGV2ZW50LmNob3NlbixcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICAgIHJhdGlvbmFsZTogZXZlbnQucmF0aW9uYWxlLFxuICAgICAgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlLFxuICAgIH07XG4gICAgY29uc3QgY29uZGl0aW9uVGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckRlY2lzaW9uPy4oZGVjaXNpb25DdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckRlY2lzaW9uKGRlY2lzaW9uQ3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2NvbmRpdGlvbicsXG4gICAgICB0ZXh0OiBjb25kaXRpb25UZXh0LFxuICAgICAgZGVwdGg6IDEsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBzdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uTmV4dCgpOiB2b2lkIHtcbiAgICAvLyBOby1vcC4gb25TdGFnZUV4ZWN1dGVkIGFscmVhZHkgaGFzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIG5leHQgc3RhZ2UuXG4gIH1cblxuICBvbkZvcmsoZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IEZvcmtSZW5kZXJDb250ZXh0ID0geyBjaGlsZHJlbjogZXZlbnQuY2hpbGRyZW4gfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyRm9yaz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyRm9yayhjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvblNlbGVjdGVkKGV2ZW50OiBGbG93U2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eDogU2VsZWN0ZWRSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc2VsZWN0ZWQ6IGV2ZW50LnNlbGVjdGVkLFxuICAgICAgdG90YWw6IGV2ZW50LnRvdGFsLFxuICAgICAgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclNlbGVjdGVkPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTZWxlY3RlZChjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc2VsZWN0b3InLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25TdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnN1YmZsb3dJZCA/PyAnJztcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuZGVsZXRlKHNmS2V5KTtcbiAgICB0aGlzLmZpcnN0U3RhZ2VGbGFncy5kZWxldGUoc2ZLZXkpO1xuXG4gICAgY29uc3QgY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBkaXJlY3Rpb246ICdlbnRyeScsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICBtYXBwZWRJbnB1dDogZXZlbnQubWFwcGVkSW5wdXQsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3ViZmxvdz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHgpO1xuICAgIGNvbnN0IHJpZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHNpZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3Qgc2ZJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3N1YmZsb3cnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5uYW1lLFxuICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHJpZCxcbiAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICAgIGRpcmVjdGlvbjogJ2VudHJ5JyxcbiAgICB9KTtcbiAgICAvLyBFbWl0IHBlci1rZXkgc3RlcCBlbnRyaWVzIGZvciBtYXBwZWQgaW5wdXRzLlxuICAgIC8vXG4gICAgLy8gUm91dGUgRUFDSCBrZXkgdGhyb3VnaCB0aGUgY29uc3VtZXIncyBgcmVuZGVyZXIucmVuZGVyT3BgIGhvb2sgYmVmb3JlXG4gICAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBoYXJkY29kZWQgYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gXG4gICAgLy8gdGVtcGxhdGUuIFdpdGhvdXQgdGhpcyByb3V0aW5nLCBhIGNvbnN1bWVyIHRoYXQgcHJvdmlkZWQgYVxuICAgIC8vIGRvbWFpbi1hd2FyZSBgcmVuZGVyZXIucmVuZGVyT3BgICh0byByZW5kZXIgZS5nLiBgcGFyc2VkUmVzcG9uc2VgXG4gICAgLy8gb2JqZWN0cyBzZW1hbnRpY2FsbHkpIHdvdWxkIHNlZSBiZWF1dGlmdWwgb3V0cHV0IGZvciBzY29wZSB3cml0ZXNcbiAgICAvLyBidXQgZ2V0IHRoZSBnZW5lcmljIGtleS1saXN0IGZhbGxiYWNrIGZvciBzdWJmbG93IGlucHV0cyDigJQgdGhlXG4gICAgLy8gbGlicmFyeSdzIFwiY29tYmluZWQgbmFycmF0aXZlXCIgcHJvbWlzZSAob25lIHJlbmRlcmVyIGNvbnRyb2xzIHRoZVxuICAgIC8vIHdob2xlIG5hcnJhdGl2ZSkgd291bGQgc2lsZW50bHkgYnJlYWsuIFdlIGhvbm91ciBpdCBoZXJlLlxuICAgIC8vXG4gICAgLy8gVGhlIE9wUmVuZGVyQ29udGV4dCBpcyBidWlsdCB3aXRoIGB0eXBlOiAnd3JpdGUnYCBiZWNhdXNlIHNlbWFudGljYWxseVxuICAgIC8vIHRoZSBzdWJmbG93J3MgaW5pdGlhbCBzY29wZSBJUyBiZWluZyB3cml0dGVuIHZpYSB0aGUgcGFyZW50J3NcbiAgICAvLyBpbnB1dE1hcHBlci4gYG9wZXJhdGlvbjogJ3NldCdgIGxpa2V3aXNlIOKAlCB0aGlzIGlzIHRoZSBzdWJmbG93J3NcbiAgICAvLyBmaXJzdCBzaWdodCBvZiB0aGUga2V5LlxuICAgIC8vXG4gICAgLy8gVmFsdWVzIHNob3duIHdoZW4gaW5jbHVkZVZhbHVlcz10cnVlIOKAlCBjb25zdW1lciByZXNwb25zaWJsZSBmb3JcbiAgICAvLyByZWRhY3Rpb24gcG9saWN5IG9uIHRoZSBwYXJlbnQgc2NvcGUgKHJlZGFjdGVkIGtleXMgcHJvZHVjZVxuICAgIC8vICdbUkVEQUNURURdJyB2aWEgU2NvcGVGYWNhZGUpLlxuICAgIGlmIChldmVudC5tYXBwZWRJbnB1dCAmJiBPYmplY3Qua2V5cyhldmVudC5tYXBwZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHN0ZXBOdW1iZXIgPSAwO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnQubWFwcGVkSW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlU3VtbWFyeSA9IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUsIHRoaXMubWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICBjb25zdCBvcEN0eDogT3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICd3cml0ZScsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHJhd1ZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZVN1bW1hcnksXG4gICAgICAgICAgb3BlcmF0aW9uOiAnc2V0JyxcbiAgICAgICAgICBzdGVwTnVtYmVyOiArK3N0ZXBOdW1iZXIsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHN1cHBsaWVkIGByZW5kZXJlci5yZW5kZXJPcGAsIHVzZSBpdHMgcmV0dXJuIHZhbHVlOlxuICAgICAgICAvLyAgIC0gc3RyaW5nIOKGkiB1c2UgYXMgdGhlIG5hcnJhdGl2ZSBsaW5lXG4gICAgICAgIC8vICAgLSBudWxsICAg4oaSIGRlbGliZXJhdGVseSBleGNsdWRlIHRoaXMgZW50cnkgKHNhbWUgc2VtYW50aWNzIGFzXG4gICAgICAgIC8vICAgICAgICAgICAgICBgZmx1c2hPcHNgIGFib3ZlIGF0IGxpbmUgfjU0MClcbiAgICAgICAgLy8gICAtIHVuZGVmaW5lZCDihpIgcmVuZGVyZXIgZG9lcyBub3QgaGFuZGxlIHRoaXMgb3Ag4oaSIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG8gdGhlIGhhcmRjb2RlZCB0ZW1wbGF0ZVxuICAgICAgICAvLyBJZiBubyByZW5kZXJlciBhdCBhbGwsIHVzZSB0aGUgaGFyZGNvZGVkIHRlbXBsYXRlLlxuICAgICAgICBsZXQgdGV4dDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXI/LnJlbmRlck9wKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tVGV4dCA9IHRoaXMucmVuZGVyZXIucmVuZGVyT3Aob3BDdHgpO1xuICAgICAgICAgIGlmIChjdXN0b21UZXh0ID09PSBudWxsKSBjb250aW51ZTsgLy8gZXhjbHVkZWQgb24gcHVycG9zZVxuICAgICAgICAgIHRleHQgPVxuICAgICAgICAgICAgY3VzdG9tVGV4dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gY3VzdG9tVGV4dFxuICAgICAgICAgICAgICA6IHRoaXMuaW5jbHVkZVZhbHVlc1xuICAgICAgICAgICAgICA/IGBJbnB1dDogJHtrZXl9ID0gJHt2YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgICAgICA6IGBJbnB1dDogJHtrZXl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gdGhpcy5pbmNsdWRlVmFsdWVzID8gYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gIDogYElucHV0OiAke2tleX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICByYXdWYWx1ZTogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgLy8gTk9URTogb3V0cHV0IHN0YXRlIGlzIE5PVCBlbWl0dGVkIGFzIHN0ZXAgZW50cmllcyBiZWNhdXNlIGl0IG1heSBjb250YWluXG4gICAgLy8gdW5yZWRhY3RlZCB2YWx1ZXMgZnJvbSB0aGUgc3ViZmxvdydzIGludGVybmFsIHNjb3BlLiBUaGUgc3ViZmxvdyBleGl0XG4gICAgLy8gaGVhZGVyIGlzIHN1ZmZpY2llbnQg4oCUIGRyaWxsIGludG8gdGhlIHN1YmZsb3cgZm9yIGRldGFpbHMuXG4gICAgY29uc3QgY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBkaXJlY3Rpb246ICdleGl0JyxcbiAgICAgIG91dHB1dFN0YXRlOiBldmVudC5vdXRwdXRTdGF0ZSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdWJmbG93Py4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdWJmbG93KGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHNpZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgICBkaXJlY3Rpb246ICdleGl0JyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uTG9vcChldmVudDogRmxvd0xvb3BFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eDogTG9vcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIGl0ZXJhdGlvbjogZXZlbnQuaXRlcmF0aW9uLFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckxvb3A/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckxvb3AoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2xvb3AnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25CcmVhayhldmVudDogRmxvd0JyZWFrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IEJyZWFrUmVuZGVyQ29udGV4dCA9IHsgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyQnJlYWs/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckJyZWFrKGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdicmVhaycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUGF1c2UoZXZlbnQ6IFBhdXNlRXZlbnQgfCBGbG93UGF1c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIEJvdGggY2hhbm5lbHMgZmlyZSBvblBhdXNlIHdpdGggZGlmZmVyZW50IHBheWxvYWQgc2hhcGVzLiBOYXJyYXRpdmUgb25seVxuICAgIC8vIHN1cmZhY2VzIHRoZSBjb250cm9sLWZsb3cgdmFyaWFudCAod2hpY2ggaGFzIHN0YWdlTmFtZS9zdGFnZUlkKS4gRGF0YVxuICAgIC8vIGNoYW5uZWwncyBQYXVzZUV2ZW50IGlzIGlnbm9yZWQgdG8gYXZvaWQgZHVwbGljYXRlIGVudHJpZXMuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAoIWV2ZW50LnN0YWdlTmFtZSB8fCAhZXZlbnQuc3RhZ2VJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBgRXhlY3V0aW9uIHBhdXNlZCBhdCAke2V2ZW50LnN0YWdlTmFtZX0uYDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3BhdXNlJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCA/PyBldmVudC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvblJlc3VtZShldmVudDogUmVzdW1lRXZlbnQgfCBGbG93UmVzdW1lRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTYW1lIGlzRmxvd0V2ZW50IGRpc2NyaW1pbmFudCBhcyBvblBhdXNlIOKAlCBpZ25vcmUgc2NvcGUgUmVzdW1lRXZlbnQuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAoIWV2ZW50LnN0YWdlTmFtZSB8fCAhZXZlbnQuc3RhZ2VJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHN1ZmZpeCA9IGV2ZW50Lmhhc0lucHV0ID8gJyB3aXRoIGlucHV0LicgOiAnLic7XG4gICAgY29uc3QgdGV4dCA9IGBFeGVjdXRpb24gcmVzdW1lZCBhdCAke2V2ZW50LnN0YWdlTmFtZX0ke3N1ZmZpeH1gO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAncmVzdW1lJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCA/PyBldmVudC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBOYXJyYXRpdmUgb25seSBzdXJmYWNlcyB0aGUgY29udHJvbC1mbG93IHZhcmlhbnQgb2YgZXJyb3JzIChoYXNcbiAgICAvLyBzdGFnZU5hbWUgKyBtZXNzYWdlKS4gU2NvcGUtbGV2ZWwgRXJyb3JFdmVudCBpcyBjYXB0dXJlZCBlbHNld2hlcmUuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGV2ZW50Lm1lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBsZXQgdmFsaWRhdGlvbklzc3Vlczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChldmVudC5zdHJ1Y3R1cmVkRXJyb3I/Lmlzc3Vlcz8ubGVuZ3RoKSB7XG4gICAgICB2YWxpZGF0aW9uSXNzdWVzID0gZXZlbnQuc3RydWN0dXJlZEVycm9yLmlzc3Vlc1xuICAgICAgICAubWFwKChpc3N1ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoLmxlbmd0aCA+IDAgPyBpc3N1ZS5wYXRoLmpvaW4oJy4nKSA6ICcocm9vdCknO1xuICAgICAgICAgIHJldHVybiBgJHtwYXRofTogJHtpc3N1ZS5tZXNzYWdlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCc7ICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGN0eDogRXJyb3JSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBtZXNzYWdlOiBldmVudC5tZXNzYWdlLFxuICAgICAgdmFsaWRhdGlvbklzc3VlcyxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJFcnJvcj8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyRXJyb3IoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEVtaXQgY2hhbm5lbCAoUGhhc2UgMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlY2VpdmUgYSBjb25zdW1lci1lbWl0dGVkIGV2ZW50IGZyb20gYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAgICpcbiAgICogQnVmZmVyZWQgYWxvbmdzaWRlIGBvblJlYWRgL2BvbldyaXRlYCBwZXItc3RhZ2Ugc28gdGhhdCB0aGUgZmluYWxcbiAgICogbmFycmF0aXZlIHByZXNlcnZlcyBvcmRlcmluZzpcbiAgICpcbiAgICogICAxLiBzdGFnZSBoZWFkZXIgKGVtaXR0ZWQgYnkgYG9uU3RhZ2VFeGVjdXRlZGAgLyBgb25EZWNpc2lvbmApXG4gICAqICAgMi4gYnVmZmVyZWQgb3BzIGZvciB0aGF0IHN0YWdlIOKAlCBpbiBjYWxsIG9yZGVyIOKAlCBmbHVzaGVkIHJpZ2h0IGFmdGVyXG4gICAqXG4gICAqIFdpdGhvdXQgYnVmZmVyaW5nLCBlbWl0IGV2ZW50cyB3b3VsZCBmaXJlIEJFRk9SRSB0aGUgc3RhZ2UgaGVhZGVyXG4gICAqICh3aGljaCBvbmx5IGxhbmRzIGF0IGBvblN0YWdlRXhlY3V0ZWRgKSwgcHJvZHVjaW5nIG91dC1vZi1vcmRlclxuICAgKiBuYXJyYXRpdmUgZW50cmllcy4gRmx1c2ggaGFwcGVucyBpbiBgZmx1c2hPcHNgIHdoaWNoIHJvdXRlcyBgZW1pdGAtXG4gICAqIHR5cGVkIGJ1ZmZlcmVkIG9wcyB0aHJvdWdoIGByZW5kZXJFbWl0YCBpbnN0ZWFkIG9mIGByZW5kZXJPcGAuXG4gICAqL1xuICBvbkVtaXQoZXZlbnQ6IEVtaXRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyT3AoZXZlbnQucnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHR5cGU6ICdlbWl0JyxcbiAgICAgIGtleTogZXZlbnQubmFtZSxcbiAgICAgIHJhd1ZhbHVlOiBldmVudC5wYXlsb2FkLFxuICAgICAgZW1pdEV2ZW50OiBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckVtaXQoY3R4OiBFbWl0UmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbZW1pdF0gJHtjdHgubmFtZX06ICR7Y3R4LnBheWxvYWRTdW1tYXJ5fWA7XG4gIH1cblxuICAvLyDilIDilIAgT3V0cHV0IChuYXJyYXRpdmUtc3BlY2lmaWMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGVudHJpZXMgZ3JvdXBlZCBieSBzdWJmbG93SWQgZm9yIHN0cnVjdHVyZWQgYWNjZXNzLlxuICAgKiBSb290LWxldmVsIGVudHJpZXMgaGF2ZSBzdWJmbG93SWQgPSB1bmRlZmluZWQuXG4gICAqL1xuICBnZXRFbnRyaWVzQnlTdWJmbG93KCk6IFJlY29yZDxzdHJpbmcsIENvbWJpbmVkTmFycmF0aXZlRW50cnlbXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdPiA9IHsgJyc6IFtdIH07XG4gICAgdGhpcy5mb3JFYWNoRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBlbnRyeS5zdWJmbG93SWQgPz8gJyc7XG4gICAgICBpZiAoIXJlc3VsdFtrZXldKSByZXN1bHRba2V5XSA9IFtdO1xuICAgICAgcmVzdWx0W2tleV0ucHVzaChlbnRyeSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBDbGVhcnMgYWxsIHN0YXRlLiBDYWxsZWQgYXV0b21hdGljYWxseSBiZWZvcmUgZWFjaCBydW4uICovXG4gIG92ZXJyaWRlIGNsZWFyKCk6IHZvaWQge1xuICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nT3BzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLnN0YWdlVmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBpbmNyZW1lbnRTdGFnZUNvdW50ZXIoc3ViZmxvd0tleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdGFnZUNvdW50ZXJzLmdldChzdWJmbG93S2V5KSA/PyAwO1xuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50ICsgMTtcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuc2V0KHN1YmZsb3dLZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lRmlyc3RTdGFnZUZsYWcoc3ViZmxvd0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmZpcnN0U3RhZ2VGbGFncy5oYXMoc3ViZmxvd0tleSkpIHtcbiAgICAgIHRoaXMuZmlyc3RTdGFnZUZsYWdzLnNldChzdWJmbG93S2V5LCBmYWxzZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWZmZXJPcChydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBvcDogT21pdDxCdWZmZXJlZE9wLCAnc3RlcE51bWJlcic+KTogdm9pZCB7XG4gICAgbGV0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICBvcHMgPSBbXTtcbiAgICAgIHRoaXMucGVuZGluZ09wcy5zZXQocnVudGltZVN0YWdlSWQsIG9wcyk7XG4gICAgfVxuICAgIG9wcy5wdXNoKHsgLi4ub3AsIHN0ZXBOdW1iZXI6IG9wcy5sZW5ndGggKyAxIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaE9wcyhydW50aW1lU3RhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdWJmbG93SWQ/OiBzdHJpbmcsIHN0YWdlSWQ/OiBzdHJpbmcsIHN0YWdlTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChydW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qgb3BzID0gdGhpcy5wZW5kaW5nT3BzLmdldChydW50aW1lU3RhZ2VJZCk7XG4gICAgaWYgKCFvcHMgfHwgb3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgIC8vIOKUgOKUgCBFbWl0IGV2ZW50cyB0YWtlIGEgZGlmZmVyZW50IHJlbmRlciBwYXRoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgLy9cbiAgICAgIC8vIEVtaXQgZXZlbnRzIGFyZSBidWZmZXJlZCBhbG9uZ3NpZGUgcmVhZHMvd3JpdGVzIChzbyB0aGV5IGFwcGVhclxuICAgICAgLy8gdW5kZXIgdGhlaXIgb3duaW5nIHN0YWdlJ3MgaGVhZGVyIGluIG5hcnJhdGl2ZSBvcmRlciwgbm90IGlubGluZVxuICAgICAgLy8gYXQgY2FsbCB0aW1lKS4gQXQgZmx1c2gsIHRoZXkgcm91dGUgdGhyb3VnaCBgcmVuZGVyRW1pdGAgaW5zdGVhZFxuICAgICAgLy8gb2YgYHJlbmRlck9wYCDigJQgY29uc3VtZXJzIHdhbnRpbmcgY3VzdG9tIGVtaXQgcmVuZGVyaW5nIGltcGxlbWVudFxuICAgICAgLy8gdGhlIGRlZGljYXRlZCBob29rLiBVbmhhbmRsZWQgLyBtaXNzaW5nIHJlbmRlcmVyIGZhbGxzIGJhY2sgdG9cbiAgICAgIC8vIHRoZSBzYW1lIGNvbXBhY3QgYFtlbWl0XSBuYW1lOiBwYXlsb2FkU3VtbWFyeWAgZGVmYXVsdCB1c2VkIGJ5XG4gICAgICAvLyB0aGUgcHJlLWJ1ZmZlcmluZyBvbkVtaXQgcGF0aC5cbiAgICAgIGlmIChvcC50eXBlID09PSAnZW1pdCcgJiYgb3AuZW1pdEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGUgPSBvcC5lbWl0RXZlbnQ7XG4gICAgICAgIGNvbnN0IHBheWxvYWRTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZShlLnBheWxvYWQsIHRoaXMubWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICBjb25zdCBlbWl0Q3R4OiBFbWl0UmVuZGVyQ29udGV4dCA9IHtcbiAgICAgICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICAgICAgcGF5bG9hZDogZS5wYXlsb2FkLFxuICAgICAgICAgIHN0YWdlTmFtZTogZS5zdGFnZU5hbWUsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgc3ViZmxvd1BhdGg6IGUuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgcGlwZWxpbmVJZDogZS5waXBlbGluZUlkLFxuICAgICAgICAgIHRpbWVzdGFtcDogZS50aW1lc3RhbXAsXG4gICAgICAgICAgcGF5bG9hZFN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICAgIGxldCBlbWl0VGV4dDogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJlcj8ucmVuZGVyRW1pdCkge1xuICAgICAgICAgIGNvbnN0IGN1c3RvbSA9IHRoaXMucmVuZGVyZXIucmVuZGVyRW1pdChlbWl0Q3R4KTtcbiAgICAgICAgICBpZiAoY3VzdG9tID09PSBudWxsKSBjb250aW51ZTsgLy8gZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVkXG4gICAgICAgICAgZW1pdFRleHQgPSBjdXN0b20gIT09IHVuZGVmaW5lZCA/IGN1c3RvbSA6IHRoaXMuZGVmYXVsdFJlbmRlckVtaXQoZW1pdEN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW1pdFRleHQgPSB0aGlzLmRlZmF1bHRSZW5kZXJFbWl0KGVtaXRDdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAgICAgIHRleHQ6IGVtaXRUZXh0LFxuICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgb3AudHlwZSBpcyBuYXJyb3dlZCB0byAncmVhZCcgfCAnd3JpdGUnIChlbWl0IGJyYW5jaFxuICAgICAgLy8gYWJvdmUgdXNlcyBgY29udGludWVgKS4gVHlwZVNjcmlwdCBjYW4ndCBmb2xsb3cgdGhhdCBuYXJyb3dpbmdcbiAgICAgIC8vIHRocm91Z2ggdGhlIGNvbnRpbnVlLCBzbyB3ZSBhc3NlcnQgYXQgcmVuZGVyIHRpbWUuXG4gICAgICBjb25zdCBvcFR5cGUgPSBvcC50eXBlIGFzICdyZWFkJyB8ICd3cml0ZSc7XG4gICAgICBjb25zdCB2YWx1ZVN1bW1hcnkgPSB0aGlzLmZvcm1hdFZhbHVlKG9wLnJhd1ZhbHVlLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgIGNvbnN0IG9wQ3R4OiBPcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgIHR5cGU6IG9wVHlwZSxcbiAgICAgICAga2V5OiBvcC5rZXksXG4gICAgICAgIHJhd1ZhbHVlOiBvcC5yYXdWYWx1ZSxcbiAgICAgICAgdmFsdWVTdW1tYXJ5LFxuICAgICAgICBvcGVyYXRpb246IG9wLm9wZXJhdGlvbixcbiAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJPcCA/IHRoaXMucmVuZGVyZXIucmVuZGVyT3Aob3BDdHgpIDogdGhpcy5kZWZhdWx0UmVuZGVyT3Aob3BDdHgpO1xuXG4gICAgICBpZiAodGV4dCA9PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5lbWl0KHtcbiAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBrZXk6IG9wLmtleSxcbiAgICAgICAgcmF3VmFsdWU6IG9wLnJhd1ZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3BzLmRlbGV0ZShydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvLyDilIDilIAgRGVmYXVsdCByZW5kZXJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyU3RhZ2UoY3R4OiBTdGFnZVJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCBpbm5lcjogc3RyaW5nO1xuICAgIGlmIChjdHguaXNGaXJzdCkge1xuICAgICAgaW5uZXIgPSBjdHguZGVzY3JpcHRpb24gPyBgVGhlIHByb2Nlc3MgYmVnYW46ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYFRoZSBwcm9jZXNzIGJlZ2FuIHdpdGggJHtjdHguc3RhZ2VOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoY3R4Lmxvb3BJdGVyYXRpb24gJiYgY3R4Lmxvb3BJdGVyYXRpb24gPiAwKSB7XG4gICAgICBpbm5lciA9IGN0eC5kZXNjcmlwdGlvblxuICAgICAgICA/IGBMb29wZWQgYmFjazogJHtjdHguZGVzY3JpcHRpb259IChwYXNzICR7Y3R4Lmxvb3BJdGVyYXRpb259KS5gXG4gICAgICAgIDogYExvb3BlZCBiYWNrIHRvICR7Y3R4LnN0YWdlTmFtZX0gKHBhc3MgJHtjdHgubG9vcEl0ZXJhdGlvbn0pLmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlubmVyID0gY3R4LmRlc2NyaXB0aW9uID8gYE5leHQgc3RlcDogJHtjdHguZGVzY3JpcHRpb259LmAgOiBgTmV4dCwgaXQgbW92ZWQgb24gdG8gJHtjdHguc3RhZ2VOYW1lfS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFN0YWdlICR7Y3R4LnN0YWdlTnVtYmVyfTogJHtpbm5lcn1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyT3AoY3R4OiBPcFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ZXBQcmVmaXggPSB0aGlzLmluY2x1ZGVTdGVwTnVtYmVycyA/IGBTdGVwICR7Y3R4LnN0ZXBOdW1iZXJ9OiBgIDogJyc7XG4gICAgaWYgKGN0eC50eXBlID09PSAncmVhZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGVWYWx1ZXMgJiYgY3R4LnZhbHVlU3VtbWFyeVxuICAgICAgICA/IGAke3N0ZXBQcmVmaXh9UmVhZCAke2N0eC5rZXl9ID0gJHtjdHgudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgOiBgJHtzdGVwUHJlZml4fVJlYWQgJHtjdHgua2V5fWA7XG4gICAgfVxuICAgIGlmIChjdHgub3BlcmF0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgcmV0dXJuIGAke3N0ZXBQcmVmaXh9RGVsZXRlICR7Y3R4LmtleX1gO1xuICAgIH1cbiAgICBpZiAoY3R4Lm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgPyBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke2N0eC5rZXl9ID0gJHtjdHgudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgOiBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke2N0eC5rZXl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5jbHVkZVZhbHVlcyA/IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtjdHgua2V5fSA9ICR7Y3R4LnZhbHVlU3VtbWFyeX1gIDogYCR7c3RlcFByZWZpeH1Xcml0ZSAke2N0eC5rZXl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckRlY2lzaW9uKGN0eDogRGVjaXNpb25SZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBicmFuY2hOYW1lID0gY3R4LmNob3NlbjtcbiAgICBsZXQgY29uZGl0aW9uVGV4dDogc3RyaW5nO1xuICAgIGlmIChjdHguZXZpZGVuY2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBldmlkZW5jZSA9IGN0eC5ldmlkZW5jZSBhcyBhbnk7XG4gICAgICBjb25zdCBtYXRjaGVkUnVsZSA9IGV2aWRlbmNlLnJ1bGVzPy5maW5kKChyOiBhbnkpID0+IHIubWF0Y2hlZCk7XG4gICAgICBpZiAobWF0Y2hlZFJ1bGUpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBtYXRjaGVkUnVsZS5sYWJlbCA/IGAgXCIke21hdGNoZWRSdWxlLmxhYmVsfVwiYCA6ICcnO1xuICAgICAgICBpZiAobWF0Y2hlZFJ1bGUudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWRSdWxlLmNvbmRpdGlvbnMubWFwKFxuICAgICAgICAgICAgKGM6IGFueSkgPT5cbiAgICAgICAgICAgICAgYCR7Yy5rZXl9ICR7Yy5hY3R1YWxTdW1tYXJ5fSAke2Mub3B9ICR7SlNPTi5zdHJpbmdpZnkoYy50aHJlc2hvbGQpfSAke2MucmVzdWx0ID8gJ1xcdTI3MTMnIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25kaXRpb25UZXh0ID0gYEl0IGV2YWx1YXRlZCBSdWxlICR7bWF0Y2hlZFJ1bGUucnVsZUluZGV4fSR7bGFiZWx9OiAke3BhcnRzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9LCBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZFJ1bGUuaW5wdXRzLm1hcCgoaTogYW55KSA9PiBgJHtpLmtleX09JHtpLnZhbHVlU3VtbWFyeX1gKTtcbiAgICAgICAgICBjb25kaXRpb25UZXh0ID0gYEl0IGV4YW1pbmVkJHtsYWJlbH06ICR7cGFydHMuam9pbignLCAnKX0sIGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yZWRDb3VudCA9IGV2aWRlbmNlLnJ1bGVzPy5maWx0ZXIoKHI6IGFueSkgPT4gci5tYXRjaEVycm9yICE9PSB1bmRlZmluZWQpLmxlbmd0aCA/PyAwO1xuICAgICAgICBjb25zdCBlcnJvck5vdGUgPSBlcnJvcmVkQ291bnQgPiAwID8gYCAoJHtlcnJvcmVkQ291bnR9IHJ1bGUke2Vycm9yZWRDb3VudCA+IDEgPyAncycgOiAnJ30gdGhyZXcgZXJyb3JzKWAgOiAnJztcbiAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBObyBydWxlcyBtYXRjaGVkJHtlcnJvck5vdGV9LCBmZWxsIGJhY2sgdG8gZGVmYXVsdDogJHticmFuY2hOYW1lfS5gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3R4LmRlc2NyaXB0aW9uICYmIGN0eC5yYXRpb25hbGUpIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgJHtjdHguZGVzY3JpcHRpb259OiAke2N0eC5yYXRpb25hbGV9LCBzbyBpdCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChjdHguZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgJHtjdHguZGVzY3JpcHRpb259IGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChjdHgucmF0aW9uYWxlKSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEEgZGVjaXNpb24gd2FzIG1hZGU6ICR7Y3R4LnJhdGlvbmFsZX0sIHNvIHRoZSBwYXRoIHRha2VuIHdhcyAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgQSBkZWNpc2lvbiB3YXMgbWFkZSwgYW5kIHRoZSBwYXRoIHRha2VuIHdhcyAke2JyYW5jaE5hbWV9LmA7XG4gICAgfVxuICAgIHJldHVybiBgW0NvbmRpdGlvbl06ICR7Y29uZGl0aW9uVGV4dH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRm9yayhjdHg6IEZvcmtSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lcyA9IGN0eC5jaGlsZHJlbi5qb2luKCcsICcpO1xuICAgIHJldHVybiBgW1BhcmFsbGVsXTogRm9ya2luZyBpbnRvICR7Y3R4LmNoaWxkcmVuLmxlbmd0aH0gcGFyYWxsZWwgcGF0aHM6ICR7bmFtZXN9LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJTZWxlY3RlZChjdHg6IFNlbGVjdGVkUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgaWYgKGN0eC5ldmlkZW5jZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGV2aWRlbmNlID0gY3R4LmV2aWRlbmNlIGFzIGFueTtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBldmlkZW5jZS5ydWxlcz8uZmlsdGVyKChyOiBhbnkpID0+IHIubWF0Y2hlZCkgPz8gW107XG4gICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWQubWFwKChyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSByLmxhYmVsID8gYCBcIiR7ci5sYWJlbH1cImAgOiAnJztcbiAgICAgICAgaWYgKHIudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBjb25kcyA9IHIuY29uZGl0aW9uc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKGM6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBgJHtjLmtleX0gJHtjLmFjdHVhbFN1bW1hcnl9ICR7Yy5vcH0gJHtKU09OLnN0cmluZ2lmeShjLnRocmVzaG9sZCl9ICR7Yy5yZXN1bHQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgIHJldHVybiBgJHtyLmJyYW5jaH0ke2xhYmVsfSAoJHtjb25kc30pYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dHMgPSByLmlucHV0cy5tYXAoKGk6IGFueSkgPT4gYCR7aS5rZXl9PSR7aS52YWx1ZVN1bW1hcnl9YCkuam9pbignLCAnKTtcbiAgICAgICAgcmV0dXJuIGAke3IuYnJhbmNofSR7bGFiZWx9ICgke2lucHV0c30pYDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGBbU2VsZWN0ZWRdOiAke2N0eC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7Y3R4LnRvdGFsfSBwYXRocyBzZWxlY3RlZDogJHtwYXJ0cy5qb2luKCc7ICcpfS5gO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IGN0eC5zZWxlY3RlZC5qb2luKCcsICcpO1xuICAgIHJldHVybiBgW1NlbGVjdGVkXTogJHtjdHguc2VsZWN0ZWQubGVuZ3RofSBvZiAke2N0eC50b3RhbH0gcGF0aHMgc2VsZWN0ZWQgZm9yIGV4ZWN1dGlvbjogJHtuYW1lc30uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09ICdleGl0Jykge1xuICAgICAgcmV0dXJuIGBFeGl0aW5nIHRoZSAke2N0eC5uYW1lfSBzdWJmbG93LmA7XG4gICAgfVxuICAgIHJldHVybiBjdHguZGVzY3JpcHRpb24gPyBgRW50ZXJpbmcgJHtjdHgubmFtZX06ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYEVudGVyaW5nIHRoZSAke2N0eC5uYW1lfSBzdWJmbG93LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJMb29wKGN0eDogTG9vcFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIHJldHVybiBjdHguZGVzY3JpcHRpb25cbiAgICAgID8gYE9uIHBhc3MgJHtjdHguaXRlcmF0aW9ufTogJHtjdHguZGVzY3JpcHRpb259IGFnYWluLmBcbiAgICAgIDogYE9uIHBhc3MgJHtjdHguaXRlcmF0aW9ufSB0aHJvdWdoICR7Y3R4LnRhcmdldH0uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckJyZWFrKGN0eDogQnJlYWtSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEV4ZWN1dGlvbiBzdG9wcGVkIGF0ICR7Y3R4LnN0YWdlTmFtZX0uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckVycm9yKGN0eDogRXJyb3JSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBsZXQgdGV4dCA9IGBBbiBlcnJvciBvY2N1cnJlZCBhdCAke2N0eC5zdGFnZU5hbWV9OiAke2N0eC5tZXNzYWdlfS5gO1xuICAgIGlmIChjdHgudmFsaWRhdGlvbklzc3Vlcykge1xuICAgICAgdGV4dCArPSBgIFZhbGlkYXRpb24gaXNzdWVzOiAke2N0eC52YWxpZGF0aW9uSXNzdWVzfS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFtFcnJvcl06ICR7dGV4dH1gO1xuICB9XG59XG4iXX0=
|
|
@@ -33,10 +33,10 @@ class FlowRecorderDispatcher {
|
|
|
33
33
|
return this.recorders.find((r) => r.id === id);
|
|
34
34
|
}
|
|
35
35
|
// ── IControlFlowNarrative implementation ──────────────────────────────────
|
|
36
|
-
onStageExecuted(stageName, description, traversalContext) {
|
|
36
|
+
onStageExecuted(stageName, description, traversalContext, stageType) {
|
|
37
37
|
if (this.recorders.length === 0)
|
|
38
38
|
return;
|
|
39
|
-
const event = { stageName, description, traversalContext };
|
|
39
|
+
const event = { stageName, description, traversalContext, stageType };
|
|
40
40
|
for (const r of this.recorders) {
|
|
41
41
|
try {
|
|
42
42
|
r.onStageExecuted?.(event);
|
|
@@ -267,4 +267,4 @@ class FlowRecorderDispatcher {
|
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
exports.FlowRecorderDispatcher = FlowRecorderDispatcher;
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9GbG93UmVjb3JkZXJEaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFHSCxxRUFBMEQ7QUFDMUQseURBQTBEO0FBSTFELE1BQWEsc0JBQXNCO0lBQ3pCLFNBQVMsR0FBbUIsRUFBRSxDQUFDO0lBRXZDLHNGQUFzRjtJQUN0RixNQUFNLENBQUMsUUFBc0I7UUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxNQUFNLENBQUMsRUFBVTtRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxpQkFBaUI7UUFDZixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxlQUFlLENBQXdDLEVBQVU7UUFDL0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQWtCLENBQUM7SUFDbEUsQ0FBQztJQUVELDZFQUE2RTtJQUU3RSxlQUFlLENBQUMsU0FBaUIsRUFBRSxXQUFvQixFQUFFLGdCQUFtQztRQUMxRixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxn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QUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQXdCLFdBQVcsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFsUkQsd0RBa1JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIOKAlCBGYW5zIG91dCBjb250cm9sIGZsb3cgZXZlbnRzIHRvIE4gYXR0YWNoZWQgRmxvd1JlY29yZGVycy5cbiAqXG4gKiBJbXBsZW1lbnRzIElDb250cm9sRmxvd05hcnJhdGl2ZSBzbyBpdCBjYW4gcmVwbGFjZSB0aGUgc2luZ2xlXG4gKiBDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciBpbiB0aGUgdHJhdmVyc2VyJ3MgSGFuZGxlckRlcHMuXG4gKlxuICogRGVzaWduIG1pcnJvcnMgU2NvcGVGYWNhZGUuX2ludm9rZUhvb2s6IGl0ZXJhdGUgcmVjb3JkZXJzLCBjYWxsIG9wdGlvbmFsXG4gKiBob29rcywgc3dhbGxvdyBlcnJvcnMgc28gYSBmYWlsaW5nIHJlY29yZGVyIG5ldmVyIGJyZWFrcyBleGVjdXRpb24uXG4gKlxuICogV2hlbiBubyByZWNvcmRlcnMgYXJlIGF0dGFjaGVkLCBldmVyeSBtZXRob2QgaXMgYSBmYXN0IG5vLW9wIChlbXB0eSBhcnJheSBjaGVjaykuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi8uLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0JyZWFrRXZlbnQsIEZsb3dSZWNvcmRlciwgSUNvbnRyb2xGbG93TmFycmF0aXZlLCBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIGltcGxlbWVudHMgSUNvbnRyb2xGbG93TmFycmF0aXZlIHtcbiAgcHJpdmF0ZSByZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG5cbiAgLyoqIEF0dGFjaCBhIEZsb3dSZWNvcmRlci4gRHVwbGljYXRlIElEcyBhcmUgYWxsb3dlZCAoc2FtZSBhcyBzY29wZSBTY29wZVJlY29yZGVyKS4gKi9cbiAgYXR0YWNoKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmRlcnMgPSB0aGlzLnJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnJlY29yZGVyc107XG4gIH1cblxuICAvKiogRmluZCBhIHJlY29yZGVyIGJ5IElELiBVc2VmdWwgZm9yIHJldHJpZXZpbmcgYnVpbHQtaW4gcmVjb3JkZXJzIGxpa2UgTmFycmF0aXZlRmxvd1JlY29yZGVyLiAqL1xuICBnZXRSZWNvcmRlckJ5SWQ8VCBleHRlbmRzIEZsb3dSZWNvcmRlciA9IEZsb3dSZWNvcmRlcj4oaWQ6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZGVycy5maW5kKChyKSA9PiByLmlkID09PSBpZCkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJQ29udHJvbEZsb3dOYXJyYXRpdmUgaW1wbGVtZW50YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKHN0YWdlTmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IHN0YWdlTmFtZSwgZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25TdGFnZUV4ZWN1dGVkPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uU3RhZ2VFeGVjdXRlZDogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25OZXh0KGZyb21TdGFnZTogc3RyaW5nLCB0b1N0YWdlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgZnJvbTogZnJvbVN0YWdlLCB0bzogdG9TdGFnZSwgZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25OZXh0Py4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvbk5leHQ6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGVjaXNpb24oXG4gICAgZGVjaWRlck5hbWU6IHN0cmluZyxcbiAgICBjaG9zZW5CcmFuY2g6IHN0cmluZyxcbiAgICByYXRpb25hbGU/OiBzdHJpbmcsXG4gICAgZGVjaWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICAgIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZGVjaWRlcjogZGVjaWRlck5hbWUsXG4gICAgICBjaG9zZW46IGNob3NlbkJyYW5jaCxcbiAgICAgIHJhdGlvbmFsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWNpZGVyRGVzY3JpcHRpb24sXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgZXZpZGVuY2UsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25EZWNpc2lvbj8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvbkRlY2lzaW9uOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkZvcmsocGFyZW50U3RhZ2U6IHN0cmluZywgY2hpbGROYW1lczogc3RyaW5nW10sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBwYXJlbnQ6IHBhcmVudFN0YWdlLCBjaGlsZHJlbjogY2hpbGROYW1lcywgdHJhdmVyc2FsQ29udGV4dCB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vbkZvcms/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uRm9yazogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TZWxlY3RlZChcbiAgICBwYXJlbnRTdGFnZTogc3RyaW5nLFxuICAgIHNlbGVjdGVkTmFtZXM6IHN0cmluZ1tdLFxuICAgIHRvdGFsQ291bnQ6IG51bWJlcixcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBldmlkZW5jZT86IFNlbGVjdGlvbkV2aWRlbmNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IHBhcmVudDogcGFyZW50U3RhZ2UsIHNlbGVjdGVkOiBzZWxlY3RlZE5hbWVzLCB0b3RhbDogdG90YWxDb3VudCwgdHJhdmVyc2FsQ29udGV4dCwgZXZpZGVuY2UgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25TZWxlY3RlZD8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvblNlbGVjdGVkOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblN1YmZsb3dFbnRyeShcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIHN1YmZsb3dJZD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBtYXBwZWRJbnB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IG5hbWU6IHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIGRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCBtYXBwZWRJbnB1dCB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vblN1YmZsb3dFbnRyeT8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvblN1YmZsb3dFbnRyeTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TdWJmbG93RXhpdChcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIHN1YmZsb3dJZD86IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBvdXRwdXRTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IG5hbWU6IHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHRyYXZlcnNhbENvbnRleHQsIG91dHB1dFN0YXRlIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uU3ViZmxvd0V4aXQ/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25TdWJmbG93RXhpdDogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TdWJmbG93UmVnaXN0ZXJlZChzdWJmbG93SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgc3BlY1N0cnVjdHVyZT86IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IHN1YmZsb3dJZCwgbmFtZSwgZGVzY3JpcHRpb24sIHNwZWNTdHJ1Y3R1cmUgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25TdWJmbG93UmVnaXN0ZXJlZD8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvblN1YmZsb3dSZWdpc3RlcmVkOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkxvb3AodGFyZ2V0U3RhZ2U6IHN0cmluZywgaXRlcmF0aW9uOiBudW1iZXIsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgdGFyZ2V0OiB0YXJnZXRTdGFnZSwgaXRlcmF0aW9uLCBkZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vbkxvb3A/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uTG9vcDogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25CcmVhayhcbiAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICByZWFzb24/OiBzdHJpbmcsXG4gICAgcHJvcGFnYXRlZEZyb21TdWJmbG93Pzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQ6IEZsb3dCcmVha0V2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lLFxuICAgICAgLi4uKHRyYXZlcnNhbENvbnRleHQgJiYgeyB0cmF2ZXJzYWxDb250ZXh0IH0pLFxuICAgICAgLi4uKHJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIHsgcmVhc29uIH0pLFxuICAgICAgLi4uKHByb3BhZ2F0ZWRGcm9tU3ViZmxvdyAhPT0gdW5kZWZpbmVkICYmIHsgcHJvcGFnYXRlZEZyb21TdWJmbG93IH0pLFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uQnJlYWs/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25CcmVhazogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihzdGFnZU5hbWU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGVycm9yOiB1bmtub3duLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBzdHJ1Y3R1cmVkRXJyb3IgPSBleHRyYWN0RXJyb3JJbmZvKGVycm9yKTtcbiAgICBjb25zdCBldmVudCA9IHsgc3RhZ2VOYW1lLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vbkVycm9yPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uRXJyb3I6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUGF1c2UoXG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHBhdXNlRGF0YTogdW5rbm93bixcbiAgICBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgc3RhZ2VOYW1lLCBzdGFnZUlkLCBwYXVzZURhdGEsIHN1YmZsb3dQYXRoLCB0cmF2ZXJzYWxDb250ZXh0IH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uUGF1c2U/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25QYXVzZTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZXN1bWUoc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaGFzSW5wdXQ6IGJvb2xlYW4sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBzdGFnZU5hbWUsIHN0YWdlSWQsIGhhc0lucHV0LCB0cmF2ZXJzYWxDb250ZXh0IH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uUmVzdW1lPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uUmVzdW1lOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJ1blN0YXJ0KGlucHV0OiB1bmtub3duLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgcGF5bG9hZDogaW5wdXQsIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25SdW5TdGFydD8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvblJ1blN0YXJ0OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJ1bkVuZChvdXRwdXQ6IHVua25vd24sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBwYXlsb2FkOiBvdXRwdXQsIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25SdW5FbmQ/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25SdW5FbmQ6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNlbnRlbmNlcyBmcm9tIGFuIGF0dGFjaGVkIE5hcnJhdGl2ZUZsb3dSZWNvcmRlciAobG9va2VkIHVwIGJ5IElEKS5cbiAgICogQ2FsbGVycyB0aGF0IG5lZWQgc2VudGVuY2VzIHNob3VsZCBhdHRhY2ggYSBOYXJyYXRpdmVGbG93UmVjb3JkZXIgd2l0aCBpZCAnbmFycmF0aXZlJ1xuICAgKiBhbmQgcmV0cmlldmUgaXQgZGlyZWN0bHkgdmlhIGdldFJlY29yZGVyQnlJZCgpIGlmIHRoZXkgbmVlZCB0eXBlZCBhY2Nlc3MuXG4gICAqL1xuICBnZXRTZW50ZW5jZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5hcnJhdGl2ZSA9IHRoaXMuZ2V0UmVjb3JkZXJCeUlkPE5hcnJhdGl2ZUZsb3dSZWNvcmRlcj4oJ25hcnJhdGl2ZScpO1xuICAgIHJldHVybiBuYXJyYXRpdmU/LmdldFNlbnRlbmNlcygpID8/IFtdO1xuICB9XG59XG4iXX0=
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9GbG93UmVjb3JkZXJEaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFHSCxxRUFBMEQ7QUFDMUQseURBQTBEO0FBVzFELE1BQWEsc0JBQXNCO0lBQ3pCLFNBQVMsR0FBbUIsRUFBRSxDQUFDO0lBRXZDLHNGQUFzRjtJQUN0RixNQUFNLENBQUMsUUFBc0I7UUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxNQUFNLENBQUMsRUFBVTtRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxpQkFBaUI7UUFDZixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxlQUFlLENBQXdDLEVBQVU7UUFDL0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQWtCLENBQUM7SUFDbEUsQ0FBQztJQUVELDZFQUE2RTtJQUU3RSxlQUFlLENBQ2IsU0FBaUIsRUFDakIsV0FBK0IsRUFDL0IsZ0JBQThDLEVBQzlDLFNBQW9CO1FBRXBCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDeEMsTUFBTSxLQUFLLEdBQW1CLEVBQUUsU0FBUyxF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LENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVk7UUFDVixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUF3QixXQUFXLENBQUMsQ0FBQztRQUMzRSxPQUFPLFNBQVMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBdlJELHdEQXVSQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciDigJQgRmFucyBvdXQgY29udHJvbCBmbG93IGV2ZW50cyB0byBOIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMuXG4gKlxuICogSW1wbGVtZW50cyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgc28gaXQgY2FuIHJlcGxhY2UgdGhlIHNpbmdsZVxuICogQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgaW4gdGhlIHRyYXZlcnNlcidzIEhhbmRsZXJEZXBzLlxuICpcbiAqIERlc2lnbiBtaXJyb3JzIFNjb3BlRmFjYWRlLl9pbnZva2VIb29rOiBpdGVyYXRlIHJlY29yZGVycywgY2FsbCBvcHRpb25hbFxuICogaG9va3MsIHN3YWxsb3cgZXJyb3JzIHNvIGEgZmFpbGluZyByZWNvcmRlciBuZXZlciBicmVha3MgZXhlY3V0aW9uLlxuICpcbiAqIFdoZW4gbm8gcmVjb3JkZXJzIGFyZSBhdHRhY2hlZCwgZXZlcnkgbWV0aG9kIGlzIGEgZmFzdCBuby1vcCAoZW1wdHkgYXJyYXkgY2hlY2spLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVjaXNpb25FdmlkZW5jZSwgU2VsZWN0aW9uRXZpZGVuY2UgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvZGV0ZWN0Q2lyY3VsYXIuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL05hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBJQ29udHJvbEZsb3dOYXJyYXRpdmUsXG4gIFN0YWdlVHlwZSxcbiAgVHJhdmVyc2FsQ29udGV4dCxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIGltcGxlbWVudHMgSUNvbnRyb2xGbG93TmFycmF0aXZlIHtcbiAgcHJpdmF0ZSByZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG5cbiAgLyoqIEF0dGFjaCBhIEZsb3dSZWNvcmRlci4gRHVwbGljYXRlIElEcyBhcmUgYWxsb3dlZCAoc2FtZSBhcyBzY29wZSBTY29wZVJlY29yZGVyKS4gKi9cbiAgYXR0YWNoKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmRlcnMgPSB0aGlzLnJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnJlY29yZGVyc107XG4gIH1cblxuICAvKiogRmluZCBhIHJlY29yZGVyIGJ5IElELiBVc2VmdWwgZm9yIHJldHJpZXZpbmcgYnVpbHQtaW4gcmVjb3JkZXJzIGxpa2UgTmFycmF0aXZlRmxvd1JlY29yZGVyLiAqL1xuICBnZXRSZWNvcmRlckJ5SWQ8VCBleHRlbmRzIEZsb3dSZWNvcmRlciA9IEZsb3dSZWNvcmRlcj4oaWQ6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZGVycy5maW5kKChyKSA9PiByLmlkID09PSBpZCkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJQ29udHJvbEZsb3dOYXJyYXRpdmUgaW1wbGVtZW50YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKFxuICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dDogVHJhdmVyc2FsQ29udGV4dCB8IHVuZGVmaW5lZCxcbiAgICBzdGFnZVR5cGU6IFN0YWdlVHlwZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50OiBGbG93U3RhZ2VFdmVudCA9IHsgc3RhZ2VOYW1lLCBkZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgc3RhZ2VUeXBlIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uU3RhZ2VFeGVjdXRlZD8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvblN0YWdlRXhlY3V0ZWQ6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uTmV4dChmcm9tU3RhZ2U6IHN0cmluZywgdG9TdGFnZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IGZyb206IGZyb21TdGFnZSwgdG86IHRvU3RhZ2UsIGRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0IH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uTmV4dD8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25OZXh0OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRlY2lzaW9uKFxuICAgIGRlY2lkZXJOYW1lOiBzdHJpbmcsXG4gICAgY2hvc2VuQnJhbmNoOiBzdHJpbmcsXG4gICAgcmF0aW9uYWxlPzogc3RyaW5nLFxuICAgIGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBldmlkZW5jZT86IERlY2lzaW9uRXZpZGVuY2UsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGRlY2lkZXI6IGRlY2lkZXJOYW1lLFxuICAgICAgY2hvc2VuOiBjaG9zZW5CcmFuY2gsXG4gICAgICByYXRpb25hbGUsXG4gICAgICBkZXNjcmlwdGlvbjogZGVjaWRlckRlc2NyaXB0aW9uLFxuICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIGV2aWRlbmNlLFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uRGVjaXNpb24/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25EZWNpc2lvbjogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Gb3JrKHBhcmVudFN0YWdlOiBzdHJpbmcsIGNoaWxkTmFtZXM6IHN0cmluZ1tdLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgcGFyZW50OiBwYXJlbnRTdGFnZSwgY2hpbGRyZW46IGNoaWxkTmFtZXMsIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25Gb3JrPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvbkZvcms6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU2VsZWN0ZWQoXG4gICAgcGFyZW50U3RhZ2U6IHN0cmluZyxcbiAgICBzZWxlY3RlZE5hbWVzOiBzdHJpbmdbXSxcbiAgICB0b3RhbENvdW50OiBudW1iZXIsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgZXZpZGVuY2U/OiBTZWxlY3Rpb25FdmlkZW5jZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBwYXJlbnQ6IHBhcmVudFN0YWdlLCBzZWxlY3RlZDogc2VsZWN0ZWROYW1lcywgdG90YWw6IHRvdGFsQ291bnQsIHRyYXZlcnNhbENvbnRleHQsIGV2aWRlbmNlIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uU2VsZWN0ZWQ/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25TZWxlY3RlZDogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TdWJmbG93RW50cnkoXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICBzdWJmbG93SWQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgbWFwcGVkSW5wdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBuYW1lOiBzdWJmbG93TmFtZSwgc3ViZmxvd0lkLCBkZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgbWFwcGVkSW5wdXQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25TdWJmbG93RW50cnk/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25TdWJmbG93RW50cnk6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICBzdWJmbG93SWQ/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgb3V0cHV0U3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBuYW1lOiBzdWJmbG93TmFtZSwgc3ViZmxvd0lkLCB0cmF2ZXJzYWxDb250ZXh0LCBvdXRwdXRTdGF0ZSB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vblN1YmZsb3dFeGl0Py4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uU3ViZmxvd0V4aXQ6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQoc3ViZmxvd0lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcsIHNwZWNTdHJ1Y3R1cmU/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0geyBzdWJmbG93SWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBzcGVjU3RydWN0dXJlIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uU3ViZmxvd1JlZ2lzdGVyZWQ/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25TdWJmbG93UmVnaXN0ZXJlZDogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Mb29wKHRhcmdldFN0YWdlOiBzdHJpbmcsIGl0ZXJhdGlvbjogbnVtYmVyLCBkZXNjcmlwdGlvbj86IHN0cmluZywgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IHRhcmdldDogdGFyZ2V0U3RhZ2UsIGl0ZXJhdGlvbiwgZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25Mb29wPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvbkxvb3A6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQnJlYWsoXG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgcmVhc29uPzogc3RyaW5nLFxuICAgIHByb3BhZ2F0ZWRGcm9tU3ViZmxvdz86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50OiBGbG93QnJlYWtFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIC4uLih0cmF2ZXJzYWxDb250ZXh0ICYmIHsgdHJhdmVyc2FsQ29udGV4dCB9KSxcbiAgICAgIC4uLihyZWFzb24gIT09IHVuZGVmaW5lZCAmJiB7IHJlYXNvbiB9KSxcbiAgICAgIC4uLihwcm9wYWdhdGVkRnJvbVN1YmZsb3cgIT09IHVuZGVmaW5lZCAmJiB7IHByb3BhZ2F0ZWRGcm9tU3ViZmxvdyB9KSxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vbkJyZWFrPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uQnJlYWs6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3Ioc3RhZ2VOYW1lOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogc3RyaW5nLCBlcnJvcjogdW5rbm93biwgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3Qgc3RydWN0dXJlZEVycm9yID0gZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gICAgY29uc3QgZXZlbnQgPSB7IHN0YWdlTmFtZSwgbWVzc2FnZTogZXJyb3JNZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3IsIHRyYXZlcnNhbENvbnRleHQgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHIub25FcnJvcj8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvbkVycm9yOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblBhdXNlKFxuICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBwYXVzZURhdGE6IHVua25vd24sXG4gICAgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IHN0YWdlTmFtZSwgc3RhZ2VJZCwgcGF1c2VEYXRhLCBzdWJmbG93UGF0aCwgdHJhdmVyc2FsQ29udGV4dCB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vblBhdXNlPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uUGF1c2U6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUmVzdW1lKHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGhhc0lucHV0OiBib29sZWFuLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgc3RhZ2VOYW1lLCBzdGFnZUlkLCBoYXNJbnB1dCwgdHJhdmVyc2FsQ29udGV4dCB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlY29yZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgci5vblJlc3VtZT8uKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbZm9vdHByaW50XSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyOiByZWNvcmRlciBcIiR7ci5pZH1cIiB0aHJldyBpbiBvblJlc3VtZTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SdW5TdGFydChpbnB1dDogdW5rbm93biwgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSB7IHBheWxvYWQ6IGlucHV0LCB0cmF2ZXJzYWxDb250ZXh0IH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uUnVuU3RhcnQ/LihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKVxuICAgICAgICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gRmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogcmVjb3JkZXIgXCIke3IuaWR9XCIgdGhyZXcgaW4gb25SdW5TdGFydDogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SdW5FbmQob3V0cHV0OiB1bmtub3duLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IHsgcGF5bG9hZDogb3V0cHV0LCB0cmF2ZXJzYWxDb250ZXh0IH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVjb3JkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByLm9uUnVuRW5kPy4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdIEZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IHJlY29yZGVyIFwiJHtyLmlkfVwiIHRocmV3IGluIG9uUnVuRW5kOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzZW50ZW5jZXMgZnJvbSBhbiBhdHRhY2hlZCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgKGxvb2tlZCB1cCBieSBJRCkuXG4gICAqIENhbGxlcnMgdGhhdCBuZWVkIHNlbnRlbmNlcyBzaG91bGQgYXR0YWNoIGEgTmFycmF0aXZlRmxvd1JlY29yZGVyIHdpdGggaWQgJ25hcnJhdGl2ZSdcbiAgICogYW5kIHJldHJpZXZlIGl0IGRpcmVjdGx5IHZpYSBnZXRSZWNvcmRlckJ5SWQoKSBpZiB0aGV5IG5lZWQgdHlwZWQgYWNjZXNzLlxuICAgKi9cbiAgZ2V0U2VudGVuY2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYXJyYXRpdmUgPSB0aGlzLmdldFJlY29yZGVyQnlJZDxOYXJyYXRpdmVGbG93UmVjb3JkZXI+KCduYXJyYXRpdmUnKTtcbiAgICByZXR1cm4gbmFycmF0aXZlPy5nZXRTZW50ZW5jZXMoKSA/PyBbXTtcbiAgfVxufVxuIl19
|