footprintjs 10.0.1 → 10.2.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/AGENTS.md +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -227,6 +227,8 @@ function raiseQueuedPause(queue) {
|
|
|
227
227
|
if ((0, types_js_1.isPausedExecution)(pause.pausedExecution)) {
|
|
228
228
|
signal.stampExecution(pause.pausedExecution.runtimeStageId, pause.pausedExecution.runId);
|
|
229
229
|
}
|
|
230
|
+
// …and the key it ran under (P3), so its own resume re-runs under the same key.
|
|
231
|
+
signal.stampIdempotencyKey(pause.idempotencyKey);
|
|
230
232
|
const below = pause.subflowPath.slice(level);
|
|
231
233
|
for (let i = below.length - 1; i >= 0; i--) {
|
|
232
234
|
const state = ownEntry(pause.subflowStates, below[i]);
|
|
@@ -453,4 +455,4 @@ function walksToItsStage(chart, subflows, fanOutGraph, pause, level) {
|
|
|
453
455
|
function ownEntry(record, key) {
|
|
454
456
|
return record && Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;
|
|
455
457
|
}
|
|
456
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdW1lRW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERHOzs7QUFFSCxxREFBNEQ7QUFFNUQsbURBQXNFO0FBOEN0RSxNQUFhLFdBQVc7SUFDdEI7Ozs7O09BS0c7SUFDTSxLQUFLLENBQXNDO0lBQ3BELDZGQUE2RjtJQUNwRixrQkFBa0IsQ0FBcUM7SUFDaEU7Ozs7OztPQU1HO0lBQ00sa0JBQWtCLENBQXFCO0lBQ2hELGlGQUFpRjtJQUNoRSxPQUFPLENBQXVDO0lBRS9ELFlBQ0UsS0FBMEMsRUFDMUMsSUFBd0MsRUFDeEMsa0JBQTJDLEVBQzNDLGtCQUEyQjtRQUUzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBZSxJQU96QjtRQUNDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxFQUFnQixDQUFDO1FBRTdDLDBFQUEwRTtRQUMx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S0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsbUdBQW1HO0FBQ25HLFNBQVMsUUFBUSxDQUFJLE1BQXFDLEVBQUUsR0FBVztJQUNyRSxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMvRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXN1bWVFbnRyeSDigJQgdGhlIHJlc3VtZSdzIE9ORS1TSE9UIHJlLWVudHJ5IChNMiwgcGF1c2UvcmVzdW1lKS5cbiAqXG4gKiBBIHJlc3VtZSBoYXMgdG8gZ2V0IGJhY2sgdG8gYSBzdGFnZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhcnQuIEl0IGRvZXMgdGhhdFxuICogd2l0aCBhIHNtYWxsIHN5bnRoZXRpYyBzdHJ1Y3R1cmU6IGEgc3RhbmQtaW4gZm9yIHRoZSBwYXVzZWQgc3RhZ2UgKHRoZVxuICogc3RhZ2UncyBvd24gbm9kZSB3aXRoIGl0cyBmdW5jdGlvbiBzd2FwcGVkIGZvciB0aGUgcmVzdW1lIGhhbGYg4oCUIG9yLCBmb3IgYW5cbiAqIGBpbnRlcnJ1cHQoKWAgcGF1c2UsIGZvciBpdHMgb3duIGZ1bmN0aW9uIHdpdGggdGhlIGFuc3dlciBkZXBvc2l0ZWQpLCBhbmQsXG4gKiBmb3IgYSBwYXVzZSBpbnNpZGUgc3ViZmxvd3MsIHRoZSBjaGVja3BvaW50J3MgY2FwdHVyZSBvZiBlYWNoIHN1YmZsb3cnc1xuICogc3RhdGUgb24gdGhlIHdheSBkb3duLlxuICpcbiAqIFRIRSBMQVc6IHRoYXQgc3RydWN0dXJlIGlzIHVzZWQgRVhBQ1RMWSBPTkNFLCBmb3IgdGhlIHJlLWVudHJ5LiBUaGUgc3RhbmQtaW5cbiAqIGlzIHdoZXJlIHRoZSByZXN1bWVkIHRyYXZlcnNhbCBTVEFSVFMgKG9yIHdoZXJlIHRoZSBsZWFmIHN1YmZsb3cncyB0cmF2ZXJzYWxcbiAqIHN0YXJ0cykg4oCUIGl0IGlzIG5ldmVyIGEgbm9kZSBhbnkgaWQgY2FuIHJlc29sdmUgdG8uIEVhY2ggc3ViZmxvdyBvbiB0aGUgcGF1c2VcbiAqIHBhdGggdGFrZXMgaXRzIHNlZWQgYW5kIGl0cyBlbnRyeSBwb2ludCBvbiBpdHMgRklSU1QgZW50cnkgYW5kIG5ldmVyIGFnYWluLlxuICogQWZ0ZXIgdGhhdCB0aGUgcnVuIGJlbG9uZ3MgdG8gdGhlIHJlYWwgY2hhcnQ6IGV2ZXJ5IGxvb3AgdGFyZ2V0LCBldmVyeSBsYXRlclxuICogc3ViZmxvdyBlbnRyeSAocmVhbCByb290LCBpbnB1dE1hcHBlciBydW5zKSwgZXZlcnkgcmUtdmlzaXQgb2YgdGhlIHBhdXNlZFxuICogc3RhZ2UgKHdoaWNoIHBhdXNlcyBhZ2FpbikgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgY2hhcnQgYXMgYnVpbHQuXG4gKlxuICogT05FIFJVTEUgQVQgRVZFUlkgTEVWRUwg4oCUIHdoYXQgcnVucyBhZnRlciB0aGUgZW50cnkuIE9uIHRoZSBvcmlnaW5hbCBydW4sXG4gKiB3aGF0ZXZlciBESVNQQVRDSEVEIHRoZSBwYXVzZWQgc3RhZ2UgKG9yIHRoZSBtb3VudCBvZiB0aGUgbmV4dCBzdWJmbG93IG9uXG4gKiB0aGUgcGF0aCkg4oCUIGEgZGVjaWRlciwgYSBzZWxlY3RvciwgYSBmb3JrIOKAlCByYW4gaXRzIG93biBjb250aW51YXRpb24gb25jZVxuICogdGhhdCBjaGlsZCdzIGNoYWluIGVuZGVkOiB0aGUgZGVjaWRlcidzIGBuZXh0YCwgdGhlIGZvcmsncyBqb2luLiBBIHJlc3VtZVxuICogZW50ZXJzIEFUIHRoZSBjaGlsZCwgc28gdGhhdCBjb250aW51YXRpb24gbXVzdCBiZSBjYXJyaWVkOiB0aGUgZW50cnkgaXNcbiAqIHRoZSBjaGlsZCB3aXRoIHRoZSBlbmNsb3NpbmcgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZCBhdCB0aGUgZW5kXG4gKiBvZiBpdHMgb3duIGNoYWluIChgeyAuLi5jaGlsZCwgbmV4dDogZGlzcGF0Y2hlci5uZXh0IH1gIGZvciBhIGNoYXJ0IHRoZVxuICogYnVpbGRlciBtYWRlKS4gSXQgaXMgcmVhZCBmcm9tIHRoZSBDSEFSVCwgbGV2ZWwgYnkgbGV2ZWwg4oCUIG5ldmVyIGZyb20gdGhlXG4gKiBjaGVja3BvaW50LCBzbyBhbiBlZGl0ZWQgY2hlY2twb2ludCBjYW5ub3QgcmVkaXJlY3QgYSBydW4g4oCUIGFuZCBpdCBsYW5kc1xuICogYXQgdGhlIGxldmVsIGl0IGJlbG9uZ3MgdG86IGEgdG9wLWxldmVsIGRlY2lkZXIncyBgbmV4dGAgcnVucyBhdCB0aGUgdG9wXG4gKiBsZXZlbCwgYWZ0ZXIgdGhlIHN1YmZsb3cncyBvdXRwdXRNYXBwZXIsIG5vdCBpbnNpZGUgdGhlIHN1YmZsb3cuXG4gKlxuICogUEFSQUxMRUwgU0lCTElOR1MgVEhBVCBQQVVTRUQgVE9PICg5LjI4LjApLiBXaGVuIHR3byBjaGlsZHJlbiBvZiBvbmVcbiAqIGZhbi1vdXQgcGF1c2VkLCB0aGUgY2hlY2twb2ludCBhc2tzIHRoZSBmaXJzdCBhbmQgY2FycmllcyB0aGUgb3RoZXJzXG4gKiAoYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLiBBdCB0aGF0IGZhbi1vdXQncyBsZXZlbCB0aGUgZW50cnkgaXNcbiAqIHRoZSBjaGlsZCdzIG93biBjaGFpbiBvbmx5IOKAlCBubyBqb2luIOKAlCBhbmQgb25jZSBpdCBlbmRzLCB0aGUgbmV4dCBzaWJsaW5nJ3NcbiAqIHBhdXNlIGlzIHJhaXNlZCBhZ2FpbiBhcyBpdCB3YXMgKGl0cyBxdWVzdGlvbiwgaXRzIGNhcHR1cmVkIHN0YXRlKSwgd2l0aG91dFxuICogcmUtcnVubmluZyBhbnl0aGluZy4gVGhlIGpvaW4gcnVucyBvbmx5IHdoZW4gdGhlIGxhc3Qgc2libGluZyBpcyByZXN1bWVkLlxuICpcbiAqIEJlZm9yZSA5LjI4LjAgdGhlIHN0cnVjdHVyZSBzdGF5ZWQgaW4gZm9yY2UgZm9yIHRoZSB3aG9sZSByZXN1bWVkIHJ1biDigJQgdGhlXG4gKiB0cmF2ZXJzYWwgd2FzIFJPT1RFRCBhdCB0aGUgc3RhbmQtaW4gKHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgaWQgcmUtcmFuXG4gKiB0aGUgcmVzdW1lIGhhbGYsIGFuZCBhIGxvb3AgdGFyZ2V0IHVwc3RyZWFtIG9mIHRoZSByZXN1bWUgcG9pbnQgd2FzXG4gKiB1bnJlYWNoYWJsZTogb25lIHN0YWdlIHJhbiwgdGhlbiB0aGUgcnVuIGVuZGVkIHNpbGVudGx5KSwgYW5kIHRoZSBsZWFmXG4gKiBzdWJmbG93J3Mgcm9vdCB3YXMgU1dBUFBFRCBmb3IgdGhlIHN0YW5kLWluIGluIHRoZSBzdWJmbG93IGRpY3Rpb25hcnkgKHNvIGFcbiAqIGxhdGVyIGVudHJ5IGludG8gaXQgd291bGQgcmUtcnVuIHRoZSByZXN1bWUgaGFsZiBvbiBhIHN0YWxlIHNlZWQpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBXaGF0IEZsb3dDaGFydEV4ZWN1dG9yLnJlc3VtZSgpIGJ1aWxkcyBmb3IgYSBwYXVzZSBhdCAnc2YtYS9zZi1iL2FzaydcbiAqIC8vIChzdWJmbG93UGF0aCBbJ3NmLWEnLCAnc2YtYS9zZi1iJ10pLCAnc2YtYS9zZi1iJyBtb3VudGVkIGFzIGEgZGVjaWRlclxuICogLy8gYnJhbmNoIGluc2lkZSBzZi1hIHdob3NlIGRlY2lkZXIgY29udGludWVzIHRvICdzZi1hL2FmdGVyJzpcbiAqIGNvbnN0IGVudHJ5ID0gUmVzdW1lRW50cnkucGxhbih7IHJvb3QsIHN1YmZsb3dzLCBwYXRoLCBjYXB0dXJlcywgc3RhbmRJbiB9KTtcbiAqIGVudHJ5LnN0YXJ0OyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0b3AtbGV2ZWwgbW91bnQgb2YgJ3NmLWEnXG4gKiBlbnRyeS5lbnRlclN1YmZsb3coJ3NmLWEnKTsgICAgICAvLyB7IHNlZWQ6IHNmLWEncyBjYXB0dXJlLCBlbnRyeTogeyAuLi5tb3VudCBvZiAnc2YtYS9zZi1iJywgbmV4dDogc2YtYS9hZnRlciB9IH1cbiAqIGVudHJ5LmVudGVyU3ViZmxvdygnc2YtYS9zZi1iJyk7IC8vIHsgc2VlZDogc2YtYidzIGNhcHR1cmUsIGVudHJ5OiB0aGUgc3RhbmQtaW4gfVxuICogZW50cnkuZW50ZXJTdWJmbG93KCdzZi1hL3NmLWInKTsgLy8gdW5kZWZpbmVkIOKAlCBhIGxhdGVyIGVudHJ5IGlzIGFuIG9yZGluYXJ5IG9uZVxuICogYGBgXG4gKlxuICogQSBwYXVzZSB0d28gKG9yIG1vcmUpIHN1YmZsb3dzIGRlZXAgdGhlcmVmb3JlIHJlLWVudGVycyBlYWNoIG91dGVyIHN1YmZsb3dcbiAqIEFUIHRoZSBtb3VudCBvZiB0aGUgbmV4dCBvbmUg4oCUIHRoZSBvdXRlciBzdWJmbG93J3Mgc3RhZ2VzIGJlZm9yZSB0aGF0IG1vdW50XG4gKiBkbyBub3QgcnVuIGFnYWluICh0aGV5IGRpZCBiZWZvcmUgOS4yOC4wKS4gVGhlIG9uZSBleGNlcHRpb24gaXMgYSBkZWdyYWRlZFxuICogY2hlY2twb2ludCBtaXNzaW5nIGFuIG91dGVyIHN1YmZsb3cncyBjYXB0dXJlOiB0aGF0IHN1YmZsb3cgcmUtcnVucyBmcm9tIGl0c1xuICogcm9vdCB3aXRoIGl0cyBpbnB1dE1hcHBlciAoaXRzIGVhcmxpZXIgc3RhZ2VzIHJlY29tcHV0ZSB3aGF0IHRoZSBjYXB0dXJlXG4gKiB3b3VsZCBoYXZlIGhlbGQpLCBleGFjdGx5IGFzIDkuMjcuMCBkaWQuXG4gKi9cblxuaW1wb3J0IHsgZGVjb2RlUGVuZGluZ1BhdXNlcyB9IGZyb20gJy4uLy4uL3BhdXNlL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlbmRpbmdQYXVzZSB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzUGF1c2VkRXhlY3V0aW9uLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcblxuLyoqXG4gKiBBIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSwgcXVldWVkIGF0IHRoZSBsZXZlbCBvZiBpdHMgZmFuLW91dDogcmFpc2VkXG4gKiBhZ2FpbiB0aGVyZSBvbmNlIHRoZSByZXN1bWVkIGNoaWxkJ3MgY2hhaW4gZW5kcyAoc2VlIHtAbGluayByYWlzZVF1ZXVlZFBhdXNlfSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVkUGF1c2Uge1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZSBhcyB0aGUgY2hlY2twb2ludCBjYXJyaWVzIGl0IOKAlCBpdHMgcGF0aCBmcm9tIHRoZSB0b3AuICovXG4gIHJlYWRvbmx5IHBhdXNlOiBQZW5kaW5nUGF1c2U7XG4gIC8qKiBIb3cgbWFueSBzdWJmbG93cyBkZWVwIHRoZSBmYW4tb3V0IHNpdHMgKDAgPSB0aGUgdG9wIGxldmVsKS4gKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IG51bWJlcjtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlJ3MgbmFtZSwgZm9yIHRoZSBgb25QYXVzZWAgZXZlbnQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogT25lIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHdheSBiYWNrIHRvIGEgcGF1c2VkIHN0YWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVIb3A8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKiBUaGUgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChhIGBGbG93Y2hhcnRDaGVja3BvaW50LnN1YmZsb3dQYXRoYCBlbnRyeSkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBzdGF0ZSBhdCB0aGUgcGF1c2UgKGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNbc3ViZmxvd0lkXWApLlxuICAgKiBTZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgSU5TVEVBRCBvZiB0aGUgaW5wdXRNYXBwZXIncyB2YWx1ZXMg4oCUIHRoZSBjYXB0dXJlXG4gICAqIGFscmVhZHkgaG9sZHMgdGhlIHBvc3QtaW5wdXQsIHByZS1wYXVzZSBtZW1vcnkgKHRoZSBpbnB1dE1hcHBlciBzdGlsbFxuICAgKiBydW5zLCBmb3IgdGhlIHN0YWdlcycgcmVhZC1vbmx5IGFyZ3Mgb25seSkuIEFic2VudCB3aGVuIHRoZSBjaGVja3BvaW50XG4gICAqIGhvbGRzIG5vIGNhcHR1cmUgZm9yIHRoaXMgc3ViZmxvdzsgdGhlIGlucHV0TWFwcGVyIHRoZW4gc2VlZHMgaXQsIGFzIG9uXG4gICAqIGFueSBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHNlZWQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFdoZXJlIHRoaXMgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgb24gdGhlIHJlLWVudHJ5OiB0aGUgbW91bnQgb2YgdGhlXG4gICAqIG5leHQgc3ViZmxvdyBvbiB0aGUgcGF0aCwgb3Ig4oCUIG9uIHRoZSBsYXN0IGhvcCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzXG4gICAqIHN0YW5kLWluLCBlYWNoIHdpdGggaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24gYXR0YWNoZWQgKHNlZSB0aGVcbiAgICogbW9kdWxlIGRvYykuIEFic2VudDogdGhlIHN1YmZsb3cncyBvd24gcm9vdCDigJQgYSBzZWVkLW9ubHkgaG9wIChzZWVcbiAgICoge0BsaW5rIFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlc30pLCBvciBhbiBvdXRlciBzdWJmbG93IHdob3NlIGNhcHR1cmUgdGhlXG4gICAqIGNoZWNrcG9pbnQgbGFja3MuXG4gICAqL1xuICByZWFkb25seSBlbnRyeT86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGF1c2VzIG9mIHBhcmFsbGVsIHNpYmxpbmdzIHdob3NlIGZhbi1vdXQgc2l0cyBpbiBUSElTIHN1YmZsb3csIHJhaXNlZCBpblxuICAgKiBvcmRlciBvbmNlIGBlbnRyeWAncyBjaGFpbiBlbmRzICh0aGUgZmlyc3QgaXMgcmFpc2VkLCB0aGUgcmVzdCB3YWl0XG4gICAqIGJlaGluZCBpdCkuIEFic2VudCB3aGVuIG5vIHNpYmxpbmcgaXMgd2FpdGluZyBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG59XG5cbmV4cG9ydCBjbGFzcyBSZXN1bWVFbnRyeTxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSByZXN1bWVkIFRPUC1MRVZFTCB0cmF2ZXJzYWwgc3RhcnRzOiB0aGUgc3RhbmQtaW4gKGEgdG9wLWxldmVsXG4gICAqIHBhdXNlKSBvciB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3cgb24gdGhlIHBhdGgg4oCUIGVhY2ggd2l0aCBpdHNcbiAgICogZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZC4gYHVuZGVmaW5lZGAgZm9yIGEgc2VlZC1vbmx5IGVudHJ5IOKAlFxuICAgKiB0aGUgdHJhdmVyc2FsIHN0YXJ0cyBhdCBpdHMgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFNpYmxpbmcgcGF1c2VzIHdob3NlIGZhbi1vdXQgc2l0cyBhdCB0aGUgVE9QIGxldmVsIOKAlCByYWlzZWQgb25jZSBgc3RhcnRgJ3MgY2hhaW4gZW5kcy4gKi9cbiAgcmVhZG9ubHkgc3RhcnRQZW5kaW5nUGF1c2VzOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogSG93IG1hbnkgc3RhZ2UgZXhlY3V0aW9ucyB0aGUgcmVzdW1lZCBydW4gbWFrZXMgYmVmb3JlIHRoZSBzdGFuZC1pbiBydW5zXG4gICAqIOKAlCBvbmUgcGVyIHN1YmZsb3cgb24gdGhlIHBhdGgsIGVhY2ggZW50ZXJlZCBhdCBpdHMgbW91bnQg4oCUIHNvIHRoZVxuICAgKiBleGVjdXRvcidzIGBvblJlc3VtZWAgbmFtZXMgdGhlIHN0YW5kLWluJ3Mgb3duIGBydW50aW1lU3RhZ2VJZGAuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGtub3duIGJlZm9yZSB0aGUgcnVuOiBhbiBvdXRlciBzdWJmbG93XG4gICAqIG1pc3NpbmcgaXRzIGNhcHR1cmUgcmUtcnVucyBmcm9tIGl0cyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcHNCZWZvcmVTdGFuZEluOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBIb3BzIG5vdCB0YWtlbiB5ZXQsIGJ5IHN1YmZsb3cgaWQuIEEgaG9wIGxlYXZlcyB0aGlzIG1hcCB3aGVuIGl0IGlzIHRha2VuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmc6IE1hcDxzdHJpbmcsIFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+PjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBob3BzOiByZWFkb25seSBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPltdLFxuICAgIHN0YXJ0UGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10sXG4gICAgc3RlcHNCZWZvcmVTdGFuZEluPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5zdGFydFBlbmRpbmdQYXVzZXMgPSBzdGFydFBlbmRpbmdQYXVzZXM7XG4gICAgdGhpcy5zdGVwc0JlZm9yZVN0YW5kSW4gPSBzdGVwc0JlZm9yZVN0YW5kSW47XG4gICAgdGhpcy5wZW5kaW5nID0gbmV3IE1hcChob3BzLm1hcCgoaG9wKSA9PiBbaG9wLnN1YmZsb3dJZCwgaG9wXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYW4gdGhlIHJlLWVudHJ5IG9mIGEgcGF1c2VkIGNoYXJ0LiBFdmVyeSBtb3VudCBvbiB0aGUgcGF0aCwgZXZlcnlcbiAgICogZGlzcGF0Y2hlciBjb250aW51YXRpb24gYW5kIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBpcyByZXNvbHZlZCBIRVJFLFxuICAgKiBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdCwgYmVmb3JlIGEgc2luZ2xlIHN0YWdlIHJ1bnMg4oCUIHNvIGEgY2hlY2twb2ludFxuICAgKiB3aG9zZSBwYXRoIHRoZSBjaGFydCBjYW5ub3Qgd2FsayBpcyByZWZ1c2VkIHVwIGZyb250IGluc3RlYWQgb2YgcmVzdW1pbmdcbiAgICogaW50byB0aGUgd3Jvbmcgc2hhcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIC0gYHJvb3RgIGFuZCBgc3ViZmxvd3NgOiB0aGUgY2hhcnQgYXMgYnVpbHRcbiAgICogICAoYEZsb3dDaGFydC5yb290YCwgYEZsb3dDaGFydC5zdWJmbG93c2ApOyBgcGF0aGA6XG4gICAqICAgYGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhgLCBvdXRlcm1vc3QgZmlyc3Q7IGBjYXB0dXJlc2A6XG4gICAqICAgYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc2AgKGEgZGV0YWNoZWQgY29weSk7IGBzdGFuZEluYDogdGhlIG5vZGUgdGhhdFxuICAgKiAgIHJ1bnMgdGhlIHJlc3VtZSBoYWxmIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3Mgb3duIG5vZGUsIGZ1bmN0aW9uIHN3YXBwZWRcbiAgICogICAoaXRzIGNvbnRpbnVhdGlvbiBpcyBhdHRhY2hlZCBoZXJlKTsgYHBlbmRpbmdQYXVzZXNgOlxuICAgKiAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgIChhIGRldGFjaGVkIGNvcHkpLlxuICAgKiBAdGhyb3dzIHdoZW4gYSBzdWJmbG93IG9uIHRoZSBwYXRoIGlzIG1pc3NpbmcsIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UsIG9yXG4gICAqICAgaXRzIG1vdW50IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIGVuY2xvc2luZyBncmFwaDsgb3Igd2hlbiBhIHBlbmRpbmdcbiAgICogICBwYXVzZSBpcyBtYWxmb3JtZWQgb3IgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiB0aGUgcGF1c2VkIHN0YWdlXG4gICAqL1xuICBzdGF0aWMgcGxhbjxUT3V0LCBUU2NvcGU+KGFyZ3M6IHtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBjYXB0dXJlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIHN0YW5kSW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBQZW5kaW5nUGF1c2VbXTtcbiAgfSk6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0gPSBhcmdzO1xuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPigpO1xuXG4gICAgLy8gMS4gV2FsayB0aGUgcGF0aDogdGhlIGdyYXBoIG9mIGV2ZXJ5IGxldmVsLCB0aGUgbW91bnQgb2YgZXZlcnkgc3ViZmxvdy5cbiAgICBjb25zdCBncmFwaHM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgY29uc3QgbW91bnRzOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBwYXRoW2ldO1xuICAgICAgbW91bnRzLnB1c2goY2hhcnQub25seU1vdW50KGdyYXBoc1tpXSwgc3ViZmxvd0lkLCBpID09PSAwID8gJ3RoZSBmbG93Y2hhcnQnIDogYHN1YmZsb3cgJyR7cGF0aFtpIC0gMV19J2ApKTtcbiAgICAgIC8vIE93biBlbnRyaWVzIG9ubHk6IGEgcGF0aCBzZWdtZW50IGlzIGRhdGEgZnJvbSBhIHN0b3JlZCBjaGVja3BvaW50LFxuICAgICAgLy8gYW5kIGAnX19wcm90b19fJ2AgbXVzdCBub3QgcmVzb2x2ZSB0aHJvdWdoIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gb3duRW50cnkoc3ViZmxvd3MsIHN1YmZsb3dJZCk7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICAgJ1RoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBncmFwaHMucHVzaChkZWZpbml0aW9uLnJvb3QpO1xuICAgIH1cbiAgICBjb25zdCBsZWFmTGV2ZWwgPSBwYXRoLmxlbmd0aDtcbiAgICAvLyBUaGUgcGF1c2VkIHN0YWdlJ3MgUkVBTCBub2RlIOKAlCB3aG9zZSBkaXNwYXRjaGVyIHRoZSBzdGFuZC1pbidzXG4gICAgLy8gY29udGludWF0aW9uIGNvbWVzIGZyb20uIChUaGUgZXhlY3V0b3IgYWxyZWFkeSBmb3VuZCBpdDsgYSBkaXJlY3RcbiAgICAvLyBjYWxsZXIncyBzdGFuZC1pbiB0aGF0IGlzIG5vdCBpbiB0aGUgbGVhZiBncmFwaCBzaW1wbHkgaGFzIG5vbmUuKVxuICAgIGNvbnN0IHBhdXNlZCA9IGNoYXJ0LnN0YWdlKGdyYXBoc1tsZWFmTGV2ZWxdLCBzdGFuZEluLmlkKTtcblxuICAgIC8vIDIuIFF1ZXVlIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBwYXVzZSBhdCB0aGUgbGV2ZWwgb2YgaXRzIGZhbi1vdXQuXG4gICAgY29uc3QgcXVldWVzID0gcXVldWVTaWJsaW5nUGF1c2VzKGFyZ3MucGVuZGluZ1BhdXNlcywgeyBjaGFydCwgc3ViZmxvd3MsIHJvb3QsIHBhdGgsIGdyYXBocywgbW91bnRzLCBwYXVzZWQgfSk7XG5cbiAgICAvLyAzLiBUaGUgb25lLXNob3QgZW50cnkgb2YgZXZlcnkgbGV2ZWw6IHRoZSBjaGlsZCwgdGhlbiBpdHMgZGlzcGF0Y2hlcidzXG4gICAgLy8gICAgY29udGludWF0aW9uIOKAlCB1cCB0byB0aGUgZmFuLW91dCB3aGVuIHNpYmxpbmdzIHdhaXQgdGhlcmUuXG4gICAgY29uc3QgY2hpbGRBdCA9IChsZXZlbDogbnVtYmVyKSA9PiAobGV2ZWwgPCBsZWFmTGV2ZWwgPyBtb3VudHNbbGV2ZWxdIDogcGF1c2VkKTtcbiAgICBjb25zdCBlbnRyeUF0ID0gKGxldmVsOiBudW1iZXIpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkQXQobGV2ZWwpO1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBsZXZlbCA8IGxlYWZMZXZlbCA/IG1vdW50c1tsZXZlbF0gOiBzdGFuZEluO1xuICAgICAgaWYgKCFjaGlsZCkgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGNoYXJ0LmVudHJ5KGdyYXBoc1tsZXZlbF0sIGNoaWxkLCByZXBsYWNlbWVudCwgcXVldWVzW2xldmVsXT8uZmFuT3V0KTtcbiAgICB9O1xuICAgIC8vIDQuIFRoZSBob3BzLiBBIHN1YmZsb3cgd2l0aCBubyBjYXB0dXJlIGlzIGVudGVyZWQgYXQgaXRzIFJPT1Qgd2l0aCBpdHNcbiAgICAvLyAgICBpbnB1dE1hcHBlciAoaXRzIGVhcmxpZXIgc3RhZ2VzIHJlY29tcHV0ZSB3aGF0IHRoZSBjYXB0dXJlIGhlbGQpIOKAlFxuICAgIC8vICAgIGV4Y2VwdCB0aGUgbGVhZiwgd2hvc2UgZW50cnkgaXMgYWx3YXlzIHRoZSBzdGFuZC1pbjogcmUtcnVubmluZyBpdFxuICAgIC8vICAgIGZyb20gaXRzIHJvb3Qgd291bGQgYXNrIGFnYWluIGFuZCBsb3NlIHRoZSBhbnN3ZXIuXG4gICAgY29uc3QgaG9wczogUmVzdW1lSG9wPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuICAgIGxldCBldmVyeUxldmVsQXRJdHNFbnRyeSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBwYXRoW2ldO1xuICAgICAgY29uc3Qgc2VlZCA9IG93bkVudHJ5KGNhcHR1cmVzLCBzdWJmbG93SWQpO1xuICAgICAgY29uc3QgaXNMZWFmSG9wID0gaSA9PT0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgaWYgKHNlZWQgPT09IHVuZGVmaW5lZCAmJiAhaXNMZWFmSG9wKSB7XG4gICAgICAgIGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID0gZmFsc2U7XG4gICAgICAgIGhvcHMucHVzaCh7IHN1YmZsb3dJZCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB3YWl0aW5nID0gcXVldWVzW2kgKyAxXT8ucGF1c2VzO1xuICAgICAgaG9wcy5wdXNoKHtcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAuLi4oc2VlZCAhPT0gdW5kZWZpbmVkICYmIHsgc2VlZCB9KSxcbiAgICAgICAgZW50cnk6IGVudHJ5QXQoaSArIDEpLFxuICAgICAgICAuLi4od2FpdGluZyAmJiB7IHBlbmRpbmdQYXVzZXM6IHdhaXRpbmcgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gRXZlcnkgbGV2ZWwgZW50ZXJlZCBhdCBpdHMgZW50cnk6IG9uZSBleGVjdXRpb24gKHRoZSBtb3VudCkgcGVyIGxldmVsXG4gICAgLy8gcnVucyBiZWZvcmUgdGhlIHN0YW5kLWluLlxuICAgIHJldHVybiBuZXcgUmVzdW1lRW50cnkoZW50cnlBdCgwKSwgaG9wcywgcXVldWVzWzBdPy5wYXVzZXMsIGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID8gcGF0aC5sZW5ndGggOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2VlZC1vbmx5IGVudHJ5OiBlYWNoIGNhcHR1cmUgc2VlZHMgdGhlIEZJUlNUIGVudHJ5IGludG8gaXRzIHN1YmZsb3csXG4gICAqIHdoaWNoIHRoZW4gc3RhcnRzIGF0IGl0cyBvd24gcm9vdC4gUGFzcyBpdCBleHBsaWNpdGx5IGFzIGByZXN1bWVgIHRvXG4gICAqIFRyYXZlcnNlck9wdGlvbnMgb3IgSGFuZGxlckRlcHMg4oCUIHRoZSBzYW1lIG9uZS1zaG90IGxhdywgd2l0aG91dCBhXG4gICAqIHN0YW5kLWluIG9yIGEgcGF0aC4gUHJlZmVyIGBwbGFuYCB3aGVuIHJlc3VtaW5nIGEgY2hlY2twb2ludC5cbiAgICovXG4gIHN0YXRpYyBmcm9tQ2FwdHVyZXM8VE91dCwgVFNjb3BlPihjYXB0dXJlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+KFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgT2JqZWN0LmVudHJpZXMoY2FwdHVyZXMpLm1hcCgoW3N1YmZsb3dJZCwgc2VlZF0pID0+ICh7IHN1YmZsb3dJZCwgc2VlZCB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmUtZW50cnkgaW50byBgc3ViZmxvd0lkYCwgdGFrZW4g4oCUIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBlbnRyeSBpc1xuICAgKiBhbiBvcmRpbmFyeSBvbmUgKHRoZSBzdWJmbG93IGlzIG9mZiB0aGUgcGF1c2UgcGF0aCwgb3IgaXRzIGhvcCB3YXMgYWxyZWFkeVxuICAgKiB0YWtlbikuIE9ORS1TSE9UOiBhIGhvcCBpcyByZXR1cm5lZCBhdCBtb3N0IG9uY2UsIHNvIGEgc2Vjb25kIGVudHJ5IGludG9cbiAgICogdGhlIHNhbWUgc3ViZmxvdyAoYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50IGFnYWluKSBydW5zIHRoZSByZWFsIHN1YmZsb3dcbiAgICogZnJvbSBpdHMgcmVhbCByb290IHdpdGggaXRzIGlucHV0TWFwcGVyLlxuICAgKi9cbiAgZW50ZXJTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogUmVzdW1lSG9wPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvcCA9IHRoaXMucGVuZGluZy5nZXQoc3ViZmxvd0lkKTtcbiAgICBpZiAoaG9wICE9PSB1bmRlZmluZWQpIHRoaXMucGVuZGluZy5kZWxldGUoc3ViZmxvd0lkKTtcbiAgICByZXR1cm4gaG9wO1xuICB9XG5cbiAgLyoqIGB0cnVlYCBvbmNlIGV2ZXJ5IGhvcCBoYXMgYmVlbiB0YWtlbiDigJQgdGhlIHJlc3Qgb2YgdGhlIHJ1biBpcyBvcmRpbmFyeS4gKi9cbiAgZ2V0IHNwZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmcuc2l6ZSA9PT0gMDtcbiAgfVxufVxuXG4vLyDilIDilIAgUmFpc2luZyBhIHdhaXRpbmcgc2libGluZydzIHBhdXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFF1ZXVlIGBxdWV1ZWAgYmVoaW5kIGEgcGF1c2UgcGFzc2luZyB0aHJvdWdoIGl0cyBsZXZlbDogYSBwYXVzZSByYWlzZWRcbiAqIHdoaWxlIHNpYmxpbmdzIHN0aWxsIHdhaXQgbXVzdCBjYXJyeSB0aGVtIHRvIGl0cyBjaGVja3BvaW50LiBFYWNoIHBhdGggaXNcbiAqIGN1dCB0byB0aGF0IGxldmVsIOKAlCB0aGUgYnViYmxlLXVwIHByZXBlbmRzIHRoZSBsZXZlbHMgYWJvdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWV1ZUJlaGluZChzaWduYWw6IFBhdXNlU2lnbmFsLCBxdWV1ZTogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHsgcGF1c2UsIGxldmVsIH0gb2YgcXVldWUpIHtcbiAgICBzaWduYWwuYWRkUGVuZGluZ1BhdXNlKHsgLi4ucGF1c2UsIHN1YmZsb3dQYXRoOiBwYXVzZS5zdWJmbG93UGF0aC5zbGljZShsZXZlbCkgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZmlyc3Qgd2FpdGluZyBzaWJsaW5nJ3MgcGF1c2UsIHJhaXNlZCBhZ2FpbiBhdCBpdHMgZmFuLW91dCdzIGxldmVsIOKAlFxuICogZXhhY3RseSBhcyBpdCBidWJibGVkIHVwIHRvIHRoYXQgbGV2ZWwgdGhlIGZpcnN0IHRpbWUgKGl0cyBzdGFnZSwgaXRzXG4gKiBxdWVzdGlvbiwgaXRzIG93biBzdWJmbG93IGNhcHR1cmVzKSwgbm90aGluZyByZS1ydW47IHRoZSByZXN0IG9mIHRoZSBxdWV1ZVxuICogd2FpdHMgYmVoaW5kIGl0LiBUaGUgc3ViZmxvd3MgQUJPVkUgdGhlIGZhbi1vdXQgY2FwdHVyZSB0aGVtc2VsdmVzIGFmcmVzaFxuICogYXMgaXQgYnViYmxlcyB1cCwgc28gdGhleSBjYXJyeSB3aGF0IHRoZSByZXN1bWVkIGNoaWxkIHdyb3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFpc2VRdWV1ZWRQYXVzZShxdWV1ZTogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSk6IFBhdXNlU2lnbmFsIHtcbiAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHF1ZXVlO1xuICBjb25zdCB7IHBhdXNlLCBsZXZlbCB9ID0gZmlyc3Q7XG4gIGNvbnN0IHNpZ25hbCA9IG5ldyBQYXVzZVNpZ25hbChwYXVzZS5wYXVzZURhdGEsIHBhdXNlLnBhdXNlZFN0YWdlSWQsIHBhdXNlLnBhdXNlZEJ5KTtcbiAgLy8gVGhlIHNpYmxpbmcgcGF1c2VkIGluIGFuIEVBUkxJRVIgcnVuOiBpdHMgb3duIGV4ZWN1dGlvbiwgbm90IHRoaXMgcnVuJ3MuXG4gIGlmIChpc1BhdXNlZEV4ZWN1dGlvbihwYXVzZS5wYXVzZWRFeGVjdXRpb24pKSB7XG4gICAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCwgcGF1c2UucGF1c2VkRXhlY3V0aW9uLnJ1bklkKTtcbiAgfVxuICBjb25zdCBiZWxvdyA9IHBhdXNlLnN1YmZsb3dQYXRoLnNsaWNlKGxldmVsKTtcbiAgZm9yIChsZXQgaSA9IGJlbG93Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBvd25FbnRyeShwYXVzZS5zdWJmbG93U3RhdGVzLCBiZWxvd1tpXSk7XG4gICAgaWYgKHN0YXRlICE9PSB1bmRlZmluZWQpIHNpZ25hbC5jYXB0dXJlU3ViZmxvd1Njb3BlKGJlbG93W2ldLCBzdGF0ZSk7XG4gICAgc2lnbmFsLnByZXBlbmRTdWJmbG93KGJlbG93W2ldKTtcbiAgfVxuICBxdWV1ZUJlaGluZChzaWduYWwsIHJlc3QpO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG4vLyDilIDilIAgUmVhZGluZyB0aGUgY2hhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIG5vZGUgdGhhdCBtb3VudHMgYHN1YmZsb3dJZGAsIGZvdW5kIGJ5IERGUyBmcm9tIGBzdGFydGAgb3ZlciBgbmV4dGAgYW5kXG4gKiBgY2hpbGRyZW5gIChsb29wLXJlZiBzdHVicyBza2lwcGVkIOKAlCB0aGV5IHNoYXJlIHRoZWlyIHRhcmdldCdzIGlkIGFuZCBjYXJyeVxuICogbm90aGluZykuIEN5Y2xlLXNhZmUgKHZpc2l0ZWQgYnkgaWRlbnRpdHksIHNvIGFuIGFic2VudCBpZCB0ZXJtaW5hdGVzIHRvbyk7XG4gKiBmaXJzdCBtYXRjaCBpbiBERlMgcHJlLW9yZGVyIChjaGlsZHJlbiBiZWZvcmUgYG5leHRgLCBsaWtlIHRoZSBidWlsZGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNb3VudDxUT3V0LCBUU2NvcGU+KFxuICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIHN1YmZsb3dJZDogc3RyaW5nLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgZGlzcGF0Y2hlckluZGV4KHN0YXJ0KS5rZXlzKCkpIHtcbiAgICBpZiAobm9kZS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFdmVyeSByZWFsIG5vZGUgb2Ygb25lIGxldmVsJ3MgZ3JhcGgsIGluIERGUyBwcmUtb3JkZXIsIG1hcHBlZCB0byB0aGVcbiAqIERJU1BBVENIRVIgd2hvc2UgY2hpbGQtY2hhaW4gaG9sZHMgaXQg4oCUIHRoZSBub2RlIHdob3NlIGBjaGlsZHJlbmAgaXRcbiAqIGRlc2NlbmRzIGZyb20gKGEgZGVjaWRlciwgYSBzZWxlY3RvciwgYSBmb3JrKSDigJQgb3IgYHVuZGVmaW5lZGAgZm9yIGEgbm9kZVxuICogb24gdGhlIGxldmVsJ3Mgb3duIHNwaW5lLiBMb29wIHN0dWJzIGFyZSBza2lwcGVkOyB2aXNpdGVkIGJ5IGlkZW50aXR5LCBzb1xuICogdHdvIG1vdW50cyBzaGFyaW5nIGFuIGlkIGFyZSBib3RoIGluZGV4ZWQgYW5kIGEgY3ljbGUgdGVybWluYXRlcy5cbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hlckluZGV4PFRPdXQsIFRTY29wZT4oXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuKTogTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBzdGFjazogQXJyYXk8W1N0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZF0+ID0gW1tyb290LCB1bmRlZmluZWRdXTtcbiAgZm9yIChsZXQgdG9wID0gc3RhY2sucG9wKCk7IHRvcCAhPT0gdW5kZWZpbmVkOyB0b3AgPSBzdGFjay5wb3AoKSkge1xuICAgIGNvbnN0IFtub2RlLCBkaXNwYXRjaGVyXSA9IHRvcDtcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYgfHwgaW5kZXguaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICBpbmRleC5zZXQobm9kZSwgZGlzcGF0Y2hlcik7XG4gICAgLy8gTElGTzogcHVzaCBgbmV4dGAgZmlyc3QgYW5kIGNoaWxkcmVuIHJldmVyc2VkLCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZFxuICAgIC8vIGJlZm9yZSBgbmV4dGAgYW5kIHRoZSBmaXJzdCBjaGlsZCBmaXJzdCDigJQgcHJlLW9yZGVyLCBsaWtlIHRoZSBidWlsZGVyLlxuICAgIGlmIChub2RlLm5leHQpIHN0YWNrLnB1c2goW25vZGUubmV4dCwgZGlzcGF0Y2hlcl0pO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBpID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgc3RhY2sucHVzaChbbm9kZS5jaGlsZHJlbltpXSwgbm9kZV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKiBPbmUgcGxhbidzIHZpZXcgb2YgdGhlIGNoYXJ0OiBlYWNoIGxldmVsJ3MgaW5kZXggYnVpbHQgb25jZS4gKi9cbmNsYXNzIENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhlcyA9IG5ldyBNYXA8XG4gICAgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD5cbiAgPigpO1xuXG4gIHByaXZhdGUgb2Yocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4ZXMuZ2V0KHJvb3QpO1xuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gZGlzcGF0Y2hlckluZGV4KHJvb3QpO1xuICAgICAgdGhpcy5pbmRleGVzLnNldChyb290LCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBtb3VudCBvZiBgc3ViZmxvd0lkYCBpbiBgcm9vdGAncyBncmFwaCwgaW4gREZTIHByZS1vcmRlci4gKi9cbiAgbW91bnRzT2Yocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm9mKHJvb3QpLmtleXMoKV0uZmlsdGVyKChub2RlKSA9PiBub2RlLnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKiBUaGUgb25lIG1vdW50IG9mIGBzdWJmbG93SWRgIGluIGByb290YCdzIGdyYXBoIOKAlCByZWZ1c2VkIHdoZW4gYWJzZW50IG9yIGFtYmlndW91cy4gKi9cbiAgb25seU1vdW50KHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzdWJmbG93SWQ6IHN0cmluZywgZ3JhcGhOYW1lOiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgZm91bmQgPSB0aGlzLm1vdW50c09mKHJvb3QsIHN1YmZsb3dJZCk7XG4gICAgaWYgKGZvdW5kLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogdGhlIG1vdW50IG9mIHN1YmZsb3cgJyR7c3ViZmxvd0lkfScgaXMgbm90IHJlYWNoYWJsZSBmcm9tICR7Z3JhcGhOYW1lfS4gYCArXG4gICAgICAgICAgXCJUaGUgY2hlY2twb2ludCdzIHN1YmZsb3dQYXRoIGRvZXMgbm90IG1hdGNoIHRoaXMgY2hhcnQg4oCUIGl0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZm91bmQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3ViZmxvdyAnJHtzdWJmbG93SWR9JyBpcyBtb3VudGVkIG1vcmUgdGhhbiBvbmNlIGluICR7Z3JhcGhOYW1lfSBgICtcbiAgICAgICAgICBgKCR7Zm91bmQubWFwKChub2RlKSA9PiBgJyR7bm9kZS5uYW1lfSdgKS5qb2luKCcsICcpfSksIGFuZCBhIGNoZWNrcG9pbnQncyBzdWJmbG93UGF0aCBjYW5ub3Qgc2F5IHdoaWNoIGAgK1xuICAgICAgICAgICdtb3VudCBwYXVzZWQuIEdpdmUgZWFjaCBtb3VudCBpdHMgb3duIHN1YmZsb3cgaWQgdG8gbWFrZSBhIHBhdXNlIGluc2lkZSBpdCByZXN1bWFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZFswXTtcbiAgfVxuXG4gIC8qKiBUaGUgcmVhbCBzdGFnZSBgaWRgIGluIGByb290YCdzIGdyYXBoIChmaXJzdCBpbiBERlMgcHJlLW9yZGVyKSwgaWYgYW55LiAqL1xuICBzdGFnZShyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgaWQ6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5vZihyb290KS5rZXlzKCkpIGlmIChub2RlLmlkID09PSBpZCkgcmV0dXJuIG5vZGU7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgZGlzcGF0Y2hlciB3aG9zZSBjaGlsZC1jaGFpbiBob2xkcyBgbm9kZWAgaW4gYHJvb3RgJ3MgZ3JhcGggKGB1bmRlZmluZWRgIG9uIHRoZSBzcGluZSkuICovXG4gIGRpc3BhdGNoZXJPZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub2Yocm9vdCkuZ2V0KG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUtc2hvdCBlbnRyeSBmb3IgYGNoaWxkYCAoYSBtb3VudCBvbiB0aGUgcGF0aCwgb3IgdGhlIHBhdXNlZCBzdGFnZSlcbiAgICogaW4gYHJvb3RgJ3MgZ3JhcGg6IGByZXBsYWNlbWVudGAgKHRoZSBub2RlIHRoYXQgcnVucyDigJQgdGhlIG1vdW50IGl0c2VsZixcbiAgICogb3IgdGhlIHN0YW5kLWluKSB3aXRoIHdoYXQgcmFuIGFmdGVyIGBjaGlsZGAncyBjaGFpbiBvbiB0aGUgb3JpZ2luYWwgcnVuXG4gICAqIGF0dGFjaGVkIHdoZXJlIHRoYXQgY2hhaW4gZW5kcyDigJQgYHsgLi4uY2hpbGQsIG5leHQ6IGRpc3BhdGNoZXIubmV4dCB9YCBmb3JcbiAgICogYSBjaGFydCB0aGUgYnVpbGRlciBtYWRlOlxuICAgKlxuICAgKiAgIOKAoiBvbiB0aGUgbGV2ZWwncyBzcGluZTogbm90aGluZyB0byBhdHRhY2gg4oCUIHRoZSBzcGluZSBnb2VzIG9uIGJ5IGl0c2VsZjtcbiAgICogICDigKIgYSBERUNJREVSJ3Mgb3IgU0VMRUNUT1IncyBicmFuY2g6IHRoZSBkaXNwYXRjaGVyJ3MgYG5leHRgO1xuICAgKiAgIOKAoiBhIEZPUksgY2hpbGQ6IHRoZSBmb3JrJ3MgYG5leHRgIOKAlCBpdHMgam9pbi5cbiAgICpcbiAgICogUGFzdCBhIGRpc3BhdGNoZXIgd2l0aCBubyBgbmV4dGAsIHRoZSB3YWxrIGdvZXMgb24gT1VUV0FSRCB0byB0aGUgb25lXG4gICAqIGVuY2xvc2luZyBpdC4gSXQgc3RvcHMgYXQgYHN0b3BBdGAg4oCUIHRoZSBmYW4tb3V0IHdoZXJlIHNpYmxpbmdzIHN0aWxsXG4gICAqIHdhaXQsIHdob3NlIGpvaW4gbXVzdCBub3QgcnVuIHlldC4gTm90aGluZyB0byBhdHRhY2g6IGByZXBsYWNlbWVudGBcbiAgICogaXRzZWxmLlxuICAgKi9cbiAgZW50cnkoXG4gICAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hpbGQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHJlcGxhY2VtZW50OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdG9wQXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIGFwcGVuZEF0Q2hhaW5FbmQocmVwbGFjZW1lbnQsIHRoaXMuYWZ0ZXIocm9vdCwgY2hpbGQsIHN0b3BBdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgcnVucyBvbmNlIGBub2RlYCdzIGNoYWluIGVuZHM6IGl0cyBkaXNwYXRjaGVyJ3MgYG5leHRgIGNoYWluLCB0aGVuIOKAlFxuICAgKiB3aGVyZSBUSEFUIGVuZHMg4oCUIHRoZSBjb250aW51YXRpb24gb2YgdGhlIGRpc3BhdGNoZXIgZW5jbG9zaW5nIGl0LCBvdXR3YXJkLFxuICAgKiB1cCB0byBgc3RvcEF0YCAoZXhjbHVzaXZlKS4gYHVuZGVmaW5lZGAgb24gdGhlIHNwaW5lLlxuICAgKi9cbiAgcHJpdmF0ZSBhZnRlcihcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdG9wQXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlck9mKHJvb3QsIG5vZGUpO1xuICAgIGlmIChkaXNwYXRjaGVyID09PSB1bmRlZmluZWQgfHwgZGlzcGF0Y2hlciA9PT0gc3RvcEF0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5hZnRlcihyb290LCBkaXNwYXRjaGVyLCBzdG9wQXQpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLm5leHQgPyBhcHBlbmRBdENoYWluRW5kKGRpc3BhdGNoZXIubmV4dCwgb3V0ZXIpIDogb3V0ZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBgc3RhcnRgJ3MgY2hhaW4gd2l0aCBgYWZ0ZXJgIGF0dGFjaGVkIHdoZXJlIGl0IGVuZHMg4oCUIHRoZSBjaGFpbidzIG5vZGVzXG4gKiBjb3BpZWQgb24gdGhlIHdheSAobmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZTogaWRzIHN0aWxsIHJlc29sdmUgdG8gdGhlIHJlYWxcbiAqIG5vZGVzKS4gQSBjaGFpbiB0aGF0IGVuZHMgaW4gYSBsb29wIHN0dWIgKG9yIGxvb3BzIGJhY2sgb24gaXRzZWxmKSBpc1xuICogcmV0dXJuZWQgYXMgaXM6IGNvbnRyb2wgbGVhdmVzIGl0IHRocm91Z2ggdGhlIGxvb3AsIG5ldmVyIFwiYWZ0ZXJcIiBpdC5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kQXRDaGFpbkVuZDxUT3V0LCBUU2NvcGU+KFxuICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGFmdGVyOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgaWYgKGFmdGVyID09PSB1bmRlZmluZWQpIHJldHVybiBzdGFydDtcbiAgY29uc3QgY2hhaW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gIGZvciAobGV0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkID0gc3RhcnQ7IG5vZGUgIT09IHVuZGVmaW5lZDsgbm9kZSA9IG5vZGUubmV4dCkge1xuICAgIGlmIChub2RlLmlzTG9vcFJlZiB8fCBzZWVuLmhhcyhub2RlKSkgcmV0dXJuIHN0YXJ0O1xuICAgIHNlZW4uYWRkKG5vZGUpO1xuICAgIGNoYWluLnB1c2gobm9kZSk7XG4gIH1cbiAgbGV0IG5leHQgPSBhZnRlcjtcbiAgZm9yIChsZXQgaSA9IGNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBuZXh0ID0geyAuLi5jaGFpbltpXSwgbmV4dCB9O1xuICByZXR1cm4gbmV4dDtcbn1cblxuLy8g4pSA4pSAIFdhaXRpbmcgc2libGluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBUaGUgc2libGluZyBwYXVzZXMgd2FpdGluZyBhdCBvbmUgbGV2ZWwsIGFuZCB0aGUgZmFuLW91dCB0aGV5IHdhaXQgaW4uICovXG5pbnRlcmZhY2UgTGV2ZWxRdWV1ZTxUT3V0LCBUU2NvcGU+IHtcbiAgcmVhZG9ubHkgZmFuT3V0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcmVhZG9ubHkgcGF1c2VzOiBRdWV1ZWRQYXVzZVtdO1xufVxuXG4vKipcbiAqIFBsYWNlIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgIChkZWNvZGVkIOKAlCBgcGF1c2UvcmVjb3JkLnRzYCkgYW5kIHF1ZXVlIGVhY2ggYXQgdGhlXG4gKiBsZXZlbCBvZiBpdHMgZmFuLW91dDogdGhlIGRlcHRoIHdoZXJlIGl0cyBwYXRoIHBhcnRzIGZyb20gdGhlIHBhdXNlZFxuICogc3RhZ2Uncy4gVGhlcmUsIHRoZSBwYXVzZWQgc3RhZ2UncyBjaGlsZCAoYSBtb3VudCBvbiB0aGUgcGF0aCwgb3IgdGhlIHN0YWdlXG4gKiBpdHNlbGYpIGFuZCB0aGUgc2libGluZydzIG11c3QgYm90aCBoYW5nIG9mZiBPTkUgcGFyYWxsZWwgZGlzcGF0Y2hlciDigJQgYVxuICogZm9yayBvciBhIHNlbGVjdG9yIOKAlCBvciB0aGUgcmVjb3JkIGlzIG5vdCBhIHNpYmxpbmcgYW5kIHRoZSByZXN1bWUgaXNcbiAqIHJlZnVzZWQgcmF0aGVyIHRoYW4gYXNrZWQgYSBxdWVzdGlvbiB0aGUgY2hhcnQgY291bGQgbm90IGhhdmUgcmFpc2VkLlxuICovXG5mdW5jdGlvbiBxdWV1ZVNpYmxpbmdQYXVzZXM8VE91dCwgVFNjb3BlPihcbiAgcGVuZGluZzogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW10gfCB1bmRlZmluZWQsXG4gIGF0OiB7XG4gICAgY2hhcnQ6IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBncmFwaHM6IHJlYWRvbmx5IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgbW91bnRzOiByZWFkb25seSBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIHBhdXNlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIH0sXG4pOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcXVldWVzOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+ID0gW107XG4gIGlmIChwZW5kaW5nID09PSB1bmRlZmluZWQpIHJldHVybiBxdWV1ZXM7XG4gIC8vIFRoZSBjb2RlYydzIGNoZWNrIChgcGF1c2UvcmVjb3JkLnRzYCkg4oCUIGBwbGFuYCBpcyBhIHB1YmxpYyBkb29yIHRvbywgc28gaXRcbiAgLy8gbmV2ZXIgdGFrZXMgYSBzaWJsaW5nIHJlY29yZCB1bmNoZWNrZWQsIGhvd2V2ZXIgaXQgd2FzIGhhbmRlZCBvbmUuXG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVQZW5kaW5nUGF1c2VzKHBlbmRpbmcpO1xuICBjb25zdCB7IGNoYXJ0LCBzdWJmbG93cywgcm9vdCwgcGF0aCwgZ3JhcGhzLCBtb3VudHMsIHBhdXNlZCB9ID0gYXQ7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBFYWNoIHJlY29yZCdzIEZJRUxEUyBhcmUgY2hlY2tlZCBhYm92ZTsgaGVyZSBpdCBpcyBhc2tlZCB3aGV0aGVyIHRoZVxuICAvLyByZWNvcmQgZml0cyBUSElTIGNoYXJ0LlxuICBkZWNvZGVkLmZvckVhY2goKHBhdXNlLCBuKSA9PiB7XG4gICAgLy8gT25lIHJlY29yZCBwZXIgcGF1c2VkIHNpYmxpbmc6IGEgcmVwZWF0IHdvdWxkIGFzayB0aGUgc2FtZSBxdWVzdGlvbiB0d2ljZS5cbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcGF1c2Uuc3ViZmxvd1BhdGgsIHBhdXNlLnBhdXNlZFN0YWdlSWRdKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzWyR7bn1dICgnJHtwYXVzZS5wYXVzZWRTdGFnZUlkfScpIHJlcGVhdHMgYW4gZWFybGllciBlbnRyeS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIHdoaWxlIChsZXZlbCA8IHBhdGgubGVuZ3RoICYmIGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoICYmIHBhdGhbbGV2ZWxdID09PSBwYXVzZS5zdWJmbG93UGF0aFtsZXZlbF0pIGxldmVsKys7XG4gICAgY29uc3QgZ3JhcGggPSBncmFwaHNbbGV2ZWxdO1xuICAgIGNvbnN0IG91cnMgPSBsZXZlbCA8IHBhdGgubGVuZ3RoID8gbW91bnRzW2xldmVsXSA6IHBhdXNlZDtcbiAgICBjb25zdCB0aGVpck1vdW50cyA9IGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoID8gY2hhcnQubW91bnRzT2YoZ3JhcGgsIHBhdXNlLnN1YmZsb3dQYXRoW2xldmVsXSkgOiBbXTtcbiAgICBjb25zdCB0aGVpcnMgPVxuICAgICAgbGV2ZWwgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGhcbiAgICAgICAgPyB0aGVpck1vdW50cy5sZW5ndGggPT09IDFcbiAgICAgICAgICA/IHRoZWlyTW91bnRzWzBdXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgOiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCk7XG4gICAgY29uc3QgZmFuT3V0ID0gb3VycyA/IGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgb3VycykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNTaWJsaW5nID1cbiAgICAgIG91cnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhlaXJzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG91cnMgIT09IHRoZWlycyAmJlxuICAgICAgZmFuT3V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgdGhlaXJzKSA9PT0gZmFuT3V0ICYmXG4gICAgICAhZmFuT3V0LmRlY2lkZXJGbiAmJlxuICAgICAgKHF1ZXVlc1tsZXZlbF0gPT09IHVuZGVmaW5lZCB8fCBxdWV1ZXNbbGV2ZWxdIS5mYW5PdXQgPT09IGZhbk91dCk7XG4gICAgaWYgKCFpc1NpYmxpbmcgfHwgIXdhbGtzVG9JdHNTdGFnZShjaGFydCwgc3ViZmxvd3MsIGdyYXBoLCBwYXVzZSwgbGV2ZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNbJHtufV0gKCcke3BhdXNlLnBhdXNlZFN0YWdlSWR9JykgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiBgICtcbiAgICAgICAgICBgdGhlIHBhdXNlZCBzdGFnZSAnJHtwYXVzZWQ/LmlkID8/ICc/J30nIGluIHRoaXMgY2hhcnQg4oCUIG5vIGZvcmsgb3Igc2VsZWN0b3IgcnVucyB0aGVtIGJvdGgsIG9yIGl0cyBgICtcbiAgICAgICAgICAncGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoYXQgc3RhZ2UuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBsZWFmUm9vdCA9XG4gICAgICBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggPT09IDAgPyByb290IDogb3duRW50cnkoc3ViZmxvd3MsIHBhdXNlLnN1YmZsb3dQYXRoW3BhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdKT8ucm9vdDtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSAobGVhZlJvb3QgJiYgY2hhcnQuc3RhZ2UobGVhZlJvb3QsIHBhdXNlLnBhdXNlZFN0YWdlSWQpPy5uYW1lKSA/PyBwYXVzZS5wYXVzZWRTdGFnZUlkO1xuICAgIGNvbnN0IHF1ZXVlID0gKHF1ZXVlc1tsZXZlbF0gPz89IHsgZmFuT3V0OiBmYW5PdXQhLCBwYXVzZXM6IFtdIH0pO1xuICAgIHF1ZXVlLnBhdXNlcy5wdXNoKHsgcGF1c2UsIGxldmVsLCBzdGFnZU5hbWUgfSk7XG4gIH0pO1xuICByZXR1cm4gcXVldWVzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB3YWl0aW5nIHNpYmxpbmcncyBXSE9MRSBwYXRoIGJlbG93IGl0cyBmYW4tb3V0IHdhbGtzIHRoaXMgY2hhcnQ6XG4gKiBldmVyeSBzZWdtZW50IHRoZSBvbmx5IG1vdW50IG9mIGl0cyBzdWJmbG93IGluIHRoZSBlbmNsb3NpbmcgZ3JhcGgsIGV2ZXJ5XG4gKiBzdWJmbG93IHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBsYXN0IGdyYXBoIOKAlCBjaGVja2VkIGF0XG4gKiB0aGUgRklSU1QgcmVzdW1lLCBzbyBhIHRhbXBlcmVkIHJlY29yZCBpcyByZWZ1c2VkIHVwIGZyb250LCBub3Qgd2hlbiBpdHNcbiAqIHR1cm4gY29tZXMuXG4gKi9cbmZ1bmN0aW9uIHdhbGtzVG9JdHNTdGFnZTxUT3V0LCBUU2NvcGU+KFxuICBjaGFydDogQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZCxcbiAgZmFuT3V0R3JhcGg6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZTogUGVuZGluZ1BhdXNlLFxuICBsZXZlbDogbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGxldCBncmFwaCA9IGZhbk91dEdyYXBoO1xuICBmb3IgKGxldCBpID0gbGV2ZWw7IGkgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjaGFydC5tb3VudHNPZihncmFwaCwgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pO1xuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGdyYXBoID0gZGVmaW5pdGlvbi5yb290O1xuICB9XG4gIHJldHVybiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIGByZWNvcmRba2V5XWAgb25seSB3aGVuIGl0IGlzIHRoZSByZWNvcmQncyBPV04gcHJvcGVydHkg4oCUIG5ldmVyIHRocm91Z2ggdGhlIHByb3RvdHlwZSBjaGFpbi4gKi9cbmZ1bmN0aW9uIG93bkVudHJ5PFQ+KHJlY29yZDogUmVjb3JkPHN0cmluZywgVD4gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZWNvcmQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlY29yZCwga2V5KSA/IHJlY29yZFtrZXldIDogdW5kZWZpbmVkO1xufVxuIl19
|
|
458
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdW1lRW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERHOzs7QUFFSCxxREFBNEQ7QUFFNUQsbURBQXNFO0FBOEN0RSxNQUFhLFdBQVc7SUFDdEI7Ozs7O09BS0c7SUFDTSxLQUFLLENBQXNDO0lBQ3BELDZGQUE2RjtJQUNwRixrQkFBa0IsQ0FBcUM7SUFDaEU7Ozs7OztPQU1HO0lBQ00sa0JBQWtCLENBQXFCO0lBQ2hELGlGQUFpRjtJQUNoRSxPQUFPLENBQXVDO0lBRS9ELFlBQ0UsS0FBMEMsRUFDMUMsSUFBd0MsRUFDeEMsa0JBQTJDLEVBQzNDLGtCQUEyQjtRQUUzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBZSxJQU96QjtRQUNDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxFQUFnQixDQUFDO1FBRTdDLDBFQUEwRTtRQUMx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Q0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0RCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsbUdBQW1HO0FBQ25HLFNBQVMsUUFBUSxDQUFJLE1BQXFDLEVBQUUsR0FBVztJQUNyRSxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMvRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXN1bWVFbnRyeSDigJQgdGhlIHJlc3VtZSdzIE9ORS1TSE9UIHJlLWVudHJ5IChNMiwgcGF1c2UvcmVzdW1lKS5cbiAqXG4gKiBBIHJlc3VtZSBoYXMgdG8gZ2V0IGJhY2sgdG8gYSBzdGFnZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhcnQuIEl0IGRvZXMgdGhhdFxuICogd2l0aCBhIHNtYWxsIHN5bnRoZXRpYyBzdHJ1Y3R1cmU6IGEgc3RhbmQtaW4gZm9yIHRoZSBwYXVzZWQgc3RhZ2UgKHRoZVxuICogc3RhZ2UncyBvd24gbm9kZSB3aXRoIGl0cyBmdW5jdGlvbiBzd2FwcGVkIGZvciB0aGUgcmVzdW1lIGhhbGYg4oCUIG9yLCBmb3IgYW5cbiAqIGBpbnRlcnJ1cHQoKWAgcGF1c2UsIGZvciBpdHMgb3duIGZ1bmN0aW9uIHdpdGggdGhlIGFuc3dlciBkZXBvc2l0ZWQpLCBhbmQsXG4gKiBmb3IgYSBwYXVzZSBpbnNpZGUgc3ViZmxvd3MsIHRoZSBjaGVja3BvaW50J3MgY2FwdHVyZSBvZiBlYWNoIHN1YmZsb3cnc1xuICogc3RhdGUgb24gdGhlIHdheSBkb3duLlxuICpcbiAqIFRIRSBMQVc6IHRoYXQgc3RydWN0dXJlIGlzIHVzZWQgRVhBQ1RMWSBPTkNFLCBmb3IgdGhlIHJlLWVudHJ5LiBUaGUgc3RhbmQtaW5cbiAqIGlzIHdoZXJlIHRoZSByZXN1bWVkIHRyYXZlcnNhbCBTVEFSVFMgKG9yIHdoZXJlIHRoZSBsZWFmIHN1YmZsb3cncyB0cmF2ZXJzYWxcbiAqIHN0YXJ0cykg4oCUIGl0IGlzIG5ldmVyIGEgbm9kZSBhbnkgaWQgY2FuIHJlc29sdmUgdG8uIEVhY2ggc3ViZmxvdyBvbiB0aGUgcGF1c2VcbiAqIHBhdGggdGFrZXMgaXRzIHNlZWQgYW5kIGl0cyBlbnRyeSBwb2ludCBvbiBpdHMgRklSU1QgZW50cnkgYW5kIG5ldmVyIGFnYWluLlxuICogQWZ0ZXIgdGhhdCB0aGUgcnVuIGJlbG9uZ3MgdG8gdGhlIHJlYWwgY2hhcnQ6IGV2ZXJ5IGxvb3AgdGFyZ2V0LCBldmVyeSBsYXRlclxuICogc3ViZmxvdyBlbnRyeSAocmVhbCByb290LCBpbnB1dE1hcHBlciBydW5zKSwgZXZlcnkgcmUtdmlzaXQgb2YgdGhlIHBhdXNlZFxuICogc3RhZ2UgKHdoaWNoIHBhdXNlcyBhZ2FpbikgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgY2hhcnQgYXMgYnVpbHQuXG4gKlxuICogT05FIFJVTEUgQVQgRVZFUlkgTEVWRUwg4oCUIHdoYXQgcnVucyBhZnRlciB0aGUgZW50cnkuIE9uIHRoZSBvcmlnaW5hbCBydW4sXG4gKiB3aGF0ZXZlciBESVNQQVRDSEVEIHRoZSBwYXVzZWQgc3RhZ2UgKG9yIHRoZSBtb3VudCBvZiB0aGUgbmV4dCBzdWJmbG93IG9uXG4gKiB0aGUgcGF0aCkg4oCUIGEgZGVjaWRlciwgYSBzZWxlY3RvciwgYSBmb3JrIOKAlCByYW4gaXRzIG93biBjb250aW51YXRpb24gb25jZVxuICogdGhhdCBjaGlsZCdzIGNoYWluIGVuZGVkOiB0aGUgZGVjaWRlcidzIGBuZXh0YCwgdGhlIGZvcmsncyBqb2luLiBBIHJlc3VtZVxuICogZW50ZXJzIEFUIHRoZSBjaGlsZCwgc28gdGhhdCBjb250aW51YXRpb24gbXVzdCBiZSBjYXJyaWVkOiB0aGUgZW50cnkgaXNcbiAqIHRoZSBjaGlsZCB3aXRoIHRoZSBlbmNsb3NpbmcgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZCBhdCB0aGUgZW5kXG4gKiBvZiBpdHMgb3duIGNoYWluIChgeyAuLi5jaGlsZCwgbmV4dDogZGlzcGF0Y2hlci5uZXh0IH1gIGZvciBhIGNoYXJ0IHRoZVxuICogYnVpbGRlciBtYWRlKS4gSXQgaXMgcmVhZCBmcm9tIHRoZSBDSEFSVCwgbGV2ZWwgYnkgbGV2ZWwg4oCUIG5ldmVyIGZyb20gdGhlXG4gKiBjaGVja3BvaW50LCBzbyBhbiBlZGl0ZWQgY2hlY2twb2ludCBjYW5ub3QgcmVkaXJlY3QgYSBydW4g4oCUIGFuZCBpdCBsYW5kc1xuICogYXQgdGhlIGxldmVsIGl0IGJlbG9uZ3MgdG86IGEgdG9wLWxldmVsIGRlY2lkZXIncyBgbmV4dGAgcnVucyBhdCB0aGUgdG9wXG4gKiBsZXZlbCwgYWZ0ZXIgdGhlIHN1YmZsb3cncyBvdXRwdXRNYXBwZXIsIG5vdCBpbnNpZGUgdGhlIHN1YmZsb3cuXG4gKlxuICogUEFSQUxMRUwgU0lCTElOR1MgVEhBVCBQQVVTRUQgVE9PICg5LjI4LjApLiBXaGVuIHR3byBjaGlsZHJlbiBvZiBvbmVcbiAqIGZhbi1vdXQgcGF1c2VkLCB0aGUgY2hlY2twb2ludCBhc2tzIHRoZSBmaXJzdCBhbmQgY2FycmllcyB0aGUgb3RoZXJzXG4gKiAoYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLiBBdCB0aGF0IGZhbi1vdXQncyBsZXZlbCB0aGUgZW50cnkgaXNcbiAqIHRoZSBjaGlsZCdzIG93biBjaGFpbiBvbmx5IOKAlCBubyBqb2luIOKAlCBhbmQgb25jZSBpdCBlbmRzLCB0aGUgbmV4dCBzaWJsaW5nJ3NcbiAqIHBhdXNlIGlzIHJhaXNlZCBhZ2FpbiBhcyBpdCB3YXMgKGl0cyBxdWVzdGlvbiwgaXRzIGNhcHR1cmVkIHN0YXRlKSwgd2l0aG91dFxuICogcmUtcnVubmluZyBhbnl0aGluZy4gVGhlIGpvaW4gcnVucyBvbmx5IHdoZW4gdGhlIGxhc3Qgc2libGluZyBpcyByZXN1bWVkLlxuICpcbiAqIEJlZm9yZSA5LjI4LjAgdGhlIHN0cnVjdHVyZSBzdGF5ZWQgaW4gZm9yY2UgZm9yIHRoZSB3aG9sZSByZXN1bWVkIHJ1biDigJQgdGhlXG4gKiB0cmF2ZXJzYWwgd2FzIFJPT1RFRCBhdCB0aGUgc3RhbmQtaW4gKHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgaWQgcmUtcmFuXG4gKiB0aGUgcmVzdW1lIGhhbGYsIGFuZCBhIGxvb3AgdGFyZ2V0IHVwc3RyZWFtIG9mIHRoZSByZXN1bWUgcG9pbnQgd2FzXG4gKiB1bnJlYWNoYWJsZTogb25lIHN0YWdlIHJhbiwgdGhlbiB0aGUgcnVuIGVuZGVkIHNpbGVudGx5KSwgYW5kIHRoZSBsZWFmXG4gKiBzdWJmbG93J3Mgcm9vdCB3YXMgU1dBUFBFRCBmb3IgdGhlIHN0YW5kLWluIGluIHRoZSBzdWJmbG93IGRpY3Rpb25hcnkgKHNvIGFcbiAqIGxhdGVyIGVudHJ5IGludG8gaXQgd291bGQgcmUtcnVuIHRoZSByZXN1bWUgaGFsZiBvbiBhIHN0YWxlIHNlZWQpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBXaGF0IEZsb3dDaGFydEV4ZWN1dG9yLnJlc3VtZSgpIGJ1aWxkcyBmb3IgYSBwYXVzZSBhdCAnc2YtYS9zZi1iL2FzaydcbiAqIC8vIChzdWJmbG93UGF0aCBbJ3NmLWEnLCAnc2YtYS9zZi1iJ10pLCAnc2YtYS9zZi1iJyBtb3VudGVkIGFzIGEgZGVjaWRlclxuICogLy8gYnJhbmNoIGluc2lkZSBzZi1hIHdob3NlIGRlY2lkZXIgY29udGludWVzIHRvICdzZi1hL2FmdGVyJzpcbiAqIGNvbnN0IGVudHJ5ID0gUmVzdW1lRW50cnkucGxhbih7IHJvb3QsIHN1YmZsb3dzLCBwYXRoLCBjYXB0dXJlcywgc3RhbmRJbiB9KTtcbiAqIGVudHJ5LnN0YXJ0OyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0b3AtbGV2ZWwgbW91bnQgb2YgJ3NmLWEnXG4gKiBlbnRyeS5lbnRlclN1YmZsb3coJ3NmLWEnKTsgICAgICAvLyB7IHNlZWQ6IHNmLWEncyBjYXB0dXJlLCBlbnRyeTogeyAuLi5tb3VudCBvZiAnc2YtYS9zZi1iJywgbmV4dDogc2YtYS9hZnRlciB9IH1cbiAqIGVudHJ5LmVudGVyU3ViZmxvdygnc2YtYS9zZi1iJyk7IC8vIHsgc2VlZDogc2YtYidzIGNhcHR1cmUsIGVudHJ5OiB0aGUgc3RhbmQtaW4gfVxuICogZW50cnkuZW50ZXJTdWJmbG93KCdzZi1hL3NmLWInKTsgLy8gdW5kZWZpbmVkIOKAlCBhIGxhdGVyIGVudHJ5IGlzIGFuIG9yZGluYXJ5IG9uZVxuICogYGBgXG4gKlxuICogQSBwYXVzZSB0d28gKG9yIG1vcmUpIHN1YmZsb3dzIGRlZXAgdGhlcmVmb3JlIHJlLWVudGVycyBlYWNoIG91dGVyIHN1YmZsb3dcbiAqIEFUIHRoZSBtb3VudCBvZiB0aGUgbmV4dCBvbmUg4oCUIHRoZSBvdXRlciBzdWJmbG93J3Mgc3RhZ2VzIGJlZm9yZSB0aGF0IG1vdW50XG4gKiBkbyBub3QgcnVuIGFnYWluICh0aGV5IGRpZCBiZWZvcmUgOS4yOC4wKS4gVGhlIG9uZSBleGNlcHRpb24gaXMgYSBkZWdyYWRlZFxuICogY2hlY2twb2ludCBtaXNzaW5nIGFuIG91dGVyIHN1YmZsb3cncyBjYXB0dXJlOiB0aGF0IHN1YmZsb3cgcmUtcnVucyBmcm9tIGl0c1xuICogcm9vdCB3aXRoIGl0cyBpbnB1dE1hcHBlciAoaXRzIGVhcmxpZXIgc3RhZ2VzIHJlY29tcHV0ZSB3aGF0IHRoZSBjYXB0dXJlXG4gKiB3b3VsZCBoYXZlIGhlbGQpLCBleGFjdGx5IGFzIDkuMjcuMCBkaWQuXG4gKi9cblxuaW1wb3J0IHsgZGVjb2RlUGVuZGluZ1BhdXNlcyB9IGZyb20gJy4uLy4uL3BhdXNlL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlbmRpbmdQYXVzZSB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzUGF1c2VkRXhlY3V0aW9uLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcblxuLyoqXG4gKiBBIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSwgcXVldWVkIGF0IHRoZSBsZXZlbCBvZiBpdHMgZmFuLW91dDogcmFpc2VkXG4gKiBhZ2FpbiB0aGVyZSBvbmNlIHRoZSByZXN1bWVkIGNoaWxkJ3MgY2hhaW4gZW5kcyAoc2VlIHtAbGluayByYWlzZVF1ZXVlZFBhdXNlfSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVkUGF1c2Uge1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZSBhcyB0aGUgY2hlY2twb2ludCBjYXJyaWVzIGl0IOKAlCBpdHMgcGF0aCBmcm9tIHRoZSB0b3AuICovXG4gIHJlYWRvbmx5IHBhdXNlOiBQZW5kaW5nUGF1c2U7XG4gIC8qKiBIb3cgbWFueSBzdWJmbG93cyBkZWVwIHRoZSBmYW4tb3V0IHNpdHMgKDAgPSB0aGUgdG9wIGxldmVsKS4gKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IG51bWJlcjtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlJ3MgbmFtZSwgZm9yIHRoZSBgb25QYXVzZWAgZXZlbnQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogT25lIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHdheSBiYWNrIHRvIGEgcGF1c2VkIHN0YWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVIb3A8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKiBUaGUgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChhIGBGbG93Y2hhcnRDaGVja3BvaW50LnN1YmZsb3dQYXRoYCBlbnRyeSkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBzdGF0ZSBhdCB0aGUgcGF1c2UgKGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNbc3ViZmxvd0lkXWApLlxuICAgKiBTZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgSU5TVEVBRCBvZiB0aGUgaW5wdXRNYXBwZXIncyB2YWx1ZXMg4oCUIHRoZSBjYXB0dXJlXG4gICAqIGFscmVhZHkgaG9sZHMgdGhlIHBvc3QtaW5wdXQsIHByZS1wYXVzZSBtZW1vcnkgKHRoZSBpbnB1dE1hcHBlciBzdGlsbFxuICAgKiBydW5zLCBmb3IgdGhlIHN0YWdlcycgcmVhZC1vbmx5IGFyZ3Mgb25seSkuIEFic2VudCB3aGVuIHRoZSBjaGVja3BvaW50XG4gICAqIGhvbGRzIG5vIGNhcHR1cmUgZm9yIHRoaXMgc3ViZmxvdzsgdGhlIGlucHV0TWFwcGVyIHRoZW4gc2VlZHMgaXQsIGFzIG9uXG4gICAqIGFueSBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHNlZWQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFdoZXJlIHRoaXMgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgb24gdGhlIHJlLWVudHJ5OiB0aGUgbW91bnQgb2YgdGhlXG4gICAqIG5leHQgc3ViZmxvdyBvbiB0aGUgcGF0aCwgb3Ig4oCUIG9uIHRoZSBsYXN0IGhvcCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzXG4gICAqIHN0YW5kLWluLCBlYWNoIHdpdGggaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24gYXR0YWNoZWQgKHNlZSB0aGVcbiAgICogbW9kdWxlIGRvYykuIEFic2VudDogdGhlIHN1YmZsb3cncyBvd24gcm9vdCDigJQgYSBzZWVkLW9ubHkgaG9wIChzZWVcbiAgICoge0BsaW5rIFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlc30pLCBvciBhbiBvdXRlciBzdWJmbG93IHdob3NlIGNhcHR1cmUgdGhlXG4gICAqIGNoZWNrcG9pbnQgbGFja3MuXG4gICAqL1xuICByZWFkb25seSBlbnRyeT86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGF1c2VzIG9mIHBhcmFsbGVsIHNpYmxpbmdzIHdob3NlIGZhbi1vdXQgc2l0cyBpbiBUSElTIHN1YmZsb3csIHJhaXNlZCBpblxuICAgKiBvcmRlciBvbmNlIGBlbnRyeWAncyBjaGFpbiBlbmRzICh0aGUgZmlyc3QgaXMgcmFpc2VkLCB0aGUgcmVzdCB3YWl0XG4gICAqIGJlaGluZCBpdCkuIEFic2VudCB3aGVuIG5vIHNpYmxpbmcgaXMgd2FpdGluZyBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG59XG5cbmV4cG9ydCBjbGFzcyBSZXN1bWVFbnRyeTxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSByZXN1bWVkIFRPUC1MRVZFTCB0cmF2ZXJzYWwgc3RhcnRzOiB0aGUgc3RhbmQtaW4gKGEgdG9wLWxldmVsXG4gICAqIHBhdXNlKSBvciB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3cgb24gdGhlIHBhdGgg4oCUIGVhY2ggd2l0aCBpdHNcbiAgICogZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZC4gYHVuZGVmaW5lZGAgZm9yIGEgc2VlZC1vbmx5IGVudHJ5IOKAlFxuICAgKiB0aGUgdHJhdmVyc2FsIHN0YXJ0cyBhdCBpdHMgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFNpYmxpbmcgcGF1c2VzIHdob3NlIGZhbi1vdXQgc2l0cyBhdCB0aGUgVE9QIGxldmVsIOKAlCByYWlzZWQgb25jZSBgc3RhcnRgJ3MgY2hhaW4gZW5kcy4gKi9cbiAgcmVhZG9ubHkgc3RhcnRQZW5kaW5nUGF1c2VzOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogSG93IG1hbnkgc3RhZ2UgZXhlY3V0aW9ucyB0aGUgcmVzdW1lZCBydW4gbWFrZXMgYmVmb3JlIHRoZSBzdGFuZC1pbiBydW5zXG4gICAqIOKAlCBvbmUgcGVyIHN1YmZsb3cgb24gdGhlIHBhdGgsIGVhY2ggZW50ZXJlZCBhdCBpdHMgbW91bnQg4oCUIHNvIHRoZVxuICAgKiBleGVjdXRvcidzIGBvblJlc3VtZWAgbmFtZXMgdGhlIHN0YW5kLWluJ3Mgb3duIGBydW50aW1lU3RhZ2VJZGAuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGtub3duIGJlZm9yZSB0aGUgcnVuOiBhbiBvdXRlciBzdWJmbG93XG4gICAqIG1pc3NpbmcgaXRzIGNhcHR1cmUgcmUtcnVucyBmcm9tIGl0cyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcHNCZWZvcmVTdGFuZEluOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBIb3BzIG5vdCB0YWtlbiB5ZXQsIGJ5IHN1YmZsb3cgaWQuIEEgaG9wIGxlYXZlcyB0aGlzIG1hcCB3aGVuIGl0IGlzIHRha2VuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmc6IE1hcDxzdHJpbmcsIFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+PjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBob3BzOiByZWFkb25seSBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPltdLFxuICAgIHN0YXJ0UGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10sXG4gICAgc3RlcHNCZWZvcmVTdGFuZEluPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5zdGFydFBlbmRpbmdQYXVzZXMgPSBzdGFydFBlbmRpbmdQYXVzZXM7XG4gICAgdGhpcy5zdGVwc0JlZm9yZVN0YW5kSW4gPSBzdGVwc0JlZm9yZVN0YW5kSW47XG4gICAgdGhpcy5wZW5kaW5nID0gbmV3IE1hcChob3BzLm1hcCgoaG9wKSA9PiBbaG9wLnN1YmZsb3dJZCwgaG9wXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYW4gdGhlIHJlLWVudHJ5IG9mIGEgcGF1c2VkIGNoYXJ0LiBFdmVyeSBtb3VudCBvbiB0aGUgcGF0aCwgZXZlcnlcbiAgICogZGlzcGF0Y2hlciBjb250aW51YXRpb24gYW5kIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBpcyByZXNvbHZlZCBIRVJFLFxuICAgKiBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdCwgYmVmb3JlIGEgc2luZ2xlIHN0YWdlIHJ1bnMg4oCUIHNvIGEgY2hlY2twb2ludFxuICAgKiB3aG9zZSBwYXRoIHRoZSBjaGFydCBjYW5ub3Qgd2FsayBpcyByZWZ1c2VkIHVwIGZyb250IGluc3RlYWQgb2YgcmVzdW1pbmdcbiAgICogaW50byB0aGUgd3Jvbmcgc2hhcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIC0gYHJvb3RgIGFuZCBgc3ViZmxvd3NgOiB0aGUgY2hhcnQgYXMgYnVpbHRcbiAgICogICAoYEZsb3dDaGFydC5yb290YCwgYEZsb3dDaGFydC5zdWJmbG93c2ApOyBgcGF0aGA6XG4gICAqICAgYGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhgLCBvdXRlcm1vc3QgZmlyc3Q7IGBjYXB0dXJlc2A6XG4gICAqICAgYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc2AgKGEgZGV0YWNoZWQgY29weSk7IGBzdGFuZEluYDogdGhlIG5vZGUgdGhhdFxuICAgKiAgIHJ1bnMgdGhlIHJlc3VtZSBoYWxmIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3Mgb3duIG5vZGUsIGZ1bmN0aW9uIHN3YXBwZWRcbiAgICogICAoaXRzIGNvbnRpbnVhdGlvbiBpcyBhdHRhY2hlZCBoZXJlKTsgYHBlbmRpbmdQYXVzZXNgOlxuICAgKiAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgIChhIGRldGFjaGVkIGNvcHkpLlxuICAgKiBAdGhyb3dzIHdoZW4gYSBzdWJmbG93IG9uIHRoZSBwYXRoIGlzIG1pc3NpbmcsIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UsIG9yXG4gICAqICAgaXRzIG1vdW50IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIGVuY2xvc2luZyBncmFwaDsgb3Igd2hlbiBhIHBlbmRpbmdcbiAgICogICBwYXVzZSBpcyBtYWxmb3JtZWQgb3IgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiB0aGUgcGF1c2VkIHN0YWdlXG4gICAqL1xuICBzdGF0aWMgcGxhbjxUT3V0LCBUU2NvcGU+KGFyZ3M6IHtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBjYXB0dXJlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIHN0YW5kSW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBQZW5kaW5nUGF1c2VbXTtcbiAgfSk6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0gPSBhcmdzO1xuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPigpO1xuXG4gICAgLy8gMS4gV2FsayB0aGUgcGF0aDogdGhlIGdyYXBoIG9mIGV2ZXJ5IGxldmVsLCB0aGUgbW91bnQgb2YgZXZlcnkgc3ViZmxvdy5cbiAgICBjb25zdCBncmFwaHM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgY29uc3QgbW91bnRzOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBwYXRoW2ldO1xuICAgICAgbW91bnRzLnB1c2goY2hhcnQub25seU1vdW50KGdyYXBoc1tpXSwgc3ViZmxvd0lkLCBpID09PSAwID8gJ3RoZSBmbG93Y2hhcnQnIDogYHN1YmZsb3cgJyR7cGF0aFtpIC0gMV19J2ApKTtcbiAgICAgIC8vIE93biBlbnRyaWVzIG9ubHk6IGEgcGF0aCBzZWdtZW50IGlzIGRhdGEgZnJvbSBhIHN0b3JlZCBjaGVja3BvaW50LFxuICAgICAgLy8gYW5kIGAnX19wcm90b19fJ2AgbXVzdCBub3QgcmVzb2x2ZSB0aHJvdWdoIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gb3duRW50cnkoc3ViZmxvd3MsIHN1YmZsb3dJZCk7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICAgJ1RoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBncmFwaHMucHVzaChkZWZpbml0aW9uLnJvb3QpO1xuICAgIH1cbiAgICBjb25zdCBsZWFmTGV2ZWwgPSBwYXRoLmxlbmd0aDtcbiAgICAvLyBUaGUgcGF1c2VkIHN0YWdlJ3MgUkVBTCBub2RlIOKAlCB3aG9zZSBkaXNwYXRjaGVyIHRoZSBzdGFuZC1pbidzXG4gICAgLy8gY29udGludWF0aW9uIGNvbWVzIGZyb20uIChUaGUgZXhlY3V0b3IgYWxyZWFkeSBmb3VuZCBpdDsgYSBkaXJlY3RcbiAgICAvLyBjYWxsZXIncyBzdGFuZC1pbiB0aGF0IGlzIG5vdCBpbiB0aGUgbGVhZiBncmFwaCBzaW1wbHkgaGFzIG5vbmUuKVxuICAgIGNvbnN0IHBhdXNlZCA9IGNoYXJ0LnN0YWdlKGdyYXBoc1tsZWFmTGV2ZWxdLCBzdGFuZEluLmlkKTtcblxuICAgIC8vIDIuIFF1ZXVlIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBwYXVzZSBhdCB0aGUgbGV2ZWwgb2YgaXRzIGZhbi1vdXQuXG4gICAgY29uc3QgcXVldWVzID0gcXVldWVTaWJsaW5nUGF1c2VzKGFyZ3MucGVuZGluZ1BhdXNlcywgeyBjaGFydCwgc3ViZmxvd3MsIHJvb3QsIHBhdGgsIGdyYXBocywgbW91bnRzLCBwYXVzZWQgfSk7XG5cbiAgICAvLyAzLiBUaGUgb25lLXNob3QgZW50cnkgb2YgZXZlcnkgbGV2ZWw6IHRoZSBjaGlsZCwgdGhlbiBpdHMgZGlzcGF0Y2hlcidzXG4gICAgLy8gICAgY29udGludWF0aW9uIOKAlCB1cCB0byB0aGUgZmFuLW91dCB3aGVuIHNpYmxpbmdzIHdhaXQgdGhlcmUuXG4gICAgY29uc3QgY2hpbGRBdCA9IChsZXZlbDogbnVtYmVyKSA9PiAobGV2ZWwgPCBsZWFmTGV2ZWwgPyBtb3VudHNbbGV2ZWxdIDogcGF1c2VkKTtcbiAgICBjb25zdCBlbnRyeUF0ID0gKGxldmVsOiBudW1iZXIpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkQXQobGV2ZWwpO1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBsZXZlbCA8IGxlYWZMZXZlbCA/IG1vdW50c1tsZXZlbF0gOiBzdGFuZEluO1xuICAgICAgaWYgKCFjaGlsZCkgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGNoYXJ0LmVudHJ5KGdyYXBoc1tsZXZlbF0sIGNoaWxkLCByZXBsYWNlbWVudCwgcXVldWVzW2xldmVsXT8uZmFuT3V0KTtcbiAgICB9O1xuICAgIC8vIDQuIFRoZSBob3BzLiBBIHN1YmZsb3cgd2l0aCBubyBjYXB0dXJlIGlzIGVudGVyZWQgYXQgaXRzIFJPT1Qgd2l0aCBpdHNcbiAgICAvLyAgICBpbnB1dE1hcHBlciAoaXRzIGVhcmxpZXIgc3RhZ2VzIHJlY29tcHV0ZSB3aGF0IHRoZSBjYXB0dXJlIGhlbGQpIOKAlFxuICAgIC8vICAgIGV4Y2VwdCB0aGUgbGVhZiwgd2hvc2UgZW50cnkgaXMgYWx3YXlzIHRoZSBzdGFuZC1pbjogcmUtcnVubmluZyBpdFxuICAgIC8vICAgIGZyb20gaXRzIHJvb3Qgd291bGQgYXNrIGFnYWluIGFuZCBsb3NlIHRoZSBhbnN3ZXIuXG4gICAgY29uc3QgaG9wczogUmVzdW1lSG9wPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuICAgIGxldCBldmVyeUxldmVsQXRJdHNFbnRyeSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBwYXRoW2ldO1xuICAgICAgY29uc3Qgc2VlZCA9IG93bkVudHJ5KGNhcHR1cmVzLCBzdWJmbG93SWQpO1xuICAgICAgY29uc3QgaXNMZWFmSG9wID0gaSA9PT0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgaWYgKHNlZWQgPT09IHVuZGVmaW5lZCAmJiAhaXNMZWFmSG9wKSB7XG4gICAgICAgIGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID0gZmFsc2U7XG4gICAgICAgIGhvcHMucHVzaCh7IHN1YmZsb3dJZCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB3YWl0aW5nID0gcXVldWVzW2kgKyAxXT8ucGF1c2VzO1xuICAgICAgaG9wcy5wdXNoKHtcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAuLi4oc2VlZCAhPT0gdW5kZWZpbmVkICYmIHsgc2VlZCB9KSxcbiAgICAgICAgZW50cnk6IGVudHJ5QXQoaSArIDEpLFxuICAgICAgICAuLi4od2FpdGluZyAmJiB7IHBlbmRpbmdQYXVzZXM6IHdhaXRpbmcgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gRXZlcnkgbGV2ZWwgZW50ZXJlZCBhdCBpdHMgZW50cnk6IG9uZSBleGVjdXRpb24gKHRoZSBtb3VudCkgcGVyIGxldmVsXG4gICAgLy8gcnVucyBiZWZvcmUgdGhlIHN0YW5kLWluLlxuICAgIHJldHVybiBuZXcgUmVzdW1lRW50cnkoZW50cnlBdCgwKSwgaG9wcywgcXVldWVzWzBdPy5wYXVzZXMsIGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID8gcGF0aC5sZW5ndGggOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2VlZC1vbmx5IGVudHJ5OiBlYWNoIGNhcHR1cmUgc2VlZHMgdGhlIEZJUlNUIGVudHJ5IGludG8gaXRzIHN1YmZsb3csXG4gICAqIHdoaWNoIHRoZW4gc3RhcnRzIGF0IGl0cyBvd24gcm9vdC4gUGFzcyBpdCBleHBsaWNpdGx5IGFzIGByZXN1bWVgIHRvXG4gICAqIFRyYXZlcnNlck9wdGlvbnMgb3IgSGFuZGxlckRlcHMg4oCUIHRoZSBzYW1lIG9uZS1zaG90IGxhdywgd2l0aG91dCBhXG4gICAqIHN0YW5kLWluIG9yIGEgcGF0aC4gUHJlZmVyIGBwbGFuYCB3aGVuIHJlc3VtaW5nIGEgY2hlY2twb2ludC5cbiAgICovXG4gIHN0YXRpYyBmcm9tQ2FwdHVyZXM8VE91dCwgVFNjb3BlPihjYXB0dXJlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+KFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgT2JqZWN0LmVudHJpZXMoY2FwdHVyZXMpLm1hcCgoW3N1YmZsb3dJZCwgc2VlZF0pID0+ICh7IHN1YmZsb3dJZCwgc2VlZCB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmUtZW50cnkgaW50byBgc3ViZmxvd0lkYCwgdGFrZW4g4oCUIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBlbnRyeSBpc1xuICAgKiBhbiBvcmRpbmFyeSBvbmUgKHRoZSBzdWJmbG93IGlzIG9mZiB0aGUgcGF1c2UgcGF0aCwgb3IgaXRzIGhvcCB3YXMgYWxyZWFkeVxuICAgKiB0YWtlbikuIE9ORS1TSE9UOiBhIGhvcCBpcyByZXR1cm5lZCBhdCBtb3N0IG9uY2UsIHNvIGEgc2Vjb25kIGVudHJ5IGludG9cbiAgICogdGhlIHNhbWUgc3ViZmxvdyAoYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50IGFnYWluKSBydW5zIHRoZSByZWFsIHN1YmZsb3dcbiAgICogZnJvbSBpdHMgcmVhbCByb290IHdpdGggaXRzIGlucHV0TWFwcGVyLlxuICAgKi9cbiAgZW50ZXJTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogUmVzdW1lSG9wPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvcCA9IHRoaXMucGVuZGluZy5nZXQoc3ViZmxvd0lkKTtcbiAgICBpZiAoaG9wICE9PSB1bmRlZmluZWQpIHRoaXMucGVuZGluZy5kZWxldGUoc3ViZmxvd0lkKTtcbiAgICByZXR1cm4gaG9wO1xuICB9XG5cbiAgLyoqIGB0cnVlYCBvbmNlIGV2ZXJ5IGhvcCBoYXMgYmVlbiB0YWtlbiDigJQgdGhlIHJlc3Qgb2YgdGhlIHJ1biBpcyBvcmRpbmFyeS4gKi9cbiAgZ2V0IHNwZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmcuc2l6ZSA9PT0gMDtcbiAgfVxufVxuXG4vLyDilIDilIAgUmFpc2luZyBhIHdhaXRpbmcgc2libGluZydzIHBhdXNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFF1ZXVlIGBxdWV1ZWAgYmVoaW5kIGEgcGF1c2UgcGFzc2luZyB0aHJvdWdoIGl0cyBsZXZlbDogYSBwYXVzZSByYWlzZWRcbiAqIHdoaWxlIHNpYmxpbmdzIHN0aWxsIHdhaXQgbXVzdCBjYXJyeSB0aGVtIHRvIGl0cyBjaGVja3BvaW50LiBFYWNoIHBhdGggaXNcbiAqIGN1dCB0byB0aGF0IGxldmVsIOKAlCB0aGUgYnViYmxlLXVwIHByZXBlbmRzIHRoZSBsZXZlbHMgYWJvdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWV1ZUJlaGluZChzaWduYWw6IFBhdXNlU2lnbmFsLCBxdWV1ZTogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHsgcGF1c2UsIGxldmVsIH0gb2YgcXVldWUpIHtcbiAgICBzaWduYWwuYWRkUGVuZGluZ1BhdXNlKHsgLi4ucGF1c2UsIHN1YmZsb3dQYXRoOiBwYXVzZS5zdWJmbG93UGF0aC5zbGljZShsZXZlbCkgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZmlyc3Qgd2FpdGluZyBzaWJsaW5nJ3MgcGF1c2UsIHJhaXNlZCBhZ2FpbiBhdCBpdHMgZmFuLW91dCdzIGxldmVsIOKAlFxuICogZXhhY3RseSBhcyBpdCBidWJibGVkIHVwIHRvIHRoYXQgbGV2ZWwgdGhlIGZpcnN0IHRpbWUgKGl0cyBzdGFnZSwgaXRzXG4gKiBxdWVzdGlvbiwgaXRzIG93biBzdWJmbG93IGNhcHR1cmVzKSwgbm90aGluZyByZS1ydW47IHRoZSByZXN0IG9mIHRoZSBxdWV1ZVxuICogd2FpdHMgYmVoaW5kIGl0LiBUaGUgc3ViZmxvd3MgQUJPVkUgdGhlIGZhbi1vdXQgY2FwdHVyZSB0aGVtc2VsdmVzIGFmcmVzaFxuICogYXMgaXQgYnViYmxlcyB1cCwgc28gdGhleSBjYXJyeSB3aGF0IHRoZSByZXN1bWVkIGNoaWxkIHdyb3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFpc2VRdWV1ZWRQYXVzZShxdWV1ZTogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSk6IFBhdXNlU2lnbmFsIHtcbiAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHF1ZXVlO1xuICBjb25zdCB7IHBhdXNlLCBsZXZlbCB9ID0gZmlyc3Q7XG4gIGNvbnN0IHNpZ25hbCA9IG5ldyBQYXVzZVNpZ25hbChwYXVzZS5wYXVzZURhdGEsIHBhdXNlLnBhdXNlZFN0YWdlSWQsIHBhdXNlLnBhdXNlZEJ5KTtcbiAgLy8gVGhlIHNpYmxpbmcgcGF1c2VkIGluIGFuIEVBUkxJRVIgcnVuOiBpdHMgb3duIGV4ZWN1dGlvbiwgbm90IHRoaXMgcnVuJ3MuXG4gIGlmIChpc1BhdXNlZEV4ZWN1dGlvbihwYXVzZS5wYXVzZWRFeGVjdXRpb24pKSB7XG4gICAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCwgcGF1c2UucGF1c2VkRXhlY3V0aW9uLnJ1bklkKTtcbiAgfVxuICAvLyDigKZhbmQgdGhlIGtleSBpdCByYW4gdW5kZXIgKFAzKSwgc28gaXRzIG93biByZXN1bWUgcmUtcnVucyB1bmRlciB0aGUgc2FtZSBrZXkuXG4gIHNpZ25hbC5zdGFtcElkZW1wb3RlbmN5S2V5KHBhdXNlLmlkZW1wb3RlbmN5S2V5KTtcbiAgY29uc3QgYmVsb3cgPSBwYXVzZS5zdWJmbG93UGF0aC5zbGljZShsZXZlbCk7XG4gIGZvciAobGV0IGkgPSBiZWxvdy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHN0YXRlID0gb3duRW50cnkocGF1c2Uuc3ViZmxvd1N0YXRlcywgYmVsb3dbaV0pO1xuICAgIGlmIChzdGF0ZSAhPT0gdW5kZWZpbmVkKSBzaWduYWwuY2FwdHVyZVN1YmZsb3dTY29wZShiZWxvd1tpXSwgc3RhdGUpO1xuICAgIHNpZ25hbC5wcmVwZW5kU3ViZmxvdyhiZWxvd1tpXSk7XG4gIH1cbiAgcXVldWVCZWhpbmQoc2lnbmFsLCByZXN0KTtcbiAgcmV0dXJuIHNpZ25hbDtcbn1cblxuLy8g4pSA4pSAIFJlYWRpbmcgdGhlIGNoYXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRoZSBub2RlIHRoYXQgbW91bnRzIGBzdWJmbG93SWRgLCBmb3VuZCBieSBERlMgZnJvbSBgc3RhcnRgIG92ZXIgYG5leHRgIGFuZFxuICogYGNoaWxkcmVuYCAobG9vcC1yZWYgc3R1YnMgc2tpcHBlZCDigJQgdGhleSBzaGFyZSB0aGVpciB0YXJnZXQncyBpZCBhbmQgY2FycnlcbiAqIG5vdGhpbmcpLiBDeWNsZS1zYWZlICh2aXNpdGVkIGJ5IGlkZW50aXR5LCBzbyBhbiBhYnNlbnQgaWQgdGVybWluYXRlcyB0b28pO1xuICogZmlyc3QgbWF0Y2ggaW4gREZTIHByZS1vcmRlciAoY2hpbGRyZW4gYmVmb3JlIGBuZXh0YCwgbGlrZSB0aGUgYnVpbGRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTW91bnQ8VE91dCwgVFNjb3BlPihcbiAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93SWQ6IHN0cmluZyxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBub2RlIG9mIGRpc3BhdGNoZXJJbmRleChzdGFydCkua2V5cygpKSB7XG4gICAgaWYgKG5vZGUuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRXZlcnkgcmVhbCBub2RlIG9mIG9uZSBsZXZlbCdzIGdyYXBoLCBpbiBERlMgcHJlLW9yZGVyLCBtYXBwZWQgdG8gdGhlXG4gKiBESVNQQVRDSEVSIHdob3NlIGNoaWxkLWNoYWluIGhvbGRzIGl0IOKAlCB0aGUgbm9kZSB3aG9zZSBgY2hpbGRyZW5gIGl0XG4gKiBkZXNjZW5kcyBmcm9tIChhIGRlY2lkZXIsIGEgc2VsZWN0b3IsIGEgZm9yaykg4oCUIG9yIGB1bmRlZmluZWRgIGZvciBhIG5vZGVcbiAqIG9uIHRoZSBsZXZlbCdzIG93biBzcGluZS4gTG9vcCBzdHVicyBhcmUgc2tpcHBlZDsgdmlzaXRlZCBieSBpZGVudGl0eSwgc29cbiAqIHR3byBtb3VudHMgc2hhcmluZyBhbiBpZCBhcmUgYm90aCBpbmRleGVkIGFuZCBhIGN5Y2xlIHRlcm1pbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoZXJJbmRleDxUT3V0LCBUU2NvcGU+KFxuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbik6IE1hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3Qgc3RhY2s6IEFycmF5PFtTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWRdPiA9IFtbcm9vdCwgdW5kZWZpbmVkXV07XG4gIGZvciAobGV0IHRvcCA9IHN0YWNrLnBvcCgpOyB0b3AgIT09IHVuZGVmaW5lZDsgdG9wID0gc3RhY2sucG9wKCkpIHtcbiAgICBjb25zdCBbbm9kZSwgZGlzcGF0Y2hlcl0gPSB0b3A7XG4gICAgaWYgKG5vZGUuaXNMb29wUmVmIHx8IGluZGV4Lmhhcyhub2RlKSkgY29udGludWU7XG4gICAgaW5kZXguc2V0KG5vZGUsIGRpc3BhdGNoZXIpO1xuICAgIC8vIExJRk86IHB1c2ggYG5leHRgIGZpcnN0IGFuZCBjaGlsZHJlbiByZXZlcnNlZCwgc28gY2hpbGRyZW4gYXJlIHZpc2l0ZWRcbiAgICAvLyBiZWZvcmUgYG5leHRgIGFuZCB0aGUgZmlyc3QgY2hpbGQgZmlyc3Qg4oCUIHByZS1vcmRlciwgbGlrZSB0aGUgYnVpbGRlci5cbiAgICBpZiAobm9kZS5uZXh0KSBzdGFjay5wdXNoKFtub2RlLm5leHQsIGRpc3BhdGNoZXJdKTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2goW25vZGUuY2hpbGRyZW5baV0sIG5vZGVdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKiogT25lIHBsYW4ncyB2aWV3IG9mIHRoZSBjaGFydDogZWFjaCBsZXZlbCdzIGluZGV4IGJ1aWx0IG9uY2UuICovXG5jbGFzcyBDaGFydEluZGV4PFRPdXQsIFRTY29wZT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4ZXMgPSBuZXcgTWFwPFxuICAgIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIE1hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+XG4gID4oKTtcblxuICBwcml2YXRlIG9mKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5pbmRleGVzLmdldChyb290KTtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBpbmRleCA9IGRpc3BhdGNoZXJJbmRleChyb290KTtcbiAgICAgIHRoaXMuaW5kZXhlcy5zZXQocm9vdCwgaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKiogRXZlcnkgbW91bnQgb2YgYHN1YmZsb3dJZGAgaW4gYHJvb3RgJ3MgZ3JhcGgsIGluIERGUyBwcmUtb3JkZXIuICovXG4gIG1vdW50c09mKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzdWJmbG93SWQ6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5vZihyb290KS5rZXlzKCldLmZpbHRlcigobm9kZSkgPT4gbm9kZS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCk7XG4gIH1cblxuICAvKiogVGhlIG9uZSBtb3VudCBvZiBgc3ViZmxvd0lkYCBpbiBgcm9vdGAncyBncmFwaCDigJQgcmVmdXNlZCB3aGVuIGFic2VudCBvciBhbWJpZ3VvdXMuICovXG4gIG9ubHlNb3VudChyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgc3ViZmxvd0lkOiBzdHJpbmcsIGdyYXBoTmFtZTogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5tb3VudHNPZihyb290LCBzdWJmbG93SWQpO1xuICAgIGlmIChmb3VuZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHRoZSBtb3VudCBvZiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG5vdCByZWFjaGFibGUgZnJvbSAke2dyYXBoTmFtZX0uIGAgK1xuICAgICAgICAgIFwiVGhlIGNoZWNrcG9pbnQncyBzdWJmbG93UGF0aCBkb2VzIG5vdCBtYXRjaCB0aGlzIGNoYXJ0IOKAlCBpdCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZvdW5kLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN1YmZsb3cgJyR7c3ViZmxvd0lkfScgaXMgbW91bnRlZCBtb3JlIHRoYW4gb25jZSBpbiAke2dyYXBoTmFtZX0gYCArXG4gICAgICAgICAgYCgke2ZvdW5kLm1hcCgobm9kZSkgPT4gYCcke25vZGUubmFtZX0nYCkuam9pbignLCAnKX0pLCBhbmQgYSBjaGVja3BvaW50J3Mgc3ViZmxvd1BhdGggY2Fubm90IHNheSB3aGljaCBgICtcbiAgICAgICAgICAnbW91bnQgcGF1c2VkLiBHaXZlIGVhY2ggbW91bnQgaXRzIG93biBzdWJmbG93IGlkIHRvIG1ha2UgYSBwYXVzZSBpbnNpZGUgaXQgcmVzdW1hYmxlLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmRbMF07XG4gIH1cblxuICAvKiogVGhlIHJlYWwgc3RhZ2UgYGlkYCBpbiBgcm9vdGAncyBncmFwaCAoZmlyc3QgaW4gREZTIHByZS1vcmRlciksIGlmIGFueS4gKi9cbiAgc3RhZ2Uocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGlkOiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMub2Yocm9vdCkua2V5cygpKSBpZiAobm9kZS5pZCA9PT0gaWQpIHJldHVybiBub2RlO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGRpc3BhdGNoZXIgd2hvc2UgY2hpbGQtY2hhaW4gaG9sZHMgYG5vZGVgIGluIGByb290YCdzIGdyYXBoIChgdW5kZWZpbmVkYCBvbiB0aGUgc3BpbmUpLiAqL1xuICBkaXNwYXRjaGVyT2Yocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm9mKHJvb3QpLmdldChub2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lLXNob3QgZW50cnkgZm9yIGBjaGlsZGAgKGEgbW91bnQgb24gdGhlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UpXG4gICAqIGluIGByb290YCdzIGdyYXBoOiBgcmVwbGFjZW1lbnRgICh0aGUgbm9kZSB0aGF0IHJ1bnMg4oCUIHRoZSBtb3VudCBpdHNlbGYsXG4gICAqIG9yIHRoZSBzdGFuZC1pbikgd2l0aCB3aGF0IHJhbiBhZnRlciBgY2hpbGRgJ3MgY2hhaW4gb24gdGhlIG9yaWdpbmFsIHJ1blxuICAgKiBhdHRhY2hlZCB3aGVyZSB0aGF0IGNoYWluIGVuZHMg4oCUIGB7IC4uLmNoaWxkLCBuZXh0OiBkaXNwYXRjaGVyLm5leHQgfWAgZm9yXG4gICAqIGEgY2hhcnQgdGhlIGJ1aWxkZXIgbWFkZTpcbiAgICpcbiAgICogICDigKIgb24gdGhlIGxldmVsJ3Mgc3BpbmU6IG5vdGhpbmcgdG8gYXR0YWNoIOKAlCB0aGUgc3BpbmUgZ29lcyBvbiBieSBpdHNlbGY7XG4gICAqICAg4oCiIGEgREVDSURFUidzIG9yIFNFTEVDVE9SJ3MgYnJhbmNoOiB0aGUgZGlzcGF0Y2hlcidzIGBuZXh0YDtcbiAgICogICDigKIgYSBGT1JLIGNoaWxkOiB0aGUgZm9yaydzIGBuZXh0YCDigJQgaXRzIGpvaW4uXG4gICAqXG4gICAqIFBhc3QgYSBkaXNwYXRjaGVyIHdpdGggbm8gYG5leHRgLCB0aGUgd2FsayBnb2VzIG9uIE9VVFdBUkQgdG8gdGhlIG9uZVxuICAgKiBlbmNsb3NpbmcgaXQuIEl0IHN0b3BzIGF0IGBzdG9wQXRgIOKAlCB0aGUgZmFuLW91dCB3aGVyZSBzaWJsaW5ncyBzdGlsbFxuICAgKiB3YWl0LCB3aG9zZSBqb2luIG11c3Qgbm90IHJ1biB5ZXQuIE5vdGhpbmcgdG8gYXR0YWNoOiBgcmVwbGFjZW1lbnRgXG4gICAqIGl0c2VsZi5cbiAgICovXG4gIGVudHJ5KFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICByZXBsYWNlbWVudDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RvcEF0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBhcHBlbmRBdENoYWluRW5kKHJlcGxhY2VtZW50LCB0aGlzLmFmdGVyKHJvb3QsIGNoaWxkLCBzdG9wQXQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHJ1bnMgb25jZSBgbm9kZWAncyBjaGFpbiBlbmRzOiBpdHMgZGlzcGF0Y2hlcidzIGBuZXh0YCBjaGFpbiwgdGhlbiDigJRcbiAgICogd2hlcmUgVEhBVCBlbmRzIOKAlCB0aGUgY29udGludWF0aW9uIG9mIHRoZSBkaXNwYXRjaGVyIGVuY2xvc2luZyBpdCwgb3V0d2FyZCxcbiAgICogdXAgdG8gYHN0b3BBdGAgKGV4Y2x1c2l2ZSkuIGB1bmRlZmluZWRgIG9uIHRoZSBzcGluZS5cbiAgICovXG4gIHByaXZhdGUgYWZ0ZXIoXG4gICAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RvcEF0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXJPZihyb290LCBub2RlKTtcbiAgICBpZiAoZGlzcGF0Y2hlciA9PT0gdW5kZWZpbmVkIHx8IGRpc3BhdGNoZXIgPT09IHN0b3BBdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdXRlciA9IHRoaXMuYWZ0ZXIocm9vdCwgZGlzcGF0Y2hlciwgc3RvcEF0KTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci5uZXh0ID8gYXBwZW5kQXRDaGFpbkVuZChkaXNwYXRjaGVyLm5leHQsIG91dGVyKSA6IG91dGVyO1xuICB9XG59XG5cbi8qKlxuICogYHN0YXJ0YCdzIGNoYWluIHdpdGggYGFmdGVyYCBhdHRhY2hlZCB3aGVyZSBpdCBlbmRzIOKAlCB0aGUgY2hhaW4ncyBub2Rlc1xuICogY29waWVkIG9uIHRoZSB3YXkgKG5ldmVyIHJlZ2lzdGVyZWQgYW55d2hlcmU6IGlkcyBzdGlsbCByZXNvbHZlIHRvIHRoZSByZWFsXG4gKiBub2RlcykuIEEgY2hhaW4gdGhhdCBlbmRzIGluIGEgbG9vcCBzdHViIChvciBsb29wcyBiYWNrIG9uIGl0c2VsZikgaXNcbiAqIHJldHVybmVkIGFzIGlzOiBjb250cm9sIGxlYXZlcyBpdCB0aHJvdWdoIHRoZSBsb29wLCBuZXZlciBcImFmdGVyXCIgaXQuXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEF0Q2hhaW5FbmQ8VE91dCwgVFNjb3BlPihcbiAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBhZnRlcjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gIGlmIChhZnRlciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc3RhcnQ7XG4gIGNvbnN0IGNoYWluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PigpO1xuICBmb3IgKGxldCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCA9IHN0YXJ0OyBub2RlICE9PSB1bmRlZmluZWQ7IG5vZGUgPSBub2RlLm5leHQpIHtcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYgfHwgc2Vlbi5oYXMobm9kZSkpIHJldHVybiBzdGFydDtcbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBjaGFpbi5wdXNoKG5vZGUpO1xuICB9XG4gIGxldCBuZXh0ID0gYWZ0ZXI7XG4gIGZvciAobGV0IGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgbmV4dCA9IHsgLi4uY2hhaW5baV0sIG5leHQgfTtcbiAgcmV0dXJuIG5leHQ7XG59XG5cbi8vIOKUgOKUgCBXYWl0aW5nIHNpYmxpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogVGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYXQgb25lIGxldmVsLCBhbmQgdGhlIGZhbi1vdXQgdGhleSB3YWl0IGluLiAqL1xuaW50ZXJmYWNlIExldmVsUXVldWU8VE91dCwgVFNjb3BlPiB7XG4gIHJlYWRvbmx5IGZhbk91dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IHBhdXNlczogUXVldWVkUGF1c2VbXTtcbn1cblxuLyoqXG4gKiBQbGFjZSBgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCAoZGVjb2RlZCDigJQgYHBhdXNlL3JlY29yZC50c2ApIGFuZCBxdWV1ZSBlYWNoIGF0IHRoZVxuICogbGV2ZWwgb2YgaXRzIGZhbi1vdXQ6IHRoZSBkZXB0aCB3aGVyZSBpdHMgcGF0aCBwYXJ0cyBmcm9tIHRoZSBwYXVzZWRcbiAqIHN0YWdlJ3MuIFRoZXJlLCB0aGUgcGF1c2VkIHN0YWdlJ3MgY2hpbGQgKGEgbW91bnQgb24gdGhlIHBhdGgsIG9yIHRoZSBzdGFnZVxuICogaXRzZWxmKSBhbmQgdGhlIHNpYmxpbmcncyBtdXN0IGJvdGggaGFuZyBvZmYgT05FIHBhcmFsbGVsIGRpc3BhdGNoZXIg4oCUIGFcbiAqIGZvcmsgb3IgYSBzZWxlY3RvciDigJQgb3IgdGhlIHJlY29yZCBpcyBub3QgYSBzaWJsaW5nIGFuZCB0aGUgcmVzdW1lIGlzXG4gKiByZWZ1c2VkIHJhdGhlciB0aGFuIGFza2VkIGEgcXVlc3Rpb24gdGhlIGNoYXJ0IGNvdWxkIG5vdCBoYXZlIHJhaXNlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVTaWJsaW5nUGF1c2VzPFRPdXQsIFRTY29wZT4oXG4gIHBlbmRpbmc6IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdIHwgdW5kZWZpbmVkLFxuICBhdDoge1xuICAgIGNoYXJ0OiBDaGFydEluZGV4PFRPdXQsIFRTY29wZT47XG4gICAgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gfCB1bmRlZmluZWQ7XG4gICAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgZ3JhcGhzOiByZWFkb25seSBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIG1vdW50czogcmVhZG9ubHkgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBwYXVzZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICB9LFxuKTogQXJyYXk8TGV2ZWxRdWV1ZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHF1ZXVlczogQXJyYXk8TGV2ZWxRdWV1ZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiA9IFtdO1xuICBpZiAocGVuZGluZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gcXVldWVzO1xuICAvLyBUaGUgY29kZWMncyBjaGVjayAoYHBhdXNlL3JlY29yZC50c2ApIOKAlCBgcGxhbmAgaXMgYSBwdWJsaWMgZG9vciB0b28sIHNvIGl0XG4gIC8vIG5ldmVyIHRha2VzIGEgc2libGluZyByZWNvcmQgdW5jaGVja2VkLCBob3dldmVyIGl0IHdhcyBoYW5kZWQgb25lLlxuICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUGVuZGluZ1BhdXNlcyhwZW5kaW5nKTtcbiAgY29uc3QgeyBjaGFydCwgc3ViZmxvd3MsIHJvb3QsIHBhdGgsIGdyYXBocywgbW91bnRzLCBwYXVzZWQgfSA9IGF0O1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gRWFjaCByZWNvcmQncyBGSUVMRFMgYXJlIGNoZWNrZWQgYWJvdmU7IGhlcmUgaXQgaXMgYXNrZWQgd2hldGhlciB0aGVcbiAgLy8gcmVjb3JkIGZpdHMgVEhJUyBjaGFydC5cbiAgZGVjb2RlZC5mb3JFYWNoKChwYXVzZSwgbikgPT4ge1xuICAgIC8vIE9uZSByZWNvcmQgcGVyIHBhdXNlZCBzaWJsaW5nOiBhIHJlcGVhdCB3b3VsZCBhc2sgdGhlIHNhbWUgcXVlc3Rpb24gdHdpY2UuXG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW3BhdXNlLnN1YmZsb3dQYXRoLCBwYXVzZS5wYXVzZWRTdGFnZUlkXSk7XG4gICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc1ske259XSAoJyR7cGF1c2UucGF1c2VkU3RhZ2VJZH0nKSByZXBlYXRzIGFuIGVhcmxpZXIgZW50cnkuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHNlZW4uYWRkKGtleSk7XG4gICAgbGV0IGxldmVsID0gMDtcbiAgICB3aGlsZSAobGV2ZWwgPCBwYXRoLmxlbmd0aCAmJiBsZXZlbCA8IHBhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCAmJiBwYXRoW2xldmVsXSA9PT0gcGF1c2Uuc3ViZmxvd1BhdGhbbGV2ZWxdKSBsZXZlbCsrO1xuICAgIGNvbnN0IGdyYXBoID0gZ3JhcGhzW2xldmVsXTtcbiAgICBjb25zdCBvdXJzID0gbGV2ZWwgPCBwYXRoLmxlbmd0aCA/IG1vdW50c1tsZXZlbF0gOiBwYXVzZWQ7XG4gICAgY29uc3QgdGhlaXJNb3VudHMgPSBsZXZlbCA8IHBhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCA/IGNoYXJ0Lm1vdW50c09mKGdyYXBoLCBwYXVzZS5zdWJmbG93UGF0aFtsZXZlbF0pIDogW107XG4gICAgY29uc3QgdGhlaXJzID1cbiAgICAgIGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoXG4gICAgICAgID8gdGhlaXJNb3VudHMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyB0aGVpck1vdW50c1swXVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIDogY2hhcnQuc3RhZ2UoZ3JhcGgsIHBhdXNlLnBhdXNlZFN0YWdlSWQpO1xuICAgIGNvbnN0IGZhbk91dCA9IG91cnMgPyBjaGFydC5kaXNwYXRjaGVyT2YoZ3JhcGgsIG91cnMpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzU2libGluZyA9XG4gICAgICBvdXJzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoZWlycyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvdXJzICE9PSB0aGVpcnMgJiZcbiAgICAgIGZhbk91dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBjaGFydC5kaXNwYXRjaGVyT2YoZ3JhcGgsIHRoZWlycykgPT09IGZhbk91dCAmJlxuICAgICAgIWZhbk91dC5kZWNpZGVyRm4gJiZcbiAgICAgIChxdWV1ZXNbbGV2ZWxdID09PSB1bmRlZmluZWQgfHwgcXVldWVzW2xldmVsXSEuZmFuT3V0ID09PSBmYW5PdXQpO1xuICAgIGlmICghaXNTaWJsaW5nIHx8ICF3YWxrc1RvSXRzU3RhZ2UoY2hhcnQsIHN1YmZsb3dzLCBncmFwaCwgcGF1c2UsIGxldmVsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzWyR7bn1dICgnJHtwYXVzZS5wYXVzZWRTdGFnZUlkfScpIGlzIG5vdCBhIHBhcmFsbGVsIHNpYmxpbmcgb2YgYCArXG4gICAgICAgICAgYHRoZSBwYXVzZWQgc3RhZ2UgJyR7cGF1c2VkPy5pZCA/PyAnPyd9JyBpbiB0aGlzIGNoYXJ0IOKAlCBubyBmb3JrIG9yIHNlbGVjdG9yIHJ1bnMgdGhlbSBib3RoLCBvciBpdHMgYCArXG4gICAgICAgICAgJ3BhdGggZG9lcyBub3QgbGVhZCB0byB0aGF0IHN0YWdlLiBUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgbGVhZlJvb3QgPVxuICAgICAgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwID8gcm9vdCA6IG93bkVudHJ5KHN1YmZsb3dzLCBwYXVzZS5zdWJmbG93UGF0aFtwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggLSAxXSk/LnJvb3Q7XG4gICAgY29uc3Qgc3RhZ2VOYW1lID0gKGxlYWZSb290ICYmIGNoYXJ0LnN0YWdlKGxlYWZSb290LCBwYXVzZS5wYXVzZWRTdGFnZUlkKT8ubmFtZSkgPz8gcGF1c2UucGF1c2VkU3RhZ2VJZDtcbiAgICBjb25zdCBxdWV1ZSA9IChxdWV1ZXNbbGV2ZWxdID8/PSB7IGZhbk91dDogZmFuT3V0ISwgcGF1c2VzOiBbXSB9KTtcbiAgICBxdWV1ZS5wYXVzZXMucHVzaCh7IHBhdXNlLCBsZXZlbCwgc3RhZ2VOYW1lIH0pO1xuICB9KTtcbiAgcmV0dXJuIHF1ZXVlcztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgd2FpdGluZyBzaWJsaW5nJ3MgV0hPTEUgcGF0aCBiZWxvdyBpdHMgZmFuLW91dCB3YWxrcyB0aGlzIGNoYXJ0OlxuICogZXZlcnkgc2VnbWVudCB0aGUgb25seSBtb3VudCBvZiBpdHMgc3ViZmxvdyBpbiB0aGUgZW5jbG9zaW5nIGdyYXBoLCBldmVyeVxuICogc3ViZmxvdyByZWdpc3RlcmVkLCBhbmQgdGhlIHBhdXNlZCBzdGFnZSBpbiB0aGUgbGFzdCBncmFwaCDigJQgY2hlY2tlZCBhdFxuICogdGhlIEZJUlNUIHJlc3VtZSwgc28gYSB0YW1wZXJlZCByZWNvcmQgaXMgcmVmdXNlZCB1cCBmcm9udCwgbm90IHdoZW4gaXRzXG4gKiB0dXJuIGNvbWVzLlxuICovXG5mdW5jdGlvbiB3YWxrc1RvSXRzU3RhZ2U8VE91dCwgVFNjb3BlPihcbiAgY2hhcnQ6IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPixcbiAgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gfCB1bmRlZmluZWQsXG4gIGZhbk91dEdyYXBoOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgcGF1c2U6IFBlbmRpbmdQYXVzZSxcbiAgbGV2ZWw6IG51bWJlcixcbik6IGJvb2xlYW4ge1xuICBsZXQgZ3JhcGggPSBmYW5PdXRHcmFwaDtcbiAgZm9yIChsZXQgaSA9IGxldmVsOyBpIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY2hhcnQubW91bnRzT2YoZ3JhcGgsIHBhdXNlLnN1YmZsb3dQYXRoW2ldKS5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gb3duRW50cnkoc3ViZmxvd3MsIHBhdXNlLnN1YmZsb3dQYXRoW2ldKTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHJldHVybiBmYWxzZTtcbiAgICBncmFwaCA9IGRlZmluaXRpb24ucm9vdDtcbiAgfVxuICByZXR1cm4gY2hhcnQuc3RhZ2UoZ3JhcGgsIHBhdXNlLnBhdXNlZFN0YWdlSWQpICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKiBgcmVjb3JkW2tleV1gIG9ubHkgd2hlbiBpdCBpcyB0aGUgcmVjb3JkJ3MgT1dOIHByb3BlcnR5IOKAlCBuZXZlciB0aHJvdWdoIHRoZSBwcm90b3R5cGUgY2hhaW4uICovXG5mdW5jdGlvbiBvd25FbnRyeTxUPihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFQ+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVjb3JkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZWNvcmQsIGtleSkgPyByZWNvcmRba2V5XSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -47,10 +47,11 @@ class SelectorHandler {
|
|
|
47
47
|
catch (error) {
|
|
48
48
|
// PauseSignal is expected control flow — commit and re-throw without error logging.
|
|
49
49
|
if ((0, types_js_2.isPauseSignal)(error)) {
|
|
50
|
-
|
|
50
|
+
(0, commitStage_js_1.commitStageWrites)(context);
|
|
51
51
|
throw error;
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
(0, stageError_js_1.captureStageFailure)(context, error);
|
|
54
|
+
(0, commitStage_js_1.commitStageWrites)(context);
|
|
54
55
|
const served = (0, stageError_js_1.recordStageError)(context, error);
|
|
55
56
|
this.deps.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
|
|
56
57
|
error: (0, stageError_js_1.loggableStageError)(context, error),
|
|
@@ -131,4 +132,4 @@ class SelectorHandler {
|
|
|
131
132
|
}
|
|
132
133
|
}
|
|
133
134
|
exports.SelectorHandler = SelectorHandler;
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7QUFHSCxvREFBd0Q7QUFFeEQsbURBQXFEO0FBSXJELGlEQUFvRDtBQUVwRCxxREFBK0M7QUFDL0MsbURBQXVFO0FBR3ZFLE1BQWEsZUFBZTtJQUVQO0lBQ0E7SUFGbkIsWUFDbUIsSUFBK0IsRUFDL0IsZ0JBQWdEO1FBRGhELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDaEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLFNBQW9CLEVBQ3BCLFVBQThCLEVBQzlCLFFBQWtDLEVBQ2xDLFdBQXdDLEVBQ3hDLGdCQUFtQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLElBQUksV0FBcUIsQ0FBQztRQUMxQixJQUFJLGlCQUFnRCxDQUFDO1FBQ3JELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hGLCtEQUErRDtZQUMvRCxJQUNFLFdBQVc7Z0JBQ1gsT0FBTyxXQUFXLEtBQUssUUFBUTtnQkFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFxQixFQUFFLDBCQUFlLENBQUM7Z0JBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUUsV0FBbUIsQ0FBQyxRQUFRLENBQUMsRUFDNUMsQ0FBQztnQkFDRCxXQUFXLEdBQUksV0FBbUIsQ0FBQyxRQUFRLENBQUM7Z0JB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QUNsRSw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXhHLE1BQU0sUUFBUSxHQUE0QjtZQUN4QyxJQUFJLEVBQUUsZUFBZTtZQUNyQixFQUFFLEVBQUUsZUFBZTtZQUNuQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLDhFQUE4RTtZQUM5RSw2RUFBNkU7WUFDN0UsZ0ZBQWdGO1lBQ2hGLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDO1FBQ0YsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FDcEQsUUFBUSxFQUNSLE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGdCQUFnQixDQUNqQixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIseURBQXlEO1lBQ3pELElBQUksSUFBQSx3QkFBYSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUcsQ0FBQyxDQUFDO2dCQUMzQixNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF2SkQsMENBdUpDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWxlY3RvckhhbmRsZXIg4oCUIE11bHRpLWNob2ljZSBmaWx0ZXJlZCBmYW4tb3V0LlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEV4ZWN1dGUgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZXMgKHN0YWdlIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGlvbilcbiAqIC0gVGhlIHNlbGVjdG9yIGZ1bmN0aW9uIElTIGEgc3RhZ2U6IHJlYWRzIHNjb3BlLCByZXR1cm5zIHN0cmluZ1tdIG9mIGJyYW5jaCBJRHNcbiAqIC0gRGVsZWdhdGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBzZWxlY3RlZCBjaGlsZHJlbiB0byBDaGlsZHJlbkV4ZWN1dG9yXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBERUNJU0lPTl9SRVNVTFQgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgTm9kZVJlc3VsdFR5cGUsIFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcmVha0hhbmRsZXIgfSBmcm9tICcuL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2UgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciwgcmVjb3JkU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZywgRXhlY3V0ZU5vZGVGbiwgUnVuU3RhZ2VGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JIYW5kbGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT4sXG4gICkge31cblxuICAvKipcbiAgICogSGFuZGxlIGEgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZSAoY3JlYXRlZCB2aWEgYWRkU2VsZWN0b3JGdW5jdGlvbikuXG4gICAqIFRoZSBzdGFnZSBmdW5jdGlvbiBJUyB0aGUgc2VsZWN0b3Ig4oCUIGl0cyByZXR1cm4gdmFsdWUgY29udGFpbnMgYnJhbmNoIElEcy5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZHJlbiDihpIgcGFyYWxsZWwgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVNjb3BlQmFzZWQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBydW5TdGFnZTogUnVuU3RhZ2VGbjxUT3V0LCBUU2NvcGU+LFxuICAgIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYnJlYWtGbiA9IGNyZWF0ZUJyZWFrSGFuZGxlcihicmVha0ZsYWcpO1xuXG4gICAgbGV0IHNlbGVjdGVkSWRzOiBzdHJpbmdbXTtcbiAgICBsZXQgc2VsZWN0aW9uRXZpZGVuY2U6IFNlbGVjdGlvbkV2aWRlbmNlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFnZU91dHB1dCA9IGF3YWl0IHJ1blN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAvLyBEZXRlY3QgU2VsZWN0aW9uUmVzdWx0IGZyb20gc2VsZWN0KCkgaGVscGVyIHZpYSBTeW1ib2wgYnJhbmRcbiAgICAgIGlmIChcbiAgICAgICAgc3RhZ2VPdXRwdXQgJiZcbiAgICAgICAgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBSZWZsZWN0LmhhcyhzdGFnZU91dHB1dCBhcyBvYmplY3QsIERFQ0lTSU9OX1JFU1VMVCkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSgoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2hlcylcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZElkcyA9IChzdGFnZU91dHB1dCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICBzZWxlY3Rpb25FdmlkZW5jZSA9IChzdGFnZU91dHB1dCBhcyBhbnkpLmV2aWRlbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSBBcnJheS5pc0FycmF5KHN0YWdlT3V0cHV0KSA/IHN0YWdlT3V0cHV0Lm1hcChTdHJpbmcpIDogW1N0cmluZyhzdGFnZU91dHB1dCldO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdyDigJQgY29tbWl0IGFuZCByZS10aHJvdyB3aXRob3V0IGVycm9yIGxvZ2dpbmcuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwge1xuICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgc2VydmVkLm1lc3NhZ2UsIHNlcnZlZC5zdHJ1Y3R1cmVkRXJyb3IsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29tbWl0U3RhZ2UoY29udGV4dCwgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvciwgbm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgIC8vIFRoZSBzZWxlY3RvciBjb21wbGV0ZWQsIGJ1dCBpdCBkaWQgbm90IHNlbGVjdCBvciBkaXNwYXRjaCBicmFuY2hlcy5cbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ3NlbGVjdG9yJyk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsobm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0LCBicmVha0ZsYWcucmVhc29uKTtcbiAgICAgIC8vIE5vIGJyYW5jaGVzIHJhbjogZG8gbm90IG1hbnVmYWN0dXJlIGEgcmVzdWx0IG1hcC4gSW4gYSBzdWJmbG93LFxuICAgICAgLy8gdW5kZWZpbmVkIGxldHMgU3ViZmxvd0V4ZWN1dG9yIHVzZSB0aGUgc3RhZ2UncyBjb21taXR0ZWQgc3RhdGUuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnRleHQuYWRkTG9nKCdzZWxlY3RlZENoaWxkSWRzJywgc2VsZWN0ZWRJZHMpO1xuICAgIGNvbnRleHQuYWRkTG9nKCdzZWxlY3RvclBhdHRlcm4nLCAnc2NvcGUtYmFzZWQtbXVsdGktY2hvaWNlJyk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygnc2tpcHBlZEFsbENoaWxkcmVuJywgdHJ1ZSk7XG4gICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3NlbGVjdGVkJywgJ05vIGNoaWxkcmVuIHNlbGVjdGVkIOKAlCBza2lwcGluZyBhbGwgYnJhbmNoZXMuJywge1xuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdGFyZ2V0U3RhZ2U6IFtdLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU2VsZWN0ZWQobm9kZS5uYW1lLCBbXSwgKG5vZGUuY2hpbGRyZW4gPz8gW10pLmxlbmd0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBldmVuIG9uIHplcm8tc2VsZWN0IHBhdGgg4oCUXG4gICAgICAvLyB0aGUgc2VsZWN0b3IgRElEIGNvbXBsZXRlIChpdCBwaWNrZWQgbm9uZSk7IGNvbnN1bWVycyB0cmFja2luZ1xuICAgICAgLy8gdmlzaXRlZCBuZWVkIHRoZSBzaWduYWwuXG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdzZWxlY3RvcicpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgY2hpbGRyZW4gYnkgbWF0Y2hpbmcgc2VsZWN0ZWQgSURzIGFnYWluc3Qgbm9kZS5jaGlsZHJlbi5cbiAgICAvLyBNYXRjaCBicmFuY2hJZCBmaXJzdCAob3JpZ2luYWwgdW5wcmVmaXhlZCBJRCksIGZhbGwgYmFjayB0byBpZCBmb3IgYmFja3dhcmQgY29tcGF0LlxuICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIGNvbnN0IHNlbGVjdGVkQ2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoKGMpID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKGMuYnJhbmNoSWQgPz8gYy5pZCEpKTtcblxuICAgIC8vIFZhbGlkYXRlIGFsbCBJRHMgZXhpc3QgKGZhaWwgZmFzdClcbiAgICBpZiAoc2VsZWN0ZWRDaGlsZHJlbi5sZW5ndGggIT09IHNlbGVjdGVkSWRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2hpbGRJZHMgPSBjaGlsZHJlbi5tYXAoKGMpID0+IGMuYnJhbmNoSWQgPz8gYy5pZCk7XG4gICAgICBjb25zdCBtaXNzaW5nID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpZCkgPT4gIWNoaWxkSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU2NvcGUtYmFzZWQgc2VsZWN0b3IgJyR7bm9kZS5uYW1lfScgcmV0dXJuZWQgdW5rbm93biBjaGlsZCBJRHM6ICR7bWlzc2luZy5qb2luKFxuICAgICAgICAnLCAnLFxuICAgICAgKX0uIEF2YWlsYWJsZTogJHtjaGlsZElkcy5qb2luKCcsICcpfWA7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSk6YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgY29udGV4dC5hZGRFcnJvcignc2VsZWN0b3JFcnJvcicsIGVycm9yTWVzc2FnZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBza2lwcGVkSWRzID0gY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIoKGMpID0+ICFzZWxlY3RlZElkcy5pbmNsdWRlcyhjLmJyYW5jaElkID8/IGMuaWQhKSlcbiAgICAgIC5tYXAoKGMpID0+IGMuYnJhbmNoSWQgPz8gYy5pZCk7XG4gICAgaWYgKHNraXBwZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3NraXBwZWRDaGlsZElkcycsIHNraXBwZWRJZHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkTmFtZXMgPSBzZWxlY3RlZENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICAgICdzZWxlY3RlZCcsXG4gICAgICBgUnVubmluZyAke3NlbGVjdGVkTmFtZXN9ICgke3NlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RofSBvZiAke2NoaWxkcmVuLmxlbmd0aH0gbWF0Y2hlZClgLFxuICAgICAgeyBjb3VudDogc2VsZWN0ZWRDaGlsZHJlbi5sZW5ndGgsIHRhcmdldFN0YWdlOiBzZWxlY3RlZENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKSB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzZWxlY3RlZERpc3BsYXlOYW1lcyA9IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TZWxlY3RlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHNlbGVjdGVkRGlzcGxheU5hbWVzLFxuICAgICAgY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIHNlbGVjdGlvbkV2aWRlbmNlLFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgQUZURVIgdGhlIHNwZWNpYWxpemVkIGV2ZW50XG4gICAgLy8gc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29yayB1bmlmb3JtbHkuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcblxuICAgIGNvbnN0IHRlbXBOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6ICdzZWxlY3Rvci10ZW1wJyxcbiAgICAgIGlkOiAnc2VsZWN0b3ItdGVtcCcsXG4gICAgICBjaGlsZHJlbjogc2VsZWN0ZWRDaGlsZHJlbixcbiAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgc2VsZWN0b3IncyBmYW4tb3V0IGVycm9yIG1vZGUuIFdpdGhvdXQgdGhpcywgQ2hpbGRyZW5FeGVjdXRvclxuICAgICAgLy8gcmVhZHMgYHRlbXBOb2RlLmZhaWxGYXN0YCAodW5kZWZpbmVkKSBhbmQgYWx3YXlzIHVzZXMgUHJvbWlzZS5hbGxTZXR0bGVkIOKAlFxuICAgICAgLy8gc2lsZW50bHkgc3dhbGxvd2luZyBhIHJlcXVpcmVkIGJyYW5jaCdzIGVycm9yLiBTZWUgYnVpbGRlciBgZmFpbEZhc3RgIG9wdGlvbi5cbiAgICAgIGZhaWxGYXN0OiBub2RlLmZhaWxGYXN0LFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICAgICAgdGVtcE5vZGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFN0YW1wIGludm9rZXIgY29udGV4dCBvbiBQYXVzZVNpZ25hbCBkdXJpbmcgYnViYmxlLXVwLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGVycm9yLnNldEludm9rZXIobm9kZS5pZCEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7QUFHSCxvREFBd0Q7QUFFeEQsbURBQXFEO0FBSXJELGlEQUFvRDtBQUVwRCxxREFBa0U7QUFDbEUsbURBQTRGO0FBRzVGLE1BQWEsZUFBZTtJQUVQO0lBQ0E7SUFGbkIsWUFDbUIsSUFBK0IsRUFDL0IsZ0JBQWdEO1FBRGhELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDaEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLFNBQW9CLEVBQ3BCLFVBQThCLEVBQzlCLFFBQWtDLEVBQ2xDLFdBQXdDLEVBQ3hDLGdCQUFtQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLElBQUksV0FBcUIsQ0FBQztRQUMxQixJQUFJLGlCQUFnRCxDQUFDO1FBQ3JELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hGLCtEQUErRDtZQUMvRCxJQUNFLFdBQVc7Z0JBQ1gsT0FBTyxXQUFXLEtBQUssUUFBUTtnQkFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFxQixFQUFFLDBCQUFlLENBQUM7Z0JBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUUsV0FBbUIsQ0FBQyxRQUFRLENBQUMsRUFDNUMsQ0FBQztnQkFDRCxXQUFXLEdBQUksV0FBbUIsQ0FBQyxRQUFRLENBQUM7Z0JB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QVEsQ0FBQyxNQUFNLEVBQ2YsZ0JBQWdCLEVBQ2hCLGlCQUFpQixDQUNsQixDQUFDO1FBQ0Ysa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFeEcsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxlQUFlO1lBQ3JCLEVBQUUsRUFBRSxlQUFlO1lBQ25CLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsOEVBQThFO1lBQzlFLDZFQUE2RTtZQUM3RSxnRkFBZ0Y7WUFDaEYsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUM7UUFDRixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUNwRCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLENBQ2pCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4Qix5REFBeUQ7WUFDekQsSUFBSSxJQUFBLHdCQUFhLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXhKRCwwQ0F3SkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlbGVjdG9ySGFuZGxlciDigJQgTXVsdGktY2hvaWNlIGZpbHRlcmVkIGZhbi1vdXQuXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gRXhlY3V0ZSBzY29wZS1iYXNlZCBzZWxlY3RvciBub2RlcyAoc3RhZ2Ug4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZHJlbiDihpIgcGFyYWxsZWwgZXhlY3V0aW9uKVxuICogLSBUaGUgc2VsZWN0b3IgZnVuY3Rpb24gSVMgYSBzdGFnZTogcmVhZHMgc2NvcGUsIHJldHVybnMgc3RyaW5nW10gb2YgYnJhbmNoIElEc1xuICogLSBEZWxlZ2F0ZXMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHNlbGVjdGVkIGNoaWxkcmVuIHRvIENoaWxkcmVuRXhlY3V0b3JcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGlvbkV2aWRlbmNlIH0gZnJvbSAnLi4vLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB7IERFQ0lTSU9OX1JFU1VMVCB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBOb2RlUmVzdWx0VHlwZSwgU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJyZWFrSGFuZGxlciB9IGZyb20gJy4vYnJlYWtGbGFnLmpzJztcbmltcG9ydCB0eXBlIHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4vQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21taXRTdGFnZSwgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IGNhcHR1cmVTdGFnZUZhaWx1cmUsIGxvZ2dhYmxlU3RhZ2VFcnJvciwgcmVjb3JkU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZywgRXhlY3V0ZU5vZGVGbiwgUnVuU3RhZ2VGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JIYW5kbGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT4sXG4gICkge31cblxuICAvKipcbiAgICogSGFuZGxlIGEgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZSAoY3JlYXRlZCB2aWEgYWRkU2VsZWN0b3JGdW5jdGlvbikuXG4gICAqIFRoZSBzdGFnZSBmdW5jdGlvbiBJUyB0aGUgc2VsZWN0b3Ig4oCUIGl0cyByZXR1cm4gdmFsdWUgY29udGFpbnMgYnJhbmNoIElEcy5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZHJlbiDihpIgcGFyYWxsZWwgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVNjb3BlQmFzZWQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBydW5TdGFnZTogUnVuU3RhZ2VGbjxUT3V0LCBUU2NvcGU+LFxuICAgIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYnJlYWtGbiA9IGNyZWF0ZUJyZWFrSGFuZGxlcihicmVha0ZsYWcpO1xuXG4gICAgbGV0IHNlbGVjdGVkSWRzOiBzdHJpbmdbXTtcbiAgICBsZXQgc2VsZWN0aW9uRXZpZGVuY2U6IFNlbGVjdGlvbkV2aWRlbmNlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFnZU91dHB1dCA9IGF3YWl0IHJ1blN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAvLyBEZXRlY3QgU2VsZWN0aW9uUmVzdWx0IGZyb20gc2VsZWN0KCkgaGVscGVyIHZpYSBTeW1ib2wgYnJhbmRcbiAgICAgIGlmIChcbiAgICAgICAgc3RhZ2VPdXRwdXQgJiZcbiAgICAgICAgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBSZWZsZWN0LmhhcyhzdGFnZU91dHB1dCBhcyBvYmplY3QsIERFQ0lTSU9OX1JFU1VMVCkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSgoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2hlcylcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZElkcyA9IChzdGFnZU91dHB1dCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICBzZWxlY3Rpb25FdmlkZW5jZSA9IChzdGFnZU91dHB1dCBhcyBhbnkpLmV2aWRlbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSBBcnJheS5pc0FycmF5KHN0YWdlT3V0cHV0KSA/IHN0YWdlT3V0cHV0Lm1hcChTdHJpbmcpIDogW1N0cmluZyhzdGFnZU91dHB1dCldO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdyDigJQgY29tbWl0IGFuZCByZS10aHJvdyB3aXRob3V0IGVycm9yIGxvZ2dpbmcuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY2FwdHVyZVN0YWdlRmFpbHVyZShjb250ZXh0LCBlcnJvcik7XG4gICAgICBjb21taXRTdGFnZVdyaXRlcyhjb250ZXh0KTtcbiAgICAgIGNvbnN0IHNlcnZlZCA9IHJlY29yZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHtcbiAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3IsIG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0b3IgY29tcGxldGVkLCBidXQgaXQgZGlkIG5vdCBzZWxlY3Qgb3IgZGlzcGF0Y2ggYnJhbmNoZXMuXG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdzZWxlY3RvcicpO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAvLyBObyBicmFuY2hlcyByYW46IGRvIG5vdCBtYW51ZmFjdHVyZSBhIHJlc3VsdCBtYXAuIEluIGEgc3ViZmxvdyxcbiAgICAgIC8vIHVuZGVmaW5lZCBsZXRzIFN1YmZsb3dFeGVjdXRvciB1c2UgdGhlIHN0YWdlJ3MgY29tbWl0dGVkIHN0YXRlLlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0ZWRDaGlsZElkcycsIHNlbGVjdGVkSWRzKTtcbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0b3JQYXR0ZXJuJywgJ3Njb3BlLWJhc2VkLW11bHRpLWNob2ljZScpO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3NraXBwZWRBbGxDaGlsZHJlbicsIHRydWUpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzZWxlY3RlZCcsICdObyBjaGlsZHJlbiBzZWxlY3RlZCDigJQgc2tpcHBpbmcgYWxsIGJyYW5jaGVzLicsIHtcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHRhcmdldFN0YWdlOiBbXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKG5vZGUubmFtZSwgW10sIChub2RlLmNoaWxkcmVuID8/IFtdKS5sZW5ndGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZXZlbiBvbiB6ZXJvLXNlbGVjdCBwYXRoIOKAlFxuICAgICAgLy8gdGhlIHNlbGVjdG9yIERJRCBjb21wbGV0ZSAoaXQgcGlja2VkIG5vbmUpOyBjb25zdW1lcnMgdHJhY2tpbmdcbiAgICAgIC8vIHZpc2l0ZWQgbmVlZCB0aGUgc2lnbmFsLlxuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNoaWxkcmVuIGJ5IG1hdGNoaW5nIHNlbGVjdGVkIElEcyBhZ2FpbnN0IG5vZGUuY2hpbGRyZW4uXG4gICAgLy8gTWF0Y2ggYnJhbmNoSWQgZmlyc3QgKG9yaWdpbmFsIHVucHJlZml4ZWQgSUQpLCBmYWxsIGJhY2sgdG8gaWQgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhjLmJyYW5jaElkID8/IGMuaWQhKSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbGwgSURzIGV4aXN0IChmYWlsIGZhc3QpXG4gICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoICE9PSBzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNoaWxkSWRzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLmJyYW5jaElkID8/IGMuaWQpO1xuICAgICAgY29uc3QgbWlzc2luZyA9IHNlbGVjdGVkSWRzLmZpbHRlcigoaWQpID0+ICFjaGlsZElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNjb3BlLWJhc2VkIHNlbGVjdG9yICcke25vZGUubmFtZX0nIHJldHVybmVkIHVua25vd24gY2hpbGQgSURzOiAke21pc3Npbmcuam9pbihcbiAgICAgICAgJywgJyxcbiAgICAgICl9LiBBdmFpbGFibGU6ICR7Y2hpbGRJZHMuam9pbignLCAnKX1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3NlbGVjdG9yRXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcHBlZElkcyA9IGNoaWxkcmVuXG4gICAgICAuZmlsdGVyKChjKSA9PiAhc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5icmFuY2hJZCA/PyBjLmlkISkpXG4gICAgICAubWFwKChjKSA9PiBjLmJyYW5jaElkID8/IGMuaWQpO1xuICAgIGlmIChza2lwcGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQ2hpbGRJZHMnLCBza2lwcGVkSWRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZE5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgYFJ1bm5pbmcgJHtzZWxlY3RlZE5hbWVzfSAoJHtzZWxlY3RlZENoaWxkcmVuLmxlbmd0aH0gb2YgJHtjaGlsZHJlbi5sZW5ndGh9IG1hdGNoZWQpYCxcbiAgICAgIHsgY291bnQ6IHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoLCB0YXJnZXRTdGFnZTogc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREaXNwbGF5TmFtZXMgPSBzZWxlY3RlZENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU2VsZWN0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICBzZWxlY3RlZERpc3BsYXlOYW1lcyxcbiAgICAgIGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICBzZWxlY3Rpb25FdmlkZW5jZSxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIEFGVEVSIHRoZSBzcGVjaWFsaXplZCBldmVudFxuICAgIC8vIHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmsgdW5pZm9ybWx5LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ3NlbGVjdG9yJyk7XG5cbiAgICBjb25zdCB0ZW1wTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiAnc2VsZWN0b3ItdGVtcCcsXG4gICAgICBpZDogJ3NlbGVjdG9yLXRlbXAnLFxuICAgICAgY2hpbGRyZW46IHNlbGVjdGVkQ2hpbGRyZW4sXG4gICAgICAvLyBQcm9wYWdhdGUgdGhlIHNlbGVjdG9yJ3MgZmFuLW91dCBlcnJvciBtb2RlLiBXaXRob3V0IHRoaXMsIENoaWxkcmVuRXhlY3V0b3JcbiAgICAgIC8vIHJlYWRzIGB0ZW1wTm9kZS5mYWlsRmFzdGAgKHVuZGVmaW5lZCkgYW5kIGFsd2F5cyB1c2VzIFByb21pc2UuYWxsU2V0dGxlZCDigJRcbiAgICAgIC8vIHNpbGVudGx5IHN3YWxsb3dpbmcgYSByZXF1aXJlZCBicmFuY2gncyBlcnJvci4gU2VlIGJ1aWxkZXIgYGZhaWxGYXN0YCBvcHRpb24uXG4gICAgICBmYWlsRmFzdDogbm9kZS5mYWlsRmFzdCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgIHRlbXBOb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBTdGFtcCBpbnZva2VyIGNvbnRleHQgb24gUGF1c2VTaWduYWwgZHVyaW5nIGJ1YmJsZS11cC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.StageRunner = void 0;
|
|
13
|
+
const effect_js_1 = require("../../attempt/effect.js");
|
|
13
14
|
const interrupt_js_1 = require("../../pause/interrupt.js");
|
|
14
15
|
const types_js_1 = require("../../pause/types.js");
|
|
15
16
|
const createProtectedScope_js_1 = require("../../scope/protection/createProtectedScope.js");
|
|
@@ -20,7 +21,20 @@ class StageRunner {
|
|
|
20
21
|
constructor(deps) {
|
|
21
22
|
this.deps = deps;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Run one stage function. `attempt` is the attempt runner's (P1b) — present when the stage runs under a retry
|
|
26
|
+
* policy, a `timeoutMs` or a run deadline: the scope hands it out (`$attempt()`) and is fenced to it, and the
|
|
27
|
+
* race below is against ITS signal (the run's, composed with the attempt's cap). Without one, the race is
|
|
28
|
+
* against the run's signal, as it always was.
|
|
29
|
+
*/
|
|
30
|
+
async run(node, stageFunc, context, breakFn, attempt) {
|
|
31
|
+
// Before the scope exists: the facade reads its attempt (and the run's signal) at construction.
|
|
32
|
+
context.useAttempt(attempt, this.deps.signal);
|
|
33
|
+
// The attempt's signal when it can abort (the run has a signal, or the attempt has a cap); else none — a race
|
|
34
|
+
// against a signal that never aborts would add a microtask per attempt and reorder parallel siblings.
|
|
35
|
+
const raceSignal = attempt && (this.deps.signal !== undefined || attempt.timeoutMs !== undefined)
|
|
36
|
+
? attempt.signal
|
|
37
|
+
: this.deps.signal;
|
|
24
38
|
// Create scope via ScopeFactory — each stage gets its own scope instance
|
|
25
39
|
const rawScope = this.deps.scopeFactory(context, node.name, this.deps.readOnlyContext, this.deps.executionEnv);
|
|
26
40
|
const runtime = (0, runtime_js_1.requireScopeRuntime)(rawScope);
|
|
@@ -72,9 +86,9 @@ class StageRunner {
|
|
|
72
86
|
const output = stageFunc(scope, breakFn, streamCallback);
|
|
73
87
|
// Sync+async safety: only await real Promises to avoid thenable assimilation
|
|
74
88
|
if (output instanceof Promise) {
|
|
75
|
-
// Race against
|
|
76
|
-
if (
|
|
77
|
-
result = (await raceAbort(output,
|
|
89
|
+
// Race against the attempt's signal (or the run's) if there is one
|
|
90
|
+
if (raceSignal) {
|
|
91
|
+
result = (await raceAbort(output, raceSignal));
|
|
78
92
|
}
|
|
79
93
|
else {
|
|
80
94
|
result = (await output);
|
|
@@ -86,11 +100,20 @@ class StageRunner {
|
|
|
86
100
|
}
|
|
87
101
|
catch (error) {
|
|
88
102
|
if ((0, interrupt_js_1.isInterruptSignal)(error)) {
|
|
103
|
+
// A keyless touching stage — or one that made a keyless touching call — may not be re-run by a resume (P3): its
|
|
104
|
+
// interrupt fails the stage instead.
|
|
105
|
+
const refusal = (0, effect_js_1.interruptProblem)(node.touches) ??
|
|
106
|
+
(context.hasKeylessEffect
|
|
107
|
+
? 'made a touching $call with no idempotencyKey, and a resume after interrupt() re-runs the stage from ' +
|
|
108
|
+
'its top — the call would be sent again without a key. Give the call a key, or interrupt before it.'
|
|
109
|
+
: undefined);
|
|
110
|
+
if (refusal !== undefined)
|
|
111
|
+
throw new Error(`[footprint] stage '${node.id}' ${refusal}`);
|
|
89
112
|
runtime.target.notifyPause?.((0, servedPause_js_1.servedPause)(context, error.payload));
|
|
90
|
-
throw stampedPause(new types_js_1.PauseSignal(error.payload, node.id, 'interrupt'), context);
|
|
113
|
+
throw stampedPause(new types_js_1.PauseSignal(error.payload, node.id, 'interrupt'), context, attempt);
|
|
91
114
|
}
|
|
92
115
|
if ((0, types_js_1.isPauseSignal)(error) && error instanceof types_js_1.PauseSignal)
|
|
93
|
-
stampedPause(error, context);
|
|
116
|
+
stampedPause(error, context, attempt);
|
|
94
117
|
throw error;
|
|
95
118
|
}
|
|
96
119
|
// Notify recorders of stage end (if scope supports it)
|
|
@@ -107,7 +130,7 @@ class StageRunner {
|
|
|
107
130
|
const pauseData = (0, types_js_1.isPauseResult)(result) ? result.data : result;
|
|
108
131
|
// Notify scope recorders before throwing
|
|
109
132
|
runtime.target.notifyPause?.((0, servedPause_js_1.servedPause)(context, pauseData));
|
|
110
|
-
throw stampedPause(new types_js_1.PauseSignal(pauseData, node.id), context);
|
|
133
|
+
throw stampedPause(new types_js_1.PauseSignal(pauseData, node.id), context, attempt);
|
|
111
134
|
}
|
|
112
135
|
return result;
|
|
113
136
|
}
|
|
@@ -121,13 +144,17 @@ exports.StageRunner = StageRunner;
|
|
|
121
144
|
* (`TraversalContext.resumedFrom`). Synchronous on purpose: an extra await
|
|
122
145
|
* here would reorder parallel siblings' microtasks.
|
|
123
146
|
*/
|
|
124
|
-
function stampedPause(signal, context) {
|
|
147
|
+
function stampedPause(signal, context, attempt) {
|
|
125
148
|
signal.stampExecution(context.runtimeStageId);
|
|
149
|
+
// A touching stage's key rides the checkpoint (P3): its resume runs under the same key.
|
|
150
|
+
signal.stampIdempotencyKey(attempt?.idempotencyKey);
|
|
126
151
|
return signal;
|
|
127
152
|
}
|
|
128
153
|
/** Race a promise against an AbortSignal. Rejects with the signal's reason on abort. */
|
|
129
154
|
function raceAbort(promise, signal) {
|
|
130
155
|
if (signal.aborted) {
|
|
156
|
+
// The stage's own promise is abandoned: observe its rejection, so it never surfaces as an unhandled one.
|
|
157
|
+
promise.catch(() => undefined);
|
|
131
158
|
return Promise.reject(signal.reason instanceof Error ? signal.reason : new Error(signal.reason ?? 'Aborted'));
|
|
132
159
|
}
|
|
133
160
|
return new Promise((resolve, reject) => {
|
|
@@ -142,4 +169,4 @@ function raceAbort(promise, signal) {
|
|
|
142
169
|
});
|
|
143
170
|
});
|
|
144
171
|
}
|
|
145
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUdILDJEQUE2RDtBQUM3RCxtREFBaUY7QUFDakYsNEZBQXNGO0FBQ3RGLHVEQUE2RDtBQUc3RCxxREFBK0M7QUFFL0MsTUFBYSxXQUFXO0lBQ087SUFBN0IsWUFBNkIsSUFBK0I7UUFBL0IsU0FBSSxHQUFKLElBQUksQ0FBMkI7SUFBRyxDQUFDO0lBRWhFLEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUI7UUFFbkIseUVBQXlFO1FBQ3pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0csTUFBTSxPQUFPLEdBQUcsSUFBQSxnQ0FBbUIsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUU5Qyx1RUFBdUU7UUFDdkUsOEVBQThFO1FBQzlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0I7WUFDdEMsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUUsSUFBQSw4Q0FBb0IsRUFBQyxRQUFrQixFQUFFO2dCQUN4QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTthQUNyQixDQUFZLENBQUM7UUFFbEIseURBQXlEO1FBQ3pELElBQUksY0FBMEMsQ0FBQztRQUMvQyxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENB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Q25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlUnVubmVyIOKAlCBFeGVjdXRlcyBpbmRpdmlkdWFsIHN0YWdlIGZ1bmN0aW9ucy5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSBmb3IgZWFjaCBzdGFnZVxuICogLSBBcHBseSBzY29wZSBwcm90ZWN0aW9uIChjcmVhdGVQcm90ZWN0ZWRTY29wZSkgdG8gaW50ZXJjZXB0IGRpcmVjdCBhc3NpZ25tZW50c1xuICogLSBIYW5kbGUgc3RyZWFtaW5nIHN0YWdlcyAob25TdGFydCwgb25Ub2tlbiwgb25FbmQgbGlmZWN5Y2xlKVxuICogLSBTeW5jK2FzeW5jIHNhZmV0eTogb25seSBhd2FpdCByZWFsIFByb21pc2VzIChpbnN0YW5jZW9mIGNoZWNrKVxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc0ludGVycnVwdFNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL2ludGVycnVwdC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgeyByZXF1aXJlU2NvcGVSdW50aW1lIH0gZnJvbSAnLi4vLi4vc2NvcGUvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBTdGFnZUZ1bmN0aW9uLCBTdHJlYW1DYWxsYmFjayB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi9zZXJ2ZWRQYXVzZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTdGFnZVJ1bm5lcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+KSB7fVxuXG4gIGFzeW5jIHJ1bihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gQ3JlYXRlIHNjb3BlIHZpYSBTY29wZUZhY3Rvcnkg4oCUIGVhY2ggc3RhZ2UgZ2V0cyBpdHMgb3duIHNjb3BlIGluc3RhbmNlXG4gICAgY29uc3QgcmF3U2NvcGUgPSB0aGlzLmRlcHMuc2NvcGVGYWN0b3J5KGNvbnRleHQsIG5vZGUubmFtZSwgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCwgdGhpcy5kZXBzLmV4ZWN1dGlvbkVudik7XG4gICAgY29uc3QgcnVudGltZSA9IHJlcXVpcmVTY29wZVJ1bnRpbWUocmF3U2NvcGUpO1xuXG4gICAgLy8gV3JhcCBzY29wZSB3aXRoIHByb3RlY3Rpb24gdG8gaW50ZXJjZXB0IGRpcmVjdCBwcm9wZXJ0eSBhc3NpZ25tZW50cy5cbiAgICAvLyBQcm92aWRlcnMgZGVjbGFyZSB3aGV0aGVyIHRoZWlyIG93biBhc3NpZ25tZW50IHRyYXBzIGFscmVhZHkgbWFuYWdlIHdyaXRlcy5cbiAgICBjb25zdCBzY29wZSA9IHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzXG4gICAgICA/IHJhd1Njb3BlXG4gICAgICA6IChjcmVhdGVQcm90ZWN0ZWRTY29wZShyYXdTY29wZSBhcyBvYmplY3QsIHtcbiAgICAgICAgICBtb2RlOiB0aGlzLmRlcHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgICAgfSkgYXMgVFNjb3BlKTtcblxuICAgIC8vIFNldCB1cCBzdHJlYW1pbmcgY2FsbGJhY2sgaWYgdGhpcyBpcyBhIHN0cmVhbWluZyBzdGFnZVxuICAgIGxldCBzdHJlYW1DYWxsYmFjazogU3RyZWFtQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjY3VtdWxhdGVkVGV4dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICBzdHJlYW1DYWxsYmFjayA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY3VtdWxhdGVkVGV4dCArPSB0b2tlbjtcbiAgICAgICAgdGhpcy5kZXBzLnN0cmVhbUhhbmRsZXJzPy5vblRva2VuPy4oc3RyZWFtSWQsIHRva2VuKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uU3RhcnQ/LihzdHJlYW1JZCk7XG4gICAgfVxuXG4gICAgcnVudGltZS5zZXRCcmVhaz8uKGJyZWFrRm4pO1xuXG4gICAgLy8gTm90aWZ5IHJlY29yZGVycyBvZiBzdGFnZSBzdGFydCAoaWYgc2NvcGUgc3VwcG9ydHMgaXQpXG4gICAgcnVudGltZS50YXJnZXQubm90aWZ5U3RhZ2VTdGFydD8uKCk7XG5cbiAgICAvLyDilIDilIAgRXhlY3V0ZSB0aGUgc3RhZ2UgZnVuY3Rpb24g4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUSEUgc3RhZ2UgYm91bmRhcnkgZm9yIGBpbnRlcnJ1cHQoKWAgKGRlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWRcbiAgICAvLyBEMykuIEV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIGluIHRoZSBlbmdpbmUgZnVubmVscyB0aHJvdWdoIHRoaXMgb25lIGNhbGwg4oCUXG4gICAgLy8gbGluZWFyIHN0YWdlcywgZGVjaWRlciBhbmQgc2VsZWN0b3Igc3RhZ2VzICh0aGVpciBoYW5kbGVycyBhcmUgaGFuZGVkXG4gICAgLy8gYGV4ZWN1dGVTdGFnZWApLCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IGJvZGllcyDigJQgc28gY29udmVydGluZyBoZXJlIGlzXG4gICAgLy8gd2hhdCBtYWtlcyBgaW50ZXJydXB0KClgIHdvcmsgaW4gQUxMIG9mIHRoZW0uIENhdGNoaW5nIGl0IGluIGEgdHJhdmVyc2VyXG4gICAgLy8gcGhhc2UgaW5zdGVhZCB3b3VsZCBoYXZlIGxlZnQgZGVjaWRlci9zZWxlY3RvciBzdGFnZXMgc2lsZW50bHkgdW5hYmxlIHRvXG4gICAgLy8gaW50ZXJydXB0LlxuICAgIC8vXG4gICAgLy8gVGhlIGNvbnZlcnNpb24gaXMgZGVsaWJlcmF0ZWx5IHRvdGFsOiBhbiBJbnRlcnJ1cHRTaWduYWwgYmVjb21lcyB0aGVcbiAgICAvLyBsaWJyYXJ5J3MgZXhpc3RpbmcgUGF1c2VTaWduYWwsIHN0YW1wZWQgd2l0aCB0aGUgbm9kZSBpZCB0aGUgZnJlZVxuICAgIC8vIGZ1bmN0aW9uIGNvdWxkIG5vdCBrbm93IGFuZCB3aXRoIGBwYXVzZWRCeTogJ2ludGVycnVwdCdgIHNvIHJlc3VtZSgpXG4gICAgLy8gcmUtZW50ZXJzIHRoZSBzdGFnZSBmcm9tIGl0cyB0b3AuIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSDigJQgY29tbWl0LXRoZW4tXG4gICAgLy8gcmV0aHJvdywgb25QYXVzZSwgc3ViZmxvdyBzY29wZSBjYXB0dXJlLCBpbnZva2VyIHN0YW1waW5nLCB0aGUgb25lXG4gICAgLy8gZGV0YWNoZWQgY2hlY2twb2ludCBjbG9uZSDigJQgaXMgdGhlIHNoaXBwZWQgcGF1c2UgbWFjaGluZXJ5LCB1bnRvdWNoZWQuXG4gICAgLy9cbiAgICAvLyBgbm90aWZ5U3RhZ2VFbmRgIGRlbGliZXJhdGVseSBkb2VzIE5PVCBmaXJlIG9uIHRoaXMgcGF0aDogdGhlIHN0YWdlXG4gICAgLy8gZnVuY3Rpb24gZGlkIG5vdCByZXR1cm4sIGV4YWN0bHkgbGlrZSB0aGUgZXJyb3IgcGF0aCBiZWxvdyBpdC4gKFRoZVxuICAgIC8vIHBhdXNhYmxlLWhhbmRsZXIgcGF0aCBmdXJ0aGVyIGRvd24gRE9FUyBmaXJlIGl0IOKAlCB0aGVyZSB0aGUgZnVuY3Rpb25cbiAgICAvLyByZXR1cm5lZCBub3JtYWxseSBhbmQgdGhlIGVuZ2luZSB0dXJuZWQgaXRzIHZhbHVlIGludG8gYSBwYXVzZS4pXG4gICAgbGV0IHJlc3VsdDogVE91dDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gc3RhZ2VGdW5jKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjayk7XG5cbiAgICAgIC8vIFN5bmMrYXN5bmMgc2FmZXR5OiBvbmx5IGF3YWl0IHJlYWwgUHJvbWlzZXMgdG8gYXZvaWQgdGhlbmFibGUgYXNzaW1pbGF0aW9uXG4gICAgICBpZiAob3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBSYWNlIGFnYWluc3QgQWJvcnRTaWduYWwgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuZGVwcy5zaWduYWwpIHtcbiAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgcmFjZUFib3J0KG91dHB1dCwgdGhpcy5kZXBzLnNpZ25hbCkpIGFzIFRPdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IG91dHB1dCkgYXMgVE91dDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb3V0cHV0IGFzIFRPdXQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc0ludGVycnVwdFNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgcnVudGltZS50YXJnZXQubm90aWZ5UGF1c2U/LihzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXlsb2FkKSk7XG4gICAgICAgIHRocm93IHN0YW1wZWRQYXVzZShuZXcgUGF1c2VTaWduYWwoZXJyb3IucGF5bG9hZCwgbm9kZS5pZCwgJ2ludGVycnVwdCcpLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSAmJiBlcnJvciBpbnN0YW5jZW9mIFBhdXNlU2lnbmFsKSBzdGFtcGVkUGF1c2UoZXJyb3IsIGNvbnRleHQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IHJlY29yZGVycyBvZiBzdGFnZSBlbmQgKGlmIHNjb3BlIHN1cHBvcnRzIGl0KVxuICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVN0YWdlRW5kPy4oKTtcblxuICAgIC8vIENhbGwgb25FbmQgbGlmZWN5Y2xlIGhvb2sgZm9yIHN0cmVhbWluZyBzdGFnZXNcbiAgICBpZiAobm9kZS5pc1N0cmVhbWluZykge1xuICAgICAgY29uc3Qgc3RyZWFtSWQgPSBub2RlLnN0cmVhbUlkID8/IG5vZGUubmFtZTtcbiAgICAgIHRoaXMuZGVwcy5zdHJlYW1IYW5kbGVycz8ub25FbmQ/LihzdHJlYW1JZCwgYWNjdW11bGF0ZWRUZXh0KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUGF1c2UgZGV0ZWN0aW9uIOKUgOKUgFxuICAgIC8vIFBhdXNhYmxlIHN0YWdlczogYW55IG5vbi12b2lkIHJldHVybiA9IHBhdXNlIHdpdGggdGhhdCBkYXRhLlxuICAgIC8vIEFsc28gc3VwcG9ydHMgZXhwbGljaXQgcGF1c2UoeyAuLi4gfSkgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBpZiAobm9kZS5pc1BhdXNhYmxlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwYXVzZURhdGEgPSBpc1BhdXNlUmVzdWx0KHJlc3VsdCkgPyAocmVzdWx0IGFzIGFueSkuZGF0YSA6IHJlc3VsdDtcbiAgICAgIC8vIE5vdGlmeSBzY29wZSByZWNvcmRlcnMgYmVmb3JlIHRocm93aW5nXG4gICAgICBydW50aW1lLnRhcmdldC5ub3RpZnlQYXVzZT8uKHNlcnZlZFBhdXNlKGNvbnRleHQsIHBhdXNlRGF0YSkpO1xuICAgICAgdGhyb3cgc3RhbXBlZFBhdXNlKG5ldyBQYXVzZVNpZ25hbChwYXVzZURhdGEsIG5vZGUuaWQpLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVjb3JkIFdISUNIIGV4ZWN1dGlvbiBwYXVzZWQgb24gdGhlIHNpZ25hbCAoZmlyc3Qgc3RhbXAgd2lucykg4oCUIHRoZSBzdGFnZVxuICogYm91bmRhcnkgaXMgdGhlIG9uZSBwbGFjZSB0aGF0IGtub3dzIGl0cyBydW50aW1lU3RhZ2VJZCAodGhlIHJ1biBpcyBhZGRlZFxuICogd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdCDigJQgYFBhdXNlU2lnbmFsIMK3IGNvbXBsZXRlRXhlY3V0aW9uYCk7IHRoZVxuICogY2hlY2twb2ludCBjYXJyaWVzIGl0IHNvIGEgcmVzdW1lIGNhbiBsaW5rIHRvIHRoZSBwYXVzZWQgZXhlY3V0aW9uXG4gKiAoYFRyYXZlcnNhbENvbnRleHQucmVzdW1lZEZyb21gKS4gU3luY2hyb25vdXMgb24gcHVycG9zZTogYW4gZXh0cmEgYXdhaXRcbiAqIGhlcmUgd291bGQgcmVvcmRlciBwYXJhbGxlbCBzaWJsaW5ncycgbWljcm90YXNrcy5cbiAqL1xuZnVuY3Rpb24gc3RhbXBlZFBhdXNlKHNpZ25hbDogUGF1c2VTaWduYWwsIGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IFBhdXNlU2lnbmFsIHtcbiAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKGNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG4vKiogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhbiBBYm9ydFNpZ25hbC4gUmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24gb24gYWJvcnQuICovXG5mdW5jdGlvbiByYWNlQWJvcnQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VD4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+XG4gICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuIl19
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUVILHVEQUEyRDtBQUczRCwyREFBNkQ7QUFDN0QsbURBQWlGO0FBQ2pGLDRGQUFzRjtBQUN0Rix1REFBNkQ7QUFHN0QscURBQStDO0FBRS9DLE1BQWEsV0FBVztJQUNPO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUIsRUFDbkIsT0FBd0I7UUFFeEIsZ0dBQWdHO1FBQ2hHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsOEdBQThHO1FBQzlHLHNHQUFzRztRQUN0RyxNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7WUFDNUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV2Qix5RUFBeUU7UUFDekUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRyxNQUFNLE9BQU8sR0FBRyxJQUFBLGdDQUFtQixFQUFDLFFB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QU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlUnVubmVyIOKAlCBFeGVjdXRlcyBpbmRpdmlkdWFsIHN0YWdlIGZ1bmN0aW9ucy5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSBmb3IgZWFjaCBzdGFnZVxuICogLSBBcHBseSBzY29wZSBwcm90ZWN0aW9uIChjcmVhdGVQcm90ZWN0ZWRTY29wZSkgdG8gaW50ZXJjZXB0IGRpcmVjdCBhc3NpZ25tZW50c1xuICogLSBIYW5kbGUgc3RyZWFtaW5nIHN0YWdlcyAob25TdGFydCwgb25Ub2tlbiwgb25FbmQgbGlmZWN5Y2xlKVxuICogLSBTeW5jK2FzeW5jIHNhZmV0eTogb25seSBhd2FpdCByZWFsIFByb21pc2VzIChpbnN0YW5jZW9mIGNoZWNrKVxuICovXG5cbmltcG9ydCB7IGludGVycnVwdFByb2JsZW0gfSBmcm9tICcuLi8uLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRDb250ZXh0IH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNJbnRlcnJ1cHRTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS9pbnRlcnJ1cHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVJlc3VsdCwgaXNQYXVzZVNpZ25hbCwgUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90ZWN0ZWRTY29wZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vY3JlYXRlUHJvdGVjdGVkU2NvcGUuanMnO1xuaW1wb3J0IHsgcmVxdWlyZVNjb3BlUnVudGltZSB9IGZyb20gJy4uLy4uL3Njb3BlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgU3RhZ2VGdW5jdGlvbiwgU3RyZWFtQ2FsbGJhY2sgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRQYXVzZSB9IGZyb20gJy4vc2VydmVkUGF1c2UuanMnO1xuXG5leHBvcnQgY2xhc3MgU3RhZ2VSdW5uZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPikge31cblxuICAvKipcbiAgICogUnVuIG9uZSBzdGFnZSBmdW5jdGlvbi4gYGF0dGVtcHRgIGlzIHRoZSBhdHRlbXB0IHJ1bm5lcidzIChQMWIpIOKAlCBwcmVzZW50IHdoZW4gdGhlIHN0YWdlIHJ1bnMgdW5kZXIgYSByZXRyeVxuICAgKiBwb2xpY3ksIGEgYHRpbWVvdXRNc2Agb3IgYSBydW4gZGVhZGxpbmU6IHRoZSBzY29wZSBoYW5kcyBpdCBvdXQgKGAkYXR0ZW1wdCgpYCkgYW5kIGlzIGZlbmNlZCB0byBpdCwgYW5kIHRoZVxuICAgKiByYWNlIGJlbG93IGlzIGFnYWluc3QgSVRTIHNpZ25hbCAodGhlIHJ1bidzLCBjb21wb3NlZCB3aXRoIHRoZSBhdHRlbXB0J3MgY2FwKS4gV2l0aG91dCBvbmUsIHRoZSByYWNlIGlzXG4gICAqIGFnYWluc3QgdGhlIHJ1bidzIHNpZ25hbCwgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICBhdHRlbXB0PzogQXR0ZW1wdENvbnRleHQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIC8vIEJlZm9yZSB0aGUgc2NvcGUgZXhpc3RzOiB0aGUgZmFjYWRlIHJlYWRzIGl0cyBhdHRlbXB0IChhbmQgdGhlIHJ1bidzIHNpZ25hbCkgYXQgY29uc3RydWN0aW9uLlxuICAgIGNvbnRleHQudXNlQXR0ZW1wdChhdHRlbXB0LCB0aGlzLmRlcHMuc2lnbmFsKTtcbiAgICAvLyBUaGUgYXR0ZW1wdCdzIHNpZ25hbCB3aGVuIGl0IGNhbiBhYm9ydCAodGhlIHJ1biBoYXMgYSBzaWduYWwsIG9yIHRoZSBhdHRlbXB0IGhhcyBhIGNhcCk7IGVsc2Ugbm9uZSDigJQgYSByYWNlXG4gICAgLy8gYWdhaW5zdCBhIHNpZ25hbCB0aGF0IG5ldmVyIGFib3J0cyB3b3VsZCBhZGQgYSBtaWNyb3Rhc2sgcGVyIGF0dGVtcHQgYW5kIHJlb3JkZXIgcGFyYWxsZWwgc2libGluZ3MuXG4gICAgY29uc3QgcmFjZVNpZ25hbCA9XG4gICAgICBhdHRlbXB0ICYmICh0aGlzLmRlcHMuc2lnbmFsICE9PSB1bmRlZmluZWQgfHwgYXR0ZW1wdC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgPyBhdHRlbXB0LnNpZ25hbFxuICAgICAgICA6IHRoaXMuZGVwcy5zaWduYWw7XG5cbiAgICAvLyBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSDigJQgZWFjaCBzdGFnZSBnZXRzIGl0cyBvd24gc2NvcGUgaW5zdGFuY2VcbiAgICBjb25zdCByYXdTY29wZSA9IHRoaXMuZGVwcy5zY29wZUZhY3RvcnkoY29udGV4dCwgbm9kZS5uYW1lLCB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0LCB0aGlzLmRlcHMuZXhlY3V0aW9uRW52KTtcbiAgICBjb25zdCBydW50aW1lID0gcmVxdWlyZVNjb3BlUnVudGltZShyYXdTY29wZSk7XG5cbiAgICAvLyBXcmFwIHNjb3BlIHdpdGggcHJvdGVjdGlvbiB0byBpbnRlcmNlcHQgZGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnRzLlxuICAgIC8vIFByb3ZpZGVycyBkZWNsYXJlIHdoZXRoZXIgdGhlaXIgb3duIGFzc2lnbm1lbnQgdHJhcHMgYWxyZWFkeSBtYW5hZ2Ugd3JpdGVzLlxuICAgIGNvbnN0IHNjb3BlID0gcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHNcbiAgICAgID8gcmF3U2NvcGVcbiAgICAgIDogKGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IHRoaXMuZGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICB9KSBhcyBUU2NvcGUpO1xuXG4gICAgLy8gU2V0IHVwIHN0cmVhbWluZyBjYWxsYmFjayBpZiB0aGlzIGlzIGEgc3RyZWFtaW5nIHN0YWdlXG4gICAgbGV0IHN0cmVhbUNhbGxiYWNrOiBTdHJlYW1DYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYWNjdW11bGF0ZWRUZXh0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc1N0cmVhbWluZykge1xuICAgICAgY29uc3Qgc3RyZWFtSWQgPSBub2RlLnN0cmVhbUlkID8/IG5vZGUubmFtZTtcbiAgICAgIHN0cmVhbUNhbGxiYWNrID0gKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgYWNjdW11bGF0ZWRUZXh0ICs9IHRva2VuO1xuICAgICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uVG9rZW4/LihzdHJlYW1JZCwgdG9rZW4pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGVwcy5zdHJlYW1IYW5kbGVycz8ub25TdGFydD8uKHN0cmVhbUlkKTtcbiAgICB9XG5cbiAgICBydW50aW1lLnNldEJyZWFrPy4oYnJlYWtGbik7XG5cbiAgICAvLyBOb3RpZnkgcmVjb3JkZXJzIG9mIHN0YWdlIHN0YXJ0IChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZVN0YXJ0Py4oKTtcblxuICAgIC8vIOKUgOKUgCBFeGVjdXRlIHRoZSBzdGFnZSBmdW5jdGlvbiDilIDilIBcbiAgICAvL1xuICAgIC8vIFRIRSBzdGFnZSBib3VuZGFyeSBmb3IgYGludGVycnVwdCgpYCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZFxuICAgIC8vIEQzKS4gRXZlcnkgc3RhZ2UgZnVuY3Rpb24gaW4gdGhlIGVuZ2luZSBmdW5uZWxzIHRocm91Z2ggdGhpcyBvbmUgY2FsbCDigJRcbiAgICAvLyBsaW5lYXIgc3RhZ2VzLCBkZWNpZGVyIGFuZCBzZWxlY3RvciBzdGFnZXMgKHRoZWlyIGhhbmRsZXJzIGFyZSBoYW5kZWRcbiAgICAvLyBgZXhlY3V0ZVN0YWdlYCksIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgYm9kaWVzIOKAlCBzbyBjb252ZXJ0aW5nIGhlcmUgaXNcbiAgICAvLyB3aGF0IG1ha2VzIGBpbnRlcnJ1cHQoKWAgd29yayBpbiBBTEwgb2YgdGhlbS4gQ2F0Y2hpbmcgaXQgaW4gYSB0cmF2ZXJzZXJcbiAgICAvLyBwaGFzZSBpbnN0ZWFkIHdvdWxkIGhhdmUgbGVmdCBkZWNpZGVyL3NlbGVjdG9yIHN0YWdlcyBzaWxlbnRseSB1bmFibGUgdG9cbiAgICAvLyBpbnRlcnJ1cHQuXG4gICAgLy9cbiAgICAvLyBUaGUgY29udmVyc2lvbiBpcyBkZWxpYmVyYXRlbHkgdG90YWw6IGFuIEludGVycnVwdFNpZ25hbCBiZWNvbWVzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBleGlzdGluZyBQYXVzZVNpZ25hbCwgc3RhbXBlZCB3aXRoIHRoZSBub2RlIGlkIHRoZSBmcmVlXG4gICAgLy8gZnVuY3Rpb24gY291bGQgbm90IGtub3cgYW5kIHdpdGggYHBhdXNlZEJ5OiAnaW50ZXJydXB0J2Agc28gcmVzdW1lKClcbiAgICAvLyByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIHRvcC4gRXZlcnl0aGluZyBkb3duc3RyZWFtIOKAlCBjb21taXQtdGhlbi1cbiAgICAvLyByZXRocm93LCBvblBhdXNlLCBzdWJmbG93IHNjb3BlIGNhcHR1cmUsIGludm9rZXIgc3RhbXBpbmcsIHRoZSBvbmVcbiAgICAvLyBkZXRhY2hlZCBjaGVja3BvaW50IGNsb25lIOKAlCBpcyB0aGUgc2hpcHBlZCBwYXVzZSBtYWNoaW5lcnksIHVudG91Y2hlZC5cbiAgICAvL1xuICAgIC8vIGBub3RpZnlTdGFnZUVuZGAgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGZpcmUgb24gdGhpcyBwYXRoOiB0aGUgc3RhZ2VcbiAgICAvLyBmdW5jdGlvbiBkaWQgbm90IHJldHVybiwgZXhhY3RseSBsaWtlIHRoZSBlcnJvciBwYXRoIGJlbG93IGl0LiAoVGhlXG4gICAgLy8gcGF1c2FibGUtaGFuZGxlciBwYXRoIGZ1cnRoZXIgZG93biBET0VTIGZpcmUgaXQg4oCUIHRoZXJlIHRoZSBmdW5jdGlvblxuICAgIC8vIHJldHVybmVkIG5vcm1hbGx5IGFuZCB0aGUgZW5naW5lIHR1cm5lZCBpdHMgdmFsdWUgaW50byBhIHBhdXNlLilcbiAgICBsZXQgcmVzdWx0OiBUT3V0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBzdGFnZUZ1bmMoc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcblxuICAgICAgLy8gU3luYythc3luYyBzYWZldHk6IG9ubHkgYXdhaXQgcmVhbCBQcm9taXNlcyB0byBhdm9pZCB0aGVuYWJsZSBhc3NpbWlsYXRpb25cbiAgICAgIGlmIChvdXRwdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIFJhY2UgYWdhaW5zdCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCAob3IgdGhlIHJ1bidzKSBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgaWYgKHJhY2VTaWduYWwpIHtcbiAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgcmFjZUFib3J0KG91dHB1dCwgcmFjZVNpZ25hbCkpIGFzIFRPdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IG91dHB1dCkgYXMgVE91dDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb3V0cHV0IGFzIFRPdXQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc0ludGVycnVwdFNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIOKAlCBvciBvbmUgdGhhdCBtYWRlIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIOKAlCBtYXkgbm90IGJlIHJlLXJ1biBieSBhIHJlc3VtZSAoUDMpOiBpdHNcbiAgICAgICAgLy8gaW50ZXJydXB0IGZhaWxzIHRoZSBzdGFnZSBpbnN0ZWFkLlxuICAgICAgICBjb25zdCByZWZ1c2FsID1cbiAgICAgICAgICBpbnRlcnJ1cHRQcm9ibGVtKG5vZGUudG91Y2hlcykgPz9cbiAgICAgICAgICAoY29udGV4dC5oYXNLZXlsZXNzRWZmZWN0XG4gICAgICAgICAgICA/ICdtYWRlIGEgdG91Y2hpbmcgJGNhbGwgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgYW5kIGEgcmVzdW1lIGFmdGVyIGludGVycnVwdCgpIHJlLXJ1bnMgdGhlIHN0YWdlIGZyb20gJyArXG4gICAgICAgICAgICAgICdpdHMgdG9wIOKAlCB0aGUgY2FsbCB3b3VsZCBiZSBzZW50IGFnYWluIHdpdGhvdXQgYSBrZXkuIEdpdmUgdGhlIGNhbGwgYSBrZXksIG9yIGludGVycnVwdCBiZWZvcmUgaXQuJ1xuICAgICAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIHN0YWdlICcke25vZGUuaWR9JyAke3JlZnVzYWx9YCk7XG4gICAgICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVBhdXNlPy4oc2VydmVkUGF1c2UoY29udGV4dCwgZXJyb3IucGF5bG9hZCkpO1xuICAgICAgICB0aHJvdyBzdGFtcGVkUGF1c2UobmV3IFBhdXNlU2lnbmFsKGVycm9yLnBheWxvYWQsIG5vZGUuaWQsICdpbnRlcnJ1cHQnKSwgY29udGV4dCwgYXR0ZW1wdCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikgJiYgZXJyb3IgaW5zdGFuY2VvZiBQYXVzZVNpZ25hbCkgc3RhbXBlZFBhdXNlKGVycm9yLCBjb250ZXh0LCBhdHRlbXB0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSByZWNvcmRlcnMgb2Ygc3RhZ2UgZW5kIChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZUVuZD8uKCk7XG5cbiAgICAvLyBDYWxsIG9uRW5kIGxpZmVjeWNsZSBob29rIGZvciBzdHJlYW1pbmcgc3RhZ2VzXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uRW5kPy4oc3RyZWFtSWQsIGFjY3VtdWxhdGVkVGV4dCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFBhdXNlIGRldGVjdGlvbiDilIDilIBcbiAgICAvLyBQYXVzYWJsZSBzdGFnZXM6IGFueSBub24tdm9pZCByZXR1cm4gPSBwYXVzZSB3aXRoIHRoYXQgZGF0YS5cbiAgICAvLyBBbHNvIHN1cHBvcnRzIGV4cGxpY2l0IHBhdXNlKHsgLi4uIH0pIGZvciBiYWNrd2FyZCBjb21wYXQuXG4gICAgaWYgKG5vZGUuaXNQYXVzYWJsZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcGF1c2VEYXRhID0gaXNQYXVzZVJlc3VsdChyZXN1bHQpID8gKHJlc3VsdCBhcyBhbnkpLmRhdGEgOiByZXN1bHQ7XG4gICAgICAvLyBOb3RpZnkgc2NvcGUgcmVjb3JkZXJzIGJlZm9yZSB0aHJvd2luZ1xuICAgICAgcnVudGltZS50YXJnZXQubm90aWZ5UGF1c2U/LihzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZURhdGEpKTtcbiAgICAgIHRocm93IHN0YW1wZWRQYXVzZShuZXcgUGF1c2VTaWduYWwocGF1c2VEYXRhLCBub2RlLmlkKSwgY29udGV4dCwgYXR0ZW1wdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlY29yZCBXSElDSCBleGVjdXRpb24gcGF1c2VkIG9uIHRoZSBzaWduYWwgKGZpcnN0IHN0YW1wIHdpbnMpIOKAlCB0aGUgc3RhZ2VcbiAqIGJvdW5kYXJ5IGlzIHRoZSBvbmUgcGxhY2UgdGhhdCBrbm93cyBpdHMgcnVudGltZVN0YWdlSWQgKHRoZSBydW4gaXMgYWRkZWRcbiAqIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgYnVpbHQg4oCUIGBQYXVzZVNpZ25hbCDCtyBjb21wbGV0ZUV4ZWN1dGlvbmApOyB0aGVcbiAqIGNoZWNrcG9pbnQgY2FycmllcyBpdCBzbyBhIHJlc3VtZSBjYW4gbGluayB0byB0aGUgcGF1c2VkIGV4ZWN1dGlvblxuICogKGBUcmF2ZXJzYWxDb250ZXh0LnJlc3VtZWRGcm9tYCkuIFN5bmNocm9ub3VzIG9uIHB1cnBvc2U6IGFuIGV4dHJhIGF3YWl0XG4gKiBoZXJlIHdvdWxkIHJlb3JkZXIgcGFyYWxsZWwgc2libGluZ3MnIG1pY3JvdGFza3MuXG4gKi9cbmZ1bmN0aW9uIHN0YW1wZWRQYXVzZShzaWduYWw6IFBhdXNlU2lnbmFsLCBjb250ZXh0OiBTdGFnZUNvbnRleHQsIGF0dGVtcHQ/OiBBdHRlbXB0Q29udGV4dCk6IFBhdXNlU2lnbmFsIHtcbiAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKGNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICAvLyBBIHRvdWNoaW5nIHN0YWdlJ3Mga2V5IHJpZGVzIHRoZSBjaGVja3BvaW50IChQMyk6IGl0cyByZXN1bWUgcnVucyB1bmRlciB0aGUgc2FtZSBrZXkuXG4gIHNpZ25hbC5zdGFtcElkZW1wb3RlbmN5S2V5KGF0dGVtcHQ/LmlkZW1wb3RlbmN5S2V5KTtcbiAgcmV0dXJuIHNpZ25hbDtcbn1cblxuLyoqIFJhY2UgYSBwcm9taXNlIGFnYWluc3QgYW4gQWJvcnRTaWduYWwuIFJlamVjdHMgd2l0aCB0aGUgc2lnbmFsJ3MgcmVhc29uIG9uIGFib3J0LiAqL1xuZnVuY3Rpb24gcmFjZUFib3J0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gVGhlIHN0YWdlJ3Mgb3duIHByb21pc2UgaXMgYWJhbmRvbmVkOiBvYnNlcnZlIGl0cyByZWplY3Rpb24sIHNvIGl0IG5ldmVyIHN1cmZhY2VzIGFzIGFuIHVuaGFuZGxlZCBvbmUuXG4gICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKHNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvbkFib3J0ID0gKCkgPT5cbiAgICAgIHJlamVjdChzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKHNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKSk7XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG4iXX0=
|