@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,397 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+
4
+ // ../logix-core/src/internal/state-trait/rowid.ts
5
+ var parseSegments = (path) => {
6
+ if (!path) return [];
7
+ return path.split(".").map(
8
+ (seg) => /^[0-9]+$/.test(seg) ? Number(seg) : seg
9
+ );
10
+ };
11
+ var getAtPath = (state, path) => {
12
+ if (!path || state == null) return state;
13
+ const segments = parseSegments(path);
14
+ let current = state;
15
+ for (const seg of segments) {
16
+ if (current == null) return void 0;
17
+ if (typeof seg === "number") {
18
+ current = Array.isArray(current) ? current[seg] : current[String(seg)];
19
+ continue;
20
+ }
21
+ current = current[seg];
22
+ }
23
+ return current;
24
+ };
25
+ var setAtPathMutating = (draft, path, value) => {
26
+ if (!path) return;
27
+ const segments = parseSegments(path);
28
+ if (segments.length === 0) return;
29
+ let current = draft;
30
+ for (let i = 0; i < segments.length - 1; i++) {
31
+ const key = segments[i];
32
+ const nextKey = segments[i + 1];
33
+ const next = current?.[key];
34
+ if (next == null || typeof next !== "object") {
35
+ current[key] = typeof nextKey === "number" ? [] : {};
36
+ }
37
+ current = current[key];
38
+ }
39
+ const last = segments[segments.length - 1];
40
+ current[last] = value;
41
+ };
42
+ var unsetAtPathMutating = (draft, path) => {
43
+ if (!path) return;
44
+ const segments = parseSegments(path);
45
+ if (segments.length === 0) return;
46
+ let current = draft;
47
+ for (let i = 0; i < segments.length - 1; i++) {
48
+ const key = segments[i];
49
+ const next = current?.[key];
50
+ if (next == null || typeof next !== "object") {
51
+ return;
52
+ }
53
+ current = next;
54
+ }
55
+ const last = segments[segments.length - 1];
56
+ if (Array.isArray(current) && typeof last === "number") {
57
+ current[last] = void 0;
58
+ return;
59
+ }
60
+ if (current && typeof current === "object") {
61
+ delete current[last];
62
+ }
63
+ };
64
+ var parseListItemFieldPath = (fieldPath) => {
65
+ const raw = typeof fieldPath === "string" ? fieldPath.trim() : "";
66
+ if (!raw) return void 0;
67
+ const segments = raw.split(".").filter(Boolean);
68
+ let lastListSeg = -1;
69
+ for (let i = 0; i < segments.length; i++) {
70
+ if (segments[i].endsWith("[]")) lastListSeg = i;
71
+ }
72
+ if (lastListSeg < 0) return void 0;
73
+ const strip = (seg) => seg.endsWith("[]") ? seg.slice(0, -2) : seg;
74
+ const listPath = segments.slice(0, lastListSeg + 1).map(strip).join(".");
75
+ const itemPath = segments.slice(lastListSeg + 1).map(strip).join(".");
76
+ return { listPath, itemPath };
77
+ };
78
+ var toListItemValuePath = (listPath, index, itemPath) => itemPath ? `${listPath}.${index}.${itemPath}` : `${listPath}.${index}`;
79
+ var readTrackBy = (item, trackBy) => {
80
+ if (!item || typeof item !== "object") return void 0;
81
+ const segments = trackBy.split(".");
82
+ let current = item;
83
+ for (const seg of segments) {
84
+ if (current == null) return void 0;
85
+ current = current[seg];
86
+ }
87
+ return current;
88
+ };
89
+ var didReorderByReference = (prevItems, nextItems) => {
90
+ const buckets = /* @__PURE__ */ new Map();
91
+ for (let i = 0; i < prevItems.length; i++) {
92
+ const item = prevItems[i];
93
+ const list = buckets.get(item) ?? [];
94
+ list.push(i);
95
+ buckets.set(item, list);
96
+ }
97
+ for (let nextIndex = 0; nextIndex < nextItems.length; nextIndex++) {
98
+ const item = nextItems[nextIndex];
99
+ const q = buckets.get(item);
100
+ if (!q || q.length === 0) continue;
101
+ const prevIndex = q.shift();
102
+ if (prevIndex !== nextIndex) {
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ };
108
+ var hasStableTrackByKeys = (items, trackBy) => items.every((item) => readTrackBy(item, trackBy) !== void 0);
109
+ var isSameTrackBySequence = (prevItems, nextItems, trackBy) => {
110
+ if (prevItems.length !== nextItems.length) return false;
111
+ for (let i = 0; i < prevItems.length; i++) {
112
+ if (!Object.is(
113
+ readTrackBy(prevItems[i], trackBy),
114
+ readTrackBy(nextItems[i], trackBy)
115
+ )) {
116
+ return false;
117
+ }
118
+ }
119
+ return true;
120
+ };
121
+ var reconcileIds = (prev, nextItems, trackBy, makeRowId) => {
122
+ const nextRowId = makeRowId ?? /* @__PURE__ */ (() => {
123
+ let rowSeq = 0;
124
+ return () => {
125
+ rowSeq += 1;
126
+ return `r${rowSeq}`;
127
+ };
128
+ })();
129
+ if (!prev) {
130
+ return {
131
+ ids: nextItems.map(() => nextRowId()),
132
+ removed: []
133
+ };
134
+ }
135
+ if (prev.itemsRef === nextItems) {
136
+ return {
137
+ ids: prev.ids,
138
+ removed: []
139
+ };
140
+ }
141
+ const sameLength = prev.itemsRef.length === nextItems.length;
142
+ if (sameLength) {
143
+ if (trackBy) {
144
+ const canUseKeys = hasStableTrackByKeys(prev.itemsRef, trackBy) && hasStableTrackByKeys(nextItems, trackBy);
145
+ if (canUseKeys) {
146
+ if (isSameTrackBySequence(prev.itemsRef, nextItems, trackBy)) {
147
+ return {
148
+ ids: prev.ids,
149
+ removed: []
150
+ };
151
+ }
152
+ } else {
153
+ if (!didReorderByReference(prev.itemsRef, nextItems)) {
154
+ return {
155
+ ids: prev.ids,
156
+ removed: []
157
+ };
158
+ }
159
+ }
160
+ } else if (!didReorderByReference(prev.itemsRef, nextItems)) {
161
+ return {
162
+ ids: prev.ids,
163
+ removed: []
164
+ };
165
+ }
166
+ }
167
+ const keyOf = (item) => {
168
+ if (!trackBy) return item;
169
+ const k = readTrackBy(item, trackBy);
170
+ return k !== void 0 ? k : item;
171
+ };
172
+ const buckets = /* @__PURE__ */ new Map();
173
+ for (let i = 0; i < prev.itemsRef.length; i++) {
174
+ const key = keyOf(prev.itemsRef[i]);
175
+ const list = buckets.get(key) ?? [];
176
+ list.push(prev.ids[i]);
177
+ buckets.set(key, list);
178
+ }
179
+ const ids = [];
180
+ for (let i = 0; i < nextItems.length; i++) {
181
+ const key = keyOf(nextItems[i]);
182
+ const list = buckets.get(key);
183
+ if (list && list.length > 0) {
184
+ ids.push(list.shift());
185
+ } else {
186
+ ids.push(nextRowId());
187
+ }
188
+ }
189
+ const removed = [];
190
+ for (const list of buckets.values()) {
191
+ removed.push(...list);
192
+ }
193
+ return { ids, removed };
194
+ };
195
+ var buildIndexById = (ids) => {
196
+ const map = /* @__PURE__ */ new Map();
197
+ for (let i = 0; i < ids.length; i++) {
198
+ map.set(ids[i], i);
199
+ }
200
+ return map;
201
+ };
202
+ var RowIdStore = class {
203
+ constructor(instanceId) {
204
+ this.instanceId = instanceId;
205
+ this.lists = /* @__PURE__ */ new Map();
206
+ this.removalListeners = /* @__PURE__ */ new Map();
207
+ this.rowIdIndex = /* @__PURE__ */ new Map();
208
+ this.nextRowSeq = 0;
209
+ this.listKey = (listPath, parentRowId) => parentRowId ? `${listPath}@@${parentRowId}` : listPath;
210
+ this.makeRowId = () => {
211
+ this.nextRowSeq += 1;
212
+ return this.instanceId ? `${this.instanceId}::r${this.nextRowSeq}` : `r${this.nextRowSeq}`;
213
+ };
214
+ }
215
+ notifyRemoved(listPath, rowId) {
216
+ const listeners = this.removalListeners.get(listPath);
217
+ if (!listeners || listeners.size === 0) return;
218
+ for (const fn of listeners) {
219
+ try {
220
+ fn(rowId);
221
+ } catch {
222
+ }
223
+ }
224
+ }
225
+ removeDescendants(parentRowId) {
226
+ const keys = [];
227
+ for (const [k, st] of this.lists.entries()) {
228
+ if (st.parentRowId === parentRowId) keys.push(k);
229
+ }
230
+ for (const key of keys) {
231
+ const st = this.lists.get(key);
232
+ if (!st) continue;
233
+ this.lists.delete(key);
234
+ for (let i = 0; i < st.ids.length; i++) {
235
+ const rowId = st.ids[i];
236
+ this.rowIdIndex.delete(rowId);
237
+ this.notifyRemoved(st.listPath, rowId);
238
+ this.removeDescendants(rowId);
239
+ }
240
+ }
241
+ }
242
+ onRemoved(listPath, listener) {
243
+ const set = this.removalListeners.get(listPath) ?? /* @__PURE__ */ new Set();
244
+ set.add(listener);
245
+ this.removalListeners.set(listPath, set);
246
+ return () => {
247
+ const current = this.removalListeners.get(listPath);
248
+ if (!current) return;
249
+ current.delete(listener);
250
+ if (current.size === 0) this.removalListeners.delete(listPath);
251
+ };
252
+ }
253
+ getRowId(listPath, index, parentRowId) {
254
+ const state = this.lists.get(this.listKey(listPath, parentRowId));
255
+ return state ? state.ids[index] : void 0;
256
+ }
257
+ getIndex(listPath, rowId) {
258
+ const info = this.rowIdIndex.get(rowId);
259
+ if (!info) return void 0;
260
+ if (info.listPath !== listPath) return void 0;
261
+ return info.index;
262
+ }
263
+ /**
264
+ * ensureList:
265
+ * - 让指定 listPath 的 RowID 映射与当前 items 对齐;
266
+ * - 返回最新的 ids(index -> RowId)。
267
+ */
268
+ ensureList(listPath, items, trackBy, parentRowId) {
269
+ const key = this.listKey(listPath, parentRowId);
270
+ const prev = this.lists.get(key);
271
+ const { ids, removed } = reconcileIds(prev, items, trackBy ?? prev?.trackBy, this.makeRowId);
272
+ const next = {
273
+ listPath,
274
+ parentRowId,
275
+ itemsRef: items,
276
+ ids,
277
+ indexById: buildIndexById(ids),
278
+ trackBy: trackBy ?? prev?.trackBy
279
+ };
280
+ this.lists.set(key, next);
281
+ if (removed.length > 0) {
282
+ for (const rowId of removed) {
283
+ this.rowIdIndex.delete(rowId);
284
+ this.notifyRemoved(listPath, rowId);
285
+ this.removeDescendants(rowId);
286
+ }
287
+ }
288
+ for (let i = 0; i < ids.length; i++) {
289
+ const rowId = ids[i];
290
+ this.rowIdIndex.set(rowId, { key, listPath, index: i });
291
+ }
292
+ return ids;
293
+ }
294
+ /**
295
+ * updateAll:
296
+ * - 在每次提交后对齐所有已知 list 的 RowID 映射;
297
+ * - configs 来自 StateTraitProgram.spec 中的 list 声明(可携带 trackBy)。
298
+ */
299
+ updateAll(state, configs) {
300
+ const cfgByPath = /* @__PURE__ */ new Map();
301
+ const paths = [];
302
+ for (const cfg of configs) {
303
+ if (!cfg || typeof cfg.path !== "string") continue;
304
+ const p = cfg.path.trim();
305
+ if (!p) continue;
306
+ cfgByPath.set(p, cfg);
307
+ paths.push(p);
308
+ }
309
+ const pathSet = new Set(paths);
310
+ const parentOf = (path) => {
311
+ const segments = path.split(".").filter(Boolean);
312
+ let best;
313
+ for (let i = 1; i < segments.length; i++) {
314
+ const prefix = segments.slice(0, i).join(".");
315
+ if (pathSet.has(prefix)) best = prefix;
316
+ }
317
+ return best;
318
+ };
319
+ const parentByPath = /* @__PURE__ */ new Map();
320
+ const suffixByPath = /* @__PURE__ */ new Map();
321
+ const childrenByParent = /* @__PURE__ */ new Map();
322
+ for (const path of paths) {
323
+ const parent = parentOf(path);
324
+ parentByPath.set(path, parent);
325
+ const suffix = parent ? path.slice(parent.length + 1) : path;
326
+ suffixByPath.set(path, suffix);
327
+ const list = childrenByParent.get(parent) ?? [];
328
+ list.push(path);
329
+ childrenByParent.set(parent, list);
330
+ }
331
+ const roots = (childrenByParent.get(void 0) ?? []).slice().sort((a, b) => a.localeCompare(b));
332
+ const visit = (listPath, parentRowId, listValue) => {
333
+ const cfg = cfgByPath.get(listPath);
334
+ const items = Array.isArray(listValue) ? listValue : [];
335
+ const ids = this.ensureList(listPath, items, cfg?.trackBy, parentRowId);
336
+ const children = (childrenByParent.get(listPath) ?? []).slice().sort((a, b) => a.localeCompare(b));
337
+ if (children.length === 0) return;
338
+ for (let i = 0; i < items.length; i++) {
339
+ const row = items[i];
340
+ const rowId = ids[i];
341
+ if (!rowId) continue;
342
+ for (const childPath of children) {
343
+ const suffix = suffixByPath.get(childPath) ?? "";
344
+ const childValue = suffix ? getAtPath(row, suffix) : void 0;
345
+ visit(childPath, rowId, childValue);
346
+ }
347
+ }
348
+ };
349
+ for (const root of roots) {
350
+ const value = getAtPath(state, root);
351
+ visit(root, void 0, value);
352
+ }
353
+ }
354
+ };
355
+ var collectListConfigs = (spec) => {
356
+ const configs = [];
357
+ for (const key in spec) {
358
+ if (!Object.prototype.hasOwnProperty.call(spec, key)) continue;
359
+ const raw = spec[key];
360
+ if (!raw || typeof raw !== "object") continue;
361
+ const tag = raw._tag;
362
+ if (tag !== "StateTraitList") continue;
363
+ const trackBy = raw.identityHint?.trackBy;
364
+ configs.push({
365
+ path: key,
366
+ trackBy: typeof trackBy === "string" ? trackBy : void 0
367
+ });
368
+ }
369
+ return configs;
370
+ };
371
+
372
+ // ../logix-core/src/internal/runtime/core/ReplayLog.ts
373
+ import { Context, Effect, Layer } from "../effect.js";
374
+ var ReplayLog = class extends Context.Tag("@logix/core/ReplayLog")() {
375
+ };
376
+ var snapshot = Effect.gen(function* () {
377
+ const log = yield* ReplayLog;
378
+ return yield* log.snapshot;
379
+ });
380
+ var resetCursor = Effect.gen(
381
+ function* () {
382
+ const log = yield* ReplayLog;
383
+ yield* log.resetCursor;
384
+ }
385
+ );
386
+
387
+ export {
388
+ ReplayLog,
389
+ getAtPath,
390
+ setAtPathMutating,
391
+ unsetAtPathMutating,
392
+ parseListItemFieldPath,
393
+ toListItemValuePath,
394
+ RowIdStore,
395
+ collectListConfigs
396
+ };
397
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvcm93aWQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlcGxheUxvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgUm93SWQgPSBzdHJpbmdcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0Q29uZmlnIHtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IHRyYWNrQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgTGlzdFJlbW92YWxMaXN0ZW5lciA9IChyb3dJZDogUm93SWQpID0+IHZvaWRcblxudHlwZSBTZWdtZW50ID0gc3RyaW5nIHwgbnVtYmVyXG5cbmNvbnN0IHBhcnNlU2VnbWVudHMgPSAocGF0aDogc3RyaW5nKTogUmVhZG9ubHlBcnJheTxTZWdtZW50PiA9PiB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFtdXG4gIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5tYXAoKHNlZykgPT5cbiAgICAvXlswLTldKyQvLnRlc3Qoc2VnKSA/IE51bWJlcihzZWcpIDogc2VnLFxuICApXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdFBhdGggPSAoc3RhdGU6IGFueSwgcGF0aDogc3RyaW5nKTogYW55ID0+IHtcbiAgaWYgKCFwYXRoIHx8IHN0YXRlID09IG51bGwpIHJldHVybiBzdGF0ZVxuICBjb25zdCBzZWdtZW50cyA9IHBhcnNlU2VnbWVudHMocGF0aClcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IHN0YXRlXG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ21lbnRzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmICh0eXBlb2Ygc2VnID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjdXJyZW50ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IGN1cnJlbnRbc2VnXSA6IGN1cnJlbnRbU3RyaW5nKHNlZyldXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtzZWddXG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRcbn1cblxuZXhwb3J0IGNvbnN0IHNldEF0UGF0aE11dGF0aW5nID0gKGRyYWZ0OiBhbnksIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgPT4ge1xuICBpZiAoIXBhdGgpIHJldHVyblxuICBjb25zdCBzZWdtZW50cyA9IHBhcnNlU2VnbWVudHMocGF0aClcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgbGV0IGN1cnJlbnQ6IGFueSA9IGRyYWZ0XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc2VnbWVudHNbaV0hXG4gICAgY29uc3QgbmV4dEtleSA9IHNlZ21lbnRzW2kgKyAxXSFcblxuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50Py5ba2V5IGFzIGFueV1cbiAgICBpZiAobmV4dCA9PSBudWxsIHx8IHR5cGVvZiBuZXh0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjdXJyZW50W2tleSBhcyBhbnldID0gdHlwZW9mIG5leHRLZXkgPT09IFwibnVtYmVyXCIgPyBbXSA6IHt9XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleSBhcyBhbnldXG4gIH1cblxuICBjb25zdCBsYXN0ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0hXG4gIGN1cnJlbnRbbGFzdCBhcyBhbnldID0gdmFsdWVcbn1cblxuZXhwb3J0IGNvbnN0IHVuc2V0QXRQYXRoTXV0YXRpbmcgPSAoZHJhZnQ6IGFueSwgcGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGlmICghcGF0aCkgcmV0dXJuXG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyc2VTZWdtZW50cyhwYXRoKVxuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBsZXQgY3VycmVudDogYW55ID0gZHJhZnRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXSFcbiAgICBjb25zdCBuZXh0ID0gY3VycmVudD8uW2tleSBhcyBhbnldXG4gICAgaWYgKG5leHQgPT0gbnVsbCB8fCB0eXBlb2YgbmV4dCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGN1cnJlbnQgPSBuZXh0XG4gIH1cblxuICBjb25zdCBsYXN0ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0hXG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIHR5cGVvZiBsYXN0ID09PSBcIm51bWJlclwiKSB7XG4gICAgY3VycmVudFtsYXN0XSA9IHVuZGVmaW5lZFxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICBkZWxldGUgY3VycmVudFtsYXN0IGFzIGFueV1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgam9pblBhdGggPSAocHJlZml4OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwcmVmaXgpIHJldHVybiBzdWZmaXhcbiAgaWYgKCFzdWZmaXgpIHJldHVybiBwcmVmaXhcbiAgcmV0dXJuIGAke3ByZWZpeH0uJHtzdWZmaXh9YFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtRmllbGRQYXRoIHtcbiAgcmVhZG9ubHkgbGlzdFBhdGg6IHN0cmluZ1xuICByZWFkb25seSBpdGVtUGF0aDogc3RyaW5nXG59XG5cbi8qKlxuICogcGFyc2VMaXN0SXRlbUZpZWxkUGF0aFx1RkYxQVxuICogLSBcdThCQzZcdTUyMkJcdTVGNjJcdTU5ODIgXCJpdGVtc1tdLnByb2ZpbGVSZXNvdXJjZVwiIFx1NzY4NCBsaXN0Lml0ZW0gXHU1QjU3XHU2QkI1XHU4REVGXHU1Rjg0XHVGRjFCXG4gKiAtIFx1NjUyRlx1NjMwMVx1NTkxQVx1NUM0Mlx1NUQ0Q1x1NTk1N1x1NjU3MFx1N0VDNFx1RkYxQVx1OEZENFx1NTZERVx1MjAxQ1x1NjcwMFx1NTE4NVx1NUM0MiBsaXN0XHUyMDFEXHU3Njg0IGxpc3RQYXRoIFx1NEUwRVx1NTE3NiBpdGVtUGF0aFx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VMaXN0SXRlbUZpZWxkUGF0aCA9IChmaWVsZFBhdGg6IHN0cmluZyk6IExpc3RJdGVtRmllbGRQYXRoIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3ID0gdHlwZW9mIGZpZWxkUGF0aCA9PT0gXCJzdHJpbmdcIiA/IGZpZWxkUGF0aC50cmltKCkgOiBcIlwiXG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2VnbWVudHMgPSByYXcuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKVxuICBsZXQgbGFzdExpc3RTZWcgPSAtMVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHNlZ21lbnRzW2ldIS5lbmRzV2l0aChcIltdXCIpKSBsYXN0TGlzdFNlZyA9IGlcbiAgfVxuICBpZiAobGFzdExpc3RTZWcgPCAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc3RyaXAgPSAoc2VnOiBzdHJpbmcpOiBzdHJpbmcgPT4gKHNlZy5lbmRzV2l0aChcIltdXCIpID8gc2VnLnNsaWNlKDAsIC0yKSA6IHNlZylcblxuICBjb25zdCBsaXN0UGF0aCA9IHNlZ21lbnRzXG4gICAgLnNsaWNlKDAsIGxhc3RMaXN0U2VnICsgMSlcbiAgICAubWFwKHN0cmlwKVxuICAgIC5qb2luKFwiLlwiKVxuXG4gIGNvbnN0IGl0ZW1QYXRoID0gc2VnbWVudHNcbiAgICAuc2xpY2UobGFzdExpc3RTZWcgKyAxKVxuICAgIC5tYXAoc3RyaXApXG4gICAgLmpvaW4oXCIuXCIpXG5cbiAgcmV0dXJuIHsgbGlzdFBhdGgsIGl0ZW1QYXRoIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRvTGlzdEl0ZW1WYWx1ZVBhdGggPSAoXG4gIGxpc3RQYXRoOiBzdHJpbmcsXG4gIGluZGV4OiBudW1iZXIsXG4gIGl0ZW1QYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgPT5cbiAgaXRlbVBhdGggPyBgJHtsaXN0UGF0aH0uJHtpbmRleH0uJHtpdGVtUGF0aH1gIDogYCR7bGlzdFBhdGh9LiR7aW5kZXh9YFxuXG50eXBlIExpc3RTdGF0ZSA9IHtcbiAgcmVhZG9ubHkgbGlzdFBhdGg6IHN0cmluZ1xuICByZWFkb25seSBwYXJlbnRSb3dJZD86IFJvd0lkXG4gIHJlYWRvbmx5IGl0ZW1zUmVmOiBSZWFkb25seUFycmF5PHVua25vd24+XG4gIHJlYWRvbmx5IGlkczogUmVhZG9ubHlBcnJheTxSb3dJZD5cbiAgcmVhZG9ubHkgaW5kZXhCeUlkOiBSZWFkb25seU1hcDxSb3dJZCwgbnVtYmVyPlxuICByZWFkb25seSB0cmFja0J5Pzogc3RyaW5nXG59XG5cbmNvbnN0IHJlYWRUcmFja0J5ID0gKGl0ZW06IHVua25vd24sIHRyYWNrQnk6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2VnbWVudHMgPSB0cmFja0J5LnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudDogYW55ID0gaXRlbVxuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdtZW50cykge1xuICAgIGlmIChjdXJyZW50ID09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICBjdXJyZW50ID0gY3VycmVudFtzZWcgYXMgYW55XVxuICB9XG4gIHJldHVybiBjdXJyZW50XG59XG5cbmNvbnN0IGRpZFJlb3JkZXJCeVJlZmVyZW5jZSA9IChcbiAgcHJldkl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICBuZXh0SXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8dW5rbm93biwgQXJyYXk8bnVtYmVyPj4oKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSBwcmV2SXRlbXNbaV1cbiAgICBjb25zdCBsaXN0ID0gYnVja2V0cy5nZXQoaXRlbSkgPz8gW11cbiAgICBsaXN0LnB1c2goaSlcbiAgICBidWNrZXRzLnNldChpdGVtLCBsaXN0KVxuICB9XG5cbiAgZm9yIChsZXQgbmV4dEluZGV4ID0gMDsgbmV4dEluZGV4IDwgbmV4dEl0ZW1zLmxlbmd0aDsgbmV4dEluZGV4KyspIHtcbiAgICBjb25zdCBpdGVtID0gbmV4dEl0ZW1zW25leHRJbmRleF1cbiAgICBjb25zdCBxID0gYnVja2V0cy5nZXQoaXRlbSlcbiAgICBpZiAoIXEgfHwgcS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgY29uc3QgcHJldkluZGV4ID0gcS5zaGlmdCgpIVxuICAgIGlmIChwcmV2SW5kZXggIT09IG5leHRJbmRleCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgaGFzU3RhYmxlVHJhY2tCeUtleXMgPSAoXG4gIGl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICB0cmFja0J5OiBzdHJpbmcsXG4pOiBib29sZWFuID0+IGl0ZW1zLmV2ZXJ5KChpdGVtKSA9PiByZWFkVHJhY2tCeShpdGVtLCB0cmFja0J5KSAhPT0gdW5kZWZpbmVkKVxuXG5jb25zdCBpc1NhbWVUcmFja0J5U2VxdWVuY2UgPSAoXG4gIHByZXZJdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPixcbiAgbmV4dEl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICB0cmFja0J5OiBzdHJpbmcsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKHByZXZJdGVtcy5sZW5ndGggIT09IG5leHRJdGVtcy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChcbiAgICAgICFPYmplY3QuaXMoXG4gICAgICAgIHJlYWRUcmFja0J5KHByZXZJdGVtc1tpXSwgdHJhY2tCeSksXG4gICAgICAgIHJlYWRUcmFja0J5KG5leHRJdGVtc1tpXSwgdHJhY2tCeSksXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgcmVjb25jaWxlSWRzID0gKFxuICBwcmV2OiBMaXN0U3RhdGUgfCB1bmRlZmluZWQsXG4gIG5leHRJdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPixcbiAgdHJhY2tCeT86IHN0cmluZyxcbiAgbWFrZVJvd0lkPzogKCkgPT4gUm93SWQsXG4pOiB7IHJlYWRvbmx5IGlkczogUmVhZG9ubHlBcnJheTxSb3dJZD47IHJlYWRvbmx5IHJlbW92ZWQ6IFJlYWRvbmx5QXJyYXk8Um93SWQ+IH0gPT4ge1xuICBjb25zdCBuZXh0Um93SWQgPVxuICAgIG1ha2VSb3dJZCA/P1xuICAgICgoKSA9PiB7XG4gICAgICBsZXQgcm93U2VxID0gMFxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcm93U2VxICs9IDFcbiAgICAgICAgcmV0dXJuIGByJHtyb3dTZXF9YFxuICAgICAgfVxuICAgIH0pKClcblxuICBpZiAoIXByZXYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWRzOiBuZXh0SXRlbXMubWFwKCgpID0+IG5leHRSb3dJZCgpKSxcbiAgICAgIHJlbW92ZWQ6IFtdLFxuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2Lml0ZW1zUmVmID09PSBuZXh0SXRlbXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWRzOiBwcmV2LmlkcyxcbiAgICAgIHJlbW92ZWQ6IFtdLFxuICAgIH1cbiAgfVxuXG4gIC8vIFx1OTFDRFx1ODk4MVx1RkYxQVx1NEZERFx1NjMwMSBSb3dJZCBcdTU3MjhcdTIwMUNcdTk3NUVcdTdFRDNcdTY3ODRcdTUzRDhcdTY2RjRcdTIwMURcdUZGMDhcdTRFQzVcdTVCNTdcdTZCQjVcdTY2RjRcdTY1QjAvXHU1QkY5XHU4QzYxXHU1MTRCXHU5Njg2XHVGRjA5XHU0RTBCXHU3Njg0XHU3QTMzXHU1QjlBXHU2MDI3XHVGRjBDXG4gIC8vIFx1NTQyNlx1NTIxOSBpbi1mbGlnaHQgLyBcdTdGMTNcdTVCNTggXHU0RjFBXHU4OEFCXHU2NUUwXHU2MTBGXHU0RTQ5XHU1NzMwXHU1OTMxXHU2NTQ4XHUzMDAyXG4gIGNvbnN0IHNhbWVMZW5ndGggPSBwcmV2Lml0ZW1zUmVmLmxlbmd0aCA9PT0gbmV4dEl0ZW1zLmxlbmd0aFxuICBpZiAoc2FtZUxlbmd0aCkge1xuICAgIC8vIHRyYWNrQnkgXHU1NzNBXHU2NjZGXHVGRjFBXHU4MkU1IGtleSBcdTVFOEZcdTUyMTdcdTRFMDBcdTgxRjRcdUZGMENcdTUyMTlcdTUzRUZcdTc2RjRcdTYzQTVcdTU5MERcdTc1MjhcdTY1RTcgaWRzXHVGRjFCXG4gICAgLy8gXHU1NDI2XHU1MjE5XHU1RkM1XHU5ODdCXHU4RDcwIGtleS1iYXNlZCByZWNvbmNpbGVcdUZGMDhcdTkwN0ZcdTUxNEQgY2xvbmUgKyByZW9yZGVyIFx1NjVGNlx1OEJFRlx1NTIyNFx1NEUzQVx1MjAxQ1x1NjcyQVx1OTFDRFx1NjM5Mlx1MjAxRFx1RkYwOVx1MzAwMlxuICAgIGlmICh0cmFja0J5KSB7XG4gICAgICBjb25zdCBjYW5Vc2VLZXlzID1cbiAgICAgICAgaGFzU3RhYmxlVHJhY2tCeUtleXMocHJldi5pdGVtc1JlZiwgdHJhY2tCeSkgJiZcbiAgICAgICAgaGFzU3RhYmxlVHJhY2tCeUtleXMobmV4dEl0ZW1zLCB0cmFja0J5KVxuICAgICAgaWYgKGNhblVzZUtleXMpIHtcbiAgICAgICAgaWYgKGlzU2FtZVRyYWNrQnlTZXF1ZW5jZShwcmV2Lml0ZW1zUmVmLCBuZXh0SXRlbXMsIHRyYWNrQnkpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkczogcHJldi5pZHMsXG4gICAgICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRyYWNrQnkga2V5IFx1NEUwRFx1NTNFRlx1NzUyOFx1NjVGNlx1OTAwMFx1NTZERVx1NTIzMFx1NUYxNVx1NzUyOFx1N0VBN1x1NEZBNlx1NkQ0Qlx1RkYwOFx1NUMzRFx1OTFDRlx1NEZERFx1NjMwMVx1MjAxQ1x1NTE0Qlx1OTY4Nlx1NEY0Nlx1NEUwRFx1OTFDRFx1NjM5Mlx1MjAxRFx1NzY4NFx1N0EzM1x1NUI5QVx1NjAyN1x1RkYwOVx1MzAwMlxuICAgICAgICBpZiAoIWRpZFJlb3JkZXJCeVJlZmVyZW5jZShwcmV2Lml0ZW1zUmVmLCBuZXh0SXRlbXMpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkczogcHJldi5pZHMsXG4gICAgICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFkaWRSZW9yZGVyQnlSZWZlcmVuY2UocHJldi5pdGVtc1JlZiwgbmV4dEl0ZW1zKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWRzOiBwcmV2LmlkcyxcbiAgICAgICAgcmVtb3ZlZDogW10sXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qga2V5T2YgPSAoaXRlbTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgIGlmICghdHJhY2tCeSkgcmV0dXJuIGl0ZW1cbiAgICBjb25zdCBrID0gcmVhZFRyYWNrQnkoaXRlbSwgdHJhY2tCeSlcbiAgICByZXR1cm4gayAhPT0gdW5kZWZpbmVkID8gayA6IGl0ZW1cbiAgfVxuXG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHVua25vd24sIEFycmF5PFJvd0lkPj4oKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYuaXRlbXNSZWYubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlPZihwcmV2Lml0ZW1zUmVmW2ldKVxuICAgIGNvbnN0IGxpc3QgPSBidWNrZXRzLmdldChrZXkpID8/IFtdXG4gICAgbGlzdC5wdXNoKHByZXYuaWRzW2ldISlcbiAgICBidWNrZXRzLnNldChrZXksIGxpc3QpXG4gIH1cblxuICBjb25zdCBpZHM6IEFycmF5PFJvd0lkPiA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV4dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5T2YobmV4dEl0ZW1zW2ldKVxuICAgIGNvbnN0IGxpc3QgPSBidWNrZXRzLmdldChrZXkpXG4gICAgaWYgKGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBpZHMucHVzaChsaXN0LnNoaWZ0KCkhKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZHMucHVzaChuZXh0Um93SWQoKSlcbiAgICB9XG4gIH1cblxuICBjb25zdCByZW1vdmVkOiBBcnJheTxSb3dJZD4gPSBbXVxuICBmb3IgKGNvbnN0IGxpc3Qgb2YgYnVja2V0cy52YWx1ZXMoKSkge1xuICAgIHJlbW92ZWQucHVzaCguLi5saXN0KVxuICB9XG5cbiAgcmV0dXJuIHsgaWRzLCByZW1vdmVkIH1cbn1cblxuY29uc3QgYnVpbGRJbmRleEJ5SWQgPSAoaWRzOiBSZWFkb25seUFycmF5PFJvd0lkPik6IFJlYWRvbmx5TWFwPFJvd0lkLCBudW1iZXI+ID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxSb3dJZCwgbnVtYmVyPigpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgbWFwLnNldChpZHNbaV0hLCBpKVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZXhwb3J0IGNsYXNzIFJvd0lkU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RzID0gbmV3IE1hcDxzdHJpbmcsIExpc3RTdGF0ZT4oKVxuICBwcml2YXRlIHJlYWRvbmx5IHJlbW92YWxMaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PExpc3RSZW1vdmFsTGlzdGVuZXI+PigpXG4gIHByaXZhdGUgcmVhZG9ubHkgcm93SWRJbmRleCA9IG5ldyBNYXA8Um93SWQsIHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IGxpc3RQYXRoOiBzdHJpbmc7IHJlYWRvbmx5IGluZGV4OiBudW1iZXIgfT4oKVxuICBwcml2YXRlIG5leHRSb3dTZXEgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBsaXN0S2V5ID0gKGxpc3RQYXRoOiBzdHJpbmcsIHBhcmVudFJvd0lkPzogUm93SWQpOiBzdHJpbmcgPT5cbiAgICBwYXJlbnRSb3dJZCA/IGAke2xpc3RQYXRofUBAJHtwYXJlbnRSb3dJZH1gIDogbGlzdFBhdGhcblxuICBwcml2YXRlIG1ha2VSb3dJZCA9ICgpOiBSb3dJZCA9PiB7XG4gICAgdGhpcy5uZXh0Um93U2VxICs9IDFcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUlkID8gYCR7dGhpcy5pbnN0YW5jZUlkfTo6ciR7dGhpcy5uZXh0Um93U2VxfWAgOiBgciR7dGhpcy5uZXh0Um93U2VxfWBcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5UmVtb3ZlZChsaXN0UGF0aDogc3RyaW5nLCByb3dJZDogUm93SWQpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuZ2V0KGxpc3RQYXRoKVxuICAgIGlmICghbGlzdGVuZXJzIHx8IGxpc3RlbmVycy5zaXplID09PSAwKSByZXR1cm5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIGxpc3RlbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4ocm93SWQpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbGlzdGVuZXIgZmFpbHVyZXMgc2hvdWxkIG5ldmVyIGJyZWFrIHJ1bnRpbWUgYmVoYXZpb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURlc2NlbmRhbnRzKHBhcmVudFJvd0lkOiBSb3dJZCk6IHZvaWQge1xuICAgIGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBbXVxuICAgIGZvciAoY29uc3QgW2ssIHN0XSBvZiB0aGlzLmxpc3RzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0LnBhcmVudFJvd0lkID09PSBwYXJlbnRSb3dJZCkga2V5cy5wdXNoKGspXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgc3QgPSB0aGlzLmxpc3RzLmdldChrZXkpXG4gICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgdGhpcy5saXN0cy5kZWxldGUoa2V5KVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdC5pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93SWQgPSBzdC5pZHNbaV0hXG4gICAgICAgIHRoaXMucm93SWRJbmRleC5kZWxldGUocm93SWQpXG4gICAgICAgIHRoaXMubm90aWZ5UmVtb3ZlZChzdC5saXN0UGF0aCwgcm93SWQpXG4gICAgICAgIHRoaXMucmVtb3ZlRGVzY2VuZGFudHMocm93SWQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVkKGxpc3RQYXRoOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0UmVtb3ZhbExpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gdGhpcy5yZW1vdmFsTGlzdGVuZXJzLmdldChsaXN0UGF0aCkgPz8gbmV3IFNldDxMaXN0UmVtb3ZhbExpc3RlbmVyPigpXG4gICAgc2V0LmFkZChsaXN0ZW5lcilcbiAgICB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuc2V0KGxpc3RQYXRoLCBzZXQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuZ2V0KGxpc3RQYXRoKVxuICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgIGN1cnJlbnQuZGVsZXRlKGxpc3RlbmVyKVxuICAgICAgaWYgKGN1cnJlbnQuc2l6ZSA9PT0gMCkgdGhpcy5yZW1vdmFsTGlzdGVuZXJzLmRlbGV0ZShsaXN0UGF0aClcbiAgICB9XG4gIH1cblxuICBnZXRSb3dJZChsaXN0UGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBwYXJlbnRSb3dJZD86IFJvd0lkKTogUm93SWQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5saXN0cy5nZXQodGhpcy5saXN0S2V5KGxpc3RQYXRoLCBwYXJlbnRSb3dJZCkpXG4gICAgcmV0dXJuIHN0YXRlID8gc3RhdGUuaWRzW2luZGV4XSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0SW5kZXgobGlzdFBhdGg6IHN0cmluZywgcm93SWQ6IFJvd0lkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5yb3dJZEluZGV4LmdldChyb3dJZClcbiAgICBpZiAoIWluZm8pIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoaW5mby5saXN0UGF0aCAhPT0gbGlzdFBhdGgpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gaW5mby5pbmRleFxuICB9XG5cbiAgLyoqXG4gICAqIGVuc3VyZUxpc3RcdUZGMUFcbiAgICogLSBcdThCQTlcdTYzMDdcdTVCOUEgbGlzdFBhdGggXHU3Njg0IFJvd0lEIFx1NjYyMFx1NUMwNFx1NEUwRVx1NUY1M1x1NTI0RCBpdGVtcyBcdTVCRjlcdTlGNTBcdUZGMUJcbiAgICogLSBcdThGRDRcdTU2REVcdTY3MDBcdTY1QjBcdTc2ODQgaWRzXHVGRjA4aW5kZXggLT4gUm93SWRcdUZGMDlcdTMwMDJcbiAgICovXG4gIGVuc3VyZUxpc3QoXG4gICAgbGlzdFBhdGg6IHN0cmluZyxcbiAgICBpdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPixcbiAgICB0cmFja0J5Pzogc3RyaW5nLFxuICAgIHBhcmVudFJvd0lkPzogUm93SWQsXG4gICk6IFJlYWRvbmx5QXJyYXk8Um93SWQ+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmxpc3RLZXkobGlzdFBhdGgsIHBhcmVudFJvd0lkKVxuICAgIGNvbnN0IHByZXYgPSB0aGlzLmxpc3RzLmdldChrZXkpXG4gICAgY29uc3QgeyBpZHMsIHJlbW92ZWQgfSA9IHJlY29uY2lsZUlkcyhwcmV2LCBpdGVtcywgdHJhY2tCeSA/PyBwcmV2Py50cmFja0J5LCB0aGlzLm1ha2VSb3dJZClcblxuICAgIGNvbnN0IG5leHQ6IExpc3RTdGF0ZSA9IHtcbiAgICAgIGxpc3RQYXRoLFxuICAgICAgcGFyZW50Um93SWQsXG4gICAgICBpdGVtc1JlZjogaXRlbXMsXG4gICAgICBpZHMsXG4gICAgICBpbmRleEJ5SWQ6IGJ1aWxkSW5kZXhCeUlkKGlkcyksXG4gICAgICB0cmFja0J5OiB0cmFja0J5ID8/IHByZXY/LnRyYWNrQnksXG4gICAgfVxuICAgIHRoaXMubGlzdHMuc2V0KGtleSwgbmV4dClcblxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgcm93SWQgb2YgcmVtb3ZlZCkge1xuICAgICAgICB0aGlzLnJvd0lkSW5kZXguZGVsZXRlKHJvd0lkKVxuICAgICAgICB0aGlzLm5vdGlmeVJlbW92ZWQobGlzdFBhdGgsIHJvd0lkKVxuICAgICAgICB0aGlzLnJlbW92ZURlc2NlbmRhbnRzKHJvd0lkKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1NTIzN1x1NjVCMCByb3dJZCBcdTIxOTIgaW5kZXggXHU3Njg0XHU1M0NEXHU1NDExXHU2NjIwXHU1QzA0XHVGRjA4XHU1MTQxXHU4QkI4IGluZGV4IFx1NTNEOFx1NTMxNlx1RkYwOVx1MzAwMlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dJZCA9IGlkc1tpXSFcbiAgICAgIHRoaXMucm93SWRJbmRleC5zZXQocm93SWQsIHsga2V5LCBsaXN0UGF0aCwgaW5kZXg6IGkgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzXG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlQWxsXHVGRjFBXG4gICAqIC0gXHU1NzI4XHU2QkNGXHU2QjIxXHU2M0QwXHU0RUE0XHU1NDBFXHU1QkY5XHU5RjUwXHU2MjQwXHU2NzA5XHU1REYyXHU3N0U1IGxpc3QgXHU3Njg0IFJvd0lEIFx1NjYyMFx1NUMwNFx1RkYxQlxuICAgKiAtIGNvbmZpZ3MgXHU2NzY1XHU4MUVBIFN0YXRlVHJhaXRQcm9ncmFtLnNwZWMgXHU0RTJEXHU3Njg0IGxpc3QgXHU1OEYwXHU2NjBFXHVGRjA4XHU1M0VGXHU2NDNBXHU1RTI2IHRyYWNrQnlcdUZGMDlcdTMwMDJcbiAgICovXG4gIHVwZGF0ZUFsbChzdGF0ZTogdW5rbm93biwgY29uZmlnczogUmVhZG9ubHlBcnJheTxMaXN0Q29uZmlnPik6IHZvaWQge1xuICAgIGNvbnN0IGNmZ0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0Q29uZmlnPigpXG4gICAgY29uc3QgcGF0aHM6IEFycmF5PHN0cmluZz4gPSBbXVxuICAgIGZvciAoY29uc3QgY2ZnIG9mIGNvbmZpZ3MpIHtcbiAgICAgIGlmICghY2ZnIHx8IHR5cGVvZiBjZmcucGF0aCAhPT0gXCJzdHJpbmdcIikgY29udGludWVcbiAgICAgIGNvbnN0IHAgPSBjZmcucGF0aC50cmltKClcbiAgICAgIGlmICghcCkgY29udGludWVcbiAgICAgIGNmZ0J5UGF0aC5zZXQocCwgY2ZnKVxuICAgICAgcGF0aHMucHVzaChwKVxuICAgIH1cblxuICAgIGNvbnN0IHBhdGhTZXQgPSBuZXcgU2V0KHBhdGhzKVxuXG4gICAgY29uc3QgcGFyZW50T2YgPSAocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pXG4gICAgICBsZXQgYmVzdDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIGkpLmpvaW4oXCIuXCIpXG4gICAgICAgIGlmIChwYXRoU2V0LmhhcyhwcmVmaXgpKSBiZXN0ID0gcHJlZml4XG4gICAgICB9XG4gICAgICByZXR1cm4gYmVzdFxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcbiAgICBjb25zdCBzdWZmaXhCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IG5ldyBNYXA8c3RyaW5nIHwgdW5kZWZpbmVkLCBBcnJheTxzdHJpbmc+PigpXG5cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudE9mKHBhdGgpXG4gICAgICBwYXJlbnRCeVBhdGguc2V0KHBhdGgsIHBhcmVudClcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IHBhcmVudCA/IHBhdGguc2xpY2UocGFyZW50Lmxlbmd0aCArIDEpIDogcGF0aFxuICAgICAgc3VmZml4QnlQYXRoLnNldChwYXRoLCBzdWZmaXgpXG4gICAgICBjb25zdCBsaXN0ID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50KSA/PyBbXVxuICAgICAgbGlzdC5wdXNoKHBhdGgpXG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnQsIGxpc3QpXG4gICAgfVxuXG4gICAgLy8gcm9vdHMgZmlyc3QgKGFuZCBkZXRlcm1pbmlzdGljIHRyYXZlcnNhbClcbiAgICBjb25zdCByb290cyA9IChjaGlsZHJlbkJ5UGFyZW50LmdldCh1bmRlZmluZWQpID8/IFtdKS5zbGljZSgpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICAgIGNvbnN0IHZpc2l0ID0gKGxpc3RQYXRoOiBzdHJpbmcsIHBhcmVudFJvd0lkOiBSb3dJZCB8IHVuZGVmaW5lZCwgbGlzdFZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBjZmdCeVBhdGguZ2V0KGxpc3RQYXRoKVxuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KGxpc3RWYWx1ZSkgPyAobGlzdFZhbHVlIGFzIFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pIDogW11cbiAgICAgIGNvbnN0IGlkcyA9IHRoaXMuZW5zdXJlTGlzdChsaXN0UGF0aCwgaXRlbXMsIGNmZz8udHJhY2tCeSwgcGFyZW50Um93SWQpXG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KGxpc3RQYXRoKSA/PyBbXSkuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3cgPSBpdGVtc1tpXVxuICAgICAgICBjb25zdCByb3dJZCA9IGlkc1tpXVxuICAgICAgICBpZiAoIXJvd0lkKSBjb250aW51ZVxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUGF0aCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IHN1ZmZpeEJ5UGF0aC5nZXQoY2hpbGRQYXRoKSA/PyBcIlwiXG4gICAgICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IHN1ZmZpeCA/IGdldEF0UGF0aChyb3cgYXMgYW55LCBzdWZmaXgpIDogdW5kZWZpbmVkXG4gICAgICAgICAgdmlzaXQoY2hpbGRQYXRoLCByb3dJZCwgY2hpbGRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiByb290cykge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdFBhdGgoc3RhdGUgYXMgYW55LCByb290KVxuICAgICAgdmlzaXQocm9vdCwgdW5kZWZpbmVkLCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RMaXN0Q29uZmlncyA9IChzcGVjOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlYWRvbmx5QXJyYXk8TGlzdENvbmZpZz4gPT4ge1xuICBjb25zdCBjb25maWdzOiBBcnJheTxMaXN0Q29uZmlnPiA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIHNwZWMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBrZXkpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhdyA9IHNwZWNba2V5XVxuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgY29uc3QgdGFnID0gKHJhdyBhcyBhbnkpLl90YWdcbiAgICBpZiAodGFnICE9PSBcIlN0YXRlVHJhaXRMaXN0XCIpIGNvbnRpbnVlXG4gICAgY29uc3QgdHJhY2tCeSA9IChyYXcgYXMgYW55KS5pZGVudGl0eUhpbnQ/LnRyYWNrQnlcbiAgICBjb25maWdzLnB1c2goe1xuICAgICAgcGF0aDoga2V5LFxuICAgICAgdHJhY2tCeTogdHlwZW9mIHRyYWNrQnkgPT09IFwic3RyaW5nXCIgPyB0cmFja0J5IDogdW5kZWZpbmVkLFxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3Ncbn1cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIExheWVyIH0gZnJvbSBcImVmZmVjdFwiXG5cbmV4cG9ydCB0eXBlIFJlc291cmNlU25hcHNob3RQaGFzZSA9IFwiaWRsZVwiIHwgXCJsb2FkaW5nXCIgfCBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIlxuXG5leHBvcnQgdHlwZSBSZXBsYXlMb2dFdmVudCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCJcbiAgICAgIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGtleUhhc2g/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBc291cmNlIFx1NzY4NFx1NUU3Nlx1NTNEMVx1N0I1Nlx1NzU2NVx1RkYwOFx1NEY4Qlx1NTk4MiBcInN3aXRjaFwiIC8gXCJleGhhdXN0LXRyYWlsaW5nXCJcdUZGMDlcdTMwMDJcbiAgICAgICAqIC0gXHU1RkM1XHU5ODdCXHU0RkREXHU2MzAxIFNsaW0gJiBcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMUJcbiAgICAgICAqIC0gXHU3NTI4XHU0RThFIERldnRvb2xzL1x1NTZERVx1NjUzRVx1ODlFM1x1OTFDQVx1MjAxQ1x1NEUzQVx1NEY1NVx1NjVFN1x1N0VEM1x1Njc5Q1x1ODhBQlx1NEUyMlx1NUYwMy9cdTRFM0FcdTRGNTUgdHJhaWxpbmcgXHU1M0QxXHU3NTFGXHUyMDFEXHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IGNvbmN1cnJlbmN5Pzogc3RyaW5nXG4gICAgICByZWFkb25seSBwaGFzZTogUmVzb3VyY2VTbmFwc2hvdFBoYXNlXG4gICAgICByZWFkb25seSBzbmFwc2hvdDogdW5rbm93blxuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IF90YWc6IFwiSW52YWxpZGF0ZVJlcXVlc3RcIlxuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBraW5kOiBcInJlc291cmNlXCIgfCBcInF1ZXJ5XCJcbiAgICAgIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nXG4gICAgICByZWFkb25seSBtZXRhPzogdW5rbm93blxuICAgIH1cblxuZXhwb3J0IHR5cGUgUmVzb3VyY2VTbmFwc2hvdEV2ZW50ID0gRXh0cmFjdDxSZXBsYXlMb2dFdmVudCwgeyByZWFkb25seSBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIiB9PlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxheUxvZ1NlcnZpY2Uge1xuICByZWFkb25seSByZWNvcmQ6IChldmVudDogUmVwbGF5TG9nRXZlbnQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbiAgcmVhZG9ubHkgc25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8UmVhZG9ubHlBcnJheTxSZXBsYXlMb2dFdmVudD4+XG4gIHJlYWRvbmx5IHJlc2V0Q3Vyc29yOiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIHJlYWRvbmx5IGNvbnN1bWVOZXh0OiAoXG4gICAgcHJlZGljYXRlOiAoZXZlbnQ6IFJlcGxheUxvZ0V2ZW50KSA9PiBib29sZWFuLFxuICApID0+IEVmZmVjdC5FZmZlY3Q8UmVwbGF5TG9nRXZlbnQgfCB1bmRlZmluZWQ+XG4gIHJlYWRvbmx5IGNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdDogKHBhcmFtczoge1xuICAgIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogc3RyaW5nXG4gICAgcmVhZG9ubHkga2V5SGFzaD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IHBoYXNlPzogUmVzb3VyY2VTbmFwc2hvdFBoYXNlXG4gIH0pID0+IEVmZmVjdC5FZmZlY3Q8UmVzb3VyY2VTbmFwc2hvdEV2ZW50IHwgdW5kZWZpbmVkPlxufVxuXG5leHBvcnQgY2xhc3MgUmVwbGF5TG9nIGV4dGVuZHMgQ29udGV4dC5UYWcoXCJAbG9naXgvY29yZS9SZXBsYXlMb2dcIik8XG4gIFJlcGxheUxvZyxcbiAgUmVwbGF5TG9nU2VydmljZVxuPigpIHt9XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gKFxuICBpbml0aWFsPzogUmVhZG9ubHlBcnJheTxSZXBsYXlMb2dFdmVudD4sXG4pOiBSZXBsYXlMb2dTZXJ2aWNlID0+IHtcbiAgY29uc3QgZXZlbnRzOiBBcnJheTxSZXBsYXlMb2dFdmVudD4gPSBpbml0aWFsID8gQXJyYXkuZnJvbShpbml0aWFsKSA6IFtdXG4gIGxldCBjdXJzb3IgPSAwXG5cbiAgY29uc3QgY29uc3VtZU5leHQgPSAoXG4gICAgcHJlZGljYXRlOiAoZXZlbnQ6IFJlcGxheUxvZ0V2ZW50KSA9PiBib29sZWFuLFxuICApOiBFZmZlY3QuRWZmZWN0PFJlcGxheUxvZ0V2ZW50IHwgdW5kZWZpbmVkPiA9PlxuICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSBjdXJzb3I7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaV1cbiAgICAgICAgaWYgKCFwcmVkaWNhdGUoZXZlbnQpKSBjb250aW51ZVxuICAgICAgICBjdXJzb3IgPSBpICsgMVxuICAgICAgICByZXR1cm4gZXZlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9KVxuXG4gIGNvbnN0IGNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCA9IChwYXJhbXM6IHtcbiAgICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmdcbiAgICByZWFkb25seSBmaWVsZFBhdGg6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGtleUhhc2g/OiBzdHJpbmdcbiAgICByZWFkb25seSBwaGFzZT86IFJlc291cmNlU25hcHNob3RQaGFzZVxuICB9KTogRWZmZWN0LkVmZmVjdDxSZXNvdXJjZVNuYXBzaG90RXZlbnQgfCB1bmRlZmluZWQ+ID0+XG4gICAgY29uc3VtZU5leHQoKGV2ZW50KTogZXZlbnQgaXMgUmVzb3VyY2VTbmFwc2hvdEV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5fdGFnICE9PSBcIlJlc291cmNlU25hcHNob3RcIikgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAoZXZlbnQucmVzb3VyY2VJZCAhPT0gcGFyYW1zLnJlc291cmNlSWQpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKGV2ZW50LmZpZWxkUGF0aCAhPT0gcGFyYW1zLmZpZWxkUGF0aCkgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAocGFyYW1zLmtleUhhc2ggIT09IHVuZGVmaW5lZCAmJiBldmVudC5rZXlIYXNoICE9PSBwYXJhbXMua2V5SGFzaCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMucGhhc2UgIT09IHVuZGVmaW5lZCAmJiBldmVudC5waGFzZSAhPT0gcGFyYW1zLnBoYXNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9KS5waXBlKEVmZmVjdC5tYXAoKGV2ZW50KSA9PiBldmVudCBhcyBSZXNvdXJjZVNuYXBzaG90RXZlbnQgfCB1bmRlZmluZWQpKVxuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkOiAoZXZlbnQpID0+IEVmZmVjdC5zeW5jKCgpID0+IGV2ZW50cy5wdXNoKGV2ZW50KSksXG4gICAgc25hcHNob3Q6IEVmZmVjdC5zeW5jKCgpID0+IGV2ZW50cy5zbGljZSgpKSxcbiAgICByZXNldEN1cnNvcjogRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgY3Vyc29yID0gMFxuICAgIH0pLFxuICAgIGNvbnN1bWVOZXh0LFxuICAgIGNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbGF5ZXIgPSAoXG4gIGluaXRpYWw/OiBSZWFkb25seUFycmF5PFJlcGxheUxvZ0V2ZW50Pixcbik6IExheWVyLkxheWVyPFJlcGxheUxvZywgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKFJlcGxheUxvZywgbWFrZShpbml0aWFsKSlcblxuZXhwb3J0IGNvbnN0IHJlY29yZCA9IChcbiAgZXZlbnQ6IFJlcGxheUxvZ0V2ZW50LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgUmVwbGF5TG9nPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgbG9nID0geWllbGQqIFJlcGxheUxvZ1xuICAgIHlpZWxkKiBsb2cucmVjb3JkKGV2ZW50KVxuICB9KVxuXG5leHBvcnQgY29uc3Qgc25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8XG4gIFJlYWRvbmx5QXJyYXk8UmVwbGF5TG9nRXZlbnQ+LFxuICBuZXZlcixcbiAgUmVwbGF5TG9nXG4+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICBjb25zdCBsb2cgPSB5aWVsZCogUmVwbGF5TG9nXG4gIHJldHVybiB5aWVsZCogbG9nLnNuYXBzaG90XG59KVxuXG5leHBvcnQgY29uc3QgcmVzZXRDdXJzb3I6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFJlcGxheUxvZz4gPSBFZmZlY3QuZ2VuKFxuICBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGxvZyA9IHlpZWxkKiBSZXBsYXlMb2dcbiAgICB5aWVsZCogbG9nLnJlc2V0Q3Vyc29yXG4gIH0sXG4pXG5cbmV4cG9ydCBjb25zdCBjb25zdW1lTmV4dFJlc291cmNlU25hcHNob3QgPSAocGFyYW1zOiB7XG4gIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSBmaWVsZFBhdGg6IHN0cmluZ1xuICByZWFkb25seSBrZXlIYXNoPzogc3RyaW5nXG4gIHJlYWRvbmx5IHBoYXNlPzogUmVzb3VyY2VTbmFwc2hvdFBoYXNlXG59KTogRWZmZWN0LkVmZmVjdDxSZXNvdXJjZVNuYXBzaG90RXZlbnQgfCB1bmRlZmluZWQsIG5ldmVyLCBSZXBsYXlMb2c+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBsb2cgPSB5aWVsZCogUmVwbGF5TG9nXG4gICAgcmV0dXJuIHlpZWxkKiBsb2cuY29uc3VtZU5leHRSZXNvdXJjZVNuYXBzaG90KHBhcmFtcylcbiAgfSlcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFXQSxJQUFNLGdCQUFnQixDQUFDLFNBQXlDO0FBQzlELE1BQUksQ0FBQyxLQUFNLFFBQU8sQ0FBQztBQUNuQixTQUFPLEtBQUssTUFBTSxHQUFHLEVBQUU7QUFBQSxJQUFJLENBQUMsUUFDMUIsV0FBVyxLQUFLLEdBQUcsSUFBSSxPQUFPLEdBQUcsSUFBSTtBQUFBLEVBQ3ZDO0FBQ0Y7QUFFTyxJQUFNLFlBQVksQ0FBQyxPQUFZLFNBQXNCO0FBQzFELE1BQUksQ0FBQyxRQUFRLFNBQVMsS0FBTSxRQUFPO0FBQ25DLFFBQU0sV0FBVyxjQUFjLElBQUk7QUFDbkMsTUFBSSxVQUFlO0FBQ25CLGFBQVcsT0FBTyxVQUFVO0FBQzFCLFFBQUksV0FBVyxLQUFNLFFBQU87QUFDNUIsUUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixnQkFBVSxNQUFNLFFBQVEsT0FBTyxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDckU7QUFBQSxJQUNGO0FBQ0EsY0FBVSxRQUFRLEdBQUc7QUFBQSxFQUN2QjtBQUNBLFNBQU87QUFDVDtBQUVPLElBQU0sb0JBQW9CLENBQUMsT0FBWSxNQUFjLFVBQXFCO0FBQy9FLE1BQUksQ0FBQyxLQUFNO0FBQ1gsUUFBTSxXQUFXLGNBQWMsSUFBSTtBQUNuQyxNQUFJLFNBQVMsV0FBVyxFQUFHO0FBRTNCLE1BQUksVUFBZTtBQUNuQixXQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsU0FBUyxHQUFHLEtBQUs7QUFDNUMsVUFBTSxNQUFNLFNBQVMsQ0FBQztBQUN0QixVQUFNLFVBQVUsU0FBUyxJQUFJLENBQUM7QUFFOUIsVUFBTSxPQUFPLFVBQVUsR0FBVTtBQUNqQyxRQUFJLFFBQVEsUUFBUSxPQUFP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