footprintjs 9.35.0 → 9.37.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 +4 -4
- package/dist/advanced.js +2 -2
- package/dist/esm/advanced.d.ts +2 -2
- package/dist/esm/advanced.js +2 -2
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +5 -34
- package/dist/esm/lib/builder/FlowChartBuilder.js +236 -375
- package/dist/esm/lib/engine/graph/prefixNodeTree.d.ts +26 -0
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +40 -0
- package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
- package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +11 -2
- package/dist/esm/lib/engine/handlers/StageRunner.js +17 -3
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +3 -32
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
- package/dist/esm/lib/engine/narrative/types.d.ts +26 -10
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +68 -86
- package/dist/esm/lib/engine/traversalContext.d.ts +65 -0
- package/dist/esm/lib/engine/traversalContext.js +83 -0
- package/dist/esm/lib/engine/types.d.ts +1 -3
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +3 -2
- package/dist/esm/lib/ids/branchSegment.js +119 -0
- package/dist/esm/lib/ids/runtimeStageId.d.ts +191 -0
- package/dist/esm/lib/ids/runtimeStageId.js +225 -0
- package/dist/esm/lib/memory/StageContext.d.ts +1 -17
- package/dist/esm/lib/memory/StageContext.js +2 -37
- package/dist/esm/lib/memory/commitLogUtils.js +1 -1
- package/dist/esm/lib/memory/logModel.js +1 -1
- package/dist/esm/lib/memory/runPolicy.d.ts +2 -3
- package/dist/esm/lib/memory/runPolicy.js +3 -4
- package/dist/esm/lib/memory/verbs.d.ts +2 -1
- package/dist/esm/lib/memory/verbs.js +1 -1
- package/dist/esm/lib/pause/index.d.ts +1 -1
- package/dist/esm/lib/pause/index.js +1 -1
- package/dist/esm/lib/pause/types.d.ts +48 -1
- package/dist/esm/lib/pause/types.js +52 -3
- package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
- package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
- package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
- package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +3 -2
- package/dist/esm/lib/recorder/hooks.d.ts +249 -0
- package/dist/esm/lib/recorder/hooks.js +132 -0
- package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
- package/dist/esm/lib/recorder/snapshot.js +26 -0
- package/dist/esm/lib/runner/DeferredObserverTier.js +15 -25
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -18
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -37
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -8
- package/dist/esm/lib/runner/FlowChartExecutor.js +59 -32
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +6 -5
- package/dist/esm/lib/scope/ScopeFacade.d.ts +6 -1
- package/dist/esm/lib/scope/ScopeFacade.js +36 -61
- package/dist/esm/lib/scope/types.d.ts +3 -9
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/time-travel/chain.js +2 -2
- package/dist/esm/lib/time-travel/commitStops.js +4 -4
- package/dist/esm/lib/time-travel/index.d.ts +1 -1
- package/dist/esm/lib/time-travel/index.js +2 -2
- package/dist/esm/lib/time-travel/timeTravel.js +8 -9
- package/dist/esm/lib/time-travel/types.d.ts +1 -1
- package/dist/esm/lib/time-travel/types.js +2 -2
- package/dist/esm/trace.d.ts +3 -3
- package/dist/esm/trace.js +3 -3
- package/dist/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +236 -375
- package/dist/lib/engine/graph/prefixNodeTree.js +44 -0
- package/dist/lib/engine/handlers/ParallelForEachHandler.js +3 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +10 -1
- package/dist/lib/engine/handlers/StageRunner.js +17 -3
- package/dist/lib/engine/handlers/SubflowExecutor.js +3 -32
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +68 -86
- package/dist/lib/engine/traversalContext.js +89 -0
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -2
- package/dist/lib/ids/branchSegment.js +127 -0
- package/dist/lib/ids/runtimeStageId.js +242 -0
- package/dist/lib/memory/StageContext.js +1 -36
- package/dist/lib/memory/commitLogUtils.js +1 -1
- package/dist/lib/memory/logModel.js +1 -1
- package/dist/lib/memory/runPolicy.js +3 -4
- package/dist/lib/memory/verbs.js +1 -1
- package/dist/lib/pause/index.js +1 -1
- package/dist/lib/pause/types.js +54 -4
- package/dist/lib/recorder/CombinedRecorder.js +11 -63
- package/dist/lib/recorder/CompositeRecorder.js +33 -97
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -2
- package/dist/lib/recorder/hooks.js +140 -0
- package/dist/lib/recorder/snapshot.js +30 -0
- package/dist/lib/runner/DeferredObserverTier.js +16 -26
- package/dist/lib/runner/ExecutionRuntime.js +1 -36
- package/dist/lib/runner/FlowChartExecutor.js +58 -31
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +36 -61
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/time-travel/chain.js +2 -2
- package/dist/lib/time-travel/commitStops.js +4 -4
- package/dist/lib/time-travel/index.js +2 -2
- package/dist/lib/time-travel/timeTravel.js +8 -9
- package/dist/lib/time-travel/types.js +2 -2
- package/dist/trace.js +3 -3
- package/dist/types/advanced.d.ts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +5 -34
- package/dist/types/lib/engine/graph/prefixNodeTree.d.ts +26 -0
- package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/types/lib/engine/narrative/types.d.ts +26 -10
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
- package/dist/types/lib/engine/traversalContext.d.ts +65 -0
- package/dist/types/lib/engine/types.d.ts +1 -3
- package/dist/types/lib/ids/runtimeStageId.d.ts +191 -0
- package/dist/types/lib/memory/StageContext.d.ts +1 -17
- package/dist/types/lib/memory/runPolicy.d.ts +2 -3
- package/dist/types/lib/memory/verbs.d.ts +2 -1
- package/dist/types/lib/pause/index.d.ts +1 -1
- package/dist/types/lib/pause/types.d.ts +48 -1
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
- package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
- package/dist/types/lib/recorder/hooks.d.ts +249 -0
- package/dist/types/lib/recorder/snapshot.d.ts +19 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -18
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -8
- package/dist/types/lib/scope/ScopeFacade.d.ts +6 -1
- package/dist/types/lib/scope/types.d.ts +3 -9
- package/dist/types/lib/time-travel/index.d.ts +1 -1
- package/dist/types/lib/time-travel/types.d.ts +1 -1
- package/dist/types/trace.d.ts +3 -3
- package/package.json +1 -1
- package/dist/esm/lib/engine/branchSegment.js +0 -119
- package/dist/esm/lib/engine/runtimeStageId.d.ts +0 -103
- package/dist/esm/lib/engine/runtimeStageId.js +0 -119
- package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
- package/dist/esm/lib/recorder/invokeHook.js +0 -9
- package/dist/lib/engine/branchSegment.js +0 -127
- package/dist/lib/engine/runtimeStageId.js +0 -126
- package/dist/lib/recorder/invokeHook.js +0 -13
- package/dist/types/lib/engine/runtimeStageId.d.ts +0 -103
- package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
- /package/dist/esm/lib/{engine → ids}/branchSegment.d.ts +0 -0
- /package/dist/types/lib/{engine → ids}/branchSegment.d.ts +0 -0
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* it belongs in the runner layer (Phase 5).
|
|
13
13
|
*/
|
|
14
14
|
import { isDevMode } from '../devMode.js';
|
|
15
|
-
import {
|
|
15
|
+
import { prefixNodeTree } from '../engine/graph/prefixNodeTree.js';
|
|
16
|
+
import { BRANCH_SEGMENT_MARKER, hasBranchSegmentMarker } from '../ids/branchSegment.js';
|
|
17
|
+
import { joinPath, refuseReservedId } from '../ids/runtimeStageId.js';
|
|
16
18
|
import { makeRunnable } from '../runner/RunnableChart.js';
|
|
17
19
|
import { StructureRecorderDispatcher } from './structure/StructureRecorderDispatcher.js';
|
|
18
20
|
import { createTypedScopeFactory } from './typedFlowChart.js';
|
|
@@ -100,7 +102,28 @@ function applyTags(node, spec, tags, where) {
|
|
|
100
102
|
spec.tags = [...tags];
|
|
101
103
|
}
|
|
102
104
|
/**
|
|
103
|
-
*
|
|
105
|
+
* The builder's ONE id refusal (F7, R5): every id door calls it once, before
|
|
106
|
+
* the id lands anywhere. The rule lives with the grammar —
|
|
107
|
+
* `ids/runtimeStageId.ts · refuseReservedId`: `#` and `/` are refused in
|
|
108
|
+
* every id (they are the runtimeStageId grammar's delimiters), `~` in a
|
|
109
|
+
* `'segment'` id (a subflow id or a `parallelForEach` id — see below).
|
|
110
|
+
*
|
|
111
|
+
* Doors (one call each): `start`, `startSelector`, `addFunction`,
|
|
112
|
+
* `addStreamingFunction`, `addPausableFunction`, `addDeciderFunction`,
|
|
113
|
+
* `addSelectorFunction`, `addListOfFunction` (each child), `addParallelForEach`,
|
|
114
|
+
* every subflow mount (`assertSubflowIdAllowed`) and every decider/selector
|
|
115
|
+
* branch (`BranchCursor · admit`). `addDetachAndForget` /
|
|
116
|
+
* `addDetachAndJoinLater` and `addBranchList` delegate to one of these.
|
|
117
|
+
* Never called by the prefixer or a store — those hold ids that carry the
|
|
118
|
+
* delimiters on purpose.
|
|
119
|
+
*/
|
|
120
|
+
const admitId = (what, id, position) => {
|
|
121
|
+
const refusal = refuseReservedId(what, id, position);
|
|
122
|
+
if (refusal !== undefined)
|
|
123
|
+
fail(refusal);
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Refuse the reserved characters in a user-authored SUBFLOW id.
|
|
104
127
|
*
|
|
105
128
|
* A subflow id IS a path segment in `runtimeStageId`, which is the same
|
|
106
129
|
* position `addParallelForEach` generates its branch segments into. A
|
|
@@ -112,51 +135,65 @@ function applyTags(node, spec, tags, where) {
|
|
|
112
135
|
* 9.14.0 and does not use the marker behaves byte-identically.
|
|
113
136
|
*
|
|
114
137
|
* Called at every user-authored subflow-id entry point. Stage ids elsewhere
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* (`addParallelForEach`'s own id is the one
|
|
118
|
-
* Design: docs/design/execution-control.md.
|
|
138
|
+
* keep `~` (they occupy the `stageId` position, never the `subflowPath`
|
|
139
|
+
* position, so they cannot collide with a segment) but, since 9.37.0, not `#`
|
|
140
|
+
* or `/` — see `admitId`. (`addParallelForEach`'s own id is the one other
|
|
141
|
+
* `'segment'` id, refused at that method.) Design: docs/design/execution-control.md.
|
|
119
142
|
*/
|
|
120
|
-
const assertSubflowIdAllowed = (id) =>
|
|
121
|
-
if (hasBranchSegmentMarker(id))
|
|
122
|
-
fail(branchSegmentReservationMessage('subflow id', id));
|
|
123
|
-
};
|
|
124
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
125
|
-
// DeciderList
|
|
126
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
143
|
+
const assertSubflowIdAllowed = (id) => admitId('subflow id', id, 'segment');
|
|
127
144
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
145
|
+
* The branch-adding mechanics of a decider or a selector — ONE implementation,
|
|
146
|
+
* composed by {@link DeciderList} and {@link SelectorFnList} (until 9.36.0 each
|
|
147
|
+
* list carried its own copy of all four branch kinds and `end()`).
|
|
148
|
+
*
|
|
149
|
+
* Owns: the branch-id ledger (duplicate + reserved-character refusal in one
|
|
150
|
+
* `admit`), the node/spec pair each branch kind builds, the structure events,
|
|
151
|
+
* and the closing `finish`. The lists keep only what differs: a decider's
|
|
152
|
+
* `{ loopTo }` / `loopTo()` / `setDefault`, and the type each method returns.
|
|
130
153
|
*/
|
|
131
|
-
|
|
154
|
+
class BranchCursor {
|
|
155
|
+
kind;
|
|
132
156
|
b;
|
|
133
157
|
curNode;
|
|
134
158
|
curSpec;
|
|
135
|
-
branchIds = new Set();
|
|
136
|
-
defaultId;
|
|
137
159
|
parentDescriptionParts;
|
|
138
160
|
parentStageDescriptions;
|
|
139
161
|
reservedStepNumber;
|
|
140
|
-
|
|
162
|
+
description;
|
|
163
|
+
branchIds = new Set();
|
|
141
164
|
branchDescInfo = [];
|
|
142
|
-
constructor(
|
|
143
|
-
this.
|
|
165
|
+
constructor(kind, b, curNode, curSpec, parentDescriptionParts, parentStageDescriptions, reservedStepNumber, description) {
|
|
166
|
+
this.kind = kind;
|
|
167
|
+
this.b = b;
|
|
144
168
|
this.curNode = curNode;
|
|
145
169
|
this.curSpec = curSpec;
|
|
146
170
|
this.parentDescriptionParts = parentDescriptionParts;
|
|
147
171
|
this.parentStageDescriptions = parentStageDescriptions;
|
|
148
172
|
this.reservedStepNumber = reservedStepNumber;
|
|
149
|
-
this.
|
|
173
|
+
this.description = description;
|
|
150
174
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
* stage — the loop is SOURCED FROM THIS BRANCH (not the decider).
|
|
154
|
-
* `{ retry }` gives THIS BRANCH's stage a declarative retry policy;
|
|
155
|
-
* `{ tags }` puts declared tags on it (see `FlowChartBuilder.tag`). */
|
|
156
|
-
options) {
|
|
175
|
+
/** The one branch-id door: duplicate refusal, then the reserved characters (R5). */
|
|
176
|
+
admit(id, position) {
|
|
157
177
|
if (this.branchIds.has(id))
|
|
158
|
-
fail(`duplicate
|
|
178
|
+
fail(`duplicate ${this.kind} branch id '${id}' under '${this.curNode.name}'`);
|
|
179
|
+
if (position === 'segment')
|
|
180
|
+
assertSubflowIdAllowed(id);
|
|
181
|
+
else
|
|
182
|
+
admitId('branch id', id, 'stage');
|
|
159
183
|
this.branchIds.add(id);
|
|
184
|
+
}
|
|
185
|
+
/** Append the branch's node + spec and fire its stage and decision-branch edge. */
|
|
186
|
+
attach(node, spec, id) {
|
|
187
|
+
this.curNode.children = this.curNode.children || [];
|
|
188
|
+
this.curNode.children.push(node);
|
|
189
|
+
this.curSpec.children = this.curSpec.children || [];
|
|
190
|
+
this.curSpec.children.push(spec);
|
|
191
|
+
// L7.3 — branch: stage + decision-branch edge keyed by id.
|
|
192
|
+
this.b._fireStageAddedFromSubBuilder(spec);
|
|
193
|
+
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
194
|
+
}
|
|
195
|
+
functionBranch(id, name, fn, description, options) {
|
|
196
|
+
this.admit(id, 'stage');
|
|
160
197
|
const node = { name: name ?? id, id, branchId: id };
|
|
161
198
|
if (description)
|
|
162
199
|
node.description = description;
|
|
@@ -169,36 +206,12 @@ export class DeciderList {
|
|
|
169
206
|
spec.description = description;
|
|
170
207
|
applyRetryPolicy(node, spec, options?.retry, `addFunctionBranch('${id}')`);
|
|
171
208
|
applyTags(node, spec, options?.tags, `addFunctionBranch('${id}')`);
|
|
172
|
-
this.
|
|
173
|
-
this.curNode.children.push(node);
|
|
174
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
175
|
-
this.curSpec.children.push(spec);
|
|
176
|
-
// L7.3 — Decider branch: stage + decision-branch edge keyed by id.
|
|
177
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
178
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
209
|
+
this.attach(node, spec, id);
|
|
179
210
|
this.branchDescInfo.push({ id, description });
|
|
180
|
-
|
|
181
|
-
this._applyBranchLoop(node, spec, options.loopTo);
|
|
182
|
-
return this;
|
|
211
|
+
return { node, spec };
|
|
183
212
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
*
|
|
187
|
-
* When this branch is chosen, the handler's `execute` runs. If it returns
|
|
188
|
-
* data, the pipeline pauses. On resume, `handler.resume` runs with the
|
|
189
|
-
* human's input. If `execute` returns void, the stage continues normally
|
|
190
|
-
* (conditional pause).
|
|
191
|
-
*/
|
|
192
|
-
addPausableFunctionBranch(id, name, handler, description,
|
|
193
|
-
/** `{ loopTo }` declares this branch loops back to an already-declared
|
|
194
|
-
* stage — the loop is SOURCED FROM THIS BRANCH (not the decider).
|
|
195
|
-
* `{ retry }` gives THIS BRANCH's `execute` half a retry policy (the
|
|
196
|
-
* `resume` half runs without it — a different function, a different
|
|
197
|
-
* contract); `{ tags }` puts declared tags on it. */
|
|
198
|
-
options) {
|
|
199
|
-
if (this.branchIds.has(id))
|
|
200
|
-
fail(`duplicate decider branch id '${id}' under '${this.curNode.name}'`);
|
|
201
|
-
this.branchIds.add(id);
|
|
213
|
+
pausableBranch(id, name, handler, description, options) {
|
|
214
|
+
this.admit(id, 'stage');
|
|
202
215
|
const node = {
|
|
203
216
|
name: name ?? id,
|
|
204
217
|
id,
|
|
@@ -215,23 +228,12 @@ export class DeciderList {
|
|
|
215
228
|
spec.description = description;
|
|
216
229
|
applyRetryPolicy(node, spec, options?.retry, `addPausableFunctionBranch('${id}')`);
|
|
217
230
|
applyTags(node, spec, options?.tags, `addPausableFunctionBranch('${id}')`);
|
|
218
|
-
this.
|
|
219
|
-
this.curNode.children.push(node);
|
|
220
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
221
|
-
this.curSpec.children.push(spec);
|
|
222
|
-
// L7.3 — Pausable decider branch.
|
|
223
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
224
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
231
|
+
this.attach(node, spec, id);
|
|
225
232
|
this.branchDescInfo.push({ id, description });
|
|
226
|
-
|
|
227
|
-
this._applyBranchLoop(node, spec, options.loopTo);
|
|
228
|
-
return this;
|
|
233
|
+
return { node, spec };
|
|
229
234
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
fail(`duplicate decider branch id '${id}' under '${this.curNode.name}'`);
|
|
233
|
-
assertSubflowIdAllowed(id);
|
|
234
|
-
this.branchIds.add(id);
|
|
235
|
+
subflowBranch(id, subflow, mountName, options) {
|
|
236
|
+
this.admit(id, 'segment');
|
|
235
237
|
const subflowName = mountName || id;
|
|
236
238
|
const prefixedRoot = this.b._prefixNodeTree(subflow.root, id);
|
|
237
239
|
this.b._registerSubflowDef(id, prefixedRoot);
|
|
@@ -254,30 +256,22 @@ export class DeciderList {
|
|
|
254
256
|
subflowName,
|
|
255
257
|
subflowStructure: subflow.buildTimeStructure,
|
|
256
258
|
};
|
|
257
|
-
// STRUCTURE-ONLY convergence override
|
|
258
|
-
//
|
|
259
|
-
// `
|
|
260
|
-
//
|
|
259
|
+
// STRUCTURE-ONLY convergence override (see `_fireNextEdgeFromParent` +
|
|
260
|
+
// `SubflowMountOptions.convergeAt`): this branch's convergence edge points at
|
|
261
|
+
// `convergeAt` (a DOWNSTREAM stage) instead of the shared next stage — e.g. a
|
|
262
|
+
// `tools` slot that bypasses `messageAPI` to pair with its output at
|
|
263
|
+
// `call-llm`. Visualization-only: NO runtime join barrier (data rides scope).
|
|
264
|
+
// Carried on the spec so the edge-firing chokepoint can read it.
|
|
261
265
|
if (options?.convergeAt)
|
|
262
266
|
spec.convergeAt = options.convergeAt;
|
|
263
267
|
applyTags(node, spec, options?.tags, `addSubFlowChartBranch('${id}')`);
|
|
264
|
-
this.
|
|
265
|
-
this.curNode.children.push(node);
|
|
266
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
267
|
-
this.curSpec.children.push(spec);
|
|
268
|
-
// L7.3 — Subflow as decider branch: stage + decision edge + mount.
|
|
269
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
270
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
268
|
+
this.attach(node, spec, id);
|
|
271
269
|
this.b._fireSubflowMountedFromSubBuilder(id, subflowName, id, false, subflow.buildTimeStructure);
|
|
272
270
|
this.b._mergeStageMap(subflow.stageMap, id);
|
|
273
271
|
this.b._mergeSubflows(subflow.subflows, id);
|
|
274
|
-
return this;
|
|
275
272
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
fail(`duplicate decider branch id '${id}' under '${this.curNode.name}'`);
|
|
279
|
-
assertSubflowIdAllowed(id);
|
|
280
|
-
this.branchIds.add(id);
|
|
273
|
+
lazySubflowBranch(id, resolver, mountName, options) {
|
|
274
|
+
this.admit(id, 'segment');
|
|
281
275
|
const subflowName = mountName || id;
|
|
282
276
|
// Store resolver on the node — NO eager tree cloning
|
|
283
277
|
const node = {
|
|
@@ -303,14 +297,130 @@ export class DeciderList {
|
|
|
303
297
|
isLazy: true,
|
|
304
298
|
};
|
|
305
299
|
applyTags(node, spec, options?.tags, `addLazySubFlowChartBranch('${id}')`);
|
|
306
|
-
this.
|
|
307
|
-
this.curNode.children.push(node);
|
|
308
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
309
|
-
this.curSpec.children.push(spec);
|
|
310
|
-
// L7.3 — Lazy subflow as decider branch.
|
|
311
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
312
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
300
|
+
this.attach(node, spec, id);
|
|
313
301
|
this.b._fireSubflowMountedFromSubBuilder(id, subflowName, id, true);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Close the dispatcher: validate the branches, flag the node, describe it,
|
|
305
|
+
* and fire `onDeciderComplete`. A decider passes its `setDefault` id (the
|
|
306
|
+
* synthetic `'default'` clone is appended AFTER `branchIds` is taken, so only
|
|
307
|
+
* user-specified branches are listed); a selector has no default.
|
|
308
|
+
*/
|
|
309
|
+
finish(defaultId) {
|
|
310
|
+
const kind = this.kind;
|
|
311
|
+
const children = this.curNode.children;
|
|
312
|
+
if (!children || children.length === 0) {
|
|
313
|
+
throw new Error(`[FlowChartBuilder] ${kind} at '${this.curNode.name}' requires at least one branch`);
|
|
314
|
+
}
|
|
315
|
+
// Validate that every branch with no embedded fn is resolvable from the stageMap
|
|
316
|
+
for (const child of children) {
|
|
317
|
+
if (!child.fn && child.id && !child.isSubflowRoot && !child.subflowResolver) {
|
|
318
|
+
const hasInMap = this.b._stageMapHas(child.id) || this.b._stageMapHas(child.name);
|
|
319
|
+
if (!hasInMap) {
|
|
320
|
+
throw new Error(`[FlowChartBuilder] ${kind} branch '${child.id}' under '${this.curNode.name}' has no function — ` +
|
|
321
|
+
`provide a fn argument to addFunctionBranch('${child.id}', ...)`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (kind === 'decider')
|
|
326
|
+
this.curNode.deciderFn = true;
|
|
327
|
+
else
|
|
328
|
+
this.curNode.selectorFn = true;
|
|
329
|
+
this.curSpec.branchIds = children
|
|
330
|
+
.map((c) => c.id)
|
|
331
|
+
.filter((id) => typeof id === 'string' && id.length > 0);
|
|
332
|
+
this.curSpec.type = kind;
|
|
333
|
+
if (kind === 'selector')
|
|
334
|
+
this.curSpec.hasSelector = true;
|
|
335
|
+
if (defaultId) {
|
|
336
|
+
const defaultChild = children.find((c) => c.id === defaultId);
|
|
337
|
+
if (defaultChild) {
|
|
338
|
+
children.push({ ...defaultChild, id: 'default', branchId: 'default' });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (this.reservedStepNumber > 0) {
|
|
342
|
+
const label = this.curNode.name;
|
|
343
|
+
const branchIdList = this.branchDescInfo.map((b) => b.id).join(', ');
|
|
344
|
+
const mainLine = kind === 'decider'
|
|
345
|
+
? this.description
|
|
346
|
+
? `${this.reservedStepNumber}. ${label} — ${this.description} (branches: ${branchIdList})`
|
|
347
|
+
: `${this.reservedStepNumber}. ${label} — Decides between: ${branchIdList}`
|
|
348
|
+
: this.description
|
|
349
|
+
? `${this.reservedStepNumber}. ${label} — ${this.description}`
|
|
350
|
+
: `${this.reservedStepNumber}. ${label} — Selects from: ${branchIdList}`;
|
|
351
|
+
this.parentDescriptionParts.push(mainLine);
|
|
352
|
+
if (this.description) {
|
|
353
|
+
this.parentStageDescriptions.set(this.curNode.name, this.description);
|
|
354
|
+
}
|
|
355
|
+
for (const branch of this.branchDescInfo) {
|
|
356
|
+
if (branch.description)
|
|
357
|
+
this.parentDescriptionParts.push(` → ${branch.id}: ${branch.description}`);
|
|
358
|
+
if (branch.description)
|
|
359
|
+
this.parentStageDescriptions.set(branch.id, branch.description);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// L7.3 — fire `onDeciderComplete` so consumers can trust no more
|
|
363
|
+
// branches will arrive. Branch iteration order = addition order = Set
|
|
364
|
+
// insertion order. Selectors have no default branch.
|
|
365
|
+
if (kind === 'decider') {
|
|
366
|
+
this.b._fireDeciderCompleteFromSubBuilder(this.curSpec.id, 'decider', [...this.branchIds], defaultId);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
this.b._fireDeciderCompleteFromSubBuilder(this.curSpec.id, 'selector', [...this.branchIds]);
|
|
370
|
+
}
|
|
371
|
+
return this.b;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
375
|
+
// DeciderList
|
|
376
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
377
|
+
/**
|
|
378
|
+
* Fluent helper returned by addDeciderFunction to add branches.
|
|
379
|
+
* `end()` sets `deciderFn = true` — the fn IS the decider.
|
|
380
|
+
*/
|
|
381
|
+
export class DeciderList {
|
|
382
|
+
cursor;
|
|
383
|
+
defaultId;
|
|
384
|
+
constructor(builder, curNode, curSpec, parentDescriptionParts = [], parentStageDescriptions = new Map(), reservedStepNumber = 0, deciderDescription) {
|
|
385
|
+
this.cursor = new BranchCursor('decider', builder, curNode, curSpec, parentDescriptionParts, parentStageDescriptions, reservedStepNumber, deciderDescription);
|
|
386
|
+
}
|
|
387
|
+
addFunctionBranch(id, name, fn, description,
|
|
388
|
+
/** `{ loopTo }` declares this branch loops back to an already-declared
|
|
389
|
+
* stage — the loop is SOURCED FROM THIS BRANCH (not the decider).
|
|
390
|
+
* `{ retry }` gives THIS BRANCH's stage a declarative retry policy;
|
|
391
|
+
* `{ tags }` puts declared tags on it (see `FlowChartBuilder.tag`). */
|
|
392
|
+
options) {
|
|
393
|
+
const { node, spec } = this.cursor.functionBranch(id, name, fn, description, options);
|
|
394
|
+
if (options?.loopTo)
|
|
395
|
+
this._applyBranchLoop(node, spec, options.loopTo);
|
|
396
|
+
return this;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Add a pausable stage as a decider branch.
|
|
400
|
+
*
|
|
401
|
+
* When this branch is chosen, the handler's `execute` runs. If it returns
|
|
402
|
+
* data, the pipeline pauses. On resume, `handler.resume` runs with the
|
|
403
|
+
* human's input. If `execute` returns void, the stage continues normally
|
|
404
|
+
* (conditional pause).
|
|
405
|
+
*/
|
|
406
|
+
addPausableFunctionBranch(id, name, handler, description,
|
|
407
|
+
/** `{ loopTo }` declares this branch loops back to an already-declared
|
|
408
|
+
* stage — the loop is SOURCED FROM THIS BRANCH (not the decider).
|
|
409
|
+
* `{ retry }` gives THIS BRANCH's `execute` half a retry policy (the
|
|
410
|
+
* `resume` half runs without it — a different function, a different
|
|
411
|
+
* contract); `{ tags }` puts declared tags on it. */
|
|
412
|
+
options) {
|
|
413
|
+
const { node, spec } = this.cursor.pausableBranch(id, name, handler, description, options);
|
|
414
|
+
if (options?.loopTo)
|
|
415
|
+
this._applyBranchLoop(node, spec, options.loopTo);
|
|
416
|
+
return this;
|
|
417
|
+
}
|
|
418
|
+
addSubFlowChartBranch(id, subflow, mountName, options) {
|
|
419
|
+
this.cursor.subflowBranch(id, subflow, mountName, options);
|
|
420
|
+
return this;
|
|
421
|
+
}
|
|
422
|
+
addLazySubFlowChartBranch(id, resolver, mountName, options) {
|
|
423
|
+
this.cursor.lazySubflowBranch(id, resolver, mountName, options);
|
|
314
424
|
return this;
|
|
315
425
|
}
|
|
316
426
|
addBranchList(branches) {
|
|
@@ -346,10 +456,10 @@ export class DeciderList {
|
|
|
346
456
|
* synthetic `'default'` clone are NOT valid loop targets.
|
|
347
457
|
*/
|
|
348
458
|
loopTo(stageId) {
|
|
349
|
-
const children = this.curNode.children;
|
|
350
|
-
const specChildren = this.curSpec.children;
|
|
459
|
+
const children = this.cursor.curNode.children;
|
|
460
|
+
const specChildren = this.cursor.curSpec.children;
|
|
351
461
|
if (!children || children.length === 0 || !specChildren || specChildren.length === 0) {
|
|
352
|
-
fail(`loopTo('${stageId}') called before any branch was added under '${this.curNode.name}'`);
|
|
462
|
+
fail(`loopTo('${stageId}') called before any branch was added under '${this.cursor.curNode.name}'`);
|
|
353
463
|
}
|
|
354
464
|
// fail() throws, so children/specChildren are non-empty here.
|
|
355
465
|
this._applyBranchLoop(children[children.length - 1], specChildren[specChildren.length - 1], stageId);
|
|
@@ -370,7 +480,7 @@ export class DeciderList {
|
|
|
370
480
|
if (branchNode.next) {
|
|
371
481
|
fail(`cannot set loopTo on branch '${branchSpec.id}' — it already has a continuation`);
|
|
372
482
|
}
|
|
373
|
-
if (!this.b._knownStageIdsHas(stageId)) {
|
|
483
|
+
if (!this.cursor.b._knownStageIdsHas(stageId)) {
|
|
374
484
|
fail(`loopTo('${stageId}') target not found — a branch loop must target a stage ` +
|
|
375
485
|
"declared BEFORE the decider (branch ids and the synthetic 'default' branch " +
|
|
376
486
|
'are not valid loop targets; did you pass a stage name instead of an id?)');
|
|
@@ -380,114 +490,28 @@ export class DeciderList {
|
|
|
380
490
|
branchSpec.next = { name: stageId, id: stageId, type: 'loop', isLoopReference: true };
|
|
381
491
|
// Branch-scoped description — attribute the loop to the branch, not the
|
|
382
492
|
// decider (parentDescriptionParts is the decider's description context).
|
|
383
|
-
this.parentDescriptionParts.push(` → branch '${branchSpec.id}' loops back to ${stageId}`);
|
|
493
|
+
this.cursor.parentDescriptionParts.push(` → branch '${branchSpec.id}' loops back to ${stageId}`);
|
|
384
494
|
// Fire the loop back-edge SOURCED FROM THE BRANCH so visualizers read
|
|
385
495
|
// `tool-calls → context`, not `Route → context`.
|
|
386
|
-
this.b._fireLoopEdgeAddedFromSubBuilder(branchSpec.id, stageId);
|
|
496
|
+
this.cursor.b._fireLoopEdgeAddedFromSubBuilder(branchSpec.id, stageId);
|
|
387
497
|
}
|
|
388
498
|
end() {
|
|
389
|
-
|
|
390
|
-
if (!children || children.length === 0) {
|
|
391
|
-
throw new Error(`[FlowChartBuilder] decider at '${this.curNode.name}' requires at least one branch`);
|
|
392
|
-
}
|
|
393
|
-
// Validate that every branch with no embedded fn is resolvable from the stageMap
|
|
394
|
-
for (const child of children) {
|
|
395
|
-
if (!child.fn && child.id && !child.isSubflowRoot && !child.subflowResolver) {
|
|
396
|
-
const hasInMap = this.b._stageMapHas(child.id) || this.b._stageMapHas(child.name);
|
|
397
|
-
if (!hasInMap) {
|
|
398
|
-
throw new Error(`[FlowChartBuilder] decider branch '${child.id}' under '${this.curNode.name}' has no function — ` +
|
|
399
|
-
`provide a fn argument to addFunctionBranch('${child.id}', ...)`);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
this.curNode.deciderFn = true;
|
|
404
|
-
// Build branchIds BEFORE appending the synthetic default — only user-specified branches
|
|
405
|
-
this.curSpec.branchIds = children
|
|
406
|
-
.map((c) => c.id)
|
|
407
|
-
.filter((id) => typeof id === 'string' && id.length > 0);
|
|
408
|
-
this.curSpec.type = 'decider';
|
|
409
|
-
if (this.defaultId) {
|
|
410
|
-
const defaultChild = children.find((c) => c.id === this.defaultId);
|
|
411
|
-
if (defaultChild) {
|
|
412
|
-
children.push({ ...defaultChild, id: 'default', branchId: 'default' });
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
if (this.reservedStepNumber > 0) {
|
|
416
|
-
const deciderLabel = this.curNode.name;
|
|
417
|
-
const branchIdList = this.branchDescInfo.map((b) => b.id).join(', ');
|
|
418
|
-
const mainLine = this.deciderDescription
|
|
419
|
-
? `${this.reservedStepNumber}. ${deciderLabel} — ${this.deciderDescription} (branches: ${branchIdList})`
|
|
420
|
-
: `${this.reservedStepNumber}. ${deciderLabel} — Decides between: ${branchIdList}`;
|
|
421
|
-
this.parentDescriptionParts.push(mainLine);
|
|
422
|
-
if (this.deciderDescription) {
|
|
423
|
-
this.parentStageDescriptions.set(this.curNode.name, this.deciderDescription);
|
|
424
|
-
}
|
|
425
|
-
for (const branch of this.branchDescInfo) {
|
|
426
|
-
const branchText = branch.description;
|
|
427
|
-
if (branchText) {
|
|
428
|
-
this.parentDescriptionParts.push(` → ${branch.id}: ${branchText}`);
|
|
429
|
-
}
|
|
430
|
-
if (branch.description) {
|
|
431
|
-
this.parentStageDescriptions.set(branch.id, branch.description);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
// L7.3 — fire `onDeciderComplete` so consumers can trust no more
|
|
436
|
-
// branches will arrive for this decider. Branch iteration order =
|
|
437
|
-
// addition order = Set insertion order.
|
|
438
|
-
this.b._fireDeciderCompleteFromSubBuilder(this.curSpec.id, 'decider', [...this.branchIds], this.defaultId);
|
|
439
|
-
return this.b;
|
|
499
|
+
return this.cursor.finish(this.defaultId);
|
|
440
500
|
}
|
|
441
501
|
}
|
|
442
502
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
443
503
|
// SelectorFnList (scope-based selector — mirrors DeciderList)
|
|
444
504
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
445
505
|
export class SelectorFnList {
|
|
446
|
-
|
|
447
|
-
curNode;
|
|
448
|
-
curSpec;
|
|
449
|
-
branchIds = new Set();
|
|
450
|
-
parentDescriptionParts;
|
|
451
|
-
parentStageDescriptions;
|
|
452
|
-
reservedStepNumber;
|
|
453
|
-
selectorDescription;
|
|
454
|
-
branchDescInfo = [];
|
|
506
|
+
cursor;
|
|
455
507
|
constructor(builder, curNode, curSpec, parentDescriptionParts = [], parentStageDescriptions = new Map(), reservedStepNumber = 0, selectorDescription) {
|
|
456
|
-
this.
|
|
457
|
-
this.curNode = curNode;
|
|
458
|
-
this.curSpec = curSpec;
|
|
459
|
-
this.parentDescriptionParts = parentDescriptionParts;
|
|
460
|
-
this.parentStageDescriptions = parentStageDescriptions;
|
|
461
|
-
this.reservedStepNumber = reservedStepNumber;
|
|
462
|
-
this.selectorDescription = selectorDescription;
|
|
508
|
+
this.cursor = new BranchCursor('selector', builder, curNode, curSpec, parentDescriptionParts, parentStageDescriptions, reservedStepNumber, selectorDescription);
|
|
463
509
|
}
|
|
464
510
|
addFunctionBranch(id, name, fn, description,
|
|
465
511
|
/** `{ retry }` gives THIS BRANCH's stage a declarative retry policy;
|
|
466
512
|
* `{ tags }` puts declared tags on it (see `FlowChartBuilder.tag`). */
|
|
467
513
|
options) {
|
|
468
|
-
|
|
469
|
-
fail(`duplicate selector branch id '${id}' under '${this.curNode.name}'`);
|
|
470
|
-
this.branchIds.add(id);
|
|
471
|
-
const node = { name: name ?? id, id, branchId: id };
|
|
472
|
-
if (description)
|
|
473
|
-
node.description = description;
|
|
474
|
-
if (fn) {
|
|
475
|
-
node.fn = fn;
|
|
476
|
-
this.b._addToMap(id, fn);
|
|
477
|
-
}
|
|
478
|
-
const spec = { name: name ?? id, id, type: 'stage' };
|
|
479
|
-
if (description)
|
|
480
|
-
spec.description = description;
|
|
481
|
-
applyRetryPolicy(node, spec, options?.retry, `addFunctionBranch('${id}')`);
|
|
482
|
-
applyTags(node, spec, options?.tags, `addFunctionBranch('${id}')`);
|
|
483
|
-
this.curNode.children = this.curNode.children || [];
|
|
484
|
-
this.curNode.children.push(node);
|
|
485
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
486
|
-
this.curSpec.children.push(spec);
|
|
487
|
-
// L7.3 — Selector branch.
|
|
488
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
489
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
490
|
-
this.branchDescInfo.push({ id, description });
|
|
514
|
+
this.cursor.functionBranch(id, name, fn, description, options);
|
|
491
515
|
return this;
|
|
492
516
|
}
|
|
493
517
|
/**
|
|
@@ -502,117 +526,15 @@ export class SelectorFnList {
|
|
|
502
526
|
* `resume` half runs without it — a different function, a different
|
|
503
527
|
* contract); `{ tags }` puts declared tags on it. */
|
|
504
528
|
options) {
|
|
505
|
-
|
|
506
|
-
fail(`duplicate selector branch id '${id}' under '${this.curNode.name}'`);
|
|
507
|
-
this.branchIds.add(id);
|
|
508
|
-
const node = {
|
|
509
|
-
name: name ?? id,
|
|
510
|
-
id,
|
|
511
|
-
branchId: id,
|
|
512
|
-
fn: handler.execute,
|
|
513
|
-
isPausable: true,
|
|
514
|
-
resumeFn: handler.resume,
|
|
515
|
-
};
|
|
516
|
-
if (description)
|
|
517
|
-
node.description = description;
|
|
518
|
-
this.b._addToMap(id, handler.execute);
|
|
519
|
-
const spec = { name: name ?? id, id, type: 'stage', isPausable: true };
|
|
520
|
-
if (description)
|
|
521
|
-
spec.description = description;
|
|
522
|
-
applyRetryPolicy(node, spec, options?.retry, `addPausableFunctionBranch('${id}')`);
|
|
523
|
-
applyTags(node, spec, options?.tags, `addPausableFunctionBranch('${id}')`);
|
|
524
|
-
this.curNode.children = this.curNode.children || [];
|
|
525
|
-
this.curNode.children.push(node);
|
|
526
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
527
|
-
this.curSpec.children.push(spec);
|
|
528
|
-
// L7.3 — Pausable selector branch.
|
|
529
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
530
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
531
|
-
this.branchDescInfo.push({ id, description });
|
|
529
|
+
this.cursor.pausableBranch(id, name, handler, description, options);
|
|
532
530
|
return this;
|
|
533
531
|
}
|
|
534
532
|
addSubFlowChartBranch(id, subflow, mountName, options) {
|
|
535
|
-
|
|
536
|
-
fail(`duplicate selector branch id '${id}' under '${this.curNode.name}'`);
|
|
537
|
-
assertSubflowIdAllowed(id);
|
|
538
|
-
this.branchIds.add(id);
|
|
539
|
-
const subflowName = mountName || id;
|
|
540
|
-
const prefixedRoot = this.b._prefixNodeTree(subflow.root, id);
|
|
541
|
-
this.b._registerSubflowDef(id, prefixedRoot);
|
|
542
|
-
const node = {
|
|
543
|
-
name: subflowName,
|
|
544
|
-
id,
|
|
545
|
-
branchId: id,
|
|
546
|
-
isSubflowRoot: true,
|
|
547
|
-
subflowId: id,
|
|
548
|
-
subflowName,
|
|
549
|
-
};
|
|
550
|
-
if (options)
|
|
551
|
-
node.subflowMountOptions = options;
|
|
552
|
-
const spec = {
|
|
553
|
-
name: subflowName,
|
|
554
|
-
type: 'stage',
|
|
555
|
-
id,
|
|
556
|
-
isSubflowRoot: true,
|
|
557
|
-
subflowId: id,
|
|
558
|
-
subflowName,
|
|
559
|
-
subflowStructure: subflow.buildTimeStructure,
|
|
560
|
-
};
|
|
561
|
-
// STRUCTURE-ONLY convergence override (see `_fireNextEdgeFromParent` +
|
|
562
|
-
// `SubflowMountOptions.convergeAt`): this branch's convergence edge points at
|
|
563
|
-
// `convergeAt` (a DOWNSTREAM stage) instead of the shared next stage — e.g. a
|
|
564
|
-
// `tools` slot that bypasses `messageAPI` to pair with its output at
|
|
565
|
-
// `call-llm`. Visualization-only: NO runtime join barrier (data rides scope).
|
|
566
|
-
if (options?.convergeAt)
|
|
567
|
-
spec.convergeAt = options.convergeAt;
|
|
568
|
-
applyTags(node, spec, options?.tags, `addSubFlowChartBranch('${id}')`);
|
|
569
|
-
this.curNode.children = this.curNode.children || [];
|
|
570
|
-
this.curNode.children.push(node);
|
|
571
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
572
|
-
this.curSpec.children.push(spec);
|
|
573
|
-
// L7.3 — Subflow as selector branch.
|
|
574
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
575
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
576
|
-
this.b._fireSubflowMountedFromSubBuilder(id, subflowName, id, false, subflow.buildTimeStructure);
|
|
577
|
-
this.b._mergeStageMap(subflow.stageMap, id);
|
|
578
|
-
this.b._mergeSubflows(subflow.subflows, id);
|
|
533
|
+
this.cursor.subflowBranch(id, subflow, mountName, options);
|
|
579
534
|
return this;
|
|
580
535
|
}
|
|
581
536
|
addLazySubFlowChartBranch(id, resolver, mountName, options) {
|
|
582
|
-
|
|
583
|
-
fail(`duplicate selector branch id '${id}' under '${this.curNode.name}'`);
|
|
584
|
-
assertSubflowIdAllowed(id);
|
|
585
|
-
this.branchIds.add(id);
|
|
586
|
-
const subflowName = mountName || id;
|
|
587
|
-
const node = {
|
|
588
|
-
name: subflowName,
|
|
589
|
-
id,
|
|
590
|
-
branchId: id,
|
|
591
|
-
isSubflowRoot: true,
|
|
592
|
-
subflowId: id,
|
|
593
|
-
subflowName,
|
|
594
|
-
subflowResolver: resolver,
|
|
595
|
-
};
|
|
596
|
-
if (options)
|
|
597
|
-
node.subflowMountOptions = options;
|
|
598
|
-
const spec = {
|
|
599
|
-
name: subflowName,
|
|
600
|
-
type: 'stage',
|
|
601
|
-
id,
|
|
602
|
-
isSubflowRoot: true,
|
|
603
|
-
subflowId: id,
|
|
604
|
-
subflowName,
|
|
605
|
-
isLazy: true,
|
|
606
|
-
};
|
|
607
|
-
applyTags(node, spec, options?.tags, `addLazySubFlowChartBranch('${id}')`);
|
|
608
|
-
this.curNode.children = this.curNode.children || [];
|
|
609
|
-
this.curNode.children.push(node);
|
|
610
|
-
this.curSpec.children = this.curSpec.children || [];
|
|
611
|
-
this.curSpec.children.push(spec);
|
|
612
|
-
// L7.3 — Lazy subflow as selector branch.
|
|
613
|
-
this.b._fireStageAddedFromSubBuilder(spec);
|
|
614
|
-
this.b._fireEdgeAddedFromSubBuilder(this.curSpec.id, spec.id, 'decision-branch', id);
|
|
615
|
-
this.b._fireSubflowMountedFromSubBuilder(id, subflowName, id, true);
|
|
537
|
+
this.cursor.lazySubflowBranch(id, resolver, mountName, options);
|
|
616
538
|
return this;
|
|
617
539
|
}
|
|
618
540
|
addBranchList(branches) {
|
|
@@ -622,49 +544,7 @@ export class SelectorFnList {
|
|
|
622
544
|
return this;
|
|
623
545
|
}
|
|
624
546
|
end() {
|
|
625
|
-
|
|
626
|
-
if (!children || children.length === 0) {
|
|
627
|
-
throw new Error(`[FlowChartBuilder] selector at '${this.curNode.name}' requires at least one branch`);
|
|
628
|
-
}
|
|
629
|
-
// Validate that every branch with no embedded fn is resolvable from the stageMap
|
|
630
|
-
for (const child of children) {
|
|
631
|
-
if (!child.fn && child.id && !child.isSubflowRoot && !child.subflowResolver) {
|
|
632
|
-
const hasInMap = this.b._stageMapHas(child.id) || this.b._stageMapHas(child.name);
|
|
633
|
-
if (!hasInMap) {
|
|
634
|
-
throw new Error(`[FlowChartBuilder] selector branch '${child.id}' under '${this.curNode.name}' has no function — ` +
|
|
635
|
-
`provide a fn argument to addFunctionBranch('${child.id}', ...)`);
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
this.curNode.selectorFn = true;
|
|
640
|
-
this.curSpec.branchIds = children
|
|
641
|
-
.map((c) => c.id)
|
|
642
|
-
.filter((id) => typeof id === 'string' && id.length > 0);
|
|
643
|
-
this.curSpec.type = 'selector'; // was 'decider' — incorrect; selectors are distinct from deciders
|
|
644
|
-
this.curSpec.hasSelector = true;
|
|
645
|
-
if (this.reservedStepNumber > 0) {
|
|
646
|
-
const selectorLabel = this.curNode.name;
|
|
647
|
-
const branchIdList = this.branchDescInfo.map((b) => b.id).join(', ');
|
|
648
|
-
const mainLine = this.selectorDescription
|
|
649
|
-
? `${this.reservedStepNumber}. ${selectorLabel} — ${this.selectorDescription}`
|
|
650
|
-
: `${this.reservedStepNumber}. ${selectorLabel} — Selects from: ${branchIdList}`;
|
|
651
|
-
this.parentDescriptionParts.push(mainLine);
|
|
652
|
-
if (this.selectorDescription) {
|
|
653
|
-
this.parentStageDescriptions.set(this.curNode.name, this.selectorDescription);
|
|
654
|
-
}
|
|
655
|
-
for (const branch of this.branchDescInfo) {
|
|
656
|
-
const branchText = branch.description;
|
|
657
|
-
if (branchText)
|
|
658
|
-
this.parentDescriptionParts.push(` → ${branch.id}: ${branchText}`);
|
|
659
|
-
if (branch.description)
|
|
660
|
-
this.parentStageDescriptions.set(branch.id, branch.description);
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
// L7.3 — fire `onDeciderComplete` with type='selector'. Selectors
|
|
664
|
-
// have no default branch (multi-select semantics differ); pass
|
|
665
|
-
// undefined.
|
|
666
|
-
this.b._fireDeciderCompleteFromSubBuilder(this.curSpec.id, 'selector', [...this.branchIds]);
|
|
667
|
-
return this.b;
|
|
547
|
+
return this.cursor.finish();
|
|
668
548
|
}
|
|
669
549
|
}
|
|
670
550
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -1008,6 +888,7 @@ export class FlowChartBuilder {
|
|
|
1008
888
|
}
|
|
1009
889
|
// ── Linear Chaining ──
|
|
1010
890
|
start(name, fn, id, description, options) {
|
|
891
|
+
admitId('stage id', id, 'stage');
|
|
1011
892
|
if (this._root)
|
|
1012
893
|
fail('root already defined; create a new builder');
|
|
1013
894
|
// Detect PausableHandler by duck-typing (has .execute property)
|
|
@@ -1055,6 +936,7 @@ export class FlowChartBuilder {
|
|
|
1055
936
|
* with no separate seed stage before it.
|
|
1056
937
|
*/
|
|
1057
938
|
startSelector(name, fn, id, description, options) {
|
|
939
|
+
admitId('stage id', id, 'stage');
|
|
1058
940
|
if (this._root)
|
|
1059
941
|
fail('root already defined; create a new builder');
|
|
1060
942
|
const node = { name, id, fn: fn };
|
|
@@ -1085,6 +967,7 @@ export class FlowChartBuilder {
|
|
|
1085
967
|
return new SelectorFnList(this, node, spec, this._descriptionParts, this._stageDescriptions, this._stepCounter, description);
|
|
1086
968
|
}
|
|
1087
969
|
addFunction(name, fn, id, description) {
|
|
970
|
+
admitId('stage id', id, 'stage');
|
|
1088
971
|
const cur = this._needCursor();
|
|
1089
972
|
const curSpec = this._needCursorSpec();
|
|
1090
973
|
// Capture the parent SPEC reference (not just id) BEFORE the
|
|
@@ -1113,6 +996,7 @@ export class FlowChartBuilder {
|
|
|
1113
996
|
return this;
|
|
1114
997
|
}
|
|
1115
998
|
addStreamingFunction(name, fn, id, streamId, description) {
|
|
999
|
+
admitId('stage id', id, 'stage');
|
|
1116
1000
|
const cur = this._needCursor();
|
|
1117
1001
|
const curSpec = this._needCursorSpec();
|
|
1118
1002
|
const parentSpec = curSpec;
|
|
@@ -1168,6 +1052,7 @@ export class FlowChartBuilder {
|
|
|
1168
1052
|
* ```
|
|
1169
1053
|
*/
|
|
1170
1054
|
addPausableFunction(name, handler, id, description) {
|
|
1055
|
+
admitId('stage id', id, 'stage');
|
|
1171
1056
|
const cur = this._needCursor();
|
|
1172
1057
|
const curSpec = this._needCursorSpec();
|
|
1173
1058
|
const parentSpec = curSpec;
|
|
@@ -1305,6 +1190,7 @@ export class FlowChartBuilder {
|
|
|
1305
1190
|
* chained modifier could mean the decider OR the branch just added;
|
|
1306
1191
|
* `{ tags }` likewise. */
|
|
1307
1192
|
options) {
|
|
1193
|
+
admitId('stage id', id, 'stage');
|
|
1308
1194
|
const cur = this._needCursor();
|
|
1309
1195
|
const curSpec = this._needCursorSpec();
|
|
1310
1196
|
const parentSpec = curSpec;
|
|
@@ -1338,6 +1224,7 @@ export class FlowChartBuilder {
|
|
|
1338
1224
|
* `addDeciderFunction`: this method returns a sub-builder, so a chained
|
|
1339
1225
|
* `.retry()` would be ambiguous; `{ tags }` likewise. */
|
|
1340
1226
|
options) {
|
|
1227
|
+
admitId('stage id', id, 'stage');
|
|
1341
1228
|
const cur = this._needCursor();
|
|
1342
1229
|
const curSpec = this._needCursorSpec();
|
|
1343
1230
|
const parentSpec = curSpec;
|
|
@@ -1386,6 +1273,7 @@ export class FlowChartBuilder {
|
|
|
1386
1273
|
for (const { id, name, fn, retry, tags } of children) {
|
|
1387
1274
|
if (!id)
|
|
1388
1275
|
fail(`child id required under '${cur.name}'`);
|
|
1276
|
+
admitId('fork child id', id, 'stage');
|
|
1389
1277
|
if (cur.children?.some((c) => c.id === id)) {
|
|
1390
1278
|
fail(`duplicate child id '${id}' under '${cur.name}'`);
|
|
1391
1279
|
}
|
|
@@ -1469,9 +1357,7 @@ export class FlowChartBuilder {
|
|
|
1469
1357
|
// ambiguous to parse. Refusing it here — on a brand-new method, at zero
|
|
1470
1358
|
// back-compat cost — kills the ambiguity class outright and keeps
|
|
1471
1359
|
// `parseBranchSegment` a split at the last marker instead of a heuristic.
|
|
1472
|
-
|
|
1473
|
-
fail(branchSegmentReservationMessage('parallelForEach stage id', id));
|
|
1474
|
-
}
|
|
1360
|
+
admitId('parallelForEach stage id', id, 'segment');
|
|
1475
1361
|
if (!config || typeof config.items !== 'function' || typeof config.branch !== 'function') {
|
|
1476
1362
|
fail(`addParallelForEach('${id}') requires items(scope) and branch(item, index) functions.`);
|
|
1477
1363
|
}
|
|
@@ -2013,7 +1899,7 @@ export class FlowChartBuilder {
|
|
|
2013
1899
|
}
|
|
2014
1900
|
_mergeStageMap(other, prefix) {
|
|
2015
1901
|
for (const [k, v] of other) {
|
|
2016
|
-
const key = prefix ?
|
|
1902
|
+
const key = prefix ? joinPath(prefix, k) : k;
|
|
2017
1903
|
if (this._stageMap.has(key)) {
|
|
2018
1904
|
const existing = this._stageMap.get(key);
|
|
2019
1905
|
if (existing !== v)
|
|
@@ -2025,43 +1911,18 @@ export class FlowChartBuilder {
|
|
|
2025
1911
|
}
|
|
2026
1912
|
}
|
|
2027
1913
|
/**
|
|
2028
|
-
* Prefix a node tree with a subflow path segment
|
|
2029
|
-
*
|
|
2030
|
-
*
|
|
2031
|
-
* This function and `FlowchartTraverser.prefixNodeTree` are byte-twins by
|
|
2032
|
-
* contract: this one prefixes at MOUNT time, the traverser's at RUN time
|
|
2033
|
-
* (lazy subflows, and the generated branches of `addParallelForEach`), and a
|
|
2034
|
-
* chart must come out identical either way.
|
|
2035
|
-
* `test/lib/engine/branch-segment-prefixer-equivalence.test.ts` pins that —
|
|
2036
|
-
* any edit here must be mirrored there, and vice versa.
|
|
2037
|
-
*
|
|
2038
|
-
* Generated branch segments (`<stageId>~<index>`, see
|
|
2039
|
-
* `engine/branchSegment.ts`) ride this exact path with no special case: a
|
|
2040
|
-
* segment is just a prefix. That is the mechanical tolerance the design
|
|
2041
|
-
* relies on — the runtimeStageId grammar accepts it unchanged, which is why
|
|
2042
|
-
* no parser in the library had to learn the marker.
|
|
2043
|
-
* Design: docs/design/execution-control.md.
|
|
1914
|
+
* Prefix a node tree with a subflow path segment at MOUNT time — the one
|
|
1915
|
+
* prefixer, `engine/graph/prefixNodeTree.ts` (the traverser calls the same
|
|
1916
|
+
* function at RUN time). Kept as the builder's door for its mount sites.
|
|
2044
1917
|
*/
|
|
2045
1918
|
_prefixNodeTree(node, prefix) {
|
|
2046
|
-
|
|
2047
|
-
return node;
|
|
2048
|
-
const clone = { ...node };
|
|
2049
|
-
clone.name = `${prefix}/${node.name}`;
|
|
2050
|
-
clone.id = `${prefix}/${node.id}`;
|
|
2051
|
-
if (clone.subflowId)
|
|
2052
|
-
clone.subflowId = `${prefix}/${clone.subflowId}`;
|
|
2053
|
-
if (clone.next)
|
|
2054
|
-
clone.next = this._prefixNodeTree(clone.next, prefix);
|
|
2055
|
-
if (clone.children) {
|
|
2056
|
-
clone.children = clone.children.map((c) => this._prefixNodeTree(c, prefix));
|
|
2057
|
-
}
|
|
2058
|
-
return clone;
|
|
1919
|
+
return prefixNodeTree(node, prefix);
|
|
2059
1920
|
}
|
|
2060
1921
|
_mergeSubflows(subflows, prefix) {
|
|
2061
1922
|
if (!subflows)
|
|
2062
1923
|
return;
|
|
2063
1924
|
for (const [key, def] of Object.entries(subflows)) {
|
|
2064
|
-
const prefixedKey =
|
|
1925
|
+
const prefixedKey = joinPath(prefix, key);
|
|
2065
1926
|
if (!this._subflowDefs.has(prefixedKey)) {
|
|
2066
1927
|
this._subflowDefs.set(prefixedKey, {
|
|
2067
1928
|
root: this._prefixNodeTree(def.root, prefix),
|
|
@@ -2126,4 +1987,4 @@ export function specToStageNode(spec) {
|
|
|
2126
1987
|
});
|
|
2127
1988
|
return inflate(spec);
|
|
2128
1989
|
}
|
|
2129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiwrQkFBK0IsRUFDL0Isc0JBQXNCLEdBQ3ZCLE1BQU0sNEJBQTRCLENBQUM7QUFJcEMsT0FBTyxFQUEwQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQTJCLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFnQnZGLGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBVyxFQUFTLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLGdCQUFnQixDQUN2QixJQUF5QixFQUN6QixJQUFpQyxFQUNqQyxLQUE4QixFQUM5QixLQUFhO0lBRWIsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEcsSUFBSSxDQUNGLEdBQUcsS0FBSyxxREFBcUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSztZQUN0RixtR0FBbUc7WUFDbkcsK0RBQStE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QUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2xFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQzNDLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEJ1aWxkZXIg4oCUIEZsdWVudCBBUEkgZm9yIGNvbnN0cnVjdGluZyBmbG93Y2hhcnQgZXhlY3V0aW9uIGdyYXBocy5cbiAqXG4gKiBCdWlsZHMgU3RhZ2VOb2RlIHRyZWVzIGFuZCBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgKEpTT04pIGluIHRhbmRlbS5cbiAqIFplcm8gZGVwZW5kZW5jaWVzIG9uIG9sZCBjb2RlIOKAlCBvbmx5IGltcG9ydHMgZnJvbSBsb2NhbCB0eXBlcy5cbiAqXG4gKiBUaGUgYnVpbGRlciBjcmVhdGVzIHR3byBwYXJhbGxlbCBzdHJ1Y3R1cmVzOlxuICogMS4gU3RhZ2VOb2RlIHRyZWUg4oCUIHJ1bnRpbWUgZ3JhcGggd2l0aCBlbWJlZGRlZCBmdW5jdGlvbnNcbiAqIDIuIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSDigJQgSlNPTi1zYWZlIHN0cnVjdHVyZSBmb3IgdmlzdWFsaXphdGlvblxuICpcbiAqIFRoZSBleGVjdXRlKCkgY29udmVuaWVuY2UgbWV0aG9kIGlzIGludGVudGlvbmFsbHkgb21pdHRlZCDigJRcbiAqIGl0IGJlbG9uZ3MgaW4gdGhlIHJ1bm5lciBsYXllciAoUGhhc2UgNSkuXG4gKi9cblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQge1xuICBCUkFOQ0hfU0VHTUVOVF9NQVJLRVIsXG4gIGJyYW5jaFNlZ21lbnRSZXNlcnZhdGlvbk1lc3NhZ2UsXG4gIGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIsXG59IGZyb20gJy4uL2VuZ2luZS9icmFuY2hTZWdtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSwgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGF1c2FibGVIYW5kbGVyIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBUeXBlZFNjb3BlIH0gZnJvbSAnLi4vcmVhY3RpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBSdW5uYWJsZUZsb3dDaGFydCwgbWFrZVJ1bm5hYmxlIH0gZnJvbSAnLi4vcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVFZGdlS2luZCwgU3RydWN0dXJlUmVjb3JkZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBUeXBlZFN0YWdlRnVuY3Rpb24sIGNyZWF0ZVR5cGVkU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi90eXBlZEZsb3dDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dDaGFydCxcbiAgRmxvd0NoYXJ0T3B0aW9ucyxcbiAgRmxvd0NoYXJ0U3BlYyxcbiAgSUxvZ2dlcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyLFxuICBTdHJlYW1Ub2tlbkhhbmRsZXIsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEludGVybmFsIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBmYWlsID0gKG1zZzogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke21zZ31gKTtcbn07XG5cbi8qKlxuICogQXR0YWNoIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5IHRvIGEgc3RhZ2Ugbm9kZSArIGl0cyBzcGVjIG5vZGUuXG4gKlxuICogVGhlIE9ORSBwbGFjZSBhIHBvbGljeSBsYW5kcyBvbiBhIG5vZGUsIHNoYXJlZCBieSB0aGUgYC5yZXRyeSgpYCBjdXJzb3JcbiAqIG1vZGlmaWVyIGFuZCBieSBldmVyeSBgb3B0aW9ucy5yZXRyeWAgZGVjbGFyYXRpb24gc2l0ZSwgc28gdmFsaWRhdGlvbiBhbmQgdGhlXG4gKiBzcGVjJ3MgYHJldHJ5QXR0ZW1wdHNgIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIGBhdHRlbXB0c2AgaXMgdmFsaWRhdGVkIGF0IEJVSUxEIHRpbWUgcmF0aGVyIHRoYW4gZGVmZW5kZWQgYXQgcnVudGltZTogYVxuICogdHlwbydkIGBhdHRlbXB0czogMGAgc2hvdWxkIGZhaWwgd2hpbGUgeW91IGFyZSB3cml0aW5nIHRoZSBjaGFydCwgbm90XG4gKiBzaWxlbnRseSB0dXJuIGEgc3RhZ2UgaW50byBhIG5vLW9wIHJ1biB0aHJlZSBtb250aHMgbGF0ZXIuIGBhdHRlbXB0czogMWAgaXNcbiAqIGFjY2VwdGVkIG9uIHB1cnBvc2Ug4oCUIGl0IG1lYW5zIFwicG9saWN5IGRlY2xhcmVkLCBjdXJyZW50bHkgb2ZmXCIsIHNvIGEgcG9saWN5XG4gKiBjYW4gYmUgZGlhbGxlZCBkb3duIHdpdGhvdXQgZGVsZXRpbmcgdGhlIGRlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBhcHBseVJldHJ5UG9saWN5KFxuICBub2RlOiBTdGFnZU5vZGU8YW55LCBhbnk+LFxuICBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHJldHJ5OiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoIXJldHJ5KSByZXR1cm47XG4gIGlmICh0eXBlb2YgcmV0cnkuYXR0ZW1wdHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJldHJ5LmF0dGVtcHRzKSB8fCByZXRyeS5hdHRlbXB0cyA8IDEpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiByZXRyeS5hdHRlbXB0cyBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyID49IDEgKGdvdCAke1N0cmluZyhyZXRyeS5hdHRlbXB0cyl9KS4gYCArXG4gICAgICAgICdJdCBjb3VudHMgVE9UQUwgcnVucyBpbmNsdWRpbmcgdGhlIGZpcnN0LCBzbyBgYXR0ZW1wdHM6IDNgIG1lYW5zIG9uZSBydW4gcGx1cyB1cCB0byB0d28gcmV0cmllczsgJyArXG4gICAgICAgICdgYXR0ZW1wdHM6IDFgIG1lYW5zIHRoZSBwb2xpY3kgaXMgZGVjbGFyZWQgYnV0IGN1cnJlbnRseSBvZmYuJyxcbiAgICApO1xuICB9XG4gIG5vZGUucmV0cnkgPSByZXRyeTtcbiAgc3BlYy5yZXRyeUF0dGVtcHRzID0gcmV0cnkuYXR0ZW1wdHM7XG59XG5cbi8qKlxuICogQXR0YWNoIGRlY2xhcmVkIHRhZ3MgdG8gYSBzdGFnZSBub2RlICsgaXRzIHNwZWMgbm9kZS5cbiAqXG4gKiBUaGUgT05FIHBsYWNlIHRhZ3MgbGFuZCBvbiBhIG5vZGUg4oCUIHRoZSB0d2luIG9mIHtAbGluayBhcHBseVJldHJ5UG9saWN5fSDigJRcbiAqIHNoYXJlZCBieSB0aGUgYC50YWcoKWAgY3Vyc29yIG1vZGlmaWVyIGFuZCBldmVyeSBgb3B0aW9ucy50YWdzYCBkZWNsYXJhdGlvblxuICogc2l0ZSwgc28gdGhlIHJlZnVzYWxzIGFuZCB0aGUgc3BlYydzIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lLCBuZXZlciBhIHZhbHVlLCBzbyBldmVyeSByZWZ1c2FsIGlzXG4gKiBhYm91dCB0aGUgbmFtZSdzIHNoYXBlOiBhbiBlbXB0eSBzdHJpbmcgbmFtZXMgbm90aGluZzsgYSBub24tc3RyaW5nIGlzIGFcbiAqIHZhbHVlLCBhbmQgYSB2YWx1ZSBvbiBhIHN0YWdlIHdvdWxkIHJpZGUgdGhlIGNvbW1pdCBsb2cgcGFzdCBldmVyeVxuICogcmVkYWN0aW9uIHBvaW50OyB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIGlzIHRoZSBydW50aW1lU3RhZ2VJZCBncmFtbWFyJ3NcbiAqIG9uZSByZXNlcnZlZCBieXRlLCBhbmQgYSBjb25zdW1lciB0aGF0IHB1dHMgYSB0YWcgaW50byBhIHBhdGggKGEgVVJMLCBhXG4gKiBzdG9yZSBrZXkpIHdvdWxkIGluaGVyaXQgZXhhY3RseSB0aGUgYW1iaWd1aXR5IHRoZSByZXNlcnZhdGlvbiBleGlzdHMgdG9cbiAqIHByZXZlbnQ7IGEgbmFtZSBkZWNsYXJlZCB0d2ljZSBpcyB0aGUgdHlwbyBpdCB1c3VhbGx5IGlzLiBSZWZ1c2VkIGF0IEJVSUxEXG4gKiB0aW1lLCBsaWtlIGByZXRyeS5hdHRlbXB0c2AsIHNvIHRoZSBtaXN0YWtlIGZhaWxzIHdoaWxlIHRoZSBjaGFydCBpcyBiZWluZ1xuICogd3JpdHRlbi4gQW4gRU1QVFkgbGlzdCBsYW5kcyBub3RoaW5nOiBcImFic2VudCB3aGVuIGVtcHR5XCIgaXMgdGhlIGxhdyB0aGVcbiAqIGNvbW1pdCBidW5kbGUga2VlcHMsIGFuZCB0aGUgc3BlYyBrZWVwcyBpdCB0b28uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGFncyhcbiAgbm9kZTogU3RhZ2VOb2RlPGFueSwgYW55PixcbiAgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAodGFncyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSkgZmFpbChgJHt3aGVyZX06IHRhZ3MgbXVzdCBiZSBhbiBhcnJheSBvZiBuYW1lcyAoZ290ICR7dHlwZW9mIHRhZ3N9KWApO1xuICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgJHt3aGVyZX06IGEgdGFnIG11c3QgYmUgYSBzdHJpbmcgbmFtZSAoZ290ICR7dGFnID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHRhZ30pLiBBIHRhZyBpcyBhIE5BTUUgYCArXG4gICAgICAgICAgJ2RlY2xhcmVkIGF0IGJ1aWxkIHRpbWUg4oCUIGEgdmFsdWUgYmVsb25ncyBpbiBzdGF0ZSBvciBpbiAkZW1pdCwgbmV2ZXIgb24gdGhlIHN0YWdlLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGFnLnRyaW0oKS5sZW5ndGggPT09IDApIGZhaWwoYCR7d2hlcmV9OiBhIHRhZyBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nYCk7XG4gICAgaWYgKGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIodGFnKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgY29udGFpbnMgdGhlIHJlc2VydmVkIGNoYXJhY3RlciAnJHtCUkFOQ0hfU0VHTUVOVF9NQVJLRVJ9Jy4gYCArXG4gICAgICAgICAgYCcke0JSQU5DSF9TRUdNRU5UX01BUktFUn0nIGlzIHJlc2VydmVkIGZvciB0aGUgc3ViZmxvdyBwYXRoIHNlZ21lbnRzIGFkZFBhcmFsbGVsRm9yRWFjaCgpIGdlbmVyYXRlcywgYCArXG4gICAgICAgICAgJ2FuZCBhIHRhZyB0aGF0IGEgY29uc3VtZXIgcHV0cyBpbnRvIGEgcGF0aCBvciBhIGtleSB3b3VsZCBpbmhlcml0IHRoYXQgYW1iaWd1aXR5LiBSZW5hbWUgdGhlIHRhZyAnICtcbiAgICAgICAgICAnKGEgZGFzaCBvciBhIGNvbG9uIHJlYWRzIHRoZSBzYW1lKS4gU2VlIGRvY3MvZGVzaWduLzIwMjYtMDktZGVjbGFyZWQtdGFncy5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKHRhZykpIGZhaWwoYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgaXMgZGVjbGFyZWQgdHdpY2VgKTtcbiAgICBzZWVuLmFkZCh0YWcpO1xuICB9XG4gIGlmIChub2RlLnRhZ3MpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiB0YWdzIGFscmVhZHkgZGVjbGFyZWQgYXQgJyR7bm9kZS5uYW1lfScgKCR7bm9kZS50YWdzLmpvaW4oJywgJyl9KSDigJQgZGVjbGFyZSBldmVyeSB0YWcgZm9yIGEgYCArXG4gICAgICAgICdzdGFnZSBpbiBPTkUgcGxhY2UsIHNvIHRoZSBNYXAgYWR2ZXJ0aXNlcyB0aGUgd2hvbGUgdm9jYWJ1bGFyeSBmcm9tIGEgc2luZ2xlIHNpdGUuJyxcbiAgICApO1xuICB9XG4gIC8vIFRoZSBub2RlJ3MgY29weSBpcyBmcm96ZW46IGNvbW1pdCBidW5kbGVzIHNoYXJlIGl0IGJ5IHJlZmVyZW5jZSBhbmQgdGhlXG4gIC8vIGxpYnJhcnkncyByZWFkcyBhcmUgYm9ycm93ZWQsIG5ldmVyIG11dGF0ZWQuIFRoZSBzcGVjJ3MgY29weSBpcyBpdHMgb3duXG4gIC8vIHBsYWluIGFycmF5LCBKU09OLXNhZmUgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3BlYy5cbiAgbm9kZS50YWdzID0gT2JqZWN0LmZyZWV6ZShbLi4udGFnc10pO1xuICBzcGVjLnRhZ3MgPSBbLi4udGFnc107XG59XG5cbi8qKlxuICogUmVmdXNlIHRoZSByZXNlcnZlZCBicmFuY2gtc2VnbWVudCBtYXJrZXIgaW4gYSB1c2VyLWF1dGhvcmVkIFNVQkZMT1cgaWQuXG4gKlxuICogQSBzdWJmbG93IGlkIElTIGEgcGF0aCBzZWdtZW50IGluIGBydW50aW1lU3RhZ2VJZGAsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiBwb3NpdGlvbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBnZW5lcmF0ZXMgaXRzIGJyYW5jaCBzZWdtZW50cyBpbnRvLiBBXG4gKiBoYW5kLWF1dGhvcmVkIGlkIGNhcnJ5aW5nIHRoZSBtYXJrZXIgY291bGQgdGhlcmVmb3JlIGNvbGxpZGUgd2l0aCBhXG4gKiBnZW5lcmF0ZWQgYnJhbmNoIOKAlCBhbmQsIGJlY2F1c2UgdGhpcyBjb2RlYmFzZSBkZWxpYmVyYXRlbHkgdG9sZXJhdGVzXG4gKiBpZC1jb2xsaXNpb24gY2xhc3NlcyAobG9vcC1yZWYgc3R1YnMpLCBzdWNoIGEgY29sbGlzaW9uIHdvdWxkIG5vdCBjcmFzaC4gSXRcbiAqIHdvdWxkIHNpbGVudGx5IG1pcy1hdHRyaWJ1dGUgYSB0cmFjZSwgd2hpY2ggaXMgd29yc2UuIFNvIHRoZSBtYXJrZXIgaXNcbiAqIHJlZnVzZWQgYXQgQlVJTEQgdGltZSwgb24gTkVXIGNoYXJ0cyBvbmx5OiBhIGNoYXJ0IHRoYXQgd2FzIGxlZ2FsIGJlZm9yZVxuICogOS4xNC4wIGFuZCBkb2VzIG5vdCB1c2UgdGhlIG1hcmtlciBiZWhhdmVzIGJ5dGUtaWRlbnRpY2FsbHkuXG4gKlxuICogQ2FsbGVkIGF0IGV2ZXJ5IHVzZXItYXV0aG9yZWQgc3ViZmxvdy1pZCBlbnRyeSBwb2ludC4gU3RhZ2UgaWRzIGVsc2V3aGVyZVxuICogc3RheSB1bnZhbGlkYXRlZCBieSBkZXNpZ24g4oCUIHRoZXkgb2NjdXB5IHRoZSBgc3RhZ2VJZGAgcG9zaXRpb24sIG5ldmVyIHRoZVxuICogYHN1YmZsb3dQYXRoYCBwb3NpdGlvbiwgc28gdGhleSBjYW5ub3QgY29sbGlkZSB3aXRoIGEgc2VnbWVudC5cbiAqIChgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIG93biBpZCBpcyB0aGUgb25lIGV4Y2VwdGlvbiwgcmVmdXNlZCBhdCB0aGF0IG1ldGhvZC4pXG4gKiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kLlxuICovXG5jb25zdCBhc3NlcnRTdWJmbG93SWRBbGxvd2VkID0gKGlkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYgKGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIoaWQpKSBmYWlsKGJyYW5jaFNlZ21lbnRSZXNlcnZhdGlvbk1lc3NhZ2UoJ3N1YmZsb3cgaWQnLCBpZCkpO1xufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEZWNpZGVyTGlzdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmx1ZW50IGhlbHBlciByZXR1cm5lZCBieSBhZGREZWNpZGVyRnVuY3Rpb24gdG8gYWRkIGJyYW5jaGVzLlxuICogYGVuZCgpYCBzZXRzIGBkZWNpZGVyRm4gPSB0cnVlYCDigJQgdGhlIGZuIElTIHRoZSBkZWNpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgRGVjaWRlckxpc3Q8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBkZWZhdWx0SWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNlcnZlZFN0ZXBOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRGVzY0luZm86IEFycmF5PHsgaWQ6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuYiA9IGJ1aWxkZXI7XG4gICAgdGhpcy5jdXJOb2RlID0gY3VyTm9kZTtcbiAgICB0aGlzLmN1clNwZWMgPSBjdXJTcGVjO1xuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cyA9IHBhcmVudERlc2NyaXB0aW9uUGFydHM7XG4gICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucyA9IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zO1xuICAgIHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID0gcmVzZXJ2ZWRTdGVwTnVtYmVyO1xuICAgIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uID0gZGVjaWRlckRlc2NyaXB0aW9uO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IGxvb3BUbyB9YCBkZWNsYXJlcyB0aGlzIGJyYW5jaCBsb29wcyBiYWNrIHRvIGFuIGFscmVhZHktZGVjbGFyZWRcbiAgICAgKiAgc3RhZ2Ug4oCUIHRoZSBsb29wIGlzIFNPVVJDRUQgRlJPTSBUSElTIEJSQU5DSCAobm90IHRoZSBkZWNpZGVyKS5cbiAgICAgKiAgYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBzdGFnZSBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeTtcbiAgICAgKiAgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQgKHNlZSBgRmxvd0NoYXJ0QnVpbGRlci50YWdgKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSBsb29wVG8/OiBzdHJpbmc7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIGRlY2lkZXIgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIGJyYW5jaElkOiBpZCB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChmbikge1xuICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgdGhpcy5iLl9hZGRUb01hcChpZCwgZm4pO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZEZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIERlY2lkZXIgYnJhbmNoOiBzdGFnZSArIGRlY2lzaW9uLWJyYW5jaCBlZGdlIGtleWVkIGJ5IGlkLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG5cbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIGRlY2lkZXIgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIGNob3NlbiwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5XG4gICAqIChjb25kaXRpb25hbCBwYXVzZSkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuXG4gICAgICogIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nOyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBkZWNpZGVyIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBmbjogaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgICByZXN1bWVGbjogaGFuZGxlci5yZXN1bWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLmIuX2FkZFRvTWFwKGlkLCBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIHR5cGU6ICdzdGFnZScsIGlzUGF1c2FibGU6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBQYXVzYWJsZSBkZWNpZGVyIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuXG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIGlmIChvcHRpb25zPy5sb29wVG8pIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChub2RlLCBzcGVjLCBvcHRpb25zLmxvb3BUbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBkZWNpZGVyIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5iLl9wcmVmaXhOb2RlVHJlZShzdWJmbG93LnJvb3QsIGlkKTtcblxuICAgIHRoaXMuYi5fcmVnaXN0ZXJTdWJmbG93RGVmKGlkLCBwcmVmaXhlZFJvb3QpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICAvLyBTVFJVQ1RVUkUtT05MWSBjb252ZXJnZW5jZSBvdmVycmlkZSDigJQgdGhpcyBicmFuY2gncyBjb252ZXJnZW5jZSBlZGdlXG4gICAgLy8gcG9pbnRzIGF0IGBjb252ZXJnZUF0YCBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgbmV4dCBzdGFnZSAoc2VlXG4gICAgLy8gYF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50YCkuIENhcnJpZWQgb24gdGhlIHNwZWMgc28gdGhlIGVkZ2UtZmlyaW5nXG4gICAgLy8gY2hva2Vwb2ludCAod2hpY2ggaXRlcmF0ZXMgY2hpbGQgc3BlY3MpIGNhbiByZWFkIGl0LlxuICAgIGlmIChvcHRpb25zPy5jb252ZXJnZUF0KSBzcGVjLmNvbnZlcmdlQXQgPSBvcHRpb25zLmNvbnZlcmdlQXQ7XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydEJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBTdWJmbG93IGFzIGRlY2lkZXIgYnJhbmNoOiBzdGFnZSArIGRlY2lzaW9uIGVkZ2UgKyBtb3VudC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgZmFsc2UsIHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIHRoaXMuYi5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5iLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBkZWNpZGVyIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG5cbiAgICAvLyBTdG9yZSByZXNvbHZlciBvbiB0aGUgbm9kZSDigJQgTk8gZWFnZXIgdHJlZSBjbG9uaW5nXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dSZXNvbHZlcjogcmVzb2x2ZXIgYXMgYW55LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAvLyBTcGVjIHN0dWIg4oCUIG5vIHN1YmZsb3dTdHJ1Y3R1cmUgKGxhenkpLiBUaGUgbGF6eSBzdWJmbG93J3NcbiAgICAvLyBpbnRlcm5hbHMgd2lsbCBiZSBzaGFwZWQgYXQgcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgc3ViZmxvdyBhcyBkZWNpZGVyIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5kZWZhdWx0SWQgPSBpZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBsb29wLWJhY2sgZWRnZSB0byB0aGUgTEFTVC1hZGRlZCBicmFuY2gsIHNvIHRoZSBsb29wIGlzIHNvdXJjZWRcbiAgICogZnJvbSBUSEFUIGJyYW5jaCBub2RlIChlLmcuIGAndG9vbC1jYWxscycg4oaSIGxvb3BUbygnY29udGV4dCcpYCkgcmF0aGVyIHRoYW5cbiAgICogZnJvbSB0aGUgZGVjaWRlci4gVGhlIGNoYXJ0IHRoZW4gcmVhZHMgaG9uZXN0bHk6IHRoZSBkZWNpZGVyIHNwbGl0cyBpbnRvIGFcbiAgICogbG9vcGluZyBicmFuY2ggYFtUb29sQ2FsbHMg4oaSIGJhY2sgdG8gQ29udGV4dF1gIGFuZCBhIHRlcm1pbmF0aW5nIGJyYW5jaFxuICAgKiBgW0ZpbmFsIOKGkiBlbmRdYCwgaW5zdGVhZCBvZiBhIHNpbmdsZSBsb29wIGhhbmdpbmcgb2ZmIHRoZSBkZWNpZGVyLlxuICAgKlxuICAgKiBObyBlbmdpbmUgY2hhbmdlIGlzIG5lZWRlZDogdGhlIHJ1bnRpbWUgcnVucyB0aGUgY2hvc2VuIGJyYW5jaCBhbmQgdGhlblxuICAgKiBmb2xsb3dzIHRoYXQgYnJhbmNoIG5vZGUncyBPV04gYG5leHRgIOKAlCBhbmQgYSBgbmV4dGAgZmxhZ2dlZCBgaXNMb29wUmVmYFxuICAgKiByb3V0ZXMgYmFjayB0byB0aGUgdGFyZ2V0IGV4YWN0bHkgbGlrZSB0aGUgZGVjaWRlcidzIG93biBsb29wIGRvZXMuIFRoaXNcbiAgICogbWV0aG9kIGp1c3QgbGV0cyB0aGUgYnVpbGRlciBleHByZXNzIHdoYXQgdGhlIGVuZ2luZSBhbHJlYWR5IHN1cHBvcnRzLlxuICAgKlxuICAgKiBUYXJnZXRzIHRoZSBicmFuY2ggYWRkZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY2FsbCAoY2hhaW4gaXQgcmlnaHQgYWZ0ZXJcbiAgICogdGhlIGJyYW5jaCdzIGBhZGRGdW5jdGlvbkJyYW5jaGAvYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgL1xuICAgKiBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYCkuIE1pcnJvcnMgYEZsb3dDaGFydEJ1aWxkZXIubG9vcFRvYCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBXb3JrcyBvbiBhIFNVQkZMT1cgYnJhbmNoIHRvbzogdGhlIGJyYW5jaCBub2RlIGNhcnJpZXMgYm90aCBpdHMgc3ViZmxvd1xuICAgKiByZXNvbHZlciBBTkQgdGhlIGxvb3AtYmFjayBgbmV4dGAg4oCUIHRoZXkgY29leGlzdCBzYWZlbHkgKHRoZSBydW50aW1lIHJ1bnNcbiAgICogdGhlIHN1YmZsb3csIHRoZW4gZm9sbG93cyB0aGUgbG9vcCByZWYpLiBUaGUgdGFyZ2V0IG11c3QgYmUgYSBzdGFnZSBhbHJlYWR5XG4gICAqIGRlY2xhcmVkIEJFRk9SRSB0aGUgZGVjaWRlciAoZS5nLiBhbiB1cHN0cmVhbSBgY29udGV4dGApOyBicmFuY2ggaWRzIGFuZCB0aGVcbiAgICogc3ludGhldGljIGAnZGVmYXVsdCdgIGNsb25lIGFyZSBOT1QgdmFsaWQgbG9vcCB0YXJnZXRzLlxuICAgKi9cbiAgbG9vcFRvKHN0YWdlSWQ6IHN0cmluZyk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IHNwZWNDaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbjtcbiAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCAhc3BlY0NoaWxkcmVuIHx8IHNwZWNDaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIGZhaWwoYGxvb3BUbygnJHtzdGFnZUlkfScpIGNhbGxlZCBiZWZvcmUgYW55IGJyYW5jaCB3YXMgYWRkZWQgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIH1cbiAgICAvLyBmYWlsKCkgdGhyb3dzLCBzbyBjaGlsZHJlbi9zcGVjQ2hpbGRyZW4gYXJlIG5vbi1lbXB0eSBoZXJlLlxuICAgIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChjaGlsZHJlbiFbY2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3BlY0NoaWxkcmVuIVtzcGVjQ2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb3JhdGUgT05FIGJyYW5jaCBub2RlL3NwZWMgd2l0aCBhIGxvb3AtYmFjayBlZGdlIHRvIGBzdGFnZUlkYC4gU2hhcmVkIGJ5XG4gICAqIHRoZSBwb3NpdGlvbmFsIGBsb29wVG8oKWAgKHdoaWNoIHRhcmdldHMgdGhlIGxhc3QtYWRkZWQgYnJhbmNoKSBBTkQgdGhlXG4gICAqIHBlci1icmFuY2ggYHsgbG9vcFRvIH1gIG9wdGlvbiBvbiBgYWRkRnVuY3Rpb25CcmFuY2hgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgIC8gYGFkZFN1YkZsb3dDaGFydEJyYW5jaGAuIEVpdGhlciB3YXkgdGhlIGxvb3BcbiAgICogU09VUkNFIGlzIHRoZSBicmFuY2gg4oCUIHNvIHZpc3VhbGl6ZXJzIHJlYWQgYHRvb2wtY2FsbHMg4oaSIGNvbnRleHRgLCBuZXZlclxuICAgKiBgUm91dGUg4oaSIGNvbnRleHRgLiBWYWxpZGF0ZXMgdGhlIHRhcmdldCBpcyBhIHN0YWdlIGRlY2xhcmVkIEJFRk9SRSB0aGVcbiAgICogZGVjaWRlciAoYnJhbmNoIGlkcyAvIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGNsb25lIGFyZSBub3QgdmFsaWQgdGFyZ2V0cykuXG4gICAqL1xuICBwcml2YXRlIF9hcHBseUJyYW5jaExvb3AoXG4gICAgYnJhbmNoTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGJyYW5jaFNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nYCk7XG4gICAgaWYgKGJyYW5jaE5vZGUubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IHNldCBsb29wVG8gb24gYnJhbmNoICcke2JyYW5jaFNwZWMuaWR9JyDigJQgaXQgYWxyZWFkeSBoYXMgYSBjb250aW51YXRpb25gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmIuX2tub3duU3RhZ2VJZHNIYXMoc3RhZ2VJZCkpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGBsb29wVG8oJyR7c3RhZ2VJZH0nKSB0YXJnZXQgbm90IGZvdW5kIOKAlCBhIGJyYW5jaCBsb29wIG11c3QgdGFyZ2V0IGEgc3RhZ2UgYCArXG4gICAgICAgICAgXCJkZWNsYXJlZCBCRUZPUkUgdGhlIGRlY2lkZXIgKGJyYW5jaCBpZHMgYW5kIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGJyYW5jaCBcIiArXG4gICAgICAgICAgJ2FyZSBub3QgdmFsaWQgbG9vcCB0YXJnZXRzOyBkaWQgeW91IHBhc3MgYSBzdGFnZSBuYW1lIGluc3RlYWQgb2YgYW4gaWQ/KScsXG4gICAgICApO1xuICAgIH1cblxuICAgIGJyYW5jaE5vZGUubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIGlzTG9vcFJlZjogdHJ1ZSB9O1xuICAgIGJyYW5jaFNwZWMubG9vcFRhcmdldCA9IHN0YWdlSWQ7XG4gICAgYnJhbmNoU3BlYy5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgdHlwZTogJ2xvb3AnLCBpc0xvb3BSZWZlcmVuY2U6IHRydWUgfTtcblxuICAgIC8vIEJyYW5jaC1zY29wZWQgZGVzY3JpcHRpb24g4oCUIGF0dHJpYnV0ZSB0aGUgbG9vcCB0byB0aGUgYnJhbmNoLCBub3QgdGhlXG4gICAgLy8gZGVjaWRlciAocGFyZW50RGVzY3JpcHRpb25QYXJ0cyBpcyB0aGUgZGVjaWRlcidzIGRlc2NyaXB0aW9uIGNvbnRleHQpLlxuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgYnJhbmNoICcke2JyYW5jaFNwZWMuaWR9JyBsb29wcyBiYWNrIHRvICR7c3RhZ2VJZH1gKTtcblxuICAgIC8vIEZpcmUgdGhlIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBUSEUgQlJBTkNIIHNvIHZpc3VhbGl6ZXJzIHJlYWRcbiAgICAvLyBgdG9vbC1jYWxscyDihpIgY29udGV4dGAsIG5vdCBgUm91dGUg4oaSIGNvbnRleHRgLlxuICAgIHRoaXMuYi5fZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihicmFuY2hTcGVjLmlkLCBzdGFnZUlkKTtcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSBkZWNpZGVyIGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZXZlcnkgYnJhbmNoIHdpdGggbm8gZW1iZWRkZWQgZm4gaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBzdGFnZU1hcFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuZm4gJiYgY2hpbGQuaWQgJiYgIWNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgIWNoaWxkLnN1YmZsb3dSZXNvbHZlcikge1xuICAgICAgICBjb25zdCBoYXNJbk1hcCA9IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQuaWQpIHx8IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQubmFtZSk7XG4gICAgICAgIGlmICghaGFzSW5NYXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdIGRlY2lkZXIgYnJhbmNoICcke2NoaWxkLmlkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyBoYXMgbm8gZnVuY3Rpb24g4oCUIGAgK1xuICAgICAgICAgICAgICBgcHJvdmlkZSBhIGZuIGFyZ3VtZW50IHRvIGFkZEZ1bmN0aW9uQnJhbmNoKCcke2NoaWxkLmlkfScsIC4uLilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmN1ck5vZGUuZGVjaWRlckZuID0gdHJ1ZTtcblxuICAgIC8vIEJ1aWxkIGJyYW5jaElkcyBCRUZPUkUgYXBwZW5kaW5nIHRoZSBzeW50aGV0aWMgZGVmYXVsdCDigJQgb25seSB1c2VyLXNwZWNpZmllZCBicmFuY2hlc1xuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSAnZGVjaWRlcic7XG5cbiAgICBpZiAodGhpcy5kZWZhdWx0SWQpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRDaGlsZCA9IGNoaWxkcmVuLmZpbmQoKGMpID0+IGMuaWQgPT09IHRoaXMuZGVmYXVsdElkKTtcbiAgICAgIGlmIChkZWZhdWx0Q2hpbGQpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh7IC4uLmRlZmF1bHRDaGlsZCwgaWQ6ICdkZWZhdWx0JywgYnJhbmNoSWQ6ICdkZWZhdWx0JyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPiAwKSB7XG4gICAgICBjb25zdCBkZWNpZGVyTGFiZWwgPSB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLmRlY2lkZXJEZXNjcmlwdGlvblxuICAgICAgICA/IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtkZWNpZGVyTGFiZWx9IOKAlCAke3RoaXMuZGVjaWRlckRlc2NyaXB0aW9ufSAoYnJhbmNoZXM6ICR7YnJhbmNoSWRMaXN0fSlgXG4gICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2RlY2lkZXJMYWJlbH0g4oCUIERlY2lkZXMgYmV0d2VlbjogJHticmFuY2hJZExpc3R9YDtcbiAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKG1haW5MaW5lKTtcblxuICAgICAgaWYgKHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KHRoaXMuY3VyTm9kZS5uYW1lLCB0aGlzLmRlY2lkZXJEZXNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHRoaXMuYnJhbmNoRGVzY0luZm8pIHtcbiAgICAgICAgY29uc3QgYnJhbmNoVGV4dCA9IGJyYW5jaC5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGJyYW5jaFRleHQpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMucHVzaChgICAg4oaSICR7YnJhbmNoLmlkfTogJHticmFuY2hUZXh0fWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFuY2guZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldChicmFuY2guaWQsIGJyYW5jaC5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMNy4zIOKAlCBmaXJlIGBvbkRlY2lkZXJDb21wbGV0ZWAgc28gY29uc3VtZXJzIGNhbiB0cnVzdCBubyBtb3JlXG4gICAgLy8gYnJhbmNoZXMgd2lsbCBhcnJpdmUgZm9yIHRoaXMgZGVjaWRlci4gQnJhbmNoIGl0ZXJhdGlvbiBvcmRlciA9XG4gICAgLy8gYWRkaXRpb24gb3JkZXIgPSBTZXQgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ2RlY2lkZXInLCBbLi4udGhpcy5icmFuY2hJZHNdLCB0aGlzLmRlZmF1bHRJZCk7XG4gICAgcmV0dXJuIHRoaXMuYjtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNlbGVjdG9yRm5MaXN0IChzY29wZS1iYXNlZCBzZWxlY3RvciDigJQgbWlycm9ycyBEZWNpZGVyTGlzdClcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JGbkxpc3Q8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc2VydmVkU3RlcE51bWJlcjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRGVzY0luZm86IEFycmF5PHsgaWQ6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBzZWxlY3RvckRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLmIgPSBidWlsZGVyO1xuICAgIHRoaXMuY3VyTm9kZSA9IGN1ck5vZGU7XG4gICAgdGhpcy5jdXJTcGVjID0gY3VyU3BlYztcbiAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMgPSBwYXJlbnREZXNjcmlwdGlvblBhcnRzO1xuICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMgPSBwYXJlbnRTdGFnZURlc2NyaXB0aW9ucztcbiAgICB0aGlzLnJlc2VydmVkU3RlcE51bWJlciA9IHJlc2VydmVkU3RlcE51bWJlcjtcbiAgICB0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb24gPSBzZWxlY3RvckRlc2NyaXB0aW9uO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3Mgc3RhZ2UgYSBkZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3k7XG4gICAgICogIGB7IHRhZ3MgfWAgcHV0cyBkZWNsYXJlZCB0YWdzIG9uIGl0IChzZWUgYEZsb3dDaGFydEJ1aWxkZXIudGFnYCkuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgc2VsZWN0b3IgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIGJyYW5jaElkOiBpZCB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChmbikge1xuICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgdGhpcy5iLl9hZGRUb01hcChpZCwgZm4pO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZEZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIFNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuXG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhdXNhYmxlIHN0YWdlIGFzIGEgc2VsZWN0b3IgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIHNlbGVjdGVkLCB0aGUgaGFuZGxlcidzIGBleGVjdXRlYCBydW5zLiBJZiBpdCByZXR1cm5zXG4gICAqIGRhdGEsIHRoZSBwaXBlbGluZSBwYXVzZXMuIE9uIHJlc3VtZSwgYGhhbmRsZXIucmVzdW1lYCBydW5zIHdpdGggdGhlXG4gICAqIGh1bWFuJ3MgaW5wdXQuIElmIGBleGVjdXRlYCByZXR1cm5zIHZvaWQsIHRoZSBzdGFnZSBjb250aW51ZXMgbm9ybWFsbHkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyBUSElTIEJSQU5DSCdzIGBleGVjdXRlYCBoYWxmIGEgcmV0cnkgcG9saWN5ICh0aGVcbiAgICAgKiAgYHJlc3VtZWAgaGFsZiBydW5zIHdpdGhvdXQgaXQg4oCUIGEgZGlmZmVyZW50IGZ1bmN0aW9uLCBhIGRpZmZlcmVudFxuICAgICAqICBjb250cmFjdCk7IGB7IHRhZ3MgfWAgcHV0cyBkZWNsYXJlZCB0YWdzIG9uIGl0LiAqL1xuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIHNlbGVjdG9yIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBmbjogaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgICByZXN1bWVGbjogaGFuZGxlci5yZXN1bWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLmIuX2FkZFRvTWFwKGlkLCBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIHR5cGU6ICdzdGFnZScsIGlzUGF1c2FibGU6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBQYXVzYWJsZSBzZWxlY3RvciBicmFuY2guXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcblxuICAgIHRoaXMuYnJhbmNoRGVzY0luZm8ucHVzaCh7IGlkLCBkZXNjcmlwdGlvbiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIHNlbGVjdG9yIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5iLl9wcmVmaXhOb2RlVHJlZShzdWJmbG93LnJvb3QsIGlkKTtcblxuICAgIHRoaXMuYi5fcmVnaXN0ZXJTdWJmbG93RGVmKGlkLCBwcmVmaXhlZFJvb3QpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICAvLyBTVFJVQ1RVUkUtT05MWSBjb252ZXJnZW5jZSBvdmVycmlkZSAoc2VlIGBfZmlyZU5leHRFZGdlRnJvbVBhcmVudGAgK1xuICAgIC8vIGBTdWJmbG93TW91bnRPcHRpb25zLmNvbnZlcmdlQXRgKTogdGhpcyBicmFuY2gncyBjb252ZXJnZW5jZSBlZGdlIHBvaW50cyBhdFxuICAgIC8vIGBjb252ZXJnZUF0YCAoYSBET1dOU1RSRUFNIHN0YWdlKSBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgbmV4dCBzdGFnZSDigJQgZS5nLiBhXG4gICAgLy8gYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgYG1lc3NhZ2VBUElgIHRvIHBhaXIgd2l0aCBpdHMgb3V0cHV0IGF0XG4gICAgLy8gYGNhbGwtbGxtYC4gVmlzdWFsaXphdGlvbi1vbmx5OiBOTyBydW50aW1lIGpvaW4gYmFycmllciAoZGF0YSByaWRlcyBzY29wZSkuXG4gICAgaWYgKG9wdGlvbnM/LmNvbnZlcmdlQXQpIHNwZWMuY29udmVyZ2VBdCA9IG9wdGlvbnMuY29udmVyZ2VBdDtcblxuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIFN1YmZsb3cgYXMgc2VsZWN0b3IgYnJhbmNoLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG4gICAgdGhpcy5iLl9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5iLl9tZXJnZVN0YWdlTWFwKHN1YmZsb3cuc3RhZ2VNYXAsIGlkKTtcbiAgICB0aGlzLmIuX21lcmdlU3ViZmxvd3Moc3ViZmxvdy5zdWJmbG93cywgaWQpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzb2x2ZXI6ICgpID0+IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIHNlbGVjdG9yIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgc3ViZmxvdyBhcyBzZWxlY3RvciBicmFuY2guXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRCcmFuY2hMaXN0KFxuICAgIGJyYW5jaGVzOiBBcnJheTx7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgfT4sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4gfSBvZiBicmFuY2hlcykge1xuICAgICAgdGhpcy5hZGRGdW5jdGlvbkJyYW5jaChpZCwgbmFtZSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSBzZWxlY3RvciBhdCAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBicmFuY2hgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGV2ZXJ5IGJyYW5jaCB3aXRoIG5vIGVtYmVkZGVkIGZuIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgc3RhZ2VNYXBcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWNoaWxkLmZuICYmIGNoaWxkLmlkICYmICFjaGlsZC5pc1N1YmZsb3dSb290ICYmICFjaGlsZC5zdWJmbG93UmVzb2x2ZXIpIHtcbiAgICAgICAgY29uc3QgaGFzSW5NYXAgPSB0aGlzLmIuX3N0YWdlTWFwSGFzKGNoaWxkLmlkKSB8fCB0aGlzLmIuX3N0YWdlTWFwSGFzKGNoaWxkLm5hbWUpO1xuICAgICAgICBpZiAoIWhhc0luTWFwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtGbG93Q2hhcnRCdWlsZGVyXSBzZWxlY3RvciBicmFuY2ggJyR7Y2hpbGQuaWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIGhhcyBubyBmdW5jdGlvbiDigJQgYCArXG4gICAgICAgICAgICAgIGBwcm92aWRlIGEgZm4gYXJndW1lbnQgdG8gYWRkRnVuY3Rpb25CcmFuY2goJyR7Y2hpbGQuaWR9JywgLi4uKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VyTm9kZS5zZWxlY3RvckZuID0gdHJ1ZTtcblxuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSAnc2VsZWN0b3InOyAvLyB3YXMgJ2RlY2lkZXInIOKAlCBpbmNvcnJlY3Q7IHNlbGVjdG9ycyBhcmUgZGlzdGluY3QgZnJvbSBkZWNpZGVyc1xuICAgIHRoaXMuY3VyU3BlYy5oYXNTZWxlY3RvciA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPiAwKSB7XG4gICAgICBjb25zdCBzZWxlY3RvckxhYmVsID0gdGhpcy5jdXJOb2RlLm5hbWU7XG4gICAgICBjb25zdCBicmFuY2hJZExpc3QgPSB0aGlzLmJyYW5jaERlc2NJbmZvLm1hcCgoYikgPT4gYi5pZCkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IG1haW5MaW5lID0gdGhpcy5zZWxlY3RvckRlc2NyaXB0aW9uXG4gICAgICAgID8gYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke3NlbGVjdG9yTGFiZWx9IOKAlCAke3RoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbn1gXG4gICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke3NlbGVjdG9yTGFiZWx9IOKAlCBTZWxlY3RzIGZyb206ICR7YnJhbmNoSWRMaXN0fWA7XG4gICAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMucHVzaChtYWluTGluZSk7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQodGhpcy5jdXJOb2RlLm5hbWUsIHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHRoaXMuYnJhbmNoRGVzY0luZm8pIHtcbiAgICAgICAgY29uc3QgYnJhbmNoVGV4dCA9IGJyYW5jaC5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGJyYW5jaFRleHQpIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgJHticmFuY2guaWR9OiAke2JyYW5jaFRleHR9YCk7XG4gICAgICAgIGlmIChicmFuY2guZGVzY3JpcHRpb24pIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KGJyYW5jaC5pZCwgYnJhbmNoLmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMNy4zIOKAlCBmaXJlIGBvbkRlY2lkZXJDb21wbGV0ZWAgd2l0aCB0eXBlPSdzZWxlY3RvcicuIFNlbGVjdG9yc1xuICAgIC8vIGhhdmUgbm8gZGVmYXVsdCBicmFuY2ggKG11bHRpLXNlbGVjdCBzZW1hbnRpY3MgZGlmZmVyKTsgcGFzc1xuICAgIC8vIHVuZGVmaW5lZC5cbiAgICB0aGlzLmIuX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsICdzZWxlY3RvcicsIFsuLi50aGlzLmJyYW5jaElkc10pO1xuICAgIHJldHVybiB0aGlzLmI7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGbG93Q2hhcnRCdWlsZGVyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEJ1aWxkZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgX3Jvb3Q/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfcm9vdFNwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgX2N1cnNvcj86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIF9jdXJzb3JTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9zdGFnZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+KCk7XG4gIF9zdWJmbG93RGVmcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+KCk7XG4gIHByaXZhdGUgX3N0cmVhbUhhbmRsZXJzOiBTdHJlYW1IYW5kbGVycyA9IHt9O1xuICAvKipcbiAgICogTDcuMyDigJQgQnVpbGQtdGltZSBvYnNlcnZlciBmYW4tb3V0LiBPd25lZCBieSB0aGUgYnVpbGRlciBzbyBldmVyeVxuICAgKiBgYWRkWCgpYCBtZXRob2QgY2FuIGZpcmUgYFN0cnVjdHVyZVJlY29yZGVyYCBldmVudHMgYXQgdGhlIG5hdHVyYWxcbiAgICogbW9tZW50IG9mIHRoZSBjb3JyZXNwb25kaW5nIG11dGF0aW9uLiBEaXNwYXRjaGVyIGlzIGFsbG9jYXRlZFxuICAgKiBsYXppbHkgb24gZmlyc3QgYXR0YWNoIHRvIGtlZXAgdGhlIHplcm8tcmVjb3JkZXIgcGF0aCBhbGxvY2F0aW9uLVxuICAgKiBmcmVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfc3RydWN0dXJlRGlzcGF0Y2hlcj86IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlcjtcbiAgLyoqXG4gICAqIEw3LjMg4oCUIFNlYWxlZC1hZnRlci1idWlsZCBmbGFnIChQYW5lbCAyIHBoYXNlIGludmFyaWFudCkuIEZsaXBzXG4gICAqIHRvIGB0cnVlYCB3aGVuIGAuYnVpbGQoKWAgcmV0dXJuczsgc3Vic2VxdWVudCBgYXR0YWNoU3RydWN0dXJlUmVjb3JkZXJgXG4gICAqIHRocm93cy4gUHJldmVudHMgdGhlIGZvb3RndW4gd2hlcmUgYSBjb25zdW1lciBhdHRhY2hlcyBhIHJlY29yZGVyXG4gICAqIG1pZC1leGVjdXRpb24gYW5kIGdldHMgcGFydGlhbCBzdHJ1Y3R1cmUgZGF0YSAobWlzc2VkIGV2ZXJ5IGV2ZW50XG4gICAqIGFscmVhZHkgZmlyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbikuXG4gICAqL1xuICBwcml2YXRlIF9zZWFsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZW5hYmxlTmFycmF0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgX2xvZ2dlcj86IElMb2dnZXI7XG4gIHByaXZhdGUgX2Rlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgX3N0ZXBDb3VudGVyID0gMDtcbiAgLy8gTk9URToga2V5ZWQgYnkgc3RhZ2UgbmFtZSAoZm9yIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyksIHdoaWxlIHN0YWdlTWFwXG4gIC8vIGFuZCBrbm93blN0YWdlSWRzIHVzZSBpZCAoc3RhYmxlIGlkZW50aWZpZXIpLiBUaGVzZSBhcmUgaW50ZW50aW9uYWxseSBkaWZmZXJlbnRcbiAgLy8gbmFtZXNwYWNlcyDigJQgZGVzY3JpcHRpb25zIGFyZSBwcmVzZW50YXRpb25hbCwgbG9va3VwcyBhcmUgc3RydWN0dXJhbC5cbiAgcHJpdmF0ZSBfc3RhZ2VEZXNjcmlwdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIF9zdGFnZVN0ZXBNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIF9rbm93blN0YWdlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2lucHV0U2NoZW1hPzogdW5rbm93bjtcbiAgcHJpdmF0ZSBfb3V0cHV0U2NoZW1hPzogdW5rbm93bjtcbiAgcHJpdmF0ZSBfb3V0cHV0TWFwcGVyPzogKGZpbmFsU2NvcGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB1bmtub3duO1xuICBwcml2YXRlIF9zY29wZUZhY3Rvcnk/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcblxuICAvLyDilIDilIAgTDcuMyDigJQgU3RydWN0dXJlUmVjb3JkZXIgYXR0YWNoICsgZGlzcGF0Y2ggaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgYFN0cnVjdHVyZVJlY29yZGVyYCBmb3IgYnVpbGQtcGhhc2Ugb2JzZXJ2YXRpb24uIE11bHRpcGxlXG4gICAqIHJlY29yZGVycyBjb2V4aXN0IChzYW1lIGlkIGFsbG93ZWQ7IGl0ZXJhdGlvbiBvcmRlciA9IGF0dGFjaFxuICAgKiBvcmRlcikuIFRocm93cyBpZiBjYWxsZWQgYWZ0ZXIgYC5idWlsZCgpYCDigJQgdGhlIGNoYXJ0IGlzIHNlYWxlZCBhdFxuICAgKiB0aGF0IHBvaW50IGFuZCBhbnkgcmVjb3JkZXIgYXR0YWNoZWQgbGF0ZSB3b3VsZCBtaXNzIGV2ZXJ5IGV2ZW50XG4gICAqIGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAqXG4gICAqICoqU2VlZCByZXBsYXkqKjogd2hlbiB0aGlzIGlzIGNhbGxlZCBBRlRFUiBgc3RhcnQoKWAgaGFzIGFscmVhZHlcbiAgICogZmlyZWQgKGkuZS4sIGFmdGVyIHRoZSBgZmxvd0NoYXJ0KClgIGZhY3RvcnkgcmV0dXJucyksIHRoZVxuICAgKiBqdXN0LWF0dGFjaGVkIHJlY29yZGVyIHJlY2VpdmVzIGEgb25lLXRpbWUgYG9uU3RhZ2VBZGRlZGAgZm9yIHRoZVxuICAgKiByb290IHN0YWdlIHNvIGl0IG9ic2VydmVzIHRoZSBzZWVkLiBPbmx5IHRoZSBuZXcgcmVjb3JkZXIgc2Vlc1xuICAgKiB0aGUgcmVwbGF5OyBhbHJlYWR5LWF0dGFjaGVkIHJlY29yZGVycyBhcmUgbm90IHJlLWZpcmVkLlxuICAgKlxuICAgKiAqKk1pZC1jaGFpbiBhdHRhY2ggY2F2ZWF0Kio6IGEgcmVjb3JkZXIgYXR0YWNoZWQgQUZURVIgb25lIG9yIG1vcmVcbiAgICogYGFkZFgoKWAgY2FsbHMgcmVjZWl2ZXMgdGhlIHNlZWQgcmVwbGF5IGJ1dCBNSVNTRVMgZXZlcnlcbiAgICogaW50ZXJtZWRpYXRlIGV2ZW50LiBBdHRhY2ggQkVGT1JFIHRoZSBmaXJzdCBgYWRkWCgpYCBmb3IgY29tcGxldGVcbiAgICogY2FwdHVyZS5cbiAgICpcbiAgICogUHVibGljIGZvciBub3cgdG8gZW5hYmxlIGRpcmVjdCBhdHRhY2ggaW4gdGVzdHMgKyBlYXJseSBjb25zdW1lcnMuXG4gICAqIEw3LjQgd2lsbCB3aXJlIGBmbG93Q2hhcnQoLi4uLCB7IHN0cnVjdHVyZVJlY29yZGVyczogWy4uLl0gfSlgIGFzXG4gICAqIGFuIGFkZGl0aW9uYWwgcmVnaXN0cmF0aW9uIHNpdGU7IHRoaXMgbWV0aG9kIHdpbGwgcmVtYWluLlxuICAgKi9cbiAgYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjb3JkZXI6IFN0cnVjdHVyZVJlY29yZGVyKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX3NlYWxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdIGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKCcke3JlY29yZGVyLmlkfScpIGNhbGxlZCBhZnRlciAuYnVpbGQoKSDigJQgY2hhcnQgaXMgc2VhbGVkOyBgICtcbiAgICAgICAgICAndGhlIHJlY29yZGVyIHdvdWxkIG1pc3MgZXZlcnkgc3RydWN0dXJlIGV2ZW50IGZyb20gY29uc3RydWN0aW9uLiBBdHRhY2ggQkVGT1JFIC5idWlsZCgpLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIgPSBuZXcgU3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAvLyBUaGUgc2VlZCBmaXJlcyBpbnNpZGUgYHN0YXJ0KClgIOKAlCB0aGF0IHJ1bnMgQkVGT1JFIHRoZSBjb25zdW1lclxuICAgIC8vIGNhbiBwb3N0LWNvbnN0cnVjdCBhdHRhY2guIFJlcGxheSB0aGUgc2VlZCBldmVudCBPTkxZIGludG8gdGhlXG4gICAgLy8ganVzdC1hdHRhY2hlZCByZWNvcmRlciBzbyBvdGhlciBhbHJlYWR5LWF0dGFjaGVkIHJlY29yZGVycyBkb24ndFxuICAgIC8vIHNlZSBhIGR1cGxpY2F0ZS4gRXJyb3JzIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgZGlzcGF0Y2hlcidzXG4gICAgLy8gYWNjdW11bGF0b3Igc28gdGhlIGNvbnRyYWN0IHN0YXlzIHVuaWZvcm0uXG4gICAgaWYgKHRoaXMuX3Jvb3RTcGVjKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvcmRlci5vblN0YWdlQWRkZWQ/Lih7XG4gICAgICAgICAgc3RhZ2VJZDogdGhpcy5fcm9vdFNwZWMuaWQsXG4gICAgICAgICAgbmFtZTogdGhpcy5fcm9vdFNwZWMubmFtZSxcbiAgICAgICAgICB0eXBlOiB0aGlzLl9yb290U3BlYy50eXBlID8/ICdzdGFnZScsXG4gICAgICAgICAgLi4uKHRoaXMuX3Jvb3RTcGVjLmlzUGF1c2FibGUgPT09IHRydWUgJiYgeyBpc1BhdXNhYmxlOiB0cnVlIH0pLFxuICAgICAgICAgIC4uLih0aGlzLl9yb290U3BlYy50YWdzICE9PSB1bmRlZmluZWQgJiYgeyB0YWdzOiBbLi4udGhpcy5fcm9vdFNwZWMudGFnc10gfSksXG4gICAgICAgICAgc3BlYzogdGhpcy5fcm9vdFNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLnJlY29yZEVycm9yRm9yUmVwbGF5KHJlY29yZGVyLmlkLCAnb25TdGFnZUFkZGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5zcGVjdCBhY2N1bXVsYXRlZCBgU3RydWN0dXJlQnVpbGRFcnJvcmBzLiBSZXR1cm5zIGVtcHR5IGFycmF5XG4gICAqIHdoZW4gbm8gcmVjb3JkZXJzIGF0dGFjaGVkIE9SIG5vIGVycm9ycyBvY2N1cnJlZC4gUmV0dXJucyBhXG4gICAqIGRlZmVuc2l2ZSBjb3B5IOKAlCBjYWxsZXIgbXV0YXRpb25zIGRvIG5vdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscy5cbiAgICpcbiAgICogKipDYWxsIG9uIHRoZSBCVUlMREVSLCBub3QgdGhlIGNoYXJ0IHJldHVybmVkIGJ5IGAuYnVpbGQoKWAuKipcbiAgICogQ2FwdHVyZSB0aGUgYnVpbGRlciByZWZlcmVuY2UgYmVmb3JlIGAuYnVpbGQoKWAgaWYgeW91IG5lZWRcbiAgICogcG9zdC1idWlsZCBhY2Nlc3M6XG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGJ1aWxkZXIgPSBmbG93Q2hhcnQoLi4uKS5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgKiBjb25zdCBjaGFydCA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICogY29uc3QgZXJyb3JzID0gYnVpbGRlci5nZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFN0cnVjdHVyZUJ1aWxkRXJyb3JzKCk6IFJldHVyblR5cGU8U3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyWydnZXRFcnJvcnMnXT4ge1xuICAgIHJldHVybiB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyPy5nZXRFcnJvcnMoKSA/PyBbXTtcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZpcmUgaGVscGVycyDigJQgbm8tb3Agd2hlbiBubyBkaXNwYXRjaGVyIGF0dGFjaGVkLiBLZWVwc1xuICAvLyBldmVyeSBjYWxsIHNpdGUgYSBvbmUtbGluZXIgd2l0aG91dCB0aGUgYGlmICh0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKWBcbiAgLy8gYm9pbGVycGxhdGUgZXZlcnl3aGVyZS5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlQWRkZWQoc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgLy8gUmVhZCBgaXNQYXVzYWJsZWAgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICAvLyBUaGUgcHJldmlvdXMgYGV4dHJhc2AgYXJndW1lbnQgd2FzIGEgc3ViLWJ1aWxkZXIgZm9vdGd1bjogYnJhbmNoXG4gICAgLy8gaGVscGVycyBpbiBEZWNpZGVyTGlzdC9TZWxlY3RvckZuTGlzdCB3ZW50IHRocm91Z2hcbiAgICAvLyBgX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgIHdoaWNoIGRyb3BwZWQgdGhlIGV4dHJhcywgc2lsZW50bHlcbiAgICAvLyBsb3NpbmcgYGlzUGF1c2FibGU6IHRydWVgIG9uIHBhdXNhYmxlIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoZXMuXG4gICAgY29uc3QgaXNQYXVzYWJsZSA9IHNwZWMuaXNQYXVzYWJsZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdGFnZUFkZGVkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0eXBlOiBzcGVjLnR5cGUgPz8gJ3N0YWdlJyxcbiAgICAgIC4uLihpc1BhdXNhYmxlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgIC4uLihzcGVjLnRhZ3MgIT09IHVuZGVmaW5lZCAmJiB7IHRhZ3M6IFsuLi5zcGVjLnRhZ3NdIH0pLFxuICAgICAgc3BlYzogc3BlYyBhcyB1bmtub3duIGFzIEZsb3dDaGFydFNwZWMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlU3RhZ2VUYWdnZWQoc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyIHx8IHNwZWMudGFncyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlU3RhZ2VUYWdnZWQoe1xuICAgICAgc3RhZ2VJZDogc3BlYy5pZCxcbiAgICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICAgIHRhZ3M6IFsuLi5zcGVjLnRhZ3NdLFxuICAgICAgc3BlYzogc3BlYyBhcyB1bmtub3duIGFzIEZsb3dDaGFydFNwZWMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZywga2luZDogU3RydWN0dXJlRWRnZUtpbmQsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlRWRnZUFkZGVkKHtcbiAgICAgIGZyb20sXG4gICAgICB0byxcbiAgICAgIGtpbmQsXG4gICAgICAuLi4obGFiZWwgIT09IHVuZGVmaW5lZCAmJiB7IGxhYmVsIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUxvb3BFZGdlQWRkZWQoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlTG9vcEVkZ2VBZGRlZCh7IGZyb20sIHRvIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmUgdGhlIGBuZXh0YCBlZGdlKHMpIGZyb20gYSBwYXJlbnQgc3BlYyB0byBhIGZyZXNobHktYWRkZWRcbiAgICogbm9kZSDigJQgd2l0aCBjb252ZXJnZW5jZSBleHBhbnNpb24gd2hlbiB0aGUgcGFyZW50IGlzIGFcbiAgICogZm9yayAvIGRlY2lkZXIgLyBzZWxlY3RvciB3aXRoIGJyYW5jaGVzLlxuICAgKlxuICAgKiBBIGZvcmsgYXQgYHBhcmVudGAgaXMgc2VtYW50aWNhbGx5IGBwYXJlbnQg4pSA4pSAZm9yay1icmFuY2jilIDilIDilrogY2hpbGRbaV1gXG4gICAqIGZvciBlYWNoIGNoaWxkLCBhbmQgdGhlIGNoYWluZWQgYC5hZGRGdW5jdGlvbihYKWAgY29udGludWVzXG4gICAqIEFGVEVSIHRoZSBmb3JrIGNvbnZlcmdlcy4gVGhlIHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGF0IGVhY2hcbiAgICogY2hpbGQgSU5ERVBFTkRFTlRMWSBmZWVkcyBgWGAgKHBhcmFsbGVsIGNvbXBsZXRpb24g4oaSIGpvaW4pLiBUaGVcbiAgICogbGl0ZXJhbCBcImVkZ2UgZnJvbSBwYXJlbnQgdG8gWFwiIHdvdWxkIG1pc3JlcHJlc2VudCB0aGlzIOKAlFxuICAgKiB2aXN1YWxpemVycyBhbmQgdG9wb2xvZ2ljYWwgYWxnb3JpdGhtcyB3b3VsZCBzZWUgb25lIGVkZ2Ugd2hlcmVcbiAgICogdGhlcmUgc2hvdWxkIGJlIE4gY29udmVyZ2VuY2UgZWRnZXMuXG4gICAqXG4gICAqIEZpeDogd2hlbiBgcGFyZW50U3BlY2AgaGFzIGJyYW5jaCBjaGlsZHJlbiAoZm9yayBvciBicmFuY2hlZFxuICAgKiBkZWNpZGVyL3NlbGVjdG9yKSwgZmlyZSBvbmUgYG5leHRgIGVkZ2UgZnJvbSBFQUNIIGNoaWxkIHRvIHRoZVxuICAgKiB0YXJnZXQuIE90aGVyd2lzZSBmaXJlIHRoZSBzaW5nbGUgZWRnZSBmcm9tIGBwYXJlbnRTcGVjYCBpdHNlbGYuXG4gICAqXG4gICAqIExvb3AtcmVmZXJlbmNlIGNoaWxkcmVuIChzeW50aGV0aWMgc3BlYyBub2RlcyBjcmVhdGVkIGJ5XG4gICAqIGAubG9vcFRvKClgKSBhcmUgZXhjbHVkZWQg4oCUIHRoZXkncmUgYmFjay1lZGdlIG1hcmtlcnMsIG5vdFxuICAgKiBjb252ZXJnZW5jZSBzb3VyY2VzLiBBIGJyYW5jaCB0aGF0IGNhcnJpZXMgYW4gT1dOIGxvb3AtYmFjayBgbmV4dGBcbiAgICogKGEgYnJhbmNoLXNvdXJjZWQgYGxvb3BUb2ApIGlzIGxpa2V3aXNlIHNraXBwZWQg4oCUIGl0IGxvb3BzLCBpdCBkb2VzXG4gICAqIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAqXG4gICAqIEEgYnJhbmNoIGNhcnJ5aW5nIGBjb252ZXJnZUF0YCBpcyBSRURJUkVDVEVEOiBpdHMgc2luZ2xlIGNvbnZlcmdlbmNlXG4gICAqIGVkZ2UgZmlyZXMgdG8gaXRzIG5hbWVkIHRhcmdldCBpbnN0ZWFkIG9mIGB0YXJnZXRJZGAg4oCUIGV4cHJlc3NpbmcgYW5cbiAgICogdW5lcXVhbC1kZXB0aCBtZXJnZSAoZS5nLiBgdG9vbHMg4oaSIGNhbGwtbGxtYCwgYnlwYXNzaW5nIGBtZXNzYWdlLWFwaWApLlxuICAgKiBUaGUgbmFtZWQgdGFyZ2V0IGlzIGEgZm9yd2FyZCBzdGFnZSwgc28gaXQgaXMgTk9UIHZhbGlkYXRlZCBoZXJlLlxuICAgKlxuICAgKiBDYWxsIE9SREVSIGNvbnN0cmFpbnQ6IG11c3QgYmUgY2FsbGVkIEJFRk9SRSB0aGUgY3Vyc29yIGFkdmFuY2VzXG4gICAqIHRvIHRoZSBuZXcgdGFyZ2V0LiBUaGUgY2FsbGVyIHBhc3NlcyB0aGUgUFJFLUFEVkFOQ0UgcGFyZW50IHNwZWMuXG4gICAqL1xuICBwcml2YXRlIF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSwgdGFyZ2V0SWQ6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICBjb25zdCBjaGlsZFNwZWNzID0gcGFyZW50U3BlYy5jaGlsZHJlbjtcbiAgICBjb25zdCBpc0JyYW5jaGluZ1BhcmVudCA9XG4gICAgICAocGFyZW50U3BlYy50eXBlID09PSAnZm9yaycgfHwgcGFyZW50U3BlYy50eXBlID09PSAnZGVjaWRlcicgfHwgcGFyZW50U3BlYy50eXBlID09PSAnc2VsZWN0b3InKSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShjaGlsZFNwZWNzKSAmJlxuICAgICAgY2hpbGRTcGVjcy5sZW5ndGggPiAwO1xuICAgIGlmICghaXNCcmFuY2hpbmdQYXJlbnQpIHtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQocGFyZW50U3BlYy5pZCwgdGFyZ2V0SWQsICduZXh0JywgbGFiZWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkU3BlY3MhKSB7XG4gICAgICBpZiAoY2hpbGQuaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIC8vIEEgYnJhbmNoIHdpdGggaXRzIG93biBsb29wLWJhY2sgbmV4dCAoYnJhbmNoLXNvdXJjZWQgbG9vcFRvKSBsb29wcyDigJRcbiAgICAgIC8vIGl0IGRvZXMgbm90IGNvbnZlcmdlIGF0IHRoZSBsaW5lYXIgbmV4dCBzdGFnZS5cbiAgICAgIGlmIChjaGlsZC5uZXh0Py5pc0xvb3BSZWZlcmVuY2UpIGNvbnRpbnVlO1xuICAgICAgaWYgKGNoaWxkLmNvbnZlcmdlQXQpIHtcbiAgICAgICAgLy8gUmVkaXJlY3RlZCBjb252ZXJnZW5jZTogdGhpcyBicmFuY2ggcmVqb2lucyBhdCBpdHMgbmFtZWQgdGFyZ2V0LlxuICAgICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCBjaGlsZC5jb252ZXJnZUF0LCAnbmV4dCcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY2hpbGQuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maXJlRGVjaWRlckNvbXBsZXRlKFxuICAgIGRlY2lkZXI6IHN0cmluZyxcbiAgICB0eXBlOiAnZGVjaWRlcicgfCAnc2VsZWN0b3InLFxuICAgIGJyYW5jaElkczogc3RyaW5nW10sXG4gICAgZGVmYXVsdEJyYW5jaD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlRGVjaWRlckNvbXBsZXRlKHtcbiAgICAgIGRlY2lkZXIsXG4gICAgICB0eXBlLFxuICAgICAgYnJhbmNoSWRzLFxuICAgICAgLi4uKGRlZmF1bHRCcmFuY2ggIT09IHVuZGVmaW5lZCAmJiB7IGRlZmF1bHRCcmFuY2ggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlU3ViZmxvd01vdW50ZWQoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIC8vIHN1YmZsb3dQYXRoIGRlZmF1bHRzIHRvIHN1YmZsb3dJZCB3aGVuIHRoZSByZWNvcmRlciBpcyBhdHRhY2hlZFxuICAgIC8vIHRvIHRoZSBpbW1lZGlhdGUgcGFyZW50ICh0b3AtbGV2ZWwgbW91bnQpOyBjb21wb3NlZCBwYXRocyBhcHBseVxuICAgIC8vIG9ubHkgd2hlbiB0aGlzIGJ1aWxkZXIgaXMgaXRzZWxmIGEgbmVzdGVkIHN1YmZsb3cgYmVpbmdcbiAgICAvLyBvYnNlcnZlZCBieSB0aGUgZ3JhbmRwYXJlbnQncyByZWNvcmRlci5cbiAgICBjb25zdCBwYXRoID0gc3ViZmxvd1BhdGggPz8gc3ViZmxvd0lkO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZVN1YmZsb3dNb3VudGVkKHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgcm9vdFN0YWdlSWQsXG4gICAgICAuLi4oaXNMYXp5ID09PSB0cnVlICYmIHsgaXNMYXp5IH0pLFxuICAgICAgLi4uKHN1YmZsb3dTcGVjICE9PSB1bmRlZmluZWQgJiYgeyBzdWJmbG93U3BlYyB9KSxcbiAgICAgIHN1YmZsb3dQYXRoOiBwYXRoLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN1Yi1idWlsZGVyIGFjY2VzcyAoYC5iLl9maXJlWHh4YCkgaXMgbmVlZGVkIGJ5IERlY2lkZXJMaXN0IC9cbiAgICogIFNlbGVjdG9yRm5MaXN0OyBleHBvc2UgdGhlIGRpc3BhdGNoZXIgdGhyb3VnaCBpbnRlcm5hbCBoZWxwZXJzXG4gICAqICB0aGF0IGdvIHRocm91Z2ggdGhlIHNhbWUgbm8tb3Atd2hlbi1hYnNlbnQgZ3VhcmQuXG4gICAqXG4gICAqICBAaW50ZXJuYWwg4oCUIHRoZXNlIG1ldGhvZHMgYXJlIGV4cG9zZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGBwcml2YXRlYFxuICAgKiAgZG9lc24ndCB0cmF2ZXJzZSBjbGFzcyBib3VuZGFyaWVzLiBDb25zdW1lciBjb2RlIE1VU1QgTk9UIGNhbGxcbiAgICogIHRoZW07IGNhbGxpbmcgdGhlbSBwb3N0LWNvbnN0cnVjdGlvbiBsZXRzIGEgaG9zdGlsZSBjYWxsZXJcbiAgICogIGZhYnJpY2F0ZSBzdHJ1Y3R1cmUgZXZlbnRzIGFuZCBjb3JydXB0IGRvd25zdHJlYW0gdmlzdWFsaXphdGlvbnNcbiAgICogIG9yIGF1ZGl0IHRyYWlscy4gVGhlIGBfYCBwcmVmaXggaXMgaW50ZW50aW9uYWwgY29udmVudGlvbi4gKi9cbiAgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoZnJvbSwgdG8sIGtpbmQsIGxhYmVsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gKi9cbiAgX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcihcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVEZWNpZGVyQ29tcGxldGUoZGVjaWRlciwgdHlwZSwgYnJhbmNoSWRzLCBkZWZhdWx0QnJhbmNoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIHJvb3RTdGFnZUlkOiBzdHJpbmcsXG4gICAgaXNMYXp5PzogYm9vbGVhbixcbiAgICBzdWJmbG93U3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICBzdWJmbG93UGF0aD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKHN1YmZsb3dJZCwgc3ViZmxvd05hbWUsIHJvb3RTdGFnZUlkLCBpc0xhenksIHN1YmZsb3dTcGVjLCBzdWJmbG93UGF0aCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiBVc2VkIGJ5IGBEZWNpZGVyTGlzdC5sb29wVG9gXG4gICAqICB0byB2YWxpZGF0ZSBhIGJyYW5jaC1zb3VyY2VkIGxvb3AgdGFyZ2V0IGFnYWluc3QgdGhlIGtub3duIHN0YWdlIGlkc1xuICAgKiAgKG1pcnJvcnMgYEZsb3dDaGFydEJ1aWxkZXIubG9vcFRvYCdzIGBfa25vd25TdGFnZUlkcy5oYXNgIGd1YXJkKS4gKi9cbiAgX2tub3duU3RhZ2VJZHNIYXMoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhpZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiBVc2VkIGJ5IGBEZWNpZGVyTGlzdC5sb29wVG9gXG4gICAqICB0byBmaXJlIGEgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIEEgQlJBTkNIIG5vZGUgKG5vdCB0aGUgZGVjaWRlcikuICovXG4gIF9maXJlTG9vcEVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGZyb20sIHRvKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXNjcmlwdGlvbiBoZWxwZXJzIOKUgOKUgFxuXG4gIHByaXZhdGUgX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICBjb25zdCBsaW5lID0gZGVzY3JpcHRpb24gPyBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX0g4oCUICR7ZGVzY3JpcHRpb259YCA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gJHtuYW1lfWA7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGxpbmUpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMuc2V0KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBlbmRTdWJmbG93RGVzY3JpcHRpb24oaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KGlkLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgaWYgKHN1YmZsb3cuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gc3ViZmxvdy5kZXNjcmlwdGlvbi5zcGxpdCgnXFxuJyk7XG4gICAgICBjb25zdCBzdGVwc0lkeCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zdGFydHNXaXRoKCdTdGVwczonKSk7XG4gICAgICBpZiAoc3RlcHNJZHggPj0gMCkge1xuICAgICAgICAvLyBCdWlsZGVyLWNvbXBvc2VkIGRlc2NyaXB0aW9uIChgRmxvd0NoYXJ0OiBYXFxuU3RlcHM6XFxuLi4uYCkuXG4gICAgICAgIC8vIElubGluZSBPTkxZIHRoZSBzdW1tYXJ5IGFib3ZlIGBTdGVwczpgIG9uIHRoZSBtb3VudCBsaW5lLCB0aGVuXG4gICAgICAgIC8vIHJlLWxpc3QgdGhlIHN0ZXAgbGluZXMgb25jZSwgaW5kZW50ZWQuIEVtYmVkZGluZyB0aGUgRlVMTCBpbm5lclxuICAgICAgICAvLyBkZXNjcmlwdGlvbiBoZXJlIEFORCByZS1saXN0aW5nIGl0cyBzdGVwcyBkb3VibGVkIHRoZSB0ZXh0IHBlclxuICAgICAgICAvLyBuZXN0aW5nIGxldmVsIOKAlCBleHBvbmVudGlhbCBncm93dGgsIFJhbmdlRXJyb3IgKFwiSW52YWxpZCBzdHJpbmdcbiAgICAgICAgLy8gbGVuZ3RoXCIpIGF0IH4yMiBuZXN0aW5nIGxldmVscyBvZiBuZXN0ZWQgYnVpbGQoKS5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGxpbmVzLnNsaWNlKDAsIHN0ZXBzSWR4KS5qb2luKCcgJykudHJpbSgpO1xuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goXG4gICAgICAgICAgc3VtbWFyeVxuICAgICAgICAgICAgPyBgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtTdWItRXhlY3V0aW9uOiAke25hbWV9XSDigJQgJHtzdW1tYXJ5fWBcbiAgICAgICAgICAgIDogYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV1gLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RlcHNJZHggKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAobGluZXNbaV0udHJpbSgpKSB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgICR7bGluZXNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZyZWUtZm9ybSAoc2luZ2xlLWJsb2NrKSBkZXNjcmlwdGlvbiDigJQgaW5saW5lIGl0IHdob2xlLCB1bmNoYW5nZWQuXG4gICAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtTdWItRXhlY3V0aW9uOiAke25hbWV9XSDigJQgJHtzdWJmbG93LmRlc2NyaXB0aW9ufWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ29uZmlndXJhdGlvbiDilIDilIBcblxuICBzZXRMb2dnZXIobG9nZ2VyOiBJTG9nZ2VyKTogdGhpcyB7XG4gICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2VyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmUgdGhlIEFQSSBjb250cmFjdCDigJQgaW5wdXQgdmFsaWRhdGlvbiwgb3V0cHV0IHNoYXBlLCBhbmQgb3V0cHV0IG1hcHBlci5cbiAgICogUmVwbGFjZXMgc2V0SW5wdXRTY2hlbWEoKSArIHNldE91dHB1dFNjaGVtYSgpICsgc2V0T3V0cHV0TWFwcGVyKCkgaW4gYSBzaW5nbGUgY2FsbC5cbiAgICpcbiAgICogSWYgYSBjb250cmFjdCB3aXRoIGlucHV0IHNjaGVtYSBpcyBkZWNsYXJlZCwgY2hhcnQucnVuKCkgdmFsaWRhdGVzIGlucHV0IGF1dG9tYXRpY2FsbHkuXG4gICAqIENvbnRyYWN0IGRhdGEgaXMgdXNlZCBieSBjaGFydC50b09wZW5BUEkoKSBhbmQgY2hhcnQudG9NQ1BUb29sKCkuXG4gICAqL1xuICBjb250cmFjdChvcHRzOiB7XG4gICAgaW5wdXQ/OiB1bmtub3duO1xuICAgIG91dHB1dD86IHVua25vd247XG4gICAgbWFwcGVyPzogKGZpbmFsU2NvcGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB1bmtub3duO1xuICB9KTogdGhpcyB7XG4gICAgaWYgKG9wdHMuaW5wdXQpIHRoaXMuX2lucHV0U2NoZW1hID0gb3B0cy5pbnB1dDtcbiAgICBpZiAob3B0cy5vdXRwdXQpIHRoaXMuX291dHB1dFNjaGVtYSA9IG9wdHMub3V0cHV0O1xuICAgIGlmIChvcHRzLm1hcHBlcikgdGhpcy5fb3V0cHV0TWFwcGVyID0gb3B0cy5tYXBwZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgTGluZWFyIENoYWluaW5nIOKUgOKUgFxuXG4gIHN0YXJ0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZXRyeT86IFJldHJ5UG9saWN5OyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX3Jvb3QpIGZhaWwoJ3Jvb3QgYWxyZWFkeSBkZWZpbmVkOyBjcmVhdGUgYSBuZXcgYnVpbGRlcicpO1xuXG4gICAgLy8gRGV0ZWN0IFBhdXNhYmxlSGFuZGxlciBieSBkdWNrLXR5cGluZyAoaGFzIC5leGVjdXRlIHByb3BlcnR5KVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgIGNvbnN0IGlzUGF1c2FibGUgPSB0eXBlb2YgZm4gPT09ICdvYmplY3QnICYmIGZuICE9PSBudWxsICYmICdleGVjdXRlJyBpbiBmbjtcbiAgICBjb25zdCBzdGFnZUZuID0gaXNQYXVzYWJsZVxuICAgICAgPyAoKGZuIGFzIFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+KS5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPilcbiAgICAgIDogKGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBzdGFnZUZuIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHtcbiAgICAgIG5vZGUuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgICBub2RlLnJlc3VtZUZuID0gKGZuIGFzIFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+KS5yZXN1bWU7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBzdGFnZUZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoaXNQYXVzYWJsZSkgc3BlYy5pc1BhdXNhYmxlID0gdHJ1ZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgc3RhcnQoJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYHN0YXJ0KCcke2lkfScpYCk7XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWVkIG5vZGUgZmlyZXMgYG9uU3RhZ2VBZGRlZGAgKG5vIGVkZ2Ug4oCUIG5vIHByZWRlY2Vzc29yKS5cbiAgICAvLyBgaXNQYXVzYWJsZWAgaXMgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBzcGVjIGJ5IGBfZmlyZVN0YWdlQWRkZWRgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGNoYXJ0IHdob3NlIFJPT1Qgc3RhZ2UgSVMgYSBzZWxlY3RvciDigJQgaXQgcnVucyBmaXJzdCAocmVhZGluZ1xuICAgKiBhcmdzLCBzZWVkaW5nIHN0YXRlLCByZXR1cm5pbmcgdGhlIGNob3NlbiBicmFuY2ggaWRzIHZpYSBgc2VsZWN0KClgKSxcbiAgICogYW5kIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gdGhlIHJvb3QuIE1pcnJvcnMgYHN0YXJ0KClgIGZvciB0aGVcbiAgICogcm9vdC1ub2RlIHNldHVwLCB0aGVuIHJldHVybnMgYSBgU2VsZWN0b3JGbkxpc3RgIGJvdW5kIHRvIHRoZSByb290IHNvXG4gICAqIGAuYWRkRnVuY3Rpb25CcmFuY2goKWAgLyBgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgpYCAvIGAuZW5kKClgIHdvcmtcbiAgICogZXhhY3RseSBhcyB0aGV5IGRvIGFmdGVyIGBhZGRTZWxlY3RvckZ1bmN0aW9uKClgLlxuICAgKlxuICAgKiBVc2Ugd2hlbiB0aGUgZmlyc3QgdGhpbmcgYSBjaGFydCBkb2VzIGlzIGNob29zZSBhbW9uZyBicmFuY2hlcyDigJQgZS5nLiBhXG4gICAqIGBDb250ZXh0YCBzZWxlY3RvciB0aGF0IGluaXRzICsgcGlja3Mgd2hpY2ggY29udGV4dCBzbG90cyB0byBlbmdpbmVlcixcbiAgICogd2l0aCBubyBzZXBhcmF0ZSBzZWVkIHN0YWdlIGJlZm9yZSBpdC5cbiAgICovXG4gIHN0YXJ0U2VsZWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbjsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm46IGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIFNlZSBgYWRkU2VsZWN0b3JGdW5jdGlvbmAg4oCUIGBmYWlsRmFzdDogdHJ1ZWAgbWFrZXMgYSBtdWx0aS1icmFuY2hcbiAgICAvLyBzZWxlY3Rpb24gZmFuIG91dCB2aWEgYFByb21pc2UuYWxsYCAoZmlyc3QgZXJyb3IgYWJvcnRzKSBpbnN0ZWFkIG9mIHRoZVxuICAgIC8vIGRlZmF1bHQgYFByb21pc2UuYWxsU2V0dGxlZGAgKGJlc3QtZWZmb3J0KS5cbiAgICBpZiAob3B0aW9ucz8uZmFpbEZhc3QpIG5vZGUuZmFpbEZhc3QgPSB0cnVlO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgc3RhcnRTZWxlY3RvcignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgc3RhcnRTZWxlY3RvcignJHtpZH0nKWApO1xuXG4gICAgdGhpcy5fcm9vdCA9IG5vZGU7XG4gICAgdGhpcy5fcm9vdFNwZWMgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gUm9vdCBzZWxlY3RvciBub2RlIGZpcmVzIG9uU3RhZ2VBZGRlZCB3aXRoIE5PIHByZWRlY2Vzc29yIGVkZ2UgKGl0J3NcbiAgICAvLyB0aGUgcm9vdCkuIEJyYW5jaGVzICsgb25EZWNpZGVyQ29tcGxldGUgY29tZSBmcm9tIHRoZSBTZWxlY3RvckZuTGlzdC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiBuZXcgU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZEZ1bmN0aW9uKG5hbWU6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiwgaWQ6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgLy8gQ2FwdHVyZSB0aGUgcGFyZW50IFNQRUMgcmVmZXJlbmNlIChub3QganVzdCBpZCkgQkVGT1JFIHRoZVxuICAgIC8vIGN1cnNvciBhZHZhbmNlcyDigJQgd2UgbmVlZCBpdHMgYGNoaWxkcmVuYCArIGB0eXBlYCB0byBkZWNpZGVcbiAgICAvLyB3aGV0aGVyIHRoZSBgbmV4dGAgZWRnZSBpcyBhIGZvcmsgY29udmVyZ2VuY2UgKE4gZWRnZXMgZnJvbVxuICAgIC8vIGVhY2ggYnJhbmNoIGNoaWxkKSB2cyBhIHBsYWluIGxpbmVhciBjaGFpbiAoMSBlZGdlIGZyb20gcGFyZW50KS5cbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBMaW5lYXIgbm9kZTogYW5ub3VuY2UgdGhlIG5vZGUgZmlyc3QsIHRoZW4gdGhlIGVkZ2VcbiAgICAvLyBmcm9tIHRoZSBwcmlvciBjdXJzb3IuIE9yZGVyIG1hdHRlcnM6IGVuZHBvaW50cyBhbm5vdW5jZWRcbiAgICAvLyBiZWZvcmUgYW55IGVkZ2UgcmVmZXJlbmNpbmcgdGhlbSAoU3RydWN0dXJlUmVjb3JkZXIgY29udHJhY3QpLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN0cmVhbWluZ0Z1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RyZWFtSWQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgZm4sXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCA/PyBuYW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGU6ICdzdHJlYW1pbmcnLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTdHJlYW1pbmcgc3RhZ2U6IHNhbWUgc2hhcGUgYXMgbGluZWFyIGFkZEZ1bmN0aW9uLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSDigJQgY2FuIHBhdXNlIGV4ZWN1dGlvbiBhbmQgcmVzdW1lIGxhdGVyIHdpdGggaW5wdXQuXG4gICAqXG4gICAqIFRoZSBoYW5kbGVyIGhhcyB0d28gcGhhc2VzOlxuICAgKiAtIGBleGVjdXRlYDogcnVucyBmaXJzdCB0aW1lLiBSZXR1cm4gYW55IG5vbi12b2lkIHZhbHVlIHRvIHBhdXNlIChpdCBiZWNvbWVzXG4gICAqICAgdGhlIGNoZWNrcG9pbnQncyBgcGF1c2VEYXRhYCk7IHJldHVybiB2b2lkL3VuZGVmaW5lZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAgICogLSBgcmVzdW1lYDogcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZCB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogJ0FwcHJvdmU/JyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH0sICdhcHByb3ZlLW9yZGVyJywgJ01hbmFnZXIgYXBwcm92YWwgZ2F0ZScpXG4gICAqIGBgYFxuICAgKi9cbiAgYWRkUGF1c2FibGVGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LCBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgUGF1c2FibGUgc3RhZ2U6IGBfZmlyZVN0YWdlQWRkZWRgIHJlYWRzIGBpc1BhdXNhYmxlYFxuICAgIC8vIGRpcmVjdGx5IGZyb20gYHNwZWMuaXNQYXVzYWJsZWAgKHNldCBhYm92ZSksIHNvIHZpc3VhbGlzZXJzXG4gICAgLy8gc2VlIGl0IG9uIHRoZSBldmVudCBwYXlsb2FkIHdpdGhvdXQgYSBzZXBhcmF0ZSB0aHJlYWRpbmcgYXJnLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2ggKGJ1aWxkZXItbmF0aXZlIGNvbXBvc2l0aW9uKSDilIDilIBcbiAgLy9cbiAgLy8gU3VnYXIgb3ZlciBgYWRkRnVuY3Rpb25gIHRoYXQgZ2VuZXJhdGVzIGEgc3RhZ2Ugd2hpY2ggY2FsbHNcbiAgLy8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAgb3IgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYXQgcnVudGltZS4gWkVSTyBlbmdpbmUgY2hhbmdlcyDigJQgcHVyZSBjb21wb3NpdGlvbiBvdmVyIHRoZVxuICAvLyBleGlzdGluZyBzY29wZS1tZXRob2QgcHJpbWl0aXZlcy5cbiAgLy9cbiAgLy8gRm9yIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgLCB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIHN0b3JlZCBpblxuICAvLyBzaGFyZWQgc3RhdGUgdmlhIGAkc2V0VmFsdWVgICh3aGljaCBieXBhc3NlcyB0aGUgdHlwZWQtcHJveHlcbiAgLy8gdW53cmFwIHRoYXQgd291bGQgb3RoZXJ3aXNlIHN0cmlwIHRoZSBoYW5kbGUncyBjbGFzcyBtZXRob2RzKS5cbiAgLy8gRG93bnN0cmVhbSBzdGFnZXMgcmVhZCBpdCB2aWEgYHNjb3BlW29wdGlvbnMuaGFuZGxlS2V5XWAgb3JcbiAgLy8gYHNjb3BlLiRnZXRWYWx1ZShvcHRpb25zLmhhbmRsZUtleSlgIOKAlCBib3RoIHByZXNlcnZlIG1ldGhvZHNcbiAgLy8gYmVjYXVzZSB0aGUgdmFsdWUgd2FzIHN0b3JlZCByYXcuXG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0YWdlIHRoYXQgZmlyZXMgYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmRcbiAgICogRElTQ0FSRFMgdGhlIGhhbmRsZS4gUHVyZSBmaXJlLWFuZC1mb3JnZXQg4oCUIHVzZWZ1bCBmb3IgdGVsZW1ldHJ5XG4gICAqIGV4cG9ydHMsIGF1ZGl0IGxvZyBzaGlwcGluZywgY2FjaGUgd2FybS11cC5cbiAgICpcbiAgICogQHBhcmFtIGlkIFN0YWJsZSBpZCBmb3IgdGhpcyBzdGFnZSAoYWxzbyB0aGUgc3RhZ2VNYXAga2V5KS5cbiAgICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCBmbG93Y2hhcnQgdG8gZGV0YWNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5kcml2ZXIgVGhlIGRyaXZlciB0byBzY2hlZHVsZSBvbiAoZS5nLiBgbWljcm90YXNrQmF0Y2hEcml2ZXJgKS5cbiAgICogQHBhcmFtIG9wdGlvbnMuaW5wdXRNYXBwZXIgTWFwcyB0aGUgcGFyZW50J3Mgc2NvcGUgdG8gdGhlIGNoaWxkJ3MgaW5wdXQuXG4gICAqICAgRGVmYXVsdHMgdG8gcGFzc2luZyBgdW5kZWZpbmVkYC5cbiAgICogQHBhcmFtIG9wdGlvbnMubW91bnROYW1lIERpc3BsYXkgbmFtZTsgZGVmYXVsdHMgdG8gYGlkYC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZGVzY3JpcHRpb24gU3RhZ2UgZGVzY3JpcHRpb24gZm9yIG5hcnJhdGl2ZSArIHRvb2xzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGZsb3dDaGFydCgncHJvY2VzcycsIHByb2Nlc3NGbiwgJ3Byb2Nlc3MnKVxuICAgKiAgIC5hZGREZXRhY2hBbmRGb3JnZXQoJ3RlbGVtZXRyeScsIHRlbGVtZXRyeUNoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gKHsgZXZlbnQ6ICdwcm9jZXNzZWQnLCBvcmRlcklkOiBzY29wZS5vcmRlcklkIH0pLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCduZXh0JywgbmV4dEZuLCAnbmV4dCcpXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRGV0YWNoQW5kRm9yZ2V0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgb3B0aW9uczoge1xuICAgICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcjtcbiAgICAgIGlucHV0TWFwcGVyPzogKHNjb3BlOiBUU2NvcGUpID0+IHVua25vd247XG4gICAgICBtb3VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5tb3VudE5hbWUgPz8gaWQ7XG4gICAgcmV0dXJuIHRoaXMuYWRkRnVuY3Rpb24oXG4gICAgICBuYW1lLFxuICAgICAgKChzY29wZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gb3B0aW9ucy5pbnB1dE1hcHBlciA/IG9wdGlvbnMuaW5wdXRNYXBwZXIoc2NvcGUgYXMgVFNjb3BlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgc2NvcGUuJGRldGFjaEFuZEZvcmdldChvcHRpb25zLmRyaXZlciwgY2hpbGQsIGlucHV0KTtcbiAgICAgIH0pIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlkLFxuICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0YWdlIHRoYXQgZmlyZXMgYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmRcbiAgICogZGVsaXZlcnMgdGhlIHJlc3VsdGluZyBgRGV0YWNoSGFuZGxlYCB0byBhIGNvbnN1bWVyLXN1cHBsaWVkXG4gICAqIGBvbkhhbmRsZWAgY2FsbGJhY2suIFRoZSBoYW5kbGUgQ0FOTk9UIGJlIHN0b3JlZCBpbiBzaGFyZWQgc3RhdGVcbiAgICog4oCUIGBTdGFnZUNvbnRleHQuc2V0VmFsdWVgIGNhbGxzIGBzdHJ1Y3R1cmVkQ2xvbmVgIHdoaWNoIGRyb3BzXG4gICAqIGNsYXNzIHByb3RvdHlwZXMgKGFuZCB0aGVyZWZvcmUgdGhlIGhhbmRsZSdzIGAud2FpdCgpYCBtZXRob2QpLlxuICAgKlxuICAgKiBUaGUgY2FsbGJhY2sgcGF0dGVybiBpcyB0aGUgZXhwbGljaXQgYWx0ZXJuYXRpdmU6IGtlZXAgaGFuZGxlcyBpblxuICAgKiBhIGNsb3N1cmUtbG9jYWwgYXJyYXkgKG9yIHdoYXRldmVyIHNoYXBlIHN1aXRzKSBhbmQgaGF2ZSBhXG4gICAqIGRvd25zdHJlYW0gc3RhZ2UgYGF3YWl0IFByb21pc2UuYWxsKC4uLilgIG92ZXIgdGhlbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKiBpbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGhhbmRsZXM6IERldGFjaEhhbmRsZVtdID0gW107XG4gICAqXG4gICAqIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdzZWVkJywgc2VlZEZuLCAnc2VlZCcpXG4gICAqICAgLmFkZERldGFjaEFuZEpvaW5MYXRlcignZXZhbC1hJywgZXZhbENoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gc2NvcGUuY29uZmlnQSxcbiAgICogICAgIG9uSGFuZGxlOiAoaCkgPT4gaGFuZGxlcy5wdXNoKGgpLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZERldGFjaEFuZEpvaW5MYXRlcignZXZhbC1iJywgZXZhbENoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gc2NvcGUuY29uZmlnQixcbiAgICogICAgIG9uSGFuZGxlOiAoaCkgPT4gaGFuZGxlcy5wdXNoKGgpLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdqb2luJywgYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoKGgpID0+IGgud2FpdCgpKSk7XG4gICAqICAgICBzY29wZS5yZXN1bHRzID0gc2V0dGxlZDtcbiAgICogICB9LCAnam9pbicpXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBOb3RlOiBwdXR0aW5nIGBoYW5kbGVzYCBpbiBhIG1vZHVsZS1sZXZlbCBjbG9zdXJlIGlzIGZpbmUgZm9yXG4gICAqIHNpbmdsZS1ydW4gc2NyaXB0cy4gRm9yIHNlcnZlciBjb2RlIHRoYXQgcnVucyB0aGUgc2FtZSBjaGFydFxuICAgKiBjb25jdXJyZW50bHkgYWNyb3NzIHJlcXVlc3RzLCBhbGxvY2F0ZSBhIG5ldyBjbG9zdXJlIHBlciBydW5cbiAgICogKGUuZy4sIHdyYXAgY2hhcnQgY29uc3RydWN0aW9uIGluIGEgZmFjdG9yeSBmdW5jdGlvbikgc28gaGFuZGxlc1xuICAgKiBmcm9tIGRpZmZlcmVudCBydW5zIGRvbid0IGJsZWVkIGludG8gZWFjaCBvdGhlci5cbiAgICovXG4gIGFkZERldGFjaEFuZEpvaW5MYXRlcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5GbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXI7XG4gICAgICBvbkhhbmRsZTogKGhhbmRsZTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUpID0+IHZvaWQ7XG4gICAgICBpbnB1dE1hcHBlcj86IChzY29wZTogVFNjb3BlKSA9PiB1bmtub3duO1xuICAgICAgbW91bnROYW1lPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubW91bnROYW1lID8/IGlkO1xuICAgIHJldHVybiB0aGlzLmFkZEZ1bmN0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgICgoc2NvcGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIgPyBvcHRpb25zLmlucHV0TWFwcGVyKHNjb3BlIGFzIFRTY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIob3B0aW9ucy5kcml2ZXIsIGNoaWxkLCBpbnB1dCk7XG4gICAgICAgIG9wdGlvbnMub25IYW5kbGUoaGFuZGxlKTtcbiAgICAgIH0pIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlkLFxuICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIEJyYW5jaGluZyDilIDilIBcblxuICBhZGREZWNpZGVyRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyB0aGUgREVDSURFUiBTVEFHRSBhIHJldHJ5IHBvbGljeS4gRGVjbGFyZWQgaGVyZSByYXRoZXJcbiAgICAgKiAgdGhhbiB2aWEgYC5yZXRyeSgpYCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYSBgRGVjaWRlckxpc3RgLCB3aGVyZSBhXG4gICAgICogIGNoYWluZWQgbW9kaWZpZXIgY291bGQgbWVhbiB0aGUgZGVjaWRlciBPUiB0aGUgYnJhbmNoIGp1c3QgYWRkZWQ7XG4gICAgICogIGB7IHRhZ3MgfWAgbGlrZXdpc2UuICovXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc0RlY2lkZXI6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkRGVjaWRlckZ1bmN0aW9uKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGREZWNpZGVyRnVuY3Rpb24oJyR7aWR9JylgKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgRGVjaWRlciBub2RlIGlzIHJlYWNoZWQgdmlhIGEgYG5leHRgIGVkZ2UgZnJvbSB0aGUgcHJpb3JcbiAgICAvLyBjdXJzb3IuIEJyYW5jaGVzIHRoZW1zZWx2ZXMgZmlyZSB2aWEgYGFkZEZ1bmN0aW9uQnJhbmNoYCBldGMuXG4gICAgLy8gYG9uRGVjaWRlckNvbXBsZXRlYCBmaXJlcyBmcm9tIHN1Yi1idWlsZGVyIGAuZW5kKClgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZFNlbGVjdG9yRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyB0aGUgU0VMRUNUT1IgU1RBR0UgYSByZXRyeSBwb2xpY3kg4oCUIHNhbWUgcmVhc29uaW5nIGFzXG4gICAgICogIGBhZGREZWNpZGVyRnVuY3Rpb25gOiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgc3ViLWJ1aWxkZXIsIHNvIGEgY2hhaW5lZFxuICAgICAqICBgLnJldHJ5KClgIHdvdWxkIGJlIGFtYmlndW91czsgYHsgdGFncyB9YCBsaWtld2lzZS4gKi9cbiAgICBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW47IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBpZiAoY3VyLnNlbGVjdG9yRm4pIGZhaWwoYHNlbGVjdG9yIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5kZWNpZGVyRm4pIGZhaWwoYGRlY2lkZXIgYW5kIHNlbGVjdG9yIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIGBmYWlsRmFzdGA6IHdoZW4gdGhlIHNlbGVjdG9yIHBpY2tzIOKJpTIgYnJhbmNoZXMgdGhleSBmYW4gb3V0IGluIHBhcmFsbGVsXG4gICAgLy8gdmlhIENoaWxkcmVuRXhlY3V0b3IuIERlZmF1bHQgPSBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQ6IGV2ZXJ5XG4gICAgLy8gYnJhbmNoIHJ1bnMgdG8gY29tcGxldGlvbiBldmVuIGlmIHNvbWUgZmFpbCkuIGBmYWlsRmFzdDogdHJ1ZWAgPSBgUHJvbWlzZS5hbGxgXG4gICAgLy8gKHRoZSBmaXJzdCBicmFuY2ggZXJyb3IgcmVqZWN0cyArIGFib3J0cykg4oCUIHVzZSB3aGVuIEFMTCBzZWxlY3RlZCBicmFuY2hlc1xuICAgIC8vIGFyZSBSRVFVSVJFRCAoZS5nLiBhc3NlbWJsaW5nIGEgcmVxdWVzdCBmcm9tIGluZGVwZW5kZW50LWJ1dC1yZXF1aXJlZCBwYXJ0cyksXG4gICAgLy8gbm90IGJlc3QtZWZmb3J0IGZhbi1vdXQuIFNhbWUgZmxhZyBgYWRkTGlzdE9mRnVuY3Rpb25gIGV4cG9zZXMuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWxlY3RvciBub2RlOiBzYW1lIGFzIGRlY2lkZXIuIEJyYW5jaGVzICsgY29tcGxldGUgZXZlbnRcbiAgICAvLyBjb21lIGZyb20gdGhlIFNlbGVjdG9yRm5MaXN0IHN1Yi1idWlsZGVyLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQYXJhbGxlbCAoRm9yaykg4pSA4pSAXG5cbiAgYWRkTGlzdE9mRnVuY3Rpb24oY2hpbGRyZW46IFNpbXBsaWZpZWRQYXJhbGxlbFNwZWM8VE91dCwgVFNjb3BlPltdLCBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW4gfSk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBjdXIuZmFpbEZhc3QgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiwgcmV0cnksIHRhZ3MgfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkIH07XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgfTtcbiAgICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgcmV0cnksIGBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZCAnJHtpZH0nYCk7XG4gICAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgdGFncywgYGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkICcke2lkfSdgKTtcblxuICAgICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAgIC8vIEw3LjMg4oCUIGZpcmUgc3RydWN0dXJlIGV2ZW50cyBmb3IgdGhlIGNoaWxkICsgdGhlIGZvcmsgZWRnZS5cbiAgICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjdXJTcGVjLmlkLCBzcGVjLmlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUgfHwgYy5pZCkuam9pbignLCAnKTtcbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFJ1bnMgaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gKTtcblxuICAgIHRoaXMuX2N1cnNvclRhaWwgPSBgdGhlIHBhcmFsbGVsIGNoaWxkcmVuICgke2NoaWxkTmFtZXN9KWA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIE9ORSBCUkFOQ0ggUEVSIElURU0sIGluIHBhcmFsbGVsIOKAlCB3aXRoIHRoZSBudW1iZXIgb2YgYnJhbmNoZXMgZGVjaWRlZFxuICAgKiBhdCBSVU4gdGltZSBmcm9tIHRoZSBwYXlsb2FkIHJhdGhlciB0aGFuIGF0IGJ1aWxkIHRpbWUuXG4gICAqXG4gICAqIGBhZGRMaXN0T2ZGdW5jdGlvbmAgZmFucyBvdXQgYSBmaXhlZCBzZXQgb2YgYnJhbmNoZXMgeW91IG5hbWUgaW4gdGhlIGNoYXJ0LlxuICAgKiBUaGlzIGZhbnMgb3V0IG92ZXIgZGF0YSB0aGUgY2hhcnQgaGFzIG5vdCBzZWVuIHlldDogdGhyZWUgY2h1bmtzIG1ha2UgdGhyZWVcbiAgICogYnJhbmNoZXMsIHRlbiBtYWtlIHRlbi4gRWFjaCBicmFuY2ggcnVucyBhcyBpdHMgb3duIGlzb2xhdGVkIHN1YmZsb3cg4oCUIGl0c1xuICAgKiBvd24gbWVtb3J5LCBpdHMgb3duIGNvbW1pdCBsb2csIGFkZHJlc3NhYmxlIGluIGV2ZXJ5IHRyYWNlIHF1ZXJ5IGF0XG4gICAqIGA8c3RhZ2VJZD5+PGluZGV4PmAg4oCUIHNvIGJyYW5jaGVzIGNhbm5vdCBjb3JydXB0IGVhY2ggb3RoZXIncyBpbi1mbGlnaHRcbiAgICogc3RhdGUsIGFuZCBhIGJhY2t3YXJkIHNsaWNlIHRocm91Z2ggYSBicmFuY2ggcmVzdWx0IHdvcmtzIHdpdGggbm8gc3BlY2lhbFxuICAgKiBoYW5kbGluZy4gRGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgICBEaXNwbGF5IGxhYmVsIGZvciB0aGUgZmFuLW91dCBzdGFnZS5cbiAgICogQHBhcmFtIGlkICAgICBTdGFibGUgc3RhZ2UgaWQuIE1heSBub3QgY29udGFpbiBgfmAgKHJlc2VydmVkIOKAlCB0aGUgYnJhbmNoXG4gICAqICAgICAgICAgICAgICAgc2VnbWVudHMgYXJlIGJ1aWx0IGZyb20gdGhpcyBpZCkuXG4gICAqIEBwYXJhbSBjb25maWcgYHsgaXRlbXMsIGJyYW5jaCwgbWF4QnJhbmNoZXMsIGludG8sIGZhaWxGYXN0PyB9YDpcbiAgICogICAtIGBpdGVtcyhzY29wZSlgIHBpY2tzIHdoYXQgdG8gZmFuIG91dCBvdmVyIChyZWFkcyBhcmUgdHJhY2tlZCk7XG4gICAqICAgLSBgYnJhbmNoKGl0ZW0sIGluZGV4KWAgYnVpbGRzIHRoZSBjaGFydCBmb3IgT05FIGl0ZW0gKGVhY2ggYnJhbmNoJ3NcbiAgICogICAgIHNjb3BlIGlzIGFsc28gc2VlZGVkIHdpdGggYGl0ZW1gIGFuZCBgaW5kZXhgLCBzbyB0aGUgaW5wdXQgaXMgaW4gdGhlXG4gICAqICAgICB0cmFjZSByYXRoZXIgdGhhbiBoaWRkZW4gaW4gYSBjbG9zdXJlKTtcbiAgICogICAtIGBtYXhCcmFuY2hlc2AgaXMgUkVRVUlSRUQg4oCUIGFuIHVuYm91bmRlZCBmYW4tb3V0IGRyaXZlbiBieSBtb2RlbCBvdXRwdXRcbiAgICogICAgIGlzIGEgcmVzb3VyY2UgYXR0YWNrLCBzbyB0aGVyZSBpcyBubyBkZWZhdWx0IHRvIGZvcmdldC4gRXh0cmEgaXRlbXMgZG9cbiAgICogICAgIG5vdCBydW4gYW5kIHRoZSB0cnVuY2F0aW9uIGlzIHJlY29yZGVkO1xuICAgKiAgIC0gYGludG9gIGlzIFJFUVVJUkVEIOKAlCB0aGUgc3RhdGUga2V5IHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgd3JpdHRlblxuICAgKiAgICAgdG8uIGBpbnRvW2ldYCBpcyBicmFuY2ggYGlgJ3MgcmVzdWx0LCBpbiBJVEVNUyBvcmRlciwgd2hhdGV2ZXIgb3JkZXJcbiAgICogICAgIHRoZSBicmFuY2hlcyBmaW5pc2hlZCBpbjtcbiAgICogICAtIGBmYWlsRmFzdGAgaXMgdGhlIHNhbWUgcG9saWN5IHRoZSByZXN0IG9mIHRoZSBsaWJyYXJ5J3MgcGFyYWxsZWxpc21cbiAgICogICAgIHVzZXM6IGB0cnVlYCByZWplY3RzIG9uIHRoZSBmaXJzdCBmYWlsaW5nIGJyYW5jaCwgb21pdHRlZCBydW5zIHRoZW0gYWxsXG4gICAqICAgICBiZXN0LWVmZm9ydCAoYSBmYWlsZWQgYnJhbmNoJ3Mgc2xvdCBpcyBgdW5kZWZpbmVkYCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGZsb3dDaGFydDxTdGF0ZT4oJ1NwbGl0Jywgc3BsaXRGbiwgJ3NwbGl0JylcbiAgICogICAuYWRkUGFyYWxsZWxGb3JFYWNoKCdSZXZpZXcgZWFjaCBjaHVuaycsICdyZXZpZXctY2h1bmtzJywge1xuICAgKiAgICAgaXRlbXM6IChzY29wZSkgPT4gc2NvcGUuY2h1bmtzLFxuICAgKiAgICAgYnJhbmNoOiAoY2h1bmssIGkpID0+IGJ1aWxkUmV2aWV3Q2hhcnQoY2h1bmssIGkpLFxuICAgKiAgICAgbWF4QnJhbmNoZXM6IDgsXG4gICAqICAgICBpbnRvOiAncmV2aWV3cycsXG4gICAqICAgfSlcbiAgICogICAuYWRkRnVuY3Rpb24oJ01lcmdlJywgbWVyZ2VGbiwgJ21lcmdlJykgICAvLyByZWFkcyBzY29wZS5yZXZpZXdzXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkUGFyYWxsZWxGb3JFYWNoPFRJdGVtID0gYW55PihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb25maWc6IFBhcmFsbGVsRm9yRWFjaENvbmZpZzxUSXRlbSwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgLy8gVGhlIGdlbmVyYXRlZCBicmFuY2ggc2VnbWVudHMgZW1iZWQgdGhpcyBpZCB2ZXJiYXRpbVxuICAgIC8vIChgPGlkPn48aW5kZXg+YCksIHNvIGEgbWFya2VyIGluc2lkZSBpdCB3b3VsZCBtYWtlIHRoZSBzZWdtZW50XG4gICAgLy8gYW1iaWd1b3VzIHRvIHBhcnNlLiBSZWZ1c2luZyBpdCBoZXJlIOKAlCBvbiBhIGJyYW5kLW5ldyBtZXRob2QsIGF0IHplcm9cbiAgICAvLyBiYWNrLWNvbXBhdCBjb3N0IOKAlCBraWxscyB0aGUgYW1iaWd1aXR5IGNsYXNzIG91dHJpZ2h0IGFuZCBrZWVwc1xuICAgIC8vIGBwYXJzZUJyYW5jaFNlZ21lbnRgIGEgc3BsaXQgYXQgdGhlIGxhc3QgbWFya2VyIGluc3RlYWQgb2YgYSBoZXVyaXN0aWMuXG4gICAgaWYgKGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIoaWQpKSB7XG4gICAgICBmYWlsKGJyYW5jaFNlZ21lbnRSZXNlcnZhdGlvbk1lc3NhZ2UoJ3BhcmFsbGVsRm9yRWFjaCBzdGFnZSBpZCcsIGlkKSk7XG4gICAgfVxuICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcuaXRlbXMgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGNvbmZpZy5icmFuY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZhaWwoYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBpdGVtcyhzY29wZSkgYW5kIGJyYW5jaChpdGVtLCBpbmRleCkgZnVuY3Rpb25zLmApO1xuICAgIH1cbiAgICAvLyBSRVFVSVJFRCwgYm90aCBvZiB0aGVtIOKAlCBzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQgKEQyKS5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5tYXhCcmFuY2hlcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29uZmlnLm1heEJyYW5jaGVzKSB8fCBjb25maWcubWF4QnJhbmNoZXMgPCAxKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIG1heEJyYW5jaGVzIOKAlCBhIHBvc2l0aXZlIGludGVnZXIgY2VpbGluZyBvbiBob3cgbWFueSBgICtcbiAgICAgICAgICAnYnJhbmNoZXMgb25lIGV4ZWN1dGlvbiBtYXkgc3RhcnQuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBkZWZhdWx0OiBhbiB1bmJvdW5kZWQgZmFuLW91dCAnICtcbiAgICAgICAgICAnZHJpdmVuIGJ5IHJ1bnRpbWUgZGF0YSAobW9kZWwgb3V0cHV0LCBhbiB1cHN0cmVhbSBBUEkpIGlzIGEgcmVzb3VyY2UgYXR0YWNrLiBQaWNrIHRoZSAnICtcbiAgICAgICAgICAnbGFyZ2VzdCBudW1iZXIgdGhpcyBmbG93IGNhbiBhZmZvcmQuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuaW50byAhPT0gJ3N0cmluZycgfHwgY29uZmlnLmludG8gPT09ICcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIGludG8g4oCUIHRoZSBzdGF0ZSBrZXkgaXRzIG9yZGVyZWQgcmVzdWx0cyBhcnJheSBpcyBgICtcbiAgICAgICAgICAnd3JpdHRlbiB0by4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIGRlZmF1bHQgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZDogYSBkZXJpdmVkIGtleSAnICtcbiAgICAgICAgICAnY291bGQgc2lsZW50bHkgb3ZlcndyaXRlIHN0YXRlIHRoZSBjaGFydCBhbHJlYWR5IG93bnMuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzRHluYW1pY1BhcmFsbGVsOiB0cnVlLFxuICAgICAgcGFyYWxsZWxGb3JFYWNoOiBjb25maWcgYXMgUGFyYWxsZWxGb3JFYWNoQ29uZmlnPGFueSwgVFNjb3BlPixcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChjb25maWcuZmFpbEZhc3QgIT09IHVuZGVmaW5lZCkgbm9kZS5mYWlsRmFzdCA9IGNvbmZpZy5mYWlsRmFzdDtcblxuICAgIC8vIGB0eXBlOiAnZm9yaydgIOKAlCBhIGZhbi1vdXQgaXMgd2hhdCB0aGlzIGlzLCBhbmQgZXZlcnkgZXhpc3RpbmcgY29uc3VtZXJcbiAgICAvLyBhbHJlYWR5IGtub3dzIGhvdyB0byBkcmF3IG9uZS4gVGhlIFwiYnJhbmNoZXMgYXJlIGRlY2lkZWQgYXQgcnVudGltZVwiXG4gICAgLy8gZGV0YWlsIHJpZGVzIGBpc0R5bmFtaWNQYXJhbGxlbGAgcmF0aGVyIHRoYW4gYSBuZXcgbm9kZSB0eXBlLCBzbyBub3RoaW5nXG4gICAgLy8gZG93bnN0cmVhbSBoYXMgdG8gbGVhcm4gYSBuZXcgd29yZCB0byBrZWVwIHdvcmtpbmcuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ2ZvcmsnLCBpc0R5bmFtaWNQYXJhbGxlbDogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbiA/PyBgUnVucyBvbmUgYnJhbmNoIHBlciBpdGVtIGludG8gJyR7Y29uZmlnLmludG99J2ApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN1YmZsb3cgTW91bnRpbmcg4pSA4pSAXG5cbiAgYWRkU3ViRmxvd0NoYXJ0KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIG1vdW50TmFtZT86IHN0cmluZywgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICB0aGlzLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkUm9vdCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgIH07XG5cbiAgICAvLyBUaGUgbW91bnQncyBPTkxZIHRhZyBzaXRlOiB0aGUgY3Vyc29yIHN0YXlzIG9uIHRoZSBwYXJlbnQgKHNlZVxuICAgIC8vIGBfY3Vyc29yVGFpbGApLCBzbyBgLnRhZygpYCBhZnRlciB0aGlzIGNhbGwgcmVmdXNlcy5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydCgnJHtpZH0nKWApO1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIC8vIEw3LjMg4oCUIFN1YmZsb3cgbW91bnQ6IHN0YWdlIGV2ZW50ICsgZm9yayBlZGdlICsgbW91bnQgbGlmZWN5Y2xlXG4gICAgLy8gZXZlbnQuIE1vdW50LW9ubHkgc2VtYW50aWNzOiBwYXJlbnQgcmVjb3JkZXJzIGRvIE5PVCByZXBsYXkgdGhlXG4gICAgLy8gc3ViZmxvdydzIG93biBpbnRlcm5hbCBzdHJ1Y3R1cmUgZXZlbnRzLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBzdWJmbG93IG1vdW50ICcke3N1YmZsb3dOYW1lfSdgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnQoJyR7aWR9JylgKTtcblxuICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgc3ViZmxvdyBwYXJhbGxlbCBtb3VudC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIGlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB0aGlzLl9maXJlU3ViZmxvd01vdW50ZWQoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbTGF6eSBTdWItRXhlY3V0aW9uOiAke3N1YmZsb3dOYW1lfV1gKTtcblxuICAgIHRoaXMuX2N1cnNvclRhaWwgPSBgdGhlIGxhenkgc3ViZmxvdyBtb3VudCAnJHtzdWJmbG93TmFtZX0nYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzb2x2ZXI6ICgpID0+IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3QgYWRkIHN1YmZsb3cgYXMgbmV4dCB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBMYXp5IGxpbmVhci1tb3VudCBzdWJmbG93LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtMYXp5IFN1Yi1FeGVjdXRpb246ICR7c3ViZmxvd05hbWV9XWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICB0aGlzLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkUm9vdCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhdHRhY2hlZFNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgIH07XG5cbiAgICAvLyBBIGxpbmVhciBtb3VudCBtb3ZlcyB0aGUgY3Vyc29yLCBzbyBgLnRhZygpYCBhZnRlciBpdCBhbHNvIHdvcmtzIOKAlFxuICAgIC8vIGBhcHBseVRhZ3NgIHJlZnVzZXMgYSBzZWNvbmQgZGVjbGFyYXRpb24gaWYgYm90aCBzaXRlcyBhcmUgdXNlZC5cbiAgICBhcHBseVRhZ3Mobm9kZSwgYXR0YWNoZWRTcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU3ViRmxvd0NoYXJ0TmV4dCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IGF0dGFjaGVkU3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKGF0dGFjaGVkU3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIC8vIEw3LjMg4oCUIExpbmVhci1tb3VudCBzdWJmbG93LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKGF0dGFjaGVkU3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG5cbiAgICB0aGlzLl9tZXJnZVN0YWdlTWFwKHN1YmZsb3cuc3RhZ2VNYXAsIGlkKTtcbiAgICB0aGlzLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcbiAgICB0aGlzLl9hcHBlbmRTdWJmbG93RGVzY3JpcHRpb24oaWQsIHN1YmZsb3dOYW1lLCBzdWJmbG93KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJldHJ5IOKUgOKUgFxuXG4gIC8qKlxuICAgKiBHaXZlIHRoZSBzdGFnZSB5b3UgSlVTVCBhZGRlZCBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeS5cbiAgICpcbiAgICogIyMgV2h5IGRlY2xhcmUgaXQgaW5zdGVhZCBvZiB3cml0aW5nIGEgbG9vcCBpbnNpZGUgdGhlIHN0YWdlXG4gICAqXG4gICAqIEEgcmV0cnkgaGFuZC1yb2xsZWQgaW5zaWRlIGEgc3RhZ2UgZnVuY3Rpb24gaXMgaW52aXNpYmxlIHRvIHRoZSB0cmFjZS4gVGhlXG4gICAqIG5hcnJhdGl2ZSBzaG93cyBvbmUgc3RhZ2UsIHRoZSBjb21taXQgbG9nIHNob3dzIG9uZSBlbnRyeSwgYW5kIHRoZSB0d29cbiAgICogZmFpbGVkIGNhbGxzIHRoYXQgY2FtZSBiZWZvcmUgdGhlIHN1Y2Nlc3NmdWwgb25lIGxlZnQgbm8gbWFyayBhbnl3aGVyZSDigJRcbiAgICogYW4gdW5leHBsYWluZWQgYmVoYXZpb3VyIGluIGEgbGlicmFyeSB3aG9zZSB3aG9sZSBwb2ludCBpcyB0aGF0IG5vdGhpbmdcbiAgICogaW52aXNpYmxlIGhhcHBlbnMuIERlY2xhcmVkIGhlcmUsIGV2ZXJ5IGF0dGVtcHQgaXMgcGFydCBvZiB0aGUgcmVjb3JkOiBlYWNoXG4gICAqIGZhaWxlZCBhdHRlbXB0IGZpcmVzIGBGbG93UmVjb3JkZXIub25TdGFnZVJldHJ5YCBhbmQgYXBwZWFycyBpbiB0aGVcbiAgICogbmFycmF0aXZlLCBpbiBvcmRlciwgYmV0d2VlbiB0aGUgYXR0ZW1wdHMnIG93biByZWFkcyBhbmQgd3JpdGVzLlxuICAgKlxuICAgKiAjIyBXaGF0IGFuIGF0dGVtcHQgaXNcbiAgICpcbiAgICogQSBmYWlsZWQgYXR0ZW1wdCdzIHN0YWdlZCB3cml0ZXMgYXJlIERJU0NBUkRFRCDigJQgdGhlIG5leHQgYXR0ZW1wdCBzdGFydHNcbiAgICogZnJvbSBjb21taXR0ZWQgc3RhdGUsIG5ldmVyIGZyb20gdGhlIHdyZWNrYWdlIG9mIHRoZSBsYXN0IHRyeS4gVGhlIGZpbmFsXG4gICAqIGF0dGVtcHQgYmVoYXZlcyBleGFjdGx5IGFzIGEgc3RhZ2Ugd2l0aCBubyBwb2xpY3kgZG9lczogb24gc3VjY2VzcyBpdFxuICAgKiBjb21taXRzOyBvbiBmYWlsdXJlIGl0IGNvbW1pdHMgd2hhdCBpdCB3cm90ZSBhbmQgcmV0aHJvd3MgKGZvb3RwcmludCBoYXNcbiAgICogbmV2ZXIgaGFkIHJvbGxiYWNrLCBhbmQgcmV0cnkgZG9lcyBub3QgaW50cm9kdWNlIG9uZSkuXG4gICAqXG4gICAqIEEgcGF1c2UgaXMgbm90IGEgZmFpbHVyZTogbmVpdGhlciBgYWRkUGF1c2FibGVGdW5jdGlvbmAncyBwYXVzZSBub3JcbiAgICogYGludGVycnVwdCgpYCBpcyBldmVyIHJldHJpZWQuIE5vciBpcyBhIGNhbmNlbGxlZCBydW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGZsb3dDaGFydDxTdGF0ZT4oJ0ZldGNoIHVzZXInLCBmZXRjaEZuLCAnZmV0Y2gtdXNlcicpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDaGFyZ2UgY2FyZCcsIGNoYXJnZUZuLCAnY2hhcmdlJylcbiAgICogICAucmV0cnkoeyBhdHRlbXB0czogMywgYmFja29mZk1zOiAobikgPT4gMTAwICogMiAqKiAobiAtIDEpIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDb25maXJtJywgY29uZmlybUZuLCAnY29uZmlybScpXG4gICAqIGBgYFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHRoZSBDVVJSRU5UIGN1cnNvciDigJQgdGhlIHN0YWdlIGFkZGVkIGJ5IHRoZSBpbW1lZGlhdGVseVxuICAgKiBwcmVjZWRpbmcgYHN0YXJ0KClgIC8gYGFkZEZ1bmN0aW9uKClgIC8gYGFkZFN0cmVhbWluZ0Z1bmN0aW9uKClgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb24oKWAuIFdoZXJlIHRoZSBjdXJzb3Igd291bGQgYmUgYW1iaWd1b3VzIChhIGRlY2lkZXIsXG4gICAqIHNlbGVjdG9yLCBicmFuY2gsIG9yIGZvcmsgY2hpbGQpLCBkZWNsYXJlIHRoZSBwb2xpY3kgaW4gdGhhdCBtZXRob2QncyBvd25cbiAgICogYHJldHJ5YCBvcHRpb24gaW5zdGVhZC5cbiAgICovXG4gIHJldHJ5KHBvbGljeTogUmV0cnlQb2xpY3kpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICAvLyBBIHN1YmZsb3cgbW91bnQgLyBwYXJhbGxlbCBmb3JrIGhhbmdzIENISUxEUkVOIG9mZiB0aGUgY3VycmVudCBzdGFnZSBhbmRcbiAgICAvLyBsZWF2ZXMgdGhlIGN1cnNvciBvbiB0aGF0IHN0YWdlLiBBdHRhY2hpbmcgdGhlIHBvbGljeSB0byB0aGUgY3Vyc29yIGhlcmVcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXRyeSB0aGUgc3RhZ2UgQkVGT1JFIHRoZSB0aGluZyB5b3UganVzdCB3cm90ZS5cbiAgICBpZiAodGhpcy5fY3Vyc29yVGFpbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGZvbGxvdyAke3RoaXMuX2N1cnNvclRhaWx9IOKAlCB0aGF0IGF0dGFjaGVzIHRvICcke2N1ci5uYW1lfScgd2l0aG91dCBtb3ZpbmcgdGhlIGN1cnNvciwgc28gYCArXG4gICAgICAgICAgYHRoZSBwb2xpY3kgd291bGQgbGFuZCBvbiAnJHtjdXIubmFtZX0nIHJhdGhlciB0aGFuIG9uIHdoYXQgeW91IGp1c3QgYWRkZWQuIERlY2xhcmUgdGhlIHBvbGljeSBhdCBpdHMgb3duIGAgK1xuICAgICAgICAgICdzaXRlIGluc3RlYWQ6IG9uIHRoZSBzdGFnZXMgSU5TSURFIGEgc3ViZmxvdyBjaGFydCwgb3IgdmlhIHRoZSBgcmV0cnlgIGZpZWxkIG9uIGFuIGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLnJldHJ5KSBmYWlsKGByZXRyeSBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIuaXNTdWJmbG93Um9vdCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHN1YmZsb3cgbW91bnQgJyR7Y3VyLm5hbWV9JyDigJQgYSBtb3VudCBoYXMgbm8gc3RhZ2UgZnVuY3Rpb24gb2YgaXRzIG93bi4gYCArXG4gICAgICAgICAgJ0RlY2xhcmUgdGhlIHBvbGljeSBvbiB0aGUgc3RhZ2VzIElOU0lERSB0aGUgc3ViZmxvdyBjaGFydCBpbnN0ZWFkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzRHluYW1pY1BhcmFsbGVsKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgcmV0cnkoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgcGFyYWxsZWwtZm9yLWVhY2ggc3RhZ2UgJyR7Y3VyLm5hbWV9JyDigJQgaXQgaGFzIG5vIHN0YWdlIGZ1bmN0aW9uIG9mIGl0cyBgICtcbiAgICAgICAgICAnb3duLiBEZWNsYXJlIHRoZSBwb2xpY3kgb24gdGhlIHN0YWdlcyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCBpdHMgYGJyYW5jaGAgZmFjdG9yeSByZXR1cm5zLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzTG9vcFJlZikgZmFpbChgcmV0cnkoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgbG9vcCByZWZlcmVuY2UgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgYXBwbHlSZXRyeVBvbGljeShjdXIsIGN1clNwZWMsIHBvbGljeSwgYHJldHJ5KCkgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERlY2xhcmVkIHRhZ3Mg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFB1dCBOQU1FUyBvbiB0aGUgc3RhZ2UgeW91IEpVU1QgYWRkZWQuIFRoZSBmaXJzdCBjb21taXQgYnVuZGxlIG9mIGVhY2hcbiAgICogZXhlY3V0aW9uIG9mIHRoYXQgc3RhZ2UgY2FycmllcyB0aGVtIChgQ29tbWl0QnVuZGxlLnRhZ3NgIOKAlCB0aGUgYnVuZGxlXG4gICAqIGBjb21taXRTdG9wc2Aga2V5cyBvbiksIGFuZCB0aGUgYnVpbHQgc3BlYyBhZHZlcnRpc2VzIHRoZW1cbiAgICogKGBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUudGFnc2ApLlxuICAgKlxuICAgKiAjIyBXaHkgZGVjbGFyZSBpdCBpbnN0ZWFkIG9mIGRlcml2aW5nIGl0IGZyb20gaWRzXG4gICAqXG4gICAqIEEgcmVhZGVyIHRoYXQgd2FudHMgXCJ0aGUgTExNIHR1cm5zXCIgb2YgYSBzdG9yZWQgcmVjb3JkaW5nIGhhZCB0byBjbGFzc2lmeVxuICAgKiBzdGFnZXMgZnJvbSB0aGVpciBpZHMg4oCUIGEgc3dpdGNoIG92ZXIgYHJ1bnRpbWVTdGFnZUlkYCB0aGF0IHBhcnNlcyBgI2AgYW5kXG4gICAqIGAvYCwgbGl2ZXMgaW4gdGhlIGNvbnN1bWVyLCBhbmQgc2lsZW50bHkgZ29lcyBzdGFsZSB3aGVuIGEgc3RhZ2UgaXNcbiAgICogcmVuYW1lZC4gRGVjbGFyZWQgaGVyZSwgdGhlIG5hbWUgdHJhdmVscyBXSVRIIHRoZSBjb21taXQ6IGEgcmVjb3JkaW5nIGZyb21cbiAgICogYW55IGNoYXJ0IGNhcnJpZXMgaXRzIG93biBtaWxlc3RvbmVzLCBhbmQgYHRhZ1N0b3BzYCAoZm9vdHByaW50anMvdHJhY2UpXG4gICAqIHNjcnVicyB0aGVtIHdpdGggbm8gaWQgY29udmVudGlvbnMgYXQgYWxsLlxuICAgKlxuICAgKiAjIyBXaGF0IGEgdGFnIGlzLCBhbmQgaXMgbm90XG4gICAqXG4gICAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lIOKAlCBuZXZlciBhIHZhbHVlLiBUaGVyZSBpcyBub1xuICAgKiBydW4tdGltZSBgJHRhZygpYDogYSBydW50aW1lIHN0cmluZyBjb3VsZCBjYXJyeSBkYXRhIChgJ3VzZXI6JyArIGVtYWlsYClcbiAgICogcGFzdCBldmVyeSByZWRhY3Rpb24gcG9pbnQuIERhdGEtZGVwZW5kZW50IG1hcmtzIGFyZSBhIGtlZXAgcnVsZSBvdmVyXG4gICAqIHRoZSBmb2xkIGF0IHJlYWQgdGltZSwgb3IgdGVsZW1ldHJ5IHZpYSBgJGVtaXRgLiBGcmVlIHN0cmluZ3M6IGZvb3RwcmludGpzXG4gICAqIG93bnMgbm8gdm9jYWJ1bGFyeTsgYSBjb25zdW1lciBkZWNsYXJlcyBpdHMgb3duIChgJ21pbGVzdG9uZTo8a2luZD4nYCkuXG4gICAqXG4gICAqIFN0YW1wZWQgT05DRSBwZXIgZXhlY3V0aW9uIG9mIHRoZSBzdGFnZTogcmV0cnkgYXR0ZW1wdHMgc2hhcmUgb25lIHN0YW1wLFxuICAgKiBhIGZhaWxlZCBzdGFnZSBrZWVwcyBpdHMgdGFnICh0aGUgZXJyb3IgcGF0aCBjb21taXRzIGJlZm9yZSBpdCByZXRocm93cyksXG4gICAqIGEgc3RhZ2UgdGhhdCBgaW50ZXJydXB0KClgcyBhbmQgaXMgcmVzdW1lZCBpcyB0d28gdGFnZ2VkIHN0b3BzIG9uIGEgY2hhaW5cbiAgICogYmVjYXVzZSBpdCByYW4gdHdpY2UsIGFuZCBhbiBFTVBUWSBjb21taXQgaXMgYSB0YWdnZWQgc3RvcCB0b28uIEEgc3ViZmxvd1xuICAgKiBtb3VudCBvciBhIHBhcmFsbGVsLWZvci1lYWNoIHN0YWdlIGNhbiBiZSB0YWdnZWQ7IHRoZSB0YWcgbGFuZHMgb24gdGhlXG4gICAqIGJ1bmRsZSB0aGF0IHJlY29yZHMgaXRzIHJlc3VsdCDigJQgZm9yIGEgbW91bnQsIGl0cyBGSVJTVCBidW5kbGUgaW4gdGhlXG4gICAqIHBhcmVudCBsb2cgKHRoZSBleGl0IGJ1bmRsZSBjYXJyaWVzIG5vbmUpLCB3aGlsZSB0aGUgc3ViZmxvdydzIG93biBsb2dcbiAgICogaXMgdW50b3VjaGVkOiBpdHMgaW5uZXIgc3RhZ2VzIGRlY2xhcmUgdGhlaXIgb3duLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdTZWVkJywgc2VlZEZuLCAnc2VlZCcpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDYWxsIG1vZGVsJywgY2FsbEZuLCAnY2FsbC1sbG0nKVxuICAgKiAgIC50YWcoJ21pbGVzdG9uZTpsbG0tdHVybicpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdSb3V0ZScsIHJvdXRlRm4sICdyb3V0ZScpXG4gICAqICAgLnRhZygnbWlsZXN0b25lOmRlY2lzaW9uJywgJ2F1ZGl0JylcbiAgICogYGBgXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gdGhlIENVUlJFTlQgY3Vyc29yIOKAlCB0aGUgc3RhZ2UgYWRkZWQgYnkgdGhlIGltbWVkaWF0ZWx5XG4gICAqIHByZWNlZGluZyBgc3RhcnQoKWAgLyBgYWRkRnVuY3Rpb24oKWAgLyBgYWRkU3RyZWFtaW5nRnVuY3Rpb24oKWAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbigpYCAvIGBhZGRTdWJGbG93Q2hhcnROZXh0KClgIC8gYGFkZFBhcmFsbGVsRm9yRWFjaCgpYC5cbiAgICogV2hlcmUgdGhlIGN1cnNvciB3b3VsZCBiZSBhbWJpZ3VvdXMgKGEgZGVjaWRlciwgc2VsZWN0b3IsIGJyYW5jaCwgb3IgZm9ya1xuICAgKiBjaGlsZCksIGRlY2xhcmUgdGhlIHRhZ3MgaW4gdGhhdCBtZXRob2QncyBvd24gYHRhZ3NgIG9wdGlvbiBpbnN0ZWFkLiBBXG4gICAqIHN1YmZsb3cgTU9VTlQgaGFzIHRoYXQgb3B0aW9uIHRvbyAoYFN1YmZsb3dNb3VudE9wdGlvbnMudGFnc2AsIDkuMjEuMSlcbiAgICog4oCUIGFuZCBmb3IgYSBmb3JrLWNoaWxkIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0YCkgb3IgYSBicmFuY2ggbW91bnRcbiAgICogKGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKSBpdCBpcyB0aGUgT05MWSBzaXRlOiB0aG9zZSBsZWF2ZSB0aGUgY3Vyc29yIG9uXG4gICAqIHRoZSBwYXJlbnQsIHNvIGAudGFnKClgIGFmdGVyIHRoZW0gcmVmdXNlcyByYXRoZXIgdGhhbiBtaXMtYXR0cmlidXRlLlxuICAgKlxuICAgKiBSZWZ1c2VkIGF0IGJ1aWxkIHRpbWU6IGFuIGVtcHR5IG5hbWUsIGEgbm9uLXN0cmluZywgdGhlIHJlc2VydmVkXG4gICAqIGJyYW5jaC1zZWdtZW50IG1hcmtlciBgfmAgaW5zaWRlIGEgbmFtZSwgYSBuYW1lIGRlY2xhcmVkIHR3aWNlLCBhbmQgYVxuICAgKiBzZWNvbmQgZGVjbGFyYXRpb24gb24gdGhlIHNhbWUgc3RhZ2UuXG4gICAqL1xuICB0YWcoLi4ubmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgLy8gU2FtZSBtaXMtYXR0cmlidXRpb24gZ3VhcmQgYXMgYC5yZXRyeSgpYDogYWZ0ZXIgYSBtb3VudCBvciBhIGZvcmsgdGhlXG4gICAgLy8gY3Vyc29yIHN0aWxsIHBvaW50cyBhdCB0aGUgc3RhZ2UgQkVGT1JFIHdoYXQgeW91IGp1c3Qgd3JvdGUuXG4gICAgaWYgKHRoaXMuX2N1cnNvclRhaWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGB0YWcoKSBjYW5ub3QgZm9sbG93ICR7dGhpcy5fY3Vyc29yVGFpbH0g4oCUIHRoYXQgYXR0YWNoZXMgdG8gJyR7Y3VyLm5hbWV9JyB3aXRob3V0IG1vdmluZyB0aGUgY3Vyc29yLCBzbyBgICtcbiAgICAgICAgICBgdGhlIG5hbWVzIHdvdWxkIGxhbmQgb24gJyR7Y3VyLm5hbWV9JyByYXRoZXIgdGhhbiBvbiB3aGF0IHlvdSBqdXN0IGFkZGVkLiBEZWNsYXJlIHRoZSB0YWdzIGF0IHRoZWlyIG93biBgICtcbiAgICAgICAgICBcInNpdGUgaW5zdGVhZDogdmlhIHRoZSBgdGFnc2AgZmllbGQgaW4gdGhlIG1vdW50J3Mgb3duIG9wdGlvbnMgKGBTdWJmbG93TW91bnRPcHRpb25zLnRhZ3NgLCA5LjIxLjEpLCBvciBcIiArXG4gICAgICAgICAgJ3ZpYSB0aGUgYHRhZ3NgIGZpZWxkIG9uIGFuIGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkLiBUaGUgc3RhZ2VzIElOU0lERSBhIHN1YmZsb3cgY2hhcnQgZGVjbGFyZSB0aGVpciBvd24uJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIuaXNMb29wUmVmKSBmYWlsKGB0YWcoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgbG9vcCByZWZlcmVuY2UgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIGZhaWwoYHRhZygpIGF0ICcke2N1ci5uYW1lfSc6IGF0IGxlYXN0IG9uZSBuYW1lIGlzIHJlcXVpcmVkYCk7XG5cbiAgICBhcHBseVRhZ3MoY3VyLCBjdXJTcGVjLCBuYW1lcywgYHRhZygpIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICAvLyBUaGUgc3RhZ2UncyBgb25TdGFnZUFkZGVkYCBoYXMgYWxyZWFkeSBmaXJlZCAodGhlIGRvb3IgY29tZXMgYWZ0ZXJcbiAgICAvLyB0aGUgYWRkKSwgc28gdGhlIG5hbWVzIGdvIG91dCBhcyB0aGVpciBvd24gZXZlbnQg4oCUIGEgcmVjb3JkZXIgdGhhdFxuICAgIC8vIGNvcGllZCBmaWVsZHMgYXQgYWRkIHRpbWUgd291bGQgb3RoZXJ3aXNlIG5ldmVyIHNlZSB0aGVtICg5LjI0LjApLlxuICAgIHRoaXMuX2ZpcmVTdGFnZVRhZ2dlZChjdXJTcGVjKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBMb29wIOKUgOKUgFxuXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLm5leHQpIGZhaWwoYGNhbm5vdCBzZXQgbG9vcFRvIHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgaWYgKCF0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGlkP2ApO1xuICAgIH1cblxuICAgIGN1ci5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgY3VyU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBjdXJTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IHRoaXMuX3N0YWdlU3RlcE1hcC5nZXQoc3RhZ2VJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byBzdGVwICR7dGFyZ2V0U3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgZXZlbnQuIERpc3RpbmN0IGZyb20gYG9uRWRnZUFkZGVkYFxuICAgIC8vIGJlY2F1c2UgcnVudGltZSBgb25Mb29wYCBjYXJyaWVzIGBpdGVyYXRpb246IG51bWJlcmAgd2hpY2ggaGFzIG5vXG4gICAgLy8gYnVpbGQgbWVhbmluZyDigJQgc2VwYXJhdGUgZXZlbnQga2VlcHMgcGF5bG9hZHMgaG9uZXN0LlxuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGN1ci5pZCwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3RyZWFtaW5nIOKUgOKUgFxuXG4gIG9uU3RyZWFtKGhhbmRsZXI6IFN0cmVhbVRva2VuSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uVG9rZW4gPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1TdGFydChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25TdGFydCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbUVuZChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25FbmQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIBcblxuICBidWlsZCgpOiBSdW5uYWJsZUZsb3dDaGFydDxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBMNy4zIOKAlCBzZWFsIHRoZSBjaGFydCBzbyBwb3N0LWJ1aWxkIGF0dGFjaGVzIHRocm93LiBQcmV2ZW50c1xuICAgIC8vIHJlY29yZGVycyBhdHRhY2hlZCBtaWQtZXhlY3V0aW9uIGZyb20gZ2V0dGluZyBwYXJ0aWFsIGRhdGEuXG4gICAgdGhpcy5fc2VhbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgc3BlYzsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiB0aGlzLl9zdWJmbG93RGVmcykge1xuICAgICAgc3ViZmxvd3Nba2V5XSA9IGRlZjtcbiAgICB9XG5cbiAgICBjb25zdCByb290TmFtZSA9IHRoaXMuX3Jvb3Q/Lm5hbWUgPz8gJ0Zsb3dDaGFydCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYEZsb3dDaGFydDogJHtyb290TmFtZX1cXG5TdGVwczpcXG4ke3RoaXMuX2Rlc2NyaXB0aW9uUGFydHMuam9pbignXFxuJyl9YCA6ICcnO1xuXG4gICAgY29uc3QgY2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgcm9vdCxcbiAgICAgIHN0YWdlTWFwOiB0aGlzLl9zdGFnZU1hcCxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogcm9vdFNwZWMsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoc3ViZmxvd3MpLmxlbmd0aCA+IDAgPyB7IHN1YmZsb3dzIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fZW5hYmxlTmFycmF0aXZlID8geyBlbmFibGVOYXJyYXRpdmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9sb2dnZXIgPyB7IGxvZ2dlcjogdGhpcy5fbG9nZ2VyIH0gOiB7fSksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN0YWdlRGVzY3JpcHRpb25zOiBuZXcgTWFwKHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zKSxcbiAgICAgIC4uLih0aGlzLl9pbnB1dFNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IHRoaXMuX2lucHV0U2NoZW1hIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fb3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHRoaXMuX291dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dE1hcHBlciA/IHsgb3V0cHV0TWFwcGVyOiB0aGlzLl9vdXRwdXRNYXBwZXIgfSA6IHt9KSxcbiAgICAgIC8vIEF1dG8tZW1iZWQgVHlwZWRTY29wZSBmYWN0b3J5IGlmIG5vbmUgd2FzIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gVGhpcyBtZWFucyBBTlkgd2F5IG9mIGNyZWF0aW5nIGEgRmxvd0NoYXJ0QnVpbGRlciAoZmxvd0NoYXJ0KCksIG5ldyBGbG93Q2hhcnRCdWlsZGVyKCksXG4gICAgICAvLyBvciBhbnkgc3ViY2xhc3MpIGF1dG9tYXRpY2FsbHkgZ2V0cyBUeXBlZFNjb3BlIOKAlCBubyBtYW51YWwgc2V0U2NvcGVGYWN0b3J5IG5lZWRlZC5cbiAgICAgIHNjb3BlRmFjdG9yeTogdGhpcy5fc2NvcGVGYWN0b3J5ID8/IChjcmVhdGVUeXBlZFNjb3BlRmFjdG9yeSgpIGFzIHVua25vd24gYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgIH07XG5cbiAgICByZXR1cm4gbWFrZVJ1bm5hYmxlKGNoYXJ0KTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0aGUgc2NvcGUgZmFjdG9yeS4gUmFyZWx5IG5lZWRlZCDigJQgYXV0by1lbWJlZHMgVHlwZWRTY29wZSBieSBkZWZhdWx0LiAqL1xuICBzZXRTY29wZUZhY3RvcnkoZmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4pOiB0aGlzIHtcbiAgICB0aGlzLl9zY29wZUZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHtjaWR9YCk7XG4gICAgICAgIHdhbGsoYyk7XG4gICAgICB9XG4gICAgICBpZiAobi5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGlkT2Yobi5uZXh0LmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke21pZH1gKTtcbiAgICAgICAgd2FsayhuLm5leHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayhyb290KTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIChleHBvc2VkIGZvciBoZWxwZXIgY2xhc3Nlcykg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvcigpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvciA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3JTcGVjKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvclNwZWMgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgc3BlYyBjdXJzb3IuIFJldGFpbmVkIGFzIGEgbWV0aG9kIHNvIGNhbGwgc2l0ZXMgc3RheVxuICAgKiBvbmUtbGluZXJzIGFuZCBmdXR1cmUgY3Vyc29yLXJlbGF0ZWQgc2lkZSBlZmZlY3RzIGhhdmUgYSBob29rLlxuICAgKi9cbiAgLyoqXG4gICAqIFdoYXQgd2FzIGF0dGFjaGVkIHRvIHRoZSBDVVJTT1Igd2l0aG91dCBhZHZhbmNpbmcgaXQg4oCUIGEgc3ViZmxvdyBtb3VudCwgYVxuICAgKiBwYXJhbGxlbCBmb3JrJ3MgY2hpbGRyZW4uIENsZWFyZWQgYnkge0BsaW5rIF9hZHZhbmNlQ3Vyc29yU3BlY30sIHRoZSBzaW5nbGVcbiAgICogY2hva2UgcG9pbnQgZXZlcnkgY3Vyc29yLWFkdmFuY2luZyBtZXRob2QgYWxyZWFkeSBnb2VzIHRocm91Z2gsIHNvIHRoaXNcbiAgICogbWFya2VyIGNhbm5vdCBkcmlmdCBhcyBuZXcgYnVpbGRlciBtZXRob2RzIGFyZSBhZGRlZC5cbiAgICpcbiAgICogRXhpc3RzIGZvciBgLnJldHJ5KClgLiBUaG9zZSBtZXRob2RzIGhhbmcgY2hpbGRyZW4gb2ZmIHRoZSBjdXJyZW50IHN0YWdlXG4gICAqIGFuZCBsZWF2ZSB0aGUgY3Vyc29yIHBvaW50aW5nIGF0IHRoYXQgc3RhZ2UsIHNvIGEgY2hhaW5lZCBgLnJldHJ5KClgIHdvdWxkXG4gICAqIHNpbGVudGx5IGF0dGFjaCB0aGUgcG9saWN5IHRvIHRoZSBzdGFnZSBCRUZPUkUgdGhlIHRoaW5nIHlvdSBqdXN0IHdyb3RlIOKAlFxuICAgKiBleGFjdGx5IHRoZSBzaWxlbnQgbWlzLWF0dHJpYnV0aW9uIHRoaXMgY29kZWJhc2UgcmVmdXNlcyBlbHNld2hlcmUgKHNlZVxuICAgKiB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIHJ1bGVzKS4gTmFtaW5nIHdoYXQgd2FzIGxhc3QgYWRkZWQgbGV0cyB0aGVcbiAgICogcmVmdXNhbCBzYXkgc29tZXRoaW5nIHVzZWZ1bC5cbiAgICovXG4gIHByaXZhdGUgX2N1cnNvclRhaWw/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYWR2YW5jZUN1cnNvclNwZWMobmV3U3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gbmV3U3BlYztcbiAgfVxuXG4gIF9zdGFnZU1hcEhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgUmVnaXN0ZXIgYSBtb3VudGVkIHN1YmZsb3cncyBkZWZpbml0aW9uIOKAlCBmaXJzdCBtb3VudCB3aW5zLFxuICAgKiBhdCBldmVyeSBlYWdlciBtb3VudCBzaXRlIChsaW5lYXIsIGZvcmsgY2hpbGQsIGRlY2lkZXIgYW5kIHNlbGVjdG9yXG4gICAqIGJyYW5jaCkuIEEgU0VDT05EIG1vdW50IHVuZGVyIHRoZSBzYW1lIGlkIGlzIGFsbG93ZWQgKGV4aXN0aW5nIGNoYXJ0cyBkb1xuICAgKiBpdCkgYW5kIHNoYXJlcyB0aGUgZmlyc3Qgb25lJ3MgZGVmaW5pdGlvbiDigJQgYnV0IGEgcGF1c2UgaW5zaWRlIGVpdGhlclxuICAgKiBjYW5ub3QgYmUgcmVzdW1lZDogYSBjaGVja3BvaW50J3MgYHN1YmZsb3dQYXRoYCBuYW1lcyB0aGUgc3ViZmxvdyBpZCwgbm90XG4gICAqIHRoZSBtb3VudCwgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZSBhbWJpZ3VvdXMgcGF0aC4gRGV2IG1vZGUgc2F5cyBzb1xuICAgKiBoZXJlLCBhdCBidWlsZCB0aW1lLCB3aGVyZSB0aGUgaWQgY2FuIHN0aWxsIGJlIGNoYW5nZWQuXG4gICAqL1xuICBfcmVnaXN0ZXJTdWJmbG93RGVmKGlkOiBzdHJpbmcsIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gc3ViZmxvdyBpZCAnJHtpZH0nIGlzIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhpcyBjaGFydC4gVGhlIG1vdW50cyBzaGFyZSBvbmUgYCArXG4gICAgICAgICAgJ2RlZmluaXRpb24sIGFuZCBhIHBhdXNlIGluc2lkZSBlaXRoZXIgY2Fubm90IGJlIHJlc3VtZWQg4oCUIHRoZSBjaGVja3BvaW50IGNhbm5vdCBzYXkgd2hpY2ggbW91bnQgJyArXG4gICAgICAgICAgJ3BhdXNlZC4gR2l2ZSBlYWNoIG1vdW50IGl0cyBvd24gaWQuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgX2FkZFRvTWFwKGlkOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pIHtcbiAgICBpZiAodGhpcy5fc3RhZ2VNYXAuaGFzKGlkKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zdGFnZU1hcC5nZXQoaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSBmbikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIGZvciBpZCAnJHtpZH0nYCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YWdlTWFwLnNldChpZCwgZm4pO1xuICB9XG5cbiAgX21lcmdlU3RhZ2VNYXAob3RoZXI6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4sIHByZWZpeD86IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG90aGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LyR7a31gIDogaztcbiAgICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgIT09IHYpIGZhaWwoYHN0YWdlTWFwIGNvbGxpc2lvbiB3aGlsZSBtb3VudGluZyBmbG93Y2hhcnQgYXQgJyR7a2V5fSdgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YWdlTWFwLnNldChrZXksIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50LlxuICAgKlxuICAgKiDilIDilIAgQllURS1UV0lOIENPTlRSQUNUIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuZCBgRmxvd2NoYXJ0VHJhdmVyc2VyLnByZWZpeE5vZGVUcmVlYCBhcmUgYnl0ZS10d2lucyBieVxuICAgKiBjb250cmFjdDogdGhpcyBvbmUgcHJlZml4ZXMgYXQgTU9VTlQgdGltZSwgdGhlIHRyYXZlcnNlcidzIGF0IFJVTiB0aW1lXG4gICAqIChsYXp5IHN1YmZsb3dzLCBhbmQgdGhlIGdlbmVyYXRlZCBicmFuY2hlcyBvZiBgYWRkUGFyYWxsZWxGb3JFYWNoYCksIGFuZCBhXG4gICAqIGNoYXJ0IG11c3QgY29tZSBvdXQgaWRlbnRpY2FsIGVpdGhlciB3YXkuXG4gICAqIGB0ZXN0L2xpYi9lbmdpbmUvYnJhbmNoLXNlZ21lbnQtcHJlZml4ZXItZXF1aXZhbGVuY2UudGVzdC50c2AgcGlucyB0aGF0IOKAlFxuICAgKiBhbnkgZWRpdCBoZXJlIG11c3QgYmUgbWlycm9yZWQgdGhlcmUsIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBHZW5lcmF0ZWQgYnJhbmNoIHNlZ21lbnRzIChgPHN0YWdlSWQ+fjxpbmRleD5gLCBzZWVcbiAgICogYGVuZ2luZS9icmFuY2hTZWdtZW50LnRzYCkgcmlkZSB0aGlzIGV4YWN0IHBhdGggd2l0aCBubyBzcGVjaWFsIGNhc2U6IGFcbiAgICogc2VnbWVudCBpcyBqdXN0IGEgcHJlZml4LiBUaGF0IGlzIHRoZSBtZWNoYW5pY2FsIHRvbGVyYW5jZSB0aGUgZGVzaWduXG4gICAqIHJlbGllcyBvbiDigJQgdGhlIHJ1bnRpbWVTdGFnZUlkIGdyYW1tYXIgYWNjZXB0cyBpdCB1bmNoYW5nZWQsIHdoaWNoIGlzIHdoeVxuICAgKiBubyBwYXJzZXIgaW4gdGhlIGxpYnJhcnkgaGFkIHRvIGxlYXJuIHRoZSBtYXJrZXIuXG4gICAqIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gICAqL1xuICBfcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgY29uc3QgY2xvbmU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgY2xvbmUubmFtZSA9IGAke3ByZWZpeH0vJHtub2RlLm5hbWV9YDtcbiAgICBjbG9uZS5pZCA9IGAke3ByZWZpeH0vJHtub2RlLmlkfWA7XG4gICAgaWYgKGNsb25lLnN1YmZsb3dJZCkgY2xvbmUuc3ViZmxvd0lkID0gYCR7cHJlZml4fS8ke2Nsb25lLnN1YmZsb3dJZH1gO1xuICAgIGlmIChjbG9uZS5uZXh0KSBjbG9uZS5uZXh0ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoY2xvbmUubmV4dCwgcHJlZml4KTtcbiAgICBpZiAoY2xvbmUuY2hpbGRyZW4pIHtcbiAgICAgIGNsb25lLmNoaWxkcmVuID0gY2xvbmUuY2hpbGRyZW4ubWFwKChjKSA9PiB0aGlzLl9wcmVmaXhOb2RlVHJlZShjLCBwcmVmaXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgX21lcmdlU3ViZmxvd3Moc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gfCB1bmRlZmluZWQsIHByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCFzdWJmbG93cykgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93cykpIHtcbiAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7cHJlZml4fS8ke2tleX1gO1xuICAgICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChwcmVmaXhlZEtleSwge1xuICAgICAgICAgIHJvb3Q6IHRoaXMuX3ByZWZpeE5vZGVUcmVlKGRlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGYWN0b3J5IEZ1bmN0aW9uXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTdGFydCBhIGZsb3djaGFydCB3aXRoIGl0cyBmaXJzdCBzdGFnZTsgcmV0dXJucyBhIGZsdWVudCBidWlsZGVyLlxuICpcbiAqIENoYWluIGAuYWRkRnVuY3Rpb24oKWAgLyBgLmFkZERlY2lkZXJGdW5jdGlvbigpYCAvIGAuYWRkU2VsZWN0b3JGdW5jdGlvbigpYCAvXG4gKiBgLmFkZFN1YkZsb3dDaGFydCgpYCBldGMuIHRvIGFkZCBtb3JlIHN0YWdlcywgdGhlbiBmaW5pc2ggd2l0aCBgLmJ1aWxkKClgLlxuICpcbiAqIEBwYXJhbSBuYW1lICAgIEh1bWFuLXJlYWRhYmxlIGRpc3BsYXkgbGFiZWwgZm9yIHRoZSBzdGFnZSAoc2hvd24gaW4gdGhlIG5hcnJhdGl2ZS90cmFjZSkuXG4gKiBAcGFyYW0gZm4gICAgICBUaGUgc3RhZ2UncyB3b3JrIOKAlCBhIGAoc2NvcGUpID0+IOKApmAgZnVuY3Rpb24sIG9yIGEgYFBhdXNhYmxlSGFuZGxlcmAgZm9yIGh1bWFuLWluLXRoZS1sb29wIHBhdXNlcy5cbiAqIEBwYXJhbSBpZCAgICAgIFN0YWJsZSBzdGFnZSBpZCB1c2VkIGluIHRyYWNlcywgdGhlIGNvbW1pdCBsb2csIGFuZCBgcnVudGltZVN0YWdlSWRgLiBLZWVwIGl0IHVuaXF1ZSB3aXRoaW4gdGhlIGNoYXJ0LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYHsgZGVzY3JpcHRpb24/LCBzdHJ1Y3R1cmVSZWNvcmRlcnM/IH1gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjaGFydCA9IGZsb3dDaGFydDxTdGF0ZT4oJ0ZldGNoVXNlcicsIGFzeW5jIChzY29wZSkgPT4ge1xuICogICBzY29wZS51c2VyID0gYXdhaXQgZ2V0VXNlcigpO1xuICogfSwgJ2ZldGNoLXVzZXInKVxuICogICAuYWRkRnVuY3Rpb24oJ1Byb2Nlc3MnLCBwcm9jZXNzRm4sICdwcm9jZXNzJylcbiAqICAgLmJ1aWxkKCk7XG4gKlxuICogY29uc3QgdHJhY2UgPSBuYXJyYXRpdmUoKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoYXJ0LnJlY29yZGVyKHRyYWNlKS5ydW4oKTtcbiAqIGNvbnNvbGUubG9nKHRyYWNlLmdldEVudHJpZXMoKS5tYXAoKGUpID0+IGUudGV4dCkuam9pbignXFxuJykpO1xuICovXG4vLyBPdmVybG9hZCAxOiB0eXBlZCBzdGF0ZSB3aXRoIG9wdGlvbnMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUU3RhdGUgZXh0ZW5kcyBvYmplY3Q+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBUeXBlZFN0YWdlRnVuY3Rpb248VFN0YXRlPiB8IFBhdXNhYmxlSGFuZGxlcjxUeXBlZFNjb3BlPFRTdGF0ZT4+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8YW55LCBUeXBlZFNjb3BlPFRTdGF0ZT4+O1xuXG4vLyBPdmVybG9hZCAyOiBleHBsaWNpdCBnZW5lcmljcyB3aXRoIG9wdGlvbnMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT47XG5cbi8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiDigJQgYWNjZXB0cyB0aGUgb3B0aW9ucyBiYWcgKG9yIHVuZGVmaW5lZCkuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+KCk7XG4gIC8vIEF0dGFjaCBTdHJ1Y3R1cmVSZWNvcmRlcnMgQkVGT1JFIHN0YXJ0KCkgc28gdGhlIHNlZWQgZXZlbnQgZmlyZXMgdGhyb3VnaFxuICAvLyB0aGUgbm9ybWFsIGRpc3BhdGNoZXIgcGF0aCAobm8gcmVwbGF5IG5lZWRlZCkuIEl0ZXJhdGlvbiBvcmRlciBtYXRjaGVzXG4gIC8vIGFycmF5IG9yZGVyLCBtYXRjaGluZyB0aGUgZmx1ZW50IGAuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIoKWAgY2hhaW5cbiAgLy8gc2VtYW50aWNzLlxuICBpZiAob3B0aW9ucz8uc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgZm9yIChjb25zdCByZWMgb2Ygb3B0aW9ucy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICAgIGJ1aWxkZXIuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1aWxkZXIuc3RhcnQobmFtZSwgZm4gYXMgYW55LCBpZCwgb3B0aW9ucz8uZGVzY3JpcHRpb24sIHtcbiAgICAuLi4ob3B0aW9ucz8ucmV0cnkgJiYgeyByZXRyeTogb3B0aW9ucy5yZXRyeSB9KSxcbiAgICAuLi4ob3B0aW9ucz8udGFncyAmJiB7IHRhZ3M6IG9wdGlvbnMudGFncyB9KSxcbiAgfSk7XG59XG5cbi8qKlxuICogTGlrZSBgZmxvd0NoYXJ0KClgLCBidXQgdGhlIFJPT1Qgc3RhZ2UgaXMgYSBTRUxFQ1RPUiDigJQgaXQgcnVucyBmaXJzdCBhbmRcbiAqIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gaXQgKG5vIHNlcGFyYXRlIHNlZWQgc3RhZ2UpLiBSZXR1cm5zIGFcbiAqIGBTZWxlY3RvckZuTGlzdGA7IGRlY2xhcmUgYnJhbmNoZXMgdGhlbiBjYWxsIGAuZW5kKClgIHRvIGdldCB0aGUgYnVpbGRlclxuICogYmFjayBmb3IgYW55IHN1YnNlcXVlbnQgc3RhZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGZsb3dDaGFydFNlbGVjdG9yPE15U3RhdGU+KCdDb250ZXh0JywgY29udGV4dFNlbGVjdG9yRm4sICdjb250ZXh0JylcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1zeXN0ZW0tcHJvbXB0Jywgc3lzU2xvdCwgJ1N5c3RlbSBQcm9tcHQnLCB7Li4ufSlcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1tZXNzYWdlcycsIG1zZ1Nsb3QsICdNZXNzYWdlcycsIHsuLi59KVxuICogICAgIC5lbmQoKVxuICogICAgIC5hZGRGdW5jdGlvbignbWVzc2FnZUFQSScsIGFzc2VtYmxlRm4sICdtZXNzYWdlLWFwaScpXG4gKiAgICAgLmJ1aWxkKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnRTZWxlY3RvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgaWYgKG9wdGlvbnM/LnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG9wdGlvbnMuc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgICBidWlsZGVyLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWlsZGVyLnN0YXJ0U2VsZWN0b3IobmFtZSwgZm4sIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbiwge1xuICAgIC4uLihvcHRpb25zPy5mYWlsRmFzdCAhPT0gdW5kZWZpbmVkICYmIHsgZmFpbEZhc3Q6IG9wdGlvbnMuZmFpbEZhc3QgfSksXG4gICAgLi4uKG9wdGlvbnM/LnJldHJ5ICYmIHsgcmV0cnk6IG9wdGlvbnMucmV0cnkgfSksXG4gICAgLi4uKG9wdGlvbnM/LnRhZ3MgJiYgeyB0YWdzOiBvcHRpb25zLnRhZ3MgfSksXG4gIH0pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNwZWMgdG8gU3RhZ2VOb2RlIENvbnZlcnRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBzcGVjVG9TdGFnZU5vZGUoc3BlYzogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4ge1xuICBjb25zdCBpbmZsYXRlID0gKHM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+ID0+ICh7XG4gICAgbmFtZTogcy5uYW1lLFxuICAgIGlkOiBzLmlkLFxuICAgIGNoaWxkcmVuOiBzLmNoaWxkcmVuPy5sZW5ndGggPyBzLmNoaWxkcmVuLm1hcChpbmZsYXRlKSA6IHVuZGVmaW5lZCxcbiAgICBuZXh0OiBzLm5leHQgPyBpbmZsYXRlKHMubmV4dCkgOiB1bmRlZmluZWQsXG4gIH0pO1xuICByZXR1cm4gaW5mbGF0ZShzcGVjKTtcbn1cbiJdfQ==
|
|
1990
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hGLE9BQU8sRUFBbUIsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHdkYsT0FBTyxFQUEwQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQTJCLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFnQnZGLGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBVyxFQUFTLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLGdCQUFnQixDQUN2QixJQUF5QixFQUN6QixJQUFpQyxFQUNqQyxLQUE4QixFQUM5QixLQUFhO0lBRWIsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEcsSUFB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LFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0QnVpbGRlciDigJQgRmx1ZW50IEFQSSBmb3IgY29uc3RydWN0aW5nIGZsb3djaGFydCBleGVjdXRpb24gZ3JhcGhzLlxuICpcbiAqIEJ1aWxkcyBTdGFnZU5vZGUgdHJlZXMgYW5kIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSAoSlNPTikgaW4gdGFuZGVtLlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUg4oCUIG9ubHkgaW1wb3J0cyBmcm9tIGxvY2FsIHR5cGVzLlxuICpcbiAqIFRoZSBidWlsZGVyIGNyZWF0ZXMgdHdvIHBhcmFsbGVsIHN0cnVjdHVyZXM6XG4gKiAxLiBTdGFnZU5vZGUgdHJlZSDigJQgcnVudGltZSBncmFwaCB3aXRoIGVtYmVkZGVkIGZ1bmN0aW9uc1xuICogMi4gU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIOKAlCBKU09OLXNhZmUgc3RydWN0dXJlIGZvciB2aXN1YWxpemF0aW9uXG4gKlxuICogVGhlIGV4ZWN1dGUoKSBjb252ZW5pZW5jZSBtZXRob2QgaXMgaW50ZW50aW9uYWxseSBvbWl0dGVkIOKAlFxuICogaXQgYmVsb25ncyBpbiB0aGUgcnVubmVyIGxheWVyIChQaGFzZSA1KS5cbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IHByZWZpeE5vZGVUcmVlIH0gZnJvbSAnLi4vZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB0eXBlIHsgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSwgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSQU5DSF9TRUdNRU5UX01BUktFUiwgaGFzQnJhbmNoU2VnbWVudE1hcmtlciB9IGZyb20gJy4uL2lkcy9icmFuY2hTZWdtZW50LmpzJztcbmltcG9ydCB7IHR5cGUgSWRQb3NpdGlvbiwgam9pblBhdGgsIHJlZnVzZVJlc2VydmVkSWQgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXVzYWJsZUhhbmRsZXIgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGVkU2NvcGUgfSBmcm9tICcuLi9yZWFjdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJ1bm5hYmxlRmxvd0NoYXJ0LCBtYWtlUnVubmFibGUgfSBmcm9tICcuLi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZUVkZ2VLaW5kLCBTdHJ1Y3R1cmVSZWNvcmRlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyB0eXBlIFR5cGVkU3RhZ2VGdW5jdGlvbiwgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL3R5cGVkRmxvd0NoYXJ0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0NoYXJ0LFxuICBGbG93Q2hhcnRPcHRpb25zLFxuICBGbG93Q2hhcnRTcGVjLFxuICBJTG9nZ2VyLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFNpbXBsaWZpZWRQYXJhbGxlbFNwZWMsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSW50ZXJuYWwgaGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGZhaWwgPSAobXNnOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdICR7bXNnfWApO1xufTtcblxuLyoqXG4gKiBBdHRhY2ggYSBkZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3kgdG8gYSBzdGFnZSBub2RlICsgaXRzIHNwZWMgbm9kZS5cbiAqXG4gKiBUaGUgT05FIHBsYWNlIGEgcG9saWN5IGxhbmRzIG9uIGEgbm9kZSwgc2hhcmVkIGJ5IHRoZSBgLnJldHJ5KClgIGN1cnNvclxuICogbW9kaWZpZXIgYW5kIGJ5IGV2ZXJ5IGBvcHRpb25zLnJldHJ5YCBkZWNsYXJhdGlvbiBzaXRlLCBzbyB2YWxpZGF0aW9uIGFuZCB0aGVcbiAqIHNwZWMncyBgcmV0cnlBdHRlbXB0c2AgbWlycm9yIGNhbiBuZXZlciBkcmlmdCBiZXR3ZWVuIHRoZW0uXG4gKlxuICogYGF0dGVtcHRzYCBpcyB2YWxpZGF0ZWQgYXQgQlVJTEQgdGltZSByYXRoZXIgdGhhbiBkZWZlbmRlZCBhdCBydW50aW1lOiBhXG4gKiB0eXBvJ2QgYGF0dGVtcHRzOiAwYCBzaG91bGQgZmFpbCB3aGlsZSB5b3UgYXJlIHdyaXRpbmcgdGhlIGNoYXJ0LCBub3RcbiAqIHNpbGVudGx5IHR1cm4gYSBzdGFnZSBpbnRvIGEgbm8tb3AgcnVuIHRocmVlIG1vbnRocyBsYXRlci4gYGF0dGVtcHRzOiAxYCBpc1xuICogYWNjZXB0ZWQgb24gcHVycG9zZSDigJQgaXQgbWVhbnMgXCJwb2xpY3kgZGVjbGFyZWQsIGN1cnJlbnRseSBvZmZcIiwgc28gYSBwb2xpY3lcbiAqIGNhbiBiZSBkaWFsbGVkIGRvd24gd2l0aG91dCBkZWxldGluZyB0aGUgZGVjbGFyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UmV0cnlQb2xpY3koXG4gIG5vZGU6IFN0YWdlTm9kZTxhbnksIGFueT4sXG4gIHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgcmV0cnk6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkLFxuICB3aGVyZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmICghcmV0cnkpIHJldHVybjtcbiAgaWYgKHR5cGVvZiByZXRyeS5hdHRlbXB0cyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIocmV0cnkuYXR0ZW1wdHMpIHx8IHJldHJ5LmF0dGVtcHRzIDwgMSkge1xuICAgIGZhaWwoXG4gICAgICBgJHt3aGVyZX06IHJldHJ5LmF0dGVtcHRzIG11c3QgYmUgYSB3aG9sZSBudW1iZXIgPj0gMSAoZ290ICR7U3RyaW5nKHJldHJ5LmF0dGVtcHRzKX0pLiBgICtcbiAgICAgICAgJ0l0IGNvdW50cyBUT1RBTCBydW5zIGluY2x1ZGluZyB0aGUgZmlyc3QsIHNvIGBhdHRlbXB0czogM2AgbWVhbnMgb25lIHJ1biBwbHVzIHVwIHRvIHR3byByZXRyaWVzOyAnICtcbiAgICAgICAgJ2BhdHRlbXB0czogMWAgbWVhbnMgdGhlIHBvbGljeSBpcyBkZWNsYXJlZCBidXQgY3VycmVudGx5IG9mZi4nLFxuICAgICk7XG4gIH1cbiAgbm9kZS5yZXRyeSA9IHJldHJ5O1xuICBzcGVjLnJldHJ5QXR0ZW1wdHMgPSByZXRyeS5hdHRlbXB0cztcbn1cblxuLyoqXG4gKiBBdHRhY2ggZGVjbGFyZWQgdGFncyB0byBhIHN0YWdlIG5vZGUgKyBpdHMgc3BlYyBub2RlLlxuICpcbiAqIFRoZSBPTkUgcGxhY2UgdGFncyBsYW5kIG9uIGEgbm9kZSDigJQgdGhlIHR3aW4gb2Yge0BsaW5rIGFwcGx5UmV0cnlQb2xpY3l9IOKAlFxuICogc2hhcmVkIGJ5IHRoZSBgLnRhZygpYCBjdXJzb3IgbW9kaWZpZXIgYW5kIGV2ZXJ5IGBvcHRpb25zLnRhZ3NgIGRlY2xhcmF0aW9uXG4gKiBzaXRlLCBzbyB0aGUgcmVmdXNhbHMgYW5kIHRoZSBzcGVjJ3MgbWlycm9yIGNhbiBuZXZlciBkcmlmdCBiZXR3ZWVuIHRoZW0uXG4gKlxuICogQSB0YWcgaXMgYSBOQU1FIGRlY2xhcmVkIGF0IGJ1aWxkIHRpbWUsIG5ldmVyIGEgdmFsdWUsIHNvIGV2ZXJ5IHJlZnVzYWwgaXNcbiAqIGFib3V0IHRoZSBuYW1lJ3Mgc2hhcGU6IGFuIGVtcHR5IHN0cmluZyBuYW1lcyBub3RoaW5nOyBhIG5vbi1zdHJpbmcgaXMgYVxuICogdmFsdWUsIGFuZCBhIHZhbHVlIG9uIGEgc3RhZ2Ugd291bGQgcmlkZSB0aGUgY29tbWl0IGxvZyBwYXN0IGV2ZXJ5XG4gKiByZWRhY3Rpb24gcG9pbnQ7IHRoZSBicmFuY2gtc2VnbWVudCBtYXJrZXIgaXMgdGhlIHJ1bnRpbWVTdGFnZUlkIGdyYW1tYXInc1xuICogb25lIHJlc2VydmVkIGJ5dGUsIGFuZCBhIGNvbnN1bWVyIHRoYXQgcHV0cyBhIHRhZyBpbnRvIGEgcGF0aCAoYSBVUkwsIGFcbiAqIHN0b3JlIGtleSkgd291bGQgaW5oZXJpdCBleGFjdGx5IHRoZSBhbWJpZ3VpdHkgdGhlIHJlc2VydmF0aW9uIGV4aXN0cyB0b1xuICogcHJldmVudDsgYSBuYW1lIGRlY2xhcmVkIHR3aWNlIGlzIHRoZSB0eXBvIGl0IHVzdWFsbHkgaXMuIFJlZnVzZWQgYXQgQlVJTERcbiAqIHRpbWUsIGxpa2UgYHJldHJ5LmF0dGVtcHRzYCwgc28gdGhlIG1pc3Rha2UgZmFpbHMgd2hpbGUgdGhlIGNoYXJ0IGlzIGJlaW5nXG4gKiB3cml0dGVuLiBBbiBFTVBUWSBsaXN0IGxhbmRzIG5vdGhpbmc6IFwiYWJzZW50IHdoZW4gZW1wdHlcIiBpcyB0aGUgbGF3IHRoZVxuICogY29tbWl0IGJ1bmRsZSBrZWVwcywgYW5kIHRoZSBzcGVjIGtlZXBzIGl0IHRvby5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUYWdzKFxuICBub2RlOiBTdGFnZU5vZGU8YW55LCBhbnk+LFxuICBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICB3aGVyZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRhZ3MpKSBmYWlsKGAke3doZXJlfTogdGFncyBtdXN0IGJlIGFuIGFycmF5IG9mIG5hbWVzIChnb3QgJHt0eXBlb2YgdGFnc30pYCk7XG4gIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICBpZiAodHlwZW9mIHRhZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGAke3doZXJlfTogYSB0YWcgbXVzdCBiZSBhIHN0cmluZyBuYW1lIChnb3QgJHt0YWcgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdGFnfSkuIEEgdGFnIGlzIGEgTkFNRSBgICtcbiAgICAgICAgICAnZGVjbGFyZWQgYXQgYnVpbGQgdGltZSDigJQgYSB2YWx1ZSBiZWxvbmdzIGluIHN0YXRlIG9yIGluICRlbWl0LCBuZXZlciBvbiB0aGUgc3RhZ2UuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0YWcudHJpbSgpLmxlbmd0aCA9PT0gMCkgZmFpbChgJHt3aGVyZX06IGEgdGFnIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmdgKTtcbiAgICBpZiAoaGFzQnJhbmNoU2VnbWVudE1hcmtlcih0YWcpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgJHt3aGVyZX06IHRhZyAnJHt0YWd9JyBjb250YWlucyB0aGUgcmVzZXJ2ZWQgY2hhcmFjdGVyICcke0JSQU5DSF9TRUdNRU5UX01BUktFUn0nLiBgICtcbiAgICAgICAgICBgJyR7QlJBTkNIX1NFR01FTlRfTUFSS0VSfScgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdWJmbG93IHBhdGggc2VnbWVudHMgYWRkUGFyYWxsZWxGb3JFYWNoKCkgZ2VuZXJhdGVzLCBgICtcbiAgICAgICAgICAnYW5kIGEgdGFnIHRoYXQgYSBjb25zdW1lciBwdXRzIGludG8gYSBwYXRoIG9yIGEga2V5IHdvdWxkIGluaGVyaXQgdGhhdCBhbWJpZ3VpdHkuIFJlbmFtZSB0aGUgdGFnICcgK1xuICAgICAgICAgICcoYSBkYXNoIG9yIGEgY29sb24gcmVhZHMgdGhlIHNhbWUpLiBTZWUgZG9jcy9kZXNpZ24vMjAyNi0wOS1kZWNsYXJlZC10YWdzLm1kLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXModGFnKSkgZmFpbChgJHt3aGVyZX06IHRhZyAnJHt0YWd9JyBpcyBkZWNsYXJlZCB0d2ljZWApO1xuICAgIHNlZW4uYWRkKHRhZyk7XG4gIH1cbiAgaWYgKG5vZGUudGFncykge1xuICAgIGZhaWwoXG4gICAgICBgJHt3aGVyZX06IHRhZ3MgYWxyZWFkeSBkZWNsYXJlZCBhdCAnJHtub2RlLm5hbWV9JyAoJHtub2RlLnRhZ3Muam9pbignLCAnKX0pIOKAlCBkZWNsYXJlIGV2ZXJ5IHRhZyBmb3IgYSBgICtcbiAgICAgICAgJ3N0YWdlIGluIE9ORSBwbGFjZSwgc28gdGhlIE1hcCBhZHZlcnRpc2VzIHRoZSB3aG9sZSB2b2NhYnVsYXJ5IGZyb20gYSBzaW5nbGUgc2l0ZS4nLFxuICAgICk7XG4gIH1cbiAgLy8gVGhlIG5vZGUncyBjb3B5IGlzIGZyb3plbjogY29tbWl0IGJ1bmRsZXMgc2hhcmUgaXQgYnkgcmVmZXJlbmNlIGFuZCB0aGVcbiAgLy8gbGlicmFyeSdzIHJlYWRzIGFyZSBib3Jyb3dlZCwgbmV2ZXIgbXV0YXRlZC4gVGhlIHNwZWMncyBjb3B5IGlzIGl0cyBvd25cbiAgLy8gcGxhaW4gYXJyYXksIEpTT04tc2FmZSBsaWtlIHRoZSByZXN0IG9mIHRoZSBzcGVjLlxuICBub2RlLnRhZ3MgPSBPYmplY3QuZnJlZXplKFsuLi50YWdzXSk7XG4gIHNwZWMudGFncyA9IFsuLi50YWdzXTtcbn1cblxuLyoqXG4gKiBUaGUgYnVpbGRlcidzIE9ORSBpZCByZWZ1c2FsIChGNywgUjUpOiBldmVyeSBpZCBkb29yIGNhbGxzIGl0IG9uY2UsIGJlZm9yZVxuICogdGhlIGlkIGxhbmRzIGFueXdoZXJlLiBUaGUgcnVsZSBsaXZlcyB3aXRoIHRoZSBncmFtbWFyIOKAlFxuICogYGlkcy9ydW50aW1lU3RhZ2VJZC50cyDCtyByZWZ1c2VSZXNlcnZlZElkYDogYCNgIGFuZCBgL2AgYXJlIHJlZnVzZWQgaW5cbiAqIGV2ZXJ5IGlkICh0aGV5IGFyZSB0aGUgcnVudGltZVN0YWdlSWQgZ3JhbW1hcidzIGRlbGltaXRlcnMpLCBgfmAgaW4gYVxuICogYCdzZWdtZW50J2AgaWQgKGEgc3ViZmxvdyBpZCBvciBhIGBwYXJhbGxlbEZvckVhY2hgIGlkIOKAlCBzZWUgYmVsb3cpLlxuICpcbiAqIERvb3JzIChvbmUgY2FsbCBlYWNoKTogYHN0YXJ0YCwgYHN0YXJ0U2VsZWN0b3JgLCBgYWRkRnVuY3Rpb25gLFxuICogYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCwgYGFkZFBhdXNhYmxlRnVuY3Rpb25gLCBgYWRkRGVjaWRlckZ1bmN0aW9uYCxcbiAqIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCwgYGFkZExpc3RPZkZ1bmN0aW9uYCAoZWFjaCBjaGlsZCksIGBhZGRQYXJhbGxlbEZvckVhY2hgLFxuICogZXZlcnkgc3ViZmxvdyBtb3VudCAoYGFzc2VydFN1YmZsb3dJZEFsbG93ZWRgKSBhbmQgZXZlcnkgZGVjaWRlci9zZWxlY3RvclxuICogYnJhbmNoIChgQnJhbmNoQ3Vyc29yIMK3IGFkbWl0YCkuIGBhZGREZXRhY2hBbmRGb3JnZXRgIC9cbiAqIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBgYWRkQnJhbmNoTGlzdGAgZGVsZWdhdGUgdG8gb25lIG9mIHRoZXNlLlxuICogTmV2ZXIgY2FsbGVkIGJ5IHRoZSBwcmVmaXhlciBvciBhIHN0b3JlIOKAlCB0aG9zZSBob2xkIGlkcyB0aGF0IGNhcnJ5IHRoZVxuICogZGVsaW1pdGVycyBvbiBwdXJwb3NlLlxuICovXG5jb25zdCBhZG1pdElkID0gKHdoYXQ6IHN0cmluZywgaWQ6IHN0cmluZywgcG9zaXRpb246IElkUG9zaXRpb24pOiB2b2lkID0+IHtcbiAgY29uc3QgcmVmdXNhbCA9IHJlZnVzZVJlc2VydmVkSWQod2hhdCwgaWQsIHBvc2l0aW9uKTtcbiAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkgZmFpbChyZWZ1c2FsKTtcbn07XG5cbi8qKlxuICogUmVmdXNlIHRoZSByZXNlcnZlZCBjaGFyYWN0ZXJzIGluIGEgdXNlci1hdXRob3JlZCBTVUJGTE9XIGlkLlxuICpcbiAqIEEgc3ViZmxvdyBpZCBJUyBhIHBhdGggc2VnbWVudCBpbiBgcnVudGltZVN0YWdlSWRgLCB3aGljaCBpcyB0aGUgc2FtZVxuICogcG9zaXRpb24gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZ2VuZXJhdGVzIGl0cyBicmFuY2ggc2VnbWVudHMgaW50by4gQVxuICogaGFuZC1hdXRob3JlZCBpZCBjYXJyeWluZyB0aGUgbWFya2VyIGNvdWxkIHRoZXJlZm9yZSBjb2xsaWRlIHdpdGggYVxuICogZ2VuZXJhdGVkIGJyYW5jaCDigJQgYW5kLCBiZWNhdXNlIHRoaXMgY29kZWJhc2UgZGVsaWJlcmF0ZWx5IHRvbGVyYXRlc1xuICogaWQtY29sbGlzaW9uIGNsYXNzZXMgKGxvb3AtcmVmIHN0dWJzKSwgc3VjaCBhIGNvbGxpc2lvbiB3b3VsZCBub3QgY3Jhc2guIEl0XG4gKiB3b3VsZCBzaWxlbnRseSBtaXMtYXR0cmlidXRlIGEgdHJhY2UsIHdoaWNoIGlzIHdvcnNlLiBTbyB0aGUgbWFya2VyIGlzXG4gKiByZWZ1c2VkIGF0IEJVSUxEIHRpbWUsIG9uIE5FVyBjaGFydHMgb25seTogYSBjaGFydCB0aGF0IHdhcyBsZWdhbCBiZWZvcmVcbiAqIDkuMTQuMCBhbmQgZG9lcyBub3QgdXNlIHRoZSBtYXJrZXIgYmVoYXZlcyBieXRlLWlkZW50aWNhbGx5LlxuICpcbiAqIENhbGxlZCBhdCBldmVyeSB1c2VyLWF1dGhvcmVkIHN1YmZsb3ctaWQgZW50cnkgcG9pbnQuIFN0YWdlIGlkcyBlbHNld2hlcmVcbiAqIGtlZXAgYH5gICh0aGV5IG9jY3VweSB0aGUgYHN0YWdlSWRgIHBvc2l0aW9uLCBuZXZlciB0aGUgYHN1YmZsb3dQYXRoYFxuICogcG9zaXRpb24sIHNvIHRoZXkgY2Fubm90IGNvbGxpZGUgd2l0aCBhIHNlZ21lbnQpIGJ1dCwgc2luY2UgOS4zNy4wLCBub3QgYCNgXG4gKiBvciBgL2Ag4oCUIHNlZSBgYWRtaXRJZGAuIChgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIG93biBpZCBpcyB0aGUgb25lIG90aGVyXG4gKiBgJ3NlZ21lbnQnYCBpZCwgcmVmdXNlZCBhdCB0aGF0IG1ldGhvZC4pIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gKi9cbmNvbnN0IGFzc2VydFN1YmZsb3dJZEFsbG93ZWQgPSAoaWQ6IHN0cmluZyk6IHZvaWQgPT4gYWRtaXRJZCgnc3ViZmxvdyBpZCcsIGlkLCAnc2VnbWVudCcpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJyYW5jaEN1cnNvciDigJQgd2hhdCBEZWNpZGVyTGlzdCBhbmQgU2VsZWN0b3JGbkxpc3Qgc2hhcmUgKEY3KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBXaGljaCBkaXNwYXRjaGVyIGEge0BsaW5rIEJyYW5jaEN1cnNvcn0gYWRkcyBicmFuY2hlcyB1bmRlci4gKi9cbnR5cGUgQnJhbmNoS2luZCA9ICdkZWNpZGVyJyB8ICdzZWxlY3Rvcic7XG5cbi8qKlxuICogVGhlIGJyYW5jaC1hZGRpbmcgbWVjaGFuaWNzIG9mIGEgZGVjaWRlciBvciBhIHNlbGVjdG9yIOKAlCBPTkUgaW1wbGVtZW50YXRpb24sXG4gKiBjb21wb3NlZCBieSB7QGxpbmsgRGVjaWRlckxpc3R9IGFuZCB7QGxpbmsgU2VsZWN0b3JGbkxpc3R9ICh1bnRpbCA5LjM2LjAgZWFjaFxuICogbGlzdCBjYXJyaWVkIGl0cyBvd24gY29weSBvZiBhbGwgZm91ciBicmFuY2gga2luZHMgYW5kIGBlbmQoKWApLlxuICpcbiAqIE93bnM6IHRoZSBicmFuY2gtaWQgbGVkZ2VyIChkdXBsaWNhdGUgKyByZXNlcnZlZC1jaGFyYWN0ZXIgcmVmdXNhbCBpbiBvbmVcbiAqIGBhZG1pdGApLCB0aGUgbm9kZS9zcGVjIHBhaXIgZWFjaCBicmFuY2gga2luZCBidWlsZHMsIHRoZSBzdHJ1Y3R1cmUgZXZlbnRzLFxuICogYW5kIHRoZSBjbG9zaW5nIGBmaW5pc2hgLiBUaGUgbGlzdHMga2VlcCBvbmx5IHdoYXQgZGlmZmVyczogYSBkZWNpZGVyJ3NcbiAqIGB7IGxvb3BUbyB9YCAvIGBsb29wVG8oKWAgLyBgc2V0RGVmYXVsdGAsIGFuZCB0aGUgdHlwZSBlYWNoIG1ldGhvZCByZXR1cm5zLlxuICovXG5jbGFzcyBCcmFuY2hDdXJzb3I8VE91dCwgVFNjb3BlPiB7XG4gIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaERlc2NJbmZvOiBBcnJheTx7IGlkOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBraW5kOiBCcmFuY2hLaW5kLFxuICAgIHJlYWRvbmx5IGI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2VydmVkU3RlcE51bWJlcjogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge31cblxuICAvKiogVGhlIG9uZSBicmFuY2gtaWQgZG9vcjogZHVwbGljYXRlIHJlZnVzYWwsIHRoZW4gdGhlIHJlc2VydmVkIGNoYXJhY3RlcnMgKFI1KS4gKi9cbiAgcHJpdmF0ZSBhZG1pdChpZDogc3RyaW5nLCBwb3NpdGlvbjogSWRQb3NpdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgJHt0aGlzLmtpbmR9IGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBpZiAocG9zaXRpb24gPT09ICdzZWdtZW50JykgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG4gICAgZWxzZSBhZG1pdElkKCdicmFuY2ggaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIC8qKiBBcHBlbmQgdGhlIGJyYW5jaCdzIG5vZGUgKyBzcGVjIGFuZCBmaXJlIGl0cyBzdGFnZSBhbmQgZGVjaXNpb24tYnJhbmNoIGVkZ2UuICovXG4gIHByaXZhdGUgYXR0YWNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIGJyYW5jaDogc3RhZ2UgKyBkZWNpc2lvbi1icmFuY2ggZWRnZSBrZXllZCBieSBpZC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICB9XG5cbiAgZnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQsXG4gICk6IHsgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB9IHtcbiAgICB0aGlzLmFkbWl0KGlkLCAnc3RhZ2UnKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgYnJhbmNoSWQ6IGlkIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgICB0aGlzLmIuX2FkZFRvTWFwKGlkLCBmbik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgcmV0dXJuIHsgbm9kZSwgc3BlYyB9O1xuICB9XG5cbiAgcGF1c2FibGVCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkLFxuICApOiB7IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+OyBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfSB7XG4gICAgdGhpcy5hZG1pdChpZCwgJ3N0YWdlJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuYi5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJywgaXNQYXVzYWJsZTogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmF0dGFjaChub2RlLCBzcGVjLCBpZCk7XG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB7IG5vZGUsIHNwZWMgfTtcbiAgfVxuXG4gIHN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgdGhpcy5iLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkUm9vdCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIC8vIFNUUlVDVFVSRS1PTkxZIGNvbnZlcmdlbmNlIG92ZXJyaWRlIChzZWUgYF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50YCArXG4gICAgLy8gYFN1YmZsb3dNb3VudE9wdGlvbnMuY29udmVyZ2VBdGApOiB0aGlzIGJyYW5jaCdzIGNvbnZlcmdlbmNlIGVkZ2UgcG9pbnRzIGF0XG4gICAgLy8gYGNvbnZlcmdlQXRgIChhIERPV05TVFJFQU0gc3RhZ2UpIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0IHN0YWdlIOKAlCBlLmcuIGFcbiAgICAvLyBgdG9vbHNgIHNsb3QgdGhhdCBieXBhc3NlcyBgbWVzc2FnZUFQSWAgdG8gcGFpciB3aXRoIGl0cyBvdXRwdXQgYXRcbiAgICAvLyBgY2FsbC1sbG1gLiBWaXN1YWxpemF0aW9uLW9ubHk6IE5PIHJ1bnRpbWUgam9pbiBiYXJyaWVyIChkYXRhIHJpZGVzIHNjb3BlKS5cbiAgICAvLyBDYXJyaWVkIG9uIHRoZSBzcGVjIHNvIHRoZSBlZGdlLWZpcmluZyBjaG9rZXBvaW50IGNhbiByZWFkIGl0LlxuICAgIGlmIChvcHRpb25zPy5jb252ZXJnZUF0KSBzcGVjLmNvbnZlcmdlQXQgPSBvcHRpb25zLmNvbnZlcmdlQXQ7XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydEJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5hdHRhY2gobm9kZSwgc3BlYywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgZmFsc2UsIHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIHRoaXMuYi5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5iLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcbiAgfVxuXG4gIGxhenlTdWJmbG93QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzb2x2ZXI6ICgpID0+IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogU3ViZmxvd01vdW50T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5hZG1pdChpZCwgJ3NlZ21lbnQnKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgLy8gU3RvcmUgcmVzb2x2ZXIgb24gdGhlIG5vZGUg4oCUIE5PIGVhZ2VyIHRyZWUgY2xvbmluZ1xuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gU3BlYyBzdHViIOKAlCBubyBzdWJmbG93U3RydWN0dXJlIChsYXp5KS4gVGhlIGxhenkgc3ViZmxvdydzXG4gICAgLy8gaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0IHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5hdHRhY2gobm9kZSwgc3BlYywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGRpc3BhdGNoZXI6IHZhbGlkYXRlIHRoZSBicmFuY2hlcywgZmxhZyB0aGUgbm9kZSwgZGVzY3JpYmUgaXQsXG4gICAqIGFuZCBmaXJlIGBvbkRlY2lkZXJDb21wbGV0ZWAuIEEgZGVjaWRlciBwYXNzZXMgaXRzIGBzZXREZWZhdWx0YCBpZCAodGhlXG4gICAqIHN5bnRoZXRpYyBgJ2RlZmF1bHQnYCBjbG9uZSBpcyBhcHBlbmRlZCBBRlRFUiBgYnJhbmNoSWRzYCBpcyB0YWtlbiwgc28gb25seVxuICAgKiB1c2VyLXNwZWNpZmllZCBicmFuY2hlcyBhcmUgbGlzdGVkKTsgYSBzZWxlY3RvciBoYXMgbm8gZGVmYXVsdC5cbiAgICovXG4gIGZpbmlzaChkZWZhdWx0SWQ/OiBzdHJpbmcpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGtpbmQgPSB0aGlzLmtpbmQ7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdICR7a2luZH0gYXQgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYnJhbmNoYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBldmVyeSBicmFuY2ggd2l0aCBubyBlbWJlZGRlZCBmbiBpcyByZXNvbHZhYmxlIGZyb20gdGhlIHN0YWdlTWFwXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFjaGlsZC5mbiAmJiBjaGlsZC5pZCAmJiAhY2hpbGQuaXNTdWJmbG93Um9vdCAmJiAhY2hpbGQuc3ViZmxvd1Jlc29sdmVyKSB7XG4gICAgICAgIGNvbnN0IGhhc0luTWFwID0gdGhpcy5iLl9zdGFnZU1hcEhhcyhjaGlsZC5pZCkgfHwgdGhpcy5iLl9zdGFnZU1hcEhhcyhjaGlsZC5uYW1lKTtcbiAgICAgICAgaWYgKCFoYXNJbk1hcCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbRmxvd0NoYXJ0QnVpbGRlcl0gJHtraW5kfSBicmFuY2ggJyR7Y2hpbGQuaWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIGhhcyBubyBmdW5jdGlvbiDigJQgYCArXG4gICAgICAgICAgICAgIGBwcm92aWRlIGEgZm4gYXJndW1lbnQgdG8gYWRkRnVuY3Rpb25CcmFuY2goJyR7Y2hpbGQuaWR9JywgLi4uKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChraW5kID09PSAnZGVjaWRlcicpIHRoaXMuY3VyTm9kZS5kZWNpZGVyRm4gPSB0cnVlO1xuICAgIGVsc2UgdGhpcy5jdXJOb2RlLnNlbGVjdG9yRm4gPSB0cnVlO1xuXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9IGtpbmQ7XG4gICAgaWYgKGtpbmQgPT09ICdzZWxlY3RvcicpIHRoaXMuY3VyU3BlYy5oYXNTZWxlY3RvciA9IHRydWU7XG5cbiAgICBpZiAoZGVmYXVsdElkKSB7XG4gICAgICBjb25zdCBkZWZhdWx0Q2hpbGQgPSBjaGlsZHJlbi5maW5kKChjKSA9PiBjLmlkID09PSBkZWZhdWx0SWQpO1xuICAgICAgaWYgKGRlZmF1bHRDaGlsZCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHsgLi4uZGVmYXVsdENoaWxkLCBpZDogJ2RlZmF1bHQnLCBicmFuY2hJZDogJ2RlZmF1bHQnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5jdXJOb2RlLm5hbWU7XG4gICAgICBjb25zdCBicmFuY2hJZExpc3QgPSB0aGlzLmJyYW5jaERlc2NJbmZvLm1hcCgoYikgPT4gYi5pZCkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IG1haW5MaW5lID1cbiAgICAgICAga2luZCA9PT0gJ2RlY2lkZXInXG4gICAgICAgICAgPyB0aGlzLmRlc2NyaXB0aW9uXG4gICAgICAgICAgICA/IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtsYWJlbH0g4oCUICR7dGhpcy5kZXNjcmlwdGlvbn0gKGJyYW5jaGVzOiAke2JyYW5jaElkTGlzdH0pYFxuICAgICAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCBEZWNpZGVzIGJldHdlZW46ICR7YnJhbmNoSWRMaXN0fWBcbiAgICAgICAgICA6IHRoaXMuZGVzY3JpcHRpb25cbiAgICAgICAgICA/IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtsYWJlbH0g4oCUICR7dGhpcy5kZXNjcmlwdGlvbn1gXG4gICAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCBTZWxlY3RzIGZyb206ICR7YnJhbmNoSWRMaXN0fWA7XG4gICAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMucHVzaChtYWluTGluZSk7XG5cbiAgICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KHRoaXMuY3VyTm9kZS5uYW1lLCB0aGlzLmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBpZiAoYnJhbmNoLmRlc2NyaXB0aW9uKSB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMucHVzaChgICAg4oaSICR7YnJhbmNoLmlkfTogJHticmFuY2guZGVzY3JpcHRpb259YCk7XG4gICAgICAgIGlmIChicmFuY2guZGVzY3JpcHRpb24pIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KGJyYW5jaC5pZCwgYnJhbmNoLmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMNy4zIOKAlCBmaXJlIGBvbkRlY2lkZXJDb21wbGV0ZWAgc28gY29uc3VtZXJzIGNhbiB0cnVzdCBubyBtb3JlXG4gICAgLy8gYnJhbmNoZXMgd2lsbCBhcnJpdmUuIEJyYW5jaCBpdGVyYXRpb24gb3JkZXIgPSBhZGRpdGlvbiBvcmRlciA9IFNldFxuICAgIC8vIGluc2VydGlvbiBvcmRlci4gU2VsZWN0b3JzIGhhdmUgbm8gZGVmYXVsdCBicmFuY2guXG4gICAgaWYgKGtpbmQgPT09ICdkZWNpZGVyJykge1xuICAgICAgdGhpcy5iLl9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCAnZGVjaWRlcicsIFsuLi50aGlzLmJyYW5jaElkc10sIGRlZmF1bHRJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ3NlbGVjdG9yJywgWy4uLnRoaXMuYnJhbmNoSWRzXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmI7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEZWNpZGVyTGlzdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmx1ZW50IGhlbHBlciByZXR1cm5lZCBieSBhZGREZWNpZGVyRnVuY3Rpb24gdG8gYWRkIGJyYW5jaGVzLlxuICogYGVuZCgpYCBzZXRzIGBkZWNpZGVyRm4gPSB0cnVlYCDigJQgdGhlIGZuIElTIHRoZSBkZWNpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgRGVjaWRlckxpc3Q8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3Vyc29yOiBCcmFuY2hDdXJzb3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBkZWZhdWx0SWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVpbGRlcjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+LFxuICAgIGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpLFxuICAgIHJlc2VydmVkU3RlcE51bWJlciA9IDAsXG4gICAgZGVjaWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLmN1cnNvciA9IG5ldyBCcmFuY2hDdXJzb3IoXG4gICAgICAnZGVjaWRlcicsXG4gICAgICBidWlsZGVyLFxuICAgICAgY3VyTm9kZSxcbiAgICAgIGN1clNwZWMsXG4gICAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzLFxuICAgICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICByZXNlcnZlZFN0ZXBOdW1iZXIsXG4gICAgICBkZWNpZGVyRGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZEZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuXG4gICAgICogIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3Mgc3RhZ2UgYSBkZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3k7XG4gICAgICogIGB7IHRhZ3MgfWAgcHV0cyBkZWNsYXJlZCB0YWdzIG9uIGl0IChzZWUgYEZsb3dDaGFydEJ1aWxkZXIudGFnYCkuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nOyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyBub2RlLCBzcGVjIH0gPSB0aGlzLmN1cnNvci5mdW5jdGlvbkJyYW5jaChpZCwgbmFtZSwgZm4sIGRlc2NyaXB0aW9uLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucz8ubG9vcFRvKSB0aGlzLl9hcHBseUJyYW5jaExvb3Aobm9kZSwgc3BlYywgb3B0aW9ucy5sb29wVG8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhdXNhYmxlIHN0YWdlIGFzIGEgZGVjaWRlciBicmFuY2guXG4gICAqXG4gICAqIFdoZW4gdGhpcyBicmFuY2ggaXMgY2hvc2VuLCB0aGUgaGFuZGxlcidzIGBleGVjdXRlYCBydW5zLiBJZiBpdCByZXR1cm5zXG4gICAqIGRhdGEsIHRoZSBwaXBlbGluZSBwYXVzZXMuIE9uIHJlc3VtZSwgYGhhbmRsZXIucmVzdW1lYCBydW5zIHdpdGggdGhlXG4gICAqIGh1bWFuJ3MgaW5wdXQuIElmIGBleGVjdXRlYCByZXR1cm5zIHZvaWQsIHRoZSBzdGFnZSBjb250aW51ZXMgbm9ybWFsbHlcbiAgICogKGNvbmRpdGlvbmFsIHBhdXNlKS5cbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IGxvb3BUbyB9YCBkZWNsYXJlcyB0aGlzIGJyYW5jaCBsb29wcyBiYWNrIHRvIGFuIGFscmVhZHktZGVjbGFyZWRcbiAgICAgKiAgc3RhZ2Ug4oCUIHRoZSBsb29wIGlzIFNPVVJDRUQgRlJPTSBUSElTIEJSQU5DSCAobm90IHRoZSBkZWNpZGVyKS5cbiAgICAgKiAgYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBgZXhlY3V0ZWAgaGFsZiBhIHJldHJ5IHBvbGljeSAodGhlXG4gICAgICogIGByZXN1bWVgIGhhbGYgcnVucyB3aXRob3V0IGl0IOKAlCBhIGRpZmZlcmVudCBmdW5jdGlvbiwgYSBkaWZmZXJlbnRcbiAgICAgKiAgY29udHJhY3QpOyBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdC4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSBsb29wVG8/OiBzdHJpbmc7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCB7IG5vZGUsIHNwZWMgfSA9IHRoaXMuY3Vyc29yLnBhdXNhYmxlQnJhbmNoKGlkLCBuYW1lLCBoYW5kbGVyLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmN1cnNvci5zdWJmbG93QnJhbmNoKGlkLCBzdWJmbG93LCBtb3VudE5hbWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IubGF6eVN1YmZsb3dCcmFuY2goaWQsIHJlc29sdmVyLCBtb3VudE5hbWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQnJhbmNoTGlzdChcbiAgICBicmFuY2hlczogQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIH0+LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBmb3IgKGNvbnN0IHsgaWQsIG5hbWUsIGZuIH0gb2YgYnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuYWRkRnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREZWZhdWx0KGlkOiBzdHJpbmcpOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmRlZmF1bHRJZCA9IGlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGxvb3AtYmFjayBlZGdlIHRvIHRoZSBMQVNULWFkZGVkIGJyYW5jaCwgc28gdGhlIGxvb3AgaXMgc291cmNlZFxuICAgKiBmcm9tIFRIQVQgYnJhbmNoIG5vZGUgKGUuZy4gYCd0b29sLWNhbGxzJyDihpIgbG9vcFRvKCdjb250ZXh0JylgKSByYXRoZXIgdGhhblxuICAgKiBmcm9tIHRoZSBkZWNpZGVyLiBUaGUgY2hhcnQgdGhlbiByZWFkcyBob25lc3RseTogdGhlIGRlY2lkZXIgc3BsaXRzIGludG8gYVxuICAgKiBsb29waW5nIGJyYW5jaCBgW1Rvb2xDYWxscyDihpIgYmFjayB0byBDb250ZXh0XWAgYW5kIGEgdGVybWluYXRpbmcgYnJhbmNoXG4gICAqIGBbRmluYWwg4oaSIGVuZF1gLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGxvb3AgaGFuZ2luZyBvZmYgdGhlIGRlY2lkZXIuXG4gICAqXG4gICAqIE5vIGVuZ2luZSBjaGFuZ2UgaXMgbmVlZGVkOiB0aGUgcnVudGltZSBydW5zIHRoZSBjaG9zZW4gYnJhbmNoIGFuZCB0aGVuXG4gICAqIGZvbGxvd3MgdGhhdCBicmFuY2ggbm9kZSdzIE9XTiBgbmV4dGAg4oCUIGFuZCBhIGBuZXh0YCBmbGFnZ2VkIGBpc0xvb3BSZWZgXG4gICAqIHJvdXRlcyBiYWNrIHRvIHRoZSB0YXJnZXQgZXhhY3RseSBsaWtlIHRoZSBkZWNpZGVyJ3Mgb3duIGxvb3AgZG9lcy4gVGhpc1xuICAgKiBtZXRob2QganVzdCBsZXRzIHRoZSBidWlsZGVyIGV4cHJlc3Mgd2hhdCB0aGUgZW5naW5lIGFscmVhZHkgc3VwcG9ydHMuXG4gICAqXG4gICAqIFRhcmdldHMgdGhlIGJyYW5jaCBhZGRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjYWxsIChjaGFpbiBpdCByaWdodCBhZnRlclxuICAgKiB0aGUgYnJhbmNoJ3MgYGFkZEZ1bmN0aW9uQnJhbmNoYC9gYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaGAvXG4gICAqIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKS4gTWlycm9ycyBgRmxvd0NoYXJ0QnVpbGRlci5sb29wVG9gIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFdvcmtzIG9uIGEgU1VCRkxPVyBicmFuY2ggdG9vOiB0aGUgYnJhbmNoIG5vZGUgY2FycmllcyBib3RoIGl0cyBzdWJmbG93XG4gICAqIHJlc29sdmVyIEFORCB0aGUgbG9vcC1iYWNrIGBuZXh0YCDigJQgdGhleSBjb2V4aXN0IHNhZmVseSAodGhlIHJ1bnRpbWUgcnVuc1xuICAgKiB0aGUgc3ViZmxvdywgdGhlbiBmb2xsb3dzIHRoZSBsb29wIHJlZikuIFRoZSB0YXJnZXQgbXVzdCBiZSBhIHN0YWdlIGFscmVhZHlcbiAgICogZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChlLmcuIGFuIHVwc3RyZWFtIGBjb250ZXh0YCk7IGJyYW5jaCBpZHMgYW5kIHRoZVxuICAgKiBzeW50aGV0aWMgYCdkZWZhdWx0J2AgY2xvbmUgYXJlIE5PVCB2YWxpZCBsb29wIHRhcmdldHMuXG4gICAqL1xuICBsb29wVG8oc3RhZ2VJZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1cnNvci5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IHNwZWNDaGlsZHJlbiA9IHRoaXMuY3Vyc29yLmN1clNwZWMuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgfHwgIXNwZWNDaGlsZHJlbiB8fCBzcGVjQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBmYWlsKGBsb29wVG8oJyR7c3RhZ2VJZH0nKSBjYWxsZWQgYmVmb3JlIGFueSBicmFuY2ggd2FzIGFkZGVkIHVuZGVyICcke3RoaXMuY3Vyc29yLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgfVxuICAgIC8vIGZhaWwoKSB0aHJvd3MsIHNvIGNoaWxkcmVuL3NwZWNDaGlsZHJlbiBhcmUgbm9uLWVtcHR5IGhlcmUuXG4gICAgdGhpcy5fYXBwbHlCcmFuY2hMb29wKGNoaWxkcmVuIVtjaGlsZHJlbiEubGVuZ3RoIC0gMV0hLCBzcGVjQ2hpbGRyZW4hW3NwZWNDaGlsZHJlbiEubGVuZ3RoIC0gMV0hLCBzdGFnZUlkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvcmF0ZSBPTkUgYnJhbmNoIG5vZGUvc3BlYyB3aXRoIGEgbG9vcC1iYWNrIGVkZ2UgdG8gYHN0YWdlSWRgLiBTaGFyZWQgYnlcbiAgICogdGhlIHBvc2l0aW9uYWwgYGxvb3BUbygpYCAod2hpY2ggdGFyZ2V0cyB0aGUgbGFzdC1hZGRlZCBicmFuY2gpIEFORCB0aGVcbiAgICogcGVyLWJyYW5jaCBgeyBsb29wVG8gfWAgb3B0aW9uIG9uIGBhZGRGdW5jdGlvbkJyYW5jaGAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaGAgLyBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYC4gRWl0aGVyIHdheSB0aGUgbG9vcFxuICAgKiBTT1VSQ0UgaXMgdGhlIGJyYW5jaCDigJQgc28gdmlzdWFsaXplcnMgcmVhZCBgdG9vbC1jYWxscyDihpIgY29udGV4dGAsIG5ldmVyXG4gICAqIGBSb3V0ZSDihpIgY29udGV4dGAuIFZhbGlkYXRlcyB0aGUgdGFyZ2V0IGlzIGEgc3RhZ2UgZGVjbGFyZWQgQkVGT1JFIHRoZVxuICAgKiBkZWNpZGVyIChicmFuY2ggaWRzIC8gdGhlIHN5bnRoZXRpYyAnZGVmYXVsdCcgY2xvbmUgYXJlIG5vdCB2YWxpZCB0YXJnZXRzKS5cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5QnJhbmNoTG9vcChcbiAgICBicmFuY2hOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBicmFuY2hTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoYnJhbmNoU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIG9uIGJyYW5jaCAnJHticmFuY2hTcGVjLmlkfSdgKTtcbiAgICBpZiAoYnJhbmNoTm9kZS5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3Qgc2V0IGxvb3BUbyBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIOKAlCBpdCBhbHJlYWR5IGhhcyBhIGNvbnRpbnVhdGlvbmApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY3Vyc29yLmIuX2tub3duU3RhZ2VJZHNIYXMoc3RhZ2VJZCkpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGBsb29wVG8oJyR7c3RhZ2VJZH0nKSB0YXJnZXQgbm90IGZvdW5kIOKAlCBhIGJyYW5jaCBsb29wIG11c3QgdGFyZ2V0IGEgc3RhZ2UgYCArXG4gICAgICAgICAgXCJkZWNsYXJlZCBCRUZPUkUgdGhlIGRlY2lkZXIgKGJyYW5jaCBpZHMgYW5kIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGJyYW5jaCBcIiArXG4gICAgICAgICAgJ2FyZSBub3QgdmFsaWQgbG9vcCB0YXJnZXRzOyBkaWQgeW91IHBhc3MgYSBzdGFnZSBuYW1lIGluc3RlYWQgb2YgYW4gaWQ/KScsXG4gICAgICApO1xuICAgIH1cblxuICAgIGJyYW5jaE5vZGUubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIGlzTG9vcFJlZjogdHJ1ZSB9O1xuICAgIGJyYW5jaFNwZWMubG9vcFRhcmdldCA9IHN0YWdlSWQ7XG4gICAgYnJhbmNoU3BlYy5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgdHlwZTogJ2xvb3AnLCBpc0xvb3BSZWZlcmVuY2U6IHRydWUgfTtcblxuICAgIC8vIEJyYW5jaC1zY29wZWQgZGVzY3JpcHRpb24g4oCUIGF0dHJpYnV0ZSB0aGUgbG9vcCB0byB0aGUgYnJhbmNoLCBub3QgdGhlXG4gICAgLy8gZGVjaWRlciAocGFyZW50RGVzY3JpcHRpb25QYXJ0cyBpcyB0aGUgZGVjaWRlcidzIGRlc2NyaXB0aW9uIGNvbnRleHQpLlxuICAgIHRoaXMuY3Vyc29yLnBhcmVudERlc2NyaXB0aW9uUGFydHMucHVzaChgICAg4oaSIGJyYW5jaCAnJHticmFuY2hTcGVjLmlkfScgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG5cbiAgICAvLyBGaXJlIHRoZSBsb29wIGJhY2stZWRnZSBTT1VSQ0VEIEZST00gVEhFIEJSQU5DSCBzbyB2aXN1YWxpemVycyByZWFkXG4gICAgLy8gYHRvb2wtY2FsbHMg4oaSIGNvbnRleHRgLCBub3QgYFJvdXRlIOKGkiBjb250ZXh0YC5cbiAgICB0aGlzLmN1cnNvci5iLl9maXJlTG9vcEVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKGJyYW5jaFNwZWMuaWQsIHN0YWdlSWQpO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yLmZpbmlzaCh0aGlzLmRlZmF1bHRJZCk7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTZWxlY3RvckZuTGlzdCAoc2NvcGUtYmFzZWQgc2VsZWN0b3Ig4oCUIG1pcnJvcnMgRGVjaWRlckxpc3QpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRm5MaXN0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnNvcjogQnJhbmNoQ3Vyc29yPFRPdXQsIFRTY29wZT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVpbGRlcjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+LFxuICAgIGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpLFxuICAgIHJlc2VydmVkU3RlcE51bWJlciA9IDAsXG4gICAgc2VsZWN0b3JEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5jdXJzb3IgPSBuZXcgQnJhbmNoQ3Vyc29yKFxuICAgICAgJ3NlbGVjdG9yJyxcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBjdXJOb2RlLFxuICAgICAgY3VyU3BlYyxcbiAgICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHMsXG4gICAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHJlc2VydmVkU3RlcE51bWJlcixcbiAgICAgIHNlbGVjdG9yRGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZEZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyBUSElTIEJSQU5DSCdzIHN0YWdlIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5O1xuICAgICAqICBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdCAoc2VlIGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2ApLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmN1cnNvci5mdW5jdGlvbkJyYW5jaChpZCwgbmFtZSwgZm4sIGRlc2NyaXB0aW9uLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIHNlbGVjdG9yIGJyYW5jaC5cbiAgICpcbiAgICogV2hlbiB0aGlzIGJyYW5jaCBpcyBzZWxlY3RlZCwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5LlxuICAgKi9cbiAgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBgZXhlY3V0ZWAgaGFsZiBhIHJldHJ5IHBvbGljeSAodGhlXG4gICAgICogIGByZXN1bWVgIGhhbGYgcnVucyB3aXRob3V0IGl0IOKAlCBhIGRpZmZlcmVudCBmdW5jdGlvbiwgYSBkaWZmZXJlbnRcbiAgICAgKiAgY29udHJhY3QpOyBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdC4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IucGF1c2FibGVCcmFuY2goaWQsIG5hbWUsIGhhbmRsZXIsIGRlc2NyaXB0aW9uLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmN1cnNvci5zdWJmbG93QnJhbmNoKGlkLCBzdWJmbG93LCBtb3VudE5hbWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IubGF6eVN1YmZsb3dCcmFuY2goaWQsIHJlc29sdmVyLCBtb3VudE5hbWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQnJhbmNoTGlzdChcbiAgICBicmFuY2hlczogQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIH0+LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBmb3IgKGNvbnN0IHsgaWQsIG5hbWUsIGZuIH0gb2YgYnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuYWRkRnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlbmQoKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJzb3IuZmluaXNoKCk7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGbG93Q2hhcnRCdWlsZGVyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEJ1aWxkZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgX3Jvb3Q/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfcm9vdFNwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgX2N1cnNvcj86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIF9jdXJzb3JTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9zdGFnZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+KCk7XG4gIF9zdWJmbG93RGVmcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+KCk7XG4gIHByaXZhdGUgX3N0cmVhbUhhbmRsZXJzOiBTdHJlYW1IYW5kbGVycyA9IHt9O1xuICAvKipcbiAgICogTDcuMyDigJQgQnVpbGQtdGltZSBvYnNlcnZlciBmYW4tb3V0LiBPd25lZCBieSB0aGUgYnVpbGRlciBzbyBldmVyeVxuICAgKiBgYWRkWCgpYCBtZXRob2QgY2FuIGZpcmUgYFN0cnVjdHVyZVJlY29yZGVyYCBldmVudHMgYXQgdGhlIG5hdHVyYWxcbiAgICogbW9tZW50IG9mIHRoZSBjb3JyZXNwb25kaW5nIG11dGF0aW9uLiBEaXNwYXRjaGVyIGlzIGFsbG9jYXRlZFxuICAgKiBsYXppbHkgb24gZmlyc3QgYXR0YWNoIHRvIGtlZXAgdGhlIHplcm8tcmVjb3JkZXIgcGF0aCBhbGxvY2F0aW9uLVxuICAgKiBmcmVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfc3RydWN0dXJlRGlzcGF0Y2hlcj86IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlcjtcbiAgLyoqXG4gICAqIEw3LjMg4oCUIFNlYWxlZC1hZnRlci1idWlsZCBmbGFnIChQYW5lbCAyIHBoYXNlIGludmFyaWFudCkuIEZsaXBzXG4gICAqIHRvIGB0cnVlYCB3aGVuIGAuYnVpbGQoKWAgcmV0dXJuczsgc3Vic2VxdWVudCBgYXR0YWNoU3RydWN0dXJlUmVjb3JkZXJgXG4gICAqIHRocm93cy4gUHJldmVudHMgdGhlIGZvb3RndW4gd2hlcmUgYSBjb25zdW1lciBhdHRhY2hlcyBhIHJlY29yZGVyXG4gICAqIG1pZC1leGVjdXRpb24gYW5kIGdldHMgcGFydGlhbCBzdHJ1Y3R1cmUgZGF0YSAobWlzc2VkIGV2ZXJ5IGV2ZW50XG4gICAqIGFscmVhZHkgZmlyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbikuXG4gICAqL1xuICBwcml2YXRlIF9zZWFsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZW5hYmxlTmFycmF0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgX2xvZ2dlcj86IElMb2dnZXI7XG4gIHByaXZhdGUgX2Rlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgX3N0ZXBDb3VudGVyID0gMDtcbiAgLy8gTk9URToga2V5ZWQgYnkgc3RhZ2UgbmFtZSAoZm9yIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyksIHdoaWxlIHN0YWdlTWFwXG4gIC8vIGFuZCBrbm93blN0YWdlSWRzIHVzZSBpZCAoc3RhYmxlIGlkZW50aWZpZXIpLiBUaGVzZSBhcmUgaW50ZW50aW9uYWxseSBkaWZmZXJlbnRcbiAgLy8gbmFtZXNwYWNlcyDigJQgZGVzY3JpcHRpb25zIGFyZSBwcmVzZW50YXRpb25hbCwgbG9va3VwcyBhcmUgc3RydWN0dXJhbC5cbiAgcHJpdmF0ZSBfc3RhZ2VEZXNjcmlwdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIF9zdGFnZVN0ZXBNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIF9rbm93blN0YWdlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2lucHV0U2NoZW1hPzogdW5rbm93bjtcbiAgcHJpdmF0ZSBfb3V0cHV0U2NoZW1hPzogdW5rbm93bjtcbiAgcHJpdmF0ZSBfb3V0cHV0TWFwcGVyPzogKGZpbmFsU2NvcGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB1bmtub3duO1xuICBwcml2YXRlIF9zY29wZUZhY3Rvcnk/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcblxuICAvLyDilIDilIAgTDcuMyDigJQgU3RydWN0dXJlUmVjb3JkZXIgYXR0YWNoICsgZGlzcGF0Y2ggaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgYFN0cnVjdHVyZVJlY29yZGVyYCBmb3IgYnVpbGQtcGhhc2Ugb2JzZXJ2YXRpb24uIE11bHRpcGxlXG4gICAqIHJlY29yZGVycyBjb2V4aXN0IChzYW1lIGlkIGFsbG93ZWQ7IGl0ZXJhdGlvbiBvcmRlciA9IGF0dGFjaFxuICAgKiBvcmRlcikuIFRocm93cyBpZiBjYWxsZWQgYWZ0ZXIgYC5idWlsZCgpYCDigJQgdGhlIGNoYXJ0IGlzIHNlYWxlZCBhdFxuICAgKiB0aGF0IHBvaW50IGFuZCBhbnkgcmVjb3JkZXIgYXR0YWNoZWQgbGF0ZSB3b3VsZCBtaXNzIGV2ZXJ5IGV2ZW50XG4gICAqIGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAqXG4gICAqICoqU2VlZCByZXBsYXkqKjogd2hlbiB0aGlzIGlzIGNhbGxlZCBBRlRFUiBgc3RhcnQoKWAgaGFzIGFscmVhZHlcbiAgICogZmlyZWQgKGkuZS4sIGFmdGVyIHRoZSBgZmxvd0NoYXJ0KClgIGZhY3RvcnkgcmV0dXJucyksIHRoZVxuICAgKiBqdXN0LWF0dGFjaGVkIHJlY29yZGVyIHJlY2VpdmVzIGEgb25lLXRpbWUgYG9uU3RhZ2VBZGRlZGAgZm9yIHRoZVxuICAgKiByb290IHN0YWdlIHNvIGl0IG9ic2VydmVzIHRoZSBzZWVkLiBPbmx5IHRoZSBuZXcgcmVjb3JkZXIgc2Vlc1xuICAgKiB0aGUgcmVwbGF5OyBhbHJlYWR5LWF0dGFjaGVkIHJlY29yZGVycyBhcmUgbm90IHJlLWZpcmVkLlxuICAgKlxuICAgKiAqKk1pZC1jaGFpbiBhdHRhY2ggY2F2ZWF0Kio6IGEgcmVjb3JkZXIgYXR0YWNoZWQgQUZURVIgb25lIG9yIG1vcmVcbiAgICogYGFkZFgoKWAgY2FsbHMgcmVjZWl2ZXMgdGhlIHNlZWQgcmVwbGF5IGJ1dCBNSVNTRVMgZXZlcnlcbiAgICogaW50ZXJtZWRpYXRlIGV2ZW50LiBBdHRhY2ggQkVGT1JFIHRoZSBmaXJzdCBgYWRkWCgpYCBmb3IgY29tcGxldGVcbiAgICogY2FwdHVyZS5cbiAgICpcbiAgICogUHVibGljIGZvciBub3cgdG8gZW5hYmxlIGRpcmVjdCBhdHRhY2ggaW4gdGVzdHMgKyBlYXJseSBjb25zdW1lcnMuXG4gICAqIEw3LjQgd2lsbCB3aXJlIGBmbG93Q2hhcnQoLi4uLCB7IHN0cnVjdHVyZVJlY29yZGVyczogWy4uLl0gfSlgIGFzXG4gICAqIGFuIGFkZGl0aW9uYWwgcmVnaXN0cmF0aW9uIHNpdGU7IHRoaXMgbWV0aG9kIHdpbGwgcmVtYWluLlxuICAgKi9cbiAgYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjb3JkZXI6IFN0cnVjdHVyZVJlY29yZGVyKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX3NlYWxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdIGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKCcke3JlY29yZGVyLmlkfScpIGNhbGxlZCBhZnRlciAuYnVpbGQoKSDigJQgY2hhcnQgaXMgc2VhbGVkOyBgICtcbiAgICAgICAgICAndGhlIHJlY29yZGVyIHdvdWxkIG1pc3MgZXZlcnkgc3RydWN0dXJlIGV2ZW50IGZyb20gY29uc3RydWN0aW9uLiBBdHRhY2ggQkVGT1JFIC5idWlsZCgpLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIgPSBuZXcgU3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAvLyBUaGUgc2VlZCBmaXJlcyBpbnNpZGUgYHN0YXJ0KClgIOKAlCB0aGF0IHJ1bnMgQkVGT1JFIHRoZSBjb25zdW1lclxuICAgIC8vIGNhbiBwb3N0LWNvbnN0cnVjdCBhdHRhY2guIFJlcGxheSB0aGUgc2VlZCBldmVudCBPTkxZIGludG8gdGhlXG4gICAgLy8ganVzdC1hdHRhY2hlZCByZWNvcmRlciBzbyBvdGhlciBhbHJlYWR5LWF0dGFjaGVkIHJlY29yZGVycyBkb24ndFxuICAgIC8vIHNlZSBhIGR1cGxpY2F0ZS4gRXJyb3JzIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgZGlzcGF0Y2hlcidzXG4gICAgLy8gYWNjdW11bGF0b3Igc28gdGhlIGNvbnRyYWN0IHN0YXlzIHVuaWZvcm0uXG4gICAgaWYgKHRoaXMuX3Jvb3RTcGVjKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvcmRlci5vblN0YWdlQWRkZWQ/Lih7XG4gICAgICAgICAgc3RhZ2VJZDogdGhpcy5fcm9vdFNwZWMuaWQsXG4gICAgICAgICAgbmFtZTogdGhpcy5fcm9vdFNwZWMubmFtZSxcbiAgICAgICAgICB0eXBlOiB0aGlzLl9yb290U3BlYy50eXBlID8/ICdzdGFnZScsXG4gICAgICAgICAgLi4uKHRoaXMuX3Jvb3RTcGVjLmlzUGF1c2FibGUgPT09IHRydWUgJiYgeyBpc1BhdXNhYmxlOiB0cnVlIH0pLFxuICAgICAgICAgIC4uLih0aGlzLl9yb290U3BlYy50YWdzICE9PSB1bmRlZmluZWQgJiYgeyB0YWdzOiBbLi4udGhpcy5fcm9vdFNwZWMudGFnc10gfSksXG4gICAgICAgICAgc3BlYzogdGhpcy5fcm9vdFNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLnJlY29yZEVycm9yRm9yUmVwbGF5KHJlY29yZGVyLmlkLCAnb25TdGFnZUFkZGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5zcGVjdCBhY2N1bXVsYXRlZCBgU3RydWN0dXJlQnVpbGRFcnJvcmBzLiBSZXR1cm5zIGVtcHR5IGFycmF5XG4gICAqIHdoZW4gbm8gcmVjb3JkZXJzIGF0dGFjaGVkIE9SIG5vIGVycm9ycyBvY2N1cnJlZC4gUmV0dXJucyBhXG4gICAqIGRlZmVuc2l2ZSBjb3B5IOKAlCBjYWxsZXIgbXV0YXRpb25zIGRvIG5vdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscy5cbiAgICpcbiAgICogKipDYWxsIG9uIHRoZSBCVUlMREVSLCBub3QgdGhlIGNoYXJ0IHJldHVybmVkIGJ5IGAuYnVpbGQoKWAuKipcbiAgICogQ2FwdHVyZSB0aGUgYnVpbGRlciByZWZlcmVuY2UgYmVmb3JlIGAuYnVpbGQoKWAgaWYgeW91IG5lZWRcbiAgICogcG9zdC1idWlsZCBhY2Nlc3M6XG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGJ1aWxkZXIgPSBmbG93Q2hhcnQoLi4uKS5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgKiBjb25zdCBjaGFydCA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICogY29uc3QgZXJyb3JzID0gYnVpbGRlci5nZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFN0cnVjdHVyZUJ1aWxkRXJyb3JzKCk6IFJldHVyblR5cGU8U3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyWydnZXRFcnJvcnMnXT4ge1xuICAgIHJldHVybiB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyPy5nZXRFcnJvcnMoKSA/PyBbXTtcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZpcmUgaGVscGVycyDigJQgbm8tb3Agd2hlbiBubyBkaXNwYXRjaGVyIGF0dGFjaGVkLiBLZWVwc1xuICAvLyBldmVyeSBjYWxsIHNpdGUgYSBvbmUtbGluZXIgd2l0aG91dCB0aGUgYGlmICh0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKWBcbiAgLy8gYm9pbGVycGxhdGUgZXZlcnl3aGVyZS5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlQWRkZWQoc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgLy8gUmVhZCBgaXNQYXVzYWJsZWAgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICAvLyBUaGUgcHJldmlvdXMgYGV4dHJhc2AgYXJndW1lbnQgd2FzIGEgc3ViLWJ1aWxkZXIgZm9vdGd1bjogYnJhbmNoXG4gICAgLy8gaGVscGVycyBpbiBEZWNpZGVyTGlzdC9TZWxlY3RvckZuTGlzdCB3ZW50IHRocm91Z2hcbiAgICAvLyBgX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgIHdoaWNoIGRyb3BwZWQgdGhlIGV4dHJhcywgc2lsZW50bHlcbiAgICAvLyBsb3NpbmcgYGlzUGF1c2FibGU6IHRydWVgIG9uIHBhdXNhYmxlIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoZXMuXG4gICAgY29uc3QgaXNQYXVzYWJsZSA9IHNwZWMuaXNQYXVzYWJsZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdGFnZUFkZGVkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0eXBlOiBzcGVjLnR5cGUgPz8gJ3N0YWdlJyxcbiAgICAgIC4uLihpc1BhdXNhYmxlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgIC4uLihzcGVjLnRhZ3MgIT09IHVuZGVmaW5lZCAmJiB7IHRhZ3M6IFsuLi5zcGVjLnRhZ3NdIH0pLFxuICAgICAgc3BlYzogc3BlYyBhcyB1bmtub3duIGFzIEZsb3dDaGFydFNwZWMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlU3RhZ2VUYWdnZWQoc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyIHx8IHNwZWMudGFncyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlU3RhZ2VUYWdnZWQoe1xuICAgICAgc3RhZ2VJZDogc3BlYy5pZCxcbiAgICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICAgIHRhZ3M6IFsuLi5zcGVjLnRhZ3NdLFxuICAgICAgc3BlYzogc3BlYyBhcyB1bmtub3duIGFzIEZsb3dDaGFydFNwZWMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZywga2luZDogU3RydWN0dXJlRWRnZUtpbmQsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlRWRnZUFkZGVkKHtcbiAgICAgIGZyb20sXG4gICAgICB0byxcbiAgICAgIGtpbmQsXG4gICAgICAuLi4obGFiZWwgIT09IHVuZGVmaW5lZCAmJiB7IGxhYmVsIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUxvb3BFZGdlQWRkZWQoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlTG9vcEVkZ2VBZGRlZCh7IGZyb20sIHRvIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmUgdGhlIGBuZXh0YCBlZGdlKHMpIGZyb20gYSBwYXJlbnQgc3BlYyB0byBhIGZyZXNobHktYWRkZWRcbiAgICogbm9kZSDigJQgd2l0aCBjb252ZXJnZW5jZSBleHBhbnNpb24gd2hlbiB0aGUgcGFyZW50IGlzIGFcbiAgICogZm9yayAvIGRlY2lkZXIgLyBzZWxlY3RvciB3aXRoIGJyYW5jaGVzLlxuICAgKlxuICAgKiBBIGZvcmsgYXQgYHBhcmVudGAgaXMgc2VtYW50aWNhbGx5IGBwYXJlbnQg4pSA4pSAZm9yay1icmFuY2jilIDilIDilrogY2hpbGRbaV1gXG4gICAqIGZvciBlYWNoIGNoaWxkLCBhbmQgdGhlIGNoYWluZWQgYC5hZGRGdW5jdGlvbihYKWAgY29udGludWVzXG4gICAqIEFGVEVSIHRoZSBmb3JrIGNvbnZlcmdlcy4gVGhlIHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGF0IGVhY2hcbiAgICogY2hpbGQgSU5ERVBFTkRFTlRMWSBmZWVkcyBgWGAgKHBhcmFsbGVsIGNvbXBsZXRpb24g4oaSIGpvaW4pLiBUaGVcbiAgICogbGl0ZXJhbCBcImVkZ2UgZnJvbSBwYXJlbnQgdG8gWFwiIHdvdWxkIG1pc3JlcHJlc2VudCB0aGlzIOKAlFxuICAgKiB2aXN1YWxpemVycyBhbmQgdG9wb2xvZ2ljYWwgYWxnb3JpdGhtcyB3b3VsZCBzZWUgb25lIGVkZ2Ugd2hlcmVcbiAgICogdGhlcmUgc2hvdWxkIGJlIE4gY29udmVyZ2VuY2UgZWRnZXMuXG4gICAqXG4gICAqIEZpeDogd2hlbiBgcGFyZW50U3BlY2AgaGFzIGJyYW5jaCBjaGlsZHJlbiAoZm9yayBvciBicmFuY2hlZFxuICAgKiBkZWNpZGVyL3NlbGVjdG9yKSwgZmlyZSBvbmUgYG5leHRgIGVkZ2UgZnJvbSBFQUNIIGNoaWxkIHRvIHRoZVxuICAgKiB0YXJnZXQuIE90aGVyd2lzZSBmaXJlIHRoZSBzaW5nbGUgZWRnZSBmcm9tIGBwYXJlbnRTcGVjYCBpdHNlbGYuXG4gICAqXG4gICAqIExvb3AtcmVmZXJlbmNlIGNoaWxkcmVuIChzeW50aGV0aWMgc3BlYyBub2RlcyBjcmVhdGVkIGJ5XG4gICAqIGAubG9vcFRvKClgKSBhcmUgZXhjbHVkZWQg4oCUIHRoZXkncmUgYmFjay1lZGdlIG1hcmtlcnMsIG5vdFxuICAgKiBjb252ZXJnZW5jZSBzb3VyY2VzLiBBIGJyYW5jaCB0aGF0IGNhcnJpZXMgYW4gT1dOIGxvb3AtYmFjayBgbmV4dGBcbiAgICogKGEgYnJhbmNoLXNvdXJjZWQgYGxvb3BUb2ApIGlzIGxpa2V3aXNlIHNraXBwZWQg4oCUIGl0IGxvb3BzLCBpdCBkb2VzXG4gICAqIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAqXG4gICAqIEEgYnJhbmNoIGNhcnJ5aW5nIGBjb252ZXJnZUF0YCBpcyBSRURJUkVDVEVEOiBpdHMgc2luZ2xlIGNvbnZlcmdlbmNlXG4gICAqIGVkZ2UgZmlyZXMgdG8gaXRzIG5hbWVkIHRhcmdldCBpbnN0ZWFkIG9mIGB0YXJnZXRJZGAg4oCUIGV4cHJlc3NpbmcgYW5cbiAgICogdW5lcXVhbC1kZXB0aCBtZXJnZSAoZS5nLiBgdG9vbHMg4oaSIGNhbGwtbGxtYCwgYnlwYXNzaW5nIGBtZXNzYWdlLWFwaWApLlxuICAgKiBUaGUgbmFtZWQgdGFyZ2V0IGlzIGEgZm9yd2FyZCBzdGFnZSwgc28gaXQgaXMgTk9UIHZhbGlkYXRlZCBoZXJlLlxuICAgKlxuICAgKiBDYWxsIE9SREVSIGNvbnN0cmFpbnQ6IG11c3QgYmUgY2FsbGVkIEJFRk9SRSB0aGUgY3Vyc29yIGFkdmFuY2VzXG4gICAqIHRvIHRoZSBuZXcgdGFyZ2V0LiBUaGUgY2FsbGVyIHBhc3NlcyB0aGUgUFJFLUFEVkFOQ0UgcGFyZW50IHNwZWMuXG4gICAqL1xuICBwcml2YXRlIF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSwgdGFyZ2V0SWQ6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICBjb25zdCBjaGlsZFNwZWNzID0gcGFyZW50U3BlYy5jaGlsZHJlbjtcbiAgICBjb25zdCBpc0JyYW5jaGluZ1BhcmVudCA9XG4gICAgICAocGFyZW50U3BlYy50eXBlID09PSAnZm9yaycgfHwgcGFyZW50U3BlYy50eXBlID09PSAnZGVjaWRlcicgfHwgcGFyZW50U3BlYy50eXBlID09PSAnc2VsZWN0b3InKSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShjaGlsZFNwZWNzKSAmJlxuICAgICAgY2hpbGRTcGVjcy5sZW5ndGggPiAwO1xuICAgIGlmICghaXNCcmFuY2hpbmdQYXJlbnQpIHtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQocGFyZW50U3BlYy5pZCwgdGFyZ2V0SWQsICduZXh0JywgbGFiZWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkU3BlY3MhKSB7XG4gICAgICBpZiAoY2hpbGQuaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIC8vIEEgYnJhbmNoIHdpdGggaXRzIG93biBsb29wLWJhY2sgbmV4dCAoYnJhbmNoLXNvdXJjZWQgbG9vcFRvKSBsb29wcyDigJRcbiAgICAgIC8vIGl0IGRvZXMgbm90IGNvbnZlcmdlIGF0IHRoZSBsaW5lYXIgbmV4dCBzdGFnZS5cbiAgICAgIGlmIChjaGlsZC5uZXh0Py5pc0xvb3BSZWZlcmVuY2UpIGNvbnRpbnVlO1xuICAgICAgaWYgKGNoaWxkLmNvbnZlcmdlQXQpIHtcbiAgICAgICAgLy8gUmVkaXJlY3RlZCBjb252ZXJnZW5jZTogdGhpcyBicmFuY2ggcmVqb2lucyBhdCBpdHMgbmFtZWQgdGFyZ2V0LlxuICAgICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCBjaGlsZC5jb252ZXJnZUF0LCAnbmV4dCcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY2hpbGQuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maXJlRGVjaWRlckNvbXBsZXRlKFxuICAgIGRlY2lkZXI6IHN0cmluZyxcbiAgICB0eXBlOiAnZGVjaWRlcicgfCAnc2VsZWN0b3InLFxuICAgIGJyYW5jaElkczogc3RyaW5nW10sXG4gICAgZGVmYXVsdEJyYW5jaD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlRGVjaWRlckNvbXBsZXRlKHtcbiAgICAgIGRlY2lkZXIsXG4gICAgICB0eXBlLFxuICAgICAgYnJhbmNoSWRzLFxuICAgICAgLi4uKGRlZmF1bHRCcmFuY2ggIT09IHVuZGVmaW5lZCAmJiB7IGRlZmF1bHRCcmFuY2ggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlU3ViZmxvd01vdW50ZWQoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIC8vIHN1YmZsb3dQYXRoIGRlZmF1bHRzIHRvIHN1YmZsb3dJZCB3aGVuIHRoZSByZWNvcmRlciBpcyBhdHRhY2hlZFxuICAgIC8vIHRvIHRoZSBpbW1lZGlhdGUgcGFyZW50ICh0b3AtbGV2ZWwgbW91bnQpOyBjb21wb3NlZCBwYXRocyBhcHBseVxuICAgIC8vIG9ubHkgd2hlbiB0aGlzIGJ1aWxkZXIgaXMgaXRzZWxmIGEgbmVzdGVkIHN1YmZsb3cgYmVpbmdcbiAgICAvLyBvYnNlcnZlZCBieSB0aGUgZ3JhbmRwYXJlbnQncyByZWNvcmRlci5cbiAgICBjb25zdCBwYXRoID0gc3ViZmxvd1BhdGggPz8gc3ViZmxvd0lkO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZVN1YmZsb3dNb3VudGVkKHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgcm9vdFN0YWdlSWQsXG4gICAgICAuLi4oaXNMYXp5ID09PSB0cnVlICYmIHsgaXNMYXp5IH0pLFxuICAgICAgLi4uKHN1YmZsb3dTcGVjICE9PSB1bmRlZmluZWQgJiYgeyBzdWJmbG93U3BlYyB9KSxcbiAgICAgIHN1YmZsb3dQYXRoOiBwYXRoLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN1Yi1idWlsZGVyIGFjY2VzcyAoYC5iLl9maXJlWHh4YCkgaXMgbmVlZGVkIGJ5IERlY2lkZXJMaXN0IC9cbiAgICogIFNlbGVjdG9yRm5MaXN0OyBleHBvc2UgdGhlIGRpc3BhdGNoZXIgdGhyb3VnaCBpbnRlcm5hbCBoZWxwZXJzXG4gICAqICB0aGF0IGdvIHRocm91Z2ggdGhlIHNhbWUgbm8tb3Atd2hlbi1hYnNlbnQgZ3VhcmQuXG4gICAqXG4gICAqICBAaW50ZXJuYWwg4oCUIHRoZXNlIG1ldGhvZHMgYXJlIGV4cG9zZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGBwcml2YXRlYFxuICAgKiAgZG9lc24ndCB0cmF2ZXJzZSBjbGFzcyBib3VuZGFyaWVzLiBDb25zdW1lciBjb2RlIE1VU1QgTk9UIGNhbGxcbiAgICogIHRoZW07IGNhbGxpbmcgdGhlbSBwb3N0LWNvbnN0cnVjdGlvbiBsZXRzIGEgaG9zdGlsZSBjYWxsZXJcbiAgICogIGZhYnJpY2F0ZSBzdHJ1Y3R1cmUgZXZlbnRzIGFuZCBjb3JydXB0IGRvd25zdHJlYW0gdmlzdWFsaXphdGlvbnNcbiAgICogIG9yIGF1ZGl0IHRyYWlscy4gVGhlIGBfYCBwcmVmaXggaXMgaW50ZW50aW9uYWwgY29udmVudGlvbi4gKi9cbiAgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoZnJvbSwgdG8sIGtpbmQsIGxhYmVsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gKi9cbiAgX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcihcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVEZWNpZGVyQ29tcGxldGUoZGVjaWRlciwgdHlwZSwgYnJhbmNoSWRzLCBkZWZhdWx0QnJhbmNoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIHJvb3RTdGFnZUlkOiBzdHJpbmcsXG4gICAgaXNMYXp5PzogYm9vbGVhbixcbiAgICBzdWJmbG93U3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICBzdWJmbG93UGF0aD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKHN1YmZsb3dJZCwgc3ViZmxvd05hbWUsIHJvb3RTdGFnZUlkLCBpc0xhenksIHN1YmZsb3dTcGVjLCBzdWJmbG93UGF0aCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiBVc2VkIGJ5IGBEZWNpZGVyTGlzdC5sb29wVG9gXG4gICAqICB0byB2YWxpZGF0ZSBhIGJyYW5jaC1zb3VyY2VkIGxvb3AgdGFyZ2V0IGFnYWluc3QgdGhlIGtub3duIHN0YWdlIGlkc1xuICAgKiAgKG1pcnJvcnMgYEZsb3dDaGFydEJ1aWxkZXIubG9vcFRvYCdzIGBfa25vd25TdGFnZUlkcy5oYXNgIGd1YXJkKS4gKi9cbiAgX2tub3duU3RhZ2VJZHNIYXMoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhpZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiBVc2VkIGJ5IGBEZWNpZGVyTGlzdC5sb29wVG9gXG4gICAqICB0byBmaXJlIGEgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIEEgQlJBTkNIIG5vZGUgKG5vdCB0aGUgZGVjaWRlcikuICovXG4gIF9maXJlTG9vcEVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGZyb20sIHRvKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXNjcmlwdGlvbiBoZWxwZXJzIOKUgOKUgFxuXG4gIHByaXZhdGUgX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICBjb25zdCBsaW5lID0gZGVzY3JpcHRpb24gPyBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX0g4oCUICR7ZGVzY3JpcHRpb259YCA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gJHtuYW1lfWA7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGxpbmUpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMuc2V0KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBlbmRTdWJmbG93RGVzY3JpcHRpb24oaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KGlkLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgaWYgKHN1YmZsb3cuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gc3ViZmxvdy5kZXNjcmlwdGlvbi5zcGxpdCgnXFxuJyk7XG4gICAgICBjb25zdCBzdGVwc0lkeCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zdGFydHNXaXRoKCdTdGVwczonKSk7XG4gICAgICBpZiAoc3RlcHNJZHggPj0gMCkge1xuICAgICAgICAvLyBCdWlsZGVyLWNvbXBvc2VkIGRlc2NyaXB0aW9uIChgRmxvd0NoYXJ0OiBYXFxuU3RlcHM6XFxuLi4uYCkuXG4gICAgICAgIC8vIElubGluZSBPTkxZIHRoZSBzdW1tYXJ5IGFib3ZlIGBTdGVwczpgIG9uIHRoZSBtb3VudCBsaW5lLCB0aGVuXG4gICAgICAgIC8vIHJlLWxpc3QgdGhlIHN0ZXAgbGluZXMgb25jZSwgaW5kZW50ZWQuIEVtYmVkZGluZyB0aGUgRlVMTCBpbm5lclxuICAgICAgICAvLyBkZXNjcmlwdGlvbiBoZXJlIEFORCByZS1saXN0aW5nIGl0cyBzdGVwcyBkb3VibGVkIHRoZSB0ZXh0IHBlclxuICAgICAgICAvLyBuZXN0aW5nIGxldmVsIOKAlCBleHBvbmVudGlhbCBncm93dGgsIFJhbmdlRXJyb3IgKFwiSW52YWxpZCBzdHJpbmdcbiAgICAgICAgLy8gbGVuZ3RoXCIpIGF0IH4yMiBuZXN0aW5nIGxldmVscyBvZiBuZXN0ZWQgYnVpbGQoKS5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGxpbmVzLnNsaWNlKDAsIHN0ZXBzSWR4KS5qb2luKCcgJykudHJpbSgpO1xuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goXG4gICAgICAgICAgc3VtbWFyeVxuICAgICAgICAgICAgPyBgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtTdWItRXhlY3V0aW9uOiAke25hbWV9XSDigJQgJHtzdW1tYXJ5fWBcbiAgICAgICAgICAgIDogYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV1gLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RlcHNJZHggKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAobGluZXNbaV0udHJpbSgpKSB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgICR7bGluZXNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZyZWUtZm9ybSAoc2luZ2xlLWJsb2NrKSBkZXNjcmlwdGlvbiDigJQgaW5saW5lIGl0IHdob2xlLCB1bmNoYW5nZWQuXG4gICAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtTdWItRXhlY3V0aW9uOiAke25hbWV9XSDigJQgJHtzdWJmbG93LmRlc2NyaXB0aW9ufWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ29uZmlndXJhdGlvbiDilIDilIBcblxuICBzZXRMb2dnZXIobG9nZ2VyOiBJTG9nZ2VyKTogdGhpcyB7XG4gICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2VyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmUgdGhlIEFQSSBjb250cmFjdCDigJQgaW5wdXQgdmFsaWRhdGlvbiwgb3V0cHV0IHNoYXBlLCBhbmQgb3V0cHV0IG1hcHBlci5cbiAgICogUmVwbGFjZXMgc2V0SW5wdXRTY2hlbWEoKSArIHNldE91dHB1dFNjaGVtYSgpICsgc2V0T3V0cHV0TWFwcGVyKCkgaW4gYSBzaW5nbGUgY2FsbC5cbiAgICpcbiAgICogSWYgYSBjb250cmFjdCB3aXRoIGlucHV0IHNjaGVtYSBpcyBkZWNsYXJlZCwgY2hhcnQucnVuKCkgdmFsaWRhdGVzIGlucHV0IGF1dG9tYXRpY2FsbHkuXG4gICAqIENvbnRyYWN0IGRhdGEgaXMgdXNlZCBieSBjaGFydC50b09wZW5BUEkoKSBhbmQgY2hhcnQudG9NQ1BUb29sKCkuXG4gICAqL1xuICBjb250cmFjdChvcHRzOiB7XG4gICAgaW5wdXQ/OiB1bmtub3duO1xuICAgIG91dHB1dD86IHVua25vd247XG4gICAgbWFwcGVyPzogKGZpbmFsU2NvcGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB1bmtub3duO1xuICB9KTogdGhpcyB7XG4gICAgaWYgKG9wdHMuaW5wdXQpIHRoaXMuX2lucHV0U2NoZW1hID0gb3B0cy5pbnB1dDtcbiAgICBpZiAob3B0cy5vdXRwdXQpIHRoaXMuX291dHB1dFNjaGVtYSA9IG9wdHMub3V0cHV0O1xuICAgIGlmIChvcHRzLm1hcHBlcikgdGhpcy5fb3V0cHV0TWFwcGVyID0gb3B0cy5tYXBwZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgTGluZWFyIENoYWluaW5nIOKUgOKUgFxuXG4gIHN0YXJ0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZXRyeT86IFJldHJ5UG9saWN5OyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogdGhpcyB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgaWYgKHRoaXMuX3Jvb3QpIGZhaWwoJ3Jvb3QgYWxyZWFkeSBkZWZpbmVkOyBjcmVhdGUgYSBuZXcgYnVpbGRlcicpO1xuXG4gICAgLy8gRGV0ZWN0IFBhdXNhYmxlSGFuZGxlciBieSBkdWNrLXR5cGluZyAoaGFzIC5leGVjdXRlIHByb3BlcnR5KVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgIGNvbnN0IGlzUGF1c2FibGUgPSB0eXBlb2YgZm4gPT09ICdvYmplY3QnICYmIGZuICE9PSBudWxsICYmICdleGVjdXRlJyBpbiBmbjtcbiAgICBjb25zdCBzdGFnZUZuID0gaXNQYXVzYWJsZVxuICAgICAgPyAoKGZuIGFzIFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+KS5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPilcbiAgICAgIDogKGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBzdGFnZUZuIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHtcbiAgICAgIG5vZGUuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgICBub2RlLnJlc3VtZUZuID0gKGZuIGFzIFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+KS5yZXN1bWU7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBzdGFnZUZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoaXNQYXVzYWJsZSkgc3BlYy5pc1BhdXNhYmxlID0gdHJ1ZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgc3RhcnQoJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYHN0YXJ0KCcke2lkfScpYCk7XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWVkIG5vZGUgZmlyZXMgYG9uU3RhZ2VBZGRlZGAgKG5vIGVkZ2Ug4oCUIG5vIHByZWRlY2Vzc29yKS5cbiAgICAvLyBgaXNQYXVzYWJsZWAgaXMgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBzcGVjIGJ5IGBfZmlyZVN0YWdlQWRkZWRgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGNoYXJ0IHdob3NlIFJPT1Qgc3RhZ2UgSVMgYSBzZWxlY3RvciDigJQgaXQgcnVucyBmaXJzdCAocmVhZGluZ1xuICAgKiBhcmdzLCBzZWVkaW5nIHN0YXRlLCByZXR1cm5pbmcgdGhlIGNob3NlbiBicmFuY2ggaWRzIHZpYSBgc2VsZWN0KClgKSxcbiAgICogYW5kIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gdGhlIHJvb3QuIE1pcnJvcnMgYHN0YXJ0KClgIGZvciB0aGVcbiAgICogcm9vdC1ub2RlIHNldHVwLCB0aGVuIHJldHVybnMgYSBgU2VsZWN0b3JGbkxpc3RgIGJvdW5kIHRvIHRoZSByb290IHNvXG4gICAqIGAuYWRkRnVuY3Rpb25CcmFuY2goKWAgLyBgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgpYCAvIGAuZW5kKClgIHdvcmtcbiAgICogZXhhY3RseSBhcyB0aGV5IGRvIGFmdGVyIGBhZGRTZWxlY3RvckZ1bmN0aW9uKClgLlxuICAgKlxuICAgKiBVc2Ugd2hlbiB0aGUgZmlyc3QgdGhpbmcgYSBjaGFydCBkb2VzIGlzIGNob29zZSBhbW9uZyBicmFuY2hlcyDigJQgZS5nLiBhXG4gICAqIGBDb250ZXh0YCBzZWxlY3RvciB0aGF0IGluaXRzICsgcGlja3Mgd2hpY2ggY29udGV4dCBzbG90cyB0byBlbmdpbmVlcixcbiAgICogd2l0aCBubyBzZXBhcmF0ZSBzZWVkIHN0YWdlIGJlZm9yZSBpdC5cbiAgICovXG4gIHN0YXJ0U2VsZWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbjsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm46IGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIFNlZSBgYWRkU2VsZWN0b3JGdW5jdGlvbmAg4oCUIGBmYWlsRmFzdDogdHJ1ZWAgbWFrZXMgYSBtdWx0aS1icmFuY2hcbiAgICAvLyBzZWxlY3Rpb24gZmFuIG91dCB2aWEgYFByb21pc2UuYWxsYCAoZmlyc3QgZXJyb3IgYWJvcnRzKSBpbnN0ZWFkIG9mIHRoZVxuICAgIC8vIGRlZmF1bHQgYFByb21pc2UuYWxsU2V0dGxlZGAgKGJlc3QtZWZmb3J0KS5cbiAgICBpZiAob3B0aW9ucz8uZmFpbEZhc3QpIG5vZGUuZmFpbEZhc3QgPSB0cnVlO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgc3RhcnRTZWxlY3RvcignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgc3RhcnRTZWxlY3RvcignJHtpZH0nKWApO1xuXG4gICAgdGhpcy5fcm9vdCA9IG5vZGU7XG4gICAgdGhpcy5fcm9vdFNwZWMgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gUm9vdCBzZWxlY3RvciBub2RlIGZpcmVzIG9uU3RhZ2VBZGRlZCB3aXRoIE5PIHByZWRlY2Vzc29yIGVkZ2UgKGl0J3NcbiAgICAvLyB0aGUgcm9vdCkuIEJyYW5jaGVzICsgb25EZWNpZGVyQ29tcGxldGUgY29tZSBmcm9tIHRoZSBTZWxlY3RvckZuTGlzdC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiBuZXcgU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZEZ1bmN0aW9uKG5hbWU6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiwgaWQ6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgLy8gQ2FwdHVyZSB0aGUgcGFyZW50IFNQRUMgcmVmZXJlbmNlIChub3QganVzdCBpZCkgQkVGT1JFIHRoZVxuICAgIC8vIGN1cnNvciBhZHZhbmNlcyDigJQgd2UgbmVlZCBpdHMgYGNoaWxkcmVuYCArIGB0eXBlYCB0byBkZWNpZGVcbiAgICAvLyB3aGV0aGVyIHRoZSBgbmV4dGAgZWRnZSBpcyBhIGZvcmsgY29udmVyZ2VuY2UgKE4gZWRnZXMgZnJvbVxuICAgIC8vIGVhY2ggYnJhbmNoIGNoaWxkKSB2cyBhIHBsYWluIGxpbmVhciBjaGFpbiAoMSBlZGdlIGZyb20gcGFyZW50KS5cbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBMaW5lYXIgbm9kZTogYW5ub3VuY2UgdGhlIG5vZGUgZmlyc3QsIHRoZW4gdGhlIGVkZ2VcbiAgICAvLyBmcm9tIHRoZSBwcmlvciBjdXJzb3IuIE9yZGVyIG1hdHRlcnM6IGVuZHBvaW50cyBhbm5vdW5jZWRcbiAgICAvLyBiZWZvcmUgYW55IGVkZ2UgcmVmZXJlbmNpbmcgdGhlbSAoU3RydWN0dXJlUmVjb3JkZXIgY29udHJhY3QpLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN0cmVhbWluZ0Z1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RyZWFtSWQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgZm4sXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCA/PyBuYW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGU6ICdzdHJlYW1pbmcnLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTdHJlYW1pbmcgc3RhZ2U6IHNhbWUgc2hhcGUgYXMgbGluZWFyIGFkZEZ1bmN0aW9uLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSDigJQgY2FuIHBhdXNlIGV4ZWN1dGlvbiBhbmQgcmVzdW1lIGxhdGVyIHdpdGggaW5wdXQuXG4gICAqXG4gICAqIFRoZSBoYW5kbGVyIGhhcyB0d28gcGhhc2VzOlxuICAgKiAtIGBleGVjdXRlYDogcnVucyBmaXJzdCB0aW1lLiBSZXR1cm4gYW55IG5vbi12b2lkIHZhbHVlIHRvIHBhdXNlIChpdCBiZWNvbWVzXG4gICAqICAgdGhlIGNoZWNrcG9pbnQncyBgcGF1c2VEYXRhYCk7IHJldHVybiB2b2lkL3VuZGVmaW5lZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAgICogLSBgcmVzdW1lYDogcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZCB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogJ0FwcHJvdmU/JyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH0sICdhcHByb3ZlLW9yZGVyJywgJ01hbmFnZXIgYXBwcm92YWwgZ2F0ZScpXG4gICAqIGBgYFxuICAgKi9cbiAgYWRkUGF1c2FibGVGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LCBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgUGF1c2FibGUgc3RhZ2U6IGBfZmlyZVN0YWdlQWRkZWRgIHJlYWRzIGBpc1BhdXNhYmxlYFxuICAgIC8vIGRpcmVjdGx5IGZyb20gYHNwZWMuaXNQYXVzYWJsZWAgKHNldCBhYm92ZSksIHNvIHZpc3VhbGlzZXJzXG4gICAgLy8gc2VlIGl0IG9uIHRoZSBldmVudCBwYXlsb2FkIHdpdGhvdXQgYSBzZXBhcmF0ZSB0aHJlYWRpbmcgYXJnLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2ggKGJ1aWxkZXItbmF0aXZlIGNvbXBvc2l0aW9uKSDilIDilIBcbiAgLy9cbiAgLy8gU3VnYXIgb3ZlciBgYWRkRnVuY3Rpb25gIHRoYXQgZ2VuZXJhdGVzIGEgc3RhZ2Ugd2hpY2ggY2FsbHNcbiAgLy8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAgb3IgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYXQgcnVudGltZS4gWkVSTyBlbmdpbmUgY2hhbmdlcyDigJQgcHVyZSBjb21wb3NpdGlvbiBvdmVyIHRoZVxuICAvLyBleGlzdGluZyBzY29wZS1tZXRob2QgcHJpbWl0aXZlcy5cbiAgLy9cbiAgLy8gRm9yIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgLCB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIHN0b3JlZCBpblxuICAvLyBzaGFyZWQgc3RhdGUgdmlhIGAkc2V0VmFsdWVgICh3aGljaCBieXBhc3NlcyB0aGUgdHlwZWQtcHJveHlcbiAgLy8gdW53cmFwIHRoYXQgd291bGQgb3RoZXJ3aXNlIHN0cmlwIHRoZSBoYW5kbGUncyBjbGFzcyBtZXRob2RzKS5cbiAgLy8gRG93bnN0cmVhbSBzdGFnZXMgcmVhZCBpdCB2aWEgYHNjb3BlW29wdGlvbnMuaGFuZGxlS2V5XWAgb3JcbiAgLy8gYHNjb3BlLiRnZXRWYWx1ZShvcHRpb25zLmhhbmRsZUtleSlgIOKAlCBib3RoIHByZXNlcnZlIG1ldGhvZHNcbiAgLy8gYmVjYXVzZSB0aGUgdmFsdWUgd2FzIHN0b3JlZCByYXcuXG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0YWdlIHRoYXQgZmlyZXMgYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmRcbiAgICogRElTQ0FSRFMgdGhlIGhhbmRsZS4gUHVyZSBmaXJlLWFuZC1mb3JnZXQg4oCUIHVzZWZ1bCBmb3IgdGVsZW1ldHJ5XG4gICAqIGV4cG9ydHMsIGF1ZGl0IGxvZyBzaGlwcGluZywgY2FjaGUgd2FybS11cC5cbiAgICpcbiAgICogQHBhcmFtIGlkIFN0YWJsZSBpZCBmb3IgdGhpcyBzdGFnZSAoYWxzbyB0aGUgc3RhZ2VNYXAga2V5KS5cbiAgICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCBmbG93Y2hhcnQgdG8gZGV0YWNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5kcml2ZXIgVGhlIGRyaXZlciB0byBzY2hlZHVsZSBvbiAoZS5nLiBgbWljcm90YXNrQmF0Y2hEcml2ZXJgKS5cbiAgICogQHBhcmFtIG9wdGlvbnMuaW5wdXRNYXBwZXIgTWFwcyB0aGUgcGFyZW50J3Mgc2NvcGUgdG8gdGhlIGNoaWxkJ3MgaW5wdXQuXG4gICAqICAgRGVmYXVsdHMgdG8gcGFzc2luZyBgdW5kZWZpbmVkYC5cbiAgICogQHBhcmFtIG9wdGlvbnMubW91bnROYW1lIERpc3BsYXkgbmFtZTsgZGVmYXVsdHMgdG8gYGlkYC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZGVzY3JpcHRpb24gU3RhZ2UgZGVzY3JpcHRpb24gZm9yIG5hcnJhdGl2ZSArIHRvb2xzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGZsb3dDaGFydCgncHJvY2VzcycsIHByb2Nlc3NGbiwgJ3Byb2Nlc3MnKVxuICAgKiAgIC5hZGREZXRhY2hBbmRGb3JnZXQoJ3RlbGVtZXRyeScsIHRlbGVtZXRyeUNoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gKHsgZXZlbnQ6ICdwcm9jZXNzZWQnLCBvcmRlcklkOiBzY29wZS5vcmRlcklkIH0pLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCduZXh0JywgbmV4dEZuLCAnbmV4dCcpXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRGV0YWNoQW5kRm9yZ2V0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgb3B0aW9uczoge1xuICAgICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcjtcbiAgICAgIGlucHV0TWFwcGVyPzogKHNjb3BlOiBUU2NvcGUpID0+IHVua25vd247XG4gICAgICBtb3VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5tb3VudE5hbWUgPz8gaWQ7XG4gICAgcmV0dXJuIHRoaXMuYWRkRnVuY3Rpb24oXG4gICAgICBuYW1lLFxuICAgICAgKChzY29wZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gb3B0aW9ucy5pbnB1dE1hcHBlciA/IG9wdGlvbnMuaW5wdXRNYXBwZXIoc2NvcGUgYXMgVFNjb3BlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgc2NvcGUuJGRldGFjaEFuZEZvcmdldChvcHRpb25zLmRyaXZlciwgY2hpbGQsIGlucHV0KTtcbiAgICAgIH0pIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlkLFxuICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0YWdlIHRoYXQgZmlyZXMgYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmRcbiAgICogZGVsaXZlcnMgdGhlIHJlc3VsdGluZyBgRGV0YWNoSGFuZGxlYCB0byBhIGNvbnN1bWVyLXN1cHBsaWVkXG4gICAqIGBvbkhhbmRsZWAgY2FsbGJhY2suIFRoZSBoYW5kbGUgQ0FOTk9UIGJlIHN0b3JlZCBpbiBzaGFyZWQgc3RhdGVcbiAgICog4oCUIGBTdGFnZUNvbnRleHQuc2V0VmFsdWVgIGNhbGxzIGBzdHJ1Y3R1cmVkQ2xvbmVgIHdoaWNoIGRyb3BzXG4gICAqIGNsYXNzIHByb3RvdHlwZXMgKGFuZCB0aGVyZWZvcmUgdGhlIGhhbmRsZSdzIGAud2FpdCgpYCBtZXRob2QpLlxuICAgKlxuICAgKiBUaGUgY2FsbGJhY2sgcGF0dGVybiBpcyB0aGUgZXhwbGljaXQgYWx0ZXJuYXRpdmU6IGtlZXAgaGFuZGxlcyBpblxuICAgKiBhIGNsb3N1cmUtbG9jYWwgYXJyYXkgKG9yIHdoYXRldmVyIHNoYXBlIHN1aXRzKSBhbmQgaGF2ZSBhXG4gICAqIGRvd25zdHJlYW0gc3RhZ2UgYGF3YWl0IFByb21pc2UuYWxsKC4uLilgIG92ZXIgdGhlbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKiBpbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGhhbmRsZXM6IERldGFjaEhhbmRsZVtdID0gW107XG4gICAqXG4gICAqIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdzZWVkJywgc2VlZEZuLCAnc2VlZCcpXG4gICAqICAgLmFkZERldGFjaEFuZEpvaW5MYXRlcignZXZhbC1hJywgZXZhbENoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gc2NvcGUuY29uZmlnQSxcbiAgICogICAgIG9uSGFuZGxlOiAoaCkgPT4gaGFuZGxlcy5wdXNoKGgpLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZERldGFjaEFuZEpvaW5MYXRlcignZXZhbC1iJywgZXZhbENoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gc2NvcGUuY29uZmlnQixcbiAgICogICAgIG9uSGFuZGxlOiAoaCkgPT4gaGFuZGxlcy5wdXNoKGgpLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdqb2luJywgYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoKGgpID0+IGgud2FpdCgpKSk7XG4gICAqICAgICBzY29wZS5yZXN1bHRzID0gc2V0dGxlZDtcbiAgICogICB9LCAnam9pbicpXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBOb3RlOiBwdXR0aW5nIGBoYW5kbGVzYCBpbiBhIG1vZHVsZS1sZXZlbCBjbG9zdXJlIGlzIGZpbmUgZm9yXG4gICAqIHNpbmdsZS1ydW4gc2NyaXB0cy4gRm9yIHNlcnZlciBjb2RlIHRoYXQgcnVucyB0aGUgc2FtZSBjaGFydFxuICAgKiBjb25jdXJyZW50bHkgYWNyb3NzIHJlcXVlc3RzLCBhbGxvY2F0ZSBhIG5ldyBjbG9zdXJlIHBlciBydW5cbiAgICogKGUuZy4sIHdyYXAgY2hhcnQgY29uc3RydWN0aW9uIGluIGEgZmFjdG9yeSBmdW5jdGlvbikgc28gaGFuZGxlc1xuICAgKiBmcm9tIGRpZmZlcmVudCBydW5zIGRvbid0IGJsZWVkIGludG8gZWFjaCBvdGhlci5cbiAgICovXG4gIGFkZERldGFjaEFuZEpvaW5MYXRlcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5GbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXI7XG4gICAgICBvbkhhbmRsZTogKGhhbmRsZTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUpID0+IHZvaWQ7XG4gICAgICBpbnB1dE1hcHBlcj86IChzY29wZTogVFNjb3BlKSA9PiB1bmtub3duO1xuICAgICAgbW91bnROYW1lPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubW91bnROYW1lID8/IGlkO1xuICAgIHJldHVybiB0aGlzLmFkZEZ1bmN0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgICgoc2NvcGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIgPyBvcHRpb25zLmlucHV0TWFwcGVyKHNjb3BlIGFzIFRTY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIob3B0aW9ucy5kcml2ZXIsIGNoaWxkLCBpbnB1dCk7XG4gICAgICAgIG9wdGlvbnMub25IYW5kbGUoaGFuZGxlKTtcbiAgICAgIH0pIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlkLFxuICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIEJyYW5jaGluZyDilIDilIBcblxuICBhZGREZWNpZGVyRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyB0aGUgREVDSURFUiBTVEFHRSBhIHJldHJ5IHBvbGljeS4gRGVjbGFyZWQgaGVyZSByYXRoZXJcbiAgICAgKiAgdGhhbiB2aWEgYC5yZXRyeSgpYCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYSBgRGVjaWRlckxpc3RgLCB3aGVyZSBhXG4gICAgICogIGNoYWluZWQgbW9kaWZpZXIgY291bGQgbWVhbiB0aGUgZGVjaWRlciBPUiB0aGUgYnJhbmNoIGp1c3QgYWRkZWQ7XG4gICAgICogIGB7IHRhZ3MgfWAgbGlrZXdpc2UuICovXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc0RlY2lkZXI6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkRGVjaWRlckZ1bmN0aW9uKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGREZWNpZGVyRnVuY3Rpb24oJyR7aWR9JylgKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgRGVjaWRlciBub2RlIGlzIHJlYWNoZWQgdmlhIGEgYG5leHRgIGVkZ2UgZnJvbSB0aGUgcHJpb3JcbiAgICAvLyBjdXJzb3IuIEJyYW5jaGVzIHRoZW1zZWx2ZXMgZmlyZSB2aWEgYGFkZEZ1bmN0aW9uQnJhbmNoYCBldGMuXG4gICAgLy8gYG9uRGVjaWRlckNvbXBsZXRlYCBmaXJlcyBmcm9tIHN1Yi1idWlsZGVyIGAuZW5kKClgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZFNlbGVjdG9yRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyB0aGUgU0VMRUNUT1IgU1RBR0UgYSByZXRyeSBwb2xpY3kg4oCUIHNhbWUgcmVhc29uaW5nIGFzXG4gICAgICogIGBhZGREZWNpZGVyRnVuY3Rpb25gOiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgc3ViLWJ1aWxkZXIsIHNvIGEgY2hhaW5lZFxuICAgICAqICBgLnJldHJ5KClgIHdvdWxkIGJlIGFtYmlndW91czsgYHsgdGFncyB9YCBsaWtld2lzZS4gKi9cbiAgICBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW47IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBpZiAoY3VyLnNlbGVjdG9yRm4pIGZhaWwoYHNlbGVjdG9yIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5kZWNpZGVyRm4pIGZhaWwoYGRlY2lkZXIgYW5kIHNlbGVjdG9yIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIGBmYWlsRmFzdGA6IHdoZW4gdGhlIHNlbGVjdG9yIHBpY2tzIOKJpTIgYnJhbmNoZXMgdGhleSBmYW4gb3V0IGluIHBhcmFsbGVsXG4gICAgLy8gdmlhIENoaWxkcmVuRXhlY3V0b3IuIERlZmF1bHQgPSBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQ6IGV2ZXJ5XG4gICAgLy8gYnJhbmNoIHJ1bnMgdG8gY29tcGxldGlvbiBldmVuIGlmIHNvbWUgZmFpbCkuIGBmYWlsRmFzdDogdHJ1ZWAgPSBgUHJvbWlzZS5hbGxgXG4gICAgLy8gKHRoZSBmaXJzdCBicmFuY2ggZXJyb3IgcmVqZWN0cyArIGFib3J0cykg4oCUIHVzZSB3aGVuIEFMTCBzZWxlY3RlZCBicmFuY2hlc1xuICAgIC8vIGFyZSBSRVFVSVJFRCAoZS5nLiBhc3NlbWJsaW5nIGEgcmVxdWVzdCBmcm9tIGluZGVwZW5kZW50LWJ1dC1yZXF1aXJlZCBwYXJ0cyksXG4gICAgLy8gbm90IGJlc3QtZWZmb3J0IGZhbi1vdXQuIFNhbWUgZmxhZyBgYWRkTGlzdE9mRnVuY3Rpb25gIGV4cG9zZXMuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWxlY3RvciBub2RlOiBzYW1lIGFzIGRlY2lkZXIuIEJyYW5jaGVzICsgY29tcGxldGUgZXZlbnRcbiAgICAvLyBjb21lIGZyb20gdGhlIFNlbGVjdG9yRm5MaXN0IHN1Yi1idWlsZGVyLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQYXJhbGxlbCAoRm9yaykg4pSA4pSAXG5cbiAgYWRkTGlzdE9mRnVuY3Rpb24oY2hpbGRyZW46IFNpbXBsaWZpZWRQYXJhbGxlbFNwZWM8VE91dCwgVFNjb3BlPltdLCBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW4gfSk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBjdXIuZmFpbEZhc3QgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiwgcmV0cnksIHRhZ3MgfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgYWRtaXRJZCgnZm9yayBjaGlsZCBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgICBmYWlsKGBkdXBsaWNhdGUgY2hpbGQgaWQgJyR7aWR9JyB1bmRlciAnJHtjdXIubmFtZX0nYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCB9O1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgICBpZCxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgaXNQYXJhbGxlbENoaWxkOiB0cnVlLFxuICAgICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIH07XG4gICAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIHJldHJ5LCBgYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQgJyR7aWR9J2ApO1xuICAgICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIHRhZ3MsIGBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZCAnJHtpZH0nYCk7XG5cbiAgICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgICAvLyBMNy4zIOKAlCBmaXJlIHN0cnVjdHVyZSBldmVudHMgZm9yIHRoZSBjaGlsZCArIHRoZSBmb3JrIGVkZ2UuXG4gICAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2ZvcmstYnJhbmNoJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lIHx8IGMuaWQpLmpvaW4oJywgJyk7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBSdW5zIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBwYXJhbGxlbCBjaGlsZHJlbiAoJHtjaGlsZE5hbWVzfSlgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBPTkUgQlJBTkNIIFBFUiBJVEVNLCBpbiBwYXJhbGxlbCDigJQgd2l0aCB0aGUgbnVtYmVyIG9mIGJyYW5jaGVzIGRlY2lkZWRcbiAgICogYXQgUlVOIHRpbWUgZnJvbSB0aGUgcGF5bG9hZCByYXRoZXIgdGhhbiBhdCBidWlsZCB0aW1lLlxuICAgKlxuICAgKiBgYWRkTGlzdE9mRnVuY3Rpb25gIGZhbnMgb3V0IGEgZml4ZWQgc2V0IG9mIGJyYW5jaGVzIHlvdSBuYW1lIGluIHRoZSBjaGFydC5cbiAgICogVGhpcyBmYW5zIG91dCBvdmVyIGRhdGEgdGhlIGNoYXJ0IGhhcyBub3Qgc2VlbiB5ZXQ6IHRocmVlIGNodW5rcyBtYWtlIHRocmVlXG4gICAqIGJyYW5jaGVzLCB0ZW4gbWFrZSB0ZW4uIEVhY2ggYnJhbmNoIHJ1bnMgYXMgaXRzIG93biBpc29sYXRlZCBzdWJmbG93IOKAlCBpdHNcbiAgICogb3duIG1lbW9yeSwgaXRzIG93biBjb21taXQgbG9nLCBhZGRyZXNzYWJsZSBpbiBldmVyeSB0cmFjZSBxdWVyeSBhdFxuICAgKiBgPHN0YWdlSWQ+fjxpbmRleD5gIOKAlCBzbyBicmFuY2hlcyBjYW5ub3QgY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0XG4gICAqIHN0YXRlLCBhbmQgYSBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIGEgYnJhbmNoIHJlc3VsdCB3b3JrcyB3aXRoIG5vIHNwZWNpYWxcbiAgICogaGFuZGxpbmcuIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lICAgRGlzcGxheSBsYWJlbCBmb3IgdGhlIGZhbi1vdXQgc3RhZ2UuXG4gICAqIEBwYXJhbSBpZCAgICAgU3RhYmxlIHN0YWdlIGlkLiBNYXkgbm90IGNvbnRhaW4gYH5gIChyZXNlcnZlZCDigJQgdGhlIGJyYW5jaFxuICAgKiAgICAgICAgICAgICAgIHNlZ21lbnRzIGFyZSBidWlsdCBmcm9tIHRoaXMgaWQpLlxuICAgKiBAcGFyYW0gY29uZmlnIGB7IGl0ZW1zLCBicmFuY2gsIG1heEJyYW5jaGVzLCBpbnRvLCBmYWlsRmFzdD8gfWA6XG4gICAqICAgLSBgaXRlbXMoc2NvcGUpYCBwaWNrcyB3aGF0IHRvIGZhbiBvdXQgb3ZlciAocmVhZHMgYXJlIHRyYWNrZWQpO1xuICAgKiAgIC0gYGJyYW5jaChpdGVtLCBpbmRleClgIGJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtIChlYWNoIGJyYW5jaCdzXG4gICAqICAgICBzY29wZSBpcyBhbHNvIHNlZWRlZCB3aXRoIGBpdGVtYCBhbmQgYGluZGV4YCwgc28gdGhlIGlucHV0IGlzIGluIHRoZVxuICAgKiAgICAgdHJhY2UgcmF0aGVyIHRoYW4gaGlkZGVuIGluIGEgY2xvc3VyZSk7XG4gICAqICAgLSBgbWF4QnJhbmNoZXNgIGlzIFJFUVVJUkVEIOKAlCBhbiB1bmJvdW5kZWQgZmFuLW91dCBkcml2ZW4gYnkgbW9kZWwgb3V0cHV0XG4gICAqICAgICBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0byBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvXG4gICAqICAgICBub3QgcnVuIGFuZCB0aGUgdHJ1bmNhdGlvbiBpcyByZWNvcmRlZDtcbiAgICogICAtIGBpbnRvYCBpcyBSRVFVSVJFRCDigJQgdGhlIHN0YXRlIGtleSB0aGUgb3JkZXJlZCByZXN1bHRzIGFycmF5IGlzIHdyaXR0ZW5cbiAgICogICAgIHRvLiBgaW50b1tpXWAgaXMgYnJhbmNoIGBpYCdzIHJlc3VsdCwgaW4gSVRFTVMgb3JkZXIsIHdoYXRldmVyIG9yZGVyXG4gICAqICAgICB0aGUgYnJhbmNoZXMgZmluaXNoZWQgaW47XG4gICAqICAgLSBgZmFpbEZhc3RgIGlzIHRoZSBzYW1lIHBvbGljeSB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSdzIHBhcmFsbGVsaXNtXG4gICAqICAgICB1c2VzOiBgdHJ1ZWAgcmVqZWN0cyBvbiB0aGUgZmlyc3QgZmFpbGluZyBicmFuY2gsIG9taXR0ZWQgcnVucyB0aGVtIGFsbFxuICAgKiAgICAgYmVzdC1lZmZvcnQgKGEgZmFpbGVkIGJyYW5jaCdzIHNsb3QgaXMgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdTcGxpdCcsIHNwbGl0Rm4sICdzcGxpdCcpXG4gICAqICAgLmFkZFBhcmFsbGVsRm9yRWFjaCgnUmV2aWV3IGVhY2ggY2h1bmsnLCAncmV2aWV3LWNodW5rcycsIHtcbiAgICogICAgIGl0ZW1zOiAoc2NvcGUpID0+IHNjb3BlLmNodW5rcyxcbiAgICogICAgIGJyYW5jaDogKGNodW5rLCBpKSA9PiBidWlsZFJldmlld0NoYXJ0KGNodW5rLCBpKSxcbiAgICogICAgIG1heEJyYW5jaGVzOiA4LFxuICAgKiAgICAgaW50bzogJ3Jldmlld3MnLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdNZXJnZScsIG1lcmdlRm4sICdtZXJnZScpICAgLy8gcmVhZHMgc2NvcGUucmV2aWV3c1xuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFBhcmFsbGVsRm9yRWFjaDxUSXRlbSA9IGFueT4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBQYXJhbGxlbEZvckVhY2hDb25maWc8VEl0ZW0sIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIC8vIFRoZSBnZW5lcmF0ZWQgYnJhbmNoIHNlZ21lbnRzIGVtYmVkIHRoaXMgaWQgdmVyYmF0aW1cbiAgICAvLyAoYDxpZD5+PGluZGV4PmApLCBzbyBhIG1hcmtlciBpbnNpZGUgaXQgd291bGQgbWFrZSB0aGUgc2VnbWVudFxuICAgIC8vIGFtYmlndW91cyB0byBwYXJzZS4gUmVmdXNpbmcgaXQgaGVyZSDigJQgb24gYSBicmFuZC1uZXcgbWV0aG9kLCBhdCB6ZXJvXG4gICAgLy8gYmFjay1jb21wYXQgY29zdCDigJQga2lsbHMgdGhlIGFtYmlndWl0eSBjbGFzcyBvdXRyaWdodCBhbmQga2VlcHNcbiAgICAvLyBgcGFyc2VCcmFuY2hTZWdtZW50YCBhIHNwbGl0IGF0IHRoZSBsYXN0IG1hcmtlciBpbnN0ZWFkIG9mIGEgaGV1cmlzdGljLlxuICAgIGFkbWl0SWQoJ3BhcmFsbGVsRm9yRWFjaCBzdGFnZSBpZCcsIGlkLCAnc2VnbWVudCcpO1xuICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcuaXRlbXMgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGNvbmZpZy5icmFuY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZhaWwoYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBpdGVtcyhzY29wZSkgYW5kIGJyYW5jaChpdGVtLCBpbmRleCkgZnVuY3Rpb25zLmApO1xuICAgIH1cbiAgICAvLyBSRVFVSVJFRCwgYm90aCBvZiB0aGVtIOKAlCBzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQgKEQyKS5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5tYXhCcmFuY2hlcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29uZmlnLm1heEJyYW5jaGVzKSB8fCBjb25maWcubWF4QnJhbmNoZXMgPCAxKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIG1heEJyYW5jaGVzIOKAlCBhIHBvc2l0aXZlIGludGVnZXIgY2VpbGluZyBvbiBob3cgbWFueSBgICtcbiAgICAgICAgICAnYnJhbmNoZXMgb25lIGV4ZWN1dGlvbiBtYXkgc3RhcnQuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBkZWZhdWx0OiBhbiB1bmJvdW5kZWQgZmFuLW91dCAnICtcbiAgICAgICAgICAnZHJpdmVuIGJ5IHJ1bnRpbWUgZGF0YSAobW9kZWwgb3V0cHV0LCBhbiB1cHN0cmVhbSBBUEkpIGlzIGEgcmVzb3VyY2UgYXR0YWNrLiBQaWNrIHRoZSAnICtcbiAgICAgICAgICAnbGFyZ2VzdCBudW1iZXIgdGhpcyBmbG93IGNhbiBhZmZvcmQuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuaW50byAhPT0gJ3N0cmluZycgfHwgY29uZmlnLmludG8gPT09ICcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIGludG8g4oCUIHRoZSBzdGF0ZSBrZXkgaXRzIG9yZGVyZWQgcmVzdWx0cyBhcnJheSBpcyBgICtcbiAgICAgICAgICAnd3JpdHRlbiB0by4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIGRlZmF1bHQgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZDogYSBkZXJpdmVkIGtleSAnICtcbiAgICAgICAgICAnY291bGQgc2lsZW50bHkgb3ZlcndyaXRlIHN0YXRlIHRoZSBjaGFydCBhbHJlYWR5IG93bnMuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzRHluYW1pY1BhcmFsbGVsOiB0cnVlLFxuICAgICAgcGFyYWxsZWxGb3JFYWNoOiBjb25maWcgYXMgUGFyYWxsZWxGb3JFYWNoQ29uZmlnPGFueSwgVFNjb3BlPixcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChjb25maWcuZmFpbEZhc3QgIT09IHVuZGVmaW5lZCkgbm9kZS5mYWlsRmFzdCA9IGNvbmZpZy5mYWlsRmFzdDtcblxuICAgIC8vIGB0eXBlOiAnZm9yaydgIOKAlCBhIGZhbi1vdXQgaXMgd2hhdCB0aGlzIGlzLCBhbmQgZXZlcnkgZXhpc3RpbmcgY29uc3VtZXJcbiAgICAvLyBhbHJlYWR5IGtub3dzIGhvdyB0byBkcmF3IG9uZS4gVGhlIFwiYnJhbmNoZXMgYXJlIGRlY2lkZWQgYXQgcnVudGltZVwiXG4gICAgLy8gZGV0YWlsIHJpZGVzIGBpc0R5bmFtaWNQYXJhbGxlbGAgcmF0aGVyIHRoYW4gYSBuZXcgbm9kZSB0eXBlLCBzbyBub3RoaW5nXG4gICAgLy8gZG93bnN0cmVhbSBoYXMgdG8gbGVhcm4gYSBuZXcgd29yZCB0byBrZWVwIHdvcmtpbmcuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ2ZvcmsnLCBpc0R5bmFtaWNQYXJhbGxlbDogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbiA/PyBgUnVucyBvbmUgYnJhbmNoIHBlciBpdGVtIGludG8gJyR7Y29uZmlnLmludG99J2ApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN1YmZsb3cgTW91bnRpbmcg4pSA4pSAXG5cbiAgYWRkU3ViRmxvd0NoYXJ0KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIG1vdW50TmFtZT86IHN0cmluZywgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICB0aGlzLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkUm9vdCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgIH07XG5cbiAgICAvLyBUaGUgbW91bnQncyBPTkxZIHRhZyBzaXRlOiB0aGUgY3Vyc29yIHN0YXlzIG9uIHRoZSBwYXJlbnQgKHNlZVxuICAgIC8vIGBfY3Vyc29yVGFpbGApLCBzbyBgLnRhZygpYCBhZnRlciB0aGlzIGNhbGwgcmVmdXNlcy5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydCgnJHtpZH0nKWApO1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIC8vIEw3LjMg4oCUIFN1YmZsb3cgbW91bnQ6IHN0YWdlIGV2ZW50ICsgZm9yayBlZGdlICsgbW91bnQgbGlmZWN5Y2xlXG4gICAgLy8gZXZlbnQuIE1vdW50LW9ubHkgc2VtYW50aWNzOiBwYXJlbnQgcmVjb3JkZXJzIGRvIE5PVCByZXBsYXkgdGhlXG4gICAgLy8gc3ViZmxvdydzIG93biBpbnRlcm5hbCBzdHJ1Y3R1cmUgZXZlbnRzLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBzdWJmbG93IG1vdW50ICcke3N1YmZsb3dOYW1lfSdgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnQoJyR7aWR9JylgKTtcblxuICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgc3ViZmxvdyBwYXJhbGxlbCBtb3VudC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIGlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB0aGlzLl9maXJlU3ViZmxvd01vdW50ZWQoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbTGF6eSBTdWItRXhlY3V0aW9uOiAke3N1YmZsb3dOYW1lfV1gKTtcblxuICAgIHRoaXMuX2N1cnNvclRhaWwgPSBgdGhlIGxhenkgc3ViZmxvdyBtb3VudCAnJHtzdWJmbG93TmFtZX0nYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzb2x2ZXI6ICgpID0+IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3QgYWRkIHN1YmZsb3cgYXMgbmV4dCB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBMYXp5IGxpbmVhci1tb3VudCBzdWJmbG93LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtMYXp5IFN1Yi1FeGVjdXRpb246ICR7c3ViZmxvd05hbWV9XWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICB0aGlzLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkUm9vdCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhdHRhY2hlZFNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgIH07XG5cbiAgICAvLyBBIGxpbmVhciBtb3VudCBtb3ZlcyB0aGUgY3Vyc29yLCBzbyBgLnRhZygpYCBhZnRlciBpdCBhbHNvIHdvcmtzIOKAlFxuICAgIC8vIGBhcHBseVRhZ3NgIHJlZnVzZXMgYSBzZWNvbmQgZGVjbGFyYXRpb24gaWYgYm90aCBzaXRlcyBhcmUgdXNlZC5cbiAgICBhcHBseVRhZ3Mobm9kZSwgYXR0YWNoZWRTcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU3ViRmxvd0NoYXJ0TmV4dCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IGF0dGFjaGVkU3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKGF0dGFjaGVkU3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIC8vIEw3LjMg4oCUIExpbmVhci1tb3VudCBzdWJmbG93LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKGF0dGFjaGVkU3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG5cbiAgICB0aGlzLl9tZXJnZVN0YWdlTWFwKHN1YmZsb3cuc3RhZ2VNYXAsIGlkKTtcbiAgICB0aGlzLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcbiAgICB0aGlzLl9hcHBlbmRTdWJmbG93RGVzY3JpcHRpb24oaWQsIHN1YmZsb3dOYW1lLCBzdWJmbG93KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJldHJ5IOKUgOKUgFxuXG4gIC8qKlxuICAgKiBHaXZlIHRoZSBzdGFnZSB5b3UgSlVTVCBhZGRlZCBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeS5cbiAgICpcbiAgICogIyMgV2h5IGRlY2xhcmUgaXQgaW5zdGVhZCBvZiB3cml0aW5nIGEgbG9vcCBpbnNpZGUgdGhlIHN0YWdlXG4gICAqXG4gICAqIEEgcmV0cnkgaGFuZC1yb2xsZWQgaW5zaWRlIGEgc3RhZ2UgZnVuY3Rpb24gaXMgaW52aXNpYmxlIHRvIHRoZSB0cmFjZS4gVGhlXG4gICAqIG5hcnJhdGl2ZSBzaG93cyBvbmUgc3RhZ2UsIHRoZSBjb21taXQgbG9nIHNob3dzIG9uZSBlbnRyeSwgYW5kIHRoZSB0d29cbiAgICogZmFpbGVkIGNhbGxzIHRoYXQgY2FtZSBiZWZvcmUgdGhlIHN1Y2Nlc3NmdWwgb25lIGxlZnQgbm8gbWFyayBhbnl3aGVyZSDigJRcbiAgICogYW4gdW5leHBsYWluZWQgYmVoYXZpb3VyIGluIGEgbGlicmFyeSB3aG9zZSB3aG9sZSBwb2ludCBpcyB0aGF0IG5vdGhpbmdcbiAgICogaW52aXNpYmxlIGhhcHBlbnMuIERlY2xhcmVkIGhlcmUsIGV2ZXJ5IGF0dGVtcHQgaXMgcGFydCBvZiB0aGUgcmVjb3JkOiBlYWNoXG4gICAqIGZhaWxlZCBhdHRlbXB0IGZpcmVzIGBGbG93UmVjb3JkZXIub25TdGFnZVJldHJ5YCBhbmQgYXBwZWFycyBpbiB0aGVcbiAgICogbmFycmF0aXZlLCBpbiBvcmRlciwgYmV0d2VlbiB0aGUgYXR0ZW1wdHMnIG93biByZWFkcyBhbmQgd3JpdGVzLlxuICAgKlxuICAgKiAjIyBXaGF0IGFuIGF0dGVtcHQgaXNcbiAgICpcbiAgICogQSBmYWlsZWQgYXR0ZW1wdCdzIHN0YWdlZCB3cml0ZXMgYXJlIERJU0NBUkRFRCDigJQgdGhlIG5leHQgYXR0ZW1wdCBzdGFydHNcbiAgICogZnJvbSBjb21taXR0ZWQgc3RhdGUsIG5ldmVyIGZyb20gdGhlIHdyZWNrYWdlIG9mIHRoZSBsYXN0IHRyeS4gVGhlIGZpbmFsXG4gICAqIGF0dGVtcHQgYmVoYXZlcyBleGFjdGx5IGFzIGEgc3RhZ2Ugd2l0aCBubyBwb2xpY3kgZG9lczogb24gc3VjY2VzcyBpdFxuICAgKiBjb21taXRzOyBvbiBmYWlsdXJlIGl0IGNvbW1pdHMgd2hhdCBpdCB3cm90ZSBhbmQgcmV0aHJvd3MgKGZvb3RwcmludCBoYXNcbiAgICogbmV2ZXIgaGFkIHJvbGxiYWNrLCBhbmQgcmV0cnkgZG9lcyBub3QgaW50cm9kdWNlIG9uZSkuXG4gICAqXG4gICAqIEEgcGF1c2UgaXMgbm90IGEgZmFpbHVyZTogbmVpdGhlciBgYWRkUGF1c2FibGVGdW5jdGlvbmAncyBwYXVzZSBub3JcbiAgICogYGludGVycnVwdCgpYCBpcyBldmVyIHJldHJpZWQuIE5vciBpcyBhIGNhbmNlbGxlZCBydW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGZsb3dDaGFydDxTdGF0ZT4oJ0ZldGNoIHVzZXInLCBmZXRjaEZuLCAnZmV0Y2gtdXNlcicpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDaGFyZ2UgY2FyZCcsIGNoYXJnZUZuLCAnY2hhcmdlJylcbiAgICogICAucmV0cnkoeyBhdHRlbXB0czogMywgYmFja29mZk1zOiAobikgPT4gMTAwICogMiAqKiAobiAtIDEpIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDb25maXJtJywgY29uZmlybUZuLCAnY29uZmlybScpXG4gICAqIGBgYFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHRoZSBDVVJSRU5UIGN1cnNvciDigJQgdGhlIHN0YWdlIGFkZGVkIGJ5IHRoZSBpbW1lZGlhdGVseVxuICAgKiBwcmVjZWRpbmcgYHN0YXJ0KClgIC8gYGFkZEZ1bmN0aW9uKClgIC8gYGFkZFN0cmVhbWluZ0Z1bmN0aW9uKClgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb24oKWAuIFdoZXJlIHRoZSBjdXJzb3Igd291bGQgYmUgYW1iaWd1b3VzIChhIGRlY2lkZXIsXG4gICAqIHNlbGVjdG9yLCBicmFuY2gsIG9yIGZvcmsgY2hpbGQpLCBkZWNsYXJlIHRoZSBwb2xpY3kgaW4gdGhhdCBtZXRob2QncyBvd25cbiAgICogYHJldHJ5YCBvcHRpb24gaW5zdGVhZC5cbiAgICovXG4gIHJldHJ5KHBvbGljeTogUmV0cnlQb2xpY3kpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICAvLyBBIHN1YmZsb3cgbW91bnQgLyBwYXJhbGxlbCBmb3JrIGhhbmdzIENISUxEUkVOIG9mZiB0aGUgY3VycmVudCBzdGFnZSBhbmRcbiAgICAvLyBsZWF2ZXMgdGhlIGN1cnNvciBvbiB0aGF0IHN0YWdlLiBBdHRhY2hpbmcgdGhlIHBvbGljeSB0byB0aGUgY3Vyc29yIGhlcmVcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXRyeSB0aGUgc3RhZ2UgQkVGT1JFIHRoZSB0aGluZyB5b3UganVzdCB3cm90ZS5cbiAgICBpZiAodGhpcy5fY3Vyc29yVGFpbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGZvbGxvdyAke3RoaXMuX2N1cnNvclRhaWx9IOKAlCB0aGF0IGF0dGFjaGVzIHRvICcke2N1ci5uYW1lfScgd2l0aG91dCBtb3ZpbmcgdGhlIGN1cnNvciwgc28gYCArXG4gICAgICAgICAgYHRoZSBwb2xpY3kgd291bGQgbGFuZCBvbiAnJHtjdXIubmFtZX0nIHJhdGhlciB0aGFuIG9uIHdoYXQgeW91IGp1c3QgYWRkZWQuIERlY2xhcmUgdGhlIHBvbGljeSBhdCBpdHMgb3duIGAgK1xuICAgICAgICAgICdzaXRlIGluc3RlYWQ6IG9uIHRoZSBzdGFnZXMgSU5TSURFIGEgc3ViZmxvdyBjaGFydCwgb3IgdmlhIHRoZSBgcmV0cnlgIGZpZWxkIG9uIGFuIGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLnJldHJ5KSBmYWlsKGByZXRyeSBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIuaXNTdWJmbG93Um9vdCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHN1YmZsb3cgbW91bnQgJyR7Y3VyLm5hbWV9JyDigJQgYSBtb3VudCBoYXMgbm8gc3RhZ2UgZnVuY3Rpb24gb2YgaXRzIG93bi4gYCArXG4gICAgICAgICAgJ0RlY2xhcmUgdGhlIHBvbGljeSBvbiB0aGUgc3RhZ2VzIElOU0lERSB0aGUgc3ViZmxvdyBjaGFydCBpbnN0ZWFkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzRHluYW1pY1BhcmFsbGVsKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgcmV0cnkoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgcGFyYWxsZWwtZm9yLWVhY2ggc3RhZ2UgJyR7Y3VyLm5hbWV9JyDigJQgaXQgaGFzIG5vIHN0YWdlIGZ1bmN0aW9uIG9mIGl0cyBgICtcbiAgICAgICAgICAnb3duLiBEZWNsYXJlIHRoZSBwb2xpY3kgb24gdGhlIHN0YWdlcyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCBpdHMgYGJyYW5jaGAgZmFjdG9yeSByZXR1cm5zLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzTG9vcFJlZikgZmFpbChgcmV0cnkoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgbG9vcCByZWZlcmVuY2UgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgYXBwbHlSZXRyeVBvbGljeShjdXIsIGN1clNwZWMsIHBvbGljeSwgYHJldHJ5KCkgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERlY2xhcmVkIHRhZ3Mg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFB1dCBOQU1FUyBvbiB0aGUgc3RhZ2UgeW91IEpVU1QgYWRkZWQuIFRoZSBmaXJzdCBjb21taXQgYnVuZGxlIG9mIGVhY2hcbiAgICogZXhlY3V0aW9uIG9mIHRoYXQgc3RhZ2UgY2FycmllcyB0aGVtIChgQ29tbWl0QnVuZGxlLnRhZ3NgIOKAlCB0aGUgYnVuZGxlXG4gICAqIGBjb21taXRTdG9wc2Aga2V5cyBvbiksIGFuZCB0aGUgYnVpbHQgc3BlYyBhZHZlcnRpc2VzIHRoZW1cbiAgICogKGBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUudGFnc2ApLlxuICAgKlxuICAgKiAjIyBXaHkgZGVjbGFyZSBpdCBpbnN0ZWFkIG9mIGRlcml2aW5nIGl0IGZyb20gaWRzXG4gICAqXG4gICAqIEEgcmVhZGVyIHRoYXQgd2FudHMgXCJ0aGUgTExNIHR1cm5zXCIgb2YgYSBzdG9yZWQgcmVjb3JkaW5nIGhhZCB0byBjbGFzc2lmeVxuICAgKiBzdGFnZXMgZnJvbSB0aGVpciBpZHMg4oCUIGEgc3dpdGNoIG92ZXIgYHJ1bnRpbWVTdGFnZUlkYCB0aGF0IHBhcnNlcyBgI2AgYW5kXG4gICAqIGAvYCwgbGl2ZXMgaW4gdGhlIGNvbnN1bWVyLCBhbmQgc2lsZW50bHkgZ29lcyBzdGFsZSB3aGVuIGEgc3RhZ2UgaXNcbiAgICogcmVuYW1lZC4gRGVjbGFyZWQgaGVyZSwgdGhlIG5hbWUgdHJhdmVscyBXSVRIIHRoZSBjb21taXQ6IGEgcmVjb3JkaW5nIGZyb21cbiAgICogYW55IGNoYXJ0IGNhcnJpZXMgaXRzIG93biBtaWxlc3RvbmVzLCBhbmQgYHRhZ1N0b3BzYCAoZm9vdHByaW50anMvdHJhY2UpXG4gICAqIHNjcnVicyB0aGVtIHdpdGggbm8gaWQgY29udmVudGlvbnMgYXQgYWxsLlxuICAgKlxuICAgKiAjIyBXaGF0IGEgdGFnIGlzLCBhbmQgaXMgbm90XG4gICAqXG4gICAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lIOKAlCBuZXZlciBhIHZhbHVlLiBUaGVyZSBpcyBub1xuICAgKiBydW4tdGltZSBgJHRhZygpYDogYSBydW50aW1lIHN0cmluZyBjb3VsZCBjYXJyeSBkYXRhIChgJ3VzZXI6JyArIGVtYWlsYClcbiAgICogcGFzdCBldmVyeSByZWRhY3Rpb24gcG9pbnQuIERhdGEtZGVwZW5kZW50IG1hcmtzIGFyZSBhIGtlZXAgcnVsZSBvdmVyXG4gICAqIHRoZSBmb2xkIGF0IHJlYWQgdGltZSwgb3IgdGVsZW1ldHJ5IHZpYSBgJGVtaXRgLiBGcmVlIHN0cmluZ3M6IGZvb3RwcmludGpzXG4gICAqIG93bnMgbm8gdm9jYWJ1bGFyeTsgYSBjb25zdW1lciBkZWNsYXJlcyBpdHMgb3duIChgJ21pbGVzdG9uZTo8a2luZD4nYCkuXG4gICAqXG4gICAqIFN0YW1wZWQgT05DRSBwZXIgZXhlY3V0aW9uIG9mIHRoZSBzdGFnZTogcmV0cnkgYXR0ZW1wdHMgc2hhcmUgb25lIHN0YW1wLFxuICAgKiBhIGZhaWxlZCBzdGFnZSBrZWVwcyBpdHMgdGFnICh0aGUgZXJyb3IgcGF0aCBjb21taXRzIGJlZm9yZSBpdCByZXRocm93cyksXG4gICAqIGEgc3RhZ2UgdGhhdCBgaW50ZXJydXB0KClgcyBhbmQgaXMgcmVzdW1lZCBpcyB0d28gdGFnZ2VkIHN0b3BzIG9uIGEgY2hhaW5cbiAgICogYmVjYXVzZSBpdCByYW4gdHdpY2UsIGFuZCBhbiBFTVBUWSBjb21taXQgaXMgYSB0YWdnZWQgc3RvcCB0b28uIEEgc3ViZmxvd1xuICAgKiBtb3VudCBvciBhIHBhcmFsbGVsLWZvci1lYWNoIHN0YWdlIGNhbiBiZSB0YWdnZWQ7IHRoZSB0YWcgbGFuZHMgb24gdGhlXG4gICAqIGJ1bmRsZSB0aGF0IHJlY29yZHMgaXRzIHJlc3VsdCDigJQgZm9yIGEgbW91bnQsIGl0cyBGSVJTVCBidW5kbGUgaW4gdGhlXG4gICAqIHBhcmVudCBsb2cgKHRoZSBleGl0IGJ1bmRsZSBjYXJyaWVzIG5vbmUpLCB3aGlsZSB0aGUgc3ViZmxvdydzIG93biBsb2dcbiAgICogaXMgdW50b3VjaGVkOiBpdHMgaW5uZXIgc3RhZ2VzIGRlY2xhcmUgdGhlaXIgb3duLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdTZWVkJywgc2VlZEZuLCAnc2VlZCcpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDYWxsIG1vZGVsJywgY2FsbEZuLCAnY2FsbC1sbG0nKVxuICAgKiAgIC50YWcoJ21pbGVzdG9uZTpsbG0tdHVybicpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdSb3V0ZScsIHJvdXRlRm4sICdyb3V0ZScpXG4gICAqICAgLnRhZygnbWlsZXN0b25lOmRlY2lzaW9uJywgJ2F1ZGl0JylcbiAgICogYGBgXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gdGhlIENVUlJFTlQgY3Vyc29yIOKAlCB0aGUgc3RhZ2UgYWRkZWQgYnkgdGhlIGltbWVkaWF0ZWx5XG4gICAqIHByZWNlZGluZyBgc3RhcnQoKWAgLyBgYWRkRnVuY3Rpb24oKWAgLyBgYWRkU3RyZWFtaW5nRnVuY3Rpb24oKWAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbigpYCAvIGBhZGRTdWJGbG93Q2hhcnROZXh0KClgIC8gYGFkZFBhcmFsbGVsRm9yRWFjaCgpYC5cbiAgICogV2hlcmUgdGhlIGN1cnNvciB3b3VsZCBiZSBhbWJpZ3VvdXMgKGEgZGVjaWRlciwgc2VsZWN0b3IsIGJyYW5jaCwgb3IgZm9ya1xuICAgKiBjaGlsZCksIGRlY2xhcmUgdGhlIHRhZ3MgaW4gdGhhdCBtZXRob2QncyBvd24gYHRhZ3NgIG9wdGlvbiBpbnN0ZWFkLiBBXG4gICAqIHN1YmZsb3cgTU9VTlQgaGFzIHRoYXQgb3B0aW9uIHRvbyAoYFN1YmZsb3dNb3VudE9wdGlvbnMudGFnc2AsIDkuMjEuMSlcbiAgICog4oCUIGFuZCBmb3IgYSBmb3JrLWNoaWxkIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0YCkgb3IgYSBicmFuY2ggbW91bnRcbiAgICogKGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKSBpdCBpcyB0aGUgT05MWSBzaXRlOiB0aG9zZSBsZWF2ZSB0aGUgY3Vyc29yIG9uXG4gICAqIHRoZSBwYXJlbnQsIHNvIGAudGFnKClgIGFmdGVyIHRoZW0gcmVmdXNlcyByYXRoZXIgdGhhbiBtaXMtYXR0cmlidXRlLlxuICAgKlxuICAgKiBSZWZ1c2VkIGF0IGJ1aWxkIHRpbWU6IGFuIGVtcHR5IG5hbWUsIGEgbm9uLXN0cmluZywgdGhlIHJlc2VydmVkXG4gICAqIGJyYW5jaC1zZWdtZW50IG1hcmtlciBgfmAgaW5zaWRlIGEgbmFtZSwgYSBuYW1lIGRlY2xhcmVkIHR3aWNlLCBhbmQgYVxuICAgKiBzZWNvbmQgZGVjbGFyYXRpb24gb24gdGhlIHNhbWUgc3RhZ2UuXG4gICAqL1xuICB0YWcoLi4ubmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgLy8gU2FtZSBtaXMtYXR0cmlidXRpb24gZ3VhcmQgYXMgYC5yZXRyeSgpYDogYWZ0ZXIgYSBtb3VudCBvciBhIGZvcmsgdGhlXG4gICAgLy8gY3Vyc29yIHN0aWxsIHBvaW50cyBhdCB0aGUgc3RhZ2UgQkVGT1JFIHdoYXQgeW91IGp1c3Qgd3JvdGUuXG4gICAgaWYgKHRoaXMuX2N1cnNvclRhaWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGB0YWcoKSBjYW5ub3QgZm9sbG93ICR7dGhpcy5fY3Vyc29yVGFpbH0g4oCUIHRoYXQgYXR0YWNoZXMgdG8gJyR7Y3VyLm5hbWV9JyB3aXRob3V0IG1vdmluZyB0aGUgY3Vyc29yLCBzbyBgICtcbiAgICAgICAgICBgdGhlIG5hbWVzIHdvdWxkIGxhbmQgb24gJyR7Y3VyLm5hbWV9JyByYXRoZXIgdGhhbiBvbiB3aGF0IHlvdSBqdXN0IGFkZGVkLiBEZWNsYXJlIHRoZSB0YWdzIGF0IHRoZWlyIG93biBgICtcbiAgICAgICAgICBcInNpdGUgaW5zdGVhZDogdmlhIHRoZSBgdGFnc2AgZmllbGQgaW4gdGhlIG1vdW50J3Mgb3duIG9wdGlvbnMgKGBTdWJmbG93TW91bnRPcHRpb25zLnRhZ3NgLCA5LjIxLjEpLCBvciBcIiArXG4gICAgICAgICAgJ3ZpYSB0aGUgYHRhZ3NgIGZpZWxkIG9uIGFuIGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkLiBUaGUgc3RhZ2VzIElOU0lERSBhIHN1YmZsb3cgY2hhcnQgZGVjbGFyZSB0aGVpciBvd24uJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIuaXNMb29wUmVmKSBmYWlsKGB0YWcoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgbG9vcCByZWZlcmVuY2UgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIGZhaWwoYHRhZygpIGF0ICcke2N1ci5uYW1lfSc6IGF0IGxlYXN0IG9uZSBuYW1lIGlzIHJlcXVpcmVkYCk7XG5cbiAgICBhcHBseVRhZ3MoY3VyLCBjdXJTcGVjLCBuYW1lcywgYHRhZygpIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICAvLyBUaGUgc3RhZ2UncyBgb25TdGFnZUFkZGVkYCBoYXMgYWxyZWFkeSBmaXJlZCAodGhlIGRvb3IgY29tZXMgYWZ0ZXJcbiAgICAvLyB0aGUgYWRkKSwgc28gdGhlIG5hbWVzIGdvIG91dCBhcyB0aGVpciBvd24gZXZlbnQg4oCUIGEgcmVjb3JkZXIgdGhhdFxuICAgIC8vIGNvcGllZCBmaWVsZHMgYXQgYWRkIHRpbWUgd291bGQgb3RoZXJ3aXNlIG5ldmVyIHNlZSB0aGVtICg5LjI0LjApLlxuICAgIHRoaXMuX2ZpcmVTdGFnZVRhZ2dlZChjdXJTcGVjKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBMb29wIOKUgOKUgFxuXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLm5leHQpIGZhaWwoYGNhbm5vdCBzZXQgbG9vcFRvIHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgaWYgKCF0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGlkP2ApO1xuICAgIH1cblxuICAgIGN1ci5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgY3VyU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBjdXJTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IHRoaXMuX3N0YWdlU3RlcE1hcC5nZXQoc3RhZ2VJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byBzdGVwICR7dGFyZ2V0U3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgZXZlbnQuIERpc3RpbmN0IGZyb20gYG9uRWRnZUFkZGVkYFxuICAgIC8vIGJlY2F1c2UgcnVudGltZSBgb25Mb29wYCBjYXJyaWVzIGBpdGVyYXRpb246IG51bWJlcmAgd2hpY2ggaGFzIG5vXG4gICAgLy8gYnVpbGQgbWVhbmluZyDigJQgc2VwYXJhdGUgZXZlbnQga2VlcHMgcGF5bG9hZHMgaG9uZXN0LlxuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGN1ci5pZCwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3RyZWFtaW5nIOKUgOKUgFxuXG4gIG9uU3RyZWFtKGhhbmRsZXI6IFN0cmVhbVRva2VuSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uVG9rZW4gPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1TdGFydChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25TdGFydCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbUVuZChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25FbmQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIBcblxuICBidWlsZCgpOiBSdW5uYWJsZUZsb3dDaGFydDxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBMNy4zIOKAlCBzZWFsIHRoZSBjaGFydCBzbyBwb3N0LWJ1aWxkIGF0dGFjaGVzIHRocm93LiBQcmV2ZW50c1xuICAgIC8vIHJlY29yZGVycyBhdHRhY2hlZCBtaWQtZXhlY3V0aW9uIGZyb20gZ2V0dGluZyBwYXJ0aWFsIGRhdGEuXG4gICAgdGhpcy5fc2VhbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgc3BlYzsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiB0aGlzLl9zdWJmbG93RGVmcykge1xuICAgICAgc3ViZmxvd3Nba2V5XSA9IGRlZjtcbiAgICB9XG5cbiAgICBjb25zdCByb290TmFtZSA9IHRoaXMuX3Jvb3Q/Lm5hbWUgPz8gJ0Zsb3dDaGFydCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYEZsb3dDaGFydDogJHtyb290TmFtZX1cXG5TdGVwczpcXG4ke3RoaXMuX2Rlc2NyaXB0aW9uUGFydHMuam9pbignXFxuJyl9YCA6ICcnO1xuXG4gICAgY29uc3QgY2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgcm9vdCxcbiAgICAgIHN0YWdlTWFwOiB0aGlzLl9zdGFnZU1hcCxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogcm9vdFNwZWMsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoc3ViZmxvd3MpLmxlbmd0aCA+IDAgPyB7IHN1YmZsb3dzIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fZW5hYmxlTmFycmF0aXZlID8geyBlbmFibGVOYXJyYXRpdmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9sb2dnZXIgPyB7IGxvZ2dlcjogdGhpcy5fbG9nZ2VyIH0gOiB7fSksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN0YWdlRGVzY3JpcHRpb25zOiBuZXcgTWFwKHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zKSxcbiAgICAgIC4uLih0aGlzLl9pbnB1dFNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IHRoaXMuX2lucHV0U2NoZW1hIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fb3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHRoaXMuX291dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dE1hcHBlciA/IHsgb3V0cHV0TWFwcGVyOiB0aGlzLl9vdXRwdXRNYXBwZXIgfSA6IHt9KSxcbiAgICAgIC8vIEF1dG8tZW1iZWQgVHlwZWRTY29wZSBmYWN0b3J5IGlmIG5vbmUgd2FzIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gVGhpcyBtZWFucyBBTlkgd2F5IG9mIGNyZWF0aW5nIGEgRmxvd0NoYXJ0QnVpbGRlciAoZmxvd0NoYXJ0KCksIG5ldyBGbG93Q2hhcnRCdWlsZGVyKCksXG4gICAgICAvLyBvciBhbnkgc3ViY2xhc3MpIGF1dG9tYXRpY2FsbHkgZ2V0cyBUeXBlZFNjb3BlIOKAlCBubyBtYW51YWwgc2V0U2NvcGVGYWN0b3J5IG5lZWRlZC5cbiAgICAgIHNjb3BlRmFjdG9yeTogdGhpcy5fc2NvcGVGYWN0b3J5ID8/IChjcmVhdGVUeXBlZFNjb3BlRmFjdG9yeSgpIGFzIHVua25vd24gYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgIH07XG5cbiAgICByZXR1cm4gbWFrZVJ1bm5hYmxlKGNoYXJ0KTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0aGUgc2NvcGUgZmFjdG9yeS4gUmFyZWx5IG5lZWRlZCDigJQgYXV0by1lbWJlZHMgVHlwZWRTY29wZSBieSBkZWZhdWx0LiAqL1xuICBzZXRTY29wZUZhY3RvcnkoZmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4pOiB0aGlzIHtcbiAgICB0aGlzLl9zY29wZUZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHtjaWR9YCk7XG4gICAgICAgIHdhbGsoYyk7XG4gICAgICB9XG4gICAgICBpZiAobi5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGlkT2Yobi5uZXh0LmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke21pZH1gKTtcbiAgICAgICAgd2FsayhuLm5leHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayhyb290KTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIChleHBvc2VkIGZvciBoZWxwZXIgY2xhc3Nlcykg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvcigpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvciA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3JTcGVjKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvclNwZWMgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgc3BlYyBjdXJzb3IuIFJldGFpbmVkIGFzIGEgbWV0aG9kIHNvIGNhbGwgc2l0ZXMgc3RheVxuICAgKiBvbmUtbGluZXJzIGFuZCBmdXR1cmUgY3Vyc29yLXJlbGF0ZWQgc2lkZSBlZmZlY3RzIGhhdmUgYSBob29rLlxuICAgKi9cbiAgLyoqXG4gICAqIFdoYXQgd2FzIGF0dGFjaGVkIHRvIHRoZSBDVVJTT1Igd2l0aG91dCBhZHZhbmNpbmcgaXQg4oCUIGEgc3ViZmxvdyBtb3VudCwgYVxuICAgKiBwYXJhbGxlbCBmb3JrJ3MgY2hpbGRyZW4uIENsZWFyZWQgYnkge0BsaW5rIF9hZHZhbmNlQ3Vyc29yU3BlY30sIHRoZSBzaW5nbGVcbiAgICogY2hva2UgcG9pbnQgZXZlcnkgY3Vyc29yLWFkdmFuY2luZyBtZXRob2QgYWxyZWFkeSBnb2VzIHRocm91Z2gsIHNvIHRoaXNcbiAgICogbWFya2VyIGNhbm5vdCBkcmlmdCBhcyBuZXcgYnVpbGRlciBtZXRob2RzIGFyZSBhZGRlZC5cbiAgICpcbiAgICogRXhpc3RzIGZvciBgLnJldHJ5KClgLiBUaG9zZSBtZXRob2RzIGhhbmcgY2hpbGRyZW4gb2ZmIHRoZSBjdXJyZW50IHN0YWdlXG4gICAqIGFuZCBsZWF2ZSB0aGUgY3Vyc29yIHBvaW50aW5nIGF0IHRoYXQgc3RhZ2UsIHNvIGEgY2hhaW5lZCBgLnJldHJ5KClgIHdvdWxkXG4gICAqIHNpbGVudGx5IGF0dGFjaCB0aGUgcG9saWN5IHRvIHRoZSBzdGFnZSBCRUZPUkUgdGhlIHRoaW5nIHlvdSBqdXN0IHdyb3RlIOKAlFxuICAgKiBleGFjdGx5IHRoZSBzaWxlbnQgbWlzLWF0dHJpYnV0aW9uIHRoaXMgY29kZWJhc2UgcmVmdXNlcyBlbHNld2hlcmUgKHNlZVxuICAgKiB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIHJ1bGVzKS4gTmFtaW5nIHdoYXQgd2FzIGxhc3QgYWRkZWQgbGV0cyB0aGVcbiAgICogcmVmdXNhbCBzYXkgc29tZXRoaW5nIHVzZWZ1bC5cbiAgICovXG4gIHByaXZhdGUgX2N1cnNvclRhaWw/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYWR2YW5jZUN1cnNvclNwZWMobmV3U3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gbmV3U3BlYztcbiAgfVxuXG4gIF9zdGFnZU1hcEhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgUmVnaXN0ZXIgYSBtb3VudGVkIHN1YmZsb3cncyBkZWZpbml0aW9uIOKAlCBmaXJzdCBtb3VudCB3aW5zLFxuICAgKiBhdCBldmVyeSBlYWdlciBtb3VudCBzaXRlIChsaW5lYXIsIGZvcmsgY2hpbGQsIGRlY2lkZXIgYW5kIHNlbGVjdG9yXG4gICAqIGJyYW5jaCkuIEEgU0VDT05EIG1vdW50IHVuZGVyIHRoZSBzYW1lIGlkIGlzIGFsbG93ZWQgKGV4aXN0aW5nIGNoYXJ0cyBkb1xuICAgKiBpdCkgYW5kIHNoYXJlcyB0aGUgZmlyc3Qgb25lJ3MgZGVmaW5pdGlvbiDigJQgYnV0IGEgcGF1c2UgaW5zaWRlIGVpdGhlclxuICAgKiBjYW5ub3QgYmUgcmVzdW1lZDogYSBjaGVja3BvaW50J3MgYHN1YmZsb3dQYXRoYCBuYW1lcyB0aGUgc3ViZmxvdyBpZCwgbm90XG4gICAqIHRoZSBtb3VudCwgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZSBhbWJpZ3VvdXMgcGF0aC4gRGV2IG1vZGUgc2F5cyBzb1xuICAgKiBoZXJlLCBhdCBidWlsZCB0aW1lLCB3aGVyZSB0aGUgaWQgY2FuIHN0aWxsIGJlIGNoYW5nZWQuXG4gICAqL1xuICBfcmVnaXN0ZXJTdWJmbG93RGVmKGlkOiBzdHJpbmcsIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gc3ViZmxvdyBpZCAnJHtpZH0nIGlzIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhpcyBjaGFydC4gVGhlIG1vdW50cyBzaGFyZSBvbmUgYCArXG4gICAgICAgICAgJ2RlZmluaXRpb24sIGFuZCBhIHBhdXNlIGluc2lkZSBlaXRoZXIgY2Fubm90IGJlIHJlc3VtZWQg4oCUIHRoZSBjaGVja3BvaW50IGNhbm5vdCBzYXkgd2hpY2ggbW91bnQgJyArXG4gICAgICAgICAgJ3BhdXNlZC4gR2l2ZSBlYWNoIG1vdW50IGl0cyBvd24gaWQuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgX2FkZFRvTWFwKGlkOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pIHtcbiAgICBpZiAodGhpcy5fc3RhZ2VNYXAuaGFzKGlkKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zdGFnZU1hcC5nZXQoaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSBmbikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIGZvciBpZCAnJHtpZH0nYCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YWdlTWFwLnNldChpZCwgZm4pO1xuICB9XG5cbiAgX21lcmdlU3RhZ2VNYXAob3RoZXI6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4sIHByZWZpeD86IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG90aGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBqb2luUGF0aChwcmVmaXgsIGspIDogaztcbiAgICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgIT09IHYpIGZhaWwoYHN0YWdlTWFwIGNvbGxpc2lvbiB3aGlsZSBtb3VudGluZyBmbG93Y2hhcnQgYXQgJyR7a2V5fSdgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YWdlTWFwLnNldChrZXksIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IE1PVU5UIHRpbWUg4oCUIHRoZSBvbmVcbiAgICogcHJlZml4ZXIsIGBlbmdpbmUvZ3JhcGgvcHJlZml4Tm9kZVRyZWUudHNgICh0aGUgdHJhdmVyc2VyIGNhbGxzIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGF0IFJVTiB0aW1lKS4gS2VwdCBhcyB0aGUgYnVpbGRlcidzIGRvb3IgZm9yIGl0cyBtb3VudCBzaXRlcy5cbiAgICovXG4gIF9wcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHByZWZpeE5vZGVUcmVlKG5vZGUsIHByZWZpeCk7XG4gIH1cblxuICBfbWVyZ2VTdWJmbG93cyhzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZCwgcHJlZml4OiBzdHJpbmcpIHtcbiAgICBpZiAoIXN1YmZsb3dzKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3dzKSkge1xuICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBqb2luUGF0aChwcmVmaXgsIGtleSk7XG4gICAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhwcmVmaXhlZEtleSkpIHtcbiAgICAgICAgdGhpcy5fc3ViZmxvd0RlZnMuc2V0KHByZWZpeGVkS2V5LCB7XG4gICAgICAgICAgcm9vdDogdGhpcy5fcHJlZml4Tm9kZVRyZWUoZGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZhY3RvcnkgRnVuY3Rpb25cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFN0YXJ0IGEgZmxvd2NoYXJ0IHdpdGggaXRzIGZpcnN0IHN0YWdlOyByZXR1cm5zIGEgZmx1ZW50IGJ1aWxkZXIuXG4gKlxuICogQ2hhaW4gYC5hZGRGdW5jdGlvbigpYCAvIGAuYWRkRGVjaWRlckZ1bmN0aW9uKClgIC8gYC5hZGRTZWxlY3RvckZ1bmN0aW9uKClgIC9cbiAqIGAuYWRkU3ViRmxvd0NoYXJ0KClgIGV0Yy4gdG8gYWRkIG1vcmUgc3RhZ2VzLCB0aGVuIGZpbmlzaCB3aXRoIGAuYnVpbGQoKWAuXG4gKlxuICogQHBhcmFtIG5hbWUgICAgSHVtYW4tcmVhZGFibGUgZGlzcGxheSBsYWJlbCBmb3IgdGhlIHN0YWdlIChzaG93biBpbiB0aGUgbmFycmF0aXZlL3RyYWNlKS5cbiAqIEBwYXJhbSBmbiAgICAgIFRoZSBzdGFnZSdzIHdvcmsg4oCUIGEgYChzY29wZSkgPT4g4oCmYCBmdW5jdGlvbiwgb3IgYSBgUGF1c2FibGVIYW5kbGVyYCBmb3IgaHVtYW4taW4tdGhlLWxvb3AgcGF1c2VzLlxuICogQHBhcmFtIGlkICAgICAgU3RhYmxlIHN0YWdlIGlkIHVzZWQgaW4gdHJhY2VzLCB0aGUgY29tbWl0IGxvZywgYW5kIGBydW50aW1lU3RhZ2VJZGAuIEtlZXAgaXQgdW5pcXVlIHdpdGhpbiB0aGUgY2hhcnQuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBgeyBkZXNjcmlwdGlvbj8sIHN0cnVjdHVyZVJlY29yZGVycz8gfWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0PFN0YXRlPignRmV0Y2hVc2VyJywgYXN5bmMgKHNjb3BlKSA9PiB7XG4gKiAgIHNjb3BlLnVzZXIgPSBhd2FpdCBnZXRVc2VyKCk7XG4gKiB9LCAnZmV0Y2gtdXNlcicpXG4gKiAgIC5hZGRGdW5jdGlvbignUHJvY2VzcycsIHByb2Nlc3NGbiwgJ3Byb2Nlc3MnKVxuICogICAuYnVpbGQoKTtcbiAqXG4gKiBjb25zdCB0cmFjZSA9IG5hcnJhdGl2ZSgpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hhcnQucmVjb3JkZXIodHJhY2UpLnJ1bigpO1xuICogY29uc29sZS5sb2codHJhY2UuZ2V0RW50cmllcygpLm1hcCgoZSkgPT4gZS50ZXh0KS5qb2luKCdcXG4nKSk7XG4gKi9cbi8vIE92ZXJsb2FkIDE6IHR5cGVkIHN0YXRlIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRTdGF0ZSBleHRlbmRzIG9iamVjdD4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFR5cGVkU3RhZ2VGdW5jdGlvbjxUU3RhdGU+IHwgUGF1c2FibGVIYW5kbGVyPFR5cGVkU2NvcGU8VFN0YXRlPj4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxhbnksIFR5cGVkU2NvcGU8VFN0YXRlPj47XG5cbi8vIE92ZXJsb2FkIDI6IGV4cGxpY2l0IGdlbmVyaWNzIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPjtcblxuLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIOKAlCBhY2NlcHRzIHRoZSBvcHRpb25zIGJhZyAob3IgdW5kZWZpbmVkKS5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgLy8gQXR0YWNoIFN0cnVjdHVyZVJlY29yZGVycyBCRUZPUkUgc3RhcnQoKSBzbyB0aGUgc2VlZCBldmVudCBmaXJlcyB0aHJvdWdoXG4gIC8vIHRoZSBub3JtYWwgZGlzcGF0Y2hlciBwYXRoIChubyByZXBsYXkgbmVlZGVkKS4gSXRlcmF0aW9uIG9yZGVyIG1hdGNoZXNcbiAgLy8gYXJyYXkgb3JkZXIsIG1hdGNoaW5nIHRoZSBmbHVlbnQgYC5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcigpYCBjaGFpblxuICAvLyBzZW1hbnRpY3MuXG4gIGlmIChvcHRpb25zPy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlYyBvZiBvcHRpb25zLnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgICAgYnVpbGRlci5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVpbGRlci5zdGFydChuYW1lLCBmbiBhcyBhbnksIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbiwge1xuICAgIC4uLihvcHRpb25zPy5yZXRyeSAmJiB7IHJldHJ5OiBvcHRpb25zLnJldHJ5IH0pLFxuICAgIC4uLihvcHRpb25zPy50YWdzICYmIHsgdGFnczogb3B0aW9ucy50YWdzIH0pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBMaWtlIGBmbG93Q2hhcnQoKWAsIGJ1dCB0aGUgUk9PVCBzdGFnZSBpcyBhIFNFTEVDVE9SIOKAlCBpdCBydW5zIGZpcnN0IGFuZFxuICogaXRzIGJyYW5jaGVzIGF0dGFjaCBkaXJlY3RseSB0byBpdCAobm8gc2VwYXJhdGUgc2VlZCBzdGFnZSkuIFJldHVybnMgYVxuICogYFNlbGVjdG9yRm5MaXN0YDsgZGVjbGFyZSBicmFuY2hlcyB0aGVuIGNhbGwgYC5lbmQoKWAgdG8gZ2V0IHRoZSBidWlsZGVyXG4gKiBiYWNrIGZvciBhbnkgc3Vic2VxdWVudCBzdGFnZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgZmxvd0NoYXJ0U2VsZWN0b3I8TXlTdGF0ZT4oJ0NvbnRleHQnLCBjb250ZXh0U2VsZWN0b3JGbiwgJ2NvbnRleHQnKVxuICogICAgIC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goJ3NmLXN5c3RlbS1wcm9tcHQnLCBzeXNTbG90LCAnU3lzdGVtIFByb21wdCcsIHsuLi59KVxuICogICAgIC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goJ3NmLW1lc3NhZ2VzJywgbXNnU2xvdCwgJ01lc3NhZ2VzJywgey4uLn0pXG4gKiAgICAgLmVuZCgpXG4gKiAgICAgLmFkZEZ1bmN0aW9uKCdtZXNzYWdlQVBJJywgYXNzZW1ibGVGbiwgJ21lc3NhZ2UtYXBpJylcbiAqICAgICAuYnVpbGQoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydFNlbGVjdG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248YW55LCBUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBidWlsZGVyID0gbmV3IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPigpO1xuICBpZiAob3B0aW9ucz8uc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgZm9yIChjb25zdCByZWMgb2Ygb3B0aW9ucy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICAgIGJ1aWxkZXIuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1aWxkZXIuc3RhcnRTZWxlY3RvcihuYW1lLCBmbiwgaWQsIG9wdGlvbnM/LmRlc2NyaXB0aW9uLCB7XG4gICAgLi4uKG9wdGlvbnM/LmZhaWxGYXN0ICE9PSB1bmRlZmluZWQgJiYgeyBmYWlsRmFzdDogb3B0aW9ucy5mYWlsRmFzdCB9KSxcbiAgICAuLi4ob3B0aW9ucz8ucmV0cnkgJiYgeyByZXRyeTogb3B0aW9ucy5yZXRyeSB9KSxcbiAgICAuLi4ob3B0aW9ucz8udGFncyAmJiB7IHRhZ3M6IG9wdGlvbnMudGFncyB9KSxcbiAgfSk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU3BlYyB0byBTdGFnZU5vZGUgQ29udmVydGVyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGZ1bmN0aW9uIHNwZWNUb1N0YWdlTm9kZShzcGVjOiBGbG93Q2hhcnRTcGVjKTogU3RhZ2VOb2RlPGFueSwgYW55PiB7XG4gIGNvbnN0IGluZmxhdGUgPSAoczogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4gPT4gKHtcbiAgICBuYW1lOiBzLm5hbWUsXG4gICAgaWQ6IHMuaWQsXG4gICAgY2hpbGRyZW46IHMuY2hpbGRyZW4/Lmxlbmd0aCA/IHMuY2hpbGRyZW4ubWFwKGluZmxhdGUpIDogdW5kZWZpbmVkLFxuICAgIG5leHQ6IHMubmV4dCA/IGluZmxhdGUocy5uZXh0KSA6IHVuZGVmaW5lZCxcbiAgfSk7XG4gIHJldHVybiBpbmZsYXRlKHNwZWMpO1xufVxuIl19
|