@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.
- package/LICENSE +201 -0
- package/package.json +3 -1
- package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
- package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
- package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
- package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
- package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
- package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
- package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
- package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
- package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
- package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
- package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
- package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
- package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
- package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
- package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
- package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
- package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
- package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
- package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
- package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
- package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
- package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
- package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
- package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
- package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
- package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
- package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
- package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
- package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
- package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
- package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
- package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
- package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
- package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
- package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
- package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
- package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
- package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
- package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
- package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
- package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
- package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
- package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
- package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
- package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
- package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
- package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
- package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
- package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
- package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
- package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
- package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
- package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
- package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
- package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
- package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
- package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
- package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
- package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
- package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
- package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
- package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
- package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
- package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
- package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
- package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
- package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
- package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
- package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
- package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
- package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
- package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
- package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
- package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
- package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
- package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
- package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
- package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
- package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
- package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
- package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
- package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
- package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
- package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
- package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
- package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
- package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
- package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
- package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
- package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
- package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
- package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
- package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
- package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
- package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
- package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
- package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
- package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
- package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
- package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
- package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
- package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
- package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
- package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
- package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
- package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
- package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
- package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
- package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
- package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
- package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
- package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
- package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
- package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
- package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
- package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
- package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
- package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
- package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
- package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
- package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
- package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
- package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
- package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
- package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
- package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
- package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
- package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
- package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
- package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
- package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
- package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
- package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
- package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
- package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
- package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
- package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
- package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
- package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
- package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
- package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
- package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
- package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
- package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
- package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
- package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
- package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
- package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
- package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
- package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
- package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
- package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
- package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
- package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
- package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
- package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
- package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
- package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
- package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
- package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
- package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
- package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
- package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
- package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
- package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
- package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
- package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
- package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
- package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
- package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
- package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
- package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
- package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
- package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
- package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
- package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
- package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
- package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
- package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
- package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
- package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
- package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
- package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
- package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
- package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
- package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
- package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
- package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
- package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
- package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
- package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
- package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
- package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
- package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
- package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
- package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
- package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
- package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
- package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
- package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
- package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
- package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
- package/public/sandbox/logix-core/Bound.js +14 -14
- package/public/sandbox/logix-core/Debug.js +12 -10
- package/public/sandbox/logix-core/EffectOp.js +3 -4
- package/public/sandbox/logix-core/Env.js +5 -2
- package/public/sandbox/logix-core/ExternalStore.js +239 -0
- package/public/sandbox/logix-core/Flow.js +7 -8
- package/public/sandbox/logix-core/Kernel.js +7 -4
- package/public/sandbox/logix-core/Link.js +33 -25
- package/public/sandbox/logix-core/Middleware.js +13 -11
- package/public/sandbox/logix-core/Module.js +93 -30
- package/public/sandbox/logix-core/ModuleTag.js +28 -25
- package/public/sandbox/logix-core/Observability.js +21 -19
- package/public/sandbox/logix-core/Process.js +27 -22
- package/public/sandbox/logix-core/ReadQuery.js +7 -11
- package/public/sandbox/logix-core/Reflection.js +173 -53
- package/public/sandbox/logix-core/Resource.js +6 -3
- package/public/sandbox/logix-core/Root.js +7 -3
- package/public/sandbox/logix-core/Runtime.js +54 -40
- package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
- package/public/sandbox/logix-core/StateTrait.js +17 -14
- package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
- package/public/sandbox/logix-core/Workflow.js +332 -0
- package/public/sandbox/logix-core.js +11133 -6622
- package/public/sandbox/logix-core.manifest.json +4 -2
- package/public/sandbox/worker.js +3 -3
- package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
- package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
- package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
- package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
- package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
- package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
- package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
- package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
- package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
- package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
- package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
- package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
- package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
- package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
- package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
- package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
- package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
- package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
- package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
|
@@ -5,32 +5,35 @@ import {
|
|
|
5
5
|
build,
|
|
6
6
|
computed,
|
|
7
7
|
exportStaticIr,
|
|
8
|
+
externalStore,
|
|
8
9
|
from,
|
|
9
10
|
install,
|
|
10
11
|
link,
|
|
11
12
|
list,
|
|
12
13
|
node,
|
|
13
14
|
source
|
|
14
|
-
} from "../chunks/chunk-
|
|
15
|
-
import "../chunks/chunk-
|
|
16
|
-
import "../chunks/chunk-
|
|
17
|
-
import "../chunks/chunk-
|
|
15
|
+
} from "../chunks/chunk-NE447XAF.js";
|
|
16
|
+
import "../chunks/chunk-FQRUTYAD.js";
|
|
17
|
+
import "../chunks/chunk-C2MYMMO4.js";
|
|
18
|
+
import "../chunks/chunk-EZTMVCJF.js";
|
|
18
19
|
import "../chunks/chunk-KE2H62D6.js";
|
|
19
|
-
import "../chunks/chunk-
|
|
20
|
-
import "../chunks/chunk-
|
|
21
|
-
import "../chunks/chunk-
|
|
22
|
-
import "../chunks/chunk-
|
|
23
|
-
import "../chunks/chunk-
|
|
24
|
-
import "../chunks/chunk-
|
|
25
|
-
import "../chunks/chunk-
|
|
26
|
-
import "../chunks/chunk-
|
|
27
|
-
import "../chunks/chunk-
|
|
28
|
-
import "../chunks/chunk-
|
|
20
|
+
import "../chunks/chunk-4MY35XR3.js";
|
|
21
|
+
import "../chunks/chunk-X2Z5VYG3.js";
|
|
22
|
+
import "../chunks/chunk-ASVMK364.js";
|
|
23
|
+
import "../chunks/chunk-7GPAF2UK.js";
|
|
24
|
+
import "../chunks/chunk-YMVMZA3U.js";
|
|
25
|
+
import "../chunks/chunk-NMGFJZ4I.js";
|
|
26
|
+
import "../chunks/chunk-UJGVDFZN.js";
|
|
27
|
+
import "../chunks/chunk-W365QUZ5.js";
|
|
28
|
+
import "../chunks/chunk-SH7TP5CJ.js";
|
|
29
|
+
import "../chunks/chunk-SI5OKFFY.js";
|
|
30
|
+
import "../chunks/chunk-DT7YIIWE.js";
|
|
29
31
|
export {
|
|
30
32
|
$root,
|
|
31
33
|
build,
|
|
32
34
|
computed,
|
|
33
35
|
exportStaticIr,
|
|
36
|
+
externalStore,
|
|
34
37
|
from,
|
|
35
38
|
install,
|
|
36
39
|
link,
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
import {
|
|
4
4
|
ReplayLog,
|
|
5
5
|
unsetAtPathMutating
|
|
6
|
-
} from "../chunks/chunk-
|
|
7
|
-
import {
|
|
8
|
-
inSyncTransactionFiber
|
|
9
|
-
} from "../chunks/chunk-WFV5PPWJ.js";
|
|
6
|
+
} from "../chunks/chunk-C2MYMMO4.js";
|
|
10
7
|
import {
|
|
11
8
|
getBoundInternals,
|
|
12
9
|
getModuleTraitsProgram
|
|
13
|
-
} from "../chunks/chunk-
|
|
14
|
-
import
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
} from "../chunks/chunk-7GPAF2UK.js";
|
|
11
|
+
import {
|
|
12
|
+
inSyncTransactionFiber
|
|
13
|
+
} from "../chunks/chunk-YMVMZA3U.js";
|
|
14
|
+
import "../chunks/chunk-UJGVDFZN.js";
|
|
15
|
+
import "../chunks/chunk-SH7TP5CJ.js";
|
|
16
|
+
import "../chunks/chunk-SI5OKFFY.js";
|
|
17
17
|
|
|
18
18
|
// ../logix-core/src/internal/trait-lifecycle/index.ts
|
|
19
19
|
import { Effect, FiberRef, Option } from "../effect.js";
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
installOne
|
|
5
|
+
} from "../chunks/chunk-DM7C5NP5.js";
|
|
6
|
+
import {
|
|
7
|
+
compileWorkflowStaticIrV1,
|
|
8
|
+
makeWorkflowError,
|
|
9
|
+
normalizeWorkflowDefV1,
|
|
10
|
+
validateWorkflowDefV1
|
|
11
|
+
} from "../chunks/chunk-UZZBHWIO.js";
|
|
12
|
+
import "../chunks/chunk-BJOWSSEL.js";
|
|
13
|
+
import "../chunks/chunk-UBMUY7WO.js";
|
|
14
|
+
import "../chunks/chunk-7GPAF2UK.js";
|
|
15
|
+
import "../chunks/chunk-YMVMZA3U.js";
|
|
16
|
+
import "../chunks/chunk-UJGVDFZN.js";
|
|
17
|
+
import "../chunks/chunk-W365QUZ5.js";
|
|
18
|
+
import "../chunks/chunk-SH7TP5CJ.js";
|
|
19
|
+
import "../chunks/chunk-SI5OKFFY.js";
|
|
20
|
+
import "../chunks/chunk-DT7YIIWE.js";
|
|
21
|
+
|
|
22
|
+
// ../logix-core/src/Workflow.ts
|
|
23
|
+
import { Context } from "../effect.js";
|
|
24
|
+
|
|
25
|
+
// ../logix-core/src/internal/serviceId.ts
|
|
26
|
+
var asNonEmptyString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
|
|
27
|
+
var fromTag = (tag) => {
|
|
28
|
+
const anyTag = tag;
|
|
29
|
+
return asNonEmptyString(anyTag.key) ?? asNonEmptyString(anyTag.id) ?? asNonEmptyString(anyTag._id);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// ../logix-core/src/Workflow.ts
|
|
33
|
+
var KernelSourceRefreshPortTagImpl = class extends Context.Tag("logix/kernel/sourceRefresh")() {
|
|
34
|
+
};
|
|
35
|
+
var KernelPorts = {
|
|
36
|
+
sourceRefresh: KernelSourceRefreshPortTagImpl
|
|
37
|
+
};
|
|
38
|
+
var forModule = (_module) => {
|
|
39
|
+
return {
|
|
40
|
+
onAction: (actionTag) => onAction(actionTag),
|
|
41
|
+
onStart,
|
|
42
|
+
onInit,
|
|
43
|
+
payload,
|
|
44
|
+
payloadPath,
|
|
45
|
+
constValue,
|
|
46
|
+
object,
|
|
47
|
+
merge,
|
|
48
|
+
dispatch: (args) => dispatch(args),
|
|
49
|
+
delay,
|
|
50
|
+
callById: (args) => callById(args),
|
|
51
|
+
call: (args) => call(args),
|
|
52
|
+
fragment: (fragmentId, steps) => fragment(fragmentId, steps),
|
|
53
|
+
withPolicy: (patch, part) => withPolicy(patch, part),
|
|
54
|
+
compose: (...parts) => compose(...parts),
|
|
55
|
+
make: (input) => make(input),
|
|
56
|
+
fromJSON: (def) => fromJSON(def)
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
60
|
+
var isReadonlyArray = (value) => Array.isArray(value);
|
|
61
|
+
var asNonEmptyString2 = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
|
|
62
|
+
var mergePolicy = (base, patch) => {
|
|
63
|
+
if (!base && !patch) return void 0;
|
|
64
|
+
return {
|
|
65
|
+
...base ?? {},
|
|
66
|
+
...patch ?? {}
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
var applyCallDefaults = (steps, patch) => {
|
|
70
|
+
const timeoutMsDefault = patch.timeoutMs;
|
|
71
|
+
const retryDefault = patch.retry;
|
|
72
|
+
const visit = (step) => {
|
|
73
|
+
if (step.kind !== "call") return step;
|
|
74
|
+
let changed = false;
|
|
75
|
+
const timeoutMs = step.timeoutMs ?? timeoutMsDefault;
|
|
76
|
+
if (timeoutMs !== step.timeoutMs) changed = true;
|
|
77
|
+
const retry = step.retry ?? retryDefault;
|
|
78
|
+
if (retry !== step.retry) changed = true;
|
|
79
|
+
const onSuccess = step.onSuccess.map(visit);
|
|
80
|
+
const onFailure = step.onFailure.map(visit);
|
|
81
|
+
if (onSuccess !== step.onSuccess) changed = true;
|
|
82
|
+
if (onFailure !== step.onFailure) changed = true;
|
|
83
|
+
if (!changed) return step;
|
|
84
|
+
return {
|
|
85
|
+
...step,
|
|
86
|
+
...timeoutMs !== void 0 ? { timeoutMs } : null,
|
|
87
|
+
...retry !== void 0 ? { retry } : null,
|
|
88
|
+
onSuccess,
|
|
89
|
+
onFailure
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
return steps.map(visit);
|
|
93
|
+
};
|
|
94
|
+
var resolveStepsInput = (input) => {
|
|
95
|
+
if (Array.isArray(input)) {
|
|
96
|
+
return { steps: input };
|
|
97
|
+
}
|
|
98
|
+
if (isRecord(input) && Array.isArray(input.steps)) {
|
|
99
|
+
return input;
|
|
100
|
+
}
|
|
101
|
+
throw makeWorkflowError({
|
|
102
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
103
|
+
message: 'Workflow.make: "steps" must be an array or a { steps, sources?, policy? } object.',
|
|
104
|
+
detail: { steps: input }
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
var recordSourcesForFragment = (sources, fragmentId, step) => {
|
|
108
|
+
sources[step.key] = { fragmentId };
|
|
109
|
+
if (step.kind !== "call") return;
|
|
110
|
+
for (const inner of step.onSuccess) recordSourcesForFragment(sources, fragmentId, inner);
|
|
111
|
+
for (const inner of step.onFailure) recordSourcesForFragment(sources, fragmentId, inner);
|
|
112
|
+
};
|
|
113
|
+
var onAction = (actionTag) => ({
|
|
114
|
+
kind: "action",
|
|
115
|
+
actionTag
|
|
116
|
+
});
|
|
117
|
+
var onStart = () => ({
|
|
118
|
+
kind: "lifecycle",
|
|
119
|
+
phase: "onStart"
|
|
120
|
+
});
|
|
121
|
+
var onInit = () => ({
|
|
122
|
+
kind: "lifecycle",
|
|
123
|
+
phase: "onInit"
|
|
124
|
+
});
|
|
125
|
+
var payload = () => ({ kind: "payload" });
|
|
126
|
+
var payloadPath = (pointer) => ({ kind: "payload.path", pointer });
|
|
127
|
+
var constValue = (value) => ({ kind: "const", value });
|
|
128
|
+
var object = (fields) => ({ kind: "object", fields });
|
|
129
|
+
var merge = (items) => ({ kind: "merge", items });
|
|
130
|
+
var dispatch = (args) => ({
|
|
131
|
+
kind: "dispatch",
|
|
132
|
+
key: args.key,
|
|
133
|
+
actionTag: args.actionTag,
|
|
134
|
+
...args.payload ? { payload: args.payload } : null
|
|
135
|
+
});
|
|
136
|
+
var delay = (args) => ({
|
|
137
|
+
kind: "delay",
|
|
138
|
+
key: args.key,
|
|
139
|
+
ms: args.ms
|
|
140
|
+
});
|
|
141
|
+
var callById = (args) => ({
|
|
142
|
+
kind: "call",
|
|
143
|
+
key: args.key,
|
|
144
|
+
serviceId: args.serviceId,
|
|
145
|
+
...args.input ? { input: args.input } : null,
|
|
146
|
+
...args.timeoutMs !== void 0 ? { timeoutMs: args.timeoutMs } : null,
|
|
147
|
+
...args.retry ? { retry: args.retry } : null,
|
|
148
|
+
onSuccess: args.onSuccess ?? [],
|
|
149
|
+
onFailure: args.onFailure ?? []
|
|
150
|
+
});
|
|
151
|
+
var call = (args) => {
|
|
152
|
+
const serviceId = fromTag(args.service);
|
|
153
|
+
if (!serviceId) {
|
|
154
|
+
throw makeWorkflowError({
|
|
155
|
+
code: "WORKFLOW_INVALID_SERVICE_ID",
|
|
156
|
+
message: "call(service): serviceId derived from tag must be a non-empty string (see 078 ServiceId contract).",
|
|
157
|
+
detail: { tag: String(args.service) }
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return callById({
|
|
161
|
+
...args,
|
|
162
|
+
serviceId
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
var fragment = (fragmentId, steps) => ({
|
|
166
|
+
fragmentId,
|
|
167
|
+
steps
|
|
168
|
+
});
|
|
169
|
+
var withPolicy = (patch, part) => {
|
|
170
|
+
let normalized;
|
|
171
|
+
if (isReadonlyArray(part)) {
|
|
172
|
+
normalized = { steps: part };
|
|
173
|
+
} else {
|
|
174
|
+
const partUnknown = part;
|
|
175
|
+
if (!isRecord(partUnknown) || !isReadonlyArray(partUnknown.steps)) {
|
|
176
|
+
throw makeWorkflowError({
|
|
177
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
178
|
+
message: "withPolicy: invalid workflow part (expected steps[] / fragment / composeResult).",
|
|
179
|
+
detail: { part }
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
normalized = {
|
|
183
|
+
steps: part.steps,
|
|
184
|
+
...part.sources ? { sources: part.sources } : null,
|
|
185
|
+
...part.policy ? { policy: part.policy } : null
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const steps = applyCallDefaults(normalized.steps, patch);
|
|
189
|
+
const patchPolicy = (() => {
|
|
190
|
+
const concurrency = patch.concurrency;
|
|
191
|
+
const priority = patch.priority;
|
|
192
|
+
return concurrency !== void 0 || priority !== void 0 ? { concurrency, priority } : void 0;
|
|
193
|
+
})();
|
|
194
|
+
const nextPolicy = mergePolicy(patchPolicy, normalized.policy);
|
|
195
|
+
return {
|
|
196
|
+
steps,
|
|
197
|
+
...normalized.sources ? { sources: normalized.sources } : null,
|
|
198
|
+
...nextPolicy ? { policy: nextPolicy } : null
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
var compose = (...parts) => {
|
|
202
|
+
const steps = [];
|
|
203
|
+
const sources = {};
|
|
204
|
+
let policy = void 0;
|
|
205
|
+
const ownersByKey = /* @__PURE__ */ new Map();
|
|
206
|
+
const recordOwner = (stepKey, fragmentId) => {
|
|
207
|
+
const list = ownersByKey.get(stepKey) ?? [];
|
|
208
|
+
list.push({ stepKey, ...fragmentId ? { fragmentId } : null });
|
|
209
|
+
ownersByKey.set(stepKey, list);
|
|
210
|
+
};
|
|
211
|
+
const recordOwners = (step, resolveFragmentId) => {
|
|
212
|
+
recordOwner(step.key, resolveFragmentId(step.key));
|
|
213
|
+
if (step.kind !== "call") return;
|
|
214
|
+
for (const inner of step.onSuccess) recordOwners(inner, resolveFragmentId);
|
|
215
|
+
for (const inner of step.onFailure) recordOwners(inner, resolveFragmentId);
|
|
216
|
+
};
|
|
217
|
+
for (const part of parts) {
|
|
218
|
+
if (isReadonlyArray(part)) {
|
|
219
|
+
steps.push(...part);
|
|
220
|
+
for (const step of part) recordOwners(step, () => void 0);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const partSteps = part.steps;
|
|
224
|
+
steps.push(...partSteps);
|
|
225
|
+
const partSources = part.sources;
|
|
226
|
+
if (partSources && typeof partSources === "object") {
|
|
227
|
+
for (const k of Object.keys(partSources).sort()) {
|
|
228
|
+
sources[k] = { ...partSources[k] };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const fragmentId = "fragmentId" in part ? part.fragmentId : void 0;
|
|
232
|
+
if (typeof fragmentId === "string" && fragmentId.length > 0) {
|
|
233
|
+
for (const step of partSteps) {
|
|
234
|
+
recordSourcesForFragment(sources, fragmentId, step);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const resolveFragmentIdForPart = (stepKey) => {
|
|
238
|
+
if (typeof fragmentId === "string" && fragmentId.length > 0) return fragmentId;
|
|
239
|
+
const fromSources = partSources?.[stepKey]?.fragmentId;
|
|
240
|
+
return typeof fromSources === "string" && fromSources.length > 0 ? fromSources : void 0;
|
|
241
|
+
};
|
|
242
|
+
for (const step of partSteps) recordOwners(step, resolveFragmentIdForPart);
|
|
243
|
+
policy = mergePolicy(policy, part.policy);
|
|
244
|
+
}
|
|
245
|
+
const finalSources = Object.keys(sources).length > 0 ? sources : void 0;
|
|
246
|
+
const duplicateKeys = Array.from(ownersByKey.entries()).filter(([, owners]) => owners.length > 1).map(([k]) => k).sort();
|
|
247
|
+
if (duplicateKeys.length > 0) {
|
|
248
|
+
const k = duplicateKeys[0];
|
|
249
|
+
throw makeWorkflowError({
|
|
250
|
+
code: "WORKFLOW_DUPLICATE_STEP_KEY",
|
|
251
|
+
message: `Duplicate stepKey "${k}" detected during composition.`,
|
|
252
|
+
source: { stepKey: k },
|
|
253
|
+
detail: { duplicateKey: k, owners: ownersByKey.get(k) ?? [] }
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
steps,
|
|
258
|
+
...finalSources ? { sources: finalSources } : null,
|
|
259
|
+
...policy ? { policy } : null
|
|
260
|
+
};
|
|
261
|
+
};
|
|
262
|
+
var make = (input) => {
|
|
263
|
+
const localId = asNonEmptyString2(input.localId);
|
|
264
|
+
if (!localId) {
|
|
265
|
+
throw makeWorkflowError({
|
|
266
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
267
|
+
message: "Workflow.make: localId must be a non-empty string.",
|
|
268
|
+
detail: { localId: input.localId }
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
const stepsInput = resolveStepsInput(input.steps);
|
|
272
|
+
const merged = mergePolicy(input.policy, stepsInput.policy);
|
|
273
|
+
const def = normalizeWorkflowDefV1({
|
|
274
|
+
astVersion: 1,
|
|
275
|
+
localId,
|
|
276
|
+
trigger: input.trigger,
|
|
277
|
+
...merged ? { policy: merged } : null,
|
|
278
|
+
steps: stepsInput.steps,
|
|
279
|
+
...stepsInput.sources ? { sources: stepsInput.sources } : null,
|
|
280
|
+
...input.meta ? { meta: input.meta } : null
|
|
281
|
+
});
|
|
282
|
+
const staticIrCache = /* @__PURE__ */ new Map();
|
|
283
|
+
return {
|
|
284
|
+
_tag: "Workflow",
|
|
285
|
+
def,
|
|
286
|
+
toJSON: () => def,
|
|
287
|
+
validate: () => validateWorkflowDefV1(def),
|
|
288
|
+
exportStaticIr: (moduleId) => {
|
|
289
|
+
const cached = staticIrCache.get(moduleId);
|
|
290
|
+
if (cached) return cached;
|
|
291
|
+
const ir = compileWorkflowStaticIrV1({ moduleId, def });
|
|
292
|
+
staticIrCache.set(moduleId, ir);
|
|
293
|
+
return ir;
|
|
294
|
+
},
|
|
295
|
+
install: (moduleTag) => installOne({
|
|
296
|
+
moduleTag,
|
|
297
|
+
program: { _tag: "Workflow", def }
|
|
298
|
+
})
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
var fromJSON = (def) => make({
|
|
302
|
+
localId: def.localId,
|
|
303
|
+
trigger: def.trigger,
|
|
304
|
+
...def.policy ? { policy: def.policy } : null,
|
|
305
|
+
steps: {
|
|
306
|
+
steps: def.steps,
|
|
307
|
+
...def.sources ? { sources: def.sources } : null
|
|
308
|
+
},
|
|
309
|
+
...def.meta ? { meta: def.meta } : null
|
|
310
|
+
});
|
|
311
|
+
export {
|
|
312
|
+
KernelPorts,
|
|
313
|
+
call,
|
|
314
|
+
callById,
|
|
315
|
+
compose,
|
|
316
|
+
constValue,
|
|
317
|
+
delay,
|
|
318
|
+
dispatch,
|
|
319
|
+
forModule,
|
|
320
|
+
fragment,
|
|
321
|
+
fromJSON,
|
|
322
|
+
make,
|
|
323
|
+
merge,
|
|
324
|
+
object,
|
|
325
|
+
onAction,
|
|
326
|
+
onInit,
|
|
327
|
+
onStart,
|
|
328
|
+
payload,
|
|
329
|
+
payloadPath,
|
|
330
|
+
withPolicy
|
|
331
|
+
};
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvV29ya2Zsb3cudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc2VydmljZUlkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuL2ludGVybmFsL29ic2VydmFiaWxpdHkvanNvblZhbHVlLmpzJ1xuaW1wb3J0IHsgZnJvbVRhZyBhcyBzZXJ2aWNlSWRGcm9tVGFnIH0gZnJvbSAnLi9pbnRlcm5hbC9zZXJ2aWNlSWQuanMnXG5pbXBvcnQgeyBtYWtlV29ya2Zsb3dFcnJvciB9IGZyb20gJy4vaW50ZXJuYWwvd29ya2Zsb3cvZXJyb3JzLmpzJ1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlTG9naWMsIE1vZHVsZVRhZyB9IGZyb20gJy4vaW50ZXJuYWwvbW9kdWxlLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBJbnB1dEV4cHJWMSxcbiAgV29ya2Zsb3dDb21wb3NlUmVzdWx0VjEsXG4gIFdvcmtmbG93RGVmVjEsXG4gIFdvcmtmbG93RnJhZ21lbnRWMSxcbiAgV29ya2Zsb3dQYXJ0VjEsXG4gIFdvcmtmbG93UG9saWN5VjEsXG4gIFdvcmtmbG93U3RhdGljSXJWMSxcbiAgV29ya2Zsb3dTdGVwVjEsXG4gIFdvcmtmbG93VHJpZ2dlclYxLFxufSBmcm9tICcuL2ludGVybmFsL3dvcmtmbG93L21vZGVsLmpzJ1xuaW1wb3J0IHsgY29tcGlsZVdvcmtmbG93U3RhdGljSXJWMSwgbm9ybWFsaXplV29ya2Zsb3dEZWZWMSwgdmFsaWRhdGVXb3JrZmxvd0RlZlYxIH0gZnJvbSAnLi9pbnRlcm5hbC93b3JrZmxvdy9jb21waWxlci5qcydcbmltcG9ydCAqIGFzIFdvcmtmbG93UnVudGltZSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9Xb3JrZmxvd1J1bnRpbWUuanMnXG5cbmV4cG9ydCB0eXBlIEFjdGlvblRhZ3NPZk1vZHVsZTxNPiA9IE0gZXh0ZW5kcyB7IHJlYWRvbmx5IGFjdGlvbnM6IGluZmVyIEEgfSA/IEV4dHJhY3Q8a2V5b2YgQSwgc3RyaW5nPiA6IHN0cmluZ1xuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1RyaWdnZXI8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnYWN0aW9uJzsgcmVhZG9ubHkgYWN0aW9uVGFnOiBBY3Rpb25UYWcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2xpZmVjeWNsZSc7IHJlYWRvbmx5IHBoYXNlOiAnb25TdGFydCcgfCAnb25Jbml0JyB9XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93UG9saWN5ID0gV29ya2Zsb3dQb2xpY3lWMVxuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZGlzcGF0Y2gnOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgYWN0aW9uVGFnOiBBY3Rpb25UYWc7IHJlYWRvbmx5IHBheWxvYWQ/OiBJbnB1dEV4cHJWMSB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZGVsYXknOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgbXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogJ2NhbGwnXG4gICAgICByZWFkb25seSBrZXk6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgc2VydmljZUlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGlucHV0PzogSW5wdXRFeHByVjFcbiAgICAgIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcmV0cnk/OiB7IHJlYWRvbmx5IHRpbWVzOiBudW1iZXIgfVxuICAgICAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICAgICAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICAgIH1cblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dEZWY8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgYXN0VmVyc2lvbjogMVxuICByZWFkb25seSBsb2NhbElkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJpZ2dlcjogV29ya2Zsb3dUcmlnZ2VyPEFjdGlvblRhZz5cbiAgcmVhZG9ubHkgcG9saWN5PzogV29ya2Zsb3dQb2xpY3lWMVxuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgc291cmNlcz86IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXVxuICByZWFkb25seSBtZXRhPzogeyByZWFkb25seSBnZW5lcmF0b3I/OiBKc29uVmFsdWUgfVxufVxuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1N0YXRpY0lyID0gV29ya2Zsb3dTdGF0aWNJclYxXG5leHBvcnQgdHlwZSBJbnB1dEV4cHIgPSBJbnB1dEV4cHJWMVxuXG5leHBvcnQgdHlwZSBXb3JrZmxvd0ZyYWdtZW50PEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHJlYWRvbmx5IGZyYWdtZW50SWQ6IHN0cmluZ1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgc291cmNlcz86IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXVxuICByZWFkb25seSBwb2xpY3k/OiBXb3JrZmxvd1BvbGljeVYxXG59XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWcgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgc291cmNlcz86IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXVxuICByZWFkb25seSBwb2xpY3k/OiBXb3JrZmxvd1BvbGljeVYxXG59XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93UGFydDxBY3Rpb25UYWcgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID1cbiAgfCBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICB8IFdvcmtmbG93RnJhZ21lbnQ8QWN0aW9uVGFnPlxuICB8IFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWc+XG5cbmNsYXNzIEtlcm5lbFNvdXJjZVJlZnJlc2hQb3J0VGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKCdsb2dpeC9rZXJuZWwvc291cmNlUmVmcmVzaCcpPFxuICBLZXJuZWxTb3VyY2VSZWZyZXNoUG9ydFRhZ0ltcGwsXG4gIHVua25vd25cbj4oKSB7fVxuXG5leHBvcnQgY29uc3QgS2VybmVsUG9ydHMgPSB7XG4gIHNvdXJjZVJlZnJlc2g6IEtlcm5lbFNvdXJjZVJlZnJlc2hQb3J0VGFnSW1wbCxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGZvck1vZHVsZSA9IDxNIGV4dGVuZHMgeyByZWFkb25seSBhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PihfbW9kdWxlOiBNKSA9PiB7XG4gIHR5cGUgQWN0aW9uVGFnID0gQWN0aW9uVGFnc09mTW9kdWxlPE0+XG5cbiAgcmV0dXJuIHtcbiAgICBvbkFjdGlvbjogKGFjdGlvblRhZzogQWN0aW9uVGFnKSA9PiBvbkFjdGlvbihhY3Rpb25UYWcpLFxuICAgIG9uU3RhcnQsXG4gICAgb25Jbml0LFxuICAgIHBheWxvYWQsXG4gICAgcGF5bG9hZFBhdGgsXG4gICAgY29uc3RWYWx1ZSxcbiAgICBvYmplY3QsXG4gICAgbWVyZ2UsXG4gICAgZGlzcGF0Y2g6IChhcmdzOiB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBhY3Rpb25UYWc6IEFjdGlvblRhZzsgcmVhZG9ubHkgcGF5bG9hZD86IElucHV0RXhwciB9KSA9PiBkaXNwYXRjaChhcmdzKSxcbiAgICBkZWxheSxcbiAgICBjYWxsQnlJZDogKGFyZ3M6IHtcbiAgICAgIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gICAgICByZWFkb25seSBzZXJ2aWNlSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5wdXQ/OiBJbnB1dEV4cHJcbiAgICAgIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcmV0cnk/OiB7IHJlYWRvbmx5IHRpbWVzOiBudW1iZXIgfVxuICAgICAgcmVhZG9ubHkgb25TdWNjZXNzPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgICAgIHJlYWRvbmx5IG9uRmFpbHVyZT86IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwPEFjdGlvblRhZz4+XG4gICAgfSkgPT4gY2FsbEJ5SWQ8QWN0aW9uVGFnPihhcmdzKSxcbiAgICBjYWxsOiA8SWQsIFN2Yz4oYXJnczoge1xuICAgICAgcmVhZG9ubHkga2V5OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHNlcnZpY2U6IENvbnRleHQuVGFnPElkLCBTdmM+XG4gICAgICByZWFkb25seSBpbnB1dD86IElucHV0RXhwclxuICAgICAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyXG4gICAgICByZWFkb25seSByZXRyeT86IHsgcmVhZG9ubHkgdGltZXM6IG51bWJlciB9XG4gICAgICByZWFkb25seSBvblN1Y2Nlc3M/OiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICAgICAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgICB9KSA9PiBjYWxsKGFyZ3MpLFxuICAgIGZyYWdtZW50OiAoZnJhZ21lbnRJZDogc3RyaW5nLCBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj4pID0+IGZyYWdtZW50PEFjdGlvblRhZz4oZnJhZ21lbnRJZCwgc3RlcHMpLFxuICAgIHdpdGhQb2xpY3k6IChwYXRjaDogV2l0aFBvbGljeVBhdGNoLCBwYXJ0OiBXb3JrZmxvd1BhcnQ8QWN0aW9uVGFnPikgPT4gd2l0aFBvbGljeTxBY3Rpb25UYWc+KHBhdGNoLCBwYXJ0KSxcbiAgICBjb21wb3NlOiAoLi4ucGFydHM6IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dQYXJ0PEFjdGlvblRhZz4+KSA9PiBjb21wb3NlPEFjdGlvblRhZz4oLi4ucGFydHMpLFxuICAgIG1ha2U6IChpbnB1dDoge1xuICAgICAgcmVhZG9ubHkgYXN0VmVyc2lvbj86IDFcbiAgICAgIHJlYWRvbmx5IGxvY2FsSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdHJpZ2dlcjogV29ya2Zsb3dUcmlnZ2VyPEFjdGlvblRhZz5cbiAgICAgIHJlYWRvbmx5IHBvbGljeT86IFdvcmtmbG93UG9saWN5XG4gICAgICByZWFkb25seSBzdGVwczogV29ya2Zsb3dTdGVwc0lucHV0PEFjdGlvblRhZz5cbiAgICAgIHJlYWRvbmx5IG1ldGE/OiB7IHJlYWRvbmx5IGdlbmVyYXRvcj86IEpzb25WYWx1ZSB9XG4gICAgfSkgPT4gbWFrZTxNPihpbnB1dCksXG4gICAgZnJvbUpTT046IChkZWY6IFdvcmtmbG93RGVmPEFjdGlvblRhZz4pID0+IGZyb21KU09OPEFjdGlvblRhZz4oZGVmKSxcbiAgfSBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBXaXRoUG9saWN5UGF0Y2ggPSB7XG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogV29ya2Zsb3dQb2xpY3lWMVsnY29uY3VycmVuY3knXVxuICByZWFkb25seSBwcmlvcml0eT86IFdvcmtmbG93UG9saWN5VjFbJ3ByaW9yaXR5J11cbiAgLyoqIERlZmF1bHQgZm9yIGNhbGwudGltZW91dE1zIChvbmx5IGZpbGxzIHdoZW4gc3RlcC50aW1lb3V0TXMgaXMgbWlzc2luZykuICovXG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAvKiogRGVmYXVsdCBmb3IgY2FsbC5yZXRyeS50aW1lcyAob25seSBmaWxscyB3aGVuIHN0ZXAucmV0cnkgaXMgbWlzc2luZykuICovXG4gIHJlYWRvbmx5IHJldHJ5PzogeyByZWFkb25seSB0aW1lczogbnVtYmVyIH1cbn1cblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dTdGVwc0lucHV0PEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPVxuICB8IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwPEFjdGlvblRhZz4+XG4gIHwgKFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWc+ICYge1xuICAgICAgcmVhZG9ubHkgc3RlcHM6IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwPEFjdGlvblRhZz4+XG4gICAgfSlcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvdyB7XG4gIHJlYWRvbmx5IF90YWc6ICdXb3JrZmxvdydcbiAgcmVhZG9ubHkgZGVmOiBXb3JrZmxvd0RlZlYxXG4gIHJlYWRvbmx5IHRvSlNPTjogKCkgPT4gV29ya2Zsb3dEZWZWMVxuICByZWFkb25seSB2YWxpZGF0ZTogKCkgPT4gdm9pZFxuICByZWFkb25seSBleHBvcnRTdGF0aWNJcjogKG1vZHVsZUlkOiBzdHJpbmcpID0+IFdvcmtmbG93U3RhdGljSXJWMVxuICByZWFkb25seSBpbnN0YWxsOiAobW9kdWxlVGFnOiBNb2R1bGVUYWc8c3RyaW5nLCBBbnlNb2R1bGVTaGFwZT4pID0+IE1vZHVsZUxvZ2ljPEFueU1vZHVsZVNoYXBlLCB1bmtub3duLCBuZXZlcj5cbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc1JlYWRvbmx5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWFkb25seUFycmF5PHVua25vd24+ID0+IEFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCA/IHZhbHVlLnRyaW0oKSA6IHVuZGVmaW5lZFxuXG5jb25zdCBtZXJnZVBvbGljeSA9IChiYXNlOiBXb3JrZmxvd1BvbGljeVYxIHwgdW5kZWZpbmVkLCBwYXRjaDogV29ya2Zsb3dQb2xpY3lWMSB8IHVuZGVmaW5lZCk6IFdvcmtmbG93UG9saWN5VjEgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWJhc2UgJiYgIXBhdGNoKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7XG4gICAgLi4uKGJhc2UgPz8ge30pLFxuICAgIC4uLihwYXRjaCA/PyB7fSksXG4gIH1cbn1cblxuY29uc3QgYXBwbHlDYWxsRGVmYXVsdHMgPSAoc3RlcHM6IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+LCBwYXRjaDogV2l0aFBvbGljeVBhdGNoKTogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4gPT4ge1xuICBjb25zdCB0aW1lb3V0TXNEZWZhdWx0ID0gcGF0Y2gudGltZW91dE1zXG4gIGNvbnN0IHJldHJ5RGVmYXVsdCA9IHBhdGNoLnJldHJ5XG5cbiAgY29uc3QgdmlzaXQgPSAoc3RlcDogV29ya2Zsb3dTdGVwVjEpOiBXb3JrZmxvd1N0ZXBWMSA9PiB7XG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSByZXR1cm4gc3RlcFxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGNvbnN0IHRpbWVvdXRNcyA9IHN0ZXAudGltZW91dE1zID8/IHRpbWVvdXRNc0RlZmF1bHRcbiAgICBpZiAodGltZW91dE1zICE9PSBzdGVwLnRpbWVvdXRNcykgY2hhbmdlZCA9IHRydWVcblxuICAgIGNvbnN0IHJldHJ5ID0gc3RlcC5yZXRyeSA/PyByZXRyeURlZmF1bHRcbiAgICBpZiAocmV0cnkgIT09IHN0ZXAucmV0cnkpIGNoYW5nZWQgPSB0cnVlXG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSBzdGVwLm9uU3VjY2Vzcy5tYXAodmlzaXQpXG4gICAgY29uc3Qgb25GYWlsdXJlID0gc3RlcC5vbkZhaWx1cmUubWFwKHZpc2l0KVxuICAgIGlmIChvblN1Y2Nlc3MgIT09IHN0ZXAub25TdWNjZXNzKSBjaGFuZ2VkID0gdHJ1ZVxuICAgIGlmIChvbkZhaWx1cmUgIT09IHN0ZXAub25GYWlsdXJlKSBjaGFuZ2VkID0gdHJ1ZVxuXG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm4gc3RlcFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0ZXAsXG4gICAgICAuLi4odGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNcyB9IDogbnVsbCksXG4gICAgICAuLi4ocmV0cnkgIT09IHVuZGVmaW5lZCA/IHsgcmV0cnkgfSA6IG51bGwpLFxuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25GYWlsdXJlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGVwcy5tYXAodmlzaXQpXG59XG5cbmNvbnN0IHJlc29sdmVTdGVwc0lucHV0ID0gKGlucHV0OiB1bmtub3duKTogV29ya2Zsb3dDb21wb3NlUmVzdWx0VjEgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4geyBzdGVwczogaW5wdXQgYXMgUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4gfVxuICB9XG4gIGlmIChpc1JlY29yZChpbnB1dCkgJiYgQXJyYXkuaXNBcnJheShpbnB1dC5zdGVwcykpIHtcbiAgICByZXR1cm4gaW5wdXQgYXMgV29ya2Zsb3dDb21wb3NlUmVzdWx0VjFcbiAgfVxuICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICBtZXNzYWdlOiAnV29ya2Zsb3cubWFrZTogXCJzdGVwc1wiIG11c3QgYmUgYW4gYXJyYXkgb3IgYSB7IHN0ZXBzLCBzb3VyY2VzPywgcG9saWN5PyB9IG9iamVjdC4nLFxuICAgIGRldGFpbDogeyBzdGVwczogaW5wdXQgfSxcbiAgfSlcbn1cblxuY29uc3QgcmVjb3JkU291cmNlc0ZvckZyYWdtZW50ID0gKFxuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCB7IHJlYWRvbmx5IGZyYWdtZW50SWQ/OiBzdHJpbmcgfT4sXG4gIGZyYWdtZW50SWQ6IHN0cmluZyxcbiAgc3RlcDogV29ya2Zsb3dTdGVwVjEsXG4pOiB2b2lkID0+IHtcbiAgc291cmNlc1tzdGVwLmtleV0gPSB7IGZyYWdtZW50SWQgfVxuICBpZiAoc3RlcC5raW5kICE9PSAnY2FsbCcpIHJldHVyblxuICBmb3IgKGNvbnN0IGlubmVyIG9mIHN0ZXAub25TdWNjZXNzKSByZWNvcmRTb3VyY2VzRm9yRnJhZ21lbnQoc291cmNlcywgZnJhZ21lbnRJZCwgaW5uZXIpXG4gIGZvciAoY29uc3QgaW5uZXIgb2Ygc3RlcC5vbkZhaWx1cmUpIHJlY29yZFNvdXJjZXNGb3JGcmFnbWVudChzb3VyY2VzLCBmcmFnbWVudElkLCBpbm5lcilcbn1cblxuZXhwb3J0IGNvbnN0IG9uQWN0aW9uID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZz4oYWN0aW9uVGFnOiBBY3Rpb25UYWcpOiBFeHRyYWN0PFdvcmtmbG93VHJpZ2dlcjxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdhY3Rpb24nIH0+ID0+ICh7XG4gIGtpbmQ6ICdhY3Rpb24nLFxuICBhY3Rpb25UYWcsXG59KVxuXG5leHBvcnQgY29uc3Qgb25TdGFydCA9ICgpOiB7IHJlYWRvbmx5IGtpbmQ6ICdsaWZlY3ljbGUnOyByZWFkb25seSBwaGFzZTogJ29uU3RhcnQnIH0gPT4gKHtcbiAga2luZDogJ2xpZmVjeWNsZScsXG4gIHBoYXNlOiAnb25TdGFydCcsXG59KVxuXG5leHBvcnQgY29uc3Qgb25Jbml0ID0gKCk6IHsgcmVhZG9ubHkga2luZDogJ2xpZmVjeWNsZSc7IHJlYWRvbmx5IHBoYXNlOiAnb25Jbml0JyB9ID0+ICh7XG4gIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICBwaGFzZTogJ29uSW5pdCcsXG59KVxuXG5leHBvcnQgY29uc3QgcGF5bG9hZCA9ICgpOiBJbnB1dEV4cHJWMSA9PiAoeyBraW5kOiAncGF5bG9hZCcgfSlcblxuZXhwb3J0IGNvbnN0IHBheWxvYWRQYXRoID0gKHBvaW50ZXI6IHN0cmluZyk6IElucHV0RXhwclYxID0+ICh7IGtpbmQ6ICdwYXlsb2FkLnBhdGgnLCBwb2ludGVyIH0pXG5cbmV4cG9ydCBjb25zdCBjb25zdFZhbHVlID0gKHZhbHVlOiBKc29uVmFsdWUpOiBJbnB1dEV4cHJWMSA9PiAoeyBraW5kOiAnY29uc3QnLCB2YWx1ZSB9KVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKGZpZWxkczogUmVjb3JkPHN0cmluZywgSW5wdXRFeHByVjE+KTogSW5wdXRFeHByVjEgPT4gKHsga2luZDogJ29iamVjdCcsIGZpZWxkcyB9KVxuXG5leHBvcnQgY29uc3QgbWVyZ2UgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8SW5wdXRFeHByVjE+KTogSW5wdXRFeHByVjEgPT4gKHsga2luZDogJ21lcmdlJywgaXRlbXMgfSlcblxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZz4oYXJnczoge1xuICByZWFkb25seSBrZXk6IHN0cmluZ1xuICByZWFkb25seSBhY3Rpb25UYWc6IEFjdGlvblRhZ1xuICByZWFkb25seSBwYXlsb2FkPzogSW5wdXRFeHByVjFcbn0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdkaXNwYXRjaCcgfT4gPT4gKHtcbiAga2luZDogJ2Rpc3BhdGNoJyxcbiAga2V5OiBhcmdzLmtleSxcbiAgYWN0aW9uVGFnOiBhcmdzLmFjdGlvblRhZyxcbiAgLi4uKGFyZ3MucGF5bG9hZCA/IHsgcGF5bG9hZDogYXJncy5wYXlsb2FkIH0gOiBudWxsKSxcbn0pXG5cbmV4cG9ydCBjb25zdCBkZWxheSA9IChhcmdzOiB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBtczogbnVtYmVyIH0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcCwgeyBraW5kOiAnZGVsYXknIH0+ID0+ICh7XG4gIGtpbmQ6ICdkZWxheScsXG4gIGtleTogYXJncy5rZXksXG4gIG1zOiBhcmdzLm1zLFxufSlcblxuZXhwb3J0IGNvbnN0IGNhbGxCeUlkID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPihhcmdzOiB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gIHJlYWRvbmx5IHNlcnZpY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGlucHV0PzogSW5wdXRFeHByVjFcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IHJldHJ5PzogeyByZWFkb25seSB0aW1lczogbnVtYmVyIH1cbiAgcmVhZG9ubHkgb25TdWNjZXNzPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbn0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdjYWxsJyB9PiA9PiAoe1xuICBraW5kOiAnY2FsbCcsXG4gIGtleTogYXJncy5rZXksXG4gIHNlcnZpY2VJZDogYXJncy5zZXJ2aWNlSWQsXG4gIC4uLihhcmdzLmlucHV0ID8geyBpbnB1dDogYXJncy5pbnB1dCB9IDogbnVsbCksXG4gIC4uLihhcmdzLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IGFyZ3MudGltZW91dE1zIH0gOiBudWxsKSxcbiAgLi4uKGFyZ3MucmV0cnkgPyB7IHJldHJ5OiBhcmdzLnJldHJ5IH0gOiBudWxsKSxcbiAgb25TdWNjZXNzOiBhcmdzLm9uU3VjY2VzcyA/PyBbXSxcbiAgb25GYWlsdXJlOiBhcmdzLm9uRmFpbHVyZSA/PyBbXSxcbn0pXG5cbmV4cG9ydCBjb25zdCBjYWxsID0gPElkLCBTdmMsIEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPihhcmdzOiB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gIHJlYWRvbmx5IHNlcnZpY2U6IENvbnRleHQuVGFnPElkLCBTdmM+XG4gIHJlYWRvbmx5IGlucHV0PzogSW5wdXRFeHByVjFcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IHJldHJ5PzogeyByZWFkb25seSB0aW1lczogbnVtYmVyIH1cbiAgcmVhZG9ubHkgb25TdWNjZXNzPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbn0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdjYWxsJyB9PiA9PiB7XG4gIGNvbnN0IHNlcnZpY2VJZCA9IHNlcnZpY2VJZEZyb21UYWcoYXJncy5zZXJ2aWNlKVxuICBpZiAoIXNlcnZpY2VJZCkge1xuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NFUlZJQ0VfSUQnLFxuICAgICAgbWVzc2FnZTogJ2NhbGwoc2VydmljZSk6IHNlcnZpY2VJZCBkZXJpdmVkIGZyb20gdGFnIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIChzZWUgMDc4IFNlcnZpY2VJZCBjb250cmFjdCkuJyxcbiAgICAgIGRldGFpbDogeyB0YWc6IFN0cmluZyhhcmdzLnNlcnZpY2UpIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBjYWxsQnlJZDxBY3Rpb25UYWc+KHtcbiAgICAuLi5hcmdzLFxuICAgIHNlcnZpY2VJZCxcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPihcbiAgZnJhZ21lbnRJZDogc3RyaW5nLFxuICBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj4sXG4pOiBXb3JrZmxvd0ZyYWdtZW50PEFjdGlvblRhZz4gPT4gKHtcbiAgZnJhZ21lbnRJZCxcbiAgc3RlcHMsXG59KVxuXG5leHBvcnQgY29uc3Qgd2l0aFBvbGljeSA9IDxBY3Rpb25UYWcgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcj4oXG4gIHBhdGNoOiBXaXRoUG9saWN5UGF0Y2gsXG4gIHBhcnQ6IFdvcmtmbG93UGFydDxBY3Rpb25UYWc+LFxuKTogV29ya2Zsb3dDb21wb3NlUmVzdWx0PEFjdGlvblRhZz4gPT4ge1xuICBsZXQgbm9ybWFsaXplZDogV29ya2Zsb3dDb21wb3NlUmVzdWx0PEFjdGlvblRhZz5cbiAgaWYgKGlzUmVhZG9ubHlBcnJheShwYXJ0KSkge1xuICAgIG5vcm1hbGl6ZWQgPSB7IHN0ZXBzOiBwYXJ0IH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXJ0VW5rbm93bjogdW5rbm93biA9IHBhcnRcbiAgICBpZiAoIWlzUmVjb3JkKHBhcnRVbmtub3duKSB8fCAhaXNSZWFkb25seUFycmF5KHBhcnRVbmtub3duLnN0ZXBzKSkge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgICBtZXNzYWdlOiAnd2l0aFBvbGljeTogaW52YWxpZCB3b3JrZmxvdyBwYXJ0IChleHBlY3RlZCBzdGVwc1tdIC8gZnJhZ21lbnQgLyBjb21wb3NlUmVzdWx0KS4nLFxuICAgICAgICBkZXRhaWw6IHsgcGFydCB9LFxuICAgICAgfSlcbiAgICB9XG4gICAgbm9ybWFsaXplZCA9IHtcbiAgICAgIHN0ZXBzOiBwYXJ0LnN0ZXBzLFxuICAgICAgLi4uKHBhcnQuc291cmNlcyA/IHsgc291cmNlczogcGFydC5zb3VyY2VzIH0gOiBudWxsKSxcbiAgICAgIC4uLihwYXJ0LnBvbGljeSA/IHsgcG9saWN5OiBwYXJ0LnBvbGljeSB9IDogbnVsbCksXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RlcHMgPSBhcHBseUNhbGxEZWZhdWx0cyhub3JtYWxpemVkLnN0ZXBzIGFzIFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+LCBwYXRjaCkgYXMgUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgY29uc3QgcGF0Y2hQb2xpY3k6IFdvcmtmbG93UG9saWN5VjEgfCB1bmRlZmluZWQgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gcGF0Y2guY29uY3VycmVuY3lcbiAgICBjb25zdCBwcmlvcml0eSA9IHBhdGNoLnByaW9yaXR5XG4gICAgcmV0dXJuIGNvbmN1cnJlbmN5ICE9PSB1bmRlZmluZWQgfHwgcHJpb3JpdHkgIT09IHVuZGVmaW5lZCA/IHsgY29uY3VycmVuY3ksIHByaW9yaXR5IH0gOiB1bmRlZmluZWRcbiAgfSkoKVxuXG4gIC8vIE91dGVyIHdpdGhQb2xpY3kgaXMgd2Vha2VyIHRoYW4gaW5uZXIgKG5lc3RlZCkgcG9saWNpZXM6IG9ubHkgZmlsbCBtaXNzaW5nIHByb2dyYW0gcG9saWN5IGZpZWxkcy5cbiAgY29uc3QgbmV4dFBvbGljeSA9IG1lcmdlUG9saWN5KHBhdGNoUG9saWN5LCBub3JtYWxpemVkLnBvbGljeSlcblxuICByZXR1cm4ge1xuICAgIHN0ZXBzLFxuICAgIC4uLihub3JtYWxpemVkLnNvdXJjZXMgPyB7IHNvdXJjZXM6IG5vcm1hbGl6ZWQuc291cmNlcyB9IDogbnVsbCksXG4gICAgLi4uKG5leHRQb2xpY3kgPyB7IHBvbGljeTogbmV4dFBvbGljeSB9IDogbnVsbCksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBvc2UgPSA8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+KFxuICAuLi5wYXJ0czogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1BhcnQ8QWN0aW9uVGFnPj5cbik6IFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWc+ID0+IHtcbiAgY29uc3Qgc3RlcHM6IEFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PiA9IFtdXG4gIGNvbnN0IHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIHsgcmVhZG9ubHkgZnJhZ21lbnRJZD86IHN0cmluZyB9PiA9IHt9XG4gIGxldCBwb2xpY3k6IFdvcmtmbG93UG9saWN5VjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICBjb25zdCBvd25lcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IHJlYWRvbmx5IHN0ZXBLZXk6IHN0cmluZzsgcmVhZG9ubHkgZnJhZ21lbnRJZD86IHN0cmluZyB9Pj4oKVxuXG4gIGNvbnN0IHJlY29yZE93bmVyID0gKHN0ZXBLZXk6IHN0cmluZywgZnJhZ21lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IG93bmVyc0J5S2V5LmdldChzdGVwS2V5KSA/PyBbXVxuICAgIGxpc3QucHVzaCh7IHN0ZXBLZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9KVxuICAgIG93bmVyc0J5S2V5LnNldChzdGVwS2V5LCBsaXN0KVxuICB9XG5cbiAgY29uc3QgcmVjb3JkT3duZXJzID0gKFxuICAgIHN0ZXA6IFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LFxuICAgIHJlc29sdmVGcmFnbWVudElkOiAoc3RlcEtleTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQgPT4ge1xuICAgIHJlY29yZE93bmVyKHN0ZXAua2V5LCByZXNvbHZlRnJhZ21lbnRJZChzdGVwLmtleSkpXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSByZXR1cm5cbiAgICBmb3IgKGNvbnN0IGlubmVyIG9mIHN0ZXAub25TdWNjZXNzKSByZWNvcmRPd25lcnMoaW5uZXIsIHJlc29sdmVGcmFnbWVudElkKVxuICAgIGZvciAoY29uc3QgaW5uZXIgb2Ygc3RlcC5vbkZhaWx1cmUpIHJlY29yZE93bmVycyhpbm5lciwgcmVzb2x2ZUZyYWdtZW50SWQpXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KHBhcnQpKSB7XG4gICAgICBzdGVwcy5wdXNoKC4uLnBhcnQpXG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGFydCkgcmVjb3JkT3duZXJzKHN0ZXAsICgpID0+IHVuZGVmaW5lZClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gZnJhZ21lbnQgLyBjb21wb3NlUmVzdWx0IChib3RoIGNhcnJ5IGBzdGVwc2ApXG4gICAgY29uc3QgcGFydFN0ZXBzID0gcGFydC5zdGVwc1xuICAgIHN0ZXBzLnB1c2goLi4ucGFydFN0ZXBzKVxuXG4gICAgY29uc3QgcGFydFNvdXJjZXMgPSBwYXJ0LnNvdXJjZXNcbiAgICBpZiAocGFydFNvdXJjZXMgJiYgdHlwZW9mIHBhcnRTb3VyY2VzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHBhcnRTb3VyY2VzKS5zb3J0KCkpIHtcbiAgICAgICAgc291cmNlc1trXSA9IHsgLi4ucGFydFNvdXJjZXNba10hIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmcmFnbWVudElkID0gJ2ZyYWdtZW50SWQnIGluIHBhcnQgPyBwYXJ0LmZyYWdtZW50SWQgOiB1bmRlZmluZWRcbiAgICBpZiAodHlwZW9mIGZyYWdtZW50SWQgPT09ICdzdHJpbmcnICYmIGZyYWdtZW50SWQubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBhcnRTdGVwcyBhcyBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPikge1xuICAgICAgICByZWNvcmRTb3VyY2VzRm9yRnJhZ21lbnQoc291cmNlcywgZnJhZ21lbnRJZCwgc3RlcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlRnJhZ21lbnRJZEZvclBhcnQgPSAoc3RlcEtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZnJhZ21lbnRJZCA9PT0gJ3N0cmluZycgJiYgZnJhZ21lbnRJZC5sZW5ndGggPiAwKSByZXR1cm4gZnJhZ21lbnRJZFxuICAgICAgY29uc3QgZnJvbVNvdXJjZXMgPSBwYXJ0U291cmNlcz8uW3N0ZXBLZXldPy5mcmFnbWVudElkXG4gICAgICByZXR1cm4gdHlwZW9mIGZyb21Tb3VyY2VzID09PSAnc3RyaW5nJyAmJiBmcm9tU291cmNlcy5sZW5ndGggPiAwID8gZnJvbVNvdXJjZXMgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHBhcnRTdGVwcykgcmVjb3JkT3duZXJzKHN0ZXAsIHJlc29sdmVGcmFnbWVudElkRm9yUGFydClcblxuICAgIHBvbGljeSA9IG1lcmdlUG9saWN5KHBvbGljeSwgcGFydC5wb2xpY3kpXG4gIH1cblxuICBjb25zdCBmaW5hbFNvdXJjZXM6IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXSB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHNvdXJjZXMpLmxlbmd0aCA+IDAgPyBzb3VyY2VzIDogdW5kZWZpbmVkXG4gIGNvbnN0IGR1cGxpY2F0ZUtleXMgPSBBcnJheS5mcm9tKG93bmVyc0J5S2V5LmVudHJpZXMoKSlcbiAgICAuZmlsdGVyKChbLCBvd25lcnNdKSA9PiBvd25lcnMubGVuZ3RoID4gMSlcbiAgICAubWFwKChba10pID0+IGspXG4gICAgLnNvcnQoKVxuICBpZiAoZHVwbGljYXRlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgayA9IGR1cGxpY2F0ZUtleXNbMF0hXG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0RVUExJQ0FURV9TVEVQX0tFWScsXG4gICAgICBtZXNzYWdlOiBgRHVwbGljYXRlIHN0ZXBLZXkgXCIke2t9XCIgZGV0ZWN0ZWQgZHVyaW5nIGNvbXBvc2l0aW9uLmAsXG4gICAgICBzb3VyY2U6IHsgc3RlcEtleTogayB9LFxuICAgICAgZGV0YWlsOiB7IGR1cGxpY2F0ZUtleTogaywgb3duZXJzOiBvd25lcnNCeUtleS5nZXQoaykgPz8gW10gfSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGVwcyxcbiAgICAuLi4oZmluYWxTb3VyY2VzID8geyBzb3VyY2VzOiBmaW5hbFNvdXJjZXMgfSA6IG51bGwpLFxuICAgIC4uLihwb2xpY3kgPyB7IHBvbGljeSB9IDogbnVsbCksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSA8TSA9IHVua25vd24+KGlucHV0OiB7XG4gIHJlYWRvbmx5IGFzdFZlcnNpb24/OiAxXG4gIHJlYWRvbmx5IGxvY2FsSWQ6IHN0cmluZ1xuICByZWFkb25seSB0cmlnZ2VyOiBXb3JrZmxvd1RyaWdnZXI8QWN0aW9uVGFnc09mTW9kdWxlPE0+PlxuICByZWFkb25seSBwb2xpY3k/OiBXb3JrZmxvd1BvbGljeVYxXG4gIHJlYWRvbmx5IHN0ZXBzOiBXb3JrZmxvd1N0ZXBzSW5wdXQ8QWN0aW9uVGFnc09mTW9kdWxlPE0+PlxuICByZWFkb25seSBtZXRhPzogeyByZWFkb25seSBnZW5lcmF0b3I/OiBKc29uVmFsdWUgfVxufSk6IFdvcmtmbG93ID0+IHtcbiAgY29uc3QgbG9jYWxJZCA9IGFzTm9uRW1wdHlTdHJpbmcoaW5wdXQubG9jYWxJZClcbiAgaWYgKCFsb2NhbElkKSB7XG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvdy5tYWtlOiBsb2NhbElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicsXG4gICAgICBkZXRhaWw6IHsgbG9jYWxJZDogaW5wdXQubG9jYWxJZCB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzdGVwc0lucHV0ID0gcmVzb2x2ZVN0ZXBzSW5wdXQoaW5wdXQuc3RlcHMpXG4gIGNvbnN0IG1lcmdlZCA9IG1lcmdlUG9saWN5KGlucHV0LnBvbGljeSwgc3RlcHNJbnB1dC5wb2xpY3kpXG5cbiAgY29uc3QgZGVmOiBXb3JrZmxvd0RlZlYxID0gbm9ybWFsaXplV29ya2Zsb3dEZWZWMSh7XG4gICAgYXN0VmVyc2lvbjogMSxcbiAgICBsb2NhbElkLFxuICAgIHRyaWdnZXI6IGlucHV0LnRyaWdnZXIsXG4gICAgLi4uKG1lcmdlZCA/IHsgcG9saWN5OiBtZXJnZWQgfSA6IG51bGwpLFxuICAgIHN0ZXBzOiBzdGVwc0lucHV0LnN0ZXBzLFxuICAgIC4uLihzdGVwc0lucHV0LnNvdXJjZXMgPyB7IHNvdXJjZXM6IHN0ZXBzSW5wdXQuc291cmNlcyB9IDogbnVsbCksXG4gICAgLi4uKGlucHV0Lm1ldGEgPyB7IG1ldGE6IGlucHV0Lm1ldGEgfSA6IG51bGwpLFxuICB9KVxuXG4gIGNvbnN0IHN0YXRpY0lyQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dTdGF0aWNJclYxPigpXG5cbiAgcmV0dXJuIHtcbiAgICBfdGFnOiAnV29ya2Zsb3cnLFxuICAgIGRlZixcbiAgICB0b0pTT046ICgpID0+IGRlZixcbiAgICB2YWxpZGF0ZTogKCkgPT4gdmFsaWRhdGVXb3JrZmxvd0RlZlYxKGRlZiksXG4gICAgZXhwb3J0U3RhdGljSXI6IChtb2R1bGVJZCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGVkID0gc3RhdGljSXJDYWNoZS5nZXQobW9kdWxlSWQpXG4gICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXG4gICAgICBjb25zdCBpciA9IGNvbXBpbGVXb3JrZmxvd1N0YXRpY0lyVjEoeyBtb2R1bGVJZCwgZGVmIH0pXG4gICAgICBzdGF0aWNJckNhY2hlLnNldChtb2R1bGVJZCwgaXIpXG4gICAgICByZXR1cm4gaXJcbiAgICB9LFxuICAgIGluc3RhbGw6IChtb2R1bGVUYWcpID0+XG4gICAgICBXb3JrZmxvd1J1bnRpbWUuaW5zdGFsbE9uZSh7XG4gICAgICAgIG1vZHVsZVRhZzogbW9kdWxlVGFnIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2YgV29ya2Zsb3dSdW50aW1lLmluc3RhbGxPbmU+WzBdWydtb2R1bGVUYWcnXSxcbiAgICAgICAgcHJvZ3JhbTogeyBfdGFnOiAnV29ya2Zsb3cnLCBkZWYgfSxcbiAgICAgIH0pLFxuICB9IHNhdGlzZmllcyBXb3JrZmxvd1xufVxuXG5leHBvcnQgY29uc3QgZnJvbUpTT04gPSA8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihkZWY6IFdvcmtmbG93RGVmPEFjdGlvblRhZz4pOiBXb3JrZmxvdyA9PlxuICBtYWtlKHtcbiAgICBsb2NhbElkOiBkZWYubG9jYWxJZCxcbiAgICB0cmlnZ2VyOiBkZWYudHJpZ2dlcixcbiAgICAuLi4oZGVmLnBvbGljeSA/IHsgcG9saWN5OiBkZWYucG9saWN5IH0gOiBudWxsKSxcbiAgICBzdGVwczoge1xuICAgICAgc3RlcHM6IGRlZi5zdGVwcyxcbiAgICAgIC4uLihkZWYuc291cmNlcyA/IHsgc291cmNlczogZGVmLnNvdXJjZXMgfSA6IG51bGwpLFxuICAgIH0sXG4gICAgLi4uKGRlZi5tZXRhID8geyBtZXRhOiBkZWYubWV0YSB9IDogbnVsbCksXG4gIH0pXG4iLCAiaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnZWZmZWN0J1xuXG4vKipcbiAqIFNlcnZpY2VJZCBjb250cmFjdCAoc3BlY3MvMDc4LW1vZHVsZS1zZXJ2aWNlLW1hbmlmZXN0L2NvbnRyYWN0cy9zZXJ2aWNlLWlkLm1kKTpcbiAqIC0gU3RhYmxlIHN0cmluZyBkZXJpdmVkIGZyb20gQ29udGV4dC5UYWcgYnkgcHJpb3JpdHk6IHRhZy5rZXkgPz8gdGFnLmlkID8/IHRhZy5faWRcbiAqIC0gdGFnLnRvU3RyaW5nKCkgaXMgZm9yYmlkZGVuIGFzIGFuIGlkZW50aXR5IHNvdXJjZSAoZGlhZ25vc3RpY3Mgb25seSkuXG4gKi9cblxuZXhwb3J0IHR5cGUgU2VydmljZUlkID0gc3RyaW5nXG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWRcblxuZXhwb3J0IGNvbnN0IGZyb21UYWcgPSAodGFnOiBDb250ZXh0LlRhZzxhbnksIGFueT4pOiBTZXJ2aWNlSWQgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhbnlUYWcgPSB0YWcgYXMgYW55XG4gIHJldHVybiBhc05vbkVtcHR5U3RyaW5nKGFueVRhZy5rZXkpID8/IGFzTm9uRW1wdHlTdHJpbmcoYW55VGFnLmlkKSA/PyBhc05vbkVtcHR5U3RyaW5nKGFueVRhZy5faWQpXG59XG5cbmV4cG9ydCBjb25zdCByZXF1aXJlRnJvbVRhZyA9ICh0YWc6IENvbnRleHQuVGFnPGFueSwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgaGludD86IHN0cmluZyB9KTogU2VydmljZUlkID0+IHtcbiAgY29uc3QgaWQgPSBmcm9tVGFnKHRhZylcbiAgaWYgKGlkKSByZXR1cm4gaWRcblxuICBjb25zdCBoaW50ID1cbiAgICBvcHRpb25zPy5oaW50ID8/XG4gICAgJ0RlZmluZSB0aGUgVGFnIHdpdGggYSBzdGFibGUgc3RyaW5nIGtleSwgZS5nLiBgY2xhc3MgWCBleHRlbmRzIENvbnRleHQuVGFnKFwibXktc3ZjL3hcIik8WCwgU2VydmljZT4oKSB7fWAuJ1xuXG4gIHRocm93IG5ldyBFcnJvcihgW0ludmFsaWRTZXJ2aWNlSWRdIFRhZyBpcyBtaXNzaW5nIGEgc3RhYmxlIGlkICh0YWcua2V5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
|