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
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* runtime, the traverser); this module never holds any.
|
|
19
19
|
*/
|
|
20
20
|
import { buildRuntimeStageId } from 'foottrace';
|
|
21
|
+
import { carriedTouches, interruptProblem } from '../attempt/effect.js';
|
|
21
22
|
import { ResumeEntry } from '../engine/handlers/ResumeEntry.js';
|
|
22
23
|
import { resumeTraversalContext } from '../engine/traversalContext.js';
|
|
23
24
|
import { provideInterruptAnswer } from '../pause/interrupt.js';
|
|
@@ -57,6 +58,17 @@ export function planResume(fc, stored, resumeInput) {
|
|
|
57
58
|
throw new Error(`Cannot resume: stage '${pausedNode.name}' (${pausedNode.id}) has no resumeFn. ` +
|
|
58
59
|
'Only stages created with addPausableFunction(), or stages that paused via interrupt(), can be resumed.');
|
|
59
60
|
}
|
|
61
|
+
// A keyless touching stage is never re-run (P3) — a checkpoint from another version of the chart included.
|
|
62
|
+
const rerunRefusal = isInterruptResume ? interruptProblem(pausedNode.touches) : undefined;
|
|
63
|
+
if (rerunRefusal !== undefined) {
|
|
64
|
+
throw new Error(`Cannot resume: stage '${pausedNode.name}' (${pausedNode.id}) ${rerunRefusal}`);
|
|
65
|
+
}
|
|
66
|
+
// A carried key is adopted only by a stage that declares a key rule (P3): a checkpoint must not hand a key to a
|
|
67
|
+
// stage that makes none — a key replayed into another operation. Named by field, never quoted.
|
|
68
|
+
if (checkpoint.idempotencyKey !== undefined && pausedNode.touches?.idempotencyKey === undefined) {
|
|
69
|
+
throw new Error(`Cannot resume: the checkpoint carries an idempotencyKey, but stage '${pausedNode.name}' (${pausedNode.id}) ` +
|
|
70
|
+
'declares no idempotency key rule — the chart may have changed since the checkpoint was created.');
|
|
71
|
+
}
|
|
60
72
|
const resumeStageFn = resumeHalfOf(fc, pausedNode, isInterruptResume, resumeInput);
|
|
61
73
|
// The paused stage's STAND-IN: the stage's OWN node — id, name,
|
|
62
74
|
// description, tags, and its shape (a decider's branches, a selector's, a
|
|
@@ -71,6 +83,12 @@ export function planResume(fc, stored, resumeInput) {
|
|
|
71
83
|
// own `next`, else its dispatcher's continuation — is attached by
|
|
72
84
|
// `ResumeEntry.plan`, from the chart.
|
|
73
85
|
const standIn = standInFor(pausedNode, resumeStageFn, isInterruptResume);
|
|
86
|
+
// A touching stage resumes under the key it paused under (P3), carried by the checkpoint — never one its rule
|
|
87
|
+
// would recompute from this leg's input (the input does not cross a resume).
|
|
88
|
+
// The key is the operational value only: served under the run's rule like a key of unknown sources.
|
|
89
|
+
const carriedKey = checkpoint.idempotencyKey;
|
|
90
|
+
if (standIn.touches && carriedKey !== undefined)
|
|
91
|
+
standIn.touches = carriedTouches(standIn.touches.system, carriedKey);
|
|
74
92
|
// Where the resume re-enters, planned against the chart as built:
|
|
75
93
|
//
|
|
76
94
|
// • TOP-LEVEL PAUSE (subflowPath empty): the resumed traversal starts
|
|
@@ -151,7 +169,7 @@ export function seedCounters(checkpoint, executionCounter, visitCounts) {
|
|
|
151
169
|
*/
|
|
152
170
|
export function announceResume(plan, resumeInput, run) {
|
|
153
171
|
const { checkpoint, pausedNode, entry } = plan;
|
|
154
|
-
const { observers } = run;
|
|
172
|
+
const { observers, correlation } = run;
|
|
155
173
|
const hasInput = resumeInput !== undefined;
|
|
156
174
|
const stepsBeforeStandIn = entry.stepsBeforeStandIn ?? checkpoint.subflowPath.length;
|
|
157
175
|
const resumeRuntimeStageId = buildRuntimeStageId(pausedNode.id, run.executionCount + stepsBeforeStandIn);
|
|
@@ -167,6 +185,7 @@ export function announceResume(plan, resumeInput, run) {
|
|
|
167
185
|
runtimeStageId: resumeRuntimeStageId,
|
|
168
186
|
subflowPath: checkpoint.subflowPath,
|
|
169
187
|
resumedFrom,
|
|
188
|
+
correlation,
|
|
170
189
|
}),
|
|
171
190
|
channel: 'flow',
|
|
172
191
|
};
|
|
@@ -182,6 +201,7 @@ export function announceResume(plan, resumeInput, run) {
|
|
|
182
201
|
pipelineId: '',
|
|
183
202
|
timestamp: Date.now(),
|
|
184
203
|
channel: 'scope',
|
|
204
|
+
...(correlation && { correlation }),
|
|
185
205
|
};
|
|
186
206
|
fire(observers.scopeRecorders, 'onResume', scopeResumeEvent, (error, _recorder, hook) =>
|
|
187
207
|
// The scope channel's policy (as `ScopeFacade` routes a stage's hook failure): the throw
|
|
@@ -298,4 +318,4 @@ function dfsFind(node, targetId, visited = new Set()) {
|
|
|
298
318
|
return dfsFind(node.next, targetId, visited);
|
|
299
319
|
return undefined;
|
|
300
320
|
}
|
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvcmVzdW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXZFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXRELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFhakYsbUdBQW1HO0FBQ25HLE1BQU0sbUJBQW1CLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLEVBQTJCLEVBQzNCLE1BQTJCLEVBQzNCLFdBQW9CO0lBRXBCLHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUMsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsVUFBVSxDQUFDLGFBQWEsNEJBQTRCO1lBQzNFLDhEQUE4RCxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELDJE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QUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3JDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckIsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVzdW1lIOKAlCBob3cgYEZsb3dDaGFydEV4ZWN1dG9yLnJlc3VtZSgpYCBwbGFucyBhbmQgYW5ub3VuY2VzIGEgcmUtZW50cnkgKEY5KS5cbiAqXG4gKiBUaHJlZSBzdGVwcywgaW4gdGhlIG9yZGVyIHRoZSBleGVjdXRvciB0YWtlcyB0aGVtOlxuICpcbiAqICAgMS4ge0BsaW5rIHBsYW5SZXN1bWV9IOKAlCBkZWNvZGUgdGhlIGNoZWNrcG9pbnQgKHRoZSBPTkUgY29kZWMsXG4gKiAgICAgIGBwYXVzZS9yZWNvcmQudHNgKSwgZmluZCB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBjaGFydCBhcyBidWlsdCwgYnVpbGRcbiAqICAgICAgdGhlIHJlc3VtZSBoYWxmIGFuZCB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIGFuZCBwbGFuIHRoZSBvbmUtc2hvdFxuICogICAgICByZS1lbnRyeSAoYFJlc3VtZUVudHJ5LnBsYW5gKS4gRXZlcnkgcmVmdXNhbCBoYXBwZW5zIEhFUkUsIGJlZm9yZSBhbnlcbiAqICAgICAgZXhlY3V0b3Igc3RhdGUgaXMgdG91Y2hlZC5cbiAqICAgMi4ge0BsaW5rIHNlZWRDb3VudGVyc30g4oCUIGNhcnJ5IHRoZSBwYXVzZS10aW1lIGV4ZWN1dGlvbiBjb3VudGVyIGFuZCB2aXNpdFxuICogICAgICBjb3VudHMgaW50byB0aGUgcnVuJ3Mgc2hhcmVkIGNvdW50ZXJzIChtdXRhdGVkLCBuZXZlciByZXBsYWNlZCkuXG4gKiAgIDMuIHtAbGluayBhbm5vdW5jZVJlc3VtZX0g4oCUIGZpcmUgdGhlIGV4ZWN1dG9yLW1hZGUgYG9uUmVzdW1lYCBvbiB0aGUgZmxvd1xuICogICAgICBhbmQgc2NvcGUgY2hhbm5lbHMgKGFuZCBjYXB0dXJlIGl0IGZvciB0aGUgZGVmZXJyZWQgdGllciksIEJFRk9SRSB0aGVcbiAqICAgICAgdHJhdmVyc2FsIHNvIGl0IHByZWNlZGVzIGBvblJ1blN0YXJ0YC5cbiAqXG4gKiBUaGUgZXhlY3V0b3Igb3ducyB0aGUgcGVyLXJ1biBzdGF0ZSBiZXR3ZWVuIHRoZSBzdGVwcyAodGhlIHJ1bklkLCB0aGVcbiAqIHJ1bnRpbWUsIHRoZSB0cmF2ZXJzZXIpOyB0aGlzIG1vZHVsZSBuZXZlciBob2xkcyBhbnkuXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBSZXN1bWVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUxpbmsgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlc3VtZVRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlRnVuY3Rpb24sIFN0YWdlTm9kZSB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm92aWRlSW50ZXJydXB0QW5zd2VyIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGRlY29kZUNoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS9yZWNvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRDaGVja3BvaW50IH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBmaXJlLCByZWNvcmRlckZhaWx1cmVFdmVudCwgd2FybkluRGV2TW9kZSB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuXG4vKiogRXZlcnl0aGluZyBhIHJlc3VtZSBkZWNpZGVkIGJlZm9yZSBhbnkgZXhlY3V0b3Igc3RhdGUgd2FzIHRvdWNoZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPiB7XG4gIC8qKiBUaGUgZGVjb2RlZCBjaGVja3BvaW50ICh1cGNhc3QgYW5kIGNoZWNrZWQpLiAqL1xuICByZWFkb25seSBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50O1xuICAvKiogVGhlIHBhdXNlZCBzdGFnZSdzIFJFQUwgbm9kZSBpbiB0aGUgY2hhcnQuICovXG4gIHJlYWRvbmx5IHBhdXNlZE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogV2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIHN0YXJ0cywgYW5kIHdoYXQgZWFjaCBzdWJmbG93IG9uIHRoZSBwYXRoIHRha2VzIG9uIGl0cyBmaXJzdCBlbnRyeS4gKi9cbiAgcmVhZG9ubHkgZW50cnk6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG59XG5cbi8qKiBUaGUgZmxvdyBjaGFubmVsJ3MgaXNvbGF0aW9uIGZvciB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIChkZXYtbW9kZSB3YXJuaW5nLCB0aGVuIHNraXApLiAqL1xuY29uc3QgUkVTVU1FX0ZMT1dfRkFJTFVSRSA9IHdhcm5JbkRldk1vZGUoJ0Zsb3dDaGFydEV4ZWN1dG9yJyk7XG5cbi8qKlxuICogUGxhbiB0aGUgcmVzdW1lIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0LiBUaHJvd3Mg4oCUIGxlYXZpbmcgdGhlIGV4ZWN1dG9yXG4gKiB1bnRvdWNoZWQg4oCUIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgbWFsZm9ybWVkLCB0aGUgcGF1c2VkIHN0YWdlIGlzIGdvbmUsIGl0XG4gKiBjYW5ub3QgYmUgcmVzdW1lZCwgb3IgaXRzIHBhdGggZG9lcyBub3QgZml0IHRoaXMgY2hhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuUmVzdW1lPFRPdXQsIFRTY29wZT4oXG4gIGZjOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgc3RvcmVkOiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbik6IFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPiB7XG4gIC8vIERlY29kZSB0aGUgY2hlY2twb2ludCAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSwgZnJvbVxuICAvLyBhbnkgcmVsZWFzZSkg4oCUIHRoZSBPTkUgY29kZWM6IHVwY2FzdCwgdGhlbiBjaGVjayBldmVyeSBwYXVzZSByZWNvcmQuXG4gIGNvbnN0IGNoZWNrcG9pbnQgPSBkZWNvZGVDaGVja3BvaW50KHN0b3JlZCk7XG5cbiAgY29uc3QgcGF1c2VkTm9kZSA9IGZpbmROb2RlSW5HcmFwaChmYywgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICApO1xuICB9XG4gIC8vIFR3byByZS1lbnRyeSBzaGFwZXMsIGNob3NlbiBieSBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQ6XG4gIC8vXG4gIC8vICAg4oCiIGludGVycnVwdCgpICAgICAg4oaSIFJFLVJVTiBUSEUgU1RBR0UnUyBPV04gRlVOQ1RJT04gRlJPTSBJVFMgVE9QLlxuICAvLyAgICAgU3RhZ2VzIGFyZSBhdG9taWMgKHRoZSBzYW1lIGxhdyBgcmVzdW1lT25FcnJvcmAgc3RhdGVzKTogYSBzdGFnZSB0aGF0XG4gIC8vICAgICBzdG9wcGVkIG1pZC1ib2R5IGhhcyBubyBoYWxmIHRvIHJlc3VtZSBpbnRvLCBzbyB0aGUgd2hvbGUgYm9keSBydW5zXG4gIC8vICAgICBhZ2FpbiBhbmQgdGhlIGFuc3dlciBjb21lcyBiYWNrIG91dCBvZiB0aGUgYGludGVycnVwdCgpYCBjYWxsIGl0c2VsZi5cbiAgLy8gICAgIEV2ZXJ5dGhpbmcgdGhlIGJvZHkgZGlkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIHJlLWRvbmUg4oCUIHdoaWNoIGlzXG4gIC8vICAgICB3aHkgdGhlIGRvY3MgdGVsbCB5b3UgdG8ga2VlcCB0aGF0IGhhbGYgaWRlbXBvdGVudC5cbiAgLy8gICDigKIgYWRkUGF1c2FibGVGdW5jdGlvbiDihpIgcnVuIHRoZSBkZWNsYXJlZCBgcmVzdW1lRm5gLlxuICAvL1xuICAvLyBUaGUgZGlzY3JpbWluYW50IGlzIG9uIHRoZSBjaGVja3BvaW50LCBzbyB0aGlzIHdvcmtzIGNyb3NzLWV4ZWN1dG9yXG4gIC8vIChhIGNoZWNrcG9pbnQgcmVzdG9yZWQgZnJvbSBSZWRpcyBvbiBhIGZyZXNoIHByb2Nlc3MgcmVzdW1lcyB0aGUgc2FtZSB3YXkpLlxuICBjb25zdCBpc0ludGVycnVwdFJlc3VtZSA9IGNoZWNrcG9pbnQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnO1xuICBpZiAoIXBhdXNlZE5vZGUucmVzdW1lRm4gJiYgIWlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSwgb3Igc3RhZ2VzIHRoYXQgcGF1c2VkIHZpYSBpbnRlcnJ1cHQoKSwgY2FuIGJlIHJlc3VtZWQuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSByZXN1bWVIYWxmT2YoZmMsIHBhdXNlZE5vZGUsIGlzSW50ZXJydXB0UmVzdW1lLCByZXN1bWVJbnB1dCk7XG5cbiAgLy8gVGhlIHBhdXNlZCBzdGFnZSdzIFNUQU5ELUlOOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgaWQsIG5hbWUsXG4gIC8vIGRlc2NyaXB0aW9uLCB0YWdzLCBhbmQgaXRzIHNoYXBlIChhIGRlY2lkZXIncyBicmFuY2hlcywgYSBzZWxlY3RvcidzLCBhXG4gIC8vIGZvcmsgcGFyZW50J3MgY2hpbGRyZW4sIGl0cyBgbmV4dGApIOKAlCB3aXRoIGl0cyBmdW5jdGlvbiBzd2FwcGVkIGZvciB0aGVcbiAgLy8gcmVzdW1lIGhhbGYuIEJ1aWx0IGZyb20gdGhlIHdob2xlIG5vZGUgc28gYW4gYGludGVycnVwdCgpYCByYWlzZWQgaW5zaWRlXG4gIC8vIGEgZGVjaWRlciwgc2VsZWN0b3Igb3IgZm9yay1wYXJlbnQgZnVuY3Rpb24gRElTUEFUQ0hFUyBvbiByZXN1bWUsIGFzIHRoZVxuICAvLyBzdGFnZSBkaWQgb24gdGhlIHJ1biAoYmVmb3JlIDkuMjguMCBvbmx5IGZuL25leHQvdGFncy9yZXRyeSB3ZXJlIGNvcGllZFxuICAvLyBhbmQgdGhlIGRpc3BhdGNoIHdhcyBzaWxlbnRseSBza2lwcGVkKS4gSXQgaXMgd2hlcmUgdGhlIHJlc3VtZWRcbiAgLy8gdHJhdmVyc2FsIHN0YXJ0cyDigJQgYW5kIG5vdGhpbmcgZWxzZTogaXQgaXMgbmV2ZXIgaW4gYSBub2RlIG1hcCBvciB0aGVcbiAgLy8gc3ViZmxvdyBkaWN0aW9uYXJ5LCBzbyBhIGxvb3AgYmFjayB0byB0aGUgcGF1c2VkIGlkIGZpbmRzIHRoZSBSRUFMXG4gIC8vIHN0YWdlLCB3aGljaCBwYXVzZXMgYWdhaW4gKHNlZSBSZXN1bWVFbnRyeSkuIFdoYXQgcnVucyBhZnRlciBpdCDigJQgaXRzXG4gIC8vIG93biBgbmV4dGAsIGVsc2UgaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24g4oCUIGlzIGF0dGFjaGVkIGJ5XG4gIC8vIGBSZXN1bWVFbnRyeS5wbGFuYCwgZnJvbSB0aGUgY2hhcnQuXG4gIGNvbnN0IHN0YW5kSW4gPSBzdGFuZEluRm9yKHBhdXNlZE5vZGUsIHJlc3VtZVN0YWdlRm4sIGlzSW50ZXJydXB0UmVzdW1lKTtcblxuICAvLyBXaGVyZSB0aGUgcmVzdW1lIHJlLWVudGVycywgcGxhbm5lZCBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdDpcbiAgLy9cbiAgLy8gICDigKIgVE9QLUxFVkVMIFBBVVNFIChzdWJmbG93UGF0aCBlbXB0eSk6IHRoZSByZXN1bWVkIHRyYXZlcnNhbCBzdGFydHNcbiAgLy8gICAgIGF0IHRoZSBzdGFuZC1pbi5cbiAgLy8gICDigKIgUEFVU0UgSU5TSURFIFNVQkZMT1dTOiBpdCBzdGFydHMgYXQgdGhlIG1vdW50IG9mIHRoZSBmaXJzdCBzdWJmbG93XG4gIC8vICAgICBvbiB0aGUgcGF0aCwgc28gdGhlIG91dHB1dE1hcHBlcnMgYW5kIHRoZSBwYXJlbnQncyBjb250aW51YXRpb25cbiAgLy8gICAgIHJ1bi4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXRoIGlzIGVudGVyZWQgT05DRSB0aHJvdWdoIGl0cyBob3A6IGl0c1xuICAvLyAgICAgbmVzdGVkIHJ1bnRpbWUgaXMgc2VlZGVkIGZyb20gaXRzIGNhcHR1cmUgKGluIHBsYWNlIG9mIHRoZVxuICAvLyAgICAgaW5wdXRNYXBwZXIncyB2YWx1ZXMpIGFuZCBpdHMgdHJhdmVyc2FsIHN0YXJ0cyBhdCB0aGUgbW91bnQgb2YgdGhlXG4gIC8vICAgICBuZXh0IHN1YmZsb3cg4oCUIG9yLCBhdCB0aGUgbGVhZiwgYXQgdGhlIHN0YW5kLWluLiBBbiBvdXRlciBzdWJmbG93J3NcbiAgLy8gICAgIHN0YWdlcyBiZWZvcmUgdGhhdCBtb3VudCBkbyBub3QgcnVuIGFnYWluLlxuICAvLyAgIOKAoiBBVCBFVkVSWSBMRVZFTCB0aGUgZW50cnkgY2FycmllcyB3aGF0IGl0cyBkaXNwYXRjaGVyIHdvdWxkIGhhdmUgcnVuXG4gIC8vICAgICBhZnRlciBpdCDigJQgYSBkZWNpZGVyJ3MgYG5leHRgLCBhIHNlbGVjdG9yJ3MsIGEgZm9yaydzIGpvaW4g4oCUIHNvIGFcbiAgLy8gICAgIHN1YmZsb3cgbW91bnRlZCBhcyBhIGJyYW5jaCBvciBhIGZvcmsgY2hpbGQgaGFuZHMgY29udHJvbCBiYWNrIHRvXG4gIC8vICAgICBpdHMgcGFyZW50J3MgY29udGludWF0aW9uIGF0IHRoZSBwYXJlbnQncyBsZXZlbC5cbiAgLy8gICDigKIgUGFyYWxsZWwgc2libGluZ3MgdGhhdCBwYXVzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCB3YWl0IGluXG4gIC8vICAgICBgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYDogZWFjaCBpcyByYWlzZWQgYWdhaW4gaW4gdHVybiwgYW5kIHRoZVxuICAvLyAgICAgam9pbiBydW5zIG9ubHkgb25jZSB0aGUgbGFzdCBvbmUgaXMgcmVzdW1lZC5cbiAgLy9cbiAgLy8gRXZlcnl0aGluZyBlbHNlIHdhbGtzIHRoZSBSRUFMIGNoYXJ0OiBgZmMucm9vdGAgYW5kIGBmYy5zdWJmbG93c2AgYXJlXG4gIC8vIHVudG91Y2hlZCwgc28gZXZlcnkgbGF0ZXIgbG9vcCB0YXJnZXQgYW5kIGV2ZXJ5IGxhdGVyIHN1YmZsb3cgZW50cnlcbiAgLy8gKHJlYWwgcm9vdCwgaW5wdXRNYXBwZXIpIHJlc29sdmVzIGFzIGl0IHdvdWxkIG9uIGEgcnVuLiBSZWZ1c2VkIEhFUkUg4oCUXG4gIC8vIGJlZm9yZSBhbnkgc3RhdGUgaXMgdG91Y2hlZCDigJQgd2hlbiB0aGUgY2hlY2twb2ludCdzIHBhdGggZG9lcyBub3QgZml0XG4gIC8vIHRoaXMgY2hhcnQuXG4gIC8vXG4gIC8vIENsb25lLWluOiB0aGUgY2FwdHVyZXMgc2VlZCBuZXN0ZWQgcnVudGltZXMgKHNoYWxsb3ctbWVyZ2VkIGludG8gZWFjaFxuICAvLyBuZXN0ZWQgU2hhcmVkTWVtb3J5KSwgc28gd2l0aG91dCBhIGNvcHkgdGhlIGVuZ2luZSB3b3VsZCBob2xkIGxpdmVcbiAgLy8gcmVmZXJlbmNlcyBpbnRvIHRoZSBjYWxsZXIncyBjaGVja3BvaW50IG9iamVjdCDigJQgY2FsbGVyIG11dGF0aW9ucyB3b3VsZFxuICAvLyBibGVlZCBpbnRvIHRoZSByZXN1bWVkIHJ1biBhbmQgZW5naW5lIHdyaXRlcyB3b3VsZCByZWFjaCBhIGNoZWNrcG9pbnRcbiAgLy8gdGhlIGNhbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHBlcnNpc3RlZC4gVGhlIHNhbWUgZm9yIHRoZSB3YWl0aW5nXG4gIC8vIHNpYmxpbmdzJyBjYXB0dXJlcy5cbiAgY29uc3QgZW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuPFRPdXQsIFRTY29wZT4oe1xuICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgIHBhdGg6IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgsXG4gICAgY2FwdHVyZXM6IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXMpLFxuICAgIHN0YW5kSW4sXG4gICAgLi4uKGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcyAhPT0gdW5kZWZpbmVkICYmIHsgcGVuZGluZ1BhdXNlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcykgfSksXG4gIH0pO1xuICByZXR1cm4geyBjaGVja3BvaW50LCBwYXVzZWROb2RlLCBlbnRyeSB9O1xufVxuXG4vKipcbiAqIFNlZWQgdGhlIHJ1bidzIHNoYXJlZCBleGVjdXRpb24gY291bnRlciArIHBlci1zdGFnZSB2aXNpdCBjb3VudHMgZnJvbSB0aGVcbiAqIGNoZWNrcG9pbnQsIHNvIHJ1bnRpbWVTdGFnZUlkcyBzdGF5IHVuaXF1ZSBhbmQgbG9vcEl0ZXJhdGlvbiBtb25vdG9uaWNcbiAqIGFjcm9zcyBhIENST1NTLWV4ZWN1dG9yIHJlc3VtZSAoYSBmcmVzaCBleGVjdXRvciBzdGFydHMgYm90aCBhdCAwL2VtcHR5KS5cbiAqXG4gKiBNVVRBVEUsIG5ldmVyIFJFUExBQ0U6IGJvdGggYXJlIHNoYXJlZCBieSByZWZlcmVuY2UgaW50byB0aGUgdHJhdmVyc2VyXG4gKiAoYW5kLCB0cmFuc2l0aXZlbHksIGV2ZXJ5IHN1YmZsb3cgdHJhdmVyc2VyKS4gQm90aCBmaWVsZHMgYXJlIG9wdGlvbmFsIG9uXG4gKiB0aGUgY2hlY2twb2ludCAob2xkZXIgcGVyc2lzdGVkIGNoZWNrcG9pbnRzIG9taXQgdGhlbSkg4oCUIHNlZWRpbmcgaXMgc2tpcHBlZFxuICogd2hlbiBhYnNlbnQuIFNhbWUtZXhlY3V0b3IgcmVzdW1lIGlzIGlkZW1wb3RlbnQ6IGF0IHBhdXNlIHRoZSB2YWx1ZXNcbiAqIGFscmVhZHkgZXF1YWwgdGhlIGNoZWNrcG9pbnQncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlZWRDb3VudGVycyhcbiAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgZXhlY3V0aW9uQ291bnRlcjogeyB2YWx1ZTogbnVtYmVyIH0sXG4gIHZpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuKTogdm9pZCB7XG4gIGlmIChjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVjdXRpb25Db3VudGVyLnZhbHVlID0gY2hlY2twb2ludC5leGVjdXRpb25Db3VudDtcbiAgfVxuICBpZiAoY2hlY2twb2ludC52aXNpdENvdW50cykge1xuICAgIHZpc2l0Q291bnRzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBbc3RhZ2VJZCwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKGNoZWNrcG9pbnQudmlzaXRDb3VudHMpKSB7XG4gICAgICB2aXNpdENvdW50cy5zZXQoc3RhZ2VJZCwgY291bnQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZpcmUgdGhlIGV4ZWN1dG9yLW1hZGUgYG9uUmVzdW1lYCBvbiBldmVyeSByZWNvcmRlciAoZmxvdyArIHNjb3BlKSwgc3RhbXBlZFxuICogd2l0aCB0aGUgcmVzdW1lZCBsZWcncyBORVcgcnVuSWQg4oCUIGNvbnN1bWVycyBkZXRlY3QgXCJhIGZyZXNoIGxvZ2ljYWwgcnVuXCJcbiAqIGJ5IHRoZSBzYW1lIHJ1bklkIGNoYW5nZSB0aGV5IHVzZSBmb3IgYG9uUnVuU3RhcnRgLiBUaGUgc3RhbXAgaXMgYnVpbHQgYnlcbiAqIHRoZSBvbmUgY29uc3RydWN0b3IgKGBlbmdpbmUvdHJhdmVyc2FsQ29udGV4dC50c2ApOiBpdCBuYW1lcyB0aGUgUkVBTFxuICogc3ViZmxvdyB0aGUgc3RhbmQtaW4gcnVucyBpbiBhbmQgaXRzIGRlcHRoLCBhbmQgTElOS1MgdG8gdGhlIHBhdXNlZFxuICogZXhlY3V0aW9uIChgcmVzdW1lZEZyb21gLCByZWFkIG9mZiBgY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb25gKSDigJQgOS4zNy4wLlxuICpcbiAqIFRoZSBydW50aW1lU3RhZ2VJZCBpcyB0aGUgU1RBTkQtSU4ncyBvd246IGl0IHJ1bnMgYWZ0ZXIgb25lIG1vdW50IHBlclxuICogc3ViZmxvdyBvbiB0aGUgcGF0aCAoZWFjaCBlbnRlcmVkIGF0IGl0cyBtb3VudCksIHNvIGl0cyBleGVjdXRpb24gaW5kZXggaXNcbiAqIHRoZSBjb3VudGVyIHBsdXMgdGhlIHBhdGgncyBsZW5ndGgg4oCUIHRoZSBldmVudCBhbmQgdGhlIHN0YW5kLWluJ3MgY29tbWl0XG4gKiBuYW1lIHRoZSBzYW1lIGV4ZWN1dGlvbi4gVGhlIG9uZSBzaGFwZSB3aGVyZSB0aGUgaW5kZXggY2Fubm90IGJlIGtub3duIHVwXG4gKiBmcm9udCDigJQgYSBkZWdyYWRlZCBjaGVja3BvaW50IG1pc3NpbmcgYW4gT1VURVIgc3ViZmxvdydzIGNhcHR1cmUsIHdob3NlXG4gKiBvcGVuaW5nIHN0YWdlcyB0aGVuIHJlLXJ1biDigJQgbmFtZXMgdGhlIHBsYW5uZWQgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdW5jZVJlc3VtZTxUT3V0LCBUU2NvcGU+KFxuICBwbGFuOiBSZXN1bWVQbGFuPFRPdXQsIFRTY29wZT4sXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuICBydW46IHsgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZzsgcmVhZG9ubHkgZXhlY3V0aW9uQ291bnQ6IG51bWJlcjsgcmVhZG9ubHkgb2JzZXJ2ZXJzOiBSdW5PYnNlcnZlcnMgfSxcbik6IHZvaWQge1xuICBjb25zdCB7IGNoZWNrcG9pbnQsIHBhdXNlZE5vZGUsIGVudHJ5IH0gPSBwbGFuO1xuICBjb25zdCB7IG9ic2VydmVycyB9ID0gcnVuO1xuICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0ZXBzQmVmb3JlU3RhbmRJbiA9IGVudHJ5LnN0ZXBzQmVmb3JlU3RhbmRJbiA/PyBjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aDtcbiAgY29uc3QgcmVzdW1lUnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHJ1bi5leGVjdXRpb25Db3VudCArIHN0ZXBzQmVmb3JlU3RhbmRJbik7XG4gIGNvbnN0IHJlc3VtZWRGcm9tID0gcmVzdW1lTGlua09mKGNoZWNrcG9pbnQpO1xuICBjb25zdCBmbG93UmVzdW1lRXZlbnQgPSB7XG4gICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICBoYXNJbnB1dCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0OiByZXN1bWVUcmF2ZXJzYWxDb250ZXh0KHtcbiAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmVzdW1lUnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogY2hlY2twb2ludC5zdWJmbG93UGF0aCxcbiAgICAgIHJlc3VtZWRGcm9tLFxuICAgIH0pLFxuICAgIGNoYW5uZWw6ICdmbG93JyBhcyBjb25zdCxcbiAgfTtcbiAgLy8gRXhlY3V0b3ItbWFkZSAoYEhPT0tTLm9uUmVzdW1lLmV4ZWN1dG9yTWFkZWApOiBmaXJlZCB0aHJvdWdoIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFzIGV2ZXJ5XG4gIC8vIGVuZ2luZSBldmVudCwgc28gYSB0aHJvd2luZyByZWNvcmRlciBpcyBpc29sYXRlZCBpbnN0ZWFkIG9mIHJlamVjdGluZyBgcmVzdW1lKClgIChSMTApLlxuICBmaXJlKG9ic2VydmVycy5pbmxpbmVGbG93TGlzdGVuZXJzKCksICdvblJlc3VtZScsIGZsb3dSZXN1bWVFdmVudCwgUkVTVU1FX0ZMT1dfRkFJTFVSRSk7XG5cbiAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICBoYXNJbnB1dCxcbiAgICAuLi4ocmVzdW1lZEZyb20gJiYgeyByZXN1bWVkRnJvbSB9KSxcbiAgICBwaXBlbGluZUlkOiAnJyxcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgfTtcbiAgZmlyZShvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMsICdvblJlc3VtZScsIHNjb3BlUmVzdW1lRXZlbnQsIChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PlxuICAgIC8vIFRoZSBzY29wZSBjaGFubmVsJ3MgcG9saWN5IChhcyBgU2NvcGVGYWNhZGVgIHJvdXRlcyBhIHN0YWdlJ3MgaG9vayBmYWlsdXJlKTogdGhlIHRocm93XG4gICAgLy8gYmVjb21lcyBhbiBgb25FcnJvcmAgb24gZXZlcnkgc2NvcGUgcmVjb3JkZXIsIHdob3NlIG93biB0aHJvdyBpcyBkcm9wcGVkLlxuICAgIGZpcmUob2JzZXJ2ZXJzLnNjb3BlUmVjb3JkZXJzLCAnb25FcnJvcicsIHJlY29yZGVyRmFpbHVyZUV2ZW50KHNjb3BlUmVzdW1lRXZlbnQsIGVycm9yLCBob29rKSksXG4gICk7XG5cbiAgLy8gRGVmZXJyZWQgdGllciAoUkZDLTAwMSk6IHRoZXNlIGV4ZWN1dG9yLXN5bnRoZXNpemVkIG9uUmVzdW1lIGV2ZW50c1xuICAvLyBieXBhc3MgdGhlIHBlci1zdGFnZSBkaXNwYXRjaCBzaXRlcywgc28gY2FwdHVyZSB0aGVtIGRpcmVjdGx5LlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIG9ic2VydmVycy5kZWZlcnJlZFRpZXIuY2FwdHVyZSgnZmxvdycsICdvblJlc3VtZScsIHJlc3VtZVJ1bnRpbWVTdGFnZUlkLCBydW4ucnVuSWQsIGZsb3dSZXN1bWVFdmVudCk7XG4gICAgb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5jYXB0dXJlKFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdvblJlc3VtZScsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc2NvcGVSZXN1bWVFdmVudC5waXBlbGluZUlkLFxuICAgICAgc2NvcGVSZXN1bWVFdmVudCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBoYWxmIOKAlCB3aGF0IHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBydW5zLiBgaW50ZXJydXB0KClgOlxuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCB3aXRoIHRoZSBhbnN3ZXIgZGVwb3NpdGVkIGZvciBUSElTIHNjb3BlIGZpcnN0XG4gKiAoa2V5ZWQgYnkgc2NvcGUgaWRlbnRpdHkg4oCUIHNhZmUgd2hlbiBzZXZlcmFsIGJyYW5jaGVzIHJlc3VtZSBhdCBvbmNlKS5cbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYDogdGhlIGRlY2xhcmVkIGByZXN1bWVGbihzY29wZSwgaW5wdXQpYCwgd3JhcHBlZCB0b1xuICogdGhlIGBTdGFnZUZ1bmN0aW9uYCBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gcmVzdW1lSGFsZk9mPFRPdXQsIFRTY29wZT4oXG4gIGZjOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbik6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB7XG4gIGlmIChpc0ludGVycnVwdFJlc3VtZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsRm4gPSBwYXVzZWROb2RlLmZuID8/IGZjLnN0YWdlTWFwLmdldChwYXVzZWROb2RlLmlkKSA/PyBmYy5zdGFnZU1hcC5nZXQocGF1c2VkTm9kZS5uYW1lKTtcbiAgICBpZiAoIW9yaWdpbmFsRm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBwYXVzZWQgdmlhIGludGVycnVwdCgpIGJ1dCBpdHMgYCArXG4gICAgICAgICAgJ3N0YWdlIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBpbiB0aGUgY2hhcnQuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50ICcgK1xuICAgICAgICAgICd3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChzY29wZSwgYnJlYWtGbiwgc3RyZWFtQ2FsbGJhY2spID0+IHtcbiAgICAgIHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIoc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbEZuKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm4hO1xuICByZXR1cm4gKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KSBhcyBUT3V0IHwgUHJvbWlzZTxUT3V0PjtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4gZm9yIGEgcmVzdW1lOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgc28gaXQga2VlcHNcbiAqIGl0cyBzaGFwZSAoYSBkZWNpZGVyJ3Mgb3Igc2VsZWN0b3IncyBicmFuY2hlcywgYSBmb3JrIHBhcmVudCdzIGNoaWxkcmVuLFxuICogaXRzIGBuZXh0YCkgYW5kIGl0cyBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgZGVjbGFyZWQgdGFncyDigJQgd2l0aCBgZm5gIHN3YXBwZWRcbiAqIGZvciB0aGUgcmVzdW1lIGhhbGYuXG4gKlxuICogRHJvcHBlZDogYHJlc3VtZUZuYCBhbmQgYGlzUGF1c2FibGVgICh0aGUgcmVzdW1lIGhhbGYgbXVzdCBub3QgcGF1c2VcbiAqIGJlY2F1c2UgaXQgcmV0dXJuZWQgYSB2YWx1ZSDigJQgdGhlIG9yaWdpbmFsIHBhdXNhYmxlIGNvbnRyYWN0KTsgYW5kLCBvbiB0aGVcbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZS1lbnRyeSwgdGhlIHBvbGljaWVzIGRlY2xhcmVkIGZvciB0aGUgc3RhZ2UncyBPV05cbiAqIGZ1bmN0aW9uIChgcmV0cnlgLCBzdHJlYW1pbmcpIOKAlCB0aGF0IHJlLWVudHJ5IHJ1bnMgYSBkaWZmZXJlbnQgZnVuY3Rpb25cbiAqIChgcmVzdW1lRm5gKSB1bmRlciBhIGRpZmZlcmVudCBjb250cmFjdC4gVGhlIGBpbnRlcnJ1cHQoKWAgcmUtZW50cnkgcmUtcnVuc1xuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCBzbyBpdCBrZWVwcyB0aGVtLlxuICpcbiAqIFRhZ3MgZm9sbG93IHRoZSBzdGFnZSBvbiBCT1RIIHJlLWVudHJpZXMgKDkuMjEuMCk6IGEgdGFnIGlzIHRoZSBzdGFnZSdzXG4gKiBOQU1FLCBub3QgYSBwb2xpY3kgb3ZlciBpdHMgZnVuY3Rpb24sIGFuZCB0aGUgcmVzdW1lZCBleGVjdXRpb24gaXMgdGhhdFxuICogc3RhZ2UgcnVubmluZyBhZ2FpbiDigJQgaXRzIGJ1bmRsZSBtdXN0IGNhcnJ5IGl0LCBvciBhIGNoYWluZWQgYXhpcyB3b3VsZFxuICogc2hvdyB0aGUgcGF1c2VkIGxlZyB0YWdnZWQgYW5kIHRoZSByZXN1bWVkIGxlZyBzaWxlbnRseSBub3QuXG4gKi9cbmZ1bmN0aW9uIHN0YW5kSW5Gb3I8VE91dCwgVFNjb3BlPihcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBzdGFuZEluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ucGF1c2VkTm9kZSwgZm4gfTtcbiAgZGVsZXRlIHN0YW5kSW4ucmVzdW1lRm47XG4gIGRlbGV0ZSBzdGFuZEluLmlzUGF1c2FibGU7XG4gIGlmICghaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICBkZWxldGUgc3RhbmRJbi5yZXRyeTtcbiAgICBkZWxldGUgc3RhbmRJbi5pc1N0cmVhbWluZztcbiAgICBkZWxldGUgc3RhbmRJbi5zdHJlYW1JZDtcbiAgfVxuICByZXR1cm4gc3RhbmRJbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdW1lIGV2ZW50J3MgbGluaywgcmVhZCBvZmYgdGhlIGNoZWNrcG9pbnQgaXRzZWxmIOKAlCBzbyBhIHJlc3VtZSByZWNvcmRzXG4gKiB0aGUgc2FtZSB3aGVyZXZlciBpdHMgY2hlY2twb2ludCBjYW1lIGZyb20uIGB1bmRlZmluZWRgIGZvciBhIGNoZWNrcG9pbnRcbiAqIHdpdGhvdXQgYHBhdXNlZEV4ZWN1dGlvbmAgKG1hZGUgYmVmb3JlIDkuMzcuMCkgb3Igd2l0aCBhIG1hbGZvcm1lZCBvbmU6IHRoZVxuICogbGluayBpcyBhIHJlY29yZCwgbmV2ZXIgdXNlZCB0byBwbGFuIHRoZSByZS1lbnRyeSwgc28gaXQgaXMgbGVmdCBvdXQgcmF0aGVyXG4gKiB0aGFuIGd1ZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZUxpbmtPZihjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50KTogUmVzdW1lTGluayB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdXNlZDogdW5rbm93biA9IGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uO1xuICByZXR1cm4gaXNQYXVzZWRFeGVjdXRpb24ocGF1c2VkKSA/IHsgcnVuSWQ6IHBhdXNlZC5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IHBhdXNlZC5ydW50aW1lU3RhZ2VJZCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELCBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWRcbiAqIHN1YmZsb3dzIGFsb25nIGBzdWJmbG93UGF0aGAgYW5kIHNlYXJjaGluZyBmcm9tIHRoZSBsYXN0IHN1YmZsb3cncyByb290LlxuICovXG5mdW5jdGlvbiBmaW5kTm9kZUluR3JhcGg8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBzdGFnZUlkOiBzdHJpbmcsXG4gIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgIGNvbnN0IHN1YmZsb3cgPSBmYy5zdWJmbG93cz8uW3NmSWRdO1xuICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgfVxuICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZGZzRmluZChzdWJmbG93Um9vdCwgc3RhZ2VJZCk7XG59XG5cbi8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG5mdW5jdGlvbiBkZnNGaW5kPFRPdXQsIFRTY29wZT4oXG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICB0YXJnZXRJZDogc3RyaW5nLFxuICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gIGlmIChub2RlLmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgaWYgKG5vZGUuaWQgPT09IHRhcmdldElkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG4gIGlmIChub2RlLm5leHQpIHJldHVybiBkZnNGaW5kKG5vZGUubmV4dCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvcmVzdW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBYWpGLG1HQUFtRztBQUNuRyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRS9EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN4QixFQUEyQixFQUMzQixNQUEyQixFQUMzQixXQUFvQjtJQUVwQix3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQ3ZFLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLFVBQVUsQ0FB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LEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckIsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVzdW1lIOKAlCBob3cgYEZsb3dDaGFydEV4ZWN1dG9yLnJlc3VtZSgpYCBwbGFucyBhbmQgYW5ub3VuY2VzIGEgcmUtZW50cnkgKEY5KS5cbiAqXG4gKiBUaHJlZSBzdGVwcywgaW4gdGhlIG9yZGVyIHRoZSBleGVjdXRvciB0YWtlcyB0aGVtOlxuICpcbiAqICAgMS4ge0BsaW5rIHBsYW5SZXN1bWV9IOKAlCBkZWNvZGUgdGhlIGNoZWNrcG9pbnQgKHRoZSBPTkUgY29kZWMsXG4gKiAgICAgIGBwYXVzZS9yZWNvcmQudHNgKSwgZmluZCB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBjaGFydCBhcyBidWlsdCwgYnVpbGRcbiAqICAgICAgdGhlIHJlc3VtZSBoYWxmIGFuZCB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIGFuZCBwbGFuIHRoZSBvbmUtc2hvdFxuICogICAgICByZS1lbnRyeSAoYFJlc3VtZUVudHJ5LnBsYW5gKS4gRXZlcnkgcmVmdXNhbCBoYXBwZW5zIEhFUkUsIGJlZm9yZSBhbnlcbiAqICAgICAgZXhlY3V0b3Igc3RhdGUgaXMgdG91Y2hlZC5cbiAqICAgMi4ge0BsaW5rIHNlZWRDb3VudGVyc30g4oCUIGNhcnJ5IHRoZSBwYXVzZS10aW1lIGV4ZWN1dGlvbiBjb3VudGVyIGFuZCB2aXNpdFxuICogICAgICBjb3VudHMgaW50byB0aGUgcnVuJ3Mgc2hhcmVkIGNvdW50ZXJzIChtdXRhdGVkLCBuZXZlciByZXBsYWNlZCkuXG4gKiAgIDMuIHtAbGluayBhbm5vdW5jZVJlc3VtZX0g4oCUIGZpcmUgdGhlIGV4ZWN1dG9yLW1hZGUgYG9uUmVzdW1lYCBvbiB0aGUgZmxvd1xuICogICAgICBhbmQgc2NvcGUgY2hhbm5lbHMgKGFuZCBjYXB0dXJlIGl0IGZvciB0aGUgZGVmZXJyZWQgdGllciksIEJFRk9SRSB0aGVcbiAqICAgICAgdHJhdmVyc2FsIHNvIGl0IHByZWNlZGVzIGBvblJ1blN0YXJ0YC5cbiAqXG4gKiBUaGUgZXhlY3V0b3Igb3ducyB0aGUgcGVyLXJ1biBzdGF0ZSBiZXR3ZWVuIHRoZSBzdGVwcyAodGhlIHJ1bklkLCB0aGVcbiAqIHJ1bnRpbWUsIHRoZSB0cmF2ZXJzZXIpOyB0aGlzIG1vZHVsZSBuZXZlciBob2xkcyBhbnkuXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGNhcnJpZWRUb3VjaGVzLCBpbnRlcnJ1cHRQcm9ibGVtIH0gZnJvbSAnLi4vYXR0ZW1wdC9lZmZlY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lTGluayB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzdW1lVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWxDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VGdW5jdGlvbiwgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIgfSBmcm9tICcuLi9wYXVzZS9pbnRlcnJ1cHQuanMnO1xuaW1wb3J0IHsgZGVjb2RlQ2hlY2twb2ludCB9IGZyb20gJy4uL3BhdXNlL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlZEV4ZWN1dGlvbiB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGZpcmUsIHJlY29yZGVyRmFpbHVyZUV2ZW50LCB3YXJuSW5EZXZNb2RlIH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5cbi8qKiBFdmVyeXRoaW5nIGEgcmVzdW1lIGRlY2lkZWQgYmVmb3JlIGFueSBleGVjdXRvciBzdGF0ZSB3YXMgdG91Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+IHtcbiAgLyoqIFRoZSBkZWNvZGVkIGNoZWNrcG9pbnQgKHVwY2FzdCBhbmQgY2hlY2tlZCkuICovXG4gIHJlYWRvbmx5IGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQ7XG4gIC8qKiBUaGUgcGF1c2VkIHN0YWdlJ3MgUkVBTCBub2RlIGluIHRoZSBjaGFydC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBXaGVyZSB0aGUgcmVzdW1lZCB0cmF2ZXJzYWwgc3RhcnRzLCBhbmQgd2hhdCBlYWNoIHN1YmZsb3cgb24gdGhlIHBhdGggdGFrZXMgb24gaXRzIGZpcnN0IGVudHJ5LiAqL1xuICByZWFkb25seSBlbnRyeTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbn1cblxuLyoqIFRoZSBmbG93IGNoYW5uZWwncyBpc29sYXRpb24gZm9yIHRoZSBleGVjdXRvci1tYWRlIGBvblJlc3VtZWAgKGRldi1tb2RlIHdhcm5pbmcsIHRoZW4gc2tpcCkuICovXG5jb25zdCBSRVNVTUVfRkxPV19GQUlMVVJFID0gd2FybkluRGV2TW9kZSgnRmxvd0NoYXJ0RXhlY3V0b3InKTtcblxuLyoqXG4gKiBQbGFuIHRoZSByZXN1bWUgYWdhaW5zdCB0aGUgY2hhcnQgYXMgYnVpbHQuIFRocm93cyDigJQgbGVhdmluZyB0aGUgZXhlY3V0b3JcbiAqIHVudG91Y2hlZCDigJQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBtYWxmb3JtZWQsIHRoZSBwYXVzZWQgc3RhZ2UgaXMgZ29uZSwgaXRcbiAqIGNhbm5vdCBiZSByZXN1bWVkLCBvciBpdHMgcGF0aCBkb2VzIG5vdCBmaXQgdGhpcyBjaGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5SZXN1bWU8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBzdG9yZWQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuKTogUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+IHtcbiAgLy8gRGVjb2RlIHRoZSBjaGVja3BvaW50IChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlLCBmcm9tXG4gIC8vIGFueSByZWxlYXNlKSDigJQgdGhlIE9ORSBjb2RlYzogdXBjYXN0LCB0aGVuIGNoZWNrIGV2ZXJ5IHBhdXNlIHJlY29yZC5cbiAgY29uc3QgY2hlY2twb2ludCA9IGRlY29kZUNoZWNrcG9pbnQoc3RvcmVkKTtcblxuICBjb25zdCBwYXVzZWROb2RlID0gZmluZE5vZGVJbkdyYXBoKGZjLCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpO1xuICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7Y2hlY2twb2ludC5wYXVzZWRTdGFnZUlkfScgbm90IGZvdW5kIGluIGZsb3djaGFydC4gYCArXG4gICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICk7XG4gIH1cbiAgLy8gVHdvIHJlLWVudHJ5IHNoYXBlcywgY2hvc2VuIGJ5IEhPVyB0aGUgcGF1c2Ugd2FzIHJhaXNlZDpcbiAgLy9cbiAgLy8gICDigKIgaW50ZXJydXB0KCkgICAgICDihpIgUkUtUlVOIFRIRSBTVEFHRSdTIE9XTiBGVU5DVElPTiBGUk9NIElUUyBUT1AuXG4gIC8vICAgICBTdGFnZXMgYXJlIGF0b21pYyAodGhlIHNhbWUgbGF3IGByZXN1bWVPbkVycm9yYCBzdGF0ZXMpOiBhIHN0YWdlIHRoYXRcbiAgLy8gICAgIHN0b3BwZWQgbWlkLWJvZHkgaGFzIG5vIGhhbGYgdG8gcmVzdW1lIGludG8sIHNvIHRoZSB3aG9sZSBib2R5IHJ1bnNcbiAgLy8gICAgIGFnYWluIGFuZCB0aGUgYW5zd2VyIGNvbWVzIGJhY2sgb3V0IG9mIHRoZSBgaW50ZXJydXB0KClgIGNhbGwgaXRzZWxmLlxuICAvLyAgICAgRXZlcnl0aGluZyB0aGUgYm9keSBkaWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaXMgcmUtZG9uZSDigJQgd2hpY2ggaXNcbiAgLy8gICAgIHdoeSB0aGUgZG9jcyB0ZWxsIHlvdSB0byBrZWVwIHRoYXQgaGFsZiBpZGVtcG90ZW50LlxuICAvLyAgIOKAoiBhZGRQYXVzYWJsZUZ1bmN0aW9uIOKGkiBydW4gdGhlIGRlY2xhcmVkIGByZXN1bWVGbmAuXG4gIC8vXG4gIC8vIFRoZSBkaXNjcmltaW5hbnQgaXMgb24gdGhlIGNoZWNrcG9pbnQsIHNvIHRoaXMgd29ya3MgY3Jvc3MtZXhlY3V0b3JcbiAgLy8gKGEgY2hlY2twb2ludCByZXN0b3JlZCBmcm9tIFJlZGlzIG9uIGEgZnJlc2ggcHJvY2VzcyByZXN1bWVzIHRoZSBzYW1lIHdheSkuXG4gIGNvbnN0IGlzSW50ZXJydXB0UmVzdW1lID0gY2hlY2twb2ludC5wYXVzZWRCeSA9PT0gJ2ludGVycnVwdCc7XG4gIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbiAmJiAhaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGhhcyBubyByZXN1bWVGbi4gYCArXG4gICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpLCBvciBzdGFnZXMgdGhhdCBwYXVzZWQgdmlhIGludGVycnVwdCgpLCBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICk7XG4gIH1cbiAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIGlzIG5ldmVyIHJlLXJ1biAoUDMpIOKAlCBhIGNoZWNrcG9pbnQgZnJvbSBhbm90aGVyIHZlcnNpb24gb2YgdGhlIGNoYXJ0IGluY2x1ZGVkLlxuICBjb25zdCByZXJ1blJlZnVzYWwgPSBpc0ludGVycnVwdFJlc3VtZSA/IGludGVycnVwdFByb2JsZW0ocGF1c2VkTm9kZS50b3VjaGVzKSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcnVuUmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgJHtyZXJ1blJlZnVzYWx9YCk7XG4gIH1cbiAgLy8gQSBjYXJyaWVkIGtleSBpcyBhZG9wdGVkIG9ubHkgYnkgYSBzdGFnZSB0aGF0IGRlY2xhcmVzIGEga2V5IHJ1bGUgKFAzKTogYSBjaGVja3BvaW50IG11c3Qgbm90IGhhbmQgYSBrZXkgdG8gYVxuICAvLyBzdGFnZSB0aGF0IG1ha2VzIG5vbmUg4oCUIGEga2V5IHJlcGxheWVkIGludG8gYW5vdGhlciBvcGVyYXRpb24uIE5hbWVkIGJ5IGZpZWxkLCBuZXZlciBxdW90ZWQuXG4gIGlmIChjaGVja3BvaW50LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgcGF1c2VkTm9kZS50b3VjaGVzPy5pZGVtcG90ZW5jeUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHRoZSBjaGVja3BvaW50IGNhcnJpZXMgYW4gaWRlbXBvdGVuY3lLZXksIGJ1dCBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgYCArXG4gICAgICAgICdkZWNsYXJlcyBubyBpZGVtcG90ZW5jeSBrZXkgcnVsZSDigJQgdGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSByZXN1bWVIYWxmT2YoZmMsIHBhdXNlZE5vZGUsIGlzSW50ZXJydXB0UmVzdW1lLCByZXN1bWVJbnB1dCk7XG5cbiAgLy8gVGhlIHBhdXNlZCBzdGFnZSdzIFNUQU5ELUlOOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgaWQsIG5hbWUsXG4gIC8vIGRlc2NyaXB0aW9uLCB0YWdzLCBhbmQgaXRzIHNoYXBlIChhIGRlY2lkZXIncyBicmFuY2hlcywgYSBzZWxlY3RvcidzLCBhXG4gIC8vIGZvcmsgcGFyZW50J3MgY2hpbGRyZW4sIGl0cyBgbmV4dGApIOKAlCB3aXRoIGl0cyBmdW5jdGlvbiBzd2FwcGVkIGZvciB0aGVcbiAgLy8gcmVzdW1lIGhhbGYuIEJ1aWx0IGZyb20gdGhlIHdob2xlIG5vZGUgc28gYW4gYGludGVycnVwdCgpYCByYWlzZWQgaW5zaWRlXG4gIC8vIGEgZGVjaWRlciwgc2VsZWN0b3Igb3IgZm9yay1wYXJlbnQgZnVuY3Rpb24gRElTUEFUQ0hFUyBvbiByZXN1bWUsIGFzIHRoZVxuICAvLyBzdGFnZSBkaWQgb24gdGhlIHJ1biAoYmVmb3JlIDkuMjguMCBvbmx5IGZuL25leHQvdGFncy9yZXRyeSB3ZXJlIGNvcGllZFxuICAvLyBhbmQgdGhlIGRpc3BhdGNoIHdhcyBzaWxlbnRseSBza2lwcGVkKS4gSXQgaXMgd2hlcmUgdGhlIHJlc3VtZWRcbiAgLy8gdHJhdmVyc2FsIHN0YXJ0cyDigJQgYW5kIG5vdGhpbmcgZWxzZTogaXQgaXMgbmV2ZXIgaW4gYSBub2RlIG1hcCBvciB0aGVcbiAgLy8gc3ViZmxvdyBkaWN0aW9uYXJ5LCBzbyBhIGxvb3AgYmFjayB0byB0aGUgcGF1c2VkIGlkIGZpbmRzIHRoZSBSRUFMXG4gIC8vIHN0YWdlLCB3aGljaCBwYXVzZXMgYWdhaW4gKHNlZSBSZXN1bWVFbnRyeSkuIFdoYXQgcnVucyBhZnRlciBpdCDigJQgaXRzXG4gIC8vIG93biBgbmV4dGAsIGVsc2UgaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24g4oCUIGlzIGF0dGFjaGVkIGJ5XG4gIC8vIGBSZXN1bWVFbnRyeS5wbGFuYCwgZnJvbSB0aGUgY2hhcnQuXG4gIGNvbnN0IHN0YW5kSW4gPSBzdGFuZEluRm9yKHBhdXNlZE5vZGUsIHJlc3VtZVN0YWdlRm4sIGlzSW50ZXJydXB0UmVzdW1lKTtcbiAgLy8gQSB0b3VjaGluZyBzdGFnZSByZXN1bWVzIHVuZGVyIHRoZSBrZXkgaXQgcGF1c2VkIHVuZGVyIChQMyksIGNhcnJpZWQgYnkgdGhlIGNoZWNrcG9pbnQg4oCUIG5ldmVyIG9uZSBpdHMgcnVsZVxuICAvLyB3b3VsZCByZWNvbXB1dGUgZnJvbSB0aGlzIGxlZydzIGlucHV0ICh0aGUgaW5wdXQgZG9lcyBub3QgY3Jvc3MgYSByZXN1bWUpLlxuICAvLyBUaGUga2V5IGlzIHRoZSBvcGVyYXRpb25hbCB2YWx1ZSBvbmx5OiBzZXJ2ZWQgdW5kZXIgdGhlIHJ1bidzIHJ1bGUgbGlrZSBhIGtleSBvZiB1bmtub3duIHNvdXJjZXMuXG4gIGNvbnN0IGNhcnJpZWRLZXkgPSBjaGVja3BvaW50LmlkZW1wb3RlbmN5S2V5O1xuICBpZiAoc3RhbmRJbi50b3VjaGVzICYmIGNhcnJpZWRLZXkgIT09IHVuZGVmaW5lZCkgc3RhbmRJbi50b3VjaGVzID0gY2FycmllZFRvdWNoZXMoc3RhbmRJbi50b3VjaGVzLnN5c3RlbSwgY2FycmllZEtleSk7XG5cbiAgLy8gV2hlcmUgdGhlIHJlc3VtZSByZS1lbnRlcnMsIHBsYW5uZWQgYWdhaW5zdCB0aGUgY2hhcnQgYXMgYnVpbHQ6XG4gIC8vXG4gIC8vICAg4oCiIFRPUC1MRVZFTCBQQVVTRSAoc3ViZmxvd1BhdGggZW1wdHkpOiB0aGUgcmVzdW1lZCB0cmF2ZXJzYWwgc3RhcnRzXG4gIC8vICAgICBhdCB0aGUgc3RhbmQtaW4uXG4gIC8vICAg4oCiIFBBVVNFIElOU0lERSBTVUJGTE9XUzogaXQgc3RhcnRzIGF0IHRoZSBtb3VudCBvZiB0aGUgZmlyc3Qgc3ViZmxvd1xuICAvLyAgICAgb24gdGhlIHBhdGgsIHNvIHRoZSBvdXRwdXRNYXBwZXJzIGFuZCB0aGUgcGFyZW50J3MgY29udGludWF0aW9uXG4gIC8vICAgICBydW4uIEVhY2ggc3ViZmxvdyBvbiB0aGUgcGF0aCBpcyBlbnRlcmVkIE9OQ0UgdGhyb3VnaCBpdHMgaG9wOiBpdHNcbiAgLy8gICAgIG5lc3RlZCBydW50aW1lIGlzIHNlZWRlZCBmcm9tIGl0cyBjYXB0dXJlIChpbiBwbGFjZSBvZiB0aGVcbiAgLy8gICAgIGlucHV0TWFwcGVyJ3MgdmFsdWVzKSBhbmQgaXRzIHRyYXZlcnNhbCBzdGFydHMgYXQgdGhlIG1vdW50IG9mIHRoZVxuICAvLyAgICAgbmV4dCBzdWJmbG93IOKAlCBvciwgYXQgdGhlIGxlYWYsIGF0IHRoZSBzdGFuZC1pbi4gQW4gb3V0ZXIgc3ViZmxvdydzXG4gIC8vICAgICBzdGFnZXMgYmVmb3JlIHRoYXQgbW91bnQgZG8gbm90IHJ1biBhZ2Fpbi5cbiAgLy8gICDigKIgQVQgRVZFUlkgTEVWRUwgdGhlIGVudHJ5IGNhcnJpZXMgd2hhdCBpdHMgZGlzcGF0Y2hlciB3b3VsZCBoYXZlIHJ1blxuICAvLyAgICAgYWZ0ZXIgaXQg4oCUIGEgZGVjaWRlcidzIGBuZXh0YCwgYSBzZWxlY3RvcidzLCBhIGZvcmsncyBqb2luIOKAlCBzbyBhXG4gIC8vICAgICBzdWJmbG93IG1vdW50ZWQgYXMgYSBicmFuY2ggb3IgYSBmb3JrIGNoaWxkIGhhbmRzIGNvbnRyb2wgYmFjayB0b1xuICAvLyAgICAgaXRzIHBhcmVudCdzIGNvbnRpbnVhdGlvbiBhdCB0aGUgcGFyZW50J3MgbGV2ZWwuXG4gIC8vICAg4oCiIFBhcmFsbGVsIHNpYmxpbmdzIHRoYXQgcGF1c2VkIGluIHRoZSBzYW1lIGZhbi1vdXQgd2FpdCBpblxuICAvLyAgICAgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2A6IGVhY2ggaXMgcmFpc2VkIGFnYWluIGluIHR1cm4sIGFuZCB0aGVcbiAgLy8gICAgIGpvaW4gcnVucyBvbmx5IG9uY2UgdGhlIGxhc3Qgb25lIGlzIHJlc3VtZWQuXG4gIC8vXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSB3YWxrcyB0aGUgUkVBTCBjaGFydDogYGZjLnJvb3RgIGFuZCBgZmMuc3ViZmxvd3NgIGFyZVxuICAvLyB1bnRvdWNoZWQsIHNvIGV2ZXJ5IGxhdGVyIGxvb3AgdGFyZ2V0IGFuZCBldmVyeSBsYXRlciBzdWJmbG93IGVudHJ5XG4gIC8vIChyZWFsIHJvb3QsIGlucHV0TWFwcGVyKSByZXNvbHZlcyBhcyBpdCB3b3VsZCBvbiBhIHJ1bi4gUmVmdXNlZCBIRVJFIOKAlFxuICAvLyBiZWZvcmUgYW55IHN0YXRlIGlzIHRvdWNoZWQg4oCUIHdoZW4gdGhlIGNoZWNrcG9pbnQncyBwYXRoIGRvZXMgbm90IGZpdFxuICAvLyB0aGlzIGNoYXJ0LlxuICAvL1xuICAvLyBDbG9uZS1pbjogdGhlIGNhcHR1cmVzIHNlZWQgbmVzdGVkIHJ1bnRpbWVzIChzaGFsbG93LW1lcmdlZCBpbnRvIGVhY2hcbiAgLy8gbmVzdGVkIFNoYXJlZE1lbW9yeSksIHNvIHdpdGhvdXQgYSBjb3B5IHRoZSBlbmdpbmUgd291bGQgaG9sZCBsaXZlXG4gIC8vIHJlZmVyZW5jZXMgaW50byB0aGUgY2FsbGVyJ3MgY2hlY2twb2ludCBvYmplY3Qg4oCUIGNhbGxlciBtdXRhdGlvbnMgd291bGRcbiAgLy8gYmxlZWQgaW50byB0aGUgcmVzdW1lZCBydW4gYW5kIGVuZ2luZSB3cml0ZXMgd291bGQgcmVhY2ggYSBjaGVja3BvaW50XG4gIC8vIHRoZSBjYWxsZXIgbWF5IGhhdmUgYWxyZWFkeSBwZXJzaXN0ZWQuIFRoZSBzYW1lIGZvciB0aGUgd2FpdGluZ1xuICAvLyBzaWJsaW5ncycgY2FwdHVyZXMuXG4gIGNvbnN0IGVudHJ5ID0gUmVzdW1lRW50cnkucGxhbjxUT3V0LCBUU2NvcGU+KHtcbiAgICByb290OiBmYy5yb290LFxuICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICBwYXRoOiBjaGVja3BvaW50LnN1YmZsb3dQYXRoLFxuICAgIGNhcHR1cmVzOiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5zdWJmbG93U3RhdGVzKSxcbiAgICBzdGFuZEluLFxuICAgIC4uLihjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMgIT09IHVuZGVmaW5lZCAmJiB7IHBlbmRpbmdQYXVzZXM6IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMpIH0pLFxuICB9KTtcbiAgcmV0dXJuIHsgY2hlY2twb2ludCwgcGF1c2VkTm9kZSwgZW50cnkgfTtcbn1cblxuLyoqXG4gKiBTZWVkIHRoZSBydW4ncyBzaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgKyBwZXItc3RhZ2UgdmlzaXQgY291bnRzIGZyb20gdGhlXG4gKiBjaGVja3BvaW50LCBzbyBydW50aW1lU3RhZ2VJZHMgc3RheSB1bmlxdWUgYW5kIGxvb3BJdGVyYXRpb24gbW9ub3RvbmljXG4gKiBhY3Jvc3MgYSBDUk9TUy1leGVjdXRvciByZXN1bWUgKGEgZnJlc2ggZXhlY3V0b3Igc3RhcnRzIGJvdGggYXQgMC9lbXB0eSkuXG4gKlxuICogTVVUQVRFLCBuZXZlciBSRVBMQUNFOiBib3RoIGFyZSBzaGFyZWQgYnkgcmVmZXJlbmNlIGludG8gdGhlIHRyYXZlcnNlclxuICogKGFuZCwgdHJhbnNpdGl2ZWx5LCBldmVyeSBzdWJmbG93IHRyYXZlcnNlcikuIEJvdGggZmllbGRzIGFyZSBvcHRpb25hbCBvblxuICogdGhlIGNoZWNrcG9pbnQgKG9sZGVyIHBlcnNpc3RlZCBjaGVja3BvaW50cyBvbWl0IHRoZW0pIOKAlCBzZWVkaW5nIGlzIHNraXBwZWRcbiAqIHdoZW4gYWJzZW50LiBTYW1lLWV4ZWN1dG9yIHJlc3VtZSBpcyBpZGVtcG90ZW50OiBhdCBwYXVzZSB0aGUgdmFsdWVzXG4gKiBhbHJlYWR5IGVxdWFsIHRoZSBjaGVja3BvaW50J3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkQ291bnRlcnMoXG4gIGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gIGV4ZWN1dGlvbkNvdW50ZXI6IHsgdmFsdWU6IG51bWJlciB9LFxuICB2aXNpdENvdW50czogTWFwPHN0cmluZywgbnVtYmVyPixcbik6IHZvaWQge1xuICBpZiAoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlY3V0aW9uQ291bnRlci52YWx1ZSA9IGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQ7XG4gIH1cbiAgaWYgKGNoZWNrcG9pbnQudmlzaXRDb3VudHMpIHtcbiAgICB2aXNpdENvdW50cy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgW3N0YWdlSWQsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhjaGVja3BvaW50LnZpc2l0Q291bnRzKSkge1xuICAgICAgdmlzaXRDb3VudHMuc2V0KHN0YWdlSWQsIGNvdW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGaXJlIHRoZSBleGVjdXRvci1tYWRlIGBvblJlc3VtZWAgb24gZXZlcnkgcmVjb3JkZXIgKGZsb3cgKyBzY29wZSksIHN0YW1wZWRcbiAqIHdpdGggdGhlIHJlc3VtZWQgbGVnJ3MgTkVXIHJ1bklkIOKAlCBjb25zdW1lcnMgZGV0ZWN0IFwiYSBmcmVzaCBsb2dpY2FsIHJ1blwiXG4gKiBieSB0aGUgc2FtZSBydW5JZCBjaGFuZ2UgdGhleSB1c2UgZm9yIGBvblJ1blN0YXJ0YC4gVGhlIHN0YW1wIGlzIGJ1aWx0IGJ5XG4gKiB0aGUgb25lIGNvbnN0cnVjdG9yIChgZW5naW5lL3RyYXZlcnNhbENvbnRleHQudHNgKTogaXQgbmFtZXMgdGhlIFJFQUxcbiAqIHN1YmZsb3cgdGhlIHN0YW5kLWluIHJ1bnMgaW4gYW5kIGl0cyBkZXB0aCwgYW5kIExJTktTIHRvIHRoZSBwYXVzZWRcbiAqIGV4ZWN1dGlvbiAoYHJlc3VtZWRGcm9tYCwgcmVhZCBvZmYgYGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uYCkg4oCUIDkuMzcuMC5cbiAqXG4gKiBUaGUgcnVudGltZVN0YWdlSWQgaXMgdGhlIFNUQU5ELUlOJ3Mgb3duOiBpdCBydW5zIGFmdGVyIG9uZSBtb3VudCBwZXJcbiAqIHN1YmZsb3cgb24gdGhlIHBhdGggKGVhY2ggZW50ZXJlZCBhdCBpdHMgbW91bnQpLCBzbyBpdHMgZXhlY3V0aW9uIGluZGV4IGlzXG4gKiB0aGUgY291bnRlciBwbHVzIHRoZSBwYXRoJ3MgbGVuZ3RoIOKAlCB0aGUgZXZlbnQgYW5kIHRoZSBzdGFuZC1pbidzIGNvbW1pdFxuICogbmFtZSB0aGUgc2FtZSBleGVjdXRpb24uIFRoZSBvbmUgc2hhcGUgd2hlcmUgdGhlIGluZGV4IGNhbm5vdCBiZSBrbm93biB1cFxuICogZnJvbnQg4oCUIGEgZGVncmFkZWQgY2hlY2twb2ludCBtaXNzaW5nIGFuIE9VVEVSIHN1YmZsb3cncyBjYXB0dXJlLCB3aG9zZVxuICogb3BlbmluZyBzdGFnZXMgdGhlbiByZS1ydW4g4oCUIG5hbWVzIHRoZSBwbGFubmVkIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3VuY2VSZXN1bWU8VE91dCwgVFNjb3BlPihcbiAgcGxhbjogUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+LFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbiAgcnVuOiB7XG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgICByZWFkb25seSBleGVjdXRpb25Db3VudDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IG9ic2VydmVyczogUnVuT2JzZXJ2ZXJzO1xuICAgIC8qKiBUaGUgUkVTVU1FRCBsZWcncyBjb3JyZWxhdGlvbiAoZnJvbSBgcmVzdW1lKClgJ3MgZW52KSDigJQgb24gYm90aCBldmVudHMsIGxpa2UgZXZlcnkgZXZlbnQgb2YgdGhlIGxlZy4gKi9cbiAgICByZWFkb25seSBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuICB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHsgY2hlY2twb2ludCwgcGF1c2VkTm9kZSwgZW50cnkgfSA9IHBsYW47XG4gIGNvbnN0IHsgb2JzZXJ2ZXJzLCBjb3JyZWxhdGlvbiB9ID0gcnVuO1xuICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0ZXBzQmVmb3JlU3RhbmRJbiA9IGVudHJ5LnN0ZXBzQmVmb3JlU3RhbmRJbiA/PyBjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aDtcbiAgY29uc3QgcmVzdW1lUnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHJ1bi5leGVjdXRpb25Db3VudCArIHN0ZXBzQmVmb3JlU3RhbmRJbik7XG4gIGNvbnN0IHJlc3VtZWRGcm9tID0gcmVzdW1lTGlua09mKGNoZWNrcG9pbnQpO1xuICBjb25zdCBmbG93UmVzdW1lRXZlbnQgPSB7XG4gICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICBoYXNJbnB1dCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0OiByZXN1bWVUcmF2ZXJzYWxDb250ZXh0KHtcbiAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmVzdW1lUnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogY2hlY2twb2ludC5zdWJmbG93UGF0aCxcbiAgICAgIHJlc3VtZWRGcm9tLFxuICAgICAgY29ycmVsYXRpb24sXG4gICAgfSksXG4gICAgY2hhbm5lbDogJ2Zsb3cnIGFzIGNvbnN0LFxuICB9O1xuICAvLyBFeGVjdXRvci1tYWRlIChgSE9PS1Mub25SZXN1bWUuZXhlY3V0b3JNYWRlYCk6IGZpcmVkIHRocm91Z2ggdGhlIHNhbWUgYGZpcmVgIGxvb3AgYXMgZXZlcnlcbiAgLy8gZW5naW5lIGV2ZW50LCBzbyBhIHRocm93aW5nIHJlY29yZGVyIGlzIGlzb2xhdGVkIGluc3RlYWQgb2YgcmVqZWN0aW5nIGByZXN1bWUoKWAgKFIxMCkuXG4gIGZpcmUob2JzZXJ2ZXJzLmlubGluZUZsb3dMaXN0ZW5lcnMoKSwgJ29uUmVzdW1lJywgZmxvd1Jlc3VtZUV2ZW50LCBSRVNVTUVfRkxPV19GQUlMVVJFKTtcblxuICBjb25zdCBzY29wZVJlc3VtZUV2ZW50ID0ge1xuICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgcnVudGltZVN0YWdlSWQ6IHJlc3VtZVJ1bnRpbWVTdGFnZUlkLFxuICAgIGhhc0lucHV0LFxuICAgIC4uLihyZXN1bWVkRnJvbSAmJiB7IHJlc3VtZWRGcm9tIH0pLFxuICAgIHBpcGVsaW5lSWQ6ICcnLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIC4uLihjb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uIH0pLFxuICB9O1xuICBmaXJlKG9ic2VydmVycy5zY29wZVJlY29yZGVycywgJ29uUmVzdW1lJywgc2NvcGVSZXN1bWVFdmVudCwgKGVycm9yLCBfcmVjb3JkZXIsIGhvb2spID0+XG4gICAgLy8gVGhlIHNjb3BlIGNoYW5uZWwncyBwb2xpY3kgKGFzIGBTY29wZUZhY2FkZWAgcm91dGVzIGEgc3RhZ2UncyBob29rIGZhaWx1cmUpOiB0aGUgdGhyb3dcbiAgICAvLyBiZWNvbWVzIGFuIGBvbkVycm9yYCBvbiBldmVyeSBzY29wZSByZWNvcmRlciwgd2hvc2Ugb3duIHRocm93IGlzIGRyb3BwZWQuXG4gICAgZmlyZShvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMsICdvbkVycm9yJywgcmVjb3JkZXJGYWlsdXJlRXZlbnQoc2NvcGVSZXN1bWVFdmVudCwgZXJyb3IsIGhvb2spKSxcbiAgKTtcblxuICAvLyBEZWZlcnJlZCB0aWVyIChSRkMtMDAxKTogdGhlc2UgZXhlY3V0b3Itc3ludGhlc2l6ZWQgb25SZXN1bWUgZXZlbnRzXG4gIC8vIGJ5cGFzcyB0aGUgcGVyLXN0YWdlIGRpc3BhdGNoIHNpdGVzLCBzbyBjYXB0dXJlIHRoZW0gZGlyZWN0bHkuXG4gIGlmIChvYnNlcnZlcnMuZGVmZXJyZWRUaWVyKSB7XG4gICAgb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5jYXB0dXJlKCdmbG93JywgJ29uUmVzdW1lJywgcmVzdW1lUnVudGltZVN0YWdlSWQsIHJ1bi5ydW5JZCwgZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmNhcHR1cmUoXG4gICAgICAnc2NvcGUnLFxuICAgICAgJ29uUmVzdW1lJyxcbiAgICAgIHNjb3BlUmVzdW1lRXZlbnQucnVudGltZVN0YWdlSWQsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcmVzdW1lIGhhbGYg4oCUIHdoYXQgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluIHJ1bnMuIGBpbnRlcnJ1cHQoKWA6XG4gKiB0aGUgc3RhZ2UncyBvd24gZnVuY3Rpb24sIHdpdGggdGhlIGFuc3dlciBkZXBvc2l0ZWQgZm9yIFRISVMgc2NvcGUgZmlyc3RcbiAqIChrZXllZCBieSBzY29wZSBpZGVudGl0eSDigJQgc2FmZSB3aGVuIHNldmVyYWwgYnJhbmNoZXMgcmVzdW1lIGF0IG9uY2UpLlxuICogYGFkZFBhdXNhYmxlRnVuY3Rpb25gOiB0aGUgZGVjbGFyZWQgYHJlc3VtZUZuKHNjb3BlLCBpbnB1dClgLCB3cmFwcGVkIHRvXG4gKiB0aGUgYFN0YWdlRnVuY3Rpb25gIHNoYXBlLlxuICovXG5mdW5jdGlvbiByZXN1bWVIYWxmT2Y8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZWROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgaXNJbnRlcnJ1cHRSZXN1bWU6IGJvb2xlYW4sXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuKTogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHtcbiAgaWYgKGlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxGbiA9IHBhdXNlZE5vZGUuZm4gPz8gZmMuc3RhZ2VNYXAuZ2V0KHBhdXNlZE5vZGUuaWQpID8/IGZjLnN0YWdlTWFwLmdldChwYXVzZWROb2RlLm5hbWUpO1xuICAgIGlmICghb3JpZ2luYWxGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIHBhdXNlZCB2aWEgaW50ZXJydXB0KCkgYnV0IGl0cyBgICtcbiAgICAgICAgICAnc3RhZ2UgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGluIHRoZSBjaGFydC4gVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgJyArXG4gICAgICAgICAgJ3dhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjaykgPT4ge1xuICAgICAgcHJvdmlkZUludGVycnVwdEFuc3dlcihzY29wZSwgcmVzdW1lSW5wdXQpO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsRm4oc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlc3VtZUZuID0gcGF1c2VkTm9kZS5yZXN1bWVGbiE7XG4gIHJldHVybiAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgIHJldHVybiByZXN1bWVGbihzY29wZSwgcmVzdW1lSW5wdXQpIGFzIFRPdXQgfCBQcm9taXNlPFRPdXQ+O1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBmb3IgYSByZXN1bWU6IHRoZSBzdGFnZSdzIE9XTiBub2RlIOKAlCBzbyBpdCBrZWVwc1xuICogaXRzIHNoYXBlIChhIGRlY2lkZXIncyBvciBzZWxlY3RvcidzIGJyYW5jaGVzLCBhIGZvcmsgcGFyZW50J3MgY2hpbGRyZW4sXG4gKiBpdHMgYG5leHRgKSBhbmQgaXRzIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBkZWNsYXJlZCB0YWdzIOKAlCB3aXRoIGBmbmAgc3dhcHBlZFxuICogZm9yIHRoZSByZXN1bWUgaGFsZi5cbiAqXG4gKiBEcm9wcGVkOiBgcmVzdW1lRm5gIGFuZCBgaXNQYXVzYWJsZWAgKHRoZSByZXN1bWUgaGFsZiBtdXN0IG5vdCBwYXVzZVxuICogYmVjYXVzZSBpdCByZXR1cm5lZCBhIHZhbHVlIOKAlCB0aGUgb3JpZ2luYWwgcGF1c2FibGUgY29udHJhY3QpOyBhbmQsIG9uIHRoZVxuICogYGFkZFBhdXNhYmxlRnVuY3Rpb25gIHJlLWVudHJ5LCB0aGUgcG9saWNpZXMgZGVjbGFyZWQgZm9yIHRoZSBzdGFnZSdzIE9XTlxuICogZnVuY3Rpb24gKGByZXRyeWAsIHN0cmVhbWluZykg4oCUIHRoYXQgcmUtZW50cnkgcnVucyBhIGRpZmZlcmVudCBmdW5jdGlvblxuICogKGByZXN1bWVGbmApIHVuZGVyIGEgZGlmZmVyZW50IGNvbnRyYWN0LiBUaGUgYGludGVycnVwdCgpYCByZS1lbnRyeSByZS1ydW5zXG4gKiB0aGUgc3RhZ2UncyBvd24gZnVuY3Rpb24sIHNvIGl0IGtlZXBzIHRoZW0uXG4gKlxuICogVGFncyBmb2xsb3cgdGhlIHN0YWdlIG9uIEJPVEggcmUtZW50cmllcyAoOS4yMS4wKTogYSB0YWcgaXMgdGhlIHN0YWdlJ3NcbiAqIE5BTUUsIG5vdCBhIHBvbGljeSBvdmVyIGl0cyBmdW5jdGlvbiwgYW5kIHRoZSByZXN1bWVkIGV4ZWN1dGlvbiBpcyB0aGF0XG4gKiBzdGFnZSBydW5uaW5nIGFnYWluIOKAlCBpdHMgYnVuZGxlIG11c3QgY2FycnkgaXQsIG9yIGEgY2hhaW5lZCBheGlzIHdvdWxkXG4gKiBzaG93IHRoZSBwYXVzZWQgbGVnIHRhZ2dlZCBhbmQgdGhlIHJlc3VtZWQgbGVnIHNpbGVudGx5IG5vdC5cbiAqL1xuZnVuY3Rpb24gc3RhbmRJbkZvcjxUT3V0LCBUU2NvcGU+KFxuICBwYXVzZWROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgaXNJbnRlcnJ1cHRSZXN1bWU6IGJvb2xlYW4sXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IHN0YW5kSW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5wYXVzZWROb2RlLCBmbiB9O1xuICBkZWxldGUgc3RhbmRJbi5yZXN1bWVGbjtcbiAgZGVsZXRlIHN0YW5kSW4uaXNQYXVzYWJsZTtcbiAgaWYgKCFpc0ludGVycnVwdFJlc3VtZSkge1xuICAgIGRlbGV0ZSBzdGFuZEluLnJldHJ5O1xuICAgIGRlbGV0ZSBzdGFuZEluLmlzU3RyZWFtaW5nO1xuICAgIGRlbGV0ZSBzdGFuZEluLnN0cmVhbUlkO1xuICB9XG4gIHJldHVybiBzdGFuZEluO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bWUgZXZlbnQncyBsaW5rLCByZWFkIG9mZiB0aGUgY2hlY2twb2ludCBpdHNlbGYg4oCUIHNvIGEgcmVzdW1lIHJlY29yZHNcbiAqIHRoZSBzYW1lIHdoZXJldmVyIGl0cyBjaGVja3BvaW50IGNhbWUgZnJvbS4gYHVuZGVmaW5lZGAgZm9yIGEgY2hlY2twb2ludFxuICogd2l0aG91dCBgcGF1c2VkRXhlY3V0aW9uYCAobWFkZSBiZWZvcmUgOS4zNy4wKSBvciB3aXRoIGEgbWFsZm9ybWVkIG9uZTogdGhlXG4gKiBsaW5rIGlzIGEgcmVjb3JkLCBuZXZlciB1c2VkIHRvIHBsYW4gdGhlIHJlLWVudHJ5LCBzbyBpdCBpcyBsZWZ0IG91dCByYXRoZXJcbiAqIHRoYW4gZ3Vlc3NlZC5cbiAqL1xuZnVuY3Rpb24gcmVzdW1lTGlua09mKGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQpOiBSZXN1bWVMaW5rIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF1c2VkOiB1bmtub3duID0gY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb247XG4gIHJldHVybiBpc1BhdXNlZEV4ZWN1dGlvbihwYXVzZWQpID8geyBydW5JZDogcGF1c2VkLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcGF1c2VkLnJ1bnRpbWVTdGFnZUlkIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQsIGRyaWxsaW5nIGludG8gcmVnaXN0ZXJlZFxuICogc3ViZmxvd3MgYWxvbmcgYHN1YmZsb3dQYXRoYCBhbmQgc2VhcmNoaW5nIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmROb2RlSW5HcmFwaDxUT3V0LCBUU2NvcGU+KFxuICBmYzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gIHN0YWdlSWQ6IHN0cmluZyxcbiAgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gZGZzRmluZChmYy5yb290LCBzdGFnZUlkKTtcbiAgbGV0IHN1YmZsb3dSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgaWYgKCFzdWJmbG93KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICB9XG4gIGlmICghc3ViZmxvd1Jvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBkZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbn1cblxuLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbmZ1bmN0aW9uIGRmc0ZpbmQ8VE91dCwgVFNjb3BlPihcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgZm91bmQgPSBkZnNGaW5kKGNoaWxkLCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIGRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { FlowchartTraverser } from '../engine/traversal/FlowchartTraverser.js';
|
|
9
9
|
import type { RunObservers } from './attach.js';
|
|
10
|
-
import type { RecorderSnapshot, RuntimeSnapshot } from './ExecutionRuntime.js';
|
|
10
|
+
import type { RecorderSnapshot, RecordSinkStats, RuntimeSnapshot } from './ExecutionRuntime.js';
|
|
11
11
|
/**
|
|
12
12
|
* The served snapshot. `sharedState` is the LIVE view in production (zero
|
|
13
13
|
* copy); in dev mode it is a deep-frozen CLONE, so a consumer mutation throws
|
|
@@ -15,7 +15,7 @@ import type { RecorderSnapshot, RuntimeSnapshot } from './ExecutionRuntime.js';
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function servedSnapshot(traverser: FlowchartTraverser<any, any>, observers: RunObservers, options?: {
|
|
17
17
|
redact?: boolean;
|
|
18
|
-
}): RuntimeSnapshot;
|
|
18
|
+
}, sink?: RecordSinkStats): RuntimeSnapshot;
|
|
19
19
|
/**
|
|
20
20
|
* Collect `toSnapshot()` bundles from every attached recorder — ONE entry
|
|
21
21
|
* per recorder id, across all channels and both delivery tiers.
|
|
@@ -15,7 +15,7 @@ import { copyBundle } from '../recorder/snapshot.js';
|
|
|
15
15
|
* copy); in dev mode it is a deep-frozen CLONE, so a consumer mutation throws
|
|
16
16
|
* instead of corrupting engine state.
|
|
17
17
|
*/
|
|
18
|
-
export function servedSnapshot(traverser, observers, options) {
|
|
18
|
+
export function servedSnapshot(traverser, observers, options, sink) {
|
|
19
19
|
const snapshot = servedLog(traverser.getSnapshot(options));
|
|
20
20
|
if (isDevMode()) {
|
|
21
21
|
// Dev-mode mutation guard: freeze a CLONE, never the live engine
|
|
@@ -46,6 +46,10 @@ export function servedSnapshot(traverser, observers, options) {
|
|
|
46
46
|
if (observers.deferredTier) {
|
|
47
47
|
snapshot.observerStats = observers.deferredTier.getStats();
|
|
48
48
|
}
|
|
49
|
+
// The crash-safe record's accounting (10.1, P6): present ONLY for an executor built with a `sink`, once a run
|
|
50
|
+
// started.
|
|
51
|
+
if (sink !== undefined)
|
|
52
|
+
snapshot.sink = sink;
|
|
49
53
|
return snapshot;
|
|
50
54
|
}
|
|
51
55
|
/**
|
|
@@ -105,4 +109,4 @@ export function collectRecorderSnapshots(observers) {
|
|
|
105
109
|
}
|
|
106
110
|
return out;
|
|
107
111
|
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR2xGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsU0FBdUMsRUFDdkMsU0FBdUIsRUFDdkIsT0FBOEI7SUFFOUIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFvQixDQUFDLENBQUM7SUFDOUUsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1FBQ2hCLGlFQUFpRTtRQUNqRSx1RUFBdUU7UUFDdkUseURBQXlEO1FBQ3pELDJCQUEyQjtRQUMzQixrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsMkRBQTJEO1FBQzNELFFBQVEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDaEQsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLHdFQUF3RTtRQUN4RSx3REFBd0Q7UUFDeEQsNEVBQTRFO1FBQzVFLFFBQVEsQ0FBQyxjQUFjLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsUUFBUSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztJQUN6QyxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUNoRSwwQ0FBMEM7SUFDMUMsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0IsUUFBUSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxRQUF5QjtJQUMxQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBbUI7UUFDL0UsR0FBRyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7S0FDbkYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFNBQXVCO0lBQzlELE1BQU0sR0FBRyxHQUF1QixFQUFFLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQStCLEVBQVEsRUFBRTtRQUN4RCxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUNGLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLGNBQWM7UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsYUFBYTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNuYXBzaG90IOKAlCB3aGF0IGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCgpYCBzZXJ2ZXMgKEY5KS5cbiAqXG4gKiBUaGUgdHJhdmVyc2VyJ3MgcnVudGltZSBzbmFwc2hvdCwgcGx1cyB3aGF0IG9ubHkgdGhlIGV4ZWN1dG9yIGtub3dzOiB0aGVcbiAqIHNlcnZlZCBzdWJmbG93IHJlc3VsdHMgKGVhY2ggc3ViZmxvdydzIG93biBtaXJyb3IgdW5kZXIgYHJlZGFjdDogdHJ1ZWApLCBvbmVcbiAqIHJlY29yZGVyIHJvdyBwZXIgcmVjb3JkZXIgaWQsIGFuZCB0aGUgZGVmZXJyZWQgdGllcidzIGFjY291bnRpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgc2VydmVSZWNvcmQgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgZGVlcEZyZWV6ZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgc2VydmVkU3ViZmxvd1Jlc3VsdHMgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvc2VydmVkU3ViZmxvd1Jlc3VsdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHsgY29weUJ1bmRsZSB9IGZyb20gJy4uL3JlY29yZGVyL3NuYXBzaG90LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgc25hcHNob3QuIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIExJVkUgdmlldyBpbiBwcm9kdWN0aW9uICh6ZXJvXG4gKiBjb3B5KTsgaW4gZGV2IG1vZGUgaXQgaXMgYSBkZWVwLWZyb3plbiBDTE9ORSwgc28gYSBjb25zdW1lciBtdXRhdGlvbiB0aHJvd3NcbiAqIGluc3RlYWQgb2YgY29ycnVwdGluZyBlbmdpbmUgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTbmFwc2hvdChcbiAgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8YW55LCBhbnk+LFxuICBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyxcbiAgb3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9LFxuKTogUnVudGltZVNuYXBzaG90IHtcbiAgY29uc3Qgc25hcHNob3QgPSBzZXJ2ZWRMb2codHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdCk7XG4gIGlmIChpc0Rldk1vZGUoKSkge1xuICAgIC8vIERldi1tb2RlIG11dGF0aW9uIGd1YXJkOiBmcmVlemUgYSBDTE9ORSwgbmV2ZXIgdGhlIGxpdmUgZW5naW5lXG4gICAgLy8gc3RhdGUg4oCUIGBzbmFwc2hvdC5zaGFyZWRTdGF0ZWAgSVMgU2hhcmVkTWVtb3J5J3MgY3VycmVudCBnZW5lcmF0aW9uLFxuICAgIC8vIHdob3NlIHVuY2hhbmdlZCBzdWJ0cmVlcyBldmVyeSBsYXRlciBnZW5lcmF0aW9uIHNoYXJlc1xuICAgIC8vIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgIC8vIFByb2R1Y3Rpb24gc3RheXMgemVyby1jb3B5OyBjbG9uZS1hbHdheXMgaXMgYSBtZWFzdXJlZCBkZWNpc2lvblxuICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgLy8gTk9URTogZGVlcEZyZWV6ZSAoY2FwdHVyZS9mcmVlemUudHMg4oCUIHRoZSBvbmUgd2FsaykgY2Fubm90IHJlYWNoXG4gICAgLy8gTWFwL1NldCBJTlRFUk5BTFMgKGBtYXAuc2V0KClgIG9uIHRoZSBmcm96ZW4gY2xvbmUgd29uJ3QgdGhyb3cpIGFuZFxuICAgIC8vIHNraXBzIHR5cGVkIGFycmF5cy4gVGhlIENMT05FIHN0aWxsIGlzb2xhdGVzIHRoZSBlbmdpbmUuXG4gICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICB9XG4gIGNvbnN0IHNmUmVzdWx0cyA9IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgLy8gVW5kZXIgYHJlZGFjdDogdHJ1ZWAgZWFjaCBzdWJmbG93J3MgYGdsb2JhbENvbnRleHRgIGlzIGl0cyBvd24gbWlycm9yXG4gICAgLy8gKDkuMjAuMCkg4oCUIHNlcnZlZCwgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSByZWNvcmQgKHNlZVxuICAgIC8vIGVuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cykuIFBsYWluOiB0aGUgcmVjb3JkcyBhcyB0aGV5IGFyZS5cbiAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IHNlcnZlZFN1YmZsb3dSZXN1bHRzKHNmUmVzdWx0cywgb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZGVyU25hcHNob3RzID0gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKG9ic2VydmVycyk7XG4gIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gIH1cblxuICAvLyBSRkMtMDAxIEJsb2NrIDk6IHRoZSBkZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIHN1cmZhY2UuIFByZXNlbnRcbiAgLy8gT05MWSB3aGVuIGEgZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGF0dGFjaGVkIG9uIHRoaXMgZXhlY3V0b3Ig4oCUXG4gIC8vIHplcm8tY29zdCBkaXNjaXBsaW5lIGZvciBldmVyeW9uZSBlbHNlLlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMgPSBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmdldFN0YXRzKCk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cgYW5kIHRoZSBmb2xkIGJhc2UgYXMgYSByZWFkZXIgbWF5IGhvbGQgdGhlbSAoOS40NC4yKTogYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlXG4gKiBpcyBzZXJ2ZWQgYXMgaXRzZWxmOyBvbmUgaG9sZGluZyB3aGF0IGZyZWV6aW5nIGNhbm5vdCBzZWFsIOKAlCBhIERhdGUsIGEgTWFwLCBhIGJ1ZmZlciDigKYg4oCUIGFzIGEgY29weVxuICogb2YgaXRzIG9wZW4gcGF0aHMsIHRoZSByZWFkZXIncyBvd24gKGBjYXB0dXJlL2ZyZWV6ZS50cyDCtyBzZXJ2ZVJlY29yZGApLiBIZXJlLCBhdCB0aGUgcHVibGljIGRvb3I6XG4gKiB0aGUgZW5naW5lJ3Mgb3duIHNuYXBzaG90IG9mIGEgbG9nIChhIHN1YmZsb3cgbW91bnQncykgaXMgbm90IHNlcnZlZCwgc28gdGhlIHJ1biBwYXlzIG5vdGhpbmcuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZExvZyhzbmFwc2hvdDogUnVudGltZVNuYXBzaG90KTogUnVudGltZVNuYXBzaG90IHtcbiAgY29uc3QgeyBpbml0aWFsU3RhdGUgfSA9IHNuYXBzaG90O1xuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZShzbmFwc2hvdC5jb21taXRMb2cubWFwKHNlcnZlUmVjb3JkKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgLi4uKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogc2VydmVSZWNvcmQoaW5pdGlhbFN0YXRlKSB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGB0b1NuYXBzaG90KClgIGJ1bmRsZXMgZnJvbSBldmVyeSBhdHRhY2hlZCByZWNvcmRlciDigJQgT05FIGVudHJ5XG4gKiBwZXIgcmVjb3JkZXIgaWQsIGFjcm9zcyBhbGwgY2hhbm5lbHMgYW5kIGJvdGggZGVsaXZlcnkgdGllcnMuXG4gKlxuICogVGhlIGRlZHVwZSBpcyBsb2FkLWJlYXJpbmcsIG5vdCB0aWRpbmVzcy4gQSByZWNvcmRlciB0aGF0IGltcGxlbWVudHMgYVxuICogc2hhcmVkLW5hbWUgaG9vayAoYG9uRXJyb3JgIC8gYG9uUGF1c2VgIC8gYG9uUmVzdW1lYCDigJQgZGVjbGFyZWQgb24gQk9USFxuICogdGhlIHNjb3BlIGFuZCBmbG93IGludGVyZmFjZXMpIGlzIGxlZ2l0aW1hdGVseSByZWdpc3RlcmVkIG9uIEJPVEggaW5saW5lXG4gKiBsaXN0cyBieSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnbjogZWFjaCBjaGFubmVsXG4gKiBjYWxscyB0aGUgaG9vayB3aXRoIGl0cyBvd24gcGF5bG9hZCB2YXJpYW50LiBgTWV0cmljUmVjb3JkZXIub25QYXVzZWAgaXNcbiAqIHRoZSBldmVyeWRheSBjYXNlLiBXYWxraW5nIHRoZSBsaXN0cyB3aXRob3V0IGEgc2hhcmVkIGBzZWVuYCBzZXQgdHVybmVkXG4gKiB0aGF0IGludG8gYSBEVVBMSUNBVEVEIHNuYXBzaG90IGVudHJ5IChzYW1lIGlkIHR3aWNlKSwgd2hpY2ggYnJlYWtzIGV2ZXJ5XG4gKiBjb25zdW1lciB0aGF0IGluZGV4ZXMgYHNuYXBzaG90LnJlY29yZGVyc2AgYnkgaWQuXG4gKlxuICogT3JkZXJpbmcgaXMgc2NvcGUgbGlzdCDihpIgZmxvdyBsaXN0IOKGkiBkZWZlcnJlZCB0aWVyLCBhbmQgdGhlIEZJUlNUIGJ1bmRsZVxuICogZm9yIGFuIGlkIHdpbnMuIEEgcmVjb3JkZXIgd2l0aCBubyBgdG9TbmFwc2hvdGAgbmV2ZXIgY2xhaW1zIGFuIGlkLCBzbyBpdFxuICogY2Fubm90IHNoYWRvdyBhIHNhbWUtaWQgcmVjb3JkZXIgdGhhdCBkb2VzIGhhdmUgb25lLlxuICpcbiAqIFRoZSByb3cgaXMgUkVCVUlMVCBmaWVsZCBieSBmaWVsZCBieSB0aGUgb25lIGNvcGllciAoYHJlY29yZGVyL3NuYXBzaG90LnRzXG4gKiDCtyBjb3B5QnVuZGxlYCwgc2hhcmVkIHdpdGggYENvbXBvc2l0ZVJlY29yZGVyYCkgcmF0aGVyIHRoYW4gc3ByZWFkLCBzbyBhXG4gKiByZWNvcmRlciBjYW5ub3Qgc211Z2dsZSBhbiBgaWRgIG9mIGl0cyBvd24gY2hvb3NpbmcgaW50byB0aGUgc25hcHNob3QgKHRoZVxuICogaWQgaXMgdGhlIGV4ZWN1dG9yJ3MsIGFuZCBjb25zdW1lcnMgaW5kZXggYnkgaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKG9ic2VydmVyczogUnVuT2JzZXJ2ZXJzKTogUmVjb3JkZXJTbmFwc2hvdFtdIHtcbiAgY29uc3Qgb3V0OiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBjb2xsZWN0ID0gKHI6IFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoIXIudG9TbmFwc2hvdCB8fCBzZWVuLmhhcyhyLmlkKSkgcmV0dXJuO1xuICAgIHNlZW4uYWRkKHIuaWQpO1xuICAgIG91dC5wdXNoKGNvcHlCdW5kbGUoci5pZCwgci50b1NuYXBzaG90KCkpKTtcbiAgfTtcbiAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5zY29wZVJlY29yZGVycykgY29sbGVjdChyKTtcbiAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5mbG93UmVjb3JkZXJzKSBjb2xsZWN0KHIpO1xuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLnNjb3BlTGlzdFJlY29yZGVycygpKSBjb2xsZWN0KHIpO1xuICAgIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmZsb3dMaXN0UmVjb3JkZXJzKCkpIGNvbGxlY3Qocik7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR2xGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsU0FBdUMsRUFDdkMsU0FBdUIsRUFDdkIsT0FBOEIsRUFDOUIsSUFBc0I7SUFFdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFvQixDQUFDLENBQUM7SUFDOUUsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1FBQ2hCLGlFQUFpRTtRQUNqRSx1RUFBdUU7UUFDdkUseURBQXlEO1FBQ3pELDJCQUEyQjtRQUMzQixrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsMkRBQTJEO1FBQzNELFFBQVEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDaEQsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLHdFQUF3RTtRQUN4RSx3REFBd0Q7UUFDeEQsNEVBQTRFO1FBQzVFLFFBQVEsQ0FBQyxjQUFjLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsUUFBUSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztJQUN6QyxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUNoRSwwQ0FBMEM7SUFDMUMsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0IsUUFBUSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCw4R0FBOEc7SUFDOUcsV0FBVztJQUNYLElBQUksSUFBSSxLQUFLLFNBQVM7UUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUU3QyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxRQUF5QjtJQUMxQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBbUI7UUFDL0UsR0FBRyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7S0FDbkYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFNBQXVCO0lBQzlELE1BQU0sR0FBRyxHQUF1QixFQUFFLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQStCLEVBQVEsRUFBRTtRQUN4RCxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUNGLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLGNBQWM7UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsYUFBYTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNuYXBzaG90IOKAlCB3aGF0IGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCgpYCBzZXJ2ZXMgKEY5KS5cbiAqXG4gKiBUaGUgdHJhdmVyc2VyJ3MgcnVudGltZSBzbmFwc2hvdCwgcGx1cyB3aGF0IG9ubHkgdGhlIGV4ZWN1dG9yIGtub3dzOiB0aGVcbiAqIHNlcnZlZCBzdWJmbG93IHJlc3VsdHMgKGVhY2ggc3ViZmxvdydzIG93biBtaXJyb3IgdW5kZXIgYHJlZGFjdDogdHJ1ZWApLCBvbmVcbiAqIHJlY29yZGVyIHJvdyBwZXIgcmVjb3JkZXIgaWQsIGFuZCB0aGUgZGVmZXJyZWQgdGllcidzIGFjY291bnRpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgc2VydmVSZWNvcmQgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgZGVlcEZyZWV6ZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgc2VydmVkU3ViZmxvd1Jlc3VsdHMgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvc2VydmVkU3ViZmxvd1Jlc3VsdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHsgY29weUJ1bmRsZSB9IGZyb20gJy4uL3JlY29yZGVyL3NuYXBzaG90LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSZWNvcmRTaW5rU3RhdHMsIFJ1bnRpbWVTbmFwc2hvdCB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5cbi8qKlxuICogVGhlIHNlcnZlZCBzbmFwc2hvdC4gYHNoYXJlZFN0YXRlYCBpcyB0aGUgTElWRSB2aWV3IGluIHByb2R1Y3Rpb24gKHplcm9cbiAqIGNvcHkpOyBpbiBkZXYgbW9kZSBpdCBpcyBhIGRlZXAtZnJvemVuIENMT05FLCBzbyBhIGNvbnN1bWVyIG11dGF0aW9uIHRocm93c1xuICogaW5zdGVhZCBvZiBjb3JydXB0aW5nIGVuZ2luZSBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlZFNuYXBzaG90KFxuICB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxhbnksIGFueT4sXG4gIG9ic2VydmVyczogUnVuT2JzZXJ2ZXJzLFxuICBvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0sXG4gIHNpbms/OiBSZWNvcmRTaW5rU3RhdHMsXG4pOiBSdW50aW1lU25hcHNob3Qge1xuICBjb25zdCBzbmFwc2hvdCA9IHNlcnZlZExvZyh0cmF2ZXJzZXIuZ2V0U25hcHNob3Qob3B0aW9ucykgYXMgUnVudGltZVNuYXBzaG90KTtcbiAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgLy8gRGV2LW1vZGUgbXV0YXRpb24gZ3VhcmQ6IGZyZWV6ZSBhIENMT05FLCBuZXZlciB0aGUgbGl2ZSBlbmdpbmVcbiAgICAvLyBzdGF0ZSDigJQgYHNuYXBzaG90LnNoYXJlZFN0YXRlYCBJUyBTaGFyZWRNZW1vcnkncyBjdXJyZW50IGdlbmVyYXRpb24sXG4gICAgLy8gd2hvc2UgdW5jaGFuZ2VkIHN1YnRyZWVzIGV2ZXJ5IGxhdGVyIGdlbmVyYXRpb24gc2hhcmVzXG4gICAgLy8gKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgLy8gUHJvZHVjdGlvbiBzdGF5cyB6ZXJvLWNvcHk7IGNsb25lLWFsd2F5cyBpcyBhIG1lYXN1cmVkIGRlY2lzaW9uXG4gICAgLy8gZGVmZXJyZWQgdW50aWwgdGhlIGJlbmNoIHNheXMgaXQncyBhZmZvcmRhYmxlIChCQUNLTE9HICM4KS5cbiAgICAvLyBOT1RFOiBkZWVwRnJlZXplIChjYXB0dXJlL2ZyZWV6ZS50cyDigJQgdGhlIG9uZSB3YWxrKSBjYW5ub3QgcmVhY2hcbiAgICAvLyBNYXAvU2V0IElOVEVSTkFMUyAoYG1hcC5zZXQoKWAgb24gdGhlIGZyb3plbiBjbG9uZSB3b24ndCB0aHJvdykgYW5kXG4gICAgLy8gc2tpcHMgdHlwZWQgYXJyYXlzLiBUaGUgQ0xPTkUgc3RpbGwgaXNvbGF0ZXMgdGhlIGVuZ2luZS5cbiAgICBzbmFwc2hvdC5zaGFyZWRTdGF0ZSA9IGRlZXBGcmVlemUoc3RydWN0dXJlZENsb25lKHNuYXBzaG90LnNoYXJlZFN0YXRlKSk7XG4gIH1cbiAgY29uc3Qgc2ZSZXN1bHRzID0gdHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAvLyBVbmRlciBgcmVkYWN0OiB0cnVlYCBlYWNoIHN1YmZsb3cncyBgZ2xvYmFsQ29udGV4dGAgaXMgaXRzIG93biBtaXJyb3JcbiAgICAvLyAoOS4yMC4wKSDigJQgc2VydmVkLCBuZXZlciB3cml0dGVuIGludG8gdGhlIHJlY29yZCAoc2VlXG4gICAgLy8gZW5naW5lL2hhbmRsZXJzL3NlcnZlZFN1YmZsb3dSZXN1bHRzLnRzKS4gUGxhaW46IHRoZSByZWNvcmRzIGFzIHRoZXkgYXJlLlxuICAgIHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzID0gc2VydmVkU3ViZmxvd1Jlc3VsdHMoc2ZSZXN1bHRzLCBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUpO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkZXJTbmFwc2hvdHMgPSBjb2xsZWN0UmVjb3JkZXJTbmFwc2hvdHMob2JzZXJ2ZXJzKTtcbiAgaWYgKHJlY29yZGVyU25hcHNob3RzLmxlbmd0aCA+IDApIHtcbiAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgfVxuXG4gIC8vIFJGQy0wMDEgQmxvY2sgOTogdGhlIGRlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgc3VyZmFjZS4gUHJlc2VudFxuICAvLyBPTkxZIHdoZW4gYSBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQgb24gdGhpcyBleGVjdXRvciDigJRcbiAgLy8gemVyby1jb3N0IGRpc2NpcGxpbmUgZm9yIGV2ZXJ5b25lIGVsc2UuXG4gIGlmIChvYnNlcnZlcnMuZGVmZXJyZWRUaWVyKSB7XG4gICAgc25hcHNob3Qub2JzZXJ2ZXJTdGF0cyA9IG9ic2VydmVycy5kZWZlcnJlZFRpZXIuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8vIFRoZSBjcmFzaC1zYWZlIHJlY29yZCdzIGFjY291bnRpbmcgKDEwLjEsIFA2KTogcHJlc2VudCBPTkxZIGZvciBhbiBleGVjdXRvciBidWlsdCB3aXRoIGEgYHNpbmtgLCBvbmNlIGEgcnVuXG4gIC8vIHN0YXJ0ZWQuXG4gIGlmIChzaW5rICE9PSB1bmRlZmluZWQpIHNuYXBzaG90LnNpbmsgPSBzaW5rO1xuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBUaGUgY29tbWl0IGxvZyBhbmQgdGhlIGZvbGQgYmFzZSBhcyBhIHJlYWRlciBtYXkgaG9sZCB0aGVtICg5LjQ0LjIpOiBhIHJlY29yZCBmcmVlemluZyBzZWFsZWQgd2hvbGVcbiAqIGlzIHNlcnZlZCBhcyBpdHNlbGY7IG9uZSBob2xkaW5nIHdoYXQgZnJlZXppbmcgY2Fubm90IHNlYWwg4oCUIGEgRGF0ZSwgYSBNYXAsIGEgYnVmZmVyIOKApiDigJQgYXMgYSBjb3B5XG4gKiBvZiBpdHMgb3BlbiBwYXRocywgdGhlIHJlYWRlcidzIG93biAoYGNhcHR1cmUvZnJlZXplLnRzIMK3IHNlcnZlUmVjb3JkYCkuIEhlcmUsIGF0IHRoZSBwdWJsaWMgZG9vcjpcbiAqIHRoZSBlbmdpbmUncyBvd24gc25hcHNob3Qgb2YgYSBsb2cgKGEgc3ViZmxvdyBtb3VudCdzKSBpcyBub3Qgc2VydmVkLCBzbyB0aGUgcnVuIHBheXMgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gc2VydmVkTG9nKHNuYXBzaG90OiBSdW50aW1lU25hcHNob3QpOiBSdW50aW1lU25hcHNob3Qge1xuICBjb25zdCB7IGluaXRpYWxTdGF0ZSB9ID0gc25hcHNob3Q7XG4gIHJldHVybiB7XG4gICAgLi4uc25hcHNob3QsXG4gICAgY29tbWl0TG9nOiBPYmplY3QuZnJlZXplKHNuYXBzaG90LmNvbW1pdExvZy5tYXAoc2VydmVSZWNvcmQpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAuLi4oaW5pdGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyB7fSA6IHsgaW5pdGlhbFN0YXRlOiBzZXJ2ZVJlY29yZChpbml0aWFsU3RhdGUpIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIENvbGxlY3QgYHRvU25hcHNob3QoKWAgYnVuZGxlcyBmcm9tIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIOKAlCBPTkUgZW50cnlcbiAqIHBlciByZWNvcmRlciBpZCwgYWNyb3NzIGFsbCBjaGFubmVscyBhbmQgYm90aCBkZWxpdmVyeSB0aWVycy5cbiAqXG4gKiBUaGUgZGVkdXBlIGlzIGxvYWQtYmVhcmluZywgbm90IHRpZGluZXNzLiBBIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBhXG4gKiBzaGFyZWQtbmFtZSBob29rIChgb25FcnJvcmAgLyBgb25QYXVzZWAgLyBgb25SZXN1bWVgIOKAlCBkZWNsYXJlZCBvbiBCT1RIXG4gKiB0aGUgc2NvcGUgYW5kIGZsb3cgaW50ZXJmYWNlcykgaXMgbGVnaXRpbWF0ZWx5IHJlZ2lzdGVyZWQgb24gQk9USCBpbmxpbmVcbiAqIGxpc3RzIGJ5IGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCwgYW5kIHRoYXQgaXMgYnkgZGVzaWduOiBlYWNoIGNoYW5uZWxcbiAqIGNhbGxzIHRoZSBob29rIHdpdGggaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuIGBNZXRyaWNSZWNvcmRlci5vblBhdXNlYCBpc1xuICogdGhlIGV2ZXJ5ZGF5IGNhc2UuIFdhbGtpbmcgdGhlIGxpc3RzIHdpdGhvdXQgYSBzaGFyZWQgYHNlZW5gIHNldCB0dXJuZWRcbiAqIHRoYXQgaW50byBhIERVUExJQ0FURUQgc25hcHNob3QgZW50cnkgKHNhbWUgaWQgdHdpY2UpLCB3aGljaCBicmVha3MgZXZlcnlcbiAqIGNvbnN1bWVyIHRoYXQgaW5kZXhlcyBgc25hcHNob3QucmVjb3JkZXJzYCBieSBpZC5cbiAqXG4gKiBPcmRlcmluZyBpcyBzY29wZSBsaXN0IOKGkiBmbG93IGxpc3Qg4oaSIGRlZmVycmVkIHRpZXIsIGFuZCB0aGUgRklSU1QgYnVuZGxlXG4gKiBmb3IgYW4gaWQgd2lucy4gQSByZWNvcmRlciB3aXRoIG5vIGB0b1NuYXBzaG90YCBuZXZlciBjbGFpbXMgYW4gaWQsIHNvIGl0XG4gKiBjYW5ub3Qgc2hhZG93IGEgc2FtZS1pZCByZWNvcmRlciB0aGF0IGRvZXMgaGF2ZSBvbmUuXG4gKlxuICogVGhlIHJvdyBpcyBSRUJVSUxUIGZpZWxkIGJ5IGZpZWxkIGJ5IHRoZSBvbmUgY29waWVyIChgcmVjb3JkZXIvc25hcHNob3QudHNcbiAqIMK3IGNvcHlCdW5kbGVgLCBzaGFyZWQgd2l0aCBgQ29tcG9zaXRlUmVjb3JkZXJgKSByYXRoZXIgdGhhbiBzcHJlYWQsIHNvIGFcbiAqIHJlY29yZGVyIGNhbm5vdCBzbXVnZ2xlIGFuIGBpZGAgb2YgaXRzIG93biBjaG9vc2luZyBpbnRvIHRoZSBzbmFwc2hvdCAodGhlXG4gKiBpZCBpcyB0aGUgZXhlY3V0b3IncywgYW5kIGNvbnN1bWVycyBpbmRleCBieSBpdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVjb3JkZXJTbmFwc2hvdHMob2JzZXJ2ZXJzOiBSdW5PYnNlcnZlcnMpOiBSZWNvcmRlclNuYXBzaG90W10ge1xuICBjb25zdCBvdXQ6IFJlY29yZGVyU25hcHNob3RbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNvbGxlY3QgPSAocjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcik6IHZvaWQgPT4ge1xuICAgIGlmICghci50b1NuYXBzaG90IHx8IHNlZW4uaGFzKHIuaWQpKSByZXR1cm47XG4gICAgc2Vlbi5hZGQoci5pZCk7XG4gICAgb3V0LnB1c2goY29weUJ1bmRsZShyLmlkLCByLnRvU25hcHNob3QoKSkpO1xuICB9O1xuICBmb3IgKGNvbnN0IHIgb2Ygb2JzZXJ2ZXJzLnNjb3BlUmVjb3JkZXJzKSBjb2xsZWN0KHIpO1xuICBmb3IgKGNvbnN0IHIgb2Ygb2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnMpIGNvbGxlY3Qocik7XG4gIGlmIChvYnNlcnZlcnMuZGVmZXJyZWRUaWVyKSB7XG4gICAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5kZWZlcnJlZFRpZXIuc2NvcGVMaXN0UmVjb3JkZXJzKCkpIGNvbGxlY3Qocik7XG4gICAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5kZWZlcnJlZFRpZXIuZmxvd0xpc3RSZWNvcmRlcnMoKSkgY29sbGVjdChyKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
* }
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
|
+
import type { AttemptContext, AttemptError, CallOptions, RetryPolicy, RunCorrelation } from '../attempt/types.js';
|
|
17
|
+
import type { FlowChart } from '../builder/types.js';
|
|
18
|
+
import type { DetachDriver, DetachHandle } from '../detach/types.js';
|
|
16
19
|
import type { ExecutionEnv } from '../engine/types.js';
|
|
17
20
|
import { StageContext } from '../memory/StageContext.js';
|
|
18
21
|
import type { CommitEvent, RedactionPolicy, RedactionReport, ScopeRecorder } from './types.js';
|
|
@@ -63,6 +66,28 @@ export declare class ScopeFacade {
|
|
|
63
66
|
* tree and this stays unset; see {@link rule}.
|
|
64
67
|
*/
|
|
65
68
|
private _localRule?;
|
|
69
|
+
/**
|
|
70
|
+
* The run's correlation (10.1), installed by the executor's composed scope factory
|
|
71
|
+
* (`RunObservers · composeScopeFactory`) — stamped LAST on every scope and emit event this facade fires,
|
|
72
|
+
* only when present, so a run without one fires byte-identical events.
|
|
73
|
+
*/
|
|
74
|
+
private _correlation?;
|
|
75
|
+
/**
|
|
76
|
+
* The attempt this facade was built for (P1b) — the runner's, read off the
|
|
77
|
+
* context at construction. A facade is ONE attempt's handle: once that
|
|
78
|
+
* attempt ends without an answer (its cap, the deadline, a cancellation, a
|
|
79
|
+
* throw), the function behind it may still be running, and anything it
|
|
80
|
+
* touches through this facade is refused ({@link refuseIfAttemptEnded}) —
|
|
81
|
+
* a write or an emit is also recorded on the stage. Absent for a stage the
|
|
82
|
+
* runner does not run: nothing is fenced, as before.
|
|
83
|
+
*/
|
|
84
|
+
private readonly _attempt?;
|
|
85
|
+
/** The run's signal, for `$attempt()` of a stage the runner does not run. */
|
|
86
|
+
private readonly _runSignal?;
|
|
87
|
+
/** `$call`s with `of > 1` in flight through this facade — a keyless touching call inside one is refused (P3). */
|
|
88
|
+
private _retryingCalls;
|
|
89
|
+
/** This attempt's observed reports, grouped into series (P2) — made on the first report. */
|
|
90
|
+
private _observedBook?;
|
|
66
91
|
constructor(context: StageContext, stageName: string, readOnlyValues?: unknown, executionEnv?: ExecutionEnv);
|
|
67
92
|
/**
|
|
68
93
|
* The redaction rule this facade decides with — the SAME object its
|
|
@@ -93,6 +118,12 @@ export declare class ScopeFacade {
|
|
|
93
118
|
* @internal
|
|
94
119
|
*/
|
|
95
120
|
useRedactionPolicy(policy: RedactionPolicy): void;
|
|
121
|
+
/**
|
|
122
|
+
* Install the run's correlation — every scope and emit event this facade fires carries it; `undefined` clears
|
|
123
|
+
* it. Engine-only (the composed scope factory calls it once per stage), like `useRedactionPolicy`.
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
useCorrelation(correlation: RunCorrelation | undefined): void;
|
|
96
127
|
/** @internal */
|
|
97
128
|
getRedactionPolicy(): RedactionPolicy | undefined;
|
|
98
129
|
/**
|
|
@@ -119,6 +150,85 @@ export declare class ScopeFacade {
|
|
|
119
150
|
* to the stage that made the write.
|
|
120
151
|
*/
|
|
121
152
|
private assertLive;
|
|
153
|
+
/**
|
|
154
|
+
* The attempt fence (P1b): this facade's attempt has ended, so whatever the
|
|
155
|
+
* abandoned function does now must not reach the stage — not its buffer, its
|
|
156
|
+
* reads, its untracked sources or a recorder. Refused; a write or an emit is
|
|
157
|
+
* recorded on the stage first (`StageSnapshot.lateWrites`, the name only),
|
|
158
|
+
* a read (`channel` undefined) is not.
|
|
159
|
+
*/
|
|
160
|
+
private refuseIfAttemptEnded;
|
|
161
|
+
/**
|
|
162
|
+
* The attempt this stage function runs in — `scope.$attempt()` (design
|
|
163
|
+
* §3.1). Its `signal` aborts when the attempt must stop (its cap, the run's
|
|
164
|
+
* deadline, a cancellation): pass it to `fetch` and SDK calls. Its
|
|
165
|
+
* `timeLeftMs()` reads the run's deadline — time is an input the record
|
|
166
|
+
* cannot replay, so with a deadline the read marks the stage's commit
|
|
167
|
+
* `untrackedSources: ['env']`, as `getEnv()` does.
|
|
168
|
+
*
|
|
169
|
+
* A stage the attempt runner does not run (no retry policy, no `timeoutMs`,
|
|
170
|
+
* no deadline) is attempt 1 of 1, with the run's signal and `Infinity` left.
|
|
171
|
+
*
|
|
172
|
+
* ```typescript
|
|
173
|
+
* const t = scope.$attempt();
|
|
174
|
+
* const res = await fetch(url, { signal: t.signal });
|
|
175
|
+
* if (t.timeLeftMs() < 1_000) scope.summary = 'partial';
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
getAttempt(): AttemptContext;
|
|
179
|
+
/**
|
|
180
|
+
* A call to an outside system, made inside this stage — `scope.$call(target, fn, policy?)` (design §3.6, P2).
|
|
181
|
+
* `fn` runs on the attempt runner under `policy` (none = ONE attempt, still recorded: a single call is evidence
|
|
182
|
+
* too), and every attempt is an `AttemptRecord` of kind `'call'` on this stage's execution-tree node and on
|
|
183
|
+
* `onAttempt` — its timing, outcome, failure category and the retry-or-stop decision, its error served under the
|
|
184
|
+
* run's redaction rule.
|
|
185
|
+
*
|
|
186
|
+
* The call lives within this stage attempt: it is capped by the time the attempt has left (its cap, the run's
|
|
187
|
+
* deadline) and `fn`'s `signal` aborts when the attempt does; once the attempt is over nothing of the call lands
|
|
188
|
+
* and no further attempt of it starts (`attempt/call.ts`). `target` is a NAME from code — never a value.
|
|
189
|
+
*
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const quote = await scope.$call('stripe.quotes.create', (t) => stripe.quotes.create(body, { signal: t.signal }),
|
|
192
|
+
* { attempts: 3, timeoutMs: 10_000, backoffMs: (n) => 500 * n });
|
|
193
|
+
* ```
|
|
194
|
+
*
|
|
195
|
+
* A call that CHANGES an outside system declares it (P3): `options.touches` names the system and
|
|
196
|
+
* `options.idempotencyKey` the key every attempt is made under (`t.idempotencyKey`) — a value from the stage's
|
|
197
|
+
* input or state, never from model output. A touching call that may retry without a key is refused here,
|
|
198
|
+
* before anything is sent; each record says what its attempt did (`effect`), and a call that ends without an answer after any attempt left the
|
|
199
|
+
* effect unknown rejects with `UnknownEffectError` — reconcile by the key, do not retry blindly.
|
|
200
|
+
*/
|
|
201
|
+
call<T>(target: string, fn: (attempt: AttemptContext) => Promise<T> | T, policy?: RetryPolicy, options?: CallOptions): Promise<T>;
|
|
202
|
+
/** `runCall` with this stage attempt as its host (`call`). */
|
|
203
|
+
private startCall;
|
|
204
|
+
/** @internal The explicit retry helper owns this state; the normal write path still owns retention/commit. */
|
|
205
|
+
writeRetryLoopState(key: string, state: {
|
|
206
|
+
readonly idempotencyKey: string;
|
|
207
|
+
}): void;
|
|
208
|
+
/** @internal Exactly the existing P3 key-retention law; operational state keeps the real key. */
|
|
209
|
+
serveRetryLoopKey(key: string): string;
|
|
210
|
+
/** @internal Loop state is durable data: never persist the thrown value, stack, cause or payload. */
|
|
211
|
+
serveRetryLoopError(error: unknown): AttemptError;
|
|
212
|
+
/** A touching call's target, its key served for the records (`RedactionRule · retainIdempotencyKey`: by name and by its sources). */
|
|
213
|
+
private callEffect;
|
|
214
|
+
/**
|
|
215
|
+
* A `$call` from an ended attempt, or from a frame that has committed: recorded by name (`lateWrites`, channel
|
|
216
|
+
* `'attempt'`) and refused — before anything reaches outside. The P1b fence first, so its message and record are
|
|
217
|
+
* the same.
|
|
218
|
+
*/
|
|
219
|
+
private refuseLateCall;
|
|
220
|
+
/**
|
|
221
|
+
* An outside attempt an adapter reported — `AttemptContext.observed` on this stage's attempt or on one of its
|
|
222
|
+
* calls' (P2). Read and validated first (a malformed report is the adapter's bug: a `TypeError`, and it never
|
|
223
|
+
* reaches the record). A report that comes after its attempt ended — the call attempt it was made through, this
|
|
224
|
+
* stage attempt, or the frame's commit — is recorded by name (`lateWrites`, channel `'attempt'`) and DROPPED,
|
|
225
|
+
* never thrown: adapters report from an SDK's own callbacks, which may fire after the stage moved on, and an
|
|
226
|
+
* observed attempt never changes control flow — in either direction. Its series opens at this stage attempt's call
|
|
227
|
+
* level: an SDK's call is a call the stage attempt made, so a report made through a `$call` is that call's sibling.
|
|
228
|
+
*/
|
|
229
|
+
private recordObserved;
|
|
230
|
+
/** This facade's attempt has ended — the P1b fence is closed. */
|
|
231
|
+
private attemptHasEnded;
|
|
122
232
|
/** Called by StageContext.commit() observer. Converts tracked writes to CommitEvent format.
|
|
123
233
|
* Errors are caught to prevent recorder issues from aborting the traversal. */
|
|
124
234
|
private _onCommitFired;
|
|
@@ -147,9 +257,9 @@ export declare class ScopeFacade {
|
|
|
147
257
|
*/
|
|
148
258
|
emitEvent(name: string, payload: unknown): void;
|
|
149
259
|
/** See `ScopeMethods.$detachAndJoinLater`. */
|
|
150
|
-
detachAndJoinLater(driver:
|
|
260
|
+
detachAndJoinLater(driver: DetachDriver, child: FlowChart, input?: unknown): DetachHandle;
|
|
151
261
|
/** See `ScopeMethods.$detachAndForget`. */
|
|
152
|
-
detachAndForget(driver:
|
|
262
|
+
detachAndForget(driver: DetachDriver, child: FlowChart, input?: unknown): void;
|
|
153
263
|
/**
|
|
154
264
|
* Build the subflowPath (outer → inner) for event enrichment.
|
|
155
265
|
*
|
|
@@ -251,8 +361,10 @@ export declare class ScopeFacade {
|
|
|
251
361
|
* Returns the execution environment — read-only infrastructure values
|
|
252
362
|
* that propagate through nested executors (like `process.env` for flowcharts).
|
|
253
363
|
*
|
|
254
|
-
* Contains: signal (abort), timeoutMs, traceId
|
|
255
|
-
*
|
|
364
|
+
* Contains: signal (abort — the run's one effective signal), timeoutMs, traceId, operationId, traceparent,
|
|
365
|
+
* deadline (epoch ms) — the run's env as admitted (`attempt/correlation.ts · admitRunEnv`: one own-field
|
|
366
|
+
* snapshot; `traceparent` is the canonical header the run's correlation carries, never the received bytes), then
|
|
367
|
+
* armed (`runner/deadline.ts · armRun`). Frozen at construction time. Inherited by subflows automatically.
|
|
256
368
|
*
|
|
257
369
|
* ```typescript
|
|
258
370
|
* const { signal, traceId } = scope.getEnv();
|
|
@@ -266,6 +378,8 @@ export declare class ScopeFacade {
|
|
|
266
378
|
/** @internal */
|
|
267
379
|
getPipelineId(): string;
|
|
268
380
|
private _invokeHook;
|
|
381
|
+
/** The event as fired: unchanged without a correlation, else with the run's correlation as its last key. */
|
|
382
|
+
private _correlated;
|
|
269
383
|
/**
|
|
270
384
|
* The scope channel's isolation: a recorder's throw becomes an `onError` on every recorder
|
|
271
385
|
* (stamped with this stage), and a throw from `onError` itself is dropped.
|