@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,1175 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ resolve
5
+ } from "./chunk-XWHIN7CC.js";
6
+ import {
7
+ create
8
+ } from "./chunk-Y5I45PEB.js";
9
+ import {
10
+ forceSourceRefresh,
11
+ inSyncTransactionFiber,
12
+ makeTaskRunner
13
+ } from "./chunk-LYBBX6WM.js";
14
+ import {
15
+ makeMatch,
16
+ makeMatchTag
17
+ } from "./chunk-3U4CAKCX.js";
18
+ import {
19
+ Tag
20
+ } from "./chunk-ZWE3P6X2.js";
21
+ import {
22
+ getRuntimeInternals,
23
+ setBoundInternals
24
+ } from "./chunk-6FKWRVP4.js";
25
+ import {
26
+ isDevEnv
27
+ } from "./chunk-GP37MEGJ.js";
28
+ import {
29
+ make
30
+ } from "./chunk-ILFVY7H5.js";
31
+ import {
32
+ currentDiagnosticsLevel,
33
+ record,
34
+ toSerializableErrorSummary
35
+ } from "./chunk-4KIYG5E4.js";
36
+ import {
37
+ RunSessionTag
38
+ } from "./chunk-O57OZBDR.js";
39
+
40
+ // ../logix-core/src/internal/runtime/core/mutativePatches.ts
41
+ var toPatchPathString = (path) => {
42
+ if (typeof path === "string") {
43
+ const trimmed = path.trim();
44
+ return trimmed.length > 0 ? trimmed : void 0;
45
+ }
46
+ if (!Array.isArray(path)) return void 0;
47
+ const parts = [];
48
+ for (const seg of path) {
49
+ if (typeof seg === "string") {
50
+ if (seg.length > 0) parts.push(seg);
51
+ continue;
52
+ }
53
+ if (typeof seg === "number" && Number.isFinite(seg)) {
54
+ parts.push(String(Math.floor(seg)));
55
+ continue;
56
+ }
57
+ }
58
+ if (parts.length === 0) return "*";
59
+ return parts.join(".");
60
+ };
61
+ var mutateWithPatchPaths = (base, mutator) => {
62
+ const out = create(base, mutator, {
63
+ enablePatches: {
64
+ pathAsArray: true,
65
+ arrayLengthAssignment: false
66
+ }
67
+ });
68
+ if (!Array.isArray(out)) {
69
+ return { nextState: out, patchPaths: [] };
70
+ }
71
+ const nextState = out[0];
72
+ const patches = out[1] ?? [];
73
+ const set = /* @__PURE__ */ new Set();
74
+ for (const patch of patches) {
75
+ const p = toPatchPathString(patch?.path);
76
+ if (!p) continue;
77
+ set.add(p);
78
+ }
79
+ return {
80
+ nextState,
81
+ patchPaths: Array.from(set)
82
+ };
83
+ };
84
+
85
+ // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
86
+ import { Context as Context3, Effect as Effect3, FiberRef, Option, Schema, Stream } from "../effect.js";
87
+
88
+ // ../logix-core/src/internal/runtime/core/Lifecycle.ts
89
+ import { Cause, Context, Effect, Ref } from "../effect.js";
90
+ var LifecycleContext = Context.GenericTag(
91
+ "@logix/LifecycleManager"
92
+ );
93
+ var safeRun = (label, eff) => eff.pipe(
94
+ Effect.matchCauseEffect({
95
+ onSuccess: () => Effect.void,
96
+ onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
97
+ })
98
+ );
99
+ var makeTaskId = (kind, order) => `${kind}:${order}`;
100
+ var makeLifecycleManager = (identity) => Effect.gen(function* () {
101
+ const budgets = {
102
+ maxEventsPerInstance: 20,
103
+ maxEventBytes: 4 * 1024
104
+ };
105
+ const statusRef = yield* Ref.make({
106
+ identity,
107
+ status: "creating"
108
+ });
109
+ const initRequired = [];
110
+ const start = [];
111
+ const destroy = [];
112
+ const platformSuspend = [];
113
+ const platformResume = [];
114
+ const platformReset = [];
115
+ const onErrorHandlers = [];
116
+ const getStatus = Ref.get(statusRef);
117
+ const recordPhase = (phase, name, payload) => record({
118
+ type: "lifecycle:phase",
119
+ moduleId: identity.moduleId,
120
+ instanceId: identity.instanceId,
121
+ phase,
122
+ name,
123
+ payload
124
+ });
125
+ const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
126
+ ...prev,
127
+ identity: {
128
+ ...prev.identity,
129
+ ...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
130
+ },
131
+ status,
132
+ ...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
133
+ ...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
134
+ }));
135
+ const registerInitRequired = (effect, options) => {
136
+ const order = initRequired.length;
137
+ initRequired.push({
138
+ taskId: makeTaskId("initRequired", order),
139
+ kind: "initRequired",
140
+ order,
141
+ name: options?.name,
142
+ effect
143
+ });
144
+ };
145
+ const registerStart = (effect, options) => {
146
+ const order = start.length;
147
+ start.push({
148
+ taskId: makeTaskId("start", order),
149
+ kind: "start",
150
+ order,
151
+ name: options?.name,
152
+ fatalOnFailure: options?.fatalOnFailure,
153
+ effect
154
+ });
155
+ };
156
+ const registerDestroy = (effect, options) => {
157
+ const order = destroy.length;
158
+ destroy.push({
159
+ taskId: makeTaskId("destroy", order),
160
+ kind: "destroy",
161
+ order,
162
+ name: options?.name,
163
+ effect
164
+ });
165
+ };
166
+ const registerOnError = (handler) => {
167
+ onErrorHandlers.push(handler);
168
+ };
169
+ const registerPlatformSuspend = (effect, options) => {
170
+ const order = platformSuspend.length;
171
+ platformSuspend.push({
172
+ taskId: makeTaskId("platformSuspend", order),
173
+ kind: "platformSuspend",
174
+ order,
175
+ name: options?.name,
176
+ effect
177
+ });
178
+ };
179
+ const registerPlatformResume = (effect, options) => {
180
+ const order = platformResume.length;
181
+ platformResume.push({
182
+ taskId: makeTaskId("platformResume", order),
183
+ kind: "platformResume",
184
+ order,
185
+ name: options?.name,
186
+ effect
187
+ });
188
+ };
189
+ const registerPlatformReset = (effect, options) => {
190
+ const order = platformReset.length;
191
+ platformReset.push({
192
+ taskId: makeTaskId("platformReset", order),
193
+ kind: "platformReset",
194
+ order,
195
+ name: options?.name,
196
+ effect
197
+ });
198
+ };
199
+ const notifyError = (cause, context) => {
200
+ if (Cause.isInterrupted(cause)) {
201
+ return Effect.void;
202
+ }
203
+ return record({
204
+ type: "lifecycle:error",
205
+ moduleId: context.moduleId,
206
+ instanceId: context.instanceId,
207
+ cause,
208
+ phase: context.phase,
209
+ hook: context.hook,
210
+ taskId: context.taskId,
211
+ txnSeq: context.txnSeq,
212
+ opSeq: context.opSeq,
213
+ origin: context.origin
214
+ }).pipe(
215
+ Effect.zipRight(
216
+ Effect.forEach(
217
+ onErrorHandlers,
218
+ (handler) => handler(cause, context).pipe(
219
+ Effect.catchAllCause(
220
+ (inner) => Effect.logError(
221
+ `[lifecycle.onError] failed: ${Cause.pretty(inner)}`
222
+ )
223
+ )
224
+ ),
225
+ { discard: true }
226
+ )
227
+ )
228
+ );
229
+ };
230
+ const runInitRequired = Effect.gen(function* () {
231
+ const total = initRequired.length;
232
+ if (total === 0) {
233
+ yield* setStatus("ready", {
234
+ initProgress: { total: 0, completed: 0 },
235
+ initOutcome: { status: "success" }
236
+ });
237
+ return;
238
+ }
239
+ const startedAt = Date.now();
240
+ yield* recordPhase("init", "initRequired:start", { total });
241
+ yield* setStatus("initializing", {
242
+ initProgress: { total, completed: 0, current: 0, startedAt }
243
+ });
244
+ let completed = 0;
245
+ for (let i = 0; i < initRequired.length; i++) {
246
+ yield* setStatus("initializing", {
247
+ initProgress: { total, completed, current: i, startedAt }
248
+ });
249
+ const task = initRequired[i];
250
+ const exit = yield* Effect.exit(task.effect);
251
+ if (exit._tag === "Success") {
252
+ completed += 1;
253
+ yield* setStatus("initializing", {
254
+ initProgress: { total, completed, current: i + 1, startedAt }
255
+ });
256
+ continue;
257
+ }
258
+ const summary = toSerializableErrorSummary(exit.cause);
259
+ yield* notifyError(exit.cause, {
260
+ phase: "init",
261
+ hook: "initRequired",
262
+ moduleId: identity.moduleId,
263
+ instanceId: identity.instanceId,
264
+ taskId: task.taskId,
265
+ origin: "initRequired"
266
+ });
267
+ yield* setStatus("failed", {
268
+ initProgress: { total, completed, current: i, startedAt },
269
+ initOutcome: { status: "failure", error: summary.errorSummary }
270
+ });
271
+ return yield* Effect.failCause(exit.cause);
272
+ }
273
+ yield* recordPhase("init", "initRequired:success", { total });
274
+ yield* setStatus("ready", {
275
+ initProgress: { total, completed, current: total, startedAt },
276
+ initOutcome: { status: "success" }
277
+ });
278
+ });
279
+ const runStart = recordPhase("run", "start:schedule", {
280
+ total: start.length
281
+ }).pipe(
282
+ Effect.zipRight(
283
+ Effect.forEach(
284
+ start,
285
+ (task) => Effect.forkScoped(
286
+ task.effect.pipe(
287
+ Effect.catchAllCause(
288
+ (cause) => notifyError(cause, {
289
+ phase: "run",
290
+ hook: "start",
291
+ moduleId: identity.moduleId,
292
+ instanceId: identity.instanceId,
293
+ taskId: task.taskId,
294
+ origin: "start"
295
+ })
296
+ )
297
+ )
298
+ ).pipe(Effect.asVoid),
299
+ { discard: true, concurrency: "unbounded" }
300
+ )
301
+ )
302
+ );
303
+ const runDestroy = Effect.gen(function* () {
304
+ yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
305
+ yield* setStatus("terminating");
306
+ for (let i = destroy.length - 1; i >= 0; i--) {
307
+ const task = destroy[i];
308
+ yield* safeRun(
309
+ "lifecycle.onDestroy",
310
+ task.effect.pipe(
311
+ Effect.catchAllCause(
312
+ (cause) => notifyError(cause, {
313
+ phase: "destroy",
314
+ hook: "destroy",
315
+ moduleId: identity.moduleId,
316
+ instanceId: identity.instanceId,
317
+ taskId: task.taskId,
318
+ origin: "destroy"
319
+ })
320
+ )
321
+ )
322
+ );
323
+ }
324
+ yield* setStatus("terminated");
325
+ yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
326
+ });
327
+ const runPlatformSuspend = Effect.gen(function* () {
328
+ if (platformSuspend.length === 0) return;
329
+ yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
330
+ for (const task of platformSuspend) {
331
+ yield* safeRun(
332
+ "lifecycle.onSuspend",
333
+ task.effect.pipe(
334
+ Effect.catchAllCause(
335
+ (cause) => notifyError(cause, {
336
+ phase: "platform",
337
+ hook: "suspend",
338
+ moduleId: identity.moduleId,
339
+ instanceId: identity.instanceId,
340
+ taskId: task.taskId,
341
+ origin: "platform.suspend"
342
+ })
343
+ )
344
+ )
345
+ );
346
+ }
347
+ });
348
+ const runPlatformResume = Effect.gen(function* () {
349
+ if (platformResume.length === 0) return;
350
+ yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
351
+ for (const task of platformResume) {
352
+ yield* safeRun(
353
+ "lifecycle.onResume",
354
+ task.effect.pipe(
355
+ Effect.catchAllCause(
356
+ (cause) => notifyError(cause, {
357
+ phase: "platform",
358
+ hook: "resume",
359
+ moduleId: identity.moduleId,
360
+ instanceId: identity.instanceId,
361
+ taskId: task.taskId,
362
+ origin: "platform.resume"
363
+ })
364
+ )
365
+ )
366
+ );
367
+ }
368
+ });
369
+ const runPlatformReset = Effect.gen(function* () {
370
+ if (platformReset.length === 0) return;
371
+ yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
372
+ for (const task of platformReset) {
373
+ yield* safeRun(
374
+ "lifecycle.onReset",
375
+ task.effect.pipe(
376
+ Effect.catchAllCause(
377
+ (cause) => notifyError(cause, {
378
+ phase: "platform",
379
+ hook: "reset",
380
+ moduleId: identity.moduleId,
381
+ instanceId: identity.instanceId,
382
+ taskId: task.taskId,
383
+ origin: "platform.reset"
384
+ })
385
+ )
386
+ )
387
+ );
388
+ }
389
+ });
390
+ const getTaskSnapshot = Effect.sync(() => ({
391
+ initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
392
+ start: start.map(({ effect: _eff, ...rest }) => rest),
393
+ destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
394
+ platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
395
+ platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
396
+ platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
397
+ }));
398
+ const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
399
+ return {
400
+ identity,
401
+ budgets,
402
+ registerPlatformSuspend,
403
+ registerPlatformResume,
404
+ registerPlatformReset,
405
+ registerInitRequired,
406
+ registerStart,
407
+ registerDestroy,
408
+ registerOnError,
409
+ getStatus,
410
+ setStatus,
411
+ notifyError,
412
+ runPlatformSuspend,
413
+ runPlatformResume,
414
+ runPlatformReset,
415
+ runInitRequired,
416
+ runStart,
417
+ runDestroy,
418
+ hasOnErrorHandlers,
419
+ getTaskSnapshot
420
+ };
421
+ });
422
+
423
+ // ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
424
+ import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
425
+ var phaseDiagnosticsEnabled = () => isDevEnv();
426
+ var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
427
+ var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
428
+ let pretty;
429
+ try {
430
+ pretty = Cause2.pretty(cause, { renderErrorCause: true });
431
+ } catch {
432
+ return;
433
+ }
434
+ if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
435
+ return;
436
+ }
437
+ yield* record({
438
+ type: "diagnostic",
439
+ moduleId,
440
+ code: "logic::env_service_not_found",
441
+ severity: "warning",
442
+ message: pretty,
443
+ hint: "Logic attempted to access an Env service before it was provided. This is a known initialization timing noise in Runtime/React integration. If it happens once during early startup and everything works afterward, it's likely harmless; if it persists or correlates with app issues, verify Runtime.make / RuntimeProvider.layer provides the service."
444
+ });
445
+ yield* record({
446
+ type: "diagnostic",
447
+ moduleId,
448
+ code: "logic::invalid_phase",
449
+ severity: "error",
450
+ message: "$.use is not allowed before Env is fully ready.",
451
+ hint: "Avoid reading services during setup or before Env is ready; move Env access to the Logic run section, or wrap init via $.lifecycle.onInitRequired.",
452
+ kind: "env_service_not_ready"
453
+ });
454
+ });
455
+ var LogicPhaseServiceTag = Context2.GenericTag(
456
+ "@logix/LogicPhaseService"
457
+ );
458
+ var LogicUnitServiceTag = class extends Context2.Tag("@logix/LogicUnitService")() {
459
+ };
460
+ var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(
461
+ new Error(
462
+ `[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`
463
+ ),
464
+ {
465
+ _tag: "LogicPhaseError",
466
+ kind,
467
+ api,
468
+ phase,
469
+ moduleId
470
+ }
471
+ );
472
+ var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
473
+ if (!phaseDiagnosticsEnabled()) {
474
+ return;
475
+ }
476
+ const allErrors = [
477
+ ...Cause2.failures(cause),
478
+ ...Cause2.defects(cause)
479
+ ];
480
+ for (const err of allErrors) {
481
+ const logicErr = err;
482
+ if (logicErr && logicErr._tag === "LogicPhaseError") {
483
+ const phaseErr = logicErr;
484
+ const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "The setup phase must not read Env/services or run long-lived logic; move the relevant calls to the run phase." : phaseErr.kind === "lifecycle_in_run" ? "Do not register $.lifecycle.* in the run phase (setup-only). Move lifecycle registrations to the synchronous part of Module.logic builder (before return)." : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "Traits are frozen after setup; move $.traits.declare to LogicPlan.setup or the setup registration phase of Module.logic builder." : "Move logic to the run phase; keep setup for registrations only.";
485
+ yield* record({
486
+ type: "diagnostic",
487
+ moduleId: phaseErr.moduleId ?? moduleId,
488
+ code: "logic::invalid_phase",
489
+ severity: "error",
490
+ message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
491
+ hint,
492
+ kind: phaseErr.kind
493
+ });
494
+ return;
495
+ }
496
+ }
497
+ });
498
+
499
+ // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
500
+ var LogicBuilderFactory = (runtime, runtimeInternals) => {
501
+ const flowApi = make(runtime, runtimeInternals);
502
+ return (stream, triggerName) => {
503
+ const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
504
+ const taskRunnerRuntime = {
505
+ moduleId: runtime.moduleId,
506
+ instanceId: runtimeInternals.instanceId,
507
+ runWithStateTransaction,
508
+ resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
509
+ };
510
+ const builder = {
511
+ debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
512
+ flowApi.debounce(ms)(stream),
513
+ triggerName
514
+ ),
515
+ throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
516
+ flowApi.throttle(ms)(stream),
517
+ triggerName
518
+ ),
519
+ filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(
520
+ flowApi.filter(predicate)(stream),
521
+ triggerName
522
+ ),
523
+ map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(
524
+ stream.pipe(Stream.map(f)),
525
+ triggerName
526
+ ),
527
+ run(eff, options) {
528
+ return flowApi.run(eff, options)(stream);
529
+ },
530
+ runLatest(eff, options) {
531
+ return flowApi.runLatest(eff, options)(stream);
532
+ },
533
+ runExhaust(eff, options) {
534
+ return flowApi.runExhaust(eff, options)(stream);
535
+ },
536
+ runParallel(eff, options) {
537
+ return flowApi.runParallel(eff, options)(stream);
538
+ },
539
+ runFork: (eff) => Effect3.forkScoped(flowApi.run(eff)(stream)).pipe(
540
+ Effect3.asVoid
541
+ ),
542
+ runParallelFork: (eff) => Effect3.forkScoped(
543
+ flowApi.runParallel(eff)(stream)
544
+ ).pipe(
545
+ Effect3.asVoid
546
+ ),
547
+ runTask: (config) => makeTaskRunner(
548
+ stream,
549
+ "task",
550
+ taskRunnerRuntime,
551
+ {
552
+ ...config,
553
+ triggerName: config.triggerName ?? triggerName
554
+ }
555
+ ),
556
+ runParallelTask: (config) => makeTaskRunner(
557
+ stream,
558
+ "parallel",
559
+ taskRunnerRuntime,
560
+ {
561
+ ...config,
562
+ triggerName: config.triggerName ?? triggerName
563
+ }
564
+ ),
565
+ runLatestTask: (config) => makeTaskRunner(
566
+ stream,
567
+ "latest",
568
+ taskRunnerRuntime,
569
+ {
570
+ ...config,
571
+ triggerName: config.triggerName ?? triggerName
572
+ }
573
+ ),
574
+ runExhaustTask: (config) => makeTaskRunner(
575
+ stream,
576
+ "exhaust",
577
+ taskRunnerRuntime,
578
+ {
579
+ ...config,
580
+ triggerName: config.triggerName ?? triggerName
581
+ }
582
+ ),
583
+ toStream: () => stream,
584
+ update: (reducer) => Stream.runForEach(
585
+ stream,
586
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
587
+ {
588
+ kind: "watcher:update",
589
+ name: triggerName
590
+ },
591
+ () => Effect3.gen(function* () {
592
+ const prev = yield* runtime.getState;
593
+ const next = reducer(prev, payload);
594
+ if (Effect3.isEffect(next)) {
595
+ const exit = yield* Effect3.exit(
596
+ next
597
+ );
598
+ if (exit._tag === "Failure") {
599
+ yield* Effect3.logError("Flow error", exit.cause);
600
+ return;
601
+ }
602
+ yield* runtime.setState(exit.value);
603
+ return;
604
+ }
605
+ yield* runtime.setState(next);
606
+ })
607
+ )
608
+ ).pipe(
609
+ Effect3.catchAllCause(
610
+ (cause) => Effect3.logError("Flow error", cause)
611
+ )
612
+ ),
613
+ mutate: (reducer) => Stream.runForEach(
614
+ stream,
615
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
616
+ {
617
+ kind: "watcher:mutate",
618
+ name: triggerName
619
+ },
620
+ () => Effect3.gen(function* () {
621
+ const prev = yield* runtime.getState;
622
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
623
+ const { nextState, patchPaths } = mutateWithPatchPaths(
624
+ prev,
625
+ (draft) => {
626
+ reducer(draft, payload);
627
+ }
628
+ );
629
+ for (const path of patchPaths) {
630
+ recordPatch?.({
631
+ path,
632
+ reason: "watcher:mutate"
633
+ });
634
+ }
635
+ yield* runtime.setState(nextState);
636
+ })
637
+ )
638
+ ).pipe(
639
+ Effect3.catchAllCause(
640
+ (cause) => Effect3.logError("Flow error", cause)
641
+ )
642
+ )
643
+ };
644
+ const andThen = (handlerOrEff) => {
645
+ if (typeof handlerOrEff === "function") {
646
+ if (handlerOrEff.length >= 2) {
647
+ return builder.update(handlerOrEff);
648
+ }
649
+ return builder.run(handlerOrEff);
650
+ }
651
+ return builder.run(handlerOrEff);
652
+ };
653
+ const pipe = function() {
654
+ const fns = arguments;
655
+ let acc = builder;
656
+ for (let i = 0; i < fns.length; i++) {
657
+ acc = fns[i](acc);
658
+ }
659
+ return acc;
660
+ };
661
+ return Object.assign(builder, { pipe, andThen });
662
+ };
663
+ };
664
+ function make2(shape, runtime, options) {
665
+ const runtimeInternals = getRuntimeInternals(runtime);
666
+ const getPhase = options?.getPhase ?? (() => "run");
667
+ const getCurrentPhase = () => {
668
+ const phaseService = options?.phaseService;
669
+ const phase = phaseService?.current ?? getPhase();
670
+ return phase === "setup" ? "setup" : "run";
671
+ };
672
+ const guardRunOnly = (kind, api2) => {
673
+ const phaseService = options?.phaseService;
674
+ const phase = phaseService?.current ?? getPhase();
675
+ if (phase === "setup") {
676
+ throw makeLogicPhaseError(
677
+ kind,
678
+ api2,
679
+ "setup",
680
+ options?.moduleId
681
+ );
682
+ }
683
+ };
684
+ const flowApi = make(runtime, runtimeInternals);
685
+ const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
686
+ const withLifecycle = (available, missing) => Effect3.serviceOption(LifecycleContext).pipe(
687
+ Effect3.flatMap(
688
+ (maybe) => Option.match(maybe, {
689
+ onSome: available,
690
+ onNone: missing
691
+ })
692
+ )
693
+ );
694
+ const withPlatform = (invoke) => Effect3.serviceOption(Tag).pipe(
695
+ Effect3.flatMap(
696
+ (maybe) => Option.match(maybe, {
697
+ onSome: invoke,
698
+ onNone: () => Effect3.void
699
+ })
700
+ )
701
+ );
702
+ const emitSetupOnlyViolation = (api2) => record({
703
+ type: "diagnostic",
704
+ moduleId: runtime.moduleId,
705
+ instanceId: runtime.instanceId,
706
+ code: "logic::invalid_phase",
707
+ severity: "error",
708
+ message: `${api2} is setup-only and is not allowed in run phase.`,
709
+ hint: "Move $.lifecycle.* calls to the synchronous part of Module.logic builder (before return) for registration; for dynamic resource cleanup in the run phase, use Effect.acquireRelease / Scope finalizer instead of registering onDestroy late.",
710
+ kind: "lifecycle_in_run"
711
+ });
712
+ const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
713
+ const onceInRunSession = (key) => Effect3.serviceOption(RunSessionTag).pipe(
714
+ Effect3.map(
715
+ (maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true
716
+ )
717
+ );
718
+ let cachedDiagnosticsLevel;
719
+ const isModuleLike = (value) => Boolean(
720
+ value && typeof value === "object" && ((value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value) && Context3.isTag(value.tag)
721
+ );
722
+ const buildModuleHandle = (tag, rt) => {
723
+ const actionsProxy = new Proxy(
724
+ {},
725
+ {
726
+ get: (_target, prop) => (payload) => rt.dispatch({
727
+ _tag: prop,
728
+ payload
729
+ })
730
+ }
731
+ );
732
+ const handle = {
733
+ read: (selector) => Effect3.map(rt.getState, selector),
734
+ changes: rt.changes,
735
+ dispatch: rt.dispatch,
736
+ actions$: rt.actions$,
737
+ actions: actionsProxy
738
+ };
739
+ const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
740
+ const extend = tag?.[EXTEND_HANDLE];
741
+ return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
742
+ };
743
+ const emitModuleDescriptorOnce = (module, rt) => Effect3.gen(function* () {
744
+ if (cachedDiagnosticsLevel === "off") return;
745
+ const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
746
+ const shouldEmit = yield* onceInRunSession(key);
747
+ if (!shouldEmit) return;
748
+ const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
749
+ const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
750
+ const internal = module[internalSymbol];
751
+ const logicUnits = (internal?.mounted ?? []).map((u) => ({
752
+ kind: String(u?.kind ?? "user"),
753
+ id: String(u?.id ?? ""),
754
+ derived: u?.derived ? true : void 0,
755
+ name: typeof u?.name === "string" ? u.name : void 0
756
+ }));
757
+ const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
758
+ const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
759
+ const source = module.dev?.source;
760
+ const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
761
+ const traits = traitsSnapshot ? {
762
+ digest: traitsSnapshot.digest,
763
+ count: traitsSnapshot.traits.length
764
+ } : void 0;
765
+ const data = {
766
+ id: module.id,
767
+ moduleId: String(rt.moduleId),
768
+ instanceId: String(rt.instanceId),
769
+ actionKeys,
770
+ logicUnits,
771
+ schemaKeys,
772
+ meta,
773
+ source,
774
+ traits
775
+ };
776
+ yield* record({
777
+ type: "trace:module:descriptor",
778
+ moduleId: rt.moduleId,
779
+ instanceId: rt.instanceId,
780
+ data
781
+ });
782
+ });
783
+ const resolveModuleRuntime = (tag) => Effect3.gen(function* () {
784
+ const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
785
+ const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : runtime.moduleId;
786
+ if (requestedModuleId && requestedModuleId === runtime.moduleId) {
787
+ return runtime;
788
+ }
789
+ const fromImports = runtimeInternals.imports.get(
790
+ tag
791
+ );
792
+ if (fromImports) {
793
+ return fromImports;
794
+ }
795
+ if (typeof options?.moduleId !== "string") {
796
+ const fromEnv = yield* Effect3.serviceOption(tag);
797
+ if (Option.isSome(fromEnv)) {
798
+ return fromEnv.value;
799
+ }
800
+ }
801
+ const tokenId = requestedModuleId ?? "<unknown module id>";
802
+ const fix = isDevEnv() ? [
803
+ "- Provide the child implementation in the same scope (imports).",
804
+ ` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
805
+ "- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
806
+ " and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
807
+ ] : [];
808
+ const err = new Error(
809
+ isDevEnv() ? [
810
+ "[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
811
+ "",
812
+ `tokenId: ${tokenId}`,
813
+ "entrypoint: logic.$.use",
814
+ "mode: strict",
815
+ `from: ${fromModuleId ?? "<unknown module id>"}`,
816
+ `startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
817
+ "",
818
+ "fix:",
819
+ ...fix
820
+ ].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
821
+ );
822
+ err.tokenId = tokenId;
823
+ err.entrypoint = "logic.$.use";
824
+ err.mode = "strict";
825
+ err.from = fromModuleId;
826
+ err.startScope = {
827
+ moduleId: fromModuleId,
828
+ instanceId: String(runtime.instanceId ?? "<unknown>")
829
+ };
830
+ err.fix = fix;
831
+ err.name = "MissingModuleRuntimeError";
832
+ return yield* Effect3.die(err);
833
+ });
834
+ const stateApi = {
835
+ read: runtime.getState,
836
+ update: (f) => Effect3.gen(function* () {
837
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
838
+ if (inTxn) {
839
+ const prev = yield* runtime.getState;
840
+ return yield* runtime.setState(f(prev));
841
+ }
842
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
843
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
844
+ { kind: "state", name: "update" },
845
+ body
846
+ ) : body();
847
+ }),
848
+ mutate: (f) => Effect3.gen(function* () {
849
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
850
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
851
+ if (inTxn) {
852
+ const prev = yield* runtime.getState;
853
+ const { nextState, patchPaths } = mutateWithPatchPaths(
854
+ prev,
855
+ (draft) => {
856
+ f(draft);
857
+ }
858
+ );
859
+ for (const path of patchPaths) {
860
+ recordPatch?.({
861
+ path,
862
+ reason: "state:mutate"
863
+ });
864
+ }
865
+ return yield* runtime.setState(nextState);
866
+ }
867
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => {
868
+ const { nextState, patchPaths } = mutateWithPatchPaths(
869
+ prev,
870
+ (draft) => {
871
+ f(draft);
872
+ }
873
+ );
874
+ for (const path of patchPaths) {
875
+ recordPatch?.({
876
+ path,
877
+ reason: "state:mutate"
878
+ });
879
+ }
880
+ return runtime.setState(nextState);
881
+ });
882
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
883
+ { kind: "state", name: "mutate" },
884
+ body
885
+ ) : body();
886
+ }),
887
+ ref: runtime.ref
888
+ };
889
+ const actionsApi = new Proxy({}, {
890
+ get: (_target, prop) => {
891
+ if (prop === "dispatch") {
892
+ return (a) => runtime.dispatch(a);
893
+ }
894
+ if (prop === "actions$") {
895
+ return runtime.actions$;
896
+ }
897
+ return (payload) => runtime.dispatch({ _tag: prop, payload });
898
+ }
899
+ });
900
+ const matchApi = (value) => makeMatch(value);
901
+ const matchTagApi = (value) => makeMatchTag(value);
902
+ const reducer = (tag, fn) => {
903
+ return Effect3.sync(() => {
904
+ runtimeInternals.txn.registerReducer(String(tag), fn);
905
+ });
906
+ };
907
+ const api = {
908
+ root: {
909
+ resolve: (tag) => {
910
+ guardRunOnly("root_resolve_in_setup", "$.root.resolve");
911
+ return resolve(tag, {
912
+ entrypoint: "logic.$.root.resolve",
913
+ waitForReady: true
914
+ });
915
+ }
916
+ },
917
+ state: stateApi,
918
+ actions: actionsApi,
919
+ flow: flowApi,
920
+ match: matchApi,
921
+ matchTag: matchTagApi,
922
+ lifecycle: {
923
+ onInitRequired: (eff) => {
924
+ if (getCurrentPhase() === "run") {
925
+ return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
926
+ }
927
+ runtimeInternals.lifecycle.registerInitRequired(eff);
928
+ return Effect3.void;
929
+ },
930
+ onStart: (eff) => {
931
+ if (getCurrentPhase() === "run") {
932
+ return emitSetupOnlyViolation("$.lifecycle.onStart");
933
+ }
934
+ runtimeInternals.lifecycle.registerStart(eff);
935
+ return Effect3.void;
936
+ },
937
+ onInit: (eff) => {
938
+ if (getCurrentPhase() === "run") {
939
+ return emitSetupOnlyViolation("$.lifecycle.onInit");
940
+ }
941
+ runtimeInternals.lifecycle.registerInitRequired(eff);
942
+ return Effect3.void;
943
+ },
944
+ onDestroy: (eff) => {
945
+ if (getCurrentPhase() === "run") {
946
+ return emitSetupOnlyViolation("$.lifecycle.onDestroy");
947
+ }
948
+ runtimeInternals.lifecycle.registerDestroy(eff);
949
+ return Effect3.void;
950
+ },
951
+ onError: (handler) => {
952
+ if (getCurrentPhase() === "run") {
953
+ return emitSetupOnlyViolation("$.lifecycle.onError");
954
+ }
955
+ runtimeInternals.lifecycle.registerOnError(handler);
956
+ return Effect3.void;
957
+ },
958
+ onSuspend: (eff) => {
959
+ if (getCurrentPhase() === "run") {
960
+ return emitSetupOnlyViolation("$.lifecycle.onSuspend");
961
+ }
962
+ runtimeInternals.lifecycle.registerPlatformSuspend(
963
+ Effect3.asVoid(eff)
964
+ );
965
+ return Effect3.void;
966
+ },
967
+ onResume: (eff) => {
968
+ if (getCurrentPhase() === "run") {
969
+ return emitSetupOnlyViolation("$.lifecycle.onResume");
970
+ }
971
+ runtimeInternals.lifecycle.registerPlatformResume(
972
+ Effect3.asVoid(eff)
973
+ );
974
+ return Effect3.void;
975
+ },
976
+ onReset: (eff) => {
977
+ if (getCurrentPhase() === "run") {
978
+ return emitSetupOnlyViolation("$.lifecycle.onReset");
979
+ }
980
+ runtimeInternals.lifecycle.registerPlatformReset(
981
+ Effect3.asVoid(eff)
982
+ );
983
+ return Effect3.void;
984
+ }
985
+ },
986
+ traits: {
987
+ declare: (traits) => {
988
+ if (getCurrentPhase() === "run") {
989
+ throw makeLogicPhaseError(
990
+ "traits_declare_in_run",
991
+ "$.traits.declare",
992
+ "run",
993
+ options?.moduleId
994
+ );
995
+ }
996
+ if (!traits || typeof traits !== "object") {
997
+ throw new Error(
998
+ "[InvalidTraitsDeclaration] $.traits.declare expects an object."
999
+ );
1000
+ }
1001
+ const logicUnit = options?.logicUnit ?? {
1002
+ logicUnitId: "unknown",
1003
+ logicUnitIdKind: "derived",
1004
+ logicUnitLabel: "logicUnit:unknown",
1005
+ path: void 0
1006
+ };
1007
+ runtimeInternals.traits.registerModuleTraitsContribution({
1008
+ traits,
1009
+ provenance: {
1010
+ originType: "logicUnit",
1011
+ originId: logicUnit.logicUnitId,
1012
+ originIdKind: logicUnit.logicUnitIdKind,
1013
+ originLabel: logicUnit.logicUnitLabel,
1014
+ path: logicUnit.path
1015
+ }
1016
+ });
1017
+ },
1018
+ source: {
1019
+ refresh: (fieldPath, options2) => Effect3.gen(function* () {
1020
+ const handler = runtimeInternals.traits.getSourceRefreshHandler(
1021
+ fieldPath
1022
+ );
1023
+ if (!handler) {
1024
+ return yield* Effect3.void;
1025
+ }
1026
+ const force = options2?.force === true;
1027
+ const runHandler = (state) => force ? Effect3.locally(forceSourceRefresh, true)(
1028
+ handler(state)
1029
+ ) : handler(state);
1030
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
1031
+ if (inTxn) {
1032
+ const state = yield* runtime.getState;
1033
+ return yield* runHandler(state);
1034
+ }
1035
+ return yield* runtimeInternals.txn.runWithStateTransaction(
1036
+ {
1037
+ kind: "source-refresh",
1038
+ name: fieldPath
1039
+ },
1040
+ () => Effect3.gen(function* () {
1041
+ const state = yield* runtime.getState;
1042
+ return yield* runHandler(state);
1043
+ })
1044
+ );
1045
+ })
1046
+ }
1047
+ },
1048
+ reducer,
1049
+ use: new Proxy(() => {
1050
+ }, {
1051
+ apply: (_target, _thisArg, [arg]) => {
1052
+ guardRunOnly("use_in_setup", "$.use");
1053
+ if (isModuleLike(arg)) {
1054
+ const domain = arg;
1055
+ const tag = domain.tag;
1056
+ const resolveAndBuild = resolveModuleRuntime(tag).pipe(
1057
+ Effect3.map((rt) => buildModuleHandle(tag, rt))
1058
+ );
1059
+ const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
1060
+ Effect3.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
1061
+ Effect3.map((rt) => buildModuleHandle(tag, rt))
1062
+ );
1063
+ const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
1064
+ Effect3.tap((level) => {
1065
+ cachedDiagnosticsLevel = level;
1066
+ }),
1067
+ Effect3.flatMap(
1068
+ (level) => level === "off" ? resolveAndBuild : resolveWithDescriptor
1069
+ )
1070
+ );
1071
+ return Effect3.suspend(() => {
1072
+ if (cachedDiagnosticsLevel === "off") {
1073
+ return resolveAndBuild;
1074
+ }
1075
+ if (cachedDiagnosticsLevel !== void 0) {
1076
+ return resolveWithDescriptor;
1077
+ }
1078
+ return detectAndSelect;
1079
+ });
1080
+ }
1081
+ if (Context3.isTag(arg)) {
1082
+ const candidate = arg;
1083
+ if (candidate._kind === "ModuleTag") {
1084
+ return resolveModuleRuntime(arg).pipe(
1085
+ Effect3.map(
1086
+ (rt) => buildModuleHandle(arg, rt)
1087
+ )
1088
+ );
1089
+ }
1090
+ return arg;
1091
+ }
1092
+ return Effect3.die("BoundApi.use: unsupported argument");
1093
+ }
1094
+ }),
1095
+ onAction: new Proxy(() => {
1096
+ }, {
1097
+ apply: (_target, _thisArg, args) => {
1098
+ guardRunOnly("use_in_setup", "$.onAction");
1099
+ const arg = args[0];
1100
+ if (typeof arg === "function") {
1101
+ return createIntentBuilder(
1102
+ runtime.actions$.pipe(Stream.filter(arg))
1103
+ );
1104
+ }
1105
+ if (typeof arg === "string") {
1106
+ return createIntentBuilder(
1107
+ runtime.actions$.pipe(
1108
+ Stream.filter((a) => a._tag === arg || a.type === arg)
1109
+ ),
1110
+ arg
1111
+ );
1112
+ }
1113
+ if (typeof arg === "object" && arg !== null) {
1114
+ if ("_tag" in arg) {
1115
+ return createIntentBuilder(
1116
+ runtime.actions$.pipe(
1117
+ Stream.filter((a) => a._tag === arg._tag)
1118
+ ),
1119
+ String(arg._tag)
1120
+ );
1121
+ }
1122
+ if (Schema.isSchema(arg)) {
1123
+ return createIntentBuilder(
1124
+ runtime.actions$.pipe(
1125
+ Stream.filter((a) => {
1126
+ const result = Schema.decodeUnknownSync(
1127
+ arg
1128
+ )(a);
1129
+ return !!result;
1130
+ })
1131
+ )
1132
+ );
1133
+ }
1134
+ }
1135
+ return createIntentBuilder(runtime.actions$);
1136
+ },
1137
+ get: (_target, prop) => {
1138
+ guardRunOnly("use_in_setup", "$.onAction");
1139
+ if (typeof prop === "string") {
1140
+ return createIntentBuilder(
1141
+ runtime.actions$.pipe(
1142
+ Stream.filter(
1143
+ (a) => a._tag === prop || a.type === prop
1144
+ )
1145
+ ),
1146
+ prop
1147
+ );
1148
+ }
1149
+ return void 0;
1150
+ }
1151
+ }),
1152
+ onState: (selector) => {
1153
+ guardRunOnly("use_in_setup", "$.onState");
1154
+ return createIntentBuilder(runtime.changes(selector));
1155
+ },
1156
+ on: (stream) => {
1157
+ guardRunOnly("use_in_setup", "$.on");
1158
+ return createIntentBuilder(stream);
1159
+ }
1160
+ };
1161
+ setBoundInternals(api, runtimeInternals);
1162
+ return api;
1163
+ }
1164
+
1165
+ export {
1166
+ mutateWithPatchPaths,
1167
+ LifecycleContext,
1168
+ makeLifecycleManager,
1169
+ emitEnvServiceNotFoundDiagnosticIfNeeded,
1170
+ LogicPhaseServiceTag,
1171
+ LogicUnitServiceTag,
1172
+ emitInvalidPhaseDiagnosticIfNeeded,
1173
+ make2 as make
1174
+ };
1175
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvQm91bmRBcGlSdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9MaWZlY3ljbGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNyZWF0ZSwgdHlwZSBQYXRjaGVzIH0gZnJvbSBcIm11dGF0aXZlXCJcblxuZXhwb3J0IHR5cGUgUGF0Y2hQYXRoID0gc3RyaW5nXG5cbmNvbnN0IHRvUGF0Y2hQYXRoU3RyaW5nID0gKHBhdGg6IHVua25vd24pOiBQYXRjaFBhdGggfCBcIipcIiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBwYXRoLnRyaW0oKVxuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgPyB0cmltbWVkIDogdW5kZWZpbmVkXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwYXJ0czogQXJyYXk8c3RyaW5nPiA9IFtdXG4gIGZvciAoY29uc3Qgc2VnIG9mIHBhdGgpIHtcbiAgICBpZiAodHlwZW9mIHNlZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHNlZy5sZW5ndGggPiAwKSBwYXJ0cy5wdXNoKHNlZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VnID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShzZWcpKSB7XG4gICAgICBwYXJ0cy5wdXNoKFN0cmluZyhNYXRoLmZsb29yKHNlZykpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cblxuICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gXCIqXCJcbiAgcmV0dXJuIHBhcnRzLmpvaW4oXCIuXCIpXG59XG5cbmV4cG9ydCBjb25zdCBtdXRhdGVXaXRoUGF0Y2hQYXRocyA9IDxTPihcbiAgYmFzZTogUyxcbiAgbXV0YXRvcjogKGRyYWZ0OiBTKSA9PiB2b2lkLFxuKTogeyByZWFkb25seSBuZXh0U3RhdGU6IFM7IHJlYWRvbmx5IHBhdGNoUGF0aHM6IFJlYWRvbmx5QXJyYXk8UGF0Y2hQYXRoIHwgXCIqXCI+IH0gPT4ge1xuICBjb25zdCBvdXQgPSBjcmVhdGUoYmFzZSwgbXV0YXRvciBhcyBhbnksIHtcbiAgICBlbmFibGVQYXRjaGVzOiB7XG4gICAgICBwYXRoQXNBcnJheTogdHJ1ZSxcbiAgICAgIGFycmF5TGVuZ3RoQXNzaWdubWVudDogZmFsc2UsXG4gICAgfSxcbiAgfSkgYXMgdW5rbm93blxuXG4gIGlmICghQXJyYXkuaXNBcnJheShvdXQpKSB7XG4gICAgcmV0dXJuIHsgbmV4dFN0YXRlOiBvdXQgYXMgUywgcGF0Y2hQYXRoczogW10gfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gb3V0WzBdIGFzIFNcbiAgY29uc3QgcGF0Y2hlcyA9IChvdXRbMV0gPz8gW10pIGFzIFBhdGNoZXM8eyBwYXRoQXNBcnJheTogdHJ1ZTsgYXJyYXlMZW5ndGhBc3NpZ25tZW50OiBmYWxzZSB9PlxuXG4gIGNvbnN0IHNldCA9IG5ldyBTZXQ8UGF0Y2hQYXRoIHwgXCIqXCI+KClcbiAgZm9yIChjb25zdCBwYXRjaCBvZiBwYXRjaGVzKSB7XG4gICAgY29uc3QgcCA9IHRvUGF0Y2hQYXRoU3RyaW5nKChwYXRjaCBhcyBhbnkpPy5wYXRoKVxuICAgIGlmICghcCkgY29udGludWVcbiAgICBzZXQuYWRkKHApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5leHRTdGF0ZSxcbiAgICBwYXRjaFBhdGhzOiBBcnJheS5mcm9tKHNldCksXG4gIH1cbn1cblxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgRmliZXJSZWYsIE9wdGlvbiwgU2NoZW1hLCBTdHJlYW0sIFN1YnNjcmlwdGlvblJlZiB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSBcIm11dGF0aXZlXCJcbmltcG9ydCB0eXBlICogYXMgTG9naXggZnJvbSBcIi4vbW9kdWxlLmpzXCJcbmltcG9ydCAqIGFzIExvZ2ljIGZyb20gXCIuL0xvZ2ljTWlkZGxld2FyZS5qc1wiXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gXCIuL1Rhc2tSdW5uZXIuanNcIlxuaW1wb3J0IHsgbXV0YXRlV2l0aFBhdGNoUGF0aHMgfSBmcm9tIFwiLi9tdXRhdGl2ZVBhdGNoZXMuanNcIlxuaW1wb3J0ICogYXMgRmxvd1J1bnRpbWUgZnJvbSBcIi4vRmxvd1J1bnRpbWUuanNcIlxuaW1wb3J0ICogYXMgTWF0Y2hCdWlsZGVyIGZyb20gXCIuL01hdGNoQnVpbGRlci5qc1wiXG5pbXBvcnQgKiBhcyBQbGF0Zm9ybSBmcm9tIFwiLi9QbGF0Zm9ybS5qc1wiXG5pbXBvcnQgKiBhcyBMaWZlY3ljbGUgZnJvbSBcIi4vTGlmZWN5Y2xlLmpzXCJcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gXCIuL0RlYnVnU2luay5qc1wiXG5pbXBvcnQgKiBhcyBMb2dpY0RpYWdub3N0aWNzIGZyb20gXCIuL0xvZ2ljRGlhZ25vc3RpY3MuanNcIlxuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tIFwiLi9lbnYuanNcIlxuaW1wb3J0IHsgUnVuU2Vzc2lvblRhZyB9IGZyb20gXCIuLi8uLi9vYnNlcnZhYmlsaXR5L3J1blNlc3Npb24uanNcIlxuaW1wb3J0ICogYXMgUm9vdCBmcm9tIFwiLi4vLi4vcm9vdC5qc1wiXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVJbnRlcm5hbHMgfSBmcm9tIFwiLi9SdW50aW1lSW50ZXJuYWxzLmpzXCJcbmltcG9ydCB0eXBlICogYXMgTW9kdWxlVHJhaXRzIGZyb20gXCIuL01vZHVsZVRyYWl0cy5qc1wiXG5pbXBvcnQge1xuICBnZXRSdW50aW1lSW50ZXJuYWxzLFxuICBzZXRCb3VuZEludGVybmFscyxcbn0gZnJvbSBcIi4vcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzXCJcbmltcG9ydCB0eXBlIHtcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIFN0YXRlT2YsXG4gIEFjdGlvbk9mLFxufSBmcm9tIFwiLi9tb2R1bGUuanNcIlxuXG4vLyBcdTY3MkNcdTU3MzBcdTY3ODRcdTkwMjAgSW50ZW50QnVpbGRlciBcdTVERTVcdTUzODJcdUZGMENcdTdCNDlcdTRFRjdcdTRFOEVcdTUzOUYgaW50ZXJuYWwvZHNsL0xvZ2ljQnVpbGRlci5tYWtlSW50ZW50QnVpbGRlckZhY3RvcnlcbmNvbnN0IExvZ2ljQnVpbGRlckZhY3RvcnkgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiA9IG5ldmVyPihcbiAgcnVudGltZTogTW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PixcbiAgcnVudGltZUludGVybmFsczogUnVudGltZUludGVybmFscyxcbikgPT4ge1xuICBjb25zdCBmbG93QXBpID0gRmxvd1J1bnRpbWUubWFrZTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscylcblxuICByZXR1cm4gPFQ+KFxuICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxUPixcbiAgICB0cmlnZ2VyTmFtZT86IHN0cmluZyxcbiAgKTogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPT4ge1xuICAgIGNvbnN0IHJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJSdW50aW1lW1wicnVuV2l0aFN0YXRlVHJhbnNhY3Rpb25cIl0gPVxuICAgICAgKG9yaWdpbiwgYm9keSkgPT4gcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24ob3JpZ2luIGFzIGFueSwgYm9keSlcblxuXHQgICAgY29uc3QgdGFza1J1bm5lclJ1bnRpbWU6IFRhc2tSdW5uZXIuVGFza1J1bm5lclJ1bnRpbWUgPSB7XG5cdCAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuXHQgICAgICBpbnN0YW5jZUlkOiBydW50aW1lSW50ZXJuYWxzLmluc3RhbmNlSWQsXG5cdCAgICAgIHJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uLFxuXHQgICAgICByZXNvbHZlQ29uY3VycmVuY3lQb2xpY3k6IHJ1bnRpbWVJbnRlcm5hbHMuY29uY3VycmVuY3kucmVzb2x2ZUNvbmN1cnJlbmN5UG9saWN5LFxuXHQgICAgfVxuXG5cdCAgICBjb25zdCBidWlsZGVyID0ge1xuXHQgICAgICBkZWJvdW5jZTogKG1zOiBudW1iZXIpID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBmbG93QXBpLmRlYm91bmNlPFQ+KG1zKShzdHJlYW0pLFxuXHQgICAgICAgICAgdHJpZ2dlck5hbWUsXG5cdCAgICAgICAgKSxcblx0ICAgICAgdGhyb3R0bGU6IChtczogbnVtYmVyKSA9PlxuXHQgICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKFxuXHQgICAgICAgICAgZmxvd0FwaS50aHJvdHRsZTxUPihtcykoc3RyZWFtKSxcblx0ICAgICAgICAgIHRyaWdnZXJOYW1lLFxuXHQgICAgICAgICksXG5cdCAgICAgIGZpbHRlcjogKHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKSA9PlxuXHQgICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKFxuXHQgICAgICAgICAgZmxvd0FwaS5maWx0ZXIocHJlZGljYXRlKShzdHJlYW0pLFxuXHQgICAgICAgICAgdHJpZ2dlck5hbWUsXG5cdCAgICAgICAgKSxcblx0ICAgICAgbWFwOiA8VT4oZjogKHZhbHVlOiBUKSA9PiBVKSA9PlxuXHQgICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKFxuXHQgICAgICAgICAgc3RyZWFtLnBpcGUoU3RyZWFtLm1hcChmKSksXG5cdCAgICAgICAgICB0cmlnZ2VyTmFtZSxcblx0ICAgICAgICApLFxuICAgICAgcnVuPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bjxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuTGF0ZXN0PEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bkxhdGVzdDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuRXhoYXVzdDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6XG4gICAgICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgICAgIHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5FeGhhdXN0PFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5QYXJhbGxlbDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6XG4gICAgICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgICAgIHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5QYXJhbGxlbDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuRm9yazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KVxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4gPT5cbiAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoZmxvd0FwaS5ydW48VCwgQSwgRSwgUjI+KGVmZikoc3RyZWFtKSkucGlwZShcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkLFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+LFxuICAgICAgcnVuUGFyYWxsZWxGb3JrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiA9PlxuICAgICAgICBFZmZlY3QuZm9ya1Njb3BlZChcbiAgICAgICAgICBmbG93QXBpLnJ1blBhcmFsbGVsPFQsIEEsIEUsIFIyPihlZmYpKHN0cmVhbSksXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkLFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+LFxuICAgICAgcnVuVGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwidGFza1wiLFxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5QYXJhbGxlbFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBcInBhcmFsbGVsXCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1bkxhdGVzdFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBcImxhdGVzdFwiLFxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5FeGhhdXN0VGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwiZXhoYXVzdFwiLFxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICB0b1N0cmVhbTogKCkgPT4gc3RyZWFtLFxuICAgICAgdXBkYXRlOiAoXG4gICAgICAgIHJlZHVjZXI6IChcbiAgICAgICAgICBwcmV2OiBTdGF0ZU9mPFNoPixcbiAgICAgICAgICBwYXlsb2FkOiBUXG4gICAgICAgICkgPT5cbiAgICAgICAgICB8IFN0YXRlT2Y8U2g+XG4gICAgICAgICAgfCBFZmZlY3QuRWZmZWN0PFN0YXRlT2Y8U2g+LCBhbnksIGFueT5cbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogXCJ3YXRjaGVyOnVwZGF0ZVwiLFxuICAgICAgICAgICAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcmVkdWNlcihwcmV2LCBwYXlsb2FkKVxuICAgICAgICAgICAgICAgIGlmIChFZmZlY3QuaXNFZmZlY3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQoXG4gICAgICAgICAgICAgICAgICAgIG5leHQgYXMgRWZmZWN0LkVmZmVjdDxTdGF0ZU9mPFNoPiwgYW55LCBhbnk+LFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgaWYgKGV4aXQuX3RhZyA9PT0gXCJGYWlsdXJlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcihcIkZsb3cgZXJyb3JcIiwgZXhpdC5jYXVzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShleGl0LnZhbHVlIGFzIFN0YXRlT2Y8U2g+KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHQgYXMgU3RhdGVPZjxTaD4pXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcIkZsb3cgZXJyb3JcIiwgY2F1c2UpXG4gICAgICAgICAgKVxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICBtdXRhdGU6IChcbiAgICAgICAgcmVkdWNlcjogKGRyYWZ0OiBMb2dpYy5EcmFmdDxTdGF0ZU9mPFNoPj4sIHBheWxvYWQ6IFQpID0+IHZvaWRcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogXCJ3YXRjaGVyOm11dGF0ZVwiLFxuICAgICAgICAgICAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRQYXRjaCA9IHJ1bnRpbWVJbnRlcm5hbHM/LnR4bi5yZWNvcmRTdGF0ZVBhdGNoXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMoXG4gICAgICAgICAgICAgICAgICBwcmV2IGFzIFN0YXRlT2Y8U2g+LFxuICAgICAgICAgICAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlZHVjZXIoZHJhZnQgYXMgTG9naWMuRHJhZnQ8U3RhdGVPZjxTaD4+LCBwYXlsb2FkKVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgICAgICAgICAgcmVjb3JkUGF0Y2g/Lih7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogXCJ3YXRjaGVyOm11dGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShuZXh0U3RhdGUpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcIkZsb3cgZXJyb3JcIiwgY2F1c2UpXG4gICAgICAgICAgKVxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgfSBhcyBPbWl0PExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+LCBcInBpcGVcIiB8IFwiYW5kVGhlblwiPlxuXG4gICAgY29uc3QgYW5kVGhlbjogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5bXCJhbmRUaGVuXCJdID0gKFxuICAgICAgaGFuZGxlck9yRWZmOiBhbnksXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlck9yRWZmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGhhbmRsZXJPckVmZi5sZW5ndGggPj0gMikge1xuICAgICAgICAgIHJldHVybiAoYnVpbGRlciBhcyBhbnkpLnVwZGF0ZShoYW5kbGVyT3JFZmYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChidWlsZGVyIGFzIGFueSkucnVuKGhhbmRsZXJPckVmZilcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYnVpbGRlciBhcyBhbnkpLnJ1bihoYW5kbGVyT3JFZmYpXG4gICAgfVxuXG4gICAgY29uc3QgcGlwZTogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5bXCJwaXBlXCJdID0gZnVuY3Rpb24gKHRoaXM6IHVua25vd24pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIGNvbnN0IGZucyA9IGFyZ3VtZW50cyBhcyB1bmtub3duIGFzIFJlYWRvbmx5QXJyYXk8XG4gICAgICAgIChzZWxmOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPikgPT4gTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5cbiAgICAgID5cbiAgICAgIGxldCBhY2M6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+ID0gYnVpbGRlciBhcyBMb2dpYy5JbnRlbnRCdWlsZGVyPFxuICAgICAgICBULFxuICAgICAgICBTaCxcbiAgICAgICAgUlxuICAgICAgPlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWNjID0gZm5zW2ldKGFjYylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihidWlsZGVyLCB7IHBpcGUsIGFuZFRoZW4gfSkgYXMgTG9naWMuSW50ZW50QnVpbGRlcjxcbiAgICAgIFQsXG4gICAgICBTaCxcbiAgICAgIFJcbiAgICA+XG4gIH1cbn1cbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tIFwiLi9tb2R1bGUuanNcIlxuXG4vKipcbiAqIEJvdW5kQXBpIFx1NUI5RVx1NzNCMFx1RkYxQVx1NEUzQVx1NjdEMFx1NEUwMFx1N0M3QiBTdG9yZSBTaGFwZSArIFJ1bnRpbWUgXHU1MjFCXHU1RUZBXHU5ODg0XHU3RUQxXHU1QjlBXHU3Njg0IGAkYFx1MzAwMlxuICpcbiAqIFx1OEJGNFx1NjYwRVx1RkYxQVx1N0M3Qlx1NTc4Qlx1NEUwRVx1NTE2NVx1NTNFM1x1N0I3RVx1NTQwRFx1NTcyOCBhcGkvQm91bmRBcGkudHMgXHU0RTJEXHU1OEYwXHU2NjBFXHVGRjBDXHU4RkQ5XHU5MUNDXHU1M0VBXHU2MjdGXHU4RjdEXHU1MTc3XHU0RjUzXHU1QjlFXHU3M0IwXHUzMDAyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlPFNoIGV4dGVuZHMgTG9naXguQW55TW9kdWxlU2hhcGUsIFIgPSBuZXZlcj4oXG4gIHNoYXBlOiBTaCxcbiAgcnVudGltZTogTG9naXguTW9kdWxlUnVudGltZTxMb2dpeC5TdGF0ZU9mPFNoPiwgTG9naXguQWN0aW9uT2Y8U2g+PixcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSBnZXRQaGFzZT86ICgpID0+IFwic2V0dXBcIiB8IFwicnVuXCJcbiAgICByZWFkb25seSBwaGFzZVNlcnZpY2U/OiBMb2dpY0RpYWdub3N0aWNzLkxvZ2ljUGhhc2VTZXJ2aWNlXG4gICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBsb2dpY1VuaXQ/OiBMb2dpY0RpYWdub3N0aWNzLkxvZ2ljVW5pdFNlcnZpY2VcbiAgfVxuICApOiBCb3VuZEFwaTxTaCwgUj4ge1xuICBjb25zdCBydW50aW1lSW50ZXJuYWxzID0gZ2V0UnVudGltZUludGVybmFscyhydW50aW1lIGFzIGFueSlcblxuICBjb25zdCBnZXRQaGFzZSA9IG9wdGlvbnM/LmdldFBoYXNlID8/ICgoKSA9PiBcInJ1blwiKVxuICBjb25zdCBnZXRDdXJyZW50UGhhc2UgPSAoKTogXCJzZXR1cFwiIHwgXCJydW5cIiA9PiB7XG4gICAgY29uc3QgcGhhc2VTZXJ2aWNlID0gb3B0aW9ucz8ucGhhc2VTZXJ2aWNlXG4gICAgY29uc3QgcGhhc2UgPSBwaGFzZVNlcnZpY2U/LmN1cnJlbnQgPz8gZ2V0UGhhc2UoKVxuICAgIHJldHVybiBwaGFzZSA9PT0gXCJzZXR1cFwiID8gXCJzZXR1cFwiIDogXCJydW5cIlxuICB9XG4gIGNvbnN0IGd1YXJkUnVuT25seSA9IChraW5kOiBzdHJpbmcsIGFwaTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcGhhc2VTZXJ2aWNlID0gb3B0aW9ucz8ucGhhc2VTZXJ2aWNlXG4gICAgY29uc3QgcGhhc2UgPSBwaGFzZVNlcnZpY2U/LmN1cnJlbnQgPz8gZ2V0UGhhc2UoKVxuICAgIGlmIChwaGFzZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICB0aHJvdyBMb2dpY0RpYWdub3N0aWNzLm1ha2VMb2dpY1BoYXNlRXJyb3IoXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGFwaSxcbiAgICAgICAgXCJzZXR1cFwiLFxuICAgICAgICBvcHRpb25zPy5tb2R1bGVJZFxuICAgICAgKVxuICAgIH1cbiAgfVxuICBjb25zdCBmbG93QXBpID0gRmxvd1J1bnRpbWUubWFrZTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscylcblxuICBjb25zdCBtYWtlSW50ZW50QnVpbGRlciA9IChydW50aW1lXzogTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4pID0+XG4gICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZV8sIHJ1bnRpbWVJbnRlcm5hbHMpXG4gIGNvbnN0IHdpdGhMaWZlY3ljbGUgPSA8QT4oXG4gICAgYXZhaWxhYmxlOiAoXG4gICAgICBtYW5hZ2VyOiBMaWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlclxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxBLCBuZXZlciwgYW55PixcbiAgICBtaXNzaW5nOiAoKSA9PiBFZmZlY3QuRWZmZWN0PEEsIG5ldmVyLCBhbnk+XG4gICkgPT5cbiAgICBFZmZlY3Quc2VydmljZU9wdGlvbihMaWZlY3ljbGUuTGlmZWN5Y2xlQ29udGV4dCkucGlwZShcbiAgICAgIEVmZmVjdC5mbGF0TWFwKChtYXliZSkgPT5cbiAgICAgICAgT3B0aW9uLm1hdGNoKG1heWJlLCB7XG4gICAgICAgICAgb25Tb21lOiBhdmFpbGFibGUsXG4gICAgICAgICAgb25Ob25lOiBtaXNzaW5nLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIClcbiAgY29uc3Qgd2l0aFBsYXRmb3JtID0gKFxuICAgIGludm9rZTogKHBsYXRmb3JtOiBQbGF0Zm9ybS5TZXJ2aWNlKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICkgPT5cbiAgICBFZmZlY3Quc2VydmljZU9wdGlvbihQbGF0Zm9ybS5UYWcpLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgobWF5YmUpID0+XG4gICAgICAgIE9wdGlvbi5tYXRjaChtYXliZSwge1xuICAgICAgICAgIG9uU29tZTogaW52b2tlLFxuICAgICAgICAgIG9uTm9uZTogKCkgPT4gRWZmZWN0LnZvaWQsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKVxuXG4gIGNvbnN0IGVtaXRTZXR1cE9ubHlWaW9sYXRpb24gPSAoYXBpOiBzdHJpbmcpOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gICAgRGVidWcucmVjb3JkKHtcbiAgICAgIHR5cGU6IFwiZGlhZ25vc3RpY1wiLFxuICAgICAgbW9kdWxlSWQ6IHJ1bnRpbWUubW9kdWxlSWQsXG4gICAgICBpbnN0YW5jZUlkOiBydW50aW1lLmluc3RhbmNlSWQsXG4gICAgICBjb2RlOiBcImxvZ2ljOjppbnZhbGlkX3BoYXNlXCIsXG4gICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgbWVzc2FnZTogYCR7YXBpfSBpcyBzZXR1cC1vbmx5IGFuZCBpcyBub3QgYWxsb3dlZCBpbiBydW4gcGhhc2UuYCxcbiAgICAgIGhpbnQ6XG4gICAgICAgIFwiTW92ZSAkLmxpZmVjeWNsZS4qIGNhbGxzIHRvIHRoZSBzeW5jaHJvbm91cyBwYXJ0IG9mIE1vZHVsZS5sb2dpYyBidWlsZGVyIChiZWZvcmUgcmV0dXJuKSBmb3IgcmVnaXN0cmF0aW9uOyBcIiArXG4gICAgICAgIFwiZm9yIGR5bmFtaWMgcmVzb3VyY2UgY2xlYW51cCBpbiB0aGUgcnVuIHBoYXNlLCB1c2UgRWZmZWN0LmFjcXVpcmVSZWxlYXNlIC8gU2NvcGUgZmluYWxpemVyIGluc3RlYWQgb2YgcmVnaXN0ZXJpbmcgb25EZXN0cm95IGxhdGUuXCIsXG4gICAgICBraW5kOiBcImxpZmVjeWNsZV9pbl9ydW5cIixcbiAgICB9KVxuXG4gIGNvbnN0IGNyZWF0ZUludGVudEJ1aWxkZXIgPSA8VD4oXG4gICAgc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+LFxuICAgIHRyaWdnZXJOYW1lPzogc3RyaW5nLFxuICApID0+IG1ha2VJbnRlbnRCdWlsZGVyKHJ1bnRpbWUpKHN0cmVhbSwgdHJpZ2dlck5hbWUpXG5cbiAgY29uc3Qgb25jZUluUnVuU2Vzc2lvbiA9IChrZXk6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbiwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKS5waXBlKFxuICAgICAgRWZmZWN0Lm1hcCgobWF5YmUpID0+XG4gICAgICAgIE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUubG9jYWwub25jZShrZXkpIDogdHJ1ZSxcbiAgICAgICksXG4gICAgKVxuXG4gIGxldCBjYWNoZWREaWFnbm9zdGljc0xldmVsOiBEZWJ1Zy5EaWFnbm9zdGljc0xldmVsIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgaXNNb2R1bGVMaWtlID0gKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICApOiB2YWx1ZSBpcyB7XG4gICAgcmVhZG9ubHkgX2tpbmQ6IFwiTW9kdWxlRGVmXCIgfCBcIk1vZHVsZVwiXG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICAgIHJlYWRvbmx5IHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj5cbiAgICByZWFkb25seSBzY2hlbWFzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICByZWFkb25seSBtZXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICByZWFkb25seSBkZXY/OiB7IHJlYWRvbmx5IHNvdXJjZT86IHsgcmVhZG9ubHkgZmlsZTogc3RyaW5nOyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyIH0gfVxuICB9ID0+XG4gICAgQm9vbGVhbihcbiAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAoKCh2YWx1ZSBhcyBhbnkpLl9raW5kID09PSBcIk1vZHVsZURlZlwiIHx8ICh2YWx1ZSBhcyBhbnkpLl9raW5kID09PSBcIk1vZHVsZVwiKSAmJlxuICAgICAgICAgIFwidGFnXCIgaW4gKHZhbHVlIGFzIG9iamVjdCkpICYmXG4gICAgICAgIENvbnRleHQuaXNUYWcoKHZhbHVlIGFzIGFueSkudGFnKSxcbiAgICApXG5cbiAgY29uc3QgYnVpbGRNb2R1bGVIYW5kbGUgPSAoXG4gICAgdGFnOiBDb250ZXh0LlRhZzxhbnksIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+PixcbiAgICBydDogTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4sXG4gICk6IHVua25vd24gPT4ge1xuICAgIGNvbnN0IGFjdGlvbnNQcm94eTogTG9naXguTW9kdWxlSGFuZGxlPGFueT5bXCJhY3Rpb25zXCJdID1cbiAgICAgIG5ldyBQcm94eShcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PlxuICAgICAgICAgICAgKHBheWxvYWQ6IHVua25vd24pID0+XG4gICAgICAgICAgICAgIHJ0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICBfdGFnOiBwcm9wIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICkgYXMgTG9naXguTW9kdWxlSGFuZGxlPGFueT5bXCJhY3Rpb25zXCJdXG5cbiAgICBjb25zdCBoYW5kbGU6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+ID0ge1xuICAgICAgcmVhZDogKHNlbGVjdG9yKSA9PiBFZmZlY3QubWFwKHJ0LmdldFN0YXRlLCBzZWxlY3RvciksXG4gICAgICBjaGFuZ2VzOiBydC5jaGFuZ2VzLFxuICAgICAgZGlzcGF0Y2g6IHJ0LmRpc3BhdGNoLFxuICAgICAgYWN0aW9ucyQ6IHJ0LmFjdGlvbnMkLFxuICAgICAgYWN0aW9uczogYWN0aW9uc1Byb3h5LFxuICAgIH1cblxuICAgIGNvbnN0IEVYVEVORF9IQU5ETEUgPSBTeW1ib2wuZm9yKFwibG9naXgubW9kdWxlLmhhbmRsZS5leHRlbmRcIilcbiAgICBjb25zdCBleHRlbmQgPVxuICAgICAgKHRhZyBhcyBhbnkpPy5bRVhURU5EX0hBTkRMRV0gYXNcbiAgICAgICAgfCAoKFxuICAgICAgICAgICAgcnVudGltZTogTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4sXG4gICAgICAgICAgICBiYXNlOiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PixcbiAgICAgICAgICApID0+IHVua25vd24pXG4gICAgICAgIHwgdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gdHlwZW9mIGV4dGVuZCA9PT0gXCJmdW5jdGlvblwiID8gKGV4dGVuZChydCwgaGFuZGxlKSA/PyBoYW5kbGUpIDogaGFuZGxlXG4gIH1cblxuICBjb25zdCBlbWl0TW9kdWxlRGVzY3JpcHRvck9uY2UgPSAoXG4gICAgbW9kdWxlOiB7XG4gICAgICByZWFkb25seSBpZDogc3RyaW5nXG4gICAgICByZWFkb25seSB0YWc6IGFueVxuICAgICAgcmVhZG9ubHkgc2NoZW1hcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICByZWFkb25seSBtZXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHJlYWRvbmx5IGRldj86IHsgcmVhZG9ubHkgc291cmNlPzogeyByZWFkb25seSBmaWxlOiBzdHJpbmc7IHJlYWRvbmx5IGxpbmU6IG51bWJlcjsgcmVhZG9ubHkgY29sdW1uOiBudW1iZXIgfSB9XG4gICAgfSxcbiAgICBydDogTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4sXG4gICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAvLyBcdTRFM0EgaG90LXBhdGggXHU1MTVDXHU1RTk1XHVGRjFBXHU4QkNBXHU2NUFEXHU3RUE3XHU1MjJCXHU0RTNBIG9mZiBcdTY1RjZcdTZDMzhcdTRFMERcdTUzRDFcdTRFOEJcdTRFRjZcdTMwMDJcbiAgICAgIGlmIChjYWNoZWREaWFnbm9zdGljc0xldmVsID09PSBcIm9mZlwiKSByZXR1cm5cblxuICAgICAgY29uc3Qga2V5ID0gYG1vZHVsZV9kZXNjcmlwdG9yOiR7U3RyaW5nKHJ0Lmluc3RhbmNlSWQgPz8gXCJ1bmtub3duXCIpfWBcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSB5aWVsZCogb25jZUluUnVuU2Vzc2lvbihrZXkpXG4gICAgICBpZiAoIXNob3VsZEVtaXQpIHJldHVyblxuXG4gICAgICBjb25zdCBhY3Rpb25LZXlzID0gT2JqZWN0LmtleXMoKG1vZHVsZS50YWcgYXMgYW55KT8uc2hhcGU/LmFjdGlvbk1hcCA/PyB7fSlcblxuICAgICAgY29uc3QgaW50ZXJuYWxTeW1ib2wgPSBTeW1ib2wuZm9yKFwibG9naXgubW9kdWxlLmludGVybmFsXCIpXG4gICAgICBjb25zdCBpbnRlcm5hbCA9IChtb2R1bGUgYXMgYW55KVtpbnRlcm5hbFN5bWJvbF0gYXNcbiAgICAgICAgfCB7IHJlYWRvbmx5IG1vdW50ZWQ/OiBSZWFkb25seUFycmF5PGFueT4gfVxuICAgICAgICB8IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBsb2dpY1VuaXRzID0gKGludGVybmFsPy5tb3VudGVkID8/IFtdKS5tYXAoKHU6IGFueSkgPT4gKHtcbiAgICAgICAga2luZDogU3RyaW5nKHU/LmtpbmQgPz8gXCJ1c2VyXCIpLFxuICAgICAgICBpZDogU3RyaW5nKHU/LmlkID8/IFwiXCIpLFxuICAgICAgICBkZXJpdmVkOiB1Py5kZXJpdmVkID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmFtZTogdHlwZW9mIHU/Lm5hbWUgPT09IFwic3RyaW5nXCIgPyB1Lm5hbWUgOiB1bmRlZmluZWQsXG4gICAgICB9KSlcblxuICAgICAgY29uc3Qgc2NoZW1hS2V5cyA9XG4gICAgICAgIG1vZHVsZS5zY2hlbWFzICYmIHR5cGVvZiBtb2R1bGUuc2NoZW1hcyA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmtleXMobW9kdWxlLnNjaGVtYXMpXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgbWV0YSA9XG4gICAgICAgIG1vZHVsZS5tZXRhICYmIHR5cGVvZiBtb2R1bGUubWV0YSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5tZXRhIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9IG1vZHVsZS5kZXY/LnNvdXJjZVxuXG4gICAgICBjb25zdCB0cmFpdHNTbmFwc2hvdCA9IHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLmdldE1vZHVsZVRyYWl0c1NuYXBzaG90KClcbiAgICAgIGNvbnN0IHRyYWl0cyA9XG4gICAgICAgIHRyYWl0c1NuYXBzaG90XG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRpZ2VzdDogdHJhaXRzU25hcHNob3QuZGlnZXN0LFxuICAgICAgICAgICAgICBjb3VudDogdHJhaXRzU25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBpZDogbW9kdWxlLmlkLFxuICAgICAgICBtb2R1bGVJZDogU3RyaW5nKHJ0Lm1vZHVsZUlkKSxcbiAgICAgICAgaW5zdGFuY2VJZDogU3RyaW5nKHJ0Lmluc3RhbmNlSWQpLFxuICAgICAgICBhY3Rpb25LZXlzLFxuICAgICAgICBsb2dpY1VuaXRzLFxuICAgICAgICBzY2hlbWFLZXlzLFxuICAgICAgICBtZXRhLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRyYWl0cyxcbiAgICAgIH1cblxuICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwidHJhY2U6bW9kdWxlOmRlc2NyaXB0b3JcIixcbiAgICAgICAgbW9kdWxlSWQ6IHJ0Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBydC5pbnN0YW5jZUlkLFxuICAgICAgICBkYXRhLFxuICAgICAgfSBhcyBhbnkpXG4gICAgfSlcblxuICAvKipcbiAgICogc3RyaWN0XHVGRjFBXHU1M0VBXHU0RUNFXHUyMDFDXHU1RjUzXHU1MjREIEVmZmVjdCBFbnZcdTIwMURcdTg5RTNcdTY3OTBcdTY3RDBcdTRFMkEgTW9kdWxlIFx1NzY4NCBSdW50aW1lXHUzMDAyXG4gICAqXG4gICAqIFx1OEJGNFx1NjYwRVx1RkYxQVxuICAgKiAtIFx1NTkxQSByb290IC8gXHU1OTFBXHU1QjlFXHU0RjhCXHU1NzNBXHU2NjZGXHU0RTBCXHVGRjBDXHU0RUZCXHU0RjU1XHU4RkRCXHU3QTBCXHU3RUE3IHJlZ2lzdHJ5IFx1OTBGRFx1NjVFMFx1NkNENVx1ODg2OFx1OEZCRVx1NkI2M1x1Nzg2RVx1OEJFRFx1NEU0OVx1RkYxQlxuICAgKiAtIFx1N0YzQVx1NTkzMVx1NjNEMFx1NEY5Qlx1ODAwNVx1NUM1RVx1NEU4RVx1ODhDNVx1OTE0RFx1OTUxOVx1OEJFRlx1RkYxQVx1NUZDNVx1OTg3Qlx1N0EzM1x1NUI5QVx1NTkzMVx1OEQyNVx1RkYwQ1x1NUU3Nlx1N0VEOVx1NTFGQVx1NTNFRlx1NEZFRVx1NTkwRFx1NzY4NFx1NjNEMFx1NzkzQVx1RkYwOGRldi90ZXN0IFx1NEUwQlx1NjZGNFx1OEJFNlx1N0VDNlx1RkYwOVx1MzAwMlxuICAgKi9cblx0ICBjb25zdCByZXNvbHZlTW9kdWxlUnVudGltZSA9IChcblx0ICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj5cblx0ICApOiBFZmZlY3QuRWZmZWN0PExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LCBuZXZlciwgYW55PiA9PlxuXHQgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuXHQgICAgICBjb25zdCByZXF1ZXN0ZWRNb2R1bGVJZCA9XG5cdCAgICAgICAgdHlwZW9mICh0YWcgYXMgYW55KT8uaWQgPT09IFwic3RyaW5nXCJcblx0ICAgICAgICAgID8gKCh0YWcgYXMgYW55KS5pZCBhcyBzdHJpbmcpXG5cdCAgICAgICAgICA6IHVuZGVmaW5lZFxuXHQgICAgICBjb25zdCBmcm9tTW9kdWxlSWQgPVxuXHQgICAgICAgIHR5cGVvZiBvcHRpb25zPy5tb2R1bGVJZCA9PT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMubW9kdWxlSWQgOiBydW50aW1lLm1vZHVsZUlkXG5cblx0ICAgICAgLy8gc2VsZlx1RkYxQVx1NTlDQlx1N0VDOFx1NTE0MVx1OEJCOFx1ODlFM1x1Njc5MFx1NTIzMFx1NUY1M1x1NTI0RCBNb2R1bGVSdW50aW1lXHVGRjA4Qm91bmQubWFrZSAvIHJ1bnRpbWUgXHU2Q0U4XHU1MTY1XHU0RTI0XHU2NzYxXHU4REVGXHU1Rjg0XHU5MEZEXHU2MjEwXHU3QUNCXHVGRjA5XG5cdCAgICAgIGlmIChyZXF1ZXN0ZWRNb2R1bGVJZCAmJiByZXF1ZXN0ZWRNb2R1bGVJZCA9PT0gcnVudGltZS5tb2R1bGVJZCkge1xuXHQgICAgICAgIHJldHVybiBydW50aW1lIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cblx0ICAgICAgfVxuXG5cdCAgICAgIGNvbnN0IGZyb21JbXBvcnRzID0gcnVudGltZUludGVybmFscy5pbXBvcnRzLmdldChcblx0ICAgICAgICB0YWcgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxhbnksIGFueT4sXG5cdCAgICAgIClcblx0ICAgICAgaWYgKGZyb21JbXBvcnRzKSB7XG5cdCAgICAgICAgcmV0dXJuIGZyb21JbXBvcnRzIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cblx0ICAgICAgfVxuXG5cdCAgICAgIC8vIEJvdW5kLm1ha2VcdUZGMDhcdTY1RTAgbW9kdWxlSWQgXHU0RTBBXHU0RTBCXHU2NTg3XHVGRjA5XHU1NzNBXHU2NjZGXHVGRjFBXHU1MTQxXHU4QkI4XHU0RUNFXHU1RjUzXHU1MjREIEVmZmVjdCBFbnYgXHU4OUUzXHU2NzkwIG1vZHVsZSBydW50aW1lXHVGRjA4XHU0RkJGXHU0RThFXHU2RDRCXHU4QkQ1L1x1ODExQVx1NjI0Qlx1NjdCNlx1RkYwOVx1MzAwMlxuXHQgICAgICBpZiAodHlwZW9mIG9wdGlvbnM/Lm1vZHVsZUlkICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgICAgY29uc3QgZnJvbUVudiA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbih0YWcgYXMgYW55KVxuXHQgICAgICAgIGlmIChPcHRpb24uaXNTb21lKGZyb21FbnYpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZnJvbUVudi52YWx1ZSBhcyB1bmtub3duIGFzIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgLy8gMikgXHU2NUUwXHU2Q0Q1XHU2MjdFXHU1MjMwXHU2NUY2XHU3NkY0XHU2M0E1IGRpZSBcdTIwMTRcdTIwMTQgXHU4RkQ5XHU2NjJGXHU5MTREXHU3RjZFXHU5NTE5XHU4QkVGXHVGRjBDXHU2M0QwXHU3OTNBXHU4QzAzXHU3NTI4XHU2NUI5XHU0RkVFXHU2QjYzXHU4OEM1XHU5MTREXHU2NUI5XHU1RjBGXG5cdCAgICAgIGNvbnN0IHRva2VuSWQgPSByZXF1ZXN0ZWRNb2R1bGVJZCA/PyBcIjx1bmtub3duIG1vZHVsZSBpZD5cIlxuICAgICAgY29uc3QgZml4OiBzdHJpbmdbXSA9IGlzRGV2RW52KClcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBcIi0gUHJvdmlkZSB0aGUgY2hpbGQgaW1wbGVtZW50YXRpb24gaW4gdGhlIHNhbWUgc2NvcGUgKGltcG9ydHMpLlwiLFxuICAgICAgICAgICAgYCAgRXhhbXBsZTogJHtmcm9tTW9kdWxlSWQgPz8gXCJQYXJlbnRNb2R1bGVcIn0uaW1wbGVtZW50KHsgaW1wb3J0czogWyR7cmVxdWVzdGVkTW9kdWxlSWQgPz8gXCJDaGlsZE1vZHVsZVwifS5pbXBsXSwgLi4uIH0pYCxcbiAgICAgICAgICAgIFwiLSBJZiB5b3UgaW50ZW50aW9uYWxseSB3YW50IGEgcm9vdCBzaW5nbGV0b24sIHByb3ZpZGUgaXQgYXQgYXBwIHJvb3QgKFJ1bnRpbWUubWFrZSguLi4seyBsYXllciB9KSAvIHJvb3QgaW1wb3J0cyksXCIsXG4gICAgICAgICAgICBcIiAgYW5kIHVzZSBSb290LnJlc29sdmUoTW9kdWxlVGFnKSAoaW5zdGVhZCBvZiAkLnVzZSkgYXQgdGhlIGNhbGxzaXRlLlwiLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXVxuXG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgIGlzRGV2RW52KClcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgXCJbTWlzc2luZ01vZHVsZVJ1bnRpbWVFcnJvcl0gQ2Fubm90IHJlc29sdmUgTW9kdWxlUnVudGltZSBmb3IgTW9kdWxlVGFnLlwiLFxuICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICBgdG9rZW5JZDogJHt0b2tlbklkfWAsXG4gICAgICAgICAgICAgIFwiZW50cnlwb2ludDogbG9naWMuJC51c2VcIixcbiAgICAgICAgICAgICAgXCJtb2RlOiBzdHJpY3RcIixcbiAgICAgICAgICAgICAgYGZyb206ICR7ZnJvbU1vZHVsZUlkID8/IFwiPHVua25vd24gbW9kdWxlIGlkPlwifWAsXG4gICAgICAgICAgICAgIGBzdGFydFNjb3BlOiBtb2R1bGVJZD0ke2Zyb21Nb2R1bGVJZCA/PyBcIjx1bmtub3duPlwifSwgaW5zdGFuY2VJZD0ke1N0cmluZyhydW50aW1lLmluc3RhbmNlSWQgPz8gXCI8dW5rbm93bj5cIil9YCxcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgXCJmaXg6XCIsXG4gICAgICAgICAgICAgIC4uLmZpeCxcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIDogXCJbTWlzc2luZ01vZHVsZVJ1bnRpbWVFcnJvcl0gbW9kdWxlIHJ1bnRpbWUgbm90IGZvdW5kXCIsXG4gICAgICApXG5cbiAgICAgIDsoZXJyIGFzIGFueSkudG9rZW5JZCA9IHRva2VuSWRcbiAgICAgIDsoZXJyIGFzIGFueSkuZW50cnlwb2ludCA9IFwibG9naWMuJC51c2VcIlxuICAgICAgOyhlcnIgYXMgYW55KS5tb2RlID0gXCJzdHJpY3RcIlxuICAgICAgOyhlcnIgYXMgYW55KS5mcm9tID0gZnJvbU1vZHVsZUlkXG4gICAgICA7KGVyciBhcyBhbnkpLnN0YXJ0U2NvcGUgPSB7XG4gICAgICAgIG1vZHVsZUlkOiBmcm9tTW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IFN0cmluZyhydW50aW1lLmluc3RhbmNlSWQgPz8gXCI8dW5rbm93bj5cIiksXG4gICAgICB9XG4gICAgICA7KGVyciBhcyBhbnkpLmZpeCA9IGZpeFxuXG4gICAgICBlcnIubmFtZSA9IFwiTWlzc2luZ01vZHVsZVJ1bnRpbWVFcnJvclwiXG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5kaWUoZXJyKVxuICAgIH0pXG5cbiAgY29uc3Qgc3RhdGVBcGk6IEJvdW5kQXBpPFNoLCBSPltcInN0YXRlXCJdID0ge1xuICAgIHJlYWQ6IHJ1bnRpbWUuZ2V0U3RhdGUsXG4gICAgdXBkYXRlOiAoZikgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcbiAgICAgICAgaWYgKGluVHhuKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHlpZWxkKiBydW50aW1lLmdldFN0YXRlXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKGYocHJldikpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gKCkgPT5cbiAgICAgICAgICBFZmZlY3QuZmxhdE1hcChydW50aW1lLmdldFN0YXRlLCAocHJldikgPT4gcnVudGltZS5zZXRTdGF0ZShmKHByZXYpKSlcblxuICAgICAgICByZXR1cm4geWllbGQqIChydW50aW1lSW50ZXJuYWxzXG4gICAgICAgICAgPyBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgICAgeyBraW5kOiBcInN0YXRlXCIsIG5hbWU6IFwidXBkYXRlXCIgfSBhcyBhbnksXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBib2R5KCkpXG4gICAgICB9KSxcbiAgICBtdXRhdGU6IChmKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCByZWNvcmRQYXRjaCA9IHJ1bnRpbWVJbnRlcm5hbHM/LnR4bi5yZWNvcmRTdGF0ZVBhdGNoXG5cbiAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcbiAgICAgICAgaWYgKGluVHhuKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHlpZWxkKiBydW50aW1lLmdldFN0YXRlXG4gICAgICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKFxuICAgICAgICAgICAgcHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPixcbiAgICAgICAgICAgIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgICBmKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PExvZ2l4LlN0YXRlT2Y8U2g+PilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgIHJlY29yZFBhdGNoPy4oe1xuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICByZWFzb246IFwic3RhdGU6bXV0YXRlXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShuZXh0U3RhdGUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gKCkgPT5cbiAgICAgICAgICBFZmZlY3QuZmxhdE1hcChydW50aW1lLmdldFN0YXRlLCAocHJldikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKFxuICAgICAgICAgICAgICBwcmV2IGFzIExvZ2l4LlN0YXRlT2Y8U2g+LFxuICAgICAgICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICBmKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PExvZ2l4LlN0YXRlT2Y8U2g+PilcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgICAgcmVjb3JkUGF0Y2g/Lih7XG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICByZWFzb246IFwic3RhdGU6bXV0YXRlXCIsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBydW50aW1lLnNldFN0YXRlKG5leHRTdGF0ZSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB5aWVsZCogKHJ1bnRpbWVJbnRlcm5hbHNcbiAgICAgICAgICA/IHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgICB7IGtpbmQ6IFwic3RhdGVcIiwgbmFtZTogXCJtdXRhdGVcIiB9IGFzIGFueSxcbiAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGJvZHkoKSlcbiAgICAgIH0pLFxuICAgIHJlZjogcnVudGltZS5yZWYsXG4gIH1cblxuICBjb25zdCBhY3Rpb25zQXBpID0gbmV3IFByb3h5KHt9IGFzIEJvdW5kQXBpPFNoLCBSPltcImFjdGlvbnNcIl0sIHtcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICBpZiAocHJvcCA9PT0gXCJkaXNwYXRjaFwiKSB7XG4gICAgICAgIHJldHVybiAoYTogTG9naXguQWN0aW9uT2Y8U2g+KSA9PiBydW50aW1lLmRpc3BhdGNoKGEpXG4gICAgICB9XG4gICAgICBpZiAocHJvcCA9PT0gXCJhY3Rpb25zJFwiKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lLmFjdGlvbnMkXG4gICAgICB9XG4gICAgICByZXR1cm4gKHBheWxvYWQ6IGFueSkgPT5cbiAgICAgICAgcnVudGltZS5kaXNwYXRjaCh7IF90YWc6IHByb3AgYXMgc3RyaW5nLCBwYXlsb2FkIH0gYXMgTG9naXguQWN0aW9uT2Y8U2g+KVxuICAgIH0sXG4gIH0pXG5cbiAgY29uc3QgbWF0Y2hBcGkgPSA8Vj4odmFsdWU6IFYpOiBMb2dpYy5GbHVlbnRNYXRjaDxWPiA9PlxuICAgIE1hdGNoQnVpbGRlci5tYWtlTWF0Y2godmFsdWUpXG5cbiAgY29uc3QgbWF0Y2hUYWdBcGkgPSA8ViBleHRlbmRzIHsgX3RhZzogc3RyaW5nIH0+KFxuICAgIHZhbHVlOiBWXG4gICk6IExvZ2ljLkZsdWVudE1hdGNoVGFnPFY+ID0+IE1hdGNoQnVpbGRlci5tYWtlTWF0Y2hUYWcodmFsdWUpXG5cbiAgLy8gUHJpbWFyeSBSZWR1Y2VyIFx1NkNFOFx1NTE4Q1x1RkYxQVx1OTAxQVx1OEZDNyBydW50aW1lIFx1NEUwQVx1NzY4NFx1NTE4NVx1OTBFOFx1NkNFOFx1NTE4Q1x1NTFGRFx1NjU3MFx1RkYwOFx1ODJFNVx1NUI1OFx1NTcyOFx1RkYwOVx1NTE5OVx1NTE2NSByZWR1Y2VyIFx1NjYyMFx1NUMwNFx1MzAwMlxuICBjb25zdCByZWR1Y2VyOiBCb3VuZEFwaTxTaCwgUj5bXCJyZWR1Y2VyXCJdID0gKHRhZywgZm4pID0+IHtcbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgcnVudGltZUludGVybmFscy50eG4ucmVnaXN0ZXJSZWR1Y2VyKFN0cmluZyh0YWcpLCBmbiBhcyBhbnkpXG4gICAgfSkgYXMgYW55XG4gIH1cblxuICBjb25zdCBhcGk6IEJvdW5kQXBpPFNoLCBSPiA9IHtcbiAgICByb290OiB7XG4gICAgICByZXNvbHZlOiAodGFnOiBhbnkpID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KFwicm9vdF9yZXNvbHZlX2luX3NldHVwXCIsIFwiJC5yb290LnJlc29sdmVcIilcbiAgICAgICAgcmV0dXJuIFJvb3QucmVzb2x2ZSh0YWcsIHtcbiAgICAgICAgICBlbnRyeXBvaW50OiBcImxvZ2ljLiQucm9vdC5yZXNvbHZlXCIsXG4gICAgICAgICAgd2FpdEZvclJlYWR5OiB0cnVlLFxuICAgICAgICB9KSBhcyBhbnlcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzdGF0ZTogc3RhdGVBcGksXG4gICAgYWN0aW9uczogYWN0aW9uc0FwaSxcbiAgICBmbG93OiBmbG93QXBpLFxuICAgIG1hdGNoOiBtYXRjaEFwaSxcbiAgICBtYXRjaFRhZzogbWF0Y2hUYWdBcGksXG4gICAgbGlmZWN5Y2xlOiB7XG4gICAgICBvbkluaXRSZXF1aXJlZDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uSW5pdFJlcXVpcmVkXCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVySW5pdFJlcXVpcmVkKGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25TdGFydFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclN0YXJ0KGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvbkluaXQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgLy8gbGVnYWN5IGFsaWFzXHVGRjFBXHU4QkVEXHU0RTQ5XHU3QjQ5XHU1NDBDXHU0RThFIG9uSW5pdFJlcXVpcmVkXHVGRjA4XHU0RTNBXHU0RTg2XHU4RkMxXHU3OUZCXHU2NzFGXHU1MUNGXHU1QzExXHU2NDY5XHU2NEU2XHVGRjA5XHUzMDAyXG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25Jbml0XCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVySW5pdFJlcXVpcmVkKGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvbkRlc3Ryb3k6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vbkRlc3Ryb3lcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJEZXN0cm95KGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoXG4gICAgICAgIGhhbmRsZXI6IChcbiAgICAgICAgICBjYXVzZTogaW1wb3J0KFwiZWZmZWN0XCIpLkNhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgICAgIGNvbnRleHQ6IExpZmVjeWNsZS5FcnJvckNvbnRleHQsXG4gICAgICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgUj4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vbkVycm9yXCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyT25FcnJvcihoYW5kbGVyIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uU3VzcGVuZDogKFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vblN1c3BlbmRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQoXG4gICAgICAgICAgRWZmZWN0LmFzVm9pZChlZmYgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uUmVzdW1lOiAoXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uUmVzdW1lXCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUoXG4gICAgICAgICAgRWZmZWN0LmFzVm9pZChlZmYgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uUmVzZXQ6IChcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25SZXNldFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtUmVzZXQoXG4gICAgICAgICAgRWZmZWN0LmFzVm9pZChlZmYgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICB9LFxuICAgIHRyYWl0czoge1xuICAgICAgZGVjbGFyZTogKHRyYWl0czogTW9kdWxlVHJhaXRzLlRyYWl0U3BlYykgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICB0aHJvdyBMb2dpY0RpYWdub3N0aWNzLm1ha2VMb2dpY1BoYXNlRXJyb3IoXG4gICAgICAgICAgICBcInRyYWl0c19kZWNsYXJlX2luX3J1blwiLFxuICAgICAgICAgICAgXCIkLnRyYWl0cy5kZWNsYXJlXCIsXG4gICAgICAgICAgICBcInJ1blwiLFxuICAgICAgICAgICAgb3B0aW9ucz8ubW9kdWxlSWQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiW0ludmFsaWRUcmFpdHNEZWNsYXJhdGlvbl0gJC50cmFpdHMuZGVjbGFyZSBleHBlY3RzIGFuIG9iamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2dpY1VuaXQgPSBvcHRpb25zPy5sb2dpY1VuaXQgPz8ge1xuICAgICAgICAgIGxvZ2ljVW5pdElkOiBcInVua25vd25cIixcbiAgICAgICAgICBsb2dpY1VuaXRJZEtpbmQ6IFwiZGVyaXZlZFwiIGFzIGNvbnN0LFxuICAgICAgICAgIGxvZ2ljVW5pdExhYmVsOiBcImxvZ2ljVW5pdDp1bmtub3duXCIsXG4gICAgICAgICAgcGF0aDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLnJlZ2lzdGVyTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uKHtcbiAgICAgICAgICB0cmFpdHMsXG4gICAgICAgICAgcHJvdmVuYW5jZToge1xuICAgICAgICAgICAgb3JpZ2luVHlwZTogXCJsb2dpY1VuaXRcIixcbiAgICAgICAgICAgIG9yaWdpbklkOiBsb2dpY1VuaXQubG9naWNVbml0SWQsXG4gICAgICAgICAgICBvcmlnaW5JZEtpbmQ6IGxvZ2ljVW5pdC5sb2dpY1VuaXRJZEtpbmQsXG4gICAgICAgICAgICBvcmlnaW5MYWJlbDogbG9naWNVbml0LmxvZ2ljVW5pdExhYmVsLFxuICAgICAgICAgICAgcGF0aDogbG9naWNVbml0LnBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IHtcbiAgICAgICAgcmVmcmVzaDogKFxuICAgICAgICAgIGZpZWxkUGF0aDogc3RyaW5nLFxuICAgICAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbiB9LFxuICAgICAgICApID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5nZXRTb3VyY2VSZWZyZXNoSGFuZGxlcihcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgKSBhc1xuICAgICAgICAgICAgICB8ICgoc3RhdGU6IExvZ2l4LlN0YXRlT2Y8U2g+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KVxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAvLyBcdTgyRTVcdTY3MkFcdTZDRThcdTUxOENcdTUyMzdcdTY1QjBcdTkwM0JcdThGOTFcdUZGMENcdTUyMTlcdTg5QzZcdTRFM0Egbm8tb3BcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdTY3MkFcdTYzMDIgU3RhdGVUcmFpdFByb2dyYW0gXHU2NUY2XHU2MjlCXHU5NTE5XHUzMDAyXG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZm9yY2UgPSBvcHRpb25zPy5mb3JjZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgcnVuSGFuZGxlciA9IChzdGF0ZTogTG9naXguU3RhdGVPZjxTaD4pID0+XG4gICAgICAgICAgICAgIGZvcmNlXG4gICAgICAgICAgICAgICAgPyBFZmZlY3QubG9jYWxseShUYXNrUnVubmVyLmZvcmNlU291cmNlUmVmcmVzaCwgdHJ1ZSkoXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoc3RhdGUpLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogaGFuZGxlcihzdGF0ZSlcblxuICAgICAgICAgICAgLy8gXHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU1MTg1XHU3OTgxXHU2QjYyXHU1MThEXHU4RDcwIGVucXVldWVUcmFuc2FjdGlvblx1RkYwOFx1NEYxQVx1NUJGQ1x1ODFGNFx1NkI3Qlx1OTUwMVx1RkYwOVx1RkYxQVxuICAgICAgICAgICAgLy8gLSBcdTc2RjRcdTYzQTVcdTU3MjhcdTVGNTNcdTUyNERcdTRFOEJcdTUyQTFcdTUxODVcdTYyNjdcdTg4NEMgaGFuZGxlclx1RkYwQ1x1NEY3Rlx1NTE3Nlx1OTAxQVx1OEZDNyBib3VuZC5zdGF0ZS5tdXRhdGUgXHU1MTk5XHU1MTY1IGRyYWZ0XHVGRjFCXG4gICAgICAgICAgICAvLyAtIFx1NzUzMVx1NTkxNlx1NUM0Mlx1NTQwQ1x1NEUwMFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1OEQxRlx1OEQyMyBjb21taXQgKyBkZWJ1ZyBcdTgwNUFcdTU0MDhcdTMwMDJcbiAgICAgICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIExvZ2l4LlN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogcnVuSGFuZGxlcihzdGF0ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gXHU1QzA2XHU0RTAwXHU2QjIxIHNvdXJjZS1yZWZyZXNoIFx1ODlDNlx1NEUzQVx1NTM1NVx1NzJFQ1x1NzY4NFx1NEU4Qlx1NTJBMVx1NTE2NVx1NTNFM1x1MzAwMlxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwic291cmNlLXJlZnJlc2hcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBMb2dpeC5TdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW5IYW5kbGVyKHN0YXRlKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlZHVjZXIsXG4gICAgdXNlOiBuZXcgUHJveHkoKCkgPT4ge30sIHtcbiAgICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIFthcmddKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQudXNlXCIpXG4gICAgICAgIGlmIChpc01vZHVsZUxpa2UoYXJnKSkge1xuICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFyZ1xuICAgICAgICAgIGNvbnN0IHRhZyA9IGRvbWFpbi50YWcgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+XG4gICAgICAgICAgPlxuXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZUFuZEJ1aWxkID0gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUodGFnKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQpID0+IGJ1aWxkTW9kdWxlSGFuZGxlKHRhZywgcnQpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCByZXNvbHZlV2l0aERlc2NyaXB0b3IgPSByZXNvbHZlTW9kdWxlUnVudGltZSh0YWcpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwKChydCkgPT4gZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlKGRvbWFpbiwgcnQpKSxcbiAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJ0KSA9PiBidWlsZE1vZHVsZUhhbmRsZSh0YWcsIHJ0KSksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgZGV0ZWN0QW5kU2VsZWN0ID0gRmliZXJSZWYuZ2V0KERlYnVnLmN1cnJlbnREaWFnbm9zdGljc0xldmVsKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LnRhcCgobGV2ZWwpID0+IHtcbiAgICAgICAgICAgICAgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9IGxldmVsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKChsZXZlbCkgPT5cbiAgICAgICAgICAgICAgbGV2ZWwgPT09IFwib2ZmXCIgPyByZXNvbHZlQW5kQnVpbGQgOiByZXNvbHZlV2l0aERlc2NyaXB0b3IsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIDAyMiBwZXJmIGdhdGVcdUZGMUFkaWFnbm9zdGljcyBvZmYgXHU2NUY2XHVGRjBDJC51c2UobW9kdWxlKSBcdTRFMEUgJC51c2UobW9kdWxlLnRhZykgXHU1RkM1XHU5ODdCXHU3QjQ5XHU0RUY3XHU0RTE0XHU5NkY2XHU5ODlEXHU1OTE2XHU1RjAwXHU5NTAwXHUzMDAyXG4gICAgICAgICAgLy8gXHU3RUE2XHU2NzVGXHVGRjFBRWZmZWN0IFx1NjYyRlx1NTAzQ1x1RkYwOFx1NTNFRlx1NTkwRFx1NzUyOFx1RkYwOVx1RkYxQlx1NTZFMFx1NkI2NFx1NUZDNVx1OTg3Qlx1NTcyOFx1NjI2N1x1ODg0Q1x1NjcxRlx1NTA1QVx1NEUwMFx1NkIyMVx1NjAyN1x1N0YxM1x1NUI1OFx1RkYwQ1x1ODAwQ1x1NEUwRFx1ODBGRFx1NTcyOFx1Njc4NFx1OTAyMFx1NjcxRlx1NTZGQVx1NUI5QVx1NTIwNlx1NjUyRlx1MzAwMlxuXHQgICAgICAgICAgcmV0dXJuIEVmZmVjdC5zdXNwZW5kKCgpID0+IHtcblx0ICAgICAgICAgICAgaWYgKGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgPT09IFwib2ZmXCIpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFuZEJ1aWxkXG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVXaXRoRGVzY3JpcHRvclxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGRldGVjdEFuZFNlbGVjdFxuXHQgICAgICAgICAgfSkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cblx0ICAgICAgICB9XG4gICAgICAgIGlmIChDb250ZXh0LmlzVGFnKGFyZykpIHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBhcmcgYXMgeyBfa2luZD86IHVua25vd24gfVxuXG4gICAgICAgICAgLy8gTW9kdWxlXHVGRjFBXHU4RkQ0XHU1NkRFXHU1M0VBXHU4QkZCIE1vZHVsZUhhbmRsZSBcdTg5QzZcdTU2RkVcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlLl9raW5kID09PSBcIk1vZHVsZVRhZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUoYXJnIGFzIGFueSkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PlxuICAgICAgICAgICAgICAgIGJ1aWxkTW9kdWxlSGFuZGxlKGFyZyBhcyBhbnksIHJ0KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBcdTY2NkVcdTkwMUEgU2VydmljZSBUYWdcdUZGMUFcdTc2RjRcdTYzQTVcdTRFQ0UgRW52IFx1ODNCN1x1NTNENiBTZXJ2aWNlXG4gICAgICAgICAgcmV0dXJuIGFyZyBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZmZlY3QuZGllKFwiQm91bmRBcGkudXNlOiB1bnN1cHBvcnRlZCBhcmd1bWVudFwiKSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFxuICAgICAgICAgIFNoLFxuICAgICAgICAgIFIsXG4gICAgICAgICAgYW55LFxuICAgICAgICAgIG5ldmVyXG4gICAgICAgID5cbiAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxTaCwgUj5bXCJ1c2VcIl0sXG4gICAgb25BY3Rpb246IG5ldyBQcm94eSgoKSA9PiB7fSwge1xuICAgICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICBndWFyZFJ1bk9ubHkoXCJ1c2VfaW5fc2V0dXBcIiwgXCIkLm9uQWN0aW9uXCIpXG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbMF1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFN0cmVhbS5maWx0ZXIoYXJnKSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShcbiAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IGFyZyB8fCBhLnR5cGUgPT09IGFyZylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBhcmcsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChcIl90YWdcIiBpbiBhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IChhcmcgYXMgYW55KS5fdGFnKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBTdHJpbmcoKGFyZyBhcyBhbnkpLl90YWcpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoU2NoZW1hLmlzU2NoZW1hKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY2hlbWEuZGVjb2RlVW5rbm93blN5bmMoXG4gICAgICAgICAgICAgICAgICAgIGFyZyBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55LCBuZXZlcj5cbiAgICAgICAgICAgICAgICAgICkoYSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5hY3Rpb25zJClcbiAgICAgIH0sXG4gICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25BY3Rpb25cIilcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGE6IGFueSkgPT4gYS5fdGFnID09PSBwcm9wIHx8IGEudHlwZSA9PT0gcHJvcFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEJvdW5kQXBpPFNoLCBSPltcIm9uQWN0aW9uXCJdLFxuICAgIG9uU3RhdGU6IChcbiAgICAgIHNlbGVjdG9yOiAoczogTG9naXguU3RhdGVPZjxTaD4pID0+IGFueSxcbiAgICApID0+IHtcbiAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25TdGF0ZVwiKVxuICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5jaGFuZ2VzKHNlbGVjdG9yKSlcbiAgICB9LFxuICAgIG9uOiAoXG4gICAgICBzdHJlYW06IFN0cmVhbS5TdHJlYW08YW55PixcbiAgICApID0+IHtcbiAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25cIilcbiAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKHN0cmVhbSlcbiAgICB9LFxuICB9IGFzIGFueVxuXG4gIHNldEJvdW5kSW50ZXJuYWxzKGFwaSBhcyBhbnksIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgcmV0dXJuIGFwaVxufVxuIiwgImltcG9ydCB7IENhdXNlLCBDb250ZXh0LCBFZmZlY3QsIFJlZiB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tIFwiLi9lcnJvclN1bW1hcnkuanNcIlxuaW1wb3J0ICogYXMgRGVidWcgZnJvbSBcIi4vRGVidWdTaW5rLmpzXCJcblxuZXhwb3J0IHR5cGUgUGhhc2UgPSBcImluaXRcIiB8IFwicnVuXCIgfCBcImRlc3Ryb3lcIiB8IFwicGxhdGZvcm1cIlxuXG5leHBvcnQgdHlwZSBIb29rID1cbiAgfCBcImluaXRSZXF1aXJlZFwiXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJkZXN0cm95XCJcbiAgfCBcInN1c3BlbmRcIlxuICB8IFwicmVzdW1lXCJcbiAgfCBcInJlc2V0XCJcbiAgfCBcInVua25vd25cIlxuXG5leHBvcnQgdHlwZSBUYXNrS2luZCA9XG4gIHwgXCJpbml0UmVxdWlyZWRcIlxuICB8IFwic3RhcnRcIlxuICB8IFwiZGVzdHJveVwiXG4gIHwgXCJwbGF0Zm9ybVN1c3BlbmRcIlxuICB8IFwicGxhdGZvcm1SZXN1bWVcIlxuICB8IFwicGxhdGZvcm1SZXNldFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDb250ZXh0IHtcbiAgcmVhZG9ubHkgcGhhc2U6IFBoYXNlXG4gIHJlYWRvbmx5IGhvb2s6IEhvb2tcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdGFza0lkPzogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICByZWFkb25seSBvcFNlcT86IG51bWJlclxuICAvKipcbiAgICogXHU0RUM1XHU3NTI4XHU0RThFXHU4QkNBXHU2NUFEXHU4OUUzXHU5MUNBXHVGRjFBXHU4QkIwXHU1RjU1XHUyMDFDXHU5NTE5XHU4QkVGXHU0RUNFXHU1NEVBXHU5MUNDXHU1MTkyXHU1MUZBXHU2NzY1XHUyMDFEXHU3Njg0XHU1QjlFXHU3M0IwXHU0RkE3XHU2ODA3XHU4QkM2XHVGRjBDXG4gICAqIFx1NEY4Qlx1NTk4MiBcImxvZ2ljLmZvcmtcIiAvIFwiaW5pdFJlcXVpcmVkXCIgLyBcInN0YXJ0XCJcdTMwMDJcbiAgICpcbiAgICogXHU2Q0U4XHU2MTBGXHVGRjFBXHU4QkU1XHU1QjU3XHU2QkI1XHU1RkM1XHU5ODdCXHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHVGRjBDXHU0RTE0XHU0RTBEXHU1RTk0XHU2MjEwXHU0RTNBXHU1MzRGXHU4QkFFXHU5NTFBXHU3MEI5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVSdW50aW1lSWRlbnRpdHkge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5zdGFuY2VTdGF0dXMgPVxuICB8IFwiY3JlYXRpbmdcIlxuICB8IFwiaW5pdGlhbGl6aW5nXCJcbiAgfCBcInJlYWR5XCJcbiAgfCBcImZhaWxlZFwiXG4gIHwgXCJ0ZXJtaW5hdGluZ1wiXG4gIHwgXCJ0ZXJtaW5hdGVkXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbml0UHJvZ3Jlc3Mge1xuICByZWFkb25seSB0b3RhbDogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbXBsZXRlZDogbnVtYmVyXG4gIHJlYWRvbmx5IGN1cnJlbnQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZU91dGNvbWUgPVxuICB8IHsgcmVhZG9ubHkgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgc3RhdHVzOiBcImZhaWx1cmVcIlxuICAgICAgcmVhZG9ubHkgZXJyb3I6IGltcG9ydChcIi4vZXJyb3JTdW1tYXJ5LmpzXCIpLlNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTdGF0dXMge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IHN0YXR1czogSW5zdGFuY2VTdGF0dXNcbiAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lXG4gIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tSZWYge1xuICByZWFkb25seSB0YXNrSWQ6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBUYXNrS2luZFxuICByZWFkb25seSBvcmRlcjogbnVtYmVyXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZmF0YWxPbkZhaWx1cmU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlVGFzayBleHRlbmRzIFRhc2tSZWYge1xuICByZWFkb25seSBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWRnZXRzIHtcbiAgLyoqIFx1NTM1NVx1NUI5RVx1NEY4Qlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRlx1NEU4Qlx1NEVGNlx1OTg4NFx1N0I5N1x1RkYxQVx1NUJGOVx1OUY1MCBzcGVjcy8wMTEgZGF0YS1tb2RlbFx1RkYwOFx1OUVEOFx1OEJBNCBcdTIyNjQyMFx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBtYXhFdmVudHNQZXJJbnN0YW5jZTogbnVtYmVyXG4gIC8qKiBcdTUzNTVcdTRFOEJcdTRFRjZcdTRGNTNcdTc5RUZcdTk4ODRcdTdCOTdcdUZGMUFcdTVCRjlcdTlGNTAgc3BlY3MvMDExIGRhdGEtbW9kZWxcdUZGMDhcdTlFRDhcdThCQTQgXHUyMjY0NEtCXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IG1heEV2ZW50Qnl0ZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZU1hbmFnZXIge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IGJ1ZGdldHM6IEJ1ZGdldHNcblxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtU3VzcGVuZDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWU6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtUmVzZXQ6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuXG4gIHJlYWRvbmx5IHJlZ2lzdGVySW5pdFJlcXVpcmVkOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJTdGFydDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nOyByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW4gfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJEZXN0cm95OiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJPbkVycm9yOiAoXG4gICAgaGFuZGxlcjogKFxuICAgICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgY29udGV4dDogRXJyb3JDb250ZXh0XG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICkgPT4gdm9pZFxuXG4gIHJlYWRvbmx5IGdldFN0YXR1czogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVTdGF0dXM+XG4gIHJlYWRvbmx5IHNldFN0YXR1czogKFxuICAgIHN0YXR1czogSW5zdGFuY2VTdGF0dXMsXG4gICAgcGF0Y2g/OiB7XG4gICAgICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWUgfCB1bmRlZmluZWRcbiAgICAgIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzcyB8IHVuZGVmaW5lZFxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgfVxuICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cblxuICByZWFkb25seSBub3RpZnlFcnJvcjogKFxuICAgIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzdW1lOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PlxuICByZWFkb25seSBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSBydW5EZXN0cm95OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgLyoqIFx1NEVDNVx1NzUyOFx1NEU4RVx1OEJDQVx1NjVBRFx1NzZFRVx1NzY4NFx1RkYxQVx1NjYyRlx1NTQyNlx1NURGMlx1NkNFOFx1NTE4Q1x1NEVGQlx1NjEwRiBvbkVycm9yIFx1NTkwNFx1NzQwNlx1NTY2OFx1MzAwMiAqL1xuICByZWFkb25seSBoYXNPbkVycm9ySGFuZGxlcnM6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbj5cblxuICAvKiogXHU0RUM1XHU3NTI4XHU0RThFXHU2RDRCXHU4QkQ1L1x1OEJDQVx1NjVBRFx1RkYxQVx1OEJGQlx1NTNENlx1NURGMlx1NkNFOFx1NTE4Q1x1NzY4NFx1NEVGQlx1NTJBMVx1NUZFQlx1NzE2N1x1RkYwOFx1NEUwRFx1NTNFRlx1NTNEOFx1ODlDNlx1NTZGRVx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBnZXRUYXNrU25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8XG4gICAgUmVhZG9ubHk8e1xuICAgICAgcmVhZG9ubHkgaW5pdFJlcXVpcmVkOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBzdGFydDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgZGVzdHJveTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1TdXNwZW5kOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVJlc3VtZTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1SZXNldDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgIH0+LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cbn1cblxuZXhwb3J0IGNvbnN0IExpZmVjeWNsZUNvbnRleHQgPSBDb250ZXh0LkdlbmVyaWNUYWc8TGlmZWN5Y2xlTWFuYWdlcj4oXG4gIFwiQGxvZ2l4L0xpZmVjeWNsZU1hbmFnZXJcIlxuKVxuXG5jb25zdCBzYWZlUnVuID0gKGxhYmVsOiBzdHJpbmcsIGVmZjogRWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4pID0+XG4gIGVmZi5waXBlKFxuICAgIEVmZmVjdC5tYXRjaENhdXNlRWZmZWN0KHtcbiAgICAgIG9uU3VjY2VzczogKCkgPT4gRWZmZWN0LnZvaWQsXG4gICAgICBvbkZhaWx1cmU6IChjYXVzZSkgPT5cbiAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKGBbJHtsYWJlbH1dIGZhaWxlZDogJHtDYXVzZS5wcmV0dHkoY2F1c2UpfWApLFxuICAgIH0pXG4gIClcblxuY29uc3QgbWFrZVRhc2tJZCA9IChraW5kOiBUYXNrS2luZCwgb3JkZXI6IG51bWJlcik6IHN0cmluZyA9PiBgJHtraW5kfToke29yZGVyfWBcblxuZXhwb3J0IGNvbnN0IG1ha2VMaWZlY3ljbGVNYW5hZ2VyID0gKFxuICBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5LFxuKTogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVNYW5hZ2VyPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgYnVkZ2V0czogQnVkZ2V0cyA9IHtcbiAgICAgIG1heEV2ZW50c1Blckluc3RhbmNlOiAyMCxcbiAgICAgIG1heEV2ZW50Qnl0ZXM6IDQgKiAxMDI0LFxuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c1JlZiA9IHlpZWxkKiBSZWYubWFrZTxMaWZlY3ljbGVTdGF0dXM+KHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgc3RhdHVzOiBcImNyZWF0aW5nXCIsXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRSZXF1aXJlZDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBzdGFydDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBkZXN0cm95OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtU3VzcGVuZDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBwbGF0Zm9ybVJlc3VtZTogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBwbGF0Zm9ybVJlc2V0OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IG9uRXJyb3JIYW5kbGVyczogQXJyYXk8XG4gICAgICAoXG4gICAgICAgIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgY29udGV4dDogRXJyb3JDb250ZXh0XG4gICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgICA+ID0gW11cblxuICAgIGNvbnN0IGdldFN0YXR1czogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVTdGF0dXM+ID0gUmVmLmdldChzdGF0dXNSZWYpXG5cbiAgICBjb25zdCByZWNvcmRQaGFzZSA9IChcbiAgICAgIHBoYXNlOiBQaGFzZSxcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHBheWxvYWQ/OiB1bmtub3duLFxuICAgICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwibGlmZWN5Y2xlOnBoYXNlXCIsXG4gICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgcGhhc2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuXG4gICAgY29uc3Qgc2V0U3RhdHVzID0gKFxuICAgICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICAgIHBhdGNoPzoge1xuICAgICAgICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWUgfCB1bmRlZmluZWRcbiAgICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgfVxuICAgICkgPT5cbiAgICAgIFJlZi51cGRhdGUoc3RhdHVzUmVmLCAocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgaWRlbnRpdHk6IHtcbiAgICAgICAgICAuLi5wcmV2LmlkZW50aXR5LFxuICAgICAgICAgIC4uLihwYXRjaD8ucnVudGltZUxhYmVsID8geyBydW50aW1lTGFiZWw6IHBhdGNoLnJ1bnRpbWVMYWJlbCB9IDogbnVsbCksXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgLi4uKHBhdGNoPy5pbml0T3V0Y29tZSAhPT0gdW5kZWZpbmVkID8geyBpbml0T3V0Y29tZTogcGF0Y2guaW5pdE91dGNvbWUgfSA6IG51bGwpLFxuICAgICAgICAuLi4ocGF0Y2g/LmluaXRQcm9ncmVzcyAhPT0gdW5kZWZpbmVkID8geyBpbml0UHJvZ3Jlc3M6IHBhdGNoLmluaXRQcm9ncmVzcyB9IDogbnVsbCksXG4gICAgICB9KSlcblxuICAgIGNvbnN0IHJlZ2lzdGVySW5pdFJlcXVpcmVkID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IGluaXRSZXF1aXJlZC5sZW5ndGhcbiAgICAgIGluaXRSZXF1aXJlZC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwiaW5pdFJlcXVpcmVkXCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJpbml0UmVxdWlyZWRcIixcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJTdGFydCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7IHJlYWRvbmx5IGZhdGFsT25GYWlsdXJlPzogYm9vbGVhbiB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHN0YXJ0Lmxlbmd0aFxuICAgICAgc3RhcnQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInN0YXJ0XCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJzdGFydFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZmF0YWxPbkZhaWx1cmU6IG9wdGlvbnM/LmZhdGFsT25GYWlsdXJlLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyRGVzdHJveSA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBkZXN0cm95Lmxlbmd0aFxuICAgICAgZGVzdHJveS5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwiZGVzdHJveVwiLCBvcmRlciksXG4gICAgICAgIGtpbmQ6IFwiZGVzdHJveVwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3Rlck9uRXJyb3IgPSAoXG4gICAgICBoYW5kbGVyOiAoXG4gICAgICAgIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgY29udGV4dDogRXJyb3JDb250ZXh0XG4gICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgICApID0+IHtcbiAgICAgIG9uRXJyb3JIYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1TdXNwZW5kLmxlbmd0aFxuICAgICAgcGxhdGZvcm1TdXNwZW5kLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoXCJwbGF0Zm9ybVN1c3BlbmRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInBsYXRmb3JtU3VzcGVuZFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtUmVzdW1lID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtUmVzdW1lLmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXN1bWUucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInBsYXRmb3JtUmVzdW1lXCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJwbGF0Zm9ybVJlc3VtZVwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtUmVzZXQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1SZXNldC5sZW5ndGhcbiAgICAgIHBsYXRmb3JtUmVzZXQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInBsYXRmb3JtUmVzZXRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInBsYXRmb3JtUmVzZXRcIixcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgbm90aWZ5RXJyb3IgPSAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LCBjb250ZXh0OiBFcnJvckNvbnRleHQpID0+IHtcbiAgICAgIC8vIFx1NEUyRFx1NjVBRC9cdTUzRDZcdTZEODhcdTRFMERcdTVFOTRcdTg4QUJcdTVGNTNcdTRGNUNcdTk1MTlcdThCRUZcdTRFMEFcdTYyQTVcdTMwMDJcbiAgICAgIGlmIChDYXVzZS5pc0ludGVycnVwdGVkKGNhdXNlKSkge1xuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwibGlmZWN5Y2xlOmVycm9yXCIsXG4gICAgICAgIG1vZHVsZUlkOiBjb250ZXh0Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBjb250ZXh0Lmluc3RhbmNlSWQsXG4gICAgICAgIGNhdXNlLFxuICAgICAgICBwaGFzZTogY29udGV4dC5waGFzZSxcbiAgICAgICAgaG9vazogY29udGV4dC5ob29rLFxuICAgICAgICB0YXNrSWQ6IGNvbnRleHQudGFza0lkLFxuICAgICAgICB0eG5TZXE6IGNvbnRleHQudHhuU2VxLFxuICAgICAgICBvcFNlcTogY29udGV4dC5vcFNlcSxcbiAgICAgICAgb3JpZ2luOiBjb250ZXh0Lm9yaWdpbixcbiAgICAgIH0pLnBpcGUoXG4gICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICAgIG9uRXJyb3JIYW5kbGVycyxcbiAgICAgICAgICAgIChoYW5kbGVyKSA9PlxuICAgICAgICAgICAgICBoYW5kbGVyKGNhdXNlLCBjb250ZXh0KS5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChpbm5lcikgPT5cbiAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFtsaWZlY3ljbGUub25FcnJvcl0gZmFpbGVkOiAke0NhdXNlLnByZXR0eShpbm5lcil9YFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHsgZGlzY2FyZDogdHJ1ZSB9XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcnVuSW5pdFJlcXVpcmVkOiBFZmZlY3QuRWZmZWN0PHZvaWQsIHVua25vd24sIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IGluaXRSZXF1aXJlZC5sZW5ndGhcbiAgICAgIGlmICh0b3RhbCA9PT0gMCkge1xuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKFwicmVhZHlcIiwge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbDogMCwgY29tcGxldGVkOiAwIH0sXG4gICAgICAgICAgaW5pdE91dGNvbWU6IHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9LFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKVxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiaW5pdFwiLCBcImluaXRSZXF1aXJlZDpzdGFydFwiLCB7IHRvdGFsIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwiaW5pdGlhbGl6aW5nXCIsIHtcbiAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQ6IDAsIGN1cnJlbnQ6IDAsIHN0YXJ0ZWRBdCB9LFxuICAgICAgfSlcblxuICAgICAgbGV0IGNvbXBsZXRlZCA9IDBcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdFJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJpbml0aWFsaXppbmdcIiwge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpLCBzdGFydGVkQXQgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB0YXNrID0gaW5pdFJlcXVpcmVkW2ldXG4gICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQodGFzay5lZmZlY3QpXG5cbiAgICAgICAgaWYgKGV4aXQuX3RhZyA9PT0gXCJTdWNjZXNzXCIpIHtcbiAgICAgICAgICBjb21wbGV0ZWQgKz0gMVxuICAgICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJpbml0aWFsaXppbmdcIiwge1xuICAgICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGkgKyAxLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoZXhpdC5jYXVzZSlcbiAgICAgICAgeWllbGQqIG5vdGlmeUVycm9yKGV4aXQuY2F1c2UsIHtcbiAgICAgICAgICBwaGFzZTogXCJpbml0XCIsXG4gICAgICAgICAgaG9vazogXCJpbml0UmVxdWlyZWRcIixcbiAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgIG9yaWdpbjogXCJpbml0UmVxdWlyZWRcIixcbiAgICAgICAgfSlcblxuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKFwiZmFpbGVkXCIsIHtcbiAgICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogaSwgc3RhcnRlZEF0IH0sXG4gICAgICAgICAgaW5pdE91dGNvbWU6IHsgc3RhdHVzOiBcImZhaWx1cmVcIiwgZXJyb3I6IHN1bW1hcnkuZXJyb3JTdW1tYXJ5IH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbENhdXNlKGV4aXQuY2F1c2UpXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcImluaXRcIiwgXCJpbml0UmVxdWlyZWQ6c3VjY2Vzc1wiLCB7IHRvdGFsIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwicmVhZHlcIiwge1xuICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogdG90YWwsIHN0YXJ0ZWRBdCB9LFxuICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IHJlY29yZFBoYXNlKFwicnVuXCIsIFwic3RhcnQ6c2NoZWR1bGVcIiwge1xuICAgICAgdG90YWw6IHN0YXJ0Lmxlbmd0aCxcbiAgICB9KS5waXBlKFxuICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAodGFzaykgPT5cbiAgICAgICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiBcInJ1blwiLFxuICAgICAgICAgICAgICAgICAgICBob29rOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKS5waXBlKEVmZmVjdC5hc1ZvaWQpLFxuICAgICAgICAgIHsgZGlzY2FyZDogdHJ1ZSwgY29uY3VycmVuY3k6IFwidW5ib3VuZGVkXCIgfVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuXG4gICAgY29uc3QgcnVuRGVzdHJveTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcImRlc3Ryb3lcIiwgXCJkZXN0cm95OnN0YXJ0XCIsIHsgdG90YWw6IGRlc3Ryb3kubGVuZ3RoIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwidGVybWluYXRpbmdcIilcblxuICAgICAgLy8gZGVzdHJveVx1RkYxQVx1NTQwRVx1NkNFOFx1NTE4Q1x1NTE0OFx1NjI2N1x1ODg0Q1x1RkYwOExJRk9cdUZGMDlcdUZGMENcdTRFMTQgYmVzdC1lZmZvcnRcdUZGMDhcdTUzNTVcdTRFMkFcdTU5MzFcdThEMjVcdTRFMERcdTk2M0JcdTU4NUVcdTU0MEVcdTdFRURcdUZGMDlcdTMwMDJcbiAgICAgIGZvciAobGV0IGkgPSBkZXN0cm95Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHRhc2sgPSBkZXN0cm95W2ldXG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgIFwibGlmZWN5Y2xlLm9uRGVzdHJveVwiLFxuICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgcGhhc2U6IFwiZGVzdHJveVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwiZGVzdHJveVwiLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcImRlc3Ryb3lcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgeWllbGQqIHNldFN0YXR1cyhcInRlcm1pbmF0ZWRcIilcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcImRlc3Ryb3lcIiwgXCJkZXN0cm95OmRvbmVcIiwgeyB0b3RhbDogZGVzdHJveS5sZW5ndGggfSlcbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKHBsYXRmb3JtU3VzcGVuZC5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJwbGF0Zm9ybVwiLCBcInNpZ25hbDpzdXNwZW5kXCIsIHsgdG90YWw6IHBsYXRmb3JtU3VzcGVuZC5sZW5ndGggfSlcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBwbGF0Zm9ybVN1c3BlbmQpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25TdXNwZW5kXCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJwbGF0Zm9ybVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwic3VzcGVuZFwiLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcInBsYXRmb3JtLnN1c3BlbmRcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXN1bWU6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1SZXN1bWUubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwicGxhdGZvcm1cIiwgXCJzaWduYWw6cmVzdW1lXCIsIHsgdG90YWw6IHBsYXRmb3JtUmVzdW1lLmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtUmVzdW1lKSB7XG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgIFwibGlmZWN5Y2xlLm9uUmVzdW1lXCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJwbGF0Zm9ybVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwicmVzdW1lXCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwicGxhdGZvcm0ucmVzdW1lXCIsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1SZXNldC5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJwbGF0Zm9ybVwiLCBcInNpZ25hbDpyZXNldFwiLCB7IHRvdGFsOiBwbGF0Zm9ybVJlc2V0Lmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtUmVzZXQpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25SZXNldFwiLFxuICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgcGhhc2U6IFwicGxhdGZvcm1cIixcbiAgICAgICAgICAgICAgICBob29rOiBcInJlc2V0XCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwicGxhdGZvcm0ucmVzZXRcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZ2V0VGFza1NuYXBzaG90OiBMaWZlY3ljbGVNYW5hZ2VyW1wiZ2V0VGFza1NuYXBzaG90XCJdID0gRWZmZWN0LnN5bmMoKCkgPT4gKHtcbiAgICAgIGluaXRSZXF1aXJlZDogaW5pdFJlcXVpcmVkLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBzdGFydDogc3RhcnQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIGRlc3Ryb3k6IGRlc3Ryb3kubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtU3VzcGVuZDogcGxhdGZvcm1TdXNwZW5kLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBwbGF0Zm9ybVJlc3VtZTogcGxhdGZvcm1SZXN1bWUubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtUmVzZXQ6IHBsYXRmb3JtUmVzZXQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICB9KSlcblxuICAgIGNvbnN0IGhhc09uRXJyb3JIYW5kbGVyczogTGlmZWN5Y2xlTWFuYWdlcltcImhhc09uRXJyb3JIYW5kbGVyc1wiXSA9IEVmZmVjdC5zeW5jKCgpID0+IG9uRXJyb3JIYW5kbGVycy5sZW5ndGggPiAwKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVkZ2V0cyxcbiAgICAgIHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVJlc3VtZSxcbiAgICAgIHJlZ2lzdGVyUGxhdGZvcm1SZXNldCxcbiAgICAgIHJlZ2lzdGVySW5pdFJlcXVpcmVkLFxuICAgICAgcmVnaXN0ZXJTdGFydCxcbiAgICAgIHJlZ2lzdGVyRGVzdHJveSxcbiAgICAgIHJlZ2lzdGVyT25FcnJvcixcbiAgICAgIGdldFN0YXR1cyxcbiAgICAgIHNldFN0YXR1cyxcbiAgICAgIG5vdGlmeUVycm9yLFxuICAgICAgcnVuUGxhdGZvcm1TdXNwZW5kLFxuICAgICAgcnVuUGxhdGZvcm1SZXN1bWUsXG4gICAgICBydW5QbGF0Zm9ybVJlc2V0LFxuICAgICAgcnVuSW5pdFJlcXVpcmVkLFxuICAgICAgcnVuU3RhcnQsXG4gICAgICBydW5EZXN0cm95LFxuICAgICAgaGFzT25FcnJvckhhbmRsZXJzLFxuICAgICAgZ2V0VGFza1NuYXBzaG90LFxuICAgIH1cbiAgfSlcbiIsICJpbXBvcnQgeyBDYXVzZSwgQ29udGV4dCwgRWZmZWN0IH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9EZWJ1Z1NpbmsuanNcIlxuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tIFwiLi9lbnYuanNcIlxuXG5jb25zdCBwaGFzZURpYWdub3N0aWNzRW5hYmxlZCA9ICgpOiBib29sZWFuID0+IGlzRGV2RW52KClcblxuLyoqXG4gKiBMb2dpYyBcdTc2RjhcdTUxNzNcdThCQ0FcdTY1QURcdUZGMUFcbiAqIC0gXHU1RjUzXHU1MjREXHU4MDVBXHU3MTI2XHU0RThFIEVudiBTZXJ2aWNlIFx1N0YzQVx1NTkzMVx1NUJGQ1x1ODFGNFx1NzY4NFx1NTIxRFx1NTlDQlx1NTMxNlx1NTY2QVx1OTdGM1x1RkYwOFNlcnZpY2Ugbm90IGZvdW5kXHVGRjA5XHUzMDAyXG4gKlxuICogXHU4QkJFXHU4QkExXHU2MTBGXHU1NkZFXHVGRjFBXG4gKiAtIFx1NTcyOFx1NjNBOFx1ODM1MFx1NzUyOFx1NkNENVx1NEUwQlx1RkYwQ1J1bnRpbWUgLyBSZWFjdCBcdTVDNDJcdTRGMUFcdTZCNjNcdTc4NkVcdTYzRDBcdTRGOUIgRW52XHVGRjFCXG4gKiAtIFx1NEY0Nlx1NTcyOFx1NjdEMFx1NEU5Qlx1NTIxRFx1NTlDQlx1NTMxNlx1NjVGNlx1NUU4Rlx1NEUwQlx1RkYwQ0xvZ2ljIFx1NTNFRlx1ODBGRFx1NTcyOCBFbnYgXHU5NEZBXHU2RUUxXHU1MjREXHU1QzMxXHU1QzFEXHU4QkQ1XHU4QkZCXHU1M0Q2IFNlcnZpY2VcdUZGMUJcbiAqIC0gXHU4RkQ5XHU3QzdCXHU5NTE5XHU4QkVGXHU5MDFBXHU1RTM4XHU1M0VBXHU1MUZBXHU3M0IwXHU0RTAwXHU2QjIxXHVGRjBDXHU0RTBEXHU2NTM5XHU1M0Q4XHU2NzAwXHU3RUM4XHU4QkVEXHU0RTQ5XHVGRjBDXHU1Mzc0XHU0RjFBXHU2QzYxXHU2N0QzXHU2NUU1XHU1RkQ3XHUzMDAyXG4gKlxuICogXHU1NkUwXHU2QjY0XHU4RkQ5XHU5MUNDXHU1NzI4IERlYnVnIFx1NEZBN1x1NTNEMVx1NTFGQVx1NEUwMFx1Njc2MSB3YXJuaW5nIFx1N0VBNyBkaWFnbm9zdGljXHVGRjBDXHU4OUUzXHU5MUNBXHU1M0VGXHU4MEZEXHU1MzlGXHU1NkUwXHU0RTBFXHU2MzkyXHU2N0U1XHU4REVGXHU1Rjg0XHVGRjBDXG4gKiBcdTc3MUZcdTZCNjNcdTc2ODRcdTk1MTlcdThCRUZcdThCRURcdTRFNDlcdTRFQ0RcdTc1MzEgbGlmZWN5Y2xlLm9uRXJyb3IgLyBBcHBSdW50aW1lLm9uRXJyb3IgXHU1OTA0XHU3NDA2XHUzMDAyXG4gKi9cblxuY29uc3QgU0VSVklDRV9OT1RfRk9VTkRfUFJFRklYID0gXCJTZXJ2aWNlIG5vdCBmb3VuZDpcIlxuXG4vKipcbiAqIFx1ODJFNSBDYXVzZSBcdTRFMkRcdTUzMDVcdTU0MkIgYFNlcnZpY2Ugbm90IGZvdW5kOiAuLi5gIFx1OTUxOVx1OEJFRlx1RkYwQ1x1NTIxOVx1NTNEMVx1NTFGQVx1NEUwMFx1Njc2MSB3YXJuaW5nIFx1N0VBNyBkaWFnbm9zdGljXHVGRjFBXG4gKiAtIGNvZGU6IGxvZ2ljOjplbnZfc2VydmljZV9ub3RfZm91bmRcbiAqIC0gbWVzc2FnZTogXHU1MzlGXHU1OUNCXHU5NTE5XHU4QkVGIG1lc3NhZ2VcdUZGMUJcbiAqIC0gaGludDogXHU4QkY0XHU2NjBFXHU4RkQ5XHU2NjJGXHU1REYyXHU3N0U1XHU3Njg0XHU1MjFEXHU1OUNCXHU1MzE2XHU2NUY2XHU1RThGXHU1NjZBXHU5N0YzXHVGRjBDXHU1RTc2XHU3RUQ5XHU1MUZBXHU2MzkyXHU2N0U1XHU1RUZBXHU4QkFFXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0RW52U2VydmljZU5vdEZvdW5kRGlhZ25vc3RpY0lmTmVlZGVkID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gIG1vZHVsZUlkPzogc3RyaW5nXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcHJldHR5OiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgcHJldHR5ID0gQ2F1c2UucHJldHR5KGNhdXNlLCB7IHJlbmRlckVycm9yQ2F1c2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcHJldHR5LmluY2x1ZGVzKFNFUlZJQ0VfTk9UX0ZPVU5EX1BSRUZJWCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDEpIEVudiBTZXJ2aWNlIFx1N0YzQVx1NTkzMVx1NjcyQ1x1OEVBQlx1NzY4NCB3YXJuaW5nIFx1OEJDQVx1NjVBRFxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGNvZGU6IFwibG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZFwiLFxuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogcHJldHR5LFxuICAgICAgaGludDpcbiAgICAgICAgXCJMb2dpYyBhdHRlbXB0ZWQgdG8gYWNjZXNzIGFuIEVudiBzZXJ2aWNlIGJlZm9yZSBpdCB3YXMgcHJvdmlkZWQuIFRoaXMgaXMgYSBrbm93biBpbml0aWFsaXphdGlvbiB0aW1pbmcgbm9pc2UgaW4gUnVudGltZS9SZWFjdCBpbnRlZ3JhdGlvbi4gXCIgK1xuICAgICAgICBcIklmIGl0IGhhcHBlbnMgb25jZSBkdXJpbmcgZWFybHkgc3RhcnR1cCBhbmQgZXZlcnl0aGluZyB3b3JrcyBhZnRlcndhcmQsIGl0J3MgbGlrZWx5IGhhcm1sZXNzOyBcIiArXG4gICAgICAgIFwiaWYgaXQgcGVyc2lzdHMgb3IgY29ycmVsYXRlcyB3aXRoIGFwcCBpc3N1ZXMsIHZlcmlmeSBSdW50aW1lLm1ha2UgLyBSdW50aW1lUHJvdmlkZXIubGF5ZXIgcHJvdmlkZXMgdGhlIHNlcnZpY2UuXCIsXG4gICAgfSlcblxuICAgIC8vIDIpIFx1NTcyOFx1NjdEMFx1NEU5Qlx1NTczQVx1NjY2Rlx1NEUwQlx1RkYwOFx1NEY4Qlx1NTk4MiBMb2dpYyBzZXR1cCBcdTZCQjVcdThGQzdcdTY1RTlcdThCQkZcdTk1RUUgRW52XHVGRjA5XHVGRjBDXHU2MjExXHU0RUVDXHU0RTVGXHU1RTBDXHU2NzFCXHU5MDFBXHU4RkM3XG4gICAgLy8gICAgbG9naWM6OmludmFsaWRfcGhhc2UgXHU2M0QwXHU5MTkyXHUyMDFDXHU4QkY3XHU1QzA2IEVudiBcdThCQkZcdTk1RUVcdTc5RkJcdTUyQThcdTUyMzAgcnVuIFx1NkJCNVx1MjAxRFx1MzAwMlxuICAgIC8vXG4gICAgLy8gXHU3NTMxXHU0RThFXHU1RjUzXHU1MjREXHU1QjlFXHU3M0IwXHU2NUUwXHU2Q0Q1XHU1NzI4XHU2QjY0XHU1OTA0XHU1M0VGXHU5NzYwXHU1MjI0XHU2NUFEXHU4QzAzXHU3NTI4XHU1M0QxXHU3NTFGXHU3Njg0IHBoYXNlXHVGRjBDXHU4RkQ5XHU5MUNDXHU1M0VBXHU2NjJGXHU2M0QwXHU0RjlCXHU0RTAwXHU0RTJBXHU4ODY1XHU1MTQ1XHU2MDI3XHU3Njg0XG4gICAgLy8gXHU4QkNBXHU2NUFEXHU0RkUxXHU1M0Y3XHVGRjBDXHU3NzFGXHU2QjYzXHU3Njg0IHBoYXNlIFx1NUI4OFx1NTM2Qlx1NEVDRFx1NzUzMSBMb2dpY1BoYXNlRXJyb3IgKyBlbWl0SW52YWxpZFBoYXNlRGlhZ25vc3RpY0lmTmVlZGVkIFx1NjI3Rlx1NjJDNVx1MzAwMlxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGNvZGU6IFwibG9naWM6OmludmFsaWRfcGhhc2VcIixcbiAgICAgIHNldmVyaXR5OiBcImVycm9yXCIsXG4gICAgICBtZXNzYWdlOiBcIiQudXNlIGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBFbnYgaXMgZnVsbHkgcmVhZHkuXCIsXG4gICAgICBoaW50OlxuICAgICAgICBcIkF2b2lkIHJlYWRpbmcgc2VydmljZXMgZHVyaW5nIHNldHVwIG9yIGJlZm9yZSBFbnYgaXMgcmVhZHk7IFwiICtcbiAgICAgICAgXCJtb3ZlIEVudiBhY2Nlc3MgdG8gdGhlIExvZ2ljIHJ1biBzZWN0aW9uLCBvciB3cmFwIGluaXQgdmlhICQubGlmZWN5Y2xlLm9uSW5pdFJlcXVpcmVkLlwiLFxuICAgICAga2luZDogXCJlbnZfc2VydmljZV9ub3RfcmVhZHlcIixcbiAgICB9KVxuICB9KVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljUGhhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgX3RhZzogXCJMb2dpY1BoYXNlRXJyb3JcIlxuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgYXBpPzogc3RyaW5nXG4gIHJlYWRvbmx5IHBoYXNlOiBcInNldHVwXCIgfCBcInJ1blwiXG4gIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNQaGFzZVNlcnZpY2Uge1xuICByZWFkb25seSBjdXJyZW50OiBcInNldHVwXCIgfCBcInJ1blwiXG59XG5cbmV4cG9ydCBjb25zdCBMb2dpY1BoYXNlU2VydmljZVRhZyA9IENvbnRleHQuR2VuZXJpY1RhZzxMb2dpY1BoYXNlU2VydmljZT4oXG4gIFwiQGxvZ2l4L0xvZ2ljUGhhc2VTZXJ2aWNlXCJcbilcblxuLyoqXG4gKiBMb2dpY1VuaXRTZXJ2aWNlXHVGRjFBXG4gKiAtIFx1NTcyOFx1NjI2N1x1ODg0Q1x1NkJDRlx1NEUyQSBtb3VudGVkIGxvZ2ljIFx1NjVGNlx1NkNFOFx1NTE2NVx1RkYwOHNjb3BlID0gXHU1MzU1XHU0RTJBIGxvZ2ljIFx1NzY4NCBzZXR1cC9ydW4gZmliZXJcdUZGMDlcdUZGMUJcbiAqIC0gXHU3NTI4XHU0RThFIHRyYWl0cyBwcm92ZW5hbmNlIFx1N0I0OVx1MjAxQ1x1NEUwRVx1NUY1M1x1NTI0RFx1OTAzQlx1OEY5MVx1NTM1NVx1NTE0M1x1N0VEMVx1NUI5QVx1MjAxRFx1NzY4NFx1NEZFMVx1NjA2Rlx1RkYwOFx1NUJGOVx1OUY1MCAwMjItbW9kdWxlIFx1NzY4NCBsb2dpY1VuaXRJZFx1RkYwOVx1MzAwMlxuICpcbiAqIFx1N0VBNlx1Njc1Rlx1RkYxQVxuICogLSBcdTdFQUZcdTUzRUFcdThCRkJcdUZGMDhcdTRFMERcdTVGOTdcdTUxOTlcdTUxNjUgcnVudGltZSBzdGF0ZVx1RkYwOVx1RkYxQlx1NEVDNVx1NEY1Q1x1NEUzQSBwcm92ZW5hbmNlL1x1OEJDQVx1NjVBRFx1OTUxQVx1NzBCOVx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljVW5pdFNlcnZpY2Uge1xuICByZWFkb25seSBsb2dpY1VuaXRJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGxvZ2ljVW5pdElkS2luZDogXCJleHBsaWNpdFwiIHwgXCJkZXJpdmVkXCJcbiAgcmVhZG9ubHkgbG9naWNVbml0TGFiZWw6IHN0cmluZ1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBMb2dpY1VuaXRTZXJ2aWNlVGFnIGV4dGVuZHMgQ29udGV4dC5UYWcoXCJAbG9naXgvTG9naWNVbml0U2VydmljZVwiKTxcbiAgTG9naWNVbml0U2VydmljZVRhZyxcbiAgTG9naWNVbml0U2VydmljZVxuPigpIHt9XG5cbmV4cG9ydCBjb25zdCBtYWtlTG9naWNQaGFzZUVycm9yID0gKFxuICBraW5kOiBzdHJpbmcsXG4gIGFwaTogc3RyaW5nLFxuICBwaGFzZTogXCJzZXR1cFwiIHwgXCJydW5cIixcbiAgbW9kdWxlSWQ/OiBzdHJpbmdcbik6IExvZ2ljUGhhc2VFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKFxuICAgIG5ldyBFcnJvcihcbiAgICAgIGBbTG9naWNQaGFzZUVycm9yXSAke2FwaX0gaXMgbm90IGFsbG93ZWQgaW4gJHtwaGFzZX0gcGhhc2UgKGtpbmQ9JHtraW5kfSkuYFxuICAgICksXG4gICAge1xuICAgICAgX3RhZzogXCJMb2dpY1BoYXNlRXJyb3JcIixcbiAgICAgIGtpbmQsXG4gICAgICBhcGksXG4gICAgICBwaGFzZSxcbiAgICAgIG1vZHVsZUlkLFxuICAgIH1cbiAgKSBhcyBMb2dpY1BoYXNlRXJyb3JcblxuLyoqXG4gKiBcdTRFQ0UgQ2F1c2UgXHU0RTJEXHU2M0QwXHU1M0Q2IExvZ2ljUGhhc2VFcnJvclx1RkYwQ1x1NUU3Nlx1NEVFNSBkaWFnbm9zdGljIFx1NUY2Mlx1NUYwRlx1NTNEMVx1NTFGQVx1RkYxQVxuICogLSBjb2RlOiBsb2dpYzo6aW52YWxpZF9waGFzZVxuICogLSBraW5kOiBcdTUxNzdcdTRGNTNcdThGRERcdTg5QzRcdTdDN0JcdTU3OEJcdUZGMDhcdTU5ODIgdXNlX2luX3NldHVwXHVGRjA5XG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0SW52YWxpZFBoYXNlRGlhZ25vc3RpY0lmTmVlZGVkID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gIG1vZHVsZUlkPzogc3RyaW5nXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoIXBoYXNlRGlhZ25vc3RpY3NFbmFibGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IFtcbiAgICAgIC4uLkNhdXNlLmZhaWx1cmVzKGNhdXNlKSxcbiAgICAgIC4uLkNhdXNlLmRlZmVjdHMoY2F1c2UpLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgZXJyIG9mIGFsbEVycm9ycykge1xuICAgICAgY29uc3QgbG9naWNFcnIgPSBlcnIgYXMgYW55XG4gICAgICBpZiAobG9naWNFcnIgJiYgbG9naWNFcnIuX3RhZyA9PT0gXCJMb2dpY1BoYXNlRXJyb3JcIikge1xuICAgICAgICBjb25zdCBwaGFzZUVyciA9IGxvZ2ljRXJyIGFzIExvZ2ljUGhhc2VFcnJvclxuICAgICAgICBjb25zdCBoaW50ID1cbiAgICAgICAgICBwaGFzZUVyci5raW5kID09PSBcInVzZV9pbl9zZXR1cFwiIHx8XG4gICAgICAgICAgcGhhc2VFcnIua2luZCA9PT0gXCJsaWZlY3ljbGVfaW5fc2V0dXBcIlxuICAgICAgICAgICAgPyBcIlRoZSBzZXR1cCBwaGFzZSBtdXN0IG5vdCByZWFkIEVudi9zZXJ2aWNlcyBvciBydW4gbG9uZy1saXZlZCBsb2dpYzsgbW92ZSB0aGUgcmVsZXZhbnQgY2FsbHMgdG8gdGhlIHJ1biBwaGFzZS5cIlxuICAgICAgICAgICAgOiBwaGFzZUVyci5raW5kID09PSBcImxpZmVjeWNsZV9pbl9ydW5cIlxuICAgICAgICAgICAgICA/IFwiRG8gbm90IHJlZ2lzdGVyICQubGlmZWN5Y2xlLiogaW4gdGhlIHJ1biBwaGFzZSAoc2V0dXAtb25seSkuIE1vdmUgbGlmZWN5Y2xlIHJlZ2lzdHJhdGlvbnMgdG8gdGhlIHN5bmNocm9ub3VzIHBhcnQgb2YgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIgKGJlZm9yZSByZXR1cm4pLlwiXG4gICAgICAgICAgICA6IHBoYXNlRXJyLmtpbmQgPT09IFwidHJhaXRzX2luX3J1blwiIHx8IHBoYXNlRXJyLmtpbmQgPT09IFwidHJhaXRzX2RlY2xhcmVfaW5fcnVuXCJcbiAgICAgICAgICAgICAgPyBcIlRyYWl0cyBhcmUgZnJvemVuIGFmdGVyIHNldHVwOyBtb3ZlICQudHJhaXRzLmRlY2xhcmUgdG8gTG9naWNQbGFuLnNldHVwIG9yIHRoZSBzZXR1cCByZWdpc3RyYXRpb24gcGhhc2Ugb2YgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIuXCJcbiAgICAgICAgICAgIDogXCJNb3ZlIGxvZ2ljIHRvIHRoZSBydW4gcGhhc2U7IGtlZXAgc2V0dXAgZm9yIHJlZ2lzdHJhdGlvbnMgb25seS5cIlxuXG4gICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgIHR5cGU6IFwiZGlhZ25vc3RpY1wiLFxuICAgICAgICAgIG1vZHVsZUlkOiBwaGFzZUVyci5tb2R1bGVJZCA/PyBtb2R1bGVJZCxcbiAgICAgICAgICBjb2RlOiBcImxvZ2ljOjppbnZhbGlkX3BoYXNlXCIsXG4gICAgICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwaGFzZUVyci5hcGkgPz8gcGhhc2VFcnIua2luZH0gaXMgbm90IGFsbG93ZWQgaW4gJHtwaGFzZUVyci5waGFzZX0gcGhhc2UuYCxcbiAgICAgICAgICBoaW50LFxuICAgICAgICAgIGtpbmQ6IHBoYXNlRXJyLmtpbmQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gXHU1NDdEXHU0RTJEXHU5OTk2XHU0RTJBIExvZ2ljUGhhc2VFcnJvciBcdTUzNzNcdTUzRUZcdThGRDRcdTU2REVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLElBQU0sb0JBQW9CLENBQUMsU0FBK0M7QUFDeEUsTUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixVQUFNLFVBQVUsS0FBSyxLQUFLO0FBQzFCLFdBQU8sUUFBUSxTQUFTLElBQUksVUFBVTtBQUFBLEVBQ3hDO0FBRUEsTUFBSSxDQUFDLE1BQU0sUUFBUSxJQUFJLEVBQUcsUUFBTztBQUVqQyxRQUFNLFFBQXVCLENBQUM7QUFDOUIsYUFBVyxPQUFPLE1BQU07QUFDdEIsUUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixVQUFJLElBQUksU0FBUyxFQUFHLE9BQU0sS0FBSyxHQUFHO0FBQ2xDO0FBQUEsSUFDRjtBQUNBLFFBQUksT0FBTyxRQUFRLFlBQVksT0FBTyxTQUFTLEdBQUcsR0FBRztBQUNuRCxZQUFNLEtBQUssT0FBTyxL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QUFBLGtCQUNGLEVBQUUsQ0FBQztBQUNILHlCQUFPLENBQUMsQ0FBQztBQUFBLGdCQUNYLENBQUM7QUFBQSxjQUNIO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsZUFBTyxvQkFBb0IsUUFBUSxRQUFRO0FBQUEsTUFDN0M7QUFBQSxNQUNBLEtBQUssQ0FBQyxTQUFTLFNBQVM7QUFDdEIscUJBQWEsZ0JBQWdCLFlBQVk7QUFDekMsWUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixpQkFBTztBQUFBLFlBQ0wsUUFBUSxTQUFTO0FBQUEsY0FDZixPQUFPO0FBQUEsZ0JBQ0wsQ0FBQyxNQUFXLEVBQUUsU0FBUyxRQUFRLEVBQUUsU0FBUztBQUFBLGNBQzVDO0FBQUEsWUFDRjtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRixDQUFDO0FBQUEsSUFDRCxTQUFTLENBQ1AsYUFDRztBQUNILG1CQUFhLGdCQUFnQixXQUFXO0FBQ3hDLGFBQU8sb0JBQW9CLFFBQVEsUUFBUSxRQUFRLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0EsSUFBSSxDQUNGLFdBQ0c7QUFDSCxtQkFBYSxnQkFBZ0IsTUFBTTtBQUNuQyxhQUFPLG9CQUFvQixNQUFNO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBRUEsb0JBQWtCLEtBQVksZ0JBQWdCO0FBRTlDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiQ29udGV4dCIsICJFZmZlY3QiLCAiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkNhdXNlIiwgIkNvbnRleHQiLCAiRWZmZWN0IiwgIm1ha2UiLCAiYXBpIiwgIkNvbnRleHQiLCAib3B0aW9ucyJdCn0K