footprintjs 10.0.1 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +61 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +62 -2
  5. package/dist/esm/index.js +13 -6
  6. package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
  7. package/dist/esm/lib/attempt/anySignal.js +39 -0
  8. package/dist/esm/lib/attempt/call.d.ts +88 -0
  9. package/dist/esm/lib/attempt/call.js +129 -0
  10. package/dist/esm/lib/attempt/category.d.ts +37 -0
  11. package/dist/esm/lib/attempt/category.js +131 -0
  12. package/dist/esm/lib/attempt/correlation.d.ts +95 -0
  13. package/dist/esm/lib/attempt/correlation.js +178 -0
  14. package/dist/esm/lib/attempt/deadline.d.ts +44 -0
  15. package/dist/esm/lib/attempt/deadline.js +101 -0
  16. package/dist/esm/lib/attempt/decision.d.ts +52 -0
  17. package/dist/esm/lib/attempt/decision.js +134 -0
  18. package/dist/esm/lib/attempt/effect.d.ts +76 -0
  19. package/dist/esm/lib/attempt/effect.js +160 -0
  20. package/dist/esm/lib/attempt/errors.d.ts +41 -0
  21. package/dist/esm/lib/attempt/errors.js +44 -0
  22. package/dist/esm/lib/attempt/index.d.ts +18 -0
  23. package/dist/esm/lib/attempt/index.js +15 -0
  24. package/dist/esm/lib/attempt/name.d.ts +21 -0
  25. package/dist/esm/lib/attempt/name.js +43 -0
  26. package/dist/esm/lib/attempt/observed.d.ts +66 -0
  27. package/dist/esm/lib/attempt/observed.js +171 -0
  28. package/dist/esm/lib/attempt/policy.d.ts +45 -0
  29. package/dist/esm/lib/attempt/policy.js +83 -0
  30. package/dist/esm/lib/attempt/record.d.ts +11 -0
  31. package/dist/esm/lib/attempt/record.js +24 -0
  32. package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
  33. package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
  34. package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
  35. package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
  36. package/dist/esm/lib/attempt/runner.d.ts +157 -0
  37. package/dist/esm/lib/attempt/runner.js +523 -0
  38. package/dist/esm/lib/attempt/standalone.d.ts +47 -0
  39. package/dist/esm/lib/attempt/standalone.js +126 -0
  40. package/dist/esm/lib/attempt/types.d.ts +453 -0
  41. package/dist/esm/lib/attempt/types.js +16 -0
  42. package/dist/esm/lib/budget/index.d.ts +9 -0
  43. package/dist/esm/lib/budget/index.js +9 -0
  44. package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
  45. package/dist/esm/lib/budget/timeBudget.js +666 -0
  46. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
  47. package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
  48. package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
  49. package/dist/esm/lib/builder/retryLoop.js +283 -0
  50. package/dist/esm/lib/builder/types.d.ts +35 -1
  51. package/dist/esm/lib/builder/types.js +1 -1
  52. package/dist/esm/lib/decide/decide.js +2 -2
  53. package/dist/esm/lib/decide/index.d.ts +1 -1
  54. package/dist/esm/lib/decide/index.js +2 -2
  55. package/dist/esm/lib/decide/types.d.ts +3 -0
  56. package/dist/esm/lib/decide/types.js +1 -8
  57. package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
  58. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  59. package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
  60. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  61. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  62. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  63. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  64. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  65. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  66. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
  67. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  68. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  69. package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
  70. package/dist/esm/lib/engine/handlers/stageError.js +23 -1
  71. package/dist/esm/lib/engine/index.d.ts +2 -2
  72. package/dist/esm/lib/engine/index.js +1 -1
  73. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  74. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  75. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  76. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  77. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  78. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  79. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  80. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  81. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  82. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  83. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  84. package/dist/esm/lib/engine/narrative/index.js +1 -1
  85. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  86. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  87. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  88. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  89. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  90. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  91. package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
  92. package/dist/esm/lib/engine/narrative/types.js +1 -1
  93. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  94. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
  95. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  96. package/dist/esm/lib/engine/traversalContext.js +6 -3
  97. package/dist/esm/lib/engine/types.d.ts +52 -57
  98. package/dist/esm/lib/engine/types.js +1 -1
  99. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  100. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  101. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  102. package/dist/esm/lib/filter/evaluator.js +135 -0
  103. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  104. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  105. package/dist/esm/lib/memory/StageContext.d.ts +123 -3
  106. package/dist/esm/lib/memory/StageContext.js +245 -4
  107. package/dist/esm/lib/memory/attention.d.ts +26 -0
  108. package/dist/esm/lib/memory/attention.js +171 -0
  109. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  110. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  111. package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
  112. package/dist/esm/lib/memory/frameTypes.js +3 -1
  113. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  114. package/dist/esm/lib/memory/redaction.js +54 -5
  115. package/dist/esm/lib/pause/record.js +10 -1
  116. package/dist/esm/lib/pause/types.d.ts +19 -0
  117. package/dist/esm/lib/pause/types.js +17 -1
  118. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  119. package/dist/esm/lib/reactive/types.d.ts +36 -4
  120. package/dist/esm/lib/reactive/types.js +3 -1
  121. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  122. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  123. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
  124. package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
  125. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  126. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  127. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  128. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  129. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  130. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  131. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  132. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  133. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  134. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  135. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  136. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  137. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  138. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  139. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  140. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  141. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  142. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  143. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  144. package/dist/esm/lib/recorder/hooks.js +4 -1
  145. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  146. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  147. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  148. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
  149. package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
  150. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  151. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  152. package/dist/esm/lib/runner/attach.d.ts +2 -1
  153. package/dist/esm/lib/runner/attach.js +8 -2
  154. package/dist/esm/lib/runner/checkpoint.js +3 -1
  155. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  156. package/dist/esm/lib/runner/deadline.js +90 -0
  157. package/dist/esm/lib/runner/index.d.ts +3 -1
  158. package/dist/esm/lib/runner/index.js +2 -1
  159. package/dist/esm/lib/runner/options.d.ts +17 -0
  160. package/dist/esm/lib/runner/options.js +3 -1
  161. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  162. package/dist/esm/lib/runner/recordSink.js +296 -0
  163. package/dist/esm/lib/runner/resume.d.ts +3 -0
  164. package/dist/esm/lib/runner/resume.js +22 -2
  165. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  166. package/dist/esm/lib/runner/snapshot.js +6 -2
  167. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  168. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  169. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  170. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  171. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  172. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  173. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  174. package/dist/esm/lib/scope/runtime.js +1 -1
  175. package/dist/esm/lib/scope/types.d.ts +6 -0
  176. package/dist/esm/lib/scope/types.js +1 -1
  177. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  178. package/dist/esm/lib/sinks/fileSink.js +387 -0
  179. package/dist/esm/recorders.d.ts +8 -2
  180. package/dist/esm/recorders.js +7 -1
  181. package/dist/esm/sinks.d.ts +23 -0
  182. package/dist/esm/sinks.js +23 -0
  183. package/dist/esm/trace.d.ts +2 -2
  184. package/dist/esm/trace.js +1 -1
  185. package/dist/index.js +77 -60
  186. package/dist/lib/attempt/anySignal.js +43 -0
  187. package/dist/lib/attempt/call.js +134 -0
  188. package/dist/lib/attempt/category.js +136 -0
  189. package/dist/lib/attempt/correlation.js +186 -0
  190. package/dist/lib/attempt/deadline.js +112 -0
  191. package/dist/lib/attempt/decision.js +139 -0
  192. package/dist/lib/attempt/effect.js +174 -0
  193. package/dist/lib/attempt/errors.js +49 -0
  194. package/dist/lib/attempt/index.js +26 -0
  195. package/dist/lib/attempt/name.js +48 -0
  196. package/dist/lib/attempt/observed.js +177 -0
  197. package/dist/lib/attempt/policy.js +92 -0
  198. package/dist/lib/attempt/record.js +29 -0
  199. package/dist/lib/attempt/retryLoopContext.js +31 -0
  200. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  201. package/dist/lib/attempt/runner.js +530 -0
  202. package/dist/lib/attempt/standalone.js +130 -0
  203. package/dist/lib/attempt/types.js +17 -0
  204. package/dist/lib/budget/index.js +17 -0
  205. package/dist/lib/budget/timeBudget.js +674 -0
  206. package/dist/lib/builder/FlowChartBuilder.js +199 -9
  207. package/dist/lib/builder/retryLoop.js +287 -0
  208. package/dist/lib/builder/types.js +1 -1
  209. package/dist/lib/decide/decide.js +2 -2
  210. package/dist/lib/decide/index.js +2 -2
  211. package/dist/lib/decide/types.js +1 -8
  212. package/dist/lib/engine/graph/StageNode.js +1 -1
  213. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  214. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  215. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  216. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  217. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  218. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  219. package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
  220. package/dist/lib/engine/handlers/commitStage.js +24 -5
  221. package/dist/lib/engine/handlers/stageError.js +26 -2
  222. package/dist/lib/engine/index.js +1 -1
  223. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  224. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  225. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  226. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  227. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  228. package/dist/lib/engine/narrative/index.js +1 -1
  229. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  230. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  231. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  232. package/dist/lib/engine/narrative/types.js +1 -1
  233. package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
  234. package/dist/lib/engine/traversalContext.js +6 -3
  235. package/dist/lib/engine/types.js +1 -1
  236. package/dist/lib/errors/terminalFailure.js +64 -0
  237. package/dist/lib/filter/evaluator.js +139 -0
  238. package/dist/lib/ids/idempotencyKey.js +28 -0
  239. package/dist/lib/memory/StageContext.js +246 -5
  240. package/dist/lib/memory/attention.js +175 -0
  241. package/dist/lib/memory/borrowedMutation.js +16 -2
  242. package/dist/lib/memory/frameTypes.js +3 -1
  243. package/dist/lib/memory/redaction.js +54 -5
  244. package/dist/lib/pause/record.js +10 -1
  245. package/dist/lib/pause/types.js +17 -1
  246. package/dist/lib/reactive/createTypedScope.js +3 -1
  247. package/dist/lib/reactive/types.js +3 -1
  248. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  249. package/dist/lib/recorder/ControlDepRecorder.js +50 -2
  250. package/dist/lib/recorder/EmitRecorder.js +1 -1
  251. package/dist/lib/recorder/InOutRecorder.js +75 -6
  252. package/dist/lib/recorder/QualityRecorder.js +87 -29
  253. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  254. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  255. package/dist/lib/recorder/attemptMetrics.js +174 -0
  256. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  257. package/dist/lib/recorder/attemptOTel.js +111 -0
  258. package/dist/lib/recorder/attemptSeries.js +113 -0
  259. package/dist/lib/recorder/hooks.js +4 -1
  260. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  261. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  262. package/dist/lib/runner/FlowChartExecutor.js +330 -101
  263. package/dist/lib/runner/RunnableChart.js +5 -1
  264. package/dist/lib/runner/attach.js +8 -2
  265. package/dist/lib/runner/checkpoint.js +3 -1
  266. package/dist/lib/runner/deadline.js +94 -0
  267. package/dist/lib/runner/index.js +4 -2
  268. package/dist/lib/runner/options.js +3 -1
  269. package/dist/lib/runner/recordSink.js +302 -0
  270. package/dist/lib/runner/resume.js +22 -2
  271. package/dist/lib/runner/snapshot.js +6 -2
  272. package/dist/lib/scope/ScopeFacade.js +303 -6
  273. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  274. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  275. package/dist/lib/scope/runtime.js +1 -1
  276. package/dist/lib/scope/types.js +1 -1
  277. package/dist/lib/sinks/fileSink.js +392 -0
  278. package/dist/recorders.js +10 -2
  279. package/dist/sinks.js +32 -0
  280. package/dist/trace.js +1 -1
  281. package/dist/types/index.d.ts +62 -2
  282. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  283. package/dist/types/lib/attempt/call.d.ts +88 -0
  284. package/dist/types/lib/attempt/category.d.ts +37 -0
  285. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  286. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  287. package/dist/types/lib/attempt/decision.d.ts +52 -0
  288. package/dist/types/lib/attempt/effect.d.ts +76 -0
  289. package/dist/types/lib/attempt/errors.d.ts +41 -0
  290. package/dist/types/lib/attempt/index.d.ts +18 -0
  291. package/dist/types/lib/attempt/name.d.ts +21 -0
  292. package/dist/types/lib/attempt/observed.d.ts +66 -0
  293. package/dist/types/lib/attempt/policy.d.ts +45 -0
  294. package/dist/types/lib/attempt/record.d.ts +11 -0
  295. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  296. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  297. package/dist/types/lib/attempt/runner.d.ts +157 -0
  298. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  299. package/dist/types/lib/attempt/types.d.ts +453 -0
  300. package/dist/types/lib/budget/index.d.ts +9 -0
  301. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  302. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  303. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  304. package/dist/types/lib/builder/types.d.ts +35 -1
  305. package/dist/types/lib/decide/index.d.ts +1 -1
  306. package/dist/types/lib/decide/types.d.ts +3 -0
  307. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  308. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  309. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  310. package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
  311. package/dist/types/lib/engine/index.d.ts +2 -2
  312. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  313. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  314. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  315. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  316. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  317. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  318. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  319. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  320. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  321. package/dist/types/lib/engine/narrative/types.d.ts +74 -5
  322. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  323. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  324. package/dist/types/lib/engine/types.d.ts +52 -57
  325. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  326. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  327. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  328. package/dist/types/lib/memory/StageContext.d.ts +123 -3
  329. package/dist/types/lib/memory/attention.d.ts +26 -0
  330. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  331. package/dist/types/lib/memory/frameTypes.d.ts +38 -0
  332. package/dist/types/lib/memory/redaction.d.ts +12 -0
  333. package/dist/types/lib/pause/types.d.ts +19 -0
  334. package/dist/types/lib/reactive/types.d.ts +36 -4
  335. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  336. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
  337. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  338. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  339. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  340. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  341. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  342. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  343. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  344. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  345. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  346. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  347. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  348. package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
  349. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  350. package/dist/types/lib/runner/attach.d.ts +2 -1
  351. package/dist/types/lib/runner/deadline.d.ts +42 -0
  352. package/dist/types/lib/runner/index.d.ts +3 -1
  353. package/dist/types/lib/runner/options.d.ts +17 -0
  354. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  355. package/dist/types/lib/runner/resume.d.ts +3 -0
  356. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  357. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  358. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  359. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  360. package/dist/types/lib/scope/runtime.d.ts +3 -0
  361. package/dist/types/lib/scope/types.d.ts +6 -0
  362. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  363. package/dist/types/recorders.d.ts +8 -2
  364. package/dist/types/sinks.d.ts +23 -0
  365. package/dist/types/trace.d.ts +2 -2
  366. package/package.json +20 -6
  367. package/dist/esm/lib/decide/evaluator.js +0 -130
  368. package/dist/lib/decide/evaluator.js +0 -134
@@ -31,6 +31,7 @@
31
31
  * Borrowed: LangGraph's checkpoint `v` field; io-ts's decode-at-the-boundary
32
32
  * (one decoder turns `unknown` into the type, or refuses with a path).
33
33
  */
34
+ import { idempotencyKeyProblem } from '../ids/idempotencyKey.js';
34
35
  import { isPausedExecution } from './types.js';
35
36
  /** The checkpoint format this release writes (`FlowchartCheckpoint.checkpointVersion`). */
36
37
  export const CHECKPOINT_VERSION = 2;
@@ -90,6 +91,13 @@ export function decodePauseRecord(raw, at = '') {
90
91
  if (raw.pausedBy !== undefined && raw.pausedBy !== 'interrupt') {
91
92
  refuse(`${field('pausedBy')} must be 'interrupt' when present`);
92
93
  }
94
+ // A key the resume will SEND (P3): held to the one key rule, refused — never dropped (dropping would let the
95
+ // resume recompute a different key).
96
+ if (raw.idempotencyKey !== undefined) {
97
+ const problem = idempotencyKeyProblem(raw.idempotencyKey);
98
+ if (problem !== undefined)
99
+ refuse(`${field('idempotencyKey')} ${problem}`);
100
+ }
93
101
  return {
94
102
  pausedStageId: raw.pausedStageId,
95
103
  subflowPath: subflowPath,
@@ -101,6 +109,7 @@ export function decodePauseRecord(raw, at = '') {
101
109
  ...(isPausedExecution(raw.pausedExecution) && {
102
110
  pausedExecution: { runId: raw.pausedExecution.runId, runtimeStageId: raw.pausedExecution.runtimeStageId },
103
111
  }),
112
+ ...(raw.idempotencyKey !== undefined && { idempotencyKey: raw.idempotencyKey }),
104
113
  };
105
114
  }
106
115
  /**
@@ -166,4 +175,4 @@ export function decodePendingPauses(pending) {
166
175
  function isCount(value) {
167
176
  return typeof value === 'number' && Number.isInteger(value) && value >= 0;
168
177
  }
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXVzZS9yZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBR0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFVLENBQUM7QUFFN0MscUdBQXFHO0FBQ3JHLE1BQU0saUJBQWlCLEdBQXVCLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFldEUsbUVBQW1FO0FBQ25FLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUErQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxDQUNKLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUNBQWlDO1lBQzlGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtREFBbUQsQ0FDeEYsQ0FBQztJQUNKLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUsTUFBTSxFQUNKLGlCQUFpQixFQUFFLFFBQVEsRUFDM0IsbUJBQW1CLEVBQUUsWUFBWSxFQUNqQyxhQUFhLEVBQUUsS0FBSyxFQUNwQixjQUFjLEVBQUUsaUJBQWlCLEVBQ2pDLEdBQUcsT0FBTyxFQUNYLEdBQUcsTUFBMEQsQ0FBQztJQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQVksRUFBRSxFQUFFLEdBQUcsRUFBRTtJQUNyRCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxnQkFBZ0Isb0JBQW9CLENBQUMsQ0FBQztJQUMvRSxJQUFJLE9BQU8sR0FBRyxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLGFBQWEsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN0RSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7SUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3BGLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUNqQyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzFHLCtFQUErRTtJQUMvRSxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDL0QsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPO1FBQ0wsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUF1QjtRQUMxQyxXQUFXLEVBQUUsV0FBdUI7UUFDcEMsYUFBYSxFQUFHLE1BQThELElBQUksRUFBRTtRQUNwRixHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFdBQVcsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFvQixFQUFFLENBQUM7UUFDdkUsd0VBQXdFO1FBQ3hFLG9EQUFvRDtRQUNwRCxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJO1lBQzVDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUU7U0FDMUcsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFBRSxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN2RSxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFBRSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN6RixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QiwyRUFBMkU7SUFDM0UsK0RBQStEO0lBQy9ELElBQUksVUFBVSxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUMvRixPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUM7SUFDcEMsQ0FBQztJQUNELDRFQUE0RTtJQUM1RSxrRUFBa0U7SUFDbEUsSUFBSSxVQUFVLENBQUMsY0FBYyxLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRixNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUN0QyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RixNQUFNLENBQUMseURBQXlELENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFNBQVM7UUFBRSxVQUFVLENBQUMsYUFBYSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNySCw0RkFBNEY7SUFDNUYsdUZBQXVGO0lBQ3ZGLElBQUksVUFBVSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQUUsb0JBQW9CLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdGLE9BQU8sVUFBNEMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsc0dBQXNHO0FBQ3RHLFNBQVMsb0JBQW9CLENBQUMsS0FBYztJQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3RFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUFFLE1BQU0sQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEcsTUFBTSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDckUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQy9CLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFnQjtJQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFBRSxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUN0RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYztJQUM3QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcGF1c2UvcmVjb3JkLnRzIOKAlCB0aGUgY2hlY2twb2ludCBDT0RFQyAoRjgsIDkuMzkuMCk6IG9uZSB2ZXJzaW9uLCBvbmVcbiAqIHVwY2FzdGVyLCBvbmUgdmFsaWRhdG9yLCBvbmUgbWVzc2FnZSBzZXQuXG4gKlxuICogQSBjaGVja3BvaW50IGlzIHN0b3JlZCBkYXRhIOKAlCBSZWRpcywgUG9zdGdyZXMsIGEgZmlsZSDigJQgYW5kIGNvbWVzIGJhY2sgdG9cbiAqIGByZXN1bWUoKWAgZnJvbSB3aGljaGV2ZXIgcmVsZWFzZSB3cm90ZSBpdC4gVW50aWwgOS4zOC4wIGl0IHdhcyBjaGVja2VkIGluXG4gKiBUV08gcGxhY2VzIHdpdGggdHdvIG1lc3NhZ2Ugc2V0czogYEZsb3dDaGFydEV4ZWN1dG9yIMK3IHJlc3VtZWAgY2hlY2tlZCB0aGVcbiAqIHBhdXNlZCByZWNvcmQncyBmaWVsZHMsIGBSZXN1bWVFbnRyeWAgY2hlY2tlZCBlYWNoIHdhaXRpbmcgc2libGluZydzXG4gKiAoYHBlbmRpbmdQYXVzZXNbbl1gKSDigJQgdGhlIFNBTUUgcmVjb3JkIHNoYXBlLCBjaGVja2VkIHR3aWNlLCBkaWZmZXJlbnRseVxuICogKHRoZSB0b3AtbGV2ZWwgYHBhdXNlZEJ5YCBhbmQgYHN1YmZsb3dTdGF0ZXNgIHdlcmUgbmV2ZXIgY2hlY2tlZCBhdCBhbGwpLlxuICogQm90aCBub3cgY2FsbCB7QGxpbmsgZGVjb2RlQ2hlY2twb2ludH07IGV2ZXJ5IHJlY29yZCBpcyBjaGVja2VkIGJ5XG4gKiB7QGxpbmsgZGVjb2RlUGF1c2VSZWNvcmR9LlxuICpcbiAqIFZFUlNJT05JTkcuIEEgY2hlY2twb2ludCB3cml0dGVuIGJ5IHRoaXMgcmVsZWFzZSBjYXJyaWVzXG4gKiBgY2hlY2twb2ludFZlcnNpb246IDJgLiBFdmVyeSBvbGRlciBvbmUgaXMgcmVhZCBieSB0aGUgT05FIHVwY2FzdGVyLFxuICoge0BsaW5rIHVwY2FzdENoZWNrcG9pbnR9LCBhbmQgZXZlcnkgc3RlcCBzbyBmYXIgb25seSBEUk9QUyBmaWVsZHMg4oCUIHdoYXQgYVxuICogbGF0ZXIgZm9ybWF0IGFkZGVkIGlzIG9wdGlvbmFsIGFuZCByZWFkIGFzIGFic2VudDpcbiAqXG4gKiAgIC0gdmVyc2lvbiAwIChubyBgY2hlY2twb2ludFZlcnNpb25gLCBiZWZvcmUgOS4zOS4wKSDihpIgMTogZHJvcFxuICogICAgIGBjb250aW51YXRpb25TdGFnZUlkYCwgYSByZWNvcmQgbm8gcmVzdW1lIGhhcyByZWFkIHNpbmNlIDkuMjguMCAod2hhdFxuICogICAgIHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnQpO1xuICogICAtIHZlcnNpb24gMSAoOS4zOS4w4oCTOS40My54KSDihpIgMiAodGhlIExFQU4gY2hlY2twb2ludCk6IGRyb3BcbiAqICAgICBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2Ag4oCUIHRoZSBydW4ncyBzZXJ2ZWQgcmVjb3JkICh0aGVcbiAqICAgICB3aG9sZSBleGVjdXRpb24gdHJlZSwgdGhlIGZpbmlzaGVkIHN1YmZsb3dzJyByZXN1bHRzKSwgd2hpY2ggbm8gcmVzdW1lXG4gKiAgICAgZXZlciByZWFkIGFuZCB3aGljaCBncmV3IHdpdGggZXZlcnkgZmluaXNoZWQgaXRlcmF0aW9uXG4gKiAgICAgKGBydW5uZXIvY2hlY2twb2ludC50c2ApLlxuICpcbiAqIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuIEFcbiAqIHZlcnNpb24gdGhpcyByZWxlYXNlIGRvZXMgbm90IGtub3cgaXMgcmVmdXNlZCwgbmV2ZXIgZ3Vlc3NlZCBhdC5cbiAqXG4gKiBCb3Jyb3dlZDogTGFuZ0dyYXBoJ3MgY2hlY2twb2ludCBgdmAgZmllbGQ7IGlvLXRzJ3MgZGVjb2RlLWF0LXRoZS1ib3VuZGFyeVxuICogKG9uZSBkZWNvZGVyIHR1cm5zIGB1bmtub3duYCBpbnRvIHRoZSB0eXBlLCBvciByZWZ1c2VzIHdpdGggYSBwYXRoKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBlbmRpbmdQYXVzZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSBjaGVja3BvaW50IGZvcm1hdCB0aGlzIHJlbGVhc2Ugd3JpdGVzIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5jaGVja3BvaW50VmVyc2lvbmApLiAqL1xuZXhwb3J0IGNvbnN0IENIRUNLUE9JTlRfVkVSU0lPTiA9IDIgYXMgY29uc3Q7XG5cbi8qKiBUaGUgZm9ybWF0cyB0aGlzIHJlbGVhc2UgcmVhZHM6IHRoZSBjdXJyZW50IG9uZSBhbmQgZXZlcnkgb25lIGl0IHVwY2FzdHMgKGFic2VudCA9IHZlcnNpb24gMCkuICovXG5jb25zdCBSRUFEQUJMRV9WRVJTSU9OUzogcmVhZG9ubHkgdW5rbm93bltdID0gWzEsIENIRUNLUE9JTlRfVkVSU0lPTl07XG5cbi8qKlxuICogRmllbGRzIG9ubHkgYW4gT0xERVIgY2hlY2twb2ludCBjYW4gY2FycnksIGVhY2ggZHJvcHBlZCBieSB0aGUgZm9ybWF0IG5hbWVkXG4gKiBiZXNpZGUgaXQuIFRoZSB1cGNhc3RlciByZW1vdmVzIHRoZW0gYW5kIHRoZSBjdXJyZW50IHNoYXBlIG5ldmVyIGhhcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHMge1xuICAvKiogVmVyc2lvbiAwIG9ubHk6IHRoZSBpbnZva2VyJ3MgYC5uZXh0YCBpZCDigJQgYSByZWNvcmQgc2luY2UgOS4yOC4wLCBuZXZlciByZWFkLiBEcm9wcGVkIGJ5IHZlcnNpb24gMS4gKi9cbiAgcmVhZG9ubHkgY29udGludWF0aW9uU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIDDigJMxOiB0aGUgcnVuJ3MgZXhlY3V0aW9uIHRyZWUgYXQgdGhlIHBhdXNlIOKAlCBuZXZlciByZWFkIGJ5IGEgcmVzdW1lLiBEcm9wcGVkIGJ5IHZlcnNpb24gMi4gKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZT86IHVua25vd247XG4gIC8qKiBWZXJzaW9ucyAw4oCTMTogdGhlIHN1YmZsb3dzIGZpbmlzaGVkIGJlZm9yZSB0aGUgcGF1c2Ug4oCUIG5ldmVyIHJlYWQgYnkgYSByZXN1bWUuIERyb3BwZWQgYnkgdmVyc2lvbiAyLiAqL1xuICByZWFkb25seSBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogVGhlIG9uZSBtZXNzYWdlIHNoYXBlOiBgSW52YWxpZCBjaGVja3BvaW50OiA8d2hlcmU+IDx3aGF0Pi5gICovXG5mdW5jdGlvbiByZWZ1c2Uod2hhdDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hlY2twb2ludDogJHt3aGF0fS5gKTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIEJyaW5nIGEgc3RvcmVkIGNoZWNrcG9pbnQgb2YgQU5ZIHJlbGVhc2UgdG8gdGhlIGN1cnJlbnQgc2hhcGUg4oCUIHRoZSBvbmVcbiAqIHVwY2FzdGVyLiBWZXJzaW9ucyAwIChubyBgY2hlY2twb2ludFZlcnNpb25gKSBhbmQgMTogZHJvcCB0aGUgZmllbGRzIHRoZWlyXG4gKiBzdWNjZXNzb3JzIGRyb3BwZWQgKHtAbGluayBMZWdhY3lDaGVja3BvaW50RmllbGRzfSksIHN0YW1wIHRoZSBjdXJyZW50XG4gKiB2ZXJzaW9uIGFzIHRoZSBmaXJzdCBrZXkuIFRoZSBjdXJyZW50IHZlcnNpb246IGFzIGlzLCBtaW51cyBhbnkgZHJvcHBlZFxuICogZmllbGQgaXQgY2xhaW1zIHRvIGNhcnJ5LiBBbnl0aGluZyBlbHNlOiByZWZ1c2VkLiBSZXR1cm5zIGEgbmV3IG9iamVjdDsgdGhlXG4gKiBjYWxsZXIncyBpcyBuZXZlciBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RDaGVja3BvaW50KHN0b3JlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBzdG9yZWQuY2hlY2twb2ludFZlcnNpb247XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgIVJFQURBQkxFX1ZFUlNJT05TLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgcmVmdXNlKFxuICAgICAgYGNoZWNrcG9pbnRWZXJzaW9uICR7SlNPTi5zdHJpbmdpZnkodmVyc2lvbikgPz8gU3RyaW5nKHZlcnNpb24pfSBpcyBub3Qgb25lIHRoaXMgcmVsZWFzZSByZWFkcyBgICtcbiAgICAgICAgYCgke1JFQURBQkxFX1ZFUlNJT05TLmpvaW4oJyBvciAnKX0sIG9yIG5vbmUgZm9yIGEgY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjM5LjApYCxcbiAgICApO1xuICB9XG4gIC8vIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuXG4gIGNvbnN0IHtcbiAgICBjaGVja3BvaW50VmVyc2lvbjogX3ZlcnNpb24sXG4gICAgY29udGludWF0aW9uU3RhZ2VJZDogX2ludm9rZXJOZXh0LFxuICAgIGV4ZWN1dGlvblRyZWU6IF90cmVlLFxuICAgIHN1YmZsb3dSZXN1bHRzOiBfZmluaXNoZWRTdWJmbG93cyxcbiAgICAuLi5jdXJyZW50XG4gIH0gPSBzdG9yZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBMZWdhY3lDaGVja3BvaW50RmllbGRzO1xuICByZXR1cm4geyBjaGVja3BvaW50VmVyc2lvbjogQ0hFQ0tQT0lOVF9WRVJTSU9OLCAuLi5jdXJyZW50IH07XG59XG5cbi8qKlxuICogQ2hlY2sgT05FIHBhdXNlIHJlY29yZCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzIG93biBmaWVsZHMgb24gdGhlIGNoZWNrcG9pbnQsXG4gKiBvciBhIHdhaXRpbmcgc2libGluZydzIGBwZW5kaW5nUGF1c2VzW25dYCDigJQgYW5kIHJldHVybiBpdCBhcyBhXG4gKiB7QGxpbmsgUGVuZGluZ1BhdXNlfS4gYGF0YCBuYW1lcyB3aGVyZSB0aGUgcmVjb3JkIHNpdHMgKGAnJ2AgZm9yIHRoZVxuICogY2hlY2twb2ludCBpdHNlbGYsIGAncGVuZGluZ1BhdXNlc1swXSdgIGZvciBhIHNpYmxpbmcpLCBzbyBib3RoIHNpdGVzIHNwZWFrXG4gKiB0aGUgc2FtZSBzZW50ZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQYXVzZVJlY29yZChyYXc6IHVua25vd24sIGF0ID0gJycpOiBQZW5kaW5nUGF1c2Uge1xuICBjb25zdCBmaWVsZCA9IChuYW1lOiBzdHJpbmcpID0+IChhdCA/IGAke2F0fS4ke25hbWV9YCA6IG5hbWUpO1xuICBpZiAoIWlzUGxhaW5SZWNvcmQocmF3KSkgcmVmdXNlKGAke2F0IHx8ICd0aGUgY2hlY2twb2ludCd9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIGlmICh0eXBlb2YgcmF3LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJhdy5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZShgJHtmaWVsZCgncGF1c2VkU3RhZ2VJZCcpfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICB9XG4gIGNvbnN0IHN1YmZsb3dQYXRoID0gcmF3LnN1YmZsb3dQYXRoO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3ViZmxvd1BhdGgpIHx8ICFzdWJmbG93UGF0aC5ldmVyeSgocykgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKSkge1xuICAgIHJlZnVzZShgJHtmaWVsZCgnc3ViZmxvd1BhdGgnKX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gIH1cbiAgY29uc3Qgc3RhdGVzID0gcmF3LnN1YmZsb3dTdGF0ZXM7XG4gIGlmIChzdGF0ZXMgIT09IHVuZGVmaW5lZCAmJiAhaXNQbGFpblJlY29yZChzdGF0ZXMpKSByZWZ1c2UoYCR7ZmllbGQoJ3N1YmZsb3dTdGF0ZXMnKX0gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgLy8gRWFjaCBjYXB0dXJlIHNlZWRzIGEgc3ViZmxvdydzIHJ1bnRpbWUg4oCUIGEgcGxhaW4gb2JqZWN0LCBsaWtlIGBzaGFyZWRTdGF0ZWAuXG4gIGZvciAoY29uc3QgW3N1YmZsb3dJZCwgY2FwdHVyZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGVzID8/IHt9KSkge1xuICAgIGlmICghaXNQbGFpblJlY29yZChjYXB0dXJlKSkgcmVmdXNlKGAke2ZpZWxkKCdzdWJmbG93U3RhdGVzJyl9WyR7SlNPTi5zdHJpbmdpZnkoc3ViZmxvd0lkKX1dIG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIH1cbiAgaWYgKHJhdy5wYXVzZWRCeSAhPT0gdW5kZWZpbmVkICYmIHJhdy5wYXVzZWRCeSAhPT0gJ2ludGVycnVwdCcpIHtcbiAgICByZWZ1c2UoYCR7ZmllbGQoJ3BhdXNlZEJ5Jyl9IG11c3QgYmUgJ2ludGVycnVwdCcgd2hlbiBwcmVzZW50YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYXVzZWRTdGFnZUlkOiByYXcucGF1c2VkU3RhZ2VJZCBhcyBzdHJpbmcsXG4gICAgc3ViZmxvd1BhdGg6IHN1YmZsb3dQYXRoIGFzIHN0cmluZ1tdLFxuICAgIHN1YmZsb3dTdGF0ZXM6IChzdGF0ZXMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkKSA/PyB7fSxcbiAgICAuLi4ocmF3LnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiByYXcucGF1c2VEYXRhIH0pLFxuICAgIC4uLihyYXcucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnICYmIHsgcGF1c2VkQnk6ICdpbnRlcnJ1cHQnIGFzIGNvbnN0IH0pLFxuICAgIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQ6IGtlcHQgb25seSB3aGVuIHdlbGwtZm9ybWVkIChhbiBvbGRlciBvclxuICAgIC8vIGhhbmQtZWRpdGVkIGVudHJ5IHNpbXBseSByZXN1bWVzIHdpdGhvdXQgYSBsaW5rKS5cbiAgICAuLi4oaXNQYXVzZWRFeGVjdXRpb24ocmF3LnBhdXNlZEV4ZWN1dGlvbikgJiYge1xuICAgICAgcGF1c2VkRXhlY3V0aW9uOiB7IHJ1bklkOiByYXcucGF1c2VkRXhlY3V0aW9uLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcmF3LnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFRIRSBjaGVja3BvaW50IGRlY29kZXI6IHVwY2FzdCwgdGhlbiBjaGVjayDigJQgdGhlIGNoZWNrcG9pbnQgaXMgYW4gb2JqZWN0LFxuICogaXRzIGBzaGFyZWRTdGF0ZWAgYSBwbGFpbiBvYmplY3QsIGl0cyBvd24gcGF1c2UgcmVjb3JkIHdlbGwtZm9ybWVkLCBhbmRcbiAqIGV2ZXJ5IGBwZW5kaW5nUGF1c2VzYCBlbnRyeSB3ZWxsLWZvcm1lZCAoZWFjaCByZXR1cm5lZCBkZWNvZGVkKS4gVGhyb3dzXG4gKiBgSW52YWxpZCBjaGVja3BvaW50OiDigKZgIG5hbWluZyB0aGUgZmlyc3QgZmllbGQgdGhhdCBpcyBub3Q7IG5ldmVyIGVkaXRzXG4gKiB0aGUgY2FsbGVyJ3Mgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQ2hlY2twb2ludChzdG9yZWQ6IHVua25vd24pOiBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKHN0b3JlZCkpIHJlZnVzZSgndGhlIGNoZWNrcG9pbnQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgY29uc3QgY2hlY2twb2ludCA9IHVwY2FzdENoZWNrcG9pbnQoc3RvcmVkKTtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpKSByZWZ1c2UoJ3NoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QnKTtcbiAgZGVjb2RlUGF1c2VSZWNvcmQoY2hlY2twb2ludCk7XG4gIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQg4oCUIHRoZSBTQU1FIHJ1bGUgYXMgYSBzaWJsaW5nJ3M6IGEgbWFsZm9ybWVkXG4gIC8vIGxpbmsgaXMgZHJvcHBlZCAodGhlIHJlc3VtZSBydW5zIHdpdGhvdXQgaXQpLCBuZXZlciB0cnVzdGVkLlxuICBpZiAoY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24gIT09IHVuZGVmaW5lZCAmJiAhaXNQYXVzZWRFeGVjdXRpb24oY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24pKSB7XG4gICAgZGVsZXRlIGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uO1xuICB9XG4gIC8vIFRoZSBjb3VudGVycyBzZWVkIHRoZSByZXN1bWVkIHJ1bidzIGlkcyBhbmQgbG9vcCBidWRnZXQ6IGFic2VudCBpcyBhbiBvbGRcbiAgLy8gY2hlY2twb2ludCAodGhlIGNvdW50ZXIgcmVzdGFydHMpLCBwcmVzZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuXG4gIGlmIChjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50ICE9PSB1bmRlZmluZWQgJiYgIWlzQ291bnQoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCkpIHtcbiAgICByZWZ1c2UoJ2V4ZWN1dGlvbkNvdW50IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICB9XG4gIGNvbnN0IHZpc2l0cyA9IGNoZWNrcG9pbnQudmlzaXRDb3VudHM7XG4gIGlmICh2aXNpdHMgIT09IHVuZGVmaW5lZCAmJiAoIWlzUGxhaW5SZWNvcmQodmlzaXRzKSB8fCAhT2JqZWN0LnZhbHVlcyh2aXNpdHMpLmV2ZXJ5KGlzQ291bnQpKSkge1xuICAgIHJlZnVzZSgndmlzaXRDb3VudHMgbXVzdCBtYXAgc3RhZ2UgaWRzIHRvIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycycpO1xuICB9XG4gIGlmIChjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMgIT09IHVuZGVmaW5lZCkgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzID0gZGVjb2RlUGVuZGluZ1BhdXNlcyhjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMpO1xuICAvLyBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyAobmFtZXMgb25seSkgc2VlZHMgdGhlIHJlc3VtZWQgcnVuJ3MgcnVsZSDigJQgYSBtYWxmb3JtZWQgb25lXG4gIC8vIGlzIHJlZnVzZWQsIG5ldmVyIGRyb3BwZWQ6IGRyb3BwaW5nIGl0IHdvdWxkIHNlcnZlIGluIHBsYWluIHdoYXQgdGhlIHJ1biBoYWQgbWFza2VkLlxuICBpZiAoY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyAhPT0gdW5kZWZpbmVkKSBkZWNvZGVSZWRhY3Rpb25NYXJrcyhjaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzKTtcbiAgcmV0dXJuIGNoZWNrcG9pbnQgYXMgdW5rbm93biBhcyBGbG93Y2hhcnRDaGVja3BvaW50O1xufVxuXG4vKiogYHJlZGFjdGlvbk1hcmtzYDogYGtleXNgIGFuIGFycmF5IG9mIHN0cmluZ3M7IGBmaWVsZHNgLCB3aGVuIHByZXNlbnQsIGtleXMg4oaSIGFycmF5cyBvZiBzdHJpbmdzLiAqL1xuZnVuY3Rpb24gZGVjb2RlUmVkYWN0aW9uTWFya3MobWFya3M6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKG1hcmtzKSkgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBpZiAoIWlzU3RyaW5ncyhtYXJrcy5rZXlzKSkgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcy5rZXlzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICBjb25zdCBmaWVsZHMgPSBtYXJrcy5maWVsZHM7XG4gIGlmIChmaWVsZHMgIT09IHVuZGVmaW5lZCAmJiAoIWlzUGxhaW5SZWNvcmQoZmllbGRzKSB8fCAhT2JqZWN0LnZhbHVlcyhmaWVsZHMpLmV2ZXJ5KGlzU3RyaW5ncykpKSB7XG4gICAgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcy5maWVsZHMgbXVzdCBtYXAga2V5cyB0byBhcnJheXMgb2Ygc3RyaW5ncycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5ncyh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbi8qKlxuICogYHBlbmRpbmdQYXVzZXNgIChzdG9yZWQsIHVudHJ1c3RlZCkgYXMgZGVjb2RlZCByZWNvcmRzIOKAlCB0aGUgb25lIGNoZWNrXG4gKiBgZGVjb2RlQ2hlY2twb2ludGAgcnVucywgYW5kIHRoZSBvbmUgYFJlc3VtZUVudHJ5LnBsYW5gIHJ1bnMgb24gd2hhdCBpdCBpc1xuICogaGFuZGVkIGRpcmVjdGx5LCBzbyBuZWl0aGVyIGRvb3IgdGFrZXMgYW4gdW5jaGVja2VkIHNpYmxpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQZW5kaW5nUGF1c2VzKHBlbmRpbmc6IHVua25vd24pOiBQZW5kaW5nUGF1c2VbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwZW5kaW5nKSkgcmVmdXNlKCdwZW5kaW5nUGF1c2VzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgcmV0dXJuIHBlbmRpbmcubWFwKChyYXc6IHVua25vd24sIG4pID0+IGRlY29kZVBhdXNlUmVjb3JkKHJhdywgYHBlbmRpbmdQYXVzZXNbJHtufV1gKSk7XG59XG5cbmZ1bmN0aW9uIGlzQ291bnQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMDtcbn1cbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXVzZS9yZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFVLENBQUM7QUFFN0MscUdBQXFHO0FBQ3JHLE1BQU0saUJBQWlCLEdBQXVCLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFldEUsbUVBQW1FO0FBQ25FLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUErQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxDQUNKLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUNBQWlDO1lBQzlGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1B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SUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxNQUFNLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUNyRSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE9BQWdCO0lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3RFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXVzZS9yZWNvcmQudHMg4oCUIHRoZSBjaGVja3BvaW50IENPREVDIChGOCwgOS4zOS4wKTogb25lIHZlcnNpb24sIG9uZVxuICogdXBjYXN0ZXIsIG9uZSB2YWxpZGF0b3IsIG9uZSBtZXNzYWdlIHNldC5cbiAqXG4gKiBBIGNoZWNrcG9pbnQgaXMgc3RvcmVkIGRhdGEg4oCUIFJlZGlzLCBQb3N0Z3JlcywgYSBmaWxlIOKAlCBhbmQgY29tZXMgYmFjayB0b1xuICogYHJlc3VtZSgpYCBmcm9tIHdoaWNoZXZlciByZWxlYXNlIHdyb3RlIGl0LiBVbnRpbCA5LjM4LjAgaXQgd2FzIGNoZWNrZWQgaW5cbiAqIFRXTyBwbGFjZXMgd2l0aCB0d28gbWVzc2FnZSBzZXRzOiBgRmxvd0NoYXJ0RXhlY3V0b3IgwrcgcmVzdW1lYCBjaGVja2VkIHRoZVxuICogcGF1c2VkIHJlY29yZCdzIGZpZWxkcywgYFJlc3VtZUVudHJ5YCBjaGVja2VkIGVhY2ggd2FpdGluZyBzaWJsaW5nJ3NcbiAqIChgcGVuZGluZ1BhdXNlc1tuXWApIOKAlCB0aGUgU0FNRSByZWNvcmQgc2hhcGUsIGNoZWNrZWQgdHdpY2UsIGRpZmZlcmVudGx5XG4gKiAodGhlIHRvcC1sZXZlbCBgcGF1c2VkQnlgIGFuZCBgc3ViZmxvd1N0YXRlc2Agd2VyZSBuZXZlciBjaGVja2VkIGF0IGFsbCkuXG4gKiBCb3RoIG5vdyBjYWxsIHtAbGluayBkZWNvZGVDaGVja3BvaW50fTsgZXZlcnkgcmVjb3JkIGlzIGNoZWNrZWQgYnlcbiAqIHtAbGluayBkZWNvZGVQYXVzZVJlY29yZH0uXG4gKlxuICogVkVSU0lPTklORy4gQSBjaGVja3BvaW50IHdyaXR0ZW4gYnkgdGhpcyByZWxlYXNlIGNhcnJpZXNcbiAqIGBjaGVja3BvaW50VmVyc2lvbjogMmAuIEV2ZXJ5IG9sZGVyIG9uZSBpcyByZWFkIGJ5IHRoZSBPTkUgdXBjYXN0ZXIsXG4gKiB7QGxpbmsgdXBjYXN0Q2hlY2twb2ludH0sIGFuZCBldmVyeSBzdGVwIHNvIGZhciBvbmx5IERST1BTIGZpZWxkcyDigJQgd2hhdCBhXG4gKiBsYXRlciBmb3JtYXQgYWRkZWQgaXMgb3B0aW9uYWwgYW5kIHJlYWQgYXMgYWJzZW50OlxuICpcbiAqICAgLSB2ZXJzaW9uIDAgKG5vIGBjaGVja3BvaW50VmVyc2lvbmAsIGJlZm9yZSA5LjM5LjApIOKGkiAxOiBkcm9wXG4gKiAgICAgYGNvbnRpbnVhdGlvblN0YWdlSWRgLCBhIHJlY29yZCBubyByZXN1bWUgaGFzIHJlYWQgc2luY2UgOS4yOC4wICh3aGF0XG4gKiAgICAgcnVucyBhZnRlciBhIHJlc3VtZSBjb21lcyBmcm9tIHRoZSBjaGFydCk7XG4gKiAgIC0gdmVyc2lvbiAxICg5LjM5LjDigJM5LjQzLngpIOKGkiAyICh0aGUgTEVBTiBjaGVja3BvaW50KTogZHJvcFxuICogICAgIGBleGVjdXRpb25UcmVlYCBhbmQgYHN1YmZsb3dSZXN1bHRzYCDigJQgdGhlIHJ1bidzIHNlcnZlZCByZWNvcmQgKHRoZVxuICogICAgIHdob2xlIGV4ZWN1dGlvbiB0cmVlLCB0aGUgZmluaXNoZWQgc3ViZmxvd3MnIHJlc3VsdHMpLCB3aGljaCBubyByZXN1bWVcbiAqICAgICBldmVyIHJlYWQgYW5kIHdoaWNoIGdyZXcgd2l0aCBldmVyeSBmaW5pc2hlZCBpdGVyYXRpb25cbiAqICAgICAoYHJ1bm5lci9jaGVja3BvaW50LnRzYCkuXG4gKlxuICogQSBkcm9wcGVkIGZpZWxkIG5ldmVyIHN1cnZpdmVzLCB3aGF0ZXZlciB2ZXJzaW9uIGNsYWltcyB0byBjYXJyeSBpdC4gQVxuICogdmVyc2lvbiB0aGlzIHJlbGVhc2UgZG9lcyBub3Qga25vdyBpcyByZWZ1c2VkLCBuZXZlciBndWVzc2VkIGF0LlxuICpcbiAqIEJvcnJvd2VkOiBMYW5nR3JhcGgncyBjaGVja3BvaW50IGB2YCBmaWVsZDsgaW8tdHMncyBkZWNvZGUtYXQtdGhlLWJvdW5kYXJ5XG4gKiAob25lIGRlY29kZXIgdHVybnMgYHVua25vd25gIGludG8gdGhlIHR5cGUsIG9yIHJlZnVzZXMgd2l0aCBhIHBhdGgpLlxuICovXG5cbmltcG9ydCB7IGlkZW1wb3RlbmN5S2V5UHJvYmxlbSB9IGZyb20gJy4uL2lkcy9pZGVtcG90ZW5jeUtleS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBlbmRpbmdQYXVzZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSBjaGVja3BvaW50IGZvcm1hdCB0aGlzIHJlbGVhc2Ugd3JpdGVzIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5jaGVja3BvaW50VmVyc2lvbmApLiAqL1xuZXhwb3J0IGNvbnN0IENIRUNLUE9JTlRfVkVSU0lPTiA9IDIgYXMgY29uc3Q7XG5cbi8qKiBUaGUgZm9ybWF0cyB0aGlzIHJlbGVhc2UgcmVhZHM6IHRoZSBjdXJyZW50IG9uZSBhbmQgZXZlcnkgb25lIGl0IHVwY2FzdHMgKGFic2VudCA9IHZlcnNpb24gMCkuICovXG5jb25zdCBSRUFEQUJMRV9WRVJTSU9OUzogcmVhZG9ubHkgdW5rbm93bltdID0gWzEsIENIRUNLUE9JTlRfVkVSU0lPTl07XG5cbi8qKlxuICogRmllbGRzIG9ubHkgYW4gT0xERVIgY2hlY2twb2ludCBjYW4gY2FycnksIGVhY2ggZHJvcHBlZCBieSB0aGUgZm9ybWF0IG5hbWVkXG4gKiBiZXNpZGUgaXQuIFRoZSB1cGNhc3RlciByZW1vdmVzIHRoZW0gYW5kIHRoZSBjdXJyZW50IHNoYXBlIG5ldmVyIGhhcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHMge1xuICAvKiogVmVyc2lvbiAwIG9ubHk6IHRoZSBpbnZva2VyJ3MgYC5uZXh0YCBpZCDigJQgYSByZWNvcmQgc2luY2UgOS4yOC4wLCBuZXZlciByZWFkLiBEcm9wcGVkIGJ5IHZlcnNpb24gMS4gKi9cbiAgcmVhZG9ubHkgY29udGludWF0aW9uU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIDDigJMxOiB0aGUgcnVuJ3MgZXhlY3V0aW9uIHRyZWUgYXQgdGhlIHBhdXNlIOKAlCBuZXZlciByZWFkIGJ5IGEgcmVzdW1lLiBEcm9wcGVkIGJ5IHZlcnNpb24gMi4gKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZT86IHVua25vd247XG4gIC8qKiBWZXJzaW9ucyAw4oCTMTogdGhlIHN1YmZsb3dzIGZpbmlzaGVkIGJlZm9yZSB0aGUgcGF1c2Ug4oCUIG5ldmVyIHJlYWQgYnkgYSByZXN1bWUuIERyb3BwZWQgYnkgdmVyc2lvbiAyLiAqL1xuICByZWFkb25seSBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogVGhlIG9uZSBtZXNzYWdlIHNoYXBlOiBgSW52YWxpZCBjaGVja3BvaW50OiA8d2hlcmU+IDx3aGF0Pi5gICovXG5mdW5jdGlvbiByZWZ1c2Uod2hhdDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hlY2twb2ludDogJHt3aGF0fS5gKTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIEJyaW5nIGEgc3RvcmVkIGNoZWNrcG9pbnQgb2YgQU5ZIHJlbGVhc2UgdG8gdGhlIGN1cnJlbnQgc2hhcGUg4oCUIHRoZSBvbmVcbiAqIHVwY2FzdGVyLiBWZXJzaW9ucyAwIChubyBgY2hlY2twb2ludFZlcnNpb25gKSBhbmQgMTogZHJvcCB0aGUgZmllbGRzIHRoZWlyXG4gKiBzdWNjZXNzb3JzIGRyb3BwZWQgKHtAbGluayBMZWdhY3lDaGVja3BvaW50RmllbGRzfSksIHN0YW1wIHRoZSBjdXJyZW50XG4gKiB2ZXJzaW9uIGFzIHRoZSBmaXJzdCBrZXkuIFRoZSBjdXJyZW50IHZlcnNpb246IGFzIGlzLCBtaW51cyBhbnkgZHJvcHBlZFxuICogZmllbGQgaXQgY2xhaW1zIHRvIGNhcnJ5LiBBbnl0aGluZyBlbHNlOiByZWZ1c2VkLiBSZXR1cm5zIGEgbmV3IG9iamVjdDsgdGhlXG4gKiBjYWxsZXIncyBpcyBuZXZlciBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RDaGVja3BvaW50KHN0b3JlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBzdG9yZWQuY2hlY2twb2ludFZlcnNpb247XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgIVJFQURBQkxFX1ZFUlNJT05TLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgcmVmdXNlKFxuICAgICAgYGNoZWNrcG9pbnRWZXJzaW9uICR7SlNPTi5zdHJpbmdpZnkodmVyc2lvbikgPz8gU3RyaW5nKHZlcnNpb24pfSBpcyBub3Qgb25lIHRoaXMgcmVsZWFzZSByZWFkcyBgICtcbiAgICAgICAgYCgke1JFQURBQkxFX1ZFUlNJT05TLmpvaW4oJyBvciAnKX0sIG9yIG5vbmUgZm9yIGEgY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjM5LjApYCxcbiAgICApO1xuICB9XG4gIC8vIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuXG4gIGNvbnN0IHtcbiAgICBjaGVja3BvaW50VmVyc2lvbjogX3ZlcnNpb24sXG4gICAgY29udGludWF0aW9uU3RhZ2VJZDogX2ludm9rZXJOZXh0LFxuICAgIGV4ZWN1dGlvblRyZWU6IF90cmVlLFxuICAgIHN1YmZsb3dSZXN1bHRzOiBfZmluaXNoZWRTdWJmbG93cyxcbiAgICAuLi5jdXJyZW50XG4gIH0gPSBzdG9yZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBMZWdhY3lDaGVja3BvaW50RmllbGRzO1xuICByZXR1cm4geyBjaGVja3BvaW50VmVyc2lvbjogQ0hFQ0tQT0lOVF9WRVJTSU9OLCAuLi5jdXJyZW50IH07XG59XG5cbi8qKlxuICogQ2hlY2sgT05FIHBhdXNlIHJlY29yZCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzIG93biBmaWVsZHMgb24gdGhlIGNoZWNrcG9pbnQsXG4gKiBvciBhIHdhaXRpbmcgc2libGluZydzIGBwZW5kaW5nUGF1c2VzW25dYCDigJQgYW5kIHJldHVybiBpdCBhcyBhXG4gKiB7QGxpbmsgUGVuZGluZ1BhdXNlfS4gYGF0YCBuYW1lcyB3aGVyZSB0aGUgcmVjb3JkIHNpdHMgKGAnJ2AgZm9yIHRoZVxuICogY2hlY2twb2ludCBpdHNlbGYsIGAncGVuZGluZ1BhdXNlc1swXSdgIGZvciBhIHNpYmxpbmcpLCBzbyBib3RoIHNpdGVzIHNwZWFrXG4gKiB0aGUgc2FtZSBzZW50ZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQYXVzZVJlY29yZChyYXc6IHVua25vd24sIGF0ID0gJycpOiBQZW5kaW5nUGF1c2Uge1xuICBjb25zdCBmaWVsZCA9IChuYW1lOiBzdHJpbmcpID0+IChhdCA/IGAke2F0fS4ke25hbWV9YCA6IG5hbWUpO1xuICBpZiAoIWlzUGxhaW5SZWNvcmQocmF3KSkgcmVmdXNlKGAke2F0IHx8ICd0aGUgY2hlY2twb2ludCd9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIGlmICh0eXBlb2YgcmF3LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJhdy5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZShgJHtmaWVsZCgncGF1c2VkU3RhZ2VJZCcpfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICB9XG4gIGNvbnN0IHN1YmZsb3dQYXRoID0gcmF3LnN1YmZsb3dQYXRoO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3ViZmxvd1BhdGgpIHx8ICFzdWJmbG93UGF0aC5ldmVyeSgocykgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKSkge1xuICAgIHJlZnVzZShgJHtmaWVsZCgnc3ViZmxvd1BhdGgnKX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gIH1cbiAgY29uc3Qgc3RhdGVzID0gcmF3LnN1YmZsb3dTdGF0ZXM7XG4gIGlmIChzdGF0ZXMgIT09IHVuZGVmaW5lZCAmJiAhaXNQbGFpblJlY29yZChzdGF0ZXMpKSByZWZ1c2UoYCR7ZmllbGQoJ3N1YmZsb3dTdGF0ZXMnKX0gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgLy8gRWFjaCBjYXB0dXJlIHNlZWRzIGEgc3ViZmxvdydzIHJ1bnRpbWUg4oCUIGEgcGxhaW4gb2JqZWN0LCBsaWtlIGBzaGFyZWRTdGF0ZWAuXG4gIGZvciAoY29uc3QgW3N1YmZsb3dJZCwgY2FwdHVyZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGVzID8/IHt9KSkge1xuICAgIGlmICghaXNQbGFpblJlY29yZChjYXB0dXJlKSkgcmVmdXNlKGAke2ZpZWxkKCdzdWJmbG93U3RhdGVzJyl9WyR7SlNPTi5zdHJpbmdpZnkoc3ViZmxvd0lkKX1dIG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIH1cbiAgaWYgKHJhdy5wYXVzZWRCeSAhPT0gdW5kZWZpbmVkICYmIHJhdy5wYXVzZWRCeSAhPT0gJ2ludGVycnVwdCcpIHtcbiAgICByZWZ1c2UoYCR7ZmllbGQoJ3BhdXNlZEJ5Jyl9IG11c3QgYmUgJ2ludGVycnVwdCcgd2hlbiBwcmVzZW50YCk7XG4gIH1cbiAgLy8gQSBrZXkgdGhlIHJlc3VtZSB3aWxsIFNFTkQgKFAzKTogaGVsZCB0byB0aGUgb25lIGtleSBydWxlLCByZWZ1c2VkIOKAlCBuZXZlciBkcm9wcGVkIChkcm9wcGluZyB3b3VsZCBsZXQgdGhlXG4gIC8vIHJlc3VtZSByZWNvbXB1dGUgYSBkaWZmZXJlbnQga2V5KS5cbiAgaWYgKHJhdy5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcHJvYmxlbSA9IGlkZW1wb3RlbmN5S2V5UHJvYmxlbShyYXcuaWRlbXBvdGVuY3lLZXkpO1xuICAgIGlmIChwcm9ibGVtICE9PSB1bmRlZmluZWQpIHJlZnVzZShgJHtmaWVsZCgnaWRlbXBvdGVuY3lLZXknKX0gJHtwcm9ibGVtfWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGF1c2VkU3RhZ2VJZDogcmF3LnBhdXNlZFN0YWdlSWQgYXMgc3RyaW5nLFxuICAgIHN1YmZsb3dQYXRoOiBzdWJmbG93UGF0aCBhcyBzdHJpbmdbXSxcbiAgICBzdWJmbG93U3RhdGVzOiAoc3RhdGVzIGFzIFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZCkgPz8ge30sXG4gICAgLi4uKHJhdy5wYXVzZURhdGEgIT09IHVuZGVmaW5lZCAmJiB7IHBhdXNlRGF0YTogcmF3LnBhdXNlRGF0YSB9KSxcbiAgICAuLi4ocmF3LnBhdXNlZEJ5ID09PSAnaW50ZXJydXB0JyAmJiB7IHBhdXNlZEJ5OiAnaW50ZXJydXB0JyBhcyBjb25zdCB9KSxcbiAgICAvLyBBIHJlY29yZCwgbmV2ZXIgYSBwbGFuIGlucHV0OiBrZXB0IG9ubHkgd2hlbiB3ZWxsLWZvcm1lZCAoYW4gb2xkZXIgb3JcbiAgICAvLyBoYW5kLWVkaXRlZCBlbnRyeSBzaW1wbHkgcmVzdW1lcyB3aXRob3V0IGEgbGluaykuXG4gICAgLi4uKGlzUGF1c2VkRXhlY3V0aW9uKHJhdy5wYXVzZWRFeGVjdXRpb24pICYmIHtcbiAgICAgIHBhdXNlZEV4ZWN1dGlvbjogeyBydW5JZDogcmF3LnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IHJhdy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQgfSxcbiAgICB9KSxcbiAgICAuLi4ocmF3LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogcmF3LmlkZW1wb3RlbmN5S2V5IGFzIHN0cmluZyB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUSEUgY2hlY2twb2ludCBkZWNvZGVyOiB1cGNhc3QsIHRoZW4gY2hlY2sg4oCUIHRoZSBjaGVja3BvaW50IGlzIGFuIG9iamVjdCxcbiAqIGl0cyBgc2hhcmVkU3RhdGVgIGEgcGxhaW4gb2JqZWN0LCBpdHMgb3duIHBhdXNlIHJlY29yZCB3ZWxsLWZvcm1lZCwgYW5kXG4gKiBldmVyeSBgcGVuZGluZ1BhdXNlc2AgZW50cnkgd2VsbC1mb3JtZWQgKGVhY2ggcmV0dXJuZWQgZGVjb2RlZCkuIFRocm93c1xuICogYEludmFsaWQgY2hlY2twb2ludDog4oCmYCBuYW1pbmcgdGhlIGZpcnN0IGZpZWxkIHRoYXQgaXMgbm90OyBuZXZlciBlZGl0c1xuICogdGhlIGNhbGxlcidzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNoZWNrcG9pbnQoc3RvcmVkOiB1bmtub3duKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB7XG4gIGlmICghaXNQbGFpblJlY29yZChzdG9yZWQpKSByZWZ1c2UoJ3RoZSBjaGVja3BvaW50IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIGNvbnN0IGNoZWNrcG9pbnQgPSB1cGNhc3RDaGVja3BvaW50KHN0b3JlZCk7XG4gIGlmICghaXNQbGFpblJlY29yZChjaGVja3BvaW50LnNoYXJlZFN0YXRlKSkgcmVmdXNlKCdzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0Jyk7XG4gIGRlY29kZVBhdXNlUmVjb3JkKGNoZWNrcG9pbnQpO1xuICAvLyBBIHJlY29yZCwgbmV2ZXIgYSBwbGFuIGlucHV0IOKAlCB0aGUgU0FNRSBydWxlIGFzIGEgc2libGluZydzOiBhIG1hbGZvcm1lZFxuICAvLyBsaW5rIGlzIGRyb3BwZWQgKHRoZSByZXN1bWUgcnVucyB3aXRob3V0IGl0KSwgbmV2ZXIgdHJ1c3RlZC5cbiAgaWYgKGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgJiYgIWlzUGF1c2VkRXhlY3V0aW9uKGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uKSkge1xuICAgIGRlbGV0ZSBjaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbjtcbiAgfVxuICAvLyBUaGUgY291bnRlcnMgc2VlZCB0aGUgcmVzdW1lZCBydW4ncyBpZHMgYW5kIGxvb3AgYnVkZ2V0OiBhYnNlbnQgaXMgYW4gb2xkXG4gIC8vIGNoZWNrcG9pbnQgKHRoZSBjb3VudGVyIHJlc3RhcnRzKSwgcHJlc2VudCBtdXN0IGJlIHdlbGwtZm9ybWVkLlxuICBpZiAoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCAhPT0gdW5kZWZpbmVkICYmICFpc0NvdW50KGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQpKSB7XG4gICAgcmVmdXNlKCdleGVjdXRpb25Db3VudCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgfVxuICBjb25zdCB2aXNpdHMgPSBjaGVja3BvaW50LnZpc2l0Q291bnRzO1xuICBpZiAodmlzaXRzICE9PSB1bmRlZmluZWQgJiYgKCFpc1BsYWluUmVjb3JkKHZpc2l0cykgfHwgIU9iamVjdC52YWx1ZXModmlzaXRzKS5ldmVyeShpc0NvdW50KSkpIHtcbiAgICByZWZ1c2UoJ3Zpc2l0Q291bnRzIG11c3QgbWFwIHN0YWdlIGlkcyB0byBub24tbmVnYXRpdmUgaW50ZWdlcnMnKTtcbiAgfVxuICBpZiAoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzICE9PSB1bmRlZmluZWQpIGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcyA9IGRlY29kZVBlbmRpbmdQYXVzZXMoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzKTtcbiAgLy8gVGhlIHJlZGFjdGlvbiBhIHBhdXNlIGNhcnJpZXMgKG5hbWVzIG9ubHkpIHNlZWRzIHRoZSByZXN1bWVkIHJ1bidzIHJ1bGUg4oCUIGEgbWFsZm9ybWVkIG9uZVxuICAvLyBpcyByZWZ1c2VkLCBuZXZlciBkcm9wcGVkOiBkcm9wcGluZyBpdCB3b3VsZCBzZXJ2ZSBpbiBwbGFpbiB3aGF0IHRoZSBydW4gaGFkIG1hc2tlZC5cbiAgaWYgKGNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgIT09IHVuZGVmaW5lZCkgZGVjb2RlUmVkYWN0aW9uTWFya3MoY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyk7XG4gIHJldHVybiBjaGVja3BvaW50IGFzIHVua25vd24gYXMgRmxvd2NoYXJ0Q2hlY2twb2ludDtcbn1cblxuLyoqIGByZWRhY3Rpb25NYXJrc2A6IGBrZXlzYCBhbiBhcnJheSBvZiBzdHJpbmdzOyBgZmllbGRzYCwgd2hlbiBwcmVzZW50LCBrZXlzIOKGkiBhcnJheXMgb2Ygc3RyaW5ncy4gKi9cbmZ1bmN0aW9uIGRlY29kZVJlZGFjdGlvbk1hcmtzKG1hcmtzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmICghaXNQbGFpblJlY29yZChtYXJrcykpIHJlZnVzZSgncmVkYWN0aW9uTWFya3MgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgaWYgKCFpc1N0cmluZ3MobWFya3Mua2V5cykpIHJlZnVzZSgncmVkYWN0aW9uTWFya3Mua2V5cyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgY29uc3QgZmllbGRzID0gbWFya3MuZmllbGRzO1xuICBpZiAoZmllbGRzICE9PSB1bmRlZmluZWQgJiYgKCFpc1BsYWluUmVjb3JkKGZpZWxkcykgfHwgIU9iamVjdC52YWx1ZXMoZmllbGRzKS5ldmVyeShpc1N0cmluZ3MpKSkge1xuICAgIHJlZnVzZSgncmVkYWN0aW9uTWFya3MuZmllbGRzIG11c3QgbWFwIGtleXMgdG8gYXJyYXlzIG9mIHN0cmluZ3MnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ3ModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG4vKipcbiAqIGBwZW5kaW5nUGF1c2VzYCAoc3RvcmVkLCB1bnRydXN0ZWQpIGFzIGRlY29kZWQgcmVjb3JkcyDigJQgdGhlIG9uZSBjaGVja1xuICogYGRlY29kZUNoZWNrcG9pbnRgIHJ1bnMsIGFuZCB0aGUgb25lIGBSZXN1bWVFbnRyeS5wbGFuYCBydW5zIG9uIHdoYXQgaXQgaXNcbiAqIGhhbmRlZCBkaXJlY3RseSwgc28gbmVpdGhlciBkb29yIHRha2VzIGFuIHVuY2hlY2tlZCBzaWJsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUGVuZGluZ1BhdXNlcyhwZW5kaW5nOiB1bmtub3duKTogUGVuZGluZ1BhdXNlW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGVuZGluZykpIHJlZnVzZSgncGVuZGluZ1BhdXNlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gIHJldHVybiBwZW5kaW5nLm1hcCgocmF3OiB1bmtub3duLCBuKSA9PiBkZWNvZGVQYXVzZVJlY29yZChyYXcsIGBwZW5kaW5nUGF1c2VzWyR7bn1dYCkpO1xufVxuXG5mdW5jdGlvbiBpc0NvdW50KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDA7XG59XG4iXX0=
@@ -114,6 +114,8 @@ export declare class PauseSignal extends Error {
114
114
  * (`completeExecution`), or both carried over for a queued sibling.
115
115
  */
116
116
  private _pausedExecution?;
117
+ /** The paused execution's idempotency key (P3) — a touching stage's, stamped once at the stage boundary. */
118
+ private _idempotencyKey?;
117
119
  constructor(data: unknown, stageId: string, pausedBy?: 'interrupt');
118
120
  get subflowPath(): readonly string[];
119
121
  /** The paused execution (its run and `[path/]stageId#N`), once both are known. */
@@ -125,6 +127,13 @@ export declare class PauseSignal extends Error {
125
127
  * carries both (it paused in an EARLIER run).
126
128
  */
127
129
  stampExecution(runtimeStageId: string, runId?: string): void;
130
+ /**
131
+ * The idempotency key the paused execution ran under (P3) — a touching stage's. It rides the checkpoint so the
132
+ * resume re-runs the stage (or its `resumeFn`) under the SAME key: the input its rule read does not cross a
133
+ * resume. First stamp wins.
134
+ */
135
+ get idempotencyKey(): string | undefined;
136
+ stampIdempotencyKey(key: string | undefined): void;
128
137
  /**
129
138
  * Name the run for every pause on this signal that paused in it — this one
130
139
  * and its queued siblings that do not already carry a run (a sibling raised
@@ -213,6 +222,8 @@ export interface PendingPause {
213
222
  readonly pausedBy?: 'interrupt';
214
223
  /** Which execution the sibling paused in (as `pausedExecution`, 9.37.0) — kept so its own resume links to it. */
215
224
  readonly pausedExecution?: PausedExecution;
225
+ /** The idempotency key the sibling's execution ran under (as `idempotencyKey`, 10.1). */
226
+ readonly idempotencyKey?: string;
216
227
  }
217
228
  /**
218
229
  * Returned by a pausable stage's execute/resume function to signal pause.
@@ -277,6 +288,14 @@ export interface FlowchartCheckpoint {
277
288
  * which then resumes without a link.
278
289
  */
279
290
  readonly pausedExecution?: PausedExecution;
291
+ /**
292
+ * The idempotency key the paused execution ran under (10.1) — present only when the paused stage `touches` an
293
+ * outside system with a key rule. `resume()` re-runs the stage (or runs its `resumeFn`) under THIS key, never a
294
+ * recomputed one: the input the rule read does not cross a resume, and a different key on the re-run would make
295
+ * the outside system apply the effect twice. A real value, like `sharedState` — no redaction policy touches the
296
+ * checkpoint. A malformed one is refused at `resume()`.
297
+ */
298
+ readonly idempotencyKey?: string;
280
299
  /** Path through subflows to the paused stage (e.g., ['sf-payment', 'sf-validation']).
281
300
  * Empty array when paused at the top level. */
282
301
  readonly subflowPath: readonly string[];
@@ -95,6 +95,8 @@ export class PauseSignal extends Error {
95
95
  * (`completeExecution`), or both carried over for a queued sibling.
96
96
  */
97
97
  _pausedExecution;
98
+ /** The paused execution's idempotency key (P3) — a touching stage's, stamped once at the stage boundary. */
99
+ _idempotencyKey;
98
100
  constructor(data, stageId, pausedBy) {
99
101
  super('Execution paused');
100
102
  this.name = 'PauseSignal';
@@ -125,6 +127,18 @@ export class PauseSignal extends Error {
125
127
  return;
126
128
  this._pausedExecution = { runtimeStageId, ...(runId !== undefined && { runId }) };
127
129
  }
130
+ /**
131
+ * The idempotency key the paused execution ran under (P3) — a touching stage's. It rides the checkpoint so the
132
+ * resume re-runs the stage (or its `resumeFn`) under the SAME key: the input its rule read does not cross a
133
+ * resume. First stamp wins.
134
+ */
135
+ get idempotencyKey() {
136
+ return this._idempotencyKey;
137
+ }
138
+ stampIdempotencyKey(key) {
139
+ if (this._idempotencyKey === undefined && key !== undefined)
140
+ this._idempotencyKey = key;
141
+ }
128
142
  /**
129
143
  * Name the run for every pause on this signal that paused in it — this one
130
144
  * and its queued siblings that do not already carry a run (a sibling raised
@@ -163,6 +177,7 @@ export class PauseSignal extends Error {
163
177
  ...(pause.pausedBy && { pausedBy: pause.pausedBy }),
164
178
  ...(pause.pausedExecution &&
165
179
  typeof pause.pausedExecution.runtimeStageId === 'string' && { pausedExecution: { ...pause.pausedExecution } }),
180
+ ...(pause.idempotencyKey !== undefined && { idempotencyKey: pause.idempotencyKey }),
166
181
  });
167
182
  }
168
183
  /**
@@ -186,6 +201,7 @@ export class PauseSignal extends Error {
186
201
  ...(this.pauseData !== undefined && { pauseData: this.pauseData }),
187
202
  ...(this.pausedBy && { pausedBy: this.pausedBy }),
188
203
  ...(this._pausedExecution && { pausedExecution: { ...this._pausedExecution } }),
204
+ ...(this._idempotencyKey !== undefined && { idempotencyKey: this._idempotencyKey }),
189
205
  };
190
206
  }
191
207
  /** The stage that invoked the paused child (decider, selector, fork). */
@@ -244,4 +260,4 @@ export function isPauseSignal(error) {
244
260
  return false;
245
261
  }
246
262
  }
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhdXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQTRCSCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBeUUsQ0FBQztJQUNwRixPQUFPLENBQ0wsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyx1REFBdUQ7SUFDOUMsU0FBUyxDQUFVO0lBQzVCLDRDQUE0QztJQUNuQyxPQUFPLENBQVM7SUFDekI7Ozs7Ozs7T0FPRztJQUNNLFFBQVEsQ0FBZTtJQUNoQyx5RUFBeUU7SUFDakUsWUFBWSxDQUFXO0lBRS9COzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBVTtJQUVqQzs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGNBQWMsR0FBNEMsRUFBRSxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSyxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQThDO0lBRXRFLFlBQVksSUFBYSxFQUFFLE9BQWUsRUFBRSxRQUFzQjtRQUNoRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2Qix1RkFBdUY7UUFDdkYsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLElBQUksZUFBZTtRQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDaEMsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLGNBQXNCLEVBQUUsS0FBYztRQUNuRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM1RyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDOUYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxLQUFtQjtRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBQ25DLGFBQWEsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN6QyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztTQUNqSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQXlDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWix5RUFBeUU7UUFDekUsT0FBcUI7WUFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQzNCLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNuQyxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsRSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztTQUNoRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLGNBQXNCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLEtBQThCO1FBQ25FLGlFQUFpRTtRQUNqRSxtRUFBbUU7UUFDbkUsNERBQTREO1FBQzVELGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUE2UUQsK0RBQStEO0FBRS9ELGdFQUFnRTtBQUNoRSxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFxQixDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDOUYsQ0FBQztBQUVELHdHQUF3RztBQUN4RyxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSwyREFBMkQ7SUFDM0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLEtBQUssWUFBWSxXQUFXO1lBQzVCLENBQUMsS0FBSyxZQUFZLEtBQUs7Z0JBQ3JCLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYTtnQkFDNUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXVzZS9SZXN1bWUg4oCUIHNlcmlhbGl6YWJsZSBjaGVja3BvaW50IGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3MuXG4gKlxuICogQSBzdGFnZSBzaWduYWxzIHBhdXNlIGJ5IGNhbGxpbmcgYHNjb3BlLiRwYXVzZShkYXRhKWAgd2hpY2ggdGhyb3dzIGEgUGF1c2VTaWduYWwuXG4gKiBUaGUgc2lnbmFsIGJ1YmJsZXMgdXAgdGhyb3VnaCBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlciDihpIgRmxvd0NoYXJ0RXhlY3V0b3IsXG4gKiBlYWNoIGxldmVsIGFkZGluZyBpdHMgc3ViZmxvdyBJRCB0byB0aGUgcGF0aC5cbiAqXG4gKiBUaGUgY2hlY2twb2ludCBjYXB0dXJlcyB3aGF0IGEgcmVzdW1lIHJlYWRzLCBhbmQgdGhlIHBhdXNlJ3Mgb3duIHJlY29yZCDigJRcbiAqIG5ldmVyIHRoZSBydW4ncyBoaXN0b3J5ICh0aGF0IGlzIGBnZXRTbmFwc2hvdCgpYCdzKTpcbiAqICAgLSBwYXVzZWRTdGFnZUlkICsgc3ViZmxvd1BhdGggKCsgcGF1c2VkQnkpOiB0aGUgY3Vyc29yXG4gKiAgIC0gc2hhcmVkU3RhdGUgKyBzdWJmbG93U3RhdGVzOiB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlIOKAlCB0aGUgcm9vdCdzLCBhbmRcbiAqICAgICBlYWNoIHN1YmZsb3cncyBvbiB0aGUgcGF1c2UgcGF0aFxuICogICAtIGV4ZWN1dGlvbkNvdW50ICsgdmlzaXRDb3VudHM6IHRoZSBjb3VudGVycyB0aGUgcmVzdW1lZCBydW4gY29udGludWVzXG4gKiAgIC0gcGVuZGluZ1BhdXNlcywgcmVkYWN0aW9uTWFya3M6IHdhaXRpbmcgc2libGluZ3MsIHJlZGFjdGlvbiBuYW1lc1xuICogICAtIHBhdXNlRGF0YSwgcGF1c2VkRXhlY3V0aW9uLCBpbnZva2VyU3RhZ2VJZCwgcGF1c2VkQXQ6IHRoZSByZWNvcmRcbiAqXG4gKiBSZXN1bWUgcmVidWlsZHMgdGhlIGZsb3djaGFydCwgcmVzdG9yZXMgc2NvcGUsIG5hdmlnYXRlcyB0byB0aGUgcGF1c2VkIHN0YWdlLFxuICogaW5qZWN0cyByZXN1bWVJbnB1dCwgYW5kIGNvbnRpbnVlcyB0cmF2ZXJzYWwuXG4gKlxuICogU3VwcG9ydGVkIHRvcG9sb2dpZXM6IGxpbmVhciwgc3ViZmxvdyAoYXQgYW55IGRlcHRoIOKAlCBtb3VudGVkIGxpbmVhcmx5LCBhcyBhXG4gKiBkZWNpZGVyIG9yIHNlbGVjdG9yIGJyYW5jaCwgb3IgYXMgYSBmb3JrIGNoaWxkKSwgbG9vcCwgbmVzdGVkIHN1YmZsb3cgaW5cbiAqIGxvb3AsIGFuZCBzZXZlcmFsIHBhcmFsbGVsIHNpYmxpbmdzIHBhdXNpbmcgaW4gb25lIGZhbi1vdXQgKGVhY2ggYXNrcyBpblxuICogdHVybiDigJQgYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLlxuICpcbiAqIE5PVCByZXN1bWFibGUgeWV0OiBhIHBhdXNlIGluc2lkZSBhIExBWlkgc3ViZmxvdyAoYGFkZExhenlTdWJGbG93Q2hhcnQqYCkgb3JcbiAqIGluc2lkZSBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBicmFuY2guIFRoZWlyIGdyYXBocyBhcmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWVcbiAqIGFuZCBhcmUgbm90IGluIHRoZSBjaGFydCBhIHJlc3VtZSB3YWxrcywgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZVxuICogY2hlY2twb2ludCAoXCJub3QgZm91bmRcIikgaW5zdGVhZCBvZiBndWVzc2luZy4gUGlubmVkIGluXG4gKiB0ZXN0L2xpYi9wYXVzZS9yZXN1bWUta25vd24tbGltaXRhdGlvbnMudGVzdC50cy5cbiAqL1xuXG4vLyDilIDilIAgUGF1c2VTaWduYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICogcnVudGltZVN0YWdlSWQgaW4gaXQuIFJlY29yZGVkIG9uIHRoZSBjaGVja3BvaW50IChhbmQgb24gZWFjaCBxdWV1ZWRcbiAqIHNpYmxpbmcncyBwZW5kaW5nIHJlY29yZCkgc28gYSByZXN1bWUgY2FuIExJTksgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VkRXhlY3V0aW9uIHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4g4oCUIE5BTUVTIG9ubHksIG5ldmVyIGEgdmFsdWVcbiAqICh0aGUgY2hlY2twb2ludCBzdGF5cyByZWFsKTogdGhlIGtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1blxuICogKGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgYSBrZXkgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZSwgYVxuICogc3ViZmxvdyBtYXBwZXIncyB0YWludCkgYW5kIHRoZSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleS4gUmVzdW1lXG4gKiBzZWVkcyB0aGUgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlbSwgc28gYSBjb3B5IG1hZGUgYmVmb3JlIHRoZSBwYXVzZSBpc1xuICogc3RpbGwgbWFza2VkIGFmdGVyIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvbk1hcmtzIHtcbiAgcmVhZG9ubHkga2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBLZXkg4oaSIHRoZSBmaWVsZCBwYXRocyBhIG1hcHBlciBoYW5kZWQgaXQuIEFic2VudCB3aGVuIG5vbmUuICovXG4gIHJlYWRvbmx5IGZpZWxkcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBUcnVlIGZvciBhIHdlbGwtZm9ybWVkIHtAbGluayBQYXVzZWRFeGVjdXRpb259ICh0d28gbm9uLWVtcHR5IHN0cmluZ3MpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VkRXhlY3V0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF1c2VkRXhlY3V0aW9uIHtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIHsgcnVuSWQ/OiB1bmtub3duOyBydW50aW1lU3RhZ2VJZD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHY/LnJ1bklkID09PSAnc3RyaW5nJyAmJiB2LnJ1bklkICE9PSAnJyAmJiB0eXBlb2Ygdi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgdi5ydW50aW1lU3RhZ2VJZCAhPT0gJydcbiAgKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgYHNjb3BlLiRwYXVzZSgpYCB0byBzaWduYWwgdGhhdCBleGVjdXRpb24gc2hvdWxkIHN0b3BcbiAqIGFuZCBjcmVhdGUgYSBzZXJpYWxpemFibGUgY2hlY2twb2ludC5cbiAqXG4gKiBCdWJibGVzIHVwIHRocm91Z2ggU3ViZmxvd0V4ZWN1dG9yICh3aGljaCBwcmVwZW5kcyBzdWJmbG93IElEIHRvIHBhdGgpXG4gKiBhbmQgaXMgY2F1Z2h0IGJ5IEZsb3djaGFydFRyYXZlcnNlci9GbG93Q2hhcnRFeGVjdXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdXNlU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGF0YSBmcm9tICRwYXVzZSgpIOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VEYXRhOiB1bmtub3duO1xuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgY2FsbGVkICRwYXVzZSgpLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQg4oCUIGAnaW50ZXJydXB0J2Agd2hlbiBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHBheWxvYWQpYCwgYWJzZW50IGZvciB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gXG4gICAqIGV4ZWN1dGUvcmVzdW1lIHBhdGguIFNldCBhdCB0aGUgc3RhZ2UgYm91bmRhcnkgKGBTdGFnZVJ1bm5lcmApLCBjYXJyaWVkXG4gICAqIG9udG8gdGhlIGNoZWNrcG9pbnQsIGFuZCByZWFkIGJ5IGByZXN1bWUoKWAgdG8gcGljayB0aGUgcmUtZW50cnk6IGFuXG4gICAqIGludGVycnVwdGVkIHN0YWdlIHJlLXJ1bnMgaXRzIE9XTiBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljKSwgYSBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgcGF1c2VkIHN0YWdlLiBCdWlsdCBkdXJpbmcgYnViYmxlLXVwLiAqL1xuICBwcml2YXRlIF9zdWJmbG93UGF0aDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludm9rZXIgY29udGV4dCDigJQgZW5yaWNoZWQgZHVyaW5nIGJ1YmJsZS11cCB3aGVuIGEgUGF1c2VTaWduYWwgcGFzc2VzXG4gICAqIHRocm91Z2ggYSBkZWNpZGVyLCBzZWxlY3Rvciwgb3IgZm9yayBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGUgaW52b2tlciBpcyB0aGUgc3RhZ2UgdGhhdCBjYWxsZWQgZXhlY3V0ZU5vZGUoKSBvbiB0aGUgcGF1c2VkIGNoaWxkLlxuICAgKiBDYXB0dXJlZCBkdXJpbmcgdHJhdmVyc2FsIChub3QgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSB0cmVlKS4gKFRoZVxuICAgKiBpbnZva2VyJ3MgYC5uZXh0YCBpZCByb2RlIGJlc2lkZSBpdCB1bnRpbCA5LjM5LjAgYXNcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgOyB3aGF0IHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnRcbiAgICogc2luY2UgOS4yOC4wLCBzbyBpdCBpcyBubyBsb25nZXIgY2FycmllZC4pXG4gICAqL1xuICBwcml2YXRlIF9pbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBwb3B1bGF0ZWQgZHVyaW5nIGJ1YmJsZS11cCBieVxuICAgKiBgU3ViZmxvd0V4ZWN1dG9yYCByaWdodCBiZWZvcmUgcmUtdGhyb3cuIEVhY2ggZW50cnkgaXMgb25lXG4gICAqIHN1YmZsb3cncyBwcmUtcGF1c2Ugc2hhcmVkIHN0YXRlLCBrZXllZCBieSB0aGUgcGF0aC1wcmVmaXhlZFxuICAgKiBzdWJmbG93IGlkIChtYXRjaGVzIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIHRoZSBuZXN0ZWQgYFNoYXJlZE1lbW9yeWAgaXMgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAgICogYmVmb3JlIHRoZSBjaGVja3BvaW50IGlzIGJ1aWx0LiBPbiByZXN1bWUsIHRoZSBpbm5lciBydW50aW1lIGlzXG4gICAqIHJlLWNyZWF0ZWQgZW1wdHkgYW5kIHJlc3VtZSBoYW5kbGVycyByZWFkaW5nIHByZS1wYXVzZSBzY29wZVxuICAgKiAoZS5nLiwgYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWAsIGBzY29wZS5wYXVzZWRUb29sQ2FsbElkYClcbiAgICogY3Jhc2ggd2l0aCBcIlggaXMgbm90IGl0ZXJhYmxlXCIgLyB1bmRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoYXQgUEFSQUxMRUwgU0lCTElOR1MgcmFpc2VkIGluIHRoZSBzYW1lIGZhbi1vdXQgYXMgdGhpcyBvbmUsXG4gICAqIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKS4gUmVjb3JkZWQgYnkgYENoaWxkcmVuRXhlY3V0b3JgIHdoZW4gbW9yZVxuICAgKiB0aGFuIG9uZSBjaGlsZCBvZiBhIGZvcmsgKG9yIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQgYnJhbmNoKSBwYXVzZXM6IHRoZVxuICAgKiBmaXJzdCBwYXVzZSBpcyB0aGUgb25lIHRoYXQgaXMgYXNrZWQsIHRoZSBvdGhlcnMgcmlkZSBoZXJlIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgZHJvcHBlZC4gRWFjaCBwYXRoIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzaWduYWwgY3VycmVudGx5IGlzXG4gICAqIGFuZCBncm93cyB3aXRoIGl0IOKAlCBgcHJlcGVuZFN1YmZsb3dgIHByZXBlbmRzIHRvIGV2ZXJ5IGVudHJ5IHRvby5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdQYXVzZXM6IE11dGFibGVQZW5kaW5nUGF1c2VbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXSElDSCBleGVjdXRpb24gcGF1c2VkIOKAlCBpdHMgcnVudGltZVN0YWdlSWQgc3RhbXBlZCBvbmNlIGF0IHRoZSBzdGFnZVxuICAgKiBib3VuZGFyeSAoYFN0YWdlUnVubmVyYCksIGl0cyBydW4gYWRkZWQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdFxuICAgKiAoYGNvbXBsZXRlRXhlY3V0aW9uYCksIG9yIGJvdGggY2FycmllZCBvdmVyIGZvciBhIHF1ZXVlZCBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IHVua25vd24sIHN0YWdlSWQ6IHN0cmluZywgcGF1c2VkQnk/OiAnaW50ZXJydXB0Jykge1xuICAgIHN1cGVyKCdFeGVjdXRpb24gcGF1c2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ1BhdXNlU2lnbmFsJztcbiAgICB0aGlzLnBhdXNlRGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICBpZiAocGF1c2VkQnkpIHRoaXMucGF1c2VkQnkgPSBwYXVzZWRCeTtcbiAgICB0aGlzLl9zdWJmbG93UGF0aCA9IFtdO1xuICAgIC8vIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgcmVhbCBlcnJvciDigJQgc3RhY2sgdHJhY2UgaGFzIG5vIGRpYWdub3N0aWMgdmFsdWUuXG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG5cbiAgZ2V0IHN1YmZsb3dQYXRoKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3ViZmxvd1BhdGg7XG4gIH1cblxuICAvKiogVGhlIHBhdXNlZCBleGVjdXRpb24gKGl0cyBydW4gYW5kIGBbcGF0aC9dc3RhZ2VJZCNOYCksIG9uY2UgYm90aCBhcmUga25vd24uICovXG4gIGdldCBwYXVzZWRFeGVjdXRpb24oKTogUGF1c2VkRXhlY3V0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlID0gdGhpcy5fcGF1c2VkRXhlY3V0aW9uO1xuICAgIHJldHVybiBlPy5ydW5JZCAhPT0gdW5kZWZpbmVkID8geyBydW5JZDogZS5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hpY2ggRVhFQ1VUSU9OIHBhdXNlZC4gRmlyc3Qgc3RhbXAgd2luczogdGhlIHNpZ25hbCBidWJibGVzXG4gICAqIHRocm91Z2ggb3V0ZXIgYm91bmRhcmllcyB0aGF0IG11c3Qgbm90IG92ZXJ3cml0ZSBpdC4gVGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIGtub3dzIG9ubHkgdGhlIHJ1bnRpbWVTdGFnZUlkOyBhIHF1ZXVlZCBzaWJsaW5nIHJhaXNlZCBhZ2FpbiBvbiByZXN1bWVcbiAgICogY2FycmllcyBib3RoIChpdCBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW4pLlxuICAgKi9cbiAgc3RhbXBFeGVjdXRpb24ocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgfHwgIXJ1bnRpbWVTdGFnZUlkKSByZXR1cm47XG4gICAgdGhpcy5fcGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZCwgLi4uKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgeyBydW5JZCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgdGhlIHJ1biBmb3IgZXZlcnkgcGF1c2Ugb24gdGhpcyBzaWduYWwgdGhhdCBwYXVzZWQgaW4gaXQg4oCUIHRoaXMgb25lXG4gICAqIGFuZCBpdHMgcXVldWVkIHNpYmxpbmdzIHRoYXQgZG8gbm90IGFscmVhZHkgY2FycnkgYSBydW4gKGEgc2libGluZyByYWlzZWRcbiAgICogYWdhaW4gb24gcmVzdW1lIGtlZXBzIHRoZSBydW4gaXQgcGF1c2VkIGluKS4gQ2FsbGVkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGNoZWNrcG9pbnQgaXMgYnVpbHQuXG4gICAqL1xuICBjb21wbGV0ZUV4ZWN1dGlvbihydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAmJiB0aGlzLl9wYXVzZWRFeGVjdXRpb24ucnVuSWQgPT09IHVuZGVmaW5lZCkgdGhpcy5fcGF1c2VkRXhlY3V0aW9uLnJ1bklkID0gcnVuSWQ7XG4gICAgZm9yIChjb25zdCBwZW5kaW5nIG9mIHRoaXMuX3BlbmRpbmdQYXVzZXMpIHtcbiAgICAgIGlmIChwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbiAmJiBwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBlbmRpbmcucGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZDogcGVuZGluZy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQsIHJ1bklkIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYSBzdWJmbG93IElEIHRvIHRoZSBwYXRoIChjYWxsZWQgZHVyaW5nIGJ1YmJsZS11cCkuIFRoZSBwZW5kaW5nXG4gICAqIHNpYmxpbmcgcGF1c2VzIHJpZGUgdGhlIHNhbWUgYm91bmRhcnksIHNvIHRoZWlyIHBhdGhzIGdyb3cgd2l0aCBpdC5cbiAgICovXG4gIHByZXBlbmRTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViZmxvd1BhdGgudW5zaGlmdChzdWJmbG93SWQpO1xuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUGF1c2VzKSBwZW5kaW5nLnN1YmZsb3dQYXRoLnVuc2hpZnQoc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSBiZWhpbmQgdGhpcyBvbmUgKGl0cyBwYXRoIHJlbGF0aXZlIHRvXG4gICAqIHRoaXMgc2lnbmFsJ3MgY3VycmVudCBsZXZlbCkuIENvcGllZCBpbjogdGhlIGVudHJ5IGlzIG93bmVkIGJ5IHRoZVxuICAgKiBzaWduYWwgZnJvbSBoZXJlIG9uLlxuICAgKi9cbiAgYWRkUGVuZGluZ1BhdXNlKHBhdXNlOiBQZW5kaW5nUGF1c2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nUGF1c2VzLnB1c2goe1xuICAgICAgcGF1c2VkU3RhZ2VJZDogcGF1c2UucGF1c2VkU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBbLi4ucGF1c2Uuc3ViZmxvd1BhdGhdLFxuICAgICAgc3ViZmxvd1N0YXRlczogeyAuLi5wYXVzZS5zdWJmbG93U3RhdGVzIH0sXG4gICAgICAuLi4ocGF1c2UucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHBhdXNlLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRCeSAmJiB7IHBhdXNlZEJ5OiBwYXVzZS5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRFeGVjdXRpb24gJiZcbiAgICAgICAgdHlwZW9mIHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4ucGF1c2UucGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyB3YWl0aW5nIGJlaGluZCB0aGlzIG9uZSwgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbFxuICAgKiBiZSBhc2tlZC4gSW4gZmxpZ2h0LCBhIHNpYmxpbmcgdGhhdCBwYXVzZWQgaW4gVEhJUyBydW4gY2FycmllcyBvbmx5IGl0c1xuICAgKiBydW50aW1lU3RhZ2VJZDsgYGNvbXBsZXRlRXhlY3V0aW9uYCAoYXQgY2hlY2twb2ludCBidWlsZCkgYWRkcyB0aGUgcnVuLlxuICAgKi9cbiAgZ2V0IHBlbmRpbmdQYXVzZXMoKTogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW10ge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nUGF1c2VzIGFzIHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgcGF1c2UgYXMgYSB7QGxpbmsgUGVuZGluZ1BhdXNlfSDigJQgd2hhdCBgQ2hpbGRyZW5FeGVjdXRvcmAgcXVldWVzXG4gICAqIGJlaGluZCBhIHNpYmxpbmcncyBwYXVzZSB3aGVuIGJvdGggcGF1c2VkIGluIG9uZSBmYW4tb3V0LlxuICAgKi9cbiAgdG9QZW5kaW5nUGF1c2UoKTogUGVuZGluZ1BhdXNlIHtcbiAgICAvLyBJbiBmbGlnaHQgKHNlZSBgcGVuZGluZ1BhdXNlc2ApOiB0aGUgcnVuIGlzIGFkZGVkIGF0IGNoZWNrcG9pbnQgYnVpbGQuXG4gICAgcmV0dXJuIDxQZW5kaW5nUGF1c2U+e1xuICAgICAgcGF1c2VkU3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IFsuLi50aGlzLl9zdWJmbG93UGF0aF0sXG4gICAgICBzdWJmbG93U3RhdGVzOiB7IC4uLnRoaXMuX3N1YmZsb3dTdGF0ZXMgfSxcbiAgICAgIC4uLih0aGlzLnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiB0aGlzLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLih0aGlzLnBhdXNlZEJ5ICYmIHsgcGF1c2VkQnk6IHRoaXMucGF1c2VkQnkgfSksXG4gICAgICAuLi4odGhpcy5fcGF1c2VkRXhlY3V0aW9uICYmIHsgcGF1c2VkRXhlY3V0aW9uOiB7IC4uLnRoaXMuX3BhdXNlZEV4ZWN1dGlvbiB9IH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlIHRoYXQgaW52b2tlZCB0aGUgcGF1c2VkIGNoaWxkIChkZWNpZGVyLCBzZWxlY3RvciwgZm9yaykuICovXG4gIGdldCBpbnZva2VyU3RhZ2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2VyU3RhZ2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCB0aGUgaW52b2tlciBjb250ZXh0IGR1cmluZyBidWJibGUtdXAuXG4gICAqIENhbGxlZCBieSBkZWNpZGVyL3NlbGVjdG9yL2ZvcmsgaGFuZGxlcnMgd2hlbiBjYXRjaGluZyBhIGNoaWxkJ3MgUGF1c2VTaWduYWwuXG4gICAqIEZpcnN0IGludm9rZXIgd2lucyAoaW5uZXJtb3N0KSDigJQgc3Vic2VxdWVudCBjYWxscyBhcmUgbm8tb3BzLlxuICAgKi9cbiAgc2V0SW52b2tlcihpbnZva2VyU3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pbnZva2VyU3RhZ2VJZCkgdGhpcy5faW52b2tlclN0YWdlSWQgPSBpbnZva2VyU3RhZ2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGEgc3ViZmxvdydzIGlzb2xhdGVkIFNoYXJlZE1lbW9yeSBhdCB0aGUgbW9tZW50IGl0c1xuICAgKiB0cmF2ZXJzYWwgdGhyZXcuIENhbGxlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCBvbmNlIHBlciBzdWJmbG93XG4gICAqIGJvdW5kYXJ5IG9uIHRoZSBidWJibGUtdXAgcGF0aC4gRWFjaCBjYXB0dXJlIGlzIGtleWVkIGJ5IHRoZVxuICAgKiBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKHRoZSBzYW1lIGlkIHVzZWQgaW4gYHN1YmZsb3dQYXRoYCkuXG4gICAqXG4gICAqIElubmVybW9zdC1maXJzdDogYSBkZWVwIGBTZXF1ZW5jZShBZ2VudCguLi4pKWAgcGF1c2UgY2FwdHVyZXMgdGhlXG4gICAqIGFnZW50J3Mgc3ViZmxvdyBmaXJzdCwgdGhlbiBpdHMgcGFyZW50J3MsIGFsbCB0aGUgd2F5IHRvIHRoZSByb290XG4gICAqIG1vdW50LiBUaGUgZnVsbCBuZXN0IHN1cnZpdmVzIGludG8gYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc2AuXG4gICAqL1xuICBjYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZDogc3RyaW5nLCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyBEZWZlbnNpdmUgc2hhbGxvdyBjbG9uZSBzbyBsYXRlciBtdXRhdGlvbnMgb24gdGhlIHNvdXJjZSBkb24ndFxuICAgIC8vIGJsZWVkIGludG8gdGhlIGNhcHR1cmVkIHNuYXBzaG90LiBEZWVwIGNsb25pbmcgaXMgdGhlIGNvbnN1bWVyJ3NcbiAgICAvLyByZXNwb25zaWJpbGl0eSAodGhlIHJlc3VtZSB0YXJnZXQgbWF5IG5vdCBldmVuIGJlIG9uIHRoaXNcbiAgICAvLyBwcm9jZXNzKTsgU2hhcmVkTWVtb3J5IHZhbHVlcyBhcmUgY29udmVudGlvbmFsbHkgSlNPTi1mcmllbmRseS5cbiAgICB0aGlzLl9zdWJmbG93U3RhdGVzW3N1YmZsb3dJZF0gPSB7IC4uLnN0YXRlIH07XG4gIH1cblxuICAvKiogQ2FwdHVyZWQgc3ViZmxvdyBzY29wZXMgKHJlYWQtb25seSB2aWV3KS4gKi9cbiAgZ2V0IHN1YmZsb3dTdGF0ZXMoKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YmZsb3dTdGF0ZXM7XG4gIH1cbn1cblxuLy8g4pSA4pSAIFBlbmRpbmdQYXVzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHBhdXNlIGEgUEFSQUxMRUwgU0lCTElORyBvZiB0aGUgcGF1c2VkIHN0YWdlIHJhaXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0IOKAlFxuICogdHdvIGNoaWxkcmVuIG9mIG9uZSBmb3JrIChvciB0d28gc2VsZWN0ZWQgYnJhbmNoZXMgb2Ygb25lIHNlbGVjdG9yKSB0aGF0XG4gKiBib3RoIHBhdXNlZCAoOS4yOC4wKS4gT25seSBvbmUgcGF1c2UgaXMgYXNrZWQgYXQgYSB0aW1lOiB0aGUgY2hlY2twb2ludCdzXG4gKiBvd24gKGBwYXVzZWRTdGFnZUlkYCksIHRoZW4gZWFjaCBvZiB0aGVzZSBpbiB0dXJuLCB3aXRoIHRoZSBmYW4tb3V0J3Mgam9pblxuICogcnVubmluZyBvbmx5IG9uY2UgZXZlcnkgY2hpbGQgaXMgZG9uZS5cbiAqXG4gKiBFdmVyeXRoaW5nIG5lZWRlZCB0byByYWlzZSB0aGUgc2libGluZydzIHBhdXNlIGFnYWluIGxhdGVyIFdJVEhPVVQgcmUtcnVubmluZ1xuICogdGhlIHNpYmxpbmc6IGl0cyBzdGFnZSwgaXRzIHBhdGgsIGl0cyBjYXB0dXJlZCBzdWJmbG93IHN0YXRlLCBpdHMgcXVlc3Rpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEEgZm9yayB3aG9zZSB0d28gY2hpbGRyZW4gYm90aCBhc2s6IHRoZSBmaXJzdCBjaGVja3BvaW50IGFza3MgYzEgYW5kXG4gKiAvLyBjYXJyaWVzIGMyJ3MgcGF1c2U7IHJlc3VtaW5nIGl0IGZpbmlzaGVzIGMxLCB0aGVuIHBhdXNlcyB3aXRoIGMyJ3NcbiAqIC8vIHF1ZXN0aW9uOyByZXN1bWluZyBUSEFUIGZpbmlzaGVzIGMyIGFuZCBydW5zIHRoZSBqb2luLlxuICogY29uc3QgY3AgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICogY3AucGF1c2VkU3RhZ2VJZDsgICAgICAgICAgICAgICAgICAvLyAnYzEvYXNrJ1xuICogY3AucGVuZGluZ1BhdXNlcz8uWzBdLnBhdXNlZFN0YWdlSWQ7IC8vICdjMi9hc2snXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nUGF1c2Uge1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UgKHBhdGgtcHJlZml4ZWQgaWQsIGFzIGBwYXVzZWRTdGFnZUlkYCkuICovXG4gIHJlYWRvbmx5IHBhdXNlZFN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgc2libGluZydzIHBhdXNlZCBzdGFnZSAoYXMgYHN1YmZsb3dQYXRoYCkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBzaWJsaW5nJ3Mgb3duIHN1YmZsb3cgY2FwdHVyZXMg4oCUIHRoZSBzdWJmbG93cyBvbiBJVFMgcGF0aCBiZWxvdyB0aGVcbiAgICogZmFuLW91dC4gVGhlIHN1YmZsb3dzIGFib3ZlIHRoZSBmYW4tb3V0IGFyZSBzaGFyZWQgd2l0aCB0aGUgY2hlY2twb2ludCdzXG4gICAqIG93biBwYXVzZSBhbmQgYXJlIGNhcHR1cmVkIGFnYWluIHdoZW4gdGhpcyBwYXVzZSBpcyByYWlzZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBUaGUgc2libGluZydzIHF1ZXN0aW9uIChhcyBgcGF1c2VEYXRhYCkuICovXG4gIHJlYWRvbmx5IHBhdXNlRGF0YT86IHVua25vd247XG4gIC8qKiBIb3cgdGhlIHNpYmxpbmcgcGF1c2VkIChhcyBgcGF1c2VkQnlgKS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFdoaWNoIGV4ZWN1dGlvbiB0aGUgc2libGluZyBwYXVzZWQgaW4gKGFzIGBwYXVzZWRFeGVjdXRpb25gLCA5LjM3LjApIOKAlCBrZXB0IHNvIGl0cyBvd24gcmVzdW1lIGxpbmtzIHRvIGl0LiAqL1xuICByZWFkb25seSBwYXVzZWRFeGVjdXRpb24/OiBQYXVzZWRFeGVjdXRpb247XG59XG5cbi8qKiBBIHBlbmRpbmcgcGF1c2Ugd2hvc2UgcGF0aCBzdGlsbCBncm93cyBhcyBpdHMgc2lnbmFsIGJ1YmJsZXMgdXAgKGludGVybmFsKS4gKi9cbi8qKlxuICogVGhlIHNpZ25hbCdzIG93biBjb3B5IG9mIGEgcGVuZGluZyBwYXVzZS4gSXRzIGBwYXVzZWRFeGVjdXRpb25gIG1heSBzdGlsbFxuICogbGFjayB0aGUgcnVuIChhIHNpYmxpbmcgdGhhdCBwYXVzZWQgaW4gVEhJUyBydW4pIHVudGlsIGBjb21wbGV0ZUV4ZWN1dGlvbmAuXG4gKi9cbnR5cGUgTXV0YWJsZVBlbmRpbmdQYXVzZSA9IE9taXQ8UGVuZGluZ1BhdXNlLCAnc3ViZmxvd1BhdGgnIHwgJ3BhdXNlZEV4ZWN1dGlvbic+ICYge1xuICBzdWJmbG93UGF0aDogc3RyaW5nW107XG4gIHBhdXNlZEV4ZWN1dGlvbj86IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgcnVuSWQ/OiBzdHJpbmcgfTtcbn07XG5cbi8vIOKUgOKUgCBQYXVzZVJlc3VsdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSZXR1cm5lZCBieSBhIHBhdXNhYmxlIHN0YWdlJ3MgZXhlY3V0ZS9yZXN1bWUgZnVuY3Rpb24gdG8gc2lnbmFsIHBhdXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleGVjdXRlOiBhc3luYyAoc2NvcGUpID0+IHtcbiAqICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICogICByZXR1cm4geyBwYXVzZTogdHJ1ZSwgZGF0YTogeyBxdWVzdGlvbjogJ0FwcHJvdmUgb3JkZXIgMTIzPycgfSB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VSZXN1bHQge1xuICByZWFkb25seSBwYXVzZTogdHJ1ZTtcbiAgLyoqIERhdGEgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2twb2ludCDigJQgcXVlc3Rpb24sIHJlYXNvbiwgbWV0YWRhdGEuICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xufVxuXG4vLyDilIDilIAgRmxvd2NoYXJ0Q2hlY2twb2ludCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTZXJpYWxpemFibGUgY2hlY2twb2ludCDigJQgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCxcbiAqIGFuZCBub3RoaW5nIGEgcmVzdW1lIG5ldmVyIHJlYWRzLlxuICpcbiAqIExFQU4gKGZvcm1hdCAyKTogaXRzIHNpemUgaXMgdGhlIFNUQVRFJ3MsIG5ldmVyIHRoZSBydW4ncyBsZW5ndGguIFRoZSBjdXJzb3JcbiAqIGlzIGBwYXVzZWRTdGFnZUlkYCArIGBzdWJmbG93UGF0aGA7IHRoZSBzdGF0ZSBpcyBgc2hhcmVkU3RhdGVgIHBsdXMgdGhlXG4gKiBjYXB0dXJlcyBvZiB0aGUgc3ViZmxvd3Mgb24gdGhhdCBwYXRoIChgc3ViZmxvd1N0YXRlc2ApLiBUaGUgcnVuJ3MgaGlzdG9yeSDigJRcbiAqIHRoZSBleGVjdXRpb24gdHJlZSwgdGhlIGZpbmlzaGVkIHN1YmZsb3dzJyByZXN1bHRzLCB0aGUgY29tbWl0IGxvZyDigJQgaXMgbm90XG4gKiBoZXJlOiByZWFkIGl0IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgIGJlZm9yZSBgcmVzdW1lKClgIChmb3JtYXQgMVxuICogY2FycmllZCBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2A7IG5vIHJlc3VtZSByZWFkIHRoZW0pLlxuICpcbiAqIEpTT04tc2FmZTogbm8gZnVuY3Rpb25zLCBubyBjbGFzcyBpbnN0YW5jZXMsIG5vIFNESyBjbGllbnRzLlxuICogU3RvcmUgYW55d2hlcmU6IFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBhIGZpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCk7IC8vIGFmdGVyIHBhdXNlXG4gKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gKlxuICogLy8gUmVzdW1lIChob3VycyBsYXRlciwgcG9zc2libHkgZGlmZmVyZW50IHNlcnZlcilcbiAqIGNvbnN0IGNoZWNrcG9pbnQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd2NoYXJ0Q2hlY2twb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgY2hlY2twb2ludCBGT1JNQVQ6IGAyYCwgdGhlIGxlYW4gY2hlY2twb2ludCAoYDFgIGZyb20gOS4zOS4wOyBhYnNlbnRcbiAgICogYmVmb3JlKS4gYHJlc3VtZSgpYCByZWFkcyBldmVyeSBvbGRlciBvbmUgdGhyb3VnaCB0aGUgb25lIHVwY2FzdGVyXG4gICAqIChgcGF1c2UvcmVjb3JkLnRzIMK3IHVwY2FzdENoZWNrcG9pbnRgKSwgd2hpY2ggZHJvcHMgd2hhdCBsYXRlciBmb3JtYXRzXG4gICAqIGRyb3BwZWQg4oCUIGZvcm1hdCAxJ3MgYGV4ZWN1dGlvblRyZWVgIGFuZCBgc3ViZmxvd1Jlc3VsdHNgLCB0aGUgbGVnYWN5XG4gICAqIGBjb250aW51YXRpb25TdGFnZUlkYCDigJQgbm9uZSBvZiB3aGljaCBhIHJlc3VtZSBldmVyIHJlYWQuIEEgdmVyc2lvbiB0aGlzXG4gICAqIHJlbGVhc2UgZG9lcyBub3Qga25vdyBpcyByZWZ1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2twb2ludFZlcnNpb24/OiAyO1xuXG4gIC8qKiBTY29wZSBzdGF0ZSBhdCB0aGUgcGF1c2UgcG9pbnQg4oCUIGFsbCBzaGFyZWQgbWVtb3J5IGtleS92YWx1ZXMuICovXG4gIHJlYWRvbmx5IHNoYXJlZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgcGF1c2VkLiBVc2VkIGJ5IHJlc3VtZSgpIHRvIGZpbmQgdGhlIG5vZGUgaW4gdGhlIGdyYXBoLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXVzZWQgRVhFQ1VUSU9OICg5LjM3LjApOiB0aGUgcnVuIHRoYXQgcGF1c2VkIGFuZCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAgICogcnVudGltZVN0YWdlSWQgaW4gaXQgKHRoZSBpZCBpdHMgYG9uUGF1c2VgIGV2ZW50IGFuZCBpdHMgY29tbWl0IGNhcnJ5KS5cbiAgICogUmVhZCBieSBgcmVzdW1lKClgIGludG8gdGhlIGBvblJlc3VtZWAgZXZlbnQncyBgdHJhdmVyc2FsQ29udGV4dC5yZXN1bWVkRnJvbWBcbiAgICogbGluayDigJQgbmV2ZXIgdXNlZCB0byBwbGFuIHRoZSByZS1lbnRyeS4gQWJzZW50IG9uIGFuIG9sZGVyIGNoZWNrcG9pbnQsXG4gICAqIHdoaWNoIHRoZW4gcmVzdW1lcyB3aXRob3V0IGEgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdXNlZEV4ZWN1dGlvbj86IFBhdXNlZEV4ZWN1dGlvbjtcblxuICAvKiogUGF0aCB0aHJvdWdoIHN1YmZsb3dzIHRvIHRoZSBwYXVzZWQgc3RhZ2UgKGUuZy4sIFsnc2YtcGF5bWVudCcsICdzZi12YWxpZGF0aW9uJ10pLlxuICAgKiAgRW1wdHkgYXJyYXkgd2hlbiBwYXVzZWQgYXQgdGhlIHRvcCBsZXZlbC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBEYXRhIGZyb20gJHBhdXNlKCkg4oCUIHF1ZXN0aW9uLCByZWFzb24sIG1ldGFkYXRhLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQuIGAnaW50ZXJydXB0J2AgbWVhbnMgYSBzdGFnZSBib2R5IGNhbGxlZFxuICAgKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIGFuZCBgcGF1c2VEYXRhYCBJUyB0aGF0IHBheWxvYWQ7XG4gICAqIGFic2VudCBtZWFucyB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gIGV4ZWN1dGUvcmVzdW1lIHBhdGggKGV2ZXJ5XG4gICAqIGNoZWNrcG9pbnQgd3JpdHRlbiBiZWZvcmUgOS4xNC4wIG9taXRzIGl0LCB3aGljaCBpcyBleGFjdGx5IHJpZ2h0KS5cbiAgICpcbiAgICogYHJlc3VtZSgpYCByZWFkcyB0aGlzIHRvIHBpY2sgdGhlIHJlLWVudHJ5LCBhbmQgdGhlIHR3byBkaWZmZXIgYnkgbGF3OlxuICAgKiBhbiBpbnRlcnJ1cHRlZCBzdGFnZSBSRS1SVU5TIElUUyBPV04gRlVOQ1RJT04gRlJPTSBUSEUgVE9QIChzdGFnZXMgYXJlXG4gICAqIGF0b21pYyDigJQgdGhlIGFuc3dlciBjb21lcyBiYWNrIG91dCBvZiB0aGUgYGludGVycnVwdCgpYCBjYWxsKSwgd2hpbGUgYVxuICAgKiBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBzZXBhcmF0ZSBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBvbmUgZW50cnkgcGVyIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHBhdGhcbiAgICogdG8gdGhlIHBhdXNlZCBzdGFnZS4gS2V5ZWQgYnkgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChtYXRjaGVzXG4gICAqIGBzdWJmbG93UGF0aGAgZW50cmllcykuIEVhY2ggdmFsdWUgaXMgdGhlIHN1YmZsb3cncyBwcmUtcGF1c2VcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiBBbHdheXMgcHJlc2VudCAoZW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMgd2hlcmUgbm8gc3ViZmxvd3NcbiAgICogd2VyZSBlbnRlcmVkKS4gT24gcmVzdW1lLCBgU3ViZmxvd0V4ZWN1dG9yYCBzZWVkcyBlYWNoIG5lc3RlZCBydW50aW1lXG4gICAqIG9uIHRoZSBwYXRoIGZyb20gdGhpcyBtYXAg4oCUIE9OQ0UsIG9uIGl0cyBmaXJzdCBlbnRyeSwgaW4gcGxhY2Ugb2YgdGhlXG4gICAqIGlucHV0TWFwcGVyJ3MgdmFsdWVzICh0aGUgbWFwcGVyIHN0aWxsIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICogYXJncykg4oCUIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgcHJlLXBhdXNlIHNjb3BlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIEFORFxuICAgKiBjcm9zcy1leGVjdXRvciByZXN0YXJ0cy4gT25seSB0aGUgc3ViZmxvd3MgT04gYHN1YmZsb3dQYXRoYCByZWFkIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGF0IHRoZSBtb21lbnQgb2YgcGF1c2Ug4oCUIHRoZSBudW1iZXIgb2Ygc3RhZ2VzXG4gICAqIGV4ZWN1dGVkIHNvIGZhciB0aGlzIHJ1bi4gUmVzdW1lIHNlZWRzIGl0IHNvIHBvc3QtcmVzdW1lIGBydW50aW1lU3RhZ2VJZGBzXG4gICAqIChgc3RhZ2VJZCNleGVjdXRpb25JbmRleGApIGtlZXAgY2xpbWJpbmcgYW5kIG5ldmVyIGNvbGxpZGUgd2l0aCBwcmUtcGF1c2VcbiAgICogb25lcywgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUgZXZlbnQtY29ycmVsYXRpb24gbW9kZWwgcmVzdHMgb24uXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGNoZWNrcG9pbnQgcGVyc2lzdGVkIGJlZm9yZSB0aGlzXG4gICAqIGZpZWxkIGV4aXN0ZWQgKG9sZGVyIFJlZGlzL1Bvc3RncmVzIHJvd3MpIHN0aWxsIHZhbGlkYXRlcyBhbmQgcmVzdW1lcyB3aXRoXG4gICAqIHRoZSBwcmV2aW91cyAoY291bnRlci1yZXN0YXJ0aW5nKSBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItYHN0YWdlSWRgIGxvb3AgdmlzaXQgY291bnRzIGF0IHRoZSBtb21lbnQgb2YgcGF1c2UuIFJlc3VtZSBzZWVkcyB0aGVtXG4gICAqIHNvIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gIHN0YXlzIGNvbnRpbnVvdXMgYWNyb3NzIHRoZSBwYXVzZSAoYVxuICAgKiBtaWQtbG9vcCByZXN1bWUga2VlcHMgY291bnRpbmcgdXAsIG5vdCByZXN0YXJ0aW5nIGF0IDApIGFuZCB0aGVcbiAgICogQ29udGludWF0aW9uUmVzb2x2ZXIgaXRlcmF0aW9uIGJ1ZGdldCBpcyBub3Qgc2lsZW50bHkgcmVmaWxsZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciB0aGUgc2FtZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbiBhcyBgZXhlY3V0aW9uQ291bnRgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaXRDb3VudHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcblxuICAvKiogU3RhZ2UgdGhhdCBpbnZva2VkIHRoZSBwYXVzZWQgY2hpbGQgKGRlY2lkZXIsIHNlbGVjdG9yLCBmb3JrKS4gQWJzZW50IGZvciBsaW5lYXIgcGF1c2VzLiAqL1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF1c2VzIHJhaXNlZCBieSBQQVJBTExFTCBTSUJMSU5HUyBvZiB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBzYW1lXG4gICAqIGZhbi1vdXQsIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKSDigJQgc2VlIHtAbGluayBQZW5kaW5nUGF1c2V9LiBBYnNlbnRcbiAgICogd2hlbiBvbmx5IG9uZSBjaGlsZCBwYXVzZWQgKGV2ZXJ5IGNoZWNrcG9pbnQgYmVmb3JlIDkuMjguMCBvbWl0cyBpdCwgYW5kXG4gICAqIHJlc3VtZXMgZXhhY3RseSBhcyBiZWZvcmUpLiBSZXN1bWluZyB0aGlzIGNoZWNrcG9pbnQgZmluaXNoZXMgdGhlIHBhdXNlZFxuICAgKiBzdGFnZSdzIGNoaWxkLCB0aGVuIHBhdXNlcyBhZ2FpbiB3aXRoIHRoZSBmaXJzdCBvZiB0aGVzZTsgdGhlIGZhbi1vdXQnc1xuICAgKiBqb2luIHJ1bnMgb25jZSBldmVyeSBjaGlsZCBpcyBkb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIG1hcmtzIG9mIHRoZSBwYXVzZWQgcnVuIOKAlCBOQU1FUyBvbmx5IChzZWVcbiAgICoge0BsaW5rIFJlZGFjdGlvbk1hcmtzfSkuIEFic2VudCB3aGVuIHRoZSBydW4gbWFya2VkIG5vdGhpbmcgKG5vIHBvbGljeVxuICAgKiBhbmQgbm8gcGVyLWNhbGwgbWFyaywgb3IgYW4gb2xkZXIgY2hlY2twb2ludCk6IHRoZSByZXN1bWVkIHJ1biB0aGVuIHN0YXJ0c1xuICAgKiBmcm9tIGl0cyBwb2xpY3kgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSByZWRhY3Rpb25NYXJrcz86IFJlZGFjdGlvbk1hcmtzO1xuXG4gIC8qKiBUaW1lc3RhbXAgb2Ygd2hlbiB0aGUgcGF1c2Ugb2NjdXJyZWQuICovXG4gIHJlYWRvbmx5IHBhdXNlZEF0OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBQYXVzYWJsZUhhbmRsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSGFuZGxlciBmb3IgYSBwYXVzYWJsZSBzdGFnZSDigJQgaGFzIHR3byBwaGFzZXM6IGV4ZWN1dGUgYW5kIHJlc3VtZS5cbiAqXG4gKiBgZXhlY3V0ZWAgcnVucyB0aGUgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAodGhhdCB2YWx1ZVxuICogYmVjb21lcyB0aGUgY2hlY2twb2ludCdzIGBwYXVzZURhdGFgKTsgcmV0dXJuIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICogYHJlc3VtZWAgcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZC4gSXQgcmVjZWl2ZXMgdGhlIHJlc3VtZSBpbnB1dC5cbiAqXG4gKiBCb3RoIHBoYXNlcyByZWNlaXZlIHRoZSBzYW1lIHNjb3BlLiBBZnRlciBleGVjdXRlIHBhdXNlcywgdGhlIHNjb3BlIHN0YXRlXG4gKiBpcyBwcmVzZXJ2ZWQgaW4gdGhlIGNoZWNrcG9pbnQuIE9uIHJlc3VtZSwgdGhlIHNjb3BlIGlzIHJlc3RvcmVkIGJlZm9yZVxuICogY2FsbGluZyByZXN1bWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICAgIHNjb3BlLm9yZGVySWQgPSAnMTIzJztcbiAqICAgICBzY29wZS5hbW91bnQgPSAyOTk7XG4gKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246IGBBcHByb3ZlICQke3Njb3BlLmFtb3VudH0gcmVmdW5kP2AgfTtcbiAqICAgfSxcbiAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAqICAgICBzY29wZS5hcHByb3ZlciA9IGlucHV0LmFwcHJvdmVyO1xuICogICB9LFxuICogfSwgJ2FwcHJvdmUtb3JkZXInLCAnTWFuYWdlciBhcHByb3ZhbCBnYXRlJylcbiAqXG4gKiAvLyBMYXRlciDigJQgcmVzdW1lIHdpdGggaHVtYW4ncyBhbnN3ZXJcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlLCBhcHByb3ZlcjogJ0phbmUnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2FibGVIYW5kbGVyPFRTY29wZSA9IGFueSwgVElucHV0ID0gdW5rbm93biwgVFBhdXNlRGF0YSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIEZpcnN0LXJ1biBwaGFzZS4gUmV0dXJuIGRhdGEgdG8gcGF1c2UsIG9yIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICAgKlxuICAgKiBBbnkgbm9uLXZvaWQgcmV0dXJuIHZhbHVlIGJlY29tZXMgdGhlIGBwYXVzZURhdGFgIGluIHRoZSBjaGVja3BvaW50LlxuICAgKiBUaGUgY29uc3VtZXIgZGVmaW5lcyB0aGUgYFRQYXVzZURhdGFgIHR5cGUg4oCUIHRoZSBGRSB1c2VzIGl0IHRvIHJlbmRlclxuICAgKiB0aGUgcmlnaHQgVUkgKGZvcm0gZmllbGRzLCBhcHByb3ZhbCBidXR0b25zLCBldGMuKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBUUGF1c2VEYXRhID0geyBxdWVzdGlvbjogc3RyaW5nOyByaXNrTGV2ZWw6IHN0cmluZyB9XG4gICAqIGNvbnN0IGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxNeVN0YXRlLCB7IGFwcHJvdmVkOiBib29sZWFuIH0sIHsgcXVlc3Rpb246IHN0cmluZzsgcmlza0xldmVsOiBzdHJpbmcgfT4gPSB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogYEFwcHJvdmUgb3JkZXIgJHtzY29wZS5vcmRlcklkfT9gLCByaXNrTGV2ZWw6ICdoaWdoJyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH07XG4gICAqIGBgYFxuICAgKi9cbiAgZXhlY3V0ZTogKHNjb3BlOiBUU2NvcGUpID0+IFByb21pc2U8VFBhdXNlRGF0YSB8IHZvaWQ+IHwgVFBhdXNlRGF0YSB8IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXN1bWUgcGhhc2UuIENhbGxlZCB3aXRoIHRoZSByZXN1bWUgaW5wdXQgd2hlbiBleGVjdXRpb24gY29udGludWVzLlxuICAgKlxuICAgKiBUaGUgc2NvcGUgaXMgcmVzdG9yZWQgZnJvbSB0aGUgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAuIFdyaXRlcyBkdXJpbmdcbiAgICogYHJlc3VtZWAgYXJlIGNvbW1pdHRlZCBhbmQgdmlzaWJsZSB0byBzdWJzZXF1ZW50IHN0YWdlcy5cbiAgICovXG4gIHJlc3VtZTogKHNjb3BlOiBUU2NvcGUsIGlucHV0OiBUSW5wdXQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuXG4vLyDilIDilIAgVHlwZSBndWFyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBQYXVzZVJlc3VsdCAoc3RhZ2Ugd2FudHMgdG8gcGF1c2UpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VSZXN1bHQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQYXVzZVJlc3VsdCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBQYXVzZVJlc3VsdCkucGF1c2UgPT09IHRydWU7XG59XG5cbi8qKiBDaGVjayBpZiBhbiBlcnJvciBpcyBhIFBhdXNlU2lnbmFsLiBVc2VzIGluc3RhbmNlb2YgKyBuYW1lIGJyYW5kIGZhbGxiYWNrIGZvciBjcm9zcy1yZWFsbSBzYWZldHkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXVzZVNpZ25hbChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIFBhdXNlU2lnbmFsIHtcbiAgLy8gVG90YWw6IGEgUHJveHkgd2hvc2UgYGdldFByb3RvdHlwZU9mYCB0cmFwIHRocm93cyAob3IgYSByZXZva2VkIFByb3h5KVxuICAvLyBpcyBub3QgYSBzaWduYWwg4oCUIHRoZSBlbmdpbmUncyBjYXRjaCBibG9ja3MgYXNrIHRoaXMgZmlyc3QsIGFuZCBtdXN0XG4gIC8vIG5vdCB0cmFkZSB0aGUgc3RhZ2UncyB0aHJvd24gdmFsdWUgZm9yIHRoZSB0cmFwJ3MgZXJyb3IuXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgUGF1c2VTaWduYWwgfHxcbiAgICAgIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgIGVycm9yLm5hbWUgPT09ICdQYXVzZVNpZ25hbCcgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAncGF1c2VEYXRhJykgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnc3RhZ2VJZCcpKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhdXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQTRCSCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBeUUsQ0FBQztJQUNwRixPQUFPLENBQ0wsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyx1REFBdUQ7SUFDOUMsU0FBUyxDQUFVO0lBQzVCLDRDQUE0QztJQUNuQyxPQUFPLENBQVM7SUFDekI7Ozs7Ozs7T0FPRztJQUNNLFFBQVEsQ0FBZTtJQUNoQyx5RUFBeUU7SUFDakUsWUFBWSxDQUFXO0lBRS9COzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBVTtJQUVqQzs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGNBQWMsR0FBNEMsRUFBRSxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSyxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQThDO0lBRXRFLDRHQUE0RztJQUNwRyxlQUFlLENBQVU7SUFFakMsWUFBWSxJQUFhLEVBQUUsT0FBZSxFQUFFLFFBQXNCO1FBQ2hFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUks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QyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXVzZS9SZXN1bWUg4oCUIHNlcmlhbGl6YWJsZSBjaGVja3BvaW50IGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3MuXG4gKlxuICogQSBzdGFnZSBzaWduYWxzIHBhdXNlIGJ5IGNhbGxpbmcgYHNjb3BlLiRwYXVzZShkYXRhKWAgd2hpY2ggdGhyb3dzIGEgUGF1c2VTaWduYWwuXG4gKiBUaGUgc2lnbmFsIGJ1YmJsZXMgdXAgdGhyb3VnaCBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlciDihpIgRmxvd0NoYXJ0RXhlY3V0b3IsXG4gKiBlYWNoIGxldmVsIGFkZGluZyBpdHMgc3ViZmxvdyBJRCB0byB0aGUgcGF0aC5cbiAqXG4gKiBUaGUgY2hlY2twb2ludCBjYXB0dXJlcyB3aGF0IGEgcmVzdW1lIHJlYWRzLCBhbmQgdGhlIHBhdXNlJ3Mgb3duIHJlY29yZCDigJRcbiAqIG5ldmVyIHRoZSBydW4ncyBoaXN0b3J5ICh0aGF0IGlzIGBnZXRTbmFwc2hvdCgpYCdzKTpcbiAqICAgLSBwYXVzZWRTdGFnZUlkICsgc3ViZmxvd1BhdGggKCsgcGF1c2VkQnkpOiB0aGUgY3Vyc29yXG4gKiAgIC0gc2hhcmVkU3RhdGUgKyBzdWJmbG93U3RhdGVzOiB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlIOKAlCB0aGUgcm9vdCdzLCBhbmRcbiAqICAgICBlYWNoIHN1YmZsb3cncyBvbiB0aGUgcGF1c2UgcGF0aFxuICogICAtIGV4ZWN1dGlvbkNvdW50ICsgdmlzaXRDb3VudHM6IHRoZSBjb3VudGVycyB0aGUgcmVzdW1lZCBydW4gY29udGludWVzXG4gKiAgIC0gcGVuZGluZ1BhdXNlcywgcmVkYWN0aW9uTWFya3M6IHdhaXRpbmcgc2libGluZ3MsIHJlZGFjdGlvbiBuYW1lc1xuICogICAtIHBhdXNlRGF0YSwgcGF1c2VkRXhlY3V0aW9uLCBpbnZva2VyU3RhZ2VJZCwgcGF1c2VkQXQ6IHRoZSByZWNvcmRcbiAqXG4gKiBSZXN1bWUgcmVidWlsZHMgdGhlIGZsb3djaGFydCwgcmVzdG9yZXMgc2NvcGUsIG5hdmlnYXRlcyB0byB0aGUgcGF1c2VkIHN0YWdlLFxuICogaW5qZWN0cyByZXN1bWVJbnB1dCwgYW5kIGNvbnRpbnVlcyB0cmF2ZXJzYWwuXG4gKlxuICogU3VwcG9ydGVkIHRvcG9sb2dpZXM6IGxpbmVhciwgc3ViZmxvdyAoYXQgYW55IGRlcHRoIOKAlCBtb3VudGVkIGxpbmVhcmx5LCBhcyBhXG4gKiBkZWNpZGVyIG9yIHNlbGVjdG9yIGJyYW5jaCwgb3IgYXMgYSBmb3JrIGNoaWxkKSwgbG9vcCwgbmVzdGVkIHN1YmZsb3cgaW5cbiAqIGxvb3AsIGFuZCBzZXZlcmFsIHBhcmFsbGVsIHNpYmxpbmdzIHBhdXNpbmcgaW4gb25lIGZhbi1vdXQgKGVhY2ggYXNrcyBpblxuICogdHVybiDigJQgYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLlxuICpcbiAqIE5PVCByZXN1bWFibGUgeWV0OiBhIHBhdXNlIGluc2lkZSBhIExBWlkgc3ViZmxvdyAoYGFkZExhenlTdWJGbG93Q2hhcnQqYCkgb3JcbiAqIGluc2lkZSBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBicmFuY2guIFRoZWlyIGdyYXBocyBhcmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWVcbiAqIGFuZCBhcmUgbm90IGluIHRoZSBjaGFydCBhIHJlc3VtZSB3YWxrcywgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZVxuICogY2hlY2twb2ludCAoXCJub3QgZm91bmRcIikgaW5zdGVhZCBvZiBndWVzc2luZy4gUGlubmVkIGluXG4gKiB0ZXN0L2xpYi9wYXVzZS9yZXN1bWUta25vd24tbGltaXRhdGlvbnMudGVzdC50cy5cbiAqL1xuXG4vLyDilIDilIAgUGF1c2VTaWduYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICogcnVudGltZVN0YWdlSWQgaW4gaXQuIFJlY29yZGVkIG9uIHRoZSBjaGVja3BvaW50IChhbmQgb24gZWFjaCBxdWV1ZWRcbiAqIHNpYmxpbmcncyBwZW5kaW5nIHJlY29yZCkgc28gYSByZXN1bWUgY2FuIExJTksgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VkRXhlY3V0aW9uIHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4g4oCUIE5BTUVTIG9ubHksIG5ldmVyIGEgdmFsdWVcbiAqICh0aGUgY2hlY2twb2ludCBzdGF5cyByZWFsKTogdGhlIGtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1blxuICogKGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgYSBrZXkgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZSwgYVxuICogc3ViZmxvdyBtYXBwZXIncyB0YWludCkgYW5kIHRoZSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleS4gUmVzdW1lXG4gKiBzZWVkcyB0aGUgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlbSwgc28gYSBjb3B5IG1hZGUgYmVmb3JlIHRoZSBwYXVzZSBpc1xuICogc3RpbGwgbWFza2VkIGFmdGVyIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvbk1hcmtzIHtcbiAgcmVhZG9ubHkga2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBLZXkg4oaSIHRoZSBmaWVsZCBwYXRocyBhIG1hcHBlciBoYW5kZWQgaXQuIEFic2VudCB3aGVuIG5vbmUuICovXG4gIHJlYWRvbmx5IGZpZWxkcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBUcnVlIGZvciBhIHdlbGwtZm9ybWVkIHtAbGluayBQYXVzZWRFeGVjdXRpb259ICh0d28gbm9uLWVtcHR5IHN0cmluZ3MpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VkRXhlY3V0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF1c2VkRXhlY3V0aW9uIHtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIHsgcnVuSWQ/OiB1bmtub3duOyBydW50aW1lU3RhZ2VJZD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHY/LnJ1bklkID09PSAnc3RyaW5nJyAmJiB2LnJ1bklkICE9PSAnJyAmJiB0eXBlb2Ygdi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgdi5ydW50aW1lU3RhZ2VJZCAhPT0gJydcbiAgKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgYHNjb3BlLiRwYXVzZSgpYCB0byBzaWduYWwgdGhhdCBleGVjdXRpb24gc2hvdWxkIHN0b3BcbiAqIGFuZCBjcmVhdGUgYSBzZXJpYWxpemFibGUgY2hlY2twb2ludC5cbiAqXG4gKiBCdWJibGVzIHVwIHRocm91Z2ggU3ViZmxvd0V4ZWN1dG9yICh3aGljaCBwcmVwZW5kcyBzdWJmbG93IElEIHRvIHBhdGgpXG4gKiBhbmQgaXMgY2F1Z2h0IGJ5IEZsb3djaGFydFRyYXZlcnNlci9GbG93Q2hhcnRFeGVjdXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdXNlU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGF0YSBmcm9tICRwYXVzZSgpIOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VEYXRhOiB1bmtub3duO1xuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgY2FsbGVkICRwYXVzZSgpLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQg4oCUIGAnaW50ZXJydXB0J2Agd2hlbiBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHBheWxvYWQpYCwgYWJzZW50IGZvciB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gXG4gICAqIGV4ZWN1dGUvcmVzdW1lIHBhdGguIFNldCBhdCB0aGUgc3RhZ2UgYm91bmRhcnkgKGBTdGFnZVJ1bm5lcmApLCBjYXJyaWVkXG4gICAqIG9udG8gdGhlIGNoZWNrcG9pbnQsIGFuZCByZWFkIGJ5IGByZXN1bWUoKWAgdG8gcGljayB0aGUgcmUtZW50cnk6IGFuXG4gICAqIGludGVycnVwdGVkIHN0YWdlIHJlLXJ1bnMgaXRzIE9XTiBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljKSwgYSBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgcGF1c2VkIHN0YWdlLiBCdWlsdCBkdXJpbmcgYnViYmxlLXVwLiAqL1xuICBwcml2YXRlIF9zdWJmbG93UGF0aDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludm9rZXIgY29udGV4dCDigJQgZW5yaWNoZWQgZHVyaW5nIGJ1YmJsZS11cCB3aGVuIGEgUGF1c2VTaWduYWwgcGFzc2VzXG4gICAqIHRocm91Z2ggYSBkZWNpZGVyLCBzZWxlY3Rvciwgb3IgZm9yayBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGUgaW52b2tlciBpcyB0aGUgc3RhZ2UgdGhhdCBjYWxsZWQgZXhlY3V0ZU5vZGUoKSBvbiB0aGUgcGF1c2VkIGNoaWxkLlxuICAgKiBDYXB0dXJlZCBkdXJpbmcgdHJhdmVyc2FsIChub3QgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSB0cmVlKS4gKFRoZVxuICAgKiBpbnZva2VyJ3MgYC5uZXh0YCBpZCByb2RlIGJlc2lkZSBpdCB1bnRpbCA5LjM5LjAgYXNcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgOyB3aGF0IHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnRcbiAgICogc2luY2UgOS4yOC4wLCBzbyBpdCBpcyBubyBsb25nZXIgY2FycmllZC4pXG4gICAqL1xuICBwcml2YXRlIF9pbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBwb3B1bGF0ZWQgZHVyaW5nIGJ1YmJsZS11cCBieVxuICAgKiBgU3ViZmxvd0V4ZWN1dG9yYCByaWdodCBiZWZvcmUgcmUtdGhyb3cuIEVhY2ggZW50cnkgaXMgb25lXG4gICAqIHN1YmZsb3cncyBwcmUtcGF1c2Ugc2hhcmVkIHN0YXRlLCBrZXllZCBieSB0aGUgcGF0aC1wcmVmaXhlZFxuICAgKiBzdWJmbG93IGlkIChtYXRjaGVzIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIHRoZSBuZXN0ZWQgYFNoYXJlZE1lbW9yeWAgaXMgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAgICogYmVmb3JlIHRoZSBjaGVja3BvaW50IGlzIGJ1aWx0LiBPbiByZXN1bWUsIHRoZSBpbm5lciBydW50aW1lIGlzXG4gICAqIHJlLWNyZWF0ZWQgZW1wdHkgYW5kIHJlc3VtZSBoYW5kbGVycyByZWFkaW5nIHByZS1wYXVzZSBzY29wZVxuICAgKiAoZS5nLiwgYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWAsIGBzY29wZS5wYXVzZWRUb29sQ2FsbElkYClcbiAgICogY3Jhc2ggd2l0aCBcIlggaXMgbm90IGl0ZXJhYmxlXCIgLyB1bmRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoYXQgUEFSQUxMRUwgU0lCTElOR1MgcmFpc2VkIGluIHRoZSBzYW1lIGZhbi1vdXQgYXMgdGhpcyBvbmUsXG4gICAqIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKS4gUmVjb3JkZWQgYnkgYENoaWxkcmVuRXhlY3V0b3JgIHdoZW4gbW9yZVxuICAgKiB0aGFuIG9uZSBjaGlsZCBvZiBhIGZvcmsgKG9yIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQgYnJhbmNoKSBwYXVzZXM6IHRoZVxuICAgKiBmaXJzdCBwYXVzZSBpcyB0aGUgb25lIHRoYXQgaXMgYXNrZWQsIHRoZSBvdGhlcnMgcmlkZSBoZXJlIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgZHJvcHBlZC4gRWFjaCBwYXRoIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzaWduYWwgY3VycmVudGx5IGlzXG4gICAqIGFuZCBncm93cyB3aXRoIGl0IOKAlCBgcHJlcGVuZFN1YmZsb3dgIHByZXBlbmRzIHRvIGV2ZXJ5IGVudHJ5IHRvby5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdQYXVzZXM6IE11dGFibGVQZW5kaW5nUGF1c2VbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXSElDSCBleGVjdXRpb24gcGF1c2VkIOKAlCBpdHMgcnVudGltZVN0YWdlSWQgc3RhbXBlZCBvbmNlIGF0IHRoZSBzdGFnZVxuICAgKiBib3VuZGFyeSAoYFN0YWdlUnVubmVyYCksIGl0cyBydW4gYWRkZWQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdFxuICAgKiAoYGNvbXBsZXRlRXhlY3V0aW9uYCksIG9yIGJvdGggY2FycmllZCBvdmVyIGZvciBhIHF1ZXVlZCBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xuXG4gIC8qKiBUaGUgcGF1c2VkIGV4ZWN1dGlvbidzIGlkZW1wb3RlbmN5IGtleSAoUDMpIOKAlCBhIHRvdWNoaW5nIHN0YWdlJ3MsIHN0YW1wZWQgb25jZSBhdCB0aGUgc3RhZ2UgYm91bmRhcnkuICovXG4gIHByaXZhdGUgX2lkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IHVua25vd24sIHN0YWdlSWQ6IHN0cmluZywgcGF1c2VkQnk/OiAnaW50ZXJydXB0Jykge1xuICAgIHN1cGVyKCdFeGVjdXRpb24gcGF1c2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ1BhdXNlU2lnbmFsJztcbiAgICB0aGlzLnBhdXNlRGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICBpZiAocGF1c2VkQnkpIHRoaXMucGF1c2VkQnkgPSBwYXVzZWRCeTtcbiAgICB0aGlzLl9zdWJmbG93UGF0aCA9IFtdO1xuICAgIC8vIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgcmVhbCBlcnJvciDigJQgc3RhY2sgdHJhY2UgaGFzIG5vIGRpYWdub3N0aWMgdmFsdWUuXG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG5cbiAgZ2V0IHN1YmZsb3dQYXRoKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3ViZmxvd1BhdGg7XG4gIH1cblxuICAvKiogVGhlIHBhdXNlZCBleGVjdXRpb24gKGl0cyBydW4gYW5kIGBbcGF0aC9dc3RhZ2VJZCNOYCksIG9uY2UgYm90aCBhcmUga25vd24uICovXG4gIGdldCBwYXVzZWRFeGVjdXRpb24oKTogUGF1c2VkRXhlY3V0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlID0gdGhpcy5fcGF1c2VkRXhlY3V0aW9uO1xuICAgIHJldHVybiBlPy5ydW5JZCAhPT0gdW5kZWZpbmVkID8geyBydW5JZDogZS5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hpY2ggRVhFQ1VUSU9OIHBhdXNlZC4gRmlyc3Qgc3RhbXAgd2luczogdGhlIHNpZ25hbCBidWJibGVzXG4gICAqIHRocm91Z2ggb3V0ZXIgYm91bmRhcmllcyB0aGF0IG11c3Qgbm90IG92ZXJ3cml0ZSBpdC4gVGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIGtub3dzIG9ubHkgdGhlIHJ1bnRpbWVTdGFnZUlkOyBhIHF1ZXVlZCBzaWJsaW5nIHJhaXNlZCBhZ2FpbiBvbiByZXN1bWVcbiAgICogY2FycmllcyBib3RoIChpdCBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW4pLlxuICAgKi9cbiAgc3RhbXBFeGVjdXRpb24ocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgfHwgIXJ1bnRpbWVTdGFnZUlkKSByZXR1cm47XG4gICAgdGhpcy5fcGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZCwgLi4uKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgeyBydW5JZCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVtcG90ZW5jeSBrZXkgdGhlIHBhdXNlZCBleGVjdXRpb24gcmFuIHVuZGVyIChQMykg4oCUIGEgdG91Y2hpbmcgc3RhZ2Uncy4gSXQgcmlkZXMgdGhlIGNoZWNrcG9pbnQgc28gdGhlXG4gICAqIHJlc3VtZSByZS1ydW5zIHRoZSBzdGFnZSAob3IgaXRzIGByZXN1bWVGbmApIHVuZGVyIHRoZSBTQU1FIGtleTogdGhlIGlucHV0IGl0cyBydWxlIHJlYWQgZG9lcyBub3QgY3Jvc3MgYVxuICAgKiByZXN1bWUuIEZpcnN0IHN0YW1wIHdpbnMuXG4gICAqL1xuICBnZXQgaWRlbXBvdGVuY3lLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faWRlbXBvdGVuY3lLZXk7XG4gIH1cblxuICBzdGFtcElkZW1wb3RlbmN5S2V5KGtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQgJiYga2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuX2lkZW1wb3RlbmN5S2V5ID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgdGhlIHJ1biBmb3IgZXZlcnkgcGF1c2Ugb24gdGhpcyBzaWduYWwgdGhhdCBwYXVzZWQgaW4gaXQg4oCUIHRoaXMgb25lXG4gICAqIGFuZCBpdHMgcXVldWVkIHNpYmxpbmdzIHRoYXQgZG8gbm90IGFscmVhZHkgY2FycnkgYSBydW4gKGEgc2libGluZyByYWlzZWRcbiAgICogYWdhaW4gb24gcmVzdW1lIGtlZXBzIHRoZSBydW4gaXQgcGF1c2VkIGluKS4gQ2FsbGVkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGNoZWNrcG9pbnQgaXMgYnVpbHQuXG4gICAqL1xuICBjb21wbGV0ZUV4ZWN1dGlvbihydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAmJiB0aGlzLl9wYXVzZWRFeGVjdXRpb24ucnVuSWQgPT09IHVuZGVmaW5lZCkgdGhpcy5fcGF1c2VkRXhlY3V0aW9uLnJ1bklkID0gcnVuSWQ7XG4gICAgZm9yIChjb25zdCBwZW5kaW5nIG9mIHRoaXMuX3BlbmRpbmdQYXVzZXMpIHtcbiAgICAgIGlmIChwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbiAmJiBwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBlbmRpbmcucGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZDogcGVuZGluZy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQsIHJ1bklkIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYSBzdWJmbG93IElEIHRvIHRoZSBwYXRoIChjYWxsZWQgZHVyaW5nIGJ1YmJsZS11cCkuIFRoZSBwZW5kaW5nXG4gICAqIHNpYmxpbmcgcGF1c2VzIHJpZGUgdGhlIHNhbWUgYm91bmRhcnksIHNvIHRoZWlyIHBhdGhzIGdyb3cgd2l0aCBpdC5cbiAgICovXG4gIHByZXBlbmRTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViZmxvd1BhdGgudW5zaGlmdChzdWJmbG93SWQpO1xuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUGF1c2VzKSBwZW5kaW5nLnN1YmZsb3dQYXRoLnVuc2hpZnQoc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSBiZWhpbmQgdGhpcyBvbmUgKGl0cyBwYXRoIHJlbGF0aXZlIHRvXG4gICAqIHRoaXMgc2lnbmFsJ3MgY3VycmVudCBsZXZlbCkuIENvcGllZCBpbjogdGhlIGVudHJ5IGlzIG93bmVkIGJ5IHRoZVxuICAgKiBzaWduYWwgZnJvbSBoZXJlIG9uLlxuICAgKi9cbiAgYWRkUGVuZGluZ1BhdXNlKHBhdXNlOiBQZW5kaW5nUGF1c2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nUGF1c2VzLnB1c2goe1xuICAgICAgcGF1c2VkU3RhZ2VJZDogcGF1c2UucGF1c2VkU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBbLi4ucGF1c2Uuc3ViZmxvd1BhdGhdLFxuICAgICAgc3ViZmxvd1N0YXRlczogeyAuLi5wYXVzZS5zdWJmbG93U3RhdGVzIH0sXG4gICAgICAuLi4ocGF1c2UucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHBhdXNlLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRCeSAmJiB7IHBhdXNlZEJ5OiBwYXVzZS5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRFeGVjdXRpb24gJiZcbiAgICAgICAgdHlwZW9mIHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4ucGF1c2UucGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgICAuLi4ocGF1c2UuaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiBwYXVzZS5pZGVtcG90ZW5jeUtleSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIHRoaXMgb25lLCBpbiB0aGUgb3JkZXIgdGhleSB3aWxsXG4gICAqIGJlIGFza2VkLiBJbiBmbGlnaHQsIGEgc2libGluZyB0aGF0IHBhdXNlZCBpbiBUSElTIHJ1biBjYXJyaWVzIG9ubHkgaXRzXG4gICAqIHJ1bnRpbWVTdGFnZUlkOyBgY29tcGxldGVFeGVjdXRpb25gIChhdCBjaGVja3BvaW50IGJ1aWxkKSBhZGRzIHRoZSBydW4uXG4gICAqL1xuICBnZXQgcGVuZGluZ1BhdXNlcygpOiByZWFkb25seSBQZW5kaW5nUGF1c2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQYXVzZXMgYXMgcmVhZG9ubHkgUGVuZGluZ1BhdXNlW107XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBwYXVzZSBhcyBhIHtAbGluayBQZW5kaW5nUGF1c2V9IOKAlCB3aGF0IGBDaGlsZHJlbkV4ZWN1dG9yYCBxdWV1ZXNcbiAgICogYmVoaW5kIGEgc2libGluZydzIHBhdXNlIHdoZW4gYm90aCBwYXVzZWQgaW4gb25lIGZhbi1vdXQuXG4gICAqL1xuICB0b1BlbmRpbmdQYXVzZSgpOiBQZW5kaW5nUGF1c2Uge1xuICAgIC8vIEluIGZsaWdodCAoc2VlIGBwZW5kaW5nUGF1c2VzYCk6IHRoZSBydW4gaXMgYWRkZWQgYXQgY2hlY2twb2ludCBidWlsZC5cbiAgICByZXR1cm4gPFBlbmRpbmdQYXVzZT57XG4gICAgICBwYXVzZWRTdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogWy4uLnRoaXMuX3N1YmZsb3dQYXRoXSxcbiAgICAgIHN1YmZsb3dTdGF0ZXM6IHsgLi4udGhpcy5fc3ViZmxvd1N0YXRlcyB9LFxuICAgICAgLi4uKHRoaXMucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHRoaXMucGF1c2VEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMucGF1c2VkQnkgJiYgeyBwYXVzZWRCeTogdGhpcy5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLih0aGlzLl9wYXVzZWRFeGVjdXRpb24gJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4udGhpcy5fcGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgICAuLi4odGhpcy5faWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiB0aGlzLl9pZGVtcG90ZW5jeUtleSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBzdGFnZSB0aGF0IGludm9rZWQgdGhlIHBhdXNlZCBjaGlsZCAoZGVjaWRlciwgc2VsZWN0b3IsIGZvcmspLiAqL1xuICBnZXQgaW52b2tlclN0YWdlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIGludm9rZXIgY29udGV4dCBkdXJpbmcgYnViYmxlLXVwLlxuICAgKiBDYWxsZWQgYnkgZGVjaWRlci9zZWxlY3Rvci9mb3JrIGhhbmRsZXJzIHdoZW4gY2F0Y2hpbmcgYSBjaGlsZCdzIFBhdXNlU2lnbmFsLlxuICAgKiBGaXJzdCBpbnZva2VyIHdpbnMgKGlubmVybW9zdCkg4oCUIHN1YnNlcXVlbnQgY2FsbHMgYXJlIG5vLW9wcy5cbiAgICovXG4gIHNldEludm9rZXIoaW52b2tlclN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW52b2tlclN0YWdlSWQpIHRoaXMuX2ludm9rZXJTdGFnZUlkID0gaW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSBhIHN1YmZsb3cncyBpc29sYXRlZCBTaGFyZWRNZW1vcnkgYXQgdGhlIG1vbWVudCBpdHNcbiAgICogdHJhdmVyc2FsIHRocmV3LiBDYWxsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgb25jZSBwZXIgc3ViZmxvd1xuICAgKiBib3VuZGFyeSBvbiB0aGUgYnViYmxlLXVwIHBhdGguIEVhY2ggY2FwdHVyZSBpcyBrZXllZCBieSB0aGVcbiAgICogcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkICh0aGUgc2FtZSBpZCB1c2VkIGluIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBJbm5lcm1vc3QtZmlyc3Q6IGEgZGVlcCBgU2VxdWVuY2UoQWdlbnQoLi4uKSlgIHBhdXNlIGNhcHR1cmVzIHRoZVxuICAgKiBhZ2VudCdzIHN1YmZsb3cgZmlyc3QsIHRoZW4gaXRzIHBhcmVudCdzLCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdFxuICAgKiBtb3VudC4gVGhlIGZ1bGwgbmVzdCBzdXJ2aXZlcyBpbnRvIGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNgLlxuICAgKi9cbiAgY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQ6IHN0cmluZywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gRGVmZW5zaXZlIHNoYWxsb3cgY2xvbmUgc28gbGF0ZXIgbXV0YXRpb25zIG9uIHRoZSBzb3VyY2UgZG9uJ3RcbiAgICAvLyBibGVlZCBpbnRvIHRoZSBjYXB0dXJlZCBzbmFwc2hvdC4gRGVlcCBjbG9uaW5nIGlzIHRoZSBjb25zdW1lcidzXG4gICAgLy8gcmVzcG9uc2liaWxpdHkgKHRoZSByZXN1bWUgdGFyZ2V0IG1heSBub3QgZXZlbiBiZSBvbiB0aGlzXG4gICAgLy8gcHJvY2Vzcyk7IFNoYXJlZE1lbW9yeSB2YWx1ZXMgYXJlIGNvbnZlbnRpb25hbGx5IEpTT04tZnJpZW5kbHkuXG4gICAgdGhpcy5fc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgLyoqIENhcHR1cmVkIHN1YmZsb3cgc2NvcGVzIChyZWFkLW9ubHkgdmlldykuICovXG4gIGdldCBzdWJmbG93U3RhdGVzKCk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJmbG93U3RhdGVzO1xuICB9XG59XG5cbi8vIOKUgOKUgCBQZW5kaW5nUGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSBwYXVzZSBhIFBBUkFMTEVMIFNJQkxJTkcgb2YgdGhlIHBhdXNlZCBzdGFnZSByYWlzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCDigJRcbiAqIHR3byBjaGlsZHJlbiBvZiBvbmUgZm9yayAob3IgdHdvIHNlbGVjdGVkIGJyYW5jaGVzIG9mIG9uZSBzZWxlY3RvcikgdGhhdFxuICogYm90aCBwYXVzZWQgKDkuMjguMCkuIE9ubHkgb25lIHBhdXNlIGlzIGFza2VkIGF0IGEgdGltZTogdGhlIGNoZWNrcG9pbnQnc1xuICogb3duIChgcGF1c2VkU3RhZ2VJZGApLCB0aGVuIGVhY2ggb2YgdGhlc2UgaW4gdHVybiwgd2l0aCB0aGUgZmFuLW91dCdzIGpvaW5cbiAqIHJ1bm5pbmcgb25seSBvbmNlIGV2ZXJ5IGNoaWxkIGlzIGRvbmUuXG4gKlxuICogRXZlcnl0aGluZyBuZWVkZWQgdG8gcmFpc2UgdGhlIHNpYmxpbmcncyBwYXVzZSBhZ2FpbiBsYXRlciBXSVRIT1VUIHJlLXJ1bm5pbmdcbiAqIHRoZSBzaWJsaW5nOiBpdHMgc3RhZ2UsIGl0cyBwYXRoLCBpdHMgY2FwdHVyZWQgc3ViZmxvdyBzdGF0ZSwgaXRzIHF1ZXN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGZvcmsgd2hvc2UgdHdvIGNoaWxkcmVuIGJvdGggYXNrOiB0aGUgZmlyc3QgY2hlY2twb2ludCBhc2tzIGMxIGFuZFxuICogLy8gY2FycmllcyBjMidzIHBhdXNlOyByZXN1bWluZyBpdCBmaW5pc2hlcyBjMSwgdGhlbiBwYXVzZXMgd2l0aCBjMidzXG4gKiAvLyBxdWVzdGlvbjsgcmVzdW1pbmcgVEhBVCBmaW5pc2hlcyBjMiBhbmQgcnVucyB0aGUgam9pbi5cbiAqIGNvbnN0IGNwID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAqIGNwLnBhdXNlZFN0YWdlSWQ7ICAgICAgICAgICAgICAgICAgLy8gJ2MxL2FzaydcbiAqIGNwLnBlbmRpbmdQYXVzZXM/LlswXS5wYXVzZWRTdGFnZUlkOyAvLyAnYzIvYXNrJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1BhdXNlIHtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlIChwYXRoLXByZWZpeGVkIGlkLCBhcyBgcGF1c2VkU3RhZ2VJZGApLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UgKGFzIGBzdWJmbG93UGF0aGApLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgc2libGluZydzIG93biBzdWJmbG93IGNhcHR1cmVzIOKAlCB0aGUgc3ViZmxvd3Mgb24gSVRTIHBhdGggYmVsb3cgdGhlXG4gICAqIGZhbi1vdXQuIFRoZSBzdWJmbG93cyBhYm92ZSB0aGUgZmFuLW91dCBhcmUgc2hhcmVkIHdpdGggdGhlIGNoZWNrcG9pbnQnc1xuICAgKiBvd24gcGF1c2UgYW5kIGFyZSBjYXB0dXJlZCBhZ2FpbiB3aGVuIHRoaXMgcGF1c2UgaXMgcmFpc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHNpYmxpbmcncyBxdWVzdGlvbiAoYXMgYHBhdXNlRGF0YWApLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuICAvKiogSG93IHRoZSBzaWJsaW5nIHBhdXNlZCAoYXMgYHBhdXNlZEJ5YCkuICovXG4gIHJlYWRvbmx5IHBhdXNlZEJ5PzogJ2ludGVycnVwdCc7XG4gIC8qKiBXaGljaCBleGVjdXRpb24gdGhlIHNpYmxpbmcgcGF1c2VkIGluIChhcyBgcGF1c2VkRXhlY3V0aW9uYCwgOS4zNy4wKSDigJQga2VwdCBzbyBpdHMgb3duIHJlc3VtZSBsaW5rcyB0byBpdC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkRXhlY3V0aW9uPzogUGF1c2VkRXhlY3V0aW9uO1xuICAvKiogVGhlIGlkZW1wb3RlbmN5IGtleSB0aGUgc2libGluZydzIGV4ZWN1dGlvbiByYW4gdW5kZXIgKGFzIGBpZGVtcG90ZW5jeUtleWAsIDEwLjEpLiAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbn1cblxuLyoqIEEgcGVuZGluZyBwYXVzZSB3aG9zZSBwYXRoIHN0aWxsIGdyb3dzIGFzIGl0cyBzaWduYWwgYnViYmxlcyB1cCAoaW50ZXJuYWwpLiAqL1xuLyoqXG4gKiBUaGUgc2lnbmFsJ3Mgb3duIGNvcHkgb2YgYSBwZW5kaW5nIHBhdXNlLiBJdHMgYHBhdXNlZEV4ZWN1dGlvbmAgbWF5IHN0aWxsXG4gKiBsYWNrIHRoZSBydW4gKGEgc2libGluZyB0aGF0IHBhdXNlZCBpbiBUSElTIHJ1bikgdW50aWwgYGNvbXBsZXRlRXhlY3V0aW9uYC5cbiAqL1xudHlwZSBNdXRhYmxlUGVuZGluZ1BhdXNlID0gT21pdDxQZW5kaW5nUGF1c2UsICdzdWJmbG93UGF0aCcgfCAncGF1c2VkRXhlY3V0aW9uJz4gJiB7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmdbXTtcbiAgcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xufTtcblxuLy8g4pSA4pSAIFBhdXNlUmVzdWx0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJldHVybmVkIGJ5IGEgcGF1c2FibGUgc3RhZ2UncyBleGVjdXRlL3Jlc3VtZSBmdW5jdGlvbiB0byBzaWduYWwgcGF1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gKiAgIHJldHVybiB7IHBhdXNlOiB0cnVlLCBkYXRhOiB7IHF1ZXN0aW9uOiAnQXBwcm92ZSBvcmRlciAxMjM/JyB9IH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXVzZVJlc3VsdCB7XG4gIHJlYWRvbmx5IHBhdXNlOiB0cnVlO1xuICAvKiogRGF0YSB0byBpbmNsdWRlIGluIHRoZSBjaGVja3BvaW50IOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgZGF0YT86IHVua25vd247XG59XG5cbi8vIOKUgOKUgCBGbG93Y2hhcnRDaGVja3BvaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50IOKAlCBldmVyeXRoaW5nIG5lZWRlZCB0byByZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0LFxuICogYW5kIG5vdGhpbmcgYSByZXN1bWUgbmV2ZXIgcmVhZHMuXG4gKlxuICogTEVBTiAoZm9ybWF0IDIpOiBpdHMgc2l6ZSBpcyB0aGUgU1RBVEUncywgbmV2ZXIgdGhlIHJ1bidzIGxlbmd0aC4gVGhlIGN1cnNvclxuICogaXMgYHBhdXNlZFN0YWdlSWRgICsgYHN1YmZsb3dQYXRoYDsgdGhlIHN0YXRlIGlzIGBzaGFyZWRTdGF0ZWAgcGx1cyB0aGVcbiAqIGNhcHR1cmVzIG9mIHRoZSBzdWJmbG93cyBvbiB0aGF0IHBhdGggKGBzdWJmbG93U3RhdGVzYCkuIFRoZSBydW4ncyBoaXN0b3J5IOKAlFxuICogdGhlIGV4ZWN1dGlvbiB0cmVlLCB0aGUgZmluaXNoZWQgc3ViZmxvd3MnIHJlc3VsdHMsIHRoZSBjb21taXQgbG9nIOKAlCBpcyBub3RcbiAqIGhlcmU6IHJlYWQgaXQgZnJvbSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgYmVmb3JlIGByZXN1bWUoKWAgKGZvcm1hdCAxXG4gKiBjYXJyaWVkIGBleGVjdXRpb25UcmVlYCBhbmQgYHN1YmZsb3dSZXN1bHRzYDsgbm8gcmVzdW1lIHJlYWQgdGhlbSkuXG4gKlxuICogSlNPTi1zYWZlOiBubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcywgbm8gU0RLIGNsaWVudHMuXG4gKiBTdG9yZSBhbnl3aGVyZTogUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGEgZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKTsgLy8gYWZ0ZXIgcGF1c2VcbiAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAqXG4gKiAvLyBSZXN1bWUgKGhvdXJzIGxhdGVyLCBwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyKVxuICogY29uc3QgY2hlY2twb2ludCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICogYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgLyoqXG4gICAqIFRoZSBjaGVja3BvaW50IEZPUk1BVDogYDJgLCB0aGUgbGVhbiBjaGVja3BvaW50IChgMWAgZnJvbSA5LjM5LjA7IGFic2VudFxuICAgKiBiZWZvcmUpLiBgcmVzdW1lKClgIHJlYWRzIGV2ZXJ5IG9sZGVyIG9uZSB0aHJvdWdoIHRoZSBvbmUgdXBjYXN0ZXJcbiAgICogKGBwYXVzZS9yZWNvcmQudHMgwrcgdXBjYXN0Q2hlY2twb2ludGApLCB3aGljaCBkcm9wcyB3aGF0IGxhdGVyIGZvcm1hdHNcbiAgICogZHJvcHBlZCDigJQgZm9ybWF0IDEncyBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2AsIHRoZSBsZWdhY3lcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgIOKAlCBub25lIG9mIHdoaWNoIGEgcmVzdW1lIGV2ZXIgcmVhZC4gQSB2ZXJzaW9uIHRoaXNcbiAgICogcmVsZWFzZSBkb2VzIG5vdCBrbm93IGlzIHJlZnVzZWQuXG4gICAqL1xuICByZWFkb25seSBjaGVja3BvaW50VmVyc2lvbj86IDI7XG5cbiAgLyoqIFNjb3BlIHN0YXRlIGF0IHRoZSBwYXVzZSBwb2ludCDigJQgYWxsIHNoYXJlZCBtZW1vcnkga2V5L3ZhbHVlcy4gKi9cbiAgcmVhZG9ubHkgc2hhcmVkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBJRCBvZiB0aGUgc3RhZ2UgdGhhdCBwYXVzZWQuIFVzZWQgYnkgcmVzdW1lKCkgdG8gZmluZCB0aGUgbm9kZSBpbiB0aGUgZ3JhcGguICovXG4gIHJlYWRvbmx5IHBhdXNlZFN0YWdlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICAgKiBydW50aW1lU3RhZ2VJZCBpbiBpdCAodGhlIGlkIGl0cyBgb25QYXVzZWAgZXZlbnQgYW5kIGl0cyBjb21taXQgY2FycnkpLlxuICAgKiBSZWFkIGJ5IGByZXN1bWUoKWAgaW50byB0aGUgYG9uUmVzdW1lYCBldmVudCdzIGB0cmF2ZXJzYWxDb250ZXh0LnJlc3VtZWRGcm9tYFxuICAgKiBsaW5rIOKAlCBuZXZlciB1c2VkIHRvIHBsYW4gdGhlIHJlLWVudHJ5LiBBYnNlbnQgb24gYW4gb2xkZXIgY2hlY2twb2ludCxcbiAgICogd2hpY2ggdGhlbiByZXN1bWVzIHdpdGhvdXQgYSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkRXhlY3V0aW9uPzogUGF1c2VkRXhlY3V0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbXBvdGVuY3kga2V5IHRoZSBwYXVzZWQgZXhlY3V0aW9uIHJhbiB1bmRlciAoMTAuMSkg4oCUIHByZXNlbnQgb25seSB3aGVuIHRoZSBwYXVzZWQgc3RhZ2UgYHRvdWNoZXNgIGFuXG4gICAqIG91dHNpZGUgc3lzdGVtIHdpdGggYSBrZXkgcnVsZS4gYHJlc3VtZSgpYCByZS1ydW5zIHRoZSBzdGFnZSAob3IgcnVucyBpdHMgYHJlc3VtZUZuYCkgdW5kZXIgVEhJUyBrZXksIG5ldmVyIGFcbiAgICogcmVjb21wdXRlZCBvbmU6IHRoZSBpbnB1dCB0aGUgcnVsZSByZWFkIGRvZXMgbm90IGNyb3NzIGEgcmVzdW1lLCBhbmQgYSBkaWZmZXJlbnQga2V5IG9uIHRoZSByZS1ydW4gd291bGQgbWFrZVxuICAgKiB0aGUgb3V0c2lkZSBzeXN0ZW0gYXBwbHkgdGhlIGVmZmVjdCB0d2ljZS4gQSByZWFsIHZhbHVlLCBsaWtlIGBzaGFyZWRTdGF0ZWAg4oCUIG5vIHJlZGFjdGlvbiBwb2xpY3kgdG91Y2hlcyB0aGVcbiAgICogY2hlY2twb2ludC4gQSBtYWxmb3JtZWQgb25lIGlzIHJlZnVzZWQgYXQgYHJlc3VtZSgpYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHBhdXNlZCBzdGFnZSAoZS5nLiwgWydzZi1wYXltZW50JywgJ3NmLXZhbGlkYXRpb24nXSkuXG4gICAqICBFbXB0eSBhcnJheSB3aGVuIHBhdXNlZCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIERhdGEgZnJvbSAkcGF1c2UoKSDigJQgcXVlc3Rpb24sIHJlYXNvbiwgbWV0YWRhdGEuICovXG4gIHJlYWRvbmx5IHBhdXNlRGF0YT86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEhPVyB0aGUgcGF1c2Ugd2FzIHJhaXNlZC4gYCdpbnRlcnJ1cHQnYCBtZWFucyBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHsgcmVhc29uLCBleHBlY3RzPyB9KWAgYW5kIGBwYXVzZURhdGFgIElTIHRoYXQgcGF5bG9hZDtcbiAgICogYWJzZW50IG1lYW5zIHRoZSBgYWRkUGF1c2FibGVGdW5jdGlvbmAgZXhlY3V0ZS9yZXN1bWUgcGF0aCAoZXZlcnlcbiAgICogY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjE0LjAgb21pdHMgaXQsIHdoaWNoIGlzIGV4YWN0bHkgcmlnaHQpLlxuICAgKlxuICAgKiBgcmVzdW1lKClgIHJlYWRzIHRoaXMgdG8gcGljayB0aGUgcmUtZW50cnksIGFuZCB0aGUgdHdvIGRpZmZlciBieSBsYXc6XG4gICAqIGFuIGludGVycnVwdGVkIHN0YWdlIFJFLVJVTlMgSVRTIE9XTiBGVU5DVElPTiBGUk9NIFRIRSBUT1AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljIOKAlCB0aGUgYW5zd2VyIGNvbWVzIGJhY2sgb3V0IG9mIHRoZSBgaW50ZXJydXB0KClgIGNhbGwpLCB3aGlsZSBhXG4gICAqIHBhdXNhYmxlIHN0YWdlIHJ1bnMgaXRzIHNlcGFyYXRlIGByZXN1bWVGbmAuXG4gICAqL1xuICByZWFkb25seSBwYXVzZWRCeT86ICdpbnRlcnJ1cHQnO1xuXG4gIC8qKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUg4oCUIG9uZSBlbnRyeSBwZXIgc3ViZmxvdyBib3VuZGFyeSBvbiB0aGUgcGF0aFxuICAgKiB0byB0aGUgcGF1c2VkIHN0YWdlLiBLZXllZCBieSBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKG1hdGNoZXNcbiAgICogYHN1YmZsb3dQYXRoYCBlbnRyaWVzKS4gRWFjaCB2YWx1ZSBpcyB0aGUgc3ViZmxvdydzIHByZS1wYXVzZVxuICAgKiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIEFsd2F5cyBwcmVzZW50IChlbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcyB3aGVyZSBubyBzdWJmbG93c1xuICAgKiB3ZXJlIGVudGVyZWQpLiBPbiByZXN1bWUsIGBTdWJmbG93RXhlY3V0b3JgIHNlZWRzIGVhY2ggbmVzdGVkIHJ1bnRpbWVcbiAgICogb24gdGhlIHBhdGggZnJvbSB0aGlzIG1hcCDigJQgT05DRSwgb24gaXRzIGZpcnN0IGVudHJ5LCBpbiBwbGFjZSBvZiB0aGVcbiAgICogaW5wdXRNYXBwZXIncyB2YWx1ZXMgKHRoZSBtYXBwZXIgc3RpbGwgcnVucywgZm9yIHRoZSBzdGFnZXMnIHJlYWQtb25seVxuICAgKiBhcmdzKSDigJQgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBwcmUtcGF1c2Ugc2NvcGUgYWNyb3NzIHNhbWUtZXhlY3V0b3IgQU5EXG4gICAqIGNyb3NzLWV4ZWN1dG9yIHJlc3RhcnRzLiBPbmx5IHRoZSBzdWJmbG93cyBPTiBgc3ViZmxvd1BhdGhgIHJlYWQgaXQuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgYXQgdGhlIG1vbWVudCBvZiBwYXVzZSDigJQgdGhlIG51bWJlciBvZiBzdGFnZXNcbiAgICogZXhlY3V0ZWQgc28gZmFyIHRoaXMgcnVuLiBSZXN1bWUgc2VlZHMgaXQgc28gcG9zdC1yZXN1bWUgYHJ1bnRpbWVTdGFnZUlkYHNcbiAgICogKGBzdGFnZUlkI2V4ZWN1dGlvbkluZGV4YCkga2VlcCBjbGltYmluZyBhbmQgbmV2ZXIgY29sbGlkZSB3aXRoIHByZS1wYXVzZVxuICAgKiBvbmVzLCB3aGljaCBpcyB3aGF0IHRoZSB3aG9sZSBldmVudC1jb3JyZWxhdGlvbiBtb2RlbCByZXN0cyBvbi5cbiAgICpcbiAgICogT3B0aW9uYWwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGEgY2hlY2twb2ludCBwZXJzaXN0ZWQgYmVmb3JlIHRoaXNcbiAgICogZmllbGQgZXhpc3RlZCAob2xkZXIgUmVkaXMvUG9zdGdyZXMgcm93cykgc3RpbGwgdmFsaWRhdGVzIGFuZCByZXN1bWVzIHdpdGhcbiAgICogdGhlIHByZXZpb3VzIChjb3VudGVyLXJlc3RhcnRpbmcpIGJlaGF2aW9yLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlci1gc3RhZ2VJZGAgbG9vcCB2aXNpdCBjb3VudHMgYXQgdGhlIG1vbWVudCBvZiBwYXVzZS4gUmVzdW1lIHNlZWRzIHRoZW1cbiAgICogc28gYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAgc3RheXMgY29udGludW91cyBhY3Jvc3MgdGhlIHBhdXNlIChhXG4gICAqIG1pZC1sb29wIHJlc3VtZSBrZWVwcyBjb3VudGluZyB1cCwgbm90IHJlc3RhcnRpbmcgYXQgMCkgYW5kIHRoZVxuICAgKiBDb250aW51YXRpb25SZXNvbHZlciBpdGVyYXRpb24gYnVkZ2V0IGlzIG5vdCBzaWxlbnRseSByZWZpbGxlZC5cbiAgICpcbiAgICogT3B0aW9uYWwgZm9yIHRoZSBzYW1lIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgcmVhc29uIGFzIGBleGVjdXRpb25Db3VudGAuXG4gICAqL1xuICByZWFkb25seSB2aXNpdENvdW50cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuXG4gIC8qKiBTdGFnZSB0aGF0IGludm9rZWQgdGhlIHBhdXNlZCBjaGlsZCAoZGVjaWRlciwgc2VsZWN0b3IsIGZvcmspLiBBYnNlbnQgZm9yIGxpbmVhciBwYXVzZXMuICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFnZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXVzZXMgcmFpc2VkIGJ5IFBBUkFMTEVMIFNJQkxJTkdTIG9mIHRoZSBwYXVzZWQgc3RhZ2UgaW4gdGhlIHNhbWVcbiAgICogZmFuLW91dCwgd2FpdGluZyB0aGVpciB0dXJuICg5LjI4LjApIOKAlCBzZWUge0BsaW5rIFBlbmRpbmdQYXVzZX0uIEFic2VudFxuICAgKiB3aGVuIG9ubHkgb25lIGNoaWxkIHBhdXNlZCAoZXZlcnkgY2hlY2twb2ludCBiZWZvcmUgOS4yOC4wIG9taXRzIGl0LCBhbmRcbiAgICogcmVzdW1lcyBleGFjdGx5IGFzIGJlZm9yZSkuIFJlc3VtaW5nIHRoaXMgY2hlY2twb2ludCBmaW5pc2hlcyB0aGUgcGF1c2VkXG4gICAqIHN0YWdlJ3MgY2hpbGQsIHRoZW4gcGF1c2VzIGFnYWluIHdpdGggdGhlIGZpcnN0IG9mIHRoZXNlOyB0aGUgZmFuLW91dCdzXG4gICAqIGpvaW4gcnVucyBvbmNlIGV2ZXJ5IGNoaWxkIGlzIGRvbmUuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3Rpb24gbWFya3Mgb2YgdGhlIHBhdXNlZCBydW4g4oCUIE5BTUVTIG9ubHkgKHNlZVxuICAgKiB7QGxpbmsgUmVkYWN0aW9uTWFya3N9KS4gQWJzZW50IHdoZW4gdGhlIHJ1biBtYXJrZWQgbm90aGluZyAobm8gcG9saWN5XG4gICAqIGFuZCBubyBwZXItY2FsbCBtYXJrLCBvciBhbiBvbGRlciBjaGVja3BvaW50KTogdGhlIHJlc3VtZWQgcnVuIHRoZW4gc3RhcnRzXG4gICAqIGZyb20gaXRzIHBvbGljeSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZGFjdGlvbk1hcmtzPzogUmVkYWN0aW9uTWFya3M7XG5cbiAgLyoqIFRpbWVzdGFtcCBvZiB3aGVuIHRoZSBwYXVzZSBvY2N1cnJlZC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkQXQ6IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFBhdXNhYmxlSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIYW5kbGVyIGZvciBhIHBhdXNhYmxlIHN0YWdlIOKAlCBoYXMgdHdvIHBoYXNlczogZXhlY3V0ZSBhbmQgcmVzdW1lLlxuICpcbiAqIGBleGVjdXRlYCBydW5zIHRoZSBmaXJzdCB0aW1lLiBSZXR1cm4gYW55IG5vbi12b2lkIHZhbHVlIHRvIHBhdXNlICh0aGF0IHZhbHVlXG4gKiBiZWNvbWVzIHRoZSBjaGVja3BvaW50J3MgYHBhdXNlRGF0YWApOyByZXR1cm4gdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gKiBgcmVzdW1lYCBydW5zIHdoZW4gdGhlIGZsb3djaGFydCBpcyByZXN1bWVkLiBJdCByZWNlaXZlcyB0aGUgcmVzdW1lIGlucHV0LlxuICpcbiAqIEJvdGggcGhhc2VzIHJlY2VpdmUgdGhlIHNhbWUgc2NvcGUuIEFmdGVyIGV4ZWN1dGUgcGF1c2VzLCB0aGUgc2NvcGUgc3RhdGVcbiAqIGlzIHByZXNlcnZlZCBpbiB0aGUgY2hlY2twb2ludC4gT24gcmVzdW1lLCB0aGUgc2NvcGUgaXMgcmVzdG9yZWQgYmVmb3JlXG4gKiBjYWxsaW5nIHJlc3VtZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLmFkZFBhdXNhYmxlRnVuY3Rpb24oJ0FwcHJvdmVPcmRlcicsIHtcbiAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gKiAgICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICogICAgIHNjb3BlLmFtb3VudCA9IDI5OTtcbiAqICAgICByZXR1cm4geyBxdWVzdGlvbjogYEFwcHJvdmUgJCR7c2NvcGUuYW1vdW50fSByZWZ1bmQ/YCB9O1xuICogICB9LFxuICogICByZXN1bWU6IGFzeW5jIChzY29wZSwgaW5wdXQpID0+IHtcbiAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICogICAgIHNjb3BlLmFwcHJvdmVyID0gaW5wdXQuYXBwcm92ZXI7XG4gKiAgIH0sXG4gKiB9LCAnYXBwcm92ZS1vcmRlcicsICdNYW5hZ2VyIGFwcHJvdmFsIGdhdGUnKVxuICpcbiAqIC8vIExhdGVyIOKAlCByZXN1bWUgd2l0aCBodW1hbidzIGFuc3dlclxuICogYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUsIGFwcHJvdmVyOiAnSmFuZScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlID0gYW55LCBUSW5wdXQgPSB1bmtub3duLCBUUGF1c2VEYXRhID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogRmlyc3QtcnVuIHBoYXNlLiBSZXR1cm4gZGF0YSB0byBwYXVzZSwgb3Igdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gICAqXG4gICAqIEFueSBub24tdm9pZCByZXR1cm4gdmFsdWUgYmVjb21lcyB0aGUgYHBhdXNlRGF0YWAgaW4gdGhlIGNoZWNrcG9pbnQuXG4gICAqIFRoZSBjb25zdW1lciBkZWZpbmVzIHRoZSBgVFBhdXNlRGF0YWAgdHlwZSDigJQgdGhlIEZFIHVzZXMgaXQgdG8gcmVuZGVyXG4gICAqIHRoZSByaWdodCBVSSAoZm9ybSBmaWVsZHMsIGFwcHJvdmFsIGJ1dHRvbnMsIGV0Yy4pLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFRQYXVzZURhdGEgPSB7IHF1ZXN0aW9uOiBzdHJpbmc7IHJpc2tMZXZlbDogc3RyaW5nIH1cbiAgICogY29uc3QgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPE15U3RhdGUsIHsgYXBwcm92ZWQ6IGJvb2xlYW4gfSwgeyBxdWVzdGlvbjogc3RyaW5nOyByaXNrTGV2ZWw6IHN0cmluZyB9PiA9IHtcbiAgICogICBleGVjdXRlOiBhc3luYyAoc2NvcGUpID0+IHtcbiAgICogICAgIHJldHVybiB7IHF1ZXN0aW9uOiBgQXBwcm92ZSBvcmRlciAke3Njb3BlLm9yZGVySWR9P2AsIHJpc2tMZXZlbDogJ2hpZ2gnIH07XG4gICAqICAgfSxcbiAgICogICByZXN1bWU6IGFzeW5jIChzY29wZSwgaW5wdXQpID0+IHtcbiAgICogICAgIHNjb3BlLmFwcHJvdmVkID0gaW5wdXQuYXBwcm92ZWQ7XG4gICAqICAgfSxcbiAgICogfTtcbiAgICogYGBgXG4gICAqL1xuICBleGVjdXRlOiAoc2NvcGU6IFRTY29wZSkgPT4gUHJvbWlzZTxUUGF1c2VEYXRhIHwgdm9pZD4gfCBUUGF1c2VEYXRhIHwgdm9pZDtcbiAgLyoqXG4gICAqIFJlc3VtZSBwaGFzZS4gQ2FsbGVkIHdpdGggdGhlIHJlc3VtZSBpbnB1dCB3aGVuIGV4ZWN1dGlvbiBjb250aW51ZXMuXG4gICAqXG4gICAqIFRoZSBzY29wZSBpcyByZXN0b3JlZCBmcm9tIHRoZSBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYC4gV3JpdGVzIGR1cmluZ1xuICAgKiBgcmVzdW1lYCBhcmUgY29tbWl0dGVkIGFuZCB2aXNpYmxlIHRvIHN1YnNlcXVlbnQgc3RhZ2VzLlxuICAgKi9cbiAgcmVzdW1lOiAoc2NvcGU6IFRTY29wZSwgaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59XG5cbi8vIOKUgOKUgCBUeXBlIGd1YXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFBhdXNlUmVzdWx0IChzdGFnZSB3YW50cyB0byBwYXVzZSkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXVzZVJlc3VsdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFBhdXNlUmVzdWx0IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFBhdXNlUmVzdWx0KS5wYXVzZSA9PT0gdHJ1ZTtcbn1cblxuLyoqIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgUGF1c2VTaWduYWwuIFVzZXMgaW5zdGFuY2VvZiArIG5hbWUgYnJhbmQgZmFsbGJhY2sgZm9yIGNyb3NzLXJlYWxtIHNhZmV0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhdXNlU2lnbmFsKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgUGF1c2VTaWduYWwge1xuICAvLyBUb3RhbDogYSBQcm94eSB3aG9zZSBgZ2V0UHJvdG90eXBlT2ZgIHRyYXAgdGhyb3dzIChvciBhIHJldm9rZWQgUHJveHkpXG4gIC8vIGlzIG5vdCBhIHNpZ25hbCDigJQgdGhlIGVuZ2luZSdzIGNhdGNoIGJsb2NrcyBhc2sgdGhpcyBmaXJzdCwgYW5kIG11c3RcbiAgLy8gbm90IHRyYWRlIHRoZSBzdGFnZSdzIHRocm93biB2YWx1ZSBmb3IgdGhlIHRyYXAncyBlcnJvci5cbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBQYXVzZVNpZ25hbCB8fFxuICAgICAgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgZXJyb3IubmFtZSA9PT0gJ1BhdXNlU2lnbmFsJyAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdwYXVzZURhdGEnKSAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdzdGFnZUlkJykpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -40,6 +40,8 @@ const METHOD_ROUTES = {
40
40
  },
41
41
  $getArgs: (t) => t.getArgs.bind(t),
42
42
  $getEnv: (t) => t.getEnv.bind(t),
43
+ $attempt: (t) => t.getAttempt.bind(t),
44
+ $call: (t) => t.call.bind(t),
43
45
  $debug: (t) => t.addDebugInfo.bind(t),
44
46
  $log: (t) => t.addDebugMessage.bind(t),
45
47
  $error: (t) => t.addErrorInfo.bind(t),
@@ -299,4 +301,4 @@ export function createTypedScope(target, options) {
299
301
  },
300
302
  });
301
303
  }
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsaUVBQWlFO0lBQ2pFLGlEQUFpRDtJQUNqRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxZQUFzQixFQUFFLFdBQW9CLEVBQUUsRUFBRSxDQUM5RixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMs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bnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9jcmVhdGVUeXBlZFNjb3BlIC0tIENvcmUgUHJveHkgZmFjdG9yeSBmb3IgVHlwZWRTY29wZTxUPi5cbiAqXG4gKiBXcmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzOlxuICogLSBUeXBlZCBwcm9wZXJ0eSBhY2Nlc3M6IHNjb3BlLmNyZWRpdFRpZXIgKHJlYWQpLCBzY29wZS5jcmVkaXRUaWVyID0gJ0EnICh3cml0ZSlcbiAqIC0gRGVlcCB3cml0ZSBpbnRlcmNlcHRpb246IHNjb3BlLmN1c3RvbWVyLmFkZHJlc3MuemlwID0gJzkwMjEwJ1xuICogLSBBcnJheSBtdXRhdGlvbiBpbnRlcmNlcHRpb246IHNjb3BlLml0ZW1zLnB1c2goJ25ldycpXG4gKiAtICQtcHJlZml4ZWQgZXNjYXBlIGhhdGNoZXM6ICRnZXRWYWx1ZSwgJHNldFZhbHVlLCAkcmVhZCwgJGdldEFyZ3MsIGV0Yy5cbiAqXG4gKiBSZWFkIHNlbWFudGljczogdG9wLWxldmVsIGdldCBjYWxscyBnZXRWYWx1ZSgpIChmaXJlcyBvblJlYWQgT05DRSkuXG4gKiAgIE5lc3RlZCBnZXQgdHJhcHMgbmF2aWdhdGUgaW4tbWVtb3J5IC0tIG5vIGFkZGl0aW9uYWwgb25SZWFkLlxuICpcbiAqIFdyaXRlIHNlbWFudGljczogdG9wLWxldmVsIHNldCBjYWxscyBzZXRWYWx1ZSgpLiBOZXN0ZWQgc2V0IGNhbGxzXG4gKiAgIHVwZGF0ZVZhbHVlKCkgd2l0aCBhIHBhcnRpYWwgb2JqZWN0IGJ1aWx0IGZyb20gdGhlIGFjY3VtdWxhdGVkIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0IGFzIGxvZGFzaEdldCB9IGZyb20gJ2Zvb3R0cmFjZS9wYXRocyc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyU2NvcGVSdW50aW1lIH0gZnJvbSAnLi4vc2NvcGUvcnVudGltZS5qcyc7XG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgYXJyYXlQcm94eUF0IH0gZnJvbSAnLi9hcnJheVRyYXBzLmpzJztcbmltcG9ydCB7IHJlbWVtYmVySGFuZGxlLCB1bndyYXBIYW5kbGVzIH0gZnJvbSAnLi9oYW5kbGVzLmpzJztcbmltcG9ydCB7IGNhY2hlZE1lbWJlciwgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QsIE1lbWJlckNhY2hlIH0gZnJvbSAnLi9saXZlVmlldy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgLy8gQSBoYW5kbGUgdGhlIHNjb3BlIGhhbmRlZCBvdXQgaXMgYSB2YWx1ZSBpdCBhY2NlcHRzIGJhY2sgKGhhbmRsZXMudHMpOlxuICAvLyBgJHNldFZhbHVlKCdjb3B5Jywgc2NvcGUuY3VzdG9tZXIpYCBzdG9yZXMgdGhlIHZhbHVlIGJlaGluZCB0aGUgaGFuZGxlLFxuICAvLyBub3QgYSBQcm94eSB0aGUgY29tbWl0IGNvdWxkIG5ldmVyIGNsb25lLiBUaGUgc2V0IHRyYXAgZG9lcyB0aGUgc2FtZSBmb3JcbiAgLy8gYHNjb3BlLmNvcHkgPSBzY29wZS5jdXN0b21lcmA7IHRoZXNlIGFyZSB0aGUgZXhwbGljaXQgZG9vcnMuIEFcbiAgLy8gaGFuZGxlLWZyZWUgdmFsdWUgcGFzc2VzIHRocm91Z2ggYnkgcmVmZXJlbmNlLlxuICAkc2V0VmFsdWU6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykgPT5cbiAgICB0LnNldFZhbHVlKGtleSwgdW53cmFwSGFuZGxlcyh2YWx1ZSksIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pLFxuICAkdXBkYXRlOiAodCkgPT4gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpID0+XG4gICAgdC51cGRhdGVWYWx1ZShrZXksIHVud3JhcEhhbmRsZXModmFsdWUpLCBkZXNjcmlwdGlvbiksXG4gICRkZWxldGU6ICh0KSA9PiB0LmRlbGV0ZVZhbHVlLmJpbmQodCksXG4gICRyZWFkOiAodCkgPT4gKGRvdFBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvb3RLZXkgPSBkb3RQYXRoLnNwbGl0KCcuJylbMF07XG4gICAgY29uc3QgdmFsdWUgPSB0LmdldFZhbHVlKHJvb3RLZXkpO1xuICAgIGlmICghZG90UGF0aC5pbmNsdWRlcygnLicpKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIGxvZGFzaEdldCh2YWx1ZSwgZG90UGF0aC5zbGljZShyb290S2V5Lmxlbmd0aCArIDEpKTtcbiAgfSxcbiAgJGdldEFyZ3M6ICh0KSA9PiB0LmdldEFyZ3MuYmluZCh0KSxcbiAgJGdldEVudjogKHQpID0+IHQuZ2V0RW52LmJpbmQodCksXG4gICRkZWJ1ZzogKHQpID0+IHQuYWRkRGVidWdJbmZvLmJpbmQodCksXG4gICRsb2c6ICh0KSA9PiB0LmFkZERlYnVnTWVzc2FnZS5iaW5kKHQpLFxuICAkZXJyb3I6ICh0KSA9PiB0LmFkZEVycm9ySW5mby5iaW5kKHQpLFxuICAkbWV0cmljOiAodCkgPT4gdC5hZGRNZXRyaWMuYmluZCh0KSxcbiAgJGV2YWw6ICh0KSA9PiB0LmFkZEV2YWwuYmluZCh0KSxcbiAgJGF0dGFjaFNjb3BlUmVjb3JkZXI6ICh0KSA9PiB0LmF0dGFjaFNjb3BlUmVjb3JkZXIuYmluZCh0KSxcbiAgJGRldGFjaFNjb3BlUmVjb3JkZXI6ICh0KSA9PiB0LmRldGFjaFNjb3BlUmVjb3JkZXIuYmluZCh0KSxcbiAgJGdldFNjb3BlUmVjb3JkZXJzOiAodCkgPT4gdC5nZXRTY29wZVJlY29yZGVycy5iaW5kKHQpLFxuICAkYmF0Y2hBcnJheTogKHQpID0+IChrZXk6IHN0cmluZywgZm46IChhcnI6IHVua25vd25bXSkgPT4gdm9pZCkgPT4ge1xuICAgIC8vIE9uZSBnZXRWYWx1ZSDigJQgZmlyZXMgb25SZWFkIG9uY2VcbiAgICBjb25zdCBjdXJyZW50ID0gdC5nZXRWYWx1ZShrZXkpO1xuICAgIC8vIENsb25lIG9uY2Ug4oCUIERFRVAgKG9yIHN0YXJ0IGVtcHR5IGlmIG1pc3Npbmcvbm9uLWFycmF5KS4gVGhlIHJlYWQgaXNcbiAgICAvLyBCT1JST1dFRDogYmVmb3JlIHRoZSBzdGFnZSdzIGZpcnN0IHN0YWdlZCB3cml0ZSBpdCBpcyBjb21taXR0ZWQgc2hhcmVkXG4gICAgLy8gbWVtb3J5IGl0c2VsZiwgc28gYSBzaGFsbG93IGBbLi4uY3VycmVudF1gIGhhbmRlZCB0aGUgc3RhZ2UgdGhlXG4gICAgLy8gY29tbWl0dGVkIEVMRU1FTlRTIGFuZCBgYXJyWzBdLm4gPSA5YCBlZGl0ZWQgY29tbWl0dGVkIHN0YXRlIGluIHBsYWNlXG4gICAgLy8gd2l0aCBubyB0cmFjZSByb3cgKGFuZCB0aGUgbGF6eSBidWZmZXIncyBiYXNlIHdhcyB0aGVuIHRha2VuIEFGVEVSIHRoZVxuICAgIC8vIGVkaXQsIHNvIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBzYXcgbm90aGluZykuIFN0YXRlIHZhbHVlcyBzdXJ2aXZlXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWAgYnkgY29udHJhY3QsIHNvIHRoZSB3b3JraW5nIGNvcHkgaXMgYSBmdWxsIGNvcHkuXG4gICAgY29uc3QgY2xvbmU6IHVua25vd25bXSA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgPyBzdHJ1Y3R1cmVkQ2xvbmUoY3VycmVudCkgOiBbXTtcbiAgICAvLyBVc2VyIGFwcGxpZXMgYWxsIG11dGF0aW9ucyB0byB0aGUgcGxhaW4gY2xvbmUg4oCUIG5vIFByb3h5LCBubyBwZXItbXV0YXRpb24gY29tbWl0XG4gICAgZm4oY2xvbmUpO1xuICAgIC8vIE9uZSBzZXRWYWx1ZSDigJQgZmlyZXMgb25Xcml0ZSBvbmNlIHdpdGggdGhlIGZpbmFsIGFycmF5LiBUaGUgc3RhZ2UgbWF5XG4gICAgLy8gaGF2ZSBwdXNoZWQgaGFuZGxlcyBpbnRvIHRoZSBjbG9uZSAoYGFyci5wdXNoKHNjb3BlLnRlbXBsYXRlKWApIOKAlCB0aGV5XG4gICAgLy8gYXJlIHZhbHVlcyBieSB0aGUgdGltZSB0aGUgYXJyYXkgaXMgc3RhZ2VkIChoYW5kbGVzLnRzKS5cbiAgICB0LnNldFZhbHVlKGtleSwgdW53cmFwSGFuZGxlcyhjbG9uZSkpO1xuICB9LFxuICAkYnJlYWs6IChfdCwgb3B0cykgPT4gKHJlYXNvbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghb3B0cy5icmVha0ZuKSB0aHJvdyBuZXcgRXJyb3IoJyRicmVhaygpIGlzIG5vdCBhdmFpbGFibGUgb3V0c2lkZSBzdGFnZSBleGVjdXRpb24nKTtcbiAgICBvcHRzLmJyZWFrRm4ocmVhc29uKTtcbiAgfSxcbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKS4gUm91dGVzIHRvIFNjb3BlRmFjYWRlLmVtaXRFdmVudFxuICAvLyB3aGljaCBoYW5kbGVzIGZhc3QtcGF0aCwgZW5yaWNobWVudCwgcmVkYWN0aW9uLCBhbmQgZXJyb3IgaXNvbGF0aW9uLlxuICAkZW1pdDogKHQpID0+IHQuZW1pdEV2ZW50LmJpbmQodCksXG4gIC8vIERldGFjaCAoVDQpIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0cy4gRGVsZWdhdGVzIHRvIFNjb3BlRmFjYWRlXG4gIC8vIHdoaWNoIG1pbnRlZCByZWZJZHMgZnJvbSBydW50aW1lU3RhZ2VJZC5cbiAgJGRldGFjaEFuZEpvaW5MYXRlcjogKHQpID0+IHQuZGV0YWNoQW5kSm9pbkxhdGVyLmJpbmQodCksXG4gICRkZXRhY2hBbmRGb3JnZXQ6ICh0KSA9PiB0LmRldGFjaEFuZEZvcmdldC5iaW5kKHQpLFxuICAkdG9SYXc6ICh0KSA9PiAoKSA9PiB0LFxufTtcblxuLy8gLS0gR3VhcmQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIHRvIHByZXZlbnQgUHJveHkgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgUHJvbWlzZSxcbi8vIGJyZWFraW5nIGluc3RhbmNlb2YgY2hlY2tzLCBvciBjb25mdXNpbmcgdGVzdCBtYXRjaGVycy5cblxuY29uc3QgR1VBUkRfUFJPUFM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+ID0ge1xuICB0aGVuOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgUHJvbWlzZSBkZXRlY3Rpb25cbiAgYXN5bW1ldHJpY01hdGNoOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgdml0ZXN0L2plc3QgbWF0Y2hlciBjb25mdXNpb25cbiAgY29uc3RydWN0b3I6IE9iamVjdCwgLy8gc2FmZSBwcm90b3R5cGVcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdUeXBlZFNjb3BlJyxcbn07XG5cbi8vIC0tIFNpbGVudCBleGlzdGVuY2UgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEb2VzIHRoaXMga2V5IGV4aXN0IGluIHN0YXRlLCBhbnN3ZXJlZCB3aXRoIE5PIHRyYWNraW5nIHNpZGUgZWZmZWN0IGF0IGFsbD9cbiAqXG4gKiBgZ2V0U3RhdGVLZXlzKClgIGlzIHRoZSBvbmx5IGluc3BlY3Rpb24gYSBTY29wZUZhY2FkZSBhbnN3ZXJzIHdpdGhvdXQgcm91dGluZ1xuICogdGhyb3VnaCB0aGUgdHJhY2tlZCByZWFkIHBhdGguIGBoYXNLZXkoKWAgZGVsaWJlcmF0ZWx5IERPRVMgcm91dGUgdGhyb3VnaCBpdDpcbiAqIGAnaycgaW4gc2NvcGVgIGlzIGEgcmVhbCBxdWVzdGlvbiBhYm91dCBzdGF0ZSB0aGF0IGEgc3RhZ2UgY2FuIGJyYW5jaCBvbiwgc29cbiAqIGl0IHJlZ2lzdGVycyBhcyBhIHJlYWQg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoaXMgcHJvYmUgbXVzdCBub3QgdXNlIGl0LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdGFyZ2V0IG9mZmVycyBubyBzaWxlbnQgYW5zd2VyOyBjYWxsZXJzIG11c3RcbiAqIHRoZW4gY2hvb3NlIGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBhc3N1bWUuXG4gKi9cbmZ1bmN0aW9uIHNpbGVudGx5S25vd25LZXkodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGtleSk7XG59XG5cbi8vIC0tIE11dGFibGUgc3RhdGUgcGVyIHByb3h5IGluc3RhbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFJlYWN0aXZlU3RhdGUge1xuICBicmVha0ZuPzogKHJlYXNvbj86IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIFRoZSB0b3AtbGV2ZWwga2V5J3MgY2hpbGQgcHJveHksIHZhbGlkYXRlZCBieSByYXcgaWRlbnRpdHkgKGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKTsgYSBzaW5rIGRyb3BzIHRoZSBrZXkgb24gd3JpdGUuICovXG4gIGNoaWxkQ2FjaGU6IE1lbWJlckNhY2hlO1xufVxuXG4vLyAtLSBOZXN0ZWQgY2hpbGQgcHJveGllcyAoZm9yIGRlZXAgd3JpdGUgaW50ZXJjZXB0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEJvdGggZmFjdG9yaWVzIGFyZSBPUkNIRVNUUkFUT1JTICg5LjIzLjEpOiByZWFkcyBhcmUgYGxpdmVWaWV3LnRzYCwgd3JpdGVzXG4vLyBhcmUgYHdyaXRlVHJhcHMudHNgIG92ZXIgYSBgcm9vdEtleVNpbmtgLCBhbmQgdGhlIE9ORSB0aGluZyBlYWNoIGRlY2lkZXNcbi8vIGl0c2VsZiBpcyB3aGF0IGEgY2hpbGQgbWVtYmVyIGJlY29tZXMg4oCUIHRoZSBjeWNsZSBwb2xpY3kuIEVhY2ggaG9sZHMgaXRzXG4vLyBvd24gcGVyLW1lbWJlciBwcm94eSBjYWNoZSAoOS4yMy4yLCBgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCkuXG4vL1xuLy8gQ3ljbGUgc2FmZXR5OiBhbiBpbW11dGFibGUgU2V0PG9iamVjdD4gb2YgYW5jZXN0b3Igb2JqZWN0cyBpcyBwYXNzZWQgZG93blxuLy8gZWFjaCBhY2Nlc3MgY2hhaW4uIEVhY2ggYnJhbmNoIGdldHMgaXRzIG93biBjb3B5IChuZXcgU2V0KHBhcmVudCkpIHNvXG4vLyBzY29wZS54LmZyaWVuZCBhbmQgc2NvcGUueC5jb3dvcmtlciBkb24ndCBwb2xsdXRlIGVhY2ggb3RoZXIncyB0cmFja2luZy5cbi8vIFdoZW4gYSBjaGlsZCB2YWx1ZSBpcyBhbHJlYWR5IGluIHRoZSBhbmNlc3RvciBzZXQsIHdlJ3ZlIGhpdCBhIGN5Y2xlLlxuLy8gQXQgdGhlIGN5Y2xlIGJyZWFrOiByZXR1cm4gYSB0ZXJtaW5hbCBwcm94eSB0aGF0IHRyYWNrcyB3cml0ZXMgKHNldCB0cmFwXG4vLyBzdGlsbCBidWlsZHMgcGF0aCArIGNvbW1pdHMgdGhyb3VnaCB0aGUgc2luaykgYnV0IGRvZXNuJ3QgcmVjdXJzZSByZWFkc1xuLy8gZnVydGhlci4gVGhlIHRlcm1pbmFsIGNoYWluIHNoYXJlcyBPTkUgbXV0YWJsZSBgdmlzaXRlZGAgc2V0OiBhIHZhbHVlIHNlZW5cbi8vIGFueXdoZXJlIHBhc3QgdGhlIGN5Y2xlIGVkZ2UgaXMgaGFuZGVkIGJhY2sgcmF3LlxuXG5mdW5jdGlvbiBjcmVhdGVUZXJtaW5hbFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmlzaXRlZDogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCksXG4pOiB1bmtub3duIHtcbiAgdmlzaXRlZC5hZGQob2JqKTtcbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBwYXN0IHRoZSBjeWNsZSBlZGdlIHN0aWxsIGdldHMgY29weS1vbi13cml0ZSBpbnRlcmNlcHRpb24g4oCUXG4gICAgLy8gaXQgY29tbWl0cyBhcyBhIGBzZXRgIG9mIHRoZSByb290IGtleSwgdGhlIHNhbWUgbGF3IGFzIHRoZSBuZXN0ZWQgcHJveHkuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIHBhdGgpO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIGNyZWF0ZVRlcm1pbmFsUHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgsIHZpc2l0ZWQpO1xuICB9O1xuICByZXR1cm4gcmVtZW1iZXJIYW5kbGUoXG4gICAgbmV3IFByb3h5KG9iaiwge1xuICAgICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgICAgc2V0OiBzaW5rU2V0VHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgICB9KSxcbiAgICBsaXZlLFxuICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOZXN0ZWRQcm94eShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2luazogV3JpdGVTaW5rLFxuICBzZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGFuY2VzdG9yczogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCksXG4pOiB1bmtub3duIHtcbiAgLy8gUmVhZHMgYXJlIExJVkUgKDkuMjIuMCk6IGEgaGVsZCBwcm94eSByZWFkcyBpdHMgb3duIHdyaXRlcywgYCd4JyBpbiBvYFxuICAvLyBhbmQgYE9iamVjdC5rZXlzKG8pYCBzZWUgdGhlbSwgYW5kIGBvLmIgPSBvLmEgKiAxMGAgdXNlcyB0aGUgbmV3IGBhYC5cbiAgLy8gVGhlIGNhcHR1cmVkIG9iamVjdCBhbnN3ZXJzIG9ubHkgd2hlbiB0aGUgcGF0aCBpcyBnb25lIOKAlCBzZWUgbGl2ZVZpZXcudHMuXG4gIGNvbnN0IG1lbWJlcnMgPSBuZXcgTWVtYmVyQ2FjaGUoKTtcbiAgY29uc3QgbGl2ZSA9ICgpID0+IGxpdmVPYmplY3Qob2JqLCBzaW5rLnJlYWRBdChzZWdtZW50cykpO1xuICBjb25zdCBjaGlsZCA9ICh2YWx1ZTogdW5rbm93biwgcGF0aDogc3RyaW5nW10pOiB1bmtub3duID0+IHtcbiAgICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgLy8gQW4gYXJyYXkgY29tbWl0cyBhcyBhIGBzZXRgIG9mIHRoZSBST09UIEtFWSAocmVhY3RpdmUvUkVBRE1FLm1kLCBsYXcgMylcbiAgICAvLyDigJQgdGhlIHNpbmsncyB2ZXJiLCB3aGF0ZXZlciBkZXB0aCB0aGUgYXJyYXkgc2l0cyBhdC5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUgYXMgb2JqZWN0KSkgcmV0dXJuIGNyZWF0ZVRlcm1pbmFsUHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgpO1xuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgbmV3IFNldChhbmNlc3RvcnMpLmFkZCh2YWx1ZSBhcyBvYmplY3QpKTtcbiAgfTtcbiAgcmV0dXJuIHJlbWVtYmVySGFuZGxlKFxuICAgIG5ldyBQcm94eShvYmosIHtcbiAgICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gICAgfSksXG4gICAgbGl2ZSxcbiAgKTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIGxlYXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIGByZXNlcnZlZFJlYWRgIGFuc3dlcmVkIG5vdGhpbmc6IHRoZSBuYW1lIGlzIGEgc3RhdGUga2V5IGFuZCBtdXN0IGJlIHJlYWQgKHRyYWNrZWQpIGZyb20gdGhlIHRhcmdldC4gKi9cbmNvbnN0IFNUQVRFX0tFWTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnc3RhdGUta2V5Jyk7XG5cbi8qKlxuICogV0hZOiB0aGUgbmFtZXMgdGhlIHNjb3BlIGFuc3dlcnMgSVRTRUxGIOKAlCBzeW1ib2xzLCB0aGUgZ3VhcmQgcHJvcGVydGllcyxcbiAqIE5vZGUncyBpbnNwZWN0IGhvb2ssIHRoZSBgJGAtbWV0aG9kcyBhbmQgdGhlIEpTT04gcHJvYmUg4oCUIG11c3QgbmV2ZXIgYmVjb21lXG4gKiB0cmFja2VkIHJlYWRzOyBldmVyeXRoaW5nIGVsc2UgKGEgbGlmZWN5Y2xlLWxvb2tpbmcgbmFtZSBzdWNoIGFzXG4gKiBgbm90aWZ5U3RhZ2VTdGFydGAgaW5jbHVkZWQpIGlzIGEgc3RhdGUga2V5IGFuZCBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoZVxuICogZW5naW5lIHJlYWNoZXMgdGhlIGZhY2FkZSB0aHJvdWdoIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWUgcG9ydCwgbmV2ZXIgdGhyb3VnaFxuICogYSBuYW1lIG9uIHRoaXMgcHJveHkuXG4gKlxuICogVGhlIHByb2JlOiBgSlNPTi5zdHJpbmdpZnlgIGFza3MgRVZFUlkgdmFsdWUgZm9yIGEgYHRvSlNPTmAgbWV0aG9kLiBUaGF0XG4gKiBxdWVzdGlvbiBjb21lcyBmcm9tIHRoZSBydW50aW1lLCBub3QgdGhlIHN0YWdlIGF1dGhvciwgc28gaXQgbXVzdCBub3QgZW50ZXJcbiAqIHRoZSByZWFkIHNldC4gQSBzdGF0ZSBrZXkgbGl0ZXJhbGx5IGNhbGxlZCAndG9KU09OJyBpcyBsZWdhbDogd2hlbiBpdCBFWElTVFNcbiAqIHRoaXMgaXMgYSBnZW51aW5lIHJlYWQgYW5kIHN0YXlzIHRyYWNrZWQsIGFuZCB3aGVuIHRoZSB0YXJnZXQgY2Fubm90IGFuc3dlclxuICogc2lsZW50bHksIHRydXRoIHdpbnMgb3ZlciBub2lzZSDigJQgZmFsbCB0aHJvdWdoLlxuICovXG5mdW5jdGlvbiByZXNlcnZlZFJlYWQodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwgc3RhdGU6IFJlYWN0aXZlU3RhdGUsIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgICBpZiAocHJvcCA9PT0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSkgcmV0dXJuICgpID0+IHRhcmdldC5nZXRWYWx1ZSgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkpIHJldHVybiBNRVRIT0RfUk9VVEVTW3Byb3BdPy4odGFyZ2V0LCBzdGF0ZSk7XG4gIGlmIChwcm9wID09PSAndG9KU09OJyAmJiBzaWxlbnRseUtub3duS2V5KHRhcmdldCwgcHJvcCkgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gU1RBVEVfS0VZO1xufVxuXG4vKipcbiAqIEEgd3JhcHBhYmxlIHN0YXRlIHZhbHVlIGJlY29tZXMgdGhlIGFycmF5IG9yIG5lc3RlZCBwcm94eSBmb3IgaXRzIGtleTtcbiAqIGFueXRoaW5nIGVsc2UgaXMgaGFuZGVkIGJhY2sgcmF3LiBgc2NvcGUuayA9PT0gc2NvcGUua2AgaG9sZHMgd2l0aGluIGFcbiAqIHN0YWdlIHRocm91Z2ggdGhlIHNhbWUgcGVyLW1lbWJlciBjYWNoZSBldmVyeSBvYmplY3QgcHJveHkgdXNlc1xuICogKGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKTogYSB3cml0ZSB0byB0aGUga2V5IGRyb3BzIHRoZSBlbnRyeSAodGhlXG4gKiBzaW5rIGRvZXMgaXQpLCBhIGNvbW1pdCBzd2FwcyB0aGUgdmFsdWUgYW5kIHRoZSByZWYgY2hlY2sgbWlzc2VzIOKAlCBlaXRoZXJcbiAqIHdheSB0aGUgbmV4dCByZWFkIGJ1aWxkcyBhIGZyZXNoIHByb3h5IG92ZXIgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gd3JhcFN0YXRlVmFsdWUoXG4gIHRhcmdldDogUmVhY3RpdmVUYXJnZXQsXG4gIHJlYWRTaWxlbnQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93bixcbiAgc3RhdGU6IFJlYWN0aXZlU3RhdGUsXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTsgLy8gRGF0ZSwgTWFwLCBjbGFzcyBpbnN0YW5jZSwgZnJvemVuIOKAplxuICByZXR1cm4gY2FjaGVkTWVtYmVyKFxuICAgIHN0YXRlLmNoaWxkQ2FjaGUsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHNpbmsgPSByb290S2V5U2luayh0YXJnZXQsIHJlYWRTaWxlbnQsIGtleSwgc3RhdGUuY2hpbGRDYWNoZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgW10pO1xuICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBbXSwgbmV3IFNldDxvYmplY3Q+KFt2YWx1ZV0pKTtcbiAgICB9LFxuICAgIFtdLFxuICApO1xufVxuXG4vKiogV0hZOiBhIGAkYC1uYW1lIGNhbiBuZXZlciBiZSBhIHN0YXRlIGtleSDigJQgdGhlIHdyaXRlIGlzIHJlZnVzZWQsIG5vdCBzaGFkb3dlZDsgZXZlcnkgb3RoZXIgYXNzaWdubWVudFxuICogIHN0b3JlcyB0aGUgdmFsdWUgQVMgQVNTSUdORUQgKGEgaGFuZGxlIGJlY29tZXMgd2hhdCBpdCBzdGFuZHMgZm9yLCBgaGFuZGxlcy50c2A7IHRoZSBidWZmZXIgZGV0YWNoZXMgYXRcbiAqICBjb21taXQg4oCUIHRoZSBzYW1lIGxhdyBhcyBgJHNldFZhbHVlYCwgOS4yNC4wKSBhbmQgZHJvcHMgdGhlIGtleSdzIGNhY2hlZCBwcm94eS4gKi9cbmZ1bmN0aW9uIGFzc2lnblN0YXRlS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMoa2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3Qgc2V0IHN0YXRlIGtleSBcIiR7a2V5fVwiIC0tIGl0IGNvbmZsaWN0cyB3aXRoIGEgcmVzZXJ2ZWQgVHlwZWRTY29wZSBtZXRob2QuIFJlbmFtZSB0aGUgc3RhdGUga2V5IHRvIGF2b2lkICQtcHJlZml4ZWQgbmFtZXMuYCxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zZXRWYWx1ZShrZXksIHVud3JhcEhhbmRsZXModmFsdWUpKTtcbiAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUoa2V5KTtcbn1cblxuLyoqIERvZXMgdGhlIGtleSBleGlzdCDigJQgYW5zd2VyZWQgd2l0aG91dCBhIHRyYWNrZWQgcmVhZCB3aGVyZXZlciB0aGUgdGFyZ2V0IGNhbjsgYGdldFZhbHVlYCBpcyB0aGUgbGFzdCByZXNvcnQuICovXG5mdW5jdGlvbiBrbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodGFyZ2V0Lmhhc0tleSkgcmV0dXJuIHRhcmdldC5oYXNLZXkoa2V5KTtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbiAgcmV0dXJuIHRhcmdldC5nZXRWYWx1ZShrZXkpICE9PSB1bmRlZmluZWQ7IC8vIGZhbGxiYWNrOiBmaXJlcyBvblJlYWQgKGFjY2VwdGFibGUgZGVncmFkYXRpb24pXG59XG5cbi8qKiBFdmVyeSBzdGF0ZSBrZXkg4oCUIHNpbGVudGx5IHdoZXJlIHRoZSB0YXJnZXQgY2FuLCBlbHNlIGZyb20gYSB3aG9sZS1zdGF0ZSByZWFkLiAqL1xuZnVuY3Rpb24gc3RhdGVLZXlzKHRhcmdldDogUmVhY3RpdmVUYXJnZXQpOiBzdHJpbmdbXSB7XG4gIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpO1xuICBjb25zdCBzbmFwc2hvdCA9IHRhcmdldC5nZXRWYWx1ZSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gc25hcHNob3QgJiYgdHlwZW9mIHNuYXBzaG90ID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKHNuYXBzaG90KSA6IFtdO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgcHJveHkgKHRoZSBtYWluIFR5cGVkU2NvcGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlcyBhIFR5cGVkU2NvcGU8VD4gcHJveHkgd3JhcHBpbmcgYSBSZWFjdGl2ZVRhcmdldC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHVuZGVybHlpbmcgc2NvcGUgKFNjb3BlRmFjYWRlIG9yIGFueSBSZWFjdGl2ZVRhcmdldClcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiAoYnJlYWtQaXBlbGluZSBpbmplY3Rpb24pXG4gKiBAcmV0dXJucyBBIFByb3h5IHdpdGggdHlwZWQgcHJvcGVydHkgYWNjZXNzIGFuZCAkLXByZWZpeGVkIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVkU2NvcGU8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwgb3B0aW9ucz86IFJlYWN0aXZlT3B0aW9ucyk6IFR5cGVkU2NvcGU8VD4ge1xuICBjb25zdCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSA9IHsgYnJlYWtGbjogb3B0aW9ucz8uYnJlYWtQaXBlbGluZSwgY2hpbGRDYWNoZTogbmV3IE1lbWJlckNhY2hlKCkgfTtcbiAgLy8gQmluZCB0aGUgc2lsZW50IHJlYWQgb25jZSDigJQgdGhlIG5lc3RlZC9hcnJheSBwcm94aWVzIHJlc29sdmUgdGhlaXIgbGl2ZSB2aWV3IHRocm91Z2ggaXQuXG4gIGNvbnN0IHJlYWRTaWxlbnQgPSAodGFyZ2V0LmdldFZhbHVlU2lsZW50ID8/IHRhcmdldC5nZXRWYWx1ZSkuYmluZCh0YXJnZXQpO1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCBhcyB1bmtub3duIGFzIFR5cGVkU2NvcGU8VD4sIHtcbiAgICBnZXQoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBjb25zdCBhbnN3ZXJlZCA9IHJlc2VydmVkUmVhZCh0YXJnZXQsIHN0YXRlLCBwcm9wKTtcbiAgICAgIGlmIChhbnN3ZXJlZCAhPT0gU1RBVEVfS0VZKSByZXR1cm4gYW5zd2VyZWQ7XG4gICAgICAvLyBBIHN0YXRlIGtleTogT05FIHRyYWNrZWQgcmVhZCAoZmlyZXMgb25SZWFkIG9uY2UpLCB0aGVuIHRoZSB3cmFwcGVyLlxuICAgICAgcmV0dXJuIHdyYXBTdGF0ZVZhbHVlKHRhcmdldCwgcmVhZFNpbGVudCwgc3RhdGUsIHByb3AgYXMgc3RyaW5nLCB0YXJnZXQuZ2V0VmFsdWUocHJvcCBhcyBzdHJpbmcpKTtcbiAgICB9LFxuICAgIHNldChfcHJveHlUYXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSBhc3NpZ25TdGF0ZUtleSh0YXJnZXQsIHN0YXRlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICB0YXJnZXQuZGVsZXRlVmFsdWUocHJvcCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaGFzKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCk7XG4gICAgICByZXR1cm4gU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSB8fCBrbm93bktleSh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gICAgb3duS2V5czogKCkgPT4gc3RhdGVLZXlzKHRhcmdldCksXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyB8fCBTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkOyAvLyAkLW1ldGhvZHMgYXJlIG5vbi1lbnVtZXJhYmxlXG4gICAgICBpZiAoIWtub3duS2V5KHRhcmdldCwgcHJvcCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH07IC8vIHRoZSB2YWx1ZSBpcyBmZXRjaGVkIHZpYSB0aGUgZ2V0IHRyYXBcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHByb3h5LCB7XG4gICAgdGFyZ2V0LFxuICAgIGhhbmRsZXNBc3NpZ25tZW50czogdHJ1ZSxcbiAgICBzZXRCcmVhazogKGZuKSA9PiB7XG4gICAgICBzdGF0ZS5icmVha0ZuID0gZm47XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsaUVBQWlFO0lBQ2pFLGlEQUFpRDtJQUNqRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxZQUFzQixFQUFFLFdBQW9CLEVBQUUsRUFBRSxDQUM5RixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMs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QUssRUFBRTtRQUNqQyxNQUFNO1FBQ04sa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNmLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9jcmVhdGVUeXBlZFNjb3BlIC0tIENvcmUgUHJveHkgZmFjdG9yeSBmb3IgVHlwZWRTY29wZTxUPi5cbiAqXG4gKiBXcmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzOlxuICogLSBUeXBlZCBwcm9wZXJ0eSBhY2Nlc3M6IHNjb3BlLmNyZWRpdFRpZXIgKHJlYWQpLCBzY29wZS5jcmVkaXRUaWVyID0gJ0EnICh3cml0ZSlcbiAqIC0gRGVlcCB3cml0ZSBpbnRlcmNlcHRpb246IHNjb3BlLmN1c3RvbWVyLmFkZHJlc3MuemlwID0gJzkwMjEwJ1xuICogLSBBcnJheSBtdXRhdGlvbiBpbnRlcmNlcHRpb246IHNjb3BlLml0ZW1zLnB1c2goJ25ldycpXG4gKiAtICQtcHJlZml4ZWQgZXNjYXBlIGhhdGNoZXM6ICRnZXRWYWx1ZSwgJHNldFZhbHVlLCAkcmVhZCwgJGdldEFyZ3MsIGV0Yy5cbiAqXG4gKiBSZWFkIHNlbWFudGljczogdG9wLWxldmVsIGdldCBjYWxscyBnZXRWYWx1ZSgpIChmaXJlcyBvblJlYWQgT05DRSkuXG4gKiAgIE5lc3RlZCBnZXQgdHJhcHMgbmF2aWdhdGUgaW4tbWVtb3J5IC0tIG5vIGFkZGl0aW9uYWwgb25SZWFkLlxuICpcbiAqIFdyaXRlIHNlbWFudGljczogdG9wLWxldmVsIHNldCBjYWxscyBzZXRWYWx1ZSgpLiBOZXN0ZWQgc2V0IGNhbGxzXG4gKiAgIHVwZGF0ZVZhbHVlKCkgd2l0aCBhIHBhcnRpYWwgb2JqZWN0IGJ1aWx0IGZyb20gdGhlIGFjY3VtdWxhdGVkIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0IGFzIGxvZGFzaEdldCB9IGZyb20gJ2Zvb3R0cmFjZS9wYXRocyc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyU2NvcGVSdW50aW1lIH0gZnJvbSAnLi4vc2NvcGUvcnVudGltZS5qcyc7XG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgYXJyYXlQcm94eUF0IH0gZnJvbSAnLi9hcnJheVRyYXBzLmpzJztcbmltcG9ydCB7IHJlbWVtYmVySGFuZGxlLCB1bndyYXBIYW5kbGVzIH0gZnJvbSAnLi9oYW5kbGVzLmpzJztcbmltcG9ydCB7IGNhY2hlZE1lbWJlciwgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QsIE1lbWJlckNhY2hlIH0gZnJvbSAnLi9saXZlVmlldy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgLy8gQSBoYW5kbGUgdGhlIHNjb3BlIGhhbmRlZCBvdXQgaXMgYSB2YWx1ZSBpdCBhY2NlcHRzIGJhY2sgKGhhbmRsZXMudHMpOlxuICAvLyBgJHNldFZhbHVlKCdjb3B5Jywgc2NvcGUuY3VzdG9tZXIpYCBzdG9yZXMgdGhlIHZhbHVlIGJlaGluZCB0aGUgaGFuZGxlLFxuICAvLyBub3QgYSBQcm94eSB0aGUgY29tbWl0IGNvdWxkIG5ldmVyIGNsb25lLiBUaGUgc2V0IHRyYXAgZG9lcyB0aGUgc2FtZSBmb3JcbiAgLy8gYHNjb3BlLmNvcHkgPSBzY29wZS5jdXN0b21lcmA7IHRoZXNlIGFyZSB0aGUgZXhwbGljaXQgZG9vcnMuIEFcbiAgLy8gaGFuZGxlLWZyZWUgdmFsdWUgcGFzc2VzIHRocm91Z2ggYnkgcmVmZXJlbmNlLlxuICAkc2V0VmFsdWU6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykgPT5cbiAgICB0LnNldFZhbHVlKGtleSwgdW53cmFwSGFuZGxlcyh2YWx1ZSksIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pLFxuICAkdXBkYXRlOiAodCkgPT4gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpID0+XG4gICAgdC51cGRhdGVWYWx1ZShrZXksIHVud3JhcEhhbmRsZXModmFsdWUpLCBkZXNjcmlwdGlvbiksXG4gICRkZWxldGU6ICh0KSA9PiB0LmRlbGV0ZVZhbHVlLmJpbmQodCksXG4gICRyZWFkOiAodCkgPT4gKGRvdFBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvb3RLZXkgPSBkb3RQYXRoLnNwbGl0KCcuJylbMF07XG4gICAgY29uc3QgdmFsdWUgPSB0LmdldFZhbHVlKHJvb3RLZXkpO1xuICAgIGlmICghZG90UGF0aC5pbmNsdWRlcygnLicpKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIGxvZGFzaEdldCh2YWx1ZSwgZG90UGF0aC5zbGljZShyb290S2V5Lmxlbmd0aCArIDEpKTtcbiAgfSxcbiAgJGdldEFyZ3M6ICh0KSA9PiB0LmdldEFyZ3MuYmluZCh0KSxcbiAgJGdldEVudjogKHQpID0+IHQuZ2V0RW52LmJpbmQodCksXG4gICRhdHRlbXB0OiAodCkgPT4gdC5nZXRBdHRlbXB0LmJpbmQodCksXG4gICRjYWxsOiAodCkgPT4gdC5jYWxsLmJpbmQodCksXG4gICRkZWJ1ZzogKHQpID0+IHQuYWRkRGVidWdJbmZvLmJpbmQodCksXG4gICRsb2c6ICh0KSA9PiB0LmFkZERlYnVnTWVzc2FnZS5iaW5kKHQpLFxuICAkZXJyb3I6ICh0KSA9PiB0LmFkZEVycm9ySW5mby5iaW5kKHQpLFxuICAkbWV0cmljOiAodCkgPT4gdC5hZGRNZXRyaWMuYmluZCh0KSxcbiAgJGV2YWw6ICh0KSA9PiB0LmFkZEV2YWwuYmluZCh0KSxcbiAgJGF0dGFjaFNjb3BlUmVjb3JkZXI6ICh0KSA9PiB0LmF0dGFjaFNjb3BlUmVjb3JkZXIuYmluZCh0KSxcbiAgJGRldGFjaFNjb3BlUmVjb3JkZXI6ICh0KSA9PiB0LmRldGFjaFNjb3BlUmVjb3JkZXIuYmluZCh0KSxcbiAgJGdldFNjb3BlUmVjb3JkZXJzOiAodCkgPT4gdC5nZXRTY29wZVJlY29yZGVycy5iaW5kKHQpLFxuICAkYmF0Y2hBcnJheTogKHQpID0+IChrZXk6IHN0cmluZywgZm46IChhcnI6IHVua25vd25bXSkgPT4gdm9pZCkgPT4ge1xuICAgIC8vIE9uZSBnZXRWYWx1ZSDigJQgZmlyZXMgb25SZWFkIG9uY2VcbiAgICBjb25zdCBjdXJyZW50ID0gdC5nZXRWYWx1ZShrZXkpO1xuICAgIC8vIENsb25lIG9uY2Ug4oCUIERFRVAgKG9yIHN0YXJ0IGVtcHR5IGlmIG1pc3Npbmcvbm9uLWFycmF5KS4gVGhlIHJlYWQgaXNcbiAgICAvLyBCT1JST1dFRDogYmVmb3JlIHRoZSBzdGFnZSdzIGZpcnN0IHN0YWdlZCB3cml0ZSBpdCBpcyBjb21taXR0ZWQgc2hhcmVkXG4gICAgLy8gbWVtb3J5IGl0c2VsZiwgc28gYSBzaGFsbG93IGBbLi4uY3VycmVudF1gIGhhbmRlZCB0aGUgc3RhZ2UgdGhlXG4gICAgLy8gY29tbWl0dGVkIEVMRU1FTlRTIGFuZCBgYXJyWzBdLm4gPSA5YCBlZGl0ZWQgY29tbWl0dGVkIHN0YXRlIGluIHBsYWNlXG4gICAgLy8gd2l0aCBubyB0cmFjZSByb3cgKGFuZCB0aGUgbGF6eSBidWZmZXIncyBiYXNlIHdhcyB0aGVuIHRha2VuIEFGVEVSIHRoZVxuICAgIC8vIGVkaXQsIHNvIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBzYXcgbm90aGluZykuIFN0YXRlIHZhbHVlcyBzdXJ2aXZlXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWAgYnkgY29udHJhY3QsIHNvIHRoZSB3b3JraW5nIGNvcHkgaXMgYSBmdWxsIGNvcHkuXG4gICAgY29uc3QgY2xvbmU6IHVua25vd25bXSA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgPyBzdHJ1Y3R1cmVkQ2xvbmUoY3VycmVudCkgOiBbXTtcbiAgICAvLyBVc2VyIGFwcGxpZXMgYWxsIG11dGF0aW9ucyB0byB0aGUgcGxhaW4gY2xvbmUg4oCUIG5vIFByb3h5LCBubyBwZXItbXV0YXRpb24gY29tbWl0XG4gICAgZm4oY2xvbmUpO1xuICAgIC8vIE9uZSBzZXRWYWx1ZSDigJQgZmlyZXMgb25Xcml0ZSBvbmNlIHdpdGggdGhlIGZpbmFsIGFycmF5LiBUaGUgc3RhZ2UgbWF5XG4gICAgLy8gaGF2ZSBwdXNoZWQgaGFuZGxlcyBpbnRvIHRoZSBjbG9uZSAoYGFyci5wdXNoKHNjb3BlLnRlbXBsYXRlKWApIOKAlCB0aGV5XG4gICAgLy8gYXJlIHZhbHVlcyBieSB0aGUgdGltZSB0aGUgYXJyYXkgaXMgc3RhZ2VkIChoYW5kbGVzLnRzKS5cbiAgICB0LnNldFZhbHVlKGtleSwgdW53cmFwSGFuZGxlcyhjbG9uZSkpO1xuICB9LFxuICAkYnJlYWs6IChfdCwgb3B0cykgPT4gKHJlYXNvbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghb3B0cy5icmVha0ZuKSB0aHJvdyBuZXcgRXJyb3IoJyRicmVhaygpIGlzIG5vdCBhdmFpbGFibGUgb3V0c2lkZSBzdGFnZSBleGVjdXRpb24nKTtcbiAgICBvcHRzLmJyZWFrRm4ocmVhc29uKTtcbiAgfSxcbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKS4gUm91dGVzIHRvIFNjb3BlRmFjYWRlLmVtaXRFdmVudFxuICAvLyB3aGljaCBoYW5kbGVzIGZhc3QtcGF0aCwgZW5yaWNobWVudCwgcmVkYWN0aW9uLCBhbmQgZXJyb3IgaXNvbGF0aW9uLlxuICAkZW1pdDogKHQpID0+IHQuZW1pdEV2ZW50LmJpbmQodCksXG4gIC8vIERldGFjaCAoVDQpIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0cy4gRGVsZWdhdGVzIHRvIFNjb3BlRmFjYWRlXG4gIC8vIHdoaWNoIG1pbnRlZCByZWZJZHMgZnJvbSBydW50aW1lU3RhZ2VJZC5cbiAgJGRldGFjaEFuZEpvaW5MYXRlcjogKHQpID0+IHQuZGV0YWNoQW5kSm9pbkxhdGVyLmJpbmQodCksXG4gICRkZXRhY2hBbmRGb3JnZXQ6ICh0KSA9PiB0LmRldGFjaEFuZEZvcmdldC5iaW5kKHQpLFxuICAkdG9SYXc6ICh0KSA9PiAoKSA9PiB0LFxufTtcblxuLy8gLS0gR3VhcmQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIHRvIHByZXZlbnQgUHJveHkgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgUHJvbWlzZSxcbi8vIGJyZWFraW5nIGluc3RhbmNlb2YgY2hlY2tzLCBvciBjb25mdXNpbmcgdGVzdCBtYXRjaGVycy5cblxuY29uc3QgR1VBUkRfUFJPUFM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+ID0ge1xuICB0aGVuOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgUHJvbWlzZSBkZXRlY3Rpb25cbiAgYXN5bW1ldHJpY01hdGNoOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgdml0ZXN0L2plc3QgbWF0Y2hlciBjb25mdXNpb25cbiAgY29uc3RydWN0b3I6IE9iamVjdCwgLy8gc2FmZSBwcm90b3R5cGVcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdUeXBlZFNjb3BlJyxcbn07XG5cbi8vIC0tIFNpbGVudCBleGlzdGVuY2UgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEb2VzIHRoaXMga2V5IGV4aXN0IGluIHN0YXRlLCBhbnN3ZXJlZCB3aXRoIE5PIHRyYWNraW5nIHNpZGUgZWZmZWN0IGF0IGFsbD9cbiAqXG4gKiBgZ2V0U3RhdGVLZXlzKClgIGlzIHRoZSBvbmx5IGluc3BlY3Rpb24gYSBTY29wZUZhY2FkZSBhbnN3ZXJzIHdpdGhvdXQgcm91dGluZ1xuICogdGhyb3VnaCB0aGUgdHJhY2tlZCByZWFkIHBhdGguIGBoYXNLZXkoKWAgZGVsaWJlcmF0ZWx5IERPRVMgcm91dGUgdGhyb3VnaCBpdDpcbiAqIGAnaycgaW4gc2NvcGVgIGlzIGEgcmVhbCBxdWVzdGlvbiBhYm91dCBzdGF0ZSB0aGF0IGEgc3RhZ2UgY2FuIGJyYW5jaCBvbiwgc29cbiAqIGl0IHJlZ2lzdGVycyBhcyBhIHJlYWQg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoaXMgcHJvYmUgbXVzdCBub3QgdXNlIGl0LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdGFyZ2V0IG9mZmVycyBubyBzaWxlbnQgYW5zd2VyOyBjYWxsZXJzIG11c3RcbiAqIHRoZW4gY2hvb3NlIGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBhc3N1bWUuXG4gKi9cbmZ1bmN0aW9uIHNpbGVudGx5S25vd25LZXkodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGtleSk7XG59XG5cbi8vIC0tIE11dGFibGUgc3RhdGUgcGVyIHByb3h5IGluc3RhbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFJlYWN0aXZlU3RhdGUge1xuICBicmVha0ZuPzogKHJlYXNvbj86IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIFRoZSB0b3AtbGV2ZWwga2V5J3MgY2hpbGQgcHJveHksIHZhbGlkYXRlZCBieSByYXcgaWRlbnRpdHkgKGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKTsgYSBzaW5rIGRyb3BzIHRoZSBrZXkgb24gd3JpdGUuICovXG4gIGNoaWxkQ2FjaGU6IE1lbWJlckNhY2hlO1xufVxuXG4vLyAtLSBOZXN0ZWQgY2hpbGQgcHJveGllcyAoZm9yIGRlZXAgd3JpdGUgaW50ZXJjZXB0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEJvdGggZmFjdG9yaWVzIGFyZSBPUkNIRVNUUkFUT1JTICg5LjIzLjEpOiByZWFkcyBhcmUgYGxpdmVWaWV3LnRzYCwgd3JpdGVzXG4vLyBhcmUgYHdyaXRlVHJhcHMudHNgIG92ZXIgYSBgcm9vdEtleVNpbmtgLCBhbmQgdGhlIE9ORSB0aGluZyBlYWNoIGRlY2lkZXNcbi8vIGl0c2VsZiBpcyB3aGF0IGEgY2hpbGQgbWVtYmVyIGJlY29tZXMg4oCUIHRoZSBjeWNsZSBwb2xpY3kuIEVhY2ggaG9sZHMgaXRzXG4vLyBvd24gcGVyLW1lbWJlciBwcm94eSBjYWNoZSAoOS4yMy4yLCBgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCkuXG4vL1xuLy8gQ3ljbGUgc2FmZXR5OiBhbiBpbW11dGFibGUgU2V0PG9iamVjdD4gb2YgYW5jZXN0b3Igb2JqZWN0cyBpcyBwYXNzZWQgZG93blxuLy8gZWFjaCBhY2Nlc3MgY2hhaW4uIEVhY2ggYnJhbmNoIGdldHMgaXRzIG93biBjb3B5IChuZXcgU2V0KHBhcmVudCkpIHNvXG4vLyBzY29wZS54LmZyaWVuZCBhbmQgc2NvcGUueC5jb3dvcmtlciBkb24ndCBwb2xsdXRlIGVhY2ggb3RoZXIncyB0cmFja2luZy5cbi8vIFdoZW4gYSBjaGlsZCB2YWx1ZSBpcyBhbHJlYWR5IGluIHRoZSBhbmNlc3RvciBzZXQsIHdlJ3ZlIGhpdCBhIGN5Y2xlLlxuLy8gQXQgdGhlIGN5Y2xlIGJyZWFrOiByZXR1cm4gYSB0ZXJtaW5hbCBwcm94eSB0aGF0IHRyYWNrcyB3cml0ZXMgKHNldCB0cmFwXG4vLyBzdGlsbCBidWlsZHMgcGF0aCArIGNvbW1pdHMgdGhyb3VnaCB0aGUgc2luaykgYnV0IGRvZXNuJ3QgcmVjdXJzZSByZWFkc1xuLy8gZnVydGhlci4gVGhlIHRlcm1pbmFsIGNoYWluIHNoYXJlcyBPTkUgbXV0YWJsZSBgdmlzaXRlZGAgc2V0OiBhIHZhbHVlIHNlZW5cbi8vIGFueXdoZXJlIHBhc3QgdGhlIGN5Y2xlIGVkZ2UgaXMgaGFuZGVkIGJhY2sgcmF3LlxuXG5mdW5jdGlvbiBjcmVhdGVUZXJtaW5hbFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmlzaXRlZDogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCksXG4pOiB1bmtub3duIHtcbiAgdmlzaXRlZC5hZGQob2JqKTtcbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBwYXN0IHRoZSBjeWNsZSBlZGdlIHN0aWxsIGdldHMgY29weS1vbi13cml0ZSBpbnRlcmNlcHRpb24g4oCUXG4gICAgLy8gaXQgY29tbWl0cyBhcyBhIGBzZXRgIG9mIHRoZSByb290IGtleSwgdGhlIHNhbWUgbGF3IGFzIHRoZSBuZXN0ZWQgcHJveHkuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIHBhdGgpO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIGNyZWF0ZVRlcm1pbmFsUHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgsIHZpc2l0ZWQpO1xuICB9O1xuICByZXR1cm4gcmVtZW1iZXJIYW5kbGUoXG4gICAgbmV3IFByb3h5KG9iaiwge1xuICAgICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgICAgc2V0OiBzaW5rU2V0VHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgICB9KSxcbiAgICBsaXZlLFxuICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOZXN0ZWRQcm94eShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2luazogV3JpdGVTaW5rLFxuICBzZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGFuY2VzdG9yczogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCksXG4pOiB1bmtub3duIHtcbiAgLy8gUmVhZHMgYXJlIExJVkUgKDkuMjIuMCk6IGEgaGVsZCBwcm94eSByZWFkcyBpdHMgb3duIHdyaXRlcywgYCd4JyBpbiBvYFxuICAvLyBhbmQgYE9iamVjdC5rZXlzKG8pYCBzZWUgdGhlbSwgYW5kIGBvLmIgPSBvLmEgKiAxMGAgdXNlcyB0aGUgbmV3IGBhYC5cbiAgLy8gVGhlIGNhcHR1cmVkIG9iamVjdCBhbnN3ZXJzIG9ubHkgd2hlbiB0aGUgcGF0aCBpcyBnb25lIOKAlCBzZWUgbGl2ZVZpZXcudHMuXG4gIGNvbnN0IG1lbWJlcnMgPSBuZXcgTWVtYmVyQ2FjaGUoKTtcbiAgY29uc3QgbGl2ZSA9ICgpID0+IGxpdmVPYmplY3Qob2JqLCBzaW5rLnJlYWRBdChzZWdtZW50cykpO1xuICBjb25zdCBjaGlsZCA9ICh2YWx1ZTogdW5rbm93biwgcGF0aDogc3RyaW5nW10pOiB1bmtub3duID0+IHtcbiAgICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgLy8gQW4gYXJyYXkgY29tbWl0cyBhcyBhIGBzZXRgIG9mIHRoZSBST09UIEtFWSAocmVhY3RpdmUvUkVBRE1FLm1kLCBsYXcgMylcbiAgICAvLyDigJQgdGhlIHNpbmsncyB2ZXJiLCB3aGF0ZXZlciBkZXB0aCB0aGUgYXJyYXkgc2l0cyBhdC5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUgYXMgb2JqZWN0KSkgcmV0dXJuIGNyZWF0ZVRlcm1pbmFsUHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgpO1xuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgbmV3IFNldChhbmNlc3RvcnMpLmFkZCh2YWx1ZSBhcyBvYmplY3QpKTtcbiAgfTtcbiAgcmV0dXJuIHJlbWVtYmVySGFuZGxlKFxuICAgIG5ldyBQcm94eShvYmosIHtcbiAgICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gICAgfSksXG4gICAgbGl2ZSxcbiAgKTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIGxlYXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIGByZXNlcnZlZFJlYWRgIGFuc3dlcmVkIG5vdGhpbmc6IHRoZSBuYW1lIGlzIGEgc3RhdGUga2V5IGFuZCBtdXN0IGJlIHJlYWQgKHRyYWNrZWQpIGZyb20gdGhlIHRhcmdldC4gKi9cbmNvbnN0IFNUQVRFX0tFWTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnc3RhdGUta2V5Jyk7XG5cbi8qKlxuICogV0hZOiB0aGUgbmFtZXMgdGhlIHNjb3BlIGFuc3dlcnMgSVRTRUxGIOKAlCBzeW1ib2xzLCB0aGUgZ3VhcmQgcHJvcGVydGllcyxcbiAqIE5vZGUncyBpbnNwZWN0IGhvb2ssIHRoZSBgJGAtbWV0aG9kcyBhbmQgdGhlIEpTT04gcHJvYmUg4oCUIG11c3QgbmV2ZXIgYmVjb21lXG4gKiB0cmFja2VkIHJlYWRzOyBldmVyeXRoaW5nIGVsc2UgKGEgbGlmZWN5Y2xlLWxvb2tpbmcgbmFtZSBzdWNoIGFzXG4gKiBgbm90aWZ5U3RhZ2VTdGFydGAgaW5jbHVkZWQpIGlzIGEgc3RhdGUga2V5IGFuZCBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoZVxuICogZW5naW5lIHJlYWNoZXMgdGhlIGZhY2FkZSB0aHJvdWdoIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWUgcG9ydCwgbmV2ZXIgdGhyb3VnaFxuICogYSBuYW1lIG9uIHRoaXMgcHJveHkuXG4gKlxuICogVGhlIHByb2JlOiBgSlNPTi5zdHJpbmdpZnlgIGFza3MgRVZFUlkgdmFsdWUgZm9yIGEgYHRvSlNPTmAgbWV0aG9kLiBUaGF0XG4gKiBxdWVzdGlvbiBjb21lcyBmcm9tIHRoZSBydW50aW1lLCBub3QgdGhlIHN0YWdlIGF1dGhvciwgc28gaXQgbXVzdCBub3QgZW50ZXJcbiAqIHRoZSByZWFkIHNldC4gQSBzdGF0ZSBrZXkgbGl0ZXJhbGx5IGNhbGxlZCAndG9KU09OJyBpcyBsZWdhbDogd2hlbiBpdCBFWElTVFNcbiAqIHRoaXMgaXMgYSBnZW51aW5lIHJlYWQgYW5kIHN0YXlzIHRyYWNrZWQsIGFuZCB3aGVuIHRoZSB0YXJnZXQgY2Fubm90IGFuc3dlclxuICogc2lsZW50bHksIHRydXRoIHdpbnMgb3ZlciBub2lzZSDigJQgZmFsbCB0aHJvdWdoLlxuICovXG5mdW5jdGlvbiByZXNlcnZlZFJlYWQodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwgc3RhdGU6IFJlYWN0aXZlU3RhdGUsIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgICBpZiAocHJvcCA9PT0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSkgcmV0dXJuICgpID0+IHRhcmdldC5nZXRWYWx1ZSgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkpIHJldHVybiBNRVRIT0RfUk9VVEVTW3Byb3BdPy4odGFyZ2V0LCBzdGF0ZSk7XG4gIGlmIChwcm9wID09PSAndG9KU09OJyAmJiBzaWxlbnRseUtub3duS2V5KHRhcmdldCwgcHJvcCkgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gU1RBVEVfS0VZO1xufVxuXG4vKipcbiAqIEEgd3JhcHBhYmxlIHN0YXRlIHZhbHVlIGJlY29tZXMgdGhlIGFycmF5IG9yIG5lc3RlZCBwcm94eSBmb3IgaXRzIGtleTtcbiAqIGFueXRoaW5nIGVsc2UgaXMgaGFuZGVkIGJhY2sgcmF3LiBgc2NvcGUuayA9PT0gc2NvcGUua2AgaG9sZHMgd2l0aGluIGFcbiAqIHN0YWdlIHRocm91Z2ggdGhlIHNhbWUgcGVyLW1lbWJlciBjYWNoZSBldmVyeSBvYmplY3QgcHJveHkgdXNlc1xuICogKGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKTogYSB3cml0ZSB0byB0aGUga2V5IGRyb3BzIHRoZSBlbnRyeSAodGhlXG4gKiBzaW5rIGRvZXMgaXQpLCBhIGNvbW1pdCBzd2FwcyB0aGUgdmFsdWUgYW5kIHRoZSByZWYgY2hlY2sgbWlzc2VzIOKAlCBlaXRoZXJcbiAqIHdheSB0aGUgbmV4dCByZWFkIGJ1aWxkcyBhIGZyZXNoIHByb3h5IG92ZXIgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gd3JhcFN0YXRlVmFsdWUoXG4gIHRhcmdldDogUmVhY3RpdmVUYXJnZXQsXG4gIHJlYWRTaWxlbnQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93bixcbiAgc3RhdGU6IFJlYWN0aXZlU3RhdGUsXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTsgLy8gRGF0ZSwgTWFwLCBjbGFzcyBpbnN0YW5jZSwgZnJvemVuIOKAplxuICByZXR1cm4gY2FjaGVkTWVtYmVyKFxuICAgIHN0YXRlLmNoaWxkQ2FjaGUsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHNpbmsgPSByb290S2V5U2luayh0YXJnZXQsIHJlYWRTaWxlbnQsIGtleSwgc3RhdGUuY2hpbGRDYWNoZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgW10pO1xuICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBbXSwgbmV3IFNldDxvYmplY3Q+KFt2YWx1ZV0pKTtcbiAgICB9LFxuICAgIFtdLFxuICApO1xufVxuXG4vKiogV0hZOiBhIGAkYC1uYW1lIGNhbiBuZXZlciBiZSBhIHN0YXRlIGtleSDigJQgdGhlIHdyaXRlIGlzIHJlZnVzZWQsIG5vdCBzaGFkb3dlZDsgZXZlcnkgb3RoZXIgYXNzaWdubWVudFxuICogIHN0b3JlcyB0aGUgdmFsdWUgQVMgQVNTSUdORUQgKGEgaGFuZGxlIGJlY29tZXMgd2hhdCBpdCBzdGFuZHMgZm9yLCBgaGFuZGxlcy50c2A7IHRoZSBidWZmZXIgZGV0YWNoZXMgYXRcbiAqICBjb21taXQg4oCUIHRoZSBzYW1lIGxhdyBhcyBgJHNldFZhbHVlYCwgOS4yNC4wKSBhbmQgZHJvcHMgdGhlIGtleSdzIGNhY2hlZCBwcm94eS4gKi9cbmZ1bmN0aW9uIGFzc2lnblN0YXRlS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMoa2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3Qgc2V0IHN0YXRlIGtleSBcIiR7a2V5fVwiIC0tIGl0IGNvbmZsaWN0cyB3aXRoIGEgcmVzZXJ2ZWQgVHlwZWRTY29wZSBtZXRob2QuIFJlbmFtZSB0aGUgc3RhdGUga2V5IHRvIGF2b2lkICQtcHJlZml4ZWQgbmFtZXMuYCxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zZXRWYWx1ZShrZXksIHVud3JhcEhhbmRsZXModmFsdWUpKTtcbiAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUoa2V5KTtcbn1cblxuLyoqIERvZXMgdGhlIGtleSBleGlzdCDigJQgYW5zd2VyZWQgd2l0aG91dCBhIHRyYWNrZWQgcmVhZCB3aGVyZXZlciB0aGUgdGFyZ2V0IGNhbjsgYGdldFZhbHVlYCBpcyB0aGUgbGFzdCByZXNvcnQuICovXG5mdW5jdGlvbiBrbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodGFyZ2V0Lmhhc0tleSkgcmV0dXJuIHRhcmdldC5oYXNLZXkoa2V5KTtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbiAgcmV0dXJuIHRhcmdldC5nZXRWYWx1ZShrZXkpICE9PSB1bmRlZmluZWQ7IC8vIGZhbGxiYWNrOiBmaXJlcyBvblJlYWQgKGFjY2VwdGFibGUgZGVncmFkYXRpb24pXG59XG5cbi8qKiBFdmVyeSBzdGF0ZSBrZXkg4oCUIHNpbGVudGx5IHdoZXJlIHRoZSB0YXJnZXQgY2FuLCBlbHNlIGZyb20gYSB3aG9sZS1zdGF0ZSByZWFkLiAqL1xuZnVuY3Rpb24gc3RhdGVLZXlzKHRhcmdldDogUmVhY3RpdmVUYXJnZXQpOiBzdHJpbmdbXSB7XG4gIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpO1xuICBjb25zdCBzbmFwc2hvdCA9IHRhcmdldC5nZXRWYWx1ZSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gc25hcHNob3QgJiYgdHlwZW9mIHNuYXBzaG90ID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKHNuYXBzaG90KSA6IFtdO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgcHJveHkgKHRoZSBtYWluIFR5cGVkU2NvcGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlcyBhIFR5cGVkU2NvcGU8VD4gcHJveHkgd3JhcHBpbmcgYSBSZWFjdGl2ZVRhcmdldC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHVuZGVybHlpbmcgc2NvcGUgKFNjb3BlRmFjYWRlIG9yIGFueSBSZWFjdGl2ZVRhcmdldClcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiAoYnJlYWtQaXBlbGluZSBpbmplY3Rpb24pXG4gKiBAcmV0dXJucyBBIFByb3h5IHdpdGggdHlwZWQgcHJvcGVydHkgYWNjZXNzIGFuZCAkLXByZWZpeGVkIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVkU2NvcGU8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwgb3B0aW9ucz86IFJlYWN0aXZlT3B0aW9ucyk6IFR5cGVkU2NvcGU8VD4ge1xuICBjb25zdCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSA9IHsgYnJlYWtGbjogb3B0aW9ucz8uYnJlYWtQaXBlbGluZSwgY2hpbGRDYWNoZTogbmV3IE1lbWJlckNhY2hlKCkgfTtcbiAgLy8gQmluZCB0aGUgc2lsZW50IHJlYWQgb25jZSDigJQgdGhlIG5lc3RlZC9hcnJheSBwcm94aWVzIHJlc29sdmUgdGhlaXIgbGl2ZSB2aWV3IHRocm91Z2ggaXQuXG4gIGNvbnN0IHJlYWRTaWxlbnQgPSAodGFyZ2V0LmdldFZhbHVlU2lsZW50ID8/IHRhcmdldC5nZXRWYWx1ZSkuYmluZCh0YXJnZXQpO1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCBhcyB1bmtub3duIGFzIFR5cGVkU2NvcGU8VD4sIHtcbiAgICBnZXQoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBjb25zdCBhbnN3ZXJlZCA9IHJlc2VydmVkUmVhZCh0YXJnZXQsIHN0YXRlLCBwcm9wKTtcbiAgICAgIGlmIChhbnN3ZXJlZCAhPT0gU1RBVEVfS0VZKSByZXR1cm4gYW5zd2VyZWQ7XG4gICAgICAvLyBBIHN0YXRlIGtleTogT05FIHRyYWNrZWQgcmVhZCAoZmlyZXMgb25SZWFkIG9uY2UpLCB0aGVuIHRoZSB3cmFwcGVyLlxuICAgICAgcmV0dXJuIHdyYXBTdGF0ZVZhbHVlKHRhcmdldCwgcmVhZFNpbGVudCwgc3RhdGUsIHByb3AgYXMgc3RyaW5nLCB0YXJnZXQuZ2V0VmFsdWUocHJvcCBhcyBzdHJpbmcpKTtcbiAgICB9LFxuICAgIHNldChfcHJveHlUYXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSBhc3NpZ25TdGF0ZUtleSh0YXJnZXQsIHN0YXRlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICB0YXJnZXQuZGVsZXRlVmFsdWUocHJvcCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaGFzKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCk7XG4gICAgICByZXR1cm4gU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSB8fCBrbm93bktleSh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gICAgb3duS2V5czogKCkgPT4gc3RhdGVLZXlzKHRhcmdldCksXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyB8fCBTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkOyAvLyAkLW1ldGhvZHMgYXJlIG5vbi1lbnVtZXJhYmxlXG4gICAgICBpZiAoIWtub3duS2V5KHRhcmdldCwgcHJvcCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH07IC8vIHRoZSB2YWx1ZSBpcyBmZXRjaGVkIHZpYSB0aGUgZ2V0IHRyYXBcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHByb3h5LCB7XG4gICAgdGFyZ2V0LFxuICAgIGhhbmRsZXNBc3NpZ25tZW50czogdHJ1ZSxcbiAgICBzZXRCcmVhazogKGZuKSA9PiB7XG4gICAgICBzdGF0ZS5icmVha0ZuID0gZm47XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=