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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* attempt/types.ts — the attempt vocabulary: ONE record shape for every try the library runs.
|
|
3
|
+
*
|
|
4
|
+
* A retry is a loop, and every pass of it is an `AttemptRecord`: when it started, how long it took, how it
|
|
5
|
+
* ended, its failure category, and the retry-or-stop decision that followed it — a `DecisionEvidence`, the
|
|
6
|
+
* shape `decide()` produces, so a reader walks a retry exactly as it walks a decider (design
|
|
7
|
+
* docs/design/2026-10-time-and-failure-evidence.md, §3.1, §3.8, §4).
|
|
8
|
+
*
|
|
9
|
+
* WHERE it lives: on the execution tree (`StageSnapshot.attempts` / `attemptSummary`), on the `onAttempt`
|
|
10
|
+
* hook, and in recorders' stores — never on the commit bundle, so every log stays byte-identical (Q1).
|
|
11
|
+
*
|
|
12
|
+
* A LEAF (L0, scripts/layering.config.cjs): the frame's snapshot type (`memory/frameTypes.ts`, L4) names
|
|
13
|
+
* `AttemptRecord`, so this file imports only other leaves' types.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC90eXBlcy50cyDigJQgdGhlIGF0dGVtcHQgdm9jYWJ1bGFyeTogT05FIHJlY29yZCBzaGFwZSBmb3IgZXZlcnkgdHJ5IHRoZSBsaWJyYXJ5IHJ1bnMuXG4gKlxuICogQSByZXRyeSBpcyBhIGxvb3AsIGFuZCBldmVyeSBwYXNzIG9mIGl0IGlzIGFuIGBBdHRlbXB0UmVjb3JkYDogd2hlbiBpdCBzdGFydGVkLCBob3cgbG9uZyBpdCB0b29rLCBob3cgaXRcbiAqIGVuZGVkLCBpdHMgZmFpbHVyZSBjYXRlZ29yeSwgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgZm9sbG93ZWQgaXQg4oCUIGEgYERlY2lzaW9uRXZpZGVuY2VgLCB0aGVcbiAqIHNoYXBlIGBkZWNpZGUoKWAgcHJvZHVjZXMsIHNvIGEgcmVhZGVyIHdhbGtzIGEgcmV0cnkgZXhhY3RseSBhcyBpdCB3YWxrcyBhIGRlY2lkZXIgKGRlc2lnblxuICogZG9jcy9kZXNpZ24vMjAyNi0xMC10aW1lLWFuZC1mYWlsdXJlLWV2aWRlbmNlLm1kLCDCpzMuMSwgwqczLjgsIMKnNCkuXG4gKlxuICogV0hFUkUgaXQgbGl2ZXM6IG9uIHRoZSBleGVjdXRpb24gdHJlZSAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNgIC8gYGF0dGVtcHRTdW1tYXJ5YCksIG9uIHRoZSBgb25BdHRlbXB0YFxuICogaG9vaywgYW5kIGluIHJlY29yZGVycycgc3RvcmVzIOKAlCBuZXZlciBvbiB0aGUgY29tbWl0IGJ1bmRsZSwgc28gZXZlcnkgbG9nIHN0YXlzIGJ5dGUtaWRlbnRpY2FsIChRMSkuXG4gKlxuICogQSBMRUFGIChMMCwgc2NyaXB0cy9sYXllcmluZy5jb25maWcuY2pzKTogdGhlIGZyYW1lJ3Mgc25hcHNob3QgdHlwZSAoYG1lbW9yeS9mcmFtZVR5cGVzLnRzYCwgTDQpIG5hbWVzXG4gKiBgQXR0ZW1wdFJlY29yZGAsIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG9ubHkgb3RoZXIgbGVhdmVzJyB0eXBlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERlY2lzaW9uRXZpZGVuY2UgfSBmcm9tICcuLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5TG9vcENhbGwgfSBmcm9tICcuL3JldHJ5TG9vcFR5cGVzLmpzJztcblxuLyoqXG4gKiBEZWNsYXJhdGl2ZSBwZXItc3RhZ2UgcmV0cnkgcG9saWN5IOKAlCB0aGUgcG9saWN5IHRoZSBhdHRlbXB0IHJ1bm5lciBydW5zIChgQXR0ZW1wdFBvbGljeWAgaW4gdGhlIGRlc2lnbiBpc1xuICogdGhpcyBvbmUgdHlwZSwgdW5kZXIgdGhpcyBvbmUgbmFtZSkuXG4gKlxuICogV0hZIHRoaXMgZXhpc3RzOiBhIHJldHJ5IGhhbmQtcm9sbGVkIGluc2lkZSBhIHN0YWdlIGZ1bmN0aW9uIGlzIGludmlzaWJsZSB0b1xuICogdGhlIHRyYWNlLiBUaGUgc3RhZ2Ugc2hvd3Mgb25lIGV4ZWN1dGlvbiwgdGhlIGNvbW1pdCBsb2cgc2hvd3Mgb25lIGJ1bmRsZSxcbiAqIGFuZCB0aGUgdHdvIGZhaWxlZCBjYWxscyB0aGF0IHByZWNlZGVkIHRoZSBzdWNjZXNzZnVsIG9uZSBsZWZ0IG5vIG1hcmtcbiAqIGFueXdoZXJlIOKAlCBhbiB1bmV4cGxhaW5lZCBiZWhhdmlvdXIgaW4gYSBsaWJyYXJ5IHdob3NlIHdob2xlIHRoZXNpcyBpcyB0aGF0XG4gKiBub3RoaW5nIGludmlzaWJsZSBoYXBwZW5zLiBEZWNsYXJlZCBoZXJlIGluc3RlYWQsIGV2ZXJ5IGF0dGVtcHQgaXMgcGFydCBvZlxuICogdGhlIHJlY29yZDogZWFjaCBhdHRlbXB0IGZpcmVzIGBGbG93UmVjb3JkZXIub25BdHRlbXB0YCB3aXRoIGl0c1xuICoge0BsaW5rIEF0dGVtcHRSZWNvcmR9LCBlYWNoIGZhaWxlZCBhdHRlbXB0IHRoYXQgaXMgcmV0cmllZCBhbHNvIGZpcmVzXG4gKiBgRmxvd1JlY29yZGVyLm9uU3RhZ2VSZXRyeWAsIGFuZCB0aGUgc3RhZ2UncyBleGVjdXRpb24tdHJlZSBub2RlIGNhcnJpZXNcbiAqIGBhdHRlbXB0c2AgYW5kIGBhdHRlbXB0U3VtbWFyeWAuXG4gKlxuICogQSBQT0xJQ1ksIG5vdCBhIHN0YWdlIGtpbmQg4oCUIGByZXRyeWAgc2l0cyBvbiBhIG5vcm1hbCBzdGFnZSB0aGUgd2F5XG4gKiBgaXNQYXVzYWJsZWAgLyBgaXNTdHJlYW1pbmdgIGRvLiBUaGUgc2VyaWFsaXplZCBub2RlIGB0eXBlYCBpcyB1bmNoYW5nZWQgYW5kXG4gKiBldmVyeSBleGlzdGluZyBjb25zdW1lciBrZWVwcyByZW5kZXJpbmcgdGhlIHN0YWdlIGV4YWN0bHkgYXMgYmVmb3JlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZmxvd0NoYXJ0PFN0YXRlPignRmV0Y2ggdXNlcicsIGZldGNoRm4sICdmZXRjaC11c2VyJylcbiAqICAgLnJldHJ5KHsgYXR0ZW1wdHM6IDMsIGJhY2tvZmZNczogKG4pID0+IDEwMCAqIDIgKiogKG4gLSAxKSB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlQb2xpY3kge1xuICAvKipcbiAgICogSG93IG1hbnkgdGltZXMgdGhlIHN0YWdlIGZ1bmN0aW9uIG1heSBydW4gaW4gdG90YWwsIElOQ0xVRElORyB0aGUgZmlyc3RcbiAgICogcnVuLiBNdXN0IGJlIGFuIGludGVnZXIgPj0gMTsgYDFgIG1lYW5zIFwibm8gcmV0cnlcIiAoYSBkZWNsYXJlZCBuby1vcCxcbiAgICogYWNjZXB0ZWQgc28gYSBwb2xpY3kgY2FuIGJlIHN3aXRjaGVkIG9mZiB3aXRob3V0IGRlbGV0aW5nIGl0IOKAlCBzdWNoIGFcbiAgICogc3RhZ2UgcnVucyBvbmNlIGFuZCByZWNvcmRzIG5vIGF0dGVtcHRzKS5cbiAgICovXG4gIGF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSB0aGUgTkVYVCBhdHRlbXB0LiBFaXRoZXIgYSBmaXhlZCBudW1iZXIgb2ZcbiAgICogbWlsbGlzZWNvbmRzLCBvciBhIGZ1bmN0aW9uIG9mIHRoZSBhdHRlbXB0IHRoYXQganVzdCBGQUlMRUQgKDEtYmFzZWQpIGFuZFxuICAgKiBpdHMgZXJyb3IsIHJldHVybmluZyBtaWxsaXNlY29uZHMg4oCUIGAobikgPT4gMTAwICogMiAqKiAobiAtIDEpYCBpc1xuICAgKiBleHBvbmVudGlhbCBiYWNrb2ZmOyBgKG4sIGVycm9yKSA9PiBzdGF0ZWRXYWl0TXMoZXJyb3IpID8/IDEwMCAqIG5gIGhvbm91cnNcbiAgICogYSB3YWl0IHRoZSBvdXRzaWRlIHN5c3RlbSBzdGF0ZWQgKGEgYFJldHJ5LUFmdGVyYCkgd2l0aG91dCB0aGUgZW5naW5lXG4gICAqIHBhcnNpbmcgYW55dGhpbmcuIEEgb25lLWFyZ3VtZW50IGZ1bmN0aW9uIGlzIHVuY2hhbmdlZC4gT21pdHRlZCAob3IgYVxuICAgKiBub24tZmluaXRlIC8gbmVnYXRpdmUgcmVzdWx0LCBvciBhIHRocm93KSBtZWFucyBubyB3YWl0LlxuICAgKlxuICAgKiBUaGUgd2FpdCBpcyBhIHBsYWluIGF3YWl0ZWQgdGltZXIgdGhhdCBpcyBDQU5DRUxMRUQgYnkgdGhlIHJ1bidzXG4gICAqIGBBYm9ydFNpZ25hbGAuIEl0IGlzIG5vdCBhIHBhdXNlOiBhIGNoYXJ0IGNhbm5vdCBiZSBjaGVja3BvaW50ZWQgaW4gdGhlXG4gICAqIG1pZGRsZSBvZiBhIGJhY2tvZmYuIFVuZGVyIGEgcnVuIGRlYWRsaW5lLCBhIHdhaXQgdGhhdCB3b3VsZCBvdXRsYXN0IGl0IGlzXG4gICAqIG5ldmVyIHN0YXJ0ZWQ6IHRoZSBzZXJpZXMgc3RvcHMgYG5vLXRpbWUtbGVmdGAuXG4gICAqL1xuICBiYWNrb2ZmTXM/OiBudW1iZXIgfCAoKGF0dGVtcHQ6IG51bWJlciwgZXJyb3I6IHVua25vd24pID0+IG51bWJlcik7XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBvbmUgd2FpdCBtYXkgbGFzdCwgaW4gbWlsbGlzZWNvbmRzIOKAlCBhIGZpbml0ZSBudW1iZXIgPj0gMC4gVGhlXG4gICAqIHJ1bm5lciBFTkZPUkNFUyBpdDogZXZlcnkgd2FpdCBpcyBgbWluKGJhY2tvZmZNcydzIGFuc3dlciwgbWF4QmFja29mZk1zKWAsXG4gICAqIHdoYXRldmVyIHRoZSBlcnJvciBzdGF0ZWQsIHNvIHRoZSBkZWNsYXJhdGlvbiBjYW5ub3QgbGllLlxuICAgKlxuICAgKiBJdCBpcyB3aGF0IG1ha2VzIGEgRlVOQ1RJT04gYmFja29mZiBjb3VudGFibGUgYmVmb3JlIHRoZSBydW4uIEEgZnVuY3Rpb25cbiAgICogbWF5IHJlYWQgdGhlIGVycm9yIChhIHN0YXRlZCBgUmV0cnktQWZ0ZXJgKSwgYW5kIG5vIGVycm9yIGV4aXN0cyBhdCBidWlsZCxcbiAgICogc28gdGhlIHN0YXRpYyBidWRnZXQgY2hlY2sgbmV2ZXIgYXNrcyBpdDogd2l0aCBgbWF4QmFja29mZk1zYCBpdCBjb3VudHNcbiAgICogZWFjaCB3YWl0IGF0IHRoZSBjZWlsaW5nOyB3aXRob3V0LCB0aGUgc3RhZ2UgaXMgdW5ib3VuZGVkIChgJ2JhY2tvZmYnYCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC5yZXRyeSh7IGF0dGVtcHRzOiA0LCB0aW1lb3V0TXM6IDEwXzAwMCwgYmFja29mZk1zOiAobiwgZXJyb3IpID0+IHN0YXRlZFdhaXRNcyhlcnJvcikgPz8gNTAwICogbiwgbWF4QmFja29mZk1zOiA1XzAwMCB9KVxuICAgKiBgYGBcbiAgICovXG4gIG1heEJhY2tvZmZNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBjYXAgb24gT05FIGF0dGVtcHQsIGluIG1pbGxpc2Vjb25kcyDigJQgYSBmaW5pdGUgbnVtYmVyID4gMC4gVGhlIGF0dGVtcHRcbiAgICogcnVucyB1bmRlciBgbWluKHRpbWVvdXRNcywgdGltZSBsZWZ0IGJlZm9yZSB0aGUgcnVuJ3MgZGVhZGxpbmUpYDsgd2hlbiB0aGVcbiAgICogY2FwIHJ1bnMgb3V0LCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCAoYHNjb3BlLiRhdHRlbXB0KCkuc2lnbmFsYCkgYWJvcnRzIHdpdGhcbiAgICogYW4gYEF0dGVtcHRUaW1lb3V0RXJyb3JgLCB0aGUgZW5naW5lIHN0b3BzIHdhaXRpbmcgZm9yIGl0LCBhbmQgdGhlIGF0dGVtcHRcbiAgICogaXMgcmVjb3JkZWQgYHRpbWVvdXRgICh0aGVuIHJldHJpZWQgbGlrZSBhbnkgZmFpbHVyZSwgaWYgdGhlIHBvbGljeSBhbGxvd3MpLlxuICAgKlxuICAgKiBXaGF0IHRoZSBlbmdpbmUgc3RvcHMgaXMgdGhlIFdBSVRJTkcuIFRoZSBmdW5jdGlvbidzIG93biB3b3JrIHN0b3BzIG9ubHkgaWZcbiAgICogaXQgcGFzc2VzIHRoZSBzaWduYWwgb24gKGBmZXRjaCh1cmwsIHsgc2lnbmFsOiBzY29wZS4kYXR0ZW1wdCgpLnNpZ25hbCB9KWApO1xuICAgKiB3aGF0ZXZlciBpdCB3cml0ZXMgYWZ0ZXIgaXRzIGF0dGVtcHQgZW5kZWQgaXMgZHJvcHBlZCBhbmQgcmVjb3JkZWQgb24gdGhlXG4gICAqIHN0YWdlIChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCkuXG4gICAqXG4gICAqIERlY2xhcmVkIHdpdGggYGF0dGVtcHRzOiAxYCwgaXQgaXMgYSB0aW1lb3V0IHdpdGggbm8gcmV0cnkg4oCUIHRoZSBzdGFnZVxuICAgKiBzdGlsbCByZWNvcmRzIGl0cyBvbmUgYXR0ZW1wdC5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIElzIFRISVMgZXJyb3Igd29ydGggYW5vdGhlciBhdHRlbXB0PyBEZWZhdWx0cyB0byByZXRyeWluZyBldmVyeSBlcnJvci5cbiAgICogUmV0dXJuaW5nIGBmYWxzZWAgZW5kcyB0aGUgc3RhZ2UgaW1tZWRpYXRlbHkgb24gdGhlIG5vcm1hbCBlcnJvciBwYXRoLCB3aXRoXG4gICAqIG5vIHJldHJ5IGV2ZW50OyB0aGUgYXR0ZW1wdCdzIHJlY29yZCBzYXlzIHdoeSBpdCBzdG9wcGVkIChgcmVhc29uOlxuICAgKiAnZGVjbGluZWQnYCkuXG4gICAqXG4gICAqIEEgdGhyb3cgZnJvbSB0aGlzIHByZWRpY2F0ZSBpcyB0cmVhdGVkIGFzIGBmYWxzZWAg4oCUIGEgYnJva2VuIHByZWRpY2F0ZVxuICAgKiBtdXN0IG5vdCB0dXJuIGEgZmFpbGluZyBzdGFnZSBpbnRvIGFuIGluZmluaXRlIHJldHJ5IGxvb3AuIFRoZSByZWNvcmRcbiAgICogdGVsbHMgdGhlIHR3byBhcGFydDogYSB0aHJvdyBzdG9wcyB0aGUgc2VyaWVzIGBkZWNsaW5lZGAgd2l0aFxuICAgKiBgcmV0cnlPblRocmV3OiB0cnVlYC5cbiAgICovXG4gIHJldHJ5T24/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hvIHJhbiB0aGUgYXR0ZW1wdDogdGhlIGVuZ2luZSwgZm9yIGEgc3RhZ2UncyBvd24gcG9saWN5IChgJ3N0YWdlJ2ApOyB0aGUgYXR0ZW1wdCBydW5uZXIsIGZvciBhIGNhbGwgYSBzdGFnZSBtYWRlXG4gKiB0aHJvdWdoIGBzY29wZS4kY2FsbGAgb3IgZm9yIHRoZSBzdGFuZGFsb25lIGBhdHRlbXB0KClgIChgJ2NhbGwnYCk7IGFuIG91dHNpZGUgc3lzdGVtIG9uIGl0cyBvd24g4oCUIGFuIFNESydzXG4gKiBpbnRlcm5hbCByZXRyeSDigJQgcmVwb3J0ZWQgdGhyb3VnaCBgQXR0ZW1wdENvbnRleHQub2JzZXJ2ZWRgIChgJ29ic2VydmVkJ2AsIFAyKS5cbiAqL1xuZXhwb3J0IHR5cGUgQXR0ZW1wdEtpbmQgPSAnc3RhZ2UnIHwgJ2NhbGwnIHwgJ29ic2VydmVkJztcblxuLyoqXG4gKiBIb3cgb25lIGF0dGVtcHQgZW5kZWQuIGAndGltZW91dCdgIGlzIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIChuZXZlciB0aGUgb3V0c2lkZSBzeXN0ZW0gZmFpbGluZyDigJQgbGF3IDQpO1xuICogYCdwYXVzZWQnYCBpcyBhIHBhdXNlIChjb250cm9sIGZsb3csIG5ldmVyIHJldHJpZWQpLiBgJ2Fib3J0ZWQnYCBpcyB0aGUgcnVuJ3Mgc2lnbmFsIGVuZGluZyB0aGUgYXR0ZW1wdDogdGhlXG4gKiBhdHRlbXB0IHRocmV3IHRoZSBhYm9ydCdzIG93biByZWFzb24uIEFuIGF0dGVtcHQgdGhhdCB0aHJldyBpdHMgb3duIGVycm9yIGlzIGAnZmFpbGVkJ2AsIHdpdGggaXRzIGNhdGVnb3J5LFxuICogZXZlbiB3aGVuIHRoZSBydW4gYWJvcnRlZCBhcm91bmQgaXQg4oCUIHRoZSBhYm9ydCBpcyB0aGVuIHRoZSBzZXJpZXMnIHN0b3AgcmVhc29uIChgcmVhc29uOiAnYWJvcnRlZCdgKSwgbmV2ZXIgYVxuICogcmV3cml0ZSBvZiB3aGF0IHRoZSBhdHRlbXB0IGRpZC5cbiAqL1xuZXhwb3J0IHR5cGUgQXR0ZW1wdE91dGNvbWUgPSAnb2snIHwgJ2ZhaWxlZCcgfCAndGltZW91dCcgfCAnYWJvcnRlZCcgfCAncGF1c2VkJztcblxuLyoqXG4gKiBUaGUgZmFpbHVyZSBjYXRlZ29yeSBvZiBhbiBhdHRlbXB0IHRoYXQgZGlkIG5vdCBzdWNjZWVkIOKAlCBPTkUgZml4ZWQgc2V0IG9mIHNldmVuLCBjbGFzc2lmaWVkIGJ5XG4gKiBgZXJyb3JDYXRlZ29yeWAgKGBhdHRlbXB0L2NhdGVnb3J5LnRzYCksIHNvIGV2ZXJ5IHJlY29yZGVyIGJyZWFrcyBmYWlsdXJlcyBkb3duIHRoZSBzYW1lIHdheSAowqczLjkpLlxuICogRXZpZGVuY2UsIG5ldmVyIHBvbGljeTogdGhlIGRlZmF1bHQgYHJldHJ5T25gIHJldHJpZXMgZXZlcnkgY2F0ZWdvcnkuXG4gKi9cbmV4cG9ydCB0eXBlIEF0dGVtcHRDYXRlZ29yeSA9ICd0aW1lb3V0JyB8ICdyYXRlLWxpbWl0ZWQnIHwgJ3NlcnZlcicgfCAnbmV0d29yaycgfCAnYXV0aCcgfCAncGVybWFuZW50JyB8ICd1bmtub3duJztcblxuLyoqIFdoYXQgZm9sbG93cyBhbiBhdHRlbXB0OiBhbm90aGVyIG9uZSwgdGhlIHZhbHVlIChgJ2RvbmUnYCksIG9yIHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yIChgJ3N0b3AnYCkuICovXG5leHBvcnQgdHlwZSBBdHRlbXB0TmV4dCA9ICdyZXRyeScgfCAnZG9uZScgfCAnc3RvcCc7XG5cbi8qKlxuICogV2h5IHRoZSBzZXJpZXMgd2VudCBvbiBvciBlbmRlZCDigJQgdGhlIG1hdGNoZWQgcnVsZSdzIGxhYmVsIGluIGByZXRyeVJ1bGVzYCAoYGF0dGVtcHQvZGVjaXNpb24udHNgKSwgb3IgdGhlXG4gKiBkZWZhdWx0J3MgKGAncmV0cnlhYmxlJ2ApLlxuICovXG5leHBvcnQgdHlwZSBBdHRlbXB0UmVhc29uID1cbiAgfCAnc3VjY2VlZGVkJ1xuICB8ICdwYXVzZWQnXG4gIHwgJ2Fib3J0ZWQnXG4gIHwgJ2V4aGF1c3RlZCdcbiAgfCAnZGVjbGluZWQnXG4gIHwgJ25vLXRpbWUtbGVmdCdcbiAgfCAncmV0cnlhYmxlJztcblxuLyoqXG4gKiBXaGF0IGFuIGF0dGVtcHQgZGlkIHRvIHRoZSBvdXRzaWRlIHN5c3RlbSBhIHRvdWNoaW5nIHRhcmdldCBuYW1lcyAoZGVzaWduIMKnMy4zLCBQMykg4oCUIHByZXNlbnQgb25seSBvbiB0aGUgcmVjb3Jkc1xuICogb2YgYSB0YXJnZXQgdGhhdCBkZWNsYXJlZCBgdG91Y2hlc2A6XG4gKiAgIC0gYCdhcHBsaWVkJ2Ag4oCUIHRoZSBhdHRlbXB0IGFuc3dlcmVkIChgb2tgKTtcbiAqICAgLSBgJ25vbmUnYCDigJQgaXQgZmFpbGVkLCBhbmQgaXRzIGVycm9yIGl0c2VsZiBkZWNsYXJlcyBgZWZmZWN0OiAnbm9uZSdgICh0aGUgYWRhcHRlcidzIHdvcmQ6IG5vdGhpbmcgd2FzIHNlbnQpO1xuICogICAtIGAndW5rbm93bidgIOKAlCBhbnl0aGluZyBlbHNlOiBhIHRpbWVvdXQsIGEgY2FuY2VsbGF0aW9uLCBhIHBhdXNlLCBvciBhIGZhaWx1cmUgdGhlIGFkYXB0ZXIgZGlkIG5vdCBkZWNsYXJlXG4gKiAgICAgaGFybWxlc3MuIE5vYm9keSBrbm93cyB3aGV0aGVyIHRoZSBlZmZlY3QgaGFwcGVuZWQsIHNvIHRoZSBzZXJpZXMgbmV2ZXIgcmVwb3J0cyBpdCBhcyBmYWlsZWQgb3Igb2s6IGEgbGFzdFxuICogICAgIGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYCDigJQgcmVjb25jaWxlLCBkbyBub3QgcmV0cnkgYmxpbmRseS5cbiAqL1xuZXhwb3J0IHR5cGUgQXR0ZW1wdEVmZmVjdCA9ICdhcHBsaWVkJyB8ICdub25lJyB8ICd1bmtub3duJztcblxuLyoqIFdoYXQgYSBzdGFnZSdzIGlkZW1wb3RlbmN5LWtleSBydWxlIGlzIGhhbmRlZCDigJQgb25jZSBwZXIgRVhFQ1VUSU9OLCBiZWZvcmUgYXR0ZW1wdCAxIChgU3RhZ2VUb3VjaGVzYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW1wb3RlbmN5S2V5Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgKG9yIHRoZSBzdWJmbG93J3MpIGlucHV0LCBmcm96ZW4uIE9uIHRoZSByb290IG9mIGEgcmVzdW1lZCBsZWcgdGhlIHJ1bidzIGlucHV0IGlzIGdvbmUgKGl0IGRvZXMgbm90XG4gICAqIGNyb3NzIGEgcmVzdW1lKSwgc28gcmVhZGluZyBpdCB0aGVyZSBUSFJPV1MgcmF0aGVyIHRoYW4gaGFuZCB0aGUgcnVsZSBub3RoaW5nIOKAlCB0aGUgc3RhZ2UgZmFpbHMgYmVmb3JlIGFueXRoaW5nXG4gICAqIGlzIHNlbnQuIEEgcGF1c2VkIHN0YWdlIGl0c2VsZiByZXN1bWVzIHVuZGVyIHRoZSBrZXkgaXRzIGNoZWNrcG9pbnQgY2FycmllczsgdGhlIHJ1bGUgaXMgbm90IGFza2VkIGFnYWluLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bjtcbiAgLyoqIFRoaXMgcnVuJ3MgaWQuIFJlZ2VuZXJhdGVkIHBlciBydW4gYW5kIHBlciByZXN1bWUg4oCUIG5ldmVyIGEga2V5IG9uIGl0cyBvd24gKHNlZSBgU3RhZ2VUb3VjaGVzYCkuICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZXhlY3V0aW9uIHRoZSBrZXkgaXMgZm9yIChgY2hhcmdlIzRgKS4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgY29tbWl0dGVkIHN0YXRlIHZhbHVlLCByZWFkIHdpdGhvdXQgdHJhY2tpbmcg4oCUIHRoZSBrZXkgaXMgbm90IGEgd3JpdGUuIFVzZSBpdCBmb3IgYSBrZXkgdGhlIGNoYXJ0IGtlZXBzIGluXG4gICAqIHN0YXRlOyBpdCBzdXJ2aXZlcyBhIHJlc3VtZSwgd2hlcmUgYGFyZ3NgIGRvZXMgbm90IChyZWFkaW5nIGBhcmdzYCBvbiBhIHJlc3VtZWQgbGVnJ3Mgcm9vdCB0aHJvd3MpLiBBIHNlbGVjdGVkXG4gICAqIHZhbHVlIHJlYWQgaGVyZSBtYWtlcyB0aGUgcmVjb3JkZWQga2V5IHRoZSByZWRhY3Rpb24gcGxhY2Vob2xkZXIuIFJlYWQtb25seTogYSBmcm96ZW4gY29weSwgbmV2ZXIgdGhlIGNvbW1pdHRlZFxuICAgKiB2YWx1ZSBpdHNlbGYuXG4gICAqL1xuICBnZXRTdGF0ZShrZXk6IHN0cmluZyk6IHVua25vd247XG59XG5cbi8qKlxuICogQSBzdGFnZSB0aGF0IGNoYW5nZXMgc29tZXRoaW5nIG91dHNpZGUgdGhlIHJ1biDigJQgYSBjaGFyZ2UsIGFuIGVtYWlsLCBhIHdyaXRlIHRvIGFub3RoZXIgc2VydmljZSAoZGVzaWduIMKnMy4zLFxuICogUDMpLiBEZWNsYXJlZCB3aXRoIGAudG91Y2hlcyhzeXN0ZW0sIHsgaWRlbXBvdGVuY3lLZXkgfSlgIG9yIGEgYHRvdWNoZXNgIG9wdGlvbjsgYSBQT0xJQ1ktbGlrZSBmaWVsZCBvbiB0aGUgbm9kZSxcbiAqIGxpa2UgYHJldHJ5YCBhbmQgYHRhZ3NgLiBUaGUgYnVpbHQgc3BlYyBjYXJyaWVzIGBzeXN0ZW1gIG9ubHkuXG4gKlxuICogYHN5c3RlbWAgaXMgYSBOQU1FIGZyb20gY29kZSAoYCdzdHJpcGUnYCkg4oCUIG5ldmVyIGEgdmFsdWUuIGBpZGVtcG90ZW5jeUtleWAgaXMgdGhlIFJVTEUgdGhhdCBtYWtlcyB0aGUga2V5LCBydW5cbiAqIE9OQ0UgcGVyIGV4ZWN1dGlvbiAobm90IHBlciBhdHRlbXB0KSBhbmQgaGFuZGVkIHRvIGV2ZXJ5IGF0dGVtcHQgYXMgYHNjb3BlLiRhdHRlbXB0KCkuaWRlbXBvdGVuY3lLZXlgLiBJdCBtdXN0XG4gKiBuYW1lIHRoZSBPUEVSQVRJT04sIHNvIHRoYXQgZXZlcnkgcmV0cnkg4oCUIGFuZCBhIHJlc3VtZSdzIHJlLXJ1biwgYW5kIGEgY2FsbGVyJ3Mgd2hvbGUtcnVuIHJldHJ5IOKAlCBzZW5kcyB0aGUgc2FtZVxuICoga2V5OiBkZXJpdmUgaXQgZnJvbSB0aGUgaW5wdXQgKGBvcmRlci0ke2FyZ3Mub3JkZXJJZH1gKSBvciBmcm9tIHN0YXRlIChgZ2V0U3RhdGUoJ29yZGVySWQnKWApLCBuZXZlciBmcm9tIGBydW5JZGBcbiAqIGFsb25lIChpdCBjaGFuZ2VzIG9uIGEgcmVzdW1lKSBhbmQgbmV2ZXIgZnJvbSB3aGF0IGEgbW9kZWwgd3JvdGUuIFRoZSBidWlsZGVyIHJlZnVzZXMgYSB0b3VjaGluZyBzdGFnZSB0aGF0IG1heSByZXRyeSB3aXRoIG5vIHJ1bGUsIGFuZCB0aGUgZW5naW5lIHJlZnVzZXMgYW5cbiAqIGBpbnRlcnJ1cHQoKWAgaW4gYSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIChhIHJlc3VtZSByZS1ydW5zIGl0KS4gVW5kZXIgYSByZWRhY3Rpb24gcnVsZSwgYSBrZXkgZGVyaXZlZCBmcm9tIGFuXG4gKiBpbnB1dCB0aGF0IGhvbGRzIGEgc2VsZWN0ZWQgdmFsdWUgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciAocmVjb3JkcywgaG9vaywgYFVua25vd25FZmZlY3RFcnJvcmApIOKAlCB0aGVcbiAqIGNhbGxlciByZWNvbXB1dGVzIGl0IGZyb20gdGhlIGlucHV0IGl0IGdhdmUgdG8gcmVjb25jaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlVG91Y2hlcyB7XG4gIC8qKiBUaGUgb3V0c2lkZSBzeXN0ZW0g4oCUIGEgbmFtZSwgMeKAkzEyOCBjaGFyYWN0ZXJzLCBubyBjb250cm9sLCBmb3JtYXQgb3IgbGluZS1zZXBhcmF0b3IgY2hhcmFjdGVyLiAqL1xuICByZWFkb25seSBzeXN0ZW06IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBrZXkgcnVsZSDigJQgYSBmdW5jdGlvbiwgc28gdGhlIGtleSBiZWxvbmdzIHRvIHRoZSBleGVjdXRpb24gKGEgY29uc3RhbnQgd291bGQgbWFrZSBldmVyeSBydW4gb25lIG9wZXJhdGlvbikuXG4gICAqIEl0cyBhbnN3ZXIgbXVzdCBiZSAx4oCTMjU1IHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzIHdpdGggbm8gc3BhY2UgKGl0IHRyYXZlbHMgaW4gYSByZXF1ZXN0IGhlYWRlcik7IGFueXRoaW5nXG4gICAqIGVsc2UgZmFpbHMgdGhlIHN0YWdlIHdpdGggYSBgVHlwZUVycm9yYCB0aGF0IG5ldmVyIGVjaG9lcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5PzogKGNvbnRleHQ6IElkZW1wb3RlbmN5S2V5Q29udGV4dCkgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYHNjb3BlLiRjYWxsKHRhcmdldCwgZm4sIHBvbGljeSwgb3B0aW9ucylgIGRlY2xhcmVzIGJleW9uZCBpdHMgcG9saWN5IChQMyk6IHRoZSBvdXRzaWRlIHN5c3RlbSB0aGUgY2FsbFxuICogdG91Y2hlcywgYW5kIHRoZSBrZXkgaXQgaXMgbWFkZSB1bmRlci4gQSBjYWxsIHRoYXQgdG91Y2hlcyBhIHN5c3RlbSBhbmQgbWF5IHJldHJ5IG11c3QgY2FycnkgYSBrZXk7IHRoZSBrZXkgaXMgYVxuICogVkFMVUUgdGhlIHN0YWdlIGNvbXB1dGVkIGZyb20gaXRzIGlucHV0IG9yIGl0cyBzdGF0ZSDigJQgbmV2ZXIgZnJvbSBtb2RlbCBvdXRwdXQg4oCUIGFuZCBpcyBjaGVja2VkIGxpa2UgYSBzdGFnZSdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbGxPcHRpb25zIHtcbiAgLyoqIFRoZSBvdXRzaWRlIHN5c3RlbSB0aGUgY2FsbCBjaGFuZ2VzIOKAlCBhIG5hbWUgbGlrZSBgdGFyZ2V0YC4gKi9cbiAgcmVhZG9ubHkgdG91Y2hlcz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBrZXkgZXZlcnkgYXR0ZW1wdCBvZiB0aGUgY2FsbCBpcyBtYWRlIHVuZGVyIOKAlCBvbmx5IHdpdGggYHRvdWNoZXNgLiBXaGVuIHRoZSBzdGFnZSBjYW4gYGludGVycnVwdCgpYCwgZGVyaXZlIGl0XG4gICAqIGZyb20gc3RhdGUgb3IgZnJvbSBgc2NvcGUuJGF0dGVtcHQoKS5pZGVtcG90ZW5jeUtleWAsIG5ldmVyIGZyb20gYCRnZXRBcmdzKClgOiB0aGUgaW5wdXQgZG9lcyBub3QgY3Jvc3MgYSByZXN1bWUsXG4gICAqIHNvIGFuIGFyZ3MtZGVyaXZlZCBrZXkgd291bGQgZGlmZmVyIG9uIHRoZSByZS1ydW4uXG4gICAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBhdHRlbXB0J3MgZXJyb3IgYXMgdGhlIHJ1biBTRVJWRVMgaXQg4oCUIGBTdHJ1Y3R1cmVkRXJyb3JJbmZvYCB1bmRlciB0aGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGVcbiAqIChgUmVkYWN0aW9uUnVsZS5yZXRhaW5TdGFnZUVycm9yYCksIHdpdGhvdXQgYHJhd2A6IGEgcmVjb3JkIG11c3Qgc3Vydml2ZSBgc3RydWN0dXJlZENsb25lYCBhbmQgbXVzdCBuZXZlclxuICogaGFuZCBvdXQgdGhlIHRocm93biB2YWx1ZSBpdHNlbGYuXG4gKi9cbmV4cG9ydCB0eXBlIEF0dGVtcHRFcnJvciA9IE9taXQ8U3RydWN0dXJlZEVycm9ySW5mbywgJ3Jhdyc+O1xuXG4vKipcbiAqIFdoYXQgYSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHJlYWRzIOKAlCB0aGUgaW5wdXRzIGByZXRyeVJ1bGVzYCBldmFsdWF0ZXMsIGZpcnN0IG1hdGNoIHdpbnMgKMKnMy4xKS4gVGhlIHJ1bm5lclxuICogY29tcHV0ZXMgZWFjaCBvbmUgb25seSB3aGVuIGEgcnVsZSByZWFjaGVzIGl0LCBzbyBgcmV0cnlPbmAgYW5kIGBiYWNrb2ZmTXNgIHJ1biBleGFjdGx5IHdoZW4gYSByZXRyeSBuZWVkc1xuICogdGhlbS5cbiAqXG4gKiBgY2F0ZWdvcnlgIGFuZCBga2V5UHJlc2VudGAgYXJlIGlucHV0cyBubyBkZWZhdWx0IHJ1bGUgcmVhZHM7IGEgY2hhcnQncyBvd24gcnVsZXMgb3ZlciB0aGUgc2FtZSBpbnB1dHMgbWF5LlxuICogYHRpbWVMZWZ0TXNgIGlzIGBJbmZpbml0eWAgd2l0aG91dCBhIGRlYWRsaW5lLCBhbmQgc28gaXMgYHRpbWVMZWZ0QWZ0ZXJXYWl0TXNgICg9IGB0aW1lTGVmdE1zIOKIkiBkZWxheU1zYCk6XG4gKiB0aGUgbm8tdGltZS1sZWZ0IHJ1bGUgY29tcGFyZXMgb25lIGlucHV0IHdpdGggYSBjb25zdGFudCwgYXMgZXZlcnkgYGRlY2lkZSgpYCBmaWx0ZXIgZG9lcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0SW5wdXRzIHtcbiAgcmVhZG9ubHkgb3V0Y29tZTogQXR0ZW1wdE91dGNvbWU7XG4gIHJlYWRvbmx5IGNhdGVnb3J5PzogQXR0ZW1wdENhdGVnb3J5O1xuICAvKipcbiAgICogVGhlIHJ1bidzIHNpZ25hbCBoYXMgYWJvcnRlZCDigJQgcmVhZCB3aGVuIHJ1bGUgMyBpcyByZWFjaGVkLCBzbyBhbiBhYm9ydCByYWlzZWQgaW5zaWRlIGByZXRyeU9uYCBpcyBzZWVuIGJ5XG4gICAqIHRoZSBkZWNpc2lvbiB0YWtlbiBhZ2FpbiBhZnRlciBpdC4gQWx3YXlzIGB0cnVlYCBmb3IgYW4gYCdhYm9ydGVkJ2Agb3V0Y29tZS5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGlzIGF0dGVtcHQsIDEtYmFzZWQuICovXG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcbiAgLyoqIFRoZSBhdHRlbXB0cyB0aGUgcG9saWN5IGFsbG93cyBpbiB0b3RhbC4gKi9cbiAgcmVhZG9ubHkgb2Y6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGltZUxlZnRNczogbnVtYmVyO1xuICAvKiogVGhlIHdhaXQgYmVmb3JlIHRoZSBuZXh0IGF0dGVtcHQsIGZyb20gYGJhY2tvZmZNc2AgKGAwYCB3aGVuIGl0IGlzIGFic2VudCwgaW52YWxpZCBvciB0aHJvd3MpLiAqL1xuICByZWFkb25seSBkZWxheU1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHRpbWVMZWZ0QWZ0ZXJXYWl0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kncyBgcmV0cnlPbmAgdmVyZGljdCBvbiB0aGlzIGF0dGVtcHQncyBlcnJvciAoYHRydWVgIHdoZW4gYWJzZW50OyBhIHRocm93IGlzIGBmYWxzZWAsIGFuZCB0aGVcbiAgICogcmVjb3JkIHNheXMgaXQgdGhyZXc6IGBBdHRlbXB0UmVjb3JkLnJldHJ5T25UaHJld2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlPbjogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRhcmdldCBkZWNsYXJlZCBhbiBpZGVtcG90ZW5jeSBrZXkg4oCUIG5ldmVyIGl0cyB2YWx1ZS4gKi9cbiAgcmVhZG9ubHkga2V5UHJlc2VudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPbmUgYXR0ZW1wdCDigJQgdGhlIHVuaXQgb2YgdGltZSBhbmQgZmFpbHVyZSBldmlkZW5jZS4gRnJvemVuOyBzdXJ2aXZlcyBgc3RydWN0dXJlZENsb25lYC5cbiAqXG4gKiBJZGVudGl0eTogYHNlcmllc2AgKHRoZSBzdGFnZSBleGVjdXRpb24ncyBgcnVudGltZVN0YWdlSWRgIGZvciBhIHN0YWdlIGF0dGVtcHQpIHBsdXMgYGF0dGVtcHRgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSZWNvcmQge1xuICAvKiogTG9naWNhbCB3b3JrZmxvdy9wYXNzIGxpbmssIHN0YW1wZWQgYnkgYW4gZXhwbGljaXQgcmV0cnkgaGVscGVyOyBwaHlzaWNhbCBzZXJpZXMvYXR0ZW1wdCBzdGF5IHVuY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgcmV0cnlMb29wPzogUmV0cnlMb29wQ2FsbDtcbiAgLyoqXG4gICAqIFRoZSBzZXJpZXMgdGhlIGF0dGVtcHQgYmVsb25ncyB0by4gQSBzdGFnZSBhdHRlbXB0OiBpdHMgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYC4gQSBjYWxsIOKAlCBgJGNhbGxgLCBvciBhblxuICAgKiBvYnNlcnZlZCBTREsgY2FsbCDigJQgbWFkZSBkdXJpbmcgc3RhZ2UgYXR0ZW1wdCBgbmA6IGA8cnVudGltZVN0YWdlSWQ+QDxuPi48az5gLCB0aGUgYGtgLXRoIGNhbGwgb2YgdGhhdCBhdHRlbXB0LFxuICAgKiBzbyBgPHNlcmllcz5APGF0dGVtcHQ+YCBpcyB0aGUgYXR0ZW1wdCBpZCBvZiBmb290dHJhY2UncyBncmFtbWFyIChkZXNpZ24gwqczLjQpLiBBIHN0YW5kYWxvbmUgYGF0dGVtcHQoKWA6IHRoZVxuICAgKiBjYWxsZXIncyBuYW1lIGZvciB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VyaWVzOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtpbmQ6IEF0dGVtcHRLaW5kO1xuICAvKipcbiAgICogVGhlIG91dHNpZGUgdGFyZ2V0IG9mIGEgYCdjYWxsJ2Agb3IgYCdvYnNlcnZlZCdgIGF0dGVtcHQg4oCUIGEgTkFNRSBmcm9tIGNvZGUgKGAnc3RyaXBlLnF1b3Rlcy5jcmVhdGUnYCksIG5ldmVyXG4gICAqIGEgdmFsdWUuIEFic2VudCBvbiBhIHN0YWdlIGF0dGVtcHQ6IGl0cyBzdGFnZSBuYW1lcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgLyoqIFdobyByYW4gYW4gYCdvYnNlcnZlZCdgIGF0dGVtcHQg4oCUIHRoZSByZXBvcnQncyBgc291cmNlYCAoYCdzZGsnYCB1bmxlc3MgaXQgc2FpZCBvdGhlcndpc2UpLiBBYnNlbnQgb3RoZXJ3aXNlLiAqL1xuICByZWFkb25seSBzb3VyY2U/OiBzdHJpbmc7XG4gIC8qKiAxLWJhc2VkIHdpdGhpbiB0aGUgc2VyaWVzLiAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG4gIC8qKiBUaGUgYXR0ZW1wdHMgdGhlIHBvbGljeSBhbGxvd3MgaW4gdG90YWwuICovXG4gIHJlYWRvbmx5IG9mPzogbnVtYmVyO1xuICAvKiogRXBvY2ggbWlsbGlzZWNvbmRzIHdoZW4gdGhlIGF0dGVtcHQgc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgc3RhcnRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgYXR0ZW1wdCBpdHNlbGYgZW5kZWQg4oCUIG5ldmVyIHJld3JpdHRlbiBieSB3aGF0IHRoZSBzZXJpZXMgZGlkIG5leHQgKHNlZSB7QGxpbmsgQXR0ZW1wdE91dGNvbWV9KS4gKi9cbiAgcmVhZG9ubHkgb3V0Y29tZTogQXR0ZW1wdE91dGNvbWU7XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIGF0dGVtcHQgZmFpbGVkLCB0aW1lZCBvdXQgb3Igd2FzIGFib3J0ZWQ7IGFic2VudCBmb3IgYCdvaydgIGFuZCBgJ3BhdXNlZCdgLiBSZWFkIG9mZiB0aGVcbiAgICogZXJyb3IgYXMgaXQgc3Rvb2Qgd2hlbiB0aGUgZGVjaXNpb24gd2FzIG1hZGUgKGFmdGVyIGByZXRyeU9uYCByYW4pLCBsaWtlIGBlcnJvcmAuXG4gICAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IEF0dGVtcHRDYXRlZ29yeTtcbiAgLyoqIFRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIOKAlCB0aGUgZXZpZGVuY2UgYGRlY2lkZSgpYCB3b3VsZCByZWNvcmQgZm9yIGByZXRyeVJ1bGVzKHBvbGljeSlgLiAqL1xuICByZWFkb25seSBkZWNpc2lvbjogRGVjaXNpb25FdmlkZW5jZTtcbiAgLyoqIGBkZWNpc2lvbi5jaG9zZW5gIOKAlCB0aGUgY29tcGFjdCBwcm9qZWN0aW9uIGEgYmFkZ2UgcmVhZHMuICovXG4gIHJlYWRvbmx5IG5leHQ6IEF0dGVtcHROZXh0O1xuICByZWFkb25seSByZWFzb246IEF0dGVtcHRSZWFzb247XG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGUgcG9saWN5J3MgYHJldHJ5T25gIFRIUkVXIG9uIHRoaXMgYXR0ZW1wdCdzIGVycm9yIChhYnNlbnQgb3RoZXJ3aXNlKS4gQSB0aHJvdyBpcyBcImRvIG5vdFxuICAgKiByZXRyeVwiLCBzbyB0aGUgcmVhc29uIGlzIGAnZGVjbGluZWQnYDsgdGhpcyBmbGFnIGtlZXBzIGEgYnJva2VuIHByZWRpY2F0ZSBhcGFydCBmcm9tIGEgcmVhbCBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlPblRocmV3PzogdHJ1ZTtcbiAgLyoqXG4gICAqIFRoZSB3YWl0IGJlZm9yZSB0aGUgbmV4dCBhdHRlbXB0IOKAlCBwcmVzZW50IHdoZW4gdGhlIGRlY2lzaW9uIGNvbXB1dGVkIGl0OiBhIHJldHJ5LCBvciAodW5kZXIgYSBkZWFkbGluZSkgYVxuICAgKiBgbm8tdGltZS1sZWZ0YCBzdG9wLCB3aG9zZSB3YWl0IHdvdWxkIGhhdmUgb3V0bGFzdGVkIHRoZSB0aW1lIGxlZnQuXG4gICAqL1xuICByZWFkb25seSBkZWxheU1zPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNhcCB0aGlzIGF0dGVtcHQgcmFuIHVuZGVyLCBpbiBtaWxsaXNlY29uZHMg4oCUIGBtaW4oUmV0cnlQb2xpY3kudGltZW91dE1zLCB0aW1lIGxlZnQgYmVmb3JlIHRoZSBkZWFkbGluZSlgXG4gICAqIGF0IGl0cyBzdGFydC4gQWJzZW50IHdoZW4gbmVpdGhlciB3YXMgc2V0ICh0aGUgYXR0ZW1wdCByYW4gdW5jYXBwZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogVGhlIHRpbWUgbGVmdCBiZWZvcmUgdGhlIHJ1bidzIGRlYWRsaW5lIHdoZW4gdGhlIGRlY2lzaW9uIHdhcyBtYWRlIChuZWdhdGl2ZSBvbmNlIHBhc3QpLiBBYnNlbnQgd2l0aG91dCBvbmUuICovXG4gIHJlYWRvbmx5IHRpbWVMZWZ0TXM/OiBudW1iZXI7XG4gIC8qKiBUaGUgc2VydmVkIGVycm9yIG9mIGFuIGF0dGVtcHQgdGhhdCBmYWlsZWQsIHRpbWVkIG91dCBvciB3YXMgYWJvcnRlZC4gKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBBdHRlbXB0RXJyb3I7XG4gIC8qKiBUaGUgb3V0c2lkZSBzeXN0ZW0gYSB0b3VjaGluZyB0YXJnZXQgbmFtZXMgKFAzKS4gQWJzZW50IGZvciBhIHRhcmdldCB0aGF0IHRvdWNoZXMgbm90aGluZy4gKi9cbiAgcmVhZG9ubHkgc3lzdGVtPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGtleSB0aGUgYXR0ZW1wdCB3YXMgbWFkZSB1bmRlciwgYXMgdGhlIHJ1biBTRVJWRVMgaXQg4oCUIHJldGFpbmVkIHVuZGVyIHRoZSBkaWFnbm9zdGljIHJ1bGUgYXNcbiAgICogYHsgaWRlbXBvdGVuY3lLZXkgfWAsIHNvIGEgcmVkYWN0aW9uIHJ1bGUgb2YgdGhhdCBuYW1lIChvciBgcG9saWN5LmRpYWdub3N0aWNzYCkgc2NydWJzIGl0LiBBYnNlbnQgd2l0aG91dCBhIGtleS5cbiAgICovXG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgYXR0ZW1wdCBkaWQgdG8gdGhlIG91dHNpZGUgc3lzdGVtIChzZWUge0BsaW5rIEF0dGVtcHRFZmZlY3R9KS4gUHJlc2VudCBvbmx5IG9uIGEgdG91Y2hpbmcgdGFyZ2V0LiAqL1xuICByZWFkb25seSBlZmZlY3Q/OiBBdHRlbXB0RWZmZWN0O1xufVxuXG4vKipcbiAqIFRoZSBhdHRlbXB0IGEgZnVuY3Rpb24gaXMgcnVubmluZyBpbiDigJQgYSBzdGFnZSdzIChgc2NvcGUuJGF0dGVtcHQoKWAsIGRlc2lnbiDCpzMuMSksIG9yIGEgY2FsbCdzICh0aGUgYXJndW1lbnRcbiAqIGBzY29wZS4kY2FsbGAgYW5kIGBhdHRlbXB0KClgIGhhbmQgdGhlaXIgZnVuY3Rpb24sIFAyKS4gTmV2ZXIgc2VyaWFsaXNlZDogaXQgaG9sZHMgYSBsaXZlIHNpZ25hbC5cbiAqXG4gKiBBIHN0YWdlIHdpdGggbm8gcmV0cnkgcG9saWN5IGFuZCBubyBkZWFkbGluZSBpcyBhdHRlbXB0IDEgb2YgMSwgd2l0aCB0aGUgcnVuJ3Mgc2lnbmFsIChvciBvbmUgdGhhdCBuZXZlclxuICogYWJvcnRzKSBhbmQgYEluZmluaXR5YCBsZWZ0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRDb250ZXh0IHtcbiAgLyoqIFRoZSBzZXJpZXMgaXRzIHJlY29yZCBuYW1lcyAoc2VlIHtAbGluayBBdHRlbXB0UmVjb3JkLnNlcmllc30pLiAqL1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgLyoqIFRoaXMgYXR0ZW1wdCwgMS1iYXNlZC4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogVGhlIGF0dGVtcHRzIHRoZSBwb2xpY3kgYWxsb3dzIGluIHRvdGFsLiAqL1xuICByZWFkb25seSBvZjogbnVtYmVyO1xuICAvKipcbiAgICogQWJvcnRzIHdoZW4gdGhpcyBhdHRlbXB0IG11c3Qgc3RvcDogYXQgaXRzIGNhcCAoYEF0dGVtcHRUaW1lb3V0RXJyb3JgKSwgYXQgdGhlIHJ1bidzIGRlYWRsaW5lLCBvciB3aGVuIHRoZSBydW5cbiAgICogaXMgY2FuY2VsbGVkLiBQYXNzIGl0IHRvIGBmZXRjaGAgYW5kIFNESyBjYWxscyDigJQgdGhlIGVuZ2luZSBzdG9wcyB3YWl0aW5nIGF0IHRoZSBjYXAgZWl0aGVyIHdheSwgYnV0IG9ubHkgdGhlXG4gICAqIGZ1bmN0aW9uIGNhbiBzdG9wIGl0cyBvd24gd29yay5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7XG4gIC8qKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1pbGxpc2Vjb25kcyDigJQgYWJzZW50IHdpdGhvdXQgb25lLiAqL1xuICByZWFkb25seSBkZWFkbGluZT86IG51bWJlcjtcbiAgLyoqIFRoZSBjYXAgdGhpcyBhdHRlbXB0IHJ1bnMgdW5kZXIgKHNlZSB7QGxpbmsgQXR0ZW1wdFJlY29yZC50aW1lb3V0TXN9KSDigJQgYWJzZW50IHdoZW4gdW5jYXBwZWQuICovXG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIFRoZSBvdXRzaWRlIHN5c3RlbSB0aGlzIGF0dGVtcHQgdG91Y2hlcyAoUDMpIOKAlCBhYnNlbnQgd2hlbiBpdCB0b3VjaGVzIG5vbmUuICovXG4gIHJlYWRvbmx5IHN5c3RlbT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBrZXkgdGhpcyBhdHRlbXB0IG11c3QgYmUgbWFkZSB1bmRlciDigJQgdGhlIFJFQUwga2V5LCBjb21wdXRlZCBvbmNlIHBlciBleGVjdXRpb24gZnJvbSB0aGUgZGVjbGFyZWQgcnVsZSAob3JcbiAgICogdGhlIGAkY2FsbGAncyBvcHRpb24pLiBQYXNzIGl0IHRvIHRoZSBzeXN0ZW0gKGB7IGlkZW1wb3RlbmN5S2V5IH1gKSwgc28gYSByZXRyeSwgYSByZXN1bWUgYW5kIGEgY2FsbGVyJ3MgcmV0cnlcbiAgICogYWxsIG5hbWUgb25lIG9wZXJhdGlvbi4gQWJzZW50IHdpdGhvdXQgYSBrZXkuIFJlY29yZHMgY2FycnkgaXRzIHNlcnZlZCBmb3JtLlxuICAgKi9cbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBydW4ncyBkZWFkbGluZSDigJQgYEluZmluaXR5YCB3aXRob3V0IG9uZS4gUmVhZCB0aHJvdWdoIHRoZSBzY29wZSwgaXQgbWFya3MgdGhlIHN0YWdlJ3NcbiAgICogY29tbWl0IGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2VudiddYCB3aGVuIGEgZGVhZGxpbmUgZXhpc3RzOiB0aW1lIGlzIGFuIGlucHV0IHRoZSByZWNvcmQgY2Fubm90IHJlcGxheS5cbiAgICovXG4gIHRpbWVMZWZ0TXMoKTogbnVtYmVyO1xuICAvKipcbiAgICogUmVwb3J0IGFuIGF0dGVtcHQgYW4gb3V0c2lkZSBzeXN0ZW0gcmFuIE9OIElUUyBPV04g4oCUIGFuIFNESydzIGludGVybmFsIHJldHJ5IChkZXNpZ24gwqczLjYsIFAyKS4gSXQgYmVjb21lcyBhblxuICAgKiBgQXR0ZW1wdFJlY29yZGAgb2Yga2luZCBgJ29ic2VydmVkJ2AgYmVzaWRlIHRoaXMgYXR0ZW1wdCdzIGV2aWRlbmNlLCBhbmQgZmlyZXMgYG9uQXR0ZW1wdGA7IGl0IG5ldmVyIGNoYW5nZXNcbiAgICogY29udHJvbCBmbG93IOKAlCBpbiBlaXRoZXIgZGlyZWN0aW9uOiBhIHJlcG9ydCB0aGF0IGNvbWVzIGFmdGVyIHRoaXMgYXR0ZW1wdCBlbmRlZCAoYW4gU0RLJ3MgY2FsbGJhY2sgZmlyaW5nXG4gICAqIGxhdGUpIGlzIGRyb3BwZWQgYW5kIHJlY29yZGVkIGJ5IG5hbWUgKGBsYXRlV3JpdGVzYCksIG5ldmVyIHRocm93bi4gT25seSB0aGUgcmVwb3J0J3MgbmFtZWQgZmllbGRzIGFyZSByZWFkOyBpdHNcbiAgICogZXJyb3IgaXMgc2VydmVkIHVuZGVyIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSwgYW5kIG5vIGhvb2sgaXMgaGFuZGVkIHRoZSBlcnJvciBvYmplY3QgaXRzZWxmLiBBIG1hbGZvcm1lZFxuICAgKiByZXBvcnQgaXMgdGhlIGFkYXB0ZXIncyBidWc6IGEgYFR5cGVFcnJvcmAgbmFtaW5nIHRoZSBmaWVsZC4gUHJlZmVyIG9uZSBsb29wOiB0dXJuIHRoZSBTREsncyBvd24gcmV0cmllcyBvZmYgYW5kXG4gICAqIHJ1biB0aGUgY2FsbCB1bmRlciBgc2NvcGUuJGNhbGxgLlxuICAgKi9cbiAgb2JzZXJ2ZWQocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQpOiB2b2lkO1xufVxuXG4vKipcbiAqIEFuIGF0dGVtcHQgYW4gb3V0c2lkZSBzeXN0ZW0gcmFuIG9uIGl0cyBvd24sIGFzIGFuIGFkYXB0ZXIgcmVwb3J0cyBpdCAoYEF0dGVtcHRDb250ZXh0Lm9ic2VydmVkYCkuIE9ubHkgdGhlc2VcbiAqIGZpZWxkcyBhcmUgcmVhZCDigJQgZWFjaCBvbmNlOyBhbnl0aGluZyBlbHNlIG9uIHRoZSBvYmplY3QgaXMgZHJvcHBlZC5cbiAqXG4gKiBBIHJlcG9ydCB3aXRoIGBvZmAgc3RhbmRzIGZvciBvbmUgYXR0ZW1wdCBvZiB0aGUgU0RLJ3Mgc2VyaWVzOyBhIHJlcG9ydCB3aXRob3V0IG9uZSBzdGFuZHMgZm9yIHRoZSBTREsncyBXSE9MRVxuICogY2FsbCwgaXRzIGNvdW50IHVua25vd24g4oCUIFwidGhlIFNESyByYW4gdGhpc1wiIHJhdGhlciB0aGFuIGEgcHJldGVuZGVkIGNvdW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmVkQXR0ZW1wdCB7XG4gIC8qKiBUaGUgb3V0c2lkZSB0YXJnZXQg4oCUIGEgbmFtZSBmcm9tIGNvZGU6IDHigJMxMjggY2hhcmFjdGVycywgbm8gY29udHJvbCwgZm9ybWF0IG9yIGxpbmUtc2VwYXJhdG9yIGNoYXJhY3Rlci4gKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG4gIC8qKiBXaGljaCBhdHRlbXB0IG9mIHRoZSBTREsncyBvd24gc2VyaWVzLCAxLWJhc2VkLiBEZWZhdWx0IGAxYC4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdD86IG51bWJlcjtcbiAgLyoqIFRoZSBhdHRlbXB0cyB0aGUgU0RLIGFsbG93cyBpbiB0b3RhbCwgd2hlbiBpdCBzYXlzICjiiaUgYGF0dGVtcHRgKS4gKi9cbiAgcmVhZG9ubHkgb2Y/OiBudW1iZXI7XG4gIC8qKiBIb3cgdGhlIFNESydzIGF0dGVtcHQgZW5kZWQuIEFuIFNESyBjYW5ub3QgcGF1c2UgYSBmbG93Y2hhcnQsIHNvIGAncGF1c2VkJ2AgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgb3V0Y29tZTogRXhjbHVkZTxBdHRlbXB0T3V0Y29tZSwgJ3BhdXNlZCc+O1xuICAvKiogSG93IGxvbmcgaXQgdG9vaywgbWlsbGlzZWNvbmRzIOKAlCBmaW5pdGUgYW5kIOKJpSAwLiAqL1xuICByZWFkb25seSBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIC8qKiBXaGVuIGl0IHN0YXJ0ZWQsIGVwb2NoIG1pbGxpc2Vjb25kcy4gRGVmYXVsdDogdGhlIHJlcG9ydCdzIGFycml2YWwgbWludXMgYGR1cmF0aW9uTXNgLiAqL1xuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXI7XG4gIC8qKiBXaG8gcmFuIGl0IOKAlCBhIG5hbWUgbGlrZSBgdGFyZ2V0YC4gRGVmYXVsdCBgJ3NkaydgLiAqL1xuICByZWFkb25seSBzb3VyY2U/OiBzdHJpbmc7XG4gIC8qKiBUaGUgZXJyb3Igb2YgYW4gYXR0ZW1wdCB0aGF0IGRpZCBub3Qgc3VjY2VlZCDigJQgc2VydmVkIHVuZGVyIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSwgbmV2ZXIga2VwdCBhcyB0aHJvd24uICovXG4gIHJlYWRvbmx5IGVycm9yPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBIHdyaXRlLCBlbWl0LCBkaWFnbm9zdGljLCBkZXRhY2ggb3IgY2FsbCBhbiBhdHRlbXB0IHRyaWVkIEFGVEVSIGl0IGhhZCBlbmRlZCDigJQgdGltZWQgb3V0LCBhYm9ydGVkIG9yIGZhaWxlZCDigJRcbiAqIGRyb3BwZWQgYXQgdGhlIHNjb3BlIGFuZCByZWNvcmRlZCBvbiBpdHMgc3RhZ2UgKGBTdGFnZVNuYXBzaG90LmxhdGVXcml0ZXNgLCB0aGUgZmlyc3QgMTAwIOKAlFxuICogYFN0YWdlQ29udGV4dCDCtyBNQVhfTEFURV9XUklURVNgKS4gQSBuYW1lLCBuZXZlciB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZVdyaXRlIHtcbiAgLyoqIFRoZSBhdHRlbXB0IHRoYXQgd3JvdGUgbGF0ZSwgMS1iYXNlZC4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0YXRlIGtleSAoYSBkb3R0ZWQgcGF0aCBmb3IgYSBuZXN0ZWQgd3JpdGUpLCB0aGUgZW1pdHRlZCBldmVudCdzIG5hbWUgKGEgZGlhZ25vc3RpYydzIGVtaXQgbmFtZSDigJRcbiAgICogYGxvZy5kZWJ1Zy48a2V5PmAsIGBtZXRyaWMuPG5hbWU+YCDigJQgZm9yIGAkZGVidWdgIC8gYCRtZXRyaWNgIC8g4oCmKSwgYGRldGFjaDo8Y2hpbGQgcm9vdCBpZD5gLCBvciDigJQgb24gdGhlXG4gICAqIGAnYXR0ZW1wdCdgIGNoYW5uZWwgKFAyKSDigJQgYGNhbGw6PHRhcmdldD5gIChhIGAkY2FsbGAgc3RhcnRlZCwgb3IgYSBjYWxsJ3MgcmVjb3JkIGFycml2aW5nLCBhZnRlciBpdHMgYXR0ZW1wdFxuICAgKiBlbmRlZCkgb3IgYG9ic2VydmVkOjx0YXJnZXQ+YCAoYW4gb2JzZXJ2ZWQgcmVwb3J0IGFmdGVyIGl0KS5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSBjaGFubmVsOiAnc3RhdGUnIHwgJ2VtaXQnIHwgJ2RldGFjaCcgfCAnYXR0ZW1wdCc7XG59XG5cbi8qKlxuICogQSBzZXJpZXMgYXQgYSBnbGFuY2Ug4oCUIHN0YW1wZWQgb25jZSwgd2hlbiB0aGUgc2VyaWVzIGVuZHMgKHRoZSBMZW5zIGJhZGdlLCDCpzMuMTApLiBgbGFzdGAgaXMgaG93IGl0IGVuZGVkOlxuICogdGhlIGxhc3QgcmVjb3JkJ3MgYG5leHRgIC8gYHJlYXNvbmAgKGFuZCBgY2F0ZWdvcnlgLCBgcmV0cnlPblRocmV3YCksIG9yIGBzdG9wYCAvIGBhYm9ydGVkYCB3aGVuIHRoZSBydW4nc1xuICogc2lnbmFsIGN1dCBhIHdhaXQgKG5vIGF0dGVtcHQgZm9sbG93ZWQsIHNvIG5vbmUgaXMgcmVjb3JkZWQpLlxuICpcbiAqIFRoZSBTRVJJRVMnIG91dGNvbWUsIG5vdCB0aGUgU1RBR0Uncy4gYGxhc3QubmV4dDogJ2RvbmUnYCBzYXlzIHRoZSBzdGFnZSBmdW5jdGlvbiByZXR1cm5lZDsgdGhlIHN0YWdlIGNhblxuICogc3RpbGwgZmFpbCBhZnRlciB0aGF0IOKAlCBpdHMgY29tbWl0IGNhbiBmYWlsIChhIHZhbHVlIG5vdGhpbmcgY2FuIGNsb25lKSwgYW5kIGEgU3RhZ2VOb2RlIGl0IHJldHVybmVkIGNhbiBiZVxuICogcmVmdXNlZCBhdCB0aGUgcnVuLXRpbWUgZG9vciAoUjUpIOKAlCBhbmQgdGhlbiBpdHMgYG9uRXJyb3JgIGZpcmVzIHdpdGggdGhpcyBzdW1tYXJ5IHVuY2hhbmdlZC4gV2hldGhlciB0aGVcbiAqIHN0YWdlIGZhaWxlZCBpcyB0aGUgZXhlY3V0aW9uJ3Mgb3duIGZhY3QgKGl0cyBlcnJvciksIG5ldmVyIHJlYWQgb2ZmIHRoaXMgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3VtbWFyeSB7XG4gIHJlYWRvbmx5IGNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9rOiBudW1iZXI7XG4gIHJlYWRvbmx5IGZhaWxlZDogbnVtYmVyO1xuICByZWFkb25seSB0aW1lb3V0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGFib3J0ZWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgcGF1c2VkOiBudW1iZXI7XG4gIHJlYWRvbmx5IGxhc3Q6IHtcbiAgICByZWFkb25seSBuZXh0OiBFeGNsdWRlPEF0dGVtcHROZXh0LCAncmV0cnknPjtcbiAgICByZWFkb25seSByZWFzb246IEF0dGVtcHRSZWFzb247XG4gICAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBBdHRlbXB0Q2F0ZWdvcnk7XG4gICAgcmVhZG9ubHkgcmV0cnlPblRocmV3PzogdHJ1ZTtcbiAgICAvKiogVGhlIHNlcmllcycgZWZmZWN0IOKAlCBgdW5rbm93bmAgb25jZSBhbnkgYXR0ZW1wdCBsZWZ0IGl0IHVua25vd24sIHVubGVzcyB0aGUgc2VyaWVzIGVuZGVkIHdpdGggYW4gYW5zd2VyLiBUb3VjaGluZyB0YXJnZXRzIG9ubHkuICovXG4gICAgcmVhZG9ubHkgZWZmZWN0PzogQXR0ZW1wdEVmZmVjdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24g4oCUIHdoaWNoIG91dHNpZGUgdHJhY2UgYW5kIHVuaXQgb2Ygd29yayB0aGlzIHJ1biBiZWxvbmdzIHRvIChkZXNpZ24gwqczLjQpLiBSZXNvbHZlZCBPTkNFXG4gKiBwZXIgbGVnIChgcnVuKClgLCBhbmQgZWFjaCBgcmVzdW1lKClgKSBmcm9tIHRoZSBlbnYgYnkgYGF0dGVtcHQvY29ycmVsYXRpb24udHMgwrcgcmVzb2x2ZUNvcnJlbGF0aW9uYCwgZnJvemVuLCBhbmRcbiAqIGhhbmRlZCBieSByZWZlcmVuY2UgdG8gYFJ1bnRpbWVTbmFwc2hvdC5jb3JyZWxhdGlvbmAsIGV2ZXJ5IGZsb3cgZXZlbnQncyBgVHJhdmVyc2FsQ29udGV4dC5jb3JyZWxhdGlvbmAsIGFuZFxuICogZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQncyBgY29ycmVsYXRpb25gLiBBYnNlbnQg4oCUIG5vIGtleSBhbnl3aGVyZSDigJQgd2hlbiB0aGUgZW52IGdpdmVzIG5vbmUuXG4gKlxuICogQ29ycmVsYXRpb24gb25seTogYSBOQU1FIHRoZSByZWNvcmQgY2FycmllcyBzbyBhIHJ1biBjYW4gYmUgZm91bmQgZnJvbSBhIHRyYWNlLiBOZXZlciBpZGVudGl0eSwgbmV2ZXJcbiAqIGF1dGhvcmlzYXRpb24g4oCUIGEgYHRyYWNlcGFyZW50YCBjb21lcyBmcm9tIHdob2V2ZXIgc2VudCB0aGUgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5Db3JyZWxhdGlvbiB7XG4gIC8qKiBgZW52LnRyYWNlSWRgLCBlbHNlIHRoZSB0cmFjZSBpZCBvZiBgZW52LnRyYWNlcGFyZW50YCAoMzIgbG93ZXJjYXNlIGhleCkuICovXG4gIHJlYWRvbmx5IHRyYWNlSWQ6IHN0cmluZztcbiAgLyoqIGBlbnYub3BlcmF0aW9uSWRgLCBlbHNlIHRoZSBoZWFkZXIncyBwYXJlbnQtaWQgKG9ubHkgd2hpbGUgdGhlIHRyYWNlIGlzIHRoZSBoZWFkZXIncyk6IHRoZSBjYWxsZXIncyB1bml0IG9mIHdvcmsuICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkPzogc3RyaW5nO1xuICAvKiogVGhlIGhlYWRlcidzIHNhbXBsZWQgZmxhZyAoYml0IDAgb2YgdHJhY2UtZmxhZ3MpIOKAlCBwcmVzZW50IG9ubHkgd2hpbGUgdGhlIHRyYWNlIGlzIHRoZSBoZWFkZXIncy4gQSBoaW50LiAqL1xuICByZWFkb25seSBzYW1wbGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBjYW5vbmljYWwgaGVhZGVyIG9mIHRoZSBFRkZFQ1RJVkUgaWRzIChgZm9ybWF0VHJhY2VwYXJlbnRgKSDigJQgZm9yIHByb3BhZ2F0aW5nIHRoZSB0cmFjZSBvbndhcmQuIFByZXNlbnRcbiAgICogb25seSB3aGlsZSB0aGUgdHJhY2UgaXMgdGhlIGhlYWRlcidzIGFuZCB0aGUgb3BlcmF0aW9uIGlzIGEgVzNDIHBhcmVudC1pZDsgbmV2ZXIgdGhlIHJlY2VpdmVkIGJ5dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2VwYXJlbnQ/OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* budget/ — the static time budget: the slowest a built chart can take, from its declared retry policies, and every
|
|
3
|
+
* stage that makes a path unbounded (design docs/design/2026-10-time-and-failure-evidence.md §3.2, packet P5).
|
|
4
|
+
*
|
|
5
|
+
* Public: `timeBudget` and its report types. `budgetRefusal` / `budgetWarning` are the builder's words for
|
|
6
|
+
* `build()`; `warnDeadlineUnderBudget` is the executor's run-start warning.
|
|
7
|
+
*/
|
|
8
|
+
export type { BudgetAssumptions, BudgetStep, TimeBudgetOptions, TimeBudgetReport, UnboundedReason, UnboundedStage, } from './timeBudget.js';
|
|
9
|
+
export { budgetRefusal, budgetWarning, declaredBudget, timeBudget, warnDeadlineUnderBudget } from './timeBudget.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* budget/ — the static time budget: the slowest a built chart can take, from its declared retry policies, and every
|
|
3
|
+
* stage that makes a path unbounded (design docs/design/2026-10-time-and-failure-evidence.md §3.2, packet P5).
|
|
4
|
+
*
|
|
5
|
+
* Public: `timeBudget` and its report types. `budgetRefusal` / `budgetWarning` are the builder's words for
|
|
6
|
+
* `build()`; `warnDeadlineUnderBudget` is the executor's run-start warning.
|
|
7
|
+
*/
|
|
8
|
+
export { budgetRefusal, budgetWarning, declaredBudget, timeBudget, warnDeadlineUnderBudget } from './timeBudget.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2J1ZGdldC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFVSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJ1ZGdldC8g4oCUIHRoZSBzdGF0aWMgdGltZSBidWRnZXQ6IHRoZSBzbG93ZXN0IGEgYnVpbHQgY2hhcnQgY2FuIHRha2UsIGZyb20gaXRzIGRlY2xhcmVkIHJldHJ5IHBvbGljaWVzLCBhbmQgZXZlcnlcbiAqIHN0YWdlIHRoYXQgbWFrZXMgYSBwYXRoIHVuYm91bmRlZCAoZGVzaWduIGRvY3MvZGVzaWduLzIwMjYtMTAtdGltZS1hbmQtZmFpbHVyZS1ldmlkZW5jZS5tZCDCpzMuMiwgcGFja2V0IFA1KS5cbiAqXG4gKiBQdWJsaWM6IGB0aW1lQnVkZ2V0YCBhbmQgaXRzIHJlcG9ydCB0eXBlcy4gYGJ1ZGdldFJlZnVzYWxgIC8gYGJ1ZGdldFdhcm5pbmdgIGFyZSB0aGUgYnVpbGRlcidzIHdvcmRzIGZvclxuICogYGJ1aWxkKClgOyBgd2FybkRlYWRsaW5lVW5kZXJCdWRnZXRgIGlzIHRoZSBleGVjdXRvcidzIHJ1bi1zdGFydCB3YXJuaW5nLlxuICovXG5cbmV4cG9ydCB0eXBlIHtcbiAgQnVkZ2V0QXNzdW1wdGlvbnMsXG4gIEJ1ZGdldFN0ZXAsXG4gIFRpbWVCdWRnZXRPcHRpb25zLFxuICBUaW1lQnVkZ2V0UmVwb3J0LFxuICBVbmJvdW5kZWRSZWFzb24sXG4gIFVuYm91bmRlZFN0YWdlLFxufSBmcm9tICcuL3RpbWVCdWRnZXQuanMnO1xuZXhwb3J0IHsgYnVkZ2V0UmVmdXNhbCwgYnVkZ2V0V2FybmluZywgZGVjbGFyZWRCdWRnZXQsIHRpbWVCdWRnZXQsIHdhcm5EZWFkbGluZVVuZGVyQnVkZ2V0IH0gZnJvbSAnLi90aW1lQnVkZ2V0LmpzJztcbiJdfQ==
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* budget/timeBudget.ts — `timeBudget(chart)`: the slowest a chart can take, from what it declares (design
|
|
3
|
+
* docs/design/2026-10-time-and-failure-evidence.md §3.2, packet P5).
|
|
4
|
+
*
|
|
5
|
+
* WHY: a retry policy is a promise about time. `{ attempts: 4, timeoutMs: 40_000, backoffMs: 1_000 }` allows
|
|
6
|
+
* 4 × 40 000 + 3 × 1 000 = 163 000 ms, and a caller who gave the chart 120 s is not served by it — which is
|
|
7
|
+
* knowable before a single stage runs. `.budget(ms)` declares the caller's contract on the chart; `build()` refuses
|
|
8
|
+
* a chart whose declared policies already allow longer (owner ruling Q2) and warns, by name, about every stage it
|
|
9
|
+
* cannot bound. An unbounded stage is never guessed around: it is counted as 0 and named.
|
|
10
|
+
*
|
|
11
|
+
* THE RULES (one walk of the built StageNode graph; each chain of `next` pointers is computed once per start):
|
|
12
|
+
* - a stage with a function: `attempts × timeoutMs` plus the waits between its attempts, as the runner waits them
|
|
13
|
+
* (`attempt/policy.ts`). A number `backoffMs` is arithmetic, under `maxBackoffMs` when declared. A FUNCTION is
|
|
14
|
+
* never asked: it may read the error (a stated `Retry-After`) and no error exists here, so asking it with none
|
|
15
|
+
* could UNDERESTIMATE. It counts at its declared ceiling, `maxBackoffMs` per wait (the runner enforces it); with
|
|
16
|
+
* no ceiling the stage is unbounded `'backoff'`. No `timeoutMs` → unbounded `'no-timeout'`;
|
|
17
|
+
* - a sequence: the sum. A decider, a selector, a fork: the node's own stage plus its slowest child (a fork's
|
|
18
|
+
* children, and a selector's picks, run at once);
|
|
19
|
+
* - a mounted subflow: its chart, walked the same way, under the ids the run gives its stages (`pay/charge`);
|
|
20
|
+
* a lazy one is unbounded `'lazy-subflow'` unless `assume.lazy[subflowId]` names the chart it resolves to;
|
|
21
|
+
* - `parallelForEach`: ONE branch — the branches run at once and `maxBranches` truncates, so the item count never
|
|
22
|
+
* adds time. The branch chart is built at run time, so it is unbounded `'items'` unless
|
|
23
|
+
* `assume.branches[stageId]` names it (its stages are reported under the first branch, `review~0/score`);
|
|
24
|
+
* - a loop is NEVER iterated. With no assumption it is unbounded `'loop'`, named by its target, and counted once.
|
|
25
|
+
* `assume.loops[targetId] = n` bounds it: each time the chart reaches the loop, every stage from the target to
|
|
26
|
+
* the loop's furthest source runs at most `n` times, each at its slowest. Nested loops multiply; two loops that
|
|
27
|
+
* overlap without nesting are one region bounded by the product of their passes (each can re-enter the other).
|
|
28
|
+
*
|
|
29
|
+
* TWO NUMBERS. `knownMs` counts what is bounded (an unbounded stage as 0, an unassumed loop once). Without
|
|
30
|
+
* assumptions it is a time the declared policies ALLOW a run to take (`retryOn` is not read: it may only end a series
|
|
31
|
+
* sooner), so a budget below it cannot be promised — `over` and the build refusal read it, on an unbounded path too.
|
|
32
|
+
* `worstCaseMs` is `knownMs` when every path is bounded, `null` otherwise; with an assumed loop it is an upper bound
|
|
33
|
+
* under that assumption (every pass is counted at its slowest branch).
|
|
34
|
+
*
|
|
35
|
+
* THREAT MODEL. The walk terminates on any graph: a chain is walked with a visited set (a `next` that closes on
|
|
36
|
+
* itself is a loop), nesting is an explicit stack (no recursion — a 5 000-deep subflow nesting walks), a chain that
|
|
37
|
+
* reaches itself through its children or a subflow is a loop, and every chain is computed once per start however
|
|
38
|
+
* often it is mounted. The walk is CAPPED: past `MAX_WALK` node visits it stops with a `RangeError` — a builder chart
|
|
39
|
+
* visits each node at most twice, but a hand-built graph whose chains share their tails is walked once per chain.
|
|
40
|
+
* Sums and products saturate at `Number.MAX_SAFE_INTEGER` — never `Infinity` or `NaN`. Assumptions are copied ONCE,
|
|
41
|
+
* own enumerable properties only, into fresh null-prototype records, and only that copy is read.
|
|
42
|
+
*
|
|
43
|
+
* What it does NOT count: the engine's own work between stages, a stage function that blocks the thread (a timeout
|
|
44
|
+
* stops the WAITING, see the attempt runner), and a StageNode a stage returns at run time — any stage may grow the
|
|
45
|
+
* graph that way, so the budget is of the graph the chart DECLARES.
|
|
46
|
+
*/
|
|
47
|
+
import type { FlowChart } from '../builder/types.js';
|
|
48
|
+
/**
|
|
49
|
+
* Why a stage keeps a path unbounded: no per-attempt cap (`'no-timeout'`); a function backoff with no declared
|
|
50
|
+
* `maxBackoffMs` (`'backoff'` — its waits may depend on an error that does not exist at build); a loop with no
|
|
51
|
+
* assumed passes (`'loop'`, named by its target); a lazy subflow whose chart is unknown at build (`'lazy-subflow'`);
|
|
52
|
+
* a `parallelForEach` whose branch chart is built at run time (`'items'`).
|
|
53
|
+
*/
|
|
54
|
+
export type UnboundedReason = 'no-timeout' | 'backoff' | 'loop' | 'lazy-subflow' | 'items';
|
|
55
|
+
/** A stage on the slowest path, with what it declares and how many times the path runs it. */
|
|
56
|
+
export interface BudgetStep {
|
|
57
|
+
/** The stage id as the run names it — a subflow's stages under their mount (`pay/charge`). */
|
|
58
|
+
readonly stageId: string;
|
|
59
|
+
/** How many attempts its policy allows (1 without one). */
|
|
60
|
+
readonly attempts: number;
|
|
61
|
+
/** The cap on one attempt; absent when the stage declares none (then `worstMs` is `null`). */
|
|
62
|
+
readonly timeoutMs?: number;
|
|
63
|
+
/** The waits between its attempts, in total. */
|
|
64
|
+
readonly backoffMs: number;
|
|
65
|
+
/** `attempts × timeoutMs + backoffMs` — `null` when the stage is unbounded. */
|
|
66
|
+
readonly worstMs: number | null;
|
|
67
|
+
/** How many times the path runs it — more than 1 only inside an assumed loop. */
|
|
68
|
+
readonly passes: number;
|
|
69
|
+
}
|
|
70
|
+
/** A stage the check cannot bound, and why. */
|
|
71
|
+
export interface UnboundedStage {
|
|
72
|
+
readonly stageId: string;
|
|
73
|
+
readonly why: UnboundedReason;
|
|
74
|
+
}
|
|
75
|
+
/** What the caller knows that the chart does not declare. Keys are ids as the run names them. */
|
|
76
|
+
export interface BudgetAssumptions {
|
|
77
|
+
/** A loop's TARGET id (what `loopTo` names) → the most passes through it each time the chart reaches it (≥ 1). */
|
|
78
|
+
readonly loops?: Readonly<Record<string, number>>;
|
|
79
|
+
/** A lazy mount's subflow id → the chart it resolves to. */
|
|
80
|
+
readonly lazy?: Readonly<Record<string, FlowChart>>;
|
|
81
|
+
/** A `parallelForEach` stage id → the chart one branch runs. */
|
|
82
|
+
readonly branches?: Readonly<Record<string, FlowChart>>;
|
|
83
|
+
}
|
|
84
|
+
export interface TimeBudgetOptions {
|
|
85
|
+
/** The budget to check against. Defaults to the chart's declared `.budget(ms)`. A finite number > 0. */
|
|
86
|
+
readonly budgetMs?: number;
|
|
87
|
+
readonly assume?: BudgetAssumptions;
|
|
88
|
+
}
|
|
89
|
+
/** What `timeBudget(chart)` reports. JSON-safe and frozen. */
|
|
90
|
+
export interface TimeBudgetReport {
|
|
91
|
+
/** The worst case of the slowest path — `null` when any path is unbounded (see `unbounded`). */
|
|
92
|
+
readonly worstCaseMs: number | null;
|
|
93
|
+
/** The worst case of what IS bounded: an unbounded stage counts 0, an unassumed loop one pass. */
|
|
94
|
+
readonly knownMs: number;
|
|
95
|
+
/** The stages of the slowest path, in the order a run first reaches them — the path that makes `worstCaseMs`,
|
|
96
|
+
* or `knownMs` when a path is unbounded. `knownMs = Σ passes × (attempts × (timeoutMs ?? 0) + backoffMs)`. */
|
|
97
|
+
readonly criticalPath: readonly BudgetStep[];
|
|
98
|
+
/** Every stage that keeps a path unbounded, each named once, in chart order. */
|
|
99
|
+
readonly unbounded: readonly UnboundedStage[];
|
|
100
|
+
/** The budget checked against — absent when there is none. */
|
|
101
|
+
readonly budgetMs?: number;
|
|
102
|
+
/** `knownMs > budgetMs`: the declared policies allow longer than the budget. Always `false` without one. */
|
|
103
|
+
readonly over: boolean;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The most node visits one walk makes. A builder chart visits each node at most twice, so 250 000 is far past any
|
|
107
|
+
* real chart; a hand-built graph whose chains share their tails can need more (each chain walks the shared tail),
|
|
108
|
+
* and the check stops there with a `RangeError` rather than grow without bound.
|
|
109
|
+
*/
|
|
110
|
+
export declare const MAX_WALK = 250000;
|
|
111
|
+
/**
|
|
112
|
+
* The slowest the chart can take, computed from its declared retry policies — and every stage that makes a path
|
|
113
|
+
* unbounded, by name. See the module header for the rules.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* const report = timeBudget(chart, { budgetMs: 120_000, assume: { loops: { 'ask-again': 3 } } });
|
|
118
|
+
* report.worstCaseMs; // number, or null when a path is unbounded
|
|
119
|
+
* report.criticalPath; // [{ stageId, attempts, timeoutMs, backoffMs, worstMs, passes }]
|
|
120
|
+
* report.unbounded; // [{ stageId, why: 'no-timeout' | 'backoff' | 'loop' | 'lazy-subflow' | 'items' }]
|
|
121
|
+
* report.over; // true when the declared policies allow longer than budgetMs
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare function timeBudget(chart: FlowChart, options?: TimeBudgetOptions): TimeBudgetReport;
|
|
125
|
+
/** The chart's declared budget (`.budget(ms)`, the spec root's `budgetMs`), or `undefined`. */
|
|
126
|
+
export declare function declaredBudget(chart: FlowChart): number | undefined;
|
|
127
|
+
/** `build()`'s refusal for a declared budget the chart can already exceed, or `undefined` when it can keep it. */
|
|
128
|
+
export declare function budgetRefusal(report: TimeBudgetReport): string | undefined;
|
|
129
|
+
/** `build()`'s dev-mode warning for a declared budget it cannot check on every path, or `undefined`. */
|
|
130
|
+
export declare function budgetWarning(report: TimeBudgetReport, chartName: string): string | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* The run-start warning (dev mode, once per chart): the run's deadline leaves the chart less time than its declared
|
|
133
|
+
* budget, so a run that takes the time the chart declares will be cut short. `startedAt` is read BEFORE the run's
|
|
134
|
+
* deadline is armed, so `timeoutMs` equal to the budget never warns.
|
|
135
|
+
*/
|
|
136
|
+
export declare function warnDeadlineUnderBudget(chart: FlowChart, deadline: number | undefined, startedAt: number): void;
|