footprintjs 10.0.1 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +61 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +62 -2
  5. package/dist/esm/index.js +13 -6
  6. package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
  7. package/dist/esm/lib/attempt/anySignal.js +39 -0
  8. package/dist/esm/lib/attempt/call.d.ts +88 -0
  9. package/dist/esm/lib/attempt/call.js +129 -0
  10. package/dist/esm/lib/attempt/category.d.ts +37 -0
  11. package/dist/esm/lib/attempt/category.js +131 -0
  12. package/dist/esm/lib/attempt/correlation.d.ts +95 -0
  13. package/dist/esm/lib/attempt/correlation.js +178 -0
  14. package/dist/esm/lib/attempt/deadline.d.ts +44 -0
  15. package/dist/esm/lib/attempt/deadline.js +101 -0
  16. package/dist/esm/lib/attempt/decision.d.ts +52 -0
  17. package/dist/esm/lib/attempt/decision.js +134 -0
  18. package/dist/esm/lib/attempt/effect.d.ts +76 -0
  19. package/dist/esm/lib/attempt/effect.js +160 -0
  20. package/dist/esm/lib/attempt/errors.d.ts +41 -0
  21. package/dist/esm/lib/attempt/errors.js +44 -0
  22. package/dist/esm/lib/attempt/index.d.ts +18 -0
  23. package/dist/esm/lib/attempt/index.js +15 -0
  24. package/dist/esm/lib/attempt/name.d.ts +21 -0
  25. package/dist/esm/lib/attempt/name.js +43 -0
  26. package/dist/esm/lib/attempt/observed.d.ts +66 -0
  27. package/dist/esm/lib/attempt/observed.js +171 -0
  28. package/dist/esm/lib/attempt/policy.d.ts +45 -0
  29. package/dist/esm/lib/attempt/policy.js +83 -0
  30. package/dist/esm/lib/attempt/record.d.ts +11 -0
  31. package/dist/esm/lib/attempt/record.js +24 -0
  32. package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
  33. package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
  34. package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
  35. package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
  36. package/dist/esm/lib/attempt/runner.d.ts +157 -0
  37. package/dist/esm/lib/attempt/runner.js +523 -0
  38. package/dist/esm/lib/attempt/standalone.d.ts +47 -0
  39. package/dist/esm/lib/attempt/standalone.js +126 -0
  40. package/dist/esm/lib/attempt/types.d.ts +453 -0
  41. package/dist/esm/lib/attempt/types.js +16 -0
  42. package/dist/esm/lib/budget/index.d.ts +9 -0
  43. package/dist/esm/lib/budget/index.js +9 -0
  44. package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
  45. package/dist/esm/lib/budget/timeBudget.js +666 -0
  46. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
  47. package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
  48. package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
  49. package/dist/esm/lib/builder/retryLoop.js +283 -0
  50. package/dist/esm/lib/builder/types.d.ts +35 -1
  51. package/dist/esm/lib/builder/types.js +1 -1
  52. package/dist/esm/lib/decide/decide.js +2 -2
  53. package/dist/esm/lib/decide/index.d.ts +1 -1
  54. package/dist/esm/lib/decide/index.js +2 -2
  55. package/dist/esm/lib/decide/types.d.ts +3 -0
  56. package/dist/esm/lib/decide/types.js +1 -8
  57. package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
  58. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  59. package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
  60. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  61. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  62. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  63. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  64. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  65. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  66. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
  67. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  68. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  69. package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
  70. package/dist/esm/lib/engine/handlers/stageError.js +23 -1
  71. package/dist/esm/lib/engine/index.d.ts +2 -2
  72. package/dist/esm/lib/engine/index.js +1 -1
  73. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  74. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  75. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  76. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  77. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  78. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  79. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  80. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  81. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  82. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  83. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  84. package/dist/esm/lib/engine/narrative/index.js +1 -1
  85. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  86. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  87. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  88. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  89. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  90. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  91. package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
  92. package/dist/esm/lib/engine/narrative/types.js +1 -1
  93. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  94. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
  95. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  96. package/dist/esm/lib/engine/traversalContext.js +6 -3
  97. package/dist/esm/lib/engine/types.d.ts +52 -57
  98. package/dist/esm/lib/engine/types.js +1 -1
  99. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  100. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  101. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  102. package/dist/esm/lib/filter/evaluator.js +135 -0
  103. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  104. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  105. package/dist/esm/lib/memory/StageContext.d.ts +123 -3
  106. package/dist/esm/lib/memory/StageContext.js +245 -4
  107. package/dist/esm/lib/memory/attention.d.ts +26 -0
  108. package/dist/esm/lib/memory/attention.js +171 -0
  109. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  110. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  111. package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
  112. package/dist/esm/lib/memory/frameTypes.js +3 -1
  113. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  114. package/dist/esm/lib/memory/redaction.js +54 -5
  115. package/dist/esm/lib/pause/record.js +10 -1
  116. package/dist/esm/lib/pause/types.d.ts +19 -0
  117. package/dist/esm/lib/pause/types.js +17 -1
  118. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  119. package/dist/esm/lib/reactive/types.d.ts +36 -4
  120. package/dist/esm/lib/reactive/types.js +3 -1
  121. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  122. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  123. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
  124. package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
  125. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  126. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  127. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  128. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  129. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  130. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  131. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  132. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  133. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  134. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  135. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  136. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  137. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  138. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  139. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  140. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  141. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  142. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  143. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  144. package/dist/esm/lib/recorder/hooks.js +4 -1
  145. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  146. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  147. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  148. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
  149. package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
  150. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  151. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  152. package/dist/esm/lib/runner/attach.d.ts +2 -1
  153. package/dist/esm/lib/runner/attach.js +8 -2
  154. package/dist/esm/lib/runner/checkpoint.js +3 -1
  155. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  156. package/dist/esm/lib/runner/deadline.js +90 -0
  157. package/dist/esm/lib/runner/index.d.ts +3 -1
  158. package/dist/esm/lib/runner/index.js +2 -1
  159. package/dist/esm/lib/runner/options.d.ts +17 -0
  160. package/dist/esm/lib/runner/options.js +3 -1
  161. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  162. package/dist/esm/lib/runner/recordSink.js +296 -0
  163. package/dist/esm/lib/runner/resume.d.ts +3 -0
  164. package/dist/esm/lib/runner/resume.js +22 -2
  165. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  166. package/dist/esm/lib/runner/snapshot.js +6 -2
  167. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  168. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  169. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  170. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  171. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  172. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  173. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  174. package/dist/esm/lib/scope/runtime.js +1 -1
  175. package/dist/esm/lib/scope/types.d.ts +6 -0
  176. package/dist/esm/lib/scope/types.js +1 -1
  177. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  178. package/dist/esm/lib/sinks/fileSink.js +387 -0
  179. package/dist/esm/recorders.d.ts +8 -2
  180. package/dist/esm/recorders.js +7 -1
  181. package/dist/esm/sinks.d.ts +23 -0
  182. package/dist/esm/sinks.js +23 -0
  183. package/dist/esm/trace.d.ts +2 -2
  184. package/dist/esm/trace.js +1 -1
  185. package/dist/index.js +77 -60
  186. package/dist/lib/attempt/anySignal.js +43 -0
  187. package/dist/lib/attempt/call.js +134 -0
  188. package/dist/lib/attempt/category.js +136 -0
  189. package/dist/lib/attempt/correlation.js +186 -0
  190. package/dist/lib/attempt/deadline.js +112 -0
  191. package/dist/lib/attempt/decision.js +139 -0
  192. package/dist/lib/attempt/effect.js +174 -0
  193. package/dist/lib/attempt/errors.js +49 -0
  194. package/dist/lib/attempt/index.js +26 -0
  195. package/dist/lib/attempt/name.js +48 -0
  196. package/dist/lib/attempt/observed.js +177 -0
  197. package/dist/lib/attempt/policy.js +92 -0
  198. package/dist/lib/attempt/record.js +29 -0
  199. package/dist/lib/attempt/retryLoopContext.js +31 -0
  200. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  201. package/dist/lib/attempt/runner.js +530 -0
  202. package/dist/lib/attempt/standalone.js +130 -0
  203. package/dist/lib/attempt/types.js +17 -0
  204. package/dist/lib/budget/index.js +17 -0
  205. package/dist/lib/budget/timeBudget.js +674 -0
  206. package/dist/lib/builder/FlowChartBuilder.js +199 -9
  207. package/dist/lib/builder/retryLoop.js +287 -0
  208. package/dist/lib/builder/types.js +1 -1
  209. package/dist/lib/decide/decide.js +2 -2
  210. package/dist/lib/decide/index.js +2 -2
  211. package/dist/lib/decide/types.js +1 -8
  212. package/dist/lib/engine/graph/StageNode.js +1 -1
  213. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  214. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  215. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  216. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  217. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  218. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  219. package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
  220. package/dist/lib/engine/handlers/commitStage.js +24 -5
  221. package/dist/lib/engine/handlers/stageError.js +26 -2
  222. package/dist/lib/engine/index.js +1 -1
  223. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  224. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  225. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  226. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  227. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  228. package/dist/lib/engine/narrative/index.js +1 -1
  229. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  230. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  231. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  232. package/dist/lib/engine/narrative/types.js +1 -1
  233. package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
  234. package/dist/lib/engine/traversalContext.js +6 -3
  235. package/dist/lib/engine/types.js +1 -1
  236. package/dist/lib/errors/terminalFailure.js +64 -0
  237. package/dist/lib/filter/evaluator.js +139 -0
  238. package/dist/lib/ids/idempotencyKey.js +28 -0
  239. package/dist/lib/memory/StageContext.js +246 -5
  240. package/dist/lib/memory/attention.js +175 -0
  241. package/dist/lib/memory/borrowedMutation.js +16 -2
  242. package/dist/lib/memory/frameTypes.js +3 -1
  243. package/dist/lib/memory/redaction.js +54 -5
  244. package/dist/lib/pause/record.js +10 -1
  245. package/dist/lib/pause/types.js +17 -1
  246. package/dist/lib/reactive/createTypedScope.js +3 -1
  247. package/dist/lib/reactive/types.js +3 -1
  248. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  249. package/dist/lib/recorder/ControlDepRecorder.js +50 -2
  250. package/dist/lib/recorder/EmitRecorder.js +1 -1
  251. package/dist/lib/recorder/InOutRecorder.js +75 -6
  252. package/dist/lib/recorder/QualityRecorder.js +87 -29
  253. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  254. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  255. package/dist/lib/recorder/attemptMetrics.js +174 -0
  256. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  257. package/dist/lib/recorder/attemptOTel.js +111 -0
  258. package/dist/lib/recorder/attemptSeries.js +113 -0
  259. package/dist/lib/recorder/hooks.js +4 -1
  260. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  261. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  262. package/dist/lib/runner/FlowChartExecutor.js +330 -101
  263. package/dist/lib/runner/RunnableChart.js +5 -1
  264. package/dist/lib/runner/attach.js +8 -2
  265. package/dist/lib/runner/checkpoint.js +3 -1
  266. package/dist/lib/runner/deadline.js +94 -0
  267. package/dist/lib/runner/index.js +4 -2
  268. package/dist/lib/runner/options.js +3 -1
  269. package/dist/lib/runner/recordSink.js +302 -0
  270. package/dist/lib/runner/resume.js +22 -2
  271. package/dist/lib/runner/snapshot.js +6 -2
  272. package/dist/lib/scope/ScopeFacade.js +303 -6
  273. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  274. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  275. package/dist/lib/scope/runtime.js +1 -1
  276. package/dist/lib/scope/types.js +1 -1
  277. package/dist/lib/sinks/fileSink.js +392 -0
  278. package/dist/recorders.js +10 -2
  279. package/dist/sinks.js +32 -0
  280. package/dist/trace.js +1 -1
  281. package/dist/types/index.d.ts +62 -2
  282. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  283. package/dist/types/lib/attempt/call.d.ts +88 -0
  284. package/dist/types/lib/attempt/category.d.ts +37 -0
  285. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  286. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  287. package/dist/types/lib/attempt/decision.d.ts +52 -0
  288. package/dist/types/lib/attempt/effect.d.ts +76 -0
  289. package/dist/types/lib/attempt/errors.d.ts +41 -0
  290. package/dist/types/lib/attempt/index.d.ts +18 -0
  291. package/dist/types/lib/attempt/name.d.ts +21 -0
  292. package/dist/types/lib/attempt/observed.d.ts +66 -0
  293. package/dist/types/lib/attempt/policy.d.ts +45 -0
  294. package/dist/types/lib/attempt/record.d.ts +11 -0
  295. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  296. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  297. package/dist/types/lib/attempt/runner.d.ts +157 -0
  298. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  299. package/dist/types/lib/attempt/types.d.ts +453 -0
  300. package/dist/types/lib/budget/index.d.ts +9 -0
  301. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  302. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  303. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  304. package/dist/types/lib/builder/types.d.ts +35 -1
  305. package/dist/types/lib/decide/index.d.ts +1 -1
  306. package/dist/types/lib/decide/types.d.ts +3 -0
  307. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  308. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  309. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  310. package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
  311. package/dist/types/lib/engine/index.d.ts +2 -2
  312. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  313. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  314. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  315. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  316. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  317. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  318. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  319. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  320. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  321. package/dist/types/lib/engine/narrative/types.d.ts +74 -5
  322. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  323. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  324. package/dist/types/lib/engine/types.d.ts +52 -57
  325. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  326. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  327. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  328. package/dist/types/lib/memory/StageContext.d.ts +123 -3
  329. package/dist/types/lib/memory/attention.d.ts +26 -0
  330. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  331. package/dist/types/lib/memory/frameTypes.d.ts +38 -0
  332. package/dist/types/lib/memory/redaction.d.ts +12 -0
  333. package/dist/types/lib/pause/types.d.ts +19 -0
  334. package/dist/types/lib/reactive/types.d.ts +36 -4
  335. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  336. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
  337. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  338. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  339. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  340. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  341. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  342. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  343. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  344. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  345. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  346. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  347. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  348. package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
  349. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  350. package/dist/types/lib/runner/attach.d.ts +2 -1
  351. package/dist/types/lib/runner/deadline.d.ts +42 -0
  352. package/dist/types/lib/runner/index.d.ts +3 -1
  353. package/dist/types/lib/runner/options.d.ts +17 -0
  354. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  355. package/dist/types/lib/runner/resume.d.ts +3 -0
  356. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  357. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  358. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  359. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  360. package/dist/types/lib/scope/runtime.d.ts +3 -0
  361. package/dist/types/lib/scope/types.d.ts +6 -0
  362. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  363. package/dist/types/recorders.d.ts +8 -2
  364. package/dist/types/sinks.d.ts +23 -0
  365. package/dist/types/trace.d.ts +2 -2
  366. package/package.json +20 -6
  367. package/dist/esm/lib/decide/evaluator.js +0 -130
  368. package/dist/lib/decide/evaluator.js +0 -134
@@ -15,10 +15,16 @@
15
15
  * three primitive channels, one live graph, queryable at any moment during
16
16
  * or after a run.
17
17
  *
18
- * What it records — THREE node kinds for complete composition coverage:
18
+ * What it records — FOUR node kinds for complete composition coverage:
19
19
  * 1. 'subflow' — via onSubflowEntry (a mounted subflow boundary)
20
20
  * 2. 'fork-branch' — via onFork (one node per child, synthesized)
21
21
  * 3. 'decision-branch' — via onDecision (the chosen branch, synthesized)
22
+ * 4. 'attempt-series' — via onAttempt (10.1): a stage execution that
23
+ * RETRIED, GAVE UP or TIMED OUT (`recorder/attemptSeries.ts · isRetryEvidence`), with its
24
+ * `attemptSummary` and its ordered `attempts`. A retry is a loop, so each
25
+ * retry decision is a self-edge of kind 'retry' on the node — the way
26
+ * onLoop draws 'loop-iteration'. A stage that ran once (with or without a
27
+ * policy) is no node, as before.
22
28
  *
23
29
  * When a fork-branch or decision-branch target IS ALSO a subflow, the
24
30
  * subsequent onSubflowEntry creates a subflow CHILD of the synthetic node.
@@ -48,6 +54,7 @@
48
54
  * topo.getSubflowNodes(); // only mounted subflows
49
55
  * ```
50
56
  */
57
+ import { AttemptSeriesBook, subflowOfAttempt } from './attemptSeries.js';
51
58
  let _counter = 0;
52
59
  /**
53
60
  * Factory — matches the `narrative()` / `metrics()` style.
@@ -86,6 +93,10 @@ export class TopologyRecorder {
86
93
  * TopologyRecorder is supposed to expose.
87
94
  */
88
95
  previousSubflowInScope = new Map();
96
+ /** Open subflow node id by its path-prefixed subflowId — where a stage's attempt series hangs. */
97
+ openSubflowByPath = new Map();
98
+ /** Per-series tallies of the series that are evidence (retried, gave up or timed out). */
99
+ attemptBook = new AttemptSeriesBook();
89
100
  constructor(options = {}) {
90
101
  this.id = options.id ?? `topology-${++_counter}`;
91
102
  }
@@ -172,11 +183,15 @@ export class TopologyRecorder {
172
183
  }
173
184
  }
174
185
  this.subflowStack.push(nodeId);
186
+ this.openSubflowByPath.set(subflowId, nodeId);
175
187
  }
176
188
  onSubflowExit(event) {
177
189
  const nodeId = this.subflowStack.pop();
178
190
  if (!nodeId)
179
191
  return;
192
+ if (event.subflowId && this.openSubflowByPath.get(event.subflowId) === nodeId) {
193
+ this.openSubflowByPath.delete(event.subflowId);
194
+ }
180
195
  const node = this.nodesById.get(nodeId);
181
196
  const exitedAt = event.traversalContext?.runtimeStageId ?? '';
182
197
  if (node) {
@@ -267,6 +282,63 @@ export class TopologyRecorder {
267
282
  at: event.traversalContext?.runtimeStageId ?? '',
268
283
  });
269
284
  }
285
+ onAttempt(event) {
286
+ const state = this.attemptBook.add(event.record);
287
+ if (!state)
288
+ return;
289
+ const nodeId = `attempts-${state.series}`;
290
+ const existing = this.nodesById.get(nodeId);
291
+ const placed = existing ?? this.placeSeries(event, nodeId);
292
+ const node = {
293
+ ...placed,
294
+ attempts: state.attempts,
295
+ ...(state.summary !== undefined ? { attemptSummary: state.summary } : {}),
296
+ };
297
+ if (!existing)
298
+ this.nodeOrder.push(nodeId);
299
+ this.nodesById.set(nodeId, node);
300
+ if (event.record.next === 'retry') {
301
+ this.edges.push({ from: nodeId, to: nodeId, kind: 'retry', at: state.series });
302
+ }
303
+ }
304
+ /**
305
+ * A new series node, under its parent: the pending fork-branch / decision-
306
+ * branch of the same name (a fork child or a chosen branch that is a plain
307
+ * stage), else the open subflow the stage runs in (read off its
308
+ * runtimeStageId — the stack top can be a parallel sibling), else the top
309
+ * level. One edge from
310
+ * the parent, as for every composition child.
311
+ */
312
+ placeSeries(event, nodeId) {
313
+ const at = event.record.series;
314
+ let parentId;
315
+ const pendingFork = this.pendingForkByName.get(event.stageName);
316
+ if (pendingFork) {
317
+ parentId = pendingFork.nodeId;
318
+ this.pendingForkByName.delete(event.stageName);
319
+ }
320
+ else if (this.pendingDecision && this.pendingDecision.name === event.stageName) {
321
+ parentId = this.pendingDecision.nodeId;
322
+ this.pendingDecision = undefined;
323
+ }
324
+ else {
325
+ const path = subflowOfAttempt(event);
326
+ parentId = path !== undefined ? this.openSubflowByPath.get(path) : undefined;
327
+ }
328
+ const incomingKind = parentId ? 'next' : 'root';
329
+ if (parentId)
330
+ this.edges.push({ from: parentId, to: nodeId, kind: 'next', at });
331
+ return {
332
+ id: nodeId,
333
+ kind: 'attempt-series',
334
+ name: event.stageName,
335
+ parentId,
336
+ depth: parentId ? this.nodesById.get(parentId).depth + 1 : 0,
337
+ incomingKind,
338
+ enteredAt: at,
339
+ metadata: { stageId: event.stageId },
340
+ };
341
+ }
270
342
  /** Called by the executor before each `run()` — resets all state. */
271
343
  clear() {
272
344
  this.nodesById.clear();
@@ -275,6 +347,8 @@ export class TopologyRecorder {
275
347
  this.subflowStack.length = 0;
276
348
  this.pendingForkByName.clear();
277
349
  this.previousSubflowInScope.clear();
350
+ this.openSubflowByPath.clear();
351
+ this.attemptBook.clear();
278
352
  this.pendingDecision = undefined;
279
353
  }
280
354
  // ── Query API ─────────────────────────────────────────────────────────
@@ -319,4 +393,4 @@ export class TopologyRecorder {
319
393
  };
320
394
  }
321
395
  }
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ3lSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQTJFSCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsVUFBbUMsRUFBRTtJQUNwRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLEVBQUUsQ0FBUztJQUVILFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUM1QyxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssR0FBbUIsRUFBRSxDQUFDO0lBQzVDLCtFQUErRTtJQUM5RCxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBRTdDOzhDQUMwQztJQUN6QixpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRSw0RUFBNEU7SUFDcEUsZUFBZSxDQUFtQztJQUMxRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDYyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUVsRyxZQUFZLFVBQW1DLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFLGNBQWMsQ0FBQyxLQUF1QjtRQUNwQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxDQUFDLDZCQUE2QjtRQUVyRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUUvRCxzRUFBc0U7UUFDdEUsOENBQThDO1FBQzlDLElBQUksUUFBNEIsQ0FBQztRQUNqQyxJQUFJLFlBQWtDLENBQUM7UUFFdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUM5QixZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsaURBQWlEO1lBQ3hFLHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1RSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDdkMsWUFBWSxHQUFHLE1BQU0sQ0FBQztZQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNELFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzVDLENBQUM7UUFFRCxzRUFBc0U7UUFDdEUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BELE1BQU0sR0FBRyxHQUFHLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFcEYsTUFBTSxJQUFJLEdBQWlCO1lBQ3pCLEVBQUUsRUFBRSxNQUFNO1lBQ1YsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsUUFBUTtZQUNSLEtBQUs7WUFDTCxZQUFZO1lBQ1osU0FBUztZQUNULFFBQVE7U0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVCLElBQUksUUFBUSxJQUFJLFlBQVksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxFQUFFLEVBQUUsTUFBTTtnQkFDVixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsRUFBRSxFQUFFLFNBQVM7YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsNkRBQTZEO1FBQzdELEVBQUU7UUFDRiwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLG1FQUFtRTtRQUNuRSxpRUFBaUU7UUFDakUsa0VBQWtFO1FBQ2xFLGdFQUFnRTtRQUNoRSxrQ0FBa0M7UUFDbEMsRUFBRTtRQUNGLGtFQUFrRTtRQUNsRSxpRUFBaUU7UUFDakUsOENBQThDO1FBQzlDLElBQUksWUFBWSxLQUFLLE1BQU0sSUFBSSxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdkQsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ2QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNO29CQUNyQixFQUFFLEVBQUUsTUFBTTtvQkFDVixJQUFJLEVBQUUsTUFBTTtvQkFDWixFQUFFLEVBQUUsU0FBUztpQkFDZCxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBdUI7UUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDOUQsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLDZEQUE2RDtZQUM3RCwrREFBK0Q7WUFDL0QsOERBQThEO1lBQzlELDBEQUEwRDtZQUMxRCw2Q0FBNkM7WUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0Qsb0VBQW9FO1FBQ3BFLG1FQUFtRTtRQUNuRSw0REFBNEQ7UUFDNUQsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ2pDLG1FQUFtRTtRQUNuRSxtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ2xFLG9FQUFvRTtJQUN0RSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQW9CO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckUsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUvQixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksR0FBaUI7Z0JBQ3pCLEVBQUUsRUFBRSxNQUFNO2dCQUNWLElBQUksRUFBRSxhQUFhO2dCQUNuQixJQUFJLEVBQUUsU0FBUztnQkFDZixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsS0FBSztnQkFDTCxZQUFZLEVBQUUsYUFBYTtnQkFDM0IsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUU7YUFDdkMsQ0FBQztZQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBd0I7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFFakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakUsTUFBTSxRQUFRLEdBQTRCLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyRSxJQUFJLEtBQUssQ0FBQyxTQUFTO1lBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQzFELElBQUksS0FBSyxDQUFDLFdBQVc7WUFBRSxRQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFFaEUsTUFBTSxJQUFJLEdBQWlCO1lBQ3pCLEVBQUUsRUFBRSxNQUFNO1lBQ1YsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDbEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsS0FBSztZQUNMLFlBQVksRUFBRSxpQkFBaUI7WUFDL0IsU0FBUyxFQUFFLEVBQUU7WUFDYixRQUFRO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFvQjtRQUN6QiwwRUFBMEU7UUFDMUUsNkVBQTZFO1FBQzdFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxFQUFFLEVBQUUsUUFBUTtZQUNaLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLElBQUksRUFBRTtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSwwRUFBMEU7SUFDMUUsV0FBVztRQUNULE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDO1FBQ2xFLE9BQU87WUFDTCxLQUFLO1lBQ0wsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3RCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUk7WUFDckUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxXQUFXLENBQUMsTUFBYztRQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLFNBQVMsQ0FBQyxJQUFzQjtRQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzt3Q0FFb0M7SUFDcEMsbUJBQW1CLENBQUMsTUFBYztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLFVBQVU7UUFDUixPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVU7WUFDaEIsV0FBVyxFQUFFLHlFQUF5RTtZQUN0RixrQkFBa0IsRUFBRSxXQUFvQjtZQUN4QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtTQUN6QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb3BvbG9neVJlY29yZGVyIOKAlCBjb21wb3NpdGlvbiBncmFwaCBidWlsdCBkdXJpbmcgdHJhdmVyc2FsLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgZm9vdHByaW50anMgZmlyZXMgYXRvbWljIGZsb3cgZXZlbnRzIChvblN1YmZsb3dFbnRyeSwgb25Gb3JrLCBvbkRlY2lzaW9uLFxuICogICBvbkxvb3ApIGJ1dCB0aGUgYWNjdW11bGF0ZWQgKnNoYXBlKiBvZiBhIHJ1biDigJQgd2hvIG5lc3RzIGluc2lkZSB3aG9tLFxuICogICB3aGljaCBub2RlcyBhcmUgcGFyYWxsZWwgc2libGluZ3MgdnMgYnJhbmNoZXMgb2YgYSBkZWNpc2lvbiDigJQgaXMgb25seVxuICogICB2aXNpYmxlIHBvc3QtcnVuIHZpYSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgdHJlZS13YWxraW5nLlxuICpcbiAqICAgU3RyZWFtaW5nIGNvbnN1bWVycyAobGl2ZSBVSXMsIGluLWZsaWdodCBkZWJ1Z2dlcnMpIHNlZSBvbmx5IHRoZSBldmVudFxuICogICBzdHJlYW0uIEV2ZXJ5IHN1Y2ggY29uc3VtZXIgaGFzIHRvIHJlYnVpbGQgc3ViZmxvdy1zdGFjayArIGZvcmstbWFwICtcbiAqICAgZGVjaXNpb24tdHJhY2tlciBmcm9tIHNjcmF0Y2gsIHVzdWFsbHkgc2xpZ2h0bHkgd3JvbmcgaW4gZGlmZmVyZW50IHdheXMuXG4gKlxuICogICBUb3BvbG9neVJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBhY2N1bXVsYXRvcjogb25lIHN1YnNjcmlwdGlvbiB0byB0aGVcbiAqICAgdGhyZWUgcHJpbWl0aXZlIGNoYW5uZWxzLCBvbmUgbGl2ZSBncmFwaCwgcXVlcnlhYmxlIGF0IGFueSBtb21lbnQgZHVyaW5nXG4gKiAgIG9yIGFmdGVyIGEgcnVuLlxuICpcbiAqIFdoYXQgaXQgcmVjb3JkcyDigJQgVEhSRUUgbm9kZSBraW5kcyBmb3IgY29tcGxldGUgY29tcG9zaXRpb24gY292ZXJhZ2U6XG4gKiAgIDEuICdzdWJmbG93JyAgICAgICAgICDigJQgdmlhIG9uU3ViZmxvd0VudHJ5IChhIG1vdW50ZWQgc3ViZmxvdyBib3VuZGFyeSlcbiAqICAgMi4gJ2ZvcmstYnJhbmNoJyAgICAgIOKAlCB2aWEgb25Gb3JrIChvbmUgbm9kZSBwZXIgY2hpbGQsIHN5bnRoZXNpemVkKVxuICogICAzLiAnZGVjaXNpb24tYnJhbmNoJyAg4oCUIHZpYSBvbkRlY2lzaW9uICh0aGUgY2hvc2VuIGJyYW5jaCwgc3ludGhlc2l6ZWQpXG4gKlxuICogICBXaGVuIGEgZm9yay1icmFuY2ggb3IgZGVjaXNpb24tYnJhbmNoIHRhcmdldCBJUyBBTFNPIGEgc3ViZmxvdywgdGhlXG4gKiAgIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgY3JlYXRlcyBhIHN1YmZsb3cgQ0hJTEQgb2YgdGhlIHN5bnRoZXRpYyBub2RlLlxuICogICBUaGUgbGF5ZXJlZCBzaGFwZSBwcmVzZXJ2ZXMgYm90aCBcIndobyBicmFuY2hlZFwiIGFuZCBcIndoYXQgdGhlIGJyYW5jaCByYW4uXCJcbiAqXG4gKiAgIFBsYWluIHNlcXVlbnRpYWwgc3RhZ2VzIGFyZSBOT1Qgbm9kZXMg4oCUIHRoYXQncyBTdGFnZUNvbnRleHQncyBqb2IuXG4gKiAgIFRvcG9sb2d5IGlzIGEgZ3JhcGggb2YgY29udHJvbC1mbG93IGJyYW5jaGluZywgbm90IGEgZnVsbCBleGVjdXRpb24gdHJlZS5cbiAqXG4gKiBFZGdlczpcbiAqICAgT25lIGVkZ2UgcGVyIHRyYXZlcnNhbCB0cmFuc2l0aW9uIOKAlCBga2luZGAgbWF0Y2hlcyB0aGUgY2hpbGQnc1xuICogICBgaW5jb21pbmdLaW5kYC4gQSBjb25zdW1lciByZW5kZXJpbmcgXCJwYXJhbGxlbCBjb2x1bW5zXCIgZmlsdGVycyBlZGdlc1xuICogICB3aGVyZSBga2luZCA9PT0gJ2ZvcmstYnJhbmNoJ2Agc2hhcmluZyB0aGUgc2FtZSBgZnJvbWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgdG9wbyA9IHRvcG9sb2d5UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodG9wbyk7ICAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzLCBhY3RpdmVOb2RlSWQsIHJvb3RJZCB9ID0gdG9wby5nZXRUb3BvbG9neSgpO1xuICogLy8gQ29uc3VtZXIgcXVlcmllczpcbiAqIHRvcG8uZ2V0Q2hpbGRyZW4oJ3NmLXBhcmVudCcpOyAgICAgICAgICAgICAgLy8gZGlyZWN0IGNoaWxkcmVuIChhbnkga2luZClcbiAqIHRvcG8uZ2V0QnlLaW5kKCdmb3JrLWJyYW5jaCcpOyAgICAgICAgICAgICAgLy8gYWxsIHBhcmFsbGVsIGJyYW5jaGVzXG4gKiB0b3BvLmdldFN1YmZsb3dOb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbW91bnRlZCBzdWJmbG93c1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcblxuLyoqIFRoZSBraW5kIG9mIGNvbXBvc2l0aW9uIHVuaXQgYSBub2RlIHJlcHJlc2VudHMuICovXG5leHBvcnQgdHlwZSBUb3BvbG9neU5vZGVLaW5kID0gJ3N1YmZsb3cnIHwgJ2ZvcmstYnJhbmNoJyB8ICdkZWNpc2lvbi1icmFuY2gnO1xuXG4vKiogSG93IHRoZSB0cmF2ZXJzYWwgcmVhY2hlZCB0aGlzIG5vZGUg4oCUIGRyaXZlcyBjb25zdW1lciBsYXlvdXQgZGVjaXNpb25zLiAqL1xuZXhwb3J0IHR5cGUgVG9wb2xvZ3lJbmNvbWluZ0tpbmQgPSAncm9vdCcgfCAnbmV4dCcgfCAnZm9yay1icmFuY2gnIHwgJ2RlY2lzaW9uLWJyYW5jaCcgfCAnbG9vcC1pdGVyYXRpb24nO1xuXG4vKiogQSBjb21wb3NpdGlvbi1zaWduaWZpY2FudCBwb2ludCBpbiB0aGUgZ3JhcGguICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5Tm9kZSB7XG4gIC8qKiBVbmlxdWUgaWQuIFN1YmZsb3dzIHVzZSB0aGVpciBzdWJmbG93SWQgKHdpdGggYCNuYCBzdWZmaXggb24gcmUtZW50cnkpLlxuICAgKiAgU3ludGhldGljIG5vZGVzIChmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLWJyYW5jaCkgdXNlXG4gICAqICBgZm9yay0ke3J1bnRpbWVTdGFnZUlkfS0ke2l9LSR7Y2hpbGROYW1lfWAgLyBgZGVjaXNpb24tJHtydW50aW1lU3RhZ2VJZH0tJHtjaG9zZW59YCBmb3JtLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGlzIG5vZGUgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkga2luZDogVG9wb2xvZ3lOb2RlS2luZDtcbiAgLyoqIERpc3BsYXkgbmFtZS4gRm9yIHN1YmZsb3dzOiBgRmxvd1N1YmZsb3dFdmVudC5uYW1lYC4gRm9yIGZvcmstYnJhbmNoZXM6XG4gICAqICB0aGUgY2hpbGQgbmFtZSBmcm9tIGBGbG93Rm9ya0V2ZW50LmNoaWxkcmVuYC4gRm9yIGRlY2lzaW9uLWJyYW5jaGVzOlxuICAgKiAgdGhlIGNob3NlbiBuYW1lIGZyb20gYEZsb3dEZWNpc2lvbkV2ZW50LmNob3NlbmAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBub2RlIGlkLiBVbmRlZmluZWQgd2hlbiB0aGlzIG5vZGUgc2l0cyBhdCB0aGUgcnVuJ3MgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBwYXJlbnRJZD86IHN0cmluZztcbiAgLyoqIERlcHRoIGluIHRoZSB0b3BvbG9neSB0cmVlICgwID0gdG9wLWxldmVsKS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgdHJhdmVyc2FsIHJlYWNoZWQgdGhpcyBub2RlLiAqL1xuICByZWFkb25seSBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuICAvKiogcnVudGltZVN0YWdlSWQgYXQgdGhlIG1vbWVudCB0aGUgbm9kZSB3YXMgY3JlYXRlZC4gKi9cbiAgcmVhZG9ubHkgZW50ZXJlZEF0OiBzdHJpbmc7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN1YmZsb3cgZXhpdGVkLiBPbmx5IG1lYW5pbmdmdWxcbiAgICogIGZvciBraW5kPSdzdWJmbG93JzsgZm9yay9kZWNpc2lvbi1icmFuY2ggbm9kZXMgYXJlIGluc3RhbnRhbmVvdXMuICovXG4gIGV4aXRlZEF0Pzogc3RyaW5nO1xuICAvKiogS2luZC1zcGVjaWZpYyBleHRyYXM6IGZvcmtQYXJlbnQsIGRlY2lkZXIsIHJhdGlvbmFsZSwgZGVzY3JpcHRpb24uICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogQSB0cmF2ZXJzYWwgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byBub2Rlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9wb2xvZ3lFZGdlIHtcbiAgcmVhZG9ubHkgZnJvbTogc3RyaW5nO1xuICByZWFkb25seSB0bzogc3RyaW5nO1xuICByZWFkb25seSBraW5kOiBFeGNsdWRlPFRvcG9sb2d5SW5jb21pbmdLaW5kLCAncm9vdCc+O1xuICByZWFkb25seSBhdDogc3RyaW5nO1xufVxuXG4vKiogU25hcHNob3Qgb2YgdGhlIGNvbXBvc2l0aW9uIGdyYXBoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BvbG9neSB7XG4gIHJlYWRvbmx5IG5vZGVzOiBSZWFkb25seUFycmF5PFRvcG9sb2d5Tm9kZT47XG4gIHJlYWRvbmx5IGVkZ2VzOiBSZWFkb25seUFycmF5PFRvcG9sb2d5RWRnZT47XG4gIC8qKiBDdXJyZW50bHktYWN0aXZlIHN1YmZsb3cgKHRvcCBvZiB0aGUgc3ViZmxvdyBzdGFjaykuIEZvcmstYnJhbmNoIGFuZFxuICAgKiAgZGVjaXNpb24tYnJhbmNoIG5vZGVzIGFyZSBpbnN0YW50YW5lb3VzIOKAlCB0aGV5IGRvbid0IGFmZmVjdCBhY3RpdmVOb2RlSWQuICovXG4gIHJlYWRvbmx5IGFjdGl2ZU5vZGVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZpcnN0IG5vZGUgaW5zZXJ0ZWQuIG51bGwgYmVmb3JlIGFueSBjb21wb3NpdGlvbiBldmVudCBmaXJlcy4gKi9cbiAgcmVhZG9ubHkgcm9vdElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGB0b3BvbG9neS1OYCAoYXV0by1pbmNyZW1lbnRlZCkuICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG4vLyBDb3JyZWxhdGlvbiBzdGF0ZTogbWFwcyBhIHBlbmRpbmcgZm9yay9kZWNpc2lvbiBjaGlsZCBuYW1lIHRvIGl0cyBzeW50aGV0aWNcbi8vIG5vZGUgaWQsIHNvIGEgc3Vic2VxdWVudCBvblN1YmZsb3dFbnRyeSBtYXRjaGluZyB0aGF0IG5hbWUgY2FuIGJlIG5lc3RlZFxuLy8gdW5kZXIgdGhlIHN5bnRoZXRpYyBub2RlIChyYXRoZXIgdGhhbiBjcmVhdGluZyBhIHBlZXIpLlxuaW50ZXJmYWNlIFBlbmRpbmdDaGlsZCB7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBhdDogc3RyaW5nO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGBuYXJyYXRpdmUoKWAgLyBgbWV0cmljcygpYCBzdHlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvcG9sb2d5UmVjb3JkZXIob3B0aW9uczogVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMgPSB7fSk6IFRvcG9sb2d5UmVjb3JkZXIge1xuICByZXR1cm4gbmV3IFRvcG9sb2d5UmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIEZsb3dSZWNvcmRlciBldmVudHMgYW5kIG1haW50YWlucyBhIGxpdmVcbiAqIGNvbXBvc2l0aW9uIGdyYXBoLiBBdHRhY2ggdmlhIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyKWAg4oCUXG4gKiBmb290cHJpbnRqcyBkZXRlY3RzIHRoZSBgRmxvd1JlY29yZGVyYCBtZXRob2Qgc2hhcGUgYW5kIHJvdXRlcyBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3BvbG9neVJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVzQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBUb3BvbG9neU5vZGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGVkZ2VzOiBUb3BvbG9neUVkZ2VbXSA9IFtdO1xuICAvKiogU3RhY2sgb2YgYWN0aXZlIFNVQkZMT1cgbm9kZSBpZHMuIEZvcmsvZGVjaXNpb24tYnJhbmNoIG5vZGVzIG5ldmVyIHB1c2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBNYXAgb2YgY2hpbGROYW1lIOKGkiBwZW5kaW5nIGZvcmstYnJhbmNoIHN5bnRoZXRpYyBub2RlLCBjb25zdW1lZCBieVxuICAgKiAgdGhlIG5leHQgbWF0Y2hpbmcgYG9uU3ViZmxvd0VudHJ5YC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRm9ya0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nQ2hpbGQ+KCk7XG4gIC8qKiBQZW5kaW5nIGRlY2lzaW9uLWJyYW5jaCBzeW50aGV0aWMgbm9kZSwgY29uc3VtZWQgYnkgYSBtYXRjaGluZyBlbnRyeS4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nRGVjaXNpb24/OiB7IG5hbWU6IHN0cmluZyB9ICYgUGVuZGluZ0NoaWxkO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIHN1YmZsb3cgdGhhdCBqdXN0IGZpbmlzaGVkLCBrZXllZCBieSBzY29wZSAocGFyZW50SWQsXG4gICAqIG9yICcnIGZvciByb290KS4gV2hlbiBhIG5ldyBzdWJmbG93IGVudGVycyBpbiB0aGUgc2FtZSBzY29wZSB2aWFcbiAgICogdGhlIG5vcm1hbCBuZXh0LWNoYWluZWQgcGF0aCAobm90IGZvcmsvZGVjaXNpb24pLCB3ZSBlbWl0IGEgYG5leHRgXG4gICAqIGVkZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3ViZmxvdyB0byB0aGUgbmV3IG9uZSDigJQgbWF0Y2hpbmcgaG93IHRoZVxuICAgKiBidWlsZGVyIGFjdHVhbGx5IHdpcmVkIHRoZW06IGAuYWRkU3ViRmxvd0NoYXJ0TmV4dChBKS5hZGRTdWJGbG93Q2hhcnROZXh0KEIpYFxuICAgKiBtZWFucyBBIOKGkiBCLCBvbmUgYWZ0ZXIgdGhlIG90aGVyLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIGNvbnN1bWVycyBvbmx5IHNlZSBwYXJlbnTihpJjaGlsZCBlZGdlcyAoQSwgQiwgQyBhbGxcbiAgICogY2hpbGRyZW4gb2YgdGhlaXIgY29tbW9uIGFuY2VzdG9yKSB3aXRoIG5vIHJlY29yZCBvZiB0aGUgYWN0dWFsXG4gICAqIEEg4oaSIEIg4oaSIEMgc2VxdWVudGlhbCBjaGFpbiB0aGF0IHJhbiDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gICAqIFRvcG9sb2d5UmVjb3JkZXIgaXMgc3VwcG9zZWQgdG8gZXhwb3NlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c1N1YmZsb3dJblNjb3BlID0gbmV3IE1hcDxzdHJpbmcsIHsgbm9kZUlkOiBzdHJpbmc7IGV4aXRlZEF0OiBzdHJpbmcgfT4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gYHRvcG9sb2d5LSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IGV2ZW50LnN1YmZsb3dJZDtcbiAgICBpZiAoIXN1YmZsb3dJZCkgcmV0dXJuOyAvLyBOZWVkIGEgc3RhYmxlIGlkIHRvIHRyYWNrLlxuXG4gICAgY29uc3QgZW50ZXJlZEF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBhcmVudDogcHJlZmVyIGEgcGVuZGluZyBmb3JrL2RlY2lzaW9uIG1hdGNoIGJ5IG5hbWUsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHRvcC1vZi1zdWJmbG93LXN0YWNrLlxuICAgIGxldCBwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuXG4gICAgY29uc3QgcGVuZGluZ0ZvcmsgPSB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmdldChldmVudC5uYW1lKTtcbiAgICBpZiAocGVuZGluZ0ZvcmspIHtcbiAgICAgIHBhcmVudElkID0gcGVuZGluZ0Zvcmsubm9kZUlkO1xuICAgICAgaW5jb21pbmdLaW5kID0gJ25leHQnOyAvLyBDaGlsZCBPRiBhIGZvcmstYnJhbmNoIG5vZGU7IHRoZSBmb3JrIHNlbWFudGljXG4gICAgICAvLyBpcyBjYXB0dXJlZCBieSB0aGUgZm9yay1icmFuY2gncyBvd24gaW5jb21pbmdLaW5kLlxuICAgICAgdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmdEZWNpc2lvbiAmJiB0aGlzLnBlbmRpbmdEZWNpc2lvbi5uYW1lID09PSBldmVudC5uYW1lKSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMucGVuZGluZ0RlY2lzaW9uLm5vZGVJZDtcbiAgICAgIGluY29taW5nS2luZCA9ICduZXh0JztcbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgaW5jb21pbmdLaW5kID0gcGFyZW50SWQgPyAnbmV4dCcgOiAncm9vdCc7XG4gICAgfVxuXG4gICAgLy8gRGlzYW1iaWd1YXRlIHJlLWVudHJ5IChlLmcuLCBsb29wIGJvZHkgcmUtZW50ZXJzIHRoZSBzYW1lIHN1YmZsb3cpLlxuICAgIGxldCBub2RlSWQgPSBzdWJmbG93SWQ7XG4gICAgaWYgKHRoaXMubm9kZXNCeUlkLmhhcyhub2RlSWQpKSB7XG4gICAgICBsZXQgbiA9IDE7XG4gICAgICB3aGlsZSAodGhpcy5ub2Rlc0J5SWQuaGFzKGAke3N1YmZsb3dJZH0jJHtufWApKSBuKys7XG4gICAgICBub2RlSWQgPSBgJHtzdWJmbG93SWR9IyR7bn1gO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHRoID0gcGFyZW50SWQgPyB0aGlzLm5vZGVzQnlJZC5nZXQocGFyZW50SWQpIS5kZXB0aCArIDEgOiAwO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbiB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdzdWJmbG93JyxcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGRlcHRoLFxuICAgICAgaW5jb21pbmdLaW5kLFxuICAgICAgZW50ZXJlZEF0LFxuICAgICAgbWV0YWRhdGEsXG4gICAgfTtcbiAgICB0aGlzLm5vZGVzQnlJZC5zZXQobm9kZUlkLCBub2RlKTtcbiAgICB0aGlzLm5vZGVPcmRlci5wdXNoKG5vZGVJZCk7XG5cbiAgICBpZiAocGFyZW50SWQgJiYgaW5jb21pbmdLaW5kICE9PSAncm9vdCcpIHtcbiAgICAgIHRoaXMuZWRnZXMucHVzaCh7XG4gICAgICAgIGZyb206IHBhcmVudElkLFxuICAgICAgICB0bzogbm9kZUlkLFxuICAgICAgICBraW5kOiBpbmNvbWluZ0tpbmQsXG4gICAgICAgIGF0OiBlbnRlcmVkQXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOZXh0LWNoYWluZWQgZWRnZSBmcm9tIHRoZSBQUkVWSU9VUyBzdWJmbG93IGluIHRoaXMgc2NvcGUuXG4gICAgLy9cbiAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoQSkuYWRkU3ViRmxvd0NoYXJ0TmV4dChCKS5hZGRTdWJGbG93Q2hhcnROZXh0KEMpYFxuICAgIC8vIHJ1bnMgYXM6IEEgZW50ZXJzIOKGkiBBIGV4aXRzIOKGkiBCIGVudGVycyDihpIgQiBleGl0cyDihpIgQyBlbnRlcnMuIEF0XG4gICAgLy8gQidzIGVudHJ5IHRoZSBzdGFjayBoYXMgcmV0dXJuZWQgdG8gdGhlIHNjb3BlIGl0IHdhcyBpbiBiZWZvcmUgQVxuICAgIC8vIGVudGVyZWQgKHJvb3QsIG9yIHRoZSBzaGFyZWQgYW5jZXN0b3IpLiBXaXRob3V0IHRoaXMgZWRnZSB3ZSdkXG4gICAgLy8gc2VlIG5vZGVzIHtBLCBCLCBDfSBidXQgbm8gcmVjb3JkIHRoYXQgQSByYW4gQkVGT1JFIEIgd2hpY2ggcmFuXG4gICAgLy8gQkVGT1JFIEMg4oCUIGFuZCBkb3duc3RyZWFtIGNvbnN1bWVycyB3b3VsZCBoYXZlIHRvIHJlY29uc3RydWN0XG4gICAgLy8gc2VxdWVudGlhbCBvcmRlcmluZyB0aGVtc2VsdmVzLlxuICAgIC8vXG4gICAgLy8gT25seSBlbWl0IG9uIHRoZSByZWd1bGFyLWVudHJ5IHBhdGguIEZvcmsvZGVjaXNpb24gZW50cmllcyBoYXZlXG4gICAgLy8gdGhlaXIgb3duIGVkZ2UgbWVjaGFuaWNzIChwYXJlbnTihpJmb3JrLWJyYW5jaCwgcGFyZW504oaSZGVjaXNpb24tXG4gICAgLy8gYnJhbmNoKSB0aGF0IGNhcnJ5IHRoZSBicmFuY2hpbmcgc2VtYW50aWNzLlxuICAgIGlmIChpbmNvbWluZ0tpbmQgPT09ICduZXh0JyB8fCBpbmNvbWluZ0tpbmQgPT09ICdyb290Jykge1xuICAgICAgY29uc3Qgc2NvcGVLZXkgPSBwYXJlbnRJZCA/PyAnJztcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1N1YmZsb3dJblNjb3BlLmdldChzY29wZUtleSk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiBwcmV2aW91cy5ub2RlSWQsXG4gICAgICAgICAgdG86IG5vZGVJZCxcbiAgICAgICAgICBraW5kOiAnbmV4dCcsXG4gICAgICAgICAgYXQ6IGVudGVyZWRBdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5kZWxldGUoc2NvcGVLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1N0YWNrLnB1c2gobm9kZUlkKTtcbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlSWQgPSB0aGlzLnN1YmZsb3dTdGFjay5wb3AoKTtcbiAgICBpZiAoIW5vZGVJZCkgcmV0dXJuO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBleGl0ZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmV4aXRlZEF0ID0gZXhpdGVkQXQ7XG4gICAgICAvLyBSZW1lbWJlciB0aGlzIG5vZGUgYXMgdGhlIFwicHJldmlvdXMgc3ViZmxvd1wiIGluIGl0cyBzY29wZS5cbiAgICAgIC8vIFdoYXRldmVyIHN1YmZsb3cgZW50ZXJzIE5FWFQgaW4gdGhlIHNhbWUgc2NvcGUgKG5vcm1hbC1lbnRyeVxuICAgICAgLy8gcGF0aCwgbm90IGZvcmsvZGVjaXNpb24pIGdldHMgYSBgbmV4dGAgZWRnZSBkcmF3biBmcm9tIGhlcmVcbiAgICAgIC8vIOKAlCB0aGlzIGlzIHRoZSByZWFsIHNlcXVlbnRpYWwgQSDihpIgQiB0cmFuc2l0aW9uIHRoYXQgdGhlXG4gICAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoKWAgYnVpbGRlciBwcm9kdWNlZC5cbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gbm9kZS5wYXJlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5zZXQoc2NvcGVLZXksIHsgbm9kZUlkLCBleGl0ZWRBdCB9KTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgcGVuZGluZ0RlY2lzaW9uIG9uIGV4aXQg4oCUIGEgZGVjaXNpb24gaWRlbnRpZmllcyBleGFjdGx5IE9ORVxuICAgIC8vIHRhcmdldC4gSWYgdGhlIGNob3NlbiBnb2VzIHRvIGEgcGxhaW4gc3RhZ2UgKG5vdCBhIHN1YmZsb3cpLCB0aGVcbiAgICAvLyBwZW5kaW5nIGVudHJ5IHdvdWxkIG90aGVyd2lzZSBsaW5nZXIgYW5kIGZhbHNlbHkgbWF0Y2ggYW5cbiAgICAvLyB1bnJlbGF0ZWQgc3ViZmxvdyBsYXRlciBpbiBhIGRpZmZlcmVudCBzY29wZS5cbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGNsZWFyaW5nIHBlbmRpbmdGb3JrQnlOYW1lIOKAlCBmb3JrIHNpYmxpbmdzIG5lZWRcbiAgICAvLyB0aGVpciBwZW5kaW5nIGVudHJpZXMgdG8gc3Vydml2ZSBzY29wZSBleGl0cyBvZiBlYXJsaWVyIHNpYmxpbmdzXG4gICAgLy8gKGUuZy4gQWxwaGEncyBpbm5lciBzZi1tZXNzYWdlcyBleGl0cyBiZWZvcmUgQmV0YSBlbnRlcnMpLiBGb3JrXG4gICAgLy8gcGVuZGluZyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uIG5ldyBgb25Gb3JrYCBvciBjb25zdW1lZCBvbiBtYXRjaC5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5zdWJmbG93U3RhY2tbdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgICBjb25zdCBkZXB0aCA9IGFjdGl2ZUlkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KGFjdGl2ZUlkKSEuZGVwdGggKyAxIDogMDtcblxuICAgIC8vIFJlc2V0IGFueSBwcmlvciBwZW5kaW5nIGZvcmsgc3RhdGUg4oCUIGEgbmV3IGZvcmsgc3RhcnRzIGZyZXNoLlxuICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuY2xlYXIoKTtcblxuICAgIGV2ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUlkID0gYGZvcmstJHthdCB8fCBldmVudC5wYXJlbnR9LSR7aX0tJHtjaGlsZE5hbWV9YDtcbiAgICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAga2luZDogJ2ZvcmstYnJhbmNoJyxcbiAgICAgICAgbmFtZTogY2hpbGROYW1lLFxuICAgICAgICBwYXJlbnRJZDogYWN0aXZlSWQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBpbmNvbWluZ0tpbmQ6ICdmb3JrLWJyYW5jaCcsXG4gICAgICAgIGVudGVyZWRBdDogYXQsXG4gICAgICAgIG1ldGFkYXRhOiB7IGZvcmtQYXJlbnQ6IGV2ZW50LnBhcmVudCB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMubm9kZXNCeUlkLnNldChub2RlSWQsIG5vZGUpO1xuICAgICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgICAgaWYgKGFjdGl2ZUlkKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7IGZyb206IGFjdGl2ZUlkLCB0bzogbm9kZUlkLCBraW5kOiAnZm9yay1icmFuY2gnLCBhdCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuc2V0KGNoaWxkTmFtZSwgeyBub2RlSWQsIGF0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gICAgY29uc3QgZGVwdGggPSBhY3RpdmVJZCA/IHRoaXMubm9kZXNCeUlkLmdldChhY3RpdmVJZCkhLmRlcHRoICsgMSA6IDA7XG5cbiAgICAvLyBBIG5ldyBkZWNpc2lvbiBzdXBlcnNlZGVzIGFueSBwcmlvciB1bnJlc29sdmVkIHBlbmRpbmcgb25lLlxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZUlkID0gYGRlY2lzaW9uLSR7YXQgfHwgZXZlbnQuZGVjaWRlcn0tJHtldmVudC5jaG9zZW59YDtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIgfTtcbiAgICBpZiAoZXZlbnQucmF0aW9uYWxlKSBtZXRhZGF0YS5yYXRpb25hbGUgPSBldmVudC5yYXRpb25hbGU7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGV2ZW50LmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgbmFtZTogZXZlbnQuY2hvc2VuLFxuICAgICAgcGFyZW50SWQ6IGFjdGl2ZUlkLFxuICAgICAgZGVwdGgsXG4gICAgICBpbmNvbWluZ0tpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgZW50ZXJlZEF0OiBhdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgIGlmIChhY3RpdmVJZCkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKHsgZnJvbTogYWN0aXZlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLCBhdCB9KTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB7IG5hbWU6IGV2ZW50LmNob3Nlbiwgbm9kZUlkLCBhdCB9O1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgLy8gbG9vcFRvIGp1bXBzIGJhY2sgaW5zaWRlIHRoZSBDVVJSRU5UIHN1YmZsb3cuIFJlY29yZCBhIHNlbGYtZWRnZSBvbiB0aGVcbiAgICAvLyBhY3RpdmUgc3ViZmxvdyDigJQgc3ludGhldGljIGZvcmsvZGVjaXNpb24gbm9kZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbG9vcHMuXG4gICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWFjdGl2ZUlkKSByZXR1cm47XG4gICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgIGZyb206IGFjdGl2ZUlkLFxuICAgICAgdG86IGFjdGl2ZUlkLFxuICAgICAga2luZDogJ2xvb3AtaXRlcmF0aW9uJyxcbiAgICAgIGF0OiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgdGhlIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIGBydW4oKWAg4oCUIHJlc2V0cyBhbGwgc3RhdGUuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMubm9kZXNCeUlkLmNsZWFyKCk7XG4gICAgdGhpcy5ub2RlT3JkZXIubGVuZ3RoID0gMDtcbiAgICB0aGlzLmVkZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoID0gMDtcbiAgICB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmNsZWFyKCk7XG4gICAgdGhpcy5wcmV2aW91c1N1YmZsb3dJblNjb3BlLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBMaXZlIHNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gU2FmZSBkdXJpbmcgb3IgYWZ0ZXIgYSBydW4uICovXG4gIGdldFRvcG9sb2d5KCk6IFRvcG9sb2d5IHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMubm9kZU9yZGVyLm1hcCgoaWQpID0+IHRoaXMubm9kZXNCeUlkLmdldChpZCkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXMsXG4gICAgICBlZGdlczogWy4uLnRoaXMuZWRnZXNdLFxuICAgICAgYWN0aXZlTm9kZUlkOiB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXSA/PyBudWxsLFxuICAgICAgcm9vdElkOiB0aGlzLm5vZGVPcmRlclswXSA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogRGlyZWN0IGNoaWxkcmVuIG9mIGEgbm9kZSDigJQgaW5zZXJ0aW9uLW9yZGVyZWQuICovXG4gIGdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLnBhcmVudElkID09PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBub2RlcyBvZiBhIGdpdmVuIGtpbmQuICovXG4gIGdldEJ5S2luZChraW5kOiBUb3BvbG9neU5vZGVLaW5kKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09IGtpbmQpO1xuICB9XG5cbiAgLyoqIEFsbCBtb3VudGVkIHN1YmZsb3cgbm9kZXMuIENvbnZlbmllbmNlIGZvciBhZ2VudC1jZW50cmljIHZpZXdzLiAqL1xuICBnZXRTdWJmbG93Tm9kZXMoKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEJ5S2luZCgnc3ViZmxvdycpO1xuICB9XG5cbiAgLyoqIEFsbCBmb3JrLWJyYW5jaCBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBgbm9kZUlkYCDigJQgaS5lLixcbiAgICogIHBhcmFsbGVsIHNpYmxpbmdzIG9mIGEgcGFyYWxsZWwgYnJhbmNoLiBFbXB0eSBpZiBgbm9kZUlkYCBpc24ndCBhXG4gICAqICBmb3JrLWJyYW5jaCBvciBoYXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJhbGxlbFNpYmxpbmdzKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnZm9yay1icmFuY2gnIHx8ICFub2RlLnBhcmVudElkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZS5wYXJlbnRJZCkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09ICdmb3JrLWJyYW5jaCcpO1xuICB9XG5cbiAgLyoqIEVtaXQgYSBzbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdUb3BvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbXBvc2l0aW9uIGdyYXBoOiBzdWJmbG93IGJvdW5kYXJpZXMsIGZvcmsgYnJhbmNoZXMsIGRlY2lzaW9uIGJyYW5jaGVzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldFRvcG9sb2d5KCksXG4gICAgfTtcbiAgfVxufVxuIl19
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ3lSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQVlILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBMkV6RSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsVUFBbUMsRUFBRTtJQUNwRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLEVBQUUsQ0FBUztJQUVILFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUM1QyxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssR0FBbUIsRUFBRSxDQUFDO0lBQzVDLCtFQUErRTtJQUM5RCxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBRTdDOzhDQUMwQztJQUN6QixpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRSw0RUFBNEU7SUFDcEUsZUFBZSxDQUFtQztJQUMxRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDYyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUNsRyxrR0FBa0c7SUFDakYsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDL0QsMEZBQTBGO0lBQ3pFLFdBQVcsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFFdkQsWUFBWSxVQUFtQyxFQUFFO1FBQy9DLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxZQUFZLEVB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a0JBQWtCLEVBQUUsV0FBb0I7WUFDeEMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9wb2xvZ3lSZWNvcmRlciDigJQgY29tcG9zaXRpb24gZ3JhcGggYnVpbHQgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIGZvb3RwcmludGpzIGZpcmVzIGF0b21pYyBmbG93IGV2ZW50cyAob25TdWJmbG93RW50cnksIG9uRm9yaywgb25EZWNpc2lvbixcbiAqICAgb25Mb29wKSBidXQgdGhlIGFjY3VtdWxhdGVkICpzaGFwZSogb2YgYSBydW4g4oCUIHdobyBuZXN0cyBpbnNpZGUgd2hvbSxcbiAqICAgd2hpY2ggbm9kZXMgYXJlIHBhcmFsbGVsIHNpYmxpbmdzIHZzIGJyYW5jaGVzIG9mIGEgZGVjaXNpb24g4oCUIGlzIG9ubHlcbiAqICAgdmlzaWJsZSBwb3N0LXJ1biB2aWEgYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgIHRyZWUtd2Fsa2luZy5cbiAqXG4gKiAgIFN0cmVhbWluZyBjb25zdW1lcnMgKGxpdmUgVUlzLCBpbi1mbGlnaHQgZGVidWdnZXJzKSBzZWUgb25seSB0aGUgZXZlbnRcbiAqICAgc3RyZWFtLiBFdmVyeSBzdWNoIGNvbnN1bWVyIGhhcyB0byByZWJ1aWxkIHN1YmZsb3ctc3RhY2sgKyBmb3JrLW1hcCArXG4gKiAgIGRlY2lzaW9uLXRyYWNrZXIgZnJvbSBzY3JhdGNoLCB1c3VhbGx5IHNsaWdodGx5IHdyb25nIGluIGRpZmZlcmVudCB3YXlzLlxuICpcbiAqICAgVG9wb2xvZ3lSZWNvcmRlciBpcyB0aGUgc3RhbmRhcmQgYWNjdW11bGF0b3I6IG9uZSBzdWJzY3JpcHRpb24gdG8gdGhlXG4gKiAgIHRocmVlIHByaW1pdGl2ZSBjaGFubmVscywgb25lIGxpdmUgZ3JhcGgsIHF1ZXJ5YWJsZSBhdCBhbnkgbW9tZW50IGR1cmluZ1xuICogICBvciBhZnRlciBhIHJ1bi5cbiAqXG4gKiBXaGF0IGl0IHJlY29yZHMg4oCUIEZPVVIgbm9kZSBraW5kcyBmb3IgY29tcGxldGUgY29tcG9zaXRpb24gY292ZXJhZ2U6XG4gKiAgIDEuICdzdWJmbG93JyAgICAgICAgICDigJQgdmlhIG9uU3ViZmxvd0VudHJ5IChhIG1vdW50ZWQgc3ViZmxvdyBib3VuZGFyeSlcbiAqICAgMi4gJ2ZvcmstYnJhbmNoJyAgICAgIOKAlCB2aWEgb25Gb3JrIChvbmUgbm9kZSBwZXIgY2hpbGQsIHN5bnRoZXNpemVkKVxuICogICAzLiAnZGVjaXNpb24tYnJhbmNoJyAg4oCUIHZpYSBvbkRlY2lzaW9uICh0aGUgY2hvc2VuIGJyYW5jaCwgc3ludGhlc2l6ZWQpXG4gKiAgIDQuICdhdHRlbXB0LXNlcmllcycgICDigJQgdmlhIG9uQXR0ZW1wdCAoMTAuMSk6IGEgc3RhZ2UgZXhlY3V0aW9uIHRoYXRcbiAqICAgICAgUkVUUklFRCwgR0FWRSBVUCBvciBUSU1FRCBPVVQgKGByZWNvcmRlci9hdHRlbXB0U2VyaWVzLnRzIMK3IGlzUmV0cnlFdmlkZW5jZWApLCB3aXRoIGl0c1xuICogICAgICBgYXR0ZW1wdFN1bW1hcnlgIGFuZCBpdHMgb3JkZXJlZCBgYXR0ZW1wdHNgLiBBIHJldHJ5IGlzIGEgbG9vcCwgc28gZWFjaFxuICogICAgICByZXRyeSBkZWNpc2lvbiBpcyBhIHNlbGYtZWRnZSBvZiBraW5kICdyZXRyeScgb24gdGhlIG5vZGUg4oCUIHRoZSB3YXlcbiAqICAgICAgb25Mb29wIGRyYXdzICdsb29wLWl0ZXJhdGlvbicuIEEgc3RhZ2UgdGhhdCByYW4gb25jZSAod2l0aCBvciB3aXRob3V0IGFcbiAqICAgICAgcG9saWN5KSBpcyBubyBub2RlLCBhcyBiZWZvcmUuXG4gKlxuICogICBXaGVuIGEgZm9yay1icmFuY2ggb3IgZGVjaXNpb24tYnJhbmNoIHRhcmdldCBJUyBBTFNPIGEgc3ViZmxvdywgdGhlXG4gKiAgIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgY3JlYXRlcyBhIHN1YmZsb3cgQ0hJTEQgb2YgdGhlIHN5bnRoZXRpYyBub2RlLlxuICogICBUaGUgbGF5ZXJlZCBzaGFwZSBwcmVzZXJ2ZXMgYm90aCBcIndobyBicmFuY2hlZFwiIGFuZCBcIndoYXQgdGhlIGJyYW5jaCByYW4uXCJcbiAqXG4gKiAgIFBsYWluIHNlcXVlbnRpYWwgc3RhZ2VzIGFyZSBOT1Qgbm9kZXMg4oCUIHRoYXQncyBTdGFnZUNvbnRleHQncyBqb2IuXG4gKiAgIFRvcG9sb2d5IGlzIGEgZ3JhcGggb2YgY29udHJvbC1mbG93IGJyYW5jaGluZywgbm90IGEgZnVsbCBleGVjdXRpb24gdHJlZS5cbiAqXG4gKiBFZGdlczpcbiAqICAgT25lIGVkZ2UgcGVyIHRyYXZlcnNhbCB0cmFuc2l0aW9uIOKAlCBga2luZGAgbWF0Y2hlcyB0aGUgY2hpbGQnc1xuICogICBgaW5jb21pbmdLaW5kYC4gQSBjb25zdW1lciByZW5kZXJpbmcgXCJwYXJhbGxlbCBjb2x1bW5zXCIgZmlsdGVycyBlZGdlc1xuICogICB3aGVyZSBga2luZCA9PT0gJ2ZvcmstYnJhbmNoJ2Agc2hhcmluZyB0aGUgc2FtZSBgZnJvbWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgdG9wbyA9IHRvcG9sb2d5UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodG9wbyk7ICAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzLCBhY3RpdmVOb2RlSWQsIHJvb3RJZCB9ID0gdG9wby5nZXRUb3BvbG9neSgpO1xuICogLy8gQ29uc3VtZXIgcXVlcmllczpcbiAqIHRvcG8uZ2V0Q2hpbGRyZW4oJ3NmLXBhcmVudCcpOyAgICAgICAgICAgICAgLy8gZGlyZWN0IGNoaWxkcmVuIChhbnkga2luZClcbiAqIHRvcG8uZ2V0QnlLaW5kKCdmb3JrLWJyYW5jaCcpOyAgICAgICAgICAgICAgLy8gYWxsIHBhcmFsbGVsIGJyYW5jaGVzXG4gKiB0b3BvLmdldFN1YmZsb3dOb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbW91bnRlZCBzdWJmbG93c1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0U3VtbWFyeSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdFJlZiB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0U2VyaWVzQm9vaywgc3ViZmxvd09mQXR0ZW1wdCB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5cbi8qKiBUaGUga2luZCBvZiBjb21wb3NpdGlvbiB1bml0IGEgbm9kZSByZXByZXNlbnRzLiAqL1xuZXhwb3J0IHR5cGUgVG9wb2xvZ3lOb2RlS2luZCA9ICdzdWJmbG93JyB8ICdmb3JrLWJyYW5jaCcgfCAnZGVjaXNpb24tYnJhbmNoJyB8ICdhdHRlbXB0LXNlcmllcyc7XG5cbi8qKiBIb3cgdGhlIHRyYXZlcnNhbCByZWFjaGVkIHRoaXMgbm9kZSDigJQgZHJpdmVzIGNvbnN1bWVyIGxheW91dCBkZWNpc2lvbnMuICovXG5leHBvcnQgdHlwZSBUb3BvbG9neUluY29taW5nS2luZCA9ICdyb290JyB8ICduZXh0JyB8ICdmb3JrLWJyYW5jaCcgfCAnZGVjaXNpb24tYnJhbmNoJyB8ICdsb29wLWl0ZXJhdGlvbicgfCAncmV0cnknO1xuXG4vKiogQSBjb21wb3NpdGlvbi1zaWduaWZpY2FudCBwb2ludCBpbiB0aGUgZ3JhcGguICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5Tm9kZSB7XG4gIC8qKiBVbmlxdWUgaWQuIFN1YmZsb3dzIHVzZSB0aGVpciBzdWJmbG93SWQgKHdpdGggYCNuYCBzdWZmaXggb24gcmUtZW50cnkpLlxuICAgKiAgU3ludGhldGljIG5vZGVzIChmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLWJyYW5jaCkgdXNlXG4gICAqICBgZm9yay0ke3J1bnRpbWVTdGFnZUlkfS0ke2l9LSR7Y2hpbGROYW1lfWAgLyBgZGVjaXNpb24tJHtydW50aW1lU3RhZ2VJZH0tJHtjaG9zZW59YCBmb3JtLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGlzIG5vZGUgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkga2luZDogVG9wb2xvZ3lOb2RlS2luZDtcbiAgLyoqIERpc3BsYXkgbmFtZS4gRm9yIHN1YmZsb3dzOiBgRmxvd1N1YmZsb3dFdmVudC5uYW1lYC4gRm9yIGZvcmstYnJhbmNoZXM6XG4gICAqICB0aGUgY2hpbGQgbmFtZSBmcm9tIGBGbG93Rm9ya0V2ZW50LmNoaWxkcmVuYC4gRm9yIGRlY2lzaW9uLWJyYW5jaGVzOlxuICAgKiAgdGhlIGNob3NlbiBuYW1lIGZyb20gYEZsb3dEZWNpc2lvbkV2ZW50LmNob3NlbmAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBub2RlIGlkLiBVbmRlZmluZWQgd2hlbiB0aGlzIG5vZGUgc2l0cyBhdCB0aGUgcnVuJ3MgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBwYXJlbnRJZD86IHN0cmluZztcbiAgLyoqIERlcHRoIGluIHRoZSB0b3BvbG9neSB0cmVlICgwID0gdG9wLWxldmVsKS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgdHJhdmVyc2FsIHJlYWNoZWQgdGhpcyBub2RlLiAqL1xuICByZWFkb25seSBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuICAvKiogcnVudGltZVN0YWdlSWQgYXQgdGhlIG1vbWVudCB0aGUgbm9kZSB3YXMgY3JlYXRlZC4gKi9cbiAgcmVhZG9ubHkgZW50ZXJlZEF0OiBzdHJpbmc7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN1YmZsb3cgZXhpdGVkLiBPbmx5IG1lYW5pbmdmdWxcbiAgICogIGZvciBraW5kPSdzdWJmbG93JzsgZm9yay9kZWNpc2lvbi1icmFuY2ggbm9kZXMgYXJlIGluc3RhbnRhbmVvdXMuICovXG4gIGV4aXRlZEF0Pzogc3RyaW5nO1xuICAvKiogS2luZC1zcGVjaWZpYyBleHRyYXM6IGZvcmtQYXJlbnQsIGRlY2lkZXIsIHJhdGlvbmFsZSwgZGVzY3JpcHRpb247IHN0YWdlSWQgZm9yIGFuIGF0dGVtcHQgc2VyaWVzLiAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqXG4gICAqIGtpbmQ9J2F0dGVtcHQtc2VyaWVzJyBvbmx5OiB0aGUgc2VyaWVzIGF0IGEgZ2xhbmNlIOKAlCBlcXVhbCB0byB0aGUgc3RhZ2Unc1xuICAgKiBgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0U3VtbWFyeWAuIEFic2VudCB3aGlsZSB0aGUgc2VyaWVzIGlzIGluIGZsaWdodCAob3JcbiAgICogd2hlbiB0aGUgcnVuJ3Mgc2lnbmFsIGN1dCBpdHMgd2FpdDogbm8gcmVjb3JkIHNheXMgaG93IGl0IGVuZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKiBraW5kPSdhdHRlbXB0LXNlcmllcycgb25seTogdGhlIHNlcmllcycgYXR0ZW1wdHMsIGluIG9yZGVyLiAqL1xuICByZWFkb25seSBhdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWZbXTtcbn1cblxuLyoqIEEgdHJhdmVyc2FsIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gbm9kZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5RWRnZSB7XG4gIHJlYWRvbmx5IGZyb206IHN0cmluZztcbiAgcmVhZG9ubHkgdG86IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogRXhjbHVkZTxUb3BvbG9neUluY29taW5nS2luZCwgJ3Jvb3QnPjtcbiAgcmVhZG9ubHkgYXQ6IHN0cmluZztcbn1cblxuLyoqIFNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9wb2xvZ3kge1xuICByZWFkb25seSBub2RlczogUmVhZG9ubHlBcnJheTxUb3BvbG9neU5vZGU+O1xuICByZWFkb25seSBlZGdlczogUmVhZG9ubHlBcnJheTxUb3BvbG9neUVkZ2U+O1xuICAvKiogQ3VycmVudGx5LWFjdGl2ZSBzdWJmbG93ICh0b3Agb2YgdGhlIHN1YmZsb3cgc3RhY2spLiBGb3JrLWJyYW5jaCBhbmRcbiAgICogIGRlY2lzaW9uLWJyYW5jaCBub2RlcyBhcmUgaW5zdGFudGFuZW91cyDigJQgdGhleSBkb24ndCBhZmZlY3QgYWN0aXZlTm9kZUlkLiAqL1xuICByZWFkb25seSBhY3RpdmVOb2RlSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGaXJzdCBub2RlIGluc2VydGVkLiBudWxsIGJlZm9yZSBhbnkgY29tcG9zaXRpb24gZXZlbnQgZmlyZXMuICovXG4gIHJlYWRvbmx5IHJvb3RJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBTY29wZVJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgdG9wb2xvZ3ktTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxuLy8gQ29ycmVsYXRpb24gc3RhdGU6IG1hcHMgYSBwZW5kaW5nIGZvcmsvZGVjaXNpb24gY2hpbGQgbmFtZSB0byBpdHMgc3ludGhldGljXG4vLyBub2RlIGlkLCBzbyBhIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgbWF0Y2hpbmcgdGhhdCBuYW1lIGNhbiBiZSBuZXN0ZWRcbi8vIHVuZGVyIHRoZSBzeW50aGV0aWMgbm9kZSAocmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBwZWVyKS5cbmludGVyZmFjZSBQZW5kaW5nQ2hpbGQge1xuICBub2RlSWQ6IHN0cmluZztcbiAgYXQ6IHN0cmluZztcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgbmFycmF0aXZlKClgIC8gYG1ldHJpY3MoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3BvbG9neVJlY29yZGVyKG9wdGlvbnM6IFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zID0ge30pOiBUb3BvbG9neVJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBUb3BvbG9neVJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBtYWludGFpbnMgYSBsaXZlXG4gKiBjb21wb3NpdGlvbiBncmFwaC4gQXR0YWNoIHZpYSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIOKAlFxuICogZm9vdHByaW50anMgZGV0ZWN0cyB0aGUgYEZsb3dSZWNvcmRlcmAgbWV0aG9kIHNoYXBlIGFuZCByb3V0ZXMgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVG9wb2xvZ3lSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBub2Rlc0J5SWQgPSBuZXcgTWFwPHN0cmluZywgVG9wb2xvZ3lOb2RlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBlZGdlczogVG9wb2xvZ3lFZGdlW10gPSBbXTtcbiAgLyoqIFN0YWNrIG9mIGFjdGl2ZSBTVUJGTE9XIG5vZGUgaWRzLiBGb3JrL2RlY2lzaW9uLWJyYW5jaCBub2RlcyBuZXZlciBwdXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICAvKiogTWFwIG9mIGNoaWxkTmFtZSDihpIgcGVuZGluZyBmb3JrLWJyYW5jaCBzeW50aGV0aWMgbm9kZSwgY29uc3VtZWQgYnlcbiAgICogIHRoZSBuZXh0IG1hdGNoaW5nIGBvblN1YmZsb3dFbnRyeWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ0ZvcmtCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ0NoaWxkPigpO1xuICAvKiogUGVuZGluZyBkZWNpc2lvbi1icmFuY2ggc3ludGhldGljIG5vZGUsIGNvbnN1bWVkIGJ5IGEgbWF0Y2hpbmcgZW50cnkuICovXG4gIHByaXZhdGUgcGVuZGluZ0RlY2lzaW9uPzogeyBuYW1lOiBzdHJpbmcgfSAmIFBlbmRpbmdDaGlsZDtcbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyBzdWJmbG93IHRoYXQganVzdCBmaW5pc2hlZCwga2V5ZWQgYnkgc2NvcGUgKHBhcmVudElkLFxuICAgKiBvciAnJyBmb3Igcm9vdCkuIFdoZW4gYSBuZXcgc3ViZmxvdyBlbnRlcnMgaW4gdGhlIHNhbWUgc2NvcGUgdmlhXG4gICAqIHRoZSBub3JtYWwgbmV4dC1jaGFpbmVkIHBhdGggKG5vdCBmb3JrL2RlY2lzaW9uKSwgd2UgZW1pdCBhIGBuZXh0YFxuICAgKiBlZGdlIGZyb20gdGhlIHByZXZpb3VzIHN1YmZsb3cgdG8gdGhlIG5ldyBvbmUg4oCUIG1hdGNoaW5nIGhvdyB0aGVcbiAgICogYnVpbGRlciBhY3R1YWxseSB3aXJlZCB0aGVtOiBgLmFkZFN1YkZsb3dDaGFydE5leHQoQSkuYWRkU3ViRmxvd0NoYXJ0TmV4dChCKWBcbiAgICogbWVhbnMgQSDihpIgQiwgb25lIGFmdGVyIHRoZSBvdGhlci5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzLCBjb25zdW1lcnMgb25seSBzZWUgcGFyZW504oaSY2hpbGQgZWRnZXMgKEEsIEIsIEMgYWxsXG4gICAqIGNoaWxkcmVuIG9mIHRoZWlyIGNvbW1vbiBhbmNlc3Rvcikgd2l0aCBubyByZWNvcmQgb2YgdGhlIGFjdHVhbFxuICAgKiBBIOKGkiBCIOKGkiBDIHNlcXVlbnRpYWwgY2hhaW4gdGhhdCByYW4g4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuICAgKiBUb3BvbG9neVJlY29yZGVyIGlzIHN1cHBvc2VkIHRvIGV4cG9zZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldmlvdXNTdWJmbG93SW5TY29wZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG5vZGVJZDogc3RyaW5nOyBleGl0ZWRBdDogc3RyaW5nIH0+KCk7XG4gIC8qKiBPcGVuIHN1YmZsb3cgbm9kZSBpZCBieSBpdHMgcGF0aC1wcmVmaXhlZCBzdWJmbG93SWQg4oCUIHdoZXJlIGEgc3RhZ2UncyBhdHRlbXB0IHNlcmllcyBoYW5ncy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuU3ViZmxvd0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBQZXItc2VyaWVzIHRhbGxpZXMgb2YgdGhlIHNlcmllcyB0aGF0IGFyZSBldmlkZW5jZSAocmV0cmllZCwgZ2F2ZSB1cCBvciB0aW1lZCBvdXQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGVtcHRCb29rID0gbmV3IEF0dGVtcHRTZXJpZXNCb29rKCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGB0b3BvbG9neS0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBldmVudC5zdWJmbG93SWQ7XG4gICAgaWYgKCFzdWJmbG93SWQpIHJldHVybjsgLy8gTmVlZCBhIHN0YWJsZSBpZCB0byB0cmFjay5cblxuICAgIGNvbnN0IGVudGVyZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBwYXJlbnQ6IHByZWZlciBhIHBlbmRpbmcgZm9yay9kZWNpc2lvbiBtYXRjaCBieSBuYW1lLFxuICAgIC8vIG90aGVyd2lzZSB0aGUgY3VycmVudCB0b3Atb2Ytc3ViZmxvdy1zdGFjay5cbiAgICBsZXQgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5jb21pbmdLaW5kOiBUb3BvbG9neUluY29taW5nS2luZDtcblxuICAgIGNvbnN0IHBlbmRpbmdGb3JrID0gdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKHBlbmRpbmdGb3JrKSB7XG4gICAgICBwYXJlbnRJZCA9IHBlbmRpbmdGb3JrLm5vZGVJZDtcbiAgICAgIGluY29taW5nS2luZCA9ICduZXh0JzsgLy8gQ2hpbGQgT0YgYSBmb3JrLWJyYW5jaCBub2RlOyB0aGUgZm9yayBzZW1hbnRpY1xuICAgICAgLy8gaXMgY2FwdHVyZWQgYnkgdGhlIGZvcmstYnJhbmNoJ3Mgb3duIGluY29taW5nS2luZC5cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nRGVjaXNpb24gJiYgdGhpcy5wZW5kaW5nRGVjaXNpb24ubmFtZSA9PT0gZXZlbnQubmFtZSkge1xuICAgICAgcGFyZW50SWQgPSB0aGlzLnBlbmRpbmdEZWNpc2lvbi5ub2RlSWQ7XG4gICAgICBpbmNvbWluZ0tpbmQgPSAnbmV4dCc7XG4gICAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50SWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGluY29taW5nS2luZCA9IHBhcmVudElkID8gJ25leHQnIDogJ3Jvb3QnO1xuICAgIH1cblxuICAgIC8vIERpc2FtYmlndWF0ZSByZS1lbnRyeSAoZS5nLiwgbG9vcCBib2R5IHJlLWVudGVycyB0aGUgc2FtZSBzdWJmbG93KS5cbiAgICBsZXQgbm9kZUlkID0gc3ViZmxvd0lkO1xuICAgIGlmICh0aGlzLm5vZGVzQnlJZC5oYXMobm9kZUlkKSkge1xuICAgICAgbGV0IG4gPSAxO1xuICAgICAgd2hpbGUgKHRoaXMubm9kZXNCeUlkLmhhcyhgJHtzdWJmbG93SWR9IyR7bn1gKSkgbisrO1xuICAgICAgbm9kZUlkID0gYCR7c3ViZmxvd0lkfSMke259YDtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aCA9IHBhcmVudElkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KHBhcmVudElkKSEuZGVwdGggKyAxIDogMDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGV2ZW50LmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24gfSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgIGlkOiBub2RlSWQsXG4gICAgICBraW5kOiAnc3ViZmxvdycsXG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBkZXB0aCxcbiAgICAgIGluY29taW5nS2luZCxcbiAgICAgIGVudGVyZWRBdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuXG4gICAgaWYgKHBhcmVudElkICYmIGluY29taW5nS2luZCAhPT0gJ3Jvb3QnKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goe1xuICAgICAgICBmcm9tOiBwYXJlbnRJZCxcbiAgICAgICAgdG86IG5vZGVJZCxcbiAgICAgICAga2luZDogaW5jb21pbmdLaW5kLFxuICAgICAgICBhdDogZW50ZXJlZEF0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTmV4dC1jaGFpbmVkIGVkZ2UgZnJvbSB0aGUgUFJFVklPVVMgc3ViZmxvdyBpbiB0aGlzIHNjb3BlLlxuICAgIC8vXG4gICAgLy8gYC5hZGRTdWJGbG93Q2hhcnROZXh0KEEpLmFkZFN1YkZsb3dDaGFydE5leHQoQikuYWRkU3ViRmxvd0NoYXJ0TmV4dChDKWBcbiAgICAvLyBydW5zIGFzOiBBIGVudGVycyDihpIgQSBleGl0cyDihpIgQiBlbnRlcnMg4oaSIEIgZXhpdHMg4oaSIEMgZW50ZXJzLiBBdFxuICAgIC8vIEIncyBlbnRyeSB0aGUgc3RhY2sgaGFzIHJldHVybmVkIHRvIHRoZSBzY29wZSBpdCB3YXMgaW4gYmVmb3JlIEFcbiAgICAvLyBlbnRlcmVkIChyb290LCBvciB0aGUgc2hhcmVkIGFuY2VzdG9yKS4gV2l0aG91dCB0aGlzIGVkZ2Ugd2UnZFxuICAgIC8vIHNlZSBub2RlcyB7QSwgQiwgQ30gYnV0IG5vIHJlY29yZCB0aGF0IEEgcmFuIEJFRk9SRSBCIHdoaWNoIHJhblxuICAgIC8vIEJFRk9SRSBDIOKAlCBhbmQgZG93bnN0cmVhbSBjb25zdW1lcnMgd291bGQgaGF2ZSB0byByZWNvbnN0cnVjdFxuICAgIC8vIHNlcXVlbnRpYWwgb3JkZXJpbmcgdGhlbXNlbHZlcy5cbiAgICAvL1xuICAgIC8vIE9ubHkgZW1pdCBvbiB0aGUgcmVndWxhci1lbnRyeSBwYXRoLiBGb3JrL2RlY2lzaW9uIGVudHJpZXMgaGF2ZVxuICAgIC8vIHRoZWlyIG93biBlZGdlIG1lY2hhbmljcyAocGFyZW504oaSZm9yay1icmFuY2gsIHBhcmVudOKGkmRlY2lzaW9uLVxuICAgIC8vIGJyYW5jaCkgdGhhdCBjYXJyeSB0aGUgYnJhbmNoaW5nIHNlbWFudGljcy5cbiAgICBpZiAoaW5jb21pbmdLaW5kID09PSAnbmV4dCcgfHwgaW5jb21pbmdLaW5kID09PSAncm9vdCcpIHtcbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gcGFyZW50SWQgPz8gJyc7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5nZXQoc2NvcGVLZXkpO1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7XG4gICAgICAgICAgZnJvbTogcHJldmlvdXMubm9kZUlkLFxuICAgICAgICAgIHRvOiBub2RlSWQsXG4gICAgICAgICAga2luZDogJ25leHQnLFxuICAgICAgICAgIGF0OiBlbnRlcmVkQXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByZXZpb3VzU3ViZmxvd0luU2NvcGUuZGVsZXRlKHNjb3BlS2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dTdGFjay5wdXNoKG5vZGVJZCk7XG4gICAgdGhpcy5vcGVuU3ViZmxvd0J5UGF0aC5zZXQoc3ViZmxvd0lkLCBub2RlSWQpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrLnBvcCgpO1xuICAgIGlmICghbm9kZUlkKSByZXR1cm47XG4gICAgaWYgKGV2ZW50LnN1YmZsb3dJZCAmJiB0aGlzLm9wZW5TdWJmbG93QnlQYXRoLmdldChldmVudC5zdWJmbG93SWQpID09PSBub2RlSWQpIHtcbiAgICAgIHRoaXMub3BlblN1YmZsb3dCeVBhdGguZGVsZXRlKGV2ZW50LnN1YmZsb3dJZCk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBleGl0ZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmV4aXRlZEF0ID0gZXhpdGVkQXQ7XG4gICAgICAvLyBSZW1lbWJlciB0aGlzIG5vZGUgYXMgdGhlIFwicHJldmlvdXMgc3ViZmxvd1wiIGluIGl0cyBzY29wZS5cbiAgICAgIC8vIFdoYXRldmVyIHN1YmZsb3cgZW50ZXJzIE5FWFQgaW4gdGhlIHNhbWUgc2NvcGUgKG5vcm1hbC1lbnRyeVxuICAgICAgLy8gcGF0aCwgbm90IGZvcmsvZGVjaXNpb24pIGdldHMgYSBgbmV4dGAgZWRnZSBkcmF3biBmcm9tIGhlcmVcbiAgICAgIC8vIOKAlCB0aGlzIGlzIHRoZSByZWFsIHNlcXVlbnRpYWwgQSDihpIgQiB0cmFuc2l0aW9uIHRoYXQgdGhlXG4gICAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoKWAgYnVpbGRlciBwcm9kdWNlZC5cbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gbm9kZS5wYXJlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5zZXQoc2NvcGVLZXksIHsgbm9kZUlkLCBleGl0ZWRBdCB9KTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgcGVuZGluZ0RlY2lzaW9uIG9uIGV4aXQg4oCUIGEgZGVjaXNpb24gaWRlbnRpZmllcyBleGFjdGx5IE9ORVxuICAgIC8vIHRhcmdldC4gSWYgdGhlIGNob3NlbiBnb2VzIHRvIGEgcGxhaW4gc3RhZ2UgKG5vdCBhIHN1YmZsb3cpLCB0aGVcbiAgICAvLyBwZW5kaW5nIGVudHJ5IHdvdWxkIG90aGVyd2lzZSBsaW5nZXIgYW5kIGZhbHNlbHkgbWF0Y2ggYW5cbiAgICAvLyB1bnJlbGF0ZWQgc3ViZmxvdyBsYXRlciBpbiBhIGRpZmZlcmVudCBzY29wZS5cbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGNsZWFyaW5nIHBlbmRpbmdGb3JrQnlOYW1lIOKAlCBmb3JrIHNpYmxpbmdzIG5lZWRcbiAgICAvLyB0aGVpciBwZW5kaW5nIGVudHJpZXMgdG8gc3Vydml2ZSBzY29wZSBleGl0cyBvZiBlYXJsaWVyIHNpYmxpbmdzXG4gICAgLy8gKGUuZy4gQWxwaGEncyBpbm5lciBzZi1tZXNzYWdlcyBleGl0cyBiZWZvcmUgQmV0YSBlbnRlcnMpLiBGb3JrXG4gICAgLy8gcGVuZGluZyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uIG5ldyBgb25Gb3JrYCBvciBjb25zdW1lZCBvbiBtYXRjaC5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5zdWJmbG93U3RhY2tbdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgICBjb25zdCBkZXB0aCA9IGFjdGl2ZUlkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KGFjdGl2ZUlkKSEuZGVwdGggKyAxIDogMDtcblxuICAgIC8vIFJlc2V0IGFueSBwcmlvciBwZW5kaW5nIGZvcmsgc3RhdGUg4oCUIGEgbmV3IGZvcmsgc3RhcnRzIGZyZXNoLlxuICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuY2xlYXIoKTtcblxuICAgIGV2ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUlkID0gYGZvcmstJHthdCB8fCBldmVudC5wYXJlbnR9LSR7aX0tJHtjaGlsZE5hbWV9YDtcbiAgICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAga2luZDogJ2ZvcmstYnJhbmNoJyxcbiAgICAgICAgbmFtZTogY2hpbGROYW1lLFxuICAgICAgICBwYXJlbnRJZDogYWN0aXZlSWQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBpbmNvbWluZ0tpbmQ6ICdmb3JrLWJyYW5jaCcsXG4gICAgICAgIGVudGVyZWRBdDogYXQsXG4gICAgICAgIG1ldGFkYXRhOiB7IGZvcmtQYXJlbnQ6IGV2ZW50LnBhcmVudCB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMubm9kZXNCeUlkLnNldChub2RlSWQsIG5vZGUpO1xuICAgICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgICAgaWYgKGFjdGl2ZUlkKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7IGZyb206IGFjdGl2ZUlkLCB0bzogbm9kZUlkLCBraW5kOiAnZm9yay1icmFuY2gnLCBhdCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuc2V0KGNoaWxkTmFtZSwgeyBub2RlSWQsIGF0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gICAgY29uc3QgZGVwdGggPSBhY3RpdmVJZCA/IHRoaXMubm9kZXNCeUlkLmdldChhY3RpdmVJZCkhLmRlcHRoICsgMSA6IDA7XG5cbiAgICAvLyBBIG5ldyBkZWNpc2lvbiBzdXBlcnNlZGVzIGFueSBwcmlvciB1bnJlc29sdmVkIHBlbmRpbmcgb25lLlxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZUlkID0gYGRlY2lzaW9uLSR7YXQgfHwgZXZlbnQuZGVjaWRlcn0tJHtldmVudC5jaG9zZW59YDtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIgfTtcbiAgICBpZiAoZXZlbnQucmF0aW9uYWxlKSBtZXRhZGF0YS5yYXRpb25hbGUgPSBldmVudC5yYXRpb25hbGU7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGV2ZW50LmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgbmFtZTogZXZlbnQuY2hvc2VuLFxuICAgICAgcGFyZW50SWQ6IGFjdGl2ZUlkLFxuICAgICAgZGVwdGgsXG4gICAgICBpbmNvbWluZ0tpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgZW50ZXJlZEF0OiBhdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgIGlmIChhY3RpdmVJZCkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKHsgZnJvbTogYWN0aXZlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLCBhdCB9KTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB7IG5hbWU6IGV2ZW50LmNob3Nlbiwgbm9kZUlkLCBhdCB9O1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgLy8gbG9vcFRvIGp1bXBzIGJhY2sgaW5zaWRlIHRoZSBDVVJSRU5UIHN1YmZsb3cuIFJlY29yZCBhIHNlbGYtZWRnZSBvbiB0aGVcbiAgICAvLyBhY3RpdmUgc3ViZmxvdyDigJQgc3ludGhldGljIGZvcmsvZGVjaXNpb24gbm9kZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbG9vcHMuXG4gICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWFjdGl2ZUlkKSByZXR1cm47XG4gICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgIGZyb206IGFjdGl2ZUlkLFxuICAgICAgdG86IGFjdGl2ZUlkLFxuICAgICAga2luZDogJ2xvb3AtaXRlcmF0aW9uJyxcbiAgICAgIGF0OiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5hdHRlbXB0Qm9vay5hZGQoZXZlbnQucmVjb3JkKTtcbiAgICBpZiAoIXN0YXRlKSByZXR1cm47XG4gICAgY29uc3Qgbm9kZUlkID0gYGF0dGVtcHRzLSR7c3RhdGUuc2VyaWVzfWA7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBwbGFjZWQgPSBleGlzdGluZyA/PyB0aGlzLnBsYWNlU2VyaWVzKGV2ZW50LCBub2RlSWQpO1xuICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgIC4uLnBsYWNlZCxcbiAgICAgIGF0dGVtcHRzOiBzdGF0ZS5hdHRlbXB0cyxcbiAgICAgIC4uLihzdGF0ZS5zdW1tYXJ5ICE9PSB1bmRlZmluZWQgPyB7IGF0dGVtcHRTdW1tYXJ5OiBzdGF0ZS5zdW1tYXJ5IH0gOiB7fSksXG4gICAgfTtcbiAgICBpZiAoIWV4aXN0aW5nKSB0aGlzLm5vZGVPcmRlci5wdXNoKG5vZGVJZCk7XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgaWYgKGV2ZW50LnJlY29yZC5uZXh0ID09PSAncmV0cnknKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goeyBmcm9tOiBub2RlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdyZXRyeScsIGF0OiBzdGF0ZS5zZXJpZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlcmllcyBub2RlLCB1bmRlciBpdHMgcGFyZW50OiB0aGUgcGVuZGluZyBmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLVxuICAgKiBicmFuY2ggb2YgdGhlIHNhbWUgbmFtZSAoYSBmb3JrIGNoaWxkIG9yIGEgY2hvc2VuIGJyYW5jaCB0aGF0IGlzIGEgcGxhaW5cbiAgICogc3RhZ2UpLCBlbHNlIHRoZSBvcGVuIHN1YmZsb3cgdGhlIHN0YWdlIHJ1bnMgaW4gKHJlYWQgb2ZmIGl0c1xuICAgKiBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN0YWNrIHRvcCBjYW4gYmUgYSBwYXJhbGxlbCBzaWJsaW5nKSwgZWxzZSB0aGUgdG9wXG4gICAqIGxldmVsLiBPbmUgZWRnZSBmcm9tXG4gICAqIHRoZSBwYXJlbnQsIGFzIGZvciBldmVyeSBjb21wb3NpdGlvbiBjaGlsZC5cbiAgICovXG4gIHByaXZhdGUgcGxhY2VTZXJpZXMoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQsIG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlIHtcbiAgICBjb25zdCBhdCA9IGV2ZW50LnJlY29yZC5zZXJpZXM7XG4gICAgbGV0IHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZ0ZvcmsgPSB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmdldChldmVudC5zdGFnZU5hbWUpO1xuICAgIGlmIChwZW5kaW5nRm9yaykge1xuICAgICAgcGFyZW50SWQgPSBwZW5kaW5nRm9yay5ub2RlSWQ7XG4gICAgICB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmRlbGV0ZShldmVudC5zdGFnZU5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nRGVjaXNpb24gJiYgdGhpcy5wZW5kaW5nRGVjaXNpb24ubmFtZSA9PT0gZXZlbnQuc3RhZ2VOYW1lKSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMucGVuZGluZ0RlY2lzaW9uLm5vZGVJZDtcbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXRoID0gc3ViZmxvd09mQXR0ZW1wdChldmVudCk7XG4gICAgICBwYXJlbnRJZCA9IHBhdGggIT09IHVuZGVmaW5lZCA/IHRoaXMub3BlblN1YmZsb3dCeVBhdGguZ2V0KHBhdGgpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kID0gcGFyZW50SWQgPyAnbmV4dCcgOiAncm9vdCc7XG4gICAgaWYgKHBhcmVudElkKSB0aGlzLmVkZ2VzLnB1c2goeyBmcm9tOiBwYXJlbnRJZCwgdG86IG5vZGVJZCwga2luZDogJ25leHQnLCBhdCB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdhdHRlbXB0LXNlcmllcycsXG4gICAgICBuYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGRlcHRoOiBwYXJlbnRJZCA/IHRoaXMubm9kZXNCeUlkLmdldChwYXJlbnRJZCkhLmRlcHRoICsgMSA6IDAsXG4gICAgICBpbmNvbWluZ0tpbmQsXG4gICAgICBlbnRlcmVkQXQ6IGF0LFxuICAgICAgbWV0YWRhdGE6IHsgc3RhZ2VJZDogZXZlbnQuc3RhZ2VJZCB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IHRoZSBleGVjdXRvciBiZWZvcmUgZWFjaCBgcnVuKClgIOKAlCByZXNldHMgYWxsIHN0YXRlLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVzQnlJZC5jbGVhcigpO1xuICAgIHRoaXMubm9kZU9yZGVyLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5lZGdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5jbGVhcigpO1xuICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5jbGVhcigpO1xuICAgIHRoaXMub3BlblN1YmZsb3dCeVBhdGguY2xlYXIoKTtcbiAgICB0aGlzLmF0dGVtcHRCb29rLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBMaXZlIHNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gU2FmZSBkdXJpbmcgb3IgYWZ0ZXIgYSBydW4uICovXG4gIGdldFRvcG9sb2d5KCk6IFRvcG9sb2d5IHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMubm9kZU9yZGVyLm1hcCgoaWQpID0+IHRoaXMubm9kZXNCeUlkLmdldChpZCkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXMsXG4gICAgICBlZGdlczogWy4uLnRoaXMuZWRnZXNdLFxuICAgICAgYWN0aXZlTm9kZUlkOiB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXSA/PyBudWxsLFxuICAgICAgcm9vdElkOiB0aGlzLm5vZGVPcmRlclswXSA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogRGlyZWN0IGNoaWxkcmVuIG9mIGEgbm9kZSDigJQgaW5zZXJ0aW9uLW9yZGVyZWQuICovXG4gIGdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLnBhcmVudElkID09PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBub2RlcyBvZiBhIGdpdmVuIGtpbmQuICovXG4gIGdldEJ5S2luZChraW5kOiBUb3BvbG9neU5vZGVLaW5kKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09IGtpbmQpO1xuICB9XG5cbiAgLyoqIEFsbCBtb3VudGVkIHN1YmZsb3cgbm9kZXMuIENvbnZlbmllbmNlIGZvciBhZ2VudC1jZW50cmljIHZpZXdzLiAqL1xuICBnZXRTdWJmbG93Tm9kZXMoKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEJ5S2luZCgnc3ViZmxvdycpO1xuICB9XG5cbiAgLyoqIEFsbCBmb3JrLWJyYW5jaCBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBgbm9kZUlkYCDigJQgaS5lLixcbiAgICogIHBhcmFsbGVsIHNpYmxpbmdzIG9mIGEgcGFyYWxsZWwgYnJhbmNoLiBFbXB0eSBpZiBgbm9kZUlkYCBpc24ndCBhXG4gICAqICBmb3JrLWJyYW5jaCBvciBoYXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJhbGxlbFNpYmxpbmdzKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnZm9yay1icmFuY2gnIHx8ICFub2RlLnBhcmVudElkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZS5wYXJlbnRJZCkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09ICdmb3JrLWJyYW5jaCcpO1xuICB9XG5cbiAgLyoqIEVtaXQgYSBzbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdUb3BvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbXBvc2l0aW9uIGdyYXBoOiBzdWJmbG93IGJvdW5kYXJpZXMsIGZvcmsgYnJhbmNoZXMsIGRlY2lzaW9uIGJyYW5jaGVzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldFRvcG9sb2d5KCksXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,11 @@
1
+ import type { AttemptQuery, AttemptRow } from './attemptMetricsTypes.js';
2
+ /** Decode plain own data only; external data never gets to run getters or coercion hooks. */
3
+ export declare function ownDataRecord(value: unknown): Record<string, unknown> | undefined;
4
+ /** Read an external array window by descriptors, never by executing an index accessor or iterator. */
5
+ export declare function metricWindow(value: unknown, maxRows: number): {
6
+ values: unknown[];
7
+ omitted: number;
8
+ };
9
+ /** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
10
+ export declare function metricRow(value: unknown): AttemptRow | undefined;
11
+ export declare function matchesQuery(row: AttemptRow, query: AttemptQuery): boolean;
@@ -0,0 +1,202 @@
1
+ import { parseAttemptId } from 'foottrace';
2
+ // Fixed named fields: a huge unknown envelope is never enumerated just to discard it.
3
+ const DATA_FIELDS = [
4
+ 'kind',
5
+ 'runId',
6
+ 'startedAt',
7
+ 'endedAt',
8
+ 'outcome',
9
+ 'target',
10
+ 'runtimeStageId',
11
+ 'attemptId',
12
+ 'id',
13
+ 'series',
14
+ 'attempt',
15
+ 'of',
16
+ 'effect',
17
+ 'reconciled',
18
+ 'next',
19
+ 'reason',
20
+ 'attemptKind',
21
+ 'durationMs',
22
+ 'category',
23
+ 'traceId',
24
+ 'retryLoop',
25
+ 'phase',
26
+ 'since',
27
+ 'until',
28
+ 'omittedRows',
29
+ ];
30
+ /** Decode plain own data only; external data never gets to run getters or coercion hooks. */
31
+ export function ownDataRecord(value) {
32
+ try {
33
+ if (value === null || typeof value !== 'object' || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
34
+ return undefined;
35
+ const data = Object.create(null);
36
+ for (const key of DATA_FIELDS) {
37
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
38
+ if (descriptor === undefined)
39
+ continue;
40
+ if (!Object.hasOwn(descriptor, 'value'))
41
+ return undefined;
42
+ data[key] = descriptor.value;
43
+ }
44
+ return data;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ /** Read an external array window by descriptors, never by executing an index accessor or iterator. */
51
+ export function metricWindow(value, maxRows) {
52
+ try {
53
+ if (!Array.isArray(value))
54
+ return { values: [], omitted: 1 };
55
+ const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
56
+ if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
57
+ return { values: [], omitted: 1 };
58
+ const start = Math.max(0, length - maxRows);
59
+ const values = [];
60
+ let omitted = start;
61
+ for (let index = start; index < length; index++) {
62
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
63
+ if (descriptor === undefined || !Object.hasOwn(descriptor, 'value'))
64
+ omitted++;
65
+ else
66
+ values.push(descriptor.value);
67
+ }
68
+ return { values, omitted };
69
+ }
70
+ catch {
71
+ return { values: [], omitted: 1 };
72
+ }
73
+ }
74
+ const outcomes = new Set(['ok', 'failed', 'timeout', 'aborted', 'paused']);
75
+ const categories = new Set(['timeout', 'rate-limited', 'server', 'network', 'auth', 'permanent', 'unknown']);
76
+ const reasons = new Set(['succeeded', 'paused', 'aborted', 'exhausted', 'declined', 'no-time-left', 'retryable']);
77
+ const nexts = new Set(['retry', 'done', 'stop']);
78
+ const effects = new Set(['none', 'applied', 'unknown']);
79
+ const number = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER;
80
+ const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 4096;
81
+ const count = (value) => number(value) && Number.isSafeInteger(value) && value >= 1;
82
+ function loopOf(value) {
83
+ if (value === undefined)
84
+ return undefined;
85
+ const v = ownDataRecord(value);
86
+ if (v === undefined)
87
+ throw new TypeError('invalid attempt loop');
88
+ if (!text(v.id) ||
89
+ !text(v.series) ||
90
+ !parseAttemptId(`${v.series}@1`) ||
91
+ !count(v.attempt) ||
92
+ !count(v.of) ||
93
+ v.attempt > v.of ||
94
+ (v.phase !== 'attempt' && v.phase !== 'reconcile'))
95
+ throw new TypeError('invalid attempt loop');
96
+ return { id: v.id, series: v.series, attempt: v.attempt, of: v.of, phase: v.phase };
97
+ }
98
+ /** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
99
+ export function metricRow(value) {
100
+ try {
101
+ const v = ownDataRecord(value);
102
+ if (v === undefined)
103
+ return undefined;
104
+ if (!text(v.runId) || !number(v.startedAt))
105
+ return undefined;
106
+ if (v.kind === 'run') {
107
+ if (!['running', 'ok', 'failed', 'paused'].includes(v.outcome) ||
108
+ (v.endedAt !== undefined && !number(v.endedAt)))
109
+ return undefined;
110
+ return {
111
+ kind: 'run',
112
+ runId: v.runId,
113
+ startedAt: v.startedAt,
114
+ ...(v.endedAt === undefined ? {} : { endedAt: v.endedAt }),
115
+ outcome: v.outcome,
116
+ };
117
+ }
118
+ if (!text(v.target) || !text(v.runtimeStageId) || !parseAttemptId(`${v.runtimeStageId}@1`))
119
+ return undefined;
120
+ if (v.kind === 'decision') {
121
+ const parsed = text(v.attemptId) ? parseAttemptId(v.attemptId) : undefined;
122
+ if (!parsed ||
123
+ !text(v.id) ||
124
+ !text(v.series) ||
125
+ !parseAttemptId(`${v.series}@1`) ||
126
+ !count(v.attempt) ||
127
+ !count(v.of) ||
128
+ v.attempt > v.of ||
129
+ !effects.has(v.effect) ||
130
+ typeof v.reconciled !== 'boolean' ||
131
+ !nexts.has(v.next) ||
132
+ !reasons.has(v.reason))
133
+ return undefined;
134
+ return {
135
+ kind: 'decision',
136
+ id: v.id,
137
+ series: v.series,
138
+ attempt: v.attempt,
139
+ of: v.of,
140
+ effect: v.effect,
141
+ reconciled: v.reconciled,
142
+ next: v.next,
143
+ reason: v.reason,
144
+ runId: v.runId,
145
+ target: v.target,
146
+ runtimeStageId: v.runtimeStageId,
147
+ attemptId: v.attemptId,
148
+ startedAt: v.startedAt,
149
+ };
150
+ }
151
+ const parsed = text(v.id) ? parseAttemptId(v.id) : undefined;
152
+ if (v.kind !== 'attempt' ||
153
+ !parsed ||
154
+ parsed.runtimeStageId !== v.runtimeStageId ||
155
+ !text(v.series) ||
156
+ !count(v.attempt) ||
157
+ v.id !== `${v.series}@${v.attempt}` ||
158
+ (v.of !== undefined && (!count(v.of) || v.attempt > v.of)) ||
159
+ !number(v.durationMs) ||
160
+ !outcomes.has(v.outcome) ||
161
+ !['stage', 'call', 'observed'].includes(v.attemptKind) ||
162
+ !nexts.has(v.next) ||
163
+ !reasons.has(v.reason) ||
164
+ (v.category !== undefined && !categories.has(v.category)) ||
165
+ (v.effect !== undefined && !effects.has(v.effect)) ||
166
+ (v.traceId !== undefined && !text(v.traceId)))
167
+ return undefined;
168
+ const retryLoop = loopOf(v.retryLoop);
169
+ if (retryLoop !== undefined && v.attemptKind !== 'call')
170
+ return undefined;
171
+ return {
172
+ kind: 'attempt',
173
+ id: v.id,
174
+ series: v.series,
175
+ runId: v.runId,
176
+ runtimeStageId: v.runtimeStageId,
177
+ target: v.target,
178
+ ...(v.traceId === undefined ? {} : { traceId: v.traceId }),
179
+ startedAt: v.startedAt,
180
+ durationMs: v.durationMs,
181
+ outcome: v.outcome,
182
+ ...(v.category === undefined ? {} : { category: v.category }),
183
+ next: v.next,
184
+ reason: v.reason,
185
+ attemptKind: v.attemptKind,
186
+ attempt: v.attempt,
187
+ ...(v.of === undefined ? {} : { of: v.of }),
188
+ ...(v.effect === undefined ? {} : { effect: v.effect }),
189
+ ...(retryLoop === undefined ? {} : { retryLoop }),
190
+ };
191
+ }
192
+ catch {
193
+ return undefined;
194
+ }
195
+ }
196
+ export function matchesQuery(row, query) {
197
+ return ((query.since === undefined || row.startedAt >= query.since) &&
198
+ (query.until === undefined || row.startedAt <= query.until) &&
199
+ (query.runId === undefined || row.runId === query.runId) &&
200
+ (query.target === undefined || (row.kind !== 'run' && row.target === query.target)));
201
+ }
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY1Jvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRNZXRyaWNSb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZM0Msc0ZBQXNGO0FBQ3RGLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsSUFBSTtJQUNKLFFBQVE7SUFDUixTQUFTO0lBQ1QsSUFBSTtJQUNKLFFBQVE7SUFDUixZQUFZO0lBQ1osTUFBTTtJQUNOLFFBQVE7SUFDUixhQUFhO0lBQ2IsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLGFBQWE7Q0FDTCxDQUFDO0FBQ1gsNkZBQTZGO0FBQzdGLE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYztJQUMxQyxJQUFJLENBQUM7UUFDSCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pILE9BQU8sU0FBUyxDQUFDO1FBQ25CLE1BQU0sSUFBSSxHQUE0QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvRCxJQUFJLFVBQVUsS0FBSyxTQUFT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TSxVQUFVLFlBQVksQ0FBQyxHQUFlLEVBQUUsS0FBbUI7SUFDL0QsT0FBTyxDQUNMLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hELENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNwRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBOYW1lZC1maWVsZCBhZG1pc3Npb24gZm9yIG1ldHJpYyByb3dzLCBzaGFyZWQgYnkgbGl2ZSBjb2xsZWN0aW9uIGFuZCBleHRlcm5hbCBzdG9yZSByZWFkcy4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9yZXRyeUxvb3BUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRDYXRlZ29yeSwgQXR0ZW1wdEtpbmQsIEF0dGVtcHROZXh0LCBBdHRlbXB0T3V0Y29tZSwgQXR0ZW1wdFJlYXNvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0RGVjaXNpb25Sb3csXG4gIEF0dGVtcHRRdWVyeSxcbiAgQXR0ZW1wdFJvdyxcbiAgQXR0ZW1wdFJ1blJvdyxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuXG4vLyBGaXhlZCBuYW1lZCBmaWVsZHM6IGEgaHVnZSB1bmtub3duIGVudmVsb3BlIGlzIG5ldmVyIGVudW1lcmF0ZWQganVzdCB0byBkaXNjYXJkIGl0LlxuY29uc3QgREFUQV9GSUVMRFMgPSBbXG4gICdraW5kJyxcbiAgJ3J1bklkJyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICdlbmRlZEF0JyxcbiAgJ291dGNvbWUnLFxuICAndGFyZ2V0JyxcbiAgJ3J1bnRpbWVTdGFnZUlkJyxcbiAgJ2F0dGVtcHRJZCcsXG4gICdpZCcsXG4gICdzZXJpZXMnLFxuICAnYXR0ZW1wdCcsXG4gICdvZicsXG4gICdlZmZlY3QnLFxuICAncmVjb25jaWxlZCcsXG4gICduZXh0JyxcbiAgJ3JlYXNvbicsXG4gICdhdHRlbXB0S2luZCcsXG4gICdkdXJhdGlvbk1zJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ3RyYWNlSWQnLFxuICAncmV0cnlMb29wJyxcbiAgJ3BoYXNlJyxcbiAgJ3NpbmNlJyxcbiAgJ3VudGlsJyxcbiAgJ29taXR0ZWRSb3dzJyxcbl0gYXMgY29uc3Q7XG4vKiogRGVjb2RlIHBsYWluIG93biBkYXRhIG9ubHk7IGV4dGVybmFsIGRhdGEgbmV2ZXIgZ2V0cyB0byBydW4gZ2V0dGVycyBvciBjb2VyY2lvbiBob29rcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25EYXRhUmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICFbT2JqZWN0LnByb3RvdHlwZSwgbnVsbF0uaW5jbHVkZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBEQVRBX0ZJRUxEUykge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSk7XG4gICAgICBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGRhdGFba2V5XSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBSZWFkIGFuIGV4dGVybmFsIGFycmF5IHdpbmRvdyBieSBkZXNjcmlwdG9ycywgbmV2ZXIgYnkgZXhlY3V0aW5nIGFuIGluZGV4IGFjY2Vzc29yIG9yIGl0ZXJhdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY1dpbmRvdyh2YWx1ZTogdW5rbm93biwgbWF4Um93czogbnVtYmVyKTogeyB2YWx1ZXM6IHVua25vd25bXTsgb21pdHRlZDogbnVtYmVyIH0ge1xuICB0cnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgICBjb25zdCBsZW5ndGggPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnbGVuZ3RoJyk/LnZhbHVlIGFzIHVua25vd247XG4gICAgaWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA8IDApIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIG1heFJvd3MpO1xuICAgIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gW107XG4gICAgbGV0IG9taXR0ZWQgPSBzdGFydDtcbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIFN0cmluZyhpbmRleCkpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCB8fCAhT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkgb21pdHRlZCsrO1xuICAgICAgZWxzZSB2YWx1ZXMucHVzaChkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBvbWl0dGVkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgfVxufVxuXG5jb25zdCBvdXRjb21lcyA9IG5ldyBTZXQoWydvaycsICdmYWlsZWQnLCAndGltZW91dCcsICdhYm9ydGVkJywgJ3BhdXNlZCddKTtcbmNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgU2V0KFsndGltZW91dCcsICdyYXRlLWxpbWl0ZWQnLCAnc2VydmVyJywgJ25ldHdvcmsnLCAnYXV0aCcsICdwZXJtYW5lbnQnLCAndW5rbm93biddKTtcbmNvbnN0IHJlYXNvbnMgPSBuZXcgU2V0KFsnc3VjY2VlZGVkJywgJ3BhdXNlZCcsICdhYm9ydGVkJywgJ2V4aGF1c3RlZCcsICdkZWNsaW5lZCcsICduby10aW1lLWxlZnQnLCAncmV0cnlhYmxlJ10pO1xuY29uc3QgbmV4dHMgPSBuZXcgU2V0KFsncmV0cnknLCAnZG9uZScsICdzdG9wJ10pO1xuY29uc3QgZWZmZWN0cyA9IG5ldyBTZXQoWydub25lJywgJ2FwcGxpZWQnLCAndW5rbm93biddKTtcbmNvbnN0IG51bWJlciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbmNvbnN0IHRleHQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8PSA0MDk2O1xuY29uc3QgY291bnQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgPT4gbnVtYmVyKHZhbHVlKSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMTtcbmZ1bmN0aW9uIGxvb3BPZih2YWx1ZTogdW5rbm93bik6IFJldHJ5TG9vcENhbGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdiA9IG93bkRhdGFSZWNvcmQodmFsdWUpO1xuICBpZiAodiA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGF0dGVtcHQgbG9vcCcpO1xuICBpZiAoXG4gICAgIXRleHQodi5pZCkgfHxcbiAgICAhdGV4dCh2LnNlcmllcykgfHxcbiAgICAhcGFyc2VBdHRlbXB0SWQoYCR7di5zZXJpZXN9QDFgKSB8fFxuICAgICFjb3VudCh2LmF0dGVtcHQpIHx8XG4gICAgIWNvdW50KHYub2YpIHx8XG4gICAgdi5hdHRlbXB0ID4gdi5vZiB8fFxuICAgICh2LnBoYXNlICE9PSAnYXR0ZW1wdCcgJiYgdi5waGFzZSAhPT0gJ3JlY29uY2lsZScpXG4gIClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGF0dGVtcHQgbG9vcCcpO1xuICByZXR1cm4geyBpZDogdi5pZCwgc2VyaWVzOiB2LnNlcmllcywgYXR0ZW1wdDogdi5hdHRlbXB0LCBvZjogdi5vZiwgcGhhc2U6IHYucGhhc2UgfTtcbn1cbi8qKiBJbnZhbGlkIHN0b3JlZCBkYXRhIGlzIG9taXR0ZWQgYW5kIGFjY291bnRlZCwgbmV2ZXIgY29waWVkIGFzIGFuIGFyYml0cmFyeSBlbnZlbG9wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNSb3codmFsdWU6IHVua25vd24pOiBBdHRlbXB0Um93IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gb3duRGF0YVJlY29yZCh2YWx1ZSk7XG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIXRleHQodi5ydW5JZCkgfHwgIW51bWJlcih2LnN0YXJ0ZWRBdCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHYua2luZCA9PT0gJ3J1bicpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIVsncnVubmluZycsICdvaycsICdmYWlsZWQnLCAncGF1c2VkJ10uaW5jbHVkZXModi5vdXRjb21lIGFzIHN0cmluZykgfHxcbiAgICAgICAgKHYuZW5kZWRBdCAhPT0gdW5kZWZpbmVkICYmICFudW1iZXIodi5lbmRlZEF0KSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdydW4nLFxuICAgICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiB2LnN0YXJ0ZWRBdCxcbiAgICAgICAgLi4uKHYuZW5kZWRBdCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVuZGVkQXQ6IHYuZW5kZWRBdCBhcyBudW1iZXIgfSksXG4gICAgICAgIG91dGNvbWU6IHYub3V0Y29tZSBhcyBBdHRlbXB0UnVuUm93WydvdXRjb21lJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRleHQodi50YXJnZXQpIHx8ICF0ZXh0KHYucnVudGltZVN0YWdlSWQpIHx8ICFwYXJzZUF0dGVtcHRJZChgJHt2LnJ1bnRpbWVTdGFnZUlkfUAxYCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHYua2luZCA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGV4dCh2LmF0dGVtcHRJZCkgPyBwYXJzZUF0dGVtcHRJZCh2LmF0dGVtcHRJZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgICFwYXJzZWQgfHxcbiAgICAgICAgIXRleHQodi5pZCkgfHxcbiAgICAgICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgICAgICFwYXJzZUF0dGVtcHRJZChgJHt2LnNlcmllc31AMWApIHx8XG4gICAgICAgICFjb3VudCh2LmF0dGVtcHQpIHx8XG4gICAgICAgICFjb3VudCh2Lm9mKSB8fFxuICAgICAgICB2LmF0dGVtcHQgPiB2Lm9mIHx8XG4gICAgICAgICFlZmZlY3RzLmhhcyh2LmVmZmVjdCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHR5cGVvZiB2LnJlY29uY2lsZWQgIT09ICdib29sZWFuJyB8fFxuICAgICAgICAhbmV4dHMuaGFzKHYubmV4dCBhcyBzdHJpbmcpIHx8XG4gICAgICAgICFyZWFzb25zLmhhcyh2LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZGVjaXNpb24nLFxuICAgICAgICBpZDogdi5pZCxcbiAgICAgICAgc2VyaWVzOiB2LnNlcmllcyxcbiAgICAgICAgYXR0ZW1wdDogdi5hdHRlbXB0LFxuICAgICAgICBvZjogdi5vZixcbiAgICAgICAgZWZmZWN0OiB2LmVmZmVjdCBhcyBBdHRlbXB0RGVjaXNpb25Sb3dbJ2VmZmVjdCddLFxuICAgICAgICByZWNvbmNpbGVkOiB2LnJlY29uY2lsZWQsXG4gICAgICAgIG5leHQ6IHYubmV4dCBhcyBBdHRlbXB0TmV4dCxcbiAgICAgICAgcmVhc29uOiB2LnJlYXNvbiBhcyBzdHJpbmcsXG4gICAgICAgIHJ1bklkOiB2LnJ1bklkLFxuICAgICAgICB0YXJnZXQ6IHYudGFyZ2V0LFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdi5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgYXR0ZW1wdElkOiB2LmF0dGVtcHRJZCBhcyBBdHRlbXB0SWQsXG4gICAgICAgIHN0YXJ0ZWRBdDogdi5zdGFydGVkQXQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSB0ZXh0KHYuaWQpID8gcGFyc2VBdHRlbXB0SWQodi5pZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdi5raW5kICE9PSAnYXR0ZW1wdCcgfHxcbiAgICAgICFwYXJzZWQgfHxcbiAgICAgIHBhcnNlZC5ydW50aW1lU3RhZ2VJZCAhPT0gdi5ydW50aW1lU3RhZ2VJZCB8fFxuICAgICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgICAhY291bnQodi5hdHRlbXB0KSB8fFxuICAgICAgdi5pZCAhPT0gYCR7di5zZXJpZXN9QCR7di5hdHRlbXB0fWAgfHxcbiAgICAgICh2Lm9mICE9PSB1bmRlZmluZWQgJiYgKCFjb3VudCh2Lm9mKSB8fCB2LmF0dGVtcHQgPiB2Lm9mKSkgfHxcbiAgICAgICFudW1iZXIodi5kdXJhdGlvbk1zKSB8fFxuICAgICAgIW91dGNvbWVzLmhhcyh2Lm91dGNvbWUgYXMgc3RyaW5nKSB8fFxuICAgICAgIVsnc3RhZ2UnLCAnY2FsbCcsICdvYnNlcnZlZCddLmluY2x1ZGVzKHYuYXR0ZW1wdEtpbmQgYXMgc3RyaW5nKSB8fFxuICAgICAgIW5leHRzLmhhcyh2Lm5leHQgYXMgc3RyaW5nKSB8fFxuICAgICAgIXJlYXNvbnMuaGFzKHYucmVhc29uIGFzIHN0cmluZykgfHxcbiAgICAgICh2LmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgIWNhdGVnb3JpZXMuaGFzKHYuY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICh2LmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmICFlZmZlY3RzLmhhcyh2LmVmZmVjdCBhcyBzdHJpbmcpKSB8fFxuICAgICAgKHYudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmICF0ZXh0KHYudHJhY2VJZCkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRyeUxvb3AgPSBsb29wT2Yodi5yZXRyeUxvb3ApO1xuICAgIGlmIChyZXRyeUxvb3AgIT09IHVuZGVmaW5lZCAmJiB2LmF0dGVtcHRLaW5kICE9PSAnY2FsbCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkOiB2LmlkIGFzIEF0dGVtcHRJZCxcbiAgICAgIHNlcmllczogdi5zZXJpZXMsXG4gICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB2LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgdGFyZ2V0OiB2LnRhcmdldCxcbiAgICAgIC4uLih2LnRyYWNlSWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0cmFjZUlkOiB2LnRyYWNlSWQgYXMgc3RyaW5nIH0pLFxuICAgICAgc3RhcnRlZEF0OiB2LnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHYuZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IHYub3V0Y29tZSBhcyBBdHRlbXB0T3V0Y29tZSxcbiAgICAgIC4uLih2LmNhdGVnb3J5ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY2F0ZWdvcnk6IHYuY2F0ZWdvcnkgYXMgQXR0ZW1wdENhdGVnb3J5IH0pLFxuICAgICAgbmV4dDogdi5uZXh0IGFzIEF0dGVtcHROZXh0LFxuICAgICAgcmVhc29uOiB2LnJlYXNvbiBhcyBBdHRlbXB0UmVhc29uLFxuICAgICAgYXR0ZW1wdEtpbmQ6IHYuYXR0ZW1wdEtpbmQgYXMgQXR0ZW1wdEtpbmQsXG4gICAgICBhdHRlbXB0OiB2LmF0dGVtcHQsXG4gICAgICAuLi4odi5vZiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG9mOiB2Lm9mIGFzIG51bWJlciB9KSxcbiAgICAgIC4uLih2LmVmZmVjdCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVmZmVjdDogdi5lZmZlY3QgYXMgUGh5c2ljYWxBdHRlbXB0Um93WydlZmZlY3QnXSB9KSxcbiAgICAgIC4uLihyZXRyeUxvb3AgPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZXRyeUxvb3AgfSksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNRdWVyeShyb3c6IEF0dGVtcHRSb3csIHF1ZXJ5OiBBdHRlbXB0UXVlcnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAocXVlcnkuc2luY2UgPT09IHVuZGVmaW5lZCB8fCByb3cuc3RhcnRlZEF0ID49IHF1ZXJ5LnNpbmNlKSAmJlxuICAgIChxdWVyeS51bnRpbCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5zdGFydGVkQXQgPD0gcXVlcnkudW50aWwpICYmXG4gICAgKHF1ZXJ5LnJ1bklkID09PSB1bmRlZmluZWQgfHwgcm93LnJ1bklkID09PSBxdWVyeS5ydW5JZCkgJiZcbiAgICAocXVlcnkudGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgKHJvdy5raW5kICE9PSAncnVuJyAmJiByb3cudGFyZ2V0ID09PSBxdWVyeS50YXJnZXQpKVxuICApO1xufVxuIl19
@@ -0,0 +1,7 @@
1
+ import type { AttemptAggregate, AttemptMetricRef, AttemptRow, AttemptStorageStats, PhysicalAttemptRow } from './attemptMetricsTypes.js';
2
+ export declare const attemptRowKey: (row: AttemptRow) => string;
3
+ export declare const logicalKey: (runId: string, series: string, attempt: number) => string;
4
+ export declare const seriesKey: (runId: string, series: string) => string;
5
+ export declare function reference(row: PhysicalAttemptRow): AttemptMetricRef;
6
+ export declare function worst(rows: readonly PhysicalAttemptRow[], limit: number): AttemptMetricRef[];
7
+ export declare function aggregateAttempts(rows: readonly AttemptRow[], exemplars: number, storage: AttemptStorageStats): AttemptAggregate;