footprintjs 9.48.2 → 10.0.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 +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* time-travel/types.ts — the shapes of the reader's cursor.
|
|
3
|
-
*
|
|
4
|
-
* WHY THIS MODULE EXISTS (context for future readers, human or LLM):
|
|
5
|
-
* Time travel in footprintjs is a READER'S cursor over a FINISHED trace, with
|
|
6
|
-
* a fold at each stop. It is not the Walker — the engine's traversal — and it
|
|
7
|
-
* must never become a second live cursor: nothing here can move, re-run or
|
|
8
|
-
* mutate an execution. Every consumer (a why-panel, a flow view, a chart
|
|
9
|
-
* dashboard) was writing the same commit-index arithmetic by hand, from the
|
|
10
|
-
* same commit log, and disagreeing about the answers. This is that arithmetic,
|
|
11
|
-
* once, in the library that owns the substrate.
|
|
12
|
-
*
|
|
13
|
-
* DAG position: memory ← time-travel. Every file here is a record file
|
|
14
|
-
* (`RECORD_FILES`, scripts/layering.config.cjs, C6): it may import only record
|
|
15
|
-
* files — memory/, the id grammar (`ids/runtimeStageId`), and the record's two
|
|
16
|
-
* capture/ leaves (`freeze`, `valueKinds`). Recorders, traversal and runner
|
|
17
|
-
* must never be imported here; the snapshot arrives as a plain structural
|
|
18
|
-
* shape ({@link FoldSource}, {@link TimeTravelSource}, the record's own
|
|
19
|
-
* `ExecutionTree` for the tree) so a stored JSON trace works exactly like a
|
|
20
|
-
* live `getSnapshot()`.
|
|
21
|
-
*/
|
|
22
|
-
import type { RegisteredCode } from '../memory/honesty.js';
|
|
23
|
-
import type { CommitBundle, ExecutionTree } from '../memory/types.js';
|
|
24
|
-
/**
|
|
25
|
-
* Anything that carries a commit log and (ideally) its fold base.
|
|
26
|
-
*
|
|
27
|
-
* Two field spellings, because the library already has two: the run's log is
|
|
28
|
-
* `commitLog` (`getSnapshot()`), a subflow's is `history`
|
|
29
|
-
* (`getSubtreeSnapshot()` / `subflowResults[...].treeContext`). Both are
|
|
30
|
-
* accepted so a caller never has to reshape a snapshot to ask a question.
|
|
31
|
-
*
|
|
32
|
-
* BOTH SPELLINGS TAKE `readonly unknown[]` (9.18.0). A live snapshot hands
|
|
33
|
-
* over real {@link CommitBundle}s and is assignable exactly as before; a
|
|
34
|
-
* STORED recording is parsed JSON, and a careful consumer will not claim that
|
|
35
|
-
* what came back off disk is a `CommitBundle`. The narrowing therefore happens
|
|
36
|
-
* HERE, per bundle, where the fold actually reads one — the only place that
|
|
37
|
-
* can honestly do it. An entry that is not a bundle becomes a GAP: it keeps
|
|
38
|
-
* its index (so every `commitIdx` still addresses the same position), it
|
|
39
|
-
* contributes no state, it gets no stop, and any fold that crosses it reports
|
|
40
|
-
* it in {@link FoldedState.skipped} with the index and the reason.
|
|
41
|
-
*
|
|
42
|
-
* EVERY FIELD IS OPTIONAL, deliberately the same shape {@link TimeTravelSource}
|
|
43
|
-
* has: a consumer's stored-recording type (`commitLog?: readonly unknown[]`)
|
|
44
|
-
* drives `stateAt` and `timeTravel` alike, with no cast at either. A source
|
|
45
|
-
* with neither spelling present folds to its base and reports
|
|
46
|
-
* `throughCommitIdx: -1` — the truthful answer for a log that was not there.
|
|
47
|
-
*
|
|
48
|
-
* THIS IS AN INPUT SHAPE. Nothing typed as a `FoldSource` promises that its
|
|
49
|
-
* rows are bundles; code that wants to read `CommitBundle` fields back OUT of
|
|
50
|
-
* one must narrow each row with `isCommitBundle` first.
|
|
51
|
-
*/
|
|
52
|
-
export type FoldSource = {
|
|
53
|
-
/** The run's commit log. May be ABSENT (a stored recording's optional field): an absent log folds to the base. */
|
|
54
|
-
readonly commitLog?: readonly unknown[];
|
|
55
|
-
/** A subflow subtree's own log — the same thing under its other name. */
|
|
56
|
-
readonly history?: readonly unknown[];
|
|
57
|
-
readonly initialState?: Record<string, unknown>;
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* A snapshot-shaped source for {@link timeTravel}.
|
|
61
|
-
*
|
|
62
|
-
* Every field is optional and the structural ones are `unknown` (9.18.0), so
|
|
63
|
-
* a live `getSnapshot()` is assignable exactly as it was AND so is a stored
|
|
64
|
-
* recording a consumer typed honestly — `commitLog: readonly unknown[]`,
|
|
65
|
-
* `executionTree: unknown` — because parsed JSON is not an execution tree
|
|
66
|
-
* until something says so. The narrowing happens inside: rows per bundle
|
|
67
|
-
* (see {@link FoldSource}), the tree and the subflow results as plain
|
|
68
|
-
* objects, anything else read as absent.
|
|
69
|
-
*/
|
|
70
|
-
export interface TimeTravelSource {
|
|
71
|
-
/** The run's commit log. See {@link FoldSource} on why this is `unknown[]`. */
|
|
72
|
-
readonly commitLog?: readonly unknown[];
|
|
73
|
-
/** A subflow subtree's own log — the same thing under its other name. */
|
|
74
|
-
readonly history?: readonly unknown[];
|
|
75
|
-
readonly initialState?: Record<string, unknown>;
|
|
76
|
-
/**
|
|
77
|
-
* The run's execution tree (`getSnapshot().executionTree`) — what makes a
|
|
78
|
-
* mount stop say `kind: 'mount'` authoritatively instead of by shape. A live
|
|
79
|
-
* snapshot hands its `StageSnapshot` tree, which is an {@link ExecutionTree};
|
|
80
|
-
* a stored one hands parsed JSON, which is read as a tree when it is a plain
|
|
81
|
-
* object and ignored otherwise.
|
|
82
|
-
*/
|
|
83
|
-
readonly executionTree?: ExecutionTree | unknown;
|
|
84
|
-
/**
|
|
85
|
-
* Dual-keyed subflow results (`getSnapshot().subflowResults`) — what
|
|
86
|
-
* {@link TimeTravel.drill} navigates. Absent, or not a plain object ⇒
|
|
87
|
-
* `drill` always returns `undefined`, which is the honest answer for a run
|
|
88
|
-
* with no subflows.
|
|
89
|
-
*/
|
|
90
|
-
readonly subflowResults?: Record<string, unknown> | unknown;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* One entry of a source's log that could not be read as a {@link CommitBundle}.
|
|
94
|
-
*
|
|
95
|
-
* Reported rather than thrown: a stored recording with one corrupt row is
|
|
96
|
-
* still worth reading, and a reader that is told WHICH index it lost can say
|
|
97
|
-
* so on screen. `index` is the position in that source's own log.
|
|
98
|
-
*
|
|
99
|
-
* Registry code: `'log-gap'` (`memory/honesty.ts · HONESTY_CODES`, served on
|
|
100
|
-
* `footprintjs/trace`) says what a gap means. A gap carries no `code` field —
|
|
101
|
-
* it is registered so a reader explains it from the same place as the other
|
|
102
|
-
* honesty signals.
|
|
103
|
-
*/
|
|
104
|
-
export interface LogGap {
|
|
105
|
-
/** ARRAY INDEX in the source's log — the address the gap occupies. */
|
|
106
|
-
readonly index: number;
|
|
107
|
-
/** Why it is not a bundle, in words a UI can print. */
|
|
108
|
-
readonly reason: string;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* What kind of position a stop is.
|
|
112
|
-
*
|
|
113
|
-
* - `'commit'` — one executed stage.
|
|
114
|
-
* - `'mount'` — a subflow mount: the boundary whose inner stages live in the
|
|
115
|
-
* subflow's OWN log (drill into it with {@link TimeTravel.drill}).
|
|
116
|
-
* - `'start'` — the bookend BEFORE the first stop of THIS axis. What it folds
|
|
117
|
-
* depends on the strategy, and the difference is load-bearing:
|
|
118
|
-
* - on a strategy that keeps every stage (`commitStops`, the one shipped)
|
|
119
|
-
* it is the run's fold BASE — the state no commit index can reach — plus
|
|
120
|
-
* the subflow's `inputMapper` seed when the log opens with one (the
|
|
121
|
-
* mount's commit, stamped with the mount's runtimeStageId since R13 and
|
|
122
|
-
* with `''` through 9.33.0). So on a drilled cursor it is exactly "the
|
|
123
|
-
* input this subflow began with".
|
|
124
|
-
* - on a strategy that FILTERS stages out, the commits of the dropped
|
|
125
|
-
* stages that ran BEFORE the first surviving stop have to fold somewhere,
|
|
126
|
-
* and `'start'` is the only place they can go without orphaning them. Its
|
|
127
|
-
* fold is then the base PLUS that prologue — the state the first stop
|
|
128
|
-
* READ, not the run's raw base. Such a start MUST say so by setting
|
|
129
|
-
* {@link Stop.prologue}; a renderer that means "the run's raw base" reads
|
|
130
|
-
* `kind === 'start' && !stop.prologue`, and gets a true answer on every
|
|
131
|
-
* axis instead of one that is true only on the library's own.
|
|
132
|
-
* - `'end'` — the bookend after the last commit: "the run is over". Its
|
|
133
|
-
* fold equals the final stage's by construction; the two are different
|
|
134
|
-
* questions, not a duplicated answer.
|
|
135
|
-
*
|
|
136
|
-
* NOT WIDENED, DELIBERATELY. A filtering strategy's start could have been a
|
|
137
|
-
* fifth kind (`'prologue'`), but adding a member to this union breaks every
|
|
138
|
-
* consumer with an exhaustive `switch` over it — a compile error handed to
|
|
139
|
-
* readers who did nothing wrong. A flag on the stop says the same thing and
|
|
140
|
-
* costs an existing reader nothing.
|
|
141
|
-
*/
|
|
142
|
-
export type StopKind = 'commit' | 'mount' | 'start' | 'end';
|
|
143
|
-
/**
|
|
144
|
-
* One position a reader's cursor can rest at.
|
|
145
|
-
*
|
|
146
|
-
* @typeParam TMeta the STRATEGY'S own vocabulary, carried opaquely in
|
|
147
|
-
* {@link Stop.meta}. Defaults to `unknown`, so every pre-9.18 `Stop` still
|
|
148
|
-
* means what it meant.
|
|
149
|
-
*/
|
|
150
|
-
export interface Stop<TMeta = unknown> {
|
|
151
|
-
/** Position in `TimeTravel.stops` — 0-based, the cursor's step number. */
|
|
152
|
-
readonly step: number;
|
|
153
|
-
/**
|
|
154
|
-
* The stage this stop is: `[subflowPath/]stageId#executionIndex`.
|
|
155
|
-
* `''` for the `'start'` / `'end'` bookends, which are not stages.
|
|
156
|
-
*/
|
|
157
|
-
readonly runtimeStageId: string;
|
|
158
|
-
/**
|
|
159
|
-
* ARRAY INDEX of this stop's FIRST commit bundle; `-1` at `'start'`.
|
|
160
|
-
* This is the stop's address on the commit axis.
|
|
161
|
-
*
|
|
162
|
-
* Indices are SOURCE-LOCAL. On a chained cursor (see
|
|
163
|
-
* {@link timeTravel}) they index the log of {@link Stop.sourceIdx}, never a
|
|
164
|
-
* concatenation — commit indices are run-local and the library will not
|
|
165
|
-
* invent a global one.
|
|
166
|
-
*/
|
|
167
|
-
readonly commitIdx: number;
|
|
168
|
-
/**
|
|
169
|
-
* ARRAY INDEX of the LAST commit bundle folded at this stop — the end of
|
|
170
|
-
* this stop's slice of the log. Stops PARTITION the log, so this is the
|
|
171
|
-
* index just before the next stop begins; it is greater than
|
|
172
|
-
* {@link commitIdx} whenever a stage committed more than one bundle (a
|
|
173
|
-
* subflow mount's output-mapping + exit pair, a fork child's empty repeat),
|
|
174
|
-
* and greater again on a filtering strategy, which absorbs the commits of
|
|
175
|
-
* the stages it dropped. Folding through this index — not through
|
|
176
|
-
* `commitIdx` — is what makes `stateAt(stop)` equal the state the next
|
|
177
|
-
* stage started from.
|
|
178
|
-
*/
|
|
179
|
-
readonly lastCommitIdx: number;
|
|
180
|
-
/** Stable stage id from the builder (the post-mount, prefixed form). */
|
|
181
|
-
readonly stageId: string;
|
|
182
|
-
/** Subflow path this stage ran under, when it ran inside one. */
|
|
183
|
-
readonly subflowPath?: string;
|
|
184
|
-
/** Human-readable stage name — what a UI puts on the axis tick. */
|
|
185
|
-
readonly label: string;
|
|
186
|
-
readonly kind: StopKind;
|
|
187
|
-
/**
|
|
188
|
-
* THE STRATEGY'S OWN VOCABULARY, carried verbatim. The port assigns it NO
|
|
189
|
-
* meaning: it never reads it, never validates it, never branches on it, and
|
|
190
|
-
* passes it through `timeTravel`, `jumpTo`, `drill` and marks BY REFERENCE
|
|
191
|
-
* — never cloned, never frozen. The stop holds the very object the strategy
|
|
192
|
-
* put there, so a mutation through one holder is visible to every other.
|
|
193
|
-
*
|
|
194
|
-
* WHY IT EXISTS. {@link kind} is the PORT's vocabulary — the four positions
|
|
195
|
-
* the substrate itself knows. A domain strategy classifies stages in its own
|
|
196
|
-
* terms (a milestone, a turn, a tool call, a beat) and had nowhere to put
|
|
197
|
-
* that, so the answer travelled by re-deriving it from `runtimeStageId` at
|
|
198
|
-
* every read: a second run of the classifier that just ran, and a second
|
|
199
|
-
* chance to disagree with it. A stop now carries what its strategy knew.
|
|
200
|
-
*
|
|
201
|
-
* Absent on every stop `commitStops` produces — the shipped strategy has no
|
|
202
|
-
* vocabulary beyond `kind`, and says so by omission rather than by `null`.
|
|
203
|
-
*/
|
|
204
|
-
readonly meta?: TMeta;
|
|
205
|
-
/**
|
|
206
|
-
* Only meaningful on `kind: 'start'`. `true` when this start folds the
|
|
207
|
-
* commits of STAGES THIS AXIS DOES NOT SHOW — the prologue a filtering
|
|
208
|
-
* strategy must put somewhere. Absent (never `false`) on an axis whose start
|
|
209
|
-
* is the run's raw fold base.
|
|
210
|
-
*
|
|
211
|
-
* A reader that wants "the state before anything ran" checks
|
|
212
|
-
* `kind === 'start' && !prologue`; one that wants "the state the first stop
|
|
213
|
-
* read" just folds the start. See {@link StopKind}.
|
|
214
|
-
*/
|
|
215
|
-
readonly prologue?: true;
|
|
216
|
-
/**
|
|
217
|
-
* Which SOURCE this stop's commit indices belong to, on a chained cursor —
|
|
218
|
-
* the position in the array handed to {@link timeTravel}. Absent on a cursor
|
|
219
|
-
* over a single source, which is every cursor built before 9.18.0.
|
|
220
|
-
*/
|
|
221
|
-
readonly sourceIdx?: number;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* The `[start, …stages, end]` shape `commitStops` returns for a NON-EMPTY log
|
|
225
|
-
* — split out, so a strategy that composes it stops writing its own guard.
|
|
226
|
-
*
|
|
227
|
-
* See {@link splitAxis}.
|
|
228
|
-
*/
|
|
229
|
-
export interface BookendedAxis<TMeta = unknown> {
|
|
230
|
-
/** The `'start'` bookend — the only stop that may open at `commitIdx: -1`. */
|
|
231
|
-
readonly start: Stop<TMeta>;
|
|
232
|
-
/** Everything between the bookends, in execution order. May be empty. */
|
|
233
|
-
readonly stages: readonly Stop<TMeta>[];
|
|
234
|
-
/** The `'end'` bookend — the only stop that folds the whole log. */
|
|
235
|
-
readonly end: Stop<TMeta>;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* What {@link splitAxis} answers when there is no bookended axis to split.
|
|
239
|
-
*
|
|
240
|
-
* - `'empty'` — no stops at all. The log itself was empty; a truthful axis
|
|
241
|
-
* with nowhere to stand, NOT a broken one.
|
|
242
|
-
* - `'not-bookended'` — stops exist but the first is not a `'start'` or the
|
|
243
|
-
* last is not an `'end'`. Only a strategy can cause this; a run cannot.
|
|
244
|
-
*/
|
|
245
|
-
export type AxisRefusal = 'empty' | 'not-bookended';
|
|
246
|
-
/** The result of {@link splitAxis}: the axis, or why there is none. */
|
|
247
|
-
export type AxisSplit<TMeta = unknown> = ({
|
|
248
|
-
readonly ok: true;
|
|
249
|
-
} & BookendedAxis<TMeta>) | {
|
|
250
|
-
readonly ok: false;
|
|
251
|
-
readonly reason: AxisRefusal;
|
|
252
|
-
/** The kinds that were actually there — what to print in the refusal. */
|
|
253
|
-
readonly kinds: readonly StopKind[];
|
|
254
|
-
};
|
|
255
|
-
/**
|
|
256
|
-
* How a folded state was derived — the honesty field (`'initial+log'` or
|
|
257
|
-
* `'log-only'`). A partial answer says it is partial, never a silent one.
|
|
258
|
-
*
|
|
259
|
-
* What each value means is registered ONCE, with the other honesty signals, in
|
|
260
|
-
* `memory/honesty.ts · HONESTY_CODES` (served as `HONESTY_CODES` on
|
|
261
|
-
* `footprintjs/trace`); this union declares its members through
|
|
262
|
-
* `RegisteredCode`, so a code the registry does not hold does not compile.
|
|
263
|
-
*/
|
|
264
|
-
export type FoldBasis = RegisteredCode<'initial+log' | 'log-only'>;
|
|
265
|
-
/** A detached fold of the log up to one stop. */
|
|
266
|
-
export interface FoldedState {
|
|
267
|
-
/** The state, deeply frozen and fully detached from the engine. */
|
|
268
|
-
readonly state: Record<string, unknown>;
|
|
269
|
-
/** How it was derived — see {@link FoldBasis}. */
|
|
270
|
-
readonly basis: FoldBasis;
|
|
271
|
-
/**
|
|
272
|
-
* `true` when any commit folded in declared redacted paths, so this state
|
|
273
|
-
* carries `'REDACTED'` placeholders where the engine scrubbed values at
|
|
274
|
-
* write time. The log is redacted where it was written; a fold must SAY so
|
|
275
|
-
* rather than present a scrubbed value as the real one.
|
|
276
|
-
*
|
|
277
|
-
* Registry code: `'redacted'` (`memory/honesty.ts · HONESTY_CODES`, served on
|
|
278
|
-
* `footprintjs/trace`) says what this field and {@link FoldedState.redactedPaths} mean;
|
|
279
|
-
* neither carries a `code`. The placeholder is the log's string,
|
|
280
|
-
* `memory/placeholders.ts · LOG_PLACEHOLDER`.
|
|
281
|
-
*/
|
|
282
|
-
readonly redacted: boolean;
|
|
283
|
-
/** The redacted paths seen across the folded prefix — sorted, deduped. */
|
|
284
|
-
readonly redactedPaths: readonly string[];
|
|
285
|
-
/** The last commit index folded in; `-1` when nothing was folded. */
|
|
286
|
-
readonly throughCommitIdx: number;
|
|
287
|
-
/**
|
|
288
|
-
* Entries of the folded prefix that were not commit bundles, with the index
|
|
289
|
-
* and the reason. ABSENT when nothing was skipped, which is every fold over
|
|
290
|
-
* a live snapshot — a clean fold's shape is byte-identical to 9.17.0's.
|
|
291
|
-
*
|
|
292
|
-
* A gap contributes no state, so a fold that reports one is INCOMPLETE at
|
|
293
|
-
* exactly the places it names.
|
|
294
|
-
*/
|
|
295
|
-
readonly skipped?: readonly LogGap[];
|
|
296
|
-
/**
|
|
297
|
-
* Which source of a CHAIN this fold ended in — `throughCommitIdx` indexes
|
|
298
|
-
* that source's log. Absent on a single-source cursor.
|
|
299
|
-
*/
|
|
300
|
-
readonly sourceIdx?: number;
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Why a move did not happen.
|
|
304
|
-
*
|
|
305
|
-
* - `'clamped'` — the move would land OUTSIDE the axis (`prev()` at the first
|
|
306
|
-
* stop, `next()` at the last, a step number below 0 or past the end), or on
|
|
307
|
-
* the very stop the cursor already stands on. Either way nothing moved. When
|
|
308
|
-
* the target was out of range, `nearest` names the end that was hit — the
|
|
309
|
-
* cursor itself may be nowhere near it.
|
|
310
|
-
* - `'miss'` — the target does not exist on this axis.
|
|
311
|
-
* - `'empty'` — this cursor has no stops at all (an empty log).
|
|
312
|
-
*/
|
|
313
|
-
export type MoveRefusal = 'clamped' | 'miss' | 'empty';
|
|
314
|
-
/**
|
|
315
|
-
* The result of asking the cursor to move.
|
|
316
|
-
*
|
|
317
|
-
* A refused move NEVER moves the cursor. That is the law a reader's UI rests
|
|
318
|
-
* on: a mistyped id or a step past the end leaves the panel showing exactly
|
|
319
|
-
* what it showed before, with a reason to display — never a silent jump to
|
|
320
|
-
* somewhere the user did not ask for.
|
|
321
|
-
*/
|
|
322
|
-
export type Move<TMeta = unknown> = {
|
|
323
|
-
readonly moved: true;
|
|
324
|
-
readonly from: Stop<TMeta> | undefined;
|
|
325
|
-
readonly to: Stop<TMeta>;
|
|
326
|
-
} | {
|
|
327
|
-
readonly moved: false;
|
|
328
|
-
readonly reason: MoveRefusal;
|
|
329
|
-
/** Where the cursor still is (absent only when there are no stops). */
|
|
330
|
-
readonly at?: Stop<TMeta>;
|
|
331
|
-
/** The closest stop to what was asked for, when one can be named. */
|
|
332
|
-
readonly nearest?: Stop<TMeta>;
|
|
333
|
-
};
|
|
334
|
-
/**
|
|
335
|
-
* A reader's bookmark. Lives BESIDE the log, in the {@link TimeTravel}
|
|
336
|
-
* instance — never written into the commit log or the snapshot, which are the
|
|
337
|
-
* run's record and not the reader's notes.
|
|
338
|
-
*
|
|
339
|
-
* A mark names its stop by `runtimeStageId`, not by step number: step numbers
|
|
340
|
-
* belong to one strategy's axis, `runtimeStageId` is the same stage on every
|
|
341
|
-
* axis, so a mark survives a change of strategy and a re-derivation of stops.
|
|
342
|
-
*/
|
|
343
|
-
export interface Mark {
|
|
344
|
-
readonly name: string;
|
|
345
|
-
readonly runtimeStageId: string;
|
|
346
|
-
/** The step the mark was placed at, on the axis in force at the time. */
|
|
347
|
-
readonly step: number;
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* How stops are DERIVED from a recorded log. The seam.
|
|
351
|
-
*
|
|
352
|
-
* footprintjs ships one strategy — `commitStops`, one stop per executed stage
|
|
353
|
-
* — because that is the only stop grammar the substrate itself knows. A
|
|
354
|
-
* consumer with a richer vocabulary (milestones, tool calls, turns) supplies
|
|
355
|
-
* its own and gets the same cursor over it, and puts that vocabulary on
|
|
356
|
-
* {@link Stop.meta} rather than re-deriving it at every read.
|
|
357
|
-
*
|
|
358
|
-
* The law a strategy must keep: stops are DERIVED FROM THE RECORDED LOG.
|
|
359
|
-
* A strategy may group, filter, label and order what was recorded. It may not
|
|
360
|
-
* re-walk the execution tree to synthesize a stop for something that was never
|
|
361
|
-
* committed — a cursor that stops where no evidence exists is telling a story,
|
|
362
|
-
* not reading one.
|
|
363
|
-
*
|
|
364
|
-
* ON A CHAIN, `stopsFor` is called ONCE PER SOURCE with that source's own log
|
|
365
|
-
* and tree, and the cursor re-steps the results into one axis. So a strategy
|
|
366
|
-
* never has to know it is part of a chain, and its `commitIdx`/`lastCommitIdx`
|
|
367
|
-
* stay source-local — which is what they always were.
|
|
368
|
-
*
|
|
369
|
-
* `subflowResults` (9.39.0) is the source's own `subflowResults`, as stored
|
|
370
|
-
* (untyped) — a mount's per-execution key names it a mount when no tree came
|
|
371
|
-
* with the log. A strategy may ignore it.
|
|
372
|
-
*
|
|
373
|
-
* `executionTree` is an {@link ExecutionTree} (9.48.0; a `StageSnapshot`
|
|
374
|
-
* before): the fields the record's readers read. A strategy written before
|
|
375
|
-
* 9.48.0 that annotates the parameter `StageSnapshot` still compiles — a
|
|
376
|
-
* method's parameters are compared both ways — but the annotation is a claim
|
|
377
|
-
* nothing checks: `timeTravel` hands a stored recording's tree over as parsed,
|
|
378
|
-
* so a field beyond these is read defensively. One left unannotated is typed
|
|
379
|
-
* by this signature.
|
|
380
|
-
*/
|
|
381
|
-
export interface TimeTravelStrategy<TMeta = unknown> {
|
|
382
|
-
stopsFor(commitLog: readonly CommitBundle[], executionTree?: ExecutionTree, subflowResults?: unknown): Stop<TMeta>[];
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* A reader's cursor over one finished log, with a fold at each stop.
|
|
386
|
-
*
|
|
387
|
-
* ONE cursor: this object holds the only position. Every question a reader
|
|
388
|
-
* asks — what changed here, what did state look like, what is inside this
|
|
389
|
-
* mount — is answered relative to it. `drill()` returns a SEPARATE cursor over
|
|
390
|
-
* a separate log (a subflow's own), never a second position on this one.
|
|
391
|
-
*/
|
|
392
|
-
export interface TimeTravel<TMeta = unknown> {
|
|
393
|
-
/** The axis, in execution order. Empty when the log is empty. */
|
|
394
|
-
readonly stops: readonly Stop<TMeta>[];
|
|
395
|
-
/** The subflow path this cursor covers; `undefined` for the run itself. */
|
|
396
|
-
readonly path: string | undefined;
|
|
397
|
-
/**
|
|
398
|
-
* The mount this cursor was drilled out of — `[subflowPath/]stageId#idx`.
|
|
399
|
-
* `undefined` on a run's own cursor.
|
|
400
|
-
*
|
|
401
|
-
* WHY BOTH: a subflow mounted inside a loop runs several times, and every
|
|
402
|
-
* iteration shares one {@link path}. This is the iteration that was actually
|
|
403
|
-
* opened, so three drill panels over `sfx#2`, `sfx#8` and `sfx#14` can be
|
|
404
|
-
* labelled and keyed apart instead of all reading `sfx`.
|
|
405
|
-
*/
|
|
406
|
-
readonly mountRuntimeStageId: string | undefined;
|
|
407
|
-
/** The cursor this one was drilled out of, if any. */
|
|
408
|
-
readonly parent: TimeTravel<TMeta> | undefined;
|
|
409
|
-
/**
|
|
410
|
-
* How many SOURCES this cursor reads — `1` for a normal cursor, more for a
|
|
411
|
-
* chained one (a pause/resume read as one axis). Every stop of a chained
|
|
412
|
-
* cursor carries the {@link Stop.sourceIdx} its indices belong to.
|
|
413
|
-
*/
|
|
414
|
-
readonly sourceCount: number;
|
|
415
|
-
/** Where the cursor is; `undefined` only when there are no stops. */
|
|
416
|
-
at(): Stop<TMeta> | undefined;
|
|
417
|
-
first(): Move<TMeta>;
|
|
418
|
-
last(): Move<TMeta>;
|
|
419
|
-
prev(): Move<TMeta>;
|
|
420
|
-
next(): Move<TMeta>;
|
|
421
|
-
/**
|
|
422
|
-
* Move to a step number or to a `runtimeStageId`.
|
|
423
|
-
* A miss refuses and names the `nearest` stop it could find.
|
|
424
|
-
*/
|
|
425
|
-
jumpTo(target: number | string): Move<TMeta>;
|
|
426
|
-
/**
|
|
427
|
-
* Fold of the log through `stop` (default: the current stop). Detached.
|
|
428
|
-
*
|
|
429
|
-
* `stop` must come from THIS cursor's axis: its `lastCommitIdx` and
|
|
430
|
-
* `sourceIdx` are read as addresses into this cursor's own legs, so a stop
|
|
431
|
-
* from another cursor is folded at whatever those numbers mean here — on a
|
|
432
|
-
* chain, a foreign stop with no `sourceIdx` folds leg 0.
|
|
433
|
-
*/
|
|
434
|
-
stateAt(stop?: Stop<TMeta>): FoldedState;
|
|
435
|
-
/**
|
|
436
|
-
* The state keys written between two stops — read straight off the bundles'
|
|
437
|
-
* traces, so it costs no fold at all.
|
|
438
|
-
*
|
|
439
|
-
* With no argument: what the CURRENT stop changed (i.e. since the stop
|
|
440
|
-
* before it). With a `from` stop: everything written after `from` up to and
|
|
441
|
-
* including the current stop. Backwards or equal ranges give `[]`. On a
|
|
442
|
-
* chained cursor a range that crosses the seam is walked source by source.
|
|
443
|
-
*/
|
|
444
|
-
changedSince(from?: Stop<TMeta>): readonly string[];
|
|
445
|
-
/** Bookmark a stop (default: the current one). Returns the mark, or
|
|
446
|
-
* `undefined` when there is no stop to name. */
|
|
447
|
-
mark(name: string, stop?: Stop<TMeta>): Mark | undefined;
|
|
448
|
-
/** A detached copy of this cursor's marks, in the order they were placed. */
|
|
449
|
-
marks(): readonly Mark[];
|
|
450
|
-
/** Move to a mark's stop. A mark whose stage is not on this axis misses. */
|
|
451
|
-
jumpToMark(name: string): Move<TMeta>;
|
|
452
|
-
/**
|
|
453
|
-
* A cursor over the subflow mounted at `mountRuntimeStageId` — the same
|
|
454
|
-
* interface, its own log, its own fold base. `undefined` when that mount is
|
|
455
|
-
* not in this run's subflow results.
|
|
456
|
-
*
|
|
457
|
-
* A stop inside a subflow is NOT a stop of this cursor: subflows run in
|
|
458
|
-
* isolated runtimes and commit to their own log, so the outer axis holds
|
|
459
|
-
* only the mount boundary. Drilling is how you get inside; there is no way
|
|
460
|
-
* to be in two places at once.
|
|
461
|
-
*/
|
|
462
|
-
drill(mountRuntimeStageId: string): TimeTravel<TMeta> | undefined;
|
|
463
|
-
}
|
|
464
|
-
/** Options for {@link timeTravel}. */
|
|
465
|
-
export interface TimeTravelOptions<TMeta = unknown> {
|
|
466
|
-
/** How stops are derived. Default: `commitStops`. */
|
|
467
|
-
readonly strategy?: TimeTravelStrategy<TMeta>;
|
|
468
|
-
/** Marks to seed the cursor with — e.g. restored from a saved session. */
|
|
469
|
-
readonly marks?: readonly Mark[];
|
|
470
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* time-travel/types.ts — the shapes of the reader's cursor.
|
|
3
|
-
*
|
|
4
|
-
* WHY THIS MODULE EXISTS (context for future readers, human or LLM):
|
|
5
|
-
* Time travel in footprintjs is a READER'S cursor over a FINISHED trace, with
|
|
6
|
-
* a fold at each stop. It is not the Walker — the engine's traversal — and it
|
|
7
|
-
* must never become a second live cursor: nothing here can move, re-run or
|
|
8
|
-
* mutate an execution. Every consumer (a why-panel, a flow view, a chart
|
|
9
|
-
* dashboard) was writing the same commit-index arithmetic by hand, from the
|
|
10
|
-
* same commit log, and disagreeing about the answers. This is that arithmetic,
|
|
11
|
-
* once, in the library that owns the substrate.
|
|
12
|
-
*
|
|
13
|
-
* DAG position: memory ← time-travel. Every file here is a record file
|
|
14
|
-
* (`RECORD_FILES`, scripts/layering.config.cjs, C6): it may import only record
|
|
15
|
-
* files — memory/, the id grammar (`ids/runtimeStageId`), and the record's two
|
|
16
|
-
* capture/ leaves (`freeze`, `valueKinds`). Recorders, traversal and runner
|
|
17
|
-
* must never be imported here; the snapshot arrives as a plain structural
|
|
18
|
-
* shape ({@link FoldSource}, {@link TimeTravelSource}, the record's own
|
|
19
|
-
* `ExecutionTree` for the tree) so a stored JSON trace works exactly like a
|
|
20
|
-
* live `getSnapshot()`.
|
|
21
|
-
*/
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdGltZS10cmF2ZWwvdHlwZXMudHMg4oCUIHRoZSBzaGFwZXMgb2YgdGhlIHJlYWRlcidzIGN1cnNvci5cbiAqXG4gKiBXSFkgVEhJUyBNT0RVTEUgRVhJU1RTIChjb250ZXh0IGZvciBmdXR1cmUgcmVhZGVycywgaHVtYW4gb3IgTExNKTpcbiAqIFRpbWUgdHJhdmVsIGluIGZvb3RwcmludGpzIGlzIGEgUkVBREVSJ1MgY3Vyc29yIG92ZXIgYSBGSU5JU0hFRCB0cmFjZSwgd2l0aFxuICogYSBmb2xkIGF0IGVhY2ggc3RvcC4gSXQgaXMgbm90IHRoZSBXYWxrZXIg4oCUIHRoZSBlbmdpbmUncyB0cmF2ZXJzYWwg4oCUIGFuZCBpdFxuICogbXVzdCBuZXZlciBiZWNvbWUgYSBzZWNvbmQgbGl2ZSBjdXJzb3I6IG5vdGhpbmcgaGVyZSBjYW4gbW92ZSwgcmUtcnVuIG9yXG4gKiBtdXRhdGUgYW4gZXhlY3V0aW9uLiBFdmVyeSBjb25zdW1lciAoYSB3aHktcGFuZWwsIGEgZmxvdyB2aWV3LCBhIGNoYXJ0XG4gKiBkYXNoYm9hcmQpIHdhcyB3cml0aW5nIHRoZSBzYW1lIGNvbW1pdC1pbmRleCBhcml0aG1ldGljIGJ5IGhhbmQsIGZyb20gdGhlXG4gKiBzYW1lIGNvbW1pdCBsb2csIGFuZCBkaXNhZ3JlZWluZyBhYm91dCB0aGUgYW5zd2Vycy4gVGhpcyBpcyB0aGF0IGFyaXRobWV0aWMsXG4gKiBvbmNlLCBpbiB0aGUgbGlicmFyeSB0aGF0IG93bnMgdGhlIHN1YnN0cmF0ZS5cbiAqXG4gKiBEQUcgcG9zaXRpb246IG1lbW9yeSDihpAgdGltZS10cmF2ZWwuIEV2ZXJ5IGZpbGUgaGVyZSBpcyBhIHJlY29yZCBmaWxlXG4gKiAoYFJFQ09SRF9GSUxFU2AsIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcywgQzYpOiBpdCBtYXkgaW1wb3J0IG9ubHkgcmVjb3JkXG4gKiBmaWxlcyDigJQgbWVtb3J5LywgdGhlIGlkIGdyYW1tYXIgKGBpZHMvcnVudGltZVN0YWdlSWRgKSwgYW5kIHRoZSByZWNvcmQncyB0d29cbiAqIGNhcHR1cmUvIGxlYXZlcyAoYGZyZWV6ZWAsIGB2YWx1ZUtpbmRzYCkuIFJlY29yZGVycywgdHJhdmVyc2FsIGFuZCBydW5uZXJcbiAqIG11c3QgbmV2ZXIgYmUgaW1wb3J0ZWQgaGVyZTsgdGhlIHNuYXBzaG90IGFycml2ZXMgYXMgYSBwbGFpbiBzdHJ1Y3R1cmFsXG4gKiBzaGFwZSAoe0BsaW5rIEZvbGRTb3VyY2V9LCB7QGxpbmsgVGltZVRyYXZlbFNvdXJjZX0sIHRoZSByZWNvcmQncyBvd25cbiAqIGBFeGVjdXRpb25UcmVlYCBmb3IgdGhlIHRyZWUpIHNvIGEgc3RvcmVkIEpTT04gdHJhY2Ugd29ya3MgZXhhY3RseSBsaWtlIGFcbiAqIGxpdmUgYGdldFNuYXBzaG90KClgLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuLi9tZW1vcnkvaG9uZXN0eS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgRXhlY3V0aW9uVHJlZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBTb3VyY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEFueXRoaW5nIHRoYXQgY2FycmllcyBhIGNvbW1pdCBsb2cgYW5kIChpZGVhbGx5KSBpdHMgZm9sZCBiYXNlLlxuICpcbiAqIFR3byBmaWVsZCBzcGVsbGluZ3MsIGJlY2F1c2UgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgdHdvOiB0aGUgcnVuJ3MgbG9nIGlzXG4gKiBgY29tbWl0TG9nYCAoYGdldFNuYXBzaG90KClgKSwgYSBzdWJmbG93J3MgaXMgYGhpc3RvcnlgXG4gKiAoYGdldFN1YnRyZWVTbmFwc2hvdCgpYCAvIGBzdWJmbG93UmVzdWx0c1suLi5dLnRyZWVDb250ZXh0YCkuIEJvdGggYXJlXG4gKiBhY2NlcHRlZCBzbyBhIGNhbGxlciBuZXZlciBoYXMgdG8gcmVzaGFwZSBhIHNuYXBzaG90IHRvIGFzayBhIHF1ZXN0aW9uLlxuICpcbiAqIEJPVEggU1BFTExJTkdTIFRBS0UgYHJlYWRvbmx5IHVua25vd25bXWAgKDkuMTguMCkuIEEgbGl2ZSBzbmFwc2hvdCBoYW5kc1xuICogb3ZlciByZWFsIHtAbGluayBDb21taXRCdW5kbGV9cyBhbmQgaXMgYXNzaWduYWJsZSBleGFjdGx5IGFzIGJlZm9yZTsgYVxuICogU1RPUkVEIHJlY29yZGluZyBpcyBwYXJzZWQgSlNPTiwgYW5kIGEgY2FyZWZ1bCBjb25zdW1lciB3aWxsIG5vdCBjbGFpbSB0aGF0XG4gKiB3aGF0IGNhbWUgYmFjayBvZmYgZGlzayBpcyBhIGBDb21taXRCdW5kbGVgLiBUaGUgbmFycm93aW5nIHRoZXJlZm9yZSBoYXBwZW5zXG4gKiBIRVJFLCBwZXIgYnVuZGxlLCB3aGVyZSB0aGUgZm9sZCBhY3R1YWxseSByZWFkcyBvbmUg4oCUIHRoZSBvbmx5IHBsYWNlIHRoYXRcbiAqIGNhbiBob25lc3RseSBkbyBpdC4gQW4gZW50cnkgdGhhdCBpcyBub3QgYSBidW5kbGUgYmVjb21lcyBhIEdBUDogaXQga2VlcHNcbiAqIGl0cyBpbmRleCAoc28gZXZlcnkgYGNvbW1pdElkeGAgc3RpbGwgYWRkcmVzc2VzIHRoZSBzYW1lIHBvc2l0aW9uKSwgaXRcbiAqIGNvbnRyaWJ1dGVzIG5vIHN0YXRlLCBpdCBnZXRzIG5vIHN0b3AsIGFuZCBhbnkgZm9sZCB0aGF0IGNyb3NzZXMgaXQgcmVwb3J0c1xuICogaXQgaW4ge0BsaW5rIEZvbGRlZFN0YXRlLnNraXBwZWR9IHdpdGggdGhlIGluZGV4IGFuZCB0aGUgcmVhc29uLlxuICpcbiAqIEVWRVJZIEZJRUxEIElTIE9QVElPTkFMLCBkZWxpYmVyYXRlbHkgdGhlIHNhbWUgc2hhcGUge0BsaW5rIFRpbWVUcmF2ZWxTb3VyY2V9XG4gKiBoYXM6IGEgY29uc3VtZXIncyBzdG9yZWQtcmVjb3JkaW5nIHR5cGUgKGBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW11gKVxuICogZHJpdmVzIGBzdGF0ZUF0YCBhbmQgYHRpbWVUcmF2ZWxgIGFsaWtlLCB3aXRoIG5vIGNhc3QgYXQgZWl0aGVyLiBBIHNvdXJjZVxuICogd2l0aCBuZWl0aGVyIHNwZWxsaW5nIHByZXNlbnQgZm9sZHMgdG8gaXRzIGJhc2UgYW5kIHJlcG9ydHNcbiAqIGB0aHJvdWdoQ29tbWl0SWR4OiAtMWAg4oCUIHRoZSB0cnV0aGZ1bCBhbnN3ZXIgZm9yIGEgbG9nIHRoYXQgd2FzIG5vdCB0aGVyZS5cbiAqXG4gKiBUSElTIElTIEFOIElOUFVUIFNIQVBFLiBOb3RoaW5nIHR5cGVkIGFzIGEgYEZvbGRTb3VyY2VgIHByb21pc2VzIHRoYXQgaXRzXG4gKiByb3dzIGFyZSBidW5kbGVzOyBjb2RlIHRoYXQgd2FudHMgdG8gcmVhZCBgQ29tbWl0QnVuZGxlYCBmaWVsZHMgYmFjayBPVVQgb2ZcbiAqIG9uZSBtdXN0IG5hcnJvdyBlYWNoIHJvdyB3aXRoIGBpc0NvbW1pdEJ1bmRsZWAgZmlyc3QuXG4gKi9cbmV4cG9ydCB0eXBlIEZvbGRTb3VyY2UgPSB7XG4gIC8qKiBUaGUgcnVuJ3MgY29tbWl0IGxvZy4gTWF5IGJlIEFCU0VOVCAoYSBzdG9yZWQgcmVjb3JkaW5nJ3Mgb3B0aW9uYWwgZmllbGQpOiBhbiBhYnNlbnQgbG9nIGZvbGRzIHRvIHRoZSBiYXNlLiAqL1xuICByZWFkb25seSBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW107XG4gIC8qKiBBIHN1YmZsb3cgc3VidHJlZSdzIG93biBsb2cg4oCUIHRoZSBzYW1lIHRoaW5nIHVuZGVyIGl0cyBvdGhlciBuYW1lLiAqL1xuICByZWFkb25seSBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdO1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbi8qKlxuICogQSBzbmFwc2hvdC1zaGFwZWQgc291cmNlIGZvciB7QGxpbmsgdGltZVRyYXZlbH0uXG4gKlxuICogRXZlcnkgZmllbGQgaXMgb3B0aW9uYWwgYW5kIHRoZSBzdHJ1Y3R1cmFsIG9uZXMgYXJlIGB1bmtub3duYCAoOS4xOC4wKSwgc29cbiAqIGEgbGl2ZSBgZ2V0U25hcHNob3QoKWAgaXMgYXNzaWduYWJsZSBleGFjdGx5IGFzIGl0IHdhcyBBTkQgc28gaXMgYSBzdG9yZWRcbiAqIHJlY29yZGluZyBhIGNvbnN1bWVyIHR5cGVkIGhvbmVzdGx5IOKAlCBgY29tbWl0TG9nOiByZWFkb25seSB1bmtub3duW11gLFxuICogYGV4ZWN1dGlvblRyZWU6IHVua25vd25gIOKAlCBiZWNhdXNlIHBhcnNlZCBKU09OIGlzIG5vdCBhbiBleGVjdXRpb24gdHJlZVxuICogdW50aWwgc29tZXRoaW5nIHNheXMgc28uIFRoZSBuYXJyb3dpbmcgaGFwcGVucyBpbnNpZGU6IHJvd3MgcGVyIGJ1bmRsZVxuICogKHNlZSB7QGxpbmsgRm9sZFNvdXJjZX0pLCB0aGUgdHJlZSBhbmQgdGhlIHN1YmZsb3cgcmVzdWx0cyBhcyBwbGFpblxuICogb2JqZWN0cywgYW55dGhpbmcgZWxzZSByZWFkIGFzIGFic2VudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsU291cmNlIHtcbiAgLyoqIFRoZSBydW4ncyBjb21taXQgbG9nLiBTZWUge0BsaW5rIEZvbGRTb3VyY2V9IG9uIHdoeSB0aGlzIGlzIGB1bmtub3duW11gLiAqL1xuICByZWFkb25seSBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW107XG4gIC8qKiBBIHN1YmZsb3cgc3VidHJlZSdzIG93biBsb2cg4oCUIHRoZSBzYW1lIHRoaW5nIHVuZGVyIGl0cyBvdGhlciBuYW1lLiAqL1xuICByZWFkb25seSBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdO1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBleGVjdXRpb24gdHJlZSAoYGdldFNuYXBzaG90KCkuZXhlY3V0aW9uVHJlZWApIOKAlCB3aGF0IG1ha2VzIGFcbiAgICogbW91bnQgc3RvcCBzYXkgYGtpbmQ6ICdtb3VudCdgIGF1dGhvcml0YXRpdmVseSBpbnN0ZWFkIG9mIGJ5IHNoYXBlLiBBIGxpdmVcbiAgICogc25hcHNob3QgaGFuZHMgaXRzIGBTdGFnZVNuYXBzaG90YCB0cmVlLCB3aGljaCBpcyBhbiB7QGxpbmsgRXhlY3V0aW9uVHJlZX07XG4gICAqIGEgc3RvcmVkIG9uZSBoYW5kcyBwYXJzZWQgSlNPTiwgd2hpY2ggaXMgcmVhZCBhcyBhIHRyZWUgd2hlbiBpdCBpcyBhIHBsYWluXG4gICAqIG9iamVjdCBhbmQgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSB8IHVua25vd247XG4gIC8qKlxuICAgKiBEdWFsLWtleWVkIHN1YmZsb3cgcmVzdWx0cyAoYGdldFNuYXBzaG90KCkuc3ViZmxvd1Jlc3VsdHNgKSDigJQgd2hhdFxuICAgKiB7QGxpbmsgVGltZVRyYXZlbC5kcmlsbH0gbmF2aWdhdGVzLiBBYnNlbnQsIG9yIG5vdCBhIHBsYWluIG9iamVjdCDih5JcbiAgICogYGRyaWxsYCBhbHdheXMgcmV0dXJucyBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgdGhlIGhvbmVzdCBhbnN3ZXIgZm9yIGEgcnVuXG4gICAqIHdpdGggbm8gc3ViZmxvd3MuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bjtcbn1cblxuLyoqXG4gKiBPbmUgZW50cnkgb2YgYSBzb3VyY2UncyBsb2cgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCBhcyBhIHtAbGluayBDb21taXRCdW5kbGV9LlxuICpcbiAqIFJlcG9ydGVkIHJhdGhlciB0aGFuIHRocm93bjogYSBzdG9yZWQgcmVjb3JkaW5nIHdpdGggb25lIGNvcnJ1cHQgcm93IGlzXG4gKiBzdGlsbCB3b3J0aCByZWFkaW5nLCBhbmQgYSByZWFkZXIgdGhhdCBpcyB0b2xkIFdISUNIIGluZGV4IGl0IGxvc3QgY2FuIHNheVxuICogc28gb24gc2NyZWVuLiBgaW5kZXhgIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGF0IHNvdXJjZSdzIG93biBsb2cuXG4gKlxuICogUmVnaXN0cnkgY29kZTogYCdsb2ctZ2FwJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgYSBnYXAgbWVhbnMuIEEgZ2FwIGNhcnJpZXMgbm8gYGNvZGVgIGZpZWxkIOKAlFxuICogaXQgaXMgcmVnaXN0ZXJlZCBzbyBhIHJlYWRlciBleHBsYWlucyBpdCBmcm9tIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBvdGhlclxuICogaG9uZXN0eSBzaWduYWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0dhcCB7XG4gIC8qKiBBUlJBWSBJTkRFWCBpbiB0aGUgc291cmNlJ3MgbG9nIOKAlCB0aGUgYWRkcmVzcyB0aGUgZ2FwIG9jY3VwaWVzLiAqL1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICAvKiogV2h5IGl0IGlzIG5vdCBhIGJ1bmRsZSwgaW4gd29yZHMgYSBVSSBjYW4gcHJpbnQuICovXG4gIHJlYWRvbmx5IHJlYXNvbjogc3RyaW5nO1xufVxuXG4vLyDilIDilIAgU3RvcHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHBvc2l0aW9uIGEgc3RvcCBpcy5cbiAqXG4gKiAtIGAnY29tbWl0J2Ag4oCUIG9uZSBleGVjdXRlZCBzdGFnZS5cbiAqIC0gYCdtb3VudCdgICDigJQgYSBzdWJmbG93IG1vdW50OiB0aGUgYm91bmRhcnkgd2hvc2UgaW5uZXIgc3RhZ2VzIGxpdmUgaW4gdGhlXG4gKiAgIHN1YmZsb3cncyBPV04gbG9nIChkcmlsbCBpbnRvIGl0IHdpdGgge0BsaW5rIFRpbWVUcmF2ZWwuZHJpbGx9KS5cbiAqIC0gYCdzdGFydCdgICDigJQgdGhlIGJvb2tlbmQgQkVGT1JFIHRoZSBmaXJzdCBzdG9wIG9mIFRISVMgYXhpcy4gV2hhdCBpdCBmb2xkc1xuICogICBkZXBlbmRzIG9uIHRoZSBzdHJhdGVneSwgYW5kIHRoZSBkaWZmZXJlbmNlIGlzIGxvYWQtYmVhcmluZzpcbiAqICAgLSBvbiBhIHN0cmF0ZWd5IHRoYXQga2VlcHMgZXZlcnkgc3RhZ2UgKGBjb21taXRTdG9wc2AsIHRoZSBvbmUgc2hpcHBlZClcbiAqICAgICBpdCBpcyB0aGUgcnVuJ3MgZm9sZCBCQVNFIOKAlCB0aGUgc3RhdGUgbm8gY29tbWl0IGluZGV4IGNhbiByZWFjaCDigJQgcGx1c1xuICogICAgIHRoZSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkIHdoZW4gdGhlIGxvZyBvcGVucyB3aXRoIG9uZSAodGhlXG4gKiAgICAgbW91bnQncyBjb21taXQsIHN0YW1wZWQgd2l0aCB0aGUgbW91bnQncyBydW50aW1lU3RhZ2VJZCBzaW5jZSBSMTMgYW5kXG4gKiAgICAgd2l0aCBgJydgIHRocm91Z2ggOS4zMy4wKS4gU28gb24gYSBkcmlsbGVkIGN1cnNvciBpdCBpcyBleGFjdGx5IFwidGhlXG4gKiAgICAgaW5wdXQgdGhpcyBzdWJmbG93IGJlZ2FuIHdpdGhcIi5cbiAqICAgLSBvbiBhIHN0cmF0ZWd5IHRoYXQgRklMVEVSUyBzdGFnZXMgb3V0LCB0aGUgY29tbWl0cyBvZiB0aGUgZHJvcHBlZFxuICogICAgIHN0YWdlcyB0aGF0IHJhbiBCRUZPUkUgdGhlIGZpcnN0IHN1cnZpdmluZyBzdG9wIGhhdmUgdG8gZm9sZCBzb21ld2hlcmUsXG4gKiAgICAgYW5kIGAnc3RhcnQnYCBpcyB0aGUgb25seSBwbGFjZSB0aGV5IGNhbiBnbyB3aXRob3V0IG9ycGhhbmluZyB0aGVtLiBJdHNcbiAqICAgICBmb2xkIGlzIHRoZW4gdGhlIGJhc2UgUExVUyB0aGF0IHByb2xvZ3VlIOKAlCB0aGUgc3RhdGUgdGhlIGZpcnN0IHN0b3BcbiAqICAgICBSRUFELCBub3QgdGhlIHJ1bidzIHJhdyBiYXNlLiBTdWNoIGEgc3RhcnQgTVVTVCBzYXkgc28gYnkgc2V0dGluZ1xuICogICAgIHtAbGluayBTdG9wLnByb2xvZ3VlfTsgYSByZW5kZXJlciB0aGF0IG1lYW5zIFwidGhlIHJ1bidzIHJhdyBiYXNlXCIgcmVhZHNcbiAqICAgICBga2luZCA9PT0gJ3N0YXJ0JyAmJiAhc3RvcC5wcm9sb2d1ZWAsIGFuZCBnZXRzIGEgdHJ1ZSBhbnN3ZXIgb24gZXZlcnlcbiAqICAgICBheGlzIGluc3RlYWQgb2Ygb25lIHRoYXQgaXMgdHJ1ZSBvbmx5IG9uIHRoZSBsaWJyYXJ5J3Mgb3duLlxuICogLSBgJ2VuZCdgICAgIOKAlCB0aGUgYm9va2VuZCBhZnRlciB0aGUgbGFzdCBjb21taXQ6IFwidGhlIHJ1biBpcyBvdmVyXCIuIEl0c1xuICogICBmb2xkIGVxdWFscyB0aGUgZmluYWwgc3RhZ2UncyBieSBjb25zdHJ1Y3Rpb247IHRoZSB0d28gYXJlIGRpZmZlcmVudFxuICogICBxdWVzdGlvbnMsIG5vdCBhIGR1cGxpY2F0ZWQgYW5zd2VyLlxuICpcbiAqIE5PVCBXSURFTkVELCBERUxJQkVSQVRFTFkuIEEgZmlsdGVyaW5nIHN0cmF0ZWd5J3Mgc3RhcnQgY291bGQgaGF2ZSBiZWVuIGFcbiAqIGZpZnRoIGtpbmQgKGAncHJvbG9ndWUnYCksIGJ1dCBhZGRpbmcgYSBtZW1iZXIgdG8gdGhpcyB1bmlvbiBicmVha3MgZXZlcnlcbiAqIGNvbnN1bWVyIHdpdGggYW4gZXhoYXVzdGl2ZSBgc3dpdGNoYCBvdmVyIGl0IOKAlCBhIGNvbXBpbGUgZXJyb3IgaGFuZGVkIHRvXG4gKiByZWFkZXJzIHdobyBkaWQgbm90aGluZyB3cm9uZy4gQSBmbGFnIG9uIHRoZSBzdG9wIHNheXMgdGhlIHNhbWUgdGhpbmcgYW5kXG4gKiBjb3N0cyBhbiBleGlzdGluZyByZWFkZXIgbm90aGluZy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcEtpbmQgPSAnY29tbWl0JyB8ICdtb3VudCcgfCAnc3RhcnQnIHwgJ2VuZCc7XG5cbi8qKlxuICogT25lIHBvc2l0aW9uIGEgcmVhZGVyJ3MgY3Vyc29yIGNhbiByZXN0IGF0LlxuICpcbiAqIEB0eXBlUGFyYW0gVE1ldGEgdGhlIFNUUkFURUdZJ1Mgb3duIHZvY2FidWxhcnksIGNhcnJpZWQgb3BhcXVlbHkgaW5cbiAqICAge0BsaW5rIFN0b3AubWV0YX0uIERlZmF1bHRzIHRvIGB1bmtub3duYCwgc28gZXZlcnkgcHJlLTkuMTggYFN0b3BgIHN0aWxsXG4gKiAgIG1lYW5zIHdoYXQgaXQgbWVhbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcDxUTWV0YSA9IHVua25vd24+IHtcbiAgLyoqIFBvc2l0aW9uIGluIGBUaW1lVHJhdmVsLnN0b3BzYCDigJQgMC1iYXNlZCwgdGhlIGN1cnNvcidzIHN0ZXAgbnVtYmVyLiAqL1xuICByZWFkb25seSBzdGVwOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc3RhZ2UgdGhpcyBzdG9wIGlzOiBgW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4YC5cbiAgICogYCcnYCBmb3IgdGhlIGAnc3RhcnQnYCAvIGAnZW5kJ2AgYm9va2VuZHMsIHdoaWNoIGFyZSBub3Qgc3RhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFSUkFZIElOREVYIG9mIHRoaXMgc3RvcCdzIEZJUlNUIGNvbW1pdCBidW5kbGU7IGAtMWAgYXQgYCdzdGFydCdgLlxuICAgKiBUaGlzIGlzIHRoZSBzdG9wJ3MgYWRkcmVzcyBvbiB0aGUgY29tbWl0IGF4aXMuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIFNPVVJDRS1MT0NBTC4gT24gYSBjaGFpbmVkIGN1cnNvciAoc2VlXG4gICAqIHtAbGluayB0aW1lVHJhdmVsfSkgdGhleSBpbmRleCB0aGUgbG9nIG9mIHtAbGluayBTdG9wLnNvdXJjZUlkeH0sIG5ldmVyIGFcbiAgICogY29uY2F0ZW5hdGlvbiDigJQgY29tbWl0IGluZGljZXMgYXJlIHJ1bi1sb2NhbCBhbmQgdGhlIGxpYnJhcnkgd2lsbCBub3RcbiAgICogaW52ZW50IGEgZ2xvYmFsIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1pdElkeDogbnVtYmVyO1xuICAvKipcbiAgICogQVJSQVkgSU5ERVggb2YgdGhlIExBU1QgY29tbWl0IGJ1bmRsZSBmb2xkZWQgYXQgdGhpcyBzdG9wIOKAlCB0aGUgZW5kIG9mXG4gICAqIHRoaXMgc3RvcCdzIHNsaWNlIG9mIHRoZSBsb2cuIFN0b3BzIFBBUlRJVElPTiB0aGUgbG9nLCBzbyB0aGlzIGlzIHRoZVxuICAgKiBpbmRleCBqdXN0IGJlZm9yZSB0aGUgbmV4dCBzdG9wIGJlZ2luczsgaXQgaXMgZ3JlYXRlciB0aGFuXG4gICAqIHtAbGluayBjb21taXRJZHh9IHdoZW5ldmVyIGEgc3RhZ2UgY29tbWl0dGVkIG1vcmUgdGhhbiBvbmUgYnVuZGxlIChhXG4gICAqIHN1YmZsb3cgbW91bnQncyBvdXRwdXQtbWFwcGluZyArIGV4aXQgcGFpciwgYSBmb3JrIGNoaWxkJ3MgZW1wdHkgcmVwZWF0KSxcbiAgICogYW5kIGdyZWF0ZXIgYWdhaW4gb24gYSBmaWx0ZXJpbmcgc3RyYXRlZ3ksIHdoaWNoIGFic29yYnMgdGhlIGNvbW1pdHMgb2ZcbiAgICogdGhlIHN0YWdlcyBpdCBkcm9wcGVkLiBGb2xkaW5nIHRocm91Z2ggdGhpcyBpbmRleCDigJQgbm90IHRocm91Z2hcbiAgICogYGNvbW1pdElkeGAg4oCUIGlzIHdoYXQgbWFrZXMgYHN0YXRlQXQoc3RvcClgIGVxdWFsIHRoZSBzdGF0ZSB0aGUgbmV4dFxuICAgKiBzdGFnZSBzdGFydGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBsYXN0Q29tbWl0SWR4OiBudW1iZXI7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWQgZnJvbSB0aGUgYnVpbGRlciAodGhlIHBvc3QtbW91bnQsIHByZWZpeGVkIGZvcm0pLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IHBhdGggdGhpcyBzdGFnZSByYW4gdW5kZXIsIHdoZW4gaXQgcmFuIGluc2lkZSBvbmUuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZSDigJQgd2hhdCBhIFVJIHB1dHMgb24gdGhlIGF4aXMgdGljay4gKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogU3RvcEtpbmQ7XG4gIC8qKlxuICAgKiBUSEUgU1RSQVRFR1knUyBPV04gVk9DQUJVTEFSWSwgY2FycmllZCB2ZXJiYXRpbS4gVGhlIHBvcnQgYXNzaWducyBpdCBOT1xuICAgKiBtZWFuaW5nOiBpdCBuZXZlciByZWFkcyBpdCwgbmV2ZXIgdmFsaWRhdGVzIGl0LCBuZXZlciBicmFuY2hlcyBvbiBpdCwgYW5kXG4gICAqIHBhc3NlcyBpdCB0aHJvdWdoIGB0aW1lVHJhdmVsYCwgYGp1bXBUb2AsIGBkcmlsbGAgYW5kIG1hcmtzIEJZIFJFRkVSRU5DRVxuICAgKiDigJQgbmV2ZXIgY2xvbmVkLCBuZXZlciBmcm96ZW4uIFRoZSBzdG9wIGhvbGRzIHRoZSB2ZXJ5IG9iamVjdCB0aGUgc3RyYXRlZ3lcbiAgICogcHV0IHRoZXJlLCBzbyBhIG11dGF0aW9uIHRocm91Z2ggb25lIGhvbGRlciBpcyB2aXNpYmxlIHRvIGV2ZXJ5IG90aGVyLlxuICAgKlxuICAgKiBXSFkgSVQgRVhJU1RTLiB7QGxpbmsga2luZH0gaXMgdGhlIFBPUlQncyB2b2NhYnVsYXJ5IOKAlCB0aGUgZm91ciBwb3NpdGlvbnNcbiAgICogdGhlIHN1YnN0cmF0ZSBpdHNlbGYga25vd3MuIEEgZG9tYWluIHN0cmF0ZWd5IGNsYXNzaWZpZXMgc3RhZ2VzIGluIGl0cyBvd25cbiAgICogdGVybXMgKGEgbWlsZXN0b25lLCBhIHR1cm4sIGEgdG9vbCBjYWxsLCBhIGJlYXQpIGFuZCBoYWQgbm93aGVyZSB0byBwdXRcbiAgICogdGhhdCwgc28gdGhlIGFuc3dlciB0cmF2ZWxsZWQgYnkgcmUtZGVyaXZpbmcgaXQgZnJvbSBgcnVudGltZVN0YWdlSWRgIGF0XG4gICAqIGV2ZXJ5IHJlYWQ6IGEgc2Vjb25kIHJ1biBvZiB0aGUgY2xhc3NpZmllciB0aGF0IGp1c3QgcmFuLCBhbmQgYSBzZWNvbmRcbiAgICogY2hhbmNlIHRvIGRpc2FncmVlIHdpdGggaXQuIEEgc3RvcCBub3cgY2FycmllcyB3aGF0IGl0cyBzdHJhdGVneSBrbmV3LlxuICAgKlxuICAgKiBBYnNlbnQgb24gZXZlcnkgc3RvcCBgY29tbWl0U3RvcHNgIHByb2R1Y2VzIOKAlCB0aGUgc2hpcHBlZCBzdHJhdGVneSBoYXMgbm9cbiAgICogdm9jYWJ1bGFyeSBiZXlvbmQgYGtpbmRgLCBhbmQgc2F5cyBzbyBieSBvbWlzc2lvbiByYXRoZXIgdGhhbiBieSBgbnVsbGAuXG4gICAqL1xuICByZWFkb25seSBtZXRhPzogVE1ldGE7XG4gIC8qKlxuICAgKiBPbmx5IG1lYW5pbmdmdWwgb24gYGtpbmQ6ICdzdGFydCdgLiBgdHJ1ZWAgd2hlbiB0aGlzIHN0YXJ0IGZvbGRzIHRoZVxuICAgKiBjb21taXRzIG9mIFNUQUdFUyBUSElTIEFYSVMgRE9FUyBOT1QgU0hPVyDigJQgdGhlIHByb2xvZ3VlIGEgZmlsdGVyaW5nXG4gICAqIHN0cmF0ZWd5IG11c3QgcHV0IHNvbWV3aGVyZS4gQWJzZW50IChuZXZlciBgZmFsc2VgKSBvbiBhbiBheGlzIHdob3NlIHN0YXJ0XG4gICAqIGlzIHRoZSBydW4ncyByYXcgZm9sZCBiYXNlLlxuICAgKlxuICAgKiBBIHJlYWRlciB0aGF0IHdhbnRzIFwidGhlIHN0YXRlIGJlZm9yZSBhbnl0aGluZyByYW5cIiBjaGVja3NcbiAgICogYGtpbmQgPT09ICdzdGFydCcgJiYgIXByb2xvZ3VlYDsgb25lIHRoYXQgd2FudHMgXCJ0aGUgc3RhdGUgdGhlIGZpcnN0IHN0b3BcbiAgICogcmVhZFwiIGp1c3QgZm9sZHMgdGhlIHN0YXJ0LiBTZWUge0BsaW5rIFN0b3BLaW5kfS5cbiAgICovXG4gIHJlYWRvbmx5IHByb2xvZ3VlPzogdHJ1ZTtcbiAgLyoqXG4gICAqIFdoaWNoIFNPVVJDRSB0aGlzIHN0b3AncyBjb21taXQgaW5kaWNlcyBiZWxvbmcgdG8sIG9uIGEgY2hhaW5lZCBjdXJzb3Ig4oCUXG4gICAqIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXJyYXkgaGFuZGVkIHRvIHtAbGluayB0aW1lVHJhdmVsfS4gQWJzZW50IG9uIGEgY3Vyc29yXG4gICAqIG92ZXIgYSBzaW5nbGUgc291cmNlLCB3aGljaCBpcyBldmVyeSBjdXJzb3IgYnVpbHQgYmVmb3JlIDkuMTguMC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUlkeD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYFtzdGFydCwg4oCmc3RhZ2VzLCBlbmRdYCBzaGFwZSBgY29tbWl0U3RvcHNgIHJldHVybnMgZm9yIGEgTk9OLUVNUFRZIGxvZ1xuICog4oCUIHNwbGl0IG91dCwgc28gYSBzdHJhdGVneSB0aGF0IGNvbXBvc2VzIGl0IHN0b3BzIHdyaXRpbmcgaXRzIG93biBndWFyZC5cbiAqXG4gKiBTZWUge0BsaW5rIHNwbGl0QXhpc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9va2VuZGVkQXhpczxUTWV0YSA9IHVua25vd24+IHtcbiAgLyoqIFRoZSBgJ3N0YXJ0J2AgYm9va2VuZCDigJQgdGhlIG9ubHkgc3RvcCB0aGF0IG1heSBvcGVuIGF0IGBjb21taXRJZHg6IC0xYC4gKi9cbiAgcmVhZG9ubHkgc3RhcnQ6IFN0b3A8VE1ldGE+O1xuICAvKiogRXZlcnl0aGluZyBiZXR3ZWVuIHRoZSBib29rZW5kcywgaW4gZXhlY3V0aW9uIG9yZGVyLiBNYXkgYmUgZW1wdHkuICovXG4gIHJlYWRvbmx5IHN0YWdlczogcmVhZG9ubHkgU3RvcDxUTWV0YT5bXTtcbiAgLyoqIFRoZSBgJ2VuZCdgIGJvb2tlbmQg4oCUIHRoZSBvbmx5IHN0b3AgdGhhdCBmb2xkcyB0aGUgd2hvbGUgbG9nLiAqL1xuICByZWFkb25seSBlbmQ6IFN0b3A8VE1ldGE+O1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIHNwbGl0QXhpc30gYW5zd2VycyB3aGVuIHRoZXJlIGlzIG5vIGJvb2tlbmRlZCBheGlzIHRvIHNwbGl0LlxuICpcbiAqIC0gYCdlbXB0eSdgIOKAlCBubyBzdG9wcyBhdCBhbGwuIFRoZSBsb2cgaXRzZWxmIHdhcyBlbXB0eTsgYSB0cnV0aGZ1bCBheGlzXG4gKiAgIHdpdGggbm93aGVyZSB0byBzdGFuZCwgTk9UIGEgYnJva2VuIG9uZS5cbiAqIC0gYCdub3QtYm9va2VuZGVkJ2Ag4oCUIHN0b3BzIGV4aXN0IGJ1dCB0aGUgZmlyc3QgaXMgbm90IGEgYCdzdGFydCdgIG9yIHRoZVxuICogICBsYXN0IGlzIG5vdCBhbiBgJ2VuZCdgLiBPbmx5IGEgc3RyYXRlZ3kgY2FuIGNhdXNlIHRoaXM7IGEgcnVuIGNhbm5vdC5cbiAqL1xuZXhwb3J0IHR5cGUgQXhpc1JlZnVzYWwgPSAnZW1wdHknIHwgJ25vdC1ib29rZW5kZWQnO1xuXG4vKiogVGhlIHJlc3VsdCBvZiB7QGxpbmsgc3BsaXRBeGlzfTogdGhlIGF4aXMsIG9yIHdoeSB0aGVyZSBpcyBub25lLiAqL1xuZXhwb3J0IHR5cGUgQXhpc1NwbGl0PFRNZXRhID0gdW5rbm93bj4gPVxuICB8ICh7IHJlYWRvbmx5IG9rOiB0cnVlIH0gJiBCb29rZW5kZWRBeGlzPFRNZXRhPilcbiAgfCB7XG4gICAgICByZWFkb25seSBvazogZmFsc2U7XG4gICAgICByZWFkb25seSByZWFzb246IEF4aXNSZWZ1c2FsO1xuICAgICAgLyoqIFRoZSBraW5kcyB0aGF0IHdlcmUgYWN0dWFsbHkgdGhlcmUg4oCUIHdoYXQgdG8gcHJpbnQgaW4gdGhlIHJlZnVzYWwuICovXG4gICAgICByZWFkb25seSBraW5kczogcmVhZG9ubHkgU3RvcEtpbmRbXTtcbiAgICB9O1xuXG4vLyDilIDilIAgVGhlIGZvbGQgcmVzdWx0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEhvdyBhIGZvbGRlZCBzdGF0ZSB3YXMgZGVyaXZlZCDigJQgdGhlIGhvbmVzdHkgZmllbGQgKGAnaW5pdGlhbCtsb2cnYCBvclxuICogYCdsb2ctb25seSdgKS4gQSBwYXJ0aWFsIGFuc3dlciBzYXlzIGl0IGlzIHBhcnRpYWwsIG5ldmVyIGEgc2lsZW50IG9uZS5cbiAqXG4gKiBXaGF0IGVhY2ggdmFsdWUgbWVhbnMgaXMgcmVnaXN0ZXJlZCBPTkNFLCB3aXRoIHRoZSBvdGhlciBob25lc3R5IHNpZ25hbHMsIGluXG4gKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AgKHNlcnZlZCBhcyBgSE9ORVNUWV9DT0RFU2Agb25cbiAqIGBmb290cHJpbnRqcy90cmFjZWApOyB0aGlzIHVuaW9uIGRlY2xhcmVzIGl0cyBtZW1iZXJzIHRocm91Z2hcbiAqIGBSZWdpc3RlcmVkQ29kZWAsIHNvIGEgY29kZSB0aGUgcmVnaXN0cnkgZG9lcyBub3QgaG9sZCBkb2VzIG5vdCBjb21waWxlLlxuICovXG5leHBvcnQgdHlwZSBGb2xkQmFzaXMgPSBSZWdpc3RlcmVkQ29kZTwnaW5pdGlhbCtsb2cnIHwgJ2xvZy1vbmx5Jz47XG5cbi8qKiBBIGRldGFjaGVkIGZvbGQgb2YgdGhlIGxvZyB1cCB0byBvbmUgc3RvcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9sZGVkU3RhdGUge1xuICAvKiogVGhlIHN0YXRlLCBkZWVwbHkgZnJvemVuIGFuZCBmdWxseSBkZXRhY2hlZCBmcm9tIHRoZSBlbmdpbmUuICovXG4gIHJlYWRvbmx5IHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIEhvdyBpdCB3YXMgZGVyaXZlZCDigJQgc2VlIHtAbGluayBGb2xkQmFzaXN9LiAqL1xuICByZWFkb25seSBiYXNpczogRm9sZEJhc2lzO1xuICAvKipcbiAgICogYHRydWVgIHdoZW4gYW55IGNvbW1pdCBmb2xkZWQgaW4gZGVjbGFyZWQgcmVkYWN0ZWQgcGF0aHMsIHNvIHRoaXMgc3RhdGVcbiAgICogY2FycmllcyBgJ1JFREFDVEVEJ2AgcGxhY2Vob2xkZXJzIHdoZXJlIHRoZSBlbmdpbmUgc2NydWJiZWQgdmFsdWVzIGF0XG4gICAqIHdyaXRlIHRpbWUuIFRoZSBsb2cgaXMgcmVkYWN0ZWQgd2hlcmUgaXQgd2FzIHdyaXR0ZW47IGEgZm9sZCBtdXN0IFNBWSBzb1xuICAgKiByYXRoZXIgdGhhbiBwcmVzZW50IGEgc2NydWJiZWQgdmFsdWUgYXMgdGhlIHJlYWwgb25lLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ3JlZGFjdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uXG4gICAqIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIGFuZCB7QGxpbmsgRm9sZGVkU3RhdGUucmVkYWN0ZWRQYXRoc30gbWVhbjtcbiAgICogbmVpdGhlciBjYXJyaWVzIGEgYGNvZGVgLiBUaGUgcGxhY2Vob2xkZXIgaXMgdGhlIGxvZydzIHN0cmluZyxcbiAgICogYG1lbW9yeS9wbGFjZWhvbGRlcnMudHMgwrcgTE9HX1BMQUNFSE9MREVSYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZGFjdGVkOiBib29sZWFuO1xuICAvKiogVGhlIHJlZGFjdGVkIHBhdGhzIHNlZW4gYWNyb3NzIHRoZSBmb2xkZWQgcHJlZml4IOKAlCBzb3J0ZWQsIGRlZHVwZWQuICovXG4gIHJlYWRvbmx5IHJlZGFjdGVkUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIGxhc3QgY29tbWl0IGluZGV4IGZvbGRlZCBpbjsgYC0xYCB3aGVuIG5vdGhpbmcgd2FzIGZvbGRlZC4gKi9cbiAgcmVhZG9ubHkgdGhyb3VnaENvbW1pdElkeDogbnVtYmVyO1xuICAvKipcbiAgICogRW50cmllcyBvZiB0aGUgZm9sZGVkIHByZWZpeCB0aGF0IHdlcmUgbm90IGNvbW1pdCBidW5kbGVzLCB3aXRoIHRoZSBpbmRleFxuICAgKiBhbmQgdGhlIHJlYXNvbi4gQUJTRU5UIHdoZW4gbm90aGluZyB3YXMgc2tpcHBlZCwgd2hpY2ggaXMgZXZlcnkgZm9sZCBvdmVyXG4gICAqIGEgbGl2ZSBzbmFwc2hvdCDigJQgYSBjbGVhbiBmb2xkJ3Mgc2hhcGUgaXMgYnl0ZS1pZGVudGljYWwgdG8gOS4xNy4wJ3MuXG4gICAqXG4gICAqIEEgZ2FwIGNvbnRyaWJ1dGVzIG5vIHN0YXRlLCBzbyBhIGZvbGQgdGhhdCByZXBvcnRzIG9uZSBpcyBJTkNPTVBMRVRFIGF0XG4gICAqIGV4YWN0bHkgdGhlIHBsYWNlcyBpdCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWQ/OiByZWFkb25seSBMb2dHYXBbXTtcbiAgLyoqXG4gICAqIFdoaWNoIHNvdXJjZSBvZiBhIENIQUlOIHRoaXMgZm9sZCBlbmRlZCBpbiDigJQgYHRocm91Z2hDb21taXRJZHhgIGluZGV4ZXNcbiAgICogdGhhdCBzb3VyY2UncyBsb2cuIEFic2VudCBvbiBhIHNpbmdsZS1zb3VyY2UgY3Vyc29yLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSWR4PzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgTW92ZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2h5IGEgbW92ZSBkaWQgbm90IGhhcHBlbi5cbiAqXG4gKiAtIGAnY2xhbXBlZCdgIOKAlCB0aGUgbW92ZSB3b3VsZCBsYW5kIE9VVFNJREUgdGhlIGF4aXMgKGBwcmV2KClgIGF0IHRoZSBmaXJzdFxuICogICBzdG9wLCBgbmV4dCgpYCBhdCB0aGUgbGFzdCwgYSBzdGVwIG51bWJlciBiZWxvdyAwIG9yIHBhc3QgdGhlIGVuZCksIG9yIG9uXG4gKiAgIHRoZSB2ZXJ5IHN0b3AgdGhlIGN1cnNvciBhbHJlYWR5IHN0YW5kcyBvbi4gRWl0aGVyIHdheSBub3RoaW5nIG1vdmVkLiBXaGVuXG4gKiAgIHRoZSB0YXJnZXQgd2FzIG91dCBvZiByYW5nZSwgYG5lYXJlc3RgIG5hbWVzIHRoZSBlbmQgdGhhdCB3YXMgaGl0IOKAlCB0aGVcbiAqICAgY3Vyc29yIGl0c2VsZiBtYXkgYmUgbm93aGVyZSBuZWFyIGl0LlxuICogLSBgJ21pc3MnYCDigJQgdGhlIHRhcmdldCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIGF4aXMuXG4gKiAtIGAnZW1wdHknYCDigJQgdGhpcyBjdXJzb3IgaGFzIG5vIHN0b3BzIGF0IGFsbCAoYW4gZW1wdHkgbG9nKS5cbiAqL1xuZXhwb3J0IHR5cGUgTW92ZVJlZnVzYWwgPSAnY2xhbXBlZCcgfCAnbWlzcycgfCAnZW1wdHknO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYXNraW5nIHRoZSBjdXJzb3IgdG8gbW92ZS5cbiAqXG4gKiBBIHJlZnVzZWQgbW92ZSBORVZFUiBtb3ZlcyB0aGUgY3Vyc29yLiBUaGF0IGlzIHRoZSBsYXcgYSByZWFkZXIncyBVSSByZXN0c1xuICogb246IGEgbWlzdHlwZWQgaWQgb3IgYSBzdGVwIHBhc3QgdGhlIGVuZCBsZWF2ZXMgdGhlIHBhbmVsIHNob3dpbmcgZXhhY3RseVxuICogd2hhdCBpdCBzaG93ZWQgYmVmb3JlLCB3aXRoIGEgcmVhc29uIHRvIGRpc3BsYXkg4oCUIG5ldmVyIGEgc2lsZW50IGp1bXAgdG9cbiAqIHNvbWV3aGVyZSB0aGUgdXNlciBkaWQgbm90IGFzayBmb3IuXG4gKi9cbmV4cG9ydCB0eXBlIE1vdmU8VE1ldGEgPSB1bmtub3duPiA9XG4gIHwgeyByZWFkb25seSBtb3ZlZDogdHJ1ZTsgcmVhZG9ubHkgZnJvbTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQ7IHJlYWRvbmx5IHRvOiBTdG9wPFRNZXRhPiB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgbW92ZWQ6IGZhbHNlO1xuICAgICAgcmVhZG9ubHkgcmVhc29uOiBNb3ZlUmVmdXNhbDtcbiAgICAgIC8qKiBXaGVyZSB0aGUgY3Vyc29yIHN0aWxsIGlzIChhYnNlbnQgb25seSB3aGVuIHRoZXJlIGFyZSBubyBzdG9wcykuICovXG4gICAgICByZWFkb25seSBhdD86IFN0b3A8VE1ldGE+O1xuICAgICAgLyoqIFRoZSBjbG9zZXN0IHN0b3AgdG8gd2hhdCB3YXMgYXNrZWQgZm9yLCB3aGVuIG9uZSBjYW4gYmUgbmFtZWQuICovXG4gICAgICByZWFkb25seSBuZWFyZXN0PzogU3RvcDxUTWV0YT47XG4gICAgfTtcblxuLy8g4pSA4pSAIE1hcmtzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEEgcmVhZGVyJ3MgYm9va21hcmsuIExpdmVzIEJFU0lERSB0aGUgbG9nLCBpbiB0aGUge0BsaW5rIFRpbWVUcmF2ZWx9XG4gKiBpbnN0YW5jZSDigJQgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSBjb21taXQgbG9nIG9yIHRoZSBzbmFwc2hvdCwgd2hpY2ggYXJlIHRoZVxuICogcnVuJ3MgcmVjb3JkIGFuZCBub3QgdGhlIHJlYWRlcidzIG5vdGVzLlxuICpcbiAqIEEgbWFyayBuYW1lcyBpdHMgc3RvcCBieSBgcnVudGltZVN0YWdlSWRgLCBub3QgYnkgc3RlcCBudW1iZXI6IHN0ZXAgbnVtYmVyc1xuICogYmVsb25nIHRvIG9uZSBzdHJhdGVneSdzIGF4aXMsIGBydW50aW1lU3RhZ2VJZGAgaXMgdGhlIHNhbWUgc3RhZ2Ugb24gZXZlcnlcbiAqIGF4aXMsIHNvIGEgbWFyayBzdXJ2aXZlcyBhIGNoYW5nZSBvZiBzdHJhdGVneSBhbmQgYSByZS1kZXJpdmF0aW9uIG9mIHN0b3BzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmsge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgc3RlcCB0aGUgbWFyayB3YXMgcGxhY2VkIGF0LCBvbiB0aGUgYXhpcyBpbiBmb3JjZSBhdCB0aGUgdGltZS4gKi9cbiAgcmVhZG9ubHkgc3RlcDogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgVGhlIHN0cmF0ZWd5IHNlYW0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSG93IHN0b3BzIGFyZSBERVJJVkVEIGZyb20gYSByZWNvcmRlZCBsb2cuIFRoZSBzZWFtLlxuICpcbiAqIGZvb3RwcmludGpzIHNoaXBzIG9uZSBzdHJhdGVneSDigJQgYGNvbW1pdFN0b3BzYCwgb25lIHN0b3AgcGVyIGV4ZWN1dGVkIHN0YWdlXG4gKiDigJQgYmVjYXVzZSB0aGF0IGlzIHRoZSBvbmx5IHN0b3AgZ3JhbW1hciB0aGUgc3Vic3RyYXRlIGl0c2VsZiBrbm93cy4gQVxuICogY29uc3VtZXIgd2l0aCBhIHJpY2hlciB2b2NhYnVsYXJ5IChtaWxlc3RvbmVzLCB0b29sIGNhbGxzLCB0dXJucykgc3VwcGxpZXNcbiAqIGl0cyBvd24gYW5kIGdldHMgdGhlIHNhbWUgY3Vyc29yIG92ZXIgaXQsIGFuZCBwdXRzIHRoYXQgdm9jYWJ1bGFyeSBvblxuICoge0BsaW5rIFN0b3AubWV0YX0gcmF0aGVyIHRoYW4gcmUtZGVyaXZpbmcgaXQgYXQgZXZlcnkgcmVhZC5cbiAqXG4gKiBUaGUgbGF3IGEgc3RyYXRlZ3kgbXVzdCBrZWVwOiBzdG9wcyBhcmUgREVSSVZFRCBGUk9NIFRIRSBSRUNPUkRFRCBMT0cuXG4gKiBBIHN0cmF0ZWd5IG1heSBncm91cCwgZmlsdGVyLCBsYWJlbCBhbmQgb3JkZXIgd2hhdCB3YXMgcmVjb3JkZWQuIEl0IG1heSBub3RcbiAqIHJlLXdhbGsgdGhlIGV4ZWN1dGlvbiB0cmVlIHRvIHN5bnRoZXNpemUgYSBzdG9wIGZvciBzb21ldGhpbmcgdGhhdCB3YXMgbmV2ZXJcbiAqIGNvbW1pdHRlZCDigJQgYSBjdXJzb3IgdGhhdCBzdG9wcyB3aGVyZSBubyBldmlkZW5jZSBleGlzdHMgaXMgdGVsbGluZyBhIHN0b3J5LFxuICogbm90IHJlYWRpbmcgb25lLlxuICpcbiAqIE9OIEEgQ0hBSU4sIGBzdG9wc0ZvcmAgaXMgY2FsbGVkIE9OQ0UgUEVSIFNPVVJDRSB3aXRoIHRoYXQgc291cmNlJ3Mgb3duIGxvZ1xuICogYW5kIHRyZWUsIGFuZCB0aGUgY3Vyc29yIHJlLXN0ZXBzIHRoZSByZXN1bHRzIGludG8gb25lIGF4aXMuIFNvIGEgc3RyYXRlZ3lcbiAqIG5ldmVyIGhhcyB0byBrbm93IGl0IGlzIHBhcnQgb2YgYSBjaGFpbiwgYW5kIGl0cyBgY29tbWl0SWR4YC9gbGFzdENvbW1pdElkeGBcbiAqIHN0YXkgc291cmNlLWxvY2FsIOKAlCB3aGljaCBpcyB3aGF0IHRoZXkgYWx3YXlzIHdlcmUuXG4gKlxuICogYHN1YmZsb3dSZXN1bHRzYCAoOS4zOS4wKSBpcyB0aGUgc291cmNlJ3Mgb3duIGBzdWJmbG93UmVzdWx0c2AsIGFzIHN0b3JlZFxuICogKHVudHlwZWQpIOKAlCBhIG1vdW50J3MgcGVyLWV4ZWN1dGlvbiBrZXkgbmFtZXMgaXQgYSBtb3VudCB3aGVuIG5vIHRyZWUgY2FtZVxuICogd2l0aCB0aGUgbG9nLiBBIHN0cmF0ZWd5IG1heSBpZ25vcmUgaXQuXG4gKlxuICogYGV4ZWN1dGlvblRyZWVgIGlzIGFuIHtAbGluayBFeGVjdXRpb25UcmVlfSAoOS40OC4wOyBhIGBTdGFnZVNuYXBzaG90YFxuICogYmVmb3JlKTogdGhlIGZpZWxkcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkLiBBIHN0cmF0ZWd5IHdyaXR0ZW4gYmVmb3JlXG4gKiA5LjQ4LjAgdGhhdCBhbm5vdGF0ZXMgdGhlIHBhcmFtZXRlciBgU3RhZ2VTbmFwc2hvdGAgc3RpbGwgY29tcGlsZXMg4oCUIGFcbiAqIG1ldGhvZCdzIHBhcmFtZXRlcnMgYXJlIGNvbXBhcmVkIGJvdGggd2F5cyDigJQgYnV0IHRoZSBhbm5vdGF0aW9uIGlzIGEgY2xhaW1cbiAqIG5vdGhpbmcgY2hlY2tzOiBgdGltZVRyYXZlbGAgaGFuZHMgYSBzdG9yZWQgcmVjb3JkaW5nJ3MgdHJlZSBvdmVyIGFzIHBhcnNlZCxcbiAqIHNvIGEgZmllbGQgYmV5b25kIHRoZXNlIGlzIHJlYWQgZGVmZW5zaXZlbHkuIE9uZSBsZWZ0IHVuYW5ub3RhdGVkIGlzIHR5cGVkXG4gKiBieSB0aGlzIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsU3RyYXRlZ3k8VE1ldGEgPSB1bmtub3duPiB7XG4gIHN0b3BzRm9yKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGV4ZWN1dGlvblRyZWU/OiBFeGVjdXRpb25UcmVlLCBzdWJmbG93UmVzdWx0cz86IHVua25vd24pOiBTdG9wPFRNZXRhPltdO1xufVxuXG4vLyDilIDilIAgVGhlIGN1cnNvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHJlYWRlcidzIGN1cnNvciBvdmVyIG9uZSBmaW5pc2hlZCBsb2csIHdpdGggYSBmb2xkIGF0IGVhY2ggc3RvcC5cbiAqXG4gKiBPTkUgY3Vyc29yOiB0aGlzIG9iamVjdCBob2xkcyB0aGUgb25seSBwb3NpdGlvbi4gRXZlcnkgcXVlc3Rpb24gYSByZWFkZXJcbiAqIGFza3Mg4oCUIHdoYXQgY2hhbmdlZCBoZXJlLCB3aGF0IGRpZCBzdGF0ZSBsb29rIGxpa2UsIHdoYXQgaXMgaW5zaWRlIHRoaXNcbiAqIG1vdW50IOKAlCBpcyBhbnN3ZXJlZCByZWxhdGl2ZSB0byBpdC4gYGRyaWxsKClgIHJldHVybnMgYSBTRVBBUkFURSBjdXJzb3Igb3ZlclxuICogYSBzZXBhcmF0ZSBsb2cgKGEgc3ViZmxvdydzIG93biksIG5ldmVyIGEgc2Vjb25kIHBvc2l0aW9uIG9uIHRoaXMgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVUcmF2ZWw8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBUaGUgYXhpcywgaW4gZXhlY3V0aW9uIG9yZGVyLiBFbXB0eSB3aGVuIHRoZSBsb2cgaXMgZW1wdHkuICovXG4gIHJlYWRvbmx5IHN0b3BzOiByZWFkb25seSBTdG9wPFRNZXRhPltdO1xuICAvKiogVGhlIHN1YmZsb3cgcGF0aCB0aGlzIGN1cnNvciBjb3ZlcnM7IGB1bmRlZmluZWRgIGZvciB0aGUgcnVuIGl0c2VsZi4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG1vdW50IHRoaXMgY3Vyc29yIHdhcyBkcmlsbGVkIG91dCBvZiDigJQgYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNpZHhgLlxuICAgKiBgdW5kZWZpbmVkYCBvbiBhIHJ1bidzIG93biBjdXJzb3IuXG4gICAqXG4gICAqIFdIWSBCT1RIOiBhIHN1YmZsb3cgbW91bnRlZCBpbnNpZGUgYSBsb29wIHJ1bnMgc2V2ZXJhbCB0aW1lcywgYW5kIGV2ZXJ5XG4gICAqIGl0ZXJhdGlvbiBzaGFyZXMgb25lIHtAbGluayBwYXRofS4gVGhpcyBpcyB0aGUgaXRlcmF0aW9uIHRoYXQgd2FzIGFjdHVhbGx5XG4gICAqIG9wZW5lZCwgc28gdGhyZWUgZHJpbGwgcGFuZWxzIG92ZXIgYHNmeCMyYCwgYHNmeCM4YCBhbmQgYHNmeCMxNGAgY2FuIGJlXG4gICAqIGxhYmVsbGVkIGFuZCBrZXllZCBhcGFydCBpbnN0ZWFkIG9mIGFsbCByZWFkaW5nIGBzZnhgLlxuICAgKi9cbiAgcmVhZG9ubHkgbW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGN1cnNvciB0aGlzIG9uZSB3YXMgZHJpbGxlZCBvdXQgb2YsIGlmIGFueS4gKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBUaW1lVHJhdmVsPFRNZXRhPiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEhvdyBtYW55IFNPVVJDRVMgdGhpcyBjdXJzb3IgcmVhZHMg4oCUIGAxYCBmb3IgYSBub3JtYWwgY3Vyc29yLCBtb3JlIGZvciBhXG4gICAqIGNoYWluZWQgb25lIChhIHBhdXNlL3Jlc3VtZSByZWFkIGFzIG9uZSBheGlzKS4gRXZlcnkgc3RvcCBvZiBhIGNoYWluZWRcbiAgICogY3Vyc29yIGNhcnJpZXMgdGhlIHtAbGluayBTdG9wLnNvdXJjZUlkeH0gaXRzIGluZGljZXMgYmVsb25nIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ291bnQ6IG51bWJlcjtcblxuICAvKiogV2hlcmUgdGhlIGN1cnNvciBpczsgYHVuZGVmaW5lZGAgb25seSB3aGVuIHRoZXJlIGFyZSBubyBzdG9wcy4gKi9cbiAgYXQoKTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQ7XG5cbiAgZmlyc3QoKTogTW92ZTxUTWV0YT47XG4gIGxhc3QoKTogTW92ZTxUTWV0YT47XG4gIHByZXYoKTogTW92ZTxUTWV0YT47XG4gIG5leHQoKTogTW92ZTxUTWV0YT47XG5cbiAgLyoqXG4gICAqIE1vdmUgdG8gYSBzdGVwIG51bWJlciBvciB0byBhIGBydW50aW1lU3RhZ2VJZGAuXG4gICAqIEEgbWlzcyByZWZ1c2VzIGFuZCBuYW1lcyB0aGUgYG5lYXJlc3RgIHN0b3AgaXQgY291bGQgZmluZC5cbiAgICovXG4gIGp1bXBUbyh0YXJnZXQ6IG51bWJlciB8IHN0cmluZyk6IE1vdmU8VE1ldGE+O1xuXG4gIC8qKlxuICAgKiBGb2xkIG9mIHRoZSBsb2cgdGhyb3VnaCBgc3RvcGAgKGRlZmF1bHQ6IHRoZSBjdXJyZW50IHN0b3ApLiBEZXRhY2hlZC5cbiAgICpcbiAgICogYHN0b3BgIG11c3QgY29tZSBmcm9tIFRISVMgY3Vyc29yJ3MgYXhpczogaXRzIGBsYXN0Q29tbWl0SWR4YCBhbmRcbiAgICogYHNvdXJjZUlkeGAgYXJlIHJlYWQgYXMgYWRkcmVzc2VzIGludG8gdGhpcyBjdXJzb3IncyBvd24gbGVncywgc28gYSBzdG9wXG4gICAqIGZyb20gYW5vdGhlciBjdXJzb3IgaXMgZm9sZGVkIGF0IHdoYXRldmVyIHRob3NlIG51bWJlcnMgbWVhbiBoZXJlIOKAlCBvbiBhXG4gICAqIGNoYWluLCBhIGZvcmVpZ24gc3RvcCB3aXRoIG5vIGBzb3VyY2VJZHhgIGZvbGRzIGxlZyAwLlxuICAgKi9cbiAgc3RhdGVBdChzdG9wPzogU3RvcDxUTWV0YT4pOiBGb2xkZWRTdGF0ZTtcblxuICAvKipcbiAgICogVGhlIHN0YXRlIGtleXMgd3JpdHRlbiBiZXR3ZWVuIHR3byBzdG9wcyDigJQgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGJ1bmRsZXMnXG4gICAqIHRyYWNlcywgc28gaXQgY29zdHMgbm8gZm9sZCBhdCBhbGwuXG4gICAqXG4gICAqIFdpdGggbm8gYXJndW1lbnQ6IHdoYXQgdGhlIENVUlJFTlQgc3RvcCBjaGFuZ2VkIChpLmUuIHNpbmNlIHRoZSBzdG9wXG4gICAqIGJlZm9yZSBpdCkuIFdpdGggYSBgZnJvbWAgc3RvcDogZXZlcnl0aGluZyB3cml0dGVuIGFmdGVyIGBmcm9tYCB1cCB0byBhbmRcbiAgICogaW5jbHVkaW5nIHRoZSBjdXJyZW50IHN0b3AuIEJhY2t3YXJkcyBvciBlcXVhbCByYW5nZXMgZ2l2ZSBgW11gLiBPbiBhXG4gICAqIGNoYWluZWQgY3Vyc29yIGEgcmFuZ2UgdGhhdCBjcm9zc2VzIHRoZSBzZWFtIGlzIHdhbGtlZCBzb3VyY2UgYnkgc291cmNlLlxuICAgKi9cbiAgY2hhbmdlZFNpbmNlKGZyb20/OiBTdG9wPFRNZXRhPik6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBCb29rbWFyayBhIHN0b3AgKGRlZmF1bHQ6IHRoZSBjdXJyZW50IG9uZSkuIFJldHVybnMgdGhlIG1hcmssIG9yXG4gICAqICBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIHN0b3AgdG8gbmFtZS4gKi9cbiAgbWFyayhuYW1lOiBzdHJpbmcsIHN0b3A/OiBTdG9wPFRNZXRhPik6IE1hcmsgfCB1bmRlZmluZWQ7XG4gIC8qKiBBIGRldGFjaGVkIGNvcHkgb2YgdGhpcyBjdXJzb3IncyBtYXJrcywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBwbGFjZWQuICovXG4gIG1hcmtzKCk6IHJlYWRvbmx5IE1hcmtbXTtcbiAgLyoqIE1vdmUgdG8gYSBtYXJrJ3Mgc3RvcC4gQSBtYXJrIHdob3NlIHN0YWdlIGlzIG5vdCBvbiB0aGlzIGF4aXMgbWlzc2VzLiAqL1xuICBqdW1wVG9NYXJrKG5hbWU6IHN0cmluZyk6IE1vdmU8VE1ldGE+O1xuXG4gIC8qKlxuICAgKiBBIGN1cnNvciBvdmVyIHRoZSBzdWJmbG93IG1vdW50ZWQgYXQgYG1vdW50UnVudGltZVN0YWdlSWRgIOKAlCB0aGUgc2FtZVxuICAgKiBpbnRlcmZhY2UsIGl0cyBvd24gbG9nLCBpdHMgb3duIGZvbGQgYmFzZS4gYHVuZGVmaW5lZGAgd2hlbiB0aGF0IG1vdW50IGlzXG4gICAqIG5vdCBpbiB0aGlzIHJ1bidzIHN1YmZsb3cgcmVzdWx0cy5cbiAgICpcbiAgICogQSBzdG9wIGluc2lkZSBhIHN1YmZsb3cgaXMgTk9UIGEgc3RvcCBvZiB0aGlzIGN1cnNvcjogc3ViZmxvd3MgcnVuIGluXG4gICAqIGlzb2xhdGVkIHJ1bnRpbWVzIGFuZCBjb21taXQgdG8gdGhlaXIgb3duIGxvZywgc28gdGhlIG91dGVyIGF4aXMgaG9sZHNcbiAgICogb25seSB0aGUgbW91bnQgYm91bmRhcnkuIERyaWxsaW5nIGlzIGhvdyB5b3UgZ2V0IGluc2lkZTsgdGhlcmUgaXMgbm8gd2F5XG4gICAqIHRvIGJlIGluIHR3byBwbGFjZXMgYXQgb25jZS5cbiAgICovXG4gIGRyaWxsKG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFRpbWVUcmF2ZWw8VE1ldGE+IHwgdW5kZWZpbmVkO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHRpbWVUcmF2ZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsT3B0aW9uczxUTWV0YSA9IHVua25vd24+IHtcbiAgLyoqIEhvdyBzdG9wcyBhcmUgZGVyaXZlZC4gRGVmYXVsdDogYGNvbW1pdFN0b3BzYC4gKi9cbiAgcmVhZG9ubHkgc3RyYXRlZ3k/OiBUaW1lVHJhdmVsU3RyYXRlZ3k8VE1ldGE+O1xuICAvKiogTWFya3MgdG8gc2VlZCB0aGUgY3Vyc29yIHdpdGgg4oCUIGUuZy4gcmVzdG9yZWQgZnJvbSBhIHNhdmVkIHNlc3Npb24uICovXG4gIHJlYWRvbmx5IG1hcmtzPzogcmVhZG9ubHkgTWFya1tdO1xufVxuIl19
|
package/dist/esm/write.d.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* footprintjs/write — the public way to write a record.
|
|
3
|
-
*
|
|
4
|
-
* A record is what a run wrote: a frozen base and an append-only log of bundles, one per step
|
|
5
|
-
* (docs/guides/record-contract.md). This door hands out the classes the engine itself writes one
|
|
6
|
-
* with — there is no wrapper, so a record written here and one a flowchart wrote come from the same
|
|
7
|
-
* code and the same bytes:
|
|
8
|
-
*
|
|
9
|
-
* - `SharedMemory` — the heap: live state, one generation per commit (copy-on-write);
|
|
10
|
-
* - `EventLog` — the log: the fold base and the bundles, frozen as they are recorded;
|
|
11
|
-
* - `RecordFrame` — one step's frame: what it read (`read`, `noteRead`), what it staged
|
|
12
|
-
* (`write`, with a redaction verdict's bytes as `WriteScrub`), and its
|
|
13
|
-
* commit onto the heap and the log (`commit`, named by a `CommitStamp`).
|
|
14
|
-
*
|
|
15
|
-
* The step's encoding is two dials (`RecordEncoding`): `commitValues` (`'full'` | `'delta'`) and
|
|
16
|
-
* `writeProvenance` (`'off'` | `'reads-prefix'`, `WriteProvenanceMode`).
|
|
17
|
-
*
|
|
18
|
-
* Every type this door names is the record's own: nothing here loads or names the engine
|
|
19
|
-
* (test/architecture/write-door.test.ts). Its names and the bytes they write are promised under the
|
|
20
|
-
* record fixtures' re-pin policy (test/fixtures/README.md): a refactor never moves a byte.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* import { EventLog, RecordFrame, SharedMemory } from 'footprintjs/write';
|
|
25
|
-
* import { stateAt } from 'footprintjs/trace';
|
|
26
|
-
*
|
|
27
|
-
* const state = new SharedMemory(undefined, { count: 0 }); // the heap, seeded
|
|
28
|
-
* const log = new EventLog(state.getState()); // its fold base is the seed
|
|
29
|
-
*
|
|
30
|
-
* const frame = new RecordFrame(state, log); // one step, at the root
|
|
31
|
-
* frame.useEncoding({ commitValues: 'full', writeProvenance: 'reads-prefix' });
|
|
32
|
-
* const count = frame.read([], 'count') as number;
|
|
33
|
-
* frame.noteRead([], 'count'); // the bundle names the read
|
|
34
|
-
* frame.write(frame.at([], 'count'), count + 1, 'set');
|
|
35
|
-
* frame.commit(() => ({ stage: 'Increment', stageId: 'increment', runtimeStageId: 'increment#0' }));
|
|
36
|
-
*
|
|
37
|
-
* stateAt({ initialState: log.getInitialState(), commitLog: log.list() }, 0).state; // { count: 1 }
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @module write
|
|
41
|
-
*/
|
|
42
|
-
export { EventLog } from './lib/memory/EventLog.js';
|
|
43
|
-
export { SharedMemory } from './lib/memory/SharedMemory.js';
|
|
44
|
-
export type { CommitStamp } from './lib/memory/recordCommit.js';
|
|
45
|
-
export type { RecordEncoding, WriteScrub, WriteVerb } from './lib/memory/RecordFrame.js';
|
|
46
|
-
export { RecordFrame } from './lib/memory/RecordFrame.js';
|
|
47
|
-
export type { WriteProvenanceMode } from './lib/memory/types.js';
|