@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
@@ -1,1036 +0,0 @@
1
- // @logixjs/core subpath bundles for @logixjs/sandbox
2
-
3
- import {
4
- currentLinkId,
5
- projectJsonValue
6
- } from "./chunk-TOQ6SJ6O.js";
7
-
8
- // ../logix-core/src/internal/runtime/core/DebugSink.ts
9
- import { Cause as Cause2, Effect, FiberRef, Layer, Logger } from "../effect.js";
10
-
11
- // ../logix-core/src/internal/runtime/core/errorSummary.ts
12
- import { Cause } from "../effect.js";
13
- var truncate = (value, maxLen) => {
14
- if (value.length <= maxLen) return { value, truncated: false };
15
- return { value: value.slice(0, maxLen), truncated: true };
16
- };
17
- var safeStringify = (value) => {
18
- try {
19
- return { ok: true, json: JSON.stringify(value) };
20
- } catch {
21
- return { ok: false };
22
- }
23
- };
24
- var getMessageFromUnknown = (cause) => {
25
- if (typeof cause === "string") return cause;
26
- if (typeof cause === "number" || typeof cause === "boolean" || typeof cause === "bigint") return String(cause);
27
- if (cause instanceof Error) return cause.message || cause.name || "Error";
28
- if (cause && typeof cause === "object" && "message" in cause && typeof cause.message === "string") {
29
- return cause.message;
30
- }
31
- try {
32
- const pretty = Cause.pretty(cause, { renderErrorCause: true });
33
- if (typeof pretty === "string" && pretty.length > 0) return pretty;
34
- } catch {
35
- }
36
- return "Unknown error";
37
- };
38
- var toSerializableErrorSummary = (cause, options) => {
39
- const maxMessageLength = options?.maxMessageLength ?? 256;
40
- const messageRaw = getMessageFromUnknown(cause);
41
- const { value: message, truncated } = truncate(messageRaw, maxMessageLength);
42
- const summary = {
43
- message
44
- };
45
- if (cause instanceof Error) {
46
- if (cause.name && cause.name !== "Error") summary.name = cause.name;
47
- const anyCause = cause;
48
- if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
49
- else if (typeof anyCause.code === "number" && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code);
50
- if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
51
- return {
52
- errorSummary: summary,
53
- downgrade: truncated ? "oversized" : void 0
54
- };
55
- }
56
- if (cause && typeof cause === "object") {
57
- const anyCause = cause;
58
- if (typeof anyCause.name === "string" && anyCause.name.length > 0) summary.name = anyCause.name;
59
- if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
60
- if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
61
- }
62
- const stringifyResult = safeStringify(cause);
63
- if (!stringifyResult.ok) {
64
- return {
65
- errorSummary: summary,
66
- downgrade: "non_serializable"
67
- };
68
- }
69
- if (truncated) {
70
- return {
71
- errorSummary: summary,
72
- downgrade: "oversized"
73
- };
74
- }
75
- if (message === "Unknown error") {
76
- return {
77
- errorSummary: summary,
78
- downgrade: "unknown"
79
- };
80
- }
81
- return { errorSummary: summary };
82
- };
83
-
84
- // ../logix-core/src/internal/runtime/core/DebugSink.ts
85
- var currentDebugSinks = FiberRef.unsafeMake([]);
86
- var currentRuntimeLabel = FiberRef.unsafeMake(void 0);
87
- var currentTxnId = FiberRef.unsafeMake(void 0);
88
- var currentOpSeq = FiberRef.unsafeMake(void 0);
89
- var currentDiagnosticsLevel = FiberRef.unsafeMake("off");
90
- var diagnosticsLevel = (level) => Layer.fiberRefLocallyScopedWith(currentDiagnosticsLevel, () => level);
91
- var currentTraitConvergeDiagnosticsSampling = FiberRef.unsafeMake({
92
- sampleEveryN: 32,
93
- topK: 3
94
- });
95
- var traitConvergeDiagnosticsSampling = (config) => Layer.fiberRefLocallyScopedWith(currentTraitConvergeDiagnosticsSampling, () => config);
96
- var appendSinks = (sinks) => Layer.fiberRefLocallyScopedWith(currentDebugSinks, (current) => [...current, ...sinks]);
97
- var nextGlobalEventSeq = 0;
98
- var clearRuntimeDebugEventSeq = () => {
99
- nextGlobalEventSeq = 0;
100
- };
101
- var nextEventSeq = () => {
102
- nextGlobalEventSeq += 1;
103
- return nextGlobalEventSeq;
104
- };
105
- var makeEventId = (instanceId, eventSeq) => `${instanceId}::e${eventSeq}`;
106
- var mergeDowngrade = (current, next) => {
107
- if (!current) return next;
108
- if (!next) return current;
109
- if (current === "non_serializable" || next === "non_serializable") return "non_serializable";
110
- if (current === "oversized" || next === "oversized") return "oversized";
111
- return "unknown";
112
- };
113
- var browserLifecycleSeen = /* @__PURE__ */ new Set();
114
- var browserDiagnosticSeen = /* @__PURE__ */ new Set();
115
- var lastTxnByInstance = /* @__PURE__ */ new Map();
116
- var pendingTxnAlignmentByInstance = /* @__PURE__ */ new Map();
117
- var enqueuePendingTxnAlignment = (instanceId, ref) => {
118
- const list = pendingTxnAlignmentByInstance.get(instanceId);
119
- if (!list) {
120
- pendingTxnAlignmentByInstance.set(instanceId, [ref]);
121
- return;
122
- }
123
- list.push(ref);
124
- if (list.length > 64) {
125
- list.shift();
126
- }
127
- };
128
- var backfillPendingTxnAlignment = (instanceId, txn) => {
129
- const pending = pendingTxnAlignmentByInstance.get(instanceId);
130
- if (!pending || pending.length === 0) {
131
- pendingTxnAlignmentByInstance.delete(instanceId);
132
- return;
133
- }
134
- for (const ref of pending) {
135
- const anyRef = ref;
136
- if (anyRef.txnId == null) {
137
- anyRef.txnId = txn.txnId;
138
- }
139
- if (typeof anyRef.txnSeq !== "number" || anyRef.txnSeq <= 0) {
140
- anyRef.txnSeq = txn.txnSeq;
141
- }
142
- }
143
- pendingTxnAlignmentByInstance.delete(instanceId);
144
- };
145
- var lifecycleErrorLog = (event) => {
146
- const moduleId = event.moduleId ?? "unknown";
147
- const causePretty = (() => {
148
- try {
149
- return Cause2.pretty(event.cause, {
150
- renderErrorCause: true
151
- });
152
- } catch {
153
- try {
154
- return JSON.stringify(event.cause, null, 2);
155
- } catch {
156
- return String(event.cause);
157
- }
158
- }
159
- })();
160
- const message = `[Logix][module=${moduleId}] lifecycle:error
161
- ${causePretty}`;
162
- return Effect.logError(message).pipe(
163
- Effect.annotateLogs({
164
- "logix.moduleId": moduleId,
165
- "logix.event": "lifecycle:error",
166
- "logix.cause": causePretty
167
- })
168
- );
169
- };
170
- var diagnosticLog = (event) => {
171
- const moduleId = event.moduleId ?? "unknown";
172
- const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`;
173
- const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
174
- hint: ${event.hint}` : ""}`;
175
- const msg = `${header}
176
- ${detail}`;
177
- const base = event.severity === "warning" ? Effect.logWarning(msg) : event.severity === "info" ? Effect.logInfo(msg) : Effect.logError(msg);
178
- const annotations = {
179
- "logix.moduleId": moduleId,
180
- "logix.event": `diagnostic(${event.severity})`,
181
- "logix.diagnostic.code": event.code,
182
- "logix.diagnostic.message": event.message
183
- };
184
- if (event.hint) {
185
- annotations["logix.diagnostic.hint"] = event.hint;
186
- }
187
- if (event.actionTag) {
188
- annotations["logix.diagnostic.actionTag"] = event.actionTag;
189
- }
190
- return base.pipe(Effect.annotateLogs(annotations));
191
- };
192
- var noopLayer = Layer.locallyScoped(currentDebugSinks, []);
193
- var errorOnlySink = {
194
- record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void
195
- };
196
- var errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink]);
197
- var isErrorOnlyOnlySinks = (sinks) => sinks.length === 1 && sinks[0] === errorOnlySink;
198
- var consoleSink = {
199
- record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event })
200
- };
201
- var consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink]);
202
- var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
203
- var renderBrowserConsoleEvent = (event) => {
204
- if (typeof event.type === "string" && event.type.startsWith("trace:")) {
205
- const moduleId = event.moduleId ?? "unknown";
206
- const type = event.type;
207
- return Effect.sync(() => {
208
- console.groupCollapsed(
209
- "%c[Logix]%c trace %c" + moduleId + "%c " + String(type),
210
- "color:#6b7280;font-weight:bold",
211
- // tag
212
- "color:#3b82f6",
213
- // label
214
- "color:#9ca3af",
215
- // module id
216
- "color:#6b7280"
217
- // type
218
- );
219
- console.log(event);
220
- console.groupEnd();
221
- });
222
- }
223
- if (event.type === "lifecycle:error") {
224
- const moduleId = event.moduleId ?? "unknown";
225
- const causePretty = (() => {
226
- try {
227
- return Cause2.pretty(event.cause, { renderErrorCause: true });
228
- } catch {
229
- try {
230
- return JSON.stringify(event.cause, null, 2);
231
- } catch {
232
- return String(event.cause);
233
- }
234
- }
235
- })();
236
- const key = `${moduleId}|${causePretty}`;
237
- if (browserLifecycleSeen.has(key)) {
238
- return Effect.void;
239
- }
240
- browserLifecycleSeen.add(key);
241
- return Effect.sync(() => {
242
- console.groupCollapsed(
243
- "%c[Logix]%c lifecycle:error %c" + moduleId,
244
- "color:#ef4444;font-weight:bold",
245
- // tag
246
- "color:#ef4444",
247
- // label
248
- "color:#9ca3af"
249
- // module id
250
- );
251
- console.error(causePretty);
252
- console.groupEnd();
253
- });
254
- }
255
- if (event.type === "diagnostic") {
256
- const moduleId = event.moduleId ?? "unknown";
257
- const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
258
- hint: ${event.hint}` : ""}`;
259
- const color = event.severity === "warning" ? "color:#d97706" : event.severity === "info" ? "color:#3b82f6" : "color:#ef4444";
260
- const label = event.severity === "warning" ? "diagnostic(warning)" : event.severity === "info" ? "diagnostic(info)" : "diagnostic(error)";
261
- const key = `${moduleId}|${event.code}|${event.message}`;
262
- if (browserDiagnosticSeen.has(key)) {
263
- return Effect.void;
264
- }
265
- browserDiagnosticSeen.add(key);
266
- return Effect.sync(() => {
267
- console.groupCollapsed(
268
- "%c[Logix]%c " + label + "%c module=" + moduleId,
269
- "color:#6b7280;font-weight:bold",
270
- color,
271
- "color:#9ca3af"
272
- );
273
- if (event.severity === "warning") {
274
- console.warn(detail);
275
- } else if (event.severity === "info") {
276
- console.info(detail);
277
- } else {
278
- console.error(detail);
279
- }
280
- console.groupEnd();
281
- });
282
- }
283
- return Effect.void;
284
- };
285
- var browserConsoleSink = {
286
- record: (event) => {
287
- if (!isBrowser) {
288
- return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event });
289
- }
290
- return renderBrowserConsoleEvent(event);
291
- }
292
- };
293
- var browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink]);
294
- var browserDiagnosticConsoleSink = {
295
- record: (event) => {
296
- if (!isBrowser) {
297
- return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void;
298
- }
299
- return event.type === "lifecycle:error" || event.type === "diagnostic" && event.severity !== "info" ? renderBrowserConsoleEvent(event) : Effect.void;
300
- }
301
- };
302
- var browserDiagnosticConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserDiagnosticConsoleSink]);
303
- var browserPrettyLoggerLayer = Logger.replace(
304
- Logger.defaultLogger,
305
- Logger.prettyLogger({ mode: "browser", colors: true })
306
- );
307
- var record = (event) => Effect.gen(function* () {
308
- const sinks = yield* FiberRef.get(currentDebugSinks);
309
- if (isErrorOnlyOnlySinks(sinks)) {
310
- if (event.type === "lifecycle:error") {
311
- yield* lifecycleErrorLog(event);
312
- return;
313
- }
314
- if (event.type === "diagnostic") {
315
- if (event.severity !== "info") {
316
- yield* diagnosticLog(event);
317
- } else {
318
- yield* Effect.void;
319
- }
320
- return;
321
- }
322
- yield* Effect.void;
323
- return;
324
- }
325
- if (sinks.length === 0) {
326
- if (isBrowser) {
327
- if (event.type === "lifecycle:error" || event.type === "diagnostic") {
328
- yield* renderBrowserConsoleEvent(event);
329
- return;
330
- }
331
- yield* Effect.void;
332
- return;
333
- }
334
- if (event.type === "lifecycle:error") {
335
- yield* lifecycleErrorLog(event);
336
- return;
337
- }
338
- if (event.type === "diagnostic") {
339
- yield* diagnosticLog(event);
340
- return;
341
- }
342
- yield* Effect.void;
343
- return;
344
- }
345
- const enriched = event;
346
- const diagnosticsLevel2 = yield* FiberRef.get(currentDiagnosticsLevel);
347
- let now;
348
- const getNow = () => {
349
- if (now === void 0) now = Date.now();
350
- return now;
351
- };
352
- if (enriched.timestamp === void 0 && (diagnosticsLevel2 !== "off" || enriched.type === "lifecycle:error" || enriched.type === "diagnostic")) {
353
- ;
354
- enriched.timestamp = getNow();
355
- }
356
- if (diagnosticsLevel2 !== "off" && enriched.runtimeLabel === void 0) {
357
- const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel);
358
- if (runtimeLabel) {
359
- ;
360
- enriched.runtimeLabel = runtimeLabel;
361
- }
362
- }
363
- if (enriched.type === "diagnostic" && enriched.txnId === void 0) {
364
- const txnId = yield* FiberRef.get(currentTxnId);
365
- if (txnId) {
366
- ;
367
- enriched.txnId = txnId;
368
- }
369
- }
370
- if (diagnosticsLevel2 !== "off" && enriched.type === "trace:effectop" && enriched.linkId === void 0) {
371
- const linkId = yield* FiberRef.get(currentLinkId);
372
- if (linkId) {
373
- ;
374
- enriched.linkId = linkId;
375
- }
376
- }
377
- if (sinks.length === 1) {
378
- yield* sinks[0].record(enriched);
379
- return;
380
- }
381
- yield* Effect.forEach(sinks, (sink) => sink.record(enriched), { discard: true });
382
- });
383
- var toRuntimeDebugEventRef = (event, options) => {
384
- const diagnosticsLevel2 = options?.diagnosticsLevel ?? "full";
385
- if (diagnosticsLevel2 === "off") {
386
- return void 0;
387
- }
388
- const isLightLike = diagnosticsLevel2 === "light" || diagnosticsLevel2 === "sampled";
389
- const timestamp = typeof event.timestamp === "number" && Number.isFinite(event.timestamp) ? event.timestamp : Date.now();
390
- const moduleIdRaw = event.moduleId;
391
- const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
392
- const instanceIdRaw = event.instanceId;
393
- const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
394
- const runtimeLabelRaw = event.runtimeLabel;
395
- const runtimeLabel = typeof runtimeLabelRaw === "string" && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : void 0;
396
- const txnSeqRaw = event.txnSeq;
397
- const txnSeq = typeof txnSeqRaw === "number" && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0;
398
- const txnIdRaw = event.txnId;
399
- const txnId = typeof txnIdRaw === "string" && txnIdRaw.length > 0 ? txnIdRaw : txnSeq > 0 ? `${instanceId}::t${txnSeq}` : void 0;
400
- const linkId = (() => {
401
- const linkIdRaw = event.linkId;
402
- if (typeof linkIdRaw === "string" && linkIdRaw.length > 0) return linkIdRaw;
403
- if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
404
- return void 0;
405
- }
406
- const data = event.data;
407
- const meta = data?.meta;
408
- const linkIdFromMeta = meta?.linkId;
409
- if (typeof linkIdFromMeta === "string" && linkIdFromMeta.length > 0) return linkIdFromMeta;
410
- return void 0;
411
- })();
412
- const eventSeqRaw = options?.eventSeq;
413
- const eventSeq = typeof eventSeqRaw === "number" && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0 ? Math.floor(eventSeqRaw) : nextEventSeq();
414
- const eventId = makeEventId(instanceId, eventSeq);
415
- const base = {
416
- eventId,
417
- eventSeq,
418
- moduleId,
419
- instanceId,
420
- runtimeLabel,
421
- txnSeq,
422
- txnId,
423
- linkId,
424
- timestamp
425
- };
426
- let downgrade;
427
- const withDowngrade = (ref) => {
428
- if (!downgrade) return ref;
429
- return { ...ref, downgrade: { reason: downgrade } };
430
- };
431
- switch (event.type) {
432
- case "module:init":
433
- return withDowngrade({
434
- ...base,
435
- kind: "lifecycle",
436
- label: "module:init"
437
- });
438
- case "module:destroy":
439
- return withDowngrade({
440
- ...base,
441
- kind: "lifecycle",
442
- label: "module:destroy"
443
- });
444
- case "lifecycle:phase": {
445
- const e = event;
446
- const metaInput = isLightLike ? { type: "lifecycle:phase", phase: e.phase, name: e.name } : { type: "lifecycle:phase", phase: e.phase, name: e.name, payload: e.payload };
447
- const metaProjection = projectJsonValue(metaInput);
448
- options?.onMetaProjection?.({
449
- stats: metaProjection.stats,
450
- downgrade: metaProjection.downgrade
451
- });
452
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
453
- return withDowngrade({
454
- ...base,
455
- kind: "lifecycle",
456
- label: e.name,
457
- meta: metaProjection.value
458
- });
459
- }
460
- case "action:dispatch": {
461
- const action = event.action;
462
- const actionTagRaw = event.actionTag;
463
- const tag = typeof actionTagRaw === "string" && actionTagRaw.length > 0 ? actionTagRaw : action?._tag ?? action?.type;
464
- const label = String(tag ?? "action:dispatch");
465
- const labelNormalized = label.length > 0 ? label : "unknown";
466
- const unknownAction = event.unknownAction === true ? true : void 0;
467
- const metaInput = isLightLike ? { actionTag: labelNormalized, ...unknownAction ? { unknownAction: true } : {} } : { action, ...unknownAction ? { unknownAction: true } : {} };
468
- const metaProjection = projectJsonValue(metaInput);
469
- options?.onMetaProjection?.({
470
- stats: metaProjection.stats,
471
- downgrade: metaProjection.downgrade
472
- });
473
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
474
- if (unknownAction) {
475
- downgrade = mergeDowngrade(downgrade, "unknown");
476
- }
477
- return withDowngrade({
478
- ...base,
479
- kind: "action",
480
- label: labelNormalized,
481
- meta: metaProjection.value
482
- });
483
- }
484
- case "state:update": {
485
- const e = event;
486
- const resolveDirtySetRootPaths = () => {
487
- const resolve = options?.resolveConvergeStaticIr;
488
- if (!resolve) return void 0;
489
- const digest = e.staticIrDigest;
490
- if (typeof digest !== "string" || digest.length === 0) return void 0;
491
- const dirtySet = e.dirtySet;
492
- if (!dirtySet || typeof dirtySet !== "object" || Array.isArray(dirtySet)) return void 0;
493
- const rootIds = dirtySet.rootIds;
494
- if (!Array.isArray(rootIds) || rootIds.length === 0) return void 0;
495
- const ir = resolve(digest);
496
- const fieldPaths = ir?.fieldPaths;
497
- if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return void 0;
498
- const out = [];
499
- for (const rawId of rootIds) {
500
- if (typeof rawId !== "number" || !Number.isFinite(rawId)) continue;
501
- const id = Math.floor(rawId);
502
- if (id < 0) continue;
503
- const path = fieldPaths[id];
504
- if (!Array.isArray(path) || path.length === 0) continue;
505
- if (!path.every((seg) => typeof seg === "string" && seg.length > 0)) continue;
506
- out.push(path);
507
- }
508
- return out.length > 0 ? out : void 0;
509
- };
510
- const dirtySetWithRootPaths = (() => {
511
- const rootPaths = resolveDirtySetRootPaths();
512
- if (!rootPaths) return e.dirtySet;
513
- const dirtySet = e.dirtySet;
514
- if (!dirtySet || typeof dirtySet !== "object" || Array.isArray(dirtySet)) return e.dirtySet;
515
- return { ...dirtySet, rootPaths };
516
- })();
517
- const metaInput = isLightLike ? {
518
- state: e.state,
519
- dirtySet: dirtySetWithRootPaths,
520
- patchCount: e.patchCount,
521
- patchesTruncated: e.patchesTruncated,
522
- patchesTruncatedReason: e.patchesTruncatedReason,
523
- staticIrDigest: e.staticIrDigest,
524
- commitMode: e.commitMode,
525
- priority: e.priority,
526
- originKind: e.originKind,
527
- originName: e.originName
528
- } : {
529
- state: e.state,
530
- dirtySet: dirtySetWithRootPaths,
531
- patchCount: e.patchCount,
532
- patchesTruncated: e.patchesTruncated,
533
- patchesTruncatedReason: e.patchesTruncatedReason,
534
- staticIrDigest: e.staticIrDigest,
535
- commitMode: e.commitMode,
536
- priority: e.priority,
537
- originKind: e.originKind,
538
- originName: e.originName,
539
- traitSummary: e.traitSummary,
540
- replayEvent: e.replayEvent
541
- };
542
- const metaProjection = projectJsonValue(metaInput);
543
- options?.onMetaProjection?.({
544
- stats: metaProjection.stats,
545
- downgrade: metaProjection.downgrade
546
- });
547
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
548
- if (txnId) {
549
- lastTxnByInstance.set(instanceId, { txnId, txnSeq });
550
- backfillPendingTxnAlignment(instanceId, { txnId, txnSeq });
551
- }
552
- return withDowngrade({
553
- ...base,
554
- kind: "state",
555
- label: "state:update",
556
- meta: metaProjection.value
557
- });
558
- }
559
- case "process:start":
560
- case "process:stop":
561
- case "process:restart":
562
- case "process:trigger":
563
- case "process:dispatch":
564
- case "process:error": {
565
- const e = event;
566
- const ts2 = typeof e.timestampMs === "number" && Number.isFinite(e.timestampMs) ? e.timestampMs : timestamp;
567
- const metaInput = {
568
- identity: e.identity,
569
- severity: e.severity,
570
- eventSeq: e.eventSeq,
571
- timestampMs: e.timestampMs,
572
- trigger: e.trigger,
573
- dispatch: e.dispatch,
574
- error: e.error
575
- };
576
- const metaProjection = projectJsonValue(metaInput);
577
- options?.onMetaProjection?.({
578
- stats: metaProjection.stats,
579
- downgrade: metaProjection.downgrade
580
- });
581
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
582
- const errorSummary = e.type === "process:error" || e.type === "process:restart" ? e.error : void 0;
583
- return withDowngrade({
584
- ...base,
585
- timestamp: ts2,
586
- kind: "process",
587
- label: e.type,
588
- meta: metaProjection.value,
589
- errorSummary
590
- });
591
- }
592
- case "lifecycle:error": {
593
- const e = event;
594
- const summary = toSerializableErrorSummary(e.cause);
595
- downgrade = mergeDowngrade(downgrade, summary.downgrade);
596
- const metaInput = isLightLike ? { type: "lifecycle:error", phase: e.phase, name: e.hook } : {
597
- type: "lifecycle:error",
598
- phase: e.phase,
599
- name: e.hook,
600
- hook: e.hook,
601
- taskId: e.taskId,
602
- origin: e.origin,
603
- txnSeq: e.txnSeq,
604
- opSeq: e.opSeq
605
- };
606
- const metaProjection = projectJsonValue(metaInput);
607
- options?.onMetaProjection?.({
608
- stats: metaProjection.stats,
609
- downgrade: metaProjection.downgrade
610
- });
611
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
612
- return withDowngrade({
613
- ...base,
614
- kind: "lifecycle",
615
- label: "lifecycle:error",
616
- meta: metaProjection.value,
617
- errorSummary: summary.errorSummary
618
- });
619
- }
620
- case "diagnostic": {
621
- const e = event;
622
- const metaInput = {
623
- code: e.code,
624
- severity: e.severity,
625
- message: e.message,
626
- hint: e.hint,
627
- actionTag: e.actionTag,
628
- kind: e.kind,
629
- trigger: e.trigger
630
- };
631
- const metaProjection = projectJsonValue(metaInput);
632
- options?.onMetaProjection?.({
633
- stats: metaProjection.stats,
634
- downgrade: metaProjection.downgrade
635
- });
636
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
637
- return withDowngrade({
638
- ...base,
639
- kind: "diagnostic",
640
- label: e.code,
641
- meta: metaProjection.value
642
- });
643
- }
644
- default: {
645
- if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
646
- return void 0;
647
- }
648
- if (event.type === "trace:txn-lane") {
649
- const data = event.data;
650
- const evidence = data?.evidence ?? data;
651
- const metaProjection2 = projectJsonValue(evidence);
652
- options?.onMetaProjection?.({
653
- stats: metaProjection2.stats,
654
- downgrade: metaProjection2.downgrade
655
- });
656
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
657
- const label = typeof evidence?.kind === "string" && evidence.kind.length > 0 ? String(evidence.kind) : "txn-lane";
658
- return withDowngrade({
659
- ...base,
660
- kind: "txn-lane",
661
- label,
662
- meta: metaProjection2.value
663
- });
664
- }
665
- if (event.type === "trace:react-render" || event.type === "trace:react-selector") {
666
- const data = event.data;
667
- const metaProjection2 = projectJsonValue(
668
- isLightLike ? {
669
- componentLabel: data?.componentLabel,
670
- selectorKey: data?.selectorKey,
671
- fieldPaths: data?.fieldPaths,
672
- selectorId: data?.selectorId,
673
- lane: data?.lane,
674
- producer: data?.producer,
675
- fallbackReason: data?.fallbackReason,
676
- readsDigest: data?.readsDigest,
677
- equalsKind: data?.equalsKind,
678
- strictModePhase: data?.strictModePhase
679
- } : {
680
- componentLabel: data?.componentLabel,
681
- selectorKey: data?.selectorKey,
682
- fieldPaths: data?.fieldPaths,
683
- selectorId: data?.selectorId,
684
- lane: data?.lane,
685
- producer: data?.producer,
686
- fallbackReason: data?.fallbackReason,
687
- readsDigest: data?.readsDigest,
688
- equalsKind: data?.equalsKind,
689
- strictModePhase: data?.strictModePhase,
690
- meta: data?.meta
691
- }
692
- );
693
- options?.onMetaProjection?.({
694
- stats: metaProjection2.stats,
695
- downgrade: metaProjection2.downgrade
696
- });
697
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
698
- const label = typeof data?.componentLabel === "string" && data.componentLabel.length > 0 ? data.componentLabel : event.type === "trace:react-selector" ? "react-selector" : "react-render";
699
- const last = lastTxnByInstance.get(instanceId);
700
- const txnSeqFromMeta = typeof data?.meta?.txnSeq === "number" && Number.isFinite(data.meta.txnSeq) && data.meta.txnSeq >= 0 ? Math.floor(data.meta.txnSeq) : void 0;
701
- const txnIdFromMeta = typeof data?.meta?.txnId === "string" && data.meta.txnId.length > 0 ? data.meta.txnId : void 0;
702
- const txnIdAligned = txnIdFromMeta ?? base.txnId ?? last?.txnId;
703
- const txnSeqAligned = txnSeqFromMeta ?? (base.txnSeq > 0 ? base.txnSeq : last?.txnSeq ?? base.txnSeq);
704
- const ref = withDowngrade({
705
- ...base,
706
- txnId: txnIdAligned,
707
- txnSeq: txnSeqAligned,
708
- kind: event.type === "trace:react-selector" ? "react-selector" : "react-render",
709
- label,
710
- meta: metaProjection2.value
711
- });
712
- if (instanceId !== "unknown" && (ref.txnId == null || ref.txnSeq <= 0)) {
713
- enqueuePendingTxnAlignment(instanceId, ref);
714
- }
715
- return ref;
716
- }
717
- if (event.type === "trace:selector:eval") {
718
- const data = event.data;
719
- const metaInput = {
720
- selectorId: data?.selectorId,
721
- lane: data?.lane,
722
- producer: data?.producer,
723
- fallbackReason: data?.fallbackReason,
724
- readsDigest: data?.readsDigest,
725
- equalsKind: data?.equalsKind,
726
- changed: data?.changed,
727
- evalMs: data?.evalMs
728
- };
729
- const metaProjection2 = projectJsonValue(metaInput);
730
- options?.onMetaProjection?.({
731
- stats: metaProjection2.stats,
732
- downgrade: metaProjection2.downgrade
733
- });
734
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
735
- return withDowngrade({
736
- ...base,
737
- kind: "devtools",
738
- label: event.type,
739
- meta: metaProjection2.value
740
- });
741
- }
742
- if (event.type === "trace:exec-vm") {
743
- const data = event.data;
744
- const metaInput = {
745
- version: data?.version,
746
- stage: data?.stage,
747
- hit: data?.hit,
748
- reasonCode: data?.reasonCode ?? data?.reason,
749
- reasonDetail: data?.reasonDetail,
750
- execIrVersion: data?.execIrVersion,
751
- execIrHash: data?.execIrHash,
752
- serviceId: data?.serviceId,
753
- implId: data?.implId
754
- };
755
- const metaProjection2 = projectJsonValue(metaInput);
756
- options?.onMetaProjection?.({
757
- stats: metaProjection2.stats,
758
- downgrade: metaProjection2.downgrade
759
- });
760
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
761
- return withDowngrade({
762
- ...base,
763
- kind: "devtools",
764
- label: event.type,
765
- meta: metaProjection2.value
766
- });
767
- }
768
- if (event.type === "trace:trait:converge") {
769
- const resolveDirtyRootPaths = (args) => {
770
- const resolve = options?.resolveConvergeStaticIr;
771
- if (!resolve) return void 0;
772
- const digest = args.staticIrDigest;
773
- if (typeof digest !== "string" || digest.length === 0) return void 0;
774
- const rootIds = args.rootIds;
775
- if (!Array.isArray(rootIds) || rootIds.length === 0) return void 0;
776
- const ir = resolve(digest);
777
- const fieldPaths = ir?.fieldPaths;
778
- if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return void 0;
779
- const out = [];
780
- for (const id of rootIds) {
781
- if (typeof id !== "number" || !Number.isFinite(id)) continue;
782
- const idx = Math.floor(id);
783
- if (idx < 0 || idx >= fieldPaths.length) continue;
784
- const path = fieldPaths[idx];
785
- if (Array.isArray(path)) {
786
- out.push(path);
787
- }
788
- }
789
- return out.length > 0 ? out : void 0;
790
- };
791
- const enrichDirtyRootPaths = (value) => {
792
- if (!value || typeof value !== "object" || Array.isArray(value)) return value;
793
- const anyValue = value;
794
- const dirty = anyValue.dirty;
795
- if (!dirty || typeof dirty !== "object" || Array.isArray(dirty)) return value;
796
- const dirtyRootPaths = resolveDirtyRootPaths({
797
- staticIrDigest: anyValue.staticIrDigest,
798
- rootIds: dirty?.rootIds
799
- });
800
- if (!dirtyRootPaths) return value;
801
- return {
802
- ...anyValue,
803
- dirty: {
804
- ...dirty,
805
- rootPaths: dirtyRootPaths
806
- }
807
- };
808
- };
809
- const stripHeavyLight = (value) => {
810
- if (!value || typeof value !== "object" || Array.isArray(value)) return value;
811
- const anyValue = value;
812
- const dirty = anyValue.dirty;
813
- const dirtyRootPaths = resolveDirtyRootPaths({
814
- staticIrDigest: anyValue.staticIrDigest,
815
- rootIds: dirty?.rootIds
816
- });
817
- const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
818
- dirtyAll: dirty.dirtyAll,
819
- ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null,
820
- ...Array.isArray(dirty.rootIds) ? { rootIds: dirty.rootIds } : null,
821
- ...typeof dirty.rootIdsTruncated === "boolean" ? { rootIdsTruncated: dirty.rootIdsTruncated } : null,
822
- ...dirtyRootPaths ? { rootPaths: dirtyRootPaths } : null
823
- } : void 0;
824
- const { top3, dirtyRoots, ...rest } = anyValue;
825
- return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
826
- };
827
- const stripHeavySampled = (value) => {
828
- if (!value || typeof value !== "object" || Array.isArray(value)) return value;
829
- const anyValue = value;
830
- const dirty = anyValue.dirty;
831
- const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
832
- dirtyAll: dirty.dirtyAll,
833
- ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null
834
- } : void 0;
835
- const { dirtyRoots, ...rest } = anyValue;
836
- return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
837
- };
838
- const data = event.data;
839
- const metaInput = diagnosticsLevel2 === "light" ? stripHeavyLight(data) : diagnosticsLevel2 === "sampled" ? stripHeavySampled(data) : enrichDirtyRootPaths(data);
840
- const metaProjection2 = projectJsonValue(metaInput);
841
- options?.onMetaProjection?.({
842
- stats: metaProjection2.stats,
843
- downgrade: metaProjection2.downgrade
844
- });
845
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
846
- return withDowngrade({
847
- ...base,
848
- kind: "trait:converge",
849
- label: "trait:converge",
850
- meta: metaProjection2.value
851
- });
852
- }
853
- if (event.type === "trace:trait:check") {
854
- const stripHeavy = (value) => {
855
- if (!value || typeof value !== "object" || Array.isArray(value)) return value;
856
- const anyValue = value;
857
- const degraded = anyValue.degraded;
858
- const degradedSlim = degraded && typeof degraded === "object" && !Array.isArray(degraded) ? { kind: degraded.kind } : void 0;
859
- const { degraded: _degraded, ...rest } = anyValue;
860
- return degradedSlim ? { ...rest, degraded: degradedSlim } : rest;
861
- };
862
- const data = event.data;
863
- const metaInput = isLightLike ? stripHeavy(data) : data;
864
- const metaProjection2 = projectJsonValue(metaInput);
865
- options?.onMetaProjection?.({
866
- stats: metaProjection2.stats,
867
- downgrade: metaProjection2.downgrade
868
- });
869
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
870
- return withDowngrade({
871
- ...base,
872
- kind: "trait:check",
873
- label: "trait:check",
874
- meta: metaProjection2.value
875
- });
876
- }
877
- if (event.type === "trace:trait:validate") {
878
- const data = event.data;
879
- const metaProjection2 = projectJsonValue(data);
880
- options?.onMetaProjection?.({
881
- stats: metaProjection2.stats,
882
- downgrade: metaProjection2.downgrade
883
- });
884
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
885
- return withDowngrade({
886
- ...base,
887
- kind: "trait:validate",
888
- label: "trait:validate",
889
- meta: metaProjection2.value
890
- });
891
- }
892
- if (event.type === "trace:module:traits") {
893
- const data = event.data;
894
- const metaInput = isLightLike ? {
895
- digest: data?.digest,
896
- count: data?.count
897
- } : {
898
- digest: data?.digest,
899
- count: data?.count,
900
- traits: data?.traits,
901
- provenanceIndex: data?.provenanceIndex
902
- };
903
- const metaProjection2 = projectJsonValue(metaInput);
904
- options?.onMetaProjection?.({
905
- stats: metaProjection2.stats,
906
- downgrade: metaProjection2.downgrade
907
- });
908
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
909
- return withDowngrade({
910
- ...base,
911
- kind: "devtools",
912
- label: event.type,
913
- meta: metaProjection2.value
914
- });
915
- }
916
- if (event.type === "trace:module:traits:conflict") {
917
- const data = event.data;
918
- const metaInput = isLightLike ? {
919
- conflictCount: data?.conflictCount,
920
- traitIds: data?.traitIds
921
- } : {
922
- conflictCount: data?.conflictCount,
923
- conflicts: data?.conflicts
924
- };
925
- const metaProjection2 = projectJsonValue(metaInput);
926
- options?.onMetaProjection?.({
927
- stats: metaProjection2.stats,
928
- downgrade: metaProjection2.downgrade
929
- });
930
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
931
- return withDowngrade({
932
- ...base,
933
- kind: "devtools",
934
- label: event.type,
935
- meta: metaProjection2.value
936
- });
937
- }
938
- if (event.type === "trace:module:descriptor") {
939
- const data = event.data;
940
- const metaInput = isLightLike ? {
941
- id: data?.id,
942
- traits: data?.traits,
943
- source: data?.source
944
- } : { data };
945
- const metaProjection2 = projectJsonValue(metaInput);
946
- options?.onMetaProjection?.({
947
- stats: metaProjection2.stats,
948
- downgrade: metaProjection2.downgrade
949
- });
950
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
951
- return withDowngrade({
952
- ...base,
953
- kind: "devtools",
954
- label: event.type,
955
- meta: metaProjection2.value
956
- });
957
- }
958
- if (event.type === "trace:effectop") {
959
- const data = event.data;
960
- const opMeta = data?.meta;
961
- const opKind = data?.kind ?? "service";
962
- const label = typeof data?.name === "string" ? data.name : "effectop";
963
- const moduleId2 = typeof opMeta?.moduleId === "string" ? opMeta.moduleId : moduleId;
964
- const txnId2 = typeof opMeta?.txnId === "string" && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId;
965
- const txnSeq2 = typeof opMeta?.txnSeq === "number" && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0 ? Math.floor(opMeta.txnSeq) : base.txnSeq;
966
- const metaInput = isLightLike ? {
967
- id: data?.id,
968
- kind: data?.kind,
969
- name: data?.name,
970
- meta: opMeta
971
- } : {
972
- id: data?.id,
973
- kind: data?.kind,
974
- name: data?.name,
975
- payload: data?.payload,
976
- meta: opMeta
977
- };
978
- const metaProjection2 = projectJsonValue(metaInput);
979
- options?.onMetaProjection?.({
980
- stats: metaProjection2.stats,
981
- downgrade: metaProjection2.downgrade
982
- });
983
- downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
984
- return withDowngrade({
985
- ...base,
986
- moduleId: moduleId2,
987
- txnId: txnId2,
988
- txnSeq: txnSeq2,
989
- kind: opKind,
990
- label,
991
- meta: metaProjection2.value
992
- });
993
- }
994
- const metaProjection = projectJsonValue(
995
- isLightLike ? {
996
- data: void 0
997
- } : {
998
- data: event.data
999
- }
1000
- );
1001
- options?.onMetaProjection?.({
1002
- stats: metaProjection.stats,
1003
- downgrade: metaProjection.downgrade
1004
- });
1005
- downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
1006
- return withDowngrade({
1007
- ...base,
1008
- kind: "devtools",
1009
- label: event.type,
1010
- meta: metaProjection.value
1011
- });
1012
- }
1013
- }
1014
- };
1015
-
1016
- export {
1017
- toSerializableErrorSummary,
1018
- currentDebugSinks,
1019
- currentRuntimeLabel,
1020
- currentTxnId,
1021
- currentOpSeq,
1022
- currentDiagnosticsLevel,
1023
- diagnosticsLevel,
1024
- currentTraitConvergeDiagnosticsSampling,
1025
- traitConvergeDiagnosticsSampling,
1026
- appendSinks,
1027
- clearRuntimeDebugEventSeq,
1028
- noopLayer,
1029
- errorOnlyLayer,
1030
- isErrorOnlyOnlySinks,
1031
- browserConsoleLayer,
1032
- browserDiagnosticConsoleLayer,
1033
- record,
1034
- toRuntimeDebugEventRef
1035
- };
1036
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0RlYnVnU2luay50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBGaWJlclJlZiwgTGF5ZXIsIExvZ2dlciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7XG4gIHByb2plY3RKc29uVmFsdWUsXG4gIHR5cGUgRG93bmdyYWRlUmVhc29uIGFzIEpzb25Eb3duZ3JhZGVSZWFzb24sXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIEpzb25WYWx1ZVByb2plY3Rpb25TdGF0cyxcbn0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgdHlwZSAqIGFzIFJlcGxheUxvZyBmcm9tICcuL1JlcGxheUxvZy5qcydcbmltcG9ydCB7XG4gIHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5LFxuICB0eXBlIERvd25ncmFkZVJlYXNvbiBhcyBFcnJvckRvd25ncmFkZVJlYXNvbixcbiAgdHlwZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnksXG59IGZyb20gJy4vZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0ICogYXMgRWZmZWN0T3BDb3JlIGZyb20gJy4vRWZmZWN0T3BDb3JlLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBQcm9jZXNzUHJvdG9jb2wgZnJvbSAnLi9wcm9jZXNzL3Byb3RvY29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyRXhwb3J0IH0gZnJvbSAnLi4vLi4vc3RhdGUtdHJhaXQvY29udmVyZ2UtaXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpZ2dlclJlZiB7XG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiB1bmtub3duXG59XG5cbnR5cGUgVHJhY2VFdmVudFR5cGUgPSBgdHJhY2U6JHtzdHJpbmd9YFxudHlwZSBHZW5lcmljVHJhY2VFdmVudFR5cGUgPSBFeGNsdWRlPFxuICBUcmFjZUV2ZW50VHlwZSxcbiAgJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJyB8ICd0cmFjZTp0cmFpdDpjaGVjaycgfCAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnXG4+XG5cbi8qKlxuICogUmVwbGF5RXZlbnRSZWZcdUZGMUFcbiAqIC0gUmVwbGF5IGV2ZW50IHN0cnVjdHVyZSByZWZlcmVuY2VkIGZyb20gRGVidWcgZXZlbnRzLlxuICogLSBCYXNlZCBvbiBSZXBsYXlMb2cuRXZlbnQsIGVucmljaGVkIHdpdGggdHhuL3RyaWdnZXIgYXNzb2NpYXRpb24gZmllbGRzIGZvciBEZXZ0b29scyBhZ2dyZWdhdGlvbiBhbmQgZXhwbGFuYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxheUV2ZW50UmVmID0gUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ICYge1xuICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICByZWFkb25seSB0cmlnZ2VyPzogVHJpZ2dlclJlZlxufVxuXG5leHBvcnQgdHlwZSBFdmVudCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ21vZHVsZTppbml0J1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdtb2R1bGU6ZGVzdHJveSdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOnBoYXNlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHBoYXNlOiAnaW5pdCcgfCAncnVuJyB8ICdkZXN0cm95JyB8ICdwbGF0Zm9ybSdcbiAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcGF5bG9hZD86IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdhY3Rpb246ZGlzcGF0Y2gnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgYWN0aW9uOiB1bmtub3duXG4gICAgICByZWFkb25seSBhY3Rpb25UYWc/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHVua25vd25BY3Rpb24/OiBib29sZWFuXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnc3RhdGU6dXBkYXRlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHN0YXRlOiB1bmtub3duXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiBTdGF0aWMgSVIgZGlnZXN0IGFsaWduZWQgd2l0aCBGaWVsZFBhdGhJZC9TdGVwSWQgKGZvciBjb25zdW1lci1zaWRlIHJldmVyc2UtbWFwcGluZyAmIGFsaWdubWVudCkuXG4gICAgICAgKiAtIFdoZW4gbWlzc2luZyBvciBtaXNtYXRjaGVkLCBjb25zdW1lcnMgbXVzdCBub3QgYXR0ZW1wdCB0byByZXZlcnNlLW1hcCByb290SWRzIC0+IHJvb3RQYXRocyAoYXZvaWQgd3JvbmcgVUkpLlxuICAgICAgICogLSBBbGxvd2VkIHRvIGJlIG9taXR0ZWQgb24gbmVhci16ZXJvLWNvc3QgZGlhZ25vc3RpY3M9b2ZmIHBhdGhzLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBzdGF0aWNJckRpZ2VzdD86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogdGhlIGFmZmVjdGVkIHNjb3BlIGFnZ3JlZ2F0ZWQgYnkgdGhpcyBjb21taXQgKGZpZWxkLWxldmVsIGRpcnR5LXNldCkuXG4gICAgICAgKiAtIFBvcHVsYXRlZCBieSBSdW50aW1lIGF0IGNvbW1pdCB0aW1lO1xuICAgICAgICogLSBNdXN0IHN0YXkgc2xpbSBhbmQgc2VyaWFsaXphYmxlO1xuICAgICAgICogLSBEZXZ0b29scyBjYW4gdXNlIGl0IHRvIGV4cGxhaW4gXCJ3aHkgY29udmVyZ2UvdmFsaWRhdGUgcmFuIC8gd2h5IGl0IGRlZ3JhZGVkIHRvIGZ1bGxcIi5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgZGlydHlTZXQ/OiB1bmtub3duXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiBwYXRjaCBjb3VudCBhZ2dyZWdhdGVkIGJ5IHRoaXMgY29tbWl0IChmcm9tIFN0YXRlVHJhbnNhY3Rpb24pLlxuICAgICAgICogLSBQb3B1bGF0ZWQgYnkgUnVudGltZSBvbmx5IG9uIHRyYW5zYWN0aW9uIHBhdGhzLlxuICAgICAgICogLSBEZXZ0b29scyBjYW4gdXNlIGl0IGFzIGEgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb24gc3VtbWFyeSBtZXRyaWMuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHBhdGNoQ291bnQ/OiBudW1iZXJcbiAgICAgIC8qKlxuICAgICAgICogT3B0aW9uYWw6IHdoZXRoZXIgcGF0Y2ggcmVjb3JkcyB3ZXJlIHRydW5jYXRlZCAoYm91bmRlZCkgdW5kZXIgZnVsbCBpbnN0cnVtZW50YXRpb24uXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHBhdGNoZXNUcnVuY2F0ZWQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiB0cnVuY2F0aW9uIHJlYXNvbiBjb2RlIChzdGFibGUgZW51bSkuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHBhdGNoZXNUcnVuY2F0ZWRSZWFzb24/OiAnbWF4X3BhdGNoZXMnXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiBjb21taXQgbW9kZSAobm9ybWFsL2JhdGNoZWQvbG93LXByaW9yaXR5LCBldGMpLlxuICAgICAgICogLSBQb3B1bGF0ZWQgYnkgUnVudGltZTtcbiAgICAgICAqIC0gRGVmYXVsdCBpcyBjaG9zZW4gYnkgdGhlIGNhbGxlciAodHlwaWNhbGx5IFwibm9ybWFsXCIpLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBjb21taXRNb2RlPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiBleHRlcm5hbCB2aXNpYmlsaXR5IHByaW9yaXR5IChub3JtYWwvbG93KS5cbiAgICAgICAqIC0gUG9wdWxhdGVkIGJ5IFJ1bnRpbWUuXG4gICAgICAgKiAtIE1haW5seSB1c2VkIGJ5IFJlYWN0IGV4dGVybmFsIHN1YnNjcmlwdGlvbiBzY2hlZHVsaW5nIChhdm9pZCB1bm5lY2Vzc2FyeSByZW5kZXJzKS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcHJpb3JpdHk/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogT3B0aW9uYWw6IHRyYW5zYWN0aW9uIG9yaWdpbiBraW5kIChvcmlnaW4ua2luZCkgdGhhdCB0cmlnZ2VyZWQgdGhpcyBzdGF0ZSBjb21taXQ6XG4gICAgICAgKiAtIGUuZy4gXCJhY3Rpb25cIiAvIFwic291cmNlLXJlZnJlc2hcIiAvIFwic2VydmljZS1jYWxsYmFja1wiIC8gXCJkZXZ0b29sc1wiLlxuICAgICAgICogLSBQb3B1bGF0ZWQgYnkgUnVudGltZSBvbmx5IG9uIFN0YXRlVHJhbnNhY3Rpb24tYmFzZWQgcGF0aHMuXG4gICAgICAgKiAtIERldnRvb2xzIGNhbiBkaXN0aW5ndWlzaCBhcHAgdHJhbnNhY3Rpb25zIHZzIGRldnRvb2xzIHRpbWUtdHJhdmVsIG9wZXJhdGlvbnMuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IG9yaWdpbktpbmQ/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogT3B0aW9uYWw6IHRyYW5zYWN0aW9uIG9yaWdpbiBuYW1lIChvcmlnaW4ubmFtZSkgdGhhdCB0cmlnZ2VyZWQgdGhpcyBzdGF0ZSBjb21taXQ6XG4gICAgICAgKiAtIGUuZy4gYWN0aW9uIGRpc3BhdGNoIC8gZmllbGRQYXRoIC8gdGFzazpzdWNjZXNzL3Rhc2s6ZmFpbHVyZSwgZXRjLlxuICAgICAgICogLSBQb3B1bGF0ZWQgYnkgUnVudGltZSBvbmx5IG9uIFN0YXRlVHJhbnNhY3Rpb24tYmFzZWQgcGF0aHMuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IG9yaWdpbk5hbWU/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogUmVzZXJ2ZWQ6IFRyYWl0IGNvbnZlcmdlIHN1bW1hcnkgKGZvciBEZXZ0b29scyB3aW5kb3ctbGV2ZWwgc3RhdHMgLyBUb3BOIGNvc3RzIC8gZGVncmFkZSByZWFzb25zLCBldGMuKS5cbiAgICAgICAqIC0gUGhhc2UgMjogZmllbGQgc2xvdCBvbmx5OyBzdHJ1Y3R1cmUgaXMgbm90IGZpeGVkLlxuICAgICAgICogLSBMYXRlciBwaGFzZXMgd2lsbCBhbGlnbiB3aXRoIHRoZSBUcmFpdC9SZXBsYXkgZXZlbnQgbW9kZWwgaW50byBhbiBleHBsYWluYWJsZSBzdHJ1Y3R1cmUuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHRyYWl0U3VtbWFyeT86IHVua25vd25cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXJ2ZWQ6IHJlcGxheSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiAocmUtZW1pdCBzb3VyY2Ugb2YgdHJ1dGggZnJvbSBSZXBsYXlMb2cpLlxuICAgICAgICogLSBQaGFzZSAyOiBmaWVsZCBzbG90IG9ubHkuXG4gICAgICAgKiAtIExhdGVyIHBoYXNlcyB3aWxsIGFsaWduIHdpdGggUmVwbGF5TG9nLkV2ZW50IHN0cnVjdHVyZS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcmVwbGF5RXZlbnQ/OiBSZXBsYXlFdmVudFJlZlxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTpcbiAgICAgICAgfCAncHJvY2VzczpzdGFydCdcbiAgICAgICAgfCAncHJvY2VzczpzdG9wJ1xuICAgICAgICB8ICdwcm9jZXNzOnJlc3RhcnQnXG4gICAgICAgIHwgJ3Byb2Nlc3M6dHJpZ2dlcidcbiAgICAgICAgfCAncHJvY2VzczpkaXNwYXRjaCdcbiAgICAgICAgfCAncHJvY2VzczplcnJvcidcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpZGVudGl0eTogUHJvY2Vzc1Byb3RvY29sLlByb2Nlc3NJbnN0YW5jZUlkZW50aXR5XG4gICAgICByZWFkb25seSBzZXZlcml0eTogJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJ1xuICAgICAgcmVhZG9ubHkgZXZlbnRTZXE6IG51bWJlclxuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wTXM6IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHJpZ2dlcj86IFByb2Nlc3NQcm90b2NvbC5Qcm9jZXNzVHJpZ2dlclxuICAgICAgcmVhZG9ubHkgZGlzcGF0Y2g/OiB7XG4gICAgICAgIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gICAgICAgIHJlYWRvbmx5IGFjdGlvbklkOiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIHJlYWRvbmx5IGVycm9yPzogUHJvY2Vzc1Byb3RvY29sLlNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBjYXVzZTogdW5rbm93blxuICAgICAgcmVhZG9ubHkgcGhhc2U/OiAnaW5pdCcgfCAncnVuJyB8ICdkZXN0cm95JyB8ICdwbGF0Zm9ybSdcbiAgICAgIHJlYWRvbmx5IGhvb2s/OiAnaW5pdFJlcXVpcmVkJyB8ICdzdGFydCcgfCAnZGVzdHJveScgfCAnc3VzcGVuZCcgfCAncmVzdW1lJyB8ICdyZXNldCcgfCAndW5rbm93bidcbiAgICAgIHJlYWRvbmx5IHRhc2tJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgb3BTZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IG9yaWdpbj86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnZGlhZ25vc3RpYydcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBjb2RlOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHNldmVyaXR5OiAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ2luZm8nXG4gICAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGFjdGlvblRhZz86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkga2luZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJSZWZcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICAvKipcbiAgICogdHJhY2U6KiBldmVudHM6XG4gICAqIC0gRXh0ZW5zaW9uIGhvb2sgZm9yIHJ1bnRpbWUgdHJhY2luZyAvIFBsYXlncm91bmQgLyBBbGlnbm1lbnQgTGFiLlxuICAgKiAtIE9ubHkgdGhlIHR5cGUgcHJlZml4IGFuZCBtb2R1bGVJZCBhcmUgc3RhbmRhcmRpemVkOyBwYXlsb2FkIHNoYXBlIGlzIGRlZmluZWQgYnkgaGlnaGVyIGxheWVycyAoZS5nLiBzcGFuSWQvYXR0cmlidXRlcyBpbiBkYXRhKS5cbiAgICovXG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNoZWNrJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OnZhbGlkYXRlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogR2VuZXJpY1RyYWNlRXZlbnRUeXBlXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YT86IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbmsge1xuICByZWFkb25seSByZWNvcmQ6IChldmVudDogRXZlbnQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbn1cbmV4cG9ydCBjb25zdCBjdXJyZW50RGVidWdTaW5rcyA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8UmVhZG9ubHlBcnJheTxTaW5rPj4oW10pXG5leHBvcnQgY29uc3QgY3VycmVudFJ1bnRpbWVMYWJlbCA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5leHBvcnQgY29uc3QgY3VycmVudFR4bklkID0gRmliZXJSZWYudW5zYWZlTWFrZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbmV4cG9ydCBjb25zdCBjdXJyZW50T3BTZXEgPSBGaWJlclJlZi51bnNhZmVNYWtlPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY3NMZXZlbCA9ICdvZmYnIHwgJ2xpZ2h0JyB8ICdzYW1wbGVkJyB8ICdmdWxsJ1xuZXhwb3J0IGNvbnN0IGN1cnJlbnREaWFnbm9zdGljc0xldmVsID0gRmliZXJSZWYudW5zYWZlTWFrZTxEaWFnbm9zdGljc0xldmVsPignb2ZmJylcblxuZXhwb3J0IGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSAobGV2ZWw6IERpYWdub3N0aWNzTGV2ZWwpOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuZmliZXJSZWZMb2NhbGx5U2NvcGVkV2l0aChjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCBhcyBhbnksICgpID0+IGxldmVsKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBTYW1wbGUgb25jZSBldmVyeSBOIHR4bnMgKGRldGVybWluaXN0aWMsIGJhc2VkIG9uIHN0YWJsZSB0eG5TZXEpLlxuICAgKiAtIDE6IHNhbXBsZSBldmVyeSB0eG4gKHRpbWluZyBncmFudWxhcml0eSBzaW1pbGFyIHRvIGZ1bGwsIHdoaWxlIGtlZXBpbmcgcGF5bG9hZCBzbGltKVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnlOOiBudW1iZXJcbiAgLyoqXG4gICAqIE1heCBudW1iZXIgb2YgVG9wSyBob3RzcG90cyB0byBvdXRwdXQgKHJlY29tbWVuZGVkIFx1MjI2NCAzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRvcEs6IG51bWJlclxufVxuXG5leHBvcnQgY29uc3QgY3VycmVudFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nID0gRmliZXJSZWYudW5zYWZlTWFrZTxUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZ0NvbmZpZz4oe1xuICBzYW1wbGVFdmVyeU46IDMyLFxuICB0b3BLOiAzLFxufSlcblxuZXhwb3J0IGNvbnN0IHRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nID0gKFxuICBjb25maWc6IFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nQ29uZmlnLFxuKTogTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+ID0+XG4gIExheWVyLmZpYmVyUmVmTG9jYWxseVNjb3BlZFdpdGgoY3VycmVudFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nIGFzIGFueSwgKCkgPT4gY29uZmlnKSBhcyBMYXllci5MYXllcjxcbiAgICBhbnksXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxuXG5leHBvcnQgY29uc3QgYXBwZW5kU2lua3MgPSAoc2lua3M6IFJlYWRvbmx5QXJyYXk8U2luaz4pOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuZmliZXJSZWZMb2NhbGx5U2NvcGVkV2l0aChjdXJyZW50RGVidWdTaW5rcywgKGN1cnJlbnQpID0+IFsuLi5jdXJyZW50LCAuLi5zaW5rc10pIGFzIExheWVyLkxheWVyPFxuICAgIGFueSxcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVEZWJ1Z0V2ZW50S2luZCA9XG4gIHwgJ2FjdGlvbidcbiAgfCAnc3RhdGUnXG4gIHwgJ3NlcnZpY2UnXG4gIHwgJ3Byb2Nlc3MnXG4gIHwgJ3RyYWl0LWNvbXB1dGVkJ1xuICB8ICd0cmFpdC1saW5rJ1xuICB8ICd0cmFpdC1zb3VyY2UnXG4gIHwgJ2xpZmVjeWNsZSdcbiAgfCAncmVhY3QtcmVuZGVyJ1xuICB8ICdkZXZ0b29scydcbiAgfCAnZGlhZ25vc3RpYydcbiAgfCAoc3RyaW5nICYge30pXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZURlYnVnRXZlbnRSZWYge1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZXZlbnRTZXE6IG51bWJlclxuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIGxpbmtJZFx1RkYxQVxuICAgKiAtIEN1cnJlbnQgb3BlcmF0aW9uIGNoYWluIGlkIChzaGFyZWQgYnkgYm91bmRhcnkgb3BzIGluIHRoZSBzYW1lIGNoYWluKS5cbiAgICogLSBDcmVhdGVkIGJ5IFJ1bnRpbWUgYXQgdGhlIGJvdW5kYXJ5IHJvb3QgYW5kIHByb3BhZ2F0ZWQgdmlhIEZpYmVyUmVmIGFjcm9zcyBuZXN0ZWQvY3Jvc3MtbW9kdWxlIGNoYWlucy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtJZD86IHN0cmluZ1xuICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlclxuICByZWFkb25seSBraW5kOiBSdW50aW1lRGVidWdFdmVudEtpbmRcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZ1xuICByZWFkb25seSBtZXRhPzogSnNvblZhbHVlXG4gIHJlYWRvbmx5IGVycm9yU3VtbWFyeT86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICByZWFkb25seSBkb3duZ3JhZGU/OiB7XG4gICAgcmVhZG9ubHkgcmVhc29uPzogJ25vbl9zZXJpYWxpemFibGUnIHwgJ292ZXJzaXplZCcgfCAndW5rbm93bidcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUeG5MYW5lRXZpZGVuY2VSZWFzb24gPVxuICB8ICdkaXNhYmxlZCdcbiAgfCAnZm9yY2VkX29mZidcbiAgfCAnZm9yY2VkX3N5bmMnXG4gIHwgJ3F1ZXVlZF9ub25fdXJnZW50J1xuICB8ICdwcmVlbXB0ZWRfYnlfdXJnZW50J1xuICB8ICdidWRnZXRfeWllbGQnXG4gIHwgJ2NvYWxlc2NlZCdcbiAgfCAnY2FuY2VsZWQnXG4gIHwgJ21heF9sYWdfZm9yY2VkJ1xuICB8ICdzdGFydmF0aW9uX3Byb3RlY3Rpb24nXG5cbmV4cG9ydCB0eXBlIFR4bkxhbmVOb25VcmdlbnRZaWVsZFJlYXNvbiA9ICdub25lJyB8ICdpbnB1dF9wZW5kaW5nJyB8ICdidWRnZXRfZXhjZWVkZWQnIHwgJ2ZvcmNlZF9mcmFtZV95aWVsZCdcblxuZXhwb3J0IHR5cGUgVHhuTGFuZUV2aWRlbmNlID0ge1xuICByZWFkb25seSBhbmNob3I6IHtcbiAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgICByZWFkb25seSBvcFNlcT86IG51bWJlclxuICB9XG4gIHJlYWRvbmx5IGxhbmU6ICd1cmdlbnQnIHwgJ25vblVyZ2VudCdcbiAgcmVhZG9ubHkga2luZDogc3RyaW5nXG4gIHJlYWRvbmx5IHBvbGljeToge1xuICAgIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW5cbiAgICByZWFkb25seSBvdmVycmlkZU1vZGU/OiAnZm9yY2VkX29mZicgfCAnZm9yY2VkX3N5bmMnXG4gICAgcmVhZG9ubHkgY29uZmlnU2NvcGU6ICdwcm92aWRlcicgfCAncnVudGltZV9tb2R1bGUnIHwgJ3J1bnRpbWVfZGVmYXVsdCcgfCAnYnVpbHRpbidcbiAgICByZWFkb25seSBidWRnZXRNczogbnVtYmVyXG4gICAgcmVhZG9ubHkgZGVib3VuY2VNczogbnVtYmVyXG4gICAgcmVhZG9ubHkgbWF4TGFnTXM6IG51bWJlclxuICAgIHJlYWRvbmx5IGFsbG93Q29hbGVzY2U6IGJvb2xlYW5cbiAgICByZWFkb25seSB5aWVsZFN0cmF0ZWd5PzogJ2Jhc2VsaW5lJyB8ICdpbnB1dFBlbmRpbmcnXG4gICAgcmVhZG9ubHkgcXVldWVNb2RlPzogJ2ZpZm8nIHwgJ2xhbmVzJ1xuICB9XG4gIHJlYWRvbmx5IGJhY2tsb2c6IHtcbiAgICByZWFkb25seSBwZW5kaW5nQ291bnQ6IG51bWJlclxuICAgIHJlYWRvbmx5IGFnZU1zPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgY29hbGVzY2VkQ291bnQ/OiBudW1iZXJcbiAgICByZWFkb25seSBjYW5jZWxlZENvdW50PzogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgYnVkZ2V0Pzoge1xuICAgIHJlYWRvbmx5IGJ1ZGdldE1zPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgc2xpY2VEdXJhdGlvbk1zPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgeWllbGRDb3VudD86IG51bWJlclxuICAgIHJlYWRvbmx5IHlpZWxkZWQ/OiBib29sZWFuXG4gICAgcmVhZG9ubHkgeWllbGRSZWFzb24/OiBUeG5MYW5lTm9uVXJnZW50WWllbGRSZWFzb25cbiAgfVxuICByZWFkb25seSBzdGFydmF0aW9uPzoge1xuICAgIHJlYWRvbmx5IHRyaWdnZXJlZD86IGJvb2xlYW5cbiAgICByZWFkb25seSByZWFzb24/OiBzdHJpbmdcbiAgfVxuICByZWFkb25seSByZWFzb25zOiBSZWFkb25seUFycmF5PFR4bkxhbmVFdmlkZW5jZVJlYXNvbj5cbn1cblxubGV0IG5leHRHbG9iYWxFdmVudFNlcSA9IDBcblxuZXhwb3J0IGNvbnN0IGNsZWFyUnVudGltZURlYnVnRXZlbnRTZXEgPSAoKTogdm9pZCA9PiB7XG4gIG5leHRHbG9iYWxFdmVudFNlcSA9IDBcbn1cblxuY29uc3QgbmV4dEV2ZW50U2VxID0gKCk6IG51bWJlciA9PiB7XG4gIG5leHRHbG9iYWxFdmVudFNlcSArPSAxXG4gIHJldHVybiBuZXh0R2xvYmFsRXZlbnRTZXFcbn1cblxuY29uc3QgbWFrZUV2ZW50SWQgPSAoaW5zdGFuY2VJZDogc3RyaW5nLCBldmVudFNlcTogbnVtYmVyKTogc3RyaW5nID0+IGAke2luc3RhbmNlSWR9OjplJHtldmVudFNlcX1gXG5cbnR5cGUgRG93bmdyYWRlUmVhc29uID0gSnNvbkRvd25ncmFkZVJlYXNvbiB8IEVycm9yRG93bmdyYWRlUmVhc29uXG5cbmNvbnN0IG1lcmdlRG93bmdyYWRlID0gKFxuICBjdXJyZW50OiBEb3duZ3JhZGVSZWFzb24gfCB1bmRlZmluZWQsXG4gIG5leHQ6IERvd25ncmFkZVJlYXNvbiB8IHVuZGVmaW5lZCxcbik6IERvd25ncmFkZVJlYXNvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghY3VycmVudCkgcmV0dXJuIG5leHRcbiAgaWYgKCFuZXh0KSByZXR1cm4gY3VycmVudFxuICBpZiAoY3VycmVudCA9PT0gJ25vbl9zZXJpYWxpemFibGUnIHx8IG5leHQgPT09ICdub25fc2VyaWFsaXphYmxlJykgcmV0dXJuICdub25fc2VyaWFsaXphYmxlJ1xuICBpZiAoY3VycmVudCA9PT0gJ292ZXJzaXplZCcgfHwgbmV4dCA9PT0gJ292ZXJzaXplZCcpIHJldHVybiAnb3ZlcnNpemVkJ1xuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbi8vIEluIGJyb3dzZXJzLCB0byByZWR1Y2UgZHVwbGljYXRlZCBub2lzZSBjYXVzZWQgYnkgUmVhY3QgU3RyaWN0TW9kZSwgZXRjLixcbi8vIGRlLWR1cGxpY2F0ZSBsaWZlY3ljbGU6ZXJyb3IgYW5kIGRpYWdub3N0aWMgZXZlbnRzOiBwcmludCB0aGUgc2FtZSBtb2R1bGVJZCtwYXlsb2FkIG9ubHkgb25jZS5cbmNvbnN0IGJyb3dzZXJMaWZlY3ljbGVTZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbmNvbnN0IGJyb3dzZXJEaWFnbm9zdGljU2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbi8vIEFsaWduIHRyYWNlOnJlYWN0LXJlbmRlciBldmVudHMgd2l0aCB0aGUgbW9zdCByZWNlbnQgc3RhdGU6dXBkYXRlIHR4biAoVUktb25seSBhc3NvY2lhdGlvbikuXG5jb25zdCBsYXN0VHhuQnlJbnN0YW5jZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHR4bklkOiBzdHJpbmc7IHJlYWRvbmx5IHR4blNlcTogbnVtYmVyIH0+KClcblxuLy8gdHJhY2U6cmVhY3QtcmVuZGVyIC8gdHJhY2U6cmVhY3Qtc2VsZWN0b3IgbWF5IGVudGVyIHRoZSBzaW5rIGJlZm9yZSBzdGF0ZTp1cGRhdGUgKHJlb3JkZXJpbmcgZHVlIHRvIGNvbmN1cnJlbmN5L3NjaGVkdWxpbmcpLlxuLy8gVG8gcHJvdmlkZSB1c2FibGUgdHhuIGFuY2hvcnMgaW4gRGV2dG9vbHMvVUksIHdlIGFsbG93IGEgb25lLXRpbWUgYmFja2ZpbGwgZm9yIHJlZnMgbWlzc2luZyB0eG4gZmllbGRzLlxuY29uc3QgcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8UnVudGltZURlYnVnRXZlbnRSZWY+PigpXG5cbmNvbnN0IGVucXVldWVQZW5kaW5nVHhuQWxpZ25tZW50ID0gKGluc3RhbmNlSWQ6IHN0cmluZywgcmVmOiBSdW50aW1lRGVidWdFdmVudFJlZik6IHZvaWQgPT4ge1xuICBjb25zdCBsaXN0ID0gcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UuZ2V0KGluc3RhbmNlSWQpXG4gIGlmICghbGlzdCkge1xuICAgIHBlbmRpbmdUeG5BbGlnbm1lbnRCeUluc3RhbmNlLnNldChpbnN0YW5jZUlkLCBbcmVmXSlcbiAgICByZXR1cm5cbiAgfVxuICBsaXN0LnB1c2gocmVmKVxuICBpZiAobGlzdC5sZW5ndGggPiA2NCkge1xuICAgIGxpc3Quc2hpZnQoKVxuICB9XG59XG5cbmNvbnN0IGJhY2tmaWxsUGVuZGluZ1R4bkFsaWdubWVudCA9IChcbiAgaW5zdGFuY2VJZDogc3RyaW5nLFxuICB0eG46IHsgcmVhZG9ubHkgdHhuSWQ6IHN0cmluZzsgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXIgfSxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwZW5kaW5nID0gcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UuZ2V0KGluc3RhbmNlSWQpXG4gIGlmICghcGVuZGluZyB8fCBwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHBlbmRpbmdUeG5BbGlnbm1lbnRCeUluc3RhbmNlLmRlbGV0ZShpbnN0YW5jZUlkKVxuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCByZWYgb2YgcGVuZGluZykge1xuICAgIGNvbnN0IGFueVJlZjogYW55ID0gcmVmIGFzIGFueVxuICAgIGlmIChhbnlSZWYudHhuSWQgPT0gbnVsbCkge1xuICAgICAgYW55UmVmLnR4bklkID0gdHhuLnR4bklkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgYW55UmVmLnR4blNlcSAhPT0gJ251bWJlcicgfHwgYW55UmVmLnR4blNlcSA8PSAwKSB7XG4gICAgICBhbnlSZWYudHhuU2VxID0gdHhuLnR4blNlcVxuICAgIH1cbiAgfVxuXG4gIHBlbmRpbmdUeG5BbGlnbm1lbnRCeUluc3RhbmNlLmRlbGV0ZShpbnN0YW5jZUlkKVxufVxuXG5jb25zdCBsaWZlY3ljbGVFcnJvckxvZyA9IChldmVudDogRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJyB9PikgPT4ge1xuICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICBjb25zdCBjYXVzZVByZXR0eSA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDYXVzZS5wcmV0dHkoZXZlbnQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHtcbiAgICAgICAgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXZlbnQuY2F1c2UsIG51bGwsIDIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhldmVudC5jYXVzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0pKClcblxuICBjb25zdCBtZXNzYWdlID0gYFtMb2dpeF1bbW9kdWxlPSR7bW9kdWxlSWR9XSBsaWZlY3ljbGU6ZXJyb3JcXG4ke2NhdXNlUHJldHR5fWBcblxuICByZXR1cm4gRWZmZWN0LmxvZ0Vycm9yKG1lc3NhZ2UpLnBpcGUoXG4gICAgRWZmZWN0LmFubm90YXRlTG9ncyh7XG4gICAgICAnbG9naXgubW9kdWxlSWQnOiBtb2R1bGVJZCxcbiAgICAgICdsb2dpeC5ldmVudCc6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgJ2xvZ2l4LmNhdXNlJzogY2F1c2VQcmV0dHksXG4gICAgfSksXG4gIClcbn1cblxuY29uc3QgZGlhZ25vc3RpY0xvZyA9IChldmVudDogRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnZGlhZ25vc3RpYycgfT4pID0+IHtcbiAgY29uc3QgbW9kdWxlSWQgPSBldmVudC5tb2R1bGVJZCA/PyAndW5rbm93bidcbiAgY29uc3QgaGVhZGVyID0gYFtMb2dpeF1bbW9kdWxlPSR7bW9kdWxlSWR9XSBkaWFnbm9zdGljKCR7ZXZlbnQuc2V2ZXJpdHl9KWBcbiAgY29uc3QgZGV0YWlsID0gYGNvZGU9JHtldmVudC5jb2RlfSBtZXNzYWdlPSR7ZXZlbnQubWVzc2FnZX0ke1xuICAgIGV2ZW50LmFjdGlvblRhZyA/IGAgYWN0aW9uPSR7ZXZlbnQuYWN0aW9uVGFnfWAgOiAnJ1xuICB9JHtldmVudC5oaW50ID8gYFxcbmhpbnQ6ICR7ZXZlbnQuaGludH1gIDogJyd9YFxuICBjb25zdCBtc2cgPSBgJHtoZWFkZXJ9XFxuJHtkZXRhaWx9YFxuXG4gIGNvbnN0IGJhc2UgPVxuICAgIGV2ZW50LnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgID8gRWZmZWN0LmxvZ1dhcm5pbmcobXNnKVxuICAgICAgOiBldmVudC5zZXZlcml0eSA9PT0gJ2luZm8nXG4gICAgICAgID8gRWZmZWN0LmxvZ0luZm8obXNnKVxuICAgICAgICA6IEVmZmVjdC5sb2dFcnJvcihtc2cpXG5cbiAgY29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICdsb2dpeC5tb2R1bGVJZCc6IG1vZHVsZUlkLFxuICAgICdsb2dpeC5ldmVudCc6IGBkaWFnbm9zdGljKCR7ZXZlbnQuc2V2ZXJpdHl9KWAsXG4gICAgJ2xvZ2l4LmRpYWdub3N0aWMuY29kZSc6IGV2ZW50LmNvZGUsXG4gICAgJ2xvZ2l4LmRpYWdub3N0aWMubWVzc2FnZSc6IGV2ZW50Lm1lc3NhZ2UsXG4gIH1cbiAgaWYgKGV2ZW50LmhpbnQpIHtcbiAgICBhbm5vdGF0aW9uc1snbG9naXguZGlhZ25vc3RpYy5oaW50J10gPSBldmVudC5oaW50XG4gIH1cbiAgaWYgKGV2ZW50LmFjdGlvblRhZykge1xuICAgIGFubm90YXRpb25zWydsb2dpeC5kaWFnbm9zdGljLmFjdGlvblRhZyddID0gZXZlbnQuYWN0aW9uVGFnXG4gIH1cblxuICByZXR1cm4gYmFzZS5waXBlKEVmZmVjdC5hbm5vdGF0ZUxvZ3MoYW5ub3RhdGlvbnMpKVxufVxuXG4vKipcbiAqIERlZmF1bHQgTGF5ZXIgY29tcG9zaXRpb24gYmFzZWQgb24gRmliZXJSZWYuY3VycmVudERlYnVnU2lua3M6XG4gKiAtIFVzZXMgTGF5ZXIubG9jYWxseVNjb3BlZCB0byBpbmplY3QgRGVidWcgc2lua3MgdmlhIEZpYmVyUmVmIHN0YXRlLlxuICogLSBBdm9pZHMgbWlzdXNpbmcgRmliZXJSZWYgYXMgYSBDb250ZXh0LlRhZy5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vb3BMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFtdKVxuXG4vKipcbiAqIGVycm9yT25seUxheWVyXHVGRjFBXG4gKiAtIERlZmF1bHQgRGVidWdTaW5rIGltcGxlbWVudGF0aW9uIHRoYXQgb25seSBjYXJlcyBhYm91dCBsaWZlY3ljbGU6ZXJyb3IgZXZlbnRzLlxuICogLSBTdWl0YWJsZSBhcyBhIFwibWluaW11bSBvYnNlcnZhYmlsaXR5XCIgbGF5ZXIgc28gZmF0YWwgZXJyb3JzIGRvbid0IHNpbGVudGx5IGRpc2FwcGVhci5cbiAqIC0gT3RoZXIgZXZlbnRzIChtb2R1bGU6aW5pdC9kZXN0cm95LCBhY3Rpb246ZGlzcGF0Y2gsIHN0YXRlOnVwZGF0ZSkgYXJlIG5vdCByZWNvcmRlZCBieSBkZWZhdWx0LlxuICovXG5jb25zdCBlcnJvck9ubHlTaW5rOiBTaW5rID0ge1xuICByZWNvcmQ6IChldmVudDogRXZlbnQpID0+XG4gICAgZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgID8gbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICA6IGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJyAmJiBldmVudC5zZXZlcml0eSAhPT0gJ2luZm8nXG4gICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgOiBFZmZlY3Qudm9pZCxcbn1cblxuZXhwb3J0IGNvbnN0IGVycm9yT25seUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2Vycm9yT25seVNpbmtdKVxuXG5leHBvcnQgY29uc3QgaXNFcnJvck9ubHlPbmx5U2lua3MgPSAoc2lua3M6IFJlYWRvbmx5QXJyYXk8U2luaz4pOiBib29sZWFuID0+IHNpbmtzLmxlbmd0aCA9PT0gMSAmJiBzaW5rc1swXSA9PT0gZXJyb3JPbmx5U2lua1xuXG4vKipcbiAqIGNvbnNvbGVMYXllclx1RkYxQVxuICogLSBGdWxsIGRlYnVnIGxheWVyIHRoYXQgbG9ncyBhbGwgRGVidWcgZXZlbnRzIHZpYSBFZmZlY3QgbG9ncyAobG9nZm10IC8gc3RydWN0dXJlZCkuXG4gKiAtIFN1aXRhYmxlIGFzIGFuIG9ic2VydmFiaWxpdHkgbGF5ZXIgZm9yIGdlbmVyYWwgZW52aXJvbm1lbnRzIChOb2RlIC8gdGVzdHMpLlxuICovXG5jb25zdCBjb25zb2xlU2luazogU2luayA9IHtcbiAgcmVjb3JkOiAoZXZlbnQ6IEV2ZW50KSA9PlxuICAgIGV2ZW50LnR5cGUgPT09ICdsaWZlY3ljbGU6ZXJyb3InXG4gICAgICA/IGxpZmVjeWNsZUVycm9yTG9nKGV2ZW50KVxuICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYydcbiAgICAgICAgPyBkaWFnbm9zdGljTG9nKGV2ZW50KVxuICAgICAgICA6IEVmZmVjdC5sb2dEZWJ1Zyh7IGRlYnVnRXZlbnQ6IGV2ZW50IH0pLFxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2NvbnNvbGVTaW5rXSlcblxuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG4vLyBTaGFyZWQgYnJvd3NlciBjb25zb2xlIHJlbmRlcmluZyBsb2dpYyB1c2VkIGJ5IHRoZSBkZWZhdWx0IERlYnVnU2luayBhbmQgYnJvd3NlckNvbnNvbGVMYXllci5cbmNvbnN0IHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PiB7XG4gIC8vIHRyYWNlOiogZXZlbnRzOiBzaG93biBhcyBzZXBhcmF0ZSBncm91cHMgaW4gYnJvd3NlcnMgZm9yIFBsYXlncm91bmQgLyBEZXZUb29scyBvYnNlcnZhdGlvbi5cbiAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJyAmJiAoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgY29uc3QgbW9kdWxlSWQgPSAoZXZlbnQgYXMgYW55KS5tb2R1bGVJZCA/PyAndW5rbm93bidcbiAgICBjb25zdCB0eXBlID0gKGV2ZW50IGFzIGFueSkudHlwZVxuXG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAnJWNbTG9naXhdJWMgdHJhY2UgJWMnICsgbW9kdWxlSWQgKyAnJWMgJyArIFN0cmluZyh0eXBlKSxcbiAgICAgICAgJ2NvbG9yOiM2YjcyODA7Zm9udC13ZWlnaHQ6Ym9sZCcsIC8vIHRhZ1xuICAgICAgICAnY29sb3I6IzNiODJmNicsIC8vIGxhYmVsXG4gICAgICAgICdjb2xvcjojOWNhM2FmJywgLy8gbW9kdWxlIGlkXG4gICAgICAgICdjb2xvcjojNmI3MjgwJywgLy8gdHlwZVxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gIH1cblxuICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcicpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGNhdXNlUHJldHR5ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBDYXVzZS5wcmV0dHkoZXZlbnQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGV2ZW50LmNhdXNlLCBudWxsLCAyKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGV2ZW50LmNhdXNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7Y2F1c2VQcmV0dHl9YFxuICAgIGlmIChicm93c2VyTGlmZWN5Y2xlU2Vlbi5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuICAgIGJyb3dzZXJMaWZlY3ljbGVTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyBsaWZlY3ljbGU6ZXJyb3IgJWMnICsgbW9kdWxlSWQsXG4gICAgICAgICdjb2xvcjojZWY0NDQ0O2ZvbnQtd2VpZ2h0OmJvbGQnLCAvLyB0YWdcbiAgICAgICAgJ2NvbG9yOiNlZjQ0NDQnLCAvLyBsYWJlbFxuICAgICAgICAnY29sb3I6IzljYTNhZicsIC8vIG1vZHVsZSBpZFxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2F1c2VQcmV0dHkpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIGlmIChldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGRldGFpbCA9IGBjb2RlPSR7ZXZlbnQuY29kZX0gbWVzc2FnZT0ke2V2ZW50Lm1lc3NhZ2V9JHtcbiAgICAgIGV2ZW50LmFjdGlvblRhZyA/IGAgYWN0aW9uPSR7ZXZlbnQuYWN0aW9uVGFnfWAgOiAnJ1xuICAgIH0ke2V2ZW50LmhpbnQgPyBgXFxuaGludDogJHtldmVudC5oaW50fWAgOiAnJ31gXG5cbiAgICBjb25zdCBjb2xvciA9XG4gICAgICBldmVudC5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnID8gJ2NvbG9yOiNkOTc3MDYnIDogZXZlbnQuc2V2ZXJpdHkgPT09ICdpbmZvJyA/ICdjb2xvcjojM2I4MmY2JyA6ICdjb2xvcjojZWY0NDQ0J1xuXG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgZXZlbnQuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJ1xuICAgICAgICA/ICdkaWFnbm9zdGljKHdhcm5pbmcpJ1xuICAgICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSAnaW5mbydcbiAgICAgICAgICA/ICdkaWFnbm9zdGljKGluZm8pJ1xuICAgICAgICAgIDogJ2RpYWdub3N0aWMoZXJyb3IpJ1xuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7ZXZlbnQuY29kZX18JHtldmVudC5tZXNzYWdlfWBcbiAgICBpZiAoYnJvd3NlckRpYWdub3N0aWNTZWVuLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG4gICAgYnJvd3NlckRpYWdub3N0aWNTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyAnICsgbGFiZWwgKyAnJWMgbW9kdWxlPScgKyBtb2R1bGVJZCxcbiAgICAgICAgJ2NvbG9yOiM2YjcyODA7Zm9udC13ZWlnaHQ6Ym9sZCcsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICAnY29sb3I6IzljYTNhZicsXG4gICAgICApXG4gICAgICBpZiAoZXZlbnQuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oZGV0YWlsKVxuICAgICAgfSBlbHNlIGlmIChldmVudC5zZXZlcml0eSA9PT0gJ2luZm8nKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuaW5mbyhkZXRhaWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGRldGFpbClcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwRW5kKClcbiAgICB9KVxuICB9XG5cbiAgLy8gT3RoZXIgZXZlbnRzIGFyZSBub3QgcHJpbnRlZCB0byB0aGUgYnJvd3NlciBjb25zb2xlIGJ5IGRlZmF1bHQgdG8gYXZvaWQgYmVpbmcgdG9vIG5vaXN5IGR1cmluZyBkZXZlbG9wbWVudC5cbiAgLy8gRm9yIGludGVybmFsIGRlYnVnIGV2ZW50cywgdXNlIGEgY3VzdG9tIERlYnVnIHNpbmsgb3IgdXNlIGNvbnNvbGVMYXllciBpbiBOb2RlLlxuICByZXR1cm4gRWZmZWN0LnZvaWRcbn1cblxuLyoqXG4gKiBCcm93c2VyIGNvbnNvbGUgZGVidWcgbGF5ZXI6XG4gKiAtIEluIGJyb3dzZXJzLCB1c2VzIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQgKyBjb2xvcmVkIGxhYmVscyB0byBzaW11bGF0ZSBwcmV0dHkgbG9nZ2VyIGdyb3VwaW5nLlxuICogLSBJbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMsIGZhbGxzIGJhY2sgdG8gY29uc29sZUxheWVyJ3MgRWZmZWN0IGxvZ2dpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmNvbnN0IGJyb3dzZXJDb25zb2xlU2luazogU2luayA9IHtcbiAgcmVjb3JkOiAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXIpIHtcbiAgICAgIC8vIE5vbi1icm93c2VyOiBmYWxsIGJhY2sgdG8gY29uc29sZUxheWVyIGJlaGF2aW9yIChFZmZlY3QubG9nKikuXG4gICAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgICAgPyBsaWZlY3ljbGVFcnJvckxvZyhldmVudClcbiAgICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYydcbiAgICAgICAgICA/IGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoeyBkZWJ1Z0V2ZW50OiBldmVudCB9KVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJCcm93c2VyQ29uc29sZUV2ZW50KGV2ZW50KVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlckNvbnNvbGVMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFticm93c2VyQ29uc29sZVNpbmtdKVxuXG4vKipcbiAqIEJyb3dzZXIgZGlhZ25vc3RpYy1vbmx5IGRlYnVnIGxheWVyOlxuICogLSBJbiBicm93c2VycywgcHJpbnRzIG9ubHkgbGlmZWN5Y2xlOmVycm9yICsgZGlhZ25vc3RpYyh3YXJuaW5nL2Vycm9yKSB2aWEgY29uc29sZS5ncm91cENvbGxhcHNlZC5cbiAqIC0gRHJvcHMgdHJhY2U6KiBhbmQgb3RoZXIgaGlnaC1mcmVxdWVuY3kgZXZlbnRzIGZyb20gdGhlIGJyb3dzZXIgY29uc29sZSAodXNlIERldnRvb2xzSHViIGluc3RlYWQpLlxuICogLSBJbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMsIGJlaGF2ZXMgbGlrZSBlcnJvck9ubHlTaW5rIChFZmZlY3QubG9nKikuXG4gKi9cbmNvbnN0IGJyb3dzZXJEaWFnbm9zdGljQ29uc29sZVNpbms6IFNpbmsgPSB7XG4gIHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgICAgPyBsaWZlY3ljbGVFcnJvckxvZyhldmVudClcbiAgICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycgJiYgZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJ1xuICAgICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgICA6IEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09ICdsaWZlY3ljbGU6ZXJyb3InIHx8IChldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycgJiYgZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJylcbiAgICAgID8gcmVuZGVyQnJvd3NlckNvbnNvbGVFdmVudChldmVudClcbiAgICAgIDogRWZmZWN0LnZvaWRcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IGJyb3dzZXJEaWFnbm9zdGljQ29uc29sZUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2Jyb3dzZXJEaWFnbm9zdGljQ29uc29sZVNpbmtdKVxuXG4vKipcbiAqIEJyb3dzZXItZnJpZW5kbHkgTG9nZ2VyIGxheWVyOiByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIgd2l0aCBFZmZlY3QncyBwcmV0dHkgbG9nZ2VyIChicm93c2VyIG1vZGUpLlxuICogLSBBdm9pZHMgaGFuZC13cml0dGVuIGNvbnNvbGUgc3R5bGVzOyByZXVzZXMgRWZmZWN0J3MgY29sb3JlZC9ncm91cGVkIGZvcm1hdHRpbmcuXG4gKiAtIFNhZmVseSBkZWdyYWRlcyB0byB0aGUgZGVmYXVsdCBsb2dnZXIgaW4gc2VydmVyIGVudmlyb25tZW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJyb3dzZXJQcmV0dHlMb2dnZXJMYXllciA9IExvZ2dlci5yZXBsYWNlKFxuICBMb2dnZXIuZGVmYXVsdExvZ2dlcixcbiAgTG9nZ2VyLnByZXR0eUxvZ2dlcih7IG1vZGU6ICdicm93c2VyJywgY29sb3JzOiB0cnVlIH0pLFxuKVxuXG4vKipcbiAqIGRlZmF1bHRMYXllclx1RkYxQVxuICogLSBQdWJsaWMgZGVmYXVsdCBsYXllcjsgY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gZXJyb3JPbmx5TGF5ZXIuXG4gKiAtIFJlY29yZHMgbGlmZWN5Y2xlOmVycm9yIG9ubHksIGF2b2lkaW5nIGEgbGFyZ2Ugdm9sdW1lIG9mIGFjdGlvbi9zdGF0ZSBsb2dzIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGF5ZXIgPSBlcnJvck9ubHlMYXllclxuXG5leHBvcnQgY29uc3QgcmVjb3JkID0gKGV2ZW50OiBFdmVudCkgPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNpbmtzID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50RGVidWdTaW5rcylcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvZHVjdGlvbiBkZWZhdWx0IGluc3RhbGxzIGVycm9yT25seUxheWVyIChzaW5rcz0xKS5cbiAgICAvLyBBdm9pZCBwYXlpbmcgZGlhZ25vc3RpY3MgRmliZXJSZWYgKyBlbnJpY2htZW50IGNvc3RzIGZvciBoaWdoLWZyZXF1ZW5jeSBldmVudHMgdGhhdCBhcmUgYWx3YXlzIGRyb3BwZWQgYnkgZXJyb3JPbmx5LlxuICAgIGlmIChpc0Vycm9yT25seU9ubHlTaW5rcyhzaW5rcykpIHtcbiAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJykge1xuICAgICAgICB5aWVsZCogbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJykge1xuICAgICAgICBpZiAoZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJykge1xuICAgICAgICAgIHlpZWxkKiBkaWFnbm9zdGljTG9nKGV2ZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgeWllbGQqIEVmZmVjdC52b2lkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHdoZW4gbm8gc2lua3MgYXJlIGluc3RhbGxlZCwgb25seSBhIHNtYWxsIHN1YnNldCBvZiBldmVudHMgYXJlIGV2ZXIgc3VyZmFjZWQuXG4gICAgLy8gQXZvaWQgcGF5aW5nIHBlci1ldmVudCBGaWJlclJlZiArIGVucmljaG1lbnQgY29zdHMgZm9yIGhpZ2gtZnJlcXVlbmN5IGV2ZW50cyBsaWtlIHN0YXRlOnVwZGF0ZS5cbiAgICBpZiAoc2lua3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJyB8fCBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICAgICAgICB5aWVsZCogcmVuZGVyQnJvd3NlckNvbnNvbGVFdmVudChldmVudClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJykge1xuICAgICAgICB5aWVsZCogbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJykge1xuICAgICAgICB5aWVsZCogZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVucmljaGVkID0gZXZlbnQgYXMgRXZlbnRcblxuICAgIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuXG4gICAgLy8gRW5yaWNoIERlYnVnLkV2ZW50IHdpdGggYmFzaWMgZmllbGRzIChlbmFibGVkIG9ubHkgd2hlbiBkaWFnbm9zdGljc0xldmVsIT1vZmYpOlxuICAgIC8vIC0gdGltZXN0YW1wOiBmb3IgRGV2dG9vbHMvVGltZWxpbmUvT3ZlcnZpZXcgdGltZSBhZ2dyZWdhdGlvbjsgYXZvaWRzIFVJLXNpZGUgXCJmaXJzdCBvYnNlcnZlZCB0aW1lXCIgZGlzdG9ydGlvbi5cbiAgICAvLyAtIHJ1bnRpbWVMYWJlbDogZnJvbSBGaWJlclJlZiBmb3IgZ3JvdXBpbmcgYnkgcnVudGltZSAoaW5qZWN0ZWQgb25seSB3aGVuIG5vdCBhbHJlYWR5IHByb3ZpZGVkIGJ5IHRoZSBldmVudCkuXG4gICAgbGV0IG5vdzogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgY29uc3QgZ2V0Tm93ID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAobm93ID09PSB1bmRlZmluZWQpIG5vdyA9IERhdGUubm93KClcbiAgICAgIHJldHVybiBub3dcbiAgICB9XG5cbiAgICAvLyBkaWFnbm9zdGljcz1vZmY6IGtlZXAgbmVhci16ZXJvIGNvc3Q7IGRvIG5vdCBhZGQgdGltZXN0YW1wIGZvciBoaWdoLWZyZXF1ZW5jeSBldmVudHMgKGF2b2lkIGV4dHJhIERhdGUubm93KCkpLlxuICAgIC8vIExvdy1mcmVxdWVuY3kgZXZlbnRzIChsaWZlY3ljbGU6ZXJyb3IvZGlhZ25vc3RpYykgbWF5IHN0aWxsIGdldCB0aW1lc3RhbXAgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgaWYgKFxuICAgICAgZW5yaWNoZWQudGltZXN0YW1wID09PSB1bmRlZmluZWQgJiZcbiAgICAgIChkaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJyB8fCBlbnJpY2hlZC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJyB8fCBlbnJpY2hlZC50eXBlID09PSAnZGlhZ25vc3RpYycpXG4gICAgKSB7XG4gICAgICA7KGVucmljaGVkIGFzIGFueSkudGltZXN0YW1wID0gZ2V0Tm93KClcbiAgICB9XG4gICAgaWYgKGRpYWdub3N0aWNzTGV2ZWwgIT09ICdvZmYnICYmIGVucmljaGVkLnJ1bnRpbWVMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBydW50aW1lTGFiZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnRSdW50aW1lTGFiZWwpXG4gICAgICBpZiAocnVudGltZUxhYmVsKSB7XG4gICAgICAgIDsoZW5yaWNoZWQgYXMgYW55KS5ydW50aW1lTGFiZWwgPSBydW50aW1lTGFiZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW5yaWNoZWQudHlwZSA9PT0gJ2RpYWdub3N0aWMnICYmIChlbnJpY2hlZCBhcyBhbnkpLnR4bklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHR4bklkID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50VHhuSWQpXG4gICAgICBpZiAodHhuSWQpIHtcbiAgICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLnR4bklkID0gdHhuSWRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbGlua0lkIGlzIG1lYW5pbmdmdWwgb25seSBmb3IgRWZmZWN0T3AgZXZlbnRzOiBhdm9pZCBleHRyYSBGaWJlclJlZiByZWFkcyBvbiBoaWdoLWZyZXF1ZW5jeSBldmVudHMgKHN0YXRlOnVwZGF0ZSwgZXRjLikuXG4gICAgaWYgKFxuICAgICAgZGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicgJiZcbiAgICAgIChlbnJpY2hlZCBhcyBhbnkpLnR5cGUgPT09ICd0cmFjZTplZmZlY3RvcCcgJiZcbiAgICAgIChlbnJpY2hlZCBhcyBhbnkpLmxpbmtJZCA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBsaW5rSWQgPSB5aWVsZCogRmliZXJSZWYuZ2V0KEVmZmVjdE9wQ29yZS5jdXJyZW50TGlua0lkKVxuICAgICAgaWYgKGxpbmtJZCkge1xuICAgICAgICA7KGVucmljaGVkIGFzIGFueSkubGlua0lkID0gbGlua0lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgeWllbGQqIHNpbmtzWzBdIS5yZWNvcmQoZW5yaWNoZWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmZvckVhY2goc2lua3MsIChzaW5rKSA9PiBzaW5rLnJlY29yZChlbnJpY2hlZCksIHsgZGlzY2FyZDogdHJ1ZSB9KVxuICB9KVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgaW50ZXJuYWwgRGVidWcuRXZlbnQgaW50byBSdW50aW1lRGVidWdFdmVudFJlZjpcbiAqIC0gQWxsb3dzIERldnRvb2xzIC8gUnVudGltZSB0byBjb25zdW1lIERlYnVnIGV2ZW50cyB1bmlmb3JtbHkuXG4gKiAtIERvZXMgbm90IGNoYW5nZSBEZWJ1Z1NpbmsgYmVoYXZpb3I7IHByb3ZpZGVzIGEgc3RydWN0dXJlZCB2aWV3IG9ubHkuXG4gKi9cbmV4cG9ydCBjb25zdCB0b1J1bnRpbWVEZWJ1Z0V2ZW50UmVmID0gKFxuICBldmVudDogRXZlbnQsXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgICByZWFkb25seSBldmVudFNlcT86IG51bWJlclxuICAgIHJlYWRvbmx5IHJlc29sdmVDb252ZXJnZVN0YXRpY0lyPzogKHN0YXRpY0lyRGlnZXN0OiBzdHJpbmcpID0+IENvbnZlcmdlU3RhdGljSXJFeHBvcnQgfCB1bmRlZmluZWRcbiAgICByZWFkb25seSBvbk1ldGFQcm9qZWN0aW9uPzogKHByb2plY3Rpb246IHtcbiAgICAgIHJlYWRvbmx5IHN0YXRzOiBKc29uVmFsdWVQcm9qZWN0aW9uU3RhdHNcbiAgICAgIHJlYWRvbmx5IGRvd25ncmFkZT86IEpzb25Eb3duZ3JhZGVSZWFzb25cbiAgICB9KSA9PiB2b2lkXG4gIH0sXG4pOiBSdW50aW1lRGVidWdFdmVudFJlZiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdmdWxsJ1xuICBpZiAoZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBpc0xpZ2h0TGlrZSA9IGRpYWdub3N0aWNzTGV2ZWwgPT09ICdsaWdodCcgfHwgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ3NhbXBsZWQnXG5cbiAgY29uc3QgdGltZXN0YW1wID1cbiAgICB0eXBlb2YgZXZlbnQudGltZXN0YW1wID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZXZlbnQudGltZXN0YW1wKSA/IGV2ZW50LnRpbWVzdGFtcCA6IERhdGUubm93KClcblxuICBjb25zdCBtb2R1bGVJZFJhdyA9IChldmVudCBhcyBhbnkpLm1vZHVsZUlkXG4gIGNvbnN0IG1vZHVsZUlkID0gdHlwZW9mIG1vZHVsZUlkUmF3ID09PSAnc3RyaW5nJyAmJiBtb2R1bGVJZFJhdy5sZW5ndGggPiAwID8gbW9kdWxlSWRSYXcgOiAndW5rbm93bidcblxuICBjb25zdCBpbnN0YW5jZUlkUmF3ID0gKGV2ZW50IGFzIGFueSkuaW5zdGFuY2VJZFxuICBjb25zdCBpbnN0YW5jZUlkID0gdHlwZW9mIGluc3RhbmNlSWRSYXcgPT09ICdzdHJpbmcnICYmIGluc3RhbmNlSWRSYXcubGVuZ3RoID4gMCA/IGluc3RhbmNlSWRSYXcgOiAndW5rbm93bidcblxuICBjb25zdCBydW50aW1lTGFiZWxSYXcgPSAoZXZlbnQgYXMgYW55KS5ydW50aW1lTGFiZWxcbiAgY29uc3QgcnVudGltZUxhYmVsID0gdHlwZW9mIHJ1bnRpbWVMYWJlbFJhdyA9PT0gJ3N0cmluZycgJiYgcnVudGltZUxhYmVsUmF3Lmxlbmd0aCA+IDAgPyBydW50aW1lTGFiZWxSYXcgOiB1bmRlZmluZWRcblxuICBjb25zdCB0eG5TZXFSYXcgPSAoZXZlbnQgYXMgYW55KS50eG5TZXFcbiAgY29uc3QgdHhuU2VxID1cbiAgICB0eXBlb2YgdHhuU2VxUmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodHhuU2VxUmF3KSAmJiB0eG5TZXFSYXcgPj0gMCA/IE1hdGguZmxvb3IodHhuU2VxUmF3KSA6IDBcblxuICBjb25zdCB0eG5JZFJhdyA9IChldmVudCBhcyBhbnkpLnR4bklkXG4gIGNvbnN0IHR4bklkID1cbiAgICB0eXBlb2YgdHhuSWRSYXcgPT09ICdzdHJpbmcnICYmIHR4bklkUmF3Lmxlbmd0aCA+IDBcbiAgICAgID8gdHhuSWRSYXdcbiAgICAgIDogdHhuU2VxID4gMFxuICAgICAgICA/IGAke2luc3RhbmNlSWR9Ojp0JHt0eG5TZXF9YFxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGxpbmtJZCA9ICgoKSA9PiB7XG4gICAgY29uc3QgbGlua0lkUmF3ID0gKGV2ZW50IGFzIGFueSkubGlua0lkXG4gICAgaWYgKHR5cGVvZiBsaW5rSWRSYXcgPT09ICdzdHJpbmcnICYmIGxpbmtJZFJhdy5sZW5ndGggPiAwKSByZXR1cm4gbGlua0lkUmF3XG5cbiAgICAvLyB0cmFjZToqOiBhbGxvdyBmYWxsYmFjayBleHRyYWN0aW9uIGZyb20gZGF0YS5tZXRhLmxpbmtJZCAoYXZvaWQgVUkgZGl2aW5nIGludG8gZGVlcCBtZXRhKS5cbiAgICBpZiAodHlwZW9mIChldmVudCBhcyBhbnkpLnR5cGUgIT09ICdzdHJpbmcnIHx8ICEoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgIGNvbnN0IG1ldGE6IGFueSA9IGRhdGE/Lm1ldGFcbiAgICBjb25zdCBsaW5rSWRGcm9tTWV0YSA9IG1ldGE/LmxpbmtJZFxuICAgIGlmICh0eXBlb2YgbGlua0lkRnJvbU1ldGEgPT09ICdzdHJpbmcnICYmIGxpbmtJZEZyb21NZXRhLmxlbmd0aCA+IDApIHJldHVybiBsaW5rSWRGcm9tTWV0YVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KSgpXG5cbiAgY29uc3QgZXZlbnRTZXFSYXcgPSBvcHRpb25zPy5ldmVudFNlcVxuICBjb25zdCBldmVudFNlcSA9XG4gICAgdHlwZW9mIGV2ZW50U2VxUmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZXZlbnRTZXFSYXcpICYmIGV2ZW50U2VxUmF3ID4gMFxuICAgICAgPyBNYXRoLmZsb29yKGV2ZW50U2VxUmF3KVxuICAgICAgOiBuZXh0RXZlbnRTZXEoKVxuICBjb25zdCBldmVudElkID0gbWFrZUV2ZW50SWQoaW5zdGFuY2VJZCwgZXZlbnRTZXEpXG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICBldmVudElkLFxuICAgIGV2ZW50U2VxLFxuICAgIG1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQsXG4gICAgcnVudGltZUxhYmVsLFxuICAgIHR4blNlcSxcbiAgICB0eG5JZCxcbiAgICBsaW5rSWQsXG4gICAgdGltZXN0YW1wLFxuICB9IGFzIGNvbnN0XG5cbiAgbGV0IGRvd25ncmFkZTogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgd2l0aERvd25ncmFkZSA9IChyZWY6IE9taXQ8UnVudGltZURlYnVnRXZlbnRSZWYsICdkb3duZ3JhZGUnPik6IFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmID0+IHtcbiAgICBpZiAoIWRvd25ncmFkZSkgcmV0dXJuIHJlZlxuICAgIHJldHVybiB7IC4uLnJlZiwgZG93bmdyYWRlOiB7IHJlYXNvbjogZG93bmdyYWRlIH0gfVxuICB9XG5cbiAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgY2FzZSAnbW9kdWxlOmluaXQnOlxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnbGlmZWN5Y2xlJyxcbiAgICAgICAgbGFiZWw6ICdtb2R1bGU6aW5pdCcsXG4gICAgICB9KVxuICAgIGNhc2UgJ21vZHVsZTpkZXN0cm95JzpcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2xpZmVjeWNsZScsXG4gICAgICAgIGxhYmVsOiAnbW9kdWxlOmRlc3Ryb3knLFxuICAgICAgfSlcbiAgICBjYXNlICdsaWZlY3ljbGU6cGhhc2UnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOnBoYXNlJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5uYW1lIH1cbiAgICAgICAgOiB7IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5uYW1lLCBwYXlsb2FkOiBlLnBheWxvYWQgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICAgICAgICBsYWJlbDogZS5uYW1lLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ2FjdGlvbjpkaXNwYXRjaCc6IHtcbiAgICAgIGNvbnN0IGFjdGlvbjogYW55ID0gKGV2ZW50IGFzIGFueSkuYWN0aW9uXG4gICAgICBjb25zdCBhY3Rpb25UYWdSYXcgPSAoZXZlbnQgYXMgYW55KS5hY3Rpb25UYWdcbiAgICAgIGNvbnN0IHRhZyA9IHR5cGVvZiBhY3Rpb25UYWdSYXcgPT09ICdzdHJpbmcnICYmIGFjdGlvblRhZ1Jhdy5sZW5ndGggPiAwID8gYWN0aW9uVGFnUmF3IDogKGFjdGlvbj8uX3RhZyA/PyBhY3Rpb24/LnR5cGUpXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyh0YWcgPz8gJ2FjdGlvbjpkaXNwYXRjaCcpXG4gICAgICBjb25zdCBsYWJlbE5vcm1hbGl6ZWQgPSBsYWJlbC5sZW5ndGggPiAwID8gbGFiZWwgOiAndW5rbm93bidcbiAgICAgIGNvbnN0IHVua25vd25BY3Rpb24gPSAoZXZlbnQgYXMgYW55KS51bmtub3duQWN0aW9uID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7IGFjdGlvblRhZzogbGFiZWxOb3JtYWxpemVkLCAuLi4odW5rbm93bkFjdGlvbiA/IHsgdW5rbm93bkFjdGlvbjogdHJ1ZSB9IDoge30pIH1cbiAgICAgICAgOiB7IGFjdGlvbiwgLi4uKHVua25vd25BY3Rpb24gPyB7IHVua25vd25BY3Rpb246IHRydWUgfSA6IHt9KSB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIGlmICh1bmtub3duQWN0aW9uKSB7XG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgJ3Vua25vd24nKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnYWN0aW9uJyxcbiAgICAgICAgbGFiZWw6IGxhYmVsTm9ybWFsaXplZCxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdzdGF0ZTp1cGRhdGUnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnc3RhdGU6dXBkYXRlJyB9PlxuXG4gICAgICBjb25zdCByZXNvbHZlRGlydHlTZXRSb290UGF0aHMgPSAoKTogUmVhZG9ubHlBcnJheTxKc29uVmFsdWU+IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IG9wdGlvbnM/LnJlc29sdmVDb252ZXJnZVN0YXRpY0lyXG4gICAgICAgIGlmICghcmVzb2x2ZSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IGRpZ2VzdCA9IGUuc3RhdGljSXJEaWdlc3RcbiAgICAgICAgaWYgKHR5cGVvZiBkaWdlc3QgIT09ICdzdHJpbmcnIHx8IGRpZ2VzdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBkaXJ0eVNldCA9IGUuZGlydHlTZXQgYXMgYW55XG4gICAgICAgIGlmICghZGlydHlTZXQgfHwgdHlwZW9mIGRpcnR5U2V0ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRpcnR5U2V0KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHJvb3RJZHMgPSBkaXJ0eVNldC5yb290SWRzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb290SWRzKSB8fCByb290SWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IGlyID0gcmVzb2x2ZShkaWdlc3QpIGFzIENvbnZlcmdlU3RhdGljSXJFeHBvcnQgfCB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgZmllbGRQYXRocyA9IChpciBhcyBhbnkpPy5maWVsZFBhdGhzIGFzIHVua25vd25cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkUGF0aHMpIHx8IGZpZWxkUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3Qgb3V0OiBBcnJheTxKc29uVmFsdWU+ID0gW11cbiAgICAgICAgZm9yIChjb25zdCByYXdJZCBvZiByb290SWRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByYXdJZCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0Zpbml0ZShyYXdJZCkpIGNvbnRpbnVlXG4gICAgICAgICAgY29uc3QgaWQgPSBNYXRoLmZsb29yKHJhd0lkKVxuICAgICAgICAgIGlmIChpZCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgY29uc3QgcGF0aCA9IChmaWVsZFBhdGhzIGFzIGFueSlbaWRdIGFzIHVua25vd25cbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkgfHwgcGF0aC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgICAgICAgaWYgKCFwYXRoLmV2ZXJ5KChzZWcpID0+IHR5cGVvZiBzZWcgPT09ICdzdHJpbmcnICYmIHNlZy5sZW5ndGggPiAwKSkgY29udGludWVcbiAgICAgICAgICBvdXQucHVzaChwYXRoIGFzIGFueSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXJ0eVNldFdpdGhSb290UGF0aHMgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCByb290UGF0aHMgPSByZXNvbHZlRGlydHlTZXRSb290UGF0aHMoKVxuICAgICAgICBpZiAoIXJvb3RQYXRocykgcmV0dXJuIGUuZGlydHlTZXRcbiAgICAgICAgY29uc3QgZGlydHlTZXQgPSBlLmRpcnR5U2V0IGFzIGFueVxuICAgICAgICBpZiAoIWRpcnR5U2V0IHx8IHR5cGVvZiBkaXJ0eVNldCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkaXJ0eVNldCkpIHJldHVybiBlLmRpcnR5U2V0XG4gICAgICAgIHJldHVybiB7IC4uLmRpcnR5U2V0LCByb290UGF0aHMgfVxuICAgICAgfSkoKVxuXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgICAgICAgZGlydHlTZXQ6IGRpcnR5U2V0V2l0aFJvb3RQYXRocyxcbiAgICAgICAgICAgIHBhdGNoQ291bnQ6IGUucGF0Y2hDb3VudCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWQ6IGUucGF0Y2hlc1RydW5jYXRlZCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWRSZWFzb246IGUucGF0Y2hlc1RydW5jYXRlZFJlYXNvbixcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBlLnN0YXRpY0lyRGlnZXN0LFxuICAgICAgICAgICAgY29tbWl0TW9kZTogZS5jb21taXRNb2RlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICBvcmlnaW5LaW5kOiBlLm9yaWdpbktpbmQsXG4gICAgICAgICAgICBvcmlnaW5OYW1lOiBlLm9yaWdpbk5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgICAgICAgZGlydHlTZXQ6IGRpcnR5U2V0V2l0aFJvb3RQYXRocyxcbiAgICAgICAgICAgIHBhdGNoQ291bnQ6IGUucGF0Y2hDb3VudCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWQ6IGUucGF0Y2hlc1RydW5jYXRlZCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWRSZWFzb246IGUucGF0Y2hlc1RydW5jYXRlZFJlYXNvbixcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBlLnN0YXRpY0lyRGlnZXN0LFxuICAgICAgICAgICAgY29tbWl0TW9kZTogZS5jb21taXRNb2RlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICBvcmlnaW5LaW5kOiBlLm9yaWdpbktpbmQsXG4gICAgICAgICAgICBvcmlnaW5OYW1lOiBlLm9yaWdpbk5hbWUsXG4gICAgICAgICAgICB0cmFpdFN1bW1hcnk6IGUudHJhaXRTdW1tYXJ5LFxuICAgICAgICAgICAgcmVwbGF5RXZlbnQ6IGUucmVwbGF5RXZlbnQsXG4gICAgICAgICAgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICBpZiAodHhuSWQpIHtcbiAgICAgICAgbGFzdFR4bkJ5SW5zdGFuY2Uuc2V0KGluc3RhbmNlSWQsIHsgdHhuSWQsIHR4blNlcSB9KVxuICAgICAgICBiYWNrZmlsbFBlbmRpbmdUeG5BbGlnbm1lbnQoaW5zdGFuY2VJZCwgeyB0eG5JZCwgdHhuU2VxIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdzdGF0ZScsXG4gICAgICAgIGxhYmVsOiAnc3RhdGU6dXBkYXRlJyxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdwcm9jZXNzOnN0YXJ0JzpcbiAgICBjYXNlICdwcm9jZXNzOnN0b3AnOlxuICAgIGNhc2UgJ3Byb2Nlc3M6cmVzdGFydCc6XG4gICAgY2FzZSAncHJvY2Vzczp0cmlnZ2VyJzpcbiAgICBjYXNlICdwcm9jZXNzOmRpc3BhdGNoJzpcbiAgICBjYXNlICdwcm9jZXNzOmVycm9yJzoge1xuICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8XG4gICAgICAgIEV2ZW50LFxuICAgICAgICB7XG4gICAgICAgICAgcmVhZG9ubHkgdHlwZTpcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6c3RhcnQnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOnN0b3AnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOnJlc3RhcnQnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOnRyaWdnZXInXG4gICAgICAgICAgICB8ICdwcm9jZXNzOmRpc3BhdGNoJ1xuICAgICAgICAgICAgfCAncHJvY2VzczplcnJvcidcbiAgICAgICAgfVxuICAgICAgPlxuXG4gICAgICBjb25zdCB0czIgPSB0eXBlb2YgZS50aW1lc3RhbXBNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGUudGltZXN0YW1wTXMpID8gZS50aW1lc3RhbXBNcyA6IHRpbWVzdGFtcFxuXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgIGlkZW50aXR5OiBlLmlkZW50aXR5LFxuICAgICAgICBzZXZlcml0eTogZS5zZXZlcml0eSxcbiAgICAgICAgZXZlbnRTZXE6IGUuZXZlbnRTZXEsXG4gICAgICAgIHRpbWVzdGFtcE1zOiBlLnRpbWVzdGFtcE1zLFxuICAgICAgICB0cmlnZ2VyOiBlLnRyaWdnZXIsXG4gICAgICAgIGRpc3BhdGNoOiBlLmRpc3BhdGNoLFxuICAgICAgICBlcnJvcjogZS5lcnJvcixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICBjb25zdCBlcnJvclN1bW1hcnkgPVxuICAgICAgICBlLnR5cGUgPT09ICdwcm9jZXNzOmVycm9yJyB8fCBlLnR5cGUgPT09ICdwcm9jZXNzOnJlc3RhcnQnXG4gICAgICAgICAgPyAoZS5lcnJvciBhcyBhbnkgYXMgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IHwgdW5kZWZpbmVkKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdGltZXN0YW1wOiB0czIsXG4gICAgICAgIGtpbmQ6ICdwcm9jZXNzJyxcbiAgICAgICAgbGFiZWw6IGUudHlwZSxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIGVycm9yU3VtbWFyeSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ2xpZmVjeWNsZTplcnJvcic6IHtcbiAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InIH0+XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoZS5jYXVzZSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgc3VtbWFyeS5kb3duZ3JhZGUpXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICA/IHsgdHlwZTogJ2xpZmVjeWNsZTplcnJvcicsIHBoYXNlOiBlLnBoYXNlLCBuYW1lOiBlLmhvb2sgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgICAgICAgcGhhc2U6IGUucGhhc2UsXG4gICAgICAgICAgICBuYW1lOiBlLmhvb2ssXG4gICAgICAgICAgICBob29rOiBlLmhvb2ssXG4gICAgICAgICAgICB0YXNrSWQ6IGUudGFza0lkLFxuICAgICAgICAgICAgb3JpZ2luOiBlLm9yaWdpbixcbiAgICAgICAgICAgIHR4blNlcTogZS50eG5TZXEsXG4gICAgICAgICAgICBvcFNlcTogZS5vcFNlcSxcbiAgICAgICAgICB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2xpZmVjeWNsZScsXG4gICAgICAgIGxhYmVsOiAnbGlmZWN5Y2xlOmVycm9yJyxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeS5lcnJvclN1bW1hcnksXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdkaWFnbm9zdGljJzoge1xuICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ2RpYWdub3N0aWMnIH0+XG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgIGNvZGU6IGUuY29kZSxcbiAgICAgICAgc2V2ZXJpdHk6IGUuc2V2ZXJpdHksXG4gICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgaGludDogZS5oaW50LFxuICAgICAgICBhY3Rpb25UYWc6IGUuYWN0aW9uVGFnLFxuICAgICAgICBraW5kOiBlLmtpbmQsXG4gICAgICAgIHRyaWdnZXI6IGUudHJpZ2dlcixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnZGlhZ25vc3RpYycsXG4gICAgICAgIGxhYmVsOiBlLmNvZGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKHR5cGVvZiBldmVudC50eXBlICE9PSAnc3RyaW5nJyB8fCAhZXZlbnQudHlwZS5zdGFydHNXaXRoKCd0cmFjZTonKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOnR4bi1sYW5lOiBzbGltIGV2aWRlbmNlIGZvciBUeG4gTGFuZXMgKGxhbmUvYmFja2xvZy9yZWFzb25zKSwgdXNlZCBmb3IgRGV2dG9vbHMgc3VtbWFyeSBhbmQgb2ZmbGluZSBleHBvcnQuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnR4bi1sYW5lJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IGV2aWRlbmNlID0gZGF0YT8uZXZpZGVuY2UgPz8gZGF0YVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShldmlkZW5jZSlcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIGNvbnN0IGxhYmVsID1cbiAgICAgICAgICB0eXBlb2YgZXZpZGVuY2U/LmtpbmQgPT09ICdzdHJpbmcnICYmIGV2aWRlbmNlLmtpbmQubGVuZ3RoID4gMCA/IFN0cmluZyhldmlkZW5jZS5raW5kKSA6ICd0eG4tbGFuZSdcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAndHhuLWxhbmUnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTpyZWFjdC1yZW5kZXIgLyB0cmFjZTpyZWFjdC1zZWxlY3Rvcjoga2VlcCBzbGltIG1ldGEgb25seSAoZmllbGQgdHJpbW1pbmcgaXMgaGFuZGxlZCBieSBKc29uVmFsdWUgcHJvamVjdGlvbikuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnJlYWN0LXJlbmRlcicgfHwgZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnJlYWN0LXNlbGVjdG9yJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShcbiAgICAgICAgICBpc0xpZ2h0TGlrZVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50TGFiZWw6IGRhdGE/LmNvbXBvbmVudExhYmVsLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yS2V5OiBkYXRhPy5zZWxlY3RvcktleSxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGhzOiBkYXRhPy5maWVsZFBhdGhzLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQ6IGRhdGE/LnNlbGVjdG9ySWQsXG4gICAgICAgICAgICAgICAgbGFuZTogZGF0YT8ubGFuZSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogZGF0YT8ucHJvZHVjZXIsXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tSZWFzb246IGRhdGE/LmZhbGxiYWNrUmVhc29uLFxuICAgICAgICAgICAgICAgIHJlYWRzRGlnZXN0OiBkYXRhPy5yZWFkc0RpZ2VzdCxcbiAgICAgICAgICAgICAgICBlcXVhbHNLaW5kOiBkYXRhPy5lcXVhbHNLaW5kLFxuICAgICAgICAgICAgICAgIHN0cmljdE1vZGVQaGFzZTogZGF0YT8uc3RyaWN0TW9kZVBoYXNlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRMYWJlbDogZGF0YT8uY29tcG9uZW50TGFiZWwsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JLZXk6IGRhdGE/LnNlbGVjdG9yS2V5LFxuICAgICAgICAgICAgICAgIGZpZWxkUGF0aHM6IGRhdGE/LmZpZWxkUGF0aHMsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JJZDogZGF0YT8uc2VsZWN0b3JJZCxcbiAgICAgICAgICAgICAgICBsYW5lOiBkYXRhPy5sYW5lLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBkYXRhPy5wcm9kdWNlcixcbiAgICAgICAgICAgICAgICBmYWxsYmFja1JlYXNvbjogZGF0YT8uZmFsbGJhY2tSZWFzb24sXG4gICAgICAgICAgICAgICAgcmVhZHNEaWdlc3Q6IGRhdGE/LnJlYWRzRGlnZXN0LFxuICAgICAgICAgICAgICAgIGVxdWFsc0tpbmQ6IGRhdGE/LmVxdWFsc0tpbmQsXG4gICAgICAgICAgICAgICAgc3RyaWN0TW9kZVBoYXNlOiBkYXRhPy5zdHJpY3RNb2RlUGhhc2UsXG4gICAgICAgICAgICAgICAgbWV0YTogZGF0YT8ubWV0YSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICAgIGNvbnN0IGxhYmVsID1cbiAgICAgICAgICB0eXBlb2YgZGF0YT8uY29tcG9uZW50TGFiZWwgPT09ICdzdHJpbmcnICYmIGRhdGEuY29tcG9uZW50TGFiZWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBkYXRhLmNvbXBvbmVudExhYmVsXG4gICAgICAgICAgICA6IGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1zZWxlY3RvcidcbiAgICAgICAgICAgICAgPyAncmVhY3Qtc2VsZWN0b3InXG4gICAgICAgICAgICAgIDogJ3JlYWN0LXJlbmRlcidcbiAgICAgICAgY29uc3QgbGFzdCA9IGxhc3RUeG5CeUluc3RhbmNlLmdldChpbnN0YW5jZUlkKVxuICAgICAgICBjb25zdCB0eG5TZXFGcm9tTWV0YSA9XG4gICAgICAgICAgdHlwZW9mIGRhdGE/Lm1ldGE/LnR4blNlcSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGRhdGEubWV0YS50eG5TZXEpICYmIGRhdGEubWV0YS50eG5TZXEgPj0gMFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKGRhdGEubWV0YS50eG5TZXEpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCB0eG5JZEZyb21NZXRhID1cbiAgICAgICAgICB0eXBlb2YgZGF0YT8ubWV0YT8udHhuSWQgPT09ICdzdHJpbmcnICYmIGRhdGEubWV0YS50eG5JZC5sZW5ndGggPiAwID8gZGF0YS5tZXRhLnR4bklkIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IHR4bklkQWxpZ25lZCA9IHR4bklkRnJvbU1ldGEgPz8gYmFzZS50eG5JZCA/PyBsYXN0Py50eG5JZFxuICAgICAgICBjb25zdCB0eG5TZXFBbGlnbmVkID0gdHhuU2VxRnJvbU1ldGEgPz8gKGJhc2UudHhuU2VxID4gMCA/IGJhc2UudHhuU2VxIDogKGxhc3Q/LnR4blNlcSA/PyBiYXNlLnR4blNlcSkpXG4gICAgICAgIGNvbnN0IHJlZiA9IHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgdHhuSWQ6IHR4bklkQWxpZ25lZCxcbiAgICAgICAgICB0eG5TZXE6IHR4blNlcUFsaWduZWQsXG4gICAgICAgICAga2luZDogZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnJlYWN0LXNlbGVjdG9yJyA/ICdyZWFjdC1zZWxlY3RvcicgOiAncmVhY3QtcmVuZGVyJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoaW5zdGFuY2VJZCAhPT0gJ3Vua25vd24nICYmIChyZWYudHhuSWQgPT0gbnVsbCB8fCByZWYudHhuU2VxIDw9IDApKSB7XG4gICAgICAgICAgZW5xdWV1ZVBlbmRpbmdUeG5BbGlnbm1lbnQoaW5zdGFuY2VJZCwgcmVmKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZlxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTpzZWxlY3RvcjpldmFsOiBTZWxlY3RvckdyYXBoIGV2YWx1YXRpb24gZXZpZGVuY2Ugd2l0aGluIGNvbW1pdCAodXNlZCBmb3IgdHhuXHUyMTkyc2VsZWN0b3JcdTIxOTJyZW5kZXIgY2F1c2FsIGNoYWluKS5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6c2VsZWN0b3I6ZXZhbCcpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgICAgc2VsZWN0b3JJZDogZGF0YT8uc2VsZWN0b3JJZCxcbiAgICAgICAgICBsYW5lOiBkYXRhPy5sYW5lLFxuICAgICAgICAgIHByb2R1Y2VyOiBkYXRhPy5wcm9kdWNlcixcbiAgICAgICAgICBmYWxsYmFja1JlYXNvbjogZGF0YT8uZmFsbGJhY2tSZWFzb24sXG4gICAgICAgICAgcmVhZHNEaWdlc3Q6IGRhdGE/LnJlYWRzRGlnZXN0LFxuICAgICAgICAgIGVxdWFsc0tpbmQ6IGRhdGE/LmVxdWFsc0tpbmQsXG4gICAgICAgICAgY2hhbmdlZDogZGF0YT8uY2hhbmdlZCxcbiAgICAgICAgICBldmFsTXM6IGRhdGE/LmV2YWxNcyxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTpleGVjLXZtOiBFeGVjIFZNIGhpdC9taXNzIGV2aWRlbmNlICgwNDkpLiBJbiBsaWdodCB0aWVyIHdlIGtlZXAgbWluaW1hbCBzdW1tYXJ5IGZpZWxkcy5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6ZXhlYy12bScpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgICAgdmVyc2lvbjogZGF0YT8udmVyc2lvbixcbiAgICAgICAgICBzdGFnZTogZGF0YT8uc3RhZ2UsXG4gICAgICAgICAgaGl0OiBkYXRhPy5oaXQsXG4gICAgICAgICAgcmVhc29uQ29kZTogZGF0YT8ucmVhc29uQ29kZSA/PyBkYXRhPy5yZWFzb24sXG4gICAgICAgICAgcmVhc29uRGV0YWlsOiBkYXRhPy5yZWFzb25EZXRhaWwsXG4gICAgICAgICAgZXhlY0lyVmVyc2lvbjogZGF0YT8uZXhlY0lyVmVyc2lvbixcbiAgICAgICAgICBleGVjSXJIYXNoOiBkYXRhPy5leGVjSXJIYXNoLFxuICAgICAgICAgIHNlcnZpY2VJZDogZGF0YT8uc2VydmljZUlkLFxuICAgICAgICAgIGltcGxJZDogZGF0YT8uaW1wbElkLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOnRyYWl0OmNvbnZlcmdlOiBjb252ZXJnZSBldmlkZW5jZSBtdXN0IGJlIGV4cG9ydGFibGUgKEpzb25WYWx1ZSBoYXJkIGdhdGUpIGFuZCB0cmltcyBoZWF2eSBmaWVsZHMgaW4gbGlnaHQgdGllci5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6Y29udmVyZ2UnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVEaXJ0eVJvb3RQYXRocyA9IChhcmdzOiB7XG4gICAgICAgICAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q6IHVua25vd25cbiAgICAgICAgICByZWFkb25seSByb290SWRzOiB1bmtub3duXG4gICAgICAgIH0pOiBSZWFkb25seUFycmF5PEpzb25WYWx1ZT4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmUgPSBvcHRpb25zPy5yZXNvbHZlQ29udmVyZ2VTdGF0aWNJclxuICAgICAgICAgIGlmICghcmVzb2x2ZSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGRpZ2VzdCA9IGFyZ3Muc3RhdGljSXJEaWdlc3RcbiAgICAgICAgICBpZiAodHlwZW9mIGRpZ2VzdCAhPT0gJ3N0cmluZycgfHwgZGlnZXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3Qgcm9vdElkcyA9IGFyZ3Mucm9vdElkc1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb290SWRzKSB8fCByb290SWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgaXIgPSByZXNvbHZlKGRpZ2VzdCkgYXMgQ29udmVyZ2VTdGF0aWNJckV4cG9ydCB8IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGZpZWxkUGF0aHMgPSAoaXIgYXMgYW55KT8uZmllbGRQYXRocyBhcyB1bmtub3duXG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkUGF0aHMpIHx8IGZpZWxkUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCBvdXQ6IEFycmF5PEpzb25WYWx1ZT4gPSBbXVxuICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygcm9vdElkcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0Zpbml0ZShpZCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKGlkKVxuICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IGZpZWxkUGF0aHMubGVuZ3RoKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGZpZWxkUGF0aHNbaWR4XVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgICAgICAgICAgb3V0LnB1c2gocGF0aCBhcyBhbnkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG91dC5sZW5ndGggPiAwID8gb3V0IDogdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnJpY2hEaXJ0eVJvb3RQYXRocyA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgICAgICAgY29uc3QgYW55VmFsdWUgPSB2YWx1ZSBhcyBhbnlcbiAgICAgICAgICBjb25zdCBkaXJ0eSA9IGFueVZhbHVlLmRpcnR5XG4gICAgICAgICAgaWYgKCFkaXJ0eSB8fCB0eXBlb2YgZGlydHkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGlydHkpKSByZXR1cm4gdmFsdWVcblxuICAgICAgICAgIGNvbnN0IGRpcnR5Um9vdFBhdGhzID0gcmVzb2x2ZURpcnR5Um9vdFBhdGhzKHtcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBhbnlWYWx1ZS5zdGF0aWNJckRpZ2VzdCxcbiAgICAgICAgICAgIHJvb3RJZHM6IGRpcnR5Py5yb290SWRzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKCFkaXJ0eVJvb3RQYXRocykgcmV0dXJuIHZhbHVlXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYW55VmFsdWUsXG4gICAgICAgICAgICBkaXJ0eToge1xuICAgICAgICAgICAgICAuLi4oZGlydHkgYXMgYW55KSxcbiAgICAgICAgICAgICAgcm9vdFBhdGhzOiBkaXJ0eVJvb3RQYXRocyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBKc29uVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmlwSGVhdnlMaWdodCA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgICAgICAgY29uc3QgYW55VmFsdWUgPSB2YWx1ZSBhcyBhbnlcbiAgICAgICAgICBjb25zdCBkaXJ0eSA9IGFueVZhbHVlLmRpcnR5XG4gICAgICAgICAgY29uc3QgZGlydHlSb290UGF0aHMgPSByZXNvbHZlRGlydHlSb290UGF0aHMoe1xuICAgICAgICAgICAgc3RhdGljSXJEaWdlc3Q6IGFueVZhbHVlLnN0YXRpY0lyRGlnZXN0LFxuICAgICAgICAgICAgcm9vdElkczogZGlydHk/LnJvb3RJZHMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBkaXJ0eVNsaW0gPVxuICAgICAgICAgICAgZGlydHkgJiYgdHlwZW9mIGRpcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkaXJ0eSlcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaXJ0eUFsbDogKGRpcnR5IGFzIGFueSkuZGlydHlBbGwsXG4gICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIChkaXJ0eSBhcyBhbnkpLnJlYXNvbiA9PT0gJ3N0cmluZycgPyB7IHJlYXNvbjogKGRpcnR5IGFzIGFueSkucmVhc29uIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KChkaXJ0eSBhcyBhbnkpLnJvb3RJZHMpID8geyByb290SWRzOiAoZGlydHkgYXMgYW55KS5yb290SWRzIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICAgIC4uLih0eXBlb2YgKGRpcnR5IGFzIGFueSkucm9vdElkc1RydW5jYXRlZCA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICAgICAgICAgID8geyByb290SWRzVHJ1bmNhdGVkOiAoZGlydHkgYXMgYW55KS5yb290SWRzVHJ1bmNhdGVkIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgICAgIC4uLihkaXJ0eVJvb3RQYXRocyA/IHsgcm9vdFBhdGhzOiBkaXJ0eVJvb3RQYXRocyB9IDogbnVsbCksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgeyB0b3AzLCBkaXJ0eVJvb3RzLCAuLi5yZXN0IH0gPSBhbnlWYWx1ZVxuICAgICAgICAgIHJldHVybiAoZGlydHlTbGltID8geyAuLi5yZXN0LCBkaXJ0eTogZGlydHlTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmlwSGVhdnlTYW1wbGVkID0gKHZhbHVlOiBKc29uVmFsdWUpOiBKc29uVmFsdWUgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgICAgICAgICBjb25zdCBhbnlWYWx1ZSA9IHZhbHVlIGFzIGFueVxuICAgICAgICAgIGNvbnN0IGRpcnR5ID0gYW55VmFsdWUuZGlydHlcbiAgICAgICAgICBjb25zdCBkaXJ0eVNsaW0gPVxuICAgICAgICAgICAgZGlydHkgJiYgdHlwZW9mIGRpcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkaXJ0eSlcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaXJ0eUFsbDogKGRpcnR5IGFzIGFueSkuZGlydHlBbGwsXG4gICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIChkaXJ0eSBhcyBhbnkpLnJlYXNvbiA9PT0gJ3N0cmluZycgPyB7IHJlYXNvbjogKGRpcnR5IGFzIGFueSkucmVhc29uIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCB7IGRpcnR5Um9vdHMsIC4uLnJlc3QgfSA9IGFueVZhbHVlXG4gICAgICAgICAgcmV0dXJuIChkaXJ0eVNsaW0gPyB7IC4uLnJlc3QsIGRpcnR5OiBkaXJ0eVNsaW0gfSA6IHJlc3QpIGFzIEpzb25WYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICd0cmFjZTp0cmFpdDpjb252ZXJnZScgfT4pLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID1cbiAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSAnbGlnaHQnXG4gICAgICAgICAgICA/IHN0cmlwSGVhdnlMaWdodChkYXRhKVxuICAgICAgICAgICAgOiBkaWFnbm9zdGljc0xldmVsID09PSAnc2FtcGxlZCdcbiAgICAgICAgICAgICAgPyBzdHJpcEhlYXZ5U2FtcGxlZChkYXRhKVxuICAgICAgICAgICAgICA6IGVucmljaERpcnR5Um9vdFBhdGhzKGRhdGEpXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAndHJhaXQ6Y29udmVyZ2UnLFxuICAgICAgICAgIGxhYmVsOiAndHJhaXQ6Y29udmVyZ2UnLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTp0cmFpdDpjaGVjazogdmFsaWRhdGlvbiBkaWFnbm9zdGljcyBtdXN0IGJlIGV4cG9ydGFibGUgYW5kIHN0YXkgc2xpbSBpbiBsaWdodCB0aWVyIChrZWVwIGtleSBmaWVsZHMpLlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTp0cmFpdDpjaGVjaycpIHtcbiAgICAgICAgY29uc3Qgc3RyaXBIZWF2eSA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG4gICAgICAgICAgY29uc3QgZGVncmFkZWQgPSBhbnlWYWx1ZS5kZWdyYWRlZFxuICAgICAgICAgIGNvbnN0IGRlZ3JhZGVkU2xpbSA9XG4gICAgICAgICAgICBkZWdyYWRlZCAmJiB0eXBlb2YgZGVncmFkZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRlZ3JhZGVkKVxuICAgICAgICAgICAgICA/IHsga2luZDogKGRlZ3JhZGVkIGFzIGFueSkua2luZCB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCB7IGRlZ3JhZGVkOiBfZGVncmFkZWQsIC4uLnJlc3QgfSA9IGFueVZhbHVlXG4gICAgICAgICAgcmV0dXJuIChkZWdyYWRlZFNsaW0gPyB7IC4uLnJlc3QsIGRlZ3JhZGVkOiBkZWdyYWRlZFNsaW0gfSA6IHJlc3QpIGFzIEpzb25WYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICd0cmFjZTp0cmFpdDpjaGVjaycgfT4pLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2UgPyBzdHJpcEhlYXZ5KGRhdGEpIDogZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OmNoZWNrJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OmNoZWNrJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHJhaXQ6dmFsaWRhdGU6IHZhbGlkYXRpb24gZGVjaXNpb24gc3VtbWFyeSBtdXN0IGJlIGV4cG9ydGFibGUgYW5kIHNsaW0gaW4gbGlnaHQgdGllciAobm8gaGVhdnkgZmllbGRzIGJ5IGRlZmF1bHQpLlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTp0cmFpdDp2YWxpZGF0ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICd0cmFjZTp0cmFpdDp2YWxpZGF0ZScgfT4pLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKGRhdGEpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAndHJhaXQ6dmFsaWRhdGUnLFxuICAgICAgICAgIGxhYmVsOiAndHJhaXQ6dmFsaWRhdGUnLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTptb2R1bGU6dHJhaXRzOiBmaW5hbCB0cmFpdHMgc25hcHNob3QgbXVzdCBiZSBleHBvcnRhYmxlIGFuZCBzbGltIGluIGxpZ2h0IHRpZXIgKGRpZ2VzdC9jb3VudCkuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOm1vZHVsZTp0cmFpdHMnKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGlnZXN0OiBkYXRhPy5kaWdlc3QsXG4gICAgICAgICAgICAgIGNvdW50OiBkYXRhPy5jb3VudCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgZGlnZXN0OiBkYXRhPy5kaWdlc3QsXG4gICAgICAgICAgICAgIGNvdW50OiBkYXRhPy5jb3VudCxcbiAgICAgICAgICAgICAgdHJhaXRzOiBkYXRhPy50cmFpdHMsXG4gICAgICAgICAgICAgIHByb3ZlbmFuY2VJbmRleDogZGF0YT8ucHJvdmVuYW5jZUluZGV4LFxuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTptb2R1bGU6dHJhaXRzOmNvbmZsaWN0OiBjb25mbGljdCBkZXRhaWxzIG11c3QgYmUgZXhwb3J0YWJsZTsgYXZvaWQgcmVseWluZyBvbiB0cnVuY2F0ZWQgbGlmZWN5Y2xlOmVycm9yIG1lc3NhZ2VzLlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTptb2R1bGU6dHJhaXRzOmNvbmZsaWN0Jykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGRhdGE/LmNvbmZsaWN0Q291bnQsXG4gICAgICAgICAgICAgIHRyYWl0SWRzOiBkYXRhPy50cmFpdElkcyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogZGF0YT8uY29uZmxpY3RDb3VudCxcbiAgICAgICAgICAgICAgY29uZmxpY3RzOiBkYXRhPy5jb25mbGljdHMsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOm1vZHVsZTpkZXNjcmlwdG9yOiBrZWVwIGtleSBhbmNob3JzIGV2ZW4gaW4gbGlnaHQgdGllciAoYXZvaWQgZGF0YSBiZWluZyBmdWxseSB0cmltbWVkKS5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6bW9kdWxlOmRlc2NyaXB0b3InKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgaWQ6IGRhdGE/LmlkLFxuICAgICAgICAgICAgICB0cmFpdHM6IGRhdGE/LnRyYWl0cyxcbiAgICAgICAgICAgICAgc291cmNlOiBkYXRhPy5zb3VyY2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7IGRhdGEgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTplZmZlY3RvcDoga2VlcCBzbGltIG9wIG1ldGEgYW5kIHByZWZlciBFZmZlY3RPcC5tZXRhLm1vZHVsZUlkIHdoZW4gcHJlc2VudC5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6ZWZmZWN0b3AnKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3Qgb3BNZXRhOiBhbnkgPSBkYXRhPy5tZXRhXG4gICAgICAgIGNvbnN0IG9wS2luZCA9IChkYXRhPy5raW5kID8/ICdzZXJ2aWNlJykgYXMgUnVudGltZURlYnVnRXZlbnRLaW5kXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdHlwZW9mIGRhdGE/Lm5hbWUgPT09ICdzdHJpbmcnID8gZGF0YS5uYW1lIDogJ2VmZmVjdG9wJ1xuICAgICAgICBjb25zdCBtb2R1bGVJZDIgPSB0eXBlb2Ygb3BNZXRhPy5tb2R1bGVJZCA9PT0gJ3N0cmluZycgPyBvcE1ldGEubW9kdWxlSWQgOiBtb2R1bGVJZFxuICAgICAgICBjb25zdCB0eG5JZDIgPSB0eXBlb2Ygb3BNZXRhPy50eG5JZCA9PT0gJ3N0cmluZycgJiYgb3BNZXRhLnR4bklkLmxlbmd0aCA+IDAgPyBvcE1ldGEudHhuSWQgOiBiYXNlLnR4bklkXG4gICAgICAgIGNvbnN0IHR4blNlcTIgPVxuICAgICAgICAgIHR5cGVvZiBvcE1ldGE/LnR4blNlcSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG9wTWV0YS50eG5TZXEpICYmIG9wTWV0YS50eG5TZXEgPj0gMFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKG9wTWV0YS50eG5TZXEpXG4gICAgICAgICAgICA6IGJhc2UudHhuU2VxXG5cbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgaWQ6IGRhdGE/LmlkLFxuICAgICAgICAgICAgICBraW5kOiBkYXRhPy5raW5kLFxuICAgICAgICAgICAgICBuYW1lOiBkYXRhPy5uYW1lLFxuICAgICAgICAgICAgICBtZXRhOiBvcE1ldGEsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGlkOiBkYXRhPy5pZCxcbiAgICAgICAgICAgICAga2luZDogZGF0YT8ua2luZCxcbiAgICAgICAgICAgICAgbmFtZTogZGF0YT8ubmFtZSxcbiAgICAgICAgICAgICAgcGF5bG9hZDogZGF0YT8ucGF5bG9hZCxcbiAgICAgICAgICAgICAgbWV0YTogb3BNZXRhLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBtb2R1bGVJZDogbW9kdWxlSWQyLFxuICAgICAgICAgIHR4bklkOiB0eG5JZDIsXG4gICAgICAgICAgdHhuU2VxOiB0eG5TZXEyLFxuICAgICAgICAgIGtpbmQ6IG9wS2luZCxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXIgdHJhY2U6KiBldmVudHM6IGNhdGVnb3JpemUgYXMgZGV2dG9vbHMgYW5kIHRyaW0gbWV0YSBieSB0aWVyLlxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKFxuICAgICAgICBpc0xpZ2h0TGlrZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGRhdGE6IChldmVudCBhcyBhbnkpLmRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDYXVzZSB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IHR5cGUgRG93bmdyYWRlUmVhc29uID0gJ25vbl9zZXJpYWxpemFibGUnIHwgJ292ZXJzaXplZCcgfCAndW5rbm93bidcblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvclN1bW1hcnlSZXN1bHQge1xuICByZWFkb25seSBlcnJvclN1bW1hcnk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICByZWFkb25seSBkb3duZ3JhZGU/OiBEb3duZ3JhZGVSZWFzb25cbn1cblxuY29uc3QgdHJ1bmNhdGUgPSAodmFsdWU6IHN0cmluZywgbWF4TGVuOiBudW1iZXIpOiB7IHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7IHJlYWRvbmx5IHRydW5jYXRlZDogYm9vbGVhbiB9ID0+IHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA8PSBtYXhMZW4pIHJldHVybiB7IHZhbHVlLCB0cnVuY2F0ZWQ6IGZhbHNlIH1cbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLnNsaWNlKDAsIG1heExlbiksIHRydW5jYXRlZDogdHJ1ZSB9XG59XG5cbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSAodmFsdWU6IHVua25vd24pOiB7IHJlYWRvbmx5IG9rOiB0cnVlOyByZWFkb25seSBqc29uOiBzdHJpbmcgfSB8IHsgcmVhZG9ubHkgb2s6IGZhbHNlIH0gPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCBqc29uOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBvazogZmFsc2UgfVxuICB9XG59XG5cbmNvbnN0IGdldE1lc3NhZ2VGcm9tVW5rbm93biA9IChjYXVzZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgY2F1c2UgPT09ICdzdHJpbmcnKSByZXR1cm4gY2F1c2VcbiAgaWYgKHR5cGVvZiBjYXVzZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGNhdXNlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGNhdXNlID09PSAnYmlnaW50JykgcmV0dXJuIFN0cmluZyhjYXVzZSlcbiAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBjYXVzZS5tZXNzYWdlIHx8IGNhdXNlLm5hbWUgfHwgJ0Vycm9yJ1xuICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gKGNhdXNlIGFzIGFueSkgJiYgdHlwZW9mIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH1cblxuICAvLyBUcnkgRWZmZWN0IENhdXNlIHByZXR0eSAoYmVzdC1lZmZvcnQpLiBUaGlzIG1heSBpbmNsdWRlIG1vcmUgZGV0YWlscyB0aGFuIG5lZWRlZCxcbiAgLy8gc28gY2FsbGVycyBNVVNUIHN0aWxsIHRyZWF0IGl0IGFzIGFuIHVudHJ1c3RlZC9vdmVyc2l6ZWQgc3RyaW5nIGFuZCB0cnVuY2F0ZS5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcmV0dHkgPSBDYXVzZS5wcmV0dHkoY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgIGlmICh0eXBlb2YgcHJldHR5ID09PSAnc3RyaW5nJyAmJiBwcmV0dHkubGVuZ3RoID4gMCkgcmV0dXJuIHByZXR0eVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93biBlcnJvcidcbn1cblxuZXhwb3J0IGNvbnN0IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5ID0gKFxuICBjYXVzZTogdW5rbm93bixcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSBtYXhNZXNzYWdlTGVuZ3RoPzogbnVtYmVyXG4gIH0sXG4pOiBFcnJvclN1bW1hcnlSZXN1bHQgPT4ge1xuICBjb25zdCBtYXhNZXNzYWdlTGVuZ3RoID0gb3B0aW9ucz8ubWF4TWVzc2FnZUxlbmd0aCA/PyAyNTZcblxuICBjb25zdCBtZXNzYWdlUmF3ID0gZ2V0TWVzc2FnZUZyb21Vbmtub3duKGNhdXNlKVxuICBjb25zdCB7IHZhbHVlOiBtZXNzYWdlLCB0cnVuY2F0ZWQgfSA9IHRydW5jYXRlKG1lc3NhZ2VSYXcsIG1heE1lc3NhZ2VMZW5ndGgpXG5cbiAgY29uc3Qgc3VtbWFyeTogeyBtZXNzYWdlOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGNvZGU/OiBzdHJpbmc7IGhpbnQ/OiBzdHJpbmcgfSA9IHtcbiAgICBtZXNzYWdlLFxuICB9XG5cbiAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoY2F1c2UubmFtZSAmJiBjYXVzZS5uYW1lICE9PSAnRXJyb3InKSBzdW1tYXJ5Lm5hbWUgPSBjYXVzZS5uYW1lXG4gICAgY29uc3QgYW55Q2F1c2UgPSBjYXVzZSBhcyBhbnlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmNvZGUgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmNvZGUubGVuZ3RoID4gMCkgc3VtbWFyeS5jb2RlID0gYW55Q2F1c2UuY29kZVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYW55Q2F1c2UuY29kZSkpIHN1bW1hcnkuY29kZSA9IFN0cmluZyhhbnlDYXVzZS5jb2RlKVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UuaGludCA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UuaGludC5sZW5ndGggPiAwKSBzdW1tYXJ5LmhpbnQgPSBhbnlDYXVzZS5oaW50XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogdHJ1bmNhdGVkID8gJ292ZXJzaXplZCcgOiB1bmRlZmluZWQsXG4gICAgfVxuICB9XG5cbiAgaWYgKGNhdXNlICYmIHR5cGVvZiBjYXVzZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBhbnlDYXVzZSA9IGNhdXNlIGFzIGFueVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UubmFtZSA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UubmFtZS5sZW5ndGggPiAwKSBzdW1tYXJ5Lm5hbWUgPSBhbnlDYXVzZS5uYW1lXG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnc3RyaW5nJyAmJiBhbnlDYXVzZS5jb2RlLmxlbmd0aCA+IDApIHN1bW1hcnkuY29kZSA9IGFueUNhdXNlLmNvZGVcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmhpbnQgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmhpbnQubGVuZ3RoID4gMCkgc3VtbWFyeS5oaW50ID0gYW55Q2F1c2UuaGludFxuICB9XG5cbiAgLy8gSWYgdGhlIG9yaWdpbmFsIGNhdXNlIGlzbid0IEpTT04tc2VyaWFsaXphYmxlLCBtYXJrIGl0IGV4cGxpY2l0bHkuXG4gIGNvbnN0IHN0cmluZ2lmeVJlc3VsdCA9IHNhZmVTdHJpbmdpZnkoY2F1c2UpXG4gIGlmICghc3RyaW5naWZ5UmVzdWx0Lm9rKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ25vbl9zZXJpYWxpemFibGUnLFxuICAgIH1cbiAgfVxuXG4gIGlmICh0cnVuY2F0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JTdW1tYXJ5OiBzdW1tYXJ5LFxuICAgICAgZG93bmdyYWRlOiAnb3ZlcnNpemVkJyxcbiAgICB9XG4gIH1cblxuICBpZiAobWVzc2FnZSA9PT0gJ1Vua25vd24gZXJyb3InKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ3Vua25vd24nLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9yU3VtbWFyeTogc3VtbWFyeSB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQUFBLFNBQVMsU0FBQUEsUUFBTyxRQUFRLFVBQVUsT0FBTyxjQUFjOzs7QUNBdkQsU0FBUyxhQUFhO0FBZ0J0QixJQUFNLFdBQVcsQ0FBQyxPQUFlLFdBQTRFO0FBQzNHLE1BQUksTUFBTSxVQUFVLE9BQVEsUUFBTyxFQUFFLE9BQU8sV0FBVyxNQUFNO0FBQzdELFNBQU8sRUFBRSxPQUFPLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxXQUFXLEtBQUs7QUFDMUQ7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQTBGO0FBQy9HLE1BQUk7QUFDRixXQUFPLEVBQUUsSUFBSSxNQUFNLE1BQU0sS0FBSyxVQUFVLEtBQUssRUFBRTtBQUFBLEVBQ2pELFFBQVE7QUFDTixXQUFPLEVBQUUsSUFBSSxNQUFNO0FBQUEsRUFDckI7QUFDRjtB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QWEsTUFBYztBQUNqQyxjQUFNLFNBQWMsTUFBTTtBQUMxQixjQUFNLFNBQVUsTUFBTSxRQUFRO0FBQzlCLGNBQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxXQUFXLEtBQUssT0FBTztBQUMzRCxjQUFNLFlBQVksT0FBTyxRQUFRLGFBQWEsV0FBVyxPQUFPLFdBQVc7QUFDM0UsY0FBTSxTQUFTLE9BQU8sUUFBUSxVQUFVLFlBQVksT0FBTyxNQUFNLFNBQVMsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUNsRyxjQUFNLFVBQ0osT0FBTyxRQUFRLFdBQVcsWUFBWSxPQUFPLFNBQVMsT0FBTyxNQUFNLEtBQUssT0FBTyxVQUFVLElBQ3JGLEtBQUssTUFBTSxPQUFPLE1BQU0sSUFDeEIsS0FBSztBQUVYLGNBQU0sWUFBWSxjQUNkO0FBQUEsVUFDRSxJQUFJLE1BQU07QUFBQSxVQUNWLE1BQU0sTUFBTTtBQUFBLFVBQ1osTUFBTSxNQUFNO0FBQUEsVUFDWixNQUFNO0FBQUEsUUFDUixJQUNBO0FBQUEsVUFDRSxJQUFJLE1BQU07QUFBQSxVQUNWLE1BQU0sTUFBTTtBQUFBLFVBQ1osTUFBTSxNQUFNO0FBQUEsVUFDWixTQUFTLE1BQU07QUFBQSxVQUNmLE1BQU07QUFBQSxRQUNSO0FBRUosY0FBTUEsa0JBQWlCLGlCQUFpQixTQUFTO0FBQ2pELGlCQUFTLG1CQUFtQjtBQUFBLFVBQzFCLE9BQU9BLGdCQUFlO0FBQUEsVUFDdEIsV0FBV0EsZ0JBQWU7QUFBQSxRQUM1QixDQUFDO0FBQ0Qsb0JBQVksZUFBZSxXQUFXQSxnQkFBZSxTQUFTO0FBRTlELGVBQU8sY0FBYztBQUFBLFVBQ25CLEdBQUc7QUFBQSxVQUNILFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOO0FBQUEsVUFDQSxNQUFNQSxnQkFBZTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBR0EsWUFBTSxpQkFBaUI7QUFBQSxRQUNyQixjQUNJO0FBQUEsVUFDRSxNQUFNO0FBQUEsUUFDUixJQUNBO0FBQUEsVUFDRSxNQUFPLE1BQWM7QUFBQSxRQUN2QjtBQUFBLE1BQ047QUFDQSxlQUFTLG1CQUFtQjtBQUFBLFFBQzFCLE9BQU8sZUFBZTtBQUFBLFFBQ3RCLFdBQVcsZUFBZTtBQUFBLE1BQzVCLENBQUM7QUFDRCxrQkFBWSxlQUFlLFdBQVcsZUFBZSxTQUFTO0FBQzlELGFBQU8sY0FBYztBQUFBLFFBQ25CLEdBQUc7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLE9BQU8sTUFBTTtBQUFBLFFBQ2IsTUFBTSxlQUFlO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkNhdXNlIiwgIkNhdXNlIiwgImRpYWdub3N0aWNzTGV2ZWwiLCAibWV0YVByb2plY3Rpb24iXQp9Cg==