footprintjs 9.48.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -1,69 +1,23 @@
1
1
  /**
2
- * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
2
+ * footprintjs/trace — recorder stores, topology, chart boundaries and control dependencies.
3
3
  *
4
- * Runtime stage IDs, commit log queries, and recorder base classes.
5
- *
6
- * @example
7
- * ```typescript
8
- * import { parseRuntimeStageId, findLastWriter, KeyedStore, SequenceStore } from 'footprintjs/trace';
9
- *
10
- * // Parse a runtimeStageId
11
- * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
12
- *
13
- * // Backtrack: who wrote 'systemPrompt' before commit at idx 8?
14
- * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
15
- *
16
- * // v5 primary API: compose a Store as a field (one purpose per recorder).
17
- * // KeyedStore<T> — 1:1 (one entry per step)
18
- * class MyRecorder {
19
- * readonly id = 'my-recorder';
20
- * private store = new KeyedStore<MyEntry>();
21
- * onWrite(e) { this.store.set(e.runtimeStageId, { ... }); }
22
- * }
23
- *
24
- * // SequenceStore<T> — 1:N (multiple entries per step, ordering matters)
25
- * class AuditRecorder {
26
- * readonly id = 'audit';
27
- * private store = new SequenceStore<AuditEntry>();
28
- * onRead(e) { this.store.push({ runtimeStageId: e.runtimeStageId, ... }); }
29
- * }
30
- * ```
4
+ * Record readers, types and runtime-ID grammar belong to `foottrace`; record path helpers belong
5
+ * to `foottrace/paths`, and record writers to `foottrace/write`. This door exports only engine-owned
6
+ * observer tools. Record symbols are never re-exported across the package boundary.
31
7
  */
32
- export type { CommitIdx, ExecutionCounter, ExecutionIndex, RuntimeStageId } from './lib/ids/runtimeStageId.js';
33
- export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId, splitStageId, } from './lib/ids/runtimeStageId.js';
34
- export { BRANCH_SEGMENT_MARKER, buildBranchSegment, hasBranchSegmentMarker, isBranchSegment, parseBranchSegment, } from './lib/ids/branchSegment.js';
35
8
  export type { WalkerItem, WalkerOptions } from './lib/engine/walkSubflowSpec.js';
36
9
  export { walkSubflowSpec } from './lib/engine/walkSubflowSpec.js';
37
- export { pathSegments } from './lib/memory/paths.js';
38
- export { UnknownVerbError } from './lib/memory/verbs.js';
39
- export type { CommitBundle, MemoryPatch, TraceEntry } from './lib/memory/types.js';
40
- export type { ExecutionTree } from './lib/memory/types.js';
41
- export { applySmartMerge } from './lib/memory/verbs.js';
42
- export type { ValueBasis, ValueBasisOptions, ValueWithBasis, WriterBasis, WriterWithBasis, } from './lib/memory/commitLogUtils.js';
43
- export { buildCommitIndex, commitIndexOf, commitValueAt, commitValueAtWithBasis, findCommit, findCommits, findLastWriter, findLastWriterWithBasis, inferLegacyPhases, recordsPhases, } from './lib/memory/commitLogUtils.js';
44
- export type { CommitPhase } from './lib/memory/types.js';
45
- export type { AxisRefusal, AxisSplit, BookendedAxis, FoldBasis, FoldedState, FoldSource, LogGap, Mark, Move, MoveRefusal, Stop, StopFilter, StopKind, TimeTravel, TimeTravelOptions, TimeTravelSource, TimeTravelStrategy, } from './lib/time-travel/index.js';
46
- export { commitStops, commitStopsStrategy, filterStops, isCommitBundle, splitAxis, stateAt, tagStops, timeTravel, } from './lib/time-travel/index.js';
47
- export type { CausalChainOptions, CausalEdge, CausalNode, ControlDependency, ControlDepLookup, EdgeWeigher, KeysReadLookup, } from './lib/memory/backtrack.js';
48
- export { causalChain, flattenCausalDAG, formatCausalChain } from './lib/memory/backtrack.js';
49
- export type { UntrackedSource } from './lib/memory/types.js';
50
- export type { ArrayProvenance, AttributionBasis, ElementBirth, FedBasis, ForwardEdge, ForwardNode, ForwardRead, ForwardSlice, ForwardSliceJSON, HonestyNote, HonestyNoteCode, KeyMoment, KeysReadSource, KeyTimeline, MissingProvenanceReason, MissingSliceReason, ReadsCoverage, SliceJSON, StateKey, VariableSlice, } from './lib/slice/index.js';
51
- export type { ForwardSliceForKeyOptions, KeyTimelineOptions, SliceForKeyOptions } from './lib/slice/index.js';
52
- export { arrayProvenance, elementProvenance, formatForwardSlice, formatSlice, formatTimeline, forwardSliceForKey, forwardSliceToJSON, keysReadFromExecutionTree, keysReadFromMap, keyTimeline, normaliseStateKey, resolveKeysReadSource, sliceForKey, sliceToJSON, } from './lib/slice/index.js';
53
- export type { HonestyCode } from './lib/memory/honesty.js';
54
- export { HONESTY_CODES } from './lib/memory/honesty.js';
10
+ export { BRANCH_SEGMENT_MARKER, buildBranchSegment, hasBranchSegmentMarker, isBranchSegment, parseBranchSegment, } from './lib/ids/branchSegment.js';
55
11
  export { BoundaryStateStore } from './lib/recorder/BoundaryStateStore.js';
56
- export { KeyedStore } from './lib/recorder/KeyedStore.js';
57
- export { SequenceStore } from './lib/recorder/SequenceStore.js';
58
- export type { RangeEntry, RangeToken } from './lib/recorder/CommitRangeIndex.js';
59
- export { CommitRangeIndex } from './lib/recorder/CommitRangeIndex.js';
60
- export type { Topology, TopologyEdge, TopologyIncomingKind, TopologyNode, TopologyRecorderOptions, } from './lib/recorder/TopologyRecorder.js';
61
- export { TopologyRecorder, topologyRecorder } from './lib/recorder/TopologyRecorder.js';
62
- export type { InOutEntry, InOutPhase, InOutRecorderOptions } from './lib/recorder/InOutRecorder.js';
63
- export { InOutRecorder, inOutRecorder, ROOT_RUNTIME_STAGE_ID, ROOT_SUBFLOW_ID } from './lib/recorder/InOutRecorder.js';
64
12
  export type { ControlDecisionRecord, ControlDepRecorderOptions } from './lib/recorder/ControlDepRecorder.js';
65
13
  export { ControlDepRecorder, controlDepRecorder } from './lib/recorder/ControlDepRecorder.js';
14
+ export type { InOutEntry, InOutPhase, InOutRecorderOptions } from './lib/recorder/InOutRecorder.js';
15
+ export { InOutRecorder, inOutRecorder, ROOT_RUNTIME_STAGE_ID, ROOT_SUBFLOW_ID } from './lib/recorder/InOutRecorder.js';
16
+ export { KeyedStore } from './lib/recorder/KeyedStore.js';
66
17
  export type { QualityEntry, QualityRecorderOptions, QualityScoringFn } from './lib/recorder/QualityRecorder.js';
67
18
  export { QualityRecorder } from './lib/recorder/QualityRecorder.js';
68
19
  export type { QualityFrame, QualityStackTrace } from './lib/recorder/qualityTrace.js';
69
20
  export { formatQualityTrace, qualityTrace } from './lib/recorder/qualityTrace.js';
21
+ export { SequenceStore } from './lib/recorder/SequenceStore.js';
22
+ export type { Topology, TopologyEdge, TopologyIncomingKind, TopologyNode, TopologyRecorderOptions, } from './lib/recorder/TopologyRecorder.js';
23
+ export { TopologyRecorder, topologyRecorder } from './lib/recorder/TopologyRecorder.js';
package/dist/esm/trace.js CHANGED
@@ -1,76 +1,18 @@
1
1
  /**
2
- * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
2
+ * footprintjs/trace — recorder stores, topology, chart boundaries and control dependencies.
3
3
  *
4
- * Runtime stage IDs, commit log queries, and recorder base classes.
5
- *
6
- * @example
7
- * ```typescript
8
- * import { parseRuntimeStageId, findLastWriter, KeyedStore, SequenceStore } from 'footprintjs/trace';
9
- *
10
- * // Parse a runtimeStageId
11
- * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
12
- *
13
- * // Backtrack: who wrote 'systemPrompt' before commit at idx 8?
14
- * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
15
- *
16
- * // v5 primary API: compose a Store as a field (one purpose per recorder).
17
- * // KeyedStore<T> — 1:1 (one entry per step)
18
- * class MyRecorder {
19
- * readonly id = 'my-recorder';
20
- * private store = new KeyedStore<MyEntry>();
21
- * onWrite(e) { this.store.set(e.runtimeStageId, { ... }); }
22
- * }
23
- *
24
- * // SequenceStore<T> — 1:N (multiple entries per step, ordering matters)
25
- * class AuditRecorder {
26
- * readonly id = 'audit';
27
- * private store = new SequenceStore<AuditEntry>();
28
- * onRead(e) { this.store.push({ runtimeStageId: e.runtimeStageId, ... }); }
29
- * }
30
- * ```
4
+ * Record readers, types and runtime-ID grammar belong to `foottrace`; record path helpers belong
5
+ * to `foottrace/paths`, and record writers to `foottrace/write`. This door exports only engine-owned
6
+ * observer tools. Record symbols are never re-exported across the package boundary.
31
7
  */
32
- export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId, splitStageId, } from './lib/ids/runtimeStageId.js';
33
- // Generated branch segments — the subflow path segments `addParallelForEach`
34
- // mints for its branches (`<stageId>~<index>`). A branch is addressed by the
35
- // ORDINARY grammar above, so nothing here is needed to READ one; these exist so
36
- // a consumer can TELL a generated branch from a hand-authored subflow (to label
37
- // it "branch 2 of review-chunks" instead of a subflow name), and so the
38
- // reserved marker is discoverable rather than folklore.
39
- // Design: docs/design/execution-control.md.
40
- export { BRANCH_SEGMENT_MARKER, buildBranchSegment, hasBranchSegmentMarker, isBranchSegment, parseBranchSegment, } from './lib/ids/branchSegment.js';
41
8
  export { walkSubflowSpec } from './lib/engine/walkSubflowSpec.js';
42
- // Path segments — the supported way to take a `TraceEntry.path` apart. Paths
43
- // are joined with an ASCII Unit-Separator (never a dot: a state key may itself
44
- // contain a dot, so a dot separator would make `['a.b']` and `['a','b']`
45
- // indistinguishable), which is an encoding, not a display character. Render a
46
- // path through this instead of splitting on the delimiter yourself.
47
- export { pathSegments } from './lib/memory/paths.js';
48
- // The refusal the commit-log readers raise for a row whose verb is not
49
- // set | merge | append | delete (`commitValueAt`, `arrayProvenance`, and
50
- // `applySmartMerge` below): a foreign or corrupted log fails loudly,
51
- // naming the row, instead of being folded as a merge.
52
- export { UnknownVerbError } from './lib/memory/verbs.js';
53
- export { applySmartMerge } from './lib/memory/verbs.js';
54
- export { buildCommitIndex, commitIndexOf, commitValueAt, commitValueAtWithBasis, findCommit, findCommits, findLastWriter, findLastWriterWithBasis,
55
- // One stage, one record (F8, 9.39.0): does a log record its continuations
56
- // (`CommitBundle.phase`), and — for a log written before it — the ONE legacy
57
- // reader that infers them the way 9.38.0 did.
58
- inferLegacyPhases, recordsPhases, } from './lib/memory/commitLogUtils.js';
59
- export { commitStops, commitStopsStrategy, filterStops, isCommitBundle, splitAxis, stateAt, tagStops, timeTravel, } from './lib/time-travel/index.js';
60
- export { causalChain, flattenCausalDAG, formatCausalChain } from './lib/memory/backtrack.js';
61
- export { arrayProvenance, elementProvenance, formatForwardSlice, formatSlice, formatTimeline, forwardSliceForKey, forwardSliceToJSON, keysReadFromExecutionTree, keysReadFromMap, keyTimeline, normaliseStateKey, resolveKeysReadSource, sliceForKey, sliceToJSON, } from './lib/slice/index.js';
62
- export { HONESTY_CODES } from './lib/memory/honesty.js';
63
- // ── v5 Stores (concrete, composable — primary recorder API) ─────
64
- // Compose these via `new Store<T>()` as a field on your recorder
65
- // class. One purpose per recorder: stores are storage; recorders
66
- // are event-hook interface implementations.
9
+ export { BRANCH_SEGMENT_MARKER, buildBranchSegment, hasBranchSegmentMarker, isBranchSegment, parseBranchSegment, } from './lib/ids/branchSegment.js';
67
10
  export { BoundaryStateStore } from './lib/recorder/BoundaryStateStore.js';
68
- export { KeyedStore } from './lib/recorder/KeyedStore.js';
69
- export { SequenceStore } from './lib/recorder/SequenceStore.js';
70
- export { CommitRangeIndex } from './lib/recorder/CommitRangeIndex.js';
71
- export { TopologyRecorder, topologyRecorder } from './lib/recorder/TopologyRecorder.js';
72
- export { InOutRecorder, inOutRecorder, ROOT_RUNTIME_STAGE_ID, ROOT_SUBFLOW_ID } from './lib/recorder/InOutRecorder.js';
73
11
  export { ControlDepRecorder, controlDepRecorder } from './lib/recorder/ControlDepRecorder.js';
12
+ export { InOutRecorder, inOutRecorder, ROOT_RUNTIME_STAGE_ID, ROOT_SUBFLOW_ID } from './lib/recorder/InOutRecorder.js';
13
+ export { KeyedStore } from './lib/recorder/KeyedStore.js';
74
14
  export { QualityRecorder } from './lib/recorder/QualityRecorder.js';
75
15
  export { formatQualityTrace, qualityTrace } from './lib/recorder/qualityTrace.js';
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUlILE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixZQUFZLEdBQ2IsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsd0VBQXdFO0FBQ3hFLHdEQUF3RDtBQUN4RCw0Q0FBNEM7QUFDNUMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUtwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSx5RUFBeUU7QUFDekUsOEVBQThFO0FBQzlFLG9FQUFvRTtBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSxxRUFBcUU7QUFDckUsc0RBQXNEO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBV3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWF4RCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixXQUFXLEVBQ1gsY0FBYyxFQUNkLHVCQUF1QjtBQUN2QiwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLDhDQUE4QztBQUM5QyxpQkFBaUIsRUFDakIsYUFBYSxHQUNkLE1BQU0sZ0NBQWdDLENBQUM7QUEwQ3hDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxjQUFjLEVBQ2QsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxHQUNYLE1BQU0sNEJBQTRCLENBQUM7QUFlcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBMkM3RixPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixlQUFlLEVBQ2YsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFdBQVcsR0FDWixNQUFNLHNCQUFzQixDQUFDO0FBYTlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV4RCxtRUFBbUU7QUFDbkUsaUVBQWlFO0FBQ2pFLGlFQUFpRTtBQUNqRSw0Q0FBNEM7QUFDNUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQVV0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUt4RixPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQU92SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUk5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBmb290cHJpbnRqcy90cmFjZSDigJQgRXhlY3V0aW9uIHRyYWNpbmcsIGRlYnVnZ2luZywgYW5kIGJhY2t0cmFja2luZyB1dGlsaXRpZXMuXG4gKlxuICogUnVudGltZSBzdGFnZSBJRHMsIGNvbW1pdCBsb2cgcXVlcmllcywgYW5kIHJlY29yZGVyIGJhc2UgY2xhc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgcGFyc2VSdW50aW1lU3RhZ2VJZCwgZmluZExhc3RXcml0ZXIsIEtleWVkU3RvcmUsIFNlcXVlbmNlU3RvcmUgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogLy8gUGFyc2UgYSBydW50aW1lU3RhZ2VJZFxuICogY29uc3QgeyBzdGFnZUlkLCBleGVjdXRpb25JbmRleCB9ID0gcGFyc2VSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0jNScpO1xuICpcbiAqIC8vIEJhY2t0cmFjazogd2hvIHdyb3RlICdzeXN0ZW1Qcm9tcHQnIGJlZm9yZSBjb21taXQgYXQgaWR4IDg/XG4gKiBjb25zdCB3cml0ZXIgPSBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csICdzeXN0ZW1Qcm9tcHQnLCA4KTtcbiAqXG4gKiAvLyB2NSBwcmltYXJ5IEFQSTogY29tcG9zZSBhIFN0b3JlIGFzIGEgZmllbGQgKG9uZSBwdXJwb3NlIHBlciByZWNvcmRlcikuXG4gKiAvLyBLZXllZFN0b3JlPFQ+IOKAlCAxOjEgKG9uZSBlbnRyeSBwZXIgc3RlcClcbiAqIGNsYXNzIE15UmVjb3JkZXIge1xuICogICByZWFkb25seSBpZCA9ICdteS1yZWNvcmRlcic7XG4gKiAgIHByaXZhdGUgc3RvcmUgPSBuZXcgS2V5ZWRTdG9yZTxNeUVudHJ5PigpO1xuICogICBvbldyaXRlKGUpIHsgdGhpcy5zdG9yZS5zZXQoZS5ydW50aW1lU3RhZ2VJZCwgeyAuLi4gfSk7IH1cbiAqIH1cbiAqXG4gKiAvLyBTZXF1ZW5jZVN0b3JlPFQ+IOKAlCAxOk4gKG11bHRpcGxlIGVudHJpZXMgcGVyIHN0ZXAsIG9yZGVyaW5nIG1hdHRlcnMpXG4gKiBjbGFzcyBBdWRpdFJlY29yZGVyIHtcbiAqICAgcmVhZG9ubHkgaWQgPSAnYXVkaXQnO1xuICogICBwcml2YXRlIHN0b3JlID0gbmV3IFNlcXVlbmNlU3RvcmU8QXVkaXRFbnRyeT4oKTtcbiAqICAgb25SZWFkKGUpIHsgdGhpcy5zdG9yZS5wdXNoKHsgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQsIC4uLiB9KTsgfVxuICogfVxuICogYGBgXG4gKi9cblxuLy8gUnVudGltZSBzdGFnZSBJRCDigJQgdW5pcXVlIGV4ZWN1dGlvbiBzdGVwIGlkZW50aWZpZXJzXG5leHBvcnQgdHlwZSB7IENvbW1pdElkeCwgRXhlY3V0aW9uQ291bnRlciwgRXhlY3V0aW9uSW5kZXgsIFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi9saWIvaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkUnVudGltZVN0YWdlSWQsXG4gIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIsXG4gIHBhcnNlUnVudGltZVN0YWdlSWQsXG4gIHNwbGl0U3RhZ2VJZCxcbn0gZnJvbSAnLi9saWIvaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcblxuLy8gR2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50cyDigJQgdGhlIHN1YmZsb3cgcGF0aCBzZWdtZW50cyBgYWRkUGFyYWxsZWxGb3JFYWNoYFxuLy8gbWludHMgZm9yIGl0cyBicmFuY2hlcyAoYDxzdGFnZUlkPn48aW5kZXg+YCkuIEEgYnJhbmNoIGlzIGFkZHJlc3NlZCBieSB0aGVcbi8vIE9SRElOQVJZIGdyYW1tYXIgYWJvdmUsIHNvIG5vdGhpbmcgaGVyZSBpcyBuZWVkZWQgdG8gUkVBRCBvbmU7IHRoZXNlIGV4aXN0IHNvXG4vLyBhIGNvbnN1bWVyIGNhbiBURUxMIGEgZ2VuZXJhdGVkIGJyYW5jaCBmcm9tIGEgaGFuZC1hdXRob3JlZCBzdWJmbG93ICh0byBsYWJlbFxuLy8gaXQgXCJicmFuY2ggMiBvZiByZXZpZXctY2h1bmtzXCIgaW5zdGVhZCBvZiBhIHN1YmZsb3cgbmFtZSksIGFuZCBzbyB0aGVcbi8vIHJlc2VydmVkIG1hcmtlciBpcyBkaXNjb3ZlcmFibGUgcmF0aGVyIHRoYW4gZm9sa2xvcmUuXG4vLyBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kLlxuZXhwb3J0IHtcbiAgQlJBTkNIX1NFR01FTlRfTUFSS0VSLFxuICBidWlsZEJyYW5jaFNlZ21lbnQsXG4gIGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIsXG4gIGlzQnJhbmNoU2VnbWVudCxcbiAgcGFyc2VCcmFuY2hTZWdtZW50LFxufSBmcm9tICcuL2xpYi9pZHMvYnJhbmNoU2VnbWVudC5qcyc7XG5cbi8vIHdhbGtTdWJmbG93U3BlYyDigJQgZmxhdCBvcmRlcmVkIHRyYXZlcnNhbCBvZiBhIHN1YmZsb3cncyBzdHJ1Y3R1cmVcbi8vIChjb25zdW1lIHZpYSBTdHJ1Y3R1cmVSZWNvcmRlci5vblN1YmZsb3dNb3VudGVkJ3Mgc3ViZmxvd1NwZWMgcGF5bG9hZClcbmV4cG9ydCB0eXBlIHsgV2Fsa2VySXRlbSwgV2Fsa2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS93YWxrU3ViZmxvd1NwZWMuanMnO1xuZXhwb3J0IHsgd2Fsa1N1YmZsb3dTcGVjIH0gZnJvbSAnLi9saWIvZW5naW5lL3dhbGtTdWJmbG93U3BlYy5qcyc7XG5cbi8vIFBhdGggc2VnbWVudHMg4oCUIHRoZSBzdXBwb3J0ZWQgd2F5IHRvIHRha2UgYSBgVHJhY2VFbnRyeS5wYXRoYCBhcGFydC4gUGF0aHNcbi8vIGFyZSBqb2luZWQgd2l0aCBhbiBBU0NJSSBVbml0LVNlcGFyYXRvciAobmV2ZXIgYSBkb3Q6IGEgc3RhdGUga2V5IG1heSBpdHNlbGZcbi8vIGNvbnRhaW4gYSBkb3QsIHNvIGEgZG90IHNlcGFyYXRvciB3b3VsZCBtYWtlIGBbJ2EuYiddYCBhbmQgYFsnYScsJ2InXWBcbi8vIGluZGlzdGluZ3Vpc2hhYmxlKSwgd2hpY2ggaXMgYW4gZW5jb2RpbmcsIG5vdCBhIGRpc3BsYXkgY2hhcmFjdGVyLiBSZW5kZXIgYVxuLy8gcGF0aCB0aHJvdWdoIHRoaXMgaW5zdGVhZCBvZiBzcGxpdHRpbmcgb24gdGhlIGRlbGltaXRlciB5b3Vyc2VsZi5cbmV4cG9ydCB7IHBhdGhTZWdtZW50cyB9IGZyb20gJy4vbGliL21lbW9yeS9wYXRocy5qcyc7XG5cbi8vIFRoZSByZWZ1c2FsIHRoZSBjb21taXQtbG9nIHJlYWRlcnMgcmFpc2UgZm9yIGEgcm93IHdob3NlIHZlcmIgaXMgbm90XG4vLyBzZXQgfCBtZXJnZSB8IGFwcGVuZCB8IGRlbGV0ZSAoYGNvbW1pdFZhbHVlQXRgLCBgYXJyYXlQcm92ZW5hbmNlYCwgYW5kXG4vLyBgYXBwbHlTbWFydE1lcmdlYCBiZWxvdyk6IGEgZm9yZWlnbiBvciBjb3JydXB0ZWQgbG9nIGZhaWxzIGxvdWRseSxcbi8vIG5hbWluZyB0aGUgcm93LCBpbnN0ZWFkIG9mIGJlaW5nIGZvbGRlZCBhcyBhIG1lcmdlLlxuZXhwb3J0IHsgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vbGliL21lbW9yeS92ZXJicy5qcyc7XG5cbi8vIFRoZSByZWNvcmQncyBvd24gc2hhcGVzIOKAlCBvbmUgYnVuZGxlIHBlciBleGVjdXRlZCBzdGFnZSAoYENvbW1pdEJ1bmRsZWApLCBpdHNcbi8vIHJvd3MgKGBUcmFjZUVudHJ5YCkgYW5kIGl0cyB2YWx1ZSBwYXRjaGVzIChgTWVtb3J5UGF0Y2hgKSDigJQgYW5kIHRoZSBvbmUgZm9sZFxuLy8gb2YgYSBidW5kbGUgb250byBhIHN0YXRlIHRoYXQgaGFuZHMgYmFjayBhIGZ1bGx5IGRldGFjaGVkIHJlc3VsdFxuLy8gKGBhcHBseVNtYXJ0TWVyZ2VgLCB0aGUgdmVyYiBsYXcncyBwdWJsaWMgZG9vcikuIEFsc28gb24gYC9hZHZhbmNlZGAgdW50aWwgMTAuMC4wO1xuLy8gYSByZWNvcmQgaXMgV1JJVFRFTiB0aHJvdWdoIGBmb290cHJpbnRqcy93cml0ZWAuIFNlZSBkb2NzL2d1aWRlcy9yZWNvcmQtY29udHJhY3QubWQuXG5leHBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL2xpYi9tZW1vcnkvdHlwZXMuanMnO1xuLy8gVGhlIGV4ZWN1dGlvbiB0cmVlIGFzIHRoZSByZWFkZXJzIHJlYWQgaXQgKEM2KTogd2hhdCBgY29tbWl0U3RvcHNgLCBgdGFnU3RvcHNgIGFuZFxuLy8gYGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWVgIHRha2Ug4oCUIGEgYFN0YWdlU25hcHNob3RgIGlzIG9uZSwgYW5kIHNvIGlzIGEgc3RvcmVkIHRyZWUuXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblRyZWUgfSBmcm9tICcuL2xpYi9tZW1vcnkvdHlwZXMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlIH0gZnJvbSAnLi9saWIvbWVtb3J5L3ZlcmJzLmpzJztcblxuLy8gQ29tbWl0IGxvZyBxdWVyaWVzIOKAlCB0eXBlZCB1dGlsaXRpZXMgZm9yIGJhY2t0cmFja2luZy5cbi8vIGNvbW1pdFZhbHVlQXQgcmVjb25zdHJ1Y3RzIHRoZSBGVUxMIHZhbHVlIG9mIGEga2V5IGF0IGEgY29tbWl0IGluZGV4IOKAlFxuLy8gcmVxdWlyZWQgdW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AgKCMxM2MtQiksIHdoZXJlIGFuIGBhcHBlbmRgXG4vLyBidW5kbGUncyBgb3ZlcndyaXRlW2tleV1gIGhvbGRzIG9ubHkgdGhlIHRhaWwuXG5leHBvcnQgdHlwZSB7XG4gIFZhbHVlQmFzaXMsXG4gIFZhbHVlQmFzaXNPcHRpb25zLFxuICBWYWx1ZVdpdGhCYXNpcyxcbiAgV3JpdGVyQmFzaXMsXG4gIFdyaXRlcldpdGhCYXNpcyxcbn0gZnJvbSAnLi9saWIvbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkQ29tbWl0SW5kZXgsXG4gIGNvbW1pdEluZGV4T2YsXG4gIGNvbW1pdFZhbHVlQXQsXG4gIGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMsXG4gIGZpbmRDb21taXQsXG4gIGZpbmRDb21taXRzLFxuICBmaW5kTGFzdFdyaXRlcixcbiAgZmluZExhc3RXcml0ZXJXaXRoQmFzaXMsXG4gIC8vIE9uZSBzdGFnZSwgb25lIHJlY29yZCAoRjgsIDkuMzkuMCk6IGRvZXMgYSBsb2cgcmVjb3JkIGl0cyBjb250aW51YXRpb25zXG4gIC8vIChgQ29tbWl0QnVuZGxlLnBoYXNlYCksIGFuZCDigJQgZm9yIGEgbG9nIHdyaXR0ZW4gYmVmb3JlIGl0IOKAlCB0aGUgT05FIGxlZ2FjeVxuICAvLyByZWFkZXIgdGhhdCBpbmZlcnMgdGhlbSB0aGUgd2F5IDkuMzguMCBkaWQuXG4gIGluZmVyTGVnYWN5UGhhc2VzLFxuICByZWNvcmRzUGhhc2VzLFxufSBmcm9tICcuL2xpYi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuZXhwb3J0IHR5cGUgeyBDb21taXRQaGFzZSB9IGZyb20gJy4vbGliL21lbW9yeS90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCB0aW1lLXRyYXZlbC8g4oCUIHRoZSBSRUFERVInUyBjdXJzb3Igb3ZlciBhIGZpbmlzaGVkIHRyYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQSBUcmFjZSBpcyB3aGF0IHRoZSBydW4gcmVjb3JkZWQ7IHRpbWUgdHJhdmVsIGlzIGEgY3Vyc29yIG92ZXIgaXQgd2l0aCBhXG4vLyBGb2xkIGF0IGVhY2ggc3RvcC4gSXQgaXMgTk9UIHRoZSBlbmdpbmUncyB3YWxrIGFuZCBuZXZlciBiZWNvbWVzIGEgc2Vjb25kXG4vLyBsaXZlIGN1cnNvcjogZXZlcnl0aGluZyBiZWxvdyBpcyBhIHJlYWQtdGltZSBxdWVyeSBvdmVyIGFscmVhZHktY29sbGVjdGVkXG4vLyBkYXRhLlxuLy9cbi8vIGBzdGF0ZUF0KHNuYXBzaG90IHwgc3VidHJlZSwgY29tbWl0SWR4KWAgaXMgdGhlIGZvbGQg4oCUIHRoZSBydW4nc1xuLy8gYGluaXRpYWxTdGF0ZWAgcmVwbGF5ZWQgdGhyb3VnaCBgY29tbWl0TG9nWzAuLmNvbW1pdElkeF1gIHdpdGggdGhlIFNBTUUgdmVyYlxuLy8gc3dpdGNoIHRoZSBsaXZlIGNvbW1pdCB1c2VzLCByZXR1cm5lZCBkZXRhY2hlZCBhbmQgZnJvemVuLCBhbmQgaG9uZXN0IGFib3V0XG4vLyBob3cgaXQgd2FzIGRlcml2ZWQgKGBiYXNpc2ApIGFuZCB3aGVyZSB0aGUgbG9nIHdhcyBzY3J1YmJlZCAoYHJlZGFjdGVkYCkuXG4vL1xuLy8gYHRpbWVUcmF2ZWwoc25hcHNob3QpYCBpcyB0aGUgY3Vyc29yOiBzdG9wcywgcHJldi9uZXh0L2p1bXBUbywgbWFya3MgYmVzaWRlXG4vLyB0aGUgbG9nLCBhbmQgYGRyaWxsKG1vdW50KWAgaW50byBhIHN1YmZsb3cncyBvd24gbG9nIOKAlCB0aGUgc2FtZSBpbnRlcmZhY2UsXG4vLyBpdHMgb3duIGJhc2UuIEhvdyBzdG9wcyBhcmUgREVSSVZFRCBpcyB0aGUgc2VhbSAoYFRpbWVUcmF2ZWxTdHJhdGVneWApO1xuLy8gZm9vdHByaW50anMgc2hpcHMgYGNvbW1pdFN0b3BzYCAob25lIHN0b3AgcGVyIGV4ZWN1dGVkIHN0YWdlKSBiZWNhdXNlIHRoYXRcbi8vIGlzIHRoZSBvbmx5IHN0b3AgZ3JhbW1hciB0aGUgc3Vic3RyYXRlIGl0c2VsZiBrbm93cyDigJQgYW5kLCBzaW5jZSA5LjIxLjAsXG4vLyBgdGFnU3RvcHModGFncz8pYDogdGhlIHN0b3BzIGEgY2hhcnQgREVDTEFSRUQgYXQgYnVpbGQgdGltZSAoYC50YWcoKWApLFxuLy8gcmVhZCBiYWNrIG9mZiBgQ29tbWl0QnVuZGxlLnRhZ3NgLCBzbyBhIHN0b3JlZCByZWNvcmRpbmcgc2NydWJzIGJ5IGl0cyBvd25cbi8vIG1pbGVzdG9uZXMgd2l0aCBubyBpZCBjb252ZW50aW9ucyBpbiB0aGUgcmVhZGVyLlxuLy8gU2VlIHNyYy9saWIvdGltZS10cmF2ZWwvUkVBRE1FLm1kLlxuZXhwb3J0IHR5cGUge1xuICBBeGlzUmVmdXNhbCxcbiAgQXhpc1NwbGl0LFxuICBCb29rZW5kZWRBeGlzLFxuICBGb2xkQmFzaXMsXG4gIEZvbGRlZFN0YXRlLFxuICBGb2xkU291cmNlLFxuICBMb2dHYXAsXG4gIE1hcmssXG4gIE1vdmUsXG4gIE1vdmVSZWZ1c2FsLFxuICBTdG9wLFxuICBTdG9wRmlsdGVyLFxuICBTdG9wS2luZCxcbiAgVGltZVRyYXZlbCxcbiAgVGltZVRyYXZlbE9wdGlvbnMsXG4gIFRpbWVUcmF2ZWxTb3VyY2UsXG4gIFRpbWVUcmF2ZWxTdHJhdGVneSxcbn0gZnJvbSAnLi9saWIvdGltZS10cmF2ZWwvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgY29tbWl0U3RvcHMsXG4gIGNvbW1pdFN0b3BzU3RyYXRlZ3ksXG4gIGZpbHRlclN0b3BzLFxuICBpc0NvbW1pdEJ1bmRsZSxcbiAgc3BsaXRBeGlzLFxuICBzdGF0ZUF0LFxuICB0YWdTdG9wcyxcbiAgdGltZVRyYXZlbCxcbn0gZnJvbSAnLi9saWIvdGltZS10cmF2ZWwvaW5kZXguanMnO1xuXG4vLyBDYXVzYWwgY2hhaW4g4oCUIGJhY2t3YXJkIHByb2dyYW0gc2xpY2luZyBvbiBjb21taXQgbG9nIChEQUcpLlxuLy8gUkZDLTAwMyBEMzogYENhdXNhbEVkZ2VgICh0eXBlZC9rZXllZC93ZWlnaHRlZCBwYXJlbnQgbGlua3Mgb25cbi8vIGBDYXVzYWxOb2RlLnBhcmVudEVkZ2VzYCkgKyB0aGUgYGNvbnRyb2xEZXBzYCBvcHRpb24gKGBDb250cm9sRGVwTG9va3VwYClcbi8vIGFkZCBjb250cm9sLWRlcGVuZGVuY2UgZWRnZXMgdG8gdGhlIHNsaWNlLlxuZXhwb3J0IHR5cGUge1xuICBDYXVzYWxDaGFpbk9wdGlvbnMsXG4gIENhdXNhbEVkZ2UsXG4gIENhdXNhbE5vZGUsXG4gIENvbnRyb2xEZXBlbmRlbmN5LFxuICBDb250cm9sRGVwTG9va3VwLFxuICBFZGdlV2VpZ2hlcixcbiAgS2V5c1JlYWRMb29rdXAsXG59IGZyb20gJy4vbGliL21lbW9yeS9iYWNrdHJhY2suanMnO1xuZXhwb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnLi9saWIvbWVtb3J5L2JhY2t0cmFjay5qcyc7XG4vLyBSRkMtMDAzIEQyIOKAlCBob25lc3R5IG1hcmtlcnM6IHRoZSB1bnRyYWNrZWQgcmVhZCBwYXRocyBhIHN0YWdlIGNvbnN1bWVkXG4vLyAoYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCDihpIgYENhdXNhbE5vZGUuaW5jb21wbGV0ZVNvdXJjZXNgKS5cbmV4cG9ydCB0eXBlIHsgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi9saWIvbWVtb3J5L3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIHNsaWNlLyDigJQgdmFyaWFibGUtZmlyc3Qgc2xpY2luZywgYm90aCBkaXJlY3Rpb25zICh0cmlhZ2UgcXVlcnkgbGF5ZXIpIOKUgOKUgFxuLy8gT25lIGNvbnRyYWN0IGZvciBldmVyeSB0cmlhZ2Ugc3VyZmFjZSAoVUkgcGFuZWwsIExMTSB0b29sLCBvZmZsaW5lXG4vLyBhdXRvcHN5IGFnZW50KTogdmFyaWFibGUgaW4g4oaSIHNsaWNlIG91dC5cbi8vXG4vLyBCQUNLV0FSRCDigJQgYHNsaWNlRm9yS2V5YCBhbmNob3JzIGF0IHRoZSBrZXkncyBsYXN0IHdyaXRlciB0aGVuIGRlbGVnYXRlc1xuLy8gdG8gY2F1c2FsQ2hhaW47IGBhcnJheVByb3ZlbmFuY2VgIC8gYGVsZW1lbnRQcm92ZW5hbmNlYCAoYXBwZW5kLWZvbGQpXG4vLyBhbnN3ZXIgZWxlbWVudC1sZXZlbCBxdWVzdGlvbnMgbGlrZSBcIndoaWNoIHN0YWdlIHByb2R1Y2VkIGhpc3RvcnlbN10/XCIg4oCUXG4vLyB0aGUgZml4IGZvciB0aGUgYWdlbnQgbWVnYS1rZXkgcHJvYmxlbSwgd2l0aCBob25lc3QgYXR0cmlidXRpb24gbGFiZWxzLlxuLy9cbi8vIEZPUldBUkQg4oCUIGBmb3J3YXJkU2xpY2VGb3JLZXlgIHdhbGtzIHRoZSBvdGhlciB3YXk6IGZyb20gYSB3cml0ZSwgdGhyb3VnaFxuLy8gdGhlIHZhbHVlJ3MgTElWRSBSQU5HRSAoaXQgbGl2ZXMgdW50aWwgdGhlIGtleSdzIG5leHQgd3JpdGUpLCB0byBldmVyeVxuLy8gc3RhZ2UgdGhhdCByZWFkIGl0IGFuZCBldmVyeSB3cml0ZSB0aG9zZSByZWFkcyBmZWQuIGBrZXlUaW1lbGluZWAgaXMgdGhlXG4vLyBmbGF0IGNocm9ub2xvZ2ljYWwgdmlldyBvZiB0aGUgc2FtZSBmYWN0cy4gRmVkIGVkZ2VzIGFyZSBFWEFDVCB1bmRlciB0aGVcbi8vIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsIGFuZCBzdGFtcGVkIENPTlNFUlZBVElWRSB3aXRob3V0XG4vLyBpdCDigJQgbmV2ZXIgdGhlIG90aGVyIHdheSByb3VuZC4gU2VlIHNyYy9saWIvc2xpY2UvUkVBRE1FLm1kLlxuZXhwb3J0IHR5cGUge1xuICBBcnJheVByb3ZlbmFuY2UsXG4gIEF0dHJpYnV0aW9uQmFzaXMsXG4gIEVsZW1lbnRCaXJ0aCxcbiAgRmVkQmFzaXMsXG4gIEZvcndhcmRFZGdlLFxuICBGb3J3YXJkTm9kZSxcbiAgRm9yd2FyZFJlYWQsXG4gIEZvcndhcmRTbGljZSxcbiAgRm9yd2FyZFNsaWNlSlNPTixcbiAgSG9uZXN0eU5vdGUsXG4gIEhvbmVzdHlOb3RlQ29kZSxcbiAgS2V5TW9tZW50LFxuICBLZXlzUmVhZFNvdXJjZSxcbiAgS2V5VGltZWxpbmUsXG4gIE1pc3NpbmdQcm92ZW5hbmNlUmVhc29uLFxuICBNaXNzaW5nU2xpY2VSZWFzb24sXG4gIFJlYWRzQ292ZXJhZ2UsXG4gIFNsaWNlSlNPTixcbiAgU3RhdGVLZXksXG4gIFZhcmlhYmxlU2xpY2UsXG59IGZyb20gJy4vbGliL3NsaWNlL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHsgRm9yd2FyZFNsaWNlRm9yS2V5T3B0aW9ucywgS2V5VGltZWxpbmVPcHRpb25zLCBTbGljZUZvcktleU9wdGlvbnMgfSBmcm9tICcuL2xpYi9zbGljZS9pbmRleC5qcyc7XG5leHBvcnQge1xuICBhcnJheVByb3ZlbmFuY2UsXG4gIGVsZW1lbnRQcm92ZW5hbmNlLFxuICBmb3JtYXRGb3J3YXJkU2xpY2UsXG4gIGZvcm1hdFNsaWNlLFxuICBmb3JtYXRUaW1lbGluZSxcbiAgZm9yd2FyZFNsaWNlRm9yS2V5LFxuICBmb3J3YXJkU2xpY2VUb0pTT04sXG4gIGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWUsXG4gIGtleXNSZWFkRnJvbU1hcCxcbiAga2V5VGltZWxpbmUsXG4gIG5vcm1hbGlzZVN0YXRlS2V5LFxuICByZXNvbHZlS2V5c1JlYWRTb3VyY2UsXG4gIHNsaWNlRm9yS2V5LFxuICBzbGljZVRvSlNPTixcbn0gZnJvbSAnLi9saWIvc2xpY2UvaW5kZXguanMnO1xuXG4vLyDilIDilIAgaG9uZXN0eSDigJQgdGhlIE9ORSByZWdpc3RyeSBvZiB3aGF0IGEgcmVhZGVyIGNhbm5vdCBzZWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUaGUgaG9uZXN0eSBzaWduYWxzIHRoaXMgZG9vcidzIHJlYWRlcnMgcHJvZHVjZSDigJQgYSBzbGljZSdzIGBIb25lc3R5Tm90ZS5jb2RlYCBhbmQgYG1pc3NpbmdgXG4vLyByZWFzb24sIGEgZmVkIGVkZ2UncyBhbmQgYW4gZWxlbWVudCBiaXJ0aCdzIGBiYXNpc2AsIGEgZm9sZCdzIGBiYXNpc2AgYW5kIGByZWRhY3RlZGAgcGF0aHMsIGFcbi8vIGBMb2dHYXBgLCBhIGNhdXNhbCBub2RlJ3MgYGluY29tcGxldGVTb3VyY2VzYCBhbmQgYHRydW5jYXRlZGAg4oCUIGVhY2ggaGFzIGEgY29kZSBoZXJlIGFuZCB0aGUgT05FXG4vLyBzZW50ZW5jZSB0aGF0IHNheXMgd2hhdCBpdCBtZWFucywgc28gYSBsZW5zIG9yIGFuIGFnZW50IHRvb2wgZXhwbGFpbnMgYW55IG9mIHRoZW0gZnJvbSBvbmUgcGxhY2Vcbi8vIGluc3RlYWQgb2Yga2VlcGluZyBpdHMgb3duIHRhYmxlLiBUaGUgdW5pb25zIG9mIHRob3NlIGNvZGVzIGV4cG9ydGVkIGFib3ZlIChgSG9uZXN0eU5vdGVDb2RlYCxcbi8vIGBNaXNzaW5nU2xpY2VSZWFzb25gLCBgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb25gLCBgRmVkQmFzaXNgLCBgQXR0cmlidXRpb25CYXNpc2AsIGBGb2xkQmFzaXNgKSBhcmVcbi8vIHN1YnNldHMgb2YgYEhvbmVzdHlDb2RlYCwgYW5kIHRlc3QvYXJjaGl0ZWN0dXJlL2hvbmVzdHktdm9jYWJ1bGFyeS50ZXN0LnRzIGZhaWxzIG9uIGEgdW5pb24gb2Zcbi8vIHN0cmluZyBsaXRlcmFscyB0aGlzIGRvb3IgZXhwb3J0cyB0aGF0IGlzIG5laXRoZXIgcmVnaXN0ZXJlZCBub3IgbmFtZWQgdGhlcmUgYXMgYSBkaWZmZXJlbnQga2luZFxuLy8gb2Ygd29yZC4gU2VlIHNyYy9saWIvbWVtb3J5L1JFQURNRS5tZC5cbmV4cG9ydCB0eXBlIHsgSG9uZXN0eUNvZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaG9uZXN0eS5qcyc7XG5leHBvcnQgeyBIT05FU1RZX0NPREVTIH0gZnJvbSAnLi9saWIvbWVtb3J5L2hvbmVzdHkuanMnO1xuXG4vLyDilIDilIAgdjUgU3RvcmVzIChjb25jcmV0ZSwgY29tcG9zYWJsZSDigJQgcHJpbWFyeSByZWNvcmRlciBBUEkpIOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tcG9zZSB0aGVzZSB2aWEgYG5ldyBTdG9yZTxUPigpYCBhcyBhIGZpZWxkIG9uIHlvdXIgcmVjb3JkZXJcbi8vIGNsYXNzLiBPbmUgcHVycG9zZSBwZXIgcmVjb3JkZXI6IHN0b3JlcyBhcmUgc3RvcmFnZTsgcmVjb3JkZXJzXG4vLyBhcmUgZXZlbnQtaG9vayBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25zLlxuZXhwb3J0IHsgQm91bmRhcnlTdGF0ZVN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQm91bmRhcnlTdGF0ZVN0b3JlLmpzJztcbmV4cG9ydCB7IEtleWVkU3RvcmUgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9LZXllZFN0b3JlLmpzJztcbmV4cG9ydCB7IFNlcXVlbmNlU3RvcmUgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9TZXF1ZW5jZVN0b3JlLmpzJztcblxuLy8g4pSA4pSAIHY1LjEgQ29tbWl0IGdyb3VwaW5nIHByaW1pdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEludGVydmFsIGluZGV4IG92ZXIgY29tbWl0IGluZGljZXMuIEJ1aWx0IGluY3JlbWVudGFsbHkgZHVyaW5nXG4vLyB0cmF2ZXJzYWw6IG9wZW4oKSBvbiBib3VuZGFyeSBlbnRyeSwgY2xvc2UoKSBvbiBleGl0LiBRdWVyeSBhdCBhbnlcbi8vIGNvbW1pdCBwb3NpdGlvbiB3aXRoIGVuY2xvc2luZygpL292ZXJsYXBwaW5nKCkuIEdlbmVyaWMgb3ZlciBUTGFiZWxcbi8vIOKAlCBmb290cHJpbnRqcyBvd25zIFpFUk8ga25vd2xlZGdlIG9mIHdoYXQgY29uc3VtZXJzIHVzZSBhcyBsYWJlbHMuXG4vLyBTZWUgZG9jcy9kZXNpZ24vY29tbWl0LXJhbmdlLWluZGV4Lm1kIGZvciB0aGUgZnVsbCBjb250cmFjdC5cbmV4cG9ydCB0eXBlIHsgUmFuZ2VFbnRyeSwgUmFuZ2VUb2tlbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbW1pdFJhbmdlSW5kZXguanMnO1xuZXhwb3J0IHsgQ29tbWl0UmFuZ2VJbmRleCB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbW1pdFJhbmdlSW5kZXguanMnO1xuXG4vLyBUb3BvbG9neVJlY29yZGVyIOKAlCBjb21wb3NpdGlvbiBncmFwaCBhY2N1bXVsYXRvciAoc3ViZmxvd3MgKyBjb250cm9sLWZsb3cgZWRnZXMpXG5leHBvcnQgdHlwZSB7XG4gIFRvcG9sb2d5LFxuICBUb3BvbG9neUVkZ2UsXG4gIFRvcG9sb2d5SW5jb21pbmdLaW5kLFxuICBUb3BvbG9neU5vZGUsXG4gIFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zLFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9Ub3BvbG9neVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IFRvcG9sb2d5UmVjb3JkZXIsIHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Ub3BvbG9neVJlY29yZGVyLmpzJztcblxuLy8gSW5PdXRSZWNvcmRlciDigJQgY2hhcnQgaW4vb3V0IHN0cmVhbSAoZW50cnkvZXhpdCBwYWlycyBhdCBldmVyeSBjaGFydCBib3VuZGFyeSxcbi8vIGluY2x1ZGluZyB0aGUgdG9wLWxldmVsIHJ1biBhbmQgZXZlcnkgc3ViZmxvdylcbmV4cG9ydCB0eXBlIHsgSW5PdXRFbnRyeSwgSW5PdXRQaGFzZSwgSW5PdXRSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Jbk91dFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IEluT3V0UmVjb3JkZXIsIGluT3V0UmVjb3JkZXIsIFJPT1RfUlVOVElNRV9TVEFHRV9JRCwgUk9PVF9TVUJGTE9XX0lEIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci5qcyc7XG5cbi8vIENvbnRyb2xEZXBSZWNvcmRlciDigJQgY29udHJvbC1kZXBlbmRlbmNlIHRyYWNraW5nIChSRkMtMDAzIEQ1KTogcmVjb3Jkc1xuLy8gb25EZWNpc2lvbi9vblNlbGVjdGVkICsgdGhlIEQxIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4sIGFuc3dlcnMgXCJ3aGljaFxuLy8gZGVjaXNpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiDigJQgdGhlIGJ1aWx0LWluIHByb2R1Y2VyIGZvclxuLy8gY2F1c2FsQ2hhaW4ncyBgY29udHJvbERlcHNgIG9wdGlvbi5cbmV4cG9ydCB0eXBlIHsgQ29udHJvbERlY2lzaW9uUmVjb3JkLCBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQ29udHJvbERlcFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IENvbnRyb2xEZXBSZWNvcmRlciwgY29udHJvbERlcFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQ29udHJvbERlcFJlY29yZGVyLmpzJztcblxuLy8gUXVhbGl0eVJlY29yZGVyIOKAlCBwZXItc3RlcCBxdWFsaXR5IHNjb3Jpbmcgd2l0aCBiYWNrdHJhY2tpbmdcbmV4cG9ydCB0eXBlIHsgUXVhbGl0eUVudHJ5LCBRdWFsaXR5UmVjb3JkZXJPcHRpb25zLCBRdWFsaXR5U2NvcmluZ0ZuIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvUXVhbGl0eVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IFF1YWxpdHlSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL1F1YWxpdHlSZWNvcmRlci5qcyc7XG5cbi8vIHF1YWxpdHlUcmFjZSDigJQgUXVhbGl0eSBTdGFjayBUcmFjZSAoYmFja3RyYWNrIGZyb20gbG93LXNjb3Jpbmcgc3RlcHMpXG5leHBvcnQgdHlwZSB7IFF1YWxpdHlGcmFtZSwgUXVhbGl0eVN0YWNrVHJhY2UgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9xdWFsaXR5VHJhY2UuanMnO1xuZXhwb3J0IHsgZm9ybWF0UXVhbGl0eVRyYWNlLCBxdWFsaXR5VHJhY2UgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9xdWFsaXR5VHJhY2UuanMnO1xuIl19
16
+ export { SequenceStore } from './lib/recorder/SequenceStore.js';
17
+ export { TopologyRecorder, topologyRecorder } from './lib/recorder/TopologyRecorder.js';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBUWhFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBmb290cHJpbnRqcy90cmFjZSDigJQgcmVjb3JkZXIgc3RvcmVzLCB0b3BvbG9neSwgY2hhcnQgYm91bmRhcmllcyBhbmQgY29udHJvbCBkZXBlbmRlbmNpZXMuXG4gKlxuICogUmVjb3JkIHJlYWRlcnMsIHR5cGVzIGFuZCBydW50aW1lLUlEIGdyYW1tYXIgYmVsb25nIHRvIGBmb290dHJhY2VgOyByZWNvcmQgcGF0aCBoZWxwZXJzIGJlbG9uZ1xuICogdG8gYGZvb3R0cmFjZS9wYXRoc2AsIGFuZCByZWNvcmQgd3JpdGVycyB0byBgZm9vdHRyYWNlL3dyaXRlYC4gVGhpcyBkb29yIGV4cG9ydHMgb25seSBlbmdpbmUtb3duZWRcbiAqIG9ic2VydmVyIHRvb2xzLiBSZWNvcmQgc3ltYm9scyBhcmUgbmV2ZXIgcmUtZXhwb3J0ZWQgYWNyb3NzIHRoZSBwYWNrYWdlIGJvdW5kYXJ5LlxuICovXG5cbmV4cG9ydCB0eXBlIHsgV2Fsa2VySXRlbSwgV2Fsa2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS93YWxrU3ViZmxvd1NwZWMuanMnO1xuZXhwb3J0IHsgd2Fsa1N1YmZsb3dTcGVjIH0gZnJvbSAnLi9saWIvZW5naW5lL3dhbGtTdWJmbG93U3BlYy5qcyc7XG5leHBvcnQge1xuICBCUkFOQ0hfU0VHTUVOVF9NQVJLRVIsXG4gIGJ1aWxkQnJhbmNoU2VnbWVudCxcbiAgaGFzQnJhbmNoU2VnbWVudE1hcmtlcixcbiAgaXNCcmFuY2hTZWdtZW50LFxuICBwYXJzZUJyYW5jaFNlZ21lbnQsXG59IGZyb20gJy4vbGliL2lkcy9icmFuY2hTZWdtZW50LmpzJztcbmV4cG9ydCB7IEJvdW5kYXJ5U3RhdGVTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVTdG9yZS5qcyc7XG5leHBvcnQgdHlwZSB7IENvbnRyb2xEZWNpc2lvblJlY29yZCwgQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbnRyb2xEZXBSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBDb250cm9sRGVwUmVjb3JkZXIsIGNvbnRyb2xEZXBSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbnRyb2xEZXBSZWNvcmRlci5qcyc7XG5leHBvcnQgdHlwZSB7IEluT3V0RW50cnksIEluT3V0UGhhc2UsIEluT3V0UmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBJbk91dFJlY29yZGVyLCBpbk91dFJlY29yZGVyLCBST09UX1JVTlRJTUVfU1RBR0VfSUQsIFJPT1RfU1VCRkxPV19JRCB9IGZyb20gJy4vbGliL3JlY29yZGVyL0luT3V0UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgS2V5ZWRTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL0tleWVkU3RvcmUuanMnO1xuZXhwb3J0IHR5cGUgeyBRdWFsaXR5RW50cnksIFF1YWxpdHlSZWNvcmRlck9wdGlvbnMsIFF1YWxpdHlTY29yaW5nRm4gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgUXVhbGl0eVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvUXVhbGl0eVJlY29yZGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgUXVhbGl0eUZyYW1lLCBRdWFsaXR5U3RhY2tUcmFjZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL3F1YWxpdHlUcmFjZS5qcyc7XG5leHBvcnQgeyBmb3JtYXRRdWFsaXR5VHJhY2UsIHF1YWxpdHlUcmFjZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL3F1YWxpdHlUcmFjZS5qcyc7XG5leHBvcnQgeyBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvU2VxdWVuY2VTdG9yZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFRvcG9sb2d5LFxuICBUb3BvbG9neUVkZ2UsXG4gIFRvcG9sb2d5SW5jb21pbmdLaW5kLFxuICBUb3BvbG9neU5vZGUsXG4gIFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zLFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9Ub3BvbG9neVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IFRvcG9sb2d5UmVjb3JkZXIsIHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Ub3BvbG9neVJlY29yZGVyLmpzJztcbiJdfQ==
package/dist/index.js CHANGED
@@ -9,8 +9,8 @@
9
9
  * ```ts
10
10
  * import { flowChart, decide, narrative } from 'footprintjs'; // main — start here
11
11
  * import { metrics, debug, manifest } from 'footprintjs/recorders'; // recorder factories
12
- * import { stateAt, causalChain } from 'footprintjs/trace'; // read a finished run
13
- * import { RecordFrame, EventLog } from 'footprintjs/write'; // write a record yourself
12
+ * import { stateAt, causalChain } from 'foottrace'; // read a finished run
13
+ * import { RecordFrame, EventLog } from 'foottrace/write'; // write a record yourself
14
14
  * import { StageContext } from 'footprintjs/advanced'; // engine internals
15
15
  * ```
16
16
  *
@@ -131,4 +131,4 @@ Object.defineProperty(exports, "isDevMode", { enumerable: true, get: function ()
131
131
  // same bytes JSON.stringify emits, for a deep `next` chain it cannot encode.
132
132
  var stringifySnapshot_js_1 = require("./lib/runner/stringifySnapshot.js");
133
133
  Object.defineProperty(exports, "stringifySnapshot", { enumerable: true, get: function () { return stringifySnapshot_js_1.stringifySnapshot; } });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOzs7QUFTSCw0QkFBNEI7QUFDNUIsbURBQXdGO0FBQS9FLHFHQUFBLFNBQVMsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNkdBQUEsaUJBQWlCLE9BQUE7QUE2QnZELDRCQUE0QjtBQUM1QiwrQ0FBMkM7QUFBbEMseUdBQUEsU0FBUyxPQUFBO0FBb0JsQixtQ0FBbUM7QUFDbkMsa0RBQXVEO0FBQTlDLGtHQUFBLE1BQU0sT0FBQTtBQUFFLGtHQUFBLE1BQU0sT0FBQTtBQWtCdkIsb0JBQW9CO0FBQ3BCLGtEQUEwRDtBQUFqRCw2R0FBQSxpQkFBaUIsT0FBQTtBQUUxQixvQkFBb0I7QUFDcEIsa0RBQW1EO0FBQTFDLHNHQUFBLFVBQVUsT0FBQTtBQXFCbkIsK0JBQStCO0FBQy9CLGlEQUFzRDtBQUE3QywwR0FBQSxjQUFjLE9BQUE7QUFFdkIsK0JBQStCO0FBQy9CLGlEQUFxRDtBQUE1Qyx5R0FBQSxhQUFhLE9BQUE7QUFFdEIsb0NBQW9DO0FBQ3BDLG9EQUE0RDtBQUFuRCw2R0FBQSxpQkFBaUIsT0FBQTtBQW1DMUIscUVBQXFFO0FBQ3JFLG9EQUtpQztBQUovQixrSEFBQSxzQkFBc0IsT0FBQTtBQUN0QixrSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qiw4R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix1R0FBQSxXQUFXLE9BQUE7QUFvRGIsK0JBQStCO0FBQy9CLGtEQUE4RDtBQUFyRCxpSEFBQSxxQkFBcUIsT0FBQTtBQUs5QiwrQkFBK0I7QUFDL0IsbURBQTZEO0FBQXBELGlIQUFBLG9CQUFvQixPQUFBO0FBRTdCLCtCQUErQjtBQUMvQixtREFBc0U7QUFBN0QsMEhBQUEsNkJBQTZCLE9BQUE7QUFFdEMsK0JBQStCO0FBQy9CLG1EQUF1RTtBQUE5RCwySEFBQSw4QkFBOEIsT0FBQTtBQUV2QywrQkFBK0I7QUFDL0IsbURBQXlFO0FBQWhFLDZIQUFBLGdDQUFnQyxPQUFBO0FBRXpDLCtCQUErQjtBQUMvQixtREFBaUU7QUFBeEQscUhBQUEsd0JBQXdCLE9BQUE7QUFFakMsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQUV0QywrQkFBK0I7QUFDL0IsbURBQW9FO0FBQTNELHdIQUFBLDJCQUEyQixPQUFBO0FBRXBDLCtCQUErQjtBQUMvQixtREFBc0U7QUFBN0QsMEhBQUEsNkJBQTZCLE9BQUE7QUFtQnRDLHVDQUF1QztBQUN2QyxtREFBNkU7QUFBcEUsK0dBQUEsa0JBQWtCLE9BQUE7QUFBRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQUU3QywrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUUvRSw4QkFBOEI7QUFDOUIscURBQTREO0FBQW5ELDhHQUFBLGlCQUFpQixPQUFBO0FBMEIxQiw2QkFBNkI7QUFDN0Isa0RBQWlEO0FBQXhDLHNHQUFBLFNBQVMsT0FBQTtBQWlFbEIsc0NBQXNDO0FBQ3RDLG1EQUEyRTtBQUFsRSx5R0FBQSxZQUFZLE9BQUE7QUFBRSwwR0FBQSxhQUFhLE9BQUE7QUFBRSxrR0FBQSxLQUFLLE9BQUE7QUFFM0Msc0NBQXNDO0FBQ3RDLG1EQUFxRztBQUE1RixpSEFBQSxvQkFBb0IsT0FBQTtBQUFFLGtIQUFBLHFCQUFxQixPQUFBO0FBQUUsNEdBQUEsZUFBZSxPQUFBO0FBU3JFLGdDQUFnQztBQUNoQyxtREFBMEU7QUFBakUsNkdBQUEsZ0JBQWdCLE9BQUE7QUFBRSw0R0FBQSxlQUFlLE9BQUE7QUFFMUMsK0VBQStFO0FBQy9FLGlEQUFpRDtBQUNqRCwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCwrQ0FBNEU7QUFBbkUsNEdBQUEsY0FBYyxPQUFBO0FBQUUsMkdBQUEsYUFBYSxPQUFBO0FBQUUsdUdBQUEsU0FBUyxPQUFBO0FBRWpELGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsc0RBQXNEO0FBQ3RELDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsMEVBQXNFO0FBQTdELHlIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb290UHJpbnQg4oCUIFB1YmxpYyBBUEkgKHYzKVxuICpcbiAqIFRoZSBmbG93Y2hhcnQgcGF0dGVybiBmb3IgYmFja2VuZCBjb2RlLlxuICogQnVpbGQg4oaSIFJ1biDihpIgT2JzZXJ2ZS5cbiAqXG4gKiAqKlRoZSBjb21tb24gaW1wb3J0IHBhdGhzOioqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZmxvd0NoYXJ0LCBkZWNpZGUsIG5hcnJhdGl2ZSB9IGZyb20gJ2Zvb3RwcmludGpzJzsgICAgICAgICAgIC8vIG1haW4g4oCUIHN0YXJ0IGhlcmVcbiAqIGltcG9ydCB7IG1ldHJpY3MsIGRlYnVnLCBtYW5pZmVzdCB9ICAgICBmcm9tICdmb290cHJpbnRqcy9yZWNvcmRlcnMnOyAvLyByZWNvcmRlciBmYWN0b3JpZXNcbiAqIGltcG9ydCB7IHN0YXRlQXQsIGNhdXNhbENoYWluIH0gICAgICAgICBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7ICAgICAvLyByZWFkIGEgZmluaXNoZWQgcnVuXG4gKiBpbXBvcnQgeyBSZWNvcmRGcmFtZSwgRXZlbnRMb2cgfSAgICAgICAgZnJvbSAnZm9vdHByaW50anMvd3JpdGUnOyAgICAgLy8gd3JpdGUgYSByZWNvcmQgeW91cnNlbGZcbiAqIGltcG9ydCB7IFN0YWdlQ29udGV4dCB9ICAgICAgICAgICAgICAgICBmcm9tICdmb290cHJpbnRqcy9hZHZhbmNlZCc7ICAvLyBlbmdpbmUgaW50ZXJuYWxzXG4gKiBgYGBcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVpY2sgU3RhcnQg4oCUIEV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIDkwJSBvZiB1c2UgY2FzZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnQsIFN0YWdlRnVuY3Rpb24gYXMgU3RhZ2VIYW5kbGVyLCBTdHJlYW1IYW5kbGVycyB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBmbG93Q2hhcnQsIEZsb3dDaGFydEJ1aWxkZXIsIGZsb3dDaGFydFNlbGVjdG9yIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0XG4gKlxuICogQ29uZmlnIGZvciBgLmFkZFBhcmFsbGVsRm9yRWFjaCgpYCDigJQgb25lIGJyYW5jaCBwZXIgaXRlbSwgYnJhbmNoIGNvdW50XG4gKiBkZWNpZGVkIGF0IHJ1biB0aW1lIGZyb20gdGhlIHBheWxvYWQuIGBtYXhCcmFuY2hlc2AgYW5kIGBpbnRvYCBhcmUgcmVxdWlyZWRcbiAqIG9uIHB1cnBvc2UgKHNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCkuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQnJhbmNoQ2hhcnQsIFBhcmFsbGVsRm9yRWFjaENvbmZpZywgUmV0cnlQb2xpY3kgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCDigJQgYnVpbGQtdGltZSBvYnNlcnZlciAodHdpbiBvZiBGbG93UmVjb3JkZXIpICovXG5leHBvcnQgdHlwZSB7XG4gIFN0cnVjdHVyZURlY2lkZXJDb21wbGV0ZUV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlRWRnZUtpbmQsXG4gIFN0cnVjdHVyZUxvb3BFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlUmVjb3JkZXIsXG4gIFN0cnVjdHVyZVN0YWdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlU3RhZ2VUYWdnZWRFdmVudCxcbiAgU3RydWN0dXJlU3ViZmxvd01vdW50ZWRFdmVudCxcbn0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgVHlwZWRTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi9saWIvYnVpbGRlci90eXBlZEZsb3dDaGFydC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgU2NvcGVNZXRob2RzLCBUeXBlZFNjb3BlIH0gZnJvbSAnLi9saWIvcmVhY3RpdmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBuYXJyYXRpdmUgfSBmcm9tICcuL3JlY29yZGVycy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlY2lzaW9uIEJyYW5jaGluZyDigJQgZGVjaWRlKCkgLyBzZWxlY3QoKSB3aXRoIGV2aWRlbmNlIGNhcHR1cmVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBEZWNpc2lvbiBCcmFuY2hpbmcgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRGVjaWRlUnVsZSxcbiAgRGVjaXNpb25FdmlkZW5jZSxcbiAgRGVjaXNpb25SZXN1bHQsXG4gIERlZmF1bHRCcmFuY2gsXG4gIEZpbHRlck9wcyxcbiAgUnVsZUV2aWRlbmNlLFxuICBTZWxlY3Rpb25FdmlkZW5jZSxcbiAgU2VsZWN0aW9uUmVzdWx0LFxuICBXaGVuQ2xhdXNlLFxuICBXaGVyZUZpbHRlcixcbn0gZnJvbSAnLi9saWIvZGVjaWRlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBEZWNpc2lvbiBCcmFuY2hpbmcgKi9cbmV4cG9ydCB7IGRlY2lkZSwgc2VsZWN0IH0gZnJvbSAnLi9saWIvZGVjaWRlL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVuIOKAlCBFeGVjdXRlIGNoYXJ0cyBhbmQgY29sbGVjdCByZXN1bHRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IFJ1blJlc3VsdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zYCBpbmhlcml0cy5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSdW5EaWFscyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSdW5Db250ZXh0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgQ2hhcnRPcGVuQVBJT3B0aW9ucywgTUNQVG9vbERlc2NyaXB0aW9uLCBSdW5uYWJsZUZsb3dDaGFydCB9IGZyb20gJy4vbGliL3J1bm5lci9SdW5uYWJsZUNoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRGF0YSAoc2NvcGUgcmVjb3JkZXJzLCBmaXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHR5cGUge1xuICBDb21taXRFdmVudCxcbiAgRXJyb3JFdmVudCxcbiAgUmVhZEV2ZW50LFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgU2NvcGVSZWNvcmRlcixcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IE1ldHJpY1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgT3BlcmF0aW9uICovXG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogRXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbCBhY2NlcHRzIGFuIG9wdGlvbnMgYmFnOlxuICogYGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjLCB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH0pYCB0YWtlcyB0aGVcbiAqIHJlY29yZGVyIE9VVCBvZiB0aGUgZW5naW5lJ3MgaG90IHBhdGgg4oCUIGV2ZW50cyBhcmUgY2FwdHVyZWQgaW50byBvbmVcbiAqIGJvdW5kZWQsIHRvdGFsbHktb3JkZXJlZCBxdWV1ZSBhbmQgZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFza1xuICogY2hlY2twb2ludCAoXCJvbmUgYmVhdCBiZWhpbmRcIikuIE9taXQgYGRlbGl2ZXJ5YCBmb3IgdGhlIGhpc3RvcmljYWxcbiAqIHN5bmNocm9ub3VzIGNhbGwgKGJ5dGUtaWRlbnRpY2FsIHRvIHByZXZpb3VzIHJlbGVhc2VzKS4gQWNjb3VudGluZ1xuICogc3VyZmFjZXMgb24gYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgOyBgZXhlY3V0b3IuZHJhaW5PYnNlcnZlcnMoKWAgc2V0dGxlc1xuICogYXN5bmMgbGlzdGVuZXJzIGJlZm9yZSBzaHV0ZG93bi4gU2VlIGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgT2JzZXJ2ZXJEZWxpdmVyeSxcbiAgT2JzZXJ2ZXJEcmFpblJlc3VsdCxcbiAgT2JzZXJ2ZXJTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogYENhcHR1cmVQb2xpY3lgIOKAlCBob3cgYSBkZWZlcnJlZCBldmVudCdzIHBheWxvYWQgaXMgbWF0ZXJpYWxpemVkIGF0XG4gKiBjYXB0dXJlIHRpbWUgKGAnY2xvbmUnYCBieSBkZWZhdWx0IGZvciBhdHRhY2ggb3B0aW9ucyAvIGAnc3VtbWFyeSdgIC8gYCdyZWYnYCkuIGBPdmVyZmxvd1BvbGljeWBcbiAqIOKAlCB3aGF0IGEgc2F0dXJhdGVkIHF1ZXVlIGRvZXMgKGAnZHJvcC1vbGRlc3QnYCBkZWZhdWx0IC8gYCdzYW1wbGUnYCAvXG4gKiBgJ2Jsb2NrJ2ApLiBgRGlzcGF0Y2hlclN0YXRzYCAvIGBMaXN0ZW5lclN0YXRzYCDigJQgdGhlIGFjY291bnRpbmcgc2hhcGVzXG4gKiBlbWJlZGRlZCBpbiBgT2JzZXJ2ZXJTdGF0c2AuIFR5cGVzIG9ubHkg4oCUIHRoZSBvYnNlcnZlci1xdWV1ZSBtb2R1bGVcbiAqIGl0c2VsZiBpcyBpbnRlcm5hbDsgY29uc3VtZXJzIHVzZSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZVBvbGljeSwgRGlzcGF0Y2hlclN0YXRzLCBMaXN0ZW5lclN0YXRzLCBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vbGliL29ic2VydmVyLXF1ZXVlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQge1xuICBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLFxuICBoYXNGbG93UmVjb3JkZXJNZXRob2RzLFxuICBoYXNSZWNvcmRlck1ldGhvZHMsXG4gIGlzRmxvd0V2ZW50LFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEVtaXQgKHVzZXItYXV0aG9yZWQgc3RydWN0dXJlZCBldmVudHMpXG4gKlxuICogVGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCAoYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmApLiBDb25zdW1lclxuICogY29kZSBjYWxscyBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGZyb20gaW5zaWRlIGEgc3RhZ2U7IGV2ZXJ5IGF0dGFjaGVkXG4gKiBgRW1pdFJlY29yZGVyLm9uRW1pdChldmVudClgIGZpcmVzIHN5bmNocm9ub3VzbHkgd2l0aCBzdGFnZS1jb250ZXh0XG4gKiBlbnJpY2htZW50LiBQYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZywgemVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJcbiAqIGlzIGF0dGFjaGVkLlxuICovXG5leHBvcnQgdHlwZSB7IEVtaXRFdmVudCwgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBGbG93IChGbG93UmVjb3JkZXIsIGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dOZXh0RXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1J1bkV2ZW50LFxuICBGbG93UnVuRmFpbGVkRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N0YWdlUmV0cnlFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG4gIEZsb3dUaHJvdHRsZWRFdmVudCxcbiAgUmVzdW1lTGluayxcbiAgVHJhdmVyc2FsQ29udGV4dCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93XG4gKlxuICogYE5hcnJhdGl2ZUZvcm1hdHRlcmAg4oCUIHBsdWdnYWJsZSBmb3JtYXR0ZXIgdGhhdCBjb252ZXJ0cyBldmVudCBjb250ZXh0XG4gKiBvYmplY3RzIGludG8gdGhlIHRleHQgbGluZXMgb2YgdGhlIG5hcnJhdGl2ZS4gUHJlZmVyIHRoaXMgbmFtZSBpbiBuZXdcbiAqIGNvZGU7IGBOYXJyYXRpdmVSZW5kZXJlcmAgaXMgYSBkZXByZWNhdGVkIGFsaWFzIHRoYXQgd2lsbCBiZSByZW1vdmVkIGluXG4gKiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuICovXG5leHBvcnQgdHlwZSB7IE5hcnJhdGl2ZUZvcm1hdHRlciwgTmFycmF0aXZlUmVuZGVyZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1pbGVzdG9uZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFJMRU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2VwYXJhdGVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgV2luZG93ZWROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZWxmLURlc2NyaWJpbmcg4oCUIC5jb250cmFjdCgpLCB0b09wZW5BUEkoKSwgdG9NQ1BUb29sKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTZWxmLURlc2NyaWJpbmcgKi9cbmV4cG9ydCB0eXBlIHsgSnNvblNjaGVtYSB9IGZyb20gJy4vbGliL2NvbnRyYWN0L2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU25hcHNob3QgJiBDb21wb3NpdGlvbiDigJQgU3ViZmxvdyBuYXZpZ2F0aW9uIGFuZCBDb21wb3NhYmxlUnVubmVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NhYmxlUnVubmVyIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IFJlY29yZGVyU25hcHNob3QsIFJ1bnRpbWVTbmFwc2hvdCwgU3VidHJlZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgeyBnZXRTdWJ0cmVlU25hcHNob3QsIGxpc3RTdWJmbG93UGF0aHMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTY29wZVJlY29yZGVyIENvbXBvc2l0aW9uIOKAlCBCdW5kbGUgbXVsdGlwbGUgcmVjb3JkZXJzIGludG8gZG9tYWluIHByZXNldHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTY29wZVJlY29yZGVyICovXG5leHBvcnQgeyBDb21wb3NpdGVSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGF1c2UvUmVzdW1lIOKAlCBTZXJpYWxpemFibGUgY2hlY2twb2ludHMgZm9yIGxvbmctcnVubmluZyBvciBodW1hbi1pbi10aGUtbG9vcCBmbG93c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgUGF1c2FibGVIYW5kbGVyLFxuICBQYXVzZWRFeGVjdXRpb24sXG4gIFBlbmRpbmdQYXVzZSxcbiAgUmVkYWN0aW9uTWFya3MsXG59IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lXG4gKlxuICogYGludGVycnVwdChzY29wZSwgeyByZWFzb24sIGV4cGVjdHM/IH0pYCDigJQgc3RvcCBtaWQtc3RhZ2UgdG8gYXNrIGEgcXVlc3Rpb24sXG4gKiBhbmQgZ2V0IHRoZSBhbnN3ZXIgYmFjayBhdCB0aGUgc2FtZSBjYWxsIHNpdGUgd2hlbiB0aGUgcnVuIHJlc3VtZXMuIFJlc3VtZVxuICogcmUtZW50ZXJzIHRoZSBzdGFnZSBmcm9tIGl0cyBUT1AgKHN0YWdlcyBhcmUgYXRvbWljKSwgc28ga2VlcCB0aGUgaGFsZlxuICogYmVmb3JlIHRoZSBjYWxsIGlkZW1wb3RlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgSW50ZXJydXB0UGF5bG9hZCB9IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbmV4cG9ydCB7IGludGVycnVwdCB9IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTY29wZVJlY29yZGVyICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2l0ZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb25maWd1cmF0aW9uIOKAlCBUeXBlcyBwYXNzZWQgdG8gRmxvd0NoYXJ0RXhlY3V0b3IgYW5kIHJ1bigpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYsIEV4ZWN1dG9yUmVzdWx0LCBQYXVzZWRSZXN1bHQsIFJ1bk9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFJlYWQtdHJhY2tpbmcgcG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KTpcbiAqIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItcmVhZCB2YWx1ZSBjbG9uZSwgaGlzdG9yaWNhbCBiZWhhdmlvcikgL1xuICogYCdzdW1tYXJ5J2AgKGNoZWFwIGBSZWFkU3VtbWFyeU1hcmtlcmAgcGVyIHJlYWQpIC8gYCdvZmYnYCAobm8gdHJhY2tpbmcsXG4gKiB6ZXJvIHBlci1yZWFkIGNsb25lKS4gUGFzcyBhcyBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHJlYWRUcmFja2luZyB9KWBcbiAqIG9yIGNhbGwgYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmVhZFN1bW1hcnlNYXJrZXIsIFJlYWRUcmFja2luZ01vZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogV3JpdGUtdHJhY2tpbmcgcG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZVxuICogc2libGluZyBvZiBgUmVhZFRyYWNraW5nTW9kZWA7IGJvdGggYWxpYXMgdGhlIHNoYXJlZCBgUmV0ZW50aW9uUG9saWN5YFxuICogZmFtaWx5IGZyb20gYGxpYi9jYXB0dXJlYC4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci13cml0ZSB2YWx1ZSBjbG9uZSxcbiAqIGhpc3RvcmljYWwgYmVoYXZpb3IpIC8gYCdzdW1tYXJ5J2AgKGNoZWFwIGBXcml0ZVN1bW1hcnlNYXJrZXJgIHBlciB3cml0ZSlcbiAqIC8gYCdvZmYnYCAobm8gdHJhY2tpbmc7IGBzdGFnZVdyaXRlc2AgYWJzZW50IGFuZCB0aGUgYG9uQ29tbWl0YCBtdXRhdGlvbnNcbiAqIHBheWxvYWQgaXMgZW1wdHkg4oCUIHdyaXRlcyB0aGVtc2VsdmVzIHN0aWxsIGNvbW1pdCwgYW5kIHRoZSBjb21taXQgbG9nIGlzXG4gKiB1bmFmZmVjdGVkKS4gUGFzcyBhcyBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHdyaXRlVHJhY2tpbmcgfSlgIG9yXG4gKiBjYWxsIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3ksIFdyaXRlU3VtbWFyeU1hcmtlciwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogQ29tbWl0LXZhbHVlcyBlbmNvZGluZyBmb3IgdGhlIENPTU1JVCBMT0cgKCMxM2MtQikg4oCUIHRoZSB0aGlyZCBkaWFsIG9mXG4gKiB0aGUgZmFtaWx5LCBhbmQgdGhlIG9ubHkgTE9TU0xFU1Mgb25lIChpdCBjaGFuZ2VzIHRoZSBsb2cncyBlbmNvZGluZyxcbiAqIG5ldmVyIGl0cyBpbmZvcm1hdGlvbikuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgc3RvcmVzXG4gKiB0aGUgZnVsbCBmaW5hbCB2YWx1ZSwgYnl0ZS1pZGVudGljYWwgdG8gaGlzdG9yeSkgLyBgJ2RlbHRhJ2AgKGFycmF5XG4gKiBuZXQtY2hhbmdlcyB0aGF0IGFyZSBcImJhc2UgcGx1cyBhIHRhaWxcIiBjb21taXQgYXMgYW4gYGFwcGVuZGAgdmVyYlxuICogc3RvcmluZyBvbmx5IHRoZSB0YWlsOyBgZGVsZXRlVmFsdWUoKWAgY29tbWl0cyBhcyBhIHJlYWwgYGRlbGV0ZWAgdmVyYjtcbiAqIG9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgpLiBSZXBsYXkgcmVjb25zdHJ1Y3RzIGV2ZXJ5IHN0ZXAnc1xuICogZnVsbCBzdGF0ZSBleGFjdGx5LiBDb25zdW1lcnMgcmVhZGluZyBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyB0aGUgZnVsbFxuICogdmFsdWUgbXVzdCB1c2UgYGNvbW1pdFZhbHVlQXRgIGZyb20gYGZvb3RwcmludGpzL3RyYWNlYC4gUGFzcyBhc1xuICogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yIGNhbGxcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgOyB0aGUgYWN0aXZlIG1vZGUgaXMgdGhlXG4gKiBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29udHJhY3QgJiBWYWxpZGF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjaGVtYUtpbmQsIFZhbGlkYXRpb25Jc3N1ZSwgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBkZXRlY3RTY2hlbWEsIGlzVmFsaWRhdGFibGUsIGlzWm9kIH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IElucHV0VmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEsIHZhbGlkYXRlT3JUaHJvdyB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVycm9yIFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIGZvcm1hdEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERldiBUb29scyDigJQgTW9kZSBmbGFncyBhbmQgWm9kIHNjb3BlIHV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBjYXRlZ29yeSBEZXYgVG9vbHNcbiAqXG4gKiBHbG9iYWwgZGV2LW1vZGUgZmxhZy4gQ2FsbCBgZW5hYmxlRGV2TW9kZSgpYCBhdCBhcHBsaWNhdGlvbiBzdGFydHVwIHRvXG4gKiB0dXJuIG9uIGRldmVsb3Blci1vbmx5IGRpYWdub3N0aWNzIGFjcm9zcyB0aGUgbGlicmFyeSDigJQgY2lyY3VsYXItcmVmZXJlbmNlXG4gKiBkZXRlY3Rpb24gaW4gc2NvcGUgd3JpdGVzLCB3YXJuaW5ncyB3aGVuIGEgcmVjb3JkZXIgaGFzIG5vIG9ic2VydmVyXG4gKiBtZXRob2RzLCBzdXNwaWNpb3VzLXByZWRpY2F0ZSB3YXJuaW5ncyBpbiBkZWNpZGUvc2VsZWN0LCBzdHJ1Y3R1cmFsXG4gKiBjaGVja3MgaW4gYGdldFN1YnRyZWVTbmFwc2hvdGAsIGFuZCBhbnkgZnV0dXJlIGRldi1vbmx5IGRpYWdub3N0aWMuXG4gKlxuICogUHJvZHVjdGlvbiBsZWF2ZXMgaXQgT0ZGIGJ5IGRlZmF1bHQgKHplcm8gb3ZlcmhlYWQpLiBTZWUgdGhlIEpTRG9jIG9uXG4gKiBgZW5hYmxlRGV2TW9kZWAgZm9yIHRoZSBmdWxsIGxpc3QgYW5kIHVzYWdlIGV4YW1wbGUuXG4gKi9cbmV4cG9ydCB7IGRpc2FibGVEZXZNb2RlLCBlbmFibGVEZXZNb2RlLCBpc0Rldk1vZGUgfSBmcm9tICcuL2xpYi9kZXZNb2RlLmpzJztcblxuLy8gYGRlZmluZVNjb3BlRnJvbVpvZGAgYW5kIHRoZSBvdGhlciB6b2QtYmFzZWQgc2NvcGUgaGVscGVycyBtb3ZlZCB0byB0aGUgb3B0LWluXG4vLyBgZm9vdHByaW50anMvem9kYCBlbnRyeSDigJQga2VlcGluZyB6b2Qgb3V0IG9mIHRoZSBjb3JlIGxvYWQgcGF0aCAoaXQgaXMgYW5cbi8vIG9wdGlvbmFsIHBlZXIpLiBJbXBvcnQgdGhlbSBmcm9tICdmb290cHJpbnRqcy96b2QnLlxuLy8gQSBydW4ncyByZWNvcmQgYXMgSlNPTiB3aXRob3V0IHRoZSBlbmdpbmUncyByZWN1cnNpb24gbGltaXQgKDkuMjYuMCk6IHRoZVxuLy8gc2FtZSBieXRlcyBKU09OLnN0cmluZ2lmeSBlbWl0cywgZm9yIGEgZGVlcCBgbmV4dGAgY2hhaW4gaXQgY2Fubm90IGVuY29kZS5cbmV4cG9ydCB7IHN0cmluZ2lmeVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL3N0cmluZ2lmeVNuYXBzaG90LmpzJztcbiJdfQ==
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOzs7QUFTSCw0QkFBNEI7QUFDNUIsbURBQXdGO0FBQS9FLHFHQUFBLFNBQVMsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNkdBQUEsaUJBQWlCLE9BQUE7QUE2QnZELDRCQUE0QjtBQUM1QiwrQ0FBMkM7QUFBbEMseUdBQUEsU0FBUyxPQUFBO0FBb0JsQixtQ0FBbUM7QUFDbkMsa0RBQXVEO0FBQTlDLGtHQUFBLE1BQU0sT0FBQTtBQUFFLGtHQUFBLE1BQU0sT0FBQTtBQWtCdkIsb0JBQW9CO0FBQ3BCLGtEQUEwRDtBQUFqRCw2R0FBQSxpQkFBaUIsT0FBQTtBQUUxQixvQkFBb0I7QUFDcEIsa0RBQW1EO0FBQTFDLHNHQUFBLFVBQVUsT0FBQTtBQXFCbkIsK0JBQStCO0FBQy9CLGlEQUFzRDtBQUE3QywwR0FBQSxjQUFjLE9BQUE7QUFFdkIsK0JBQStCO0FBQy9CLGlEQUFxRDtBQUE1Qyx5R0FBQSxhQUFhLE9BQUE7QUFFdEIsb0NBQW9DO0FBQ3BDLG9EQUE0RDtBQUFuRCw2R0FBQSxpQkFBaUIsT0FBQTtBQW1DMUIscUVBQXFFO0FBQ3JFLG9EQUtpQztBQUovQixrSEFBQSxzQkFBc0IsT0FBQTtBQUN0QixrSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qiw4R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix1R0FBQSxXQUFXLE9BQUE7QUFrRGIsK0JBQStCO0FBQy9CLGtEQUE4RDtBQUFyRCxpSEFBQSxxQkFBcUIsT0FBQTtBQUs5QiwrQkFBK0I7QUFDL0IsbURBQTZEO0FBQXBELGlIQUFBLG9CQUFvQixPQUFBO0FBRTdCLCtCQUErQjtBQUMvQixtREFBc0U7QUFBN0QsMEhBQUEsNkJBQTZCLE9BQUE7QUFFdEMsK0JBQStCO0FBQy9CLG1EQUF1RTtBQUE5RCwySEFBQSw4QkFBOEIsT0FBQTtBQUV2QywrQkFBK0I7QUFDL0IsbURBQXlFO0FBQWhFLDZIQUFBLGdDQUFnQyxPQUFBO0FBRXpDLCtCQUErQjtBQUMvQixtREFBaUU7QUFBeEQscUhBQUEsd0JBQXdCLE9BQUE7QUFFakMsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQUV0QywrQkFBK0I7QUFDL0IsbURBQW9FO0FBQTNELHdIQUFBLDJCQUEyQixPQUFBO0FBRXBDLCtCQUErQjtBQUMvQixtREFBc0U7QUFBN0QsMEhBQUEsNkJBQTZCLE9BQUE7QUFtQnRDLHVDQUF1QztBQUN2QyxtREFBNkU7QUFBcEUsK0dBQUEsa0JBQWtCLE9BQUE7QUFBRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQUU3QywrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUUvRSw4QkFBOEI7QUFDOUIscURBQTREO0FBQW5ELDhHQUFBLGlCQUFpQixPQUFBO0FBMEIxQiw2QkFBNkI7QUFDN0Isa0RBQWlEO0FBQXhDLHNHQUFBLFNBQVMsT0FBQTtBQWdFbEIsc0NBQXNDO0FBQ3RDLG1EQUEyRTtBQUFsRSx5R0FBQSxZQUFZLE9BQUE7QUFBRSwwR0FBQSxhQUFhLE9BQUE7QUFBRSxrR0FBQSxLQUFLLE9BQUE7QUFFM0Msc0NBQXNDO0FBQ3RDLG1EQUFxRztBQUE1RixpSEFBQSxvQkFBb0IsT0FBQTtBQUFFLGtIQUFBLHFCQUFxQixPQUFBO0FBQUUsNEdBQUEsZUFBZSxPQUFBO0FBU3JFLGdDQUFnQztBQUNoQyxtREFBMEU7QUFBakUsNkdBQUEsZ0JBQWdCLE9BQUE7QUFBRSw0R0FBQSxlQUFlLE9BQUE7QUFFMUMsK0VBQStFO0FBQy9FLGlEQUFpRDtBQUNqRCwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCwrQ0FBNEU7QUFBbkUsNEdBQUEsY0FBYyxPQUFBO0FBQUUsMkdBQUEsYUFBYSxPQUFBO0FBQUUsdUdBQUEsU0FBUyxPQUFBO0FBRWpELGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsc0RBQXNEO0FBQ3RELDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsMEVBQXNFO0FBQTdELHlIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb290UHJpbnQg4oCUIFB1YmxpYyBBUEkgKHYzKVxuICpcbiAqIFRoZSBmbG93Y2hhcnQgcGF0dGVybiBmb3IgYmFja2VuZCBjb2RlLlxuICogQnVpbGQg4oaSIFJ1biDihpIgT2JzZXJ2ZS5cbiAqXG4gKiAqKlRoZSBjb21tb24gaW1wb3J0IHBhdGhzOioqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZmxvd0NoYXJ0LCBkZWNpZGUsIG5hcnJhdGl2ZSB9IGZyb20gJ2Zvb3RwcmludGpzJzsgICAgICAgICAgIC8vIG1haW4g4oCUIHN0YXJ0IGhlcmVcbiAqIGltcG9ydCB7IG1ldHJpY3MsIGRlYnVnLCBtYW5pZmVzdCB9ICAgICBmcm9tICdmb290cHJpbnRqcy9yZWNvcmRlcnMnOyAvLyByZWNvcmRlciBmYWN0b3JpZXNcbiAqIGltcG9ydCB7IHN0YXRlQXQsIGNhdXNhbENoYWluIH0gZnJvbSAnZm9vdHRyYWNlJzsgICAgIC8vIHJlYWQgYSBmaW5pc2hlZCBydW5cbiAqIGltcG9ydCB7IFJlY29yZEZyYW1lLCBFdmVudExvZyB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7ICAgICAvLyB3cml0ZSBhIHJlY29yZCB5b3Vyc2VsZlxuICogaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gICAgICAgICAgICAgICAgIGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJzsgIC8vIGVuZ2luZSBpbnRlcm5hbHNcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRdWljayBTdGFydCDigJQgRXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgOTAlIG9mIHVzZSBjYXNlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydCwgU3RhZ2VGdW5jdGlvbiBhcyBTdGFnZUhhbmRsZXIsIFN0cmVhbUhhbmRsZXJzIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IGZsb3dDaGFydCwgRmxvd0NoYXJ0QnVpbGRlciwgZmxvd0NoYXJ0U2VsZWN0b3IgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnRcbiAqXG4gKiBDb25maWcgZm9yIGAuYWRkUGFyYWxsZWxGb3JFYWNoKClgIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggY291bnRcbiAqIGRlY2lkZWQgYXQgcnVuIHRpbWUgZnJvbSB0aGUgcGF5bG9hZC4gYG1heEJyYW5jaGVzYCBhbmQgYGludG9gIGFyZSByZXF1aXJlZFxuICogb24gcHVycG9zZSAoc2VlIGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kKS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBCcmFuY2hDaGFydCwgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0IOKAlCBidWlsZC10aW1lIG9ic2VydmVyICh0d2luIG9mIEZsb3dSZWNvcmRlcikgKi9cbmV4cG9ydCB0eXBlIHtcbiAgU3RydWN0dXJlRGVjaWRlckNvbXBsZXRlRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlS2luZCxcbiAgU3RydWN0dXJlTG9vcEVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVSZWNvcmRlcixcbiAgU3RydWN0dXJlU3RhZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdGFnZVRhZ2dlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdWJmbG93TW91bnRlZEV2ZW50LFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBUeXBlZFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZU1ldGhvZHMsIFR5cGVkU2NvcGUgfSBmcm9tICcuL2xpYi9yZWFjdGl2ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IG5hcnJhdGl2ZSB9IGZyb20gJy4vcmVjb3JkZXJzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjaXNpb24gQnJhbmNoaW5nIOKAlCBkZWNpZGUoKSAvIHNlbGVjdCgpIHdpdGggZXZpZGVuY2UgY2FwdHVyZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNpZGVSdWxlLFxuICBEZWNpc2lvbkV2aWRlbmNlLFxuICBEZWNpc2lvblJlc3VsdCxcbiAgRGVmYXVsdEJyYW5jaCxcbiAgRmlsdGVyT3BzLFxuICBSdWxlRXZpZGVuY2UsXG4gIFNlbGVjdGlvbkV2aWRlbmNlLFxuICBTZWxlY3Rpb25SZXN1bHQsXG4gIFdoZW5DbGF1c2UsXG4gIFdoZXJlRmlsdGVyLFxufSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHsgZGVjaWRlLCBzZWxlY3QgfSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSdW4g4oCUIEV4ZWN1dGUgY2hhcnRzIGFuZCBjb2xsZWN0IHJlc3VsdHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgUnVuUmVzdWx0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBUaGUgZm91ciBvYnNlcnZhYmlsaXR5IGRpYWxzIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNgIGluaGVyaXRzLlxuICogQGNhdGVnb3J5IFJ1blxuICovXG5leHBvcnQgdHlwZSB7IFJ1bkRpYWxzIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IEZsb3dDaGFydEV4ZWN1dG9yIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJ1bkNvbnRleHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBDaGFydE9wZW5BUElPcHRpb25zLCBNQ1BUb29sRGVzY3JpcHRpb24sIFJ1bm5hYmxlRmxvd0NoYXJ0IH0gZnJvbSAnLi9saWIvcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBEYXRhIChzY29wZSByZWNvcmRlcnMsIGZpcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEV2ZW50LFxuICBFcnJvckV2ZW50LFxuICBSZWFkRXZlbnQsXG4gIFJlZGFjdGlvblBvbGljeSxcbiAgUmVkYWN0aW9uUmVwb3J0LFxuICBTY29wZVJlY29yZGVyLFxuICBTdGFnZUV2ZW50LFxuICBXcml0ZUV2ZW50LFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHsgTWV0cmljUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHsgRGVidWdSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBPcGVyYXRpb24gKi9cbmV4cG9ydCB7IFJlY29yZGVyT3BlcmF0aW9uIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEZWxpdmVyeSB0aWVyIChSRkMtMDAxIGRlZmVycmVkIG9ic2VydmVycylcbiAqXG4gKiBFdmVyeSBgYXR0YWNoKlJlY29yZGVyYCBjYWxsIGFjY2VwdHMgYW4gb3B0aW9ucyBiYWc6XG4gKiBgZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWMsIHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfSlgIHRha2VzIHRoZVxuICogcmVjb3JkZXIgT1VUIG9mIHRoZSBlbmdpbmUncyBob3QgcGF0aCDigJQgZXZlbnRzIGFyZSBjYXB0dXJlZCBpbnRvIG9uZVxuICogYm91bmRlZCwgdG90YWxseS1vcmRlcmVkIHF1ZXVlIGFuZCBkZWxpdmVyZWQgYXQgdGhlIG5leHQgbWljcm90YXNrXG4gKiBjaGVja3BvaW50IChcIm9uZSBiZWF0IGJlaGluZFwiKS4gT21pdCBgZGVsaXZlcnlgIGZvciB0aGUgaGlzdG9yaWNhbFxuICogc3luY2hyb25vdXMgY2FsbCAoYnl0ZS1pZGVudGljYWwgdG8gcHJldmlvdXMgcmVsZWFzZXMpLiBBY2NvdW50aW5nXG4gKiBzdXJmYWNlcyBvbiBgc25hcHNob3Qub2JzZXJ2ZXJTdGF0c2A7IGBleGVjdXRvci5kcmFpbk9ic2VydmVycygpYCBzZXR0bGVzXG4gKiBhc3luYyBsaXN0ZW5lcnMgYmVmb3JlIHNodXRkb3duLiBTZWUgYGRvY3MvZ3VpZGVzL29ic2VydmVycy1kZWZlcnJlZC5tZGAuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0YWNoUmVjb3JkZXJPcHRpb25zLFxuICBPYnNlcnZlckRlbGl2ZXJ5LFxuICBPYnNlcnZlckRyYWluUmVzdWx0LFxuICBPYnNlcnZlclN0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEZWxpdmVyeSB0aWVyIChSRkMtMDAxIGRlZmVycmVkIG9ic2VydmVycylcbiAqXG4gKiBgQ2FwdHVyZVBvbGljeWAg4oCUIGhvdyBhIGRlZmVycmVkIGV2ZW50J3MgcGF5bG9hZCBpcyBtYXRlcmlhbGl6ZWQgYXRcbiAqIGNhcHR1cmUgdGltZSAoYCdjbG9uZSdgIGJ5IGRlZmF1bHQgZm9yIGF0dGFjaCBvcHRpb25zIC8gYCdzdW1tYXJ5J2AgLyBgJ3JlZidgKS4gYE92ZXJmbG93UG9saWN5YFxuICog4oCUIHdoYXQgYSBzYXR1cmF0ZWQgcXVldWUgZG9lcyAoYCdkcm9wLW9sZGVzdCdgIGRlZmF1bHQgLyBgJ3NhbXBsZSdgIC9cbiAqIGAnYmxvY2snYCkuIGBEaXNwYXRjaGVyU3RhdHNgIC8gYExpc3RlbmVyU3RhdHNgIOKAlCB0aGUgYWNjb3VudGluZyBzaGFwZXNcbiAqIGVtYmVkZGVkIGluIGBPYnNlcnZlclN0YXRzYC4gVHlwZXMgb25seSDigJQgdGhlIG9ic2VydmVyLXF1ZXVlIG1vZHVsZVxuICogaXRzZWxmIGlzIGludGVybmFsOyBjb25zdW1lcnMgdXNlIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgeyBDYXB0dXJlUG9saWN5LCBEaXNwYXRjaGVyU3RhdHMsIExpc3RlbmVyU3RhdHMsIE92ZXJmbG93UG9saWN5IH0gZnJvbSAnLi9saWIvb2JzZXJ2ZXItcXVldWUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB7XG4gIGhhc0VtaXRSZWNvcmRlck1ldGhvZHMsXG4gIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMsXG4gIGhhc1JlY29yZGVyTWV0aG9kcyxcbiAgaXNGbG93RXZlbnQsXG59IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRW1pdCAodXNlci1hdXRob3JlZCBzdHJ1Y3R1cmVkIGV2ZW50cylcbiAqXG4gKiBUaGlyZCBvYnNlcnZlciBjaGFubmVsIChhbG9uZ3NpZGUgYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCkuIENvbnN1bWVyXG4gKiBjb2RlIGNhbGxzIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAgZnJvbSBpbnNpZGUgYSBzdGFnZTsgZXZlcnkgYXR0YWNoZWRcbiAqIGBFbWl0UmVjb3JkZXIub25FbWl0KGV2ZW50KWAgZmlyZXMgc3luY2hyb25vdXNseSB3aXRoIHN0YWdlLWNvbnRleHRcbiAqIGVucmljaG1lbnQuIFBhc3MtdGhyb3VnaCDigJQgbm8gYnVmZmVyaW5nLCB6ZXJvIGFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlclxuICogaXMgYXR0YWNoZWQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgRW1pdEV2ZW50LCBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIEZsb3cgKEZsb3dSZWNvcmRlciwgZmlyZXMgYWZ0ZXIgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd05leHRFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBGbG93U3RhZ2VSZXRyeUV2ZW50LFxuICBGbG93U3ViZmxvd0V2ZW50LFxuICBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCxcbiAgRmxvd1Rocm90dGxlZEV2ZW50LFxuICBSZXN1bWVMaW5rLFxuICBUcmF2ZXJzYWxDb250ZXh0LFxufSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3dcbiAqXG4gKiBgTmFycmF0aXZlRm9ybWF0dGVyYCDigJQgcGx1Z2dhYmxlIGZvcm1hdHRlciB0aGF0IGNvbnZlcnRzIGV2ZW50IGNvbnRleHRcbiAqIG9iamVjdHMgaW50byB0aGUgdGV4dCBsaW5lcyBvZiB0aGUgbmFycmF0aXZlLlxuICovXG5leHBvcnQgdHlwZSB7IE5hcnJhdGl2ZUZvcm1hdHRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBQcm9ncmVzc2l2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2lsZW50TmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGYtRGVzY3JpYmluZyDigJQgLmNvbnRyYWN0KCksIHRvT3BlbkFQSSgpLCB0b01DUFRvb2woKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNlbGYtRGVzY3JpYmluZyAqL1xuZXhwb3J0IHR5cGUgeyBKc29uU2NoZW1hIH0gZnJvbSAnLi9saWIvY29udHJhY3QvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTbmFwc2hvdCAmIENvbXBvc2l0aW9uIOKAlCBTdWJmbG93IG5hdmlnYXRpb24gYW5kIENvbXBvc2FibGVSdW5uZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCwgUnVudGltZVNuYXBzaG90LCBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB7IGdldFN1YnRyZWVTbmFwc2hvdCwgbGlzdFN1YmZsb3dQYXRocyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjb3BlUmVjb3JkZXIgQ29tcG9zaXRpb24g4oCUIEJ1bmRsZSBtdWx0aXBsZSByZWNvcmRlcnMgaW50byBkb21haW4gcHJlc2V0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXVzZS9SZXN1bWUg4oCUIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50cyBmb3IgbG9uZy1ydW5uaW5nIG9yIGh1bWFuLWluLXRoZS1sb29wIGZsb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBQYXVzYWJsZUhhbmRsZXIsXG4gIFBhdXNlZEV4ZWN1dGlvbixcbiAgUGVuZGluZ1BhdXNlLFxuICBSZWRhY3Rpb25NYXJrcyxcbn0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWVcbiAqXG4gKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIOKAlCBzdG9wIG1pZC1zdGFnZSB0byBhc2sgYSBxdWVzdGlvbixcbiAqIGFuZCBnZXQgdGhlIGFuc3dlciBiYWNrIGF0IHRoZSBzYW1lIGNhbGwgc2l0ZSB3aGVuIHRoZSBydW4gcmVzdW1lcy4gUmVzdW1lXG4gKiByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIFRPUCAoc3RhZ2VzIGFyZSBhdG9taWMpLCBzbyBrZWVwIHRoZSBoYWxmXG4gKiBiZWZvcmUgdGhlIGNhbGwgaWRlbXBvdGVudC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBJbnRlcnJ1cHRQYXlsb2FkIH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHsgaW50ZXJydXB0IH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24g4oCUIFR5cGVzIHBhc3NlZCB0byBGbG93Q2hhcnRFeGVjdXRvciBhbmQgcnVuKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgRXhlY3V0b3JSZXN1bHQsIFBhdXNlZFJlc3VsdCwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogUmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpOlxuICogYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci1yZWFkIHZhbHVlIGNsb25lLCBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvXG4gKiBgJ3N1bW1hcnknYCAoY2hlYXAgYFJlYWRTdW1tYXJ5TWFya2VyYCBwZXIgcmVhZCkgLyBgJ29mZidgIChubyB0cmFja2luZyxcbiAqIHplcm8gcGVyLXJlYWQgY2xvbmUpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYFxuICogb3IgY2FsbCBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgUmVhZFRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBXcml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gKiBzaWJsaW5nIG9mIGBSZWFkVHJhY2tpbmdNb2RlYDsgYm90aCBhbGlhcyB0aGUgc2hhcmVkIGBSZXRlbnRpb25Qb2xpY3lgXG4gKiBmYW1pbHkgZnJvbSBgbGliL2NhcHR1cmVgLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXdyaXRlIHZhbHVlIGNsb25lLFxuICogaGlzdG9yaWNhbCBiZWhhdmlvcikgLyBgJ3N1bW1hcnknYCAoY2hlYXAgYFdyaXRlU3VtbWFyeU1hcmtlcmAgcGVyIHdyaXRlKVxuICogLyBgJ29mZidgIChubyB0cmFja2luZzsgYHN0YWdlV3JpdGVzYCBhYnNlbnQgYW5kIHRoZSBgb25Db21taXRgIG11dGF0aW9uc1xuICogcGF5bG9hZCBpcyBlbXB0eSDigJQgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0LCBhbmQgdGhlIGNvbW1pdCBsb2cgaXNcbiAqIHVuYWZmZWN0ZWQpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGNhbGwgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSwgV3JpdGVTdW1tYXJ5TWFya2VyLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBDb21taXQtdmFsdWVzIGVuY29kaW5nIGZvciB0aGUgQ09NTUlUIExPRyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2ZcbiAqIHRoZSBmYW1pbHksIGFuZCB0aGUgb25seSBMT1NTTEVTUyBvbmUgKGl0IGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLFxuICogbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBzdG9yZXNcbiAqIHRoZSBmdWxsIGZpbmFsIHZhbHVlLCBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5KSAvIGAnZGVsdGEnYCAoYXJyYXlcbiAqIG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhbiBgYXBwZW5kYCB2ZXJiXG4gKiBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzIGFzIGEgcmVhbCBgZGVsZXRlYCB2ZXJiO1xuICogb25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCkuIFJlcGxheSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzXG4gKiBmdWxsIHN0YXRlIGV4YWN0bHkuIENvbnN1bWVycyByZWFkaW5nIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIHRoZSBmdWxsXG4gKiB2YWx1ZSBtdXN0IHVzZSBgY29tbWl0VmFsdWVBdGAgZnJvbSBgZm9vdHRyYWNlYC4gUGFzcyBhc1xuICogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yIGNhbGxcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgOyB0aGUgYWN0aXZlIG1vZGUgaXMgdGhlXG4gKiBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250cmFjdCAmIFZhbGlkYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGV2IFRvb2xzIOKAlCBNb2RlIGZsYWdzIGFuZCBab2Qgc2NvcGUgdXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IERldiBUb29sc1xuICpcbiAqIEdsb2JhbCBkZXYtbW9kZSBmbGFnLiBDYWxsIGBlbmFibGVEZXZNb2RlKClgIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgdG9cbiAqIHR1cm4gb24gZGV2ZWxvcGVyLW9ubHkgZGlhZ25vc3RpY3MgYWNyb3NzIHRoZSBsaWJyYXJ5IOKAlCBjaXJjdWxhci1yZWZlcmVuY2VcbiAqIGRldGVjdGlvbiBpbiBzY29wZSB3cml0ZXMsIHdhcm5pbmdzIHdoZW4gYSByZWNvcmRlciBoYXMgbm8gb2JzZXJ2ZXJcbiAqIG1ldGhvZHMsIHN1c3BpY2lvdXMtcHJlZGljYXRlIHdhcm5pbmdzIGluIGRlY2lkZS9zZWxlY3QsIHN0cnVjdHVyYWxcbiAqIGNoZWNrcyBpbiBgZ2V0U3VidHJlZVNuYXBzaG90YCwgYW5kIGFueSBmdXR1cmUgZGV2LW9ubHkgZGlhZ25vc3RpYy5cbiAqXG4gKiBQcm9kdWN0aW9uIGxlYXZlcyBpdCBPRkYgYnkgZGVmYXVsdCAoemVybyBvdmVyaGVhZCkuIFNlZSB0aGUgSlNEb2Mgb25cbiAqIGBlbmFibGVEZXZNb2RlYCBmb3IgdGhlIGZ1bGwgbGlzdCBhbmQgdXNhZ2UgZXhhbXBsZS5cbiAqL1xuZXhwb3J0IHsgZGlzYWJsZURldk1vZGUsIGVuYWJsZURldk1vZGUsIGlzRGV2TW9kZSB9IGZyb20gJy4vbGliL2Rldk1vZGUuanMnO1xuXG4vLyBgZGVmaW5lU2NvcGVGcm9tWm9kYCBhbmQgdGhlIG90aGVyIHpvZC1iYXNlZCBzY29wZSBoZWxwZXJzIG1vdmVkIHRvIHRoZSBvcHQtaW5cbi8vIGBmb290cHJpbnRqcy96b2RgIGVudHJ5IOKAlCBrZWVwaW5nIHpvZCBvdXQgb2YgdGhlIGNvcmUgbG9hZCBwYXRoIChpdCBpcyBhblxuLy8gb3B0aW9uYWwgcGVlcikuIEltcG9ydCB0aGVtIGZyb20gJ2Zvb3RwcmludGpzL3pvZCcuXG4vLyBBIHJ1bidzIHJlY29yZCBhcyBKU09OIHdpdGhvdXQgdGhlIGVuZ2luZSdzIHJlY3Vyc2lvbiBsaW1pdCAoOS4yNi4wKTogdGhlXG4vLyBzYW1lIGJ5dGVzIEpTT04uc3RyaW5naWZ5IGVtaXRzLCBmb3IgYSBkZWVwIGBuZXh0YCBjaGFpbiBpdCBjYW5ub3QgZW5jb2RlLlxuZXhwb3J0IHsgc3RyaW5naWZ5U25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvc3RyaW5naWZ5U25hcHNob3QuanMnO1xuIl19