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.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -1,25 +0,0 @@
1
- /**
2
- * slice/types.ts — data shapes of the variable-first slicing layer.
3
- *
4
- * WHY THIS LIBRARY EXISTS (context for future readers, human or LLM):
5
- * `causalChain()` (memory/backtrack.ts) answers "what influenced this STEP?"
6
- * — its address space is runtimeStageIds. But every triage consumer starts
7
- * from a VARIABLE: a human clicks the key `creditTier` in a UI; an LLM tool
8
- * call asks "where did history[7] come from?". This library is the address
9
- * translation layer: variable in → slice out. It deliberately adds NO new
10
- * capture and NO new graph algorithm — it composes the commit-log primitives
11
- * (findLastWriter / causalChain / the per-key verb fold) so every surface
12
- * (UI panel, LLM tool, offline autopsy agent) asks the question the same way
13
- * and gets the same, honestly-labeled answer.
14
- *
15
- * Both directions live here: BACKWARD ("why is `key` what it is" —
16
- * {@link VariableSlice}) and FORWARD ("who read it, and what did it feed" —
17
- * {@link ForwardSlice}, {@link KeyTimeline}). Same anchor idiom, same
18
- * `KeysReadSource` strategies, same honesty vocabulary.
19
- *
20
- * DAG position: memory ← slice. This module may import ONLY from memory/.
21
- * Recorders, engine, and runner must never be imported here — that is what
22
- * keeps it a tiny, separately-evolvable library (see README.md).
23
- */
24
- export {};
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzbGljZS90eXBlcy50cyDigJQgZGF0YSBzaGFwZXMgb2YgdGhlIHZhcmlhYmxlLWZpcnN0IHNsaWNpbmcgbGF5ZXIuXG4gKlxuICogV0hZIFRISVMgTElCUkFSWSBFWElTVFMgKGNvbnRleHQgZm9yIGZ1dHVyZSByZWFkZXJzLCBodW1hbiBvciBMTE0pOlxuICogYGNhdXNhbENoYWluKClgIChtZW1vcnkvYmFja3RyYWNrLnRzKSBhbnN3ZXJzIFwid2hhdCBpbmZsdWVuY2VkIHRoaXMgU1RFUD9cIlxuICog4oCUIGl0cyBhZGRyZXNzIHNwYWNlIGlzIHJ1bnRpbWVTdGFnZUlkcy4gQnV0IGV2ZXJ5IHRyaWFnZSBjb25zdW1lciBzdGFydHNcbiAqIGZyb20gYSBWQVJJQUJMRTogYSBodW1hbiBjbGlja3MgdGhlIGtleSBgY3JlZGl0VGllcmAgaW4gYSBVSTsgYW4gTExNIHRvb2xcbiAqIGNhbGwgYXNrcyBcIndoZXJlIGRpZCBoaXN0b3J5WzddIGNvbWUgZnJvbT9cIi4gVGhpcyBsaWJyYXJ5IGlzIHRoZSBhZGRyZXNzXG4gKiB0cmFuc2xhdGlvbiBsYXllcjogdmFyaWFibGUgaW4g4oaSIHNsaWNlIG91dC4gSXQgZGVsaWJlcmF0ZWx5IGFkZHMgTk8gbmV3XG4gKiBjYXB0dXJlIGFuZCBOTyBuZXcgZ3JhcGggYWxnb3JpdGhtIOKAlCBpdCBjb21wb3NlcyB0aGUgY29tbWl0LWxvZyBwcmltaXRpdmVzXG4gKiAoZmluZExhc3RXcml0ZXIgLyBjYXVzYWxDaGFpbiAvIHRoZSBwZXIta2V5IHZlcmIgZm9sZCkgc28gZXZlcnkgc3VyZmFjZVxuICogKFVJIHBhbmVsLCBMTE0gdG9vbCwgb2ZmbGluZSBhdXRvcHN5IGFnZW50KSBhc2tzIHRoZSBxdWVzdGlvbiB0aGUgc2FtZSB3YXlcbiAqIGFuZCBnZXRzIHRoZSBzYW1lLCBob25lc3RseS1sYWJlbGVkIGFuc3dlci5cbiAqXG4gKiBCb3RoIGRpcmVjdGlvbnMgbGl2ZSBoZXJlOiBCQUNLV0FSRCAoXCJ3aHkgaXMgYGtleWAgd2hhdCBpdCBpc1wiIOKAlFxuICoge0BsaW5rIFZhcmlhYmxlU2xpY2V9KSBhbmQgRk9SV0FSRCAoXCJ3aG8gcmVhZCBpdCwgYW5kIHdoYXQgZGlkIGl0IGZlZWRcIiDigJRcbiAqIHtAbGluayBGb3J3YXJkU2xpY2V9LCB7QGxpbmsgS2V5VGltZWxpbmV9KS4gU2FtZSBhbmNob3IgaWRpb20sIHNhbWVcbiAqIGBLZXlzUmVhZFNvdXJjZWAgc3RyYXRlZ2llcywgc2FtZSBob25lc3R5IHZvY2FidWxhcnkuXG4gKlxuICogREFHIHBvc2l0aW9uOiBtZW1vcnkg4oaQIHNsaWNlLiBUaGlzIG1vZHVsZSBtYXkgaW1wb3J0IE9OTFkgZnJvbSBtZW1vcnkvLlxuICogUmVjb3JkZXJzLCBlbmdpbmUsIGFuZCBydW5uZXIgbXVzdCBuZXZlciBiZSBpbXBvcnRlZCBoZXJlIOKAlCB0aGF0IGlzIHdoYXRcbiAqIGtlZXBzIGl0IGEgdGlueSwgc2VwYXJhdGVseS1ldm9sdmFibGUgbGlicmFyeSAoc2VlIFJFQURNRS5tZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDYXVzYWxOb2RlLCBLZXlzUmVhZExvb2t1cCB9IGZyb20gJy4uL21lbW9yeS9iYWNrdHJhY2suanMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZUJhc2lzIH0gZnJvbSAnLi4vbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuLi9tZW1vcnkvaG9uZXN0eS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgVHJhY2VFbnRyeSwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIEtleXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSBzdGF0ZSBrZXkgYXMgY29uc3VtZXJzIGtub3cgaXQ6IGVpdGhlciB0aGUgcGxhaW4gdG9wLWxldmVsIGtleSBzdHJpbmcsIG9yXG4gKiBhIHBhdGggYXJyYXkgZm9yIG5lc3RlZCBrZXlzIChgWydjdXN0b21lcicsICdhZGRyZXNzJ11gKS4gUGF0aCBhcnJheXMgYXJlXG4gKiBub3JtYWxpc2VkIGludGVybmFsbHkg4oCUIHRoZSBlbmdpbmUncyBwYXRoIGRlbGltaXRlciBuZXZlciBhcHBlYXJzIGluIHRoaXNcbiAqIHB1YmxpYyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhdGVLZXkgPSBzdHJpbmcgfCBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj47XG5cbi8vIOKUgOKUgCBLZXlzUmVhZCBzb3VyY2luZyAoc3RyYXRlZ3kgaW50ZXJmYWNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTVFJBVEVHWSBJTlRFUkZBQ0U6IHdoZXJlIHBlci1zdGFnZSByZWFkIGtleXMgY29tZSBmcm9tLiBUSEUgY2Fub25pY2FsXG4gKiBzdHJhdGVneSBsaXN0IGxpdmVzIGhlcmUgKGltcGxlbWVudGF0aW9ucyBpbiBrZXlzUmVhZFNvdXJjZXMudHMpOlxuICpcbiAqIFJlYWRzIGFyZSBkZWxpYmVyYXRlbHkgTk9UIGluIHRoZSBjb21taXQgbG9nIChDb21taXRCdW5kbGUgY2FycmllcyBvbmx5IHRoZVxuICogYHVudHJhY2tlZFNvdXJjZXNgIGhvbmVzdHkgZmxhZ3MpLCBzbyBhIHNsaWNlIG5lZWRzIGEgcmVhZHMgcHJvdmlkZXIuIFRoZXJlXG4gKiBhcmUgc2V2ZXJhbCBsZWdpdGltYXRlIHByb3ZpZGVycyB3aXRoIGRpZmZlcmVudCB0cmFkZS1vZmZzLCBhbmQgbmV3IG9uZXNcbiAqIHdpbGwgYXBwZWFyIOKAlCBoZW5jZSBhbiBpbnRlcmZhY2UgcmF0aGVyIHRoYW4gYSBoYXJkY29kZWQgcGF0aDpcbiAqXG4gKiAtIGBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlYCDigJQgcG9zdC1ob2MsIFpFUk8gc2V0dXA6IHJlYWRzIGxpdmUgaW4gdGhlXG4gKiAgIHNuYXBzaG90J3MgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2Agd2hlbmV2ZXIgYHJlYWRUcmFja2luZ2Ag4omgICdvZmYnXG4gKiAgIChkZWZhdWx0ICdmdWxsJzsgJ3N1bW1hcnknIHN0aWxsIGtlZXBzIHRoZSBrZXlzKS4gVXNlIHdoZW4geW91IGhhdmUgYVxuICogICBmaW5pc2hlZCBydW4ncyBzbmFwc2hvdC5cbiAqIC0gYGtleXNSZWFkRnJvbU1hcGAg4oCUIGEgcHJlYnVpbHQgTWFwL29iamVjdCwgZS5nLiBjb2xsZWN0ZWQgbGl2ZSBmcm9tXG4gKiAgIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgZXZlbnRzIG9yIGRlc2VyaWFsaXplZCBmcm9tIGEgc3RvcmVkIHRyYWNlLlxuICogLSBhIGJhcmUgYEtleXNSZWFkTG9va3VwYCBmdW5jdGlvbiDigJQgYW55dGhpbmcgZWxzZSAoZS5nLiBRdWFsaXR5UmVjb3JkZXI6XG4gKiAgIGAoaWQpID0+IHJlYy5nZXRCeUtleShpZCk/LmtleXNSZWFkID8/IFtdYCkuIFdyYXBwZWQgYXMga2luZCAnY3VzdG9tLWZuJy5cbiAqXG4gKiBga2luZGAgaXMgYSBkZWJ1Z2dpbmcvaG9uZXN0eSBicmVhZGNydW1iOiBgVmFyaWFibGVTbGljZS5rZXlzUmVhZEtpbmRgXG4gKiByZWNvcmRzIHdoaWNoIHN0cmF0ZWd5IHByb2R1Y2VkIHRoZSBzbGljZSwgc28gYSBzdXJwcmlzaW5nIHNsaWNlIGNhbiBiZVxuICogdHJhY2VkIGJhY2sgdG8gaXRzIHJlYWRzIHByb3ZpZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleXNSZWFkU291cmNlIHtcbiAgLyoqIERpc2NyaW1pbmF0b3Igc3VyZmFjZWQgb24ge0BsaW5rIFZhcmlhYmxlU2xpY2Uua2V5c1JlYWRLaW5kfS4gKi9cbiAgcmVhZG9ubHkga2luZDogc3RyaW5nO1xuICAvKiogVGhlIGxvb2t1cCBgY2F1c2FsQ2hhaW5gIHdpbGwgY2FsbCBwZXIgdmlzaXRlZCBub2RlLiAqL1xuICByZWFkb25seSBsb29rdXA6IEtleXNSZWFkTG9va3VwO1xuICAvKipcbiAgICogT1BUSU9OQUwgaG9uZXN0eSB0ZWxlbWV0cnkgYSBzdHJhdGVneSBjYW4gY29tcHV0ZSB3aGlsZSBpdCBidWlsZHM6XG4gICAqIGhvdyBtYW55IGV4ZWN1dGlvbiBzdGVwcyBpdCBzYXcsIGFuZCBob3cgbWFueSBhY3R1YWxseSBoYWQgcmVhZCBlbnRyaWVzLlxuICAgKiBgc3RlcHNXaXRoUmVhZHMgPT09IDBgIG92ZXIgYSBtdWx0aS1zdGVwIHJ1biBpcyB0aGUgbWFjaGluZS1kZXRlY3RhYmxlXG4gICAqIHNpZ25hdHVyZSBvZiBgcmVhZFRyYWNraW5nOiAnb2ZmJ2Ag4oCUIFdJVEhPVVQgdGhpcywgYSByZWFkcy1sZXNzIHNsaWNlIGlzXG4gICAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gXCJnZW51aW5lbHkgbm8gdXBzdHJlYW0gZGVwZW5kZW5jaWVzXCIsIHdoaWNoIGlzIGFcbiAgICogbGllIGEgdHJpYWdlIHRvb2wgbXVzdCBuZXZlciB0ZWxsLiBDb3BpZWQgb250b1xuICAgKiB7QGxpbmsgVmFyaWFibGVTbGljZS5yZWFkc0NvdmVyYWdlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNvdmVyYWdlPzogUmVhZHNDb3ZlcmFnZTtcbn1cblxuLyoqIFNlZSB7QGxpbmsgS2V5c1JlYWRTb3VyY2UuY292ZXJhZ2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFkc0NvdmVyYWdlIHtcbiAgLyoqIEV4ZWN1dGlvbiBzdGVwcyB0aGUgc3RyYXRlZ3kgc2F3IChub2RlcyB3aXRoIGEgcnVudGltZVN0YWdlSWQpLiAqL1xuICByZWFkb25seSBzdGVwczogbnVtYmVyO1xuICAvKiogT2YgdGhvc2UsIHN0ZXBzIHRoYXQgaGFkIGF0IGxlYXN0IG9uZSByZWNvcmRlZCByZWFkIGtleS4gKi9cbiAgcmVhZG9ubHkgc3RlcHNXaXRoUmVhZHM6IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFZhcmlhYmxlIHNsaWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFdoeSBhIHNsaWNlIGNvdWxkIG5vdCBiZSBwcm9kdWNlZC4gSG9uZXN0IGFic2VuY2UgaXMgYSBmaXJzdC1jbGFzcyByZXN1bHQ6XG4gKiAtIGAnZW1wdHktbG9nJ2AgICAgIOKAlCB0aGVyZSBhcmUgbm8gY29tbWl0cyBhdCBhbGwgKHJ1biBuZXZlciBleGVjdXRlZCwgb3JcbiAqICAgc25hcHNob3QgY2FtZSBmcm9tIGVsc2V3aGVyZSkuXG4gKiAtIGAnbmV2ZXItd3JpdHRlbidgIOKAlCBubyBjb21taXQgaW4gcmFuZ2Ugd3JvdGUgYGtleWA6IG5vbmUgd3JvdGUgaXQgd2hvbGUsXG4gKiAgIG5vbmUgd3JvdGUgYSBwYXRoIGluc2lkZSBpdCwgbm9uZSBjaGFuZ2VkIGl0IGJ5IHdyaXRpbmcgYSBjb250YWluZXIgYXJvdW5kXG4gKiAgIGl0ICh0aGUgd3JpdGVyIHJ1bGUsIGBtZW1vcnkva2V5UGF0aHMudHNgIOKAlCBzaW5jZSA5LjMzLjAgYSBzdWJmbG93IHNlZWQgb3JcbiAqICAgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2sgb2YgYGNmZ+KQn2JgIElTIGEgd3JpdGUgb2YgYGNmZ2ApLiBUaGUgdmFsdWUgKGlmXG4gKiAgIGFueSkgY2FtZSBmcm9tIHRoZSBydW4ncyBJTklUSUFMIHN0YXRlLCBydW4gYGlucHV0YCAoZnJvemVuIGFyZ3MgY2hhbm5lbCksXG4gKiAgIG9yIGEgY2xvc3VyZSDigJQgbm9uZSBvZiB3aGljaCB0aGUgY29tbWl0IGxvZyBjYW4gc2VlLiBTYW1lIGJsaW5kIHNwb3QgYXNcbiAqICAgYGZpbmRMYXN0V3JpdGVyYC5cbiAqXG4gKiBFYWNoIG1lbWJlciBpcyByZWdpc3RlcmVkLCB3aXRoIHRoZSBvbmUgc2VudGVuY2UgdGhhdCBzYXlzIHdoYXQgaXQgbWVhbnMsXG4gKiBpbiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AgKHNlcnZlZCBvbiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhlXG4gKiB1bmlvbiBkZWNsYXJlcyBpdHMgbWVtYmVycyB0aHJvdWdoIGBSZWdpc3RlcmVkQ29kZWAsIHNvIGEgbWVtYmVyIHRoZVxuICogcmVnaXN0cnkgZG9lcyBub3QgaG9sZCBkb2VzIG5vdCBjb21waWxlLlxuICovXG5leHBvcnQgdHlwZSBNaXNzaW5nU2xpY2VSZWFzb24gPSBSZWdpc3RlcmVkQ29kZTwnZW1wdHktbG9nJyB8ICduZXZlci13cml0dGVuJz47XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhIHZhcmlhYmxlLWZpcnN0IGJhY2t3YXJkIHNsaWNlOiBcIndoeSBpcyBga2V5YCB3aGF0IGl0IGlzP1wiLlxuICpcbiAqIEFuY2hvcmluZyBydWxlOiB0aGUgc2xpY2UgaXMgcm9vdGVkIGF0IHRoZSBMQVNUIHdyaXRlciBvZiBga2V5YCAoYmVmb3JlXG4gKiBgYmVmb3JlYCwgd2hlbiBnaXZlbikg4oCUIHRoZSBjb21taXQgdGhhdCBtYWRlIHRoZSB2YWx1ZSB3aGF0IGl0IGN1cnJlbnRseVxuICogaXMuIEV2ZXJ5dGhpbmcgdXBzdHJlYW0gb2YgdGhhdCB3cml0ZXIgaXMgcmVhY2hlZCB0aHJvdWdoIHRoZSBjYXVzYWwgREFHLlxuICpcbiAqIFNFUklBTElaQVRJT04gV0FSTklORzogYHJvb3RgIGlzIGFuIGluLW1lbW9yeSBEQUcg4oCUIG5vZGVzIGFwcGVhciBpbiBCT1RIXG4gKiBgcGFyZW50c2AgYW5kIGBwYXJlbnRFZGdlc1tdLnBhcmVudGAsIGFuZCBzaGFyZWQgYW5jZXN0b3JzIChkaWFtb25kcykgYXJlXG4gKiB0aGUgc2FtZSBvYmplY3QgcmVhY2hlZCB0aHJvdWdoIG1hbnkgcGF0aHMuIGBKU09OLnN0cmluZ2lmeShzbGljZSlgXG4gKiBkdXBsaWNhdGVzIGV2ZXJ5IHNoYXJlZCBzdWJ0cmVlIHBlciBwYXRoIGFuZCBleHBsb2RlcyBjb21iaW5hdG9yaWFsbHkuXG4gKiBOZXZlciBzdHJpbmdpZnkgaXQ6IHVzZSBgc2xpY2VUb0pTT04oKWAgKGZsYXQsIGlkLXJlZmVyZW5jZWQsIGxpbmVhcikgZm9yXG4gKiB3aXJlIHRyYW5zZmVyIG9yIGBmb3JtYXRTbGljZSgpYCAoYm91bmRlZCBzdHJpbmcpIGZvciBMTE0gdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVTbGljZSB7XG4gIC8qKiBUaGUgc3RhdGUga2V5IHRoYXQgd2FzIGFza2VkIGFib3V0IChub3JtYWxpc2VkIHN0cmluZyBmb3JtKS4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IHVwcGVyIGJvdW5kIHRoZSB3cml0ZXIgc2VhcmNoIHdhcyBhbmNob3JlZFxuICAgKiBhdCAoXCJhcyBpdCBzdG9vZCBiZWZvcmUgdGhpcyBpZHhcIikuIFVuZGVmaW5lZCA9IHRoZSB3aG9sZSBsb2cgKGN1cnJlbnRcbiAgICogdmFsdWUpLlxuICAgKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNvbW1pdCB0aGF0IGxhc3Qgd3JvdGUgYGtleWAg4oCUIHRoZSBzbGljZSBhbmNob3IuIEFic2VudCB3aGVuIG1pc3NpbmcuXG4gICAqIFVuZGVyIHRoZSB3cml0ZXIgcnVsZSAoOS4zMy4wKSBpdCBtYXkgaGF2ZSB3cml0dGVuIG9ubHkgYSBwYXRoIElOU0lERSB0aGVcbiAgICoga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2spOiBpdCB0aGVuIG1hZGUgcGFydCBvZiB0aGVcbiAgICogdmFsdWUsIGFuZCBlYXJsaWVyIHdyaXRlcnMgbWF5IGFjY291bnQgZm9yIHRoZSByZXN0LiBBbiBvdXRwdXRNYXBwZXInc1xuICAgKiBtZXJnZS1iYWNrIGJ1bmRsZSBjYXJyaWVzIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3RhZ2UgQkVGT1JFIHRoZSBtb3VudFxuICAgKiAob3Igb2YgdGhlIGJyYW5jaGluZyBkZWNpZGVyKSwgbm90IHRoZSBtb3VudCdzIOKAlCBhIGtub3duIGdhcCBpbiB0aGUgcmVjb3JkXG4gICAqIChgU3ViZmxvd0V4ZWN1dG9yIMK3IGV4ZWN1dGVTdWJmbG93YCksIG5hbWVkIGluIHNsaWNlL1JFQURNRS5tZC5cbiAgICovXG4gIHdyaXRlcj86IENvbW1pdEJ1bmRsZTtcbiAgLyoqXG4gICAqIFRoZSBiYWNrd2FyZCBjYXVzYWwgREFHIHJvb3RlZCBhdCB0aGUgd3JpdGVyIChzYW1lIGBDYXVzYWxOb2RlYCBzaGFwZSBhc1xuICAgKiBgY2F1c2FsQ2hhaW5gIOKAlCBwYXJlbnRFZGdlcyBjYXJyeSBrZXllZCBkYXRhL2NvbnRyb2wgZWRnZXMsIGhvbmVzdHkgdmlhXG4gICAqIGBpbmNvbXBsZXRlU291cmNlc2AvYHRydW5jYXRlZGApLiBBYnNlbnQgd2hlbiBtaXNzaW5nLiBTZWUgdGhlXG4gICAqIHNlcmlhbGl6YXRpb24gd2FybmluZyBvbiB0aGlzIGludGVyZmFjZSBiZWZvcmUgc3RyaW5naWZ5aW5nLlxuICAgKi9cbiAgcm9vdD86IENhdXNhbE5vZGU7XG4gIC8qKiBQcmVzZW50IE9OTFkgd2hlbiBgcm9vdGAgaXMgYWJzZW50IOKAlCB3aHkgdGhlcmUgaXMgbm8gc2xpY2UuICovXG4gIG1pc3Npbmc/OiBNaXNzaW5nU2xpY2VSZWFzb247XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHdoYXQgdGhlIGFuY2hvciByZXN0cyBvbiwgd2hlbiBpdCBpcyBub3QgYW4gZXhhY3Qgd3JpdGU6IGEgYCduZXN0ZWQtcm93cydgIG5vdGUgd2hlblxuICAgKiB0aGUgd3JpdGVyIHJlYWNoZWQgdGhlIGtleSBvbmx5IHRocm91Z2ggcm93cyBpbnNpZGUgaXQ7IGEgYCdyZWRhY3RlZCdgIG5vdGUgd2hlbiB0aGUgdmFsdWUgaXQgZXhwbGFpbnNcbiAgICogaG9sZHMgKG9yIGxvc3QgdGhlIGtleSB1bmRlcikgdGhlIGxvZydzIHBsYWNlaG9sZGVyOyBhIGAnZnJvbS1pbml0aWFsLXN0YXRlJ2Agbm90ZSB3aGVuIG5vIGBzZXRgIC9cbiAgICogYGRlbGV0ZWAgb2YgdGhlIGtleSBvciBhcm91bmQgaXQgaXMgaW4gcmFuZ2UsIHNvIHRoZSB2YWx1ZSByZXN0cyBvbiB0aGUgcHJlLXJ1biBzdGF0ZSB0aGUgbG9nIGNhbm5vdFxuICAgKiBzZWUgKHRoZSBjb2RlcyBvZiBgY29tbWl0VmFsdWVBdFdpdGhCYXNpc2AgYXQgdGhlIHNsaWNlJ3MgcG9pbnQpLiBBQlNFTlQgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHNheSwgc28gYVxuICAgKiBzbGljZSBhbmNob3JlZCBhdCBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5IGtlZXBzIGl0cyA5LjMyLjAgc2hhcGUuIEVhY2ggY2F1c2FsIGVkZ2Ugc2F5cyB0aGVcbiAgICogc2FtZSBwZXIgbGluayAoYENhdXNhbEVkZ2UuYmFzaXNgKS5cbiAgICovXG4gIG5vdGVzPzogSG9uZXN0eU5vdGVbXTtcbiAgLyoqIFdoaWNoIHtAbGluayBLZXlzUmVhZFNvdXJjZX0gc3RyYXRlZ3kgcmVzb2x2ZWQgcmVhZHMgKGhvbmVzdHkvZGVidWcpLiAqL1xuICBrZXlzUmVhZEtpbmQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvbmVzdHkgdGVsZW1ldHJ5IGNvcGllZCBmcm9tIHRoZSBzdHJhdGVneSB3aGVuIGl0IHByb3ZpZGVzIG9uZSDigJQgc2VlXG4gICAqIHtAbGluayBLZXlzUmVhZFNvdXJjZS5jb3ZlcmFnZX0uIEEgcm9vdCB3aXRoIG5vIHBhcmVudHMgQU5EXG4gICAqIGBzdGVwc1dpdGhSZWFkcyA9PT0gMGAgbWVhbnMgXCJyZWFkcyB3ZXJlIG5vdCByZWNvcmRlZFwiLCBOT1QgXCJub1xuICAgKiBkZXBlbmRlbmNpZXNcIjsgdHJpYWdlIHRvb2xzIG11c3Qgc2F5IHNvLlxuICAgKi9cbiAgcmVhZHNDb3ZlcmFnZT86IFJlYWRzQ292ZXJhZ2U7XG59XG5cbi8vIOKUgOKUgCBGb3J3YXJkIHNsaWNlICh0aGUgZm9yd2FyZCBoYWxmOiBcIndoYXQgZGlkIHRoaXMgdmFsdWUgRkVFRD9cIikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSG93IGEgYGZlZGAgZWRnZSB3YXMgYXR0cmlidXRlZCDigJQgdGhlIGhvbmVzdHkgYXhpcyBvZiB0aGUgRk9SV0FSRCB3YWxrLFxuICogdGhlIG1pcnJvciBvZiB7QGxpbmsgQXR0cmlidXRpb25CYXNpc30gZm9yIHRoZSBiYWNrd2FyZCBvbmUuIFRoZSB0d28gd29yZHNcbiAqIGFyZSBkZWxpYmVyYXRlbHkgYGNhdXNhbENoYWluYCdzIGBlZGdlQXR0cmlidXRpb25gIHZhbHVlcywgYmVjYXVzZSB0aGV5XG4gKiBuYW1lIHRoZSBzYW1lIHR3byBtZWNoYW5pc21zOlxuICpcbiAqIC0gYCdwZXItd3JpdGUnYCDigJQgRVhBQ1QuIFRoZSBjaGlsZCdzIHdyaXRlIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWRcbiAqICAgcHJvdmVuYW5jZSAoYFRyYWNlRW50cnkucmVhZEtleXNgLCByZWNvcmRlZCB1bmRlciB0aGUgZXhlY3V0b3Inc1xuICogICBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZGlhbCkgYW5kIHRoaXMga2V5IGlzIElOIGl0OiB0aGUgdmFsdWVcbiAqICAgd2FzIHJlYWQgYmVmb3JlIHRoYXQgd3JpdGUsIHNvIGl0IGNvdWxkIGZlZWQgaXQuIFRoZSBzYW1lIHByb3ZlbmFuY2VcbiAqICAgYWxzbyBFWENMVURFUyBleGFjdGx5OiBhIHdyaXRlIHdob3NlIGByZWFkS2V5c2Agb21pdCB0aGlzIGtleSBnZXRzIG5vXG4gKiAgIGVkZ2UgYXQgYWxsLlxuICogLSBgJ3N0YWdlJ2Ag4oCUIENPTlNFUlZBVElWRS4gVGhlIGNoaWxkJ3Mgd3JpdGUgY2FycmllcyBubyBgcmVhZEtleXNgICh0aGVcbiAqICAgZGlhbCB3YXMgb2ZmLCBvciB0aGUgbG9nIGlzIG1peGVkKSwgc28gYWxsIHRoYXQgaXMga25vd24gaXMgc3RhZ2UtbGV2ZWxcbiAqICAgY28tb2NjdXJyZW5jZTogdGhlIHN0YWdlIHJlYWQgdGhpcyBrZXkgYW5kIHdyb3RlIHRoYXQgb25lLCBpbiBzb21lIG9yZGVyXG4gKiAgIHRoaXMgbG9nIGNhbm5vdCBzZWUuIEEgc291bmQgb3Zlci1hcHByb3hpbWF0aW9uIOKAlCB0aGUgZWRnZSBtYXkgbm90IGJlXG4gKiAgIHJlYWwuIE5ldmVyIHByZXNlbnRlZCBhcyBleGFjdDogZXZlcnkgY29uc2VydmF0aXZlIGVkZ2UgaXMgc3RhbXBlZCBoZXJlXG4gKiAgIEFORCBzdW1tYXJpc2VkIG9uY2Ugb24gdGhlIHNsaWNlIGFzIGEgYCdjb25zZXJ2YXRpdmUtZmVkLWVkZ2VzJ2BcbiAqICAge0BsaW5rIEhvbmVzdHlOb3RlfS5cbiAqXG4gKiBFYWNoIG1lbWJlciBpcyByZWdpc3RlcmVkLCB3aXRoIHRoZSBvbmUgc2VudGVuY2UgdGhhdCBzYXlzIHdoYXQgaXQgbWVhbnMsXG4gKiBpbiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AgKHNlcnZlZCBvbiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhlXG4gKiB1bmlvbiBkZWNsYXJlcyBpdHMgbWVtYmVycyB0aHJvdWdoIGBSZWdpc3RlcmVkQ29kZWAsIHNvIGEgbWVtYmVyIHRoZVxuICogcmVnaXN0cnkgZG9lcyBub3QgaG9sZCBkb2VzIG5vdCBjb21waWxlLlxuICovXG5leHBvcnQgdHlwZSBGZWRCYXNpcyA9IFJlZ2lzdGVyZWRDb2RlPCdwZXItd3JpdGUnIHwgJ3N0YWdlJz47XG5cbi8qKlxuICogVGhlIGNvZGUgb2YgYSB7QGxpbmsgSG9uZXN0eU5vdGV9IOKAlCBhIG1hY2hpbmUtcmVhZGFibGUgaG9uZXN0eSBzdGF0ZW1lbnQgYWJvdXQgYSBmb3J3YXJkIHF1ZXJ5J3NcbiAqIGFuc3dlci4gQSBjb25zdW1lciBCUkFOQ0hFUyBvbiBgY29kZWA7IGBkZXRhaWxgIGlzIHRoZSBzZW50ZW5jZSB0byBzaG93LlxuICpcbiAqIFdoYXQgZWFjaCBjb2RlIG1lYW5zIGlzIHJlZ2lzdGVyZWQgT05DRSwgd2l0aCB0aGUgb3RoZXIgaG9uZXN0eSBzaWduYWxzLCBpblxuICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgIChzZXJ2ZWQgYXMgYEhPTkVTVFlfQ09ERVNgIG9uIGBmb290cHJpbnRqcy90cmFjZWApOyB0aGlzXG4gKiB1bmlvbiBkZWNsYXJlcyBpdHMgbWVtYmVycyB0aHJvdWdoIGBSZWdpc3RlcmVkQ29kZWAsIHNvIGEgY29kZSB0aGUgcmVnaXN0cnkgZG9lcyBub3QgaG9sZCBkb2VzXG4gKiBub3QgY29tcGlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgSG9uZXN0eU5vdGVDb2RlID0gUmVnaXN0ZXJlZENvZGU8XG4gIHwgJ2NvbnNlcnZhdGl2ZS1mZWQtZWRnZXMnXG4gIHwgJ25lc3RlZC1yb3dzJ1xuICB8ICdwcmUtcnVuLW9yaWdpbidcbiAgfCAncmVhZHMtbm90LXJlY29yZGVkJ1xuICB8ICd1bmtub3duLWtleSdcbiAgfCAndHJ1bmNhdGVkJ1xuICB8ICdyZWRhY3RlZCdcbiAgfCAnZnJvbS1pbml0aWFsLXN0YXRlJ1xuPjtcblxuLyoqIE9uZSBob25lc3R5IHN0YXRlbWVudCDigJQgc2VlIHtAbGluayBIb25lc3R5Tm90ZUNvZGV9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb25lc3R5Tm90ZSB7XG4gIGNvZGU6IEhvbmVzdHlOb3RlQ29kZTtcbiAgLyoqIE9uZSBodW1hbi9MTE0tcmVhZGFibGUgc2VudGVuY2UuIFJlbmRlcmVkIGJ5IHRoZSBmb3JtYXR0ZXJzIGFzIGDimqAg4oCmYC4gKi9cbiAgZGV0YWlsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT05FIHJlY29yZGVkIHJlYWQgb2YgYSBrZXkgaW5zaWRlIGEgdmFsdWUncyBsaXZlIHJhbmdlOiB3aGljaCBleGVjdXRpb25cbiAqIHN0ZXAgcmVhZCBpdCwgYW5kIHdoZXJlIHRoYXQgc3RlcCBzaXRzIGluIHRoZSBjb21taXQgbG9nLiBCb3RoIGpvaW4ga2V5c1xuICogYXJlIGNhcnJpZWQgKGBydW50aW1lU3RhZ2VJZGAgZm9yIHJlY29yZGVycy9VSXMsIGBjb21taXRJZHhgIGZvciB0aGUgbG9nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J3YXJkUmVhZCB7XG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBDb21taXQgQVJSQVkgcG9zaXRpb24gb2YgdGhlIFJFQURJTkcgc3RhZ2UncyBvd24gY29tbWl0IGJ1bmRsZS4gKi9cbiAgY29tbWl0SWR4OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBgZmVkYCBlZGdlOiB0aGUgcGFyZW50IG5vZGUncyB2YWx1ZSB3YXMgbGl2ZSBhbmQgcmVhZCBieSBhIHN0YWdlLCBhbmRcbiAqIHRoYXQgc2FtZSBzdGFnZSB3cm90ZSBgY2hpbGRgLiBUaGUgcmVhZGVyIElTIHRoZSBjaGlsZCdzIHdyaXRlciDigJQgdGhhdCBpc1xuICogd2h5IHRoZSBlZGdlIGNhcnJpZXMgbm8gc2VwYXJhdGUgXCJ2aWFcIiBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcndhcmRFZGdlIHtcbiAgY2hpbGQ6IEZvcndhcmROb2RlO1xuICAvKiogRXhhY3QgKGAncGVyLXdyaXRlJ2ApIG9yIGNvbnNlcnZhdGl2ZSAoYCdzdGFnZSdgKSDigJQgc2VlIHtAbGluayBGZWRCYXNpc30uICovXG4gIGJhc2lzOiBGZWRCYXNpcztcbn1cblxuLyoqXG4gKiBPTkUgTElGRSBvZiBvbmUga2V5J3MgdmFsdWUg4oCUIHRoZSBmb3J3YXJkIG1pcnJvciBvZiB7QGxpbmsgQ2F1c2FsTm9kZX0uXG4gKlxuICogQSB2YWx1ZSdzIGxpZmUgc3RhcnRzIGF0IGEgd3JpdGUgYW5kIGVuZHMgYXQgdGhlIGtleSdzIE5FWFQgd3JpdGVcbiAqIChgbmV4dFdyaXRlSWR4YCkuIFJlYWRzIGluc2lkZSB0aGF0IHdpbmRvdyBzYXcgVEhJUyB2YWx1ZTsgdGhlIHdyaXRlc1xuICogdGhvc2UgcmVhZGVycyBtYWRlIGFyZSB0aGlzIHZhbHVlJ3MgYGZlZEVkZ2VzYC5cbiAqXG4gKiBTRVJJQUxJWkFUSU9OIFdBUk5JTkcgKHNhbWUgYXMge0BsaW5rIFZhcmlhYmxlU2xpY2V9KTogYGZlZEVkZ2VzYCBmb3JtIGFuXG4gKiBpbi1tZW1vcnkgREFHIHdpdGggU0hBUkVEIG5vZGVzIOKAlCB0d28gZGlmZmVyZW50IHZhbHVlcyByZWFkIGJ5IG9uZSBzdGFnZVxuICogZmVlZCB0aGUgc2FtZSBjaGlsZCB3cml0ZS4gYEpTT04uc3RyaW5naWZ5YCByZS1zZXJpYWxpemVzIHNoYXJlZCBzdWJ0cmVlc1xuICogcGVyIHBhdGguIFVzZSBgZm9yd2FyZFNsaWNlVG9KU09OKClgIC8gYGZvcm1hdEZvcndhcmRTbGljZSgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J3YXJkTm9kZSB7XG4gIC8qKiBUaGUgc3RhdGUga2V5IHdob3NlIHZhbHVlIHRoaXMgaXMgKG5vcm1hbGlzZWQgc3RyaW5nIGZvcm0pLiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIC0gYCd3cml0ZSdgIOKAlCBhIGNvbW1pdCBpbiB0aGlzIGxvZyBzdGFydGVkIHRoaXMgbGlmZS5cbiAgICogLSBgJ3ByZS1ydW4nYCDigJQgdGhlIHZhbHVlIHdhcyBhbHJlYWR5IHRoZXJlIGJlZm9yZSB0aGUgbG9nJ3MgZmlyc3Qgd3JpdGVcbiAgICogICBvZiB0aGUga2V5IChpbml0aWFsIHN0YXRlIC8gZnJvemVuIGBpbnB1dGAgLyBhIGNsb3N1cmUpLiBUaGVcbiAgICogICBpZGVudGl0eS92ZXJiIGZpZWxkcyBiZWxvdyBhcmUgQUJTRU5UOiB0aGUgY29tbWl0IGxvZyBnZW51aW5lbHkgZG9lc1xuICAgKiAgIG5vdCBrbm93IHdobyBwdXQgaXQgdGhlcmUuXG4gICAqL1xuICBvcmlnaW46ICd3cml0ZScgfCAncHJlLXJ1bic7XG4gIC8qKiBFeGVjdXRpb24gc3RlcCB0aGF0IHdyb3RlIGl0LiBBYnNlbnQgZm9yIGEgYCdwcmUtcnVuJ2Agb3JpZ2luLiAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIG9mIHRoZSB3cml0ZXIuIEFic2VudCBmb3IgYCdwcmUtcnVuJ2AuICovXG4gIHN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdGFnZSBuYW1lIG9mIHRoZSB3cml0ZXIuIEFic2VudCBmb3IgYCdwcmUtcnVuJ2AuICovXG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgLyoqIENvbW1pdCBBUlJBWSBwb3NpdGlvbiBvZiB0aGUgd3JpdGUuIEFic2VudCBmb3IgYCdwcmUtcnVuJ2AuICovXG4gIGNvbW1pdElkeD86IG51bWJlcjtcbiAgLyoqIFRoZSB0cmFjZSB2ZXJiIG9mIHRoYXQgd3JpdGUuIEFic2VudCBmb3IgYCdwcmUtcnVuJ2AuICovXG4gIHZlcmI/OiBUcmFjZUVudHJ5Wyd2ZXJiJ107XG4gIC8qKlxuICAgKiBDb21taXQgQVJSQVkgcG9zaXRpb24gb2YgdGhlIGtleSdzIE5FWFQgd3JpdGUg4oCUIHdoZXJlIHRoaXMgdmFsdWUncyBsaWZlXG4gICAqIGVuZHMuIEFic2VudCA9IHN0aWxsIGxpdmUgYXQgdGhlIGVuZCBvZiB0aGUgbG9nLiBSZWFkcyBBVCB0aGlzIGluZGV4XG4gICAqIHN0aWxsIGJlbG9uZyB0byBUSElTIGxpZmU6IHJlYWRzIGZpcmUgYmVmb3JlIHRoZWlyIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbmV4dFdyaXRlSWR4PzogbnVtYmVyO1xuICAvKiogQkZTIGRlcHRoIGZyb20gdGhlIGFuY2hvciAoMCA9IHRoZSBhbmNob3IgdmFsdWUpLiAqL1xuICBkZXB0aDogbnVtYmVyO1xuICAvKiogUmVjb3JkZWQgcmVhZHMgb2YgYGtleWAgaW5zaWRlIHRoaXMgbGlmZSwgaW4gY29tbWl0IG9yZGVyLiAqL1xuICByZWFkczogRm9yd2FyZFJlYWRbXTtcbiAgLyoqIFdoYXQgdGhpcyB2YWx1ZSBmZWQg4oCUIG9uZSBlZGdlIHBlciBkb3duc3RyZWFtIHdyaXRlLiAqL1xuICBmZWRFZGdlczogRm9yd2FyZEVkZ2VbXTtcbiAgLyoqXG4gICAqIEhvbmVzdHkgbWFya2VyIGNvcGllZCBmcm9tIHRoZSB3cml0ZXIncyBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgXG4gICAqIOKAlCBpZGVudGljYWwgbWVhbmluZyB0byB7QGxpbmsgQ2F1c2FsTm9kZS5pbmNvbXBsZXRlU291cmNlc30uXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFNldCBvbiB0aGUgUk9PVCBvbmx5LCBhbmQgb25seSB3aGVuIGEgYnVkZ2V0IGFjdHVhbGx5IGN1dCB0aGUgd2Fsay4gQ2Fycmllc1xuICAgKiBubyBjb2RlOiB3aGF0IGl0IG1lYW5zIGlzIHJlZ2lzdGVyZWQgYXMgYCd0cnVuY2F0ZWQnYCBpbiBgSE9ORVNUWV9DT0RFU2AuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGEgZm9yd2FyZCBzbGljZTogXCJ3aG8gUkVBRCB0aGlzIHZhbHVlLCBhbmQgd2hhdCBkaWQgaXRcbiAqIEZFRUQ/XCIg4oCUIHRoZSBtaXJyb3Igb2Yge0BsaW5rIFZhcmlhYmxlU2xpY2V9LlxuICpcbiAqIEFuY2hvcmluZyBydWxlIGlzIHRoZSBiYWNrd2FyZCBvbmUsIHVuY2hhbmdlZDogdGhlIExBU1Qgd3JpdGUgb2YgYGtleWBcbiAqIChiZWZvcmUgYGJlZm9yZWAsIHdoZW4gZ2l2ZW4pLiBXaGF0IGRpZmZlcnMgaXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgd2FsayDigJRcbiAqIGBiZWZvcmVgIGJvdW5kcyB0aGUgQU5DSE9SIHNlYXJjaCBvbmx5OyB0aGUgd2FsayB0aGVuIHJ1bnMgZm9yd2FyZCBwYXN0IGl0LFxuICogYmVjYXVzZSBcIndoYXQgZGlkIHRoZSB2YWx1ZSBhdCBzdGVwIDEyIGdvIG9uIHRvIGZlZWQ/XCIgaXMgdGhlIHF1ZXN0aW9uLlxuICpcbiAqIEFCU0VOQ0UsIHNwbGl0IGJ5IHdoYXQgdGhlIHJlY29yZGluZyBhZmZvcmRzIChhIHR5cG8gbXVzdCBuZXZlciByZWFkIGFzXG4gKiBcInRoaXMgdmFyaWFibGUgaGFzIG5vIGhpc3RvcnlcIik6XG4gKiAtIGAnZW1wdHktbG9nJ2Ag4oCUIG5vdGhpbmcgZXhlY3V0ZWQuXG4gKiAtIGAnbmV2ZXItd3JpdHRlbidgIOKAlCBubyB3cml0ZSAodGhlIHdyaXRlciBydWxlKSBBTkQgbm8gcmVjb3JkZWQgcmVhZCBvbixcbiAqICAgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5LCBpbiBhIGxvZ1xuICogICB0aGF0IERPRVMgY2FycnkgcmVjb3JkZWQgcmVhZHMuIFRoZSBsb2cgY2FuIHNlZSByZWFkZXJzIGFuZCB0aGlzIGtleSBoYXNcbiAqICAgbm9uZSwgc28gXCJubyBoaXN0b3J5XCIgaXMgYSBmaW5kaW5nLCBub3QgYSBibGluZCBzcG90OiBubyByb290IG5vZGUsIGFuZFxuICogICBhbiBgJ3Vua25vd24ta2V5J2Age0BsaW5rIEhvbmVzdHlOb3RlfSBuYW1lcyB0aGUga2V5cyB0aGUgbG9nIGRvZXMga25vdy5cbiAqIC0gb3RoZXJ3aXNlIGEga2V5IHdpdGggbm8gd3JpdGUgc3RpbGwgZ2V0cyBhIGAncHJlLXJ1bidgIG9yaWdpbiBsaWZlIOKAlFxuICogICB0aGUgdmFsdWUgY2FtZSBmcm9tIGluaXRpYWwgc3RhdGUgLyBgaW5wdXRgIC8gYSBjbG9zdXJlIGFuZCBzdGFnZXMgcmVhZFxuICogICBpdC4gV2hlbiB0aGUgbG9nIGNhcnJpZXMgTk8gcmVjb3JkZWQgcmVhZHMgYXQgYWxsLCB0aGF0IHByZS1ydW4gbm9kZSBpc1xuICogICB0aGUgb25seSBob25lc3QgYW5zd2VyIGFuZCBhbHdheXMgc2hpcHMgdGhlIGAncmVhZHMtbm90LXJlY29yZGVkJ2Agbm90ZTpcbiAqICAgYSB0eXBvIGFuZCBhbiB1bnJlYWQgc2VlZGVkIGtleSBhcmUgZ2VudWluZWx5IGluZGlzdGluZ3Vpc2hhYmxlIHRoZW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZFNsaWNlIHtcbiAgLyoqIFRoZSBzdGF0ZSBrZXkgdGhhdCB3YXMgYXNrZWQgYWJvdXQgKG5vcm1hbGlzZWQgc3RyaW5nIGZvcm0pLiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIEV4Y2x1c2l2ZSBjb21taXQtYXJyYXktaW5kZXggYm91bmQgdGhlIEFOQ0hPUiBzZWFyY2ggdXNlZC4gKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xuICAvKiogVGhlIGNvbW1pdCB0aGF0IHdyb3RlIHRoZSBhbmNob3IgdmFsdWUuIEFic2VudCBmb3IgYSBwcmUtcnVuIG9yaWdpbi4gKi9cbiAgd3JpdGVyPzogQ29tbWl0QnVuZGxlO1xuICAvKiogVGhlIGZvcndhcmQgREFHIHJvb3RlZCBhdCB0aGUgYW5jaG9yIHZhbHVlLiBBYnNlbnQgd2hlbiBgbWlzc2luZ2AuICovXG4gIHJvb3Q/OiBGb3J3YXJkTm9kZTtcbiAgLyoqIFByZXNlbnQgT05MWSB3aGVuIGByb290YCBpcyBhYnNlbnQg4oCUIHNlZSB7QGxpbmsgTWlzc2luZ1NsaWNlUmVhc29ufS4gKi9cbiAgbWlzc2luZz86IE1pc3NpbmdTbGljZVJlYXNvbjtcbiAgLyoqIFdoaWNoIHtAbGluayBLZXlzUmVhZFNvdXJjZX0gc3RyYXRlZ3kgcmVzb2x2ZWQgcmVhZHMgKGhvbmVzdHkvZGVidWcpLiAqL1xuICBrZXlzUmVhZEtpbmQ6IHN0cmluZztcbiAgLyoqIEhvbmVzdHkgdGVsZW1ldHJ5IGZyb20gdGhlIHN0cmF0ZWd5IOKAlCBzZWUge0BsaW5rIEtleXNSZWFkU291cmNlLmNvdmVyYWdlfS4gKi9cbiAgcmVhZHNDb3ZlcmFnZT86IFJlYWRzQ292ZXJhZ2U7XG4gIC8qKiBBbHdheXMgcHJlc2VudCAocG9zc2libHkgZW1wdHkpIOKAlCBzZWUge0BsaW5rIEhvbmVzdHlOb3RlfS4gKi9cbiAgbm90ZXM6IEhvbmVzdHlOb3RlW107XG59XG5cbi8qKiBPbmUgbW9tZW50IGluIGEga2V5J3MgbGlmZTogYSB3cml0ZSwgb3IgYSByZWNvcmRlZCByZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlNb21lbnQge1xuICBraW5kOiAnd3JpdGUnIHwgJ3JlYWQnO1xuICAvKipcbiAgICogQ29tbWl0IEFSUkFZIHBvc2l0aW9uIOKAlCBmb3IgYSBgJ3dyaXRlJ2AgaXRzIG93biBjb21taXQsIGZvciBhIGAncmVhZCdgXG4gICAqIHRoZSBSRUFESU5HIHN0YWdlJ3MgY29tbWl0LiBXaXRoIGBydW50aW1lU3RhZ2VJZGAgdGhlc2UgYXJlIHRoZSB0d29cbiAgICogdW5pdmVyc2FsIGpvaW4ga2V5cyAodG8gdGhlIGNvbW1pdCBsb2csIGFuZCB0byByZWNvcmRlcnMvVUlzKS5cbiAgICovXG4gIGNvbW1pdElkeDogbnVtYmVyO1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogYCd3cml0ZSdgIG1vbWVudHMgb25seTogdGhlIHRyYWNlIHZlcmIgb2YgdGhlIHdyaXRlLiAqL1xuICB2ZXJiPzogVHJhY2VFbnRyeVsndmVyYiddO1xuICAvKipcbiAgICogYCdyZWFkJ2AgbW9tZW50cyBvbmx5OiB0aGUgYGNvbW1pdElkeGAgb2YgdGhlIHdyaXRlIHdob3NlIGxpdmUgcmFuZ2VcbiAgICogdGhpcyByZWFkIHNpdHMgaW4g4oCUIHdoaWNoIHZhbHVlIGl0IHNhdy4gQUJTRU5UIHdoZW4gdGhlIHJlYWQgcHJlY2VkZXNcbiAgICogZXZlcnkgd3JpdGUgb2YgdGhlIGtleSAocHJlLXJ1biBvcmlnaW46IGluaXRpYWwgc3RhdGUgLyBgaW5wdXRgIC9cbiAgICogY2xvc3VyZSkuXG4gICAqL1xuICBmcm9tV3JpdGVJZHg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHdob2xlIGxpZmUgb2Ygb25lIGtleSBpbiBjb21taXQgb3JkZXIg4oCUIGV2ZXJ5IHdyaXRlIGFuZCBldmVyeSByZWNvcmRlZFxuICogcmVhZC4gVGhlIGZsYXQsIGNocm9ub2xvZ2ljYWwgY29tcGFuaW9uIHRvIHtAbGluayBGb3J3YXJkU2xpY2V9OiBubyBncmFwaCxcbiAqIG5vIGJ1ZGdldHMsIG5vIGxpdmUgcmVmZXJlbmNlcyAoYWxyZWFkeSBKU09OLXNhZmUgYnkgY29uc3RydWN0aW9uKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlUaW1lbGluZSB7XG4gIC8qKiBUaGUgc3RhdGUga2V5IHRoYXQgd2FzIGFza2VkIGFib3V0IChub3JtYWxpc2VkIHN0cmluZyBmb3JtKS4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IGJvdW5kOiBvbmx5IG1vbWVudHMgYmVmb3JlIHRoaXMgaW5kZXguICovXG4gIGJlZm9yZT86IG51bWJlcjtcbiAgLyoqIFdyaXRlcyBhbmQgcmVhZHMgaW4gY29tbWl0IG9yZGVyLiBBYnNlbnQgd2hlbiBgbWlzc2luZ2AuICovXG4gIG1vbWVudHM/OiBLZXlNb21lbnRbXTtcbiAgLyoqXG4gICAqIFByZXNlbnQgT05MWSB3aGVuIGBtb21lbnRzYCBpcyBhYnNlbnQg4oCUIHNhbWUgc3BsaXQgYXNcbiAgICoge0BsaW5rIEZvcndhcmRTbGljZX06IGAnZW1wdHktbG9nJ2Agd2hlbiBub3RoaW5nIGV4ZWN1dGVkLFxuICAgKiBgJ25ldmVyLXdyaXR0ZW4nYCB3aGVuIGEgbG9nIHRoYXQgRE9FUyBjYXJyeSByZWNvcmRlZCByZWFkcyBoYXMgbmVpdGhlclxuICAgKiBhIHdyaXRlIG5vciBhIHJlYWQgb2YgdGhpcyBrZXkgKGFuIGAndW5rbm93bi1rZXknYCBub3RlIHRoZW4gbmFtZXMgdGhlXG4gICAqIGtleXMgaXQga25vd3MpLlxuICAgKi9cbiAgbWlzc2luZz86IE1pc3NpbmdTbGljZVJlYXNvbjtcbiAgLyoqIFdoaWNoIHtAbGluayBLZXlzUmVhZFNvdXJjZX0gc3RyYXRlZ3kgcmVzb2x2ZWQgcmVhZHMgKGhvbmVzdHkvZGVidWcpLiAqL1xuICBrZXlzUmVhZEtpbmQ6IHN0cmluZztcbiAgLyoqIEhvbmVzdHkgdGVsZW1ldHJ5IGZyb20gdGhlIHN0cmF0ZWd5IOKAlCBzZWUge0BsaW5rIEtleXNSZWFkU291cmNlLmNvdmVyYWdlfS4gKi9cbiAgcmVhZHNDb3ZlcmFnZT86IFJlYWRzQ292ZXJhZ2U7XG4gIC8qKiBBbHdheXMgcHJlc2VudCAocG9zc2libHkgZW1wdHkpIOKAlCBzZWUge0BsaW5rIEhvbmVzdHlOb3RlfS4gKi9cbiAgbm90ZXM6IEhvbmVzdHlOb3RlW107XG59XG5cbi8qKlxuICogRmxhdCwgaWQtcmVmZXJlbmNlZCwgSlNPTi1zYWZlIHByb2plY3Rpb24gb2YgYSB7QGxpbmsgRm9yd2FyZFNsaWNlfSDigJQgdGhlXG4gKiBmb3J3YXJkIHR3aW4gb2Yge0BsaW5rIFNsaWNlSlNPTn0sIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uIChzaGFyZWQgbm9kZXM7XG4gKiBzZWUgdGhlIHNlcmlhbGl6YXRpb24gd2FybmluZyBvbiB7QGxpbmsgRm9yd2FyZE5vZGV9KS5cbiAqXG4gKiBOb2RlIGlkcyBkaWZmZXIgZnJvbSBgU2xpY2VKU09OYCdzIGRlbGliZXJhdGVseTogYSBmb3J3YXJkIG5vZGUgaXMgYVxuICogKGtleSwgd3JpdGUpIHBhaXIsIHNvIG9uZSBgcnVudGltZVN0YWdlSWRgIGNhbiBob3N0IHNldmVyYWwgbm9kZXMgKGEgc3RhZ2VcbiAqIHdyaXRpbmcgdHdvIGtleXMpLiBJZHMgYXJlIHRoZXJlZm9yZSBPUEFRVUUsIGFzc2lnbmVkIGluIEJGUyBvcmRlciDigJRcbiAqIG5ldmVyIHBhcnNlIHRoZW07IGpvaW4gb24gYHJ1bnRpbWVTdGFnZUlkYCAvIGBjb21taXRJZHhgIC8gYGtleWAsIHdoaWNoXG4gKiBldmVyeSBub2RlIGNhcnJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZFNsaWNlSlNPTiB7XG4gIGtleTogc3RyaW5nO1xuICBiZWZvcmU/OiBudW1iZXI7XG4gIG1pc3Npbmc/OiBNaXNzaW5nU2xpY2VSZWFzb247XG4gIGtleXNSZWFkS2luZDogc3RyaW5nO1xuICByZWFkc0NvdmVyYWdlPzogUmVhZHNDb3ZlcmFnZTtcbiAgbm90ZXM6IEhvbmVzdHlOb3RlW107XG4gIC8qKiBPcGFxdWUgaWQgb2YgdGhlIGFuY2hvciBub2RlLiBBYnNlbnQgd2hlbiBgbWlzc2luZ2AuICovXG4gIHJvb3RJZD86IHN0cmluZztcbiAgLyoqIEV2ZXJ5IERBRyBub2RlIGV4YWN0bHkgb25jZSwgaW4gQkZTIG9yZGVyLiAqL1xuICBub2Rlcz86IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIG9yaWdpbjogJ3dyaXRlJyB8ICdwcmUtcnVuJztcbiAgICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgICBzdGFnZUlkPzogc3RyaW5nO1xuICAgIHN0YWdlTmFtZT86IHN0cmluZztcbiAgICBjb21taXRJZHg/OiBudW1iZXI7XG4gICAgdmVyYj86IFRyYWNlRW50cnlbJ3ZlcmInXTtcbiAgICBuZXh0V3JpdGVJZHg/OiBudW1iZXI7XG4gICAgZGVwdGg6IG51bWJlcjtcbiAgICByZWFkczogRm9yd2FyZFJlYWRbXTtcbiAgICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgfT47XG4gIC8qKiBJZC1yZWZlcmVuY2VkIGVkZ2VzOiBwYXJlbnQgKGBmcm9tYCkgZmVkIGNoaWxkIChgdG9gKS4gKi9cbiAgZWRnZXM/OiBBcnJheTx7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgYmFzaXM6IEZlZEJhc2lzIH0+O1xuICAvKiogQ29waWVkIGZyb20gdGhlIHJvb3Qgd2hlbiBhIGJ1ZGdldCBjdXQgdGhlIHdhbGsg4oCUIHJlZ2lzdGVyZWQgYXMgYCd0cnVuY2F0ZWQnYCBpbiBgSE9ORVNUWV9DT0RFU2AuICovXG4gIHRydW5jYXRlZD86IHsgYnlEZXB0aDogYm9vbGVhbjsgYnlOb2RlczogYm9vbGVhbiB9O1xufVxuXG4vLyDilIDilIAgRWxlbWVudCBwcm92ZW5hbmNlIChhcHBlbmQtZm9sZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSG93IGFuIGVsZW1lbnQncyBiaXJ0aCBjb21taXQgd2FzIGRldGVybWluZWQg4oCUIHRoZSBob25lc3R5IGF4aXMgb2ZcbiAqIGFwcGVuZC1mb2xkIHByb3ZlbmFuY2UuIE9yZGVyZWQgc3Ryb25nZXN0IOKGkiB3ZWFrZXN0OlxuICpcbiAqIC0gYCdhcHBlbmQtdmVyYidgICAgICAg4oCUIHRoZSBlbmdpbmUgUkVDT1JERUQgdGhpcyB0YWlsIGFwcGVuZFxuICogICAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2ApLiBFeGFjdCBieSBjb25zdHJ1Y3Rpb24uXG4gKiAtIGAncHJlZml4LWluZmVyZW5jZSdgIOKAlCBhIGZ1bGwtdmFsdWUgd3JpdGUgcHJlc2VydmVkIHRoZSBwcmV2aW91cyBhcnJheSBhc1xuICogICBhIHN0cmljdCBwcmVmaXgsIHNvIHRoZSBuZXcgdGFpbCBpcyBhdHRyaWJ1dGVkIHRvIHRoaXMgY29tbWl0LiBIZXVyaXN0aWM6XG4gKiAgIGEgd3JpdGVyIHRoYXQgUkVQTEFDRUQgdGhlIGFycmF5IHdpdGggb25lIHRoYXQgaGFwcGVucyB0byBzaGFyZSB0aGUgb2xkXG4gKiAgIHByZWZpeCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFwcGVuZC4gUmlnaHQgaW4gcHJhY3RpY2UgKHB1c2gtc3R5bGVcbiAqICAgZ3Jvd3RoKSwgbGFiZWxlZCBob25lc3RseSBzbyBjb25zdW1lcnMgY2FuIHRlbGwuXG4gKiAtIGAnd2hvbGUtdmFsdWUnYCAgICAgIOKAlCB0aGUgYXJyYXkgd2FzIChyZSlwbGFjZWQgd2hvbGVzYWxlOyBldmVyeVxuICogICBlbGVtZW50J3MgcHJvdmVuYW5jZSByZXNldHMgdG8gdGhpcyBjb21taXQuIEV4YWN0IGJ1dCBjb2Fyc2UuXG4gKlxuICogRWFjaCBtZW1iZXIgaXMgcmVnaXN0ZXJlZCwgd2l0aCB0aGUgb25lIHNlbnRlbmNlIHRoYXQgc2F5cyB3aGF0IGl0IG1lYW5zLFxuICogaW4gYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgIChzZXJ2ZWQgb24gYGZvb3RwcmludGpzL3RyYWNlYCk7IHRoZVxuICogdW5pb24gZGVjbGFyZXMgaXRzIG1lbWJlcnMgdGhyb3VnaCBgUmVnaXN0ZXJlZENvZGVgLCBzbyBhIG1lbWJlciB0aGVcbiAqIHJlZ2lzdHJ5IGRvZXMgbm90IGhvbGQgZG9lcyBub3QgY29tcGlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXR0cmlidXRpb25CYXNpcyA9IFJlZ2lzdGVyZWRDb2RlPCdhcHBlbmQtdmVyYicgfCAncHJlZml4LWluZmVyZW5jZScgfCAnd2hvbGUtdmFsdWUnPjtcblxuLyoqXG4gKiBUaGUgYmlydGggcmVjb3JkIG9mIE9ORSBhcnJheSBlbGVtZW50OiB3aGljaCBjb21taXQgKGFuZCB0aGVyZWZvcmUgd2hpY2hcbiAqIHN0YWdlIGV4ZWN1dGlvbikgZmlyc3QgcHV0IGl0IHRoZXJlLiBUaGlzIGlzIHdoYXQgdHVybnMgdGhlIGFnZW50XG4gKiBtZWdhLWtleSBwcm9ibGVtIChcImV2ZXJ5dGhpbmcgZGVwZW5kcyBvbiBgaGlzdG9yeWBcIikgaW50byBlbGVtZW50LWxldmVsXG4gKiBhbnN3ZXJzIChcImhpc3RvcnlbN10gd2FzIGFwcGVuZGVkIGJ5IHRvb2wtY2FsbHMjNDEgaW4gaXRlcmF0aW9uIDNcIikuXG4gKlxuICogQHNlZSBlbGVtZW50UHJvdmVuYW5jZSDigJQgdGhlIHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGlzIHJlY29yZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50QmlydGgge1xuICAvKiogRWxlbWVudCBpbmRleCBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBhcnJheSBhdCBxdWVyeSB0aW1lLiAqL1xuICBpbmRleDogbnVtYmVyO1xuICAvKiogQ29tbWl0IEFSUkFZIHBvc2l0aW9uICh0aGUgYENvbW1pdEJ1bmRsZS5pZHhgIHNwYWNlKSBvZiB0aGUgYmlydGguICovXG4gIGNvbW1pdElkeDogbnVtYmVyO1xuICAvKiogRXhlY3V0aW9uIHN0ZXAgdGhhdCB3cm90ZSBpdCDigJQgam9pbnMgdG8gc2xpY2VzLCByZWNvcmRlcnMsIFVJcy4gKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIG9mIHRoZSB3cml0ZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUgb2YgdGhlIHdyaXRlci4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgdHJhY2UgdmVyYiBvZiB0aGUgYmlydGggY29tbWl0J3MgZW50cnkgZm9yIHRoaXMga2V5LiAqL1xuICB2ZXJiOiBUcmFjZUVudHJ5Wyd2ZXJiJ107XG4gIC8qKiBIb3cgdGhlIGF0dHJpYnV0aW9uIHdhcyBkZXRlcm1pbmVkIOKAlCBzZWUge0BsaW5rIEF0dHJpYnV0aW9uQmFzaXN9LiAqL1xuICBiYXNpczogQXR0cmlidXRpb25CYXNpcztcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgc2V0IG9ubHkgYnkgYGVsZW1lbnRQcm92ZW5hbmNlYDogdGhlIGBiYXNpc2Agb2YgdGhlIGFycmF5IHRoaXMgZWxlbWVudCBzaXRzIGluXG4gICAqIChgQXJyYXlQcm92ZW5hbmNlLmJhc2lzYCDigJQgZS5nLiBgJ2Zyb20taW5pdGlhbC1zdGF0ZSdgLCBgJ3JlZGFjdGVkJ2ApLiBBYnNlbnQgd2hlbiB0aGF0IGJhc2lzIGlzIGVtcHR5LlxuICAgKi9cbiAgdmFsdWVCYXNpcz86IFZhbHVlQmFzaXNbXTtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50J3MgdmFsdWUgYXMgb2YgdGhlIGZvbGQgKGRldGFjaGVkIGNsb25lKS4gUmVkYWN0aW9uIG5vdGU6XG4gICAqIHZhbHVlcyBhcmUgcmUtc2VydmVkIGV4YWN0bHkgYXMgdGhlIGNvbW1pdCBsb2cgc3RvcmVkIHRoZW0g4oCUIGEgcmVkYWN0ZWRcbiAgICoga2V5J3MgYCdSRURBQ1RFRCdgIHBsYWNlaG9sZGVyIChgbWVtb3J5L3BsYWNlaG9sZGVycy50cyDCt1xuICAgKiBMT0dfUExBQ0VIT0xERVJgLCB0aGUgbG9nJ3Mgc3RyaW5nKSBzdGF5cyByZWRhY3RlZDsgdGhpcyBsYXllciBuZXZlclxuICAgKiByZXN1cnJlY3RzIG9yaWdpbmFscy5cbiAgICovXG4gIHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFdoeSBlbGVtZW50IHByb3ZlbmFuY2UgY291bGQgbm90IGJlIHByb2R1Y2VkIChtaXJyb3JzXG4gKiB7QGxpbmsgTWlzc2luZ1NsaWNlUmVhc29ufSDigJQgb25lIGhvbmVzdC1hYnNlbmNlIHBhdHRlcm4gbW9kdWxlLXdpZGUpOlxuICogLSBgJ2VtcHR5LWxvZydgICAgICDigJQgbm8gY29tbWl0cyBhdCBhbGwuXG4gKiAtIGAnbmV2ZXItd3JpdHRlbidgIOKAlCBubyBjb21taXQgaW4gcmFuZ2Ugd3JvdGUgdGhlIGtleSAodGhlIHdyaXRlciBydWxlOlxuICogICBhIHJvdyBvbiBpdCwgaW5zaWRlIGl0LCBvciBhcm91bmQgaXQgdGhhdCBjaGFuZ2VkIGl0KS5cbiAqIC0gYCdub3QtYW4tYXJyYXknYCAg4oCUIHRoZSBrZXkgV0FTIHdyaXR0ZW4gYnV0IGl0cyBmb2xkZWQgdmFsdWUgaXMgbm90IGFuXG4gKiAgIGFycmF5IGF0IHRoZSBxdWVyaWVkIHBvaW50OiBhIHNjYWxhci9vYmplY3Qga2V5LCBhIGRlbGV0ZWQga2V5LCBvciBhXG4gKiAgIG1lcmdlIHRoYXQgZGVncmFkZWQgaXQuIEVsZW1lbnQgcHJvdmVuYW5jZSBpcyBhbiBhcnJheSBjb25jZXB0IOKAlCBmb3JcbiAqICAgc2NhbGFyIGtleXMgdGhlIHJpZ2h0IHF1ZXJ5IGlzIGBzbGljZUZvcktleWAuXG4gKlxuICogRWFjaCBtZW1iZXIgaXMgcmVnaXN0ZXJlZCwgd2l0aCB0aGUgb25lIHNlbnRlbmNlIHRoYXQgc2F5cyB3aGF0IGl0IG1lYW5zLFxuICogaW4gYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgIChzZXJ2ZWQgb24gYGZvb3RwcmludGpzL3RyYWNlYCk7IHRoZVxuICogdW5pb24gZGVjbGFyZXMgaXRzIG1lbWJlcnMgdGhyb3VnaCBgUmVnaXN0ZXJlZENvZGVgLCBzbyBhIG1lbWJlciB0aGVcbiAqIHJlZ2lzdHJ5IGRvZXMgbm90IGhvbGQgZG9lcyBub3QgY29tcGlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb24gPSBSZWdpc3RlcmVkQ29kZTwnZW1wdHktbG9nJyB8ICduZXZlci13cml0dGVuJyB8ICdub3QtYW4tYXJyYXknPjtcblxuLyoqXG4gKiBFbGVtZW50LWxldmVsIHByb3ZlbmFuY2UgZm9yIG9uZSBhcnJheS12YWx1ZWQga2V5LiBNaXJyb3JzXG4gKiB7QGxpbmsgVmFyaWFibGVTbGljZX0ncyBob25lc3QtYWJzZW5jZSBzaGFwZTogb24gc3VjY2VzcyBgYXRJZHhgL2BsZW5ndGhgL1xuICogYGJpcnRoc2AgYXJlIHNldDsgb3RoZXJ3aXNlIGBtaXNzaW5nYCBzYXlzIHdoeSAocHJlc2VudCBPTkxZIHdoZW4gYGJpcnRoc2BcbiAqIGlzIGFic2VudCkuXG4gKlxuICogQHNlZSBhcnJheVByb3ZlbmFuY2Ug4oCUIHRoZSBxdWVyeSB0aGF0IHJldHVybnMgdGhpcy5cbiAqIEBzZWUgRWxlbWVudEJpcnRoIOKAlCBvbmUgcmVjb3JkIHBlciBlbGVtZW50LCBpbmRleC1hbGlnbmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5UHJvdmVuYW5jZSB7XG4gIC8qKiBUaGUgc3RhdGUga2V5IChub3JtYWxpc2VkIHN0cmluZyBmb3JtKS4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBJbmNsdXNpdmUgY29tbWl0IGFycmF5IGlkeCB0aGUgZm9sZCByYW4gdG8uIEFic2VudCB3aGVuIG1pc3NpbmcuICovXG4gIGF0SWR4PzogbnVtYmVyO1xuICAvKiogTGVuZ3RoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGFycmF5IChiaXJ0aHMubGVuZ3RoID09PSBsZW5ndGgpLiAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBPbmUgYmlydGggcGVyIGVsZW1lbnQsIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgcmVjb25zdHJ1Y3RlZCBhcnJheS4gKi9cbiAgYmlydGhzPzogRWxlbWVudEJpcnRoW107XG4gIC8qKiBQcmVzZW50IE9OTFkgd2hlbiBgYmlydGhzYCBpcyBhYnNlbnQg4oCUIHdoeSB0aGVyZSBpcyBubyBwcm92ZW5hbmNlLiAqL1xuICBtaXNzaW5nPzogTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb247XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHRoZSBjb2RlcyBgY29tbWl0VmFsdWVBdFdpdGhCYXNpc2AgZ2l2ZXMgdGhlIGtleSdzIHZhbHVlIGF0IGBhdElkeGAgKG9yIGF0IHRoZSBlbmQgb2ZcbiAgICogdGhlIGxvZyk6IGAnbmVzdGVkLXJvd3MnYCwgYCdmcm9tLWluaXRpYWwtc3RhdGUnYCAoZWxlbWVudHMgc2VlZGVkIGJlZm9yZSB0aGUgcnVuIGFyZSBpbnZpc2libGUgdG8gdGhlXG4gICAqIGZvbGQpLCBgJ3JlZGFjdGVkJ2AsIGAnZGVsZXRlZCdgLiBBIGNvZGUgYG1pc3NpbmdgIGFscmVhZHkgc2F5cyBpcyBsZWZ0IG91dCAoYCduZXZlci13cml0dGVuJ2AsIGFuZCB0aGVcbiAgICogaW5pdGlhbC1zdGF0ZSBjYXZlYXQgdGhhdCBzZW50ZW5jZSBhbHJlYWR5IHN0YXRlcykuIEFCU0VOVCB3aGVuIGVtcHR5LCBzbyBhbiBleGFjdCBhbnN3ZXIga2VlcHMgaXRzXG4gICAqIDkuMzIuMCBzaGFwZS5cbiAgICovXG4gIGJhc2lzPzogVmFsdWVCYXNpc1tdO1xufVxuXG4vLyDilIDilIAgSlNPTi1zYWZlIHNlcmlhbGl6YXRpb24gKGZvciB3aXJlIHRyYW5zZmVyIC8gTExNIHRvb2xzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBGbGF0LCBpZC1yZWZlcmVuY2VkLCBKU09OLXNhZmUgcHJvamVjdGlvbiBvZiBhIHtAbGluayBWYXJpYWJsZVNsaWNlfSDigJRcbiAqIGxpbmVhciBpbiBub2RlIGNvdW50IChlYWNoIG5vZGUgc2VyaWFsaXplZCBleGFjdGx5IG9uY2U7IGVkZ2VzIHJlZmVyZW5jZVxuICogaWRzKS4gVEhFIHNoYXBlIHRvIHBlcnNpc3QsIHNlbmQgb3ZlciB0aGUgd2lyZSwgb3IgaGFuZCB0byBzdHJ1Y3R1cmVkXG4gKiBjb25zdW1lcnMuIFNlZSB0aGUgc2VyaWFsaXphdGlvbiB3YXJuaW5nIG9uIHtAbGluayBWYXJpYWJsZVNsaWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUpTT04ge1xuICBrZXk6IHN0cmluZztcbiAgYmVmb3JlPzogbnVtYmVyO1xuICBtaXNzaW5nPzogTWlzc2luZ1NsaWNlUmVhc29uO1xuICBrZXlzUmVhZEtpbmQ6IHN0cmluZztcbiAgcmVhZHNDb3ZlcmFnZT86IFJlYWRzQ292ZXJhZ2U7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgYW5jaG9yIHdyaXRlci4gQWJzZW50IHdoZW4gbWlzc2luZy4gKi9cbiAgd3JpdGVySWQ/OiBzdHJpbmc7XG4gIC8qKiBFdmVyeSBEQUcgbm9kZSBleGFjdGx5IG9uY2UsIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBub2Rlcz86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgc3RhZ2VJZDogc3RyaW5nO1xuICAgICAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gICAgICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gICAgICBkZXB0aDogbnVtYmVyO1xuICAgICAgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT47XG4gICAgICAvKiogQ29waWVkIGZyb20gYENhdXNhbE5vZGUucHJlUnVuUmVhZHNgICg5LjMzLjApOyBhYnNlbnQgd2hlbiBldmVyeSByZWFkIGhhZCBhIHdyaXRlci4gKi9cbiAgICAgIHByZVJ1blJlYWRzPzogeyBjb2RlOiBSZWdpc3RlcmVkQ29kZTwncHJlLXJ1bi1vcmlnaW4nPjsga2V5czogc3RyaW5nW10gfTtcbiAgICB9XG4gID47XG4gIC8qKiBJZC1yZWZlcmVuY2VkIGVkZ2VzOiBjaGlsZCAoYGZyb21gKSBkZXBlbmRzIG9uIHBhcmVudCAoYHRvYCkuICovXG4gIGVkZ2VzPzogQXJyYXk8e1xuICAgIGZyb206IHN0cmluZztcbiAgICB0bzogc3RyaW5nO1xuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJztcbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgd2VpZ2h0OiBudW1iZXI7XG4gICAgLyoqIENvcGllZCBmcm9tIGBDYXVzYWxFZGdlLmJhc2lzYCAoOS4zMy4wKTsgYWJzZW50IGZvciBhbiBleGFjdCBlZGdlLiAqL1xuICAgIGJhc2lzPzogUmVnaXN0ZXJlZENvZGU8J25lc3RlZC1yb3dzJz47XG4gIH0+O1xuICAvKiogQ29waWVkIGZyb20gdGhlIHJvb3Qgd2hlbiBhIGJ1ZGdldCBjdXQgdGhlIHNsaWNlIOKAlCByZWdpc3RlcmVkIGFzIGAndHJ1bmNhdGVkJ2AgaW4gYEhPTkVTVFlfQ09ERVNgLiAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqIENvcGllZCBmcm9tIHtAbGluayBWYXJpYWJsZVNsaWNlLm5vdGVzfSAoOS4zMy4wKTsgYWJzZW50IHdoZW4gdGhlIHNsaWNlIGhhcyBub25lLiAqL1xuICBub3Rlcz86IEhvbmVzdHlOb3RlW107XG59XG4iXX0=
@@ -1,119 +0,0 @@
1
- /**
2
- * axis.ts — the shape of an axis, and the one safe way to narrow it.
3
- *
4
- * WHY THIS FILE EXISTS. `commitStops` returns `Stop[]`, and every strategy
5
- * that COMPOSES it (keep the stages my domain recognises, drop the rest) rests
6
- * on a shape the type never stated: `[start, …stages, end]` for a non-empty
7
- * log, empty for an empty one. Each composer therefore wrote its own runtime
8
- * guard against its own reading of the contract, plus a mocked-substrate test
9
- * to prove the guard fires. That is one invariant, discovered three times, and
10
- * the library that owns the invariant should be the one that states it.
11
- *
12
- * {@link splitAxis} states it. {@link filterStops} then does the whole
13
- * composition — check the shape, keep what the caller keeps, RE-PARTITION the
14
- * log so the dropped stages' commits are still folded somewhere, and mark the
15
- * `'start'` bookend as carrying a prologue — because getting the
16
- * re-partitioning right by hand is the other thing every composer had to
17
- * rediscover.
18
- */
19
- import type { AxisSplit, Stop } from './types.js';
20
- /**
21
- * Split a strategy's stops into `{ start, stages, end }`, or say why it cannot.
22
- *
23
- * THE INVARIANT, stated once: for a non-EMPTY log, `commitStops` returns at
24
- * least the two bookends, `'start'` first and `'end'` last, with one stop per
25
- * executed stage in execution order between them. For an EMPTY log it returns
26
- * `[]` — no bookends around nothing, because a cursor with nowhere to stand
27
- * should say `reason: 'empty'` rather than offer two positions that are the
28
- * same position.
29
- *
30
- * The two refusals are different facts and must not be collapsed: `'empty'`
31
- * means the run committed nothing, `'not-bookended'` means a strategy broke
32
- * the contract. A composer that treats them alike reports a broken strategy as
33
- * an empty run.
34
- *
35
- * @example
36
- * ```typescript
37
- * import { commitStops, splitAxis } from 'footprintjs/trace';
38
- *
39
- * const axis = splitAxis(commitStops(snapshot.commitLog, snapshot.executionTree));
40
- * if (axis.ok) {
41
- * axis.start.commitIdx; // -1 — the fold base
42
- * axis.stages.map((s) => s.label);
43
- * axis.end.lastCommitIdx; // the last bundle in the log
44
- * } else {
45
- * axis.reason; // 'empty' | 'not-bookended'
46
- * }
47
- * ```
48
- */
49
- export declare function splitAxis<TMeta = unknown>(stops: readonly Stop<TMeta>[]): AxisSplit<TMeta>;
50
- /**
51
- * What {@link filterStops} does with one stop: drop it, keep it, or keep it
52
- * carrying the strategy's own label and vocabulary.
53
- *
54
- * `false` / `null` / `undefined` drop. `true` keeps it unchanged. An object
55
- * keeps it and overrides `label` and/or sets `meta` — the strategy's own
56
- * classification, travelling ON the stop instead of being re-derived from
57
- * `runtimeStageId` at every read.
58
- */
59
- export type StopFilter<TMeta> = boolean | null | undefined | {
60
- readonly label?: string;
61
- readonly meta?: TMeta;
62
- };
63
- /**
64
- * Build a FILTERING strategy's axis out of another strategy's stops.
65
- *
66
- * The rule, in one sentence: keep the stages `keep` recognises, and give the
67
- * survivors the log back.
68
- *
69
- * **Meta is the decision's, never inherited.** The input may already be a
70
- * filtered axis carrying another strategy's `meta`; a `true` (or a meta-less
71
- * object) keeps the stop and DROPS that meta, so a `Stop<TMeta>` never carries
72
- * a value of some other type under `TMeta`. The bookends carry none either.
73
- *
74
- * **The survivors re-partition the log.** A dropped stage's commits still
75
- * happened, so they fold into the stop that PRECEDES them: every kept stop's
76
- * `lastCommitIdx` runs to just before the next kept stop begins. Nothing is
77
- * orphaned and `stateAt(stop)` stays "the state that existed when the next
78
- * kept stage started".
79
- *
80
- * **What that costs `'start'`, said out loud.** The commits before the first
81
- * survivor have nowhere else to go, so `'start'` absorbs them: its fold is the
82
- * run's base PLUS that prologue — the state the first stop READ, not the raw
83
- * base. The returned start therefore carries `prologue: true` whenever it
84
- * actually absorbed a stage, and a renderer that means "before anything ran"
85
- * checks `kind === 'start' && !prologue`. That flag is the whole reason this
86
- * helper exists rather than a `.filter()` call.
87
- *
88
- * **A log with nothing kept** yields the two bookends and nothing between
89
- * them: `'start'` folds the whole log, `'end'` folds the whole log, and
90
- * `jumpTo` on any stage id refuses with `reason: 'miss'`. An axis with nowhere
91
- * meaningful to stand — which is the truthful shape for a run this strategy
92
- * recognises nothing in, and NOT the `[]` that says the log was empty.
93
- *
94
- * @throws when `stops` is non-empty but not bookended — see {@link splitAxis}.
95
- * Only a strategy can cause that; a run cannot, so it is a contract error
96
- * and not a condition to fold into the data.
97
- *
98
- * @example
99
- * ```typescript
100
- * import { commitStops, filterStops } from 'footprintjs/trace';
101
- * import type { Stop, TimeTravelStrategy } from 'footprintjs/trace';
102
- *
103
- * type Milestone = { kind: 'llm-turn' | 'tool-call'; label: string };
104
- * declare function milestoneFor(runtimeStageId: string): Milestone | null;
105
- *
106
- * const milestoneStops: TimeTravelStrategy<Milestone> = {
107
- * stopsFor: (log, tree) =>
108
- * filterStops<Milestone>(commitStops(log, tree), (stop) => {
109
- * const m = milestoneFor(stop.runtimeStageId);
110
- * return m ? { label: m.label, meta: m } : null;
111
- * }),
112
- * };
113
- *
114
- * const cursor = timeTravel(snapshot, { strategy: milestoneStops });
115
- * cursor.at()?.meta?.kind; // 'llm-turn' — no re-derivation
116
- * cursor.stops[0].prologue; // true when stages ran before the first turn
117
- * ```
118
- */
119
- export declare function filterStops<TMeta = unknown>(stops: readonly Stop<unknown>[], keep: (stop: Stop<unknown>) => StopFilter<TMeta>): Stop<TMeta>[];
@@ -1,179 +0,0 @@
1
- /**
2
- * axis.ts — the shape of an axis, and the one safe way to narrow it.
3
- *
4
- * WHY THIS FILE EXISTS. `commitStops` returns `Stop[]`, and every strategy
5
- * that COMPOSES it (keep the stages my domain recognises, drop the rest) rests
6
- * on a shape the type never stated: `[start, …stages, end]` for a non-empty
7
- * log, empty for an empty one. Each composer therefore wrote its own runtime
8
- * guard against its own reading of the contract, plus a mocked-substrate test
9
- * to prove the guard fires. That is one invariant, discovered three times, and
10
- * the library that owns the invariant should be the one that states it.
11
- *
12
- * {@link splitAxis} states it. {@link filterStops} then does the whole
13
- * composition — check the shape, keep what the caller keeps, RE-PARTITION the
14
- * log so the dropped stages' commits are still folded somewhere, and mark the
15
- * `'start'` bookend as carrying a prologue — because getting the
16
- * re-partitioning right by hand is the other thing every composer had to
17
- * rediscover.
18
- */
19
- /**
20
- * Split a strategy's stops into `{ start, stages, end }`, or say why it cannot.
21
- *
22
- * THE INVARIANT, stated once: for a non-EMPTY log, `commitStops` returns at
23
- * least the two bookends, `'start'` first and `'end'` last, with one stop per
24
- * executed stage in execution order between them. For an EMPTY log it returns
25
- * `[]` — no bookends around nothing, because a cursor with nowhere to stand
26
- * should say `reason: 'empty'` rather than offer two positions that are the
27
- * same position.
28
- *
29
- * The two refusals are different facts and must not be collapsed: `'empty'`
30
- * means the run committed nothing, `'not-bookended'` means a strategy broke
31
- * the contract. A composer that treats them alike reports a broken strategy as
32
- * an empty run.
33
- *
34
- * @example
35
- * ```typescript
36
- * import { commitStops, splitAxis } from 'footprintjs/trace';
37
- *
38
- * const axis = splitAxis(commitStops(snapshot.commitLog, snapshot.executionTree));
39
- * if (axis.ok) {
40
- * axis.start.commitIdx; // -1 — the fold base
41
- * axis.stages.map((s) => s.label);
42
- * axis.end.lastCommitIdx; // the last bundle in the log
43
- * } else {
44
- * axis.reason; // 'empty' | 'not-bookended'
45
- * }
46
- * ```
47
- */
48
- export function splitAxis(stops) {
49
- const kinds = Object.freeze(stops.map((stop) => stop.kind));
50
- if (stops.length === 0)
51
- return { ok: false, reason: 'empty', kinds };
52
- const start = stops[0];
53
- const end = stops[stops.length - 1];
54
- if (start.kind !== 'start' || end.kind !== 'end' || stops.length < 2) {
55
- return { ok: false, reason: 'not-bookended', kinds };
56
- }
57
- return { ok: true, start, stages: Object.freeze(stops.slice(1, -1)), end };
58
- }
59
- /**
60
- * `stop` retyped to the OUTPUT vocabulary, with any meta it already carried
61
- * left behind. The input axis may itself be a filtered one (a Beat axis being
62
- * narrowed into a Tag axis), and a `true` decision keeps the STOP, not the
63
- * other strategy's classification: a `Stop<Tag>` whose `meta` is a Beat would
64
- * be a lie the type could not catch. Only the decision may supply a meta.
65
- */
66
- function retyped(stop) {
67
- if (stop.meta === undefined)
68
- return stop;
69
- const out = {};
70
- const fields = stop;
71
- for (const key of Object.keys(fields))
72
- if (key !== 'meta')
73
- out[key] = fields[key];
74
- return out;
75
- }
76
- /**
77
- * Build a FILTERING strategy's axis out of another strategy's stops.
78
- *
79
- * The rule, in one sentence: keep the stages `keep` recognises, and give the
80
- * survivors the log back.
81
- *
82
- * **Meta is the decision's, never inherited.** The input may already be a
83
- * filtered axis carrying another strategy's `meta`; a `true` (or a meta-less
84
- * object) keeps the stop and DROPS that meta, so a `Stop<TMeta>` never carries
85
- * a value of some other type under `TMeta`. The bookends carry none either.
86
- *
87
- * **The survivors re-partition the log.** A dropped stage's commits still
88
- * happened, so they fold into the stop that PRECEDES them: every kept stop's
89
- * `lastCommitIdx` runs to just before the next kept stop begins. Nothing is
90
- * orphaned and `stateAt(stop)` stays "the state that existed when the next
91
- * kept stage started".
92
- *
93
- * **What that costs `'start'`, said out loud.** The commits before the first
94
- * survivor have nowhere else to go, so `'start'` absorbs them: its fold is the
95
- * run's base PLUS that prologue — the state the first stop READ, not the raw
96
- * base. The returned start therefore carries `prologue: true` whenever it
97
- * actually absorbed a stage, and a renderer that means "before anything ran"
98
- * checks `kind === 'start' && !prologue`. That flag is the whole reason this
99
- * helper exists rather than a `.filter()` call.
100
- *
101
- * **A log with nothing kept** yields the two bookends and nothing between
102
- * them: `'start'` folds the whole log, `'end'` folds the whole log, and
103
- * `jumpTo` on any stage id refuses with `reason: 'miss'`. An axis with nowhere
104
- * meaningful to stand — which is the truthful shape for a run this strategy
105
- * recognises nothing in, and NOT the `[]` that says the log was empty.
106
- *
107
- * @throws when `stops` is non-empty but not bookended — see {@link splitAxis}.
108
- * Only a strategy can cause that; a run cannot, so it is a contract error
109
- * and not a condition to fold into the data.
110
- *
111
- * @example
112
- * ```typescript
113
- * import { commitStops, filterStops } from 'footprintjs/trace';
114
- * import type { Stop, TimeTravelStrategy } from 'footprintjs/trace';
115
- *
116
- * type Milestone = { kind: 'llm-turn' | 'tool-call'; label: string };
117
- * declare function milestoneFor(runtimeStageId: string): Milestone | null;
118
- *
119
- * const milestoneStops: TimeTravelStrategy<Milestone> = {
120
- * stopsFor: (log, tree) =>
121
- * filterStops<Milestone>(commitStops(log, tree), (stop) => {
122
- * const m = milestoneFor(stop.runtimeStageId);
123
- * return m ? { label: m.label, meta: m } : null;
124
- * }),
125
- * };
126
- *
127
- * const cursor = timeTravel(snapshot, { strategy: milestoneStops });
128
- * cursor.at()?.meta?.kind; // 'llm-turn' — no re-derivation
129
- * cursor.stops[0].prologue; // true when stages ran before the first turn
130
- * ```
131
- */
132
- export function filterStops(stops, keep) {
133
- const axis = splitAxis(stops);
134
- if (!axis.ok) {
135
- if (axis.reason === 'empty')
136
- return [];
137
- throw new Error('filterStops: expected a bookended axis — [start, …stages, end] — got kinds ' +
138
- `[${axis.kinds.join(', ')}]. Only a strategy can produce that shape; a run cannot.`);
139
- }
140
- const kept = [];
141
- for (const stop of axis.stages) {
142
- const decision = keep(stop);
143
- if (!decision)
144
- continue;
145
- if (decision === true)
146
- kept.push({ stop });
147
- else
148
- kept.push({ stop, label: decision.label, meta: decision.meta });
149
- }
150
- // The log's last index, taken from the `'end'` bookend rather than a length:
151
- // `end` is the one stop guaranteed to fold the whole log, and this function
152
- // is never handed the log itself.
153
- const lastIdx = axis.end.lastCommitIdx;
154
- const first = kept[0];
155
- const out = [
156
- {
157
- ...retyped(axis.start),
158
- step: 0,
159
- lastCommitIdx: first ? first.stop.commitIdx - 1 : lastIdx,
160
- // Only when a STAGE was actually absorbed. An axis that kept everything
161
- // has the same start it always had, and says nothing it need not say.
162
- ...(first && first.stop.step > 1 ? { prologue: true } : {}),
163
- ...(!first && axis.stages.length > 0 ? { prologue: true } : {}),
164
- },
165
- ];
166
- for (const [i, row] of kept.entries()) {
167
- const next = kept[i + 1];
168
- out.push({
169
- ...retyped(row.stop),
170
- step: out.length,
171
- lastCommitIdx: next ? next.stop.commitIdx - 1 : lastIdx,
172
- ...(row.label !== undefined ? { label: row.label } : {}),
173
- ...(row.meta !== undefined ? { meta: row.meta } : {}),
174
- });
175
- }
176
- out.push({ ...retyped(axis.end), step: out.length });
177
- return out;
178
- }
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvYXhpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFJSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQWtCLEtBQTZCO0lBQ3RFLE1BQU0sS0FBSyxHQUF3QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNyRSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0UsQ0FBQztBQWFEOzs7Ozs7R0FNRztBQUNILFNBQVMsT0FBTyxDQUFRLElBQW1CO0lBQ3pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFtQixDQUFDO0lBQ3hELE1BQU0sR0FBRyxHQUE0QixFQUFFLENBQUM7SUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBMEMsQ0FBQztJQUMxRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQUUsSUFBSSxHQUFHLEtBQUssTUFBTTtZQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEYsT0FBTyxHQUE2QixDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLEtBQStCLEVBQy9CLElBQWdEO0lBRWhELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RTtZQUMzRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwREFBMEQsQ0FDdEYsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLElBQUksR0FBNEQsRUFBRSxDQUFDO0lBQ3pFLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUTtZQUFFLFNBQVM7UUFDeEIsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxrQ0FBa0M7SUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7SUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE1BQU0sR0FBRyxHQUFrQjtRQUN6QjtZQUNFLEdBQUcsT0FBTyxDQUFRLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUM7WUFDUCxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDekQsd0VBQXdFO1lBQ3hFLHNFQUFzRTtZQUN0RSxHQUFHLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3pFO0tBQ0YsQ0FBQztJQUVGLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxHQUFHLE9BQU8sQ0FBUSxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNoQixhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDdkQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1RCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF4aXMudHMg4oCUIHRoZSBzaGFwZSBvZiBhbiBheGlzLCBhbmQgdGhlIG9uZSBzYWZlIHdheSB0byBuYXJyb3cgaXQuXG4gKlxuICogV0hZIFRISVMgRklMRSBFWElTVFMuIGBjb21taXRTdG9wc2AgcmV0dXJucyBgU3RvcFtdYCwgYW5kIGV2ZXJ5IHN0cmF0ZWd5XG4gKiB0aGF0IENPTVBPU0VTIGl0IChrZWVwIHRoZSBzdGFnZXMgbXkgZG9tYWluIHJlY29nbmlzZXMsIGRyb3AgdGhlIHJlc3QpIHJlc3RzXG4gKiBvbiBhIHNoYXBlIHRoZSB0eXBlIG5ldmVyIHN0YXRlZDogYFtzdGFydCwg4oCmc3RhZ2VzLCBlbmRdYCBmb3IgYSBub24tZW1wdHlcbiAqIGxvZywgZW1wdHkgZm9yIGFuIGVtcHR5IG9uZS4gRWFjaCBjb21wb3NlciB0aGVyZWZvcmUgd3JvdGUgaXRzIG93biBydW50aW1lXG4gKiBndWFyZCBhZ2FpbnN0IGl0cyBvd24gcmVhZGluZyBvZiB0aGUgY29udHJhY3QsIHBsdXMgYSBtb2NrZWQtc3Vic3RyYXRlIHRlc3RcbiAqIHRvIHByb3ZlIHRoZSBndWFyZCBmaXJlcy4gVGhhdCBpcyBvbmUgaW52YXJpYW50LCBkaXNjb3ZlcmVkIHRocmVlIHRpbWVzLCBhbmRcbiAqIHRoZSBsaWJyYXJ5IHRoYXQgb3ducyB0aGUgaW52YXJpYW50IHNob3VsZCBiZSB0aGUgb25lIHRoYXQgc3RhdGVzIGl0LlxuICpcbiAqIHtAbGluayBzcGxpdEF4aXN9IHN0YXRlcyBpdC4ge0BsaW5rIGZpbHRlclN0b3BzfSB0aGVuIGRvZXMgdGhlIHdob2xlXG4gKiBjb21wb3NpdGlvbiDigJQgY2hlY2sgdGhlIHNoYXBlLCBrZWVwIHdoYXQgdGhlIGNhbGxlciBrZWVwcywgUkUtUEFSVElUSU9OIHRoZVxuICogbG9nIHNvIHRoZSBkcm9wcGVkIHN0YWdlcycgY29tbWl0cyBhcmUgc3RpbGwgZm9sZGVkIHNvbWV3aGVyZSwgYW5kIG1hcmsgdGhlXG4gKiBgJ3N0YXJ0J2AgYm9va2VuZCBhcyBjYXJyeWluZyBhIHByb2xvZ3VlIOKAlCBiZWNhdXNlIGdldHRpbmcgdGhlXG4gKiByZS1wYXJ0aXRpb25pbmcgcmlnaHQgYnkgaGFuZCBpcyB0aGUgb3RoZXIgdGhpbmcgZXZlcnkgY29tcG9zZXIgaGFkIHRvXG4gKiByZWRpc2NvdmVyLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXhpc1NwbGl0LCBTdG9wLCBTdG9wS2luZCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFNwbGl0IGEgc3RyYXRlZ3kncyBzdG9wcyBpbnRvIGB7IHN0YXJ0LCBzdGFnZXMsIGVuZCB9YCwgb3Igc2F5IHdoeSBpdCBjYW5ub3QuXG4gKlxuICogVEhFIElOVkFSSUFOVCwgc3RhdGVkIG9uY2U6IGZvciBhIG5vbi1FTVBUWSBsb2csIGBjb21taXRTdG9wc2AgcmV0dXJucyBhdFxuICogbGVhc3QgdGhlIHR3byBib29rZW5kcywgYCdzdGFydCdgIGZpcnN0IGFuZCBgJ2VuZCdgIGxhc3QsIHdpdGggb25lIHN0b3AgcGVyXG4gKiBleGVjdXRlZCBzdGFnZSBpbiBleGVjdXRpb24gb3JkZXIgYmV0d2VlbiB0aGVtLiBGb3IgYW4gRU1QVFkgbG9nIGl0IHJldHVybnNcbiAqIGBbXWAg4oCUIG5vIGJvb2tlbmRzIGFyb3VuZCBub3RoaW5nLCBiZWNhdXNlIGEgY3Vyc29yIHdpdGggbm93aGVyZSB0byBzdGFuZFxuICogc2hvdWxkIHNheSBgcmVhc29uOiAnZW1wdHknYCByYXRoZXIgdGhhbiBvZmZlciB0d28gcG9zaXRpb25zIHRoYXQgYXJlIHRoZVxuICogc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBUaGUgdHdvIHJlZnVzYWxzIGFyZSBkaWZmZXJlbnQgZmFjdHMgYW5kIG11c3Qgbm90IGJlIGNvbGxhcHNlZDogYCdlbXB0eSdgXG4gKiBtZWFucyB0aGUgcnVuIGNvbW1pdHRlZCBub3RoaW5nLCBgJ25vdC1ib29rZW5kZWQnYCBtZWFucyBhIHN0cmF0ZWd5IGJyb2tlXG4gKiB0aGUgY29udHJhY3QuIEEgY29tcG9zZXIgdGhhdCB0cmVhdHMgdGhlbSBhbGlrZSByZXBvcnRzIGEgYnJva2VuIHN0cmF0ZWd5IGFzXG4gKiBhbiBlbXB0eSBydW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNvbW1pdFN0b3BzLCBzcGxpdEF4aXMgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgYXhpcyA9IHNwbGl0QXhpcyhjb21taXRTdG9wcyhzbmFwc2hvdC5jb21taXRMb2csIHNuYXBzaG90LmV4ZWN1dGlvblRyZWUpKTtcbiAqIGlmIChheGlzLm9rKSB7XG4gKiAgIGF4aXMuc3RhcnQuY29tbWl0SWR4OyAgICAgICAgICAvLyAtMSDigJQgdGhlIGZvbGQgYmFzZVxuICogICBheGlzLnN0YWdlcy5tYXAoKHMpID0+IHMubGFiZWwpO1xuICogICBheGlzLmVuZC5sYXN0Q29tbWl0SWR4OyAgICAgICAgLy8gdGhlIGxhc3QgYnVuZGxlIGluIHRoZSBsb2dcbiAqIH0gZWxzZSB7XG4gKiAgIGF4aXMucmVhc29uOyAgICAgICAgICAgICAgICAgICAvLyAnZW1wdHknIHwgJ25vdC1ib29rZW5kZWQnXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QXhpczxUTWV0YSA9IHVua25vd24+KHN0b3BzOiByZWFkb25seSBTdG9wPFRNZXRhPltdKTogQXhpc1NwbGl0PFRNZXRhPiB7XG4gIGNvbnN0IGtpbmRzOiByZWFkb25seSBTdG9wS2luZFtdID0gT2JqZWN0LmZyZWV6ZShzdG9wcy5tYXAoKHN0b3ApID0+IHN0b3Aua2luZCkpO1xuICBpZiAoc3RvcHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ2VtcHR5Jywga2luZHMgfTtcbiAgY29uc3Qgc3RhcnQgPSBzdG9wc1swXTtcbiAgY29uc3QgZW5kID0gc3RvcHNbc3RvcHMubGVuZ3RoIC0gMV07XG4gIGlmIChzdGFydC5raW5kICE9PSAnc3RhcnQnIHx8IGVuZC5raW5kICE9PSAnZW5kJyB8fCBzdG9wcy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHsgb2s6IGZhbHNlLCByZWFzb246ICdub3QtYm9va2VuZGVkJywga2luZHMgfTtcbiAgfVxuICByZXR1cm4geyBvazogdHJ1ZSwgc3RhcnQsIHN0YWdlczogT2JqZWN0LmZyZWV6ZShzdG9wcy5zbGljZSgxLCAtMSkpLCBlbmQgfTtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBmaWx0ZXJTdG9wc30gZG9lcyB3aXRoIG9uZSBzdG9wOiBkcm9wIGl0LCBrZWVwIGl0LCBvciBrZWVwIGl0XG4gKiBjYXJyeWluZyB0aGUgc3RyYXRlZ3kncyBvd24gbGFiZWwgYW5kIHZvY2FidWxhcnkuXG4gKlxuICogYGZhbHNlYCAvIGBudWxsYCAvIGB1bmRlZmluZWRgIGRyb3AuIGB0cnVlYCBrZWVwcyBpdCB1bmNoYW5nZWQuIEFuIG9iamVjdFxuICoga2VlcHMgaXQgYW5kIG92ZXJyaWRlcyBgbGFiZWxgIGFuZC9vciBzZXRzIGBtZXRhYCDigJQgdGhlIHN0cmF0ZWd5J3Mgb3duXG4gKiBjbGFzc2lmaWNhdGlvbiwgdHJhdmVsbGluZyBPTiB0aGUgc3RvcCBpbnN0ZWFkIG9mIGJlaW5nIHJlLWRlcml2ZWQgZnJvbVxuICogYHJ1bnRpbWVTdGFnZUlkYCBhdCBldmVyeSByZWFkLlxuICovXG5leHBvcnQgdHlwZSBTdG9wRmlsdGVyPFRNZXRhPiA9IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgeyByZWFkb25seSBsYWJlbD86IHN0cmluZzsgcmVhZG9ubHkgbWV0YT86IFRNZXRhIH07XG5cbi8qKlxuICogYHN0b3BgIHJldHlwZWQgdG8gdGhlIE9VVFBVVCB2b2NhYnVsYXJ5LCB3aXRoIGFueSBtZXRhIGl0IGFscmVhZHkgY2FycmllZFxuICogbGVmdCBiZWhpbmQuIFRoZSBpbnB1dCBheGlzIG1heSBpdHNlbGYgYmUgYSBmaWx0ZXJlZCBvbmUgKGEgQmVhdCBheGlzIGJlaW5nXG4gKiBuYXJyb3dlZCBpbnRvIGEgVGFnIGF4aXMpLCBhbmQgYSBgdHJ1ZWAgZGVjaXNpb24ga2VlcHMgdGhlIFNUT1AsIG5vdCB0aGVcbiAqIG90aGVyIHN0cmF0ZWd5J3MgY2xhc3NpZmljYXRpb246IGEgYFN0b3A8VGFnPmAgd2hvc2UgYG1ldGFgIGlzIGEgQmVhdCB3b3VsZFxuICogYmUgYSBsaWUgdGhlIHR5cGUgY291bGQgbm90IGNhdGNoLiBPbmx5IHRoZSBkZWNpc2lvbiBtYXkgc3VwcGx5IGEgbWV0YS5cbiAqL1xuZnVuY3Rpb24gcmV0eXBlZDxUTWV0YT4oc3RvcDogU3RvcDx1bmtub3duPik6IFN0b3A8VE1ldGE+IHtcbiAgaWYgKHN0b3AubWV0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc3RvcCBhcyBTdG9wPFRNZXRhPjtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBjb25zdCBmaWVsZHMgPSBzdG9wIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkcykpIGlmIChrZXkgIT09ICdtZXRhJykgb3V0W2tleV0gPSBmaWVsZHNba2V5XTtcbiAgcmV0dXJuIG91dCBhcyB1bmtub3duIGFzIFN0b3A8VE1ldGE+O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgRklMVEVSSU5HIHN0cmF0ZWd5J3MgYXhpcyBvdXQgb2YgYW5vdGhlciBzdHJhdGVneSdzIHN0b3BzLlxuICpcbiAqIFRoZSBydWxlLCBpbiBvbmUgc2VudGVuY2U6IGtlZXAgdGhlIHN0YWdlcyBga2VlcGAgcmVjb2duaXNlcywgYW5kIGdpdmUgdGhlXG4gKiBzdXJ2aXZvcnMgdGhlIGxvZyBiYWNrLlxuICpcbiAqICoqTWV0YSBpcyB0aGUgZGVjaXNpb24ncywgbmV2ZXIgaW5oZXJpdGVkLioqIFRoZSBpbnB1dCBtYXkgYWxyZWFkeSBiZSBhXG4gKiBmaWx0ZXJlZCBheGlzIGNhcnJ5aW5nIGFub3RoZXIgc3RyYXRlZ3kncyBgbWV0YWA7IGEgYHRydWVgIChvciBhIG1ldGEtbGVzc1xuICogb2JqZWN0KSBrZWVwcyB0aGUgc3RvcCBhbmQgRFJPUFMgdGhhdCBtZXRhLCBzbyBhIGBTdG9wPFRNZXRhPmAgbmV2ZXIgY2Fycmllc1xuICogYSB2YWx1ZSBvZiBzb21lIG90aGVyIHR5cGUgdW5kZXIgYFRNZXRhYC4gVGhlIGJvb2tlbmRzIGNhcnJ5IG5vbmUgZWl0aGVyLlxuICpcbiAqICoqVGhlIHN1cnZpdm9ycyByZS1wYXJ0aXRpb24gdGhlIGxvZy4qKiBBIGRyb3BwZWQgc3RhZ2UncyBjb21taXRzIHN0aWxsXG4gKiBoYXBwZW5lZCwgc28gdGhleSBmb2xkIGludG8gdGhlIHN0b3AgdGhhdCBQUkVDRURFUyB0aGVtOiBldmVyeSBrZXB0IHN0b3Anc1xuICogYGxhc3RDb21taXRJZHhgIHJ1bnMgdG8ganVzdCBiZWZvcmUgdGhlIG5leHQga2VwdCBzdG9wIGJlZ2lucy4gTm90aGluZyBpc1xuICogb3JwaGFuZWQgYW5kIGBzdGF0ZUF0KHN0b3ApYCBzdGF5cyBcInRoZSBzdGF0ZSB0aGF0IGV4aXN0ZWQgd2hlbiB0aGUgbmV4dFxuICoga2VwdCBzdGFnZSBzdGFydGVkXCIuXG4gKlxuICogKipXaGF0IHRoYXQgY29zdHMgYCdzdGFydCdgLCBzYWlkIG91dCBsb3VkLioqIFRoZSBjb21taXRzIGJlZm9yZSB0aGUgZmlyc3RcbiAqIHN1cnZpdm9yIGhhdmUgbm93aGVyZSBlbHNlIHRvIGdvLCBzbyBgJ3N0YXJ0J2AgYWJzb3JicyB0aGVtOiBpdHMgZm9sZCBpcyB0aGVcbiAqIHJ1bidzIGJhc2UgUExVUyB0aGF0IHByb2xvZ3VlIOKAlCB0aGUgc3RhdGUgdGhlIGZpcnN0IHN0b3AgUkVBRCwgbm90IHRoZSByYXdcbiAqIGJhc2UuIFRoZSByZXR1cm5lZCBzdGFydCB0aGVyZWZvcmUgY2FycmllcyBgcHJvbG9ndWU6IHRydWVgIHdoZW5ldmVyIGl0XG4gKiBhY3R1YWxseSBhYnNvcmJlZCBhIHN0YWdlLCBhbmQgYSByZW5kZXJlciB0aGF0IG1lYW5zIFwiYmVmb3JlIGFueXRoaW5nIHJhblwiXG4gKiBjaGVja3MgYGtpbmQgPT09ICdzdGFydCcgJiYgIXByb2xvZ3VlYC4gVGhhdCBmbGFnIGlzIHRoZSB3aG9sZSByZWFzb24gdGhpc1xuICogaGVscGVyIGV4aXN0cyByYXRoZXIgdGhhbiBhIGAuZmlsdGVyKClgIGNhbGwuXG4gKlxuICogKipBIGxvZyB3aXRoIG5vdGhpbmcga2VwdCoqIHlpZWxkcyB0aGUgdHdvIGJvb2tlbmRzIGFuZCBub3RoaW5nIGJldHdlZW5cbiAqIHRoZW06IGAnc3RhcnQnYCBmb2xkcyB0aGUgd2hvbGUgbG9nLCBgJ2VuZCdgIGZvbGRzIHRoZSB3aG9sZSBsb2csIGFuZFxuICogYGp1bXBUb2Agb24gYW55IHN0YWdlIGlkIHJlZnVzZXMgd2l0aCBgcmVhc29uOiAnbWlzcydgLiBBbiBheGlzIHdpdGggbm93aGVyZVxuICogbWVhbmluZ2Z1bCB0byBzdGFuZCDigJQgd2hpY2ggaXMgdGhlIHRydXRoZnVsIHNoYXBlIGZvciBhIHJ1biB0aGlzIHN0cmF0ZWd5XG4gKiByZWNvZ25pc2VzIG5vdGhpbmcgaW4sIGFuZCBOT1QgdGhlIGBbXWAgdGhhdCBzYXlzIHRoZSBsb2cgd2FzIGVtcHR5LlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgc3RvcHNgIGlzIG5vbi1lbXB0eSBidXQgbm90IGJvb2tlbmRlZCDigJQgc2VlIHtAbGluayBzcGxpdEF4aXN9LlxuICogICBPbmx5IGEgc3RyYXRlZ3kgY2FuIGNhdXNlIHRoYXQ7IGEgcnVuIGNhbm5vdCwgc28gaXQgaXMgYSBjb250cmFjdCBlcnJvclxuICogICBhbmQgbm90IGEgY29uZGl0aW9uIHRvIGZvbGQgaW50byB0aGUgZGF0YS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY29tbWl0U3RvcHMsIGZpbHRlclN0b3BzIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICogaW1wb3J0IHR5cGUgeyBTdG9wLCBUaW1lVHJhdmVsU3RyYXRlZ3kgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogdHlwZSBNaWxlc3RvbmUgPSB7IGtpbmQ6ICdsbG0tdHVybicgfCAndG9vbC1jYWxsJzsgbGFiZWw6IHN0cmluZyB9O1xuICogZGVjbGFyZSBmdW5jdGlvbiBtaWxlc3RvbmVGb3IocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IE1pbGVzdG9uZSB8IG51bGw7XG4gKlxuICogY29uc3QgbWlsZXN0b25lU3RvcHM6IFRpbWVUcmF2ZWxTdHJhdGVneTxNaWxlc3RvbmU+ID0ge1xuICogICBzdG9wc0ZvcjogKGxvZywgdHJlZSkgPT5cbiAqICAgICBmaWx0ZXJTdG9wczxNaWxlc3RvbmU+KGNvbW1pdFN0b3BzKGxvZywgdHJlZSksIChzdG9wKSA9PiB7XG4gKiAgICAgICBjb25zdCBtID0gbWlsZXN0b25lRm9yKHN0b3AucnVudGltZVN0YWdlSWQpO1xuICogICAgICAgcmV0dXJuIG0gPyB7IGxhYmVsOiBtLmxhYmVsLCBtZXRhOiBtIH0gOiBudWxsO1xuICogICAgIH0pLFxuICogfTtcbiAqXG4gKiBjb25zdCBjdXJzb3IgPSB0aW1lVHJhdmVsKHNuYXBzaG90LCB7IHN0cmF0ZWd5OiBtaWxlc3RvbmVTdG9wcyB9KTtcbiAqIGN1cnNvci5hdCgpPy5tZXRhPy5raW5kOyAgICAgICAgLy8gJ2xsbS10dXJuJyDigJQgbm8gcmUtZGVyaXZhdGlvblxuICogY3Vyc29yLnN0b3BzWzBdLnByb2xvZ3VlOyAgICAgICAvLyB0cnVlIHdoZW4gc3RhZ2VzIHJhbiBiZWZvcmUgdGhlIGZpcnN0IHR1cm5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyU3RvcHM8VE1ldGEgPSB1bmtub3duPihcbiAgc3RvcHM6IHJlYWRvbmx5IFN0b3A8dW5rbm93bj5bXSxcbiAga2VlcDogKHN0b3A6IFN0b3A8dW5rbm93bj4pID0+IFN0b3BGaWx0ZXI8VE1ldGE+LFxuKTogU3RvcDxUTWV0YT5bXSB7XG4gIGNvbnN0IGF4aXMgPSBzcGxpdEF4aXMoc3RvcHMpO1xuICBpZiAoIWF4aXMub2spIHtcbiAgICBpZiAoYXhpcy5yZWFzb24gPT09ICdlbXB0eScpIHJldHVybiBbXTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnZmlsdGVyU3RvcHM6IGV4cGVjdGVkIGEgYm9va2VuZGVkIGF4aXMg4oCUIFtzdGFydCwg4oCmc3RhZ2VzLCBlbmRdIOKAlCBnb3Qga2luZHMgJyArXG4gICAgICAgIGBbJHtheGlzLmtpbmRzLmpvaW4oJywgJyl9XS4gT25seSBhIHN0cmF0ZWd5IGNhbiBwcm9kdWNlIHRoYXQgc2hhcGU7IGEgcnVuIGNhbm5vdC5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBrZXB0OiB7IHN0b3A6IFN0b3A8dW5rbm93bj47IGxhYmVsPzogc3RyaW5nOyBtZXRhPzogVE1ldGEgfVtdID0gW107XG4gIGZvciAoY29uc3Qgc3RvcCBvZiBheGlzLnN0YWdlcykge1xuICAgIGNvbnN0IGRlY2lzaW9uID0ga2VlcChzdG9wKTtcbiAgICBpZiAoIWRlY2lzaW9uKSBjb250aW51ZTtcbiAgICBpZiAoZGVjaXNpb24gPT09IHRydWUpIGtlcHQucHVzaCh7IHN0b3AgfSk7XG4gICAgZWxzZSBrZXB0LnB1c2goeyBzdG9wLCBsYWJlbDogZGVjaXNpb24ubGFiZWwsIG1ldGE6IGRlY2lzaW9uLm1ldGEgfSk7XG4gIH1cblxuICAvLyBUaGUgbG9nJ3MgbGFzdCBpbmRleCwgdGFrZW4gZnJvbSB0aGUgYCdlbmQnYCBib29rZW5kIHJhdGhlciB0aGFuIGEgbGVuZ3RoOlxuICAvLyBgZW5kYCBpcyB0aGUgb25lIHN0b3AgZ3VhcmFudGVlZCB0byBmb2xkIHRoZSB3aG9sZSBsb2csIGFuZCB0aGlzIGZ1bmN0aW9uXG4gIC8vIGlzIG5ldmVyIGhhbmRlZCB0aGUgbG9nIGl0c2VsZi5cbiAgY29uc3QgbGFzdElkeCA9IGF4aXMuZW5kLmxhc3RDb21taXRJZHg7XG4gIGNvbnN0IGZpcnN0ID0ga2VwdFswXTtcbiAgY29uc3Qgb3V0OiBTdG9wPFRNZXRhPltdID0gW1xuICAgIHtcbiAgICAgIC4uLnJldHlwZWQ8VE1ldGE+KGF4aXMuc3RhcnQpLFxuICAgICAgc3RlcDogMCxcbiAgICAgIGxhc3RDb21taXRJZHg6IGZpcnN0ID8gZmlyc3Quc3RvcC5jb21taXRJZHggLSAxIDogbGFzdElkeCxcbiAgICAgIC8vIE9ubHkgd2hlbiBhIFNUQUdFIHdhcyBhY3R1YWxseSBhYnNvcmJlZC4gQW4gYXhpcyB0aGF0IGtlcHQgZXZlcnl0aGluZ1xuICAgICAgLy8gaGFzIHRoZSBzYW1lIHN0YXJ0IGl0IGFsd2F5cyBoYWQsIGFuZCBzYXlzIG5vdGhpbmcgaXQgbmVlZCBub3Qgc2F5LlxuICAgICAgLi4uKGZpcnN0ICYmIGZpcnN0LnN0b3Auc3RlcCA+IDEgPyB7IHByb2xvZ3VlOiB0cnVlIGFzIGNvbnN0IH0gOiB7fSksXG4gICAgICAuLi4oIWZpcnN0ICYmIGF4aXMuc3RhZ2VzLmxlbmd0aCA+IDAgPyB7IHByb2xvZ3VlOiB0cnVlIGFzIGNvbnN0IH0gOiB7fSksXG4gICAgfSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IFtpLCByb3ddIG9mIGtlcHQuZW50cmllcygpKSB7XG4gICAgY29uc3QgbmV4dCA9IGtlcHRbaSArIDFdO1xuICAgIG91dC5wdXNoKHtcbiAgICAgIC4uLnJldHlwZWQ8VE1ldGE+KHJvdy5zdG9wKSxcbiAgICAgIHN0ZXA6IG91dC5sZW5ndGgsXG4gICAgICBsYXN0Q29tbWl0SWR4OiBuZXh0ID8gbmV4dC5zdG9wLmNvbW1pdElkeCAtIDEgOiBsYXN0SWR4LFxuICAgICAgLi4uKHJvdy5sYWJlbCAhPT0gdW5kZWZpbmVkID8geyBsYWJlbDogcm93LmxhYmVsIH0gOiB7fSksXG4gICAgICAuLi4ocm93Lm1ldGEgIT09IHVuZGVmaW5lZCA/IHsgbWV0YTogcm93Lm1ldGEgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIG91dC5wdXNoKHsgLi4ucmV0eXBlZDxUTWV0YT4oYXhpcy5lbmQpLCBzdGVwOiBvdXQubGVuZ3RoIH0pO1xuICByZXR1cm4gb3V0O1xufVxuIl19
@@ -1,77 +0,0 @@
1
- /**
2
- * bundles.ts — reading a log whose rows are not typed yet.
3
- *
4
- * WHY THIS FILE EXISTS. A LIVE snapshot hands time travel real
5
- * {@link CommitBundle}s. A STORED recording hands it parsed JSON, and a
6
- * careful consumer will not claim that what came back off disk is a
7
- * `CommitBundle` — so it either casts (a lie with a comment on it) or cannot
8
- * call the library at all. Since 9.18.0 the source takes `readonly unknown[]`
9
- * and the narrowing happens here, per row, at the one place that actually
10
- * reads one.
11
- *
12
- * A row that is not a bundle becomes a GAP rather than an exception: it KEEPS
13
- * ITS INDEX — so every `commitIdx` in the axis still addresses the same
14
- * position — contributes no state, gets no stop, and is reported with its
15
- * index and a reason. One corrupt row in a stored recording loses that row,
16
- * not the recording.
17
- */
18
- import type { CommitBundle, ExecutionTree } from '../memory/types.js';
19
- import type { LogGap } from './types.js';
20
- /** A plain object — not null, not an array, not a primitive. */
21
- export declare function isPlainish(value: unknown): value is Record<string, unknown>;
22
- /**
23
- * Read a source's `executionTree` as an {@link ExecutionTree}, or as absent.
24
- *
25
- * The tree is only ever WALKED for mount ids (`subflowId` + `runtimeStageId`
26
- * on each node), so the honest narrowing a reader can do is "a plain object";
27
- * anything else — a stored field that came back as a string, a number, an
28
- * array — is read as no tree at all, which sends `commitStops` down the same
29
- * shape-heuristic path a log handed over without its tree already takes.
30
- */
31
- export declare function readTree(value: unknown): ExecutionTree | undefined;
32
- /**
33
- * Why `row` cannot be read as a commit bundle, or `undefined` when it can.
34
- *
35
- * DELIBERATELY LENIENT — but exactly as lenient as the readers are. It checks
36
- * what the fold, the axis and `changedSince` actually touch:
37
- *
38
- * - `runtimeStageId` must be a string — the axis keys on it.
39
- * - `trace` must be an ARRAY, and it must be PRESENT. It is the one field
40
- * every reader WALKS (`applySmartMerge` iterates it verb by verb;
41
- * `changedSince` reads its paths), so a row without one is not a bundle the
42
- * fold can survive — it is the crash a gap exists to prevent. `CommitBundle`
43
- * declares it required, so no live log is affected.
44
- * - `updates` / `overwrite`, when present, must be plain objects. They are
45
- * read only AT THE PATHS THE TRACE NAMES, so an absent one is harmless and
46
- * is tolerated, exactly as the fold tolerates an absent `redactedPaths`.
47
- *
48
- * Being stricter than that — demanding `stage`, `stageId`, `idx` — would
49
- * reject hand-built logs that have folded correctly since 9.17.0, which is a
50
- * compatibility break dressed up as validation.
51
- */
52
- export declare function bundleRefusal(row: unknown): string | undefined;
53
- /** `true` when `row` can be read as a {@link CommitBundle}. */
54
- export declare function isCommitBundle(row: unknown): row is CommitBundle;
55
- /** A log read row by row: the bundles, index-aligned, plus what was refused. */
56
- export interface ReadLog {
57
- /** Same length and order as the input; a refused row holds a GAP stand-in. */
58
- readonly log: readonly CommitBundle[];
59
- /** The refused rows, in index order. Empty when the log was clean. */
60
- readonly gaps: readonly LogGap[];
61
- }
62
- /**
63
- * Read an unvalidated array as a commit log.
64
- *
65
- * The clean case (a live snapshot, or a stored recording that round-tripped
66
- * intact) returns the SAME array reference and no gaps: nothing is copied,
67
- * nothing is allocated, and the fold behaves byte for byte as it did in
68
- * 9.17.0. Only a log with a refused row is rebuilt, and only to keep the
69
- * indices aligned.
70
- *
71
- * @example
72
- * ```typescript
73
- * const { log, gaps } = readLog(JSON.parse(stored).commitLog);
74
- * gaps; // [{ index: 3, reason: 'not an object (null)' }]
75
- * ```
76
- */
77
- export declare function readLog(raw: readonly unknown[] | undefined): ReadLog;