@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,836 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ exportStaticIr
5
+ } from "./chunk-QGIM3FQK.js";
6
+ import {
7
+ installSourceRefresh
8
+ } from "./chunk-2AUQRESB.js";
9
+ import {
10
+ getAtPath
11
+ } from "./chunk-67RVISUC.js";
12
+ import {
13
+ compareFieldPath,
14
+ getFieldPathId,
15
+ makeFieldPathIdRegistry,
16
+ normalizeFieldPath
17
+ } from "./chunk-5XOBKSOT.js";
18
+ import {
19
+ getBoundInternals
20
+ } from "./chunk-6FKWRVP4.js";
21
+
22
+ // ../logix-core/src/internal/state-trait/meta.ts
23
+ var uniqSortedStrings = (input) => {
24
+ const set = /* @__PURE__ */ new Set();
25
+ for (const item of input) {
26
+ const v = item.trim();
27
+ if (!v) continue;
28
+ set.add(v);
29
+ }
30
+ return Array.from(set).sort((a, b) => a.localeCompare(b));
31
+ };
32
+ var isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
33
+ var sanitizeJsonValue = (input, depth) => {
34
+ if (input === null) return null;
35
+ if (typeof input === "string") return input;
36
+ if (typeof input === "boolean") return input;
37
+ if (typeof input === "number") {
38
+ return Number.isFinite(input) ? input : void 0;
39
+ }
40
+ if (depth >= 6) return void 0;
41
+ if (Array.isArray(input)) {
42
+ const out = [];
43
+ for (const item of input) {
44
+ const v = sanitizeJsonValue(item, depth + 1);
45
+ if (v !== void 0) out.push(v);
46
+ }
47
+ return out;
48
+ }
49
+ if (isPlainRecord(input)) {
50
+ const keys = Object.keys(input).sort();
51
+ const out = {};
52
+ for (const key of keys) {
53
+ const v = sanitizeJsonValue(input[key], depth + 1);
54
+ if (v !== void 0) out[key] = v;
55
+ }
56
+ return out;
57
+ }
58
+ return void 0;
59
+ };
60
+ var sanitize = (input) => {
61
+ if (input === null || input === void 0) return void 0;
62
+ if (typeof input !== "object" || Array.isArray(input)) return void 0;
63
+ const record = input;
64
+ const out = {};
65
+ const pickString = (key) => {
66
+ const value = record[key];
67
+ if (typeof value !== "string") return;
68
+ const trimmed = value.trim();
69
+ if (!trimmed) return;
70
+ out[key] = trimmed;
71
+ };
72
+ pickString("label");
73
+ pickString("description");
74
+ pickString("group");
75
+ pickString("docsUrl");
76
+ pickString("cacheGroup");
77
+ const canonical = record.canonical;
78
+ if (typeof canonical === "boolean") {
79
+ out.canonical = canonical;
80
+ }
81
+ const tagsRaw = record.tags;
82
+ if (typeof tagsRaw === "string") {
83
+ const tags = uniqSortedStrings([tagsRaw]);
84
+ if (tags.length > 0) out.tags = tags;
85
+ } else if (Array.isArray(tagsRaw)) {
86
+ const tags = uniqSortedStrings(tagsRaw.filter((x) => typeof x === "string"));
87
+ if (tags.length > 0) out.tags = tags;
88
+ }
89
+ const annotations = {};
90
+ const annotationKeys = Object.keys(record).filter((k) => k.startsWith("x-")).sort((a, b) => a.localeCompare(b));
91
+ for (const key of annotationKeys) {
92
+ const v = sanitizeJsonValue(record[key], 0);
93
+ if (v !== void 0) annotations[key] = v;
94
+ }
95
+ const annotationsRaw = record.annotations;
96
+ if (isPlainRecord(annotationsRaw)) {
97
+ const keys = Object.keys(annotationsRaw).filter((k) => k.startsWith("x-")).sort((a, b) => a.localeCompare(b));
98
+ for (const key of keys) {
99
+ const v = sanitizeJsonValue(annotationsRaw[key], 0);
100
+ if (v !== void 0) annotations[key] = v;
101
+ }
102
+ }
103
+ if (Object.keys(annotations).length > 0) out.annotations = annotations;
104
+ return Object.keys(out).length > 0 ? out : void 0;
105
+ };
106
+ var stableStringify = (meta) => {
107
+ const out = {};
108
+ const keys = Object.keys(meta).sort();
109
+ for (const k of keys) {
110
+ out[k] = meta[k];
111
+ }
112
+ return JSON.stringify(out);
113
+ };
114
+ var equals = (a, b) => {
115
+ if (a === b) return true;
116
+ if (!a || !b) return false;
117
+ return stableStringify(a) === stableStringify(b);
118
+ };
119
+ var mergeCanonical = (current, incoming) => {
120
+ const existing = current.meta;
121
+ if (!existing) {
122
+ return {
123
+ meta: incoming.meta,
124
+ origin: incoming.origin,
125
+ conflicts: current.conflicts
126
+ };
127
+ }
128
+ if (equals(existing, incoming.meta)) {
129
+ return current;
130
+ }
131
+ const conflicts = [
132
+ ...current.conflicts ?? []
133
+ ];
134
+ const push = (conflict) => {
135
+ const exists = conflicts.some(
136
+ (c) => c.origin === conflict.origin && equals(c.meta, conflict.meta)
137
+ );
138
+ if (!exists) conflicts.push(conflict);
139
+ };
140
+ const existingCanonical = existing.canonical === true;
141
+ const incomingCanonical = incoming.meta.canonical === true;
142
+ if (!existingCanonical && incomingCanonical) {
143
+ push({
144
+ origin: current.origin ?? "unknown",
145
+ meta: existing
146
+ });
147
+ return {
148
+ meta: incoming.meta,
149
+ origin: incoming.origin,
150
+ conflicts
151
+ };
152
+ }
153
+ push({
154
+ origin: incoming.origin,
155
+ meta: incoming.meta
156
+ });
157
+ return {
158
+ meta: existing,
159
+ origin: current.origin ?? incoming.origin,
160
+ conflicts
161
+ };
162
+ };
163
+
164
+ // ../logix-core/src/internal/state-trait/model.ts
165
+ var normalizeSpec = (spec) => {
166
+ const entries = [];
167
+ const isNode = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitNode";
168
+ const isList = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitList";
169
+ const joinPath = (prefix, suffix) => {
170
+ if (!prefix) return suffix;
171
+ if (!suffix) return prefix;
172
+ return `${prefix}.${suffix}`;
173
+ };
174
+ const prefixDeps = (deps, prefix) => {
175
+ if (!deps || deps.length === 0) return [];
176
+ return deps.map((d) => prefix ? joinPath(prefix, d) : d);
177
+ };
178
+ const normalizeEntry = (entry, fieldPath, depPrefix) => {
179
+ if (entry.kind === "computed") {
180
+ const meta = entry.meta;
181
+ const rawDeps = meta.deps;
182
+ const deps = rawDeps !== void 0 ? prefixDeps(rawDeps, depPrefix) : void 0;
183
+ return {
184
+ ...entry,
185
+ fieldPath,
186
+ meta: { ...meta, deps }
187
+ };
188
+ }
189
+ if (entry.kind === "source") {
190
+ const meta = entry.meta;
191
+ const rawDeps = meta.deps;
192
+ const deps = rawDeps !== void 0 ? prefixDeps(rawDeps, depPrefix) : void 0;
193
+ return {
194
+ ...entry,
195
+ fieldPath,
196
+ meta: { ...meta, deps, _fieldPath: fieldPath }
197
+ };
198
+ }
199
+ if (entry.kind === "link") {
200
+ const meta = entry.meta;
201
+ const from2 = prefixDeps([meta.from], depPrefix)[0] ?? meta.from;
202
+ return {
203
+ ...entry,
204
+ fieldPath,
205
+ meta: { ...meta, from: from2 }
206
+ };
207
+ }
208
+ return {
209
+ ...entry,
210
+ fieldPath
211
+ };
212
+ };
213
+ const expandNode = (scopeId, joinPrefix, node2, options) => {
214
+ const addEntry = (relativeTarget, raw) => {
215
+ const rel = raw.fieldPath ?? relativeTarget;
216
+ const fieldPath = joinPrefix ? joinPath(joinPrefix, String(rel)) : String(rel);
217
+ entries.push(normalizeEntry(raw, fieldPath, joinPrefix));
218
+ };
219
+ const expandMaybeRecord = (value) => {
220
+ if (!value) return;
221
+ if (typeof value.kind === "string") {
222
+ addEntry("", value);
223
+ return;
224
+ }
225
+ const record = value;
226
+ for (const key in record) {
227
+ if (!Object.prototype.hasOwnProperty.call(record, key)) continue;
228
+ const entry = record[key];
229
+ if (!entry) continue;
230
+ addEntry(key, entry);
231
+ }
232
+ };
233
+ expandMaybeRecord(node2.computed);
234
+ expandMaybeRecord(node2.source);
235
+ expandMaybeRecord(node2.link);
236
+ if (node2.check) {
237
+ const rules = {};
238
+ const checkDepsPrefix = options?.checkDepsPrefix ?? (joinPrefix.endsWith("[]") ? joinPrefix : "");
239
+ const prefixCheckDeps = (deps) => {
240
+ if (!deps || deps.length === 0) return [];
241
+ return deps.map(
242
+ (d) => d === "" ? scopeId : checkDepsPrefix ? joinPath(checkDepsPrefix, d) : d
243
+ );
244
+ };
245
+ for (const name of Object.keys(node2.check)) {
246
+ const rule = node2.check[name];
247
+ if (typeof rule === "function") {
248
+ rules[name] = rule;
249
+ continue;
250
+ }
251
+ if (rule && typeof rule === "object") {
252
+ const meta = sanitize(rule.meta);
253
+ rules[name] = {
254
+ ...rule,
255
+ deps: prefixCheckDeps(rule.deps),
256
+ meta
257
+ };
258
+ continue;
259
+ }
260
+ }
261
+ entries.push({
262
+ fieldPath: scopeId,
263
+ kind: "check",
264
+ meta: {
265
+ rules,
266
+ writeback: { kind: "errors" }
267
+ }
268
+ });
269
+ }
270
+ };
271
+ for (const key in spec) {
272
+ if (!Object.prototype.hasOwnProperty.call(spec, key)) continue;
273
+ const raw = spec[key];
274
+ if (!raw) continue;
275
+ if (isList(raw)) {
276
+ const listPath = key;
277
+ if (raw.item) {
278
+ expandNode(`${listPath}[]`, `${listPath}[]`, raw.item);
279
+ }
280
+ if (raw.list) {
281
+ expandNode(listPath, listPath, raw.list, {
282
+ checkDepsPrefix: `${listPath}[]`
283
+ });
284
+ }
285
+ continue;
286
+ }
287
+ if (isNode(raw)) {
288
+ if (key === "$root") {
289
+ expandNode("$root", "", raw);
290
+ } else {
291
+ expandNode(key, key, raw);
292
+ }
293
+ continue;
294
+ }
295
+ const entry = raw;
296
+ const fieldPath = entry.fieldPath ?? key;
297
+ entries.push(normalizeEntry(entry, String(fieldPath), ""));
298
+ }
299
+ return entries;
300
+ };
301
+ var collectNodeMeta = (spec) => {
302
+ const out = /* @__PURE__ */ new Map();
303
+ const isNode = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitNode";
304
+ const isList = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitList";
305
+ const add = (scopeId, node2) => {
306
+ const meta = sanitize(node2.meta);
307
+ if (meta) out.set(scopeId, meta);
308
+ };
309
+ for (const key in spec) {
310
+ if (!Object.prototype.hasOwnProperty.call(spec, key)) continue;
311
+ const raw = spec[key];
312
+ if (!raw) continue;
313
+ if (isList(raw)) {
314
+ const listPath = key;
315
+ if (raw.item) add(`${listPath}[]`, raw.item);
316
+ if (raw.list) add(listPath, raw.list);
317
+ continue;
318
+ }
319
+ if (isNode(raw)) {
320
+ if (key === "$root") add("$root", raw);
321
+ else add(key, raw);
322
+ continue;
323
+ }
324
+ }
325
+ return out;
326
+ };
327
+
328
+ // ../logix-core/src/internal/state-trait/build.ts
329
+ var nowPerf = () => typeof globalThis.performance !== "undefined" && typeof globalThis.performance.now === "function" ? globalThis.performance.now() : Date.now();
330
+ var getConvergeWriterDeps = (entry) => {
331
+ if (entry.kind === "computed") {
332
+ return entry.meta?.deps ?? [];
333
+ }
334
+ return [entry.meta.from];
335
+ };
336
+ var computeConvergeTopoOrder = (writers) => {
337
+ const writerByPath = /* @__PURE__ */ new Map();
338
+ for (const entry of writers) {
339
+ const existing = writerByPath.get(entry.fieldPath);
340
+ if (existing) {
341
+ return {
342
+ order: [],
343
+ configError: {
344
+ code: "MULTIPLE_WRITERS",
345
+ message: `[StateTrait.converge] Multiple writers for field "${entry.fieldPath}" (${existing.kind} + ${entry.kind}).`,
346
+ fields: [entry.fieldPath]
347
+ }
348
+ };
349
+ }
350
+ writerByPath.set(entry.fieldPath, entry);
351
+ }
352
+ const nodes = /* @__PURE__ */ new Set();
353
+ for (const entry of writers) {
354
+ nodes.add(entry.fieldPath);
355
+ }
356
+ const indegree = /* @__PURE__ */ new Map();
357
+ const forward = /* @__PURE__ */ new Map();
358
+ for (const node2 of nodes) {
359
+ indegree.set(node2, 0);
360
+ forward.set(node2, []);
361
+ }
362
+ for (const entry of writers) {
363
+ const to = entry.fieldPath;
364
+ const deps = getConvergeWriterDeps(entry);
365
+ for (const dep of deps) {
366
+ if (!nodes.has(dep)) continue;
367
+ forward.get(dep).push(to);
368
+ indegree.set(to, (indegree.get(to) ?? 0) + 1);
369
+ }
370
+ }
371
+ const queue = [];
372
+ for (const [node2, deg] of indegree.entries()) {
373
+ if (deg === 0) queue.push(node2);
374
+ }
375
+ const order = [];
376
+ while (queue.length) {
377
+ const n = queue.shift();
378
+ order.push(n);
379
+ const outs = forward.get(n);
380
+ for (const to of outs) {
381
+ const next = (indegree.get(to) ?? 0) - 1;
382
+ indegree.set(to, next);
383
+ if (next === 0) queue.push(to);
384
+ }
385
+ }
386
+ if (order.length !== nodes.size) {
387
+ const remaining = Array.from(nodes).filter((n) => !order.includes(n));
388
+ return {
389
+ order: [],
390
+ configError: {
391
+ code: "CYCLE_DETECTED",
392
+ message: `[StateTrait.converge] Cycle detected in computed/link graph: ${remaining.join(", ")}`,
393
+ fields: remaining
394
+ }
395
+ };
396
+ }
397
+ return { order };
398
+ };
399
+ var buildConvergeIr = (entries) => {
400
+ const startedAt = nowPerf();
401
+ const generation = 0;
402
+ const writers = entries.filter(
403
+ (e) => e.kind === "computed" || e.kind === "link"
404
+ );
405
+ const writersKey = writers.map((entry) => `${entry.kind}:${entry.fieldPath}`).sort().join("|");
406
+ const depsKey = writers.map((entry) => {
407
+ const deps = getConvergeWriterDeps(entry).slice().sort().join(",");
408
+ return `${entry.kind}:${entry.fieldPath}=>${deps}`;
409
+ }).sort().join("|");
410
+ const writerByPath = /* @__PURE__ */ new Map();
411
+ for (const entry of writers) {
412
+ writerByPath.set(entry.fieldPath, entry);
413
+ }
414
+ const topo = writers.length > 0 ? computeConvergeTopoOrder(writers) : { order: [] };
415
+ const stepsById = topo.configError ? [] : topo.order.map((path) => writerByPath.get(path));
416
+ const fieldPathTable = /* @__PURE__ */ new Map();
417
+ const addPath = (path) => {
418
+ for (let i = 1; i <= path.length; i++) {
419
+ const prefix = path.slice(0, i);
420
+ const key = JSON.stringify(prefix);
421
+ if (!fieldPathTable.has(key)) fieldPathTable.set(key, prefix);
422
+ }
423
+ };
424
+ for (const entry of writers) {
425
+ const out = normalizeFieldPath(entry.fieldPath);
426
+ if (out) addPath(out);
427
+ for (const dep of getConvergeWriterDeps(entry)) {
428
+ const depPath = normalizeFieldPath(dep);
429
+ if (depPath) addPath(depPath);
430
+ }
431
+ }
432
+ const fieldPaths = Array.from(fieldPathTable.values()).sort(compareFieldPath);
433
+ const fieldPathIdRegistry = makeFieldPathIdRegistry(fieldPaths);
434
+ const stepOutFieldPathIdByStepId = [];
435
+ const stepDepsFieldPathIdsByStepId = [];
436
+ for (const entry of stepsById) {
437
+ const out = normalizeFieldPath(entry.fieldPath);
438
+ const outId = out != null ? getFieldPathId(fieldPathIdRegistry, out) : void 0;
439
+ if (outId == null) {
440
+ throw new Error(
441
+ `[StateTrait.build] Failed to map converge output fieldPath "${entry.fieldPath}" to FieldPathId.`
442
+ );
443
+ }
444
+ const depIds = [];
445
+ for (const dep of getConvergeWriterDeps(entry)) {
446
+ const depPath = normalizeFieldPath(dep);
447
+ if (!depPath) continue;
448
+ const depId = getFieldPathId(fieldPathIdRegistry, depPath);
449
+ if (depId != null) depIds.push(depId);
450
+ }
451
+ stepOutFieldPathIdByStepId.push(outId);
452
+ stepDepsFieldPathIdsByStepId.push(depIds);
453
+ }
454
+ const topoOrder = stepsById.map((_, i) => i);
455
+ const buildDurationMs = Math.max(0, nowPerf() - startedAt);
456
+ return {
457
+ generation,
458
+ writersKey,
459
+ depsKey,
460
+ fieldPaths,
461
+ fieldPathIdRegistry,
462
+ ...topo.configError ? { configError: topo.configError } : null,
463
+ stepsById,
464
+ stepOutFieldPathIdByStepId,
465
+ stepDepsFieldPathIdsByStepId,
466
+ topoOrder,
467
+ buildDurationMs
468
+ };
469
+ };
470
+ var toFieldTrait = (entry) => {
471
+ const deps = [];
472
+ if (entry.kind === "computed") {
473
+ const meta = entry.meta;
474
+ const list2 = meta.deps;
475
+ if (list2) deps.push(...list2);
476
+ } else if (entry.kind === "source") {
477
+ const meta = entry.meta;
478
+ const list2 = meta.deps;
479
+ if (list2) deps.push(...list2);
480
+ } else if (entry.kind === "link") {
481
+ deps.push(entry.meta.from);
482
+ } else if (entry.kind === "check") {
483
+ const meta = entry.meta;
484
+ const rules = meta?.rules ?? {};
485
+ for (const name of Object.keys(rules)) {
486
+ const rule = rules[name];
487
+ if (rule && typeof rule === "object") {
488
+ const list2 = rule.deps;
489
+ if (list2) deps.push(...list2);
490
+ }
491
+ }
492
+ }
493
+ return {
494
+ fieldId: entry.fieldPath,
495
+ kind: entry.kind,
496
+ // meta 在运行时保持与 Entry.meta 一致,便于 install 直接复用。
497
+ meta: entry.meta,
498
+ deps
499
+ };
500
+ };
501
+ var buildGraph = (entries, nodeMetaByFieldPath) => {
502
+ const fieldMap = /* @__PURE__ */ new Map();
503
+ const nodes = [];
504
+ const edges = [];
505
+ const resourcesById = /* @__PURE__ */ new Map();
506
+ const planSteps = [];
507
+ const ensureField = (fieldPath) => {
508
+ let field = fieldMap.get(fieldPath);
509
+ if (!field) {
510
+ field = {
511
+ id: fieldPath,
512
+ path: fieldPath,
513
+ traits: []
514
+ };
515
+ fieldMap.set(fieldPath, field);
516
+ }
517
+ return field;
518
+ };
519
+ for (const entry of entries) {
520
+ const fieldPath = entry.fieldPath;
521
+ const field = ensureField(fieldPath);
522
+ const trait = toFieldTrait(entry);
523
+ field.traits.push(trait);
524
+ if (entry.kind === "computed") {
525
+ const stepId = `computed:${fieldPath}`;
526
+ planSteps.push({
527
+ id: stepId,
528
+ kind: "computed-update",
529
+ targetFieldPath: fieldPath
530
+ // 说明:当前版本不静态分析 computed 依赖字段,sourceFieldPaths 留空。
531
+ });
532
+ const deps = entry.meta.deps;
533
+ if (deps) {
534
+ for (const dep of deps) {
535
+ ensureField(dep);
536
+ edges.push({
537
+ id: `computed:${dep}->${fieldPath}`,
538
+ from: dep,
539
+ to: fieldPath,
540
+ kind: "computed"
541
+ });
542
+ }
543
+ }
544
+ } else if (entry.kind === "link") {
545
+ const from2 = entry.meta.from;
546
+ ensureField(from2);
547
+ const edgeId = `link:${from2}->${fieldPath}`;
548
+ edges.push({
549
+ id: edgeId,
550
+ from: from2,
551
+ to: fieldPath,
552
+ kind: "link"
553
+ });
554
+ planSteps.push({
555
+ id: `link:${fieldPath}`,
556
+ kind: "link-propagate",
557
+ targetFieldPath: fieldPath,
558
+ sourceFieldPaths: [from2],
559
+ debugInfo: {
560
+ graphEdgeId: edgeId
561
+ }
562
+ });
563
+ } else if (entry.kind === "source") {
564
+ const resourceId = entry.meta.resource;
565
+ const resourceMeta = sanitize(entry.meta.meta);
566
+ const existing = resourcesById.get(resourceId);
567
+ if (existing) {
568
+ const ownerFields = [...existing.ownerFields, fieldPath];
569
+ let meta = existing.meta;
570
+ let metaOrigin = existing.metaOrigin;
571
+ let metaConflicts = existing.metaConflicts;
572
+ if (resourceMeta) {
573
+ const merged = mergeCanonical(
574
+ { meta, origin: metaOrigin, conflicts: metaConflicts },
575
+ { origin: fieldPath, meta: resourceMeta }
576
+ );
577
+ meta = merged.meta;
578
+ metaOrigin = merged.origin;
579
+ metaConflicts = merged.conflicts;
580
+ }
581
+ resourcesById.set(resourceId, {
582
+ ...existing,
583
+ ownerFields,
584
+ meta,
585
+ metaOrigin,
586
+ metaConflicts
587
+ });
588
+ } else {
589
+ resourcesById.set(resourceId, {
590
+ resourceId,
591
+ // 暂时使用简单的标识字符串,后续可根据 key 规则进一步结构化。
592
+ keySelector: `StateTrait.source@${fieldPath}`,
593
+ ownerFields: [fieldPath],
594
+ meta: resourceMeta,
595
+ metaOrigin: resourceMeta ? fieldPath : void 0
596
+ });
597
+ }
598
+ planSteps.push({
599
+ id: `source:${fieldPath}`,
600
+ kind: "source-refresh",
601
+ targetFieldPath: fieldPath,
602
+ resourceId,
603
+ keySelectorId: `StateTrait.source@${fieldPath}`
604
+ });
605
+ const deps = entry.meta.deps;
606
+ if (deps) {
607
+ for (const dep of deps) {
608
+ ensureField(dep);
609
+ edges.push({
610
+ id: `source-dep:${dep}->${fieldPath}`,
611
+ from: dep,
612
+ to: fieldPath,
613
+ kind: "source-dep"
614
+ });
615
+ }
616
+ }
617
+ } else if (entry.kind === "check") {
618
+ planSteps.push({
619
+ id: `check:${fieldPath}`,
620
+ kind: "check-validate",
621
+ targetFieldPath: fieldPath
622
+ });
623
+ if (trait.deps.length > 0) {
624
+ for (const dep of trait.deps) {
625
+ ensureField(dep);
626
+ edges.push({
627
+ id: `check-dep:${dep}->${fieldPath}`,
628
+ from: dep,
629
+ to: fieldPath,
630
+ kind: "check-dep"
631
+ });
632
+ }
633
+ }
634
+ }
635
+ }
636
+ for (const field of fieldMap.values()) {
637
+ nodes.push({
638
+ id: field.id,
639
+ field,
640
+ traits: field.traits,
641
+ meta: nodeMetaByFieldPath.get(field.id)
642
+ });
643
+ }
644
+ const graph = {
645
+ _tag: "StateTraitGraph",
646
+ nodes,
647
+ edges,
648
+ resources: Array.from(resourcesById.values())
649
+ };
650
+ const plan = {
651
+ _tag: "StateTraitPlan",
652
+ steps: planSteps
653
+ };
654
+ return { graph, plan };
655
+ };
656
+ var assertNoLinkCycles = (edges) => {
657
+ const adjacency = /* @__PURE__ */ new Map();
658
+ for (const edge of edges) {
659
+ if (edge.kind !== "link") continue;
660
+ const list2 = adjacency.get(edge.from) ?? [];
661
+ list2.push(edge.to);
662
+ adjacency.set(edge.from, list2);
663
+ }
664
+ const visited = /* @__PURE__ */ new Set();
665
+ const stack = /* @__PURE__ */ new Set();
666
+ const dfs = (node2) => {
667
+ if (stack.has(node2)) {
668
+ throw new Error(
669
+ `[StateTrait.build] link cycle detected at field "${node2}". Please check link traits for circular dependencies.`
670
+ );
671
+ }
672
+ if (visited.has(node2)) return;
673
+ visited.add(node2);
674
+ stack.add(node2);
675
+ const nexts = adjacency.get(node2);
676
+ if (nexts) {
677
+ for (const to of nexts) {
678
+ dfs(to);
679
+ }
680
+ }
681
+ stack.delete(node2);
682
+ };
683
+ for (const node2 of adjacency.keys()) {
684
+ if (!visited.has(node2)) {
685
+ dfs(node2);
686
+ }
687
+ }
688
+ };
689
+ var build = (stateSchema, spec) => {
690
+ const entries = normalizeSpec(spec);
691
+ const nodeMetaByFieldPath = collectNodeMeta(spec);
692
+ for (const entry of entries) {
693
+ if (entry.kind === "computed") {
694
+ const deps = entry.meta.deps;
695
+ if (deps === void 0) {
696
+ throw new Error(
697
+ `[StateTrait.build] Missing explicit deps for computed "${entry.fieldPath}". Please use StateTrait.computed({ deps: [...], get: ... }).`
698
+ );
699
+ }
700
+ }
701
+ if (entry.kind === "source") {
702
+ const deps = entry.meta.deps;
703
+ if (deps === void 0) {
704
+ throw new Error(
705
+ `[StateTrait.build] Missing explicit deps for source "${entry.fieldPath}". Please provide meta.deps for StateTrait.source({ deps: [...], ... }).`
706
+ );
707
+ }
708
+ }
709
+ if (entry.kind === "check") {
710
+ const rules = entry.meta?.rules ?? {};
711
+ for (const name of Object.keys(rules)) {
712
+ const rule = rules[name];
713
+ if (typeof rule === "function" || !rule || typeof rule !== "object") {
714
+ throw new Error(
715
+ `[StateTrait.build] Missing explicit deps for check "${entry.fieldPath}" rule "${name}". Please use { deps: [...], validate: ... } form.`
716
+ );
717
+ }
718
+ if (rule.deps === void 0) {
719
+ throw new Error(
720
+ `[StateTrait.build] Missing explicit deps for check "${entry.fieldPath}" rule "${name}". Please provide deps: [...].`
721
+ );
722
+ }
723
+ }
724
+ }
725
+ }
726
+ const { graph, plan } = buildGraph(entries, nodeMetaByFieldPath);
727
+ assertNoLinkCycles(graph.edges);
728
+ return {
729
+ stateSchema,
730
+ spec,
731
+ entries,
732
+ graph,
733
+ plan,
734
+ convergeIr: buildConvergeIr(entries)
735
+ };
736
+ };
737
+
738
+ // ../logix-core/src/internal/state-trait/install.ts
739
+ import { Effect } from "../effect.js";
740
+ var buildEntryIndex = (entries) => {
741
+ const index = /* @__PURE__ */ new Map();
742
+ for (const entry of entries) {
743
+ const list2 = index.get(entry.fieldPath) ?? [];
744
+ list2.push(entry);
745
+ index.set(entry.fieldPath, list2);
746
+ }
747
+ return index;
748
+ };
749
+ var install = (bound, program) => {
750
+ try {
751
+ const internals = getBoundInternals(bound);
752
+ internals.traits.registerStateTraitProgram(program, {
753
+ bumpReason: "logic_installed"
754
+ });
755
+ } catch {
756
+ }
757
+ const entryIndex = buildEntryIndex(program.entries);
758
+ const installStep = (step) => {
759
+ if (!step.targetFieldPath) {
760
+ return Effect.void;
761
+ }
762
+ if (step.kind !== "source-refresh") {
763
+ return Effect.void;
764
+ }
765
+ const candidates = entryIndex.get(step.targetFieldPath);
766
+ if (!candidates || candidates.length === 0) {
767
+ return Effect.void;
768
+ }
769
+ const entry = candidates.find((e) => e.kind === "source");
770
+ if (!entry) {
771
+ return Effect.void;
772
+ }
773
+ return installSourceRefresh(
774
+ bound,
775
+ step,
776
+ entry
777
+ );
778
+ };
779
+ return Effect.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect.asVoid);
780
+ };
781
+
782
+ // ../logix-core/src/state-trait.ts
783
+ var $root = "$root";
784
+ var from = (_schema) => (spec) => spec;
785
+ var node = (spec) => ({
786
+ _tag: "StateTraitNode",
787
+ ...spec
788
+ });
789
+ var list = (spec) => ({
790
+ _tag: "StateTraitList",
791
+ ...spec
792
+ });
793
+ var computed = (input) => {
794
+ const derive = (state) => {
795
+ const args = input.deps.map(
796
+ (dep) => getAtPath(state, dep)
797
+ );
798
+ return input.get(...args);
799
+ };
800
+ return {
801
+ fieldPath: void 0,
802
+ kind: "computed",
803
+ meta: { deps: input.deps, derive, equals: input.equals }
804
+ };
805
+ };
806
+ var source = (meta) => ({
807
+ fieldPath: void 0,
808
+ kind: "source",
809
+ meta
810
+ });
811
+ var link = (meta) => ({
812
+ fieldPath: void 0,
813
+ kind: "link",
814
+ meta
815
+ });
816
+ var build2 = (stateSchema, spec) => build(stateSchema, spec);
817
+ var install2 = (bound, program) => install(bound, program);
818
+ var exportStaticIr2 = (program, moduleId, options) => exportStaticIr({
819
+ program,
820
+ moduleId,
821
+ version: options?.version
822
+ });
823
+
824
+ export {
825
+ $root,
826
+ from,
827
+ node,
828
+ list,
829
+ computed,
830
+ source,
831
+ link,
832
+ build2 as build,
833
+ install2 as install,
834
+ exportStaticIr2 as exportStaticIr
835
+ };
836
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvbWV0YS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9tb2RlbC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9idWlsZC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pbnN0YWxsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL3N0YXRlLXRyYWl0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgdHlwZSBUcmFpdE1ldGEgPSBSZWFkb25seTx7XG4gIHJlYWRvbmx5IGxhYmVsPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIHJlYWRvbmx5IHRhZ3M/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgZ3JvdXA/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZG9jc1VybD86IHN0cmluZ1xuICByZWFkb25seSBjYWNoZUdyb3VwPzogc3RyaW5nXG4gIC8qKlxuICAgKiBcdTYyNjlcdTVDNTVcdTZDRThcdTg5RTNcdTRGNERcdUZGMUFcdTRFQzVcdTYzQTVcdTUzRDcgYHgtKmAga2V5XHVGRjA4XHU3NTI4XHU0RThFIFBoYW50b20gU291cmNlIC8gRHJpZnQgRGV0ZWN0aW9uIFx1N0I0OVx1ODBGRFx1NTI5Qlx1NzY4NFx1OTUxQVx1NzBCOVx1RkYwOVx1MzAwMlxuICAgKlxuICAgKiBcdTdFQTZcdTY3NUZcdUZGMUFcbiAgICogLSBcdTVGQzVcdTk4N0JcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMDhKU09OIFx1NTAzQ1x1RkYwOVx1RkYxQlxuICAgKiAtIFx1NUZDNVx1OTg3QiBTbGltXHVGRjA4XHU1RUZBXHU4QkFFXHU1M0VBXHU2NTNFXHU1QzExXHU5MUNGXHU1MTczXHU5NTJFXHU2M0QwXHU3OTNBXHVGRjBDXHU0RTBEXHU4OTgxXHU1ODVFXHU1OTI3XHU1QkY5XHU4QzYxXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9ucz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4+XG4gIC8qKlxuICAgKiBcdThCRURcdTRFNDlcdTYzRDBcdTc5M0FcdUZGMUFcdTVGNTNcdTU0MENcdTRFMDBcdTVCOUVcdTRGNTNcdUZGMDhcdTRGOEJcdTU5ODJcdTU0MENcdTRFMDAgcmVzb3VyY2VJZFx1RkYwOVx1NTFGQVx1NzNCMFx1NTkxQVx1NTkwNCBtZXRhIFx1NThGMFx1NjYwRVx1NEUxNFx1NEUwRFx1NEUwMFx1ODFGNFx1NjVGNlx1RkYwQ1xuICAgKiBjYW5vbmljYWw9dHJ1ZSBcdTc2ODRcdTU4RjBcdTY2MEVcdTRGMThcdTUxNDhcdTYyMTBcdTRFM0FcdTIwMUNcdTVDNTVcdTc5M0FcdTc1MjggY2Fub25pY2FsXHUyMDFEXHVGRjFCXHU1MTc2XHU0RUQ2XHU1OEYwXHU2NjBFXHU0RjFBXHU4QkIwXHU1RjU1XHU0RTNBIGNvbmZsaWN0c1x1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgY2Fub25pY2FsPzogYm9vbGVhblxufT5cblxuZXhwb3J0IHR5cGUgVHJhaXRNZXRhQ29uZmxpY3QgPSBSZWFkb25seTx7XG4gIHJlYWRvbmx5IG9yaWdpbjogc3RyaW5nXG4gIHJlYWRvbmx5IG1ldGE6IFRyYWl0TWV0YVxufT5cblxuZXhwb3J0IHR5cGUgSnNvblByaW1pdGl2ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsXG5leHBvcnQgdHlwZSBKc29uVmFsdWUgPVxuICB8IEpzb25QcmltaXRpdmVcbiAgfCBSZWFkb25seUFycmF5PEpzb25WYWx1ZT5cbiAgfCB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB9XG5cbmNvbnN0IHVuaXFTb3J0ZWRTdHJpbmdzID0gKGlucHV0OiBSZWFkb25seUFycmF5PHN0cmluZz4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcbiAgICBjb25zdCB2ID0gaXRlbS50cmltKClcbiAgICBpZiAoIXYpIGNvbnRpbnVlXG4gICAgc2V0LmFkZCh2KVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKHNldCkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBpc1BsYWluUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBzYW5pdGl6ZUpzb25WYWx1ZSA9IChcbiAgaW5wdXQ6IHVua25vd24sXG4gIGRlcHRoOiBudW1iZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoaW5wdXQgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlucHV0XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gaW5wdXRcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUoaW5wdXQpID8gaW5wdXQgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmIChkZXB0aCA+PSA2KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgY29uc3Qgb3V0OiBBcnJheTxKc29uVmFsdWU+ID0gW11cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcbiAgICAgIGNvbnN0IHYgPSBzYW5pdGl6ZUpzb25WYWx1ZShpdGVtLCBkZXB0aCArIDEpXG4gICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSBvdXQucHVzaCh2KVxuICAgIH1cbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICBpZiAoaXNQbGFpblJlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5wdXQpLnNvcnQoKVxuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgdiA9IHNhbml0aXplSnNvblZhbHVlKGlucHV0W2tleV0sIGRlcHRoICsgMSlcbiAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIG91dFtrZXldID0gdlxuICAgIH1cbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBzYW5pdGl6ZSA9IChpbnB1dDogdW5rbm93bik6IFRyYWl0TWV0YSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCByZWNvcmQgPSBpbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICBjb25zdCBwaWNrU3RyaW5nID0gKGtleToga2V5b2YgVHJhaXRNZXRhKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmRba2V5IGFzIHN0cmluZ11cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm5cbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm5cbiAgICBvdXRba2V5XSA9IHRyaW1tZWRcbiAgfVxuXG4gIHBpY2tTdHJpbmcoXCJsYWJlbFwiKVxuICBwaWNrU3RyaW5nKFwiZGVzY3JpcHRpb25cIilcbiAgcGlja1N0cmluZyhcImdyb3VwXCIpXG4gIHBpY2tTdHJpbmcoXCJkb2NzVXJsXCIpXG4gIHBpY2tTdHJpbmcoXCJjYWNoZUdyb3VwXCIpXG5cbiAgY29uc3QgY2Fub25pY2FsID0gcmVjb3JkLmNhbm9uaWNhbFxuICBpZiAodHlwZW9mIGNhbm9uaWNhbCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICBvdXQuY2Fub25pY2FsID0gY2Fub25pY2FsXG4gIH1cblxuICBjb25zdCB0YWdzUmF3ID0gcmVjb3JkLnRhZ3NcbiAgaWYgKHR5cGVvZiB0YWdzUmF3ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGFncyA9IHVuaXFTb3J0ZWRTdHJpbmdzKFt0YWdzUmF3XSlcbiAgICBpZiAodGFncy5sZW5ndGggPiAwKSBvdXQudGFncyA9IHRhZ3NcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhZ3NSYXcpKSB7XG4gICAgY29uc3QgdGFncyA9IHVuaXFTb3J0ZWRTdHJpbmdzKHRhZ3NSYXcuZmlsdGVyKCh4KTogeCBpcyBzdHJpbmcgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpKVxuICAgIGlmICh0YWdzLmxlbmd0aCA+IDApIG91dC50YWdzID0gdGFnc1xuICB9XG5cbiAgY29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuXG4gIC8vIGxlZ2FjeTogYWxsb3cgcGFzc2luZyBgeC0qYCBrZXlzIGF0IHRoZSB0b3AtbGV2ZWwgKHVudHlwZWQgaW5wdXQpLCB0aGVuIG5vcm1hbGl6ZSBpbnRvIGBhbm5vdGF0aW9uc2AuXG4gIGNvbnN0IGFubm90YXRpb25LZXlzID0gT2JqZWN0LmtleXMocmVjb3JkKVxuICAgIC5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChcIngtXCIpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gIGZvciAoY29uc3Qga2V5IG9mIGFubm90YXRpb25LZXlzKSB7XG4gICAgY29uc3QgdiA9IHNhbml0aXplSnNvblZhbHVlKHJlY29yZFtrZXldLCAwKVxuICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIGFubm90YXRpb25zW2tleV0gPSB2XG4gIH1cblxuICAvLyBwcmVmZXJyZWQ6IHR5cGVkIGBhbm5vdGF0aW9uc2AgZmllbGQgKG9ubHkgYWNjZXB0cyBgeC0qYCBrZXlzKS5cbiAgY29uc3QgYW5ub3RhdGlvbnNSYXcgPSByZWNvcmQuYW5ub3RhdGlvbnNcbiAgaWYgKGlzUGxhaW5SZWNvcmQoYW5ub3RhdGlvbnNSYXcpKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFubm90YXRpb25zUmF3KVxuICAgICAgLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKFwieC1cIikpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IHYgPSBzYW5pdGl6ZUpzb25WYWx1ZShhbm5vdGF0aW9uc1Jhd1trZXldLCAwKVxuICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCkgYW5ub3RhdGlvbnNba2V5XSA9IHZcbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoYW5ub3RhdGlvbnMpLmxlbmd0aCA+IDApIG91dC5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IChvdXQgYXMgVHJhaXRNZXRhKSA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBzdGFibGVTdHJpbmdpZnkgPSAobWV0YTogVHJhaXRNZXRhKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KClcbiAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICBvdXRba10gPSAobWV0YSBhcyBhbnkpW2tdXG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG91dClcbn1cblxuZXhwb3J0IGNvbnN0IGVxdWFscyA9IChhOiBUcmFpdE1ldGEgfCB1bmRlZmluZWQsIGI6IFRyYWl0TWV0YSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWVcbiAgaWYgKCFhIHx8ICFiKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHN0YWJsZVN0cmluZ2lmeShhKSA9PT0gc3RhYmxlU3RyaW5naWZ5KGIpXG59XG5cbmV4cG9ydCB0eXBlIENhbm9uaWNhbE1lcmdlSW5wdXQgPSBSZWFkb25seTx7XG4gIHJlYWRvbmx5IG1ldGE/OiBUcmFpdE1ldGFcbiAgcmVhZG9ubHkgb3JpZ2luPzogc3RyaW5nXG4gIHJlYWRvbmx5IGNvbmZsaWN0cz86IFJlYWRvbmx5QXJyYXk8VHJhaXRNZXRhQ29uZmxpY3Q+XG59PlxuXG5leHBvcnQgdHlwZSBDYW5vbmljYWxNZXJnZVJlc3VsdCA9IFJlYWRvbmx5PHtcbiAgcmVhZG9ubHkgbWV0YT86IFRyYWl0TWV0YVxuICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmdcbiAgcmVhZG9ubHkgY29uZmxpY3RzPzogUmVhZG9ubHlBcnJheTxUcmFpdE1ldGFDb25mbGljdD5cbn0+XG5cbmV4cG9ydCBjb25zdCBtZXJnZUNhbm9uaWNhbCA9IChcbiAgY3VycmVudDogQ2Fub25pY2FsTWVyZ2VJbnB1dCxcbiAgaW5jb21pbmc6IFJlYWRvbmx5PHsgcmVhZG9ubHkgb3JpZ2luOiBzdHJpbmc7IHJlYWRvbmx5IG1ldGE6IFRyYWl0TWV0YSB9Pixcbik6IENhbm9uaWNhbE1lcmdlUmVzdWx0ID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSBjdXJyZW50Lm1ldGFcbiAgaWYgKCFleGlzdGluZykge1xuICAgIHJldHVybiB7XG4gICAgICBtZXRhOiBpbmNvbWluZy5tZXRhLFxuICAgICAgb3JpZ2luOiBpbmNvbWluZy5vcmlnaW4sXG4gICAgICBjb25mbGljdHM6IGN1cnJlbnQuY29uZmxpY3RzLFxuICAgIH1cbiAgfVxuXG4gIGlmIChlcXVhbHMoZXhpc3RpbmcsIGluY29taW5nLm1ldGEpKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIGNvbnN0IGNvbmZsaWN0czogQXJyYXk8VHJhaXRNZXRhQ29uZmxpY3Q+ID0gW1xuICAgIC4uLigoY3VycmVudC5jb25mbGljdHMgPz8gW10pIGFzIFJlYWRvbmx5QXJyYXk8VHJhaXRNZXRhQ29uZmxpY3Q+KSxcbiAgXVxuXG4gIGNvbnN0IHB1c2ggPSAoY29uZmxpY3Q6IFRyYWl0TWV0YUNvbmZsaWN0KTogdm9pZCA9PiB7XG4gICAgY29uc3QgZXhpc3RzID0gY29uZmxpY3RzLnNvbWUoXG4gICAgICAoYykgPT4gYy5vcmlnaW4gPT09IGNvbmZsaWN0Lm9yaWdpbiAmJiBlcXVhbHMoYy5tZXRhLCBjb25mbGljdC5tZXRhKSxcbiAgICApXG4gICAgaWYgKCFleGlzdHMpIGNvbmZsaWN0cy5wdXNoKGNvbmZsaWN0KVxuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdDYW5vbmljYWwgPSBleGlzdGluZy5jYW5vbmljYWwgPT09IHRydWVcbiAgY29uc3QgaW5jb21pbmdDYW5vbmljYWwgPSBpbmNvbWluZy5tZXRhLmNhbm9uaWNhbCA9PT0gdHJ1ZVxuXG4gIGlmICghZXhpc3RpbmdDYW5vbmljYWwgJiYgaW5jb21pbmdDYW5vbmljYWwpIHtcbiAgICBwdXNoKHtcbiAgICAgIG9yaWdpbjogY3VycmVudC5vcmlnaW4gPz8gXCJ1bmtub3duXCIsXG4gICAgICBtZXRhOiBleGlzdGluZyxcbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICBtZXRhOiBpbmNvbWluZy5tZXRhLFxuICAgICAgb3JpZ2luOiBpbmNvbWluZy5vcmlnaW4sXG4gICAgICBjb25mbGljdHMsXG4gICAgfVxuICB9XG5cbiAgcHVzaCh7XG4gICAgb3JpZ2luOiBpbmNvbWluZy5vcmlnaW4sXG4gICAgbWV0YTogaW5jb21pbmcubWV0YSxcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIG1ldGE6IGV4aXN0aW5nLFxuICAgIG9yaWdpbjogY3VycmVudC5vcmlnaW4gPz8gaW5jb21pbmcub3JpZ2luLFxuICAgIGNvbmZsaWN0cyxcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IFN0YXRlQXRQYXRoLCBTdGF0ZUZpZWxkUGF0aCB9IGZyb20gXCIuL2ZpZWxkLXBhdGguanNcIlxuaW1wb3J0IHR5cGUgeyBEaXJ0eUFsbFJlYXNvbiB9IGZyb20gXCIuLi9maWVsZC1wYXRoLmpzXCJcbmltcG9ydCAqIGFzIE1ldGEgZnJvbSBcIi4vbWV0YS5qc1wiXG5pbXBvcnQgdHlwZSB7IENvbnZlcmdlU3RhdGljSXJSZWdpc3RyeSB9IGZyb20gXCIuL2NvbnZlcmdlLWlyLmpzXCJcblxuLy8gU3RhdGVUcmFpdCBjb3JlIG1vZGVsXHUzMDAyXG4vLyBcdTUxNzdcdTRGNTNcdTVCNTdcdTZCQjVcdThCRURcdTRFNDlcdTRFMEUgZGF0YS1tb2RlbC5tZCAvIHJlZmVyZW5jZXMvc3RhdGUtdHJhaXQtY29yZS5tZCBcdTRGRERcdTYzMDFcdTVCRjlcdTlGNTBcdTMwMDJcblxuLyoqXG4gKiBTdGF0ZVRyYWl0U3BlYzxTPlx1RkYxQVxuICogLSBNb2R1bGUgXHU1NkZFXHU3RUI4XHU0RTJEIHRyYWl0cyBcdTY5RkRcdTRGNERcdTc2ODRcdTY4MDdcdTUxQzZcdTVGNjJcdTYwMDFcdUZGMUJcbiAqIC0ga2V5IFx1NTNENyBTdGF0ZUZpZWxkUGF0aDxTPiBcdTdFQTZcdTY3NUZcdUZGMEN2YWx1ZSBcdTRFM0FcdTVCRjlcdTVFOTQgc2NvcGUgXHU3Njg0XHU1OEYwXHU2NjBFXHVGRjA4RW50cnkgLyBOb2RlIC8gTGlzdFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0U3BlYzxTPiA9IFMgZXh0ZW5kcyBvYmplY3RcbiAgPyB7XG4gICAgICBbUGF0aCBpbiBTdGF0ZUZpZWxkUGF0aDxTPiB8IFwiJHJvb3RcIl0/OiBTdGF0ZVRyYWl0U3BlY1ZhbHVlPFMsIFBhdGg+XG4gICAgfVxuICA6IG5ldmVyXG5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRLaW5kID0gXCJjb21wdXRlZFwiIHwgXCJzb3VyY2VcIiB8IFwibGlua1wiIHwgXCJjaGVja1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRNZXRhPFMsIFA+IHtcbiAgLyoqXG4gICAqIFx1NjYzRVx1NUYwRlx1NEY5RFx1OEQ1Nlx1NUI1N1x1NkJCNVx1OERFRlx1NUY4NFx1OTZDNlx1NTQwOFx1RkYwOFx1NUZDNVx1OTg3Qlx1RkYwOVx1RkYxQVxuICAgKlxuICAgKiAtIGRlcHMgXHU2NjJGXHU1NTJGXHU0RTAwXHU0RjlEXHU4RDU2XHU0RThCXHU1QjlFXHU2RTkwXHVGRjFBR3JhcGgvUmV2ZXJzZUNsb3N1cmUvXHU1ODlFXHU5MUNGXHU4QzAzXHU1RUE2L1x1NjAyN1x1ODBGRFx1NEYxOFx1NTMxNlx1OTBGRFx1NTNFQVx1OEJBNCBkZXBzXHVGRjFCXG4gICAqIC0gRFNMIFx1NEZBNyBgU3RhdGVUcmFpdC5jb21wdXRlZCh7IGRlcHMsIGdldCB9KWAgXHU3Njg0IGBnZXRgIFx1OTFDN1x1NzUyOCBkZXBzLWFzLWFyZ3NcdUZGMENcdTRFMERcdTY2QjRcdTk3MzIgYChzdGF0ZSkgPT4gLi4uYFx1RkYxQlxuICAgKiAtIGJ1aWxkIFx1OTYzNlx1NkJCNVx1NEYxQVx1NUMwNiBgZ2V0KC4uLmRlcHNWYWx1ZXMpYCBcdTk2NERcdTg5RTNcdTRFM0EgYGRlcml2ZShzdGF0ZSlgIFx1NEY5Qlx1OEZEMFx1ODg0Q1x1NjVGNlx1NjI2N1x1ODg0Q1x1RkYwQ1x1NEY0Nlx1NEY5RFx1OEQ1Nlx1OEJGQlx1OTZDNlx1NEVDRFx1NEVFNSBkZXBzIFx1NEUzQVx1NTFDNlx1RkYxQlxuICAgKiAtIGRldi1tb2RlIFx1NEUwQlx1ODJFNSBgZGVyaXZlKHN0YXRlKWAgXHU3Njg0XHU1QjlFXHU5NjQ1XHU4QkZCXHU1M0Q2XHU0RTBFIGRlcHMgXHU0RTBEXHU0RTAwXHU4MUY0XHVGRjBDXHU0RjFBXHU0RUE3XHU3NTFGIGBkZXBzX21pc21hdGNoYCBcdThCQ0FcdTY1QURcdTU0NEFcdThCNjZcdTMwMDJcbiAgICpcbiAgICogLSBcdTVCRjlcdTRFOEUgUm9vdCBcdTg5QzRcdTUyMTlcdUZGMUFkZXBzIFx1NEUzQSBTdGF0ZUZpZWxkUGF0aDxTdGF0ZT5cdUZGMUJcbiAgICogLSBcdTVCRjlcdTRFOEUgbGlzdC5pdGVtIHNjb3BlXHVGRjFBZGVwcyBcdTRFM0EgU3RhdGVGaWVsZFBhdGg8SXRlbT5cdUZGMDhcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcdUZGMENidWlsZCBcdTk2MzZcdTZCQjVcdTRGMUFcdTUyNERcdTdGMDBcdTUzMTZcdUZGMDlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGRlcHM6IFJlYWRvbmx5QXJyYXk8U3RhdGVGaWVsZFBhdGg8Uz4+XG4gIHJlYWRvbmx5IGRlcml2ZTogKHN0YXRlOiBSZWFkb25seTxTPikgPT4gU3RhdGVBdFBhdGg8UywgUD5cbiAgLyoqXG4gICAqIFx1NTNFRlx1OTAwOVx1RkYxQVx1N0I0OVx1NEVGN1x1NTIyNFx1NUI5QVx1RkYwOFx1NzUyOFx1NEU4RVx1OERGM1x1OEZDN1x1NjVFMFx1NTNEOFx1NTMxNlx1NTE5OVx1NTZERVx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgZXF1YWxzPzogKHByZXY6IFN0YXRlQXRQYXRoPFMsIFA+LCBuZXh0OiBTdGF0ZUF0UGF0aDxTLCBQPikgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZU1ldGE8UywgUD4ge1xuICByZWFkb25seSBkZXBzOiBSZWFkb25seUFycmF5PFN0YXRlRmllbGRQYXRoPFM+PlxuICAvKipcbiAgICogXHU5MDNCXHU4RjkxXHU4RDQ0XHU2RTkwXHU2ODA3XHU4QkM2XHVGRjA4XHU1OTgyIFwidXNlci9wcm9maWxlXCJcdUZGMDlcdTMwMDJcbiAgICpcbiAgICogLSBTdGF0ZVRyYWl0LnNvdXJjZSBEU0wgXHU0RTJEXHU3Njg0IGByZXNvdXJjZWAgXHU1QjU3XHU2QkI1XHU1NzI4IGJ1aWxkIFx1OTYzNlx1NkJCNVx1NEYxQVx1ODQzRFx1NTcyOFx1NkI2NFx1NTkwNFx1RkYxQlxuICAgKiAtIGRhdGEtbW9kZWwubWQgXHU0RTJEXHU4QkIwXHU0RTNBIHJlc291cmNlSWRcdUZGMENcdThGRDlcdTkxQ0NcdTZDQkZcdTc1MjggRFNMIFx1NTQ3RFx1NTQwRFx1OTA3Rlx1NTE0RFx1NkRGN1x1NkRDNlx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZ1xuICAvKipcbiAgICogXHU0RUNFXHU1QjhDXHU2NTc0IFN0YXRlIFx1OEJBMVx1N0I5N1x1OEJCRlx1OTVFRVx1OEJFNVx1OEQ0NFx1NkU5MFx1NjI0MFx1OTcwMCBrZXkgXHU3Njg0XHU4OUM0XHU1MjE5XHUzMDAyXG4gICAqXG4gICAqIC0gXHU1MTQxXHU4QkI4XHU4RkQ0XHU1NkRFIHVuZGVmaW5lZFx1RkYxQVx1ODg2OFx1NzkzQVx1OEJFNVx1OEQ0NFx1NkU5MFx1NTcyOFx1NUY1M1x1NTI0RCBzdGF0ZSBcdTRFMEJcdTY3MkFcdTZGQzBcdTZEM0JcdUZGMDhcdTVFOTRcdTU2REVcdTY1MzZcdTRFM0EgaWRsZVx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiAoc3RhdGU6IFJlYWRvbmx5PFM+KSA9PiB1bmtub3duXG4gIHJlYWRvbmx5IHRyaWdnZXJzPzogUmVhZG9ubHlBcnJheTxcIm9uTW91bnRcIiB8IFwib25WYWx1ZUNoYW5nZVwiIHwgXCJtYW51YWxcIj5cbiAgcmVhZG9ubHkgZGVib3VuY2VNcz86IG51bWJlclxuICByZWFkb25seSBjb25jdXJyZW5jeT86IFwic3dpdGNoXCIgfCBcImV4aGF1c3QtdHJhaWxpbmdcIlxuICAvKipcbiAgICogXHU3NTI4XHU0RThFIERldnRvb2xzL1x1NjU4N1x1Njg2M1x1NzY4NFx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NTE0M1x1NEZFMVx1NjA2Rlx1RkYwOFx1NzY3RFx1NTQwRFx1NTM1NVx1NUI1N1x1NkJCNVx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YT86IE1ldGEuVHJhaXRNZXRhXG4gIC8qKlxuICAgKiBcdTk4ODRcdTc1NTlcdUZGMUFcdTU3MjggYnVpbGQgXHU5NjM2XHU2QkI1XHU1M0VGXHU1ODZCXHU1MTQ1XHU4QkU1IFRyYWl0IFx1NjI0MFx1NTcyOFx1NUI1N1x1NkJCNVx1OERFRlx1NUY4NFx1RkYwQ1x1NEZCRlx1NEU4RVx1OEMwM1x1OEJENVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgX2ZpZWxkUGF0aD86IFBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rTWV0YTxTPiB7XG4gIC8qKlxuICAgKiBcdTZFOTBcdTVCNTdcdTZCQjVcdThERUZcdTVGODRcdUZGMENcdTU0MENcdTY4MzdcdTUzRDcgU3RhdGVGaWVsZFBhdGg8Uz4gXHU3RUE2XHU2NzVGXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBmcm9tOiBTdGF0ZUZpZWxkUGF0aDxTPlxufVxuXG5leHBvcnQgdHlwZSBDaGVja1J1bGU8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPiA9XG4gIHtcbiAgICByZWFkb25seSBkZXBzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgICAvKipcbiAgICAgKiB2YWxpZGF0ZU9uXHVGRjFBXG4gICAgICogLSBcdTRFQzVcdTVGNzFcdTU0Q0RcdTgxRUFcdTUyQThcdTY4MjFcdTlBOENcdTk2MzZcdTZCQjVcdUZGMDhvbkNoYW5nZS9vbkJsdXJcdUZGMDlcdUZGMUJzdWJtaXQvbWFudWFsIFx1NTlDQlx1N0VDOFx1NjI2N1x1ODg0Q1x1RkYxQlxuICAgICAqIC0gXHU0RTNBXHU3QTdBXHU2NTcwXHU3RUM0XHU4ODY4XHU3OTNBXHU3OTgxXHU3NTI4XHU4MUVBXHU1MkE4XHU2ODIxXHU5QThDXHVGRjA4XHU0RUM1IHN1Ym1pdC9tYW51YWwgXHU2MjY3XHU4ODRDXHVGRjA5XHUzMDAyXG4gICAgICovXG4gICAgcmVhZG9ubHkgdmFsaWRhdGVPbj86IFJlYWRvbmx5QXJyYXk8XCJvbkNoYW5nZVwiIHwgXCJvbkJsdXJcIj5cbiAgICByZWFkb25seSB2YWxpZGF0ZTogKGlucHV0OiBJbnB1dCwgY3R4OiBDdHgpID0+IHVua25vd25cbiAgICByZWFkb25seSBtZXRhPzogTWV0YS5UcmFpdE1ldGFcbiAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrTWV0YTxJbnB1dCA9IHVua25vd24sIEN0eCA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFx1NTQ3RFx1NTQwRFx1ODlDNFx1NTIxOVx1OTZDNlx1NTQwOFx1RkYwOFx1OEJCMFx1NUY1NVx1NzUyOFx1NEU4RVx1Nzg2RVx1NUI5QVx1NjAyN1x1NTQwOFx1NUU3Nlx1NEUwRVx1OEJDQVx1NjVBRFx1NUM1NVx1NzkzQVx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgcnVsZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoZWNrUnVsZTxJbnB1dCwgQ3R4Pj4+XG4gIC8qKlxuICAgKiBcdTk1MTlcdThCRUZcdTY4MTFcdTUxOTlcdTU2REVcdUZGMDhQaGFzZSAyXHVGRjFBXHU0RUM1XHU1NkZBXHU1MzE2XHU3RUQzXHU2Nzg0XHVGRjFCXHU1MTc3XHU0RjUzXHU1MTk5XHU1NkRFXHU4QkVEXHU0RTQ5XHU1NzI4XHU1NDBFXHU3RUVEIFBoYXNlIFx1NUI5RVx1NzNCMFx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGViYWNrPzoge1xuICAgIHJlYWRvbmx5IGtpbmQ6IFwiZXJyb3JzXCJcbiAgICByZWFkb25seSBwYXRoPzogc3RyaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0RW50cnk8UywgUD5cdUZGMUFcbiAqIC0gXHU4ODY4XHU3OTNBXHU2N0QwXHU0RTJBXHU1QjU3XHU2QkI1XHU4REVGXHU1Rjg0IFAgXHU0RTBBXHU3Njg0XHU0RTAwXHU5ODc5IFRyYWl0IFx1OTE0RFx1N0Y2RVx1RkYxQlxuICogLSBraW5kIFx1NEUwRSBtZXRhIFx1NjIxMFx1NUJGOVx1NTFGQVx1NzNCMFx1RkYwQ1x1NzUyOFx1NEU4RVx1NTcyOCBidWlsZC9pbnN0YWxsIFx1OTYzNlx1NkJCNVx1NTIwNlx1NkQzRVx1ODg0Q1x1NEUzQVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0RW50cnk8XG4gIFMgPSB1bmtub3duLFxuICBQIGV4dGVuZHMgc3RyaW5nID0gU3RhdGVGaWVsZFBhdGg8Uz5cbj4gPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogUFxuICAgICAgcmVhZG9ubHkga2luZDogXCJjb21wdXRlZFwiXG4gICAgICByZWFkb25seSBtZXRhOiBDb21wdXRlZE1ldGE8UywgUD5cbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBQXG4gICAgICByZWFkb25seSBraW5kOiBcInNvdXJjZVwiXG4gICAgICByZWFkb25seSBtZXRhOiBTb3VyY2VNZXRhPFMsIFA+XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogUFxuICAgICAgcmVhZG9ubHkga2luZDogXCJsaW5rXCJcbiAgICAgIHJlYWRvbmx5IG1ldGE6IExpbmtNZXRhPFM+XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogUFxuICAgICAgcmVhZG9ubHkga2luZDogXCJjaGVja1wiXG4gICAgICByZWFkb25seSBtZXRhOiBDaGVja01ldGE8dW5rbm93biwgdW5rbm93bj5cbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdE5vZGU8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPiB7XG4gIHJlYWRvbmx5IF90YWc6IFwiU3RhdGVUcmFpdE5vZGVcIlxuICByZWFkb25seSBjb21wdXRlZD86XG4gICAgfCBTdGF0ZVRyYWl0RW50cnk8SW5wdXQsIGFueT5cbiAgICB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFN0YXRlVHJhaXRFbnRyeTxJbnB1dCwgYW55Pj4+XG4gIHJlYWRvbmx5IHNvdXJjZT86XG4gICAgfCBTdGF0ZVRyYWl0RW50cnk8SW5wdXQsIGFueT5cbiAgICB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFN0YXRlVHJhaXRFbnRyeTxJbnB1dCwgYW55Pj4+XG4gIHJlYWRvbmx5IGxpbms/OlxuICAgIHwgU3RhdGVUcmFpdEVudHJ5PElucHV0LCBhbnk+XG4gICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTdGF0ZVRyYWl0RW50cnk8SW5wdXQsIGFueT4+PlxuICByZWFkb25seSBjaGVjaz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoZWNrUnVsZTxJbnB1dCwgQ3R4Pj4+XG4gIHJlYWRvbmx5IG1ldGE/OiBNZXRhLlRyYWl0TWV0YVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRMaXN0PEl0ZW0gPSB1bmtub3duPiB7XG4gIHJlYWRvbmx5IF90YWc6IFwiU3RhdGVUcmFpdExpc3RcIlxuICByZWFkb25seSBpdGVtPzogU3RhdGVUcmFpdE5vZGU8SXRlbSwgYW55PlxuICByZWFkb25seSBsaXN0PzogU3RhdGVUcmFpdE5vZGU8UmVhZG9ubHlBcnJheTxJdGVtPiwgYW55PlxuICByZWFkb25seSBpZGVudGl0eUhpbnQ/OiB7XG4gICAgcmVhZG9ubHkgdHJhY2tCeT86IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRTcGVjVmFsdWU8UywgUCBleHRlbmRzIHN0cmluZz4gPVxuICB8IFN0YXRlVHJhaXRFbnRyeTxTLCBQPlxuICB8IFN0YXRlVHJhaXROb2RlPGFueSwgYW55PlxuICB8IFN0YXRlVHJhaXRMaXN0PGFueT5cblxuLyoqXG4gKiBTdGF0ZVRyYWl0RmllbGRcdUZGMUFcbiAqIC0gXHU4ODY4XHU3OTNBIFN0YXRlIFx1NEUyRFx1NzY4NFx1NEUwMFx1NEUyQVx1NUI1N1x1NkJCNVx1ODI4Mlx1NzBCOVx1RkYwOFx1NEUwRFx1OEJCQVx1NjYyRlx1NTQyNlx1NjMwMiBUcmFpdFx1RkYwOVx1RkYxQlxuICogLSBcdTc1MzEgYnVpbGQgXHU5NjM2XHU2QkI1XHU0RUNFIFN0YXRlVHJhaXRTcGVjIFx1NUY1Mlx1NEUwMFx1NTMxNlx1ODAwQ1x1Njc2NVx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRGaWVsZCB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nXG4gIHJlYWRvbmx5IHZhbHVlVHlwZT86IHN0cmluZ1xuICByZWFkb25seSB0cmFpdHM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEZpZWxkVHJhaXQ+XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdEZpZWxkVHJhaXRcdUZGMUFcbiAqIC0gXHU2N0QwXHU0RTJBXHU1QjU3XHU2QkI1XHU0RTBBXHU3Njg0XHU0RTAwXHU5ODc5IFRyYWl0XHVGRjA4Y29tcHV0ZWQgLyBzb3VyY2UgLyBsaW5rXHVGRjA5XHU3Njg0XHU3RUQzXHU2Nzg0XHU1MzE2XHU2M0NGXHU4RkYwXHVGRjFCXG4gKiAtIG1ldGEgXHU0RTBFIFN0YXRlVHJhaXRFbnRyeS5tZXRhIFx1NUJGOVx1OUY1MFx1RkYwQ2RlcHMgXHU4ODY4XHU3OTNBXHU4QkU1IFRyYWl0IFx1NjI0MFx1NEY5RFx1OEQ1Nlx1NzY4NFx1NUI1N1x1NkJCNVx1OERFRlx1NUY4NFx1OTZDNlx1NTQwOFx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRGaWVsZFRyYWl0IHtcbiAgcmVhZG9ubHkgZmllbGRJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6IFN0YXRlVHJhaXRLaW5kXG4gIHJlYWRvbmx5IG1ldGE6XG4gICAgfCBDb21wdXRlZE1ldGE8dW5rbm93biwgc3RyaW5nPlxuICAgIHwgU291cmNlTWV0YTx1bmtub3duLCBzdHJpbmc+XG4gICAgfCBMaW5rTWV0YTx1bmtub3duPlxuICAgIHwgQ2hlY2tNZXRhPHVua25vd24sIHVua25vd24+XG4gIHJlYWRvbmx5IGRlcHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG4vKipcbiAqIFN0YXRlVHJhaXRSZXNvdXJjZVx1RkYxQVxuICogLSBcdTYzQ0ZcdThGRjAgc291cmNlIFx1NTc4QiBUcmFpdCBcdTYyNDBcdTRGOURcdThENTZcdTc2ODRcdTkwM0JcdThGOTFcdThENDRcdTZFOTBcdTUxNDNcdTRGRTFcdTYwNkZcdUZGMUJcbiAqIC0gUmVzb3VyY2VTcGVjIFx1NzY4NFx1NTE3N1x1NEY1M1x1NUI5RVx1NzNCMFx1NzUzMSBSZXNvdXJjZSBcdTU0N0RcdTU0MERcdTdBN0FcdTk1RjRcdThEMUZcdThEMjNcdUZGMENcdThGRDlcdTkxQ0NcdTUzRUFcdTRGRERcdTc1NTkgVHJhaXQgXHU4OUM2XHU4OUQyXHU3Njg0XHU0RjlEXHU4RDU2XHU0RkUxXHU2MDZGXHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdFJlc291cmNlIHtcbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtleVNlbGVjdG9yOiBzdHJpbmdcbiAgcmVhZG9ubHkga2V5RXhhbXBsZT86IHVua25vd25cbiAgcmVhZG9ubHkgb3duZXJGaWVsZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtZXRhPzogTWV0YS5UcmFpdE1ldGFcbiAgcmVhZG9ubHkgbWV0YU9yaWdpbj86IHN0cmluZ1xuICByZWFkb25seSBtZXRhQ29uZmxpY3RzPzogUmVhZG9ubHlBcnJheTxNZXRhLlRyYWl0TWV0YUNvbmZsaWN0PlxufVxuXG4vKipcbiAqIEdyYXBoIE5vZGUgLyBFZGdlXHVGRjFBXG4gKiAtIFx1ODI4Mlx1NzBCOVx1OTAxQVx1NUUzOFx1NUJGOVx1NUU5NFx1NEUwMFx1NEUyQVx1NUI1N1x1NkJCNVx1RkYxQlxuICogLSBcdThGQjlcdTg4NjhcdTc5M0FcdTVCNTdcdTZCQjVcdTRFNEJcdTk1RjRcdTYyMTZcdTVCNTdcdTZCQjVcdTRFMEVcdThENDRcdTZFOTBcdTRFNEJcdTk1RjRcdTc2ODRcdTRGOURcdThENTZcdTUxNzNcdTdDRkJcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0R3JhcGhOb2RlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBmaWVsZDogU3RhdGVUcmFpdEZpZWxkXG4gIHJlYWRvbmx5IHRyYWl0czogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0RmllbGRUcmFpdD5cbiAgcmVhZG9ubHkgbWV0YT86IE1ldGEuVHJhaXRNZXRhXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdEdyYXBoRWRnZSB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZnJvbTogc3RyaW5nXG4gIHJlYWRvbmx5IHRvOiBzdHJpbmdcbiAgcmVhZG9ubHkga2luZDogXCJjb21wdXRlZFwiIHwgXCJsaW5rXCIgfCBcInNvdXJjZS1kZXBcIiB8IFwiY2hlY2stZGVwXCJcbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0R3JhcGhcdUZGMUFcbiAqIC0gU3RhdGVUcmFpdCBcdTVGMTVcdTY0Q0VcdTc2ODRcdTdFRDNcdTY3ODRcdTg5QzZcdTU2RkVcdUZGMENcdTRFMDBcdTVGMjBcdTUzMDVcdTU0MkJcdTgyODJcdTcwQjlcdTRFMEVcdTRGOURcdThENTZcdThGQjlcdTc2ODRcdTU2RkVcdUZGMUJcbiAqIC0gXHU0RjlCIERldnRvb2xzIC8gU3R1ZGlvIFx1NEUwRSBSdW50aW1lIFx1NTA1QVx1N0VEM1x1Njc4NFx1NTIwNlx1Njc5MFx1NEUwRVx1NTNFRlx1ODlDNlx1NTMxNlx1NEY3Rlx1NzUyOFx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRHcmFwaCB7XG4gIHJlYWRvbmx5IF90YWc6IFwiU3RhdGVUcmFpdEdyYXBoXCJcbiAgcmVhZG9ubHkgbm9kZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEdyYXBoTm9kZT5cbiAgcmVhZG9ubHkgZWRnZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEdyYXBoRWRnZT5cbiAgcmVhZG9ubHkgcmVzb3VyY2VzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRSZXNvdXJjZT5cbiAgcmVhZG9ubHkgbWV0YT86IHtcbiAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmdcbiAgfVxufVxuXG4vKipcbiAqIFN0YXRlVHJhaXRQbGFuU3RlcFx1RkYxQVxuICogLSBTdGF0ZVRyYWl0Lmluc3RhbGwgLyBSdW50aW1lIFx1NjI2N1x1ODg0Q1x1NjVGNlx1NzY4NFx1NjcwMFx1NUMwRlx1NjMwN1x1NEVFNFx1NTM1NVx1NTE0M1x1RkYxQlxuICogLSBcdTc1MzEgR3JhcGggXHU2M0E4XHU1QkZDXHU4MDBDXHU2NzY1XHVGRjBDXHU3NTI4XHU0RThFXHU1NzI4XHU4RkQwXHU4ODRDXHU2NUY2XHU1Qjg5XHU4OEM1IHdhdGNoZXIgXHU2MjE2XHU4OUU2XHU1M0QxXHU1OTE2XHU5MEU4XHU4QzAzXHU3NTI4XHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdFBsYW5TdGVwIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBcImNvbXB1dGVkLXVwZGF0ZVwiIHwgXCJsaW5rLXByb3BhZ2F0ZVwiIHwgXCJzb3VyY2UtcmVmcmVzaFwiIHwgXCJjaGVjay12YWxpZGF0ZVwiXG4gIHJlYWRvbmx5IHRhcmdldEZpZWxkUGF0aD86IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2VGaWVsZFBhdGhzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IHJlc291cmNlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkga2V5U2VsZWN0b3JJZD86IHN0cmluZ1xuICByZWFkb25seSBkZWJ1Z0luZm8/OiB7XG4gICAgcmVhZG9ubHkgZ3JhcGhOb2RlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBncmFwaEVkZ2VJZD86IHN0cmluZ1xuICB9XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdFBsYW5cdUZGMUFcbiAqIC0gXHU2QzQ3XHU2MDNCXHU2N0QwXHU2QTIxXHU1NzU3XHU2MjQwXHU2NzA5IFRyYWl0IFx1ODg0Q1x1NEUzQVx1NzY4NFx1NjI2N1x1ODg0Q1x1OEJBMVx1NTIxMlx1RkYxQlxuICogLSBpbnN0YWxsIFx1OTYzNlx1NkJCNVx1NjMwOSBQbGFuIFx1NUMwNlx1ODg0Q1x1NEUzQVx1NjMwMlx1OEY3RFx1NTIzMCBCb3VuZCBBUEkgLyBFZmZlY3RPcCBcdTdCQTFcdTkwNTNcdTRFMEFcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0UGxhbiB7XG4gIHJlYWRvbmx5IF90YWc6IFwiU3RhdGVUcmFpdFBsYW5cIlxuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0UGxhblN0ZXA+XG4gIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxufVxuXG4vKipcbiAqIFN0YXRlVHJhaXRQcm9ncmFtPFM+XHVGRjFBXG4gKiAtIFN0YXRlVHJhaXQgXHU1RjE1XHU2NENFXHU3Njg0IFByb2dyYW0gXHU4RjkzXHU1MUZBXHVGRjBDXHU2NjJGIFJ1bnRpbWUgLyBEZXZ0b29scyBcdTc2ODRcdTdFREZcdTRFMDBcdTUxNjVcdTUzRTNcdUZGMUJcbiAqIC0gc3RhdGVTY2hlbWEgXHU0RTBFIHNwZWMgXHU0RkREXHU3NTU5XHU1MzlGXHU1OUNCXHU4RjkzXHU1MTY1XHVGRjBDZ3JhcGgvcGxhbiBcdTRFM0FcdTUxODVcdTkwRTggSVJcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0UHJvZ3JhbTxTPiB7XG4gIHJlYWRvbmx5IHN0YXRlU2NoZW1hOiBTY2hlbWEuU2NoZW1hPFMsIGFueT5cbiAgcmVhZG9ubHkgc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz5cbiAgLyoqXG4gICAqIFByb2dyYW0uZW50cmllc1x1RkYxQVxuICAgKiAtIGJ1aWxkIFx1OTYzNlx1NkJCNVx1NEVDRSBzcGVjXHVGRjA4XHU1NDJCIG5vZGUvbGlzdC8kcm9vdFx1RkYwOVx1NUY1Mlx1NEUwMFx1NTMxNlx1NUY5N1x1NTIzMFx1NzY4NFx1NjcwMFx1NUMwRlx1ODlDNFx1NTIxOVx1OTZDNlx1NTQwOFx1RkYxQlxuICAgKiAtIFBoYXNlIDIgXHU1MTQ4XHU0RkREXHU4QkMxXHUyMDFDXHU1M0VGXHU4QkZCXHU1M0VGXHU4QkNBXHU2NUFEXHU3Njg0XHU3RUQzXHU2Nzg0XHUyMDFEXHVGRjBDXHU1NDBFXHU3RUVEIFBoYXNlIFx1NjI0RFx1NjNBNVx1NTE2NVx1NjI2N1x1ODg0Q1x1NEUwRVx1NjUzNlx1NjU1Qlx1OEJFRFx1NEU0OVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cmllczogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+PlxuICByZWFkb25seSBncmFwaDogU3RhdGVUcmFpdEdyYXBoXG4gIHJlYWRvbmx5IHBsYW46IFN0YXRlVHJhaXRQbGFuXG4gIHJlYWRvbmx5IGNvbnZlcmdlSXI/OiBDb252ZXJnZVN0YXRpY0lyUmVnaXN0cnlcbn1cblxuLyoqXG4gKiBcdTRFQ0UgU3RhdGVUcmFpdFNwZWMgXHU2Nzg0XHU1RUZBXHU1RjUyXHU0RTAwXHU1MzE2XHU3Njg0IGVudHJ5IFx1NTIxN1x1ODg2OFx1MzAwMlxuICpcbiAqIC0gUGhhc2UgMlx1RkYxQVx1NjUyRlx1NjMwMSBub2RlL2xpc3QvJHJvb3QgXHU3Njg0XHU3RUQzXHU2Nzg0XHU1QzU1XHU1RjAwXHVGRjBDXHU1RTc2XHU1NzI4XHU1RkM1XHU4OTgxXHU2NUY2XHU4ODY1XHU1MTY4L1x1NTI0RFx1N0YwMFx1NTMxNiBmaWVsZFBhdGggXHU0RTBFIGRlcHNcdUZGMUJcbiAqIC0gXHU1NDBFXHU3RUVEIFBoYXNlIFx1NTNFRlx1NTcyOFx1NkI2NFx1NTkwNFx1NjI2OVx1NUM1NVx1NjgyMVx1OUE4Q1x1OTAzQlx1OEY5MVx1RkYwOFx1NEY4Qlx1NTk4Mlx1NjhDMFx1NkQ0Qlx1OTFDRFx1NTkwRFx1NUI5QVx1NEU0OVx1MzAwMVx1ODk4Nlx1NzZENlx1NjczQVx1NTIzNlx1N0I0OVx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplU3BlYyA9IDxTPihcbiAgc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz4sXG4pOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+ID0+IHtcbiAgY29uc3QgZW50cmllczogQXJyYXk8U3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPj4gPSBbXVxuXG4gIGNvbnN0IGlzTm9kZSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0YXRlVHJhaXROb2RlPGFueSwgYW55PiA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KS5fdGFnID09PSBcIlN0YXRlVHJhaXROb2RlXCJcblxuICBjb25zdCBpc0xpc3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGF0ZVRyYWl0TGlzdDxhbnk+ID0+XG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpLl90YWcgPT09IFwiU3RhdGVUcmFpdExpc3RcIlxuXG4gIGNvbnN0IGpvaW5QYXRoID0gKHByZWZpeDogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFwcmVmaXgpIHJldHVybiBzdWZmaXhcbiAgICBpZiAoIXN1ZmZpeCkgcmV0dXJuIHByZWZpeFxuICAgIHJldHVybiBgJHtwcmVmaXh9LiR7c3VmZml4fWBcbiAgfVxuXG4gIGNvbnN0IHByZWZpeERlcHMgPSAoXG4gICAgZGVwczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICAgIHByZWZpeDogc3RyaW5nLFxuICApOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICAgIGlmICghZGVwcyB8fCBkZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdXG4gICAgcmV0dXJuIGRlcHMubWFwKChkKSA9PiAocHJlZml4ID8gam9pblBhdGgocHJlZml4LCBkKSA6IGQpKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplRW50cnkgPSAoXG4gICAgZW50cnk6IFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4sXG4gICAgZmllbGRQYXRoOiBzdHJpbmcsXG4gICAgZGVwUHJlZml4OiBzdHJpbmcsXG4gICk6IFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4gPT4ge1xuICAgIGlmIChlbnRyeS5raW5kID09PSBcImNvbXB1dGVkXCIpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBlbnRyeS5tZXRhIGFzIGFueVxuICAgICAgY29uc3QgcmF3RGVwcyA9IG1ldGEuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlcHMgPVxuICAgICAgICByYXdEZXBzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHByZWZpeERlcHMocmF3RGVwcywgZGVwUHJlZml4KVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4oZW50cnkgYXMgYW55KSxcbiAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICBtZXRhOiB7IC4uLm1ldGEsIGRlcHMgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVudHJ5LmtpbmQgPT09IFwic291cmNlXCIpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBlbnRyeS5tZXRhIGFzIGFueVxuICAgICAgY29uc3QgcmF3RGVwcyA9IG1ldGEuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlcHMgPVxuICAgICAgICByYXdEZXBzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHByZWZpeERlcHMocmF3RGVwcywgZGVwUHJlZml4KVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4oZW50cnkgYXMgYW55KSxcbiAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICBtZXRhOiB7IC4uLm1ldGEsIGRlcHMsIF9maWVsZFBhdGg6IGZpZWxkUGF0aCB9LFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJsaW5rXCIpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBlbnRyeS5tZXRhIGFzIGFueVxuICAgICAgY29uc3QgZnJvbSA9IHByZWZpeERlcHMoW21ldGEuZnJvbSBhcyBzdHJpbmddLCBkZXBQcmVmaXgpWzBdID8/IG1ldGEuZnJvbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGVudHJ5IGFzIGFueSksXG4gICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgbWV0YTogeyAuLi5tZXRhLCBmcm9tIH0sXG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrXHVGRjFBUGhhc2UgMiBcdTRFQzVcdThDMDNcdTY1NzQgZmllbGRQYXRoXHVGRjBDZGVwcyBcdTRFQ0RcdTc1MzEgbWV0YS5ydWxlcyBcdTU3MjggYnVpbGQgXHU5NjM2XHU2QkI1XHU2QzQ3XHU2MDNCXHUzMDAyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihlbnRyeSBhcyBhbnkpLFxuICAgICAgZmllbGRQYXRoLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4cGFuZE5vZGUgPSAoXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIGpvaW5QcmVmaXg6IHN0cmluZyxcbiAgICBub2RlOiBTdGF0ZVRyYWl0Tm9kZTxhbnksIGFueT4sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIC8qKlxuICAgICAgICogY2hlY2sgZGVwcyBcdTUyNERcdTdGMDBcdUZGMUFcdTc1MjhcdTRFOEUgbGlzdC1zY29wZSBjaGVjayBcdTc2ODRcdTlFRDhcdThCQTRcdThCRURcdTRFNDlcdUZGMDhkZXBzIFx1NzZGOFx1NUJGOVx1MjAxQ1x1ODg0Q1x1NTE0M1x1N0QyMFx1MjAxRFx1ODAwQ1x1OTc1RSBsaXN0IFx1NjgzOVx1RkYwOVx1MzAwMlxuICAgICAgICpcbiAgICAgICAqIC0gaXRlbSBzY29wZVx1RkYxQWRlcHNQcmVmaXggPSBgJHtsaXN0UGF0aH1bXWBcdUZGMDhcdTRFMEUgam9pblByZWZpeCBcdTRFMDBcdTgxRjRcdUZGMDlcdUZGMUJcbiAgICAgICAqIC0gbGlzdCBzY29wZVx1RkYxQWZpZWxkUGF0aCA9IGAke2xpc3RQYXRofWBcdUZGMENcdTRGNDYgZGVwc1ByZWZpeCBcdTVFOTRcdTRFM0EgYCR7bGlzdFBhdGh9W11gXHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IGNoZWNrRGVwc1ByZWZpeD86IHN0cmluZ1xuICAgIH0sXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGFkZEVudHJ5ID0gKHJlbGF0aXZlVGFyZ2V0OiBzdHJpbmcsIHJhdzogU3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcmVsID0gKHJhdyBhcyBhbnkpLmZpZWxkUGF0aCA/PyByZWxhdGl2ZVRhcmdldFxuICAgICAgY29uc3QgZmllbGRQYXRoID0gam9pblByZWZpeCA/IGpvaW5QYXRoKGpvaW5QcmVmaXgsIFN0cmluZyhyZWwpKSA6IFN0cmluZyhyZWwpXG4gICAgICBlbnRyaWVzLnB1c2gobm9ybWFsaXplRW50cnkocmF3LCBmaWVsZFBhdGgsIGpvaW5QcmVmaXgpKVxuICAgIH1cblxuICAgIGNvbnN0IGV4cGFuZE1heWJlUmVjb3JkID0gKFxuICAgICAgdmFsdWU6XG4gICAgICAgIHwgU3RhdGVUcmFpdEVudHJ5PGFueSwgYW55PlxuICAgICAgICB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFN0YXRlVHJhaXRFbnRyeTxhbnksIGFueT4+PlxuICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVyblxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5raW5kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGFkZEVudHJ5KFwiXCIsIHZhbHVlIGFzIGFueSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCByZWNvcmQgPSB2YWx1ZSBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTdGF0ZVRyYWl0RW50cnk8YW55LCBhbnk+Pj5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlY29yZCkge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZWNvcmQsIGtleSkpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcmVjb3JkW2tleV1cbiAgICAgICAgaWYgKCFlbnRyeSkgY29udGludWVcbiAgICAgICAgYWRkRW50cnkoa2V5LCBlbnRyeSBhcyBhbnkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZXhwYW5kTWF5YmVSZWNvcmQobm9kZS5jb21wdXRlZClcbiAgICBleHBhbmRNYXliZVJlY29yZChub2RlLnNvdXJjZSlcbiAgICBleHBhbmRNYXliZVJlY29yZChub2RlLmxpbmspXG5cbiAgICBpZiAobm9kZS5jaGVjaykge1xuICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIENoZWNrUnVsZTxhbnksIGFueT4+ID0ge31cbiAgICAgIGNvbnN0IGNoZWNrRGVwc1ByZWZpeCA9XG4gICAgICAgIG9wdGlvbnM/LmNoZWNrRGVwc1ByZWZpeCA/PyAoam9pblByZWZpeC5lbmRzV2l0aChcIltdXCIpID8gam9pblByZWZpeCA6IFwiXCIpXG5cbiAgICAgIGNvbnN0IHByZWZpeENoZWNrRGVwcyA9IChcbiAgICAgICAgZGVwczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICAgICAgKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgICAgICAgaWYgKCFkZXBzIHx8IGRlcHMubGVuZ3RoID09PSAwKSByZXR1cm4gW11cbiAgICAgICAgcmV0dXJuIGRlcHMubWFwKChkKSA9PlxuICAgICAgICAgIGQgPT09IFwiXCIgPyBzY29wZUlkIDogKGNoZWNrRGVwc1ByZWZpeCA/IGpvaW5QYXRoKGNoZWNrRGVwc1ByZWZpeCwgZCkgOiBkKSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG5vZGUuY2hlY2spKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSAobm9kZS5jaGVjayBhcyBhbnkpW25hbWVdIGFzIENoZWNrUnVsZTxhbnksIGFueT5cbiAgICAgICAgaWYgKHR5cGVvZiBydWxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBydWxlc1tuYW1lXSA9IHJ1bGVcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlICYmIHR5cGVvZiBydWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IE1ldGEuc2FuaXRpemUoKHJ1bGUgYXMgYW55KS5tZXRhKVxuICAgICAgICAgIHJ1bGVzW25hbWVdID0ge1xuICAgICAgICAgICAgLi4ucnVsZSxcbiAgICAgICAgICAgIGRlcHM6IHByZWZpeENoZWNrRGVwcyhydWxlLmRlcHMpLFxuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICAvLyBcdTk3NUVcdTZDRDVcdThGOTNcdTUxNjVcdUZGMUFcdTVGRkRcdTc1NjVcdUZGMDhcdTU0MEVcdTdFRUQgUGhhc2UgXHU1QzA2XHU1NzI4IGJ1aWxkIFx1OTYzNlx1NkJCNVx1NjNEMFx1NTM0N1x1NEUzQVx1OTE0RFx1N0Y2RVx1OTUxOVx1OEJFRlx1RkYwOVx1MzAwMlxuICAgICAgfVxuXG4gICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICBmaWVsZFBhdGg6IHNjb3BlSWQsXG4gICAgICAgIGtpbmQ6IFwiY2hlY2tcIixcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgIHJ1bGVzLFxuICAgICAgICAgIHdyaXRlYmFjazogeyBraW5kOiBcImVycm9yc1wiIH0sXG4gICAgICAgIH0sXG4gICAgICB9IGFzIFN0YXRlVHJhaXRFbnRyeTxhbnksIGFueT4pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gc3BlYykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIGtleSkpIGNvbnRpbnVlXG4gICAgY29uc3QgcmF3ID0gc3BlY1trZXkgYXMga2V5b2YgdHlwZW9mIHNwZWNdIGFzIFN0YXRlVHJhaXRTcGVjVmFsdWU8UywgYW55PiB8IHVuZGVmaW5lZFxuICAgIGlmICghcmF3KSBjb250aW51ZVxuXG4gICAgaWYgKGlzTGlzdChyYXcpKSB7XG4gICAgICBjb25zdCBsaXN0UGF0aCA9IGtleVxuICAgICAgaWYgKHJhdy5pdGVtKSB7XG4gICAgICAgIGV4cGFuZE5vZGUoYCR7bGlzdFBhdGh9W11gLCBgJHtsaXN0UGF0aH1bXWAsIHJhdy5pdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHJhdy5saXN0KSB7XG4gICAgICAgIGV4cGFuZE5vZGUobGlzdFBhdGgsIGxpc3RQYXRoLCByYXcubGlzdCwge1xuICAgICAgICAgIGNoZWNrRGVwc1ByZWZpeDogYCR7bGlzdFBhdGh9W11gLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoaXNOb2RlKHJhdykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiJHJvb3RcIikge1xuICAgICAgICBleHBhbmROb2RlKFwiJHJvb3RcIiwgXCJcIiwgcmF3KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhwYW5kTm9kZShrZXksIGtleSwgcmF3KVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeSA9IHJhdyBhcyBhbnkgYXMgU3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPlxuICAgIGNvbnN0IGZpZWxkUGF0aCA9IChlbnRyeSBhcyBhbnkpLmZpZWxkUGF0aCA/PyBrZXlcbiAgICBlbnRyaWVzLnB1c2gobm9ybWFsaXplRW50cnkoZW50cnksIFN0cmluZyhmaWVsZFBhdGgpLCBcIlwiKSlcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbi8qKlxuICogY29sbGVjdE5vZGVNZXRhXHVGRjFBXG4gKiAtIFx1NEVDRSBTdGF0ZVRyYWl0U3BlYyBcdTRFMkRcdTYzRDBcdTUzRDYgU3RhdGVUcmFpdE5vZGUubWV0YVx1RkYwOFx1NzY3RFx1NTQwRFx1NTM1NVx1NUI1N1x1NkJCNVx1RkYwOVx1RkYwQ1x1NEY5QiBEZXZ0b29scyBcdThGREJcdTg4NENcdTdFRDNcdTY3ODRcdTVDNTVcdTc5M0FcdUZGMUJcbiAqIC0gbWV0YSBcdTRFQzVcdTc1MjhcdTRFOEVcdThCQ0FcdTY1QURcdTRFMEVcdTVDNTVcdTc5M0FcdUZGMENcdTRFMERcdTUzQzJcdTRFMEVcdThGRDBcdTg4NENcdTY1RjZcdThCRURcdTRFNDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbGxlY3ROb2RlTWV0YSA9IDxTPihcbiAgc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz4sXG4pOiBSZWFkb25seU1hcDxzdHJpbmcsIE1ldGEuVHJhaXRNZXRhPiA9PiB7XG4gIGNvbnN0IG91dCA9IG5ldyBNYXA8c3RyaW5nLCBNZXRhLlRyYWl0TWV0YT4oKVxuXG4gIGNvbnN0IGlzTm9kZSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0YXRlVHJhaXROb2RlPGFueSwgYW55PiA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KS5fdGFnID09PSBcIlN0YXRlVHJhaXROb2RlXCJcblxuICBjb25zdCBpc0xpc3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGF0ZVRyYWl0TGlzdDxhbnk+ID0+XG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpLl90YWcgPT09IFwiU3RhdGVUcmFpdExpc3RcIlxuXG4gIGNvbnN0IGFkZCA9IChzY29wZUlkOiBzdHJpbmcsIG5vZGU6IFN0YXRlVHJhaXROb2RlPGFueSwgYW55Pik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1ldGEgPSBNZXRhLnNhbml0aXplKG5vZGUubWV0YSlcbiAgICBpZiAobWV0YSkgb3V0LnNldChzY29wZUlkLCBtZXRhKVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gc3BlYykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIGtleSkpIGNvbnRpbnVlXG4gICAgY29uc3QgcmF3ID0gc3BlY1trZXkgYXMga2V5b2YgdHlwZW9mIHNwZWNdIGFzIFN0YXRlVHJhaXRTcGVjVmFsdWU8UywgYW55PiB8IHVuZGVmaW5lZFxuICAgIGlmICghcmF3KSBjb250aW51ZVxuXG4gICAgaWYgKGlzTGlzdChyYXcpKSB7XG4gICAgICBjb25zdCBsaXN0UGF0aCA9IGtleVxuICAgICAgaWYgKHJhdy5pdGVtKSBhZGQoYCR7bGlzdFBhdGh9W11gLCByYXcuaXRlbSlcbiAgICAgIGlmIChyYXcubGlzdCkgYWRkKGxpc3RQYXRoLCByYXcubGlzdClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGlzTm9kZShyYXcpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIiRyb290XCIpIGFkZChcIiRyb290XCIsIHJhdylcbiAgICAgIGVsc2UgYWRkKGtleSwgcmF3KVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0XG59XG5cbi8vIC0tLS0gQ29udmVyZ2UgKDAxMykgZXZpZGVuY2UgbW9kZWwgLS0tLVxuXG5leHBvcnQgdHlwZSBUcmFpdENvbnZlcmdlUmVxdWVzdGVkTW9kZSA9IFwiYXV0b1wiIHwgXCJmdWxsXCIgfCBcImRpcnR5XCJcbmV4cG9ydCB0eXBlIFRyYWl0Q29udmVyZ2VFeGVjdXRlZE1vZGUgPSBcImZ1bGxcIiB8IFwiZGlydHlcIlxuZXhwb3J0IHR5cGUgVHJhaXRDb252ZXJnZU91dGNvbWUgPSBcIkNvbnZlcmdlZFwiIHwgXCJOb29wXCIgfCBcIkRlZ3JhZGVkXCJcblxuZXhwb3J0IHR5cGUgVHJhaXRDb252ZXJnZUNvbmZpZ1Njb3BlID1cbiAgfCBcInByb3ZpZGVyXCJcbiAgfCBcInJ1bnRpbWVfbW9kdWxlXCJcbiAgfCBcInJ1bnRpbWVfZGVmYXVsdFwiXG4gIHwgXCJidWlsdGluXCJcblxuZXhwb3J0IHR5cGUgVHJhaXRDb252ZXJnZVJlYXNvbiA9XG4gIHwgXCJjb2xkX3N0YXJ0XCJcbiAgfCBcImNhY2hlX2hpdFwiXG4gIHwgXCJjYWNoZV9taXNzXCJcbiAgfCBcImJ1ZGdldF9jdXRvZmZcIlxuICB8IFwibmVhcl9mdWxsXCJcbiAgfCBcInVua25vd25fd3JpdGVcIlxuICB8IFwiZGlydHlfYWxsXCJcbiAgfCBcImdlbmVyYXRpb25fYnVtcGVkXCJcbiAgfCBcImxvd19oaXRfcmF0ZV9wcm90ZWN0aW9uXCJcbiAgfCBcIm1vZHVsZV9vdmVycmlkZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb252ZXJnZVN0ZXBTdGF0cyB7XG4gIHJlYWRvbmx5IHRvdGFsU3RlcHM6IG51bWJlclxuICByZWFkb25seSBleGVjdXRlZFN0ZXBzOiBudW1iZXJcbiAgcmVhZG9ubHkgc2tpcHBlZFN0ZXBzOiBudW1iZXJcbiAgcmVhZG9ubHkgY2hhbmdlZFN0ZXBzOiBudW1iZXJcbiAgcmVhZG9ubHkgYWZmZWN0ZWRTdGVwcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udmVyZ2VEaXJ0eVN1bW1hcnkge1xuICByZWFkb25seSBkaXJ0eUFsbDogYm9vbGVhblxuICByZWFkb25seSByZWFzb24/OiBEaXJ0eUFsbFJlYXNvblxuICByZWFkb25seSByb290Q291bnQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgcm9vdElkcz86IFJlYWRvbmx5QXJyYXk8bnVtYmVyPlxuICByZWFkb25seSByb290SWRzVHJ1bmNhdGVkPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udmVyZ2VQbGFuQ2FjaGVFdmlkZW5jZSB7XG4gIHJlYWRvbmx5IGNhcGFjaXR5OiBudW1iZXJcbiAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyXG4gIHJlYWRvbmx5IGhpdHM6IG51bWJlclxuICByZWFkb25seSBtaXNzZXM6IG51bWJlclxuICByZWFkb25seSBldmljdHM6IG51bWJlclxuICByZWFkb25seSBoaXQ6IGJvb2xlYW5cbiAgcmVhZG9ubHkga2V5U2l6ZT86IG51bWJlclxuICByZWFkb25seSBtaXNzUmVhc29uPzogXCJjb2xkX3N0YXJ0XCIgfCBcImdlbmVyYXRpb25fYnVtcGVkXCIgfCBcIm5vdF9jYWNoZWRcIiB8IFwidW5rbm93blwiXG4gIHJlYWRvbmx5IGRpc2FibGVkPzogYm9vbGVhblxuICByZWFkb25seSBkaXNhYmxlUmVhc29uPzogXCJsb3dfaGl0X3JhdGVcIiB8IFwiZ2VuZXJhdGlvbl90aHJhc2hcIiB8IFwibWFudWFsX292ZXJyaWRlXCIgfCBcInVua25vd25cIlxufVxuXG5leHBvcnQgdHlwZSBUcmFpdENvbnZlcmdlR2VuZXJhdGlvbkJ1bXBSZWFzb24gPVxuICB8IFwid3JpdGVyc19jaGFuZ2VkXCJcbiAgfCBcImRlcHNfY2hhbmdlZFwiXG4gIHwgXCJsb2dpY19pbnN0YWxsZWRcIlxuICB8IFwibG9naWNfdW5pbnN0YWxsZWRcIlxuICB8IFwiaW1wb3J0c19jaGFuZ2VkXCJcbiAgfCBcInVua25vd25cIlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udmVyZ2VHZW5lcmF0aW9uRXZpZGVuY2Uge1xuICByZWFkb25seSBnZW5lcmF0aW9uOiBudW1iZXJcbiAgcmVhZG9ubHkgZ2VuZXJhdGlvbkJ1bXBDb3VudD86IG51bWJlclxuICByZWFkb25seSBsYXN0QnVtcFJlYXNvbj86IFRyYWl0Q29udmVyZ2VHZW5lcmF0aW9uQnVtcFJlYXNvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udmVyZ2VTdGF0aWNJckV2aWRlbmNlIHtcbiAgcmVhZG9ubHkgZmllbGRQYXRoQ291bnQ6IG51bWJlclxuICByZWFkb25seSBzdGVwQ291bnQ6IG51bWJlclxuICByZWFkb25seSBidWlsZER1cmF0aW9uTXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlSG90c3BvdCB7XG4gIHJlYWRvbmx5IGtpbmQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc3RlcElkOiBudW1iZXJcbiAgcmVhZG9ubHkgb3V0RmllbGRQYXRoSWQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZHVyYXRpb25NczogbnVtYmVyXG4gIHJlYWRvbmx5IGNoYW5nZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlRGVjaXNpb25TdW1tYXJ5IHtcbiAgcmVhZG9ubHkgcmVxdWVzdGVkTW9kZTogVHJhaXRDb252ZXJnZVJlcXVlc3RlZE1vZGVcbiAgcmVhZG9ubHkgZXhlY3V0ZWRNb2RlOiBUcmFpdENvbnZlcmdlRXhlY3V0ZWRNb2RlXG4gIHJlYWRvbmx5IG91dGNvbWU6IFRyYWl0Q29udmVyZ2VPdXRjb21lXG4gIHJlYWRvbmx5IGNvbmZpZ1Njb3BlOiBUcmFpdENvbnZlcmdlQ29uZmlnU2NvcGVcbiAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q6IHN0cmluZ1xuICByZWFkb25seSBleGVjdXRpb25CdWRnZXRNczogbnVtYmVyXG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkR1cmF0aW9uTXM6IG51bWJlclxuICByZWFkb25seSBkZWNpc2lvbkJ1ZGdldE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGRlY2lzaW9uRHVyYXRpb25Ncz86IG51bWJlclxuICByZWFkb25seSByZWFzb25zOiBSZWFkb25seUFycmF5PFRyYWl0Q29udmVyZ2VSZWFzb24+XG4gIHJlYWRvbmx5IHN0ZXBTdGF0czogVHJhaXRDb252ZXJnZVN0ZXBTdGF0c1xuICByZWFkb25seSBkaXJ0eT86IFRyYWl0Q29udmVyZ2VEaXJ0eVN1bW1hcnlcbiAgcmVhZG9ubHkgY2FjaGU/OiBUcmFpdENvbnZlcmdlUGxhbkNhY2hlRXZpZGVuY2VcbiAgcmVhZG9ubHkgZ2VuZXJhdGlvbj86IFRyYWl0Q29udmVyZ2VHZW5lcmF0aW9uRXZpZGVuY2VcbiAgcmVhZG9ubHkgc3RhdGljSXI/OiBUcmFpdENvbnZlcmdlU3RhdGljSXJFdmlkZW5jZVxuICByZWFkb25seSB0aHJlc2hvbGRzPzogeyByZWFkb25seSBmbG9vclJhdGlvPzogbnVtYmVyIH1cbiAgcmVhZG9ubHkgdG9wMz86IFJlYWRvbmx5QXJyYXk8VHJhaXRDb252ZXJnZUhvdHNwb3Q+XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7XG4gIHR5cGUgU3RhdGVUcmFpdFByb2dyYW0sXG4gIHR5cGUgU3RhdGVUcmFpdFNwZWMsXG4gIHR5cGUgU3RhdGVUcmFpdEVudHJ5LFxuICB0eXBlIFN0YXRlVHJhaXRHcmFwaCxcbiAgdHlwZSBTdGF0ZVRyYWl0R3JhcGhFZGdlLFxuICB0eXBlIFN0YXRlVHJhaXRHcmFwaE5vZGUsXG4gIHR5cGUgU3RhdGVUcmFpdEZpZWxkLFxuICB0eXBlIFN0YXRlVHJhaXRGaWVsZFRyYWl0LFxuICB0eXBlIFN0YXRlVHJhaXRQbGFuLFxuICB0eXBlIFN0YXRlVHJhaXRQbGFuU3RlcCxcbiAgdHlwZSBTdGF0ZVRyYWl0UmVzb3VyY2UsXG4gIGNvbGxlY3ROb2RlTWV0YSxcbiAgbm9ybWFsaXplU3BlYyxcbn0gZnJvbSBcIi4vbW9kZWwuanNcIlxuaW1wb3J0ICogYXMgTWV0YSBmcm9tIFwiLi9tZXRhLmpzXCJcbmltcG9ydCB7XG4gIGNvbXBhcmVGaWVsZFBhdGgsXG4gIGdldEZpZWxkUGF0aElkLFxuICBtYWtlRmllbGRQYXRoSWRSZWdpc3RyeSxcbiAgbm9ybWFsaXplRmllbGRQYXRoLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFBhdGhJZCxcbn0gZnJvbSBcIi4uL2ZpZWxkLXBhdGguanNcIlxuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyUmVnaXN0cnkgfSBmcm9tIFwiLi9jb252ZXJnZS1pci5qc1wiXG5cbmNvbnN0IG5vd1BlcmYgPSAoKTogbnVtYmVyID0+XG4gIHR5cGVvZiBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gIHR5cGVvZiBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlLm5vdyA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiBEYXRlLm5vdygpXG5cbnR5cGUgQ29udmVyZ2VXcml0ZXIgPSBFeHRyYWN0PFxuICBTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+LFxuICB7IHJlYWRvbmx5IGtpbmQ6IFwiY29tcHV0ZWRcIiB8IFwibGlua1wiIH1cbj5cblxuY29uc3QgZ2V0Q29udmVyZ2VXcml0ZXJEZXBzID0gKGVudHJ5OiBDb252ZXJnZVdyaXRlcik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGlmIChlbnRyeS5raW5kID09PSBcImNvbXB1dGVkXCIpIHtcbiAgICByZXR1cm4gKChlbnRyeS5tZXRhIGFzIGFueSk/LmRlcHMgPz8gW10pIGFzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICB9XG4gIHJldHVybiBbZW50cnkubWV0YS5mcm9tIGFzIHN0cmluZ11cbn1cblxuY29uc3QgY29tcHV0ZUNvbnZlcmdlVG9wb09yZGVyID0gKFxuICB3cml0ZXJzOiBSZWFkb25seUFycmF5PENvbnZlcmdlV3JpdGVyPixcbik6IHsgcmVhZG9ubHkgb3JkZXI6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjsgcmVhZG9ubHkgY29uZmlnRXJyb3I/OiBDb252ZXJnZVN0YXRpY0lyUmVnaXN0cnlbXCJjb25maWdFcnJvclwiXSB9ID0+IHtcbiAgY29uc3Qgd3JpdGVyQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIENvbnZlcmdlV3JpdGVyPigpXG4gIGZvciAoY29uc3QgZW50cnkgb2Ygd3JpdGVycykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gd3JpdGVyQnlQYXRoLmdldChlbnRyeS5maWVsZFBhdGgpXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmRlcjogW10sXG4gICAgICAgIGNvbmZpZ0Vycm9yOiB7XG4gICAgICAgICAgY29kZTogXCJNVUxUSVBMRV9XUklURVJTXCIsXG4gICAgICAgICAgbWVzc2FnZTogYFtTdGF0ZVRyYWl0LmNvbnZlcmdlXSBNdWx0aXBsZSB3cml0ZXJzIGZvciBmaWVsZCBcIiR7ZW50cnkuZmllbGRQYXRofVwiICgke2V4aXN0aW5nLmtpbmR9ICsgJHtlbnRyeS5raW5kfSkuYCxcbiAgICAgICAgICBmaWVsZHM6IFtlbnRyeS5maWVsZFBhdGhdLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cbiAgICB3cml0ZXJCeVBhdGguc2V0KGVudHJ5LmZpZWxkUGF0aCwgZW50cnkpXG4gIH1cblxuICBjb25zdCBub2RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgZW50cnkgb2Ygd3JpdGVycykge1xuICAgIG5vZGVzLmFkZChlbnRyeS5maWVsZFBhdGgpXG4gIH1cblxuICBjb25zdCBpbmRlZ3JlZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcbiAgY29uc3QgZm9yd2FyZCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmc+PigpXG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaW5kZWdyZWUuc2V0KG5vZGUsIDApXG4gICAgZm9yd2FyZC5zZXQobm9kZSwgW10pXG4gIH1cblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdyaXRlcnMpIHtcbiAgICBjb25zdCB0byA9IGVudHJ5LmZpZWxkUGF0aFxuICAgIGNvbnN0IGRlcHMgPSBnZXRDb252ZXJnZVdyaXRlckRlcHMoZW50cnkpXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgaWYgKCFub2Rlcy5oYXMoZGVwKSkgY29udGludWVcbiAgICAgIGZvcndhcmQuZ2V0KGRlcCkhLnB1c2godG8pXG4gICAgICBpbmRlZ3JlZS5zZXQodG8sIChpbmRlZ3JlZS5nZXQodG8pID8/IDApICsgMSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBxdWV1ZTogQXJyYXk8c3RyaW5nPiA9IFtdXG4gIGZvciAoY29uc3QgW25vZGUsIGRlZ10gb2YgaW5kZWdyZWUuZW50cmllcygpKSB7XG4gICAgaWYgKGRlZyA9PT0gMCkgcXVldWUucHVzaChub2RlKVxuICB9XG5cbiAgY29uc3Qgb3JkZXI6IEFycmF5PHN0cmluZz4gPSBbXVxuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgbiA9IHF1ZXVlLnNoaWZ0KCkhXG4gICAgb3JkZXIucHVzaChuKVxuICAgIGNvbnN0IG91dHMgPSBmb3J3YXJkLmdldChuKSFcbiAgICBmb3IgKGNvbnN0IHRvIG9mIG91dHMpIHtcbiAgICAgIGNvbnN0IG5leHQgPSAoaW5kZWdyZWUuZ2V0KHRvKSA/PyAwKSAtIDFcbiAgICAgIGluZGVncmVlLnNldCh0bywgbmV4dClcbiAgICAgIGlmIChuZXh0ID09PSAwKSBxdWV1ZS5wdXNoKHRvKVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcmRlci5sZW5ndGggIT09IG5vZGVzLnNpemUpIHtcbiAgICBjb25zdCByZW1haW5pbmcgPSBBcnJheS5mcm9tKG5vZGVzKS5maWx0ZXIoKG4pID0+ICFvcmRlci5pbmNsdWRlcyhuKSlcbiAgICByZXR1cm4ge1xuICAgICAgb3JkZXI6IFtdLFxuICAgICAgY29uZmlnRXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJDWUNMRV9ERVRFQ1RFRFwiLFxuICAgICAgICBtZXNzYWdlOiBgW1N0YXRlVHJhaXQuY29udmVyZ2VdIEN5Y2xlIGRldGVjdGVkIGluIGNvbXB1dGVkL2xpbmsgZ3JhcGg6ICR7cmVtYWluaW5nLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICBmaWVsZHM6IHJlbWFpbmluZyxcbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgb3JkZXIgfVxufVxuXG5jb25zdCBidWlsZENvbnZlcmdlSXIgPSAoXG4gIGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPj4sXG4pOiBDb252ZXJnZVN0YXRpY0lyUmVnaXN0cnkgPT4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBub3dQZXJmKClcbiAgY29uc3QgZ2VuZXJhdGlvbiA9IDBcblxuICBjb25zdCB3cml0ZXJzID0gZW50cmllcy5maWx0ZXIoXG4gICAgKGUpOiBlIGlzIENvbnZlcmdlV3JpdGVyID0+IGUua2luZCA9PT0gXCJjb21wdXRlZFwiIHx8IGUua2luZCA9PT0gXCJsaW5rXCIsXG4gIClcblxuICBjb25zdCB3cml0ZXJzS2V5ID0gd3JpdGVyc1xuICAgIC5tYXAoKGVudHJ5KSA9PiBgJHtlbnRyeS5raW5kfToke2VudHJ5LmZpZWxkUGF0aH1gKVxuICAgIC5zb3J0KClcbiAgICAuam9pbihcInxcIilcblxuICBjb25zdCBkZXBzS2V5ID0gd3JpdGVyc1xuICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBkZXBzID0gZ2V0Q29udmVyZ2VXcml0ZXJEZXBzKGVudHJ5KS5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKVxuICAgICAgcmV0dXJuIGAke2VudHJ5LmtpbmR9OiR7ZW50cnkuZmllbGRQYXRofT0+JHtkZXBzfWBcbiAgICB9KVxuICAgIC5zb3J0KClcbiAgICAuam9pbihcInxcIilcblxuICBjb25zdCB3cml0ZXJCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgQ29udmVyZ2VXcml0ZXI+KClcbiAgZm9yIChjb25zdCBlbnRyeSBvZiB3cml0ZXJzKSB7XG4gICAgd3JpdGVyQnlQYXRoLnNldChlbnRyeS5maWVsZFBhdGgsIGVudHJ5KVxuICB9XG5cbiAgY29uc3QgdG9wbyA9IHdyaXRlcnMubGVuZ3RoID4gMCA/IGNvbXB1dGVDb252ZXJnZVRvcG9PcmRlcih3cml0ZXJzKSA6IHsgb3JkZXI6IFtdIGFzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB9XG4gIGNvbnN0IHN0ZXBzQnlJZDogQXJyYXk8Q29udmVyZ2VXcml0ZXI+ID0gdG9wby5jb25maWdFcnJvclxuICAgID8gW11cbiAgICA6IHRvcG8ub3JkZXIubWFwKChwYXRoKSA9PiB3cml0ZXJCeVBhdGguZ2V0KHBhdGgpISlcblxuICBjb25zdCBmaWVsZFBhdGhUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFBhdGg+KClcbiAgY29uc3QgYWRkUGF0aCA9IChwYXRoOiBGaWVsZFBhdGgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSBwYXRoLnNsaWNlKDAsIGkpXG4gICAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShwcmVmaXgpXG4gICAgICBpZiAoIWZpZWxkUGF0aFRhYmxlLmhhcyhrZXkpKSBmaWVsZFBhdGhUYWJsZS5zZXQoa2V5LCBwcmVmaXgpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiB3cml0ZXJzKSB7XG4gICAgY29uc3Qgb3V0ID0gbm9ybWFsaXplRmllbGRQYXRoKGVudHJ5LmZpZWxkUGF0aClcbiAgICBpZiAob3V0KSBhZGRQYXRoKG91dClcbiAgICBmb3IgKGNvbnN0IGRlcCBvZiBnZXRDb252ZXJnZVdyaXRlckRlcHMoZW50cnkpKSB7XG4gICAgICBjb25zdCBkZXBQYXRoID0gbm9ybWFsaXplRmllbGRQYXRoKGRlcClcbiAgICAgIGlmIChkZXBQYXRoKSBhZGRQYXRoKGRlcFBhdGgpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmllbGRQYXRocyA9IEFycmF5LmZyb20oZmllbGRQYXRoVGFibGUudmFsdWVzKCkpLnNvcnQoY29tcGFyZUZpZWxkUGF0aClcbiAgY29uc3QgZmllbGRQYXRoSWRSZWdpc3RyeSA9IG1ha2VGaWVsZFBhdGhJZFJlZ2lzdHJ5KGZpZWxkUGF0aHMpXG5cbiAgY29uc3Qgc3RlcE91dEZpZWxkUGF0aElkQnlTdGVwSWQ6IEFycmF5PEZpZWxkUGF0aElkPiA9IFtdXG4gIGNvbnN0IHN0ZXBEZXBzRmllbGRQYXRoSWRzQnlTdGVwSWQ6IEFycmF5PFJlYWRvbmx5QXJyYXk8RmllbGRQYXRoSWQ+PiA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzdGVwc0J5SWQpIHtcbiAgICBjb25zdCBvdXQgPSBub3JtYWxpemVGaWVsZFBhdGgoZW50cnkuZmllbGRQYXRoKVxuICAgIGNvbnN0IG91dElkID1cbiAgICAgIG91dCAhPSBudWxsID8gZ2V0RmllbGRQYXRoSWQoZmllbGRQYXRoSWRSZWdpc3RyeSwgb3V0KSA6IHVuZGVmaW5lZFxuICAgIGlmIChvdXRJZCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gRmFpbGVkIHRvIG1hcCBjb252ZXJnZSBvdXRwdXQgZmllbGRQYXRoIFwiJHtlbnRyeS5maWVsZFBhdGh9XCIgdG8gRmllbGRQYXRoSWQuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBkZXBJZHM6IEFycmF5PEZpZWxkUGF0aElkPiA9IFtdXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZ2V0Q29udmVyZ2VXcml0ZXJEZXBzKGVudHJ5KSkge1xuICAgICAgY29uc3QgZGVwUGF0aCA9IG5vcm1hbGl6ZUZpZWxkUGF0aChkZXApXG4gICAgICBpZiAoIWRlcFBhdGgpIGNvbnRpbnVlXG4gICAgICBjb25zdCBkZXBJZCA9IGdldEZpZWxkUGF0aElkKGZpZWxkUGF0aElkUmVnaXN0cnksIGRlcFBhdGgpXG4gICAgICBpZiAoZGVwSWQgIT0gbnVsbCkgZGVwSWRzLnB1c2goZGVwSWQpXG4gICAgfVxuXG4gICAgc3RlcE91dEZpZWxkUGF0aElkQnlTdGVwSWQucHVzaChvdXRJZClcbiAgICBzdGVwRGVwc0ZpZWxkUGF0aElkc0J5U3RlcElkLnB1c2goZGVwSWRzKVxuICB9XG5cbiAgY29uc3QgdG9wb09yZGVyID0gc3RlcHNCeUlkLm1hcCgoXywgaSkgPT4gaSlcbiAgY29uc3QgYnVpbGREdXJhdGlvbk1zID0gTWF0aC5tYXgoMCwgbm93UGVyZigpIC0gc3RhcnRlZEF0KVxuXG4gIHJldHVybiB7XG4gICAgZ2VuZXJhdGlvbixcbiAgICB3cml0ZXJzS2V5LFxuICAgIGRlcHNLZXksXG4gICAgZmllbGRQYXRocyxcbiAgICBmaWVsZFBhdGhJZFJlZ2lzdHJ5LFxuICAgIC4uLih0b3BvLmNvbmZpZ0Vycm9yID8geyBjb25maWdFcnJvcjogdG9wby5jb25maWdFcnJvciB9IDogbnVsbCksXG4gICAgc3RlcHNCeUlkLFxuICAgIHN0ZXBPdXRGaWVsZFBhdGhJZEJ5U3RlcElkLFxuICAgIHN0ZXBEZXBzRmllbGRQYXRoSWRzQnlTdGVwSWQsXG4gICAgdG9wb09yZGVyLFxuICAgIGJ1aWxkRHVyYXRpb25NcyxcbiAgfVxufVxuXG4vKipcbiAqIFx1NjgzOVx1NjM2RSBTdGF0ZVRyYWl0RW50cnkgXHU2Nzg0XHU5MDIwXHU2ODA3XHU1MUM2XHU1MzE2XHU3Njg0IEZpZWxkVHJhaXRcdTMwMDJcbiAqXG4gKiAtIFx1NzZFRVx1NTI0RFx1NEVDNVx1NUJGOSBsaW5rL3NvdXJjZSBcdTU4NkJcdTUxNDUgZGVwcyBcdTRGRTFcdTYwNkZcdUZGMENjb21wdXRlZCBcdTc2ODRcdTRGOURcdThENTZcdTY2ODJcdTRFMERcdTk3NTlcdTYwMDFcdTUyMDZcdTY3OTBcdUZGMUJcbiAqIC0gXHU1NDBFXHU3RUVEXHU4MkU1XHU1RjE1XHU1MTY1XHU2NjNFXHU1RjBGXHU0RjlEXHU4RDU2XHU1OEYwXHU2NjBFXHVGRjBDXHU1M0VGXHU0RUU1XHU1NzI4XHU2QjY0XHU1OTA0XHU2MjY5XHU1QzU1XHUzMDAyXG4gKi9cbmNvbnN0IHRvRmllbGRUcmFpdCA9IChcbiAgZW50cnk6IFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4sXG4pOiBTdGF0ZVRyYWl0RmllbGRUcmFpdCA9PiB7XG4gIGNvbnN0IGRlcHM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGlmIChlbnRyeS5raW5kID09PSBcImNvbXB1dGVkXCIpIHtcbiAgICBjb25zdCBtZXRhID0gZW50cnkubWV0YSBhcyBhbnlcbiAgICBjb25zdCBsaXN0ID0gbWV0YS5kZXBzIGFzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgIGlmIChsaXN0KSBkZXBzLnB1c2goLi4ubGlzdClcbiAgfSBlbHNlIGlmIChlbnRyeS5raW5kID09PSBcInNvdXJjZVwiKSB7XG4gICAgY29uc3QgbWV0YSA9IGVudHJ5Lm1ldGEgYXMgYW55XG4gICAgY29uc3QgbGlzdCA9IG1ldGEuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICBpZiAobGlzdCkgZGVwcy5wdXNoKC4uLmxpc3QpXG4gIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gXCJsaW5rXCIpIHtcbiAgICBkZXBzLnB1c2goZW50cnkubWV0YS5mcm9tIGFzIHN0cmluZylcbiAgfSBlbHNlIGlmIChlbnRyeS5raW5kID09PSBcImNoZWNrXCIpIHtcbiAgICBjb25zdCBtZXRhID0gZW50cnkubWV0YSBhcyBhbnlcbiAgICBjb25zdCBydWxlcyA9IChtZXRhPy5ydWxlcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhydWxlcykpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSBydWxlc1tuYW1lXVxuICAgICAgaWYgKHJ1bGUgJiYgdHlwZW9mIHJ1bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IHJ1bGUuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgICAgaWYgKGxpc3QpIGRlcHMucHVzaCguLi5saXN0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmllbGRJZDogZW50cnkuZmllbGRQYXRoLFxuICAgIGtpbmQ6IGVudHJ5LmtpbmQsXG4gICAgLy8gbWV0YSBcdTU3MjhcdThGRDBcdTg4NENcdTY1RjZcdTRGRERcdTYzMDFcdTRFMEUgRW50cnkubWV0YSBcdTRFMDBcdTgxRjRcdUZGMENcdTRGQkZcdTRFOEUgaW5zdGFsbCBcdTc2RjRcdTYzQTVcdTU5MERcdTc1MjhcdTMwMDJcbiAgICBtZXRhOiBlbnRyeS5tZXRhIGFzIGFueSxcbiAgICBkZXBzLFxuICB9XG59XG5cbi8qKlxuICogXHU0RUNFXHU1RjUyXHU0RTAwXHU1MzE2XHU3Njg0IEVudHJ5IFx1NTIxN1x1ODg2OFx1Njc4NFx1NUVGQSBGaWVsZCAvIE5vZGUgLyBFZGdlIC8gUmVzb3VyY2UgXHU5NkM2XHU1NDA4XHUzMDAyXG4gKi9cbmNvbnN0IGJ1aWxkR3JhcGggPSAoXG4gIGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPj4sXG4gIG5vZGVNZXRhQnlGaWVsZFBhdGg6IFJlYWRvbmx5TWFwPHN0cmluZywgTWV0YS5UcmFpdE1ldGE+LFxuKToge1xuICByZWFkb25seSBncmFwaDogU3RhdGVUcmFpdEdyYXBoXG4gIHJlYWRvbmx5IHBsYW46IFN0YXRlVHJhaXRQbGFuXG59ID0+IHtcbiAgY29uc3QgZmllbGRNYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhdGVUcmFpdEZpZWxkPigpXG4gIGNvbnN0IG5vZGVzOiBBcnJheTxTdGF0ZVRyYWl0R3JhcGhOb2RlPiA9IFtdXG4gIGNvbnN0IGVkZ2VzOiBBcnJheTxTdGF0ZVRyYWl0R3JhcGhFZGdlPiA9IFtdXG4gIGNvbnN0IHJlc291cmNlc0J5SWQgPSBuZXcgTWFwPHN0cmluZywgU3RhdGVUcmFpdFJlc291cmNlPigpXG4gIGNvbnN0IHBsYW5TdGVwczogQXJyYXk8U3RhdGVUcmFpdFBsYW5TdGVwPiA9IFtdXG5cbiAgY29uc3QgZW5zdXJlRmllbGQgPSAoZmllbGRQYXRoOiBzdHJpbmcpOiBTdGF0ZVRyYWl0RmllbGQgPT4ge1xuICAgIGxldCBmaWVsZCA9IGZpZWxkTWFwLmdldChmaWVsZFBhdGgpXG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgZmllbGQgPSB7XG4gICAgICAgIGlkOiBmaWVsZFBhdGgsXG4gICAgICAgIHBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgdHJhaXRzOiBbXSxcbiAgICAgIH1cbiAgICAgIGZpZWxkTWFwLnNldChmaWVsZFBhdGgsIGZpZWxkKVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRcbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZpZWxkUGF0aCA9IGVudHJ5LmZpZWxkUGF0aFxuICAgIGNvbnN0IGZpZWxkID0gZW5zdXJlRmllbGQoZmllbGRQYXRoKVxuICAgIGNvbnN0IHRyYWl0ID0gdG9GaWVsZFRyYWl0KGVudHJ5KVxuXG4gICAgOyhmaWVsZC50cmFpdHMgYXMgQXJyYXk8U3RhdGVUcmFpdEZpZWxkVHJhaXQ+KS5wdXNoKHRyYWl0KVxuXG4gICAgLy8gXHU5NDg4XHU1QkY5XHU0RTBEXHU1NDBDIGtpbmQgXHU2Nzg0XHU1RUZBIEdyYXBoIFx1OEZCOVx1NEUwRSBQbGFuIFx1NkI2NVx1OUFBNFx1MzAwMlxuICAgIGlmIChlbnRyeS5raW5kID09PSBcImNvbXB1dGVkXCIpIHtcbiAgICAgIGNvbnN0IHN0ZXBJZCA9IGBjb21wdXRlZDoke2ZpZWxkUGF0aH1gXG4gICAgICBwbGFuU3RlcHMucHVzaCh7XG4gICAgICAgIGlkOiBzdGVwSWQsXG4gICAgICAgIGtpbmQ6IFwiY29tcHV0ZWQtdXBkYXRlXCIsXG4gICAgICAgIHRhcmdldEZpZWxkUGF0aDogZmllbGRQYXRoLFxuICAgICAgICAvLyBcdThCRjRcdTY2MEVcdUZGMUFcdTVGNTNcdTUyNERcdTcyNDhcdTY3MkNcdTRFMERcdTk3NTlcdTYwMDFcdTUyMDZcdTY3OTAgY29tcHV0ZWQgXHU0RjlEXHU4RDU2XHU1QjU3XHU2QkI1XHVGRjBDc291cmNlRmllbGRQYXRocyBcdTc1NTlcdTdBN0FcdTMwMDJcbiAgICAgIH0pXG4gICAgICAvLyBcdTgyRTVcdTY2M0VcdTVGMEZcdTU4RjBcdTY2MEUgZGVwc1x1RkYwQ1x1NTIxOVx1ODg2NVx1NTE0NSBHcmFwaCBcdThGQjlcdUZGMDhcdTc1MjhcdTRFOEVcdThCQ0FcdTY1QUQvXHU1M0NEXHU1NDExXHU5NUVEXHU1MzA1XHU4QkExXHU3Qjk3XHVGRjA5XHUzMDAyXG4gICAgICBjb25zdCBkZXBzID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5kZXBzIGFzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICAgaWYgKGRlcHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgICAgIGVuc3VyZUZpZWxkKGRlcClcbiAgICAgICAgICBlZGdlcy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBgY29tcHV0ZWQ6JHtkZXB9LT4ke2ZpZWxkUGF0aH1gLFxuICAgICAgICAgICAgZnJvbTogZGVwLFxuICAgICAgICAgICAgdG86IGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtpbmQ6IFwiY29tcHV0ZWRcIixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbnRyeS5raW5kID09PSBcImxpbmtcIikge1xuICAgICAgY29uc3QgZnJvbSA9IGVudHJ5Lm1ldGEuZnJvbSBhcyBzdHJpbmdcbiAgICAgIGVuc3VyZUZpZWxkKGZyb20pXG5cbiAgICAgIGNvbnN0IGVkZ2VJZCA9IGBsaW5rOiR7ZnJvbX0tPiR7ZmllbGRQYXRofWBcbiAgICAgIGVkZ2VzLnB1c2goe1xuICAgICAgICBpZDogZWRnZUlkLFxuICAgICAgICBmcm9tLFxuICAgICAgICB0bzogZmllbGRQYXRoLFxuICAgICAgICBraW5kOiBcImxpbmtcIixcbiAgICAgIH0pXG5cbiAgICAgIHBsYW5TdGVwcy5wdXNoKHtcbiAgICAgICAgaWQ6IGBsaW5rOiR7ZmllbGRQYXRofWAsXG4gICAgICAgIGtpbmQ6IFwibGluay1wcm9wYWdhdGVcIixcbiAgICAgICAgdGFyZ2V0RmllbGRQYXRoOiBmaWVsZFBhdGgsXG4gICAgICAgIHNvdXJjZUZpZWxkUGF0aHM6IFtmcm9tXSxcbiAgICAgICAgZGVidWdJbmZvOiB7XG4gICAgICAgICAgZ3JhcGhFZGdlSWQ6IGVkZ2VJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChlbnRyeS5raW5kID09PSBcInNvdXJjZVwiKSB7XG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gZW50cnkubWV0YS5yZXNvdXJjZVxuICAgICAgY29uc3QgcmVzb3VyY2VNZXRhID0gTWV0YS5zYW5pdGl6ZSgoZW50cnkubWV0YSBhcyBhbnkpLm1ldGEpXG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVzb3VyY2VzQnlJZC5nZXQocmVzb3VyY2VJZClcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBjb25zdCBvd25lckZpZWxkcyA9IFsuLi5leGlzdGluZy5vd25lckZpZWxkcywgZmllbGRQYXRoXVxuICAgICAgICBsZXQgbWV0YSA9IGV4aXN0aW5nLm1ldGFcbiAgICAgICAgbGV0IG1ldGFPcmlnaW4gPSBleGlzdGluZy5tZXRhT3JpZ2luXG4gICAgICAgIGxldCBtZXRhQ29uZmxpY3RzID0gZXhpc3RpbmcubWV0YUNvbmZsaWN0c1xuXG4gICAgICAgIGlmIChyZXNvdXJjZU1ldGEpIHtcbiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBNZXRhLm1lcmdlQ2Fub25pY2FsKFxuICAgICAgICAgICAgeyBtZXRhLCBvcmlnaW46IG1ldGFPcmlnaW4sIGNvbmZsaWN0czogbWV0YUNvbmZsaWN0cyB9LFxuICAgICAgICAgICAgeyBvcmlnaW46IGZpZWxkUGF0aCwgbWV0YTogcmVzb3VyY2VNZXRhIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIG1ldGEgPSBtZXJnZWQubWV0YVxuICAgICAgICAgIG1ldGFPcmlnaW4gPSBtZXJnZWQub3JpZ2luXG4gICAgICAgICAgbWV0YUNvbmZsaWN0cyA9IG1lcmdlZC5jb25mbGljdHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc291cmNlc0J5SWQuc2V0KHJlc291cmNlSWQsIHtcbiAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICBvd25lckZpZWxkcyxcbiAgICAgICAgICBtZXRhLFxuICAgICAgICAgIG1ldGFPcmlnaW4sXG4gICAgICAgICAgbWV0YUNvbmZsaWN0cyxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc291cmNlc0J5SWQuc2V0KHJlc291cmNlSWQsIHtcbiAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgIC8vIFx1NjY4Mlx1NjVGNlx1NEY3Rlx1NzUyOFx1N0I4MFx1NTM1NVx1NzY4NFx1NjgwN1x1OEJDNlx1NUI1N1x1N0IyNlx1NEUzMlx1RkYwQ1x1NTQwRVx1N0VFRFx1NTNFRlx1NjgzOVx1NjM2RSBrZXkgXHU4OUM0XHU1MjE5XHU4RkRCXHU0RTAwXHU2QjY1XHU3RUQzXHU2Nzg0XHU1MzE2XHUzMDAyXG4gICAgICAgICAga2V5U2VsZWN0b3I6IGBTdGF0ZVRyYWl0LnNvdXJjZUAke2ZpZWxkUGF0aH1gLFxuICAgICAgICAgIG93bmVyRmllbGRzOiBbZmllbGRQYXRoXSxcbiAgICAgICAgICBtZXRhOiByZXNvdXJjZU1ldGEsXG4gICAgICAgICAgbWV0YU9yaWdpbjogcmVzb3VyY2VNZXRhID8gZmllbGRQYXRoIDogdW5kZWZpbmVkLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBwbGFuU3RlcHMucHVzaCh7XG4gICAgICAgIGlkOiBgc291cmNlOiR7ZmllbGRQYXRofWAsXG4gICAgICAgIGtpbmQ6IFwic291cmNlLXJlZnJlc2hcIixcbiAgICAgICAgdGFyZ2V0RmllbGRQYXRoOiBmaWVsZFBhdGgsXG4gICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgIGtleVNlbGVjdG9ySWQ6IGBTdGF0ZVRyYWl0LnNvdXJjZUAke2ZpZWxkUGF0aH1gLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgZGVwcyA9IChlbnRyeS5tZXRhIGFzIGFueSkuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgICBlbnN1cmVGaWVsZChkZXApXG4gICAgICAgICAgZWRnZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogYHNvdXJjZS1kZXA6JHtkZXB9LT4ke2ZpZWxkUGF0aH1gLFxuICAgICAgICAgICAgZnJvbTogZGVwLFxuICAgICAgICAgICAgdG86IGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtpbmQ6IFwic291cmNlLWRlcFwiLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmtpbmQgPT09IFwiY2hlY2tcIikge1xuICAgICAgcGxhblN0ZXBzLnB1c2goe1xuICAgICAgICBpZDogYGNoZWNrOiR7ZmllbGRQYXRofWAsXG4gICAgICAgIGtpbmQ6IFwiY2hlY2stdmFsaWRhdGVcIixcbiAgICAgICAgdGFyZ2V0RmllbGRQYXRoOiBmaWVsZFBhdGgsXG4gICAgICB9KVxuXG4gICAgICAvLyBcdTgyRTVcdTg5QzRcdTUyMTlcdTY2M0VcdTVGMEZcdTU4RjBcdTY2MEUgZGVwc1x1RkYwQ1x1NTIxOVx1ODg2NVx1NTE0NSBHcmFwaCBcdThGQjlcdUZGMDhcdTc1MjhcdTRFOEUgUmV2ZXJzZUNsb3N1cmUgc2NvcGVkIHZhbGlkYXRlXHVGRjA5XHUzMDAyXG4gICAgICBpZiAodHJhaXQuZGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIHRyYWl0LmRlcHMpIHtcbiAgICAgICAgICBlbnN1cmVGaWVsZChkZXApXG4gICAgICAgICAgZWRnZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogYGNoZWNrLWRlcDoke2RlcH0tPiR7ZmllbGRQYXRofWAsXG4gICAgICAgICAgICBmcm9tOiBkZXAsXG4gICAgICAgICAgICB0bzogZmllbGRQYXRoLFxuICAgICAgICAgICAga2luZDogXCJjaGVjay1kZXBcIixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZE1hcC52YWx1ZXMoKSkge1xuICAgIG5vZGVzLnB1c2goe1xuICAgICAgaWQ6IGZpZWxkLmlkLFxuICAgICAgZmllbGQsXG4gICAgICB0cmFpdHM6IGZpZWxkLnRyYWl0cyxcbiAgICAgIG1ldGE6IG5vZGVNZXRhQnlGaWVsZFBhdGguZ2V0KGZpZWxkLmlkKSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgZ3JhcGg6IFN0YXRlVHJhaXRHcmFwaCA9IHtcbiAgICBfdGFnOiBcIlN0YXRlVHJhaXRHcmFwaFwiLFxuICAgIG5vZGVzLFxuICAgIGVkZ2VzLFxuICAgIHJlc291cmNlczogQXJyYXkuZnJvbShyZXNvdXJjZXNCeUlkLnZhbHVlcygpKSxcbiAgfVxuXG4gIGNvbnN0IHBsYW46IFN0YXRlVHJhaXRQbGFuID0ge1xuICAgIF90YWc6IFwiU3RhdGVUcmFpdFBsYW5cIixcbiAgICBzdGVwczogcGxhblN0ZXBzLFxuICB9XG5cbiAgcmV0dXJuIHsgZ3JhcGgsIHBsYW4gfVxufVxuXG4vKipcbiAqIFx1OTQ4OFx1NUJGOSBsaW5rIFx1OEZCOVx1OEZEQlx1ODg0Q1x1N0I4MFx1NTM1NVx1NzY4NFx1NzNBRlx1OERFRlx1NjhDMFx1NkQ0Qlx1MzAwMlxuICpcbiAqIC0gXHU0RUM1XHU4MDAzXHU4NjUxIGtpbmQgPSBcImxpbmtcIiBcdTc2ODRcdThGQjlcdUZGMENjb21wdXRlZC9zb3VyY2UgXHU5OTk2XHU3MjQ4XHU0RTBEXHU1M0MyXHU0RTBFXHU3M0FGXHU2OEMwXHU2RDRCXHVGRjFCXG4gKiAtIFx1ODJFNVx1NTNEMVx1NzNCMFx1NzNBRlx1OERFRlx1RkYwQ1x1NjI5Qlx1NTFGQVx1NUUyNlx1NjcwOVx1OERFRlx1NUY4NFx1NEZFMVx1NjA2Rlx1NzY4NFx1OTUxOVx1OEJFRlx1RkYwQ1x1OTA3Rlx1NTE0RFx1NTcyOFx1OEZEMFx1ODg0Q1x1NjVGNlx1OEZEQlx1NTE2NVx1NjVFMFx1OTY1MFx1NjZGNFx1NjVCMFx1MzAwMlxuICovXG5jb25zdCBhc3NlcnROb0xpbmtDeWNsZXMgPSAoZWRnZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEdyYXBoRWRnZT4pOiB2b2lkID0+IHtcbiAgY29uc3QgYWRqYWNlbmN5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpXG5cbiAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XG4gICAgaWYgKGVkZ2Uua2luZCAhPT0gXCJsaW5rXCIpIGNvbnRpbnVlXG4gICAgY29uc3QgbGlzdCA9IGFkamFjZW5jeS5nZXQoZWRnZS5mcm9tKSA/PyBbXVxuICAgIGxpc3QucHVzaChlZGdlLnRvKVxuICAgIGFkamFjZW5jeS5zZXQoZWRnZS5mcm9tLCBsaXN0KVxuICB9XG5cbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGNvbnN0IHN0YWNrID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBjb25zdCBkZnMgPSAobm9kZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0YWNrLmhhcyhub2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgW1N0YXRlVHJhaXQuYnVpbGRdIGxpbmsgY3ljbGUgZGV0ZWN0ZWQgYXQgZmllbGQgXCIke25vZGV9XCIuIGAgK1xuICAgICAgICAgIFwiUGxlYXNlIGNoZWNrIGxpbmsgdHJhaXRzIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXCIsXG4gICAgICApXG4gICAgfVxuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlKSkgcmV0dXJuXG4gICAgdmlzaXRlZC5hZGQobm9kZSlcbiAgICBzdGFjay5hZGQobm9kZSlcblxuICAgIGNvbnN0IG5leHRzID0gYWRqYWNlbmN5LmdldChub2RlKVxuICAgIGlmIChuZXh0cykge1xuICAgICAgZm9yIChjb25zdCB0byBvZiBuZXh0cykge1xuICAgICAgICBkZnModG8pXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhY2suZGVsZXRlKG5vZGUpXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgYWRqYWNlbmN5LmtleXMoKSkge1xuICAgIGlmICghdmlzaXRlZC5oYXMobm9kZSkpIHtcbiAgICAgIGRmcyhub2RlKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFx1NjgzOVx1NjM2RVx1N0VEOVx1NUI5QVx1NzY4NCBzdGF0ZVNjaGVtYSBcdTRFMEUgdHJhaXRzIHNwZWMgXHU2Nzg0XHU5MDIwIFN0YXRlVHJhaXRQcm9ncmFtXHUzMDAyXG4gKlxuICogLSBcdTdFQUZcdTUxRkRcdTY1NzBcdUZGMUFcdTRFMERcdTRGOURcdThENTZcdTU5MTZcdTkwRTggRW52IC8gXHU1MTY4XHU1QzQwXHU3MkI2XHU2MDAxXHVGRjFCXG4gKiAtIFx1NUY1M1x1NTI0RFx1NUI5RVx1NzNCMFx1ODA1QVx1NzEyNlx1NEU4RVx1RkYxQVxuICogICAtIFx1NEVDRSBTcGVjIFx1NUY1Mlx1NEUwMFx1NTMxNlx1NTFGQSBFbnRyeSBcdTUyMTdcdTg4NjhcdUZGMUJcbiAqICAgLSBcdTU3RkFcdTRFOEUgRW50cnkgXHU2Nzg0XHU1RUZBXHU4RjdCXHU5MUNGXHU3MjQ4IEdyYXBoIC8gUGxhblx1RkYxQlxuICogICAtIFx1NUJGOSBsaW5rIFx1OEZCOVx1NTA1QVx1NTdGQVx1NjcyQ1x1NzNBRlx1OERFRlx1NjhDMFx1NkQ0Qlx1MzAwMlxuICpcbiAqIFx1NTQwRVx1N0VFRFx1ODJFNVx1OTcwMFx1ODk4MVx1NjZGNFx1N0NCRVx1N0VDNlx1NzY4NFx1NEY5RFx1OEQ1Nlx1NTIwNlx1Njc5MFx1RkYwOFx1NEY4Qlx1NTk4Mlx1NUJGOSBjb21wdXRlZC9rZXkgXHU1MDVBXHU5NzU5XHU2MDAxXHU4OUUzXHU2NzkwXHVGRjA5XHVGRjBDXG4gKiBcdTUzRUZcdTRFRTVcdTU3MjhcdTY3MkNcdTZBMjFcdTU3NTdcdTUxODVcdTZGMTRcdThGREJcdTVCOUVcdTczQjBcdUZGMENcdTgwMENcdTRFMERcdTVGNzFcdTU0Q0RcdTVCRjlcdTU5MTYgQVBJXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZCA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgc3RhdGVTY2hlbWE6IFNjaGVtYS5TY2hlbWE8UywgYW55PixcbiAgc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz4sXG4pOiBTdGF0ZVRyYWl0UHJvZ3JhbTxTPiA9PiB7XG4gIGNvbnN0IGVudHJpZXMgPSBub3JtYWxpemVTcGVjKHNwZWMpIGFzIFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PFMsIHN0cmluZz4+XG4gIGNvbnN0IG5vZGVNZXRhQnlGaWVsZFBhdGggPSBjb2xsZWN0Tm9kZU1ldGEoc3BlYylcblxuICAvLyBQaGFzZSA0XHVGRjA4VVMyXHVGRjA5XHVGRjFBXHU1RjNBXHU1MjM2XHU2NjNFXHU1RjBGIGRlcHNcdUZGMDhHcmFwaC9kaWFnbm9zdGljcy9yZXBsYXkgXHU1M0VBXHU4QkE0IGRlcHMgXHU0RjVDXHU0RTNBXHU0RjlEXHU4RDU2XHU0RThCXHU1QjlFXHU2RTkwXHVGRjA5XHUzMDAyXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmIChlbnRyeS5raW5kID09PSBcImNvbXB1dGVkXCIpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSAoZW50cnkubWV0YSBhcyBhbnkpLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZGVwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgW1N0YXRlVHJhaXQuYnVpbGRdIE1pc3NpbmcgZXhwbGljaXQgZGVwcyBmb3IgY29tcHV0ZWQgXCIke2VudHJ5LmZpZWxkUGF0aH1cIi4gYCArXG4gICAgICAgICAgICBcIlBsZWFzZSB1c2UgU3RhdGVUcmFpdC5jb21wdXRlZCh7IGRlcHM6IFsuLi5dLCBnZXQ6IC4uLiB9KS5cIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJzb3VyY2VcIikge1xuICAgICAgY29uc3QgZGVwcyA9IChlbnRyeS5tZXRhIGFzIGFueSkuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgIGlmIChkZXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gTWlzc2luZyBleHBsaWNpdCBkZXBzIGZvciBzb3VyY2UgXCIke2VudHJ5LmZpZWxkUGF0aH1cIi4gYCArXG4gICAgICAgICAgICBcIlBsZWFzZSBwcm92aWRlIG1ldGEuZGVwcyBmb3IgU3RhdGVUcmFpdC5zb3VyY2UoeyBkZXBzOiBbLi4uXSwgLi4uIH0pLlwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnRyeS5raW5kID09PSBcImNoZWNrXCIpIHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gKChlbnRyeS5tZXRhIGFzIGFueSk/LnJ1bGVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMocnVsZXMpKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSBydWxlc1tuYW1lXVxuICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09IFwiZnVuY3Rpb25cIiB8fCAhcnVsZSB8fCB0eXBlb2YgcnVsZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gTWlzc2luZyBleHBsaWNpdCBkZXBzIGZvciBjaGVjayBcIiR7ZW50cnkuZmllbGRQYXRofVwiIHJ1bGUgXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBcIlBsZWFzZSB1c2UgeyBkZXBzOiBbLi4uXSwgdmFsaWRhdGU6IC4uLiB9IGZvcm0uXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICgocnVsZSBhcyBhbnkpLmRlcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gTWlzc2luZyBleHBsaWNpdCBkZXBzIGZvciBjaGVjayBcIiR7ZW50cnkuZmllbGRQYXRofVwiIHJ1bGUgXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBcIlBsZWFzZSBwcm92aWRlIGRlcHM6IFsuLi5dLlwiLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgZ3JhcGgsIHBsYW4gfSA9IGJ1aWxkR3JhcGgoZW50cmllcywgbm9kZU1ldGFCeUZpZWxkUGF0aClcblxuICAvLyBcdTk0ODhcdTVCRjkgbGluayBcdThGQjlcdThGREJcdTg4NENcdTRFMDBcdTZCMjFcdTczQUZcdThERUZcdTY4QzBcdTZENEJcdUZGMENcdTkwN0ZcdTUxNERcdTY2MEVcdTY2M0VcdTc2ODRcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdTMwMDJcbiAgYXNzZXJ0Tm9MaW5rQ3ljbGVzKGdyYXBoLmVkZ2VzKVxuXG4gIHJldHVybiB7XG4gICAgc3RhdGVTY2hlbWEsXG4gICAgc3BlYyxcbiAgICBlbnRyaWVzOiBlbnRyaWVzIGFzIFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPj4sXG4gICAgZ3JhcGgsXG4gICAgcGxhbixcbiAgICBjb252ZXJnZUlyOiBidWlsZENvbnZlcmdlSXIoZW50cmllcyBhcyBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+KSxcbiAgfVxufVxuIiwgImltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHR5cGUgeyBCb3VuZEFwaSB9IGZyb20gXCIuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzXCJcbmltcG9ydCB7IGdldEJvdW5kSW50ZXJuYWxzIH0gZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanNcIlxuaW1wb3J0ICogYXMgU291cmNlUnVudGltZSBmcm9tIFwiLi9zb3VyY2UuanNcIlxuaW1wb3J0IHR5cGUge1xuICBTdGF0ZVRyYWl0UHJvZ3JhbSxcbiAgU3RhdGVUcmFpdFBsYW5TdGVwLFxuICBTdGF0ZVRyYWl0RW50cnksXG4gIFRyYWl0Q29udmVyZ2VHZW5lcmF0aW9uQnVtcFJlYXNvbixcbn0gZnJvbSBcIi4vbW9kZWwuanNcIlxuXG5jb25zdCBidWlsZEVudHJ5SW5kZXggPSA8Uz4oXG4gIGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PFMsIHN0cmluZz4+LFxuKTogTWFwPHN0cmluZywgQXJyYXk8U3RhdGVUcmFpdEVudHJ5PFMsIHN0cmluZz4+PiA9PiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PFN0YXRlVHJhaXRFbnRyeTxTLCBzdHJpbmc+Pj4oKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBsaXN0ID0gaW5kZXguZ2V0KGVudHJ5LmZpZWxkUGF0aCkgPz8gW11cbiAgICBsaXN0LnB1c2goZW50cnkpXG4gICAgaW5kZXguc2V0KGVudHJ5LmZpZWxkUGF0aCwgbGlzdClcbiAgfVxuICByZXR1cm4gaW5kZXhcbn1cblxuLyoqXG4gKiBcdTU3MjhcdTdFRDlcdTVCOUEgQm91bmQgQVBJIFx1NEUwQVx1NUI4OVx1ODhDNSBTdGF0ZVRyYWl0UHJvZ3JhbSBcdTYzQ0ZcdThGRjBcdTc2ODRcdTg4NENcdTRFM0FcdTMwMDJcbiAqXG4gKiAtIFBoYXNlIDIgXHU2NzAwXHU1QzBGXHU1QjlFXHU3M0IwXHVGRjFBXG4gKiAgIC0gXHU0RTNBIGNvbXB1dGVkIFx1NUI1N1x1NkJCNVx1NkNFOFx1NTE4QyB3YXRjaGVyXHVGRjFBXHU1RjUzIFN0YXRlIFx1NTNEOFx1NTMxNlx1NjVGNlx1OTFDRFx1N0I5N1x1NzZFRVx1NjgwN1x1NUI1N1x1NkJCNVx1RkYxQlxuICogICAtIFx1NEUzQSBsaW5rIFx1NUI1N1x1NkJCNVx1NkNFOFx1NTE4QyB3YXRjaGVyXHVGRjFBXHU1RjUzXHU2RTkwXHU1QjU3XHU2QkI1XHU1M0Q4XHU1MzE2XHU2NUY2XHU1NDBDXHU2QjY1XHU3NkVFXHU2ODA3XHU1QjU3XHU2QkI1XHVGRjFCXG4gKiAgIC0gXHU0RTNBIHNvdXJjZSBcdTVCNTdcdTZCQjVcdTk4ODRcdTc1NTlcdTUyMzdcdTY1QjBcdTUxNjVcdTUzRTNcdUZGMDhcdTY2ODJcdTRFMERcdTg5RTZcdTUzRDFcdTU5MTZcdTkwRThcdThDMDNcdTc1MjhcdUZGMDlcdTMwMDJcbiAqXG4gKiBcdThCRjRcdTY2MEVcdUZGMUFcbiAqIC0gXHU2MjQwXHU2NzA5IHdhdGNoZXIgXHU5MEZEXHU5MDFBXHU4RkM3IEJvdW5kIEFQSSBgJGAgXHU1Qjg5XHU4OEM1XHVGRjBDXHU0RTBEXHU3NkY0XHU2M0E1XHU0RjlEXHU4RDU2IE1vZHVsZVJ1bnRpbWVcdUZGMUJcbiAqIC0gXHU2QkNGXHU0RTJBIFBsYW5TdGVwIFx1NUJGOVx1NUU5NFx1NEUwMFx1NEUyQVx1OTU3Rlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRiBFZmZlY3RcdUZGMENcdTkwMUFcdThGQzcgZm9ya1Njb3BlZCBcdTYzMDJcdThGN0RcdTUyMzAgUnVudGltZSBTY29wZVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgaW5zdGFsbCA9IDxTPihcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55PixcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08Uz4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+IHtcbiAgLy8gXHU0RjE4XHU1MTQ4XHU1QzA2IFByb2dyYW0gXHU2Q0U4XHU1MThDXHU1MjMwIFJ1bnRpbWVcdUZGMDhcdTY1MzZcdTY1NUJcdTVGMTVcdTY0Q0VcdTU3MjhcdTRFOEJcdTUyQTFcdTYzRDBcdTRFQTRcdTUyNERcdTdFREZcdTRFMDBcdTYyNjdcdTg4NEMgY29tcHV0ZWQvbGluay9jaGVja1x1RkYwOVx1MzAwMlxuICB0cnkge1xuICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKGJvdW5kIGFzIGFueSlcbiAgICA7KGludGVybmFscy50cmFpdHMucmVnaXN0ZXJTdGF0ZVRyYWl0UHJvZ3JhbSBhcyBhbnkpKHByb2dyYW0sIHtcbiAgICAgIGJ1bXBSZWFzb246IFwibG9naWNfaW5zdGFsbGVkXCIgYXMgVHJhaXRDb252ZXJnZUdlbmVyYXRpb25CdW1wUmVhc29uLFxuICAgIH0pXG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vLW9wIGZvciBsZWdhY3kvbW9ja2VkIGJvdW5kXG4gIH1cblxuICBjb25zdCBlbnRyeUluZGV4ID0gYnVpbGRFbnRyeUluZGV4KHByb2dyYW0uZW50cmllcyBhcyBhbnkpXG5cbiAgY29uc3QgaW5zdGFsbFN0ZXAgPSAoXG4gICAgc3RlcDogU3RhdGVUcmFpdFBsYW5TdGVwLFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+IHtcbiAgICBpZiAoIXN0ZXAudGFyZ2V0RmllbGRQYXRoKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5raW5kICE9PSBcInNvdXJjZS1yZWZyZXNoXCIpIHtcbiAgICAgIC8vIGNvbXB1dGVkL2xpbmsvY2hlY2sgXHU1REYyXHU3NTMxIFJ1bnRpbWUgXHU1MTg1XHU2ODM4XHU1NzI4XHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU1MTg1XHU1OTA0XHU3NDA2XHVGRjFCaW5zdGFsbCBcdTk2MzZcdTZCQjVcdTRFQzVcdTRGRERcdTc1NTkgc291cmNlLnJlZnJlc2ggXHU1MTY1XHU1M0UzXHUzMDAyXG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gZW50cnlJbmRleC5nZXQoc3RlcC50YXJnZXRGaWVsZFBhdGgpXG4gICAgaWYgKCFjYW5kaWRhdGVzIHx8IGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBQbGFuIFx1NEUyRFx1NUYxNVx1NzUyOFx1NEU4Nlx1NEUwRFx1NUI1OFx1NTcyOFx1NzY4NCBTcGVjXHVGRjFBXHU4OUM2XHU0RTNBXHU2Nzg0XHU1RUZBXHU5NjM2XHU2QkI1XHU3Njg0IGJ1Z1x1RkYwQ1x1OEZEOVx1OTFDQ1x1NzZGNFx1NjNBNVx1NUZGRFx1NzU2NVx1OEJFNVx1NkI2NVx1OUFBNFx1MzAwMlxuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgY29uc3QgZW50cnkgPSBjYW5kaWRhdGVzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJzb3VyY2VcIilcblxuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgIH1cblxuICAgIHJldHVybiBTb3VyY2VSdW50aW1lLmluc3RhbGxTb3VyY2VSZWZyZXNoKFxuICAgICAgYm91bmQsXG4gICAgICBzdGVwLFxuICAgICAgZW50cnkgYXMgYW55LFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBFZmZlY3QuZm9yRWFjaChwcm9ncmFtLnBsYW4uc3RlcHMsIChzdGVwKSA9PiBpbnN0YWxsU3RlcChzdGVwKSkucGlwZShFZmZlY3QuYXNWb2lkKVxufVxuIiwgIi8vIFN0YXRlVHJhaXQgXHU1NDdEXHU1NDBEXHU3QTdBXHU5NUY0XHU2QTIxXHU1NzU3XHVGRjFBXG4vLyAtIFx1NjNEMFx1NEY5QiB0cmFpdHMgc3BlYyBcdTc2ODQgRFNMXHVGRjA4ZnJvbS9ub2RlL2xpc3QvY29tcHV0ZWQvc291cmNlL2xpbmtcdUZGMDlcdUZGMUJcbi8vIC0gYnVpbGRcdUZGMUFcdTVGNTJcdTRFMDBcdTUzMTYgc3BlYyBcdTVFNzZcdTc1MUZcdTYyMTAgUHJvZ3JhbS9HcmFwaC9QbGFuXHVGRjFCXG4vLyAtIGluc3RhbGxcdUZGMUFcdTVDMDYgUHJvZ3JhbSBcdTVCODlcdTg4QzVcdTUyMzBcdThGRDBcdTg4NENcdTY1RjZcdUZGMDhcdTZDRThcdTUxOEMgc291cmNlLnJlZnJlc2ggXHU3QjQ5XHU1MTY1XHU1M0UzXHVGRjBDXHU1RTc2XHU1NzI4XHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU2MjY3XHU4ODRDIGNvbnZlcmdlL3ZhbGlkYXRlXHVGRjA5XHUzMDAyXG5cbmltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tIFwiLi9Cb3VuZC5qc1wiXG5pbXBvcnQgKiBhcyBNb2RlbCBmcm9tIFwiLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9tb2RlbC5qc1wiXG5pbXBvcnQgKiBhcyBGaWVsZFBhdGggZnJvbSBcIi4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvZmllbGQtcGF0aC5qc1wiXG5pbXBvcnQgKiBhcyBSb3dJZCBmcm9tIFwiLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9yb3dpZC5qc1wiXG5pbXBvcnQgKiBhcyBJbnRlcm5hbEJ1aWxkIGZyb20gXCIuL2ludGVybmFsL3N0YXRlLXRyYWl0L2J1aWxkLmpzXCJcbmltcG9ydCAqIGFzIEludGVybmFsSW5zdGFsbCBmcm9tIFwiLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pbnN0YWxsLmpzXCJcbmltcG9ydCAqIGFzIEludGVybmFsSXIgZnJvbSBcIi4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvaXIuanNcIlxuXG4vLyBcdTVCRjlcdTU5MTZcdTY2QjRcdTk3MzJcdTc2ODRcdTY4MzhcdTVGQzNcdTdDN0JcdTU3OEJcdTUyMkJcdTU0MERcdTMwMDJcbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRTcGVjPFM+ID0gTW9kZWwuU3RhdGVUcmFpdFNwZWM8Uz5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRFbnRyeTxTID0gdW5rbm93biwgUCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPVxuICBNb2RlbC5TdGF0ZVRyYWl0RW50cnk8UywgUD5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRQcm9ncmFtPFM+ID0gTW9kZWwuU3RhdGVUcmFpdFByb2dyYW08Uz5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRHcmFwaCA9IE1vZGVsLlN0YXRlVHJhaXRHcmFwaFxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdFBsYW4gPSBNb2RlbC5TdGF0ZVRyYWl0UGxhblxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdE5vZGU8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPiA9IE1vZGVsLlN0YXRlVHJhaXROb2RlPElucHV0LCBDdHg+XG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0TGlzdDxJdGVtID0gdW5rbm93bj4gPSBNb2RlbC5TdGF0ZVRyYWl0TGlzdDxJdGVtPlxuZXhwb3J0IHR5cGUgQ2hlY2tSdWxlPElucHV0ID0gdW5rbm93biwgQ3R4ID0gdW5rbm93bj4gPSBNb2RlbC5DaGVja1J1bGU8SW5wdXQsIEN0eD5cblxuZXhwb3J0IHR5cGUgU3RhdGVGaWVsZFBhdGg8Uz4gPSBGaWVsZFBhdGguU3RhdGVGaWVsZFBhdGg8Uz5cbmV4cG9ydCB0eXBlIFN0YXRlQXRQYXRoPFMsIFA+ID0gRmllbGRQYXRoLlN0YXRlQXRQYXRoPFMsIFA+XG5cbmV4cG9ydCBjb25zdCAkcm9vdCA9IFwiJHJvb3RcIiBhcyBjb25zdFxuXG50eXBlIERlcHNBcmdzPFMgZXh0ZW5kcyBvYmplY3QsIERlcHMgZXh0ZW5kcyBSZWFkb25seUFycmF5PFN0YXRlRmllbGRQYXRoPFM+Pj4gPSB7XG4gIHJlYWRvbmx5IFtLIGluIGtleW9mIERlcHNdOiBTdGF0ZUF0UGF0aDxTLCBEZXBzW0tdPlxufVxuXG4vKipcbiAqIFN0YXRlVHJhaXQuZnJvbVx1RkYxQVxuICogLSBcdTY4MzlcdTYzNkUgU3RhdGUgU2NoZW1hIFx1NjUzNlx1N0E4NFx1NTNFRlx1NzUyOFx1NUI1N1x1NkJCNVx1OERFRlx1NUY4NFx1RkYwQ1x1NUU3Nlx1NEUzQSB0cmFpdHMgc3BlYyBcdTYzRDBcdTRGOUJcdTdDN0JcdTU3OEJcdTdFQTZcdTY3NUZcdUZGMUJcbiAqIC0gXHU4RkQwXHU4ODRDXHU2NUY2XHU0RUM1XHU4RkQ0XHU1NkRFXHU1MzlGXHU1OUNCIHNwZWMgXHU1QkY5XHU4QzYxXHVGRjBDXHU1MTc3XHU0RjUzXHU1RjUyXHU0RTAwXHU1MzE2XHU3NTMxIGludGVybmFsIFx1NUM0Mlx1NTkwNFx1NzQwNlx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgZnJvbSA9IDxTIGV4dGVuZHMgb2JqZWN0LCBJPihcbiAgX3NjaGVtYTogU2NoZW1hLlNjaGVtYTxTLCBJPixcbikgPT5cbihzcGVjOiBTdGF0ZVRyYWl0U3BlYzxTPik6IFN0YXRlVHJhaXRTcGVjPFM+ID0+XG4gIHNwZWNcblxuZXhwb3J0IGNvbnN0IG5vZGUgPSA8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPihcbiAgc3BlYzogT21pdDxNb2RlbC5TdGF0ZVRyYWl0Tm9kZTxJbnB1dCwgQ3R4PiwgXCJfdGFnXCI+LFxuKTogTW9kZWwuU3RhdGVUcmFpdE5vZGU8SW5wdXQsIEN0eD4gPT4gKHtcbiAgX3RhZzogXCJTdGF0ZVRyYWl0Tm9kZVwiLFxuICAuLi5zcGVjLFxufSlcblxuZXhwb3J0IGNvbnN0IGxpc3QgPSA8SXRlbSA9IHVua25vd24+KFxuICBzcGVjOiBPbWl0PE1vZGVsLlN0YXRlVHJhaXRMaXN0PEl0ZW0+LCBcIl90YWdcIj4sXG4pOiBNb2RlbC5TdGF0ZVRyYWl0TGlzdDxJdGVtPiA9PiAoe1xuICBfdGFnOiBcIlN0YXRlVHJhaXRMaXN0XCIsXG4gIC4uLnNwZWMsXG59KVxuXG4vKipcbiAqIFN0YXRlVHJhaXQuY29tcHV0ZWRcdUZGMUFcbiAqIC0gXHU0RTNBXHU2N0QwXHU0RTJBXHU1QjU3XHU2QkI1XHU1OEYwXHU2NjBFIGNvbXB1dGVkIFx1ODBGRFx1NTI5Qlx1RkYxQlxuICogLSBcdTkwMUFcdThGQzdcdTY2M0VcdTVGMEYgZGVwcyBcdTRGNUNcdTRFM0FcdTU1MkZcdTRFMDBcdTRGOURcdThENTZcdTRFOEJcdTVCOUVcdTZFOTBcdUZGMDhcdTc1MjhcdTRFOEVcdThCQ0FcdTY1QUQvXHU1M0NEXHU1NDExXHU5NUVEXHU1MzA1L1x1NTQwRVx1N0VFRFx1NTg5RVx1OTFDRlx1OEMwM1x1NUVBNlx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgY29tcHV0ZWQgPSA8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFAgZXh0ZW5kcyBTdGF0ZUZpZWxkUGF0aDxTPixcbiAgY29uc3QgRGVwcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8U3RhdGVGaWVsZFBhdGg8Uz4+LFxuPihcbiAgaW5wdXQ6IHtcbiAgICByZWFkb25seSBkZXBzOiBEZXBzXG4gICAgcmVhZG9ubHkgZ2V0OiAoLi4uZGVwc1ZhbHVlczogRGVwc0FyZ3M8UywgRGVwcz4pID0+IFN0YXRlQXRQYXRoPFMsIFA+XG4gICAgcmVhZG9ubHkgZXF1YWxzPzogKHByZXY6IFN0YXRlQXRQYXRoPFMsIFA+LCBuZXh0OiBTdGF0ZUF0UGF0aDxTLCBQPikgPT4gYm9vbGVhblxuICB9LFxuKTogU3RhdGVUcmFpdEVudHJ5PFMsIFA+ID0+IHtcbiAgY29uc3QgZGVyaXZlID0gKHN0YXRlOiBSZWFkb25seTxTPik6IFN0YXRlQXRQYXRoPFMsIFA+ID0+IHtcbiAgICBjb25zdCBhcmdzID0gKGlucHV0LmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+KS5tYXAoKGRlcCkgPT5cbiAgICAgIFJvd0lkLmdldEF0UGF0aChzdGF0ZSBhcyBhbnksIGRlcCksXG4gICAgKVxuICAgIHJldHVybiAoaW5wdXQuZ2V0IGFzIGFueSkoLi4uYXJncylcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpZWxkUGF0aDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgUCxcbiAgICBraW5kOiBcImNvbXB1dGVkXCIsXG4gICAgbWV0YTogeyBkZXBzOiBpbnB1dC5kZXBzLCBkZXJpdmUsIGVxdWFsczogaW5wdXQuZXF1YWxzIH0sXG4gIH0gYXMgU3RhdGVUcmFpdEVudHJ5PFMsIFA+XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdC5zb3VyY2VcdUZGMUFcbiAqIC0gXHU0RTNBXHU2N0QwXHU0RTJBXHU1QjU3XHU2QkI1XHU1OEYwXHU2NjBFXHU1OTE2XHU5MEU4XHU4RDQ0XHU2RTkwXHU2NzY1XHU2RTkwXHVGRjA4UmVzb3VyY2UgLyBRdWVyeSBcdTk2QzZcdTYyMTBcdTU3MjhcdTU0MEVcdTdFRUQgUGhhc2UgXHU0RTJEXHU1QjlFXHU3M0IwXHVGRjA5XHVGRjFCXG4gKiAtIFx1NTE4NVx1NjgzOFx1OEQxRlx1OEQyMyBrZXlIYXNoIGdhdGUgLyBjb25jdXJyZW5jeSAvIFJlcGxheU1vZGUgXHU4ODRDXHU0RTNBXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBzb3VyY2UgPSA8UyBleHRlbmRzIG9iamVjdCwgUCBleHRlbmRzIFN0YXRlRmllbGRQYXRoPFM+PihtZXRhOiB7XG4gIHJlc291cmNlOiBzdHJpbmdcbiAgZGVwczogUmVhZG9ubHlBcnJheTxTdGF0ZUZpZWxkUGF0aDxTPj5cbiAga2V5OiAoc3RhdGU6IFJlYWRvbmx5PFM+KSA9PiB1bmtub3duXG4gIHRyaWdnZXJzPzogUmVhZG9ubHlBcnJheTxcIm9uTW91bnRcIiB8IFwib25WYWx1ZUNoYW5nZVwiIHwgXCJtYW51YWxcIj5cbiAgZGVib3VuY2VNcz86IG51bWJlclxuICBjb25jdXJyZW5jeT86IFwic3dpdGNoXCIgfCBcImV4aGF1c3QtdHJhaWxpbmdcIlxuICAvKipcbiAgICogXHU3NTI4XHU0RThFIERldnRvb2xzL1x1NjU4N1x1Njg2M1x1NzY4NFx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NTE0M1x1NEZFMVx1NjA2Rlx1RkYwOFx1NzY3RFx1NTQwRFx1NTM1NVx1NUI1N1x1NkJCNVx1NEYxQVx1NTcyOCBidWlsZCBcdTk2MzZcdTZCQjVcdTg4QUJcdTYzRDBcdTUzRDZcdUZGMDlcdTMwMDJcbiAgICovXG4gIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxufSk6IFN0YXRlVHJhaXRFbnRyeTxTLCBQPiA9PlxuICAoe1xuICAgIGZpZWxkUGF0aDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgUCxcbiAgICBraW5kOiBcInNvdXJjZVwiLFxuICAgIG1ldGEsXG4gIH0gYXMgU3RhdGVUcmFpdEVudHJ5PFMsIFA+KVxuXG4vKipcbiAqIFN0YXRlVHJhaXQubGlua1x1RkYxQVxuICogLSBcdTRFM0FcdTc2RUVcdTY4MDdcdTVCNTdcdTZCQjVcdTU4RjBcdTY2MEVcdTRFQ0VcdTUxNzZcdTRFRDZcdTVCNTdcdTZCQjVcdTgwNTRcdTUyQThcdTc2ODRcdTgwRkRcdTUyOUJcdUZGMUJcbiAqIC0gbWV0YS5mcm9tIFx1NTQwQ1x1NjgzN1x1NTNENyBTdGF0ZUZpZWxkUGF0aDxTPiBcdTdFQTZcdTY3NUZcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGxpbmsgPSA8UyBleHRlbmRzIG9iamVjdCwgUCBleHRlbmRzIFN0YXRlRmllbGRQYXRoPFM+PihtZXRhOiB7XG4gIGZyb206IFN0YXRlRmllbGRQYXRoPFM+XG59KTogU3RhdGVUcmFpdEVudHJ5PFMsIFA+ID0+XG4gICh7XG4gICAgZmllbGRQYXRoOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBQLFxuICAgIGtpbmQ6IFwibGlua1wiLFxuICAgIG1ldGEsXG4gIH0gYXMgU3RhdGVUcmFpdEVudHJ5PFMsIFA+KVxuXG4vKipcbiAqIFN0YXRlVHJhaXQuYnVpbGRcdUZGMUFcbiAqIC0gXHU1QzA2IFNwZWMgXHU1RjUyXHU0RTAwXHU1MzE2XHU0RTNBXHU1M0VGXHU2MjY3XHU4ODRDIFByb2dyYW1cdUZGMDhcdTU0MkIgR3JhcGgvUGxhblx1RkYwOVx1RkYxQlxuICogLSBEU0wgXHU1QzQyXHU0RTBFIGJ1aWxkIFx1NUM0Mlx1NzY4NFx1N0VBNlx1Njc1Rlx1NEVFNSBidWlsZCBcdTRFM0FcdTY3MDBcdTdFQzhcdTg4QzFcdTUxQjNcdUZGMDhcdTRGOEJcdTU5ODJcdTVGM0FcdTUyMzZcdTY2M0VcdTVGMEYgZGVwc1x1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgYnVpbGQgPSA8UyBleHRlbmRzIG9iamVjdD4oXG4gIHN0YXRlU2NoZW1hOiBTY2hlbWEuU2NoZW1hPFMsIGFueT4sXG4gIHNwZWM6IFN0YXRlVHJhaXRTcGVjPFM+LFxuKTogU3RhdGVUcmFpdFByb2dyYW08Uz4gPT4gSW50ZXJuYWxCdWlsZC5idWlsZChzdGF0ZVNjaGVtYSwgc3BlYylcblxuLyoqXG4gKiBTdGF0ZVRyYWl0Lmluc3RhbGxcdUZGMUFcbiAqIC0gXHU1NzI4XHU3RUQ5XHU1QjlBIEJvdW5kIEFQSSBcdTRFMEFcdTVCODlcdTg4QzUgUHJvZ3JhbSBcdTYzQ0ZcdThGRjBcdTc2ODRcdTg4NENcdTRFM0FcdUZGMDhjb21wdXRlZC9saW5rL3NvdXJjZS9jaGVjayBcdTdCNDlcdUZGMDlcdUZGMUJcbiAqIC0gXHU2QkNGXHU0RTJBIFBsYW5TdGVwIFx1NUJGOVx1NUU5NFx1NEUwMFx1NEUyQVx1OTU3Rlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRiBFZmZlY3RcdUZGMENcdTVFNzZcdTYzMDJcdThGN0RcdTUyMzAgUnVudGltZSBTY29wZVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgaW5zdGFsbCA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55PixcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08Uz4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+IEludGVybmFsSW5zdGFsbC5pbnN0YWxsKGJvdW5kLCBwcm9ncmFtKVxuXG4vKipcbiAqIFN0YXRlVHJhaXQuZXhwb3J0U3RhdGljSXJcdUZGMUFcbiAqIC0gXHU1QkZDXHU1MUZBXHU2NzAwXHU1QzBGIFN0YXRpYyBJUlx1RkYwOFx1NUJGOVx1OUY1MCAwMDkgXHU3Njg0IGNhbm9uaWNhbCBGaWVsZFBhdGggXHU3RUE2XHU2NzVGXHVGRjA5XHVGRjBDXHU0RjlCIERldnRvb2xzL1x1NUJGOVx1OUY1MFx1NUI5RVx1OUE4Q1x1NUJBNFx1NkQ4OFx1OEQzOVx1RkYxQlxuICogLSBcdThGRDRcdTU2REVcdTUwM0NcdTVGQzVcdTk4N0JcdTUzRUYgSlNPTi5zdHJpbmdpZnlcdUZGMDhcdTc1MjhcdTRFOEVcdThCQzFcdTYzNkVcdTUzMDUvXHU1NkRFXHU2NTNFXHU5NEZFXHU4REVGXHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXRpY0lyID0gSW50ZXJuYWxJci5TdGF0aWNJclxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAoXG4gIHByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPGFueT4sXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZ1xuICB9LFxuKTogU3RhdGljSXIgPT5cbiAgSW50ZXJuYWxJci5leHBvcnRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZCxcbiAgICB2ZXJzaW9uOiBvcHRpb25zPy52ZXJzaW9uLFxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDQSxJQUFNLG9CQUFvQixDQUFDLFVBQXdEO0FBQ2pGLFFBQU0sTUFBTSxvQkFBSSxJQUFZO0FBQzVCLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFVBQU0sSUFBSSxLQUFLLEtBQUs7QUFDcEIsUUFBSSxDQUFDLEVBQUc7QUFDUixRQUFJLElBQUksQ0FBQztBQUFBLEVBQ1g7QUFDQSxTQUFPLE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzFEO0FBRUEsSUFBTSxnQkFBZ0IsQ0FBQyxVQUNyQixPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUVyRSxJQUFNLG9CQUFv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QUNuQztBQUNBLFdBQVEsTUFBTSxJQUFZLEdBQUcsSUFBSTtBQUFBLEVBQ25DO0FBQ0EsU0FBTztBQUFBLElBQ0wsV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sTUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLFFBQVEsUUFBUSxNQUFNLE9BQU87QUFBQSxFQUN6RDtBQUNGO0FBT08sSUFBTSxTQUFTLENBQWdELFVBWW5FO0FBQUEsRUFDQyxXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTjtBQUNGO0FBT0ssSUFBTSxPQUFPLENBQWdELFVBR2pFO0FBQUEsRUFDQyxXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTjtBQUNGO0FBT0ssSUFBTUMsU0FBUSxDQUNuQixhQUNBLFNBQ3VDLE1BQU0sYUFBYSxJQUFJO0FBT3pELElBQU1DLFdBQVUsQ0FDckIsT0FDQSxZQUNvRCxRQUFRLE9BQU8sT0FBTztBQVNyRSxJQUFNQyxrQkFBaUIsQ0FDNUIsU0FDQSxVQUNBLFlBSVcsZUFBZTtBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUyxTQUFTO0FBQ3BCLENBQUM7IiwKICAibmFtZXMiOiBbImZyb20iLCAibm9kZSIsICJub2RlIiwgImxpc3QiLCAiZnJvbSIsICJsaXN0IiwgImJ1aWxkIiwgImluc3RhbGwiLCAiZXhwb3J0U3RhdGljSXIiXQp9Cg==