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
|
@@ -29,6 +29,8 @@ class ExecutionRuntime {
|
|
|
29
29
|
redactedStore;
|
|
30
30
|
rootStageContext;
|
|
31
31
|
executionHistory;
|
|
32
|
+
/** The run's sink, when this runtime's log writes to one — handed on to every mount (`recordFor`). */
|
|
33
|
+
recordSink;
|
|
32
34
|
/** Original root for getSnapshot() — set before resume changes rootStageContext. */
|
|
33
35
|
_snapshotRoot;
|
|
34
36
|
_initialState;
|
|
@@ -45,7 +47,7 @@ class ExecutionRuntime {
|
|
|
45
47
|
* every frame after inherits the same reference. Default: every dial at
|
|
46
48
|
* its default, no rule, no mirror.
|
|
47
49
|
*/
|
|
48
|
-
constructor(rootName, rootId, defaultValues, initialState, policy = runPolicy_js_1.DEFAULT_RUN_POLICY) {
|
|
50
|
+
constructor(rootName, rootId, defaultValues, initialState, policy = runPolicy_js_1.DEFAULT_RUN_POLICY, record) {
|
|
49
51
|
this._initialState = initialState;
|
|
50
52
|
this._defaultValues = defaultValues;
|
|
51
53
|
this.globalStore = new write_1.SharedMemory(defaultValues, initialState);
|
|
@@ -55,7 +57,9 @@ class ExecutionRuntime {
|
|
|
55
57
|
// left `defaultValues` out of every replay, so a fold could not reproduce
|
|
56
58
|
// the state a stage actually saw. `getState()` is the live context; the
|
|
57
59
|
// EventLog constructor clones it, so the base stays detached.
|
|
58
|
-
this.executionHistory =
|
|
60
|
+
this.executionHistory = openLog(this.globalStore.getState(), record);
|
|
61
|
+
if (record && this.executionHistory.address !== undefined)
|
|
62
|
+
this.recordSink = record.sink;
|
|
59
63
|
this.policy = policy;
|
|
60
64
|
this.rootStageContext = this.newRoot(rootName, rootId);
|
|
61
65
|
}
|
|
@@ -122,6 +126,29 @@ class ExecutionRuntime {
|
|
|
122
126
|
}
|
|
123
127
|
return this._foldBase;
|
|
124
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Where a mount's log writes (10.1, P6): the same sink, at this log's address plus the mount's `runtimeStageId`
|
|
131
|
+
* (`drillPath: [...parent, mount]`, the address law `RuntimeSnapshot.logAddress` states). Absent when this log
|
|
132
|
+
* writes to no sink — a mount of a plain log is plain too.
|
|
133
|
+
*/
|
|
134
|
+
recordFor(mountRuntimeStageId, meta) {
|
|
135
|
+
const address = this.executionHistory.address;
|
|
136
|
+
if (this.recordSink === undefined || address === undefined)
|
|
137
|
+
return undefined;
|
|
138
|
+
return {
|
|
139
|
+
sink: this.recordSink,
|
|
140
|
+
address: { logRunId: address.logRunId, drillPath: [...address.drillPath, mountRuntimeStageId] },
|
|
141
|
+
...(meta === undefined ? {} : { meta }),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** Tell the sink this runtime's log ended. Nothing happens without a sink; never throws. */
|
|
145
|
+
closeRecord(outcome, meta) {
|
|
146
|
+
this.executionHistory.close(outcome, meta);
|
|
147
|
+
}
|
|
148
|
+
/** Note something beside this runtime's log, in its sink (a resumed leg). Nothing without a sink; never throws. */
|
|
149
|
+
noteRecord(kind, data) {
|
|
150
|
+
this.executionHistory.note(kind, data);
|
|
151
|
+
}
|
|
125
152
|
getPipelines() {
|
|
126
153
|
const state = this.globalStore.getState();
|
|
127
154
|
return state.pipelines ? Object.keys(state.pipelines) : [];
|
|
@@ -156,12 +183,13 @@ class ExecutionRuntime {
|
|
|
156
183
|
* `stateAt`, which is the honest signal that the base did not travel with
|
|
157
184
|
* this log — a partial answer that says it is partial, never a silent one.
|
|
158
185
|
*
|
|
159
|
-
* Returns `Omit<RuntimeSnapshot, 'runId'>`: the runtime is the memory
|
|
186
|
+
* Returns `Omit<RuntimeSnapshot, 'runId' | 'correlation'>`: the runtime is the memory
|
|
160
187
|
* container and doesn't know which run it serves — `runId` is per-run
|
|
161
188
|
* executor state, stamped by `FlowchartTraverser.getSnapshot()` (which
|
|
162
189
|
* owns the run's id and already stamps it on every event). Subflows'
|
|
163
190
|
* nested runtimes deliberately have NO runId of their own (a subflow is
|
|
164
|
-
* part of the parent's logical run).
|
|
191
|
+
* part of the parent's logical run). `correlation` is the traverser's for
|
|
192
|
+
* the same reason.
|
|
165
193
|
*/
|
|
166
194
|
getSnapshot(options) {
|
|
167
195
|
const snapshotRoot = this._snapshotRoot ?? this.rootStageContext;
|
|
@@ -189,4 +217,28 @@ class ExecutionRuntime {
|
|
|
189
217
|
}
|
|
190
218
|
}
|
|
191
219
|
exports.ExecutionRuntime = ExecutionRuntime;
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUlILDJDQUF3RjtBQUl4Rix5REFBNEQ7QUFDNUQsK0RBQXlEO0FBa0h6RCxNQUFhLGdCQUFnQjtJQUNwQixXQUFXLENBQWU7SUFDakM7Ozs7Ozs7O09BUUc7SUFDSSxhQUFhLENBQWdCO0lBQzdCLGdCQUFnQixDQUFlO0lBQy9CLGdCQUFnQixDQUFXO0lBQ2xDLG9GQUFvRjtJQUM1RSxhQUFhLENBQWdCO0lBQzdCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVU7SUFDaEM7bUZBQytFO0lBQ3ZFLE1BQU0sQ0FBWTtJQUUxQiw0RUFBNEU7SUFDcEUsU0FBUyxDQUEyQjtJQUU1Qzs7Ozs7O09BTUc7SUFDSCxZQUNFLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxhQUF1QixFQUN2QixZQUFzQixFQUN0QixTQUFvQixpQ0FBa0I7UUFFdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLG9CQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsOERBQThEO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEs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bnRpbWUg4oCUIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBvbmUgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAqXG4gKiBXaXJlcyB1cCB0aGUgdGhyZWUgbWVtb3J5IHByaW1pdGl2ZXMgaW50byBhIHNpbmdsZSBjb250YWluZXI6XG4gKiAgIC0gU2hhcmVkTWVtb3J5ICh0aGUgaGVhcCDigJQgc2hhcmVkIHN0YXRlIGFjcm9zcyBhbGwgc3RhZ2VzKVxuICogICAtIFN0YWdlQ29udGV4dCAgKHRoZSBjYWxsIHN0YWNrIOKAlCBwZXItc3RhZ2UgZXhlY3V0aW9uIHRyZWUpXG4gKiAgIC0gRXZlbnRMb2cgICAgICAodGhlIHRyYW5zYWN0aW9uIGxvZyDigJQgY29tbWl0IGhpc3RvcnkgZm9yIHJlcGxheSlcbiAqXG4gKiBUaGUgZW5naW5lIChGbG93Y2hhcnRUcmF2ZXJzZXIpIHJlY2VpdmVzIHRoaXMgYXMgaXRzIHJ1bnRpbWUgcGFyYW1ldGVyLlxuICogQWZ0ZXIgZXhlY3V0aW9uLCBjb25zdW1lcnMgcXVlcnkgaXQgZm9yIHRoZSBmdWxsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgTG9nQWRkcmVzcyB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IFdyaXRlUHJvdmVuYW5jZU1vZGUgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuaW1wb3J0IHsgRXZlbnRMb2csIGZyZWV6ZVJlY29yZCwgTE9HX1BMQUNFSE9MREVSLCBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlU25hcHNob3QgfSBmcm9tICcuLi9tZW1vcnkvZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1blBvbGljeSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZIH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2ZXJTdGF0cyB9IGZyb20gJy4vRGVmZXJyZWRPYnNlcnZlclRpZXIuanMnO1xuXG4vKiogU25hcHNob3Qgb2YgYSBzaW5nbGUgcmVjb3JkZXIncyBjb2xsZWN0ZWQgZGF0YS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZXJTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFNjb3BlUmVjb3JkZXIgdHlwZSBhbmQgcGF0dGVybiBkZXNjcmlwdGlvbiAoZS5nLiwgXCJUcmFuc2xhdG9yIChLZXllZFN0b3JlKSDigJQgcGVyLXN0ZXAgdG9rZW4gdXNhZ2VcIikuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogUHJlZmVycmVkIHJlYWQtdGltZSBvcGVyYXRpb24g4oCUIGhpbnRzIHRoZSBVSSBhYm91dCB3aGljaCB2aWV3IHRvIHNob3cgcHJvbWluZW50bHkuICovXG4gIHByZWZlcnJlZE9wZXJhdGlvbj86ICd0cmFuc2xhdGUnIHwgJ2FjY3VtdWxhdGUnIHwgJ2FnZ3JlZ2F0ZSc7XG4gIGRhdGE6IHVua25vd247XG4gIC8qKlxuICAgKiBTbWFsbCBtYWNoaW5lLXJlYWRhYmxlIGZhY3RzIGFib3V0IHRoZSBCVU5ETEUg4oCUIGhvdyBpdCB3YXMgcHJvZHVjZWQsXG4gICAqIHdoaWNoIHByb2plY3Rpb24gb2YgdGhlIHJlY29yZGVyJ3MgZGF0YSBpdCBpcywgd2hhdCBpdCBkZWxpYmVyYXRlbHlcbiAgICogbGVmdCBvdXQuIFdoYXRldmVyIHRoZSByZWNvcmRlcidzIGB0b1NuYXBzaG90KClgIHB1dCBoZXJlLCBjb3BpZWRcbiAgICogdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAqXG4gICAqIFRoZSBzcGxpdCB3aXRoIGBkZXNjcmlwdGlvbmA6IGBkZXNjcmlwdGlvbmAgaXMgdGhlIHNlbnRlbmNlIGEgaHVtYW5cbiAgICogcmVhZHM7IGBtZXRhYCBpcyB3aGF0IGFuIG9mZmxpbmUgY29uc3VtZXIgQlJBTkNIRVMgb24uIEEgcmVjb3JkZXIgd2l0aFxuICAgKiBhIFwiZnVsbFwiIGFuZCBhIFwibGVhblwiIGJ1bmRsZSBzaGFwZSB0aGF0IHNheXMgc28gb25seSBpbiBpdHNcbiAgICogZGVzY3JpcHRpb24gZm9yY2VzIGV2ZXJ5IHJlYWRlciB0byBzdHJpbmctbWF0Y2ggcHJvc2Ug4oCUIGFuZCBhIHJlYWRlclxuICAgKiB0aGF0IGRvZXNuJ3QgcmVuZGVycyBhbiBlbXB0eSBwYW5lbCBpbnN0ZWFkIG9mIHNheWluZyBcInRoaXMgcmVjb3JkaW5nXG4gICAqIGNhcnJpZXMgc3RydWN0dXJlIG9ubHlcIi5cbiAgICpcbiAgICogTm90IGludGVycHJldGVkIGJ5IHRoZSBlbmdpbmUsIHNvIGtleXMgYXJlIHRoZSByZWNvcmRlcidzIHRvIGNob29zZTtcbiAgICoga2VlcCB0aGUgdmFsdWVzIEpTT04tc2FmZSwgc2luY2UgdGhpcyByaWRlcyB0aGUgc25hcHNob3Qgb3V0IHRvIGRpc2suXG4gICAqL1xuICBtZXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG5leHBvcnQgdHlwZSBSdW50aW1lU25hcHNob3QgPSB7XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgc25hcHNob3QgYmVsb25ncyB0byDigJQgdGhlIHNhbWUgYHJ1bklkYCBzdGFtcGVkIG9uIGV2ZXJ5XG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0YCAoYW5kIHRodXMgZXZlcnkgcmVjb3JkZXIgZXZlbnQpIG9mIHRoZSBydW4sIHNvIGFcbiAgICogc25hcHNob3QgY2FuIGJlIGpvaW5lZCBhZ2FpbnN0IGFuIGV2ZW50IHN0cmVhbSBvciBhbiBleHRlcm5hbFxuICAgKiBjb3JyZWxhdGlvbiB0YWJsZS4gUmVhZC1vbmx5IGJ5IGNvbnRyYWN0OiBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIChgcnVubmVyL3J1bklkLnRzYCksIG5ldmVyIGRlcml2ZWQgZnJvbSBzbmFwc2hvdCBjb250ZW50cy5cbiAgICpcbiAgICogTGlmZWN5Y2xlIChtYXRjaGVzIHRoZSBldmVudCBtb2RlbCk6IGZyZXNoIHBlciBgcnVuKClgIEFORCBwZXJcbiAgICogYHJlc3VtZSgpYCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1biwgc28gYSBwb3N0LXJlc3VtZVxuICAgKiBzbmFwc2hvdCBjYXJyaWVzIGEgRElGRkVSRU5UIHJ1bklkIHRoYW4gdGhlIHBhdXNlZCBydW4ncyBzbmFwc2hvdC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHNoYXJlZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXhlY3V0aW9uVHJlZTogU3RhZ2VTbmFwc2hvdDtcbiAgLyoqXG4gICAqIFRoZSBjb21taXQgbG9nJ3MgZm9sZCBCQVNFIOKAlCB0aGUgcnVuJ3Mgc3RhdGUgYmVmb3JlIGl0cyBmaXJzdCBjb21taXRcbiAgICogKGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YDsgb24gYSByZXN1bWUsIHRoZVxuICAgKiBjaGVja3BvaW50J3Mgc3RhdGUpLiBEZWVwbHkgZnJvemVuIGFuZCBmdWxseSBkZXRhY2hlZCBmcm9tIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIENvbW1pdCBidW5kbGVzIGFyZSBESUZGUywgc28gdGhlIGxvZyBhbG9uZSBjYW5ub3QgcmVidWlsZCBhIHZhbHVlIHRoYXRcbiAgICogd2FzIHNlZWRlZCBiZWZvcmUgdGhlIHJ1biBhbmQgb25seSBldmVyIG1lcmdlZCBhZnRlcndhcmRzLiBTaGlwcGluZyB0aGVcbiAgICogYmFzZSBXSVRIIHRoZSBsb2cgaXMgd2hhdCBtYWtlcyBhbiBvZmZsaW5lIGZvbGQg4oCUIGBzdGF0ZUF0KHNuYXBzaG90LCBpKWBcbiAgICogZnJvbSBgZm9vdHRyYWNlYCDigJQgcmVwcm9kdWNlIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy5cbiAgICpcbiAgICogT1BUSU9OQUwgQlkgVFlQRSwgYW5kIGFic2VudCBpbiBleGFjdGx5IHR3byBjYXNlcy4gQSBwbGFpbiBgZ2V0U25hcHNob3QoKWBcbiAgICogYWx3YXlzIGNhcnJpZXMgaXQsIHNvIGEgbGl2ZSBmb2xkIHJlcG9ydHMgYGJhc2lzOiAnaW5pdGlhbCtsb2cnYC4gVW5kZXJcbiAgICogYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpdCBpcyBPTUlUVEVEIOKAlCB0aGUgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW5cbiAgICogc2VlZCBhbmQgdGhlIHJlZGFjdGlvbiBwb2xpY3kgaXMgbm90IHBsdW1iZWQgaW50byB0aGUgZm9sZCDigJQgc28gYSBmb2xkIG9mXG4gICAqIGEgcmVkYWN0ZWQgc25hcHNob3QgZGVncmFkZXMgaG9uZXN0bHkgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC4gQW5kIGl0IGlzXG4gICAqIGRlY2xhcmVkIG9wdGlvbmFsIHNvIHRoYXQgY29kZSB3cml0dGVuIGFnYWluc3QgOS4xNi54IOKAlCBhIHRlc3QgZml4dHVyZSBvclxuICAgKiBhIFVJIG1vY2sgdGhhdCBDT05TVFJVQ1RTIGEgYFJ1bnRpbWVTbmFwc2hvdGAgbGl0ZXJhbCDigJQgc3RpbGwgY29tcGlsZXMuXG4gICAqIGBzdGF0ZUF0YCBoYW5kbGVzIGFic2VuY2UgYnkgc2F5aW5nIHNvLCBuZXZlciBieSBmb2xkaW5nIGEgbGllLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29tbWl0IGJ1bmRsZXMsIG9uZSBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGluIGV4ZWN1dGlvbiBvcmRlciDigJRcbiAgICogYSBERVRBQ0hFRCwgZnJvemVuIGNvcHkgb2YgdGhlIGVuZ2luZSdzIGxpdmUgbG9nIChhIHNuYXBzaG90IGlzIGEgZm9sZFxuICAgKiByZXN1bHQ6IGl0IG11c3Qgbm90IGtlZXAgY2hhbmdpbmcgdW5kZXIgdGhlIGNvbnN1bWVyIHRoYXQgaG9sZHMgaXQpLlxuICAgKiBUaGUgYnVuZGxlcyBpbnNpZGUgYXJlIHRoZSBlbmdpbmUncyBvd24gb2JqZWN0cywgaW1tdXRhYmxlIGFmdGVyIHJlY29yZC5cbiAgICovXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGlzIGxvZywgc3RhYmxlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIHJlc3VtZS4gQWJzZW50IGJlZm9yZSBiaW5kaW5nIG9yIGluIG9sZGVyIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAvKipcbiAgICogRW5jb2RpbmcgZGlzY3JpbWluYW50IGZvciBgY29tbWl0TG9nYCAoIzEzYy1CKTogYCdmdWxsJ2Ag4oCUIGV2ZXJ5IGBzZXRgXG4gICAqIGJ1bmRsZSBzdG9yZXMgdGhlIGZ1bGwgZmluYWwgdmFsdWUgKGhpc3RvcmljYWwpOyBgJ2RlbHRhJ2Ag4oCUIGJ1bmRsZXMgbWF5XG4gICAqIGNhcnJ5IGBhcHBlbmRgL2BkZWxldGVgIHRyYWNlIHZlcmJzIHdpdGggdmVyYi1xdWFsaWZpZWQgYG92ZXJ3cml0ZWBcbiAgICogcGF5bG9hZHMgKHRhaWxzKS4gT2ZmbGluZSB0b29saW5nIGtleXMgb24gdGhpcyBmaWVsZDsgYSBidW5kbGUgc3RyZWFtXG4gICAqIHdpdGhvdXQgY29udGV4dCByZW1haW5zIHNlbGYtZGVzY3JpYmluZyB2aWEgdGhlIHZlcmJzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIGRpYWwgKCNQMSkgdGhlIHJ1biBleGVjdXRlZCB1bmRlciDigJQgdGhlXG4gICAqICBvZmZsaW5lLXRvb2xpbmcgZGlzY3JpbWluYW50IGZvciBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgYXZhaWxhYmlsaXR5LiAqL1xuICB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cywgRFVBTC1LRVlFRCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKTpcbiAgICogICAtIGJ5IHN1YmZsb3cgUEFUSCAoYHN1YmZsb3dJZGAsIGUuZy4gYCdzZi1wYXknYCkg4oaSIHRoZSBMQVNUIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQpOyB0aGlzXG4gICAqICAgICBpcyB3aGF0IGBnZXRTdWJ0cmVlU25hcHNob3QocGF0aClgIGFuZCBgbGlzdFN1YmZsb3dQYXRocygpYCByZXNvbHZlLlxuICAgKiAgIC0gYnkgcGVyLWV4ZWN1dGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgIChlLmcuIGAnc2YtcGF5IzUnYCkg4oaSIFRIQVQgaXRlcmF0aW9uJ3MgcmVzdWx0LCBzb1xuICAgKiAgICAgYSBMT09QSU5HIHN1YmZsb3cgcmV0YWlucyBFVkVSWSBpdGVyYXRpb24gKG5vdCBqdXN0IHRoZSBsYXN0KS4gTG9vayB1cCBhIHNwZWNpZmljXG4gICAqICAgICBpdGVyYXRpb24gYXMgYHN1YmZsb3dSZXN1bHRzW25vZGUucnVudGltZVN0YWdlSWRdID8/IHN1YmZsb3dSZXN1bHRzW25vZGUuc3ViZmxvd0lkXWAuXG4gICAqIEJvdGgga2V5cyBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QgZm9yIGEgc2luZ2xlIG1vdW50OyBpdGVyYXRlIHdpdGggY2FyZSAoY291bnQgdmlhIHRoZVxuICAgKiBwYXRoIGtleXMg4oCUIHRob3NlIHdpdGhvdXQgYCcjJ2ApLiBUaGUgcGF1c2UgY2hlY2twb2ludCBjYXJyaWVzIG9ubHkgdGhlIHBhdGgga2V5cywgbGVhbi5cbiAgICpcbiAgICogVW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBlYWNoIGVudHJ5J3MgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGlzIHRoYXRcbiAgICogc3ViZmxvdydzIE9XTiByZWRhY3RlZCBtaXJyb3IgKDkuMjAuMCkg4oCUIHRoZSBmb2xkIG9mIGl0cyBzY3J1YmJlZCBgaGlzdG9yeWAg4oCUIHNlcnZlZCBhc1xuICAgKiBvbmUgc3Vic3RpdHV0ZWQgb2JqZWN0IHBlciBtb3VudCAoYm90aCBrZXlzIHN0aWxsIGFncmVlKSDigJQgdGhlIHdyYXBwZXIgaXMgZnJlc2ggcGVyXG4gICAqIGBnZXRTbmFwc2hvdGAgY2FsbCwgdGhlIGBnbG9iYWxDb250ZXh0YCBpbnNpZGUgaXQgaXMgdGhlIHN0YWJsZSBtaXJyb3I7IHBsYWluLCBpdCBpcyB0aGUgc3ViZmxvdydzXG4gICAqIGxpdmUgaGVhcC4gV2l0aG91dCBhIHBvbGljeSB0aGVyZSBpcyBubyBtaXJyb3IgYW5kIHRoZSB0d28gdmlld3MgYXJlIHRoZSBzYW1lIG9iamVjdHMuXG4gICAqL1xuICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KCkuICovXG4gIHJlY29yZGVycz86IFJlY29yZGVyU25hcHNob3RbXTtcbiAgLyoqXG4gICAqIERlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgKFJGQy0wMDEgQmxvY2sgOSkg4oCUIHF1ZXVlIGRlcHRoLCBkcm9wcyxcbiAgICogZmx1c2gvYnVkZ2V0IGNvdW50ZXJzLCBwZXItbGlzdGVuZXIgdGltZSBhdHRyaWJ1dGlvbiwgYW5kIHRoZVxuICAgKiB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQuIEFCU0VOVCB1bmxlc3MgYSByZWNvcmRlciB3YXMgYXR0YWNoZWRcbiAgICogd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBvbiB0aGlzIGV4ZWN1dG9yICh6ZXJvLWNvc3QgZGlzY2lwbGluZSkuXG4gICAqL1xuICBvYnNlcnZlclN0YXRzPzogT2JzZXJ2ZXJTdGF0cztcbn07XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGJ5IGV2ZXJ5IGNvbW1pdCB0aGF0XG4gICAqIHN0YWdlZCBhIHdyaXRlIChgbWVtb3J5L3JlY29yZENvbW1pdC50cyDCtyByZWNvcmRDb21taXRgKSwgd2l0aCB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzLlxuICAgKiBPbmx5IGV4aXN0cyB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IgKGBSdW5Qb2xpY3kubWlycm9yYCDigJRcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCBzZXRzIGl0IHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKS5cbiAgICogT3RoZXJ3aXNlIHVuZGVmaW5lZCBhbmQgemVybyBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpYSBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLlxuICAgKi9cbiAgcHVibGljIHJlZGFjdGVkU3RvcmU/OiBTaGFyZWRNZW1vcnk7XG4gIHB1YmxpYyByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBleGVjdXRpb25IaXN0b3J5OiBFdmVudExvZztcbiAgLyoqIE9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkg4oCUIHNldCBiZWZvcmUgcmVzdW1lIGNoYW5nZXMgcm9vdFN0YWdlQ29udGV4dC4gKi9cbiAgcHJpdmF0ZSBfc25hcHNob3RSb290PzogU3RhZ2VDb250ZXh0O1xuICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IHVua25vd247XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IHVua25vd247XG4gIC8qKiBUaGUgcnVuJ3MgcG9saWN5IChgbWVtb3J5L3J1blBvbGljeS50c2ApIOKAlCBpbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWU7XG4gICAqICBpdHMgYGNvbW1pdFZhbHVlc2AgYW5kIGB3cml0ZVByb3ZlbmFuY2VgIGFyZSB0aGUgc25hcHNob3QgZGlzY3JpbWluYW50cy4gKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeTtcblxuICAvKiogTWVtb2l6ZWQgZnJvemVuIGZvbGQgYmFzZSDigJQgc2VlIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS4gKi9cbiAgcHJpdmF0ZSBfZm9sZEJhc2U/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCwgRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlXG4gICAqICAgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZy4gSW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lIGhlcmUsIHNvXG4gICAqICAgdGhlIEZJUlNUIGNvbW1pdCAoYSBzdWJmbG93J3Mgc2VlZCwgYGhpc3RvcnlbMF1gKSBhbHJlYWR5IHJ1bnMgdW5kZXIgaXQ7XG4gICAqICAgZXZlcnkgZnJhbWUgYWZ0ZXIgaW5oZXJpdHMgdGhlIHNhbWUgcmVmZXJlbmNlLiBEZWZhdWx0OiBldmVyeSBkaWFsIGF0XG4gICAqICAgaXRzIGRlZmF1bHQsIG5vIHJ1bGUsIG5vIG1pcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgcm9vdElkOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4gICAgaW5pdGlhbFN0YXRlPzogdW5rbm93bixcbiAgICBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWSxcbiAgKSB7XG4gICAgdGhpcy5faW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzO1xuICAgIHRoaXMuZ2xvYmFsU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KGRlZmF1bHRWYWx1ZXMsIGluaXRpYWxTdGF0ZSk7XG4gICAgLy8gVGhlIGV2ZW50IGxvZydzIGZvbGQgYmFzZSBtdXN0IGJlIHRoZSBTQU1FIHN0YXRlIHRoZSBzdG9yZSBzdGFydHMgZnJvbVxuICAgIC8vIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHdoYXRcbiAgICAvLyBgU2hhcmVkTWVtb3J5YCBjb21wdXRlZCBhYm92ZS4gU2VlZGluZyB0aGUgbG9nIGZyb20gYGluaXRpYWxTdGF0ZWAgYWxvbmVcbiAgICAvLyBsZWZ0IGBkZWZhdWx0VmFsdWVzYCBvdXQgb2YgZXZlcnkgcmVwbGF5LCBzbyBhIGZvbGQgY291bGQgbm90IHJlcHJvZHVjZVxuICAgIC8vIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy4gYGdldFN0YXRlKClgIGlzIHRoZSBsaXZlIGNvbnRleHQ7IHRoZVxuICAgIC8vIEV2ZW50TG9nIGNvbnN0cnVjdG9yIGNsb25lcyBpdCwgc28gdGhlIGJhc2Ugc3RheXMgZGV0YWNoZWQuXG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gbmV3IEV2ZW50TG9nKHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0ID0gdGhpcy5uZXdSb290KHJvb3ROYW1lLCByb290SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZnJlc2ggcm9vdCBmcmFtZSBmb3IgdGhpcyBydW50aW1lIOKAlCBgZ2xvYmFsU3RvcmVgLCBgZXhlY3V0aW9uSGlzdG9yeWAsXG4gICAqIHRoZSBydW4ncyBwb2xpY3kgYW5kICh3aGVuIGtlcHQpIHRoZSBtaXJyb3IuIEFsc28gaG93IGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHJlcGxhY2VzIGEgc3ViZmxvdydzIHNlZWQgZnJhbWUgd2l0aCB0aGUgZnJhbWUgaXRzIGZpcnN0IHN0YWdlIHJ1bnMgb24uXG4gICAqL1xuICBuZXdSb290KG5hbWU6IHN0cmluZywgaWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgY29uc3Qgcm9vdCA9IG5ldyBTdGFnZUNvbnRleHQoJycsIG5hbWUsIGlkLCB0aGlzLmdsb2JhbFN0b3JlLCAnJywgdGhpcy5leGVjdXRpb25IaXN0b3J5KTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kocm9vdCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IG9uIHRoZSBDVVJSRU5UIHJvb3QgZnJhbWUg4oCUIGEgc2FtZS1leGVjdXRvclxuICAgKiByZXN1bWUsIHdob3NlIGNvbnRpbnVhdGlvbiByb290IChgbGVhZi5jcmVhdGVOZXh0YCkgaXMgYWR2YW5jZWQgYmVmb3JlXG4gICAqIHRoZSBleGVjdXRvciBidWlsZHMgdGhpcyBsZWcncyBwb2xpY3kgKGEgZnJlc2ggcnVsZSBwZXIgbGVnKS4gRXZlcnlcbiAgICogZGVzY2VuZGFudCB0YWtlcyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlcmUuXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kodGhpcy5yb290U3RhZ2VDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IG9uIGByb290YCwgYW5kIHRoZSBtaXJyb3Igc3RvcmUgd2hlbiB0aGUgcG9saWN5IGtlZXBzIG9uZS5cbiAgICogVGhlIG1pcnJvciBpcyBhIFNFUlZFRCBzdXJmYWNlLCBzbyBpdHMgc2VlZCBtdXN0IGFscmVhZHkgYmUgdGhlIHBvbGljeSdzXG4gICAqIHZpZXcgb2YgdGhlIHN0YXJ0aW5nIHN0YXRlOiBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IGBpbml0aWFsQ29udGV4dGBcbiAgICogLyBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIChvciwgb24gYSBjcm9zcy1leGVjdXRvciByZXN1bWUsIGJ5IHRoZVxuICAgKiBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCkgYW5kIGlzIG5ldmVyIHJlLXdyaXR0ZW4gd291bGQgb3RoZXJ3aXNlIHNpdFxuICAgKiBpbiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGluIHBsYWludGV4dCDigJQgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgTE9HJ3MgcGxhY2Vob2xkZXIsIHRoZSBzYW1lIHN0cmluZyB0aGUgcmVkYWN0ZWQgcGF0Y2hlcyBjYXJyeS5cbiAgICogQ3JlYXRlZCBvbmNlIHBlciBydW50aW1lIChhIHN1YmZsb3cncyBydW50aW1lIGtlZXBzIGl0cyBvd247IGl0cyBzZWVkIGlzXG4gICAqIGVtcHR5IOKAlCB0aGUgaW5wdXQgYXJyaXZlcyBhcyBhIGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxQb2xpY3kocm9vdDogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgcm9vdC51c2VQb2xpY3kodGhpcy5wb2xpY3kpO1xuICAgIGlmICghdGhpcy5wb2xpY3kubWlycm9yKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnJlZGFjdGVkU3RvcmUpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgICB0aGlzLnJlZGFjdGVkU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9kZWZhdWx0VmFsdWVzLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5fZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5faW5pdGlhbFN0YXRlLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5faW5pdGlhbFN0YXRlLFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC51c2VSZWRhY3RlZE1pcnJvcih0aGlzLnJlZGFjdGVkU3RvcmUpO1xuICB9XG5cbiAgLyoqIFByZXNlcnZlIHRoZSBjdXJyZW50IHJvb3RTdGFnZUNvbnRleHQgZm9yIHNuYXBzaG90cyBiZWZvcmUgY2hhbmdpbmcgaXQgZm9yIHJlc3VtZS4gKi9cbiAgcHJlc2VydmVTbmFwc2hvdFJvb3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zbmFwc2hvdFJvb3QpIHtcbiAgICAgIHRoaXMuX3NuYXBzaG90Um9vdCA9IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyb3plbiwgZGV0YWNoZWQgZm9sZCBiYXNlIHNlcnZlZCBhcyB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uXG4gICAqIENvbXB1dGVkIG9uY2UgKHRoZSBiYXNlIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgY29uc3RydWN0aW9uKSBhbmQgc2hhcmVkIOKAlFxuICAgKiBzYWZlIGJlY2F1c2UgaXQgaXMgZGVlcGx5IGZyb3plbiwgc28gbm8gaG9sZGVyIGNhbiBtdXRhdGUgaXQgb3IgcmVhY2ggdGhlXG4gICAqIGVuZ2luZSB0aHJvdWdoIGl0OyBhIGJhc2UgaG9sZGluZyBhIERhdGUsIE1hcCwgYnVmZmVyIOKApiAod2hhdCBmcmVlemluZ1xuICAgKiBjYW5ub3Qgc2VhbCkgaXMgc2VydmVkIGJ5IHRoZSBwdWJsaWMgc25hcHNob3QgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzXG4gICAqIChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCwgYGNhcHR1cmUvZnJlZXplLnRzIMK3IHNlcnZlUmVjb3JkYCxcbiAgICogOS40NC4yKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9sZEJhc2UoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5fZm9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB0aGlzLl9mb2xkQmFzZSA9IGZyZWV6ZVJlY29yZChiYXNlICYmIHR5cGVvZiBiYXNlID09PSAnb2JqZWN0JyA/IGJhc2UgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb2xkQmFzZTtcbiAgfVxuXG4gIGdldFBpcGVsaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIHN0YXRlLnBpcGVsaW5lcyA/IE9iamVjdC5rZXlzKHN0YXRlLnBpcGVsaW5lcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dC5zZXRPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCByZXR1cm5zIGBzaGFyZWRTdGF0ZWAgZnJvbSB0aGVcbiAgICogICBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIG9uZSB3YXMgZW5hYmxlZCkuIFRoaXMgaXMgdGhlIHNhZmUgdmlld1xuICAgKiAgIGZvciBzaGFyaW5nIHRyYWNlcyBleHRlcm5hbGx5IOKAlCBwYXN0ZSBpbnRvIGEgdmlld2VyLCBzaGlwIHRvIHN1cHBvcnQsXG4gICAqICAgZXRjLiBXaGVuIHRoZSBtaXJyb3Igd2FzIG5ldmVyIGVuYWJsZWQsIGZhbGxzIGJhY2sgdG8gcmF3IGBnbG9iYWxTdG9yZWBcbiAgICogICBhbmQgYSBkZXYtbW9kZSB3YXJuaW5nIGlzIGVtaXR0ZWQgKHNpbGVudCBpbiBwcm9kdWN0aW9uKS5cbiAgICpcbiAgICogICBEZWZhdWx0IGBmYWxzZWAgcHJlc2VydmVzIHRoZSBydW50aW1lIHZpZXcg4oCUIG5lY2Vzc2FyeSBmb3IgcGF1c2UgL1xuICAgKiAgIHJlc3VtZSAocmVzdW1wdGlvbiBtdXN0IHJlcGxheSBhZ2FpbnN0IHRoZSByZWFsIHZhbHVlcywgbm90XG4gICAqICAgJ1tSRURBQ1RFRF0nKS5cbiAgICpcbiAgICogT3RoZXIgZmllbGRzIChgZXhlY3V0aW9uVHJlZWAsIGBjb21taXRMb2dgKSBhcmUgdGhlIHNhbWUgZWl0aGVyIHdheSDigJRcbiAgICogdGhlIGNvbW1pdCBsb2cgaXMgYWxyZWFkeSByZWRhY3RlZCBhdCB3cml0ZS10aW1lLCBhbmQgdGhlIGV4ZWN1dGlvblxuICAgKiB0cmVlIG9ubHkgY2FycmllcyBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKlxuICAgKiBgaW5pdGlhbFN0YXRlYCAodGhlIGZvbGQgYmFzZSkgaXMgT01JVFRFRCB1bmRlciBgcmVkYWN0OiB0cnVlYC4gSXQgaXMgdGhlXG4gICAqIHJ1bidzIHJhdyBwcmUtcnVuIHNlZWQg4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGhcbiAgICogYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCDigJQgYW5kIGl0IG5ldmVyIHBhc3NlZCB0aHJvdWdoIGEgcmVkYWN0aW9uXG4gICAqIHBvbGljeTogdGhlIHBvbGljeSBzY3J1YnMgV1JJVEVTIGF0IHRoZSBzY29wZSBmYWNhZGUsIGFuZCB0aGUgYmFzZSB3YXNcbiAgICogbmV2ZXIgd3JpdHRlbiBieSBhIHN0YWdlLiBTZXJ2aW5nIGl0IG9uIHRoZSByZWRhY3RlZCBzdXJmYWNlIHdvdWxkIGhhbmRcbiAgICogYmFjayB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYSBzZWVkZWQgc2VjcmV0IHRoYXQgYSBsYXRlciBjb21taXQgaGFkXG4gICAqIHNjcnViYmVkLiBBIGNvbnN1bWVyIGZvbGRpbmcgd2l0aG91dCBpdCBnZXRzIGBiYXNpczogJ2xvZy1vbmx5J2AgZnJvbVxuICAgKiBgc3RhdGVBdGAsIHdoaWNoIGlzIHRoZSBob25lc3Qgc2lnbmFsIHRoYXQgdGhlIGJhc2UgZGlkIG5vdCB0cmF2ZWwgd2l0aFxuICAgKiB0aGlzIGxvZyDigJQgYSBwYXJ0aWFsIGFuc3dlciB0aGF0IHNheXMgaXQgaXMgcGFydGlhbCwgbmV2ZXIgYSBzaWxlbnQgb25lLlxuICAgKlxuICAgKiBSZXR1cm5zIGBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJz5gOiB0aGUgcnVudGltZSBpcyB0aGUgbWVtb3J5XG4gICAqIGNvbnRhaW5lciBhbmQgZG9lc24ndCBrbm93IHdoaWNoIHJ1biBpdCBzZXJ2ZXMg4oCUIGBydW5JZGAgaXMgcGVyLXJ1blxuICAgKiBleGVjdXRvciBzdGF0ZSwgc3RhbXBlZCBieSBgRmxvd2NoYXJ0VHJhdmVyc2VyLmdldFNuYXBzaG90KClgICh3aGljaFxuICAgKiBvd25zIHRoZSBydW4ncyBpZCBhbmQgYWxyZWFkeSBzdGFtcHMgaXQgb24gZXZlcnkgZXZlbnQpLiBTdWJmbG93cydcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGRlbGliZXJhdGVseSBoYXZlIE5PIHJ1bklkIG9mIHRoZWlyIG93biAoYSBzdWJmbG93IGlzXG4gICAqIHBhcnQgb2YgdGhlIHBhcmVudCdzIGxvZ2ljYWwgcnVuKS5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPiB7XG4gICAgY29uc3Qgc25hcHNob3RSb290ID0gdGhpcy5fc25hcHNob3RSb290ID8/IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICBjb25zdCB1c2VSZWRhY3RlZCA9IG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSAmJiB0aGlzLnJlZGFjdGVkU3RvcmUgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2hhcmVkU3RhdGU6IHVzZVJlZGFjdGVkID8gdGhpcy5yZWRhY3RlZFN0b3JlIS5nZXRTdGF0ZSgpIDogdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpLFxuICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3RSb290LmdldFNuYXBzaG90KCksXG4gICAgICAvLyBSRURBQ1RJT046IHRoZSBmb2xkIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuIHNlZWQgYW5kIG5vIHBvbGljeSBldmVyXG4gICAgICAvLyB0b3VjaGVkIGl0IChwb2xpY2llcyBzY3J1YiB3cml0ZXM7IG5vdGhpbmcgd3JvdGUgdGhlIGJhc2UpLiBPbWl0IGl0XG4gICAgICAvLyByYXRoZXIgdGhhbiBsZWFrIGl0IOKAlCBgc3RhdGVBdGAgZGVncmFkZXMgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC5cbiAgICAgIC4uLih1c2VSZWRhY3RlZCA/IHt9IDogeyBpbml0aWFsU3RhdGU6IHRoaXMuZ2V0Rm9sZEJhc2UoKSB9KSxcbiAgICAgIC8vIERFVEFDSEVEOiB0aGUgZW5naW5lIGtlZXBzIGl0cyBsaXZlIEV2ZW50TG9nOyB0aGUgc25hcHNob3QgZ2V0cyBhXG4gICAgICAvLyBmcm96ZW4gYXJyYXkgb2YgaXRzIG93biAoYHJlY29yZGVkKClgIGJ1aWxkcyBhIG5ldyBvbmUpLiBTZXJ2aW5nIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgYXJyYXkgYWxpYXNlZCBpdCwgc28gYSBzbmFwc2hvdCB0YWtlbiBtaWQtcnVuIGtlcHQgZ3Jvd2luZ1xuICAgICAgLy8gdW5kZXIgaXRzIGhvbGRlciBhbmQgYSBjb25zdW1lciBjb3VsZCBzcGxpY2UgdGhlIGVuZ2luZSdzIG93biBoaXN0b3J5LlxuICAgICAgLy8gVGhlIGJ1bmRsZXMgaW4gaXQgYXJlIHRoZSBsb2cncyBvd24sIGZyb3plbiBhdCBgRXZlbnRMb2cgwrcgcmVjb3JkYFxuICAgICAgLy8gKEYzKS4gVGhlIHB1YmxpYyBzbmFwc2hvdCBzZXJ2ZXMgdGhlbSAoYHJ1bm5lci9zbmFwc2hvdC50cyDCt1xuICAgICAgLy8gc2VydmVkU25hcHNob3RgLCA5LjQ0LjIpOyB0aGlzIG9uZSBpcyBhbHNvIHRoZSBlbmdpbmUncyBvd24g4oCUIGFcbiAgICAgIC8vIHN1YmZsb3cgbW91bnQgdGFrZXMgaXQgb25jZSBwZXIgbW91bnQg4oCUIHNvIHRoZSBydW4gcGF0aCBzZXJ2ZXMgbm90aGluZy5cbiAgICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZSh0aGlzLmV4ZWN1dGlvbkhpc3RvcnkucmVjb3JkZWQoKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgICAuLi4odGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dBZGRyZXNzOiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyB9KSxcbiAgICAgIGNvbW1pdFZhbHVlczogdGhpcy5wb2xpY3kuY29tbWl0VmFsdWVzLFxuICAgICAgd3JpdGVQcm92ZW5hbmNlOiB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
220
|
+
/**
|
|
221
|
+
* The runtime's log: with a record, the log that writes to the sink as it lands. A base the sink cannot carry (it
|
|
222
|
+
* must be a plain object) is the sink's loss, never the run's — the log is then the plain one, and the loss is
|
|
223
|
+
* reported to the sink like any other (`RecordSink.onFailure`), so the run's accounting names it.
|
|
224
|
+
*/
|
|
225
|
+
function openLog(base, record) {
|
|
226
|
+
if (record === undefined)
|
|
227
|
+
return new write_1.EventLog(base);
|
|
228
|
+
try {
|
|
229
|
+
return new write_1.EventLog(base, record);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
try {
|
|
233
|
+
record.sink.onFailure?.({
|
|
234
|
+
entry: { kind: 'opened', address: record.address, at: Date.now(), initialState: {} },
|
|
235
|
+
error,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// The run's own sink isolates its listener; an app's raw adapter here is told once, best effort.
|
|
240
|
+
}
|
|
241
|
+
return new write_1.EventLog(base);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUlILDJDQUF3RjtBQUt4Rix5REFBNEQ7QUFDNUQsK0RBQXlEO0FBc0p6RCxNQUFhLGdCQUFnQjtJQUNwQixXQUFXLENBQWU7SUFDakM7Ozs7Ozs7O09BUUc7SUFDSSxhQUFhLENBQWdCO0lBQzdCLGdCQUFnQixDQUFlO0lBQy9CLGdCQUFnQixDQUFXO0lBQ2xDLHNHQUFzRztJQUM5RixVQUFVLENBQWM7SUFDaEMsb0ZBQW9GO0lBQzVFLGFBQWEsQ0FBZ0I7SUFDN0IsYUFBYSxDQUFVO0lBQ3ZCLGNBQWMsQ0FBVTtJQUNoQzttRkFDK0U7SUFDdkUsTUFBTSxDQUFZO0lBRTFCLDRFQUE0RTtJQUNwRSxTQUFTLENBQTJCO0lBRTVDOzs7Ozs7T0FNRztJQUNILFlBQ0UsUUFBZ0IsRUFDaEIsTUFBYyxFQUNkLGFBQXVCLEVBQ3ZCLFlBQXNCLEVBQ3RCLFNBQW9CLGlDQUFrQixFQUN0QyxNQUFzQjtRQUV0QixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksb0JBQVksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakUseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxP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QUksQ0FBQztRQUNILE9BQU8sSUFBSSxnQkFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO2dCQUNwRixLQUFLO2FBQ04sQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGlHQUFpRztRQUNuRyxDQUFDO1FBQ0QsT0FBTyxJQUFJLGdCQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4ZWN1dGlvblJ1bnRpbWUg4oCUIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBvbmUgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAqXG4gKiBXaXJlcyB1cCB0aGUgdGhyZWUgbWVtb3J5IHByaW1pdGl2ZXMgaW50byBhIHNpbmdsZSBjb250YWluZXI6XG4gKiAgIC0gU2hhcmVkTWVtb3J5ICh0aGUgaGVhcCDigJQgc2hhcmVkIHN0YXRlIGFjcm9zcyBhbGwgc3RhZ2VzKVxuICogICAtIFN0YWdlQ29udGV4dCAgKHRoZSBjYWxsIHN0YWNrIOKAlCBwZXItc3RhZ2UgZXhlY3V0aW9uIHRyZWUpXG4gKiAgIC0gRXZlbnRMb2cgICAgICAodGhlIHRyYW5zYWN0aW9uIGxvZyDigJQgY29tbWl0IGhpc3RvcnkgZm9yIHJlcGxheSlcbiAqXG4gKiBUaGUgZW5naW5lIChGbG93Y2hhcnRUcmF2ZXJzZXIpIHJlY2VpdmVzIHRoaXMgYXMgaXRzIHJ1bnRpbWUgcGFyYW1ldGVyLlxuICogQWZ0ZXIgZXhlY3V0aW9uLCBjb25zdW1lcnMgcXVlcnkgaXQgZm9yIHRoZSBmdWxsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgTG9nQWRkcmVzcywgTG9nT3V0Y29tZSwgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZFNpbmssIFdyaXRlUHJvdmVuYW5jZU1vZGUgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuaW1wb3J0IHsgRXZlbnRMb2csIGZyZWV6ZVJlY29yZCwgTE9HX1BMQUNFSE9MREVSLCBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IFJ1bkNvcnJlbGF0aW9uIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlU25hcHNob3QgfSBmcm9tICcuLi9tZW1vcnkvZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1blBvbGljeSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZIH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2ZXJTdGF0cyB9IGZyb20gJy4vRGVmZXJyZWRPYnNlcnZlclRpZXIuanMnO1xuXG4vKiogU25hcHNob3Qgb2YgYSBzaW5nbGUgcmVjb3JkZXIncyBjb2xsZWN0ZWQgZGF0YS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZXJTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFNjb3BlUmVjb3JkZXIgdHlwZSBhbmQgcGF0dGVybiBkZXNjcmlwdGlvbiAoZS5nLiwgXCJUcmFuc2xhdG9yIChLZXllZFN0b3JlKSDigJQgcGVyLXN0ZXAgdG9rZW4gdXNhZ2VcIikuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogUHJlZmVycmVkIHJlYWQtdGltZSBvcGVyYXRpb24g4oCUIGhpbnRzIHRoZSBVSSBhYm91dCB3aGljaCB2aWV3IHRvIHNob3cgcHJvbWluZW50bHkuICovXG4gIHByZWZlcnJlZE9wZXJhdGlvbj86ICd0cmFuc2xhdGUnIHwgJ2FjY3VtdWxhdGUnIHwgJ2FnZ3JlZ2F0ZSc7XG4gIGRhdGE6IHVua25vd247XG4gIC8qKlxuICAgKiBTbWFsbCBtYWNoaW5lLXJlYWRhYmxlIGZhY3RzIGFib3V0IHRoZSBCVU5ETEUg4oCUIGhvdyBpdCB3YXMgcHJvZHVjZWQsXG4gICAqIHdoaWNoIHByb2plY3Rpb24gb2YgdGhlIHJlY29yZGVyJ3MgZGF0YSBpdCBpcywgd2hhdCBpdCBkZWxpYmVyYXRlbHlcbiAgICogbGVmdCBvdXQuIFdoYXRldmVyIHRoZSByZWNvcmRlcidzIGB0b1NuYXBzaG90KClgIHB1dCBoZXJlLCBjb3BpZWRcbiAgICogdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAqXG4gICAqIFRoZSBzcGxpdCB3aXRoIGBkZXNjcmlwdGlvbmA6IGBkZXNjcmlwdGlvbmAgaXMgdGhlIHNlbnRlbmNlIGEgaHVtYW5cbiAgICogcmVhZHM7IGBtZXRhYCBpcyB3aGF0IGFuIG9mZmxpbmUgY29uc3VtZXIgQlJBTkNIRVMgb24uIEEgcmVjb3JkZXIgd2l0aFxuICAgKiBhIFwiZnVsbFwiIGFuZCBhIFwibGVhblwiIGJ1bmRsZSBzaGFwZSB0aGF0IHNheXMgc28gb25seSBpbiBpdHNcbiAgICogZGVzY3JpcHRpb24gZm9yY2VzIGV2ZXJ5IHJlYWRlciB0byBzdHJpbmctbWF0Y2ggcHJvc2Ug4oCUIGFuZCBhIHJlYWRlclxuICAgKiB0aGF0IGRvZXNuJ3QgcmVuZGVycyBhbiBlbXB0eSBwYW5lbCBpbnN0ZWFkIG9mIHNheWluZyBcInRoaXMgcmVjb3JkaW5nXG4gICAqIGNhcnJpZXMgc3RydWN0dXJlIG9ubHlcIi5cbiAgICpcbiAgICogTm90IGludGVycHJldGVkIGJ5IHRoZSBlbmdpbmUsIHNvIGtleXMgYXJlIHRoZSByZWNvcmRlcidzIHRvIGNob29zZTtcbiAgICoga2VlcCB0aGUgdmFsdWVzIEpTT04tc2FmZSwgc2luY2UgdGhpcyByaWRlcyB0aGUgc25hcHNob3Qgb3V0IHRvIGRpc2suXG4gICAqL1xuICBtZXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG5leHBvcnQgdHlwZSBSdW50aW1lU25hcHNob3QgPSB7XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgc25hcHNob3QgYmVsb25ncyB0byDigJQgdGhlIHNhbWUgYHJ1bklkYCBzdGFtcGVkIG9uIGV2ZXJ5XG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0YCAoYW5kIHRodXMgZXZlcnkgcmVjb3JkZXIgZXZlbnQpIG9mIHRoZSBydW4sIHNvIGFcbiAgICogc25hcHNob3QgY2FuIGJlIGpvaW5lZCBhZ2FpbnN0IGFuIGV2ZW50IHN0cmVhbSBvciBhbiBleHRlcm5hbFxuICAgKiBjb3JyZWxhdGlvbiB0YWJsZS4gUmVhZC1vbmx5IGJ5IGNvbnRyYWN0OiBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIChgcnVubmVyL3J1bklkLnRzYCksIG5ldmVyIGRlcml2ZWQgZnJvbSBzbmFwc2hvdCBjb250ZW50cy5cbiAgICpcbiAgICogTGlmZWN5Y2xlIChtYXRjaGVzIHRoZSBldmVudCBtb2RlbCk6IGZyZXNoIHBlciBgcnVuKClgIEFORCBwZXJcbiAgICogYHJlc3VtZSgpYCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1biwgc28gYSBwb3N0LXJlc3VtZVxuICAgKiBzbmFwc2hvdCBjYXJyaWVzIGEgRElGRkVSRU5UIHJ1bklkIHRoYW4gdGhlIHBhdXNlZCBydW4ncyBzbmFwc2hvdC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24gKDEwLjEpIOKAlCBgZW52LnRyYWNlcGFyZW50YCwgb3IgYGVudi50cmFjZUlkYCArIGBlbnYub3BlcmF0aW9uSWRgLCByZXNvbHZlZCBvbmNlIHBlclxuICAgKiBsZWc7IHRoZSBzYW1lIGZyb3plbiBvYmplY3QgZXZlcnkgZXZlbnQgb2YgdGhlIGxlZyBjYXJyaWVzIChgVHJhdmVyc2FsQ29udGV4dC5jb3JyZWxhdGlvbmAsIGEgc2NvcGUgZXZlbnQnc1xuICAgKiBgY29ycmVsYXRpb25gKS4gTGlrZSBgcnVuSWRgLCBwZXIgbGVnOiBhIHJlc3VtZSBjYXJyaWVzIElUUyBlbnYncywgbmV2ZXIgdGhlIHBhdXNlZCBsZWcncy4gQWJzZW50IOKAlCBub1xuICAgKiBrZXkg4oCUIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uXG4gICAqL1xuICByZWFkb25seSBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3R0cmFjZWAg4oCUIHJlcHJvZHVjZSB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuXG4gICAqXG4gICAqIE9QVElPTkFMIEJZIFRZUEUsIGFuZCBhYnNlbnQgaW4gZXhhY3RseSB0d28gY2FzZXMuIEEgcGxhaW4gYGdldFNuYXBzaG90KClgXG4gICAqIGFsd2F5cyBjYXJyaWVzIGl0LCBzbyBhIGxpdmUgZm9sZCByZXBvcnRzIGBiYXNpczogJ2luaXRpYWwrbG9nJ2AuIFVuZGVyXG4gICAqIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaXQgaXMgT01JVFRFRCDigJQgdGhlIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuXG4gICAqIHNlZWQgYW5kIHRoZSByZWRhY3Rpb24gcG9saWN5IGlzIG5vdCBwbHVtYmVkIGludG8gdGhlIGZvbGQg4oCUIHNvIGEgZm9sZCBvZlxuICAgKiBhIHJlZGFjdGVkIHNuYXBzaG90IGRlZ3JhZGVzIGhvbmVzdGx5IHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuIEFuZCBpdCBpc1xuICAgKiBkZWNsYXJlZCBvcHRpb25hbCBzbyB0aGF0IGNvZGUgd3JpdHRlbiBhZ2FpbnN0IDkuMTYueCDigJQgYSB0ZXN0IGZpeHR1cmUgb3JcbiAgICogYSBVSSBtb2NrIHRoYXQgQ09OU1RSVUNUUyBhIGBSdW50aW1lU25hcHNob3RgIGxpdGVyYWwg4oCUIHN0aWxsIGNvbXBpbGVzLlxuICAgKiBgc3RhdGVBdGAgaGFuZGxlcyBhYnNlbmNlIGJ5IHNheWluZyBzbywgbmV2ZXIgYnkgZm9sZGluZyBhIGxpZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHJ1bidzIGNvbW1pdCBidW5kbGVzLCBvbmUgcGVyIGV4ZWN1dGVkIHN0YWdlLCBpbiBleGVjdXRpb24gb3JkZXIg4oCUXG4gICAqIGEgREVUQUNIRUQsIGZyb3plbiBjb3B5IG9mIHRoZSBlbmdpbmUncyBsaXZlIGxvZyAoYSBzbmFwc2hvdCBpcyBhIGZvbGRcbiAgICogcmVzdWx0OiBpdCBtdXN0IG5vdCBrZWVwIGNoYW5naW5nIHVuZGVyIHRoZSBjb25zdW1lciB0aGF0IGhvbGRzIGl0KS5cbiAgICogVGhlIGJ1bmRsZXMgaW5zaWRlIGFyZSB0aGUgZW5naW5lJ3Mgb3duIG9iamVjdHMsIGltbXV0YWJsZSBhZnRlciByZWNvcmQuXG4gICAqL1xuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdO1xuICAvKiogSWRlbnRpdHkgb2YgdGhpcyBsb2csIHN0YWJsZSBhY3Jvc3Mgc2FtZS1leGVjdXRvciByZXN1bWUuIEFic2VudCBiZWZvcmUgYmluZGluZyBvciBpbiBvbGRlciBzb3VyY2VzLiAqL1xuICByZWFkb25seSBsb2dBZGRyZXNzPzogTG9nQWRkcmVzcztcbiAgLyoqXG4gICAqIEVuY29kaW5nIGRpc2NyaW1pbmFudCBmb3IgYGNvbW1pdExvZ2AgKCMxM2MtQik6IGAnZnVsbCdgIOKAlCBldmVyeSBgc2V0YFxuICAgKiBidW5kbGUgc3RvcmVzIHRoZSBmdWxsIGZpbmFsIHZhbHVlIChoaXN0b3JpY2FsKTsgYCdkZWx0YSdgIOKAlCBidW5kbGVzIG1heVxuICAgKiBjYXJyeSBgYXBwZW5kYC9gZGVsZXRlYCB0cmFjZSB2ZXJicyB3aXRoIHZlcmItcXVhbGlmaWVkIGBvdmVyd3JpdGVgXG4gICAqIHBheWxvYWRzICh0YWlscykuIE9mZmxpbmUgdG9vbGluZyBrZXlzIG9uIHRoaXMgZmllbGQ7IGEgYnVuZGxlIHN0cmVhbVxuICAgKiB3aXRob3V0IGNvbnRleHQgcmVtYWlucyBzZWxmLWRlc2NyaWJpbmcgdmlhIHRoZSB2ZXJicyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBkaWFsICgjUDEpIHRoZSBydW4gZXhlY3V0ZWQgdW5kZXIg4oCUIHRoZVxuICAgKiAgb2ZmbGluZS10b29saW5nIGRpc2NyaW1pbmFudCBmb3IgYFRyYWNlRW50cnkucmVhZEtleXNgIGF2YWlsYWJpbGl0eS4gKi9cbiAgd3JpdGVQcm92ZW5hbmNlOiBXcml0ZVByb3ZlbmFuY2VNb2RlO1xuICAvKipcbiAgICogUGVyLXN1YmZsb3cgZXhlY3V0aW9uIHJlc3VsdHMsIERVQUwtS0VZRUQgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCk6XG4gICAqICAgLSBieSBzdWJmbG93IFBBVEggKGBzdWJmbG93SWRgLCBlLmcuIGAnc2YtcGF5J2ApIOKGkiB0aGUgTEFTVCBpdGVyYXRpb24gKGJhY2stY29tcGF0KTsgdGhpc1xuICAgKiAgICAgaXMgd2hhdCBgZ2V0U3VidHJlZVNuYXBzaG90KHBhdGgpYCBhbmQgYGxpc3RTdWJmbG93UGF0aHMoKWAgcmVzb2x2ZS5cbiAgICogICAtIGJ5IHBlci1leGVjdXRpb24gbW91bnQgYHJ1bnRpbWVTdGFnZUlkYCAoZS5nLiBgJ3NmLXBheSM1J2ApIOKGkiBUSEFUIGl0ZXJhdGlvbidzIHJlc3VsdCwgc29cbiAgICogICAgIGEgTE9PUElORyBzdWJmbG93IHJldGFpbnMgRVZFUlkgaXRlcmF0aW9uIChub3QganVzdCB0aGUgbGFzdCkuIExvb2sgdXAgYSBzcGVjaWZpY1xuICAgKiAgICAgaXRlcmF0aW9uIGFzIGBzdWJmbG93UmVzdWx0c1tub2RlLnJ1bnRpbWVTdGFnZUlkXSA/PyBzdWJmbG93UmVzdWx0c1tub2RlLnN1YmZsb3dJZF1gLlxuICAgKiBCb3RoIGtleXMgcG9pbnQgYXQgdGhlIHNhbWUgb2JqZWN0IGZvciBhIHNpbmdsZSBtb3VudDsgaXRlcmF0ZSB3aXRoIGNhcmUgKGNvdW50IHZpYSB0aGVcbiAgICogcGF0aCBrZXlzIOKAlCB0aG9zZSB3aXRob3V0IGAnIydgKS4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgY2FycmllcyBvbmx5IHRoZSBwYXRoIGtleXMsIGxlYW4uXG4gICAqXG4gICAqIFVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgZWFjaCBlbnRyeSdzIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBpcyB0aGF0XG4gICAqIHN1YmZsb3cncyBPV04gcmVkYWN0ZWQgbWlycm9yICg5LjIwLjApIOKAlCB0aGUgZm9sZCBvZiBpdHMgc2NydWJiZWQgYGhpc3RvcnlgIOKAlCBzZXJ2ZWQgYXNcbiAgICogb25lIHN1YnN0aXR1dGVkIG9iamVjdCBwZXIgbW91bnQgKGJvdGgga2V5cyBzdGlsbCBhZ3JlZSkg4oCUIHRoZSB3cmFwcGVyIGlzIGZyZXNoIHBlclxuICAgKiBgZ2V0U25hcHNob3RgIGNhbGwsIHRoZSBgZ2xvYmFsQ29udGV4dGAgaW5zaWRlIGl0IGlzIHRoZSBzdGFibGUgbWlycm9yOyBwbGFpbiwgaXQgaXMgdGhlIHN1YmZsb3cnc1xuICAgKiBsaXZlIGhlYXAuIFdpdGhvdXQgYSBwb2xpY3kgdGhlcmUgaXMgbm8gbWlycm9yIGFuZCB0aGUgdHdvIHZpZXdzIGFyZSB0aGUgc2FtZSBvYmplY3RzLlxuICAgKi9cbiAgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpLiAqL1xuICByZWNvcmRlcnM/OiBSZWNvcmRlclNuYXBzaG90W107XG4gIC8qKlxuICAgKiBEZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIChSRkMtMDAxIEJsb2NrIDkpIOKAlCBxdWV1ZSBkZXB0aCwgZHJvcHMsXG4gICAqIGZsdXNoL2J1ZGdldCBjb3VudGVycywgcGVyLWxpc3RlbmVyIHRpbWUgYXR0cmlidXRpb24sIGFuZCB0aGVcbiAgICogdGVybWluYWwtZmx1c2ggc3RyYW5kaW5nIGNvdW50LiBBQlNFTlQgdW5sZXNzIGEgcmVjb3JkZXIgd2FzIGF0dGFjaGVkXG4gICAqIHdpdGggYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgb24gdGhpcyBleGVjdXRvciAoemVyby1jb3N0IGRpc2NpcGxpbmUpLlxuICAgKi9cbiAgb2JzZXJ2ZXJTdGF0cz86IE9ic2VydmVyU3RhdHM7XG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQncyBhY2NvdW50aW5nICgxMC4xLCBQNikg4oCUIGhvdyBtYW55IGVudHJpZXMgdGhlIHJ1biBoYW5kZWQgaXRzIHNpbmsgYW5kIGhvdyBtYW55IHRoZSBzaW5rXG4gICAqIGRpZCBub3QgdGFrZS4gQUJTRU5UIHVubGVzcyB0aGUgZXhlY3V0b3Igd2FzIGJ1aWx0IHdpdGggYSBgc2lua2AgYW5kIGEgcnVuIHN0YXJ0ZWQuXG4gICAqL1xuICBzaW5rPzogUmVjb3JkU2lua1N0YXRzO1xufTtcblxuLyoqIGBnZXRTbmFwc2hvdCgpLnNpbmtgIOKAlCB3aGF0IHRoZSBydW4gaGFuZGVkIGl0cyBzaW5rLCBhbmQgd2hhdCB0aGUgc2luayBkaWQgbm90IHRha2UgKDEwLjEsIFA2KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkU2lua1N0YXRzIHtcbiAgLyoqIEVudHJpZXMgaGFuZGVkIHRvIHRoZSBhZGFwdGVyIChlYWNoIGBvcGVuZWRgLCBgY29tbWl0YCwgYG5vdGVgLCBgY2xvc2VkYCBjYWxsKS4gKi9cbiAgcmVhZG9ubHkgZW50cmllczogbnVtYmVyO1xuICAvKipcbiAgICogTG9zc2VzIOKAlCBhIG1ldGhvZCB0aGF0IHRocmV3IG9yIHJlamVjdGVkLCBhbiBlbnRyeSB0aGUgbG9nIHJlZnVzZWQgdG8gc2VuZCwgYSBgbWV0YWAgdGhlIGxvZyBjb3VsZCBub3QgY29weVxuICAgKiAodGhhdCBlbnRyeSB3YXMgc3RpbGwgc3RvcmVkLCB3aXRob3V0IGl0KSwgYW5kIGZhaWxlZCBvciB0aW1lZC1vdXQgZmx1c2hlcy4gQSByZWplY3Rpb24gdGhhdCBzZXR0bGVzIGFmdGVyIHRoZVxuICAgKiBydW4gZmluaXNoZWQgaXMgY291bnRlZCB3aGVuIGl0IHNldHRsZXMuXG4gICAqL1xuICByZWFkb25seSBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIFRoZSBsYXN0IGxvc3MncyBlcnJvciwgYXMgdGV4dC4gQWJzZW50IHdoaWxlIG5vdGhpbmcgd2FzIGxvc3QuICovXG4gIHJlYWRvbmx5IGxhc3RFcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGVyZSBhIHJ1bnRpbWUncyBsb2cgd3JpdGVzIGFzIGl0IGxhbmRzICgxMC4xLCBQNik6IHRoZSBydW4ncyBzaW5rLCB0aGUgbG9nJ3MgYWRkcmVzcyBhbmQgd2hhdCB0aGUgd3JpdGVyIHB1dHMgb25cbiAqIGl0cyBgb3BlbmVkYCBlbnRyeS4gQWJzZW50IOKGkiB0aGUgbG9nIGlzIHRoZSBwbGFpbiBvbmUtYXJndW1lbnQgYEV2ZW50TG9nYCwgYnl0ZS1pZGVudGljYWwgdG8gMTAuMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lUmVjb3JkIHtcbiAgcmVhZG9ubHkgc2luazogUmVjb3JkU2luaztcbiAgcmVhZG9ubHkgYWRkcmVzczogTG9nQWRkcmVzcztcbiAgcmVhZG9ubHkgbWV0YT86IE1ldGE7XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGJ5IGV2ZXJ5IGNvbW1pdCB0aGF0XG4gICAqIHN0YWdlZCBhIHdyaXRlIChgbWVtb3J5L3JlY29yZENvbW1pdC50cyDCtyByZWNvcmRDb21taXRgKSwgd2l0aCB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzLlxuICAgKiBPbmx5IGV4aXN0cyB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IgKGBSdW5Qb2xpY3kubWlycm9yYCDigJRcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCBzZXRzIGl0IHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKS5cbiAgICogT3RoZXJ3aXNlIHVuZGVmaW5lZCBhbmQgemVybyBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpYSBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLlxuICAgKi9cbiAgcHVibGljIHJlZGFjdGVkU3RvcmU/OiBTaGFyZWRNZW1vcnk7XG4gIHB1YmxpYyByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBleGVjdXRpb25IaXN0b3J5OiBFdmVudExvZztcbiAgLyoqIFRoZSBydW4ncyBzaW5rLCB3aGVuIHRoaXMgcnVudGltZSdzIGxvZyB3cml0ZXMgdG8gb25lIOKAlCBoYW5kZWQgb24gdG8gZXZlcnkgbW91bnQgKGByZWNvcmRGb3JgKS4gKi9cbiAgcHJpdmF0ZSByZWNvcmRTaW5rPzogUmVjb3JkU2luaztcbiAgLyoqIE9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkg4oCUIHNldCBiZWZvcmUgcmVzdW1lIGNoYW5nZXMgcm9vdFN0YWdlQ29udGV4dC4gKi9cbiAgcHJpdmF0ZSBfc25hcHNob3RSb290PzogU3RhZ2VDb250ZXh0O1xuICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IHVua25vd247XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IHVua25vd247XG4gIC8qKiBUaGUgcnVuJ3MgcG9saWN5IChgbWVtb3J5L3J1blBvbGljeS50c2ApIOKAlCBpbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWU7XG4gICAqICBpdHMgYGNvbW1pdFZhbHVlc2AgYW5kIGB3cml0ZVByb3ZlbmFuY2VgIGFyZSB0aGUgc25hcHNob3QgZGlzY3JpbWluYW50cy4gKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeTtcblxuICAvKiogTWVtb2l6ZWQgZnJvemVuIGZvbGQgYmFzZSDigJQgc2VlIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS4gKi9cbiAgcHJpdmF0ZSBfZm9sZEJhc2U/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCwgRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlXG4gICAqICAgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZy4gSW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lIGhlcmUsIHNvXG4gICAqICAgdGhlIEZJUlNUIGNvbW1pdCAoYSBzdWJmbG93J3Mgc2VlZCwgYGhpc3RvcnlbMF1gKSBhbHJlYWR5IHJ1bnMgdW5kZXIgaXQ7XG4gICAqICAgZXZlcnkgZnJhbWUgYWZ0ZXIgaW5oZXJpdHMgdGhlIHNhbWUgcmVmZXJlbmNlLiBEZWZhdWx0OiBldmVyeSBkaWFsIGF0XG4gICAqICAgaXRzIGRlZmF1bHQsIG5vIHJ1bGUsIG5vIG1pcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgcm9vdElkOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4gICAgaW5pdGlhbFN0YXRlPzogdW5rbm93bixcbiAgICBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWSxcbiAgICByZWNvcmQ/OiBSdW50aW1lUmVjb3JkLFxuICApIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICAvLyBUaGUgZXZlbnQgbG9nJ3MgZm9sZCBiYXNlIG11c3QgYmUgdGhlIFNBTUUgc3RhdGUgdGhlIHN0b3JlIHN0YXJ0cyBmcm9tXG4gICAgLy8g4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgd2hhdFxuICAgIC8vIGBTaGFyZWRNZW1vcnlgIGNvbXB1dGVkIGFib3ZlLiBTZWVkaW5nIHRoZSBsb2cgZnJvbSBgaW5pdGlhbFN0YXRlYCBhbG9uZVxuICAgIC8vIGxlZnQgYGRlZmF1bHRWYWx1ZXNgIG91dCBvZiBldmVyeSByZXBsYXksIHNvIGEgZm9sZCBjb3VsZCBub3QgcmVwcm9kdWNlXG4gICAgLy8gdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LiBgZ2V0U3RhdGUoKWAgaXMgdGhlIGxpdmUgY29udGV4dDsgdGhlXG4gICAgLy8gRXZlbnRMb2cgY29uc3RydWN0b3IgY2xvbmVzIGl0LCBzbyB0aGUgYmFzZSBzdGF5cyBkZXRhY2hlZC5cbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkgPSBvcGVuTG9nKHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSwgcmVjb3JkKTtcbiAgICBpZiAocmVjb3JkICYmIHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzICE9PSB1bmRlZmluZWQpIHRoaXMucmVjb3JkU2luayA9IHJlY29yZC5zaW5rO1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dCA9IHRoaXMubmV3Um9vdChyb290TmFtZSwgcm9vdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZyZXNoIHJvb3QgZnJhbWUgZm9yIHRoaXMgcnVudGltZSDigJQgYGdsb2JhbFN0b3JlYCwgYGV4ZWN1dGlvbkhpc3RvcnlgLFxuICAgKiB0aGUgcnVuJ3MgcG9saWN5IGFuZCAod2hlbiBrZXB0KSB0aGUgbWlycm9yLiBBbHNvIGhvdyBgU3ViZmxvd0V4ZWN1dG9yYFxuICAgKiByZXBsYWNlcyBhIHN1YmZsb3cncyBzZWVkIGZyYW1lIHdpdGggdGhlIGZyYW1lIGl0cyBmaXJzdCBzdGFnZSBydW5zIG9uLlxuICAgKi9cbiAgbmV3Um9vdChuYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIGNvbnN0IHJvb3QgPSBuZXcgU3RhZ2VDb250ZXh0KCcnLCBuYW1lLCBpZCwgdGhpcy5nbG9iYWxTdG9yZSwgJycsIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSk7XG4gICAgdGhpcy5pbnN0YWxsUG9saWN5KHJvb3QpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIHBvbGljeSBvbiB0aGUgQ1VSUkVOVCByb290IGZyYW1lIOKAlCBhIHNhbWUtZXhlY3V0b3JcbiAgICogcmVzdW1lLCB3aG9zZSBjb250aW51YXRpb24gcm9vdCAoYGxlYWYuY3JlYXRlTmV4dGApIGlzIGFkdmFuY2VkIGJlZm9yZVxuICAgKiB0aGUgZXhlY3V0b3IgYnVpbGRzIHRoaXMgbGVnJ3MgcG9saWN5IChhIGZyZXNoIHJ1bGUgcGVyIGxlZykuIEV2ZXJ5XG4gICAqIGRlc2NlbmRhbnQgdGFrZXMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZXJlLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5pbnN0YWxsUG9saWN5KHRoaXMucm9vdFN0YWdlQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvbGljeSBvbiBgcm9vdGAsIGFuZCB0aGUgbWlycm9yIHN0b3JlIHdoZW4gdGhlIHBvbGljeSBrZWVwcyBvbmUuXG4gICAqIFRoZSBtaXJyb3IgaXMgYSBTRVJWRUQgc3VyZmFjZSwgc28gaXRzIHNlZWQgbXVzdCBhbHJlYWR5IGJlIHRoZSBwb2xpY3knc1xuICAgKiB2aWV3IG9mIHRoZSBzdGFydGluZyBzdGF0ZTogYSBwb2xpY3kga2V5IHRoYXQgYXJyaXZlcyBieSBgaW5pdGlhbENvbnRleHRgXG4gICAqIC8gYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCAob3IsIG9uIGEgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lLCBieSB0aGVcbiAgICogY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWApIGFuZCBpcyBuZXZlciByZS13cml0dGVuIHdvdWxkIG90aGVyd2lzZSBzaXRcbiAgICogaW4gYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpbiBwbGFpbnRleHQg4oCUIHNvIHRoZSBzZWVkIGlzIHNjcnViYmVkXG4gICAqIHdpdGggdGhlIExPRydzIHBsYWNlaG9sZGVyLCB0aGUgc2FtZSBzdHJpbmcgdGhlIHJlZGFjdGVkIHBhdGNoZXMgY2FycnkuXG4gICAqIENyZWF0ZWQgb25jZSBwZXIgcnVudGltZSAoYSBzdWJmbG93J3MgcnVudGltZSBrZWVwcyBpdHMgb3duOyBpdHMgc2VlZCBpc1xuICAgKiBlbXB0eSDigJQgdGhlIGlucHV0IGFycml2ZXMgYXMgYSBjb21taXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsUG9saWN5KHJvb3Q6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIHJvb3QudXNlUG9saWN5KHRoaXMucG9saWN5KTtcbiAgICBpZiAoIXRoaXMucG9saWN5Lm1pcnJvcikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5yZWRhY3RlZFN0b3JlKSB7XG4gICAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgICAgdGhpcy5yZWRhY3RlZFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5fZGVmYXVsdFZhbHVlcywgTE9HX1BMQUNFSE9MREVSKSA6IHRoaXMuX2RlZmF1bHRWYWx1ZXMsXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2luaXRpYWxTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKSA6IHRoaXMuX2luaXRpYWxTdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3QudXNlUmVkYWN0ZWRNaXJyb3IodGhpcy5yZWRhY3RlZFN0b3JlKTtcbiAgfVxuXG4gIC8qKiBQcmVzZXJ2ZSB0aGUgY3VycmVudCByb290U3RhZ2VDb250ZXh0IGZvciBzbmFwc2hvdHMgYmVmb3JlIGNoYW5naW5nIGl0IGZvciByZXN1bWUuICovXG4gIHByZXNlcnZlU25hcHNob3RSb290KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc25hcHNob3RSb290KSB7XG4gICAgICB0aGlzLl9zbmFwc2hvdFJvb3QgPSB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmcm96ZW4sIGRldGFjaGVkIGZvbGQgYmFzZSBzZXJ2ZWQgYXMge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LlxuICAgKiBDb21wdXRlZCBvbmNlICh0aGUgYmFzZSBuZXZlciBjaGFuZ2VzIGFmdGVyIGNvbnN0cnVjdGlvbikgYW5kIHNoYXJlZCDigJRcbiAgICogc2FmZSBiZWNhdXNlIGl0IGlzIGRlZXBseSBmcm96ZW4sIHNvIG5vIGhvbGRlciBjYW4gbXV0YXRlIGl0IG9yIHJlYWNoIHRoZVxuICAgKiBlbmdpbmUgdGhyb3VnaCBpdDsgYSBiYXNlIGhvbGRpbmcgYSBEYXRlLCBNYXAsIGJ1ZmZlciDigKYgKHdoYXQgZnJlZXppbmdcbiAgICogY2Fubm90IHNlYWwpIGlzIHNlcnZlZCBieSB0aGUgcHVibGljIHNuYXBzaG90IGFzIGEgY29weSBvZiBpdHMgb3BlbiBwYXRoc1xuICAgKiAoYHJ1bm5lci9zbmFwc2hvdC50cyDCtyBzZXJ2ZWRTbmFwc2hvdGAsIGBjYXB0dXJlL2ZyZWV6ZS50cyDCtyBzZXJ2ZVJlY29yZGAsXG4gICAqIDkuNDQuMikuXG4gICAqL1xuICBwcml2YXRlIGdldEZvbGRCYXNlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuX2ZvbGRCYXNlKSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5leGVjdXRpb25IaXN0b3J5LmdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgdGhpcy5fZm9sZEJhc2UgPSBmcmVlemVSZWNvcmQoYmFzZSAmJiB0eXBlb2YgYmFzZSA9PT0gJ29iamVjdCcgPyBiYXNlIDoge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZm9sZEJhc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgYSBtb3VudCdzIGxvZyB3cml0ZXMgKDEwLjEsIFA2KTogdGhlIHNhbWUgc2luaywgYXQgdGhpcyBsb2cncyBhZGRyZXNzIHBsdXMgdGhlIG1vdW50J3MgYHJ1bnRpbWVTdGFnZUlkYFxuICAgKiAoYGRyaWxsUGF0aDogWy4uLnBhcmVudCwgbW91bnRdYCwgdGhlIGFkZHJlc3MgbGF3IGBSdW50aW1lU25hcHNob3QubG9nQWRkcmVzc2Agc3RhdGVzKS4gQWJzZW50IHdoZW4gdGhpcyBsb2dcbiAgICogd3JpdGVzIHRvIG5vIHNpbmsg4oCUIGEgbW91bnQgb2YgYSBwbGFpbiBsb2cgaXMgcGxhaW4gdG9vLlxuICAgKi9cbiAgcmVjb3JkRm9yKG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZywgbWV0YT86IE1ldGEpOiBSdW50aW1lUmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3M7XG4gICAgaWYgKHRoaXMucmVjb3JkU2luayA9PT0gdW5kZWZpbmVkIHx8IGFkZHJlc3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2luazogdGhpcy5yZWNvcmRTaW5rLFxuICAgICAgYWRkcmVzczogeyBsb2dSdW5JZDogYWRkcmVzcy5sb2dSdW5JZCwgZHJpbGxQYXRoOiBbLi4uYWRkcmVzcy5kcmlsbFBhdGgsIG1vdW50UnVudGltZVN0YWdlSWRdIH0sXG4gICAgICAuLi4obWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGEgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUZWxsIHRoZSBzaW5rIHRoaXMgcnVudGltZSdzIGxvZyBlbmRlZC4gTm90aGluZyBoYXBwZW5zIHdpdGhvdXQgYSBzaW5rOyBuZXZlciB0aHJvd3MuICovXG4gIGNsb3NlUmVjb3JkKG91dGNvbWU6IExvZ091dGNvbWUsIG1ldGE/OiBNZXRhKTogdm9pZCB7XG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5LmNsb3NlKG91dGNvbWUsIG1ldGEpO1xuICB9XG5cbiAgLyoqIE5vdGUgc29tZXRoaW5nIGJlc2lkZSB0aGlzIHJ1bnRpbWUncyBsb2csIGluIGl0cyBzaW5rIChhIHJlc3VtZWQgbGVnKS4gTm90aGluZyB3aXRob3V0IGEgc2luazsgbmV2ZXIgdGhyb3dzLiAqL1xuICBub3RlUmVjb3JkKGtpbmQ6IHN0cmluZywgZGF0YTogTWV0YSk6IHZvaWQge1xuICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5ub3RlKGtpbmQsIGRhdGEpO1xuICB9XG5cbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gc3RhdGUucGlwZWxpbmVzID8gT2JqZWN0LmtleXMoc3RhdGUucGlwZWxpbmVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIHJldHVybnMgYHNoYXJlZFN0YXRlYCBmcm9tIHRoZVxuICAgKiAgIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgb25lIHdhcyBlbmFibGVkKS4gVGhpcyBpcyB0aGUgc2FmZSB2aWV3XG4gICAqICAgZm9yIHNoYXJpbmcgdHJhY2VzIGV4dGVybmFsbHkg4oCUIHBhc3RlIGludG8gYSB2aWV3ZXIsIHNoaXAgdG8gc3VwcG9ydCxcbiAgICogICBldGMuIFdoZW4gdGhlIG1pcnJvciB3YXMgbmV2ZXIgZW5hYmxlZCwgZmFsbHMgYmFjayB0byByYXcgYGdsb2JhbFN0b3JlYFxuICAgKiAgIGFuZCBhIGRldi1tb2RlIHdhcm5pbmcgaXMgZW1pdHRlZCAoc2lsZW50IGluIHByb2R1Y3Rpb24pLlxuICAgKlxuICAgKiAgIERlZmF1bHQgYGZhbHNlYCBwcmVzZXJ2ZXMgdGhlIHJ1bnRpbWUgdmlldyDigJQgbmVjZXNzYXJ5IGZvciBwYXVzZSAvXG4gICAqICAgcmVzdW1lIChyZXN1bXB0aW9uIG11c3QgcmVwbGF5IGFnYWluc3QgdGhlIHJlYWwgdmFsdWVzLCBub3RcbiAgICogICAnW1JFREFDVEVEXScpLlxuICAgKlxuICAgKiBPdGhlciBmaWVsZHMgKGBleGVjdXRpb25UcmVlYCwgYGNvbW1pdExvZ2ApIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IOKAlFxuICAgKiB0aGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUsIGFuZCB0aGUgZXhlY3V0aW9uXG4gICAqIHRyZWUgb25seSBjYXJyaWVzIHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqXG4gICAqIGBpbml0aWFsU3RhdGVgICh0aGUgZm9sZCBiYXNlKSBpcyBPTUlUVEVEIHVuZGVyIGByZWRhY3Q6IHRydWVgLiBJdCBpcyB0aGVcbiAgICogcnVuJ3MgcmF3IHByZS1ydW4gc2VlZCDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aFxuICAgKiBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIOKAlCBhbmQgaXQgbmV2ZXIgcGFzc2VkIHRocm91Z2ggYSByZWRhY3Rpb25cbiAgICogcG9saWN5OiB0aGUgcG9saWN5IHNjcnVicyBXUklURVMgYXQgdGhlIHNjb3BlIGZhY2FkZSwgYW5kIHRoZSBiYXNlIHdhc1xuICAgKiBuZXZlciB3cml0dGVuIGJ5IGEgc3RhZ2UuIFNlcnZpbmcgaXQgb24gdGhlIHJlZGFjdGVkIHN1cmZhY2Ugd291bGQgaGFuZFxuICAgKiBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBhIHNlZWRlZCBzZWNyZXQgdGhhdCBhIGxhdGVyIGNvbW1pdCBoYWRcbiAgICogc2NydWJiZWQuIEEgY29uc3VtZXIgZm9sZGluZyB3aXRob3V0IGl0IGdldHMgYGJhc2lzOiAnbG9nLW9ubHknYCBmcm9tXG4gICAqIGBzdGF0ZUF0YCwgd2hpY2ggaXMgdGhlIGhvbmVzdCBzaWduYWwgdGhhdCB0aGUgYmFzZSBkaWQgbm90IHRyYXZlbCB3aXRoXG4gICAqIHRoaXMgbG9nIOKAlCBhIHBhcnRpYWwgYW5zd2VyIHRoYXQgc2F5cyBpdCBpcyBwYXJ0aWFsLCBuZXZlciBhIHNpbGVudCBvbmUuXG4gICAqXG4gICAqIFJldHVybnMgYE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnIHwgJ2NvcnJlbGF0aW9uJz5gOiB0aGUgcnVudGltZSBpcyB0aGUgbWVtb3J5XG4gICAqIGNvbnRhaW5lciBhbmQgZG9lc24ndCBrbm93IHdoaWNoIHJ1biBpdCBzZXJ2ZXMg4oCUIGBydW5JZGAgaXMgcGVyLXJ1blxuICAgKiBleGVjdXRvciBzdGF0ZSwgc3RhbXBlZCBieSBgRmxvd2NoYXJ0VHJhdmVyc2VyLmdldFNuYXBzaG90KClgICh3aGljaFxuICAgKiBvd25zIHRoZSBydW4ncyBpZCBhbmQgYWxyZWFkeSBzdGFtcHMgaXQgb24gZXZlcnkgZXZlbnQpLiBTdWJmbG93cydcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGRlbGliZXJhdGVseSBoYXZlIE5PIHJ1bklkIG9mIHRoZWlyIG93biAoYSBzdWJmbG93IGlzXG4gICAqIHBhcnQgb2YgdGhlIHBhcmVudCdzIGxvZ2ljYWwgcnVuKS4gYGNvcnJlbGF0aW9uYCBpcyB0aGUgdHJhdmVyc2VyJ3MgZm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbi5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnIHwgJ2NvcnJlbGF0aW9uJz4ge1xuICAgIGNvbnN0IHNuYXBzaG90Um9vdCA9IHRoaXMuX3NuYXBzaG90Um9vdCA/PyB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgdXNlUmVkYWN0ZWQgPSBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUgJiYgdGhpcy5yZWRhY3RlZFN0b3JlICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZFN0YXRlOiB1c2VSZWRhY3RlZCA/IHRoaXMucmVkYWN0ZWRTdG9yZSEuZ2V0U3RhdGUoKSA6IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90Um9vdC5nZXRTbmFwc2hvdCgpLFxuICAgICAgLy8gUkVEQUNUSU9OOiB0aGUgZm9sZCBiYXNlIGlzIHRoZSByYXcgcHJlLXJ1biBzZWVkIGFuZCBubyBwb2xpY3kgZXZlclxuICAgICAgLy8gdG91Y2hlZCBpdCAocG9saWNpZXMgc2NydWIgd3JpdGVzOyBub3RoaW5nIHdyb3RlIHRoZSBiYXNlKS4gT21pdCBpdFxuICAgICAgLy8gcmF0aGVyIHRoYW4gbGVhayBpdCDigJQgYHN0YXRlQXRgIGRlZ3JhZGVzIHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuXG4gICAgICAuLi4odXNlUmVkYWN0ZWQgPyB7fSA6IHsgaW5pdGlhbFN0YXRlOiB0aGlzLmdldEZvbGRCYXNlKCkgfSksXG4gICAgICAvLyBERVRBQ0hFRDogdGhlIGVuZ2luZSBrZWVwcyBpdHMgbGl2ZSBFdmVudExvZzsgdGhlIHNuYXBzaG90IGdldHMgYVxuICAgICAgLy8gZnJvemVuIGFycmF5IG9mIGl0cyBvd24gKGByZWNvcmRlZCgpYCBidWlsZHMgYSBuZXcgb25lKS4gU2VydmluZyB0aGVcbiAgICAgIC8vIGludGVybmFsIGFycmF5IGFsaWFzZWQgaXQsIHNvIGEgc25hcHNob3QgdGFrZW4gbWlkLXJ1biBrZXB0IGdyb3dpbmdcbiAgICAgIC8vIHVuZGVyIGl0cyBob2xkZXIgYW5kIGEgY29uc3VtZXIgY291bGQgc3BsaWNlIHRoZSBlbmdpbmUncyBvd24gaGlzdG9yeS5cbiAgICAgIC8vIFRoZSBidW5kbGVzIGluIGl0IGFyZSB0aGUgbG9nJ3Mgb3duLCBmcm96ZW4gYXQgYEV2ZW50TG9nIMK3IHJlY29yZGBcbiAgICAgIC8vIChGMykuIFRoZSBwdWJsaWMgc25hcHNob3Qgc2VydmVzIHRoZW0gKGBydW5uZXIvc25hcHNob3QudHMgwrdcbiAgICAgIC8vIHNlcnZlZFNuYXBzaG90YCwgOS40NC4yKTsgdGhpcyBvbmUgaXMgYWxzbyB0aGUgZW5naW5lJ3Mgb3duIOKAlCBhXG4gICAgICAvLyBzdWJmbG93IG1vdW50IHRha2VzIGl0IG9uY2UgcGVyIG1vdW50IOKAlCBzbyB0aGUgcnVuIHBhdGggc2VydmVzIG5vdGhpbmcuXG4gICAgICBjb21taXRMb2c6IE9iamVjdC5mcmVlemUodGhpcy5leGVjdXRpb25IaXN0b3J5LnJlY29yZGVkKCkpIGFzIENvbW1pdEJ1bmRsZVtdLFxuICAgICAgLi4uKHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbG9nQWRkcmVzczogdGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgfSksXG4gICAgICBjb21taXRWYWx1ZXM6IHRoaXMucG9saWN5LmNvbW1pdFZhbHVlcyxcbiAgICAgIHdyaXRlUHJvdmVuYW5jZTogdGhpcy5wb2xpY3kud3JpdGVQcm92ZW5hbmNlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSdzIGxvZzogd2l0aCBhIHJlY29yZCwgdGhlIGxvZyB0aGF0IHdyaXRlcyB0byB0aGUgc2luayBhcyBpdCBsYW5kcy4gQSBiYXNlIHRoZSBzaW5rIGNhbm5vdCBjYXJyeSAoaXRcbiAqIG11c3QgYmUgYSBwbGFpbiBvYmplY3QpIGlzIHRoZSBzaW5rJ3MgbG9zcywgbmV2ZXIgdGhlIHJ1bidzIOKAlCB0aGUgbG9nIGlzIHRoZW4gdGhlIHBsYWluIG9uZSwgYW5kIHRoZSBsb3NzIGlzXG4gKiByZXBvcnRlZCB0byB0aGUgc2luayBsaWtlIGFueSBvdGhlciAoYFJlY29yZFNpbmsub25GYWlsdXJlYCksIHNvIHRoZSBydW4ncyBhY2NvdW50aW5nIG5hbWVzIGl0LlxuICovXG5mdW5jdGlvbiBvcGVuTG9nKGJhc2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWNvcmQ6IFJ1bnRpbWVSZWNvcmQgfCB1bmRlZmluZWQpOiBFdmVudExvZyB7XG4gIGlmIChyZWNvcmQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyBFdmVudExvZyhiYXNlKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEV2ZW50TG9nKGJhc2UsIHJlY29yZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZC5zaW5rLm9uRmFpbHVyZT8uKHtcbiAgICAgICAgZW50cnk6IHsga2luZDogJ29wZW5lZCcsIGFkZHJlc3M6IHJlY29yZC5hZGRyZXNzLCBhdDogRGF0ZS5ub3coKSwgaW5pdGlhbFN0YXRlOiB7fSB9LFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHJ1bidzIG93biBzaW5rIGlzb2xhdGVzIGl0cyBsaXN0ZW5lcjsgYW4gYXBwJ3MgcmF3IGFkYXB0ZXIgaGVyZSBpcyB0b2xkIG9uY2UsIGJlc3QgZWZmb3J0LlxuICAgIH1cbiAgICByZXR1cm4gbmV3IEV2ZW50TG9nKGJhc2UpO1xuICB9XG59XG4iXX0=
|