footprintjs 9.48.3 → 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 -18
  138. package/dist/esm/lib/capture/ownData.js +0 -36
  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 -947
  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 -52
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -118
  172. package/dist/esm/lib/memory/pathOps.js +0 -293
  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 -151
  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 -41
  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 -951
  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 -56
  249. package/dist/lib/memory/pathOps.js +0 -309
  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 -170
  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 -18
  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 -118
  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,79 +0,0 @@
1
- "use strict";
2
- /**
3
- * scrub.ts — the commit log's scrub: the placeholder at every redacted path of a patch (C4, L2).
4
- *
5
- * The RECORD's half of a redaction. A redacted path is DATA by the time it reaches here — the
6
- * transaction buffer's `redactedPaths`, registered by `RecordFrame · write` from the scrub it was
7
- * handed — and this file only writes `LOG_PLACEHOLDER` (`placeholders.ts`) where such a path holds
8
- * a value. It never decides WHAT is secret: that is the engine's verdict (`redaction.ts`, L4 —
9
- * `RedactionRule` and the write decision), which also owns the OTHER placeholder, the scope channel's
10
- * `SCOPE_PLACEHOLDER`. Before C4 both halves lived in `redaction.ts`, so the record imported the
11
- * engine's policy module to write a string.
12
- *
13
- * THE LAW:
14
- * 1. A path is scrubbed only where it holds a DEFINED value — scrubbing never invents a field.
15
- * 2. Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one
16
- * already scrubbed finds a string, not a container, and is left alone.
17
- * 3. The input patch is never edited. `scrubPatch` copies only the spine of each scrubbed path
18
- * (and nothing at all when nothing is scrubbed); `redactPatch` hands back a fresh deep copy.
19
- */
20
- Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.redactPatch = exports.scrubPatch = void 0;
22
- const pathOps_js_1 = require("./pathOps.js");
23
- const paths_js_1 = require("./paths.js");
24
- const placeholders_js_1 = require("./placeholders.js");
25
- /**
26
- * The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
27
- * holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
28
- *
29
- * CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
30
- * own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
31
- * commit), so the scrub copies only what it must not edit in place:
32
- * - no path to scrub (no policy, no per-call mark — the common case) → `patch` ITSELF, no copy at all;
33
- * - otherwise → a new root and a shallow copy of each container on a scrubbed path (`pathOps ·
34
- * ownSpine`), every other subtree shared with `patch`. `patch` is never edited.
35
- * The engine called the public {@link redactPatch} (a whole `structuredClone`) twice per commit before
36
- * 9.33.0. The bytes are the same: a scrubbed path holds the placeholder, every other path the value the
37
- * buffer cloned (pinned by the 9.18.1 / 9.19.1 redaction byte tests).
38
- *
39
- * Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one already
40
- * scrubbed finds a string, not a container, and is left alone (as before).
41
- *
42
- * INTERNAL — the result shares structure with `patch`. A caller outside the commit path wants
43
- * {@link redactPatch}.
44
- *
45
- * @param redactedPaths DELIM-joined paths (`TransactionBuffer`'s `redactedPaths`; a bundle's
46
- * `redactedPaths` array works too).
47
- */
48
- function scrubPatch(patch, redactedPaths) {
49
- let out;
50
- let owned;
51
- for (const flat of redactedPaths) {
52
- const segs = flat.split(paths_js_1.DELIM);
53
- const current = out ?? patch;
54
- if (!(0, pathOps_js_1.nativeHas)(current, segs) || (0, pathOps_js_1.nativeGet)(current, segs) === undefined)
55
- continue;
56
- if (out === undefined) {
57
- owned = new WeakSet();
58
- out = (0, pathOps_js_1.ownedRootOf)(patch, owned);
59
- }
60
- (0, pathOps_js_1.ownSpine)(out, segs, owned);
61
- (0, pathOps_js_1.nativeSet)(out, segs, placeholders_js_1.LOG_PLACEHOLDER);
62
- }
63
- return out ?? patch;
64
- }
65
- exports.scrubPatch = scrubPatch;
66
- /**
67
- * Redacts sensitive values in a patch for logging/debugging — the PUBLIC scrub (`footprintjs/advanced`),
68
- * its contract unchanged since 4.x: a fresh deep copy of `patch` (`structuredClone`) with
69
- * {@link LOG_PLACEHOLDER} at every listed path that holds a defined value. Shares nothing with `patch`
70
- * and never edits it. (It lived in `memory/utils.ts` until 9.33.0 and in `memory/redaction.ts` until
71
- * C4; the engine's own commit path uses the clone-free {@link scrubPatch}.) No caller inside the
72
- * library: it stays on `footprintjs/advanced` for the consumers that import it until 10.0.0 (the trace
73
- * extraction, E6), which takes it off every door.
74
- */
75
- function redactPatch(patch, redactedSet) {
76
- return scrubPatch(structuredClone(patch), redactedSet);
77
- }
78
- exports.redactPatch = redactPatch;
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NydWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9zY3J1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFFSCw2Q0FBc0Y7QUFDdEYseUNBQW1DO0FBQ25DLHVEQUFvRDtBQUdwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFrQixFQUFFLGFBQStCO0lBQzVFLElBQUksR0FBNEIsQ0FBQztJQUNqQyxJQUFJLEtBQWtDLENBQUM7SUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFBLHNCQUFTLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUEsc0JBQVMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDbEYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7WUFDOUIsR0FBRyxHQUFHLElBQUEsd0JBQVcsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFnQixDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFBLHFCQUFRLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFNLENBQUMsQ0FBQztRQUM1QixJQUFBLHNCQUFTLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxpQ0FBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBZkQsZ0NBZUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFrQixFQUFFLFdBQXdCO0lBQ3RFLE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRkQsa0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNjcnViLnRzIOKAlCB0aGUgY29tbWl0IGxvZydzIHNjcnViOiB0aGUgcGxhY2Vob2xkZXIgYXQgZXZlcnkgcmVkYWN0ZWQgcGF0aCBvZiBhIHBhdGNoIChDNCwgTDIpLlxuICpcbiAqIFRoZSBSRUNPUkQncyBoYWxmIG9mIGEgcmVkYWN0aW9uLiBBIHJlZGFjdGVkIHBhdGggaXMgREFUQSBieSB0aGUgdGltZSBpdCByZWFjaGVzIGhlcmUg4oCUIHRoZVxuICogdHJhbnNhY3Rpb24gYnVmZmVyJ3MgYHJlZGFjdGVkUGF0aHNgLCByZWdpc3RlcmVkIGJ5IGBSZWNvcmRGcmFtZSDCtyB3cml0ZWAgZnJvbSB0aGUgc2NydWIgaXQgd2FzXG4gKiBoYW5kZWQg4oCUIGFuZCB0aGlzIGZpbGUgb25seSB3cml0ZXMgYExPR19QTEFDRUhPTERFUmAgKGBwbGFjZWhvbGRlcnMudHNgKSB3aGVyZSBzdWNoIGEgcGF0aCBob2xkc1xuICogYSB2YWx1ZS4gSXQgbmV2ZXIgZGVjaWRlcyBXSEFUIGlzIHNlY3JldDogdGhhdCBpcyB0aGUgZW5naW5lJ3MgdmVyZGljdCAoYHJlZGFjdGlvbi50c2AsIEw0IOKAlFxuICogYFJlZGFjdGlvblJ1bGVgIGFuZCB0aGUgd3JpdGUgZGVjaXNpb24pLCB3aGljaCBhbHNvIG93bnMgdGhlIE9USEVSIHBsYWNlaG9sZGVyLCB0aGUgc2NvcGUgY2hhbm5lbCdzXG4gKiBgU0NPUEVfUExBQ0VIT0xERVJgLiBCZWZvcmUgQzQgYm90aCBoYWx2ZXMgbGl2ZWQgaW4gYHJlZGFjdGlvbi50c2AsIHNvIHRoZSByZWNvcmQgaW1wb3J0ZWQgdGhlXG4gKiBlbmdpbmUncyBwb2xpY3kgbW9kdWxlIHRvIHdyaXRlIGEgc3RyaW5nLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEEgcGF0aCBpcyBzY3J1YmJlZCBvbmx5IHdoZXJlIGl0IGhvbGRzIGEgREVGSU5FRCB2YWx1ZSDigJQgc2NydWJiaW5nIG5ldmVyIGludmVudHMgYSBmaWVsZC5cbiAqICAgMi4gUGF0aHMgYXJlIHNjcnViYmVkIGluIHRoZSBzZXQncyBvcmRlciwgYWdhaW5zdCB0aGUgdHJlZSBhcyBzY3J1YmJlZCBzbyBmYXI6IGEgcGF0aCB1bmRlciBvbmVcbiAqICAgICAgYWxyZWFkeSBzY3J1YmJlZCBmaW5kcyBhIHN0cmluZywgbm90IGEgY29udGFpbmVyLCBhbmQgaXMgbGVmdCBhbG9uZS5cbiAqICAgMy4gVGhlIGlucHV0IHBhdGNoIGlzIG5ldmVyIGVkaXRlZC4gYHNjcnViUGF0Y2hgIGNvcGllcyBvbmx5IHRoZSBzcGluZSBvZiBlYWNoIHNjcnViYmVkIHBhdGhcbiAqICAgICAgKGFuZCBub3RoaW5nIGF0IGFsbCB3aGVuIG5vdGhpbmcgaXMgc2NydWJiZWQpOyBgcmVkYWN0UGF0Y2hgIGhhbmRzIGJhY2sgYSBmcmVzaCBkZWVwIGNvcHkuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuL3BsYWNlaG9sZGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cncyBzY3J1YjogYHBhdGNoYCB3aXRoIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IHBhdGggaW4gYHJlZGFjdGVkUGF0aHNgIHRoYXRcbiAqIGhvbGRzIGEgZGVmaW5lZCB2YWx1ZSDigJQgdGhlIGNvcHkgYHJlY29yZENvbW1pdGAgcmVjb3JkcyBhbmQgZmVlZHMgdGhlIHJlZGFjdGVkIG1pcnJvci5cbiAqXG4gKiBDTE9ORS1GUkVFICg5LjMzLjApLiBUaGUgcGF0Y2ggaXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGNvbW1pdC10aW1lIHBheWxvYWQsIGFscmVhZHkgdGhlIHJlY29yZCdzXG4gKiBvd24gY29weSAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGNvbW1pdGAgY2xvbmVzIGVhY2ggc3Vydml2aW5nIHBhdGggb25jZTsgdGhlIGJ1ZmZlciBpcyBkcm9wcGVkIGF0XG4gKiBjb21taXQpLCBzbyB0aGUgc2NydWIgY29waWVzIG9ubHkgd2hhdCBpdCBtdXN0IG5vdCBlZGl0IGluIHBsYWNlOlxuICogICAtIG5vIHBhdGggdG8gc2NydWIgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyayDigJQgdGhlIGNvbW1vbiBjYXNlKSDihpIgYHBhdGNoYCBJVFNFTEYsIG5vIGNvcHkgYXQgYWxsO1xuICogICAtIG90aGVyd2lzZSDihpIgYSBuZXcgcm9vdCBhbmQgYSBzaGFsbG93IGNvcHkgb2YgZWFjaCBjb250YWluZXIgb24gYSBzY3J1YmJlZCBwYXRoIChgcGF0aE9wcyDCt1xuICogICAgIG93blNwaW5lYCksIGV2ZXJ5IG90aGVyIHN1YnRyZWUgc2hhcmVkIHdpdGggYHBhdGNoYC4gYHBhdGNoYCBpcyBuZXZlciBlZGl0ZWQuXG4gKiBUaGUgZW5naW5lIGNhbGxlZCB0aGUgcHVibGljIHtAbGluayByZWRhY3RQYXRjaH0gKGEgd2hvbGUgYHN0cnVjdHVyZWRDbG9uZWApIHR3aWNlIHBlciBjb21taXQgYmVmb3JlXG4gKiA5LjMzLjAuIFRoZSBieXRlcyBhcmUgdGhlIHNhbWU6IGEgc2NydWJiZWQgcGF0aCBob2xkcyB0aGUgcGxhY2Vob2xkZXIsIGV2ZXJ5IG90aGVyIHBhdGggdGhlIHZhbHVlIHRoZVxuICogYnVmZmVyIGNsb25lZCAocGlubmVkIGJ5IHRoZSA5LjE4LjEgLyA5LjE5LjEgcmVkYWN0aW9uIGJ5dGUgdGVzdHMpLlxuICpcbiAqIFBhdGhzIGFyZSBzY3J1YmJlZCBpbiB0aGUgc2V0J3Mgb3JkZXIsIGFnYWluc3QgdGhlIHRyZWUgYXMgc2NydWJiZWQgc28gZmFyOiBhIHBhdGggdW5kZXIgb25lIGFscmVhZHlcbiAqIHNjcnViYmVkIGZpbmRzIGEgc3RyaW5nLCBub3QgYSBjb250YWluZXIsIGFuZCBpcyBsZWZ0IGFsb25lIChhcyBiZWZvcmUpLlxuICpcbiAqIElOVEVSTkFMIOKAlCB0aGUgcmVzdWx0IHNoYXJlcyBzdHJ1Y3R1cmUgd2l0aCBgcGF0Y2hgLiBBIGNhbGxlciBvdXRzaWRlIHRoZSBjb21taXQgcGF0aCB3YW50c1xuICoge0BsaW5rIHJlZGFjdFBhdGNofS5cbiAqXG4gKiBAcGFyYW0gcmVkYWN0ZWRQYXRocyBERUxJTS1qb2luZWQgcGF0aHMgKGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBgcmVkYWN0ZWRQYXRoc2A7IGEgYnVuZGxlJ3NcbiAqICAgYHJlZGFjdGVkUGF0aHNgIGFycmF5IHdvcmtzIHRvbykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1YlBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgbGV0IG91dDogTWVtb3J5UGF0Y2ggfCB1bmRlZmluZWQ7XG4gIGxldCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRQYXRocykge1xuICAgIGNvbnN0IHNlZ3MgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBjb25zdCBjdXJyZW50ID0gb3V0ID8/IHBhdGNoO1xuICAgIGlmICghbmF0aXZlSGFzKGN1cnJlbnQsIHNlZ3MpIHx8IG5hdGl2ZUdldChjdXJyZW50LCBzZWdzKSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgb3V0ID0gb3duZWRSb290T2YocGF0Y2gsIG93bmVkKSBhcyBNZW1vcnlQYXRjaDtcbiAgICB9XG4gICAgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCEpO1xuICAgIG5hdGl2ZVNldChvdXQsIHNlZ3MsIExPR19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBwYXRjaDtcbn1cblxuLyoqXG4gKiBSZWRhY3RzIHNlbnNpdGl2ZSB2YWx1ZXMgaW4gYSBwYXRjaCBmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcg4oCUIHRoZSBQVUJMSUMgc2NydWIgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApLFxuICogaXRzIGNvbnRyYWN0IHVuY2hhbmdlZCBzaW5jZSA0Lng6IGEgZnJlc2ggZGVlcCBjb3B5IG9mIGBwYXRjaGAgKGBzdHJ1Y3R1cmVkQ2xvbmVgKSB3aXRoXG4gKiB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSBhdCBldmVyeSBsaXN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgZGVmaW5lZCB2YWx1ZS4gU2hhcmVzIG5vdGhpbmcgd2l0aCBgcGF0Y2hgXG4gKiBhbmQgbmV2ZXIgZWRpdHMgaXQuIChJdCBsaXZlZCBpbiBgbWVtb3J5L3V0aWxzLnRzYCB1bnRpbCA5LjMzLjAgYW5kIGluIGBtZW1vcnkvcmVkYWN0aW9uLnRzYCB1bnRpbFxuICogQzQ7IHRoZSBlbmdpbmUncyBvd24gY29tbWl0IHBhdGggdXNlcyB0aGUgY2xvbmUtZnJlZSB7QGxpbmsgc2NydWJQYXRjaH0uKSBObyBjYWxsZXIgaW5zaWRlIHRoZVxuICogbGlicmFyeTogaXQgc3RheXMgb24gYGZvb3RwcmludGpzL2FkdmFuY2VkYCBmb3IgdGhlIGNvbnN1bWVycyB0aGF0IGltcG9ydCBpdCB1bnRpbCAxMC4wLjAgKHRoZSB0cmFjZVxuICogZXh0cmFjdGlvbiwgRTYpLCB3aGljaCB0YWtlcyBpdCBvZmYgZXZlcnkgZG9vci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICByZXR1cm4gc2NydWJQYXRjaChzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpLCByZWRhY3RlZFNldCk7XG59XG4iXX0=
@@ -1,11 +0,0 @@
1
- "use strict";
2
- /**
3
- * types.ts — the record's types: a bundle, its rows, its patches, its encoding, and the
4
- * execution tree as the record's readers read it.
5
- *
6
- * Imports nothing. The record names nothing outside itself (C6, `RECORD_FILES` in
7
- * scripts/layering.config.cjs): the engine's frame types — the stage snapshot, the flow
8
- * messages, the retention dials — live beside the frame, in `frameTypes.ts` (L4).
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIHRoZSByZWNvcmQncyB0eXBlczogYSBidW5kbGUsIGl0cyByb3dzLCBpdHMgcGF0Y2hlcywgaXRzIGVuY29kaW5nLCBhbmQgdGhlXG4gKiBleGVjdXRpb24gdHJlZSBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0LlxuICpcbiAqIEltcG9ydHMgbm90aGluZy4gVGhlIHJlY29yZCBuYW1lcyBub3RoaW5nIG91dHNpZGUgaXRzZWxmIChDNiwgYFJFQ09SRF9GSUxFU2AgaW5cbiAqIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcyk6IHRoZSBlbmdpbmUncyBmcmFtZSB0eXBlcyDigJQgdGhlIHN0YWdlIHNuYXBzaG90LCB0aGUgZmxvd1xuICogbWVzc2FnZXMsIHRoZSByZXRlbnRpb24gZGlhbHMg4oCUIGxpdmUgYmVzaWRlIHRoZSBmcmFtZSwgaW4gYGZyYW1lVHlwZXMudHNgIChMNCkuXG4gKi9cblxuLy8g4pSA4pSAIFBhdGNoICYgVHJhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGZsYXQga2V5LXZhbHVlIGJhZyByZXByZXNlbnRpbmcgYSBzdGF0ZSBwYXRjaCAob3ZlcndyaXRlIG9yIG1lcmdlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5UGF0Y2gge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgY2hyb25vbG9naWNhbCBvcGVyYXRpb24gdHJhY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlRW50cnkge1xuICAvKiogQ2Fub25pY2FsIHBhdGggc3RyaW5nIChzZWdtZW50cyBqb2luZWQgYnkgREVMSU0pLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpIOKAlCB0aGUga2V5cyB0aGlzIHN0YWdlIGhhZCBUUkFDS0VELVJFQUQgYXRcbiAgICogdGhlIG1vbWVudCB0aGlzIHBhdGggd2FzIChsYXN0KSB3cml0dGVuOiB0aGUgdGVtcG9yYWwtcHJlZml4IGF0dHJpYnV0aW9uXG4gICAqIHRoYXQgbGV0cyBzbGljZXMgbGluayBhIHNwZWNpZmljIHdyaXRlIHRvIG9ubHkgdGhlIHJlYWRzIHRoYXQgY291bGQgaGF2ZVxuICAgKiBmZWQgaXQgKGEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmQgd3JpdGluZyBgeCx5YCBubyBsb25nZXIgaW1wbGllcyB44oaQYikuXG4gICAqIEFCU0VOVCB1bmxlc3MgdGhlIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsIGlzIG9uIOKAlCBjaGFydHNcbiAgICogdGhhdCBuZXZlciBlbmFibGUgaXQga2VlcCBieXRlLWlkZW50aWNhbCBjb21taXQgbG9ncy4gUmVhZCBwcmVmaXhlcyBvbmx5XG4gICAqIGdyb3cgZHVyaW5nIGEgc3RhZ2UsIHNvIHVuZGVyIGRlbHRhIG1vZGUncyBvbmUtZW50cnktcGVyLXBhdGggZGVkdXAgdGhlXG4gICAqIExBU1Qgd3JpdGUncyBwcmVmaXggPT0gdGhlIHVuaW9uIGFjcm9zcyBhbGwgb2YgdGhhdCBwYXRoJ3Mgd3JpdGVzLlxuICAgKiBIb25lc3QgY2VpbGluZzogYSB3cml0ZSB3aXRoIE5PIHRyYWNrZWQgcmVhZHMgYmVmb3JlIGl0IHJlY29yZHMgYFtdYCDigJRcbiAgICogXCJkZXBlbmRlZCBvbiBubyB0cmFja2VkIHJlYWRzXCIgaXMgaW5mb3JtYXRpb24sIG5vdCBhYnNlbmNlLlxuICAgKi9cbiAgcmVhZEtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIC0gYCdzZXQnYCAgICDigJQgaGFyZCBvdmVyd3JpdGU7IGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIHRoZSBmdWxsIGZpbmFsIHZhbHVlLlxuICAgKiAtIGAnbWVyZ2UnYCAg4oCUIGRlZXAgdW5pb24gbWVyZ2U7IGB1cGRhdGVzW3BhdGhdYCBob2xkcyB0aGUgYWNjdW11bGF0ZWQgZGVsdGEuXG4gICAqIC0gYCdhcHBlbmQnYCDigJQgKCMxM2MtQiwgcHJvZHVjZWQgb25seSB1bmRlciB7QGxpbmsgQ29tbWl0VmFsdWVzTW9kZX1cbiAgICogICBgJ2RlbHRhJ2ApIHRoZSBwYXRoJ3MgZmluYWwgdmFsdWUgaXMgaXRzIGJhc2UgdmFsdWUgcGx1cyBhIHRhaWwgb2YgbmV3XG4gICAqICAgdHJhaWxpbmcgZWxlbWVudHM7IGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIE9OTFkgdGhlIHRhaWwuIFJlcGxheVxuICAgKiAgIHJlY29uc3RydWN0cyBieSBjb25jYXRlbmF0aW9uLiBOT1QgaWRlbXBvdGVudCDigJQgZGVsdGEtbW9kZSBidW5kbGVzXG4gICAqICAgY2FycnkgZXhhY3RseSBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoLlxuICAgKiAtIGAnZGVsZXRlJ2Ag4oCUICgjMTNjLUIsIHByb2R1Y2VkIG9ubHkgdW5kZXIgYCdkZWx0YSdgOyBhYnNvcmJzIGJhY2tsb2dcbiAgICogICBCOCkgdGhlIGtleSB3YXMgZXhwbGljaXRseSByZW1vdmVkIHZpYSBgZGVsZXRlVmFsdWUoKWAuIFJlcGxheSByZW1vdmVzXG4gICAqICAgdGhlIGtleS4gYG92ZXJ3cml0ZVtwYXRoXWAgc3RpbGwgRU5VTUVSQVRFUyB0aGUgcGF0aCAodmFsdWVcbiAgICogICBgdW5kZWZpbmVkYCkgc28ga2V5LXNldCBjb25zdW1lcnMga2VlcCBzZWVpbmcgdGhlIGNoYW5nZWQga2V5LlxuICAgKlxuICAgKiBgb3ZlcndyaXRlYCB2YWx1ZXMgYXJlIHRoZXJlZm9yZSBWRVJCLVFVQUxJRklFRDogY29uc3VtZXJzIHRoYXQgcmVhZFxuICAgKiBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyBcInRoZSBmdWxsIHZhbHVlIHdyaXR0ZW5cIiBtdXN0IHVzZVxuICAgKiBgY29tbWl0VmFsdWVBdChjb21taXRMb2csIGlkeCwga2V5KWAgKGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCkgd2hlbiB0aGVcbiAgICogbG9nIG1heSBjb250YWluIGRlbHRhLW1vZGUgYnVuZGxlcy5cbiAgICovXG4gIHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB8ICdhcHBlbmQnIHwgJ2RlbGV0ZSc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMiDigJQgcmVhZCBwYXRocyB0aGF0IEJZUEFTUyByZWFkIHRyYWNraW5nOlxuICogLSBgJ2FyZ3MnYCAgIOKAlCB0aGUgc3RhZ2UgY2FsbGVkIGBnZXRBcmdzKClgIC8gYCRnZXRBcmdzKClgIHdpdGggbm9uLWVtcHR5XG4gKiAgIHJ1biBpbnB1dCAoZnJvemVuLCB1bnRyYWNrZWQgYnkgZGVzaWduKVxuICogLSBgJ2VudidgICAgIOKAlCB0aGUgc3RhZ2UgY2FsbGVkIGBnZXRFbnYoKWAgLyBgJGdldEVudigpYCB3aXRoIGEgbm9uLWVtcHR5XG4gKiAgIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCAoZnJvemVuLCB1bnRyYWNrZWQgYnkgZGVzaWduKVxuICogLSBgJ3NpbGVudCdgIOKAlCB0aGUgc3RhZ2UgcGVyZm9ybWVkIGEgc2lsZW50IHJlYWQgKGBnZXRWYWx1ZVNpbGVudGAgL1xuICogICBgZ2V0VmFsdWVEaXJlY3RgKSBvZiBhIGtleSBpdCBuZXZlciB0cmFja2VkLXJlYWQgaW4gdGhlIHNhbWUgc3RhZ2UuXG4gKiAgIFNpbGVudCByZWFkcyBTSEFET1dFRCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgaW4gdGhlIHNhbWVcbiAqICAgc3RhZ2UgKFR5cGVkU2NvcGUgYXJyYXktcHJveHkgaW50ZXJuYWxzLCBgJGJhdGNoQXJyYXlgKSBhcmUgTk9UXG4gKiAgIGZsYWdnZWQg4oCUIHRoZWlyIHJlYWTihpJ3cml0ZSBlZGdlIGlzIGFscmVhZHkgY2FwdHVyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFVudHJhY2tlZFNvdXJjZSA9ICdhcmdzJyB8ICdlbnYnIHwgJ3NpbGVudCc7XG5cbi8qKiBUaGUgYXRvbWljIGJ1bmRsZSBwcm9kdWNlZCBieSBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QnVuZGxlIHtcbiAgLyoqIEF1dG8tYXNzaWduZWQgc3RlcCBpbmRleCAoc2V0IGJ5IEV2ZW50TG9nLnJlY29yZCkuICovXG4gIGlkeD86IG51bWJlcjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBDaHJvbm9sb2dpY2FsIHdyaXRlIGxvZyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuICovXG4gIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIC8qKiBQYXRocyB0aGF0IHNob3VsZCBiZSByZWRhY3RlZCBpbiBVSSAoc2Vuc2l0aXZlIGRhdGEpLiAqL1xuICByZWRhY3RlZFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEhhcmQgb3ZlcndyaXRlIHBhdGNoZXMuICovXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gIC8qKiBEZWVwIG1lcmdlIHBhdGNoZXMuICovXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHRoaXMgc3RhZ2UgY29uc3VtZWRcbiAgICogKHNlZSB7QGxpbmsgVW50cmFja2VkU291cmNlfSkuIEFCU0VOVCB3aGVuIHRoZSBzdGFnZSB1c2VkIG5vbmUsIHNvXG4gICAqIGNoYXJ0cyB0aGF0IG5ldmVyIHRvdWNoIHRob3NlIHBhdGhzIGtlZXAgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuXG4gICAqIENhdXNhbC1zbGljZSBjb25zdW1lcnMgKGBjYXVzYWxDaGFpbmAvYGZvcm1hdENhdXNhbENoYWluYCkgc3VyZmFjZSB0aGlzXG4gICAqIGFzIFwic2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZVwiLiBSZXNpZHVhbCBsaW1pdGF0aW9uIChieSBkZXNpZ24pOlxuICAgKiB2YWx1ZXMgc211Z2dsZWQgdGhyb3VnaCBKUyBjbG9zdXJlcyBhcmUgdW5kZXRlY3RhYmxlLlxuICAgKi9cbiAgdW50cmFja2VkU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBuYW1lcyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUgKGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2AgLyBgb3B0aW9ucy50YWdzYCksIHN0YW1wZWQgaGVyZSBieSB0aGVcbiAgICogdHJhdmVyc2VyIHNvIGEgc3RvcmVkIHJlY29yZGluZyBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcyB3aXRob3V0IGFcbiAgICogY29uc3VtZXIncyBpZCBjb252ZW50aW9ucy4gQUJTRU5UIHdoZW4gdGhlIHN0YWdlIGRlY2xhcmVzIG5vbmUsIHNvIGFuXG4gICAqIHVudGFnZ2VkIGNoYXJ0J3MgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMjAuMCAodGhlIGxhd1xuICAgKiBgdW50cmFja2VkU291cmNlc2Aga2VlcHMpLiBSZWNvcmRlZCBvbiB0aGUgRklSU1QgYnVuZGxlIG9mIGVhY2ggZXhlY3V0aW9uXG4gICAqIG9mIHRoZSBzdGFnZSDigJQgdGhlIHN0YWdlJ3Mgb3duIGJ1bmRsZSwgdGhlIG9uZSB3aXRob3V0IGEgYHBoYXNlYCDigJQgc29cbiAgICogcmV0cnkgYXR0ZW1wdHMgc3RhbXAgaXQgb25jZSwgYSBjb250aW51YXRpb24gKGEgZm9yayBjaGlsZCdzIGAncmVwZWF0J2AsXG4gICAqIGEgbW91bnQncyBgJ2V4aXQnYCBhZnRlciBpdHMgbWVyZ2UtYmFjaykgY2FycmllcyBub25lLCBhbmQgYSBtb3VudCB3aG9zZVxuICAgKiBleGl0IGlzIGl0cyBvbmx5IGJ1bmRsZSAobm8gYG91dHB1dE1hcHBlcmApIGNhcnJpZXMgdGhlbSBvbiB0aGF0IGJ1bmRsZS4gRnJlZSBzdHJpbmdzOiBmb290cHJpbnRqcyBhc3NpZ25zXG4gICAqIHRoZW0gbm8gbWVhbmluZzsgYHRhZ1N0b3BzYCAoZm9vdHByaW50anMvdHJhY2UpIGtlZXBzIGEgc3RvcCB3aGVuIGFueSBvZlxuICAgKiB0aGVtIG1hdGNoZXMuXG4gICAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGljaCBDT05USU5VQVRJT04gb2YgYSBzdGFnZSdzIGV4ZWN1dGlvbiB0aGlzIGJ1bmRsZSBpcyAoOS4zOS4wKSDigJRcbiAgICogc3RhbXBlZCBieSB0aGUgV1JJVEVSLiBUSEUgTEFXOiB0aGUgRklSU1QgYnVuZGxlIHBlciBgcnVudGltZVN0YWdlSWRgIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biBhbmQgY2FycmllcyBOTyBgcGhhc2VgOyBvbmx5IGEgYnVuZGxlIGFmdGVyIGl0IGNhbjpcbiAgICpcbiAgICogLSBgJ2V4aXQnYCDigJQgYSBzdWJmbG93IG1vdW50J3MgZXhpdCBjb21taXQgKGBTdWJmbG93RXhlY3V0b3JgKSBhZnRlciBpdHNcbiAgICogICBtZXJnZS1iYWNrIGJ1bmRsZSAoYG91dHB1dE1hcHBlcmApLiBBIG1vdW50IHdpdGhvdXQgYSBtZXJnZS1iYWNrIChhIGxhenlcbiAgICogICBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoLCBhbnkgbW91bnQgd2l0aCBubyBtYXBwZXIpIGhhc1xuICAgKiAgIGl0cyBleGl0IGFzIGl0cyBPTkxZIGJ1bmRsZSDigJQgaXRzIG93biwgc28gbm8gYHBoYXNlYDsgdGhlIGV4ZWN1dGlvblxuICAgKiAgIHRyZWUgbmFtZXMgaXQgYSBtb3VudC5cbiAgICogLSBgJ3JlcGVhdCdgIOKAlCB0aGUgZmFuLW91dCdzIHNldHRsZSBjb21taXQgb2YgYSBmb3JrIGNoaWxkJ3MgZnJhbWVcbiAgICogICAoYENoaWxkcmVuRXhlY3V0b3JgKSwgYWZ0ZXIgdGhlIGNoaWxkJ3Mgb3duIGJ1bmRsZS5cbiAgICpcbiAgICogQSByZWFkZXIgZ3JvdXBzIGEgc3RhZ2UncyBidW5kbGVzIGJ5IGBydW50aW1lU3RhZ2VJZGAgYW5kIHJlYWRzIHRoaXNcbiAgICogZmllbGQgdG8ga25vdyB3aGF0IGVhY2ggY29udGludWF0aW9uIGlzOyBpdCBuZXZlciBpbmZlcnMgaXQgZnJvbSB0aGVcbiAgICogbG9nJ3Mgc2hhcGUuIEEgbG9nIHdyaXR0ZW4gYmVmb3JlIDkuMzkuMCBjYXJyaWVzIG5vIGBwaGFzZWAgYW55d2hlcmUg4oCUXG4gICAqIHNlZSBgaW5mZXJMZWdhY3lQaGFzZXNgIChmb290cHJpbnRqcy90cmFjZSkgZm9yIGhvdyBpdCBpcyBzdGlsbCByZWFkLlxuICAgKi9cbiAgcGhhc2U/OiBDb21taXRQaGFzZTtcbn1cblxuLyoqIFRoZSBjb250aW51YXRpb24gYSBidW5kbGUgcmVjb3JkcyDigJQgc2VlIHtAbGluayBDb21taXRCdW5kbGUucGhhc2V9LiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0UGhhc2UgPSAnZXhpdCcgfCAncmVwZWF0JztcblxuLyoqXG4gKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKSDigJQgdGhlIGZvdXJ0aCBkaWFsIG9mIHRoZVxuICogcmVhZFRyYWNraW5nL3dyaXRlVHJhY2tpbmcvY29tbWl0VmFsdWVzIGZhbWlseSwgc2FtZSA2LXNpdGUgcHJvcGFnYXRpb25cbiAqIHBhdHRlcm4gKGV4ZWN1dG9yIG9wdGlvbiDihpIgRXhlY3V0aW9uUnVudGltZS51c2UqIOKGkiByb290IFN0YWdlQ29udGV4dCDihpJcbiAqIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQgaW5oZXJpdGFuY2Ug4oaSIFN1YmZsb3dFeGVjdXRvciBkdWNrLXB1c2gpLlxuICpcbiAqIC0gYCdvZmYnYCAoZGVmYXVsdCkg4oCUIHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuXG4gKiAtIGAncmVhZHMtcHJlZml4J2Ag4oCUIGV2ZXJ5IGNvbW1pdHRlZCB7QGxpbmsgVHJhY2VFbnRyeX0gY2Fycmllc1xuICogICBgcmVhZEtleXNgOiB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFIHRoYXQgd3JpdGUgKHRlbXBvcmFsLXByZWZpeFxuICogICBhdHRyaWJ1dGlvbikuIENvc3Q6IG9uZSBTZXQtdG8tYXJyYXkgY29weSBwZXIgd3JpdGUuIENvbnN1bWVkIGJ5XG4gKiAgIGBjYXVzYWxDaGFpbmAncyBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHRoZSBzbGljZSBsYXllci5cbiAqL1xuZXhwb3J0IHR5cGUgV3JpdGVQcm92ZW5hbmNlTW9kZSA9ICdvZmYnIHwgJ3JlYWRzLXByZWZpeCc7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgY29tbWl0LWJ1bmRsZSBWQUxVRVMgYXJlIGVuY29kZWQgaW50byB0aGUgY29tbWl0IGxvZ1xuICogKCMxM2MtQikg4oCUIGNvbXBsZXRlcyB0aGUgYHJlYWRUcmFja2luZ2AvYHdyaXRlVHJhY2tpbmdgIGRpYWwgZmFtaWx5LlxuICogVW5saWtlIHRob3NlIHR3byAod2hpY2ggZ2F0ZSBsb3NzeSBzbmFwc2hvdCBib29ra2VlcGluZyksIHRoaXMgZGlhbCBpc1xuICogKipsb3NzbGVzcyBpbiBib3RoIG1vZGVzKiog4oCUIGl0IGNoYW5nZXMgdGhlIGNvbW1pdCBsb2cncyAqZW5jb2RpbmcqLFxuICogbmV2ZXIgaXRzICppbmZvcm1hdGlvbio7IGFueSBzdGVwJ3MgZnVsbCBzdGF0ZSBzdGF5cyBleGFjdGx5XG4gKiByZWNvbnN0cnVjdGFibGUgYnkgcmVwbGF5LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgcGF0aCBzdG9yZXMgdGhlIGZ1bGwgZmluYWxcbiAqICAgdmFsdWUsIG9uZSB0cmFjZSBlbnRyeSBwZXIgb3BlcmF0aW9uLiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbFxuICogICBiZWhhdmlvci5cbiAqIC0gYCdkZWx0YSdgIOKAlCB0d28gY2hhbmdlcywgYm90aCByZXBsYXktY292ZXJlZCBieSBgYXBwbHlTbWFydE1lcmdlYDpcbiAqICAgMS4gKipgYXBwZW5kYCBkZXRlY3Rpb24qKjogd2hlbiBhIHBhdGgncyBuZXQgY2hhbmdlIGlzIFwidGhlIGJhc2UgYXJyYXlcbiAqICAgICAgcGx1cyBuZXcgdHJhaWxpbmcgZWxlbWVudHNcIiAoc3RyaWN0IHByZWZpeCksIHRoZSBidW5kbGUgcmVjb3JkcyBPTkxZXG4gKiAgICAgIHRoZSB0YWlsIHVuZGVyIGEgYHZlcmI6ICdhcHBlbmQnYCB0cmFjZSBlbnRyeSDigJQgdGhlIGdyb3dpbmctaGlzdG9yeVxuICogICAgICBjb21taXQgbG9nIGJlY29tZXMgbGluZWFyIGluIHRhaWwgc2l6ZSBpbnN0ZWFkIG9mIE8oTsKyKSByZXRhaW5lZC5cbiAqICAgICAgQSByZWFsIGB2ZXJiOiAnZGVsZXRlJ2AgZW50cnkgcmVwbGFjZXMgdGhlIGBzZXQ6IHVuZGVmaW5lZGAgZmxhdHRlbmluZ1xuICogICAgICBmb3IgYGRlbGV0ZVZhbHVlKClgIChjbG9zZXMgdGhlIGRvY3VtZW50ZWQgTWVtb3J5UGF0Y2ggbGltaXRhdGlvbikuXG4gKiAgIDIuICoqT25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCoqIChhcHBlbmQgaXMgbm90IGlkZW1wb3RlbnQgb25cbiAqICAgICAgcmVwbGF5KTogdGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIGJhc2XihpJmaW5hbCByZWxhdGlvbnNoaXBcbiAqICAgICAgYW5kIG9wIG1peDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLlxuICpcbiAqIEhvbmVzdCBjb3N0IG5vdGU6IGFwcGVuZCBkZXRlY3Rpb24gaXMgTkVXIHdhbGwgd29yayDigJQgYW4gTyh8YmFzZXwpXG4gKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0ICh0b2RheSdzXG4gKiBgZGVlcEVxdWFsYCBmYXN0LWZhaWxzIG9uIGxlbmd0aCBpbiBPKDEpIGZvciBhIGdyb3duIGFycmF5KS4gT24gYSBoaXQgdGhlXG4gKiBjb21taXQgZ2V0cyBjaGVhcGVyIGluIGJvdGggd2FsbCBhbmQgaGVhcCAodGhlIE8ofGZpbmFsfCkgY2xvbmUgc2hyaW5rcyB0b1xuICogTyh8dGFpbHwpKTsgb24gYSBtaXNzIGl0IHBheXMgY29tcGFyZSArIGZ1bGwgY2xvbmUuIGAnZnVsbCdgIHBheXMgemVybyDigJRcbiAqIHRoZSBkZXRlY3Rpb24gYnJhbmNoIGlzIG1vZGUtZ2F0ZWQuXG4gKlxuICogU2V0IHZpYSBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IGNvbW1pdFZhbHVlcyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFRoZSBhY3RpdmUgbW9kZSBpc1xuICogc3VyZmFjZWQgYXMgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudCBgUnVudGltZVNuYXBzaG90LmNvbW1pdFZhbHVlc2AuXG4gKi9cbmV4cG9ydCB0eXBlIENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCcgfCAnZGVsdGEnO1xuXG4vLyDilIDilIAgVGhlIGV4ZWN1dGlvbiB0cmVlLCBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRoZSBleGVjdXRpb24gdHJlZSBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0IChDNik6IHRoZSBmaWVsZHMgYSByZWFkZXIgdG91Y2hlcyBhbmRcbiAqIG5vdGhpbmcgZWxzZS4gYGNvbW1pdFN0b3BzYCAoYW5kIHNvIGB0YWdTdG9wc2AgYW5kIGV2ZXJ5IHN0cmF0ZWd5IGJ1aWx0IG9uIGl0KSByZWFkcyB0aGUgbW91bnRcbiAqIG1hcmtlciAoYHN1YmZsb3dJZGApIGFuZCB0aGUgcm9vdCdzIGBpZGA7IGBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlYCByZWFkcyB0aGUga2V5cyBvZlxuICogYHN0YWdlUmVhZHNgOyBib3RoIGtleSBvbiBgcnVudGltZVN0YWdlSWRgIGFuZCB3YWxrIGBuZXh0YCBhbmQgYGNoaWxkcmVuYC5cbiAqXG4gKiBBIHN0cnVjdHVyYWwgdHlwZSB0aGUgcmVjb3JkIG93bnMsIHNvIHRoZSByZWFkZXJzIG5hbWUgbm90aGluZyBvZiB0aGUgZW5naW5lLiBUaGUgZW5naW5lJ3NcbiAqIGBTdGFnZVNuYXBzaG90YCAoYGdldFNuYXBzaG90KCkuZXhlY3V0aW9uVHJlZWApIGlzIG9uZSDigJQgYSBzdXBlcnR5cGUgb2YgaXQsIHNvIGV2ZXJ5IGNhbGxlclxuICogdGhhdCBoYW5kcyBhIHNuYXBzaG90J3MgdHJlZSBvdmVyIGNvbXBpbGVzIHVuY2hhbmdlZCDigJQgYW5kIHNvIGlzIGEgc3RvcmVkIHJlY29yZGluZydzIHBhcnNlZFxuICogSlNPTiB3aXRoIHRoZXNlIGZpZWxkcy4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGEgcmVhZGVyIHRoYXQgZmluZHMgb25lIGFic2VudCByZWFkcyBvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgdHlwZSBFeGVjdXRpb25UcmVlLCBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IHRyZWU6IEV4ZWN1dGlvblRyZWUgPSB7XG4gKiAgIHJ1bnRpbWVTdGFnZUlkOiAnc2VlZCMwJyxcbiAqICAgbmV4dDogeyBydW50aW1lU3RhZ2VJZDogJ2RlY2lkZSMxJywgc3RhZ2VSZWFkczogeyBjcmVkaXRUaWVyOiAnQScgfSB9LFxuICogfTtcbiAqIGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWUodHJlZSkubG9va3VwKCdkZWNpZGUjMScpOyAvLyBbJ2NyZWRpdFRpZXInXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uVHJlZSB7XG4gIC8qKiBUaGUgc3RhZ2UncyBpZCAocHJlZml4ZWQgaW5zaWRlIGEgc3ViZmxvdykuIGBjb21taXRTdG9wc2AgcmVhZHMgdGhlIHJvb3QncyB0byBwbGFjZSBhIHN1YmZsb3cncyBzZWVkLiAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgLyoqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIOKAlCB3aGF0IGEgcmVhZGVyIGtleXMgb24uIEEgbm9kZSB3aXRob3V0IG9uZSBpcyBub3QgYSBzdGFnZS4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBQcmVzZW50IG9uIGEgc3ViZmxvdyBtb3VudDogdGhlIHN0b3AgdGhlcmUgc2F5cyBga2luZDogJ21vdW50J2AuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIHN0YWdlIHRyYWNrZWQtcmVhZCwgYnkga2V5LiBPbmx5IHRoZSBLRVlTIGFyZSByZWFkOiBhIGAnc3VtbWFyeSdgIG1hcmtlciBzZXJ2ZXMgYXMgd2VsbCBhcyBhIHZhbHVlLiAqL1xuICByZWFkb25seSBzdGFnZVJlYWRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHN0YWdlIHRoYXQgcmFuIG5leHQuICovXG4gIHJlYWRvbmx5IG5leHQ/OiBFeGVjdXRpb25UcmVlO1xuICAvKiogVGhlIHN0YWdlcyB0aGF0IHJhbiBhcyB0aGlzIG9uZSdzIGNoaWxkcmVuIChhIGZvcmsncyBicmFuY2hlcywgYSBkZWNpZGVyJ3MgY2hvc2VuIGJyYW5jaCkuICovXG4gIHJlYWRvbmx5IGNoaWxkcmVuPzogcmVhZG9ubHkgRXhlY3V0aW9uVHJlZVtdO1xufVxuIl19
@@ -1,170 +0,0 @@
1
- "use strict";
2
- /**
3
- * utils.ts — nested-object helpers for the heap, and the memory leaves' one
4
- * re-export surface.
5
- *
6
- * The helpers here (`setNestedValue`, `updateNestedValue`, `updateValue`,
7
- * `getNestedValue`) walk a nested object by path with
8
- * prototype-pollution protection. Everything else this file used to hold has an
9
- * owner of its own and is re-exported, so no importer moved: the path codec
10
- * (`paths.ts`), structural equality (`equality.ts`) and the union merge
11
- * (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
12
- * `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
13
- * The log's scrub, `redactPatch`, moved out in 9.33.0; it is the record's own, `scrub.ts` (C4).
14
- * The writers take an ADDRESS, a path prefix their caller computed, and never
15
- * name one (C2: the engine decides where a stage writes, `runAddress.ts · runAddress`).
16
- * Zero external dependencies.
17
- */
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.isDeniedWritePath = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
20
- const ownData_js_1 = require("../capture/ownData.js");
21
- const pathOps_js_1 = require("./pathOps.js");
22
- var equality_js_1 = require("./equality.js");
23
- Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return equality_js_1.deepEqual; } });
24
- var merge_js_1 = require("./merge.js");
25
- Object.defineProperty(exports, "deepSmartMerge", { enumerable: true, get: function () { return merge_js_1.deepSmartMerge; } });
26
- var paths_js_1 = require("./paths.js");
27
- Object.defineProperty(exports, "DELIM", { enumerable: true, get: function () { return paths_js_1.DELIM; } });
28
- Object.defineProperty(exports, "normalisePath", { enumerable: true, get: function () { return paths_js_1.normalisePath; } });
29
- Object.defineProperty(exports, "pathSegments", { enumerable: true, get: function () { return paths_js_1.pathSegments; } });
30
- var verbs_js_1 = require("./verbs.js");
31
- Object.defineProperty(exports, "applySmartMerge", { enumerable: true, get: function () { return verbs_js_1.applySmartMerge; } });
32
- Object.defineProperty(exports, "applySmartMergeInto", { enumerable: true, get: function () { return verbs_js_1.applySmartMergeInto; } });
33
- Object.defineProperty(exports, "dryFold", { enumerable: true, get: function () { return verbs_js_1.dryFold; } });
34
- Object.defineProperty(exports, "nextGeneration", { enumerable: true, get: function () { return verbs_js_1.nextGeneration; } });
35
- Object.defineProperty(exports, "supersededByNextSet", { enumerable: true, get: function () { return verbs_js_1.supersededByNextSet; } });
36
- /**
37
- * The two places a value at `path` can sit: under `address` (`runPath`, absent
38
- * for the root address `[]`) and at the root (`globalPath`). `address` is a
39
- * path prefix the caller computed — for the engine, a frame's run namespace
40
- * (`runAddress.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
41
- */
42
- function getRunAndGlobalPaths(address = [], path = []) {
43
- return {
44
- runPath: addressOf(address).length > 0 ? pathUnder(address, path) : undefined,
45
- globalPath: [...path],
46
- };
47
- }
48
- exports.getRunAndGlobalPaths = getRunAndGlobalPaths;
49
- /** An address is an array. A run id still passed in its place (C2) is refused, never spread into its characters. */
50
- function addressOf(address) {
51
- if (Array.isArray(address))
52
- return address;
53
- throw new TypeError(`footprintjs: an address is an array path prefix, got ${address === null ? 'null' : typeof address}`);
54
- }
55
- /**
56
- * `address` then `path`, as one new array. An index loop, because the double
57
- * spread `[...address, ...path]` costs twice as much and a frame builds one on
58
- * every read it serves from live state (a fork child reading a root key).
59
- */
60
- function pathUnder(address, path) {
61
- const out = new Array(address.length + path.length);
62
- for (let i = 0; i < address.length; i++)
63
- out[i] = address[i];
64
- for (let i = 0; i < path.length; i++)
65
- out[address.length + i] = path[i];
66
- return out;
67
- }
68
- /**
69
- * Refuse the WHOLE selector before creating a container or copying a generation.
70
- * The address's array contract is checked even when another selector is denied.
71
- * Payload keys are data, not selectors, and are deliberately not inspected.
72
- * @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
73
- */
74
- function isDeniedWritePath(address = [], path = [], field) {
75
- const prefix = addressOf(address);
76
- return prefix.some(pathOps_js_1.isDeniedSegment) || path.some(pathOps_js_1.isDeniedSegment) || (0, pathOps_js_1.isDeniedSegment)(field);
77
- }
78
- exports.isDeniedWritePath = isDeniedWritePath;
79
- /**
80
- * The container at `address` + `path` inside `obj`, each missing one created
81
- * on the way: the one AT the address from `defaultValues` when given, every
82
- * other one empty. The one walk both nested writers share.
83
- */
84
- function containerAt(obj, address = [], path = [], defaultValues) {
85
- const segments = pathUnder(addressOf(address), path);
86
- let current = obj;
87
- for (let i = 0; i < segments.length; i++) {
88
- const key = segments[i];
89
- if (!Object.prototype.hasOwnProperty.call(current, key)) {
90
- (0, ownData_js_1.setOwnValue)(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
91
- }
92
- current = current[key];
93
- }
94
- return current;
95
- }
96
- /**
97
- * Sets a value at a nested path under `address`, creating intermediate objects as needed.
98
- * A denied address/path/field leaves `obj` unchanged, including its prototype.
99
- */
100
- function setNestedValue(obj, address, path, field, value, defaultValues) {
101
- if (isDeniedWritePath(address, path, field))
102
- return obj;
103
- (0, ownData_js_1.setOwnValue)(containerAt(obj, address, path, defaultValues), field, value);
104
- return obj;
105
- }
106
- exports.setNestedValue = setNestedValue;
107
- /**
108
- * Updates a value in the object at a nested path under `address`.
109
- * A denied address/path/field leaves `obj` unchanged, including its prototype.
110
- * - Arrays: concatenate
111
- * - Objects: shallow merge at each level
112
- * - Primitives: replace
113
- */
114
- function updateNestedValue(obj, address, path, field, value, defaultValues) {
115
- if (isDeniedWritePath(address, path, field))
116
- return obj;
117
- updateValue(containerAt(obj, address, path, defaultValues), field, value);
118
- return obj;
119
- }
120
- exports.updateNestedValue = updateNestedValue;
121
- /**
122
- * In-place value update with merge semantics.
123
- * - Arrays (non-empty): concatenate onto existing
124
- * - Arrays (empty): direct replace — writing `[]` clears the field
125
- * - Objects (non-empty): shallow merge (spread)
126
- * - Objects (empty): direct replace — writing `{}` clears the field
127
- * - Primitives: direct assignment
128
- *
129
- * Note on empty arrays: both `value && Array.isArray(value)` and
130
- * `Array.isArray(value)` evaluate the same for arrays — `[]` is truthy in
131
- * JavaScript, so the `&&` guard was never the issue. The actual bug was the
132
- * concat path: `[...cur, ...[]]` silently returned `cur` unchanged when `value`
133
- * was `[]`, making `updateValue(obj, 'tags', [])` a no-op instead of a clear.
134
- * The fix is the explicit `value.length === 0` early-return branch.
135
- */
136
- function updateValue(object, key, value) {
137
- if ((0, pathOps_js_1.isDeniedSegment)(key))
138
- return;
139
- if (Array.isArray(value)) {
140
- if (value.length === 0) {
141
- (0, ownData_js_1.setOwnValue)(object, key, value); // clear: [] replaces whatever was there
142
- }
143
- else {
144
- const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
145
- (0, ownData_js_1.setOwnValue)(object, key, cur === undefined ? value : [...cur, ...value]);
146
- }
147
- }
148
- else if (value && typeof value === 'object' && Object.keys(value).length) {
149
- const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
150
- (0, ownData_js_1.setOwnValue)(object, key, cur === undefined ? value : { ...cur, ...value });
151
- }
152
- else {
153
- (0, ownData_js_1.setOwnValue)(object, key, value);
154
- }
155
- }
156
- exports.updateValue = updateValue;
157
- /**
158
- * Gets a value at a nested path with prototype-pollution protection.
159
- */
160
- function getNestedValue(root, path, field) {
161
- const node = path && path.length > 0 ? (0, pathOps_js_1.nativeGet)(root, path) : root;
162
- if (field === undefined || node === undefined)
163
- return node;
164
- if (node !== null && typeof node === 'object' && Object.prototype.hasOwnProperty.call(node, field)) {
165
- return node[field];
166
- }
167
- return undefined;
168
- }
169
- exports.getNestedValue = getNestedValue;
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCxzREFBb0Q7QUFDcEQsNkNBQWtFO0FBSWxFLDZDQUEwQztBQUFqQyx3R0FBQSxTQUFTLE9BQUE7QUFDbEIsdUNBQTRDO0FBQW5DLDBHQUFBLGNBQWMsT0FBQTtBQUN2Qix1Q0FBZ0U7QUFBdkQsaUdBQUEsS0FBSyxPQUFBO0FBQUUseUdBQUEsYUFBYSxPQUFBO0FBQUUsd0dBQUEsWUFBWSxPQUFBO0FBQzNDLHVDQUFnSDtBQUF2RywyR0FBQSxlQUFlLE9BQUE7QUFBRSwrR0FBQSxtQkFBbUIsT0FBQTtBQUFFLG1HQUFBLE9BQU8sT0FBQTtBQUFFLDBHQUFBLGNBQWMsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBSTNGOzs7OztHQUtHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUxELG9EQUtDO0FBRUQsb0hBQW9IO0FBQ3BILFNBQVMsU0FBUyxDQUFDLE9BQTBCO0lBQzNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUMzQyxNQUFNLElBQUksU0FBUyxDQUNqQix3REFBd0QsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sRUFB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bHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCBvdXQgaW4gOS4zMy4wOyBpdCBpcyB0aGUgcmVjb3JkJ3Mgb3duLCBgc2NydWIudHNgIChDNCkuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBzZXRPd25WYWx1ZSB9IGZyb20gJy4uL2NhcHR1cmUvb3duRGF0YS5qcyc7XG5pbXBvcnQgeyBpc0RlbmllZFNlZ21lbnQsIG5hdGl2ZUdldCBhcyBfZ2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgLCBDMiksIGhlbGQgYnkgaXRzIHJlY29yZCBmcmFtZSAoYFJlY29yZEZyYW1lIMK3IGFkZHJlc3NgLCBDMykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBhZGRyZXNzT2YoYWRkcmVzcykubGVuZ3RoID4gMCA/IHBhdGhVbmRlcihhZGRyZXNzLCBwYXRoKSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKiBBbiBhZGRyZXNzIGlzIGFuIGFycmF5LiBBIHJ1biBpZCBzdGlsbCBwYXNzZWQgaW4gaXRzIHBsYWNlIChDMikgaXMgcmVmdXNlZCwgbmV2ZXIgc3ByZWFkIGludG8gaXRzIGNoYXJhY3RlcnMuICovXG5mdW5jdGlvbiBhZGRyZXNzT2YoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFkZHJlc3MpKSByZXR1cm4gYWRkcmVzcztcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgZm9vdHByaW50anM6IGFuIGFkZHJlc3MgaXMgYW4gYXJyYXkgcGF0aCBwcmVmaXgsIGdvdCAke2FkZHJlc3MgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWRkcmVzc31gLFxuICApO1xufVxuXG4vKipcbiAqIGBhZGRyZXNzYCB0aGVuIGBwYXRoYCwgYXMgb25lIG5ldyBhcnJheS4gQW4gaW5kZXggbG9vcCwgYmVjYXVzZSB0aGUgZG91YmxlXG4gKiBzcHJlYWQgYFsuLi5hZGRyZXNzLCAuLi5wYXRoXWAgY29zdHMgdHdpY2UgYXMgbXVjaCBhbmQgYSBmcmFtZSBidWlsZHMgb25lIG9uXG4gKiBldmVyeSByZWFkIGl0IHNlcnZlcyBmcm9tIGxpdmUgc3RhdGUgKGEgZm9yayBjaGlsZCByZWFkaW5nIGEgcm9vdCBrZXkpLlxuICovXG5mdW5jdGlvbiBwYXRoVW5kZXIoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PHN0cmluZyB8IG51bWJlcj4oYWRkcmVzcy5sZW5ndGggKyBwYXRoLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gYWRkcmVzc1tpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVmdXNlIHRoZSBXSE9MRSBzZWxlY3RvciBiZWZvcmUgY3JlYXRpbmcgYSBjb250YWluZXIgb3IgY29weWluZyBhIGdlbmVyYXRpb24uXG4gKiBUaGUgYWRkcmVzcydzIGFycmF5IGNvbnRyYWN0IGlzIGNoZWNrZWQgZXZlbiB3aGVuIGFub3RoZXIgc2VsZWN0b3IgaXMgZGVuaWVkLlxuICogUGF5bG9hZCBrZXlzIGFyZSBkYXRhLCBub3Qgc2VsZWN0b3JzLCBhbmQgYXJlIGRlbGliZXJhdGVseSBub3QgaW5zcGVjdGVkLlxuICogQGludGVybmFsIFNoYXJlZCBieSB0aGUgbmVzdGVkIHdyaXRlcnMgYW5kIFNoYXJlZE1lbW9yeSdzIHByZS1jb3B5IGJvdW5kYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRXcml0ZVBhdGgoXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmVmaXggPSBhZGRyZXNzT2YoYWRkcmVzcyk7XG4gIHJldHVybiBwcmVmaXguc29tZShpc0RlbmllZFNlZ21lbnQpIHx8IHBhdGguc29tZShpc0RlbmllZFNlZ21lbnQpIHx8IGlzRGVuaWVkU2VnbWVudChmaWVsZCk7XG59XG5cbi8qKlxuICogVGhlIGNvbnRhaW5lciBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgaW5zaWRlIGBvYmpgLCBlYWNoIG1pc3Npbmcgb25lIGNyZWF0ZWRcbiAqIG9uIHRoZSB3YXk6IHRoZSBvbmUgQVQgdGhlIGFkZHJlc3MgZnJvbSBgZGVmYXVsdFZhbHVlc2Agd2hlbiBnaXZlbiwgZXZlcnlcbiAqIG90aGVyIG9uZSBlbXB0eS4gVGhlIG9uZSB3YWxrIGJvdGggbmVzdGVkIHdyaXRlcnMgc2hhcmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckF0KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aFVuZGVyKGFkZHJlc3NPZihhZGRyZXNzKSwgcGF0aCk7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc2VnbWVudHNbaV07XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgc2V0T3duVmFsdWUoY3VycmVudCwga2V5LCBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fSk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKiBBIGRlbmllZCBhZGRyZXNzL3BhdGgvZmllbGQgbGVhdmVzIGBvYmpgIHVuY2hhbmdlZCwgaW5jbHVkaW5nIGl0cyBwcm90b3R5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgaWYgKGlzRGVuaWVkV3JpdGVQYXRoKGFkZHJlc3MsIHBhdGgsIGZpZWxkKSkgcmV0dXJuIG9iajtcbiAgc2V0T3duVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgdmFsdWUgaW4gdGhlIG9iamVjdCBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgaWYgKGlzRGVuaWVkV3JpdGVQYXRoKGFkZHJlc3MsIHBhdGgsIGZpZWxkKSkgcmV0dXJuIG9iajtcbiAgdXBkYXRlVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGlzRGVuaWVkU2VnbWVudChrZXkpKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldE93blZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSA/IG9iamVjdFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19