footprintjs 9.7.0 → 9.8.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 +3 -1
- package/dist/advanced.js +1 -1
- package/dist/esm/advanced.js +1 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -1
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +17 -1
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +36 -2
- package/dist/esm/lib/memory/backtrack.js +145 -35
- package/dist/esm/lib/memory/index.js +1 -1
- package/dist/esm/lib/memory/types.js +1 -1
- package/dist/esm/lib/recorder/ControlDepRecorder.js +228 -0
- package/dist/esm/lib/scope/ScopeFacade.js +44 -2
- package/dist/esm/trace.js +2 -1
- package/dist/lib/engine/handlers/SubflowExecutor.js +4 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +17 -1
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +36 -2
- package/dist/lib/memory/backtrack.js +145 -35
- package/dist/lib/memory/index.js +1 -1
- package/dist/lib/memory/types.js +1 -1
- package/dist/lib/recorder/ControlDepRecorder.js +233 -0
- package/dist/lib/scope/ScopeFacade.js +44 -2
- package/dist/trace.js +5 -2
- package/dist/types/advanced.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +10 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -0
- package/dist/types/lib/engine/types.d.ts +6 -0
- package/dist/types/lib/memory/StageContext.d.ts +23 -1
- package/dist/types/lib/memory/backtrack.d.ts +108 -2
- package/dist/types/lib/memory/index.d.ts +1 -1
- package/dist/types/lib/memory/types.d.ts +22 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +133 -0
- package/dist/types/lib/scope/ScopeFacade.d.ts +30 -1
- package/dist/types/trace.d.ts +4 -1
- package/package.json +1 -1
|
@@ -56,6 +56,10 @@ class FlowchartTraverser {
|
|
|
56
56
|
logger;
|
|
57
57
|
signal;
|
|
58
58
|
parentSubflowId;
|
|
59
|
+
/** RFC-003 D1: runtimeStageId of the subflow mount stage in the parent
|
|
60
|
+
* traverser. Fallback `parentRuntimeStageId` for stages whose context has
|
|
61
|
+
* no parent (the subflow root). Undefined at the top level. */
|
|
62
|
+
parentMountRuntimeStageId;
|
|
59
63
|
/** Frozen value passed via `run({input})`. Surfaced on `onRunStart` at the
|
|
60
64
|
* top-level traversal so consumers (e.g. `InOutRecorder`) can bracket
|
|
61
65
|
* the run with the same payload shape that subflows already have. */
|
|
@@ -177,6 +181,7 @@ class FlowchartTraverser {
|
|
|
177
181
|
this.logger = opts.logger;
|
|
178
182
|
this.signal = opts.signal;
|
|
179
183
|
this.parentSubflowId = opts.parentSubflowId;
|
|
184
|
+
this.parentMountRuntimeStageId = opts.parentMountRuntimeStageId;
|
|
180
185
|
this.readOnlyContext = opts.readOnlyContext;
|
|
181
186
|
this.runId = opts.runId;
|
|
182
187
|
// Structure manager (deep-clones build-time structure)
|
|
@@ -251,6 +256,9 @@ class FlowchartTraverser {
|
|
|
251
256
|
maxDepth: this._maxDepth,
|
|
252
257
|
...(this._maxIterations !== undefined && { maxIterations: this._maxIterations }),
|
|
253
258
|
parentSubflowId: subflowOpts.subflowId,
|
|
259
|
+
// RFC-003 D1: the mount stage's runtimeStageId — parent fallback for
|
|
260
|
+
// the subflow's root stage so ancestor chains cross the boundary.
|
|
261
|
+
parentMountRuntimeStageId: subflowOpts.parentMountRuntimeStageId,
|
|
254
262
|
executionCounter: this._executionCounter, // Share counter — subflow continues global numbering
|
|
255
263
|
runId: this.runId, // Subflow inherits parent's runId — same logical run
|
|
256
264
|
// Forward the resume-only subflow scope captures so nested
|
|
@@ -577,6 +585,13 @@ class FlowchartTraverser {
|
|
|
577
585
|
// use the same value. Must happen before executeStage AND before traversalContext.
|
|
578
586
|
const idx = this._executionCounter.value++;
|
|
579
587
|
context.runtimeStageId = (0, runtimeStageId_js_1.buildRuntimeStageId)(node.id, idx);
|
|
588
|
+
// RFC-003 D1: runtime parent — the previous execution step's runtimeStageId.
|
|
589
|
+
// Falls back to the subflow MOUNT's runtimeStageId for the subflow root
|
|
590
|
+
// stage (its StageContext is created fresh with no parent), so runtime
|
|
591
|
+
// ancestor chains cross subflow boundaries. `||` (not `??`) on purpose:
|
|
592
|
+
// a parent context that never executed still carries the field's
|
|
593
|
+
// initial `''`, which must also fall through to the mount fallback.
|
|
594
|
+
const parentRuntimeStageId = context.parent?.runtimeStageId || this.parentMountRuntimeStageId;
|
|
580
595
|
// Build traversal context for recorder events — created once per stage, shared by all events
|
|
581
596
|
const traversalContext = {
|
|
582
597
|
runId: this.runId,
|
|
@@ -584,6 +599,7 @@ class FlowchartTraverser {
|
|
|
584
599
|
runtimeStageId: context.runtimeStageId,
|
|
585
600
|
stageName: node.name,
|
|
586
601
|
parentStageId: context.parent?.stageId,
|
|
602
|
+
...(parentRuntimeStageId && { parentRuntimeStageId }),
|
|
587
603
|
subflowId: context.subflowId ?? this.parentSubflowId,
|
|
588
604
|
subflowPath: branchPath || undefined,
|
|
589
605
|
depth: this.computeContextDepth(context),
|
|
@@ -1021,4 +1037,4 @@ class FlowchartTraverser {
|
|
|
1021
1037
|
}
|
|
1022
1038
|
}
|
|
1023
1039
|
exports.FlowchartTraverser = FlowchartTraverser;
|
|
1024
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUdILG1EQUFxRDtBQUVyRCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELHlFQUFtRTtBQUNuRSxpRkFBMkU7QUFDM0UscUVBQStEO0FBQy9ELGlFQUEyRDtBQUMzRCx1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCx1RUFBaUU7QUFFakUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsNERBQTJEO0FBOEczRDs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBOEIvRSxTQUFTLGlCQUFpQixDQUFlLEtBQWM7SUFDckQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFpQyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNsSCxDQUFDO0FBRUQsTUFBYSxrQkFBa0I7SUFDWixJQUFJLENBQTBCO0lBQ3ZDLFFBQVEsQ0FBMkM7SUFDMUMsZ0JBQWdCLENBQW9CO0lBQzdDLFFBQVEsQ0FBb0Q7SUFDbkQsTUFBTSxDQUFVO0lBQ2hCLE1BQU0sQ0FBZTtJQUNyQixlQUFlLENBQVU7SUFDMUM7OzBFQUVzRTtJQUNyRCxlQUFlLENBQVc7SUFDM0M7b0ZBQ2dGO0lBQy9ELEtBQUssQ0FBUztJQUUvQixrQkFBa0I7SUFDRCxZQUFZLENBQTZCO0lBQ3pDLGdCQUFnQixDQUFpQztJQUNqRCxlQUFlLENBQWdDO0lBQy9DLFdBQVcsQ0FBNEI7SUFDdkMsb0JBQW9CLENBQXFDO0lBQ3pELGNBQWMsQ0FBK0I7SUFDN0MsZUFBZSxDQUFnQztJQUMvQyxnQkFBZ0IsQ0FBMEI7SUFDMUMsa0JBQWtCLENBQXdCO0lBQzFDLHNCQUFzQixDQUFxQztJQUU1RSxrQkFBa0I7SUFDVixjQUFjLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFL0Q7Ozs7O09BS0c7SUFDYyxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTFEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNjLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBMkQsQ0FBQztJQUNqRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRXZCOzs7Ozs7Ozs7O09BVUc7SUFDSyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBRTFCOzs7Ozs7O09BT0c7SUFDYyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBd0IsQ0FBQztJQUV6RTs7O09BR0c7SUFDYyxpQkFBaUIsQ0FBb0I7SUFFdEQ7O09BRUc7SUFDYyxTQUFTLENBQVM7SUFFbkM7OztPQUdHO0lBQ2MsY0FBYyxDQUFVO0lBRXpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9CRztJQUNILE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFFeEMsWUFBWSxJQUFvQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDO1FBQ3ZFLElBQUksUUFBUSxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRXhCLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxvREFBdUIsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFcEQsc0JBQXNCO1FBQ3RCLGdHQUFnRztRQUNoRyw4RkFBOEY7UUFDOUYsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ3BELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksa0RBQXNCLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDO1lBRXpDLGlHQUFpRztZQUNqRyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMxQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxnREFBcUIsRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSx3RUFBaUMsRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuQyxxRkFBcUY7UUFDckYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakQsOEJBQThCO1FBQzlCLHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSw4QkFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxzQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksNEJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSw4Q0FBb0IsQ0FDbEQsSUFBSSxFQUNKLElBQUksQ0FBQyxZQUFZLEVBQ2pCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FDcEIsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxrQ0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxvQ0FBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksb0NBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw2QkFBNkIsQ0FDbkMsVUFBMEM7UUFFMUMscUZBQXFGO1FBQ3JGLDBGQUEwRjtRQUMxRiwrRUFBK0U7UUFDL0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBRW5ELE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNyQixNQUFNLFNBQVMsR0FBRyxJQUFJLGtCQUFrQixDQUFlO2dCQUNyRCxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7Z0JBQ3RCLFFBQVEsRUFBRSxjQUFjLEVBQUUsa0NBQWtDO2dCQUM1RCxZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7Z0JBQ3JDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxnQkFBZ0I7Z0JBQzlDLGVBQWUsRUFBRSxXQUFXLENBQUMsZUFBZTtnQkFDNUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZO2dCQUNyQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsc0JBQXNCO2dCQUN6RCxjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQWM7Z0JBQ3pDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUI7Z0JBQ25ELFFBQVEsRUFBRSxjQUFjLEVBQUUsa0NBQWtDO2dCQUM1RCxrQkFBa0IsRUFBRSxnREFBZ0Q7Z0JBQ3BFLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtnQkFDekIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dCQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2hGLGVBQWUsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDdEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLHFEQUFxRDtnQkFDL0YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUscURBQXFEO2dCQUN4RSwyREFBMkQ7Z0JBQzNELDREQUE0RDtnQkFDNUQsOERBQThEO2dCQUM5RCxHQUFHLENBQUMsVUFBVSxDQUFDLHNCQUFzQixJQUFJO29CQUN2QyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsc0JBQXNCO2lCQUMxRCxDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtnQkFDbEMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFO2dCQUN0RCxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTthQUMvQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFvQztRQUNyRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixzQkFBc0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQ25ELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNuQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLElBQUksT0FBTztZQUN4RCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDM0MsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJO2dCQUNqQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCO2FBQ3BELENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELDZEQUE2RDtJQUU3RDs7OztPQUlHO0lBQ0ssYUFBYSxHQUE4QyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUUxRixLQUFLLENBQUMsT0FBTyxDQUFDLFVBQW1CO1FBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBRTVDLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsZ0VBQWdFO1FBQ2hFLDREQUE0RDtRQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQztRQUN0RCxrRUFBa0U7UUFDbEUsd0VBQXdFO1FBQ3hFLG9FQUFvRTtRQUNwRSxnRUFBZ0U7UUFDaEUsTUFBTSxXQUFXLEdBQXFCO1lBQ3BDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixjQUFjLEVBQUUsWUFBWTtZQUM1QixTQUFTLEVBQUUsVUFBVTtZQUNyQixLQUFLLEVBQUUsQ0FBQztTQUNULENBQUM7UUFDRixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2Ysb0VBQW9FO1lBQ3BFLGlFQUFpRTtZQUNqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxnRUFBZ0U7UUFDaEUsbUVBQW1FO1FBQ25FLCtDQUErQztRQUMvQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxJQUFJLE1BQXVCLENBQUM7UUFDNUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBQSx3QkFBYSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBQSwrQkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxhQUFhO1FBQ1gsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUE4QjtRQUN4QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELGlGQUFpRjtJQUNqRix5QkFBeUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUVELGlFQUFpRTtJQUVqRTs7Ozs7Ozs7T0FRRztJQUNLLGNBQWMsQ0FBQyxJQUE2QjtRQUNsRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQztRQUN2RCxNQUFNLEtBQUssR0FBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRyxDQUFDO1lBQzFCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUFFLFNBQVMsQ0FBQyx5REFBeUQ7WUFDekYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLHNFQUFzRTtZQUN0RSxxRUFBcUU7WUFDckUsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLElBQUk7Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sVUFBVSxDQUFDLElBQTZCO1FBQzlDLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxFQUFpQyxDQUFDO1FBQ2pGLHdFQUF3RTtRQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BDLHdGQUF3RjtRQUN4RixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLEVBQUU7SUFDRixpRUFBaUU7SUFDakUsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUVqRSxRQUFRLENBQUMsSUFBNkI7UUFDNUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUE2QjtRQUNwRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLFdBQVcsQ0FBQyxJQUE2QjtRQUMvQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDeEQsQ0FBQztJQUVELG1GQUFtRjtJQUMzRSxXQUFXLENBQUMsSUFBNkI7UUFDL0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN4RSxDQUFDO0lBRUQsa0ZBQWtGO0lBQzFFLGdCQUFnQixDQUFDLElBQTZCO1FBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDMUMsQ0FBQztJQUVELDJFQUEyRTtJQUNuRSxZQUFZLENBQUMsSUFBNkI7UUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLE9BQU8sQ0FBQyxJQUE2QjtRQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQTRCLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUM1QixNQUFNLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDbkQsTUFBTSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLFFBQVE7WUFBRSxNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDckQsSUFBSSxLQUFLLENBQUMsZ0JBQWdCO1lBQUUsTUFBTSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3RSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FDeEIsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUI7UUFFbkIsZ0ZBQWdGO1FBQ2hGLDREQUE0RDtRQUM1RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FDdkIsSUFBNkIsRUFDN0IsT0FBcUIsRUFDckIsU0FBb0IsRUFDcEIsVUFBbUI7UUFFbkIsb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSx5RUFBeUU7UUFDekUsSUFBSSxlQUEyQyxDQUFDO1FBQ2hELDJCQUEyQjtRQUMzQixvRUFBb0U7UUFDcEUsMkNBQTJDO1FBQzNDLElBQUksQ0FBQztZQUNILElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsSUFBSSxDQUFDLFNBQVMsS0FBSztvQkFDMUUsbUdBQW1HO29CQUNuRyxvRUFBb0U7b0JBQ3BFLGdCQUFnQixJQUFJLENBQUMsSUFBSSxLQUFLO29CQUM5Qiw4RkFBOEYsQ0FDakcsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE9BQU8sR0FBa0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2pHLFNBQVMsQ0FBQztnQkFDUixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hHLElBQUksQ0FBQyxpQkFBaUIsQ0FBZSxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUM3QyxPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxZQUFZO29CQUFFLENBQUMsZUFBZSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLDJEQUEyRDtZQUMzRCxzRUFBc0U7WUFDdEUsdURBQXVEO1lBQ3ZELElBQUksZUFBZSxLQUFLLFNBQVMsSUFBSSxJQUFBLHdCQUFhLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3JELEtBQUssQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDOUYsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELHlEQUF5RDtJQUNqRCxHQUFHLENBQ1QsSUFBNkIsRUFDN0IsT0FBcUIsRUFDckIsVUFBOEIsRUFDOUIsWUFBMkI7UUFFM0IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEcsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsZUFBZSxDQUMzQixJQUE2QixFQUM3QixPQUFxQixFQUNyQixTQUFvQixFQUNwQixVQUFtQjtRQUVuQiw4REFBOEQ7UUFDOUQsbUVBQW1FO1FBQ25FLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM3RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVk7WUFBRSxPQUFPLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztRQUVsRixnRkFBZ0Y7UUFDaEYsNEZBQTRGO1FBQzVGLG1GQUFtRjtRQUNuRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0MsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFBLHVDQUFtQixFQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFM0QsNkZBQTZGO1FBQzdGLE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsT0FBTztZQUNuQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ3BCLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU87WUFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWU7WUFDcEQsV0FBVyxFQUFFLFVBQVUsSUFBSSxTQUFTO1lBQ3BDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1NBQ3pDLENBQUM7UUFFRiwrREFBK0Q7UUFDL0QsaUZBQWlGO1FBQ2pGLHdGQUF3RjtRQUN4RixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQStCLEVBQUUsSUFBSSxDQUFDLFNBQVUsQ0FBQyxDQUFDO1lBRXBHLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUV4RCx5QkFBeUI7WUFDekIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQWlDLENBQUMsQ0FBQztnQkFDcEUsQ0FBQztZQUNILENBQUM7WUFFRCx3QkFBd0I7WUFDeEIsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMzRCxNQUFNLFdBQVcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7d0JBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBd0MsQ0FBQztvQkFDeEUsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELHNEQUFzRDtZQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLElBQUksQ0FBQyxFQUFFLEVBQ1AsSUFBSSxDQUFDLFNBQVUsRUFDZixJQUFJLENBQUMsV0FBVyxFQUNoQixRQUFRLENBQUMsa0JBQWtCLENBQzVCLENBQUM7WUFFRiw0RUFBNEU7WUFDNUUsd0ZBQXdGO1lBQ3hGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDaEQsc0VBQXNFO1lBQ3RFLGlFQUFpRTtZQUNqRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFMUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FDN0QsWUFBWSxFQUNaLE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLElBQUksQ0FBQyxjQUFjLEVBQ25CLGdCQUFnQixDQUNqQixDQUFDO1lBRUYsTUFBTSx1QkFBdUIsR0FBRyxZQUFZLEtBQUssU0FBUyxDQUFDO1lBQzNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0seUJBQXlCLEdBQUcsdUJBQXVCLElBQUksV0FBVyxDQUFDO1lBRXpFLGlEQUFpRDtZQUNqRCxtRUFBbUU7WUFDbkUsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSx5QkFBeUIsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFFRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELHNFQUFzRTtRQUN0RSx1RUFBdUU7UUFDdkUsOERBQThEO1FBQzlELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUUvQiw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRixNQUFNLFlBQVksR0FBRyxTQUFTLElBQUksQ0FBQyxJQUFJLHlFQUF5RSxDQUFDO1lBQ2pILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixVQUFVLFlBQVksSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDdEcsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxhQUFhLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFlBQVksR0FBRyxnREFBZ0QsQ0FBQztZQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksb0JBQW9CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFlBQVksR0FBRyxpREFBaUQsQ0FBQztZQUN2RSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QixJQUFJLGFBQWE7Z0JBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUNyQyxJQUFJLFdBQVc7Z0JBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFFRCxpRUFBaUU7UUFDakUscUVBQXFFO1FBQ3JFLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDbEMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDN0IsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNELFNBQVMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRix3REFBd0Q7UUFDeEQsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FDaEUsSUFBSSxFQUNKLFNBQVUsRUFDVixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQzNCLGdCQUFnQixDQUNqQixDQUFDO1lBRUYsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FDeEQsSUFBSSxFQUNKLFNBQVUsRUFDVixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDNUIsZ0JBQWdCLENBQ2pCLENBQUM7WUFFRixnRUFBZ0U7WUFDaEUsa0VBQWtFO1lBQ2xFLG9FQUFvRTtZQUNwRSxvRUFBb0U7WUFDcEUsOERBQThEO1lBQzlELElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUU7b0JBQ25FLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRztvQkFDeEIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFO2lCQUNuQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsbUVBQW1FO1lBQ25FLDREQUE0RDtZQUM1RCxpRUFBaUU7WUFDakUsd0RBQXdEO1lBQ3hELElBQUksYUFBa0IsQ0FBQztZQUN2QixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzlCLGFBQWEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUM7b0JBQ0gsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN6RyxDQUFDO2dCQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7b0JBQ3hCLElBQUksSUFBQSx3QkFBYSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ3pCLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxDQUFDO29CQUNELE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1lBRUQsMEVBQTBFO1lBQzFFLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLFFBQVEsR0FBRyxZQUFhLENBQUM7Z0JBQy9CLDRFQUE0RTtnQkFDNUUsdUZBQXVGO2dCQUN2RixNQUFNLFNBQVMsR0FDYixRQUFRLENBQUMsU0FBUyxLQUFLLElBQUk7b0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzt3QkFDekIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU07d0JBQ25DLENBQUMsUUFBUSxDQUFDLFNBQVM7d0JBQ25CLENBQUMsUUFBUSxDQUFDLFVBQVU7d0JBQ3BCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBRXRDLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDNUYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2pHLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBb0IsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUVELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQ3hHLE1BQU0sTUFBTSxDQUFDO1FBQ2YsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFJLFdBQTZCLENBQUM7UUFDbEMsSUFBSSxXQUFnRCxDQUFDO1FBRXJELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUM7Z0JBQ0gsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzRSxDQUFDO1lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztnQkFDcEIseUZBQXlGO2dCQUN6RixJQUFJLElBQUEsd0JBQWEsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN6QixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUMxRyxNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RixPQUFPLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFakcsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFCLGlFQUFpRTtnQkFDakUsZ0VBQWdFO2dCQUNoRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvRSxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO1lBRUQsd0RBQXdEO1lBQ3hELElBQUksV0FBVyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxJQUFBLGdDQUFpQixFQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLE1BQU0sV0FBVyxHQUFHLFdBQXNDLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBRXBELG1FQUFtRTtnQkFDbkUsa0VBQWtFO2dCQUNsRSw4REFBOEQ7Z0JBQzlELHFEQUFxRDtnQkFDckQsSUFBSSxXQUFXLENBQUMsYUFBYSxJQUFJLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqRixPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25ELE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUUxRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFcEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsR0FBRzt3QkFDeEMsYUFBYSxFQUFFLElBQUk7d0JBQ25CLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUzt3QkFDaEMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXO3dCQUNwQyxtQkFBbUIsRUFBRSxXQUFXLENBQUMsbUJBQW1CO3FCQUNyRCxDQUFDO29CQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FDeEMsSUFBSSxDQUFDLEVBQUUsRUFDUCxXQUFXLENBQUMsU0FBVSxFQUN0QixXQUFXLENBQUMsV0FBVyxFQUN2QixXQUFXLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUMzQyxDQUFDO29CQUVGLGlFQUFpRTtvQkFDakUsdURBQXVEO29CQUN2RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztnQkFFRCxnQ0FBZ0M7Z0JBQ2hDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDekMsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUMvRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDekUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUN4QyxLQUFLLENBQUMsRUFBRSxFQUNSLEtBQUssQ0FBQyxTQUFVLEVBQ2hCLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQ3JDLENBQUM7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsOERBQThEO2dCQUM5RCxpRUFBaUU7Z0JBQ2pFLElBQUksV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO29CQUM1RCxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pFLE9BQU8sQ0FBQyxNQUFNLENBQ1osaUJBQWlCLEVBQ2pCLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3RDLENBQUM7b0JBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUN6QyxJQUFJLENBQUMsRUFBRSxFQUNQLFdBQVcsQ0FBQyxRQUFRLEVBQ3BCLE9BQU8sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFDckMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FDL0IsQ0FBQztvQkFFRixJQUFJLE9BQU8sV0FBVyxDQUFDLGdCQUFnQixLQUFLLFVBQVUsRUFBRSxDQUFDO3dCQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO3dCQUM1RSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDdEMsQ0FBQztnQkFDSCxDQUFDO2dCQUVELGlFQUFpRTtnQkFDakUsb0RBQW9EO2dCQUNwRCxvRUFBb0U7Z0JBQ3BFLDREQUE0RDtnQkFDNUQsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3JCLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25FLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7Z0JBRUQsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBRXpELElBQUksbUJBQW1ELENBQUM7WUFFeEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FDdkUsYUFBYSxFQUNiLGtCQUFtQixFQUNuQixXQUFXLEVBQ1gsT0FBTyxFQUNQLFVBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsUUFBUSxDQUNkLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxVQUFVLEdBQUcsa0JBQWtCLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLGlCQUFpQixVQUFVLDBCQUEwQixVQUFVLEVBQUUsRUFBRTtvQkFDekcsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ3BELENBQUMsQ0FBQztnQkFFSCxzRUFBc0U7Z0JBQ3RFLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUNsQixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixnQkFBZ0IsQ0FDakIsQ0FBQztZQUNKLENBQUM7WUFFRCwyQkFBMkI7WUFDM0IsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM3QixPQUFPLG1CQUFvQixDQUFDO1lBQzlCLENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDO1lBQ3ZELElBQUksU0FBUyxJQUFJLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RSxDQUFDO1FBQ0gsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDL0YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sUUFBUSxHQUFHLFlBQWEsQ0FBQztZQUUvQixnRkFBZ0Y7WUFDaEYseUVBQXlFO1lBQ3pFLHFFQUFxRTtZQUNyRSxpRUFBaUU7WUFDakUsZ0RBQWdEO1lBQ2hELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFFM0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDOUcsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2pHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxRQUFRLENBQUMsSUFBSSxRQUFRLEVBQUU7Z0JBQ3RFLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSTthQUMzQixDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsa0VBQWtFO0lBRTFELDRCQUE0QixDQUNsQyxJQUE2QixFQUM3QixRQUFtQyxFQUNuQyxPQUFxQjtRQUVyQixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFM0MsTUFBTSxjQUFjLEdBQVE7WUFDMUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsV0FBVztZQUN6QixJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCLElBQUksRUFBRSxNQUFNO1lBQ1osUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDLENBQUM7U0FDSixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQTRCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN4QyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUc7b0JBQzFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDbkIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO29CQUNyQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ3ZCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztvQkFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN6RixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNsQixXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDdEIsV0FBVyxFQUFFO2dCQUNYLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixhQUFhLEVBQUUsV0FBaUQ7Z0JBQ2hFLE9BQU8sRUFBRSxFQUFFO2FBQ1o7WUFDRCxhQUFhO1lBQ2IsaUJBQWlCLEVBQUUsY0FBYztTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssbUJBQW1CLENBQUMsT0FBcUI7UUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFeEMsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxNQUFNLFFBQVEsR0FBbUIsRUFBRSxDQUFDO1FBQ3BDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbURBQW1EO1FBQ25FLElBQUksT0FBTyxHQUE2QixPQUFPLENBQUM7UUFDaEQsT0FBTyxPQUFPLEVBQUUsQ0FBQztZQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ1osTUFBTTtZQUNSLENBQUM7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzNCLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBNkIsRUFBRSxNQUFjO1FBQ2xFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQTRCLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNuRCxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxLQUFLLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEtBQUssQ0FBQyxTQUFTO1lBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEUsSUFBSSxLQUFLLENBQUMsSUFBSTtZQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixTQUFpQixFQUNqQixVQUFnRCxFQUNoRCxXQUFvQjtRQUVwQiwrRkFBK0Y7UUFDL0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVuQyxtQkFBbUI7UUFDbkIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUc7Z0JBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBK0I7Z0JBQ2hELEdBQUcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN6RixDQUFDO1FBQ1gsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFpQyxDQUFDLENBQUM7Z0JBQzVELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBd0MsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQ3JELFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQ3pDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQzVCLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQXRwQ0gsZ0RBdXBDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXMuIGBleGVjdXRlTm9kZWAgaXMgYVxuICogVFJBTVBPTElORSBkcml2ZXI6IGl0IHJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluXG4gKiBhIGZsYXQgbG9vcCwgZm9sbG93aW5nIHRhaWwgY29udGludWF0aW9ucyAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlcyxcbiAqIGR5bmFtaWMgbmV4dCwgZmxhdCBkZWNpZGVyIGRpc3BhdGNoKSBpdGVyYXRpdmVseSDigJQgc28gY2hhaW4gbGVuZ3RoIGFuZFxuICogbG9vcCBpdGVyYXRpb25zIG5ldmVyIGdyb3cgdGhlIGNhbGwgc3RhY2suIE9ubHkgdHJ1ZSB0cmVlIG5lc3RpbmcgKGZvcmtcbiAqIGNoaWxkcmVuLCB3aXRoLWNvbnRpbnVhdGlvbiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCBzdWJmbG93IG1vdW50cylcbiAqIHJlY3Vyc2VzLlxuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlU3RlcCBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDEuIFZBTElEQVRFICDigJQgbm9kZSBpbnZhcmlhbnRzLCByb2xlIG1hcmtlcnNcbiAqICAgMi4gRVhFQ1VURSAgIOKAlCBydW4gc3RhZ2UgZm4sIGNvbW1pdCwgYnJlYWsgY2hlY2tcbiAqICAgMy4gRFlOQU1JQyAgIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiwgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbiwgc3RydWN0dXJlIHVwZGF0ZXNcbiAqICAgNC4gQ0hJTERSRU4gIOKAlCBmb3JrL3NlbGVjdG9yL2RlY2lkZXIgZGlzcGF0Y2hcbiAqICAgNS4gQ09OVElOVUUgIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCByZXNvbHV0aW9uXG4gKiAgIDYuIExFQUYgICAgICDigJQgbm8gY29udGludWF0aW9uLCByZXR1cm4gb3V0cHV0XG4gKlxuICogQnJlYWsgc2VtYW50aWNzOiBJZiBhIHN0YWdlIGNhbGxzIGJyZWFrRm4oKSwgY29tbWl0IGFuZCBTVE9QLlxuICogUGF0Y2ggbW9kZWw6IFN0YWdlIHdyaXRlcyBpbnRvIGxvY2FsIHBhdGNoOyBjb21taXRQYXRjaCgpIGFmdGVyIHJldHVybiBvciB0aHJvdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgaXNTdGFnZU5vZGVSZXR1cm4gfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgQ29udGludWF0aW9uUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBEZWNpZGVySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0RlY2lkZXJIYW5kbGVyLmpzJztcbmltcG9ydCB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL05vZGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBSdW50aW1lU3RydWN0dXJlTWFuYWdlciB9IGZyb20gJy4uL2hhbmRsZXJzL1J1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdG9ySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1NlbGVjdG9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCBwcm9wYWdhdGVzIHRvIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuICovXG4gIGV4ZWN1dGlvbkVudj86IGltcG9ydCgnLi4vLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52O1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBuYXJyYXRpdmVFbmFibGVkPzogYm9vbGVhbjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBsb2dnZXI6IElMb2dnZXI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKiogUHJlLWNvbmZpZ3VyZWQgRmxvd1JlY29yZGVycyB0byBhdHRhY2ggd2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZC4gKi9cbiAgZmxvd1JlY29yZGVycz86IEZsb3dSZWNvcmRlcltdO1xuICAvKipcbiAgICogUHJlLWNvbmZpZ3VyZWQgbmFycmF0aXZlIGdlbmVyYXRvci4gSWYgcHJvdmlkZWQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgKiBmbG93UmVjb3JkZXJzIGFuZCBuYXJyYXRpdmVFbmFibGVkLiBVc2VkIGJ5IHRoZSBzdWJmbG93IHRyYXZlcnNlciBmYWN0b3J5XG4gICAqIHRvIHNoYXJlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmUgZ2VuZXJhdG9yIHdpdGggc3ViZmxvdyB0cmF2ZXJzZXJzLlxuICAgKi9cbiAgbmFycmF0aXZlR2VuZXJhdG9yPzogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICAvKipcbiAgICogTWF4aW11bSBuZXN0ZWQgZXhlY3V0ZU5vZGUgZGVwdGggKHRyZWUgbmVzdGluZyDigJQgYnJhbmNoL2ZvcmsgZGlzcGF0Y2ggYW5kXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLCBOT1QgbGluZWFyIGNoYWlucyBvciBsb29wIGl0ZXJhdGlvbnMsIHdoaWNoIHJ1biBmbGF0KS5cbiAgICogRGVmYXVsdHMgdG8gRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIICg1MDApLlxuICAgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGxvb3AgaXRlcmF0aW9ucyBwZXIgbm9kZSAodGhlIENvbnRpbnVhdGlvblJlc29sdmVyIGd1YXJkKS5cbiAgICogRGVmYXVsdHMgdG8gREVGQVVMVF9NQVhfSVRFUkFUSU9OUyAoMTAwMCkuIFByb3BhZ2F0ZWQgdG8gc3ViZmxvd1xuICAgKiB0cmF2ZXJzZXJzLiBNdXN0IGJlID49IDEuXG4gICAqL1xuICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHNldCB0aGlzIHRvIHRoZSBzdWJmbG93J3MgSUQuXG4gICAqIFByb3BhZ2F0ZWQgdG8gVHJhdmVyc2FsQ29udGV4dCBzbyBuYXJyYXRpdmUgZW50cmllcyBjYXJyeSB0aGUgY29ycmVjdCBzdWJmbG93SWQuXG4gICAqL1xuICBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgZnJvbSBwYXJlbnQgdHJhdmVyc2VyLiBTdWJmbG93cyBjb250aW51ZSB0aGUgcGFyZW50J3MgbnVtYmVyaW5nLiAqL1xuICBleGVjdXRpb25Db3VudGVyPzogeyB2YWx1ZTogbnVtYmVyIH07XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBmcm9tIGEgY2hlY2twb2ludCwgb24gdGhlIHJlc3VtZSBwYXRoLlxuICAgKiBGb3J3YXJkZWQgdG8gYEhhbmRsZXJEZXBzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWVgIHNvIFN1YmZsb3dFeGVjdXRvclxuICAgKiBjYW4gcmUtc2VlZCBuZXN0ZWQgcnVudGltZXMgZnJvbSBwcmUtcGF1c2Ugc3RhdGUgaW5zdGVhZCBvZiBydW5uaW5nXG4gICAqIHRoZSBpbnB1dE1hcHBlci4gVW5kZWZpbmVkIG9uIG5vcm1hbCBgcnVuKClgIHBhdGhzLlxuICAgKi9cbiAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqXG4gICAqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFRocmVhZGVkIGludG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dFxuICAgKiB0aGlzIHRyYXZlcnNlciBwcm9kdWNlcyBzbyByZWNvcmRlcnMgY2FuIHNjb3BlIHN0YXRlIHRvIGEgc2luZ2xlIHJ1bi5cbiAgICogU3ViZmxvdyB0cmF2ZXJzZXJzIGluaGVyaXQgdGhlIHBhcmVudCdzIHJ1bklkICh0aGUgc3ViZmxvdyBpcyBwYXJ0IG9mXG4gICAqIHRoZSBzYW1lIHJ1biBmcm9tIHRoZSBjb25zdW1lcidzIFBPVikuIFJlcXVpcmVkIGZpZWxkIOKAlCBldmVyeSBldmVudFxuICAgKiBuZWVkcyBpdC4gU2VlIGBydW5uZXIvcnVuSWQudHNgLlxuICAgKi9cbiAgcnVuSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXItbG9jYWwgb3ZlcmxheSBlbnRyeSBmb3IgYSBub2RlIHdob3NlIHN0YWdlIGZ1bmN0aW9uIHJldHVybmVkIGFcbiAqIFN0YWdlTm9kZSAoZHluYW1pYyBjb250aW51YXRpb24pLiBIb2xkcyB0aGUgZHluYW1pYyB2YWx1ZXMgdGhhdCBlYXJsaWVyXG4gKiB2ZXJzaW9ucyB3cm90ZSBESVJFQ1RMWSBvbnRvIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnQgbm9kZSDigJQgd2hpY2ggbGVha2VkIHRoZVxuICogZHluYW1pYyBzaGFwZSBpbnRvIGV2ZXJ5IGxhdGVyIHJ1biBvZiB0aGUgc2FtZSBidWlsdCBjaGFydCBhbmQgcmFjZWRcbiAqIGNvbmN1cnJlbnQgZXhlY3V0b3JzLiBUaGUgb3ZlcmxheSBrZWVwcyB0aGUgYnVpbHQgZ3JhcGggaW1tdXRhYmxlOiBwYXRjaGVzXG4gKiBsaXZlIGluIGEgcGVyLXRyYXZlcnNlciBNYXAga2V5ZWQgYnkgYG5vZGUuaWRgIGFuZCBkaWUgd2l0aCB0aGUgcnVuLlxuICpcbiAqIGBuZXh0YCBpcyBpbnRlbnRpb25hbGx5IEFCU0VOVDogYSBkeW5hbWljIGBuZXh0YCBvbmx5IGV2ZXIgYXBwbGllcyB0byB0aGVcbiAqIHZpc2l0IHRoYXQgcHJvZHVjZWQgaXQgKHRoZSBvbGQgY29kZSB3cm90ZSBgbm9kZS5uZXh0YCBhbmQgcmVzdG9yZWQgaXRcbiAqIGJlZm9yZSBhbnl0aGluZyBjb3VsZCBvYnNlcnZlIHRoZSB3cml0ZSksIHNvIGl0IHN0YXlzIGEgbG9jYWwgdmFyaWFibGUgaW5cbiAqIGBleGVjdXRlTm9kZWAgYW5kIGlzIHJvdXRlZCB0aHJvdWdoIGBDb250aW51YXRpb25SZXNvbHZlcmAgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY05vZGVQYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFN1YmZsb3cgbW91bnQgbWV0YWRhdGEgZnJvbSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4uIEdyb3VwZWQgc28gdGhlXG4gICAqIG1lcmdlZCB2aWV3IHJlcHJvZHVjZXMgdGhlIG9sZCBmaWVsZC13aXNlIG92ZXJ3cml0ZSBleGFjdGx5IOKAlCBpbmNsdWRpbmdcbiAgICogYHN1YmZsb3dOYW1lYC9gc3ViZmxvd01vdW50T3B0aW9uc2AgYmVjb21pbmcgdW5kZWZpbmVkIHdoZW4gdGhlIGR5bmFtaWNcbiAgICogcmV0dXJuIG9taXR0ZWQgdGhlbS5cbiAgICovXG4gIHN1YmZsb3dNZXRhPzoge1xuICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWU7XG4gICAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzdWJmbG93TW91bnRPcHRpb25zOiBTdWJmbG93TW91bnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogRHluYW1pYyBmb3JrIGNoaWxkcmVuIChyZXBsYWNlcyB0aGUgYnVpbHQgbm9kZSdzIGNoaWxkcmVuIGZvciB0aGlzIHJ1bikuICovXG4gIGNoaWxkcmVuPzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgLyoqIER5bmFtaWMgb3V0cHV0LWJhc2VkIHNlbGVjdG9yIGFjY29tcGFueWluZyBkeW5hbWljIGNoaWxkcmVuLiAqL1xuICBuZXh0Tm9kZVNlbGVjdG9yPzogU2VsZWN0b3I7XG59XG5cbi8qKlxuICogVHJhbXBvbGluZSBicmFuZCDigJQgbWFya3MgYSBjb250aW51YXRpb24gaG9wIHJldHVybmVkIGJ5IGBleGVjdXRlTm9kZVN0ZXBgXG4gKiB0byB0aGUgZHJpdmVyIGxvb3AgaW4gYGV4ZWN1dGVOb2RlYC4gTW9kdWxlLXByaXZhdGUgc3ltYm9sIHNvIGEgc3RhZ2UncyBvd25cbiAqIHJldHVybiB2YWx1ZSAod2hpY2ggY2FuIGJlIGFueSBvYmplY3QpIGNhbiBuZXZlciBiZSBtaXN0YWtlbiBmb3IgYSBob3AuXG4gKi9cbmNvbnN0IENPTlRJTlVFX0hPUDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnZm9vdHByaW50anMuZXhlY3V0ZU5vZGUuY29udGludWUnKTtcblxuLyoqXG4gKiBBIGZsYXQgY29udGludWF0aW9uIOKAlCBcImV4ZWN1dGUgdGhpcyBub2RlIG5leHQsIGluIHRoaXMgY29udGV4dFwiIOKAlCByZXR1cm5lZFxuICogYnkgYGV4ZWN1dGVOb2RlU3RlcGAgZm9yIGV2ZXJ5IFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wXG4gKiBlZGdlcywgZHluYW1pYyBuZXh0LCBkeW5hbWljLXN1YmZsb3cgcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyXG4gKiBkaXNwYXRjaCkuIFRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgIGNvbnN1bWVzIGhvcHMgaXRlcmF0aXZlbHk6XG4gKiBgY3VycmVudCA9IGhvcDsgY29udGludWU7YCDigJQgc28gbmVpdGhlciB0aGUgY2FsbCBzdGFjayBub3IgdGhlIHJldGFpbmVkXG4gKiBwcm9taXNlIGNoYWluIGdyb3dzIHdpdGggY2hhaW4gbGVuZ3RoIG9yIGxvb3AgaXRlcmF0aW9ucy5cbiAqL1xuaW50ZXJmYWNlIENvbnRpbnVhdGlvbkhvcDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcmVhZG9ubHkgW0NPTlRJTlVFX0hPUF06IHRydWU7XG4gIHJlYWRvbmx5IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICByZWFkb25seSBjb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHJlYWRvbmx5IGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGlzIGEgZGVjaWRlcidzIGJyYW5jaCBkaXNwYXRjaCAoZGVjaWRlciB3aXRob3V0IGl0c1xuICAgKiBvd24gYG5leHRgKS4gVGhlIGRyaXZlciByZWNvcmRzIGl0IHNvIGEgUGF1c2VTaWduYWwgdGhyb3duIGFueXdoZXJlIGluXG4gICAqIHRoZSBjb250aW51ZWQgY2hhaW4gc3RpbGwgZ2V0cyB0aGUgZGVjaWRlciBzdGFtcGVkIGFzIGl0cyBpbnZva2VyIOKAlFxuICAgKiBleGFjdGx5IHdoYXQgdGhlIHJlY3Vyc2l2ZSBkaXNwYXRjaCdzIGNhdGNoIHVzZWQgdG8gZG8uXG4gICAqL1xuICByZWFkb25seSBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXA7XG59XG5cbi8qKiBQYXVzZS1pbnZva2VyIGNvbnRleHQgcmVjb3JkZWQgYnkgdGhlIGRyaXZlciBmb3IgZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMuICovXG5pbnRlcmZhY2UgSW52b2tlclN0YW1wIHtcbiAgcmVhZG9ubHkgaW52b2tlclN0YWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGludWF0aW9uU3RhZ2VJZD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtDT05USU5VRV9IT1BdID09PSB0cnVlO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBwcml2YXRlIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBGcm96ZW4gdmFsdWUgcGFzc2VkIHZpYSBgcnVuKHtpbnB1dH0pYC4gU3VyZmFjZWQgb24gYG9uUnVuU3RhcnRgIGF0IHRoZVxuICAgKiAgdG9wLWxldmVsIHRyYXZlcnNhbCBzbyBjb25zdW1lcnMgKGUuZy4gYEluT3V0UmVjb3JkZXJgKSBjYW4gYnJhY2tldFxuICAgKiAgdGhlIHJ1biB3aXRoIHRoZSBzYW1lIHBheWxvYWQgc2hhcGUgdGhhdCBzdWJmbG93cyBhbHJlYWR5IGhhdmUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cnVjdHVyZU1hbmFnZXI6IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5hcnJhdGl2ZUdlbmVyYXRvcjogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRXhlY3V0aW9uIHN0YXRlXG4gIHByaXZhdGUgc3ViZmxvd1Jlc3VsdHM6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIHNldCBvZiBsYXp5IHN1YmZsb3cgSURzIHRoYXQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IFRISVMgcnVuLlxuICAgKiBVc2VkIGluc3RlYWQgb2Ygd3JpdGluZyBgbm9kZS5zdWJmbG93UmVzb2x2ZXIgPSB1bmRlZmluZWRgIGJhY2sgdG8gdGhlIHNoYXJlZFxuICAgKiBTdGFnZU5vZGUgZ3JhcGgg4oCUIGF2b2lkcyBhIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50IHRyYXZlcnNlciBjbGVhcnMgdGhlIHNoYXJlZFxuICAgKiByZXNvbHZlciBiZWZvcmUgYW5vdGhlciB0cmF2ZXJzZXIgaGFzIGZpbmlzaGVkIHVzaW5nIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZExhenlTdWJmbG93cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIG92ZXJsYXkgb2YgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJucywga2V5ZWQgYnkgYG5vZGUuaWRgLlxuICAgKiBQaGFzZSA0IHdyaXRlcyBwYXRjaGVzIEhFUkUgaW5zdGVhZCBvZiBtdXRhdGluZyB0aGUgc2hhcmVkIGJ1aWx0LWNoYXJ0XG4gICAqIG5vZGUgb2JqZWN0cyAoc2FtZSBpc29sYXRpb24gY29udmVudGlvbiBhcyBgcmVzb2x2ZWRMYXp5U3ViZmxvd3NgKS5cbiAgICogQWxsIGVuZ2luZSByZWFkcyBvZiB0aGUgcGF0Y2hlZCBmaWVsZHMgZ28gdGhyb3VnaCB0aGUgYGVmZipgIGFjY2Vzc29yc1xuICAgKiBiZWxvdy4gVGhlIG1hcCBkaWVzIHdpdGggdGhlIHRyYXZlcnNlciDigJQgb25lIHJ1biwgb25lIG92ZXJsYXkg4oCUIHNvIGFcbiAgICogZnJlc2ggZXhlY3V0b3Igb3ZlciB0aGUgc2FtZSBidWlsdCBjaGFydCBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgZ3JhcGguXG4gICAqXG4gICAqIEtleWVkIGJ5IHRoZSBub2RlIE9CSkVDVCAoV2Vha01hcCksIG5vdCBgbm9kZS5pZGA6IGEgZHluYW1pYyBjaGlsZCB0aGF0XG4gICAqIHJldXNlcyBhIGJ1aWx0IG5vZGUncyBpZCBtdXN0IE5PVCBtYWtlIHRoZSBidWlsdCBub2RlIGluaGVyaXQgdGhlIHBhdGNoXG4gICAqIChpZC1rZXllZCBsb29rdXAgY2F1c2VkIHBoYW50b20gZG91YmxlLWV4ZWN1dGlvbikuIGBwYXRjaENvdW50YCBpcyB0aGVcbiAgICogZmFzdC1wYXRoIGNoZWNrIOKAlCBXZWFrTWFwIGhhcyBubyBgc2l6ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNQYXRjaGVzID0gbmV3IFdlYWtNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPj4oKTtcbiAgcHJpdmF0ZSBwYXRjaENvdW50ID0gMDtcblxuICAvKipcbiAgICogVFJFRS1uZXN0aW5nIGRlcHRoIGNvdW50ZXIgZm9yIGV4ZWN1dGVOb2RlICh0aGUgdHJhbXBvbGluZSBkcml2ZXIpLlxuICAgKiBFYWNoIGRyaXZlciBpbnZvY2F0aW9uIGluY3JlbWVudHMgdGhpczsgZGVjcmVtZW50cyBvbiBleGl0ICh0cnkvZmluYWxseSkuXG4gICAqXG4gICAqIExpbmVhciBgbmV4dGAgY2hhaW5zLCBsb29wIGVkZ2VzLCBhbmQgZHluYW1pYyBjb250aW51YXRpb25zIGFyZSBmb2xsb3dlZFxuICAgKiBJVEVSQVRJVkVMWSBpbnNpZGUgb25lIGRyaXZlciBpbnZvY2F0aW9uLCBzbyB0aGV5IG5ldmVyIGdyb3cgdGhpc1xuICAgKiBjb3VudGVyLiBPbmx5IHRydWUgdHJlZSByZWN1cnNpb24gZG9lczogZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvclxuICAgKiBicmFuY2ggZGlzcGF0Y2ggKHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gY29udGludWF0aW9uKSwgYW5kXG4gICAqIHVuYm91bmRlZCBkeW5hbWljIHJlY3Vyc2lvbi4gUHJldmVudHMgY2FsbC1zdGFjayBvdmVyZmxvdyBvbiBydW5hd2F5XG4gICAqIHJlY3Vyc2l2ZSBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2V4ZWN1dGVEZXB0aCA9IDA7XG5cbiAgLyoqXG4gICAqIE1lbW9pemVkIHBhcmVudC1jaGFpbiBkZXB0aCBwZXIgU3RhZ2VDb250ZXh0LiBUaGUgY29udGV4dCB0cmVlIGRlZXBlbnNcbiAgICogYnkgb25lIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBhIGNoYWluLCBzbyB0aGUgbmFpdmUgcGFyZW50LXdhbGsgaW5cbiAgICogYGNvbXB1dGVDb250ZXh0RGVwdGhgIGlzIE8oY2hhaW4gbGVuZ3RoKSBwZXIgc3RhZ2Ug4oCUIE8obsKyKSBwZXIgcnVuIG9uY2VcbiAgICogdGhlIHRyYW1wb2xpbmUgYWxsb3dzIGNoYWlucyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZiBzdGFnZXMuIENvbnRleHRzXG4gICAqIGFyZSB2aXNpdGVkIHBhcmVudC1iZWZvcmUtY2hpbGQsIHNvIHRoZSBtZW1vIG1ha2VzIGVhY2ggbG9va3VwIE8oMSlcbiAgICogYW1vcnRpemVkLiBXZWFrTWFwIOKAlCBkaWVzIHdpdGggdGhlIHRyYXZlcnNlci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dERlcHRoQ2FjaGUgPSBuZXcgV2Vha01hcDxTdGFnZUNvbnRleHQsIG51bWJlcj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIG1heGltdW0gZGVwdGggKHNldCBmcm9tIFRyYXZlcnNlck9wdGlvbnMubWF4RGVwdGggb3IgdGhlIGNsYXNzIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4RGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIGxvb3AtaXRlcmF0aW9uIGxpbWl0IGZvcndhcmRlZCB0byB0aGUgQ29udGludWF0aW9uUmVzb2x2ZXJcbiAgICogYW5kIHByb3BhZ2F0ZWQgdG8gc3ViZmxvdyB0cmF2ZXJzZXJzLiBVbmRlZmluZWQg4oaSIHJlc29sdmVyIGRlZmF1bHQgKDEwMDApLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIG5lc3RlZCBleGVjdXRlTm9kZSBkZXB0aCBiZWZvcmUgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKlxuICAgKiAqKldoYXQgY291bnRzIGFzIGRlcHRoICh0cmFtcG9saW5lIG1vZGVsKToqKiBgZXhlY3V0ZU5vZGVgIGlzIGFuIGl0ZXJhdGl2ZVxuICAgKiBkcml2ZXIg4oCUIGxpbmVhciBgbmV4dGAgaG9wcywgbG9vcCBlZGdlcyAoYGxvb3BUb2AvZHluYW1pYyBuZXh0KSwgYW5kXG4gICAqIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSBhcmUgZm9sbG93ZWQgaW4gYSBmbGF0IGxvb3AgYW5kIGNvbnN1bWUgTk8gZGVwdGguXG4gICAqIERlcHRoIGdyb3dzIG9ubHkgd2l0aCB0cnVlIHRyZWUgbmVzdGluZzogb25lIHRpY2sgcGVyIGZvcmsgY2hpbGQsIG9uZSBwZXJcbiAgICogZGVjaWRlci9zZWxlY3RvciBicmFuY2ggZGlzcGF0Y2ggdGhhdCBtdXN0IHJldHVybiB0byBpdHMgaW52b2tlciAoZGVjaWRlclxuICAgKiB3aXRoIGl0cyBvd24gYG5leHRgKSwgb25lIHBlciBzdWJmbG93IG1vdW50IGZyYW1lIGluIHRoZSBwYXJlbnQgKHRoZVxuICAgKiBzdWJmbG93IGJvZHkgaXRzZWxmIHJ1bnMgb24gYSBGUkVTSCB0cmF2ZXJzZXIgd2l0aCBpdHMgb3duIGJ1ZGdldCkuXG4gICAqXG4gICAqIDUwMCB0aGVyZWZvcmUgY292ZXJzIGFueSByZWFsaXN0aWMgY2hhcnQg4oCUIGl0IGJvdW5kcyByZWN1cnNpdmVcbiAgICogQ09NUE9TSVRJT04sIG5vdCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC4gTG9vcHMgYXJlIGJvdW5kZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCdzIGluZGVwZW5kZW50IGl0ZXJhdGlvbiBsaW1pdCAoZGVmYXVsdCAxMDAwLFxuICAgKiBjb25maWd1cmFibGUgdmlhIGBSdW5PcHRpb25zLm1heEl0ZXJhdGlvbnNgKSwgd2hpY2ggaXMgbm93IHRoZSBiaW5kaW5nXG4gICAqIGNvbnN0cmFpbnQgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3Qgc2FmZSBmb3IgY29uY3VycmVudCBgLmV4ZWN1dGUoKWAgY2FsbHMgb24gdGhlIHNhbWUgaW5zdGFuY2Ug4oCUIGNvbmN1cnJlbnRcbiAgICogZXhlY3V0aW9ucyByYWNlIG9uIGBfZXhlY3V0ZURlcHRoYC4gVXNlIGEgc2VwYXJhdGUgYEZsb3djaGFydFRyYXZlcnNlcmAgcGVyIGNvbmN1cnJlbnRcbiAgICogZXhlY3V0aW9uLiBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFsd2F5cyBjcmVhdGVzIGEgZnJlc2ggdHJhdmVyc2VyIHBlciBjYWxsLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9FWEVDVVRFX0RFUFRIID0gNTAwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPikge1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0cy5tYXhEZXB0aCA/PyBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEg7XG4gICAgaWYgKG1heERlcHRoIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heERlcHRoIG11c3QgYmUgPj0gMScpO1xuICAgIHRoaXMuX21heERlcHRoID0gbWF4RGVwdGg7XG4gICAgaWYgKG9wdHMubWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWF4SXRlcmF0aW9ucyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhJdGVyYXRpb25zIG11c3QgYmUgPj0gMScpO1xuICAgIH1cbiAgICB0aGlzLl9tYXhJdGVyYXRpb25zID0gb3B0cy5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSBvcHRzLmV4ZWN1dGlvbkNvdW50ZXIgPz8geyB2YWx1ZTogMCB9O1xuICAgIHRoaXMucm9vdCA9IG9wdHMucm9vdDtcbiAgICAvLyBTaGFsbG93LWNvcHkgc3RhZ2VNYXAgYW5kIHN1YmZsb3dzIHNvIHRoYXQgbGF6eS1yZXNvbHV0aW9uIG11dGF0aW9uc1xuICAgIC8vIChwcmVmaXhlZCBlbnRyaWVzIGFkZGVkIGR1cmluZyBleGVjdXRpb24pIHN0YXkgc2NvcGVkIHRvIFRISVMgdHJhdmVyc2VyXG4gICAgLy8gYW5kIGRvIG5vdCBlc2NhcGUgdG8gdGhlIHNoYXJlZCBGbG93Q2hhcnQgb2JqZWN0LiBXaXRob3V0IHRoZSBjb3B5LFxuICAgIC8vIGNvbmN1cnJlbnQgRmxvd0NoYXJ0RXhlY3V0b3IgcnVucyBzaGFyaW5nIHRoZSBzYW1lIEZsb3dDaGFydCB3b3VsZCByYWNlXG4gICAgLy8gb24gdGhlc2UgdHdvIG11dGFibGUgZGljdGlvbmFyaWVzLlxuICAgIHRoaXMuc3RhZ2VNYXAgPSBuZXcgTWFwKG9wdHMuc3RhZ2VNYXApO1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZSA9IG9wdHMuZXhlY3V0aW9uUnVudGltZTtcbiAgICB0aGlzLnN1YmZsb3dzID0gb3B0cy5zdWJmbG93cyA/IHsgLi4ub3B0cy5zdWJmbG93cyB9IDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlcjtcbiAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgIHRoaXMucGFyZW50U3ViZmxvd0lkID0gb3B0cy5wYXJlbnRTdWJmbG93SWQ7XG4gICAgdGhpcy5yZWFkT25seUNvbnRleHQgPSBvcHRzLnJlYWRPbmx5Q29udGV4dDtcbiAgICB0aGlzLnJ1bklkID0gb3B0cy5ydW5JZDtcblxuICAgIC8vIFN0cnVjdHVyZSBtYW5hZ2VyIChkZWVwLWNsb25lcyBidWlsZC10aW1lIHN0cnVjdHVyZSlcbiAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIgPSBuZXcgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIoKTtcbiAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuaW5pdChvcHRzLmJ1aWxkVGltZVN0cnVjdHVyZSk7XG5cbiAgICAvLyBOYXJyYXRpdmUgZ2VuZXJhdG9yXG4gICAgLy8gUHJpb3JpdHk6IGV4cGxpY2l0IG5hcnJhdGl2ZUdlbmVyYXRvciA+IGZsb3dSZWNvcmRlcnMgPiBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciA+IG51bGwuXG4gICAgLy8gU3ViZmxvdyB0cmF2ZXJzZXJzIHJlY2VpdmUgdGhlIHBhcmVudCdzIG5hcnJhdGl2ZUdlbmVyYXRvciBzbyBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlLlxuICAgIGlmIChvcHRzLm5hcnJhdGl2ZUdlbmVyYXRvcikge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBvcHRzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcbiAgICB9IGVsc2UgaWYgKG9wdHMubmFycmF0aXZlRW5hYmxlZCkge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IG5ldyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyKCk7XG4gICAgICB0aGlzLmZsb3dSZWNvcmRlckRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuXG4gICAgICAvLyBJZiBjdXN0b20gRmxvd1JlY29yZGVycyBhcmUgcHJvdmlkZWQsIHVzZSB0aGVtOyBvdGhlcndpc2UgYXR0YWNoIGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyXG4gICAgICBpZiAob3B0cy5mbG93UmVjb3JkZXJzICYmIG9wdHMuZmxvd1JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkZXIgb2Ygb3B0cy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gocmVjb3JkZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChuZXcgTmFycmF0aXZlRmxvd1JlY29yZGVyKCkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IGRpc3BhdGNoZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gbmV3IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvcigpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHNoYXJlZCBkZXBzIGJhZ1xuICAgIGNvbnN0IGRlcHMgPSB0aGlzLmNyZWF0ZURlcHMob3B0cyk7XG5cbiAgICAvLyBCdWlsZCBPKDEpIG5vZGUgSUQgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGggKGF2b2lkcyByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkpXG4gICAgY29uc3Qgbm9kZUlkTWFwID0gdGhpcy5idWlsZE5vZGVJZE1hcChvcHRzLnJvb3QpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVyIG1vZHVsZXMuXG4gICAgLy8gTm9kZVJlc29sdmVyJ3MgREZTIGZhbGxiYWNrIHJlc29sdmVzIGxvb3AgdGFyZ2V0cyBhZ2FpbnN0IHRoZSBMSVZFXG4gICAgLy8gcnVudGltZSBzaGFwZSwgc28gaXQgcmVhZHMgY2hpbGRyZW4gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5XG4gICAgLy8gKGEgbG9vcCBjYW4gdGFyZ2V0IGEgbm9kZSBhZGRlZCBieSBhIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybikuXG4gICAgdGhpcy5ub2RlUmVzb2x2ZXIgPSBuZXcgTm9kZVJlc29sdmVyKGRlcHMsIG5vZGVJZE1hcCwgKG4pID0+IHRoaXMuZWZmQ2hpbGRyZW4obikpO1xuICAgIHRoaXMuY2hpbGRyZW5FeGVjdXRvciA9IG5ldyBDaGlsZHJlbkV4ZWN1dG9yKGRlcHMsIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zdGFnZVJ1bm5lciA9IG5ldyBTdGFnZVJ1bm5lcihkZXBzKTtcbiAgICB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyID0gbmV3IENvbnRpbnVhdGlvblJlc29sdmVyKFxuICAgICAgZGVwcyxcbiAgICAgIHRoaXMubm9kZVJlc29sdmVyLFxuICAgICAgKG5vZGVJZCwgY291bnQpID0+IHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVJdGVyYXRpb25Db3VudChub2RlSWQsIGNvdW50KSxcbiAgICAgIHRoaXMuX21heEl0ZXJhdGlvbnMsXG4gICAgKTtcbiAgICB0aGlzLmRlY2lkZXJIYW5kbGVyID0gbmV3IERlY2lkZXJIYW5kbGVyKGRlcHMpO1xuICAgIHRoaXMuc2VsZWN0b3JIYW5kbGVyID0gbmV3IFNlbGVjdG9ySGFuZGxlcihkZXBzLCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IpO1xuICAgIHRoaXMuc3ViZmxvd0V4ZWN1dG9yID0gbmV3IFN1YmZsb3dFeGVjdXRvcihkZXBzLCB0aGlzLmNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KG9wdHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgcHJvZHVjZXMgRmxvd2NoYXJ0VHJhdmVyc2VyIGluc3RhbmNlcyBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gICAqIENhcHR1cmVzIHBhcmVudCBjb25maWcgaW4gY2xvc3VyZSDigJQgU3ViZmxvd0V4ZWN1dG9yIHByb3ZpZGVzIHN1YmZsb3ctc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICAgKiBFYWNoIHN1YmZsb3cgZ2V0cyBhIGZ1bGwgdHJhdmVyc2VyIHdpdGggYWxsIDcgcGhhc2VzIChkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgZXRjLikuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KFxuICAgIHBhcmVudE9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPixcbiAgKTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gQ2FwdHVyZSByZWZlcmVuY2VzIHRvIG11dGFibGUgc3RhdGUg4oCUIGZhY3RvcnkgcmVhZHMgdGhlIENVUlJFTlQgc3RhdGUgd2hlbiBjYWxsZWQsXG4gICAgLy8gbm90IHRoZSBzdGF0ZSBhdCBmYWN0b3J5IGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIGxhenkgc3ViZmxvdyByZXNvbHV0aW9uXG4gICAgLy8gbWF5IGFkZCBlbnRyaWVzIHRvIHN0YWdlTWFwL3N1YmZsb3dzIGJlZm9yZSBhIG5lc3RlZCBzdWJmbG93IGlzIGVuY291bnRlcmVkLlxuICAgIGNvbnN0IHBhcmVudFN0YWdlTWFwID0gdGhpcy5zdGFnZU1hcDtcbiAgICBjb25zdCBwYXJlbnRTdWJmbG93cyA9IHRoaXMuc3ViZmxvd3M7XG4gICAgY29uc3QgbmFycmF0aXZlR2VuZXJhdG9yID0gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3I7XG5cbiAgICByZXR1cm4gKHN1YmZsb3dPcHRzKSA9PiB7XG4gICAgICBjb25zdCB0cmF2ZXJzZXIgPSBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgICByb290OiBzdWJmbG93T3B0cy5yb290LFxuICAgICAgICBzdGFnZU1hcDogcGFyZW50U3RhZ2VNYXAsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgc2NvcGVGYWN0b3J5OiBwYXJlbnRPcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd09wdHMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBzdWJmbG93T3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogcGFyZW50T3B0cy5leGVjdXRpb25FbnYsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudE9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudE9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IHBhcmVudE9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IHBhcmVudFN1YmZsb3dzLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvciwgLy8gU2hhcmUgcGFyZW50J3Mg4oCUIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2VcbiAgICAgICAgbG9nZ2VyOiBwYXJlbnRPcHRzLmxvZ2dlcixcbiAgICAgICAgc2lnbmFsOiBwYXJlbnRPcHRzLnNpZ25hbCxcbiAgICAgICAgbWF4RGVwdGg6IHRoaXMuX21heERlcHRoLFxuICAgICAgICAuLi4odGhpcy5fbWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9uczogdGhpcy5fbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIC8vIFNoYXJlIGNvdW50ZXIg4oCUIHN1YmZsb3cgY29udGludWVzIGdsb2JhbCBudW1iZXJpbmdcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gRm9yd2FyZCB0aGUgcmVzdW1lLW9ubHkgc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBzbyBuZXN0ZWRcbiAgICAgICAgLy8gU3ViZmxvd0V4ZWN1dG9ycyBjYW4gcmUtc2VlZCBkZWVwZXItbmVzdGVkIHJ1bnRpbWVzIChlLmcuXG4gICAgICAgIC8vIFNlcXVlbmNlKEFnZW50KC4uLikpIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLihwYXJlbnRPcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHBhcmVudE9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICByZWFkT25seUNvbnRleHQ6IG9wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgZXhlY3V0aW9uRW52OiBvcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvcjogdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgIC4uLihvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGRzIHRoZSB0b3AtbGV2ZWwgYnJlYWsgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIGBleGVjdXRlKClgLiBLZXB0IGFzXG4gICAqIGEgZmllbGQgKG5vdCBhIGxvY2FsKSBzbyBgZ2V0QnJlYWtTdGF0ZSgpYCBjYW4gc3VyZmFjZSB0aGUgZmluYWwgc3RhdGVcbiAgICogZm9yIGNhbGxlcnMgbGlrZSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGF0IGltcGxlbWVudCBgcHJvcGFnYXRlQnJlYWtgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9wQnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgdGhpcy5fdG9wQnJlYWtGbGFnID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiAnX19yb290X18nLFxuICAgICAgcnVudGltZVN0YWdlSWQ6ICdfX3Jvb3RfXyMwJyxcbiAgICAgIHN0YWdlTmFtZTogJ19fcm9vdF9fJyxcbiAgICAgIGRlcHRoOiAwLFxuICAgIH07XG4gICAgaWYgKGlzVG9wTGV2ZWwpIHtcbiAgICAgIC8vIGByZWFkT25seUNvbnRleHRgIGlzIHRoZSBlbmdpbmUncyB2aWV3IG9mIGBydW4oe2lucHV0fSlgIOKAlCBwYXNzZWRcbiAgICAgIC8vIHRocm91Z2ggZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFzIHRoZSB2YWxpZGF0ZWQgaW5wdXQuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1blN0YXJ0KHRoaXMucmVhZE9ubHlDb250ZXh0LCByb290Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gVG9wLWxldmVsIHJ1bnMgY2xvc2UgdGhlaXIgYm91bmRhcnkgU1lNTUVUUklDQUxMWTogZXZlcnkgb25SdW5TdGFydFxuICAgIC8vIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIG9uUnVuRW5kIChjbGVhbikgb3Igb25SdW5GYWlsZWQgKGVycm9yKS5cbiAgICAvLyBXaXRob3V0IHRoZSBjYXRjaCwgYSB0aHJvd24gcnVuIGZpcmVkIG9uUnVuU3RhcnQgdGhlbiBub3RoaW5nIOKAlCBhXG4gICAgLy8gbW9uaXRvciBjb3VsZG4ndCB0ZWxsIFwic3RpbGwgcnVubmluZ1wiIGZyb20gXCJjcmFzaGVkLlwiIFBhdXNlIGlzIE5PVFxuICAgIC8vIGFuIGVycm9yIChpdCdzIGV4cGVjdGVkIHN1c3BlbnNpb24pLCBzbyBpdCBza2lwcyBvblJ1bkZhaWxlZCBhbmRcbiAgICAvLyByZS10aHJvd3MgdW50b3VjaGVkLiBUaGUgc3RhZ2UtbGV2ZWwgY2F0Y2ggYWxyZWFkeSByZWNvcmRlZCB0aGVcbiAgICAvLyBmYWlsaW5nIHN0YWdlIChvbkVycm9yICsgY29tbWl0KTsgdGhpcyBhZGRzIHRoZSBydW4tbGV2ZWwgdGVybWluYWxcbiAgICAvLyBzaWduYWwuIFRoZSBlcnJvciBzdGlsbCBwcm9wYWdhdGVzIOKAlCB0aGlzIGlzIG9ic2VydmF0aW9uLCBub3RcbiAgICAvLyByZWNvdmVyeS4gU3ViZmxvdyB0cmF2ZXJzZXJzIGRvbid0IGZpcmUgcnVuIGV2ZW50czsgdGhlaXIgZXJyb3JzXG4gICAgLy8gYnViYmxlIHVwIGFuZCBzdXJmYWNlIGhlcmUgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICBpZiAoIWlzVG9wTGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVOb2RlKHRoaXMucm9vdCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHRoaXMucm9vdCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChleHRyYWN0RXJyb3JJbmZvKGVycm9yKSwgcm9vdENvbnRleHQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRW5kKHJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnJlYWsgc3RhdGUgY2FwdHVyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgbW9zdCByZWNlbnQgYGV4ZWN1dGUoKWAuXG4gICAqIGBzaG91bGRCcmVha2AgaXMgdHJ1ZSB3aGVuIGEgc3RhZ2UgY2FsbGVkIGBzY29wZS4kYnJlYWsocmVhc29uKWA7IHRoZVxuICAgKiBvcHRpb25hbCBgcmVhc29uYCBjYXJyaWVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIHByb3BhZ2F0ZSBhbiBpbm5lciBzdWJmbG93J3MgYnJlYWsgdXAgdG9cbiAgICogdGhlIHBhcmVudCB0cmF2ZXJzZXIgd2hlbiB0aGUgbW91bnQgc2V0cyBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdG9wQnJlYWtGbGFnIH07XG4gIH1cblxuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlTWFuYWdlci5nZXRTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyk7XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICkge1xuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGlzIGFzc2lnbmVkIGluIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24sXG4gICAgLy8gZW5zdXJpbmcgc2NvcGUgZXZlbnRzIGFuZCBmbG93IGV2ZW50cyB1c2UgdGhlIHNhbWUgdmFsdWUuXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gIH1cblxuICAvKipcbiAgICogVHJhbXBvbGluZSBkcml2ZXIg4oCUIHByZS1vcmRlciBERlMgdHJhdmVyc2FsIGVudHJ5IHBvaW50LlxuICAgKlxuICAgKiBSdW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpbiBhIGZsYXQgbG9vcDogZXZlcnlcbiAgICogVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZSwgZHluYW1pYyBuZXh0IC8gZHluYW1pY1xuICAgKiByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXIgZGlzcGF0Y2gpIGNvbWVzIGJhY2sgYXMgYVxuICAgKiBgQ29udGludWF0aW9uSG9wYCBhbmQgaXMgZm9sbG93ZWQgSVRFUkFUSVZFTFkg4oCUIG5laXRoZXIgdGhlIGNhbGwgc3RhY2tcbiAgICogbm9yIHRoZSByZXRhaW5lZCBwcm9taXNlIGNoYWluIGdyb3dzIHdpdGggY2hhaW4gbGVuZ3RoIG9yIGxvb3AgY291bnQuXG4gICAqXG4gICAqIFJlY3Vyc2lvbiByZW1haW5zIE9OTFkgZm9yIHRydWUgdHJlZSBuZXN0aW5nIChlYWNoIGdldHMgYSBuZXN0ZWQgZHJpdmVyXG4gICAqIGNhbGwpOiBmb3JrIGNoaWxkcmVuIChgQ2hpbGRyZW5FeGVjdXRvcmApLCBzZWxlY3RvciBicmFuY2hlcyAocGFyYWxsZWxcbiAgICogZmFuLW91dCksIGRlY2lkZXIgYnJhbmNoIGRpc3BhdGNoIHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gYG5leHRgXG4gICAqICh0aGUgYnJhbmNoIG11c3QgY29tcGxldGUgQkVGT1JFIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMpLCBhbmRcbiAgICogc3ViZmxvdyBtb3VudHMgKGZyZXNoIHRyYXZlcnNlcjsgdGhlIG1vdW50IGZyYW1lIHN0YXlzIGluIHRoZSBwYXJlbnQpLlxuICAgKiBgX2V4ZWN1dGVEZXB0aGAgdGhlcmVmb3JlIGNvdW50cyBjaGFydCBDT01QT1NJVElPTiBkZXB0aCBvbmx5LCBndWFyZGVkXG4gICAqIGJ5IGBfbWF4RGVwdGhgIChkZWZhdWx0IGBNQVhfRVhFQ1VURV9ERVBUSGAgPSA1MDApLlxuICAgKlxuICAgKiBQYXVzZVNpZ25hbDogYSBmbGF0IGRlY2lkZXIgZGlzcGF0Y2ggcmVjb3JkcyBhbiBgSW52b2tlclN0YW1wYDsgaWYgdGhlXG4gICAqIGNvbnRpbnVlZCBjaGFpbiBsYXRlciBwYXVzZXMsIHRoZSBkcml2ZXIgc3RhbXBzIHRoZSBzaWduYWwgZHVyaW5nXG4gICAqIHVud2luZCDigJQgc2FtZSBpbnZva2VyIGNvbnRleHQgdGhlIHJlY3Vyc2l2ZSBkaXNwYXRjaCdzIGNhdGNoIHVzZWQgdG9cbiAgICogc3RhbXAsIGlubmVybW9zdCAobW9zdCByZWNlbnQgZGlzcGF0Y2gpIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBJbnZva2VyIHN0YW1wcyBmcm9tIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzIGluIFRISVMgZHJpdmVyIOKAlCBrZXB0XG4gICAgLy8gbG9jYWwgc28gbmVzdGVkIGRyaXZlcnMgKGZvcmsgY2hpbGRyZW4sIHdpdGgtbmV4dCBkZWNpZGVyIGJyYW5jaGVzKVxuICAgIC8vIGdldCB0aGVpciBvd24gd2luZG93cywgbWF0Y2hpbmcgdGhlIG9sZCBmcmFtZS1vbi1zdGFjayBzdGFtcGluZyBzY29wZS5cbiAgICBsZXQgcGVuZGluZ0ludm9rZXJzOiBJbnZva2VyU3RhbXBbXSB8IHVuZGVmaW5lZDtcbiAgICAvLyDilIDilIDilIAgVHJlZS1kZXB0aCBndWFyZCDilIDilIDilIBcbiAgICAvLyBUaGUgaW5jcmVtZW50IGlzIGluc2lkZSBgdHJ5YCBzbyBgZmluYWxseWAgYWx3YXlzIGRlY3JlbWVudHMg4oCUIG5vXG4gICAgLy8gZnJhZ2lsZSBnYXAgYmV0d2VlbiBjaGVjayBhbmQgdHJ5IGVudHJ5LlxuICAgIHRyeSB7XG4gICAgICBpZiAoKyt0aGlzLl9leGVjdXRlRGVwdGggPiB0aGlzLl9tYXhEZXB0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZsb3djaGFydFRyYXZlcnNlcjogbWF4aW11bSB0cmF2ZXJzYWwgZGVwdGggZXhjZWVkZWQgKCR7dGhpcy5fbWF4RGVwdGh9KS4gYCArXG4gICAgICAgICAgICAnRGVwdGggY291bnRzIE5FU1RFRCBkaXNwYXRjaCAoZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvciBicmFuY2hlcywgcmVjdXJzaXZlIGNvbXBvc2l0aW9uKSDigJQgJyArXG4gICAgICAgICAgICAnbGluZWFyIGNoYWlucyBhbmQgbG9vcCBpdGVyYXRpb25zIHJ1biBmbGF0IGFuZCBkbyBub3QgY29uc3VtZSBpdC4gJyArXG4gICAgICAgICAgICBgTGFzdCBzdGFnZTogJyR7bm9kZS5uYW1lfScuIGAgK1xuICAgICAgICAgICAgJ0NoZWNrIGZvciB1bmJvdW5kZWQgcmVjdXJzaXZlIGNoYXJ0IGNvbXBvc2l0aW9uLCBvciByYWlzZSB0aGUgbGltaXQgdmlhIFJ1bk9wdGlvbnMubWF4RGVwdGguJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGN1cnJlbnQ6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+ID0geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCB9O1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5pbnZva2VyU3RhbXApIChwZW5kaW5nSW52b2tlcnMgPz89IFtdKS5wdXNoKHJlc3VsdC5pbnZva2VyU3RhbXApO1xuICAgICAgICBjdXJyZW50ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBSZXBsYXkgaW52b2tlciBzdGFtcHMgbW9zdC1yZWNlbnQtZmlyc3QuIGBzZXRJbnZva2VyYCBpc1xuICAgICAgLy8gZmlyc3Qtd3JpdGUtd2lucywgc28gdGhlIGlubmVybW9zdCBkaXNwYXRjaCdzIHN0YW1wIGxhbmRzIOKAlCBleGFjdGx5XG4gICAgICAvLyB0aGUgb2xkIGJ1YmJsZS11cCBvcmRlciB0aHJvdWdoIG5lc3RlZCBjYXRjaCBmcmFtZXMuXG4gICAgICBpZiAocGVuZGluZ0ludm9rZXJzICE9PSB1bmRlZmluZWQgJiYgaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBlbmRpbmdJbnZva2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGVycm9yLnNldEludm9rZXIocGVuZGluZ0ludm9rZXJzW2ldLmludm9rZXJTdGFnZUlkLCBwZW5kaW5nSW52b2tlcnNbaV0uY29udGludWF0aW9uU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9leGVjdXRlRGVwdGgtLTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYSBmbGF0IGNvbnRpbnVhdGlvbiBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcC4gKi9cbiAgcHJpdmF0ZSBob3AoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXAsXG4gICk6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgLi4uKGludm9rZXJTdGFtcCAmJiB7IGludm9rZXJTdGFtcCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgT05FIG5vZGUgdGhyb3VnaCBhbGwgNyBwaGFzZXMg4oCUIHRoZSBvbGQgcmVjdXJzaXZlIGBleGVjdXRlTm9kZWBcbiAgICogYm9keTsgb25seSB0aGUgdGFpbCBjYWxscyBiZWNhbWUgYENvbnRpbnVhdGlvbkhvcGAgcmV0dXJucy4gUmV0dXJucyB0aGVcbiAgICogbm9kZSdzIHJlc3VsdCwgb3IgYSBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcCB0byBmb2xsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlU3RlcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBBdHRhY2ggYnVpbGRlciBtZXRhZGF0YSB0byBjb250ZXh0IGZvciBzbmFwc2hvdCBlbnJpY2htZW50LlxuICAgIC8vIFN1YmZsb3cgbWV0YSByZWFkcyBnbyB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXkg4oCUIGEgbm9kZVxuICAgIC8vIHBhdGNoZWQgYnkgYSBkeW5hbWljLXN1YmZsb3cgcmV0dXJuIHJlLWVudGVycyBleGVjdXRlTm9kZSBhbmQgbXVzdFxuICAgIC8vIGNsYXNzaWZ5IGFzIGEgc3ViZmxvdyB3aXRob3V0IHRoZSBzaGFyZWQgbm9kZSBldmVyIGJlaW5nIG11dGF0ZWQuXG4gICAgaWYgKG5vZGUuZGVzY3JpcHRpb24pIGNvbnRleHQuZGVzY3JpcHRpb24gPSBub2RlLmRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IGVmZlN1YmZsb3dJZCA9IHRoaXMuZWZmU3ViZmxvd0lkKG5vZGUpO1xuICAgIGlmICh0aGlzLmVmZklzU3ViZmxvd1Jvb3Qobm9kZSkgJiYgZWZmU3ViZmxvd0lkKSBjb250ZXh0LnN1YmZsb3dJZCA9IGVmZlN1YmZsb3dJZDtcblxuICAgIC8vIEFzc2lnbiBydW50aW1lU3RhZ2VJZCBCRUZPUkUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbiDigJQgZW5zdXJlcyBzY29wZSBldmVudHNcbiAgICAvLyAoYnVmZmVyZWQgYnkgcnVudGltZVN0YWdlSWQpIGFuZCBmbG93IGV2ZW50cyAoZmx1c2hlZCBieSB0cmF2ZXJzYWxDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKVxuICAgIC8vIHVzZSB0aGUgc2FtZSB2YWx1ZS4gTXVzdCBoYXBwZW4gYmVmb3JlIGV4ZWN1dGVTdGFnZSBBTkQgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSsrO1xuICAgIGNvbnRleHQucnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKG5vZGUuaWQsIGlkeCk7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQgPSB7XG4gICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgIHN0YWdlSWQ6IG5vZGUuaWQgPz8gY29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IGNvbnRleHQucGFyZW50Py5zdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBjb250ZXh0LnN1YmZsb3dJZCA/PyB0aGlzLnBhcmVudFN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBicmFuY2hQYXRoIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRlcHRoOiB0aGlzLmNvbXB1dGVDb250ZXh0RGVwdGgoY29udGV4dCksXG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYTogTEFaWSBSRVNPTFZFIOKAlCBkZWZlcnJlZCBzdWJmbG93IHJlc29sdXRpb24g4pSA4pSA4pSAXG4gICAgLy8gR3VhcmQgdXNlcyB0aGUgcGVyLXRyYXZlcnNlciByZXNvbHZlZExhenlTdWJmbG93cyBzZXQgKG5vdCB0aGUgc2hhcmVkIG5vZGUpIHNvXG4gICAgLy8gY29uY3VycmVudCB0cmF2ZXJzZXJzIGRvIG5vdCByYWNlIG9uIG5vZGUuc3ViZmxvd1Jlc29sdmVyIG9yIGNsZWFyIGl0IGZvciBlYWNoIG90aGVyLlxuICAgIGlmIChub2RlLmlzU3ViZmxvd1Jvb3QgJiYgbm9kZS5zdWJmbG93UmVzb2x2ZXIgJiYgIXRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuaGFzKG5vZGUuc3ViZmxvd0lkISkpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gbm9kZS5zdWJmbG93UmVzb2x2ZXIoKTtcbiAgICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMucHJlZml4Tm9kZVRyZWUocmVzb2x2ZWQucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZS5zdWJmbG93SWQhKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHJlc29sdmVkIHN1YmZsb3cgKHNhbWUgcGF0aCBhcyBlYWdlciByZWdpc3RyYXRpb24pXG4gICAgICB0aGlzLnN1YmZsb3dzW25vZGUuc3ViZmxvd0lkIV0gPSB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9O1xuXG4gICAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiByZXNvbHZlZC5zdGFnZU1hcCkge1xuICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke25vZGUuc3ViZmxvd0lkfS8ke2tleX1gO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke25vZGUuc3ViZmxvd0lkfS8ke2tleX1gO1xuICAgICAgICAgIGlmICghdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHJ1bnRpbWUgc3RydWN0dXJlIHdpdGggdGhlIG5vdy1yZXNvbHZlZCBzcGVjXG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG5vZGUuaWQsXG4gICAgICAgIG5vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgcmVzb2x2ZWQuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhcyByZXNvbHZlZCBmb3IgVEhJUyB0cmF2ZXJzZXIg4oCUIHBlci10cmF2ZXJzZXIgc2V0IHByZXZlbnRzIHJlLWVudHJ5XG4gICAgICAvLyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgU3RhZ2VOb2RlIGdyYXBoICh3aGljaCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgdHJhdmVyc2VycykuXG4gICAgICB0aGlzLnJlc29sdmVkTGF6eVN1YmZsb3dzLmFkZChub2RlLnN1YmZsb3dJZCEpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwOiBDTEFTU0lGWSDigJQgc3ViZmxvdyBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIHtcbiAgICAgIC8vIEhhbmQgaGVscGVycyB0aGUgRUZGRUNUSVZFIG5vZGUgdmlldyAoYnVpbHQgZmllbGRzICsgZHluYW1pYyBwYXRjaClcbiAgICAgIC8vIHNvIFN1YmZsb3dFeGVjdXRvci9Ob2RlUmVzb2x2ZXIgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuXG4gICAgICBjb25zdCBtb3VudE5vZGUgPSB0aGlzLmVmZk5vZGUobm9kZSk7XG4gICAgICBjb25zdCByZXNvbHZlZE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5yZXNvbHZlU3ViZmxvd1JlZmVyZW5jZShtb3VudE5vZGUpO1xuXG4gICAgICBjb25zdCBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5zdWJmbG93RXhlY3V0b3IuZXhlY3V0ZVN1YmZsb3coXG4gICAgICAgIHJlc29sdmVkTm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgPSByZXNvbHZlZE5vZGUgIT09IG1vdW50Tm9kZTtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbihtb3VudE5vZGUuY2hpbGRyZW4gJiYgbW91bnROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbiA9IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93IHx8IGhhc0NoaWxkcmVuO1xuXG4gICAgICAvLyDilIDilIDilIAgQnJlYWstZmxhZyBjaGVjayBBRlRFUiBzdWJmbG93IHJldHVybnMg4pSA4pSA4pSAXG4gICAgICAvLyBJZiB0aGUgc3ViZmxvdyB3YXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAgYW5kIGJyb2tlXG4gICAgICAvLyBpbnRlcm5hbGx5LCBgU3ViZmxvd0V4ZWN1dG9yYCBoYXMgYWxyZWFkeSBmbGlwcGVkIG91ciBicmVha0ZsYWcuXG4gICAgICAvLyBTdG9wIHRoZSBvdXRlciB0cmF2ZXJzYWwgaGVyZSDigJQgZG8gbm90IHJ1biB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5uZXh0ICYmIHNob3VsZEV4ZWN1dGVDb250aW51YXRpb24pIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFnZUZ1bmMgPSB0aGlzLmdldFN0YWdlRm4obm9kZSk7XG4gICAgY29uc3QgaGFzU3RhZ2VGdW5jdGlvbiA9IEJvb2xlYW4oc3RhZ2VGdW5jKTtcbiAgICBjb25zdCBpc1Njb3BlQmFzZWREZWNpZGVyID0gQm9vbGVhbihub2RlLmRlY2lkZXJGbik7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkU2VsZWN0b3IgPSBCb29sZWFuKG5vZGUuc2VsZWN0b3JGbik7XG4gICAgY29uc3QgaXNEZWNpZGVyTm9kZSA9IGlzU2NvcGVCYXNlZERlY2lkZXI7XG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKHRoaXMuZWZmQ2hpbGRyZW4obm9kZSk/Lmxlbmd0aCk7XG4gICAgLy8gYG5leHRgIGlzIG5ldmVyIG92ZXJsYWlkIOKAlCBhIGR5bmFtaWMgbmV4dCBhcHBsaWVzIG9ubHkgdG8gdGhlIHZpc2l0XG4gICAgLy8gdGhhdCBwcm9kdWNlZCBpdCAoaGFuZGxlZCB2aWEgdGhlIGBkeW5hbWljTmV4dGAgbG9jYWwgYmVsb3cpLCBzbyB0aGVcbiAgICAvLyBidWlsdCBjaGFydCdzIG5leHQgaXMgYWx3YXlzIHRoZSBjb3JyZWN0IGNvbnRpbnVhdGlvbiBoZXJlLlxuICAgIGNvbnN0IGhhc05leHQgPSBCb29sZWFuKG5vZGUubmV4dCk7XG4gICAgY29uc3Qgb3JpZ2luYWxOZXh0ID0gbm9kZS5uZXh0O1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDE6IFZBTElEQVRFIOKAlCBub2RlIGludmFyaWFudHMg4pSA4pSA4pSAXG4gICAgaWYgKCFoYXNTdGFnZUZ1bmN0aW9uICYmICFpc0RlY2lkZXJOb2RlICYmICFpc1Njb3BlQmFzZWRTZWxlY3RvciAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBOb2RlICcke25vZGUubmFtZX0nIG11c3QgZGVmaW5lOiBlbWJlZGRlZCBmbiBPUiBhIHN0YWdlTWFwIGVudHJ5IE9SIGhhdmUgY2hpbGRyZW4vZGVjaWRlcmA7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNEZWNpZGVyTm9kZSAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdEZWNpZGVyIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3RvciAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdTZWxlY3RvciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIFJvbGUgbWFya2VycyBmb3IgZGVidWcgcGFuZWxzXG4gICAgaWYgKCFoYXNTdGFnZUZ1bmN0aW9uKSB7XG4gICAgICBpZiAoaXNEZWNpZGVyTm9kZSkgY29udGV4dC5zZXRBc0RlY2lkZXIoKTtcbiAgICAgIGVsc2UgaWYgKGhhc0NoaWxkcmVuKSBjb250ZXh0LnNldEFzRm9yaygpO1xuICAgIH1cblxuICAgIC8vIEJyZWFrIGhhbmRsZXIgd2lyZWQgdG8gdGhlIHNjb3BlLiBDYXB0dXJlcyB0aGUgb3B0aW9uYWwgcmVhc29uXG4gICAgLy8gcGFzc2VkIHZpYSBgc2NvcGUuJGJyZWFrKHJlYXNvbilgIGFuZCBwYXJrcyBpdCBvbiB0aGUgYnJlYWtGbGFnIHNvXG4gICAgLy8gZG93bnN0cmVhbSBjb2RlIChGbG93UmVjb3JkZXIub25CcmVhaywgc3ViZmxvdyBwcm9wYWdhdGlvbikgY2FuXG4gICAgLy8gc3VyZmFjZSBpdC4gQSBzZWNvbmQgJGJyZWFrIGNhbGwgaW4gdGhlIHNhbWUgc3RhZ2Uga2VlcHMgdGhlIEZJUlNUXG4gICAgLy8gcmVhc29uIOKAlCBmaXJzdC1icmVhay13aW5zIOKAlCBtYXRjaGluZyB0aGUgXCJleGVjdXRpb24gc3RvcHBlZFwiIHN0b3J5LlxuICAgIGNvbnN0IGJyZWFrRm4gPSAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVha0ZsYWcucmVhc29uID0gcmVhc29uO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0IS5uYW1lLCBub2RlLm5leHQhLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCEsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYjogREVDSURFUiDigJQgc2NvcGUtYmFzZWQgc2luZ2xlLWNob2ljZSBjb25kaXRpb25hbCBicmFuY2gg4pSA4pSA4pSAXG4gICAgaWYgKGlzRGVjaWRlck5vZGUpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5kZWNpZGVySGFuZGxlci5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIE5vIGRlY2lkZXItbGV2ZWwgY29udGludWF0aW9uIOKGkiB0aGUgYnJhbmNoIGRpc3BhdGNoIGlzIGEgdGFpbFxuICAgICAgLy8gY2FsbC4gSGFuZCBpdCB0byB0aGUgZHJpdmVyIGFzIGEgZmxhdCBob3Agc28gbG9vcC1oZWF2eSBkZWNpZGVyXG4gICAgICAvLyBjaGFydHMgKGUuZy4gYWdlbnQgUmVBY3QgbG9vcHMgd2l0aCBicmFuY2gtc291cmNlZCBgbG9vcFRvYCkgc3RheVxuICAgICAgLy8gZmxhdC1zdGFja2VkLiBUaGUgaW52b2tlciBzdGFtcCBwcmVzZXJ2ZXMgUGF1c2VTaWduYWwgc2VtYW50aWNzIOKAlFxuICAgICAgLy8gdGhlIGRlY2lkZXIgaXMgdGhlIGludm9rZXIgb2Ygd2hhdGV2ZXIgcGF1c2VzIGluIHRoZSBjaGFpbi5cbiAgICAgIGlmICghaGFzTmV4dCAmJiBkaXNwYXRjaC5raW5kID09PSAnZGlzcGF0Y2gnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyYW5jaFBhdGgsIHtcbiAgICAgICAgICBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEsXG4gICAgICAgICAgY29udGludWF0aW9uU3RhZ2VJZDogbm9kZS5uZXh0Py5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlcikuIE1pcnJvcnMgaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LFxuICAgICAgLy8gaW5jbHVkaW5nIHRoZSBQYXVzZVNpZ25hbCBpbnZva2VyIHN0YW1wIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICAgIGVycm9yLnNldEludm9rZXIobm9kZS5pZCEsIG5vZGUubmV4dD8uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciBicmFuY2ggZXhlY3V0aW9uLCBmb2xsb3cgZGVjaWRlcidzIG93biBuZXh0IChlLmcuLCBsb29wVG8gdGFyZ2V0KVxuICAgICAgaWYgKGhhc05leHQgJiYgIWJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG4gICAgICAgIC8vIFVzZSB0aGUgaXNMb29wUmVmIGZsYWcgc2V0IGJ5IGxvb3BUbygpIOKAlCBkbyBub3QgcmVseSBvbiBzdGFnZU1hcCBhYnNlbmNlLFxuICAgICAgICAvLyBzaW5jZSBpZC1rZXllZCBzdGFnZU1hcHMgd291bGQgb3RoZXJ3aXNlIGNhdXNlIGxvb3AgdGFyZ2V0cyB0byBiZSBleGVjdXRlZCBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgaXNMb29wUmVmID1cbiAgICAgICAgICBuZXh0Tm9kZS5pc0xvb3BSZWYgPT09IHRydWUgfHxcbiAgICAgICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0Tm9kZSkgJiZcbiAgICAgICAgICAgICF0aGlzLmVmZkNoaWxkcmVuKG5leHROb2RlKT8ubGVuZ3RoICYmXG4gICAgICAgICAgICAhbmV4dE5vZGUuZGVjaWRlckZuICYmXG4gICAgICAgICAgICAhbmV4dE5vZGUuc2VsZWN0b3JGbiAmJlxuICAgICAgICAgICAgIXRoaXMuZWZmSXNTdWJmbG93Um9vdChuZXh0Tm9kZSkpO1xuXG4gICAgICAgIGlmIChpc0xvb3BSZWYpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmVUYXJnZXQobmV4dE5vZGUsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmhvcCh0YXJnZXQubm9kZSwgdGFyZ2V0LmNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChuZXh0Tm9kZSwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWNpZGVyUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBBYm9ydCBjaGVjayDigJQgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uIOKUgOKUgOKUgFxuICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyB0aGlzLnNpZ25hbC5yZWFzb24gOiBuZXcgRXJyb3IodGhpcy5zaWduYWwucmVhc29uID8/ICdBYm9ydGVkJyk7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDM6IEVYRUNVVEUg4oCUIHJ1biBzdGFnZSBmdW5jdGlvbiDilIDilIDilIBcbiAgICBsZXQgc3RhZ2VPdXRwdXQ6IFRPdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGR5bmFtaWNOZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChzdGFnZUZ1bmMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YWdlT3V0cHV0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gUGF1c2VTaWduYWwgaXMgZXhwZWN0ZWQgY29udHJvbCBmbG93LCBub3QgYW4gZXJyb3Ig4oCUIGZpcmUgbmFycmF0aXZlLCBjb21taXQsIHJlLXRocm93LlxuICAgICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2Uobm9kZS5uYW1lLCBub2RlLmlkLCBlcnJvci5wYXVzZURhdGEsIGVycm9yLnN1YmZsb3dQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgZXJyb3IudG9TdHJpbmcoKSwgZXJyb3IsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3N0YWdlRXhlY3V0aW9uRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2xpbmVhcicpO1xuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIC8vIEZvcndhcmQgdGhlIG9wdGlvbmFsIHJlYXNvbiBjYXB0dXJlZCBvbiBicmVha0ZsYWcg4oCUIHNldCBieSB0aGVcbiAgICAgICAgLy8gc3RhZ2UncyAkYnJlYWsocmVhc29uKSBjYWxsIE9SIGJ5IGEgc3ViZmxvdydzIHByb3BhZ2F0ZUJyZWFrLlxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDQ6IERZTkFNSUMg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uIOKUgOKUgOKUgFxuICAgICAgaWYgKHN0YWdlT3V0cHV0ICYmIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiYgaXNTdGFnZU5vZGVSZXR1cm4oc3RhZ2VPdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNOb2RlID0gc3RhZ2VPdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdpc0R5bmFtaWMnLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ1N0YWdlTm9kZVJldHVybicpO1xuXG4gICAgICAgIC8vIER5bmFtaWMgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbi4gVGhlIHN1YmZsb3cgbWV0YSBsYW5kcyBpbiB0aGVcbiAgICAgICAgLy8gdHJhdmVyc2VyLWxvY2FsIG92ZXJsYXkgKE5PVCBvbiB0aGUgc2hhcmVkIG5vZGUpOyB0aGUgaW1tZWRpYXRlXG4gICAgICAgIC8vIGV4ZWN1dGVOb2RlIHJlLWVudHJ5IHNlZXMgaXQgdGhyb3VnaCB0aGUgZWZmKiBhY2Nlc3NvcnMgYW5kXG4gICAgICAgIC8vIGNsYXNzaWZpZXMgdGhlIG5vZGUgYXMgYSBzdWJmbG93IG1vdW50IGluIFBoYXNlIDAuXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5pc1N1YmZsb3dSb290ICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYgJiYgZHluYW1pY05vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ2R5bmFtaWNTdWJmbG93Jyk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNTdWJmbG93SWQnLCBkeW5hbWljTm9kZS5zdWJmbG93SWQpO1xuXG4gICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGR5bmFtaWNOb2RlLnN1YmZsb3dJZCwgZHluYW1pY05vZGUuc3ViZmxvd0RlZiwgbm9kZS5pZCk7XG5cbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuc3ViZmxvd01ldGEgPSB7XG4gICAgICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICAgICAgc3ViZmxvd0lkOiBkeW5hbWljTm9kZS5zdWJmbG93SWQsXG4gICAgICAgICAgICBzdWJmbG93TmFtZTogZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBzdWJmbG93TW91bnRPcHRpb25zOiBkeW5hbWljTm9kZS5zdWJmbG93TW91bnRPcHRpb25zLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZS1lbnRlciBUSElTIG5vZGUgKHNhbWUgY29udGV4dCk6IHRoZSBvdmVybGF5IHBhdGNoIG1ha2VzIHRoZVxuICAgICAgICAgIC8vIG5leHQgc3RlcCBjbGFzc2lmeSBpdCBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjaGlsZHJlbiBmb3Igc3ViZmxvd0RlZlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuaXNTdWJmbG93Um9vdCAmJiBjaGlsZC5zdWJmbG93RGVmICYmIGNoaWxkLnN1YmZsb3dJZCkge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoY2hpbGQuc3ViZmxvd0lkLCBjaGlsZC5zdWJmbG93RGVmLCBjaGlsZC5pZCk7XG4gICAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgICAgICBjaGlsZC5pZCxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIGNoaWxkcmVuIChmb3JrIHBhdHRlcm4pIOKAlCBwYXRjaGVkIGludG8gdGhlIG92ZXJsYXk7XG4gICAgICAgIC8vIFBoYXNlIDUgYmVsb3cgcmVhZHMgdGhlbSBiYWNrIHRocm91Z2ggZWZmQ2hpbGRyZW4vZWZmU2VsZWN0b3IuXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbiAmJiBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLmNoaWxkcmVuID0gZHluYW1pY05vZGUuY2hpbGRyZW47XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNDaGlsZENvdW50JywgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZyhcbiAgICAgICAgICAgICdkeW5hbWljQ2hpbGRJZHMnLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmlkKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciksXG4gICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLmRlY2lkZXJGbiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLm5leHROb2RlU2VsZWN0b3IgPSBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc1NlbGVjdG9yJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBuZXh0IChsaW5lYXIgY29udGludWF0aW9uKSDigJQgc3RheXMgYSBMT0NBTDogaXQgYXBwbGllc1xuICAgICAgICAvLyBvbmx5IHRvIHRoaXMgdmlzaXQgKFBoYXNlIDYgcm91dGVzIGl0IHRocm91Z2ggdGhlXG4gICAgICAgIC8vIENvbnRpbnVhdGlvblJlc29sdmVyKSwgc28gdGhlIHNoYXJlZCBub2RlJ3MgbmV4dCBpcyBuZXZlciB0b3VjaGVkXG4gICAgICAgIC8vIGFuZCBhIGxvb3AgcmV2aXNpdCBuYXR1cmFsbHkgc2VlcyB0aGUgYnVpbHQgY29udGludWF0aW9uLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUubmV4dCkge1xuICAgICAgICAgIGR5bmFtaWNOZXh0ID0gZHluYW1pY05vZGUubmV4dDtcbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY05leHQobm9kZS5pZCwgZHluYW1pY05vZGUubmV4dCk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc0R5bmFtaWNOZXh0JywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFnZU91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNTogQ0hJTERSRU4g4oCUIGZvcmsgZGlzcGF0Y2gg4pSA4pSA4pSAXG4gICAgLy8gUmUtcmVhZCB0aHJvdWdoIHRoZSBvdmVybGF5OiBQaGFzZSA0IG1heSBoYXZlIGp1c3QgcGF0Y2hlZCBkeW5hbWljXG4gICAgLy8gY2hpbGRyZW4vc2VsZWN0b3IgZm9yIFRISVMgdmlzaXQgKG9yIGFuIGVhcmxpZXIgdmlzaXQgaW4gdGhpcyBydW4pLlxuICAgIGNvbnN0IGNoaWxkcmVuQWZ0ZXJTdGFnZSA9IHRoaXMuZWZmQ2hpbGRyZW4obm9kZSk7XG4gICAgY29uc3QgaGFzQ2hpbGRyZW5BZnRlclN0YWdlID0gQm9vbGVhbihjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCk7XG5cbiAgICBpZiAoaGFzQ2hpbGRyZW5BZnRlclN0YWdlKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygndG90YWxDaGlsZHJlbicsIGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdvcmRlck9mRXhlY3V0aW9uJywgJ0NoaWxkcmVuQWZ0ZXJTdGFnZScpO1xuXG4gICAgICBsZXQgbm9kZUNoaWxkcmVuUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+O1xuXG4gICAgICBjb25zdCBlZmZTZWxlY3RvckZuID0gdGhpcy5lZmZTZWxlY3Rvcihub2RlKTtcbiAgICAgIGlmIChlZmZTZWxlY3RvckZuKSB7XG4gICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZVNlbGVjdGVkQ2hpbGRyZW4oXG4gICAgICAgICAgZWZmU2VsZWN0b3JGbixcbiAgICAgICAgICBjaGlsZHJlbkFmdGVyU3RhZ2UhLFxuICAgICAgICAgIHN0YWdlT3V0cHV0LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJhbmNoUGF0aCBhcyBzdHJpbmcsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICBub2RlLmZhaWxGYXN0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoID8/IDA7XG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2NoaWxkcmVuJywgYEV4ZWN1dGluZyBhbGwgJHtjaGlsZENvdW50fSBjaGlsZHJlbiBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWAsIHtcbiAgICAgICAgICBjb3VudDogY2hpbGRDb3VudCxcbiAgICAgICAgICB0YXJnZXRTdGFnZTogY2hpbGRyZW5BZnRlclN0YWdlPy5tYXAoKGMpID0+IGMubmFtZSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGVmZk5vZGU6IENoaWxkcmVuRXhlY3V0b3IgcmVhZHMgbm9kZS5jaGlsZHJlbi9ub2RlLmZhaWxGYXN0IGl0c2VsZi5cbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlTm9kZUNoaWxkcmVuKFxuICAgICAgICAgIHRoaXMuZWZmTm9kZShub2RlKSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvcmstb25seTogcmV0dXJuIGJ1bmRsZVxuICAgICAgaWYgKCFoYXNOZXh0ICYmICFkeW5hbWljTmV4dCkge1xuICAgICAgICByZXR1cm4gbm9kZUNoaWxkcmVuUmVzdWx0cyE7XG4gICAgICB9XG5cbiAgICAgIC8vIENhcHR1cmUgZHluYW1pYyBjaGlsZHJlbiBhcyBzeW50aGV0aWMgc3ViZmxvdyByZXN1bHQgZm9yIFVJXG4gICAgICBjb25zdCBpc0R5bmFtaWMgPSBjb250ZXh0LmRlYnVnPy5sb2dDb250ZXh0Py5pc0R5bmFtaWM7XG4gICAgICBpZiAoaXNEeW5hbWljICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGR5bmFtaWNOZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLmhvcCh0YXJnZXQubm9kZSwgdGFyZ2V0LmNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgIH1cblxuICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG5cbiAgICAgIC8vIERldGVjdCBsb29wIHJlZmVyZW5jZSBub2RlcyBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBtYXJrZWQgd2l0aCBpc0xvb3BSZWYgZmxhZy5cbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggQ29udGludWF0aW9uUmVzb2x2ZXIgZm9yIHByb3BlciBJRCByZXNvbHV0aW9uLCBpdGVyYXRpb25cbiAgICAgIC8vIHRyYWNraW5nLCBhbmQgbmFycmF0aXZlIGdlbmVyYXRpb24uIFRoZSByZXNvbHZlZCB0YXJnZXQgY29tZXMgYmFja1xuICAgICAgLy8gYXMgYSBob3Ag4oCUIGxvb3AgZWRnZXMgY29uc3VtZSBubyBzdGFjaywgc28gdGhlIGl0ZXJhdGlvbiBsaW1pdFxuICAgICAgLy8gKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gICAgICBjb25zdCBpc0xvb3BSZWZlcmVuY2UgPSBuZXh0Tm9kZS5pc0xvb3BSZWY7XG5cbiAgICAgIGlmIChpc0xvb3BSZWZlcmVuY2UpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtuZXh0Tm9kZS5uYW1lfSBzdGFnZWAsIHtcbiAgICAgICAgdGFyZ2V0U3RhZ2U6IG5leHROb2RlLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgIHJldHVybiB0aGlzLmhvcChuZXh0Tm9kZSwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDc6IExFQUYg4oCUIG5vIGNvbnRpbnVhdGlvbiDilIDilIDilIBcbiAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHJpdmF0ZSBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZHJlbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFN0YWdlSWQgPSBjb250ZXh0LmdldFN0YWdlSWQoKTtcblxuICAgIGNvbnN0IGNoaWxkU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgICBpZDogYCR7bm9kZS5pZH0tY2hpbGRyZW5gLFxuICAgICAgbmFtZTogJ0R5bmFtaWMgQ2hpbGRyZW4nLFxuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLm1hcCgoYykgPT4gKHtcbiAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hpbGRTdGFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdHggb2YgY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGNoaWxkQ3R4LmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU3RhZ2VzW3NuYXBzaG90Lm5hbWUgfHwgc25hcHNob3QuaWRdID0ge1xuICAgICAgICAgIG5hbWU6IHNuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgb3V0cHV0OiBzbmFwc2hvdC5sb2dzLFxuICAgICAgICAgIGVycm9yczogc25hcHNob3QuZXJyb3JzLFxuICAgICAgICAgIG1ldHJpY3M6IHNuYXBzaG90Lm1ldHJpY3MsXG4gICAgICAgICAgc3RhdHVzOiBzbmFwc2hvdC5lcnJvcnMgJiYgT2JqZWN0LmtleXMoc25hcHNob3QuZXJyb3JzKS5sZW5ndGggPiAwID8gJ2Vycm9yJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLnNldChub2RlLmlkLCB7XG4gICAgICBzdWJmbG93SWQ6IG5vZGUuaWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5uYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDoge30sXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IGNoaWxkU3RhZ2VzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQsXG4gICAgICBwaXBlbGluZVN0cnVjdHVyZTogY2hpbGRTdHJ1Y3R1cmUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyZW50LWNoYWluIGxlbmd0aCBvZiBhIFN0YWdlQ29udGV4dCDigJQgc2FtZSB2YWx1ZSB0aGUgcHJlLXRyYW1wb2xpbmVcbiAgICogd2FsayBwcm9kdWNlZCwgbWVtb2l6ZWQuIFRoZSBjb250ZXh0IHRyZWUgZGVlcGVucyBieSBvbmUgcGVyIGV4ZWN1dGVkXG4gICAqIHN0YWdlIGFsb25nIGEgY2hhaW4sIHNvIHRoZSBuYWl2ZSB3YWxrIGlzIE8oY2hhaW4gbGVuZ3RoKSBwZXIgc3RhZ2Ug4oCUXG4gICAqIE8obsKyKSBwZXIgcnVuIG9uY2UgY2hhaW5zIHJlYWNoIHRyYW1wb2xpbmUgc2NhbGUuIENvbnRleHRzIGFyZSB2aXNpdGVkXG4gICAqIHBhcmVudC1iZWZvcmUtY2hpbGQsIHNvIHRoZSBjYWNoZWQgcGFyZW50IG1ha2VzIHRoaXMgTygxKSBhbW9ydGl6ZWQuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVDb250ZXh0RGVwdGgoY29udGV4dDogU3RhZ2VDb250ZXh0KTogbnVtYmVyIHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNvbnRleHREZXB0aENhY2hlLmdldChjb250ZXh0KTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICAvLyBXYWxrIHVwIHRvIHRoZSBuZWFyZXN0IGNhY2hlZCBhbmNlc3RvciAob3IgdGhlIHJvb3QpLCB0aGVuIGZpbGwgdGhlXG4gICAgLy8gY2FjaGUgYmFjayBkb3duIOKAlCBpdGVyYXRpdmUsIHNvIGEgY29sZCBkZWVwIGNoYWluIGNhbid0IG92ZXJmbG93LlxuICAgIGNvbnN0IHVuY2FjaGVkOiBTdGFnZUNvbnRleHRbXSA9IFtdO1xuICAgIGxldCBkZXB0aCA9IC0xOyAvLyBkZXB0aCBvZiB0aGUgbm9kZSBBQk9WRSB0aGUgZmlyc3QgdW5jYWNoZWQgZW50cnlcbiAgICBsZXQgY3VycmVudDogU3RhZ2VDb250ZXh0IHwgdW5kZWZpbmVkID0gY29udGV4dDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgY29uc3QgaGl0ID0gdGhpcy5jb250ZXh0RGVwdGhDYWNoZS5nZXQoY3VycmVudCk7XG4gICAgICBpZiAoaGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVwdGggPSBoaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdW5jYWNoZWQucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHVuY2FjaGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgdGhpcy5jb250ZXh0RGVwdGhDYWNoZS5zZXQodW5jYWNoZWRbaV0sIGRlcHRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlcHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKCFub2RlKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBjbG9uZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IC4uLm5vZGUgfTtcbiAgICBjbG9uZS5uYW1lID0gYCR7cHJlZml4fS8ke25vZGUubmFtZX1gO1xuICAgIGNsb25lLmlkID0gYCR7cHJlZml4fS8ke2Nsb25lLmlkfWA7XG4gICAgaWYgKGNsb25lLnN1YmZsb3dJZCkgY2xvbmUuc3ViZmxvd0lkID0gYCR7cHJlZml4fS8ke2Nsb25lLnN1YmZsb3dJZH1gO1xuICAgIGlmIChjbG9uZS5uZXh0KSBjbG9uZS5uZXh0ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShjbG9uZS5uZXh0LCBwcmVmaXgpO1xuICAgIGlmIChjbG9uZS5jaGlsZHJlbikge1xuICAgICAgY2xvbmUuY2hpbGRyZW4gPSBjbG9uZS5jaGlsZHJlbi5tYXAoKGMpID0+IHRoaXMucHJlZml4Tm9kZVRyZWUoYywgcHJlZml4KSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
1040
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUdILG1EQUFxRDtBQUVyRCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELHlFQUFtRTtBQUNuRSxpRkFBMkU7QUFDM0UscUVBQStEO0FBQy9ELGlFQUEyRDtBQUMzRCx1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCx1RUFBaUU7QUFFakUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsNERBQTJEO0FBdUgzRDs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBOEIvRSxTQUFTLGlCQUFpQixDQUFlLEtBQWM7SUFDckQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFpQyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNsSCxDQUFDO0FBRUQsTUFBYSxrQkFBa0I7SUFDWixJQUFJLENBQTBCO0lBQ3ZDLFFBQVEsQ0FBMkM7SUFDMUMsZ0JBQWdCLENBQW9CO0lBQzdDLFFBQVEsQ0FBb0Q7SUFDbkQsTUFBTSxDQUFVO0lBQ2hCLE1BQU0sQ0FBZTtJQUNyQixlQUFlLENBQVU7SUFDMUM7O29FQUVnRTtJQUMvQyx5QkFBeUIsQ0FBVTtJQUNwRDs7MEVBRXNFO0lBQ3JELGVBQWUsQ0FBVztJQUMzQztvRkFDZ0Y7SUFDL0QsS0FBSyxDQUFTO0lBRS9CLGtCQUFrQjtJQUNELFlBQVksQ0FBNkI7SUFDekMsZ0JBQWdCLENBQWlDO0lBQ2pELGVBQWUsQ0FBZ0M7SUFDL0MsV0FBVyxDQUE0QjtJQUN2QyxvQkFBb0Is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LENBQUM7WUFDdkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUN6QyxTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUM1QixVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs7QUF2cUNILGdEQXdxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3djaGFydFRyYXZlcnNlciDigJQgUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgb2YgU3RhZ2VOb2RlIGdyYXBoLlxuICpcbiAqIFVuaWZpZWQgdHJhdmVyc2FsIGFsZ29yaXRobSBmb3IgYWxsIG5vZGUgc2hhcGVzLiBgZXhlY3V0ZU5vZGVgIGlzIGFcbiAqIFRSQU1QT0xJTkUgZHJpdmVyOiBpdCBydW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpblxuICogYSBmbGF0IGxvb3AsIGZvbGxvd2luZyB0YWlsIGNvbnRpbnVhdGlvbnMgKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZXMsXG4gKiBkeW5hbWljIG5leHQsIGZsYXQgZGVjaWRlciBkaXNwYXRjaCkgaXRlcmF0aXZlbHkg4oCUIHNvIGNoYWluIGxlbmd0aCBhbmRcbiAqIGxvb3AgaXRlcmF0aW9ucyBuZXZlciBncm93IHRoZSBjYWxsIHN0YWNrLiBPbmx5IHRydWUgdHJlZSBuZXN0aW5nIChmb3JrXG4gKiBjaGlsZHJlbiwgd2l0aC1jb250aW51YXRpb24gZGVjaWRlci9zZWxlY3RvciBicmFuY2hlcywgc3ViZmxvdyBtb3VudHMpXG4gKiByZWN1cnNlcy5cbiAqXG4gKiBGb3IgZWFjaCBub2RlLCBleGVjdXRlTm9kZVN0ZXAgZm9sbG93cyA3IHBoYXNlczpcbiAqICAgMC4gQ0xBU1NJRlkgIOKAlCBzdWJmbG93IGRldGVjdGlvbiwgZWFybHkgZGVsZWdhdGlvblxuICogICAxLiBWQUxJREFURSAg4oCUIG5vZGUgaW52YXJpYW50cywgcm9sZSBtYXJrZXJzXG4gKiAgIDIuIEVYRUNVVEUgICDigJQgcnVuIHN0YWdlIGZuLCBjb21taXQsIGJyZWFrIGNoZWNrXG4gKiAgIDMuIERZTkFNSUMgICDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24sIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24sIHN0cnVjdHVyZSB1cGRhdGVzXG4gKiAgIDQuIENISUxEUkVOICDigJQgZm9yay9zZWxlY3Rvci9kZWNpZGVyIGRpc3BhdGNoXG4gKiAgIDUuIENPTlRJTlVFICDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQgcmVzb2x1dGlvblxuICogICA2LiBMRUFGICAgICAg4oCUIG5vIGNvbnRpbnVhdGlvbiwgcmV0dXJuIG91dHB1dFxuICpcbiAqIEJyZWFrIHNlbWFudGljczogSWYgYSBzdGFnZSBjYWxscyBicmVha0ZuKCksIGNvbW1pdCBhbmQgU1RPUC5cbiAqIFBhdGNoIG1vZGVsOiBTdGFnZSB3cml0ZXMgaW50byBsb2NhbCBwYXRjaDsgY29tbWl0UGF0Y2goKSBhZnRlciByZXR1cm4gb3IgdGhyb3cuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIgfSBmcm9tICcuLi9oYW5kbGVycy9SdW50aW1lU3RydWN0dXJlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RvckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TZWxlY3RvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgU3RhZ2VSdW5uZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TdGFnZVJ1bm5lci5qcyc7XG5pbXBvcnQgeyBTdWJmbG93RXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9TdWJmbG93RXhlY3V0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuLi9oYW5kbGVycy90eXBlcy5qcyc7XG5pbXBvcnQgeyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIH0gZnJvbSAnLi4vbmFycmF0aXZlL0Zsb3dSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vbmFycmF0aXZlL05hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgfSBmcm9tICcuLi9uYXJyYXRpdmUvTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyLCBJQ29udHJvbEZsb3dOYXJyYXRpdmUsIFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBJTG9nZ2VyLFxuICBOb2RlUmVzdWx0VHlwZSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZWxlY3RvcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgVHJhdmVyc2FsUmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhdmVyc2VyT3B0aW9uczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogUGVyLXN1YmZsb3cgc2NvcGUgY2FwdHVyZXMgZnJvbSBhIGNoZWNrcG9pbnQsIG9uIHRoZSByZXN1bWUgcGF0aC5cbiAgICogRm9yd2FyZGVkIHRvIGBIYW5kbGVyRGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lYCBzbyBTdWJmbG93RXhlY3V0b3JcbiAgICogY2FuIHJlLXNlZWQgbmVzdGVkIHJ1bnRpbWVzIGZyb20gcHJlLXBhdXNlIHN0YXRlIGluc3RlYWQgb2YgcnVubmluZ1xuICAgKiB0aGUgaW5wdXRNYXBwZXIuIFVuZGVmaW5lZCBvbiBub3JtYWwgYHJ1bigpYCBwYXRocy5cbiAgICovXG4gIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKlxuICAgKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBUaHJlYWRlZCBpbnRvIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHRcbiAgICogdGhpcyB0cmF2ZXJzZXIgcHJvZHVjZXMgc28gcmVjb3JkZXJzIGNhbiBzY29wZSBzdGF0ZSB0byBhIHNpbmdsZSBydW4uXG4gICAqIFN1YmZsb3cgdHJhdmVyc2VycyBpbmhlcml0IHRoZSBwYXJlbnQncyBydW5JZCAodGhlIHN1YmZsb3cgaXMgcGFydCBvZlxuICAgKiB0aGUgc2FtZSBydW4gZnJvbSB0aGUgY29uc3VtZXIncyBQT1YpLiBSZXF1aXJlZCBmaWVsZCDigJQgZXZlcnkgZXZlbnRcbiAgICogbmVlZHMgaXQuIFNlZSBgcnVubmVyL3J1bklkLnRzYC5cbiAgICovXG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhdmVyc2VyLWxvY2FsIG92ZXJsYXkgZW50cnkgZm9yIGEgbm9kZSB3aG9zZSBzdGFnZSBmdW5jdGlvbiByZXR1cm5lZCBhXG4gKiBTdGFnZU5vZGUgKGR5bmFtaWMgY29udGludWF0aW9uKS4gSG9sZHMgdGhlIGR5bmFtaWMgdmFsdWVzIHRoYXQgZWFybGllclxuICogdmVyc2lvbnMgd3JvdGUgRElSRUNUTFkgb250byB0aGUgc2hhcmVkIGJ1aWx0LWNoYXJ0IG5vZGUg4oCUIHdoaWNoIGxlYWtlZCB0aGVcbiAqIGR5bmFtaWMgc2hhcGUgaW50byBldmVyeSBsYXRlciBydW4gb2YgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYW5kIHJhY2VkXG4gKiBjb25jdXJyZW50IGV4ZWN1dG9ycy4gVGhlIG92ZXJsYXkga2VlcHMgdGhlIGJ1aWx0IGdyYXBoIGltbXV0YWJsZTogcGF0Y2hlc1xuICogbGl2ZSBpbiBhIHBlci10cmF2ZXJzZXIgTWFwIGtleWVkIGJ5IGBub2RlLmlkYCBhbmQgZGllIHdpdGggdGhlIHJ1bi5cbiAqXG4gKiBgbmV4dGAgaXMgaW50ZW50aW9uYWxseSBBQlNFTlQ6IGEgZHluYW1pYyBgbmV4dGAgb25seSBldmVyIGFwcGxpZXMgdG8gdGhlXG4gKiB2aXNpdCB0aGF0IHByb2R1Y2VkIGl0ICh0aGUgb2xkIGNvZGUgd3JvdGUgYG5vZGUubmV4dGAgYW5kIHJlc3RvcmVkIGl0XG4gKiBiZWZvcmUgYW55dGhpbmcgY291bGQgb2JzZXJ2ZSB0aGUgd3JpdGUpLCBzbyBpdCBzdGF5cyBhIGxvY2FsIHZhcmlhYmxlIGluXG4gKiBgZXhlY3V0ZU5vZGVgIGFuZCBpcyByb3V0ZWQgdGhyb3VnaCBgQ29udGludWF0aW9uUmVzb2x2ZXJgIGRpcmVjdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNOb2RlUGF0Y2g8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBTdWJmbG93IG1vdW50IG1ldGFkYXRhIGZyb20gYSBkeW5hbWljLXN1YmZsb3cgcmV0dXJuLiBHcm91cGVkIHNvIHRoZVxuICAgKiBtZXJnZWQgdmlldyByZXByb2R1Y2VzIHRoZSBvbGQgZmllbGQtd2lzZSBvdmVyd3JpdGUgZXhhY3RseSDigJQgaW5jbHVkaW5nXG4gICAqIGBzdWJmbG93TmFtZWAvYHN1YmZsb3dNb3VudE9wdGlvbnNgIGJlY29taW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBkeW5hbWljXG4gICAqIHJldHVybiBvbWl0dGVkIHRoZW0uXG4gICAqL1xuICBzdWJmbG93TWV0YT86IHtcbiAgICBpc1N1YmZsb3dSb290OiB0cnVlO1xuICAgIHN1YmZsb3dJZDogc3RyaW5nO1xuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3ViZmxvd01vdW50T3B0aW9uczogU3ViZmxvd01vdW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgLyoqIER5bmFtaWMgZm9yayBjaGlsZHJlbiAocmVwbGFjZXMgdGhlIGJ1aWx0IG5vZGUncyBjaGlsZHJlbiBmb3IgdGhpcyBydW4pLiAqL1xuICBjaGlsZHJlbj86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gIC8qKiBEeW5hbWljIG91dHB1dC1iYXNlZCBzZWxlY3RvciBhY2NvbXBhbnlpbmcgZHluYW1pYyBjaGlsZHJlbi4gKi9cbiAgbmV4dE5vZGVTZWxlY3Rvcj86IFNlbGVjdG9yO1xufVxuXG4vKipcbiAqIFRyYW1wb2xpbmUgYnJhbmQg4oCUIG1hcmtzIGEgY29udGludWF0aW9uIGhvcCByZXR1cm5lZCBieSBgZXhlY3V0ZU5vZGVTdGVwYFxuICogdG8gdGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAuIE1vZHVsZS1wcml2YXRlIHN5bWJvbCBzbyBhIHN0YWdlJ3Mgb3duXG4gKiByZXR1cm4gdmFsdWUgKHdoaWNoIGNhbiBiZSBhbnkgb2JqZWN0KSBjYW4gbmV2ZXIgYmUgbWlzdGFrZW4gZm9yIGEgaG9wLlxuICovXG5jb25zdCBDT05USU5VRV9IT1A6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2Zvb3RwcmludGpzLmV4ZWN1dGVOb2RlLmNvbnRpbnVlJyk7XG5cbi8qKlxuICogQSBmbGF0IGNvbnRpbnVhdGlvbiDigJQgXCJleGVjdXRlIHRoaXMgbm9kZSBuZXh0LCBpbiB0aGlzIGNvbnRleHRcIiDigJQgcmV0dXJuZWRcbiAqIGJ5IGBleGVjdXRlTm9kZVN0ZXBgIGZvciBldmVyeSBUQUlMIGNvbnRpbnVhdGlvbiAobGluZWFyIGBuZXh0YCwgbG9vcFxuICogZWRnZXMsIGR5bmFtaWMgbmV4dCwgZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5LCBuby1jb250aW51YXRpb24gZGVjaWRlclxuICogZGlzcGF0Y2gpLiBUaGUgZHJpdmVyIGxvb3AgaW4gYGV4ZWN1dGVOb2RlYCBjb25zdW1lcyBob3BzIGl0ZXJhdGl2ZWx5OlxuICogYGN1cnJlbnQgPSBob3A7IGNvbnRpbnVlO2Ag4oCUIHNvIG5laXRoZXIgdGhlIGNhbGwgc3RhY2sgbm9yIHRoZSByZXRhaW5lZFxuICogcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGl0ZXJhdGlvbnMuXG4gKi9cbmludGVyZmFjZSBDb250aW51YXRpb25Ib3A8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHJlYWRvbmx5IFtDT05USU5VRV9IT1BdOiB0cnVlO1xuICByZWFkb25seSBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcmVhZG9ubHkgY29udGV4dDogU3RhZ2VDb250ZXh0O1xuICByZWFkb25seSBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIGhvcCBpcyBhIGRlY2lkZXIncyBicmFuY2ggZGlzcGF0Y2ggKGRlY2lkZXIgd2l0aG91dCBpdHNcbiAgICogb3duIGBuZXh0YCkuIFRoZSBkcml2ZXIgcmVjb3JkcyBpdCBzbyBhIFBhdXNlU2lnbmFsIHRocm93biBhbnl3aGVyZSBpblxuICAgKiB0aGUgY29udGludWVkIGNoYWluIHN0aWxsIGdldHMgdGhlIGRlY2lkZXIgc3RhbXBlZCBhcyBpdHMgaW52b2tlciDigJRcbiAgICogZXhhY3RseSB3aGF0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvIGRvLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2tlclN0YW1wPzogSW52b2tlclN0YW1wO1xufVxuXG4vKiogUGF1c2UtaW52b2tlciBjb250ZXh0IHJlY29yZGVkIGJ5IHRoZSBkcml2ZXIgZm9yIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzLiAqL1xuaW50ZXJmYWNlIEludm9rZXJTdGFtcCB7XG4gIHJlYWRvbmx5IGludm9rZXJTdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRpbnVhdGlvblN0YWdlSWQ/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbQ09OVElOVUVfSE9QXSA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogUkZDLTAwMyBEMTogcnVudGltZVN0YWdlSWQgb2YgdGhlIHN1YmZsb3cgbW91bnQgc3RhZ2UgaW4gdGhlIHBhcmVudFxuICAgKiAgdHJhdmVyc2VyLiBGYWxsYmFjayBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZvciBzdGFnZXMgd2hvc2UgY29udGV4dCBoYXNcbiAgICogIG5vIHBhcmVudCAodGhlIHN1YmZsb3cgcm9vdCkuIFVuZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBGcm96ZW4gdmFsdWUgcGFzc2VkIHZpYSBgcnVuKHtpbnB1dH0pYC4gU3VyZmFjZWQgb24gYG9uUnVuU3RhcnRgIGF0IHRoZVxuICAgKiAgdG9wLWxldmVsIHRyYXZlcnNhbCBzbyBjb25zdW1lcnMgKGUuZy4gYEluT3V0UmVjb3JkZXJgKSBjYW4gYnJhY2tldFxuICAgKiAgdGhlIHJ1biB3aXRoIHRoZSBzYW1lIHBheWxvYWQgc2hhcGUgdGhhdCBzdWJmbG93cyBhbHJlYWR5IGhhdmUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cnVjdHVyZU1hbmFnZXI6IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5hcnJhdGl2ZUdlbmVyYXRvcjogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRXhlY3V0aW9uIHN0YXRlXG4gIHByaXZhdGUgc3ViZmxvd1Jlc3VsdHM6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIHNldCBvZiBsYXp5IHN1YmZsb3cgSURzIHRoYXQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IFRISVMgcnVuLlxuICAgKiBVc2VkIGluc3RlYWQgb2Ygd3JpdGluZyBgbm9kZS5zdWJmbG93UmVzb2x2ZXIgPSB1bmRlZmluZWRgIGJhY2sgdG8gdGhlIHNoYXJlZFxuICAgKiBTdGFnZU5vZGUgZ3JhcGgg4oCUIGF2b2lkcyBhIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50IHRyYXZlcnNlciBjbGVhcnMgdGhlIHNoYXJlZFxuICAgKiByZXNvbHZlciBiZWZvcmUgYW5vdGhlciB0cmF2ZXJzZXIgaGFzIGZpbmlzaGVkIHVzaW5nIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZExhenlTdWJmbG93cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIG92ZXJsYXkgb2YgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJucywga2V5ZWQgYnkgYG5vZGUuaWRgLlxuICAgKiBQaGFzZSA0IHdyaXRlcyBwYXRjaGVzIEhFUkUgaW5zdGVhZCBvZiBtdXRhdGluZyB0aGUgc2hhcmVkIGJ1aWx0LWNoYXJ0XG4gICAqIG5vZGUgb2JqZWN0cyAoc2FtZSBpc29sYXRpb24gY29udmVudGlvbiBhcyBgcmVzb2x2ZWRMYXp5U3ViZmxvd3NgKS5cbiAgICogQWxsIGVuZ2luZSByZWFkcyBvZiB0aGUgcGF0Y2hlZCBmaWVsZHMgZ28gdGhyb3VnaCB0aGUgYGVmZipgIGFjY2Vzc29yc1xuICAgKiBiZWxvdy4gVGhlIG1hcCBkaWVzIHdpdGggdGhlIHRyYXZlcnNlciDigJQgb25lIHJ1biwgb25lIG92ZXJsYXkg4oCUIHNvIGFcbiAgICogZnJlc2ggZXhlY3V0b3Igb3ZlciB0aGUgc2FtZSBidWlsdCBjaGFydCBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgZ3JhcGguXG4gICAqXG4gICAqIEtleWVkIGJ5IHRoZSBub2RlIE9CSkVDVCAoV2Vha01hcCksIG5vdCBgbm9kZS5pZGA6IGEgZHluYW1pYyBjaGlsZCB0aGF0XG4gICAqIHJldXNlcyBhIGJ1aWx0IG5vZGUncyBpZCBtdXN0IE5PVCBtYWtlIHRoZSBidWlsdCBub2RlIGluaGVyaXQgdGhlIHBhdGNoXG4gICAqIChpZC1rZXllZCBsb29rdXAgY2F1c2VkIHBoYW50b20gZG91YmxlLWV4ZWN1dGlvbikuIGBwYXRjaENvdW50YCBpcyB0aGVcbiAgICogZmFzdC1wYXRoIGNoZWNrIOKAlCBXZWFrTWFwIGhhcyBubyBgc2l6ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNQYXRjaGVzID0gbmV3IFdlYWtNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPj4oKTtcbiAgcHJpdmF0ZSBwYXRjaENvdW50ID0gMDtcblxuICAvKipcbiAgICogVFJFRS1uZXN0aW5nIGRlcHRoIGNvdW50ZXIgZm9yIGV4ZWN1dGVOb2RlICh0aGUgdHJhbXBvbGluZSBkcml2ZXIpLlxuICAgKiBFYWNoIGRyaXZlciBpbnZvY2F0aW9uIGluY3JlbWVudHMgdGhpczsgZGVjcmVtZW50cyBvbiBleGl0ICh0cnkvZmluYWxseSkuXG4gICAqXG4gICAqIExpbmVhciBgbmV4dGAgY2hhaW5zLCBsb29wIGVkZ2VzLCBhbmQgZHluYW1pYyBjb250aW51YXRpb25zIGFyZSBmb2xsb3dlZFxuICAgKiBJVEVSQVRJVkVMWSBpbnNpZGUgb25lIGRyaXZlciBpbnZvY2F0aW9uLCBzbyB0aGV5IG5ldmVyIGdyb3cgdGhpc1xuICAgKiBjb3VudGVyLiBPbmx5IHRydWUgdHJlZSByZWN1cnNpb24gZG9lczogZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvclxuICAgKiBicmFuY2ggZGlzcGF0Y2ggKHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gY29udGludWF0aW9uKSwgYW5kXG4gICAqIHVuYm91bmRlZCBkeW5hbWljIHJlY3Vyc2lvbi4gUHJldmVudHMgY2FsbC1zdGFjayBvdmVyZmxvdyBvbiBydW5hd2F5XG4gICAqIHJlY3Vyc2l2ZSBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2V4ZWN1dGVEZXB0aCA9IDA7XG5cbiAgLyoqXG4gICAqIE1lbW9pemVkIHBhcmVudC1jaGFpbiBkZXB0aCBwZXIgU3RhZ2VDb250ZXh0LiBUaGUgY29udGV4dCB0cmVlIGRlZXBlbnNcbiAgICogYnkgb25lIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBhIGNoYWluLCBzbyB0aGUgbmFpdmUgcGFyZW50LXdhbGsgaW5cbiAgICogYGNvbXB1dGVDb250ZXh0RGVwdGhgIGlzIE8oY2hhaW4gbGVuZ3RoKSBwZXIgc3RhZ2Ug4oCUIE8obsKyKSBwZXIgcnVuIG9uY2VcbiAgICogdGhlIHRyYW1wb2xpbmUgYWxsb3dzIGNoYWlucyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZiBzdGFnZXMuIENvbnRleHRzXG4gICAqIGFyZSB2aXNpdGVkIHBhcmVudC1iZWZvcmUtY2hpbGQsIHNvIHRoZSBtZW1vIG1ha2VzIGVhY2ggbG9va3VwIE8oMSlcbiAgICogYW1vcnRpemVkLiBXZWFrTWFwIOKAlCBkaWVzIHdpdGggdGhlIHRyYXZlcnNlci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dERlcHRoQ2FjaGUgPSBuZXcgV2Vha01hcDxTdGFnZUNvbnRleHQsIG51bWJlcj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIG1heGltdW0gZGVwdGggKHNldCBmcm9tIFRyYXZlcnNlck9wdGlvbnMubWF4RGVwdGggb3IgdGhlIGNsYXNzIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4RGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIGxvb3AtaXRlcmF0aW9uIGxpbWl0IGZvcndhcmRlZCB0byB0aGUgQ29udGludWF0aW9uUmVzb2x2ZXJcbiAgICogYW5kIHByb3BhZ2F0ZWQgdG8gc3ViZmxvdyB0cmF2ZXJzZXJzLiBVbmRlZmluZWQg4oaSIHJlc29sdmVyIGRlZmF1bHQgKDEwMDApLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIG5lc3RlZCBleGVjdXRlTm9kZSBkZXB0aCBiZWZvcmUgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKlxuICAgKiAqKldoYXQgY291bnRzIGFzIGRlcHRoICh0cmFtcG9saW5lIG1vZGVsKToqKiBgZXhlY3V0ZU5vZGVgIGlzIGFuIGl0ZXJhdGl2ZVxuICAgKiBkcml2ZXIg4oCUIGxpbmVhciBgbmV4dGAgaG9wcywgbG9vcCBlZGdlcyAoYGxvb3BUb2AvZHluYW1pYyBuZXh0KSwgYW5kXG4gICAqIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSBhcmUgZm9sbG93ZWQgaW4gYSBmbGF0IGxvb3AgYW5kIGNvbnN1bWUgTk8gZGVwdGguXG4gICAqIERlcHRoIGdyb3dzIG9ubHkgd2l0aCB0cnVlIHRyZWUgbmVzdGluZzogb25lIHRpY2sgcGVyIGZvcmsgY2hpbGQsIG9uZSBwZXJcbiAgICogZGVjaWRlci9zZWxlY3RvciBicmFuY2ggZGlzcGF0Y2ggdGhhdCBtdXN0IHJldHVybiB0byBpdHMgaW52b2tlciAoZGVjaWRlclxuICAgKiB3aXRoIGl0cyBvd24gYG5leHRgKSwgb25lIHBlciBzdWJmbG93IG1vdW50IGZyYW1lIGluIHRoZSBwYXJlbnQgKHRoZVxuICAgKiBzdWJmbG93IGJvZHkgaXRzZWxmIHJ1bnMgb24gYSBGUkVTSCB0cmF2ZXJzZXIgd2l0aCBpdHMgb3duIGJ1ZGdldCkuXG4gICAqXG4gICAqIDUwMCB0aGVyZWZvcmUgY292ZXJzIGFueSByZWFsaXN0aWMgY2hhcnQg4oCUIGl0IGJvdW5kcyByZWN1cnNpdmVcbiAgICogQ09NUE9TSVRJT04sIG5vdCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC4gTG9vcHMgYXJlIGJvdW5kZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCdzIGluZGVwZW5kZW50IGl0ZXJhdGlvbiBsaW1pdCAoZGVmYXVsdCAxMDAwLFxuICAgKiBjb25maWd1cmFibGUgdmlhIGBSdW5PcHRpb25zLm1heEl0ZXJhdGlvbnNgKSwgd2hpY2ggaXMgbm93IHRoZSBiaW5kaW5nXG4gICAqIGNvbnN0cmFpbnQgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3Qgc2FmZSBmb3IgY29uY3VycmVudCBgLmV4ZWN1dGUoKWAgY2FsbHMgb24gdGhlIHNhbWUgaW5zdGFuY2Ug4oCUIGNvbmN1cnJlbnRcbiAgICogZXhlY3V0aW9ucyByYWNlIG9uIGBfZXhlY3V0ZURlcHRoYC4gVXNlIGEgc2VwYXJhdGUgYEZsb3djaGFydFRyYXZlcnNlcmAgcGVyIGNvbmN1cnJlbnRcbiAgICogZXhlY3V0aW9uLiBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFsd2F5cyBjcmVhdGVzIGEgZnJlc2ggdHJhdmVyc2VyIHBlciBjYWxsLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9FWEVDVVRFX0RFUFRIID0gNTAwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPikge1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0cy5tYXhEZXB0aCA/PyBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEg7XG4gICAgaWYgKG1heERlcHRoIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heERlcHRoIG11c3QgYmUgPj0gMScpO1xuICAgIHRoaXMuX21heERlcHRoID0gbWF4RGVwdGg7XG4gICAgaWYgKG9wdHMubWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWF4SXRlcmF0aW9ucyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhJdGVyYXRpb25zIG11c3QgYmUgPj0gMScpO1xuICAgIH1cbiAgICB0aGlzLl9tYXhJdGVyYXRpb25zID0gb3B0cy5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSBvcHRzLmV4ZWN1dGlvbkNvdW50ZXIgPz8geyB2YWx1ZTogMCB9O1xuICAgIHRoaXMucm9vdCA9IG9wdHMucm9vdDtcbiAgICAvLyBTaGFsbG93LWNvcHkgc3RhZ2VNYXAgYW5kIHN1YmZsb3dzIHNvIHRoYXQgbGF6eS1yZXNvbHV0aW9uIG11dGF0aW9uc1xuICAgIC8vIChwcmVmaXhlZCBlbnRyaWVzIGFkZGVkIGR1cmluZyBleGVjdXRpb24pIHN0YXkgc2NvcGVkIHRvIFRISVMgdHJhdmVyc2VyXG4gICAgLy8gYW5kIGRvIG5vdCBlc2NhcGUgdG8gdGhlIHNoYXJlZCBGbG93Q2hhcnQgb2JqZWN0LiBXaXRob3V0IHRoZSBjb3B5LFxuICAgIC8vIGNvbmN1cnJlbnQgRmxvd0NoYXJ0RXhlY3V0b3IgcnVucyBzaGFyaW5nIHRoZSBzYW1lIEZsb3dDaGFydCB3b3VsZCByYWNlXG4gICAgLy8gb24gdGhlc2UgdHdvIG11dGFibGUgZGljdGlvbmFyaWVzLlxuICAgIHRoaXMuc3RhZ2VNYXAgPSBuZXcgTWFwKG9wdHMuc3RhZ2VNYXApO1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZSA9IG9wdHMuZXhlY3V0aW9uUnVudGltZTtcbiAgICB0aGlzLnN1YmZsb3dzID0gb3B0cy5zdWJmbG93cyA/IHsgLi4ub3B0cy5zdWJmbG93cyB9IDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlcjtcbiAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgIHRoaXMucGFyZW50U3ViZmxvd0lkID0gb3B0cy5wYXJlbnRTdWJmbG93SWQ7XG4gICAgdGhpcy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkID0gb3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuXG4gICAgLy8gQnVpbGQgTygxKSBub2RlIElEIG1hcCBmcm9tIHRoZSByb290IGdyYXBoIChhdm9pZHMgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpKVxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzLlxuICAgIC8vIE5vZGVSZXNvbHZlcidzIERGUyBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRVxuICAgIC8vIHJ1bnRpbWUgc2hhcGUsIHNvIGl0IHJlYWRzIGNoaWxkcmVuIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheVxuICAgIC8vIChhIGxvb3AgY2FuIHRhcmdldCBhIG5vZGUgYWRkZWQgYnkgYSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm4pLlxuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXAsIChuKSA9PiB0aGlzLmVmZkNoaWxkcmVuKG4pKTtcbiAgICB0aGlzLmNoaWxkcmVuRXhlY3V0b3IgPSBuZXcgQ2hpbGRyZW5FeGVjdXRvcihkZXBzLCB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc3RhZ2VSdW5uZXIgPSBuZXcgU3RhZ2VSdW5uZXIoZGVwcyk7XG4gICAgdGhpcy5jb250aW51YXRpb25SZXNvbHZlciA9IG5ldyBDb250aW51YXRpb25SZXNvbHZlcihcbiAgICAgIGRlcHMsXG4gICAgICB0aGlzLm5vZGVSZXNvbHZlcixcbiAgICAgIChub2RlSWQsIGNvdW50KSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkLCBjb3VudCksXG4gICAgICB0aGlzLl9tYXhJdGVyYXRpb25zLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIEZsb3djaGFydFRyYXZlcnNlciBpbnN0YW5jZXMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICAgKiBDYXB0dXJlcyBwYXJlbnQgY29uZmlnIGluIGNsb3N1cmUg4oCUIFN1YmZsb3dFeGVjdXRvciBwcm92aWRlcyBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAgICogRWFjaCBzdWJmbG93IGdldHMgYSBmdWxsIHRyYXZlcnNlciB3aXRoIGFsbCA3IHBoYXNlcyAoZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShcbiAgICBwYXJlbnRPcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4sXG4gICk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIENhcHR1cmUgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHN0YXRlIOKAlCBmYWN0b3J5IHJlYWRzIHRoZSBDVVJSRU5UIHN0YXRlIHdoZW4gY2FsbGVkLFxuICAgIC8vIG5vdCB0aGUgc3RhdGUgYXQgZmFjdG9yeSBjcmVhdGlvbiB0aW1lLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSBsYXp5IHN1YmZsb3cgcmVzb2x1dGlvblxuICAgIC8vIG1heSBhZGQgZW50cmllcyB0byBzdGFnZU1hcC9zdWJmbG93cyBiZWZvcmUgYSBuZXN0ZWQgc3ViZmxvdyBpcyBlbmNvdW50ZXJlZC5cbiAgICBjb25zdCBwYXJlbnRTdGFnZU1hcCA9IHRoaXMuc3RhZ2VNYXA7XG4gICAgY29uc3QgcGFyZW50U3ViZmxvd3MgPSB0aGlzLnN1YmZsb3dzO1xuICAgIGNvbnN0IG5hcnJhdGl2ZUdlbmVyYXRvciA9IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yO1xuXG4gICAgcmV0dXJuIChzdWJmbG93T3B0cykgPT4ge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgcm9vdDogc3ViZmxvd09wdHMucm9vdCxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgLi4uKHRoaXMuX21heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnM6IHRoaXMuX21heEl0ZXJhdGlvbnMgfSksXG4gICAgICAgIHBhcmVudFN1YmZsb3dJZDogc3ViZmxvd09wdHMuc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgcGFyZW50IGZhbGxiYWNrIGZvclxuICAgICAgICAvLyB0aGUgc3ViZmxvdydzIHJvb3Qgc3RhZ2Ugc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBib3VuZGFyeS5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlciwgLy8gU2hhcmUgY291bnRlciDigJQgc3ViZmxvdyBjb250aW51ZXMgZ2xvYmFsIG51bWJlcmluZ1xuICAgICAgICBydW5JZDogdGhpcy5ydW5JZCwgLy8gU3ViZmxvdyBpbmhlcml0cyBwYXJlbnQncyBydW5JZCDigJQgc2FtZSBsb2dpY2FsIHJ1blxuICAgICAgICAvLyBGb3J3YXJkIHRoZSByZXN1bWUtb25seSBzdWJmbG93IHNjb3BlIGNhcHR1cmVzIHNvIG5lc3RlZFxuICAgICAgICAvLyBTdWJmbG93RXhlY3V0b3JzIGNhbiByZS1zZWVkIGRlZXBlci1uZXN0ZWQgcnVudGltZXMgKGUuZy5cbiAgICAgICAgLy8gU2VxdWVuY2UoQWdlbnQoLi4uKSkgd2hlcmUgdGhlIGlubmVyIEFnZW50IHN1YmZsb3cgcGF1c2VkKS5cbiAgICAgICAgLi4uKHBhcmVudE9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSAmJiB7XG4gICAgICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogcGFyZW50T3B0cy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGVjdXRlOiAoKSA9PiB0cmF2ZXJzZXIuZXhlY3V0ZSgpLFxuICAgICAgICBnZXRTdWJmbG93UmVzdWx0czogKCkgPT4gdHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCksXG4gICAgICAgIGdldEJyZWFrU3RhdGU6ICgpID0+IHRyYXZlcnNlci5nZXRCcmVha1N0YXRlKCksXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcHMob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KTogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWdlTWFwOiB0aGlzLnN0YWdlTWFwLFxuICAgICAgcm9vdDogdGhpcy5yb290LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogdGhpcy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgc2NvcGVGYWN0b3J5OiBvcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgIHN1YmZsb3dzOiB0aGlzLnN1YmZsb3dzLFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IG9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUgPz8gJ2Vycm9yJyxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogb3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICBleGVjdXRpb25FbnY6IG9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgbmFycmF0aXZlR2VuZXJhdG9yOiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcixcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgLi4uKG9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSAmJiB7XG4gICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IG9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuXG4gICAgLy8gRmlyZSBvblJ1blN0YXJ0IE9OTFkgYXQgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzYWwg4oCUIHN1YmZsb3cgdHJhdmVyc2Vyc1xuICAgIC8vIGFscmVhZHkgcHJvZHVjZSBvblN1YmZsb3dFbnRyeS9vblN1YmZsb3dFeGl0IHBhaXJzLCBzbyBlbWl0dGluZyBydW5cbiAgICAvLyBldmVudHMgZm9yIHRoZW0gd291bGQgZG91YmxlLWJyYWNrZXQgdGhlIGJvdW5kYXJ5IHN0cmVhbS4gVGhlXG4gICAgLy8gdG9wLWxldmVsIHRyYXZlcnNlciBpcyB0aGUgb25lIHdpdGhvdXQgYSBwYXJlbnRTdWJmbG93SWQuXG4gICAgY29uc3QgaXNUb3BMZXZlbCA9IHRoaXMucGFyZW50U3ViZmxvd0lkID09PSB1bmRlZmluZWQ7XG4gICAgLy8gU3ludGhldGljIFRyYXZlcnNhbENvbnRleHQgZm9yIHJ1bi5lbnRyeSAvIHJ1bi5leGl0LiBGaWVsZHMgdXNlXG4gICAgLy8gcm9vdC1zdGFnZSBkZWZhdWx0cyAoc3RhZ2VJZD0nX19yb290X18nLCBydW50aW1lU3RhZ2VJZD0nX19yb290X18jMCcsXG4gICAgLy8gZGVwdGggMCkgc28gdGhlIHJ1bklkIGlzIHJlbGlhYmx5IGF2YWlsYWJsZSBvbiBydW4gZXZlbnRzIHdpdGhvdXRcbiAgICAvLyBmb3JjaW5nIHJlY29yZGVycyB0byBoYW5kbGUgYHRyYXZlcnNhbENvbnRleHQgPT09IHVuZGVmaW5lZGAuXG4gICAgY29uc3Qgcm9vdENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQgPSB7XG4gICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgIHN0YWdlSWQ6ICdfX3Jvb3RfXycsXG4gICAgICBydW50aW1lU3RhZ2VJZDogJ19fcm9vdF9fIzAnLFxuICAgICAgc3RhZ2VOYW1lOiAnX19yb290X18nLFxuICAgICAgZGVwdGg6IDAsXG4gICAgfTtcbiAgICBpZiAoaXNUb3BMZXZlbCkge1xuICAgICAgLy8gYHJlYWRPbmx5Q29udGV4dGAgaXMgdGhlIGVuZ2luZSdzIHZpZXcgb2YgYHJ1bih7aW5wdXR9KWAg4oCUIHBhc3NlZFxuICAgICAgLy8gdGhyb3VnaCBmcm9tIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYXMgdGhlIHZhbGlkYXRlZCBpbnB1dC5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuU3RhcnQodGhpcy5yZWFkT25seUNvbnRleHQsIHJvb3RDb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBUb3AtbGV2ZWwgcnVucyBjbG9zZSB0aGVpciBib3VuZGFyeSBTWU1NRVRSSUNBTExZOiBldmVyeSBvblJ1blN0YXJ0XG4gICAgLy8gaXMgZm9sbG93ZWQgYnkgZXhhY3RseSBvbmUgb25SdW5FbmQgKGNsZWFuKSBvciBvblJ1bkZhaWxlZCAoZXJyb3IpLlxuICAgIC8vIFdpdGhvdXQgdGhlIGNhdGNoLCBhIHRocm93biBydW4gZmlyZWQgb25SdW5TdGFydCB0aGVuIG5vdGhpbmcg4oCUIGFcbiAgICAvLyBtb25pdG9yIGNvdWxkbid0IHRlbGwgXCJzdGlsbCBydW5uaW5nXCIgZnJvbSBcImNyYXNoZWQuXCIgUGF1c2UgaXMgTk9UXG4gICAgLy8gYW4gZXJyb3IgKGl0J3MgZXhwZWN0ZWQgc3VzcGVuc2lvbiksIHNvIGl0IHNraXBzIG9uUnVuRmFpbGVkIGFuZFxuICAgIC8vIHJlLXRocm93cyB1bnRvdWNoZWQuIFRoZSBzdGFnZS1sZXZlbCBjYXRjaCBhbHJlYWR5IHJlY29yZGVkIHRoZVxuICAgIC8vIGZhaWxpbmcgc3RhZ2UgKG9uRXJyb3IgKyBjb21taXQpOyB0aGlzIGFkZHMgdGhlIHJ1bi1sZXZlbCB0ZXJtaW5hbFxuICAgIC8vIHNpZ25hbC4gVGhlIGVycm9yIHN0aWxsIHByb3BhZ2F0ZXMg4oCUIHRoaXMgaXMgb2JzZXJ2YXRpb24sIG5vdFxuICAgIC8vIHJlY292ZXJ5LiBTdWJmbG93IHRyYXZlcnNlcnMgZG9uJ3QgZmlyZSBydW4gZXZlbnRzOyB0aGVpciBlcnJvcnNcbiAgICAvLyBidWJibGUgdXAgYW5kIHN1cmZhY2UgaGVyZSBhdCB0aGUgdG9wIGxldmVsLlxuICAgIGlmICghaXNUb3BMZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU5vZGUodGhpcy5yb290LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUodGhpcy5yb290LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoIWlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRmFpbGVkKGV4dHJhY3RFcnJvckluZm8oZXJyb3IpLCByb290Q29udGV4dCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5FbmQocmVzdWx0LCByb290Q29udGV4dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhayBzdGF0ZSBjYXB0dXJlZCBhdCB0aGUgdG9wLWxldmVsIG9mIHRoZSBtb3N0IHJlY2VudCBgZXhlY3V0ZSgpYC5cbiAgICogYHNob3VsZEJyZWFrYCBpcyB0cnVlIHdoZW4gYSBzdGFnZSBjYWxsZWQgYHNjb3BlLiRicmVhayhyZWFzb24pYDsgdGhlXG4gICAqIG9wdGlvbmFsIGByZWFzb25gIGNhcnJpZXMgdGhlIHN0cmluZyBwYXNzZWQgdG8gYCRicmVha2AuXG4gICAqXG4gICAqIFVzZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdG8gcHJvcGFnYXRlIGFuIGlubmVyIHN1YmZsb3cncyBicmVhayB1cCB0b1xuICAgKiB0aGUgcGFyZW50IHRyYXZlcnNlciB3aGVuIHRoZSBtb3VudCBzZXRzIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAuXG4gICAqL1xuICBnZXRCcmVha1N0YXRlKCk6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICByZXR1cm4geyAuLi50aGlzLl90b3BCcmVha0ZsYWcgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmdldFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZS5nZXRTbmFwc2hvdChvcHRpb25zKTtcbiAgfVxuXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZS5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0UGlwZWxpbmVzKCk7XG4gIH1cblxuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gIH1cblxuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViZmxvd1Jlc3VsdHM7XG4gIH1cblxuICBnZXROYXJyYXRpdmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5nZXRTZW50ZW5jZXMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyLCBvciB1bmRlZmluZWQgaWYgbmFycmF0aXZlIGlzIGRpc2FibGVkLiAqL1xuICBnZXRGbG93UmVjb3JkZXJEaXNwYXRjaGVyKCk6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dSZWNvcmRlckRpc3BhdGNoZXI7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgQ29yZSBUcmF2ZXJzYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIE8oMSkgSUTihpJub2RlIG1hcCBmcm9tIHRoZSByb290IGdyYXBoLlxuICAgKiBVc2VkIGJ5IE5vZGVSZXNvbHZlciB0byBhdm9pZCByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkgY2FsbC5cbiAgICogSXRlcmF0aXZlIHdvcmtsaXN0IChubyByZWN1cnNpb24pIHNvIGFyYml0cmFyaWx5IGxvbmcgY2hhaW5zIGluZGV4IGZ1bGx5O1xuICAgKiB0aGUgYG1hcC5oYXNgIGd1YXJkIGhhbmRsZXMgY3ljbGljIHJlZnMuIEZpcnN0LXZpc2l0ZWQgbm9kZSB3aW5zIHBlciBJRCDigJRcbiAgICogd29ya2xpc3Qgb3JkZXIgbWF0Y2hlcyB0aGUgb2xkIHJlY3Vyc2l2ZSBwcmUtb3JkZXIgKGNoaWxkcmVuLCB0aGVuIG5leHQpLlxuICAgKiBEeW5hbWljIHN1YmZsb3dzIGFuZCBsYXp5LXJlc29sdmVkIG5vZGVzIGFyZSBhZGRlZCB0byBzdGFnZU1hcCBhdCBydW50aW1lIGJ1dCBub3QgdG8gdGhpcyBtYXAg4oCUXG4gICAqIHRob3NlIHVzZSB0aGUgREZTIGZhbGxiYWNrIGluIE5vZGVSZXNvbHZlci5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb2RlSWRNYXAocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgICBjb25zdCBzdGFjazogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGlmIChtYXAuaGFzKG5vZGUuaWQpKSBjb250aW51ZTsgLy8gYWxyZWFkeSB2aXNpdGVkIChhdm9pZHMgaW5maW5pdGUgbG9vcHMgb24gY3ljbGljIHJlZnMpXG4gICAgICBtYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgLy8gUHVzaCBpbiByZXZlcnNlIHZpc2l0IG9yZGVyIChMSUZPIHN0YWNrKTogbmV4dCBmaXJzdCwgdGhlbiBjaGlsZHJlblxuICAgICAgLy8gcmV2ZXJzZWQg4oCUIHNvIGNoaWxkcmVuIGFyZSB2aXNpdGVkIGJlZm9yZSBuZXh0LCBmaXJzdCBjaGlsZCBmaXJzdCxcbiAgICAgIC8vIG1hdGNoaW5nIHRoZSByZWN1cnNpdmUgcHJlLW9yZGVyIGV4YWN0bHkuXG4gICAgICBpZiAobm9kZS5uZXh0KSBzdGFjay5wdXNoKG5vZGUubmV4dCk7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGxldCBpID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgc3RhY2sucHVzaChub2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhZ2VGbihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBub2RlLmZuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbm9kZS5mbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgLy8gUHJpbWFyeTogbG9vayB1cCBieSBpZCAoc3RhYmxlIGlkZW50aWZpZXIsIGtleWVkIGJ5IEZsb3dDaGFydEJ1aWxkZXIpXG4gICAgY29uc3QgYnlJZCA9IHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUuaWQpO1xuICAgIGlmIChieUlkICE9PSB1bmRlZmluZWQpIHJldHVybiBieUlkO1xuICAgIC8vIEZhbGxiYWNrOiBsb29rIHVwIGJ5IG5hbWUgKHN1cHBvcnRzIGhhbmQtY3JhZnRlZCBzdGFnZU1hcHMgaW4gdGVzdHMgYW5kIGFkdmFuY2VkIHVzZSlcbiAgICByZXR1cm4gdGhpcy5zdGFnZU1hcC5nZXQobm9kZS5uYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBEeW5hbWljLXBhdGNoIG92ZXJsYXkgYWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBFdmVyeSBlbmdpbmUgcmVhZCBvZiBhIGZpZWxkIHRoYXQgUGhhc2UgNCBjYW4gcGF0Y2ggKGNoaWxkcmVuLFxuICAvLyBuZXh0Tm9kZVNlbGVjdG9yLCBzdWJmbG93IG1ldGEpIGdvZXMgdGhyb3VnaCB0aGVzZS4gRmFzdCBwYXRoOiBjaGFydHNcbiAgLy8gd2l0aCBubyBkeW5hbWljIHJldHVybnMgbmV2ZXIgYWxsb2NhdGUgYW5kIHBheSBvbmUgYHNpemUgPT09IDBgIGNoZWNrLlxuXG4gIHByaXZhdGUgZ2V0UGF0Y2gobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnBhdGNoQ291bnQgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY1BhdGNoZXMuZ2V0KG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHtcbiAgICBsZXQgcGF0Y2ggPSB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSB7XG4gICAgICBwYXRjaCA9IHt9O1xuICAgICAgdGhpcy5keW5hbWljUGF0Y2hlcy5zZXQobm9kZSwgcGF0Y2gpO1xuICAgICAgdGhpcy5wYXRjaENvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBwYXRjaDtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgY2hpbGRyZW46IGR5bmFtaWMgcGF0Y2ggZmlyc3QsIHRoZW4gdGhlIGJ1aWx0IG5vZGUncyBjaGlsZHJlbi4gKi9cbiAgcHJpdmF0ZSBlZmZDaGlsZHJlbihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFBhdGNoKG5vZGUpPy5jaGlsZHJlbiA/PyBub2RlLmNoaWxkcmVuO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBvdXRwdXQtYmFzZWQgc2VsZWN0b3I6IGR5bmFtaWMgcGF0Y2ggZmlyc3QsIHRoZW4gdGhlIGJ1aWx0IG5vZGUncy4gKi9cbiAgcHJpdmF0ZSBlZmZTZWxlY3Rvcihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFNlbGVjdG9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8ubmV4dE5vZGVTZWxlY3RvciA/PyBub2RlLm5leHROb2RlU2VsZWN0b3I7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIHN1YmZsb3ctcm9vdCBtYXJrZXIgKHRydWUgd2hlbiBhIGR5bmFtaWMgc3ViZmxvdyB3YXMgcGF0Y2hlZCBvbikuICovXG4gIHByaXZhdGUgZWZmSXNTdWJmbG93Um9vdChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFBhdGNoKG5vZGUpPy5zdWJmbG93TWV0YTtcbiAgICByZXR1cm4gbWV0YSA/IHRydWUgOiBub2RlLmlzU3ViZmxvd1Jvb3Q7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIHN1YmZsb3cgaWQgKHBhdGNoZWQgdmVyYmF0aW0gYnkgYSBkeW5hbWljIHN1YmZsb3cgcmV0dXJuKS4gKi9cbiAgcHJpdmF0ZSBlZmZTdWJmbG93SWQobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFBhdGNoKG5vZGUpPy5zdWJmbG93TWV0YTtcbiAgICByZXR1cm4gbWV0YSA/IG1ldGEuc3ViZmxvd0lkIDogbm9kZS5zdWJmbG93SWQ7XG4gIH1cblxuICAvKipcbiAgICogTWF0ZXJpYWxpemUgdGhlIGVmZmVjdGl2ZSB2aWV3IG9mIGEgbm9kZSDigJQgZmllbGQtaWRlbnRpY2FsIHRvIHdoYXQgdGhlXG4gICAqIHByZS1vdmVybGF5IGNvZGUgcHJvZHVjZWQgYnkgbXV0YXRpbmcgdGhlIHNoYXJlZCBub2RlLiBVc2VkIHdoZXJlIGEgbm9kZVxuICAgKiBpcyBoYW5kZWQgdG8gYSBoZWxwZXIgZXhlY3V0b3IgKE5vZGVSZXNvbHZlciAvIFN1YmZsb3dFeGVjdXRvciAvXG4gICAqIENoaWxkcmVuRXhlY3V0b3IpIHNvIGhlbHBlcnMgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUgaXRzZWxmIChubyBhbGxvY2F0aW9uKSB3aGVuIGl0IGNhcnJpZXMgbm8gcGF0Y2guXG4gICAqL1xuICBwcml2YXRlIGVmZk5vZGUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgcGF0Y2ggPSB0aGlzLmdldFBhdGNoKG5vZGUpO1xuICAgIGlmICghcGF0Y2gpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IG1lcmdlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IC4uLm5vZGUgfTtcbiAgICBpZiAocGF0Y2guc3ViZmxvd01ldGEpIHtcbiAgICAgIG1lcmdlZC5pc1N1YmZsb3dSb290ID0gdHJ1ZTtcbiAgICAgIG1lcmdlZC5zdWJmbG93SWQgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93SWQ7XG4gICAgICBtZXJnZWQuc3ViZmxvd05hbWUgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93TmFtZTtcbiAgICAgIG1lcmdlZC5zdWJmbG93TW91bnRPcHRpb25zID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHBhdGNoLmNoaWxkcmVuKSBtZXJnZWQuY2hpbGRyZW4gPSBwYXRjaC5jaGlsZHJlbjtcbiAgICBpZiAocGF0Y2gubmV4dE5vZGVTZWxlY3RvcikgbWVyZ2VkLm5leHROb2RlU2VsZWN0b3IgPSBwYXRjaC5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFtcG9saW5lIGRyaXZlciDigJQgcHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluIGEgZmxhdCBsb29wOiBldmVyeVxuICAgKiBUQUlMIGNvbnRpbnVhdGlvbiAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlLCBkeW5hbWljIG5leHQgLyBkeW5hbWljXG4gICAqIHJlLWVudHJ5LCBuby1jb250aW51YXRpb24gZGVjaWRlciBkaXNwYXRjaCkgY29tZXMgYmFjayBhcyBhXG4gICAqIGBDb250aW51YXRpb25Ib3BgIGFuZCBpcyBmb2xsb3dlZCBJVEVSQVRJVkVMWSDigJQgbmVpdGhlciB0aGUgY2FsbCBzdGFja1xuICAgKiBub3IgdGhlIHJldGFpbmVkIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC5cbiAgICpcbiAgICogUmVjdXJzaW9uIHJlbWFpbnMgT05MWSBmb3IgdHJ1ZSB0cmVlIG5lc3RpbmcgKGVhY2ggZ2V0cyBhIG5lc3RlZCBkcml2ZXJcbiAgICogY2FsbCk6IGZvcmsgY2hpbGRyZW4gKGBDaGlsZHJlbkV4ZWN1dG9yYCksIHNlbGVjdG9yIGJyYW5jaGVzIChwYXJhbGxlbFxuICAgKiBmYW4tb3V0KSwgZGVjaWRlciBicmFuY2ggZGlzcGF0Y2ggd2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBgbmV4dGBcbiAgICogKHRoZSBicmFuY2ggbXVzdCBjb21wbGV0ZSBCRUZPUkUgdGhlIGRlY2lkZXIncyBjb250aW51YXRpb24gcnVucyksIGFuZFxuICAgKiBzdWJmbG93IG1vdW50cyAoZnJlc2ggdHJhdmVyc2VyOyB0aGUgbW91bnQgZnJhbWUgc3RheXMgaW4gdGhlIHBhcmVudCkuXG4gICAqIGBfZXhlY3V0ZURlcHRoYCB0aGVyZWZvcmUgY291bnRzIGNoYXJ0IENPTVBPU0lUSU9OIGRlcHRoIG9ubHksIGd1YXJkZWRcbiAgICogYnkgYF9tYXhEZXB0aGAgKGRlZmF1bHQgYE1BWF9FWEVDVVRFX0RFUFRIYCA9IDUwMCkuXG4gICAqXG4gICAqIFBhdXNlU2lnbmFsOiBhIGZsYXQgZGVjaWRlciBkaXNwYXRjaCByZWNvcmRzIGFuIGBJbnZva2VyU3RhbXBgOyBpZiB0aGVcbiAgICogY29udGludWVkIGNoYWluIGxhdGVyIHBhdXNlcywgdGhlIGRyaXZlciBzdGFtcHMgdGhlIHNpZ25hbCBkdXJpbmdcbiAgICogdW53aW5kIOKAlCBzYW1lIGludm9rZXIgY29udGV4dCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0b1xuICAgKiBzdGFtcCwgaW5uZXJtb3N0IChtb3N0IHJlY2VudCBkaXNwYXRjaCkgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBpbmNyZW1lbnQgaXMgaW5zaWRlIGB0cnlgIHNvIGBmaW5hbGx5YCBhbHdheXMgZGVjcmVtZW50cyDigJQgbm9cbiAgICAvLyBmcmFnaWxlIGdhcCBiZXR3ZWVuIGNoZWNrIGFuZCB0cnkgZW50cnkuXG4gICAgdHJ5IHtcbiAgICAgIGlmICgrK3RoaXMuX2V4ZWN1dGVEZXB0aCA+IHRoaXMuX21heERlcHRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhpbXVtIHRyYXZlcnNhbCBkZXB0aCBleGNlZWRlZCAoJHt0aGlzLl9tYXhEZXB0aH0pLiBgICtcbiAgICAgICAgICAgICdEZXB0aCBjb3VudHMgTkVTVEVEIGRpc3BhdGNoIChmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCByZWN1cnNpdmUgY29tcG9zaXRpb24pIOKAlCAnICtcbiAgICAgICAgICAgICdsaW5lYXIgY2hhaW5zIGFuZCBsb29wIGl0ZXJhdGlvbnMgcnVuIGZsYXQgYW5kIGRvIG5vdCBjb25zdW1lIGl0LiAnICtcbiAgICAgICAgICAgIGBMYXN0IHN0YWdlOiAnJHtub2RlLm5hbWV9Jy4gYCArXG4gICAgICAgICAgICAnQ2hlY2sgZm9yIHVuYm91bmRlZCByZWN1cnNpdmUgY2hhcnQgY29tcG9zaXRpb24sIG9yIHJhaXNlIHRoZSBsaW1pdCB2aWEgUnVuT3B0aW9ucy5tYXhEZXB0aC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGVTdGVwKGN1cnJlbnQubm9kZSwgY3VycmVudC5jb250ZXh0LCBicmVha0ZsYWcsIGN1cnJlbnQuYnJhbmNoUGF0aCk7XG4gICAgICAgIGlmICghaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPihyZXN1bHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmludm9rZXJTdGFtcCkgKHBlbmRpbmdJbnZva2VycyA/Pz0gW10pLnB1c2gocmVzdWx0Lmludm9rZXJTdGFtcCk7XG4gICAgICAgIGN1cnJlbnQgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFJlcGxheSBpbnZva2VyIHN0YW1wcyBtb3N0LXJlY2VudC1maXJzdC4gYHNldEludm9rZXJgIGlzXG4gICAgICAvLyBmaXJzdC13cml0ZS13aW5zLCBzbyB0aGUgaW5uZXJtb3N0IGRpc3BhdGNoJ3Mgc3RhbXAgbGFuZHMg4oCUIGV4YWN0bHlcbiAgICAgIC8vIHRoZSBvbGQgYnViYmxlLXVwIG9yZGVyIHRocm91Z2ggbmVzdGVkIGNhdGNoIGZyYW1lcy5cbiAgICAgIGlmIChwZW5kaW5nSW52b2tlcnMgIT09IHVuZGVmaW5lZCAmJiBpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gcGVuZGluZ0ludm9rZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihwZW5kaW5nSW52b2tlcnNbaV0uaW52b2tlclN0YWdlSWQsIHBlbmRpbmdJbnZva2Vyc1tpXS5jb250aW51YXRpb25TdGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2V4ZWN1dGVEZXB0aC0tO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBPTkUgbm9kZSB0aHJvdWdoIGFsbCA3IHBoYXNlcyDigJQgdGhlIG9sZCByZWN1cnNpdmUgYGV4ZWN1dGVOb2RlYFxuICAgKiBib2R5OyBvbmx5IHRoZSB0YWlsIGNhbGxzIGJlY2FtZSBgQ29udGludWF0aW9uSG9wYCByZXR1cm5zLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlJ3MgcmVzdWx0LCBvciBhIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wIHRvIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGVTdGVwKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEF0dGFjaCBidWlsZGVyIG1ldGFkYXRhIHRvIGNvbnRleHQgZm9yIHNuYXBzaG90IGVucmljaG1lbnQuXG4gICAgLy8gU3ViZmxvdyBtZXRhIHJlYWRzIGdvIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheSDigJQgYSBub2RlXG4gICAgLy8gcGF0Y2hlZCBieSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4gcmUtZW50ZXJzIGV4ZWN1dGVOb2RlIGFuZCBtdXN0XG4gICAgLy8gY2xhc3NpZnkgYXMgYSBzdWJmbG93IHdpdGhvdXQgdGhlIHNoYXJlZCBub2RlIGV2ZXIgYmVpbmcgbXV0YXRlZC5cbiAgICBpZiAobm9kZS5kZXNjcmlwdGlvbikgY29udGV4dC5kZXNjcmlwdGlvbiA9IG5vZGUuZGVzY3JpcHRpb247XG4gICAgY29uc3QgZWZmU3ViZmxvd0lkID0gdGhpcy5lZmZTdWJmbG93SWQobm9kZSk7XG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIGNvbnRleHQuc3ViZmxvd0lkID0gZWZmU3ViZmxvd0lkO1xuXG4gICAgLy8gQXNzaWduIHJ1bnRpbWVTdGFnZUlkIEJFRk9SRSB0cmF2ZXJzYWxDb250ZXh0IGNyZWF0aW9uIOKAlCBlbnN1cmVzIHNjb3BlIGV2ZW50c1xuICAgIC8vIChidWZmZXJlZCBieSBydW50aW1lU3RhZ2VJZCkgYW5kIGZsb3cgZXZlbnRzIChmbHVzaGVkIGJ5IHRyYXZlcnNhbENvbnRleHQucnVudGltZVN0YWdlSWQpXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlLiBNdXN0IGhhcHBlbiBiZWZvcmUgZXhlY3V0ZVN0YWdlIEFORCBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dC5cbiAgICBjb25zdCBpZHggPSB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKys7XG4gICAgY29udGV4dC5ydW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQobm9kZS5pZCwgaWR4KTtcblxuICAgIC8vIFJGQy0wMDMgRDE6IHJ1bnRpbWUgcGFyZW50IOKAlCB0aGUgcHJldmlvdXMgZXhlY3V0aW9uIHN0ZXAncyBydW50aW1lU3RhZ2VJZC5cbiAgICAvLyBGYWxscyBiYWNrIHRvIHRoZSBzdWJmbG93IE1PVU5UJ3MgcnVudGltZVN0YWdlSWQgZm9yIHRoZSBzdWJmbG93IHJvb3RcbiAgICAvLyBzdGFnZSAoaXRzIFN0YWdlQ29udGV4dCBpcyBjcmVhdGVkIGZyZXNoIHdpdGggbm8gcGFyZW50KSwgc28gcnVudGltZVxuICAgIC8vIGFuY2VzdG9yIGNoYWlucyBjcm9zcyBzdWJmbG93IGJvdW5kYXJpZXMuIGB8fGAgKG5vdCBgPz9gKSBvbiBwdXJwb3NlOlxuICAgIC8vIGEgcGFyZW50IGNvbnRleHQgdGhhdCBuZXZlciBleGVjdXRlZCBzdGlsbCBjYXJyaWVzIHRoZSBmaWVsZCdzXG4gICAgLy8gaW5pdGlhbCBgJydgLCB3aGljaCBtdXN0IGFsc28gZmFsbCB0aHJvdWdoIHRvIHRoZSBtb3VudCBmYWxsYmFjay5cbiAgICBjb25zdCBwYXJlbnRSdW50aW1lU3RhZ2VJZCA9IGNvbnRleHQucGFyZW50Py5ydW50aW1lU3RhZ2VJZCB8fCB0aGlzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQgPSB7XG4gICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgIHN0YWdlSWQ6IG5vZGUuaWQgPz8gY29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IGNvbnRleHQucGFyZW50Py5zdGFnZUlkLFxuICAgICAgLi4uKHBhcmVudFJ1bnRpbWVTdGFnZUlkICYmIHsgcGFyZW50UnVudGltZVN0YWdlSWQgfSksXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgICAgZGVwdGg6IHRoaXMuY29tcHV0ZUNvbnRleHREZXB0aChjb250ZXh0KSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQocHJlZml4ZWRLZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgICBpZiAocmVzb2x2ZWQuc3ViZmxvd3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHJlc29sdmVkLnN1YmZsb3dzKSkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgICAgaWYgKCF0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlRnVuYyA9IHRoaXMuZ2V0U3RhZ2VGbihub2RlKTtcbiAgICBjb25zdCBoYXNTdGFnZUZ1bmN0aW9uID0gQm9vbGVhbihzdGFnZUZ1bmMpO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZERlY2lkZXIgPSBCb29sZWFuKG5vZGUuZGVjaWRlckZuKTtcbiAgICBjb25zdCBpc1Njb3BlQmFzZWRTZWxlY3RvciA9IEJvb2xlYW4obm9kZS5zZWxlY3RvckZuKTtcbiAgICBjb25zdCBpc0RlY2lkZXJOb2RlID0gaXNTY29wZUJhc2VkRGVjaWRlcjtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4odGhpcy5lZmZDaGlsZHJlbihub2RlKT8ubGVuZ3RoKTtcbiAgICAvLyBgbmV4dGAgaXMgbmV2ZXIgb3ZlcmxhaWQg4oCUIGEgZHluYW1pYyBuZXh0IGFwcGxpZXMgb25seSB0byB0aGUgdmlzaXRcbiAgICAvLyB0aGF0IHByb2R1Y2VkIGl0IChoYW5kbGVkIHZpYSB0aGUgYGR5bmFtaWNOZXh0YCBsb2NhbCBiZWxvdyksIHNvIHRoZVxuICAgIC8vIGJ1aWx0IGNoYXJ0J3MgbmV4dCBpcyBhbHdheXMgdGhlIGNvcnJlY3QgY29udGludWF0aW9uIGhlcmUuXG4gICAgY29uc3QgaGFzTmV4dCA9IEJvb2xlYW4obm9kZS5uZXh0KTtcbiAgICBjb25zdCBvcmlnaW5hbE5leHQgPSBub2RlLm5leHQ7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMTogVkFMSURBVEUg4oCUIG5vZGUgaW52YXJpYW50cyDilIDilIDilIBcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24gJiYgIWlzRGVjaWRlck5vZGUgJiYgIWlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYE5vZGUgJyR7bm9kZS5uYW1lfScgbXVzdCBkZWZpbmU6IGVtYmVkZGVkIGZuIE9SIGEgc3RhZ2VNYXAgZW50cnkgT1IgaGF2ZSBjaGlsZHJlbi9kZWNpZGVyYDtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmIChpc0RlY2lkZXJOb2RlICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ0RlY2lkZXIgbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlbGVjdG9yIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYXJrZXJzIGZvciBkZWJ1ZyBwYW5lbHNcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24pIHtcbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSBjb250ZXh0LnNldEFzRGVjaWRlcigpO1xuICAgICAgZWxzZSBpZiAoaGFzQ2hpbGRyZW4pIGNvbnRleHQuc2V0QXNGb3JrKCk7XG4gICAgfVxuXG4gICAgLy8gQnJlYWsgaGFuZGxlciB3aXJlZCB0byB0aGUgc2NvcGUuIENhcHR1cmVzIHRoZSBvcHRpb25hbCByZWFzb25cbiAgICAvLyBwYXNzZWQgdmlhIGBzY29wZS4kYnJlYWsocmVhc29uKWAgYW5kIHBhcmtzIGl0IG9uIHRoZSBicmVha0ZsYWcgc29cbiAgICAvLyBkb3duc3RyZWFtIGNvZGUgKEZsb3dSZWNvcmRlci5vbkJyZWFrLCBzdWJmbG93IHByb3BhZ2F0aW9uKSBjYW5cbiAgICAvLyBzdXJmYWNlIGl0LiBBIHNlY29uZCAkYnJlYWsgY2FsbCBpbiB0aGUgc2FtZSBzdGFnZSBrZWVwcyB0aGUgRklSU1RcbiAgICAvLyByZWFzb24g4oCUIGZpcnN0LWJyZWFrLXdpbnMg4oCUIG1hdGNoaW5nIHRoZSBcImV4ZWN1dGlvbiBzdG9wcGVkXCIgc3RvcnkuXG4gICAgY29uc3QgYnJlYWtGbiA9IChyZWFzb24/OiBzdHJpbmcpID0+IHtcbiAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSByZWFzb247XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYTogU0VMRUNUT1Ig4oCUIHNjb3BlLWJhc2VkIG11bHRpLWNob2ljZSDilIDilIDilIBcbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yUmVzdWx0ID0gYXdhaXQgdGhpcy5zZWxlY3RvckhhbmRsZXIuaGFuZGxlU2NvcGVCYXNlZChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwge1xuICAgICAgICAgIGludm9rZXJTdGFnZUlkOiBub2RlLmlkISxcbiAgICAgICAgICBjb250aW51YXRpb25TdGFnZUlkOiBub2RlLm5leHQ/LmlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlciBXSVRIIGl0cyBvd24gbmV4dDogdGhlIGJyYW5jaCBjaGFpbiBtdXN0IGNvbXBsZXRlIEJFRk9SRVxuICAgICAgLy8gdGhlIGRlY2lkZXIncyBjb250aW51YXRpb24gcnVucyDigJQgdHJ1ZSB0cmVlIG5lc3RpbmcsIGtlcHRcbiAgICAgIC8vIHJlY3Vyc2l2ZSAoYSBuZXN0ZWQgZHJpdmVyKS4gTWlycm9ycyBoYW5kbGVTY29wZUJhc2VkIGV4YWN0bHksXG4gICAgICAvLyBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXAgb24gYnViYmxlLXVwLlxuICAgICAgbGV0IGRlY2lkZXJSZXN1bHQ6IGFueTtcbiAgICAgIGlmIChkaXNwYXRjaC5raW5kID09PSAnYnJlYWsnKSB7XG4gICAgICAgIGRlY2lkZXJSZXN1bHQgPSBkaXNwYXRjaC5icmFuY2hJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVjaWRlclJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUoZGlzcGF0Y2guY2hvc2VuLCBkaXNwYXRjaC5icmFuY2hDb250ZXh0LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISwgbm9kZS5uZXh0Py5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGJyYW5jaCBleGVjdXRpb24sIGZvbGxvdyBkZWNpZGVyJ3Mgb3duIG5leHQgKGUuZy4sIGxvb3BUbyB0YXJnZXQpXG4gICAgICBpZiAoaGFzTmV4dCAmJiAhYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcbiAgICAgICAgLy8gVXNlIHRoZSBpc0xvb3BSZWYgZmxhZyBzZXQgYnkgbG9vcFRvKCkg4oCUIGRvIG5vdCByZWx5IG9uIHN0YWdlTWFwIGFic2VuY2UsXG4gICAgICAgIC8vIHNpbmNlIGlkLWtleWVkIHN0YWdlTWFwcyB3b3VsZCBvdGhlcndpc2UgY2F1c2UgbG9vcCB0YXJnZXRzIHRvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5LlxuICAgICAgICBjb25zdCBpc0xvb3BSZWYgPVxuICAgICAgICAgIG5leHROb2RlLmlzTG9vcFJlZiA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICghdGhpcy5nZXRTdGFnZUZuKG5leHROb2RlKSAmJlxuICAgICAgICAgICAgIXRoaXMuZWZmQ2hpbGRyZW4obmV4dE5vZGUpPy5sZW5ndGggJiZcbiAgICAgICAgICAgICFuZXh0Tm9kZS5kZWNpZGVyRm4gJiZcbiAgICAgICAgICAgICFuZXh0Tm9kZS5zZWxlY3RvckZuICYmXG4gICAgICAgICAgICAhdGhpcy5lZmZJc1N1YmZsb3dSb290KG5leHROb2RlKSk7XG5cbiAgICAgICAgaWYgKGlzTG9vcFJlZikge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChuZXh0Tm9kZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHN0YWdlRnVuYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhZ2VPdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShub2RlLm5hbWUsIG5vZGUuaWQsIGVycm9yLnBhdXNlRGF0YSwgZXJyb3Iuc3ViZmxvd1BhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBlcnJvci50b1N0cmluZygpLCBlcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvciB9KTtcbiAgICAgICAgY29udGV4dC5hZGRFcnJvcignc3RhZ2VFeGVjdXRpb25FcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnbGluZWFyJyk7XG5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgLy8gRm9yd2FyZCB0aGUgb3B0aW9uYWwgcmVhc29uIGNhcHR1cmVkIG9uIGJyZWFrRmxhZyDigJQgc2V0IGJ5IHRoZVxuICAgICAgICAvLyBzdGFnZSdzICRicmVhayhyZWFzb24pIGNhbGwgT1IgYnkgYSBzdWJmbG93J3MgcHJvcGFnYXRlQnJlYWsuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsobm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0LCBicmVha0ZsYWcucmVhc29uKTtcbiAgICAgICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNDogRFlOQU1JQyDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBpc1N0YWdlTm9kZVJldHVybihzdGFnZU91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgZHluYW1pY05vZGUgPSBzdGFnZU91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLiBUaGUgc3ViZmxvdyBtZXRhIGxhbmRzIGluIHRoZVxuICAgICAgICAvLyB0cmF2ZXJzZXItbG9jYWwgb3ZlcmxheSAoTk9UIG9uIHRoZSBzaGFyZWQgbm9kZSk7IHRoZSBpbW1lZGlhdGVcbiAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgLy8gY2xhc3NpZmllcyB0aGUgbm9kZSBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1N1YmZsb3dJZCcsIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCk7XG5cbiAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoZHluYW1pY05vZGUuc3ViZmxvd0lkLCBkeW5hbWljTm9kZS5zdWJmbG93RGVmLCBub2RlLmlkKTtcblxuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJmbG93SWQ6IGR5bmFtaWNOb2RlLnN1YmZsb3dJZCxcbiAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlLWVudGVyIFRISVMgbm9kZSAoc2FtZSBjb250ZXh0KTogdGhlIG92ZXJsYXkgcGF0Y2ggbWFrZXMgdGhlXG4gICAgICAgICAgLy8gbmV4dCBzdGVwIGNsYXNzaWZ5IGl0IGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgLy8gUGhhc2UgNSBiZWxvdyByZWFkcyB0aGVtIGJhY2sgdGhyb3VnaCBlZmZDaGlsZHJlbi9lZmZTZWxlY3Rvci5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pIOKAlCBzdGF5cyBhIExPQ0FMOiBpdCBhcHBsaWVzXG4gICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gQ29udGludWF0aW9uUmVzb2x2ZXIpLCBzbyB0aGUgc2hhcmVkIG5vZGUncyBuZXh0IGlzIG5ldmVyIHRvdWNoZWRcbiAgICAgICAgLy8gYW5kIGEgbG9vcCByZXZpc2l0IG5hdHVyYWxseSBzZWVzIHRoZSBidWlsdCBjb250aW51YXRpb24uXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAvLyBjaGlsZHJlbi9zZWxlY3RvciBmb3IgVEhJUyB2aXNpdCAob3IgYW4gZWFybGllciB2aXNpdCBpbiB0aGlzIHJ1bikuXG4gICAgY29uc3QgY2hpbGRyZW5BZnRlclN0YWdlID0gdGhpcy5lZmZDaGlsZHJlbihub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgIGNvbnN0IGVmZlNlbGVjdG9yRm4gPSB0aGlzLmVmZlNlbGVjdG9yKG5vZGUpO1xuICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICBlZmZTZWxlY3RvckZuLFxuICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgIG5vZGUuZmFpbEZhc3QsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWZmTm9kZTogQ2hpbGRyZW5FeGVjdXRvciByZWFkcyBub2RlLmNoaWxkcmVuL25vZGUuZmFpbEZhc3QgaXRzZWxmLlxuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgdGhpcy5lZmZOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgIGNvbnN0IGlzRHluYW1pYyA9IGNvbnRleHQuZGVidWc/LmxvZ0NvbnRleHQ/LmlzRHluYW1pYztcbiAgICAgIGlmIChpc0R5bmFtaWMgJiYgY2hpbGRyZW5BZnRlclN0YWdlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChub2RlLCBjaGlsZHJlbkFmdGVyU3RhZ2UsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA2OiBDT05USU5VRSDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQg4pSA4pSA4pSAXG4gICAgaWYgKGR5bmFtaWNOZXh0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmVUYXJnZXQoZHluYW1pY05leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKGhhc05leHQpIHtcbiAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcblxuICAgICAgLy8gRGV0ZWN0IGxvb3AgcmVmZXJlbmNlIG5vZGVzIGNyZWF0ZWQgYnkgbG9vcFRvKCkg4oCUIG1hcmtlZCB3aXRoIGlzTG9vcFJlZiBmbGFnLlxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBDb250aW51YXRpb25SZXNvbHZlciBmb3IgcHJvcGVyIElEIHJlc29sdXRpb24sIGl0ZXJhdGlvblxuICAgICAgLy8gdHJhY2tpbmcsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdGlvbi4gVGhlIHJlc29sdmVkIHRhcmdldCBjb21lcyBiYWNrXG4gICAgICAvLyBhcyBhIGhvcCDigJQgbG9vcCBlZGdlcyBjb25zdW1lIG5vIHN0YWNrLCBzbyB0aGUgaXRlcmF0aW9uIGxpbWl0XG4gICAgICAvLyAobm90IGNhbGwtc3RhY2sgZGVwdGgpIGlzIHdoYXQgYm91bmRzIGEgbG9vcC5cbiAgICAgIGNvbnN0IGlzTG9vcFJlZmVyZW5jZSA9IG5leHROb2RlLmlzTG9vcFJlZjtcblxuICAgICAgaWYgKGlzTG9vcFJlZmVyZW5jZSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmVUYXJnZXQobmV4dE5vZGUsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3AodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkcmVuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U3RhZ2VJZCA9IGNvbnRleHQuZ2V0U3RhZ2VJZCgpO1xuXG4gICAgY29uc3QgY2hpbGRTdHJ1Y3R1cmU6IGFueSA9IHtcbiAgICAgIGlkOiBgJHtub2RlLmlkfS1jaGlsZHJlbmAsXG4gICAgICBuYW1lOiAnRHluYW1pYyBDaGlsZHJlbicsXG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5pZCxcbiAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZFN0YWdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBpZiAoY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZEN0eCBvZiBjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gY2hpbGRDdHguZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY2hpbGRTdGFnZXNbc25hcHNob3QubmFtZSB8fCBzbmFwc2hvdC5pZF0gPSB7XG4gICAgICAgICAgbmFtZTogc25hcHNob3QubmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHNuYXBzaG90LmxvZ3MsXG4gICAgICAgICAgZXJyb3JzOiBzbmFwc2hvdC5lcnJvcnMsXG4gICAgICAgICAgbWV0cmljczogc25hcHNob3QubWV0cmljcyxcbiAgICAgICAgICBzdGF0dXM6IHNuYXBzaG90LmVycm9ycyAmJiBPYmplY3Qua2V5cyhzbmFwc2hvdC5lcnJvcnMpLmxlbmd0aCA+IDAgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBub2RlLm5hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiB7fSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogY2hpbGRTdGFnZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lU3RydWN0dXJlOiBjaGlsZFN0cnVjdHVyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJlbnQtY2hhaW4gbGVuZ3RoIG9mIGEgU3RhZ2VDb250ZXh0IOKAlCBzYW1lIHZhbHVlIHRoZSBwcmUtdHJhbXBvbGluZVxuICAgKiB3YWxrIHByb2R1Y2VkLCBtZW1vaXplZC4gVGhlIGNvbnRleHQgdHJlZSBkZWVwZW5zIGJ5IG9uZSBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2UgYWxvbmcgYSBjaGFpbiwgc28gdGhlIG5haXZlIHdhbGsgaXMgTyhjaGFpbiBsZW5ndGgpIHBlciBzdGFnZSDigJRcbiAgICogTyhuwrIpIHBlciBydW4gb25jZSBjaGFpbnMgcmVhY2ggdHJhbXBvbGluZSBzY2FsZS4gQ29udGV4dHMgYXJlIHZpc2l0ZWRcbiAgICogcGFyZW50LWJlZm9yZS1jaGlsZCwgc28gdGhlIGNhY2hlZCBwYXJlbnQgbWFrZXMgdGhpcyBPKDEpIGFtb3J0aXplZC5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUNvbnRleHREZXB0aChjb250ZXh0OiBTdGFnZUNvbnRleHQpOiBudW1iZXIge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuY29udGV4dERlcHRoQ2FjaGUuZ2V0KGNvbnRleHQpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgIC8vIFdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgY2FjaGVkIGFuY2VzdG9yIChvciB0aGUgcm9vdCksIHRoZW4gZmlsbCB0aGVcbiAgICAvLyBjYWNoZSBiYWNrIGRvd24g4oCUIGl0ZXJhdGl2ZSwgc28gYSBjb2xkIGRlZXAgY2hhaW4gY2FuJ3Qgb3ZlcmZsb3cuXG4gICAgY29uc3QgdW5jYWNoZWQ6IFN0YWdlQ29udGV4dFtdID0gW107XG4gICAgbGV0IGRlcHRoID0gLTE7IC8vIGRlcHRoIG9mIHRoZSBub2RlIEFCT1ZFIHRoZSBmaXJzdCB1bmNhY2hlZCBlbnRyeVxuICAgIGxldCBjdXJyZW50OiBTdGFnZUNvbnRleHQgfCB1bmRlZmluZWQgPSBjb250ZXh0O1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjb25zdCBoaXQgPSB0aGlzLmNvbnRleHREZXB0aENhY2hlLmdldChjdXJyZW50KTtcbiAgICAgIGlmIChoaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXB0aCA9IGhpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB1bmNhY2hlZC5wdXNoKGN1cnJlbnQpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gdW5jYWNoZWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGRlcHRoKys7XG4gICAgICB0aGlzLmNvbnRleHREZXB0aENhY2hlLnNldCh1bmNhY2hlZFtpXSwgZGVwdGgpO1xuICAgIH1cbiAgICByZXR1cm4gZGVwdGg7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IGNsb25lOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGNsb25lLm5hbWUgPSBgJHtwcmVmaXh9LyR7bm9kZS5uYW1lfWA7XG4gICAgY2xvbmUuaWQgPSBgJHtwcmVmaXh9LyR7Y2xvbmUuaWR9YDtcbiAgICBpZiAoY2xvbmUuc3ViZmxvd0lkKSBjbG9uZS5zdWJmbG93SWQgPSBgJHtwcmVmaXh9LyR7Y2xvbmUuc3ViZmxvd0lkfWA7XG4gICAgaWYgKGNsb25lLm5leHQpIGNsb25lLm5leHQgPSB0aGlzLnByZWZpeE5vZGVUcmVlKGNsb25lLm5leHQsIHByZWZpeCk7XG4gICAgaWYgKGNsb25lLmNoaWxkcmVuKSB7XG4gICAgICBjbG9uZS5jaGlsZHJlbiA9IGNsb25lLmNoaWxkcmVuLm1hcCgoYykgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShjLCBwcmVmaXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dEZWY6IE5vbk51bGxhYmxlPFN0YWdlTm9kZVsnc3ViZmxvd0RlZiddPixcbiAgICBtb3VudE5vZGVJZD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdGhpcy5zdWJmbG93cyBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yOyB0aGUgbnVsbCBndWFyZCBiZWxvdyBpcyB1bnJlYWNoYWJsZS5cbiAgICBjb25zdCBzdWJmbG93c0RpY3QgPSB0aGlzLnN1YmZsb3dzO1xuXG4gICAgLy8gRmlyc3Qtd3JpdGUtd2luc1xuICAgIGNvbnN0IGlzTmV3UmVnaXN0cmF0aW9uID0gIXN1YmZsb3dzRGljdFtzdWJmbG93SWRdO1xuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbiAmJiBzdWJmbG93RGVmLnJvb3QpIHtcbiAgICAgIHN1YmZsb3dzRGljdFtzdWJmbG93SWRdID0ge1xuICAgICAgICByb290OiBzdWJmbG93RGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgICAgIC4uLihzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSA/IHsgYnVpbGRUaW1lU3RydWN0dXJlOiBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSB9IDoge30pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc3RhZ2VNYXAgZW50cmllcyAocGFyZW50IGVudHJpZXMgcHJlc2VydmVkKVxuICAgIGlmIChzdWJmbG93RGVmLnN0YWdlTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBBcnJheS5mcm9tKHN1YmZsb3dEZWYuc3RhZ2VNYXAuZW50cmllcygpKSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChrZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICBpZiAoc3ViZmxvd0RlZi5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3dEZWYuc3ViZmxvd3MpKSB7XG4gICAgICAgIGlmICghc3ViZmxvd3NEaWN0W2tleV0pIHtcbiAgICAgICAgICBzdWJmbG93c0RpY3Rba2V5XSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91bnROb2RlSWQpIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbW91bnROb2RlSWQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgRmxvd1JlY29yZGVycyBvbmx5IG9uIGZpcnN0IHJlZ2lzdHJhdGlvbiAobWF0Y2hlcyBmaXJzdC13cml0ZS13aW5zKVxuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbikge1xuICAgICAgY29uc3Qgc3ViZmxvd05hbWUgPSBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSB8fCBzdWJmbG93SWQ7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dSZWdpc3RlcmVkKFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LmRlc2NyaXB0aW9uLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
|