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,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,178 +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 pathOps_js_1 = require("./pathOps.js");
21
- var equality_js_1 = require("./equality.js");
22
- Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return equality_js_1.deepEqual; } });
23
- var merge_js_1 = require("./merge.js");
24
- Object.defineProperty(exports, "deepSmartMerge", { enumerable: true, get: function () { return merge_js_1.deepSmartMerge; } });
25
- var paths_js_1 = require("./paths.js");
26
- Object.defineProperty(exports, "DELIM", { enumerable: true, get: function () { return paths_js_1.DELIM; } });
27
- Object.defineProperty(exports, "normalisePath", { enumerable: true, get: function () { return paths_js_1.normalisePath; } });
28
- Object.defineProperty(exports, "pathSegments", { enumerable: true, get: function () { return paths_js_1.pathSegments; } });
29
- var verbs_js_1 = require("./verbs.js");
30
- Object.defineProperty(exports, "applySmartMerge", { enumerable: true, get: function () { return verbs_js_1.applySmartMerge; } });
31
- Object.defineProperty(exports, "applySmartMergeInto", { enumerable: true, get: function () { return verbs_js_1.applySmartMergeInto; } });
32
- Object.defineProperty(exports, "dryFold", { enumerable: true, get: function () { return verbs_js_1.dryFold; } });
33
- Object.defineProperty(exports, "nextGeneration", { enumerable: true, get: function () { return verbs_js_1.nextGeneration; } });
34
- Object.defineProperty(exports, "supersededByNextSet", { enumerable: true, get: function () { return verbs_js_1.supersededByNextSet; } });
35
- /**
36
- * The two places a value at `path` can sit: under `address` (`runPath`, absent
37
- * for the root address `[]`) and at the root (`globalPath`). `address` is a
38
- * path prefix the caller computed — for the engine, a frame's run namespace
39
- * (`runAddress.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
40
- */
41
- function getRunAndGlobalPaths(address = [], path = []) {
42
- return {
43
- runPath: addressOf(address).length > 0 ? pathUnder(address, path) : undefined,
44
- globalPath: [...path],
45
- };
46
- }
47
- exports.getRunAndGlobalPaths = getRunAndGlobalPaths;
48
- /** An address is an array. A run id still passed in its place (C2) is refused, never spread into its characters. */
49
- function addressOf(address) {
50
- if (Array.isArray(address))
51
- return address;
52
- throw new TypeError(`footprintjs: an address is an array path prefix, got ${address === null ? 'null' : typeof address}`);
53
- }
54
- /**
55
- * `address` then `path`, as one new array. An index loop, because the double
56
- * spread `[...address, ...path]` costs twice as much and a frame builds one on
57
- * every read it serves from live state (a fork child reading a root key).
58
- */
59
- function pathUnder(address, path) {
60
- const out = new Array(address.length + path.length);
61
- for (let i = 0; i < address.length; i++)
62
- out[i] = address[i];
63
- for (let i = 0; i < path.length; i++)
64
- out[address.length + i] = path[i];
65
- return out;
66
- }
67
- /**
68
- * Refuse the WHOLE selector before creating a container or copying a generation.
69
- * The address's array contract is checked even when another selector is denied.
70
- * Payload keys are data, not selectors, and are deliberately not inspected.
71
- * @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
72
- */
73
- function isDeniedWritePath(address = [], path = [], field) {
74
- const prefix = addressOf(address);
75
- return prefix.some(pathOps_js_1.isDeniedSegment) || path.some(pathOps_js_1.isDeniedSegment) || (0, pathOps_js_1.isDeniedSegment)(field);
76
- }
77
- exports.isDeniedWritePath = isDeniedWritePath;
78
- /** Keep existing own-property behavior; a missing slot must not call an inherited setter. */
79
- function setOwnValue(object, key, value) {
80
- if (Object.prototype.hasOwnProperty.call(object, key)) {
81
- object[key] = value;
82
- }
83
- else {
84
- Object.defineProperty(object, key, { value, enumerable: true, writable: true, configurable: true });
85
- }
86
- }
87
- /**
88
- * The container at `address` + `path` inside `obj`, each missing one created
89
- * on the way: the one AT the address from `defaultValues` when given, every
90
- * other one empty. The one walk both nested writers share.
91
- */
92
- function containerAt(obj, address = [], path = [], defaultValues) {
93
- const segments = pathUnder(addressOf(address), path);
94
- let current = obj;
95
- for (let i = 0; i < segments.length; i++) {
96
- const key = segments[i];
97
- if (!Object.prototype.hasOwnProperty.call(current, key)) {
98
- setOwnValue(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
99
- }
100
- current = current[key];
101
- }
102
- return current;
103
- }
104
- /**
105
- * Sets a value at a nested path under `address`, creating intermediate objects as needed.
106
- * A denied address/path/field leaves `obj` unchanged, including its prototype.
107
- */
108
- function setNestedValue(obj, address, path, field, value, defaultValues) {
109
- if (isDeniedWritePath(address, path, field))
110
- return obj;
111
- setOwnValue(containerAt(obj, address, path, defaultValues), field, value);
112
- return obj;
113
- }
114
- exports.setNestedValue = setNestedValue;
115
- /**
116
- * Updates a value in the object at a nested path under `address`.
117
- * A denied address/path/field leaves `obj` unchanged, including its prototype.
118
- * - Arrays: concatenate
119
- * - Objects: shallow merge at each level
120
- * - Primitives: replace
121
- */
122
- function updateNestedValue(obj, address, path, field, value, defaultValues) {
123
- if (isDeniedWritePath(address, path, field))
124
- return obj;
125
- updateValue(containerAt(obj, address, path, defaultValues), field, value);
126
- return obj;
127
- }
128
- exports.updateNestedValue = updateNestedValue;
129
- /**
130
- * In-place value update with merge semantics.
131
- * - Arrays (non-empty): concatenate onto existing
132
- * - Arrays (empty): direct replace — writing `[]` clears the field
133
- * - Objects (non-empty): shallow merge (spread)
134
- * - Objects (empty): direct replace — writing `{}` clears the field
135
- * - Primitives: direct assignment
136
- *
137
- * Note on empty arrays: both `value && Array.isArray(value)` and
138
- * `Array.isArray(value)` evaluate the same for arrays — `[]` is truthy in
139
- * JavaScript, so the `&&` guard was never the issue. The actual bug was the
140
- * concat path: `[...cur, ...[]]` silently returned `cur` unchanged when `value`
141
- * was `[]`, making `updateValue(obj, 'tags', [])` a no-op instead of a clear.
142
- * The fix is the explicit `value.length === 0` early-return branch.
143
- */
144
- function updateValue(object, key, value) {
145
- if ((0, pathOps_js_1.isDeniedSegment)(key))
146
- return;
147
- if (Array.isArray(value)) {
148
- if (value.length === 0) {
149
- setOwnValue(object, key, value); // clear: [] replaces whatever was there
150
- }
151
- else {
152
- const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
153
- setOwnValue(object, key, cur === undefined ? value : [...cur, ...value]);
154
- }
155
- }
156
- else if (value && typeof value === 'object' && Object.keys(value).length) {
157
- const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
158
- setOwnValue(object, key, cur === undefined ? value : { ...cur, ...value });
159
- }
160
- else {
161
- setOwnValue(object, key, value);
162
- }
163
- }
164
- exports.updateValue = updateValue;
165
- /**
166
- * Gets a value at a nested path with prototype-pollution protection.
167
- */
168
- function getNestedValue(root, path, field) {
169
- const node = path && path.length > 0 ? (0, pathOps_js_1.nativeGet)(root, path) : root;
170
- if (field === undefined || node === undefined)
171
- return node;
172
- if (node !== null && typeof node === 'object' && Object.prototype.hasOwnProperty.call(node, field)) {
173
- return node[field];
174
- }
175
- return undefined;
176
- }
177
- exports.getNestedValue = getNestedValue;
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBa0U7QUFJbEUsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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QUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIG91dCBpbiA5LjMzLjA7IGl0IGlzIHRoZSByZWNvcmQncyBvd24sIGBzY3J1Yi50c2AgKEM0KS5cbiAqIFRoZSB3cml0ZXJzIHRha2UgYW4gQUREUkVTUywgYSBwYXRoIHByZWZpeCB0aGVpciBjYWxsZXIgY29tcHV0ZWQsIGFuZCBuZXZlclxuICogbmFtZSBvbmUgKEMyOiB0aGUgZW5naW5lIGRlY2lkZXMgd2hlcmUgYSBzdGFnZSB3cml0ZXMsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IGlzRGVuaWVkU2VnbWVudCwgbmF0aXZlR2V0IGFzIF9nZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgdGhlIFdIT0xFIHNlbGVjdG9yIGJlZm9yZSBjcmVhdGluZyBhIGNvbnRhaW5lciBvciBjb3B5aW5nIGEgZ2VuZXJhdGlvbi5cbiAqIFRoZSBhZGRyZXNzJ3MgYXJyYXkgY29udHJhY3QgaXMgY2hlY2tlZCBldmVuIHdoZW4gYW5vdGhlciBzZWxlY3RvciBpcyBkZW5pZWQuXG4gKiBQYXlsb2FkIGtleXMgYXJlIGRhdGEsIG5vdCBzZWxlY3RvcnMsIGFuZCBhcmUgZGVsaWJlcmF0ZWx5IG5vdCBpbnNwZWN0ZWQuXG4gKiBAaW50ZXJuYWwgU2hhcmVkIGJ5IHRoZSBuZXN0ZWQgd3JpdGVycyBhbmQgU2hhcmVkTWVtb3J5J3MgcHJlLWNvcHkgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbmllZFdyaXRlUGF0aChcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWZpeCA9IGFkZHJlc3NPZihhZGRyZXNzKTtcbiAgcmV0dXJuIHByZWZpeC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgcGF0aC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgaXNEZW5pZWRTZWdtZW50KGZpZWxkKTtcbn1cblxuLyoqIEtlZXAgZXhpc3Rpbmcgb3duLXByb3BlcnR5IGJlaGF2aW9yOyBhIG1pc3Npbmcgc2xvdCBtdXN0IG5vdCBjYWxsIGFuIGluaGVyaXRlZCBzZXR0ZXIuICovXG5mdW5jdGlvbiBzZXRPd25WYWx1ZShvYmplY3Q6IE5lc3RlZE9iamVjdCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBzZXRPd25WYWx1ZShjdXJyZW50LCBrZXksIGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9KTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICBzZXRPd25WYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogQSBkZW5pZWQgYWRkcmVzcy9wYXRoL2ZpZWxkIGxlYXZlcyBgb2JqYCB1bmNoYW5nZWQsIGluY2x1ZGluZyBpdHMgcHJvdG90eXBlLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoaXNEZW5pZWRTZWdtZW50KGtleSkpIHJldHVybjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgPyBvYmplY3Rba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=