@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
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
fnv1a32,
|
|
5
|
+
stableStringify
|
|
6
|
+
} from "./chunk-6JRP52YT.js";
|
|
7
|
+
|
|
8
|
+
// ../logix-core/src/internal/runtime/core/ReadQuery.ts
|
|
9
|
+
function isReadQuery(input) {
|
|
10
|
+
if (!input || typeof input !== "object" && typeof input !== "function") return false;
|
|
11
|
+
const maybe = input;
|
|
12
|
+
return typeof maybe.selectorId === "string" && typeof maybe.select === "function" && Array.isArray(maybe.reads);
|
|
13
|
+
}
|
|
14
|
+
var normalizeReads = (reads) => {
|
|
15
|
+
const unique = [];
|
|
16
|
+
const seen = /* @__PURE__ */ new Set();
|
|
17
|
+
for (const r of reads) {
|
|
18
|
+
const key = typeof r === "number" ? `n:${r}` : `s:${r}`;
|
|
19
|
+
if (seen.has(key)) continue;
|
|
20
|
+
seen.add(key);
|
|
21
|
+
unique.push(r);
|
|
22
|
+
}
|
|
23
|
+
return unique.slice().sort((a, b) => String(a).localeCompare(String(b)));
|
|
24
|
+
};
|
|
25
|
+
var toHash32Number = (hex) => Number.parseInt(hex, 16);
|
|
26
|
+
var makeReadsDigest = (reads) => {
|
|
27
|
+
const normalized = normalizeReads(reads);
|
|
28
|
+
return {
|
|
29
|
+
count: normalized.length,
|
|
30
|
+
hash: toHash32Number(fnv1a32(stableStringify(normalized)))
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
var computeSelectorId = (value) => `rq_${fnv1a32(stableStringify(value))}`;
|
|
34
|
+
var nextUnstableSelectorSeq = 0;
|
|
35
|
+
var unstableSelectorIdByFn = /* @__PURE__ */ new WeakMap();
|
|
36
|
+
var computeUnstableSelectorId = (selector) => {
|
|
37
|
+
const existing = unstableSelectorIdByFn.get(selector);
|
|
38
|
+
if (existing) return existing;
|
|
39
|
+
nextUnstableSelectorSeq += 1;
|
|
40
|
+
const selectorId = `rq_u${nextUnstableSelectorSeq}`;
|
|
41
|
+
unstableSelectorIdByFn.set(selector, selectorId);
|
|
42
|
+
return selectorId;
|
|
43
|
+
};
|
|
44
|
+
var unwrapParens = (input) => {
|
|
45
|
+
const trimmed = input.trim();
|
|
46
|
+
if (trimmed.startsWith("(") && trimmed.endsWith(")")) {
|
|
47
|
+
const inner = trimmed.slice(1, -1).trim();
|
|
48
|
+
if (!inner.startsWith("(") || !inner.endsWith(")")) {
|
|
49
|
+
return inner;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return trimmed;
|
|
53
|
+
};
|
|
54
|
+
var extractArrow = (source) => {
|
|
55
|
+
const idx = source.indexOf("=>");
|
|
56
|
+
if (idx < 0) return void 0;
|
|
57
|
+
const left = source.slice(0, idx).trim();
|
|
58
|
+
const right = source.slice(idx + 2).trim();
|
|
59
|
+
const paramRaw = unwrapParens(left);
|
|
60
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(paramRaw)) return void 0;
|
|
61
|
+
if (right.startsWith("{")) {
|
|
62
|
+
const m = right.match(/^\{\s*return\s+(.+?);?\s*\}\s*$/s);
|
|
63
|
+
if (!m) return void 0;
|
|
64
|
+
return { param: paramRaw, body: m[1]?.trim() ?? "" };
|
|
65
|
+
}
|
|
66
|
+
return { param: paramRaw, body: right };
|
|
67
|
+
};
|
|
68
|
+
var tryParseSelectorSource = (source) => {
|
|
69
|
+
const arrow = extractArrow(source);
|
|
70
|
+
if (!arrow) return void 0;
|
|
71
|
+
const expr = unwrapParens(arrow.body).trim().replace(/;$/, "").trim();
|
|
72
|
+
{
|
|
73
|
+
const re = new RegExp(`^${arrow.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
|
|
74
|
+
const m = expr.match(re);
|
|
75
|
+
if (m) {
|
|
76
|
+
return { kind: "path", path: m[1] };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (expr.startsWith("{") && expr.endsWith("}")) {
|
|
80
|
+
const inner = expr.slice(1, -1).trim();
|
|
81
|
+
if (inner.length === 0) return { kind: "struct", entries: [] };
|
|
82
|
+
const parts = inner.split(",").map((p) => p.trim()).filter((p) => p.length > 0);
|
|
83
|
+
const entries = [];
|
|
84
|
+
for (const part of parts) {
|
|
85
|
+
const idx = part.indexOf(":");
|
|
86
|
+
if (idx < 0) return void 0;
|
|
87
|
+
const key = part.slice(0, idx).trim();
|
|
88
|
+
const value = part.slice(idx + 1).trim();
|
|
89
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) return void 0;
|
|
90
|
+
const re = new RegExp(`^${arrow.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
|
|
91
|
+
const m = value.match(re);
|
|
92
|
+
if (!m) return void 0;
|
|
93
|
+
entries.push([key, m[1]]);
|
|
94
|
+
}
|
|
95
|
+
entries.sort((a, b) => a[0].localeCompare(b[0]));
|
|
96
|
+
return { kind: "struct", entries };
|
|
97
|
+
}
|
|
98
|
+
return void 0;
|
|
99
|
+
};
|
|
100
|
+
var READ_QUERY_TEMPLATE_CACHE_MAX = 2048;
|
|
101
|
+
var readQueryTemplateByFn = /* @__PURE__ */ new WeakMap();
|
|
102
|
+
var readQueryTemplateBySource = /* @__PURE__ */ new Map();
|
|
103
|
+
var lruGet = (map, key) => {
|
|
104
|
+
const value = map.get(key);
|
|
105
|
+
if (value === void 0) return void 0;
|
|
106
|
+
map.delete(key);
|
|
107
|
+
map.set(key, value);
|
|
108
|
+
return value;
|
|
109
|
+
};
|
|
110
|
+
var lruSet = (map, key, value, maxSize) => {
|
|
111
|
+
if (map.has(key)) map.delete(key);
|
|
112
|
+
map.set(key, value);
|
|
113
|
+
if (map.size <= maxSize) return;
|
|
114
|
+
const oldestKey = map.keys().next().value;
|
|
115
|
+
if (oldestKey !== void 0) {
|
|
116
|
+
map.delete(oldestKey);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
var safeToString = (fn) => {
|
|
120
|
+
try {
|
|
121
|
+
return fn.toString();
|
|
122
|
+
} catch {
|
|
123
|
+
return "";
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
var make = (spec) => spec;
|
|
127
|
+
var compile = (input) => {
|
|
128
|
+
if (isReadQuery(input)) {
|
|
129
|
+
const reads = normalizeReads(input.reads);
|
|
130
|
+
const readsDigest = reads.length > 0 ? makeReadsDigest(reads) : void 0;
|
|
131
|
+
const equalsKind = input.equalsKind;
|
|
132
|
+
const staticIr2 = {
|
|
133
|
+
selectorId: input.selectorId,
|
|
134
|
+
debugKey: input.debugKey,
|
|
135
|
+
lane: "static",
|
|
136
|
+
producer: "manual",
|
|
137
|
+
reads,
|
|
138
|
+
readsDigest,
|
|
139
|
+
equalsKind
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
...input,
|
|
143
|
+
reads,
|
|
144
|
+
lane: "static",
|
|
145
|
+
producer: "manual",
|
|
146
|
+
readsDigest,
|
|
147
|
+
staticIr: staticIr2
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const selector = input;
|
|
151
|
+
const debugKey = (typeof selector?.debugKey === "string" && selector.debugKey.length > 0 ? selector.debugKey : void 0) ?? (typeof selector.name === "string" && selector.name.length > 0 ? selector.name : void 0);
|
|
152
|
+
const declaredReads = Array.isArray(selector?.fieldPaths) ? selector.fieldPaths.filter((x) => typeof x === "string") : void 0;
|
|
153
|
+
if (declaredReads && declaredReads.length > 0) {
|
|
154
|
+
const reads = normalizeReads(declaredReads);
|
|
155
|
+
const readsDigest = makeReadsDigest(reads);
|
|
156
|
+
const selectorId2 = computeSelectorId({ kind: "reads", reads });
|
|
157
|
+
const staticIr2 = {
|
|
158
|
+
selectorId: selectorId2,
|
|
159
|
+
debugKey,
|
|
160
|
+
lane: "static",
|
|
161
|
+
producer: "jit",
|
|
162
|
+
reads,
|
|
163
|
+
readsDigest,
|
|
164
|
+
equalsKind: "objectIs"
|
|
165
|
+
};
|
|
166
|
+
return {
|
|
167
|
+
selectorId: selectorId2,
|
|
168
|
+
debugKey,
|
|
169
|
+
reads,
|
|
170
|
+
select: selector,
|
|
171
|
+
equalsKind: "objectIs",
|
|
172
|
+
lane: "static",
|
|
173
|
+
producer: "jit",
|
|
174
|
+
readsDigest,
|
|
175
|
+
staticIr: staticIr2
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const cachedByFn = readQueryTemplateByFn.get(selector);
|
|
179
|
+
if (cachedByFn) {
|
|
180
|
+
const staticIr2 = {
|
|
181
|
+
selectorId: cachedByFn.selectorId,
|
|
182
|
+
debugKey,
|
|
183
|
+
lane: "static",
|
|
184
|
+
producer: "jit",
|
|
185
|
+
reads: cachedByFn.reads,
|
|
186
|
+
readsDigest: cachedByFn.readsDigest,
|
|
187
|
+
equalsKind: cachedByFn.equalsKind
|
|
188
|
+
};
|
|
189
|
+
return {
|
|
190
|
+
selectorId: cachedByFn.selectorId,
|
|
191
|
+
debugKey,
|
|
192
|
+
reads: cachedByFn.reads,
|
|
193
|
+
select: selector,
|
|
194
|
+
equalsKind: cachedByFn.equalsKind,
|
|
195
|
+
lane: "static",
|
|
196
|
+
producer: "jit",
|
|
197
|
+
readsDigest: cachedByFn.readsDigest,
|
|
198
|
+
staticIr: staticIr2
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const srcTrimmed = safeToString(selector).trim();
|
|
202
|
+
const cachedBySource = srcTrimmed.length > 0 ? lruGet(readQueryTemplateBySource, srcTrimmed) : void 0;
|
|
203
|
+
if (cachedBySource) {
|
|
204
|
+
readQueryTemplateByFn.set(selector, cachedBySource);
|
|
205
|
+
const staticIr2 = {
|
|
206
|
+
selectorId: cachedBySource.selectorId,
|
|
207
|
+
debugKey,
|
|
208
|
+
lane: "static",
|
|
209
|
+
producer: "jit",
|
|
210
|
+
reads: cachedBySource.reads,
|
|
211
|
+
readsDigest: cachedBySource.readsDigest,
|
|
212
|
+
equalsKind: cachedBySource.equalsKind
|
|
213
|
+
};
|
|
214
|
+
return {
|
|
215
|
+
selectorId: cachedBySource.selectorId,
|
|
216
|
+
debugKey,
|
|
217
|
+
reads: cachedBySource.reads,
|
|
218
|
+
select: selector,
|
|
219
|
+
equalsKind: cachedBySource.equalsKind,
|
|
220
|
+
lane: "static",
|
|
221
|
+
producer: "jit",
|
|
222
|
+
readsDigest: cachedBySource.readsDigest,
|
|
223
|
+
staticIr: staticIr2
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const parsed = srcTrimmed.length > 0 ? tryParseSelectorSource(srcTrimmed) : void 0;
|
|
227
|
+
if (parsed?.kind === "path") {
|
|
228
|
+
const reads = [parsed.path];
|
|
229
|
+
const readsDigest = makeReadsDigest(reads);
|
|
230
|
+
const selectorId2 = computeSelectorId({ kind: "path", path: parsed.path });
|
|
231
|
+
const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "objectIs" };
|
|
232
|
+
readQueryTemplateByFn.set(selector, template);
|
|
233
|
+
lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
|
|
234
|
+
const staticIr2 = {
|
|
235
|
+
selectorId: selectorId2,
|
|
236
|
+
debugKey,
|
|
237
|
+
lane: "static",
|
|
238
|
+
producer: "jit",
|
|
239
|
+
reads,
|
|
240
|
+
readsDigest,
|
|
241
|
+
equalsKind: "objectIs"
|
|
242
|
+
};
|
|
243
|
+
return {
|
|
244
|
+
selectorId: selectorId2,
|
|
245
|
+
debugKey,
|
|
246
|
+
reads,
|
|
247
|
+
select: selector,
|
|
248
|
+
equalsKind: "objectIs",
|
|
249
|
+
lane: "static",
|
|
250
|
+
producer: "jit",
|
|
251
|
+
readsDigest,
|
|
252
|
+
staticIr: staticIr2
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (parsed?.kind === "struct") {
|
|
256
|
+
const reads = normalizeReads(parsed.entries.map(([, path]) => path));
|
|
257
|
+
const readsDigest = makeReadsDigest(reads);
|
|
258
|
+
const selectorId2 = computeSelectorId({ kind: "struct", entries: parsed.entries });
|
|
259
|
+
const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "shallowStruct" };
|
|
260
|
+
readQueryTemplateByFn.set(selector, template);
|
|
261
|
+
lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
|
|
262
|
+
const staticIr2 = {
|
|
263
|
+
selectorId: selectorId2,
|
|
264
|
+
debugKey,
|
|
265
|
+
lane: "static",
|
|
266
|
+
producer: "jit",
|
|
267
|
+
reads,
|
|
268
|
+
readsDigest,
|
|
269
|
+
equalsKind: "shallowStruct"
|
|
270
|
+
};
|
|
271
|
+
return {
|
|
272
|
+
selectorId: selectorId2,
|
|
273
|
+
debugKey,
|
|
274
|
+
reads,
|
|
275
|
+
select: selector,
|
|
276
|
+
equalsKind: "shallowStruct",
|
|
277
|
+
lane: "static",
|
|
278
|
+
producer: "jit",
|
|
279
|
+
readsDigest,
|
|
280
|
+
staticIr: staticIr2
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const baseFallbackReason = extractArrow(srcTrimmed) ? "unsupportedSyntax" : "missingDeps";
|
|
284
|
+
const lowDiscriminabilitySource = srcTrimmed.length === 0 || srcTrimmed.includes("[native code]");
|
|
285
|
+
const fallbackReason = !debugKey || lowDiscriminabilitySource ? "unstableSelectorId" : baseFallbackReason;
|
|
286
|
+
const selectorId = fallbackReason === "unstableSelectorId" ? computeUnstableSelectorId(selector) : computeSelectorId({ kind: "dynamic", debugKey, src: srcTrimmed });
|
|
287
|
+
const staticIr = {
|
|
288
|
+
selectorId,
|
|
289
|
+
debugKey,
|
|
290
|
+
lane: "dynamic",
|
|
291
|
+
producer: "dynamic",
|
|
292
|
+
fallbackReason,
|
|
293
|
+
equalsKind: "objectIs"
|
|
294
|
+
};
|
|
295
|
+
return {
|
|
296
|
+
selectorId,
|
|
297
|
+
debugKey,
|
|
298
|
+
reads: [],
|
|
299
|
+
select: selector,
|
|
300
|
+
equalsKind: "objectIs",
|
|
301
|
+
lane: "dynamic",
|
|
302
|
+
producer: "dynamic",
|
|
303
|
+
fallbackReason,
|
|
304
|
+
staticIr
|
|
305
|
+
};
|
|
306
|
+
};
|
|
307
|
+
var filterNonEmpty = (values) => {
|
|
308
|
+
if (!values || values.length === 0) return void 0;
|
|
309
|
+
const next = values.map((v) => v.trim()).filter((v) => v.length > 0);
|
|
310
|
+
return next.length > 0 ? next : void 0;
|
|
311
|
+
};
|
|
312
|
+
var makeStrictGateDiagnostic = (args) => {
|
|
313
|
+
const severity = args.config.mode === "warn" ? "warning" : "error";
|
|
314
|
+
return {
|
|
315
|
+
type: "diagnostic",
|
|
316
|
+
moduleId: args.details.moduleId,
|
|
317
|
+
instanceId: args.details.instanceId,
|
|
318
|
+
txnSeq: args.details.txnSeq,
|
|
319
|
+
code: "read_query::strict_gate",
|
|
320
|
+
severity,
|
|
321
|
+
message: `ReadQuery strict gate violated: selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,
|
|
322
|
+
hint: "Fix: make the selector statically compilable (AOT/JIT) or pass an explicit ReadQuery; or disable/narrow the gate via RuntimeOptions.readQuery.strictGate.requireStatic / denyFallbackReasons.",
|
|
323
|
+
kind: "read_query:strict_gate",
|
|
324
|
+
trigger: {
|
|
325
|
+
kind: "read_query",
|
|
326
|
+
name: "strict_gate",
|
|
327
|
+
details: args.details
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
};
|
|
331
|
+
var makeStrictGateError = (args) => Object.assign(
|
|
332
|
+
new Error(
|
|
333
|
+
`[ReadQueryStrictGateError] selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`
|
|
334
|
+
),
|
|
335
|
+
{
|
|
336
|
+
_tag: "ReadQueryStrictGateError",
|
|
337
|
+
details: args.details
|
|
338
|
+
}
|
|
339
|
+
);
|
|
340
|
+
var evaluateStrictGate = (args) => {
|
|
341
|
+
if (args.config.mode === "off") {
|
|
342
|
+
return { verdict: "PASS" };
|
|
343
|
+
}
|
|
344
|
+
if (args.compiled.lane !== "dynamic") {
|
|
345
|
+
return { verdict: "PASS" };
|
|
346
|
+
}
|
|
347
|
+
const fallbackReason = args.compiled.fallbackReason ?? "missingDeps";
|
|
348
|
+
const denyFallbackReasons = args.config.denyFallbackReasons;
|
|
349
|
+
const denied = !!denyFallbackReasons?.includes(fallbackReason);
|
|
350
|
+
const selectorIds = filterNonEmpty(args.config.requireStatic?.selectorIds);
|
|
351
|
+
const modules = filterNonEmpty(args.config.requireStatic?.modules);
|
|
352
|
+
const hasCoverageFilter = !!selectorIds || !!modules;
|
|
353
|
+
const matchedSelectorId = !!selectorIds?.includes(args.compiled.selectorId);
|
|
354
|
+
const matchedModule = !!modules?.includes(args.moduleId);
|
|
355
|
+
const coveredByRequireStatic = !hasCoverageFilter || matchedSelectorId || matchedModule;
|
|
356
|
+
if (!denied && !coveredByRequireStatic) {
|
|
357
|
+
return { verdict: "PASS" };
|
|
358
|
+
}
|
|
359
|
+
const rule = denied ? "denyFallbackReason" : !hasCoverageFilter ? "requireStatic:global" : matchedSelectorId ? "requireStatic:selectorId" : "requireStatic:module";
|
|
360
|
+
const details = {
|
|
361
|
+
moduleId: args.moduleId,
|
|
362
|
+
instanceId: args.instanceId,
|
|
363
|
+
txnSeq: args.txnSeq,
|
|
364
|
+
selectorId: args.compiled.selectorId,
|
|
365
|
+
debugKey: args.compiled.debugKey,
|
|
366
|
+
fallbackReason,
|
|
367
|
+
rule
|
|
368
|
+
};
|
|
369
|
+
const diagnostic = makeStrictGateDiagnostic({ config: args.config, details });
|
|
370
|
+
if (args.config.mode === "warn") {
|
|
371
|
+
return { verdict: "WARN", diagnostic, details };
|
|
372
|
+
}
|
|
373
|
+
const error = makeStrictGateError({ details });
|
|
374
|
+
return { verdict: "FAIL", diagnostic, error, details };
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
export {
|
|
378
|
+
isReadQuery,
|
|
379
|
+
make,
|
|
380
|
+
compile,
|
|
381
|
+
evaluateStrictGate
|
|
382
|
+
};
|
|
383
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlYWRRdWVyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1Z1NpbmsgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFJlYWRMYW5lID0gJ3N0YXRpYycgfCAnZHluYW1pYydcblxuZXhwb3J0IHR5cGUgUmVhZFByb2R1Y2VyID0gJ2FvdCcgfCAnaml0JyB8ICdtYW51YWwnIHwgJ2R5bmFtaWMnXG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gJ21pc3NpbmdEZXBzJyB8ICd1bnN1cHBvcnRlZFN5bnRheCcgfCAndW5zdGFibGVTZWxlY3RvcklkJ1xuXG5leHBvcnQgdHlwZSBFcXVhbHNLaW5kID0gJ29iamVjdElzJyB8ICdzaGFsbG93U3RydWN0JyB8ICdjdXN0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHNEaWdlc3Qge1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IGhhc2g6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0YXRpY0lyIHtcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnS2V5Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGxhbmU6IFJlYWRMYW5lXG4gIHJlYWRvbmx5IHByb2R1Y2VyOiBSZWFkUHJvZHVjZXJcbiAgcmVhZG9ubHkgcmVhZHM/OiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj5cbiAgcmVhZG9ubHkgcmVhZHNEaWdlc3Q/OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBmYWxsYmFja1JlYXNvbj86IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IGVxdWFsc0tpbmQ6IEVxdWFsc0tpbmRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnk8UywgVj4ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSBzZWxlY3Q6IChzdGF0ZTogUykgPT4gVlxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG4gIHJlYWRvbmx5IGVxdWFscz86IChwcmV2aW91czogViwgbmV4dDogVikgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+IGV4dGVuZHMgUmVhZFF1ZXJ5PFMsIFY+IHtcbiAgcmVhZG9ubHkgbGFuZTogUmVhZExhbmVcbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFJlYWRQcm9kdWNlclxuICByZWFkb25seSByZWFkc0RpZ2VzdD86IFJlYWRzRGlnZXN0XG4gIHJlYWRvbmx5IGZhbGxiYWNrUmVhc29uPzogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyXG59XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUlucHV0PFMsIFY+ID0gKChzdGF0ZTogUykgPT4gVikgfCBSZWFkUXVlcnk8UywgVj5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5PFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IGlucHV0IGlzIFJlYWRRdWVyeTxTLCBWPlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PiB7XG4gIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGlucHV0ICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IG1heWJlID0gaW5wdXQgYXMgYW55XG4gIHJldHVybiB0eXBlb2YgbWF5YmUuc2VsZWN0b3JJZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1heWJlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KG1heWJlLnJlYWRzKVxufVxuXG5jb25zdCBub3JtYWxpemVSZWFkcyA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgY29uc3QgdW5pcXVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW11cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgciBvZiByZWFkcykge1xuICAgIGNvbnN0IGtleSA9IHR5cGVvZiByID09PSAnbnVtYmVyJyA/IGBuOiR7cn1gIDogYHM6JHtyfWBcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWVcbiAgICBzZWVuLmFkZChrZXkpXG4gICAgdW5pcXVlLnB1c2gocilcbiAgfVxuICByZXR1cm4gdW5pcXVlLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKSlcbn1cblxuY29uc3QgdG9IYXNoMzJOdW1iZXIgPSAoaGV4OiBzdHJpbmcpOiBudW1iZXIgPT4gTnVtYmVyLnBhcnNlSW50KGhleCwgMTYpXG5cbmNvbnN0IG1ha2VSZWFkc0RpZ2VzdCA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZHNEaWdlc3QgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhZHMocmVhZHMpXG4gIHJldHVybiB7XG4gICAgY291bnQ6IG5vcm1hbGl6ZWQubGVuZ3RoLFxuICAgIGhhc2g6IHRvSGFzaDMyTnVtYmVyKGZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KG5vcm1hbGl6ZWQpKSksXG4gIH1cbn1cblxuY29uc3QgY29tcHV0ZVNlbGVjdG9ySWQgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gYHJxXyR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkodmFsdWUpKX1gXG5cbmxldCBuZXh0VW5zdGFibGVTZWxlY3RvclNlcSA9IDBcbmNvbnN0IHVuc3RhYmxlU2VsZWN0b3JJZEJ5Rm4gPSBuZXcgV2Vha01hcDxGdW5jdGlvbiwgc3RyaW5nPigpXG5cbmNvbnN0IGNvbXB1dGVVbnN0YWJsZVNlbGVjdG9ySWQgPSAoc2VsZWN0b3I6IEZ1bmN0aW9uKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSB1bnN0YWJsZVNlbGVjdG9ySWRCeUZuLmdldChzZWxlY3RvcilcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgbmV4dFVuc3RhYmxlU2VsZWN0b3JTZXEgKz0gMVxuICBjb25zdCBzZWxlY3RvcklkID0gYHJxX3Uke25leHRVbnN0YWJsZVNlbGVjdG9yU2VxfWBcbiAgdW5zdGFibGVTZWxlY3RvcklkQnlGbi5zZXQoc2VsZWN0b3IsIHNlbGVjdG9ySWQpXG4gIHJldHVybiBzZWxlY3RvcklkXG59XG5cbmNvbnN0IHVud3JhcFBhcmVucyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKVxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCcoJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnKScpKSB7XG4gICAgY29uc3QgaW5uZXIgPSB0cmltbWVkLnNsaWNlKDEsIC0xKS50cmltKClcbiAgICAvLyBcdTRFQzVcdTU5MDRcdTc0MDZcdTY3MDBcdTU5MTZcdTVDNDJcdTRFMDBcdTVCRjlcdTYyRUNcdTUzRjdcdUZGMENcdTkwN0ZcdTUxNERcdThCRUZcdTUyMjBcdThCRURcdTZDRDVcdTdFRDNcdTY3ODRcbiAgICBpZiAoIWlubmVyLnN0YXJ0c1dpdGgoJygnKSB8fCAhaW5uZXIuZW5kc1dpdGgoJyknKSkge1xuICAgICAgcmV0dXJuIGlubmVyXG4gICAgfVxuICB9XG4gIHJldHVybiB0cmltbWVkXG59XG5cbmNvbnN0IGV4dHJhY3RBcnJvdyA9IChzb3VyY2U6IHN0cmluZyk6IHsgcmVhZG9ubHkgcGFyYW06IHN0cmluZzsgcmVhZG9ubHkgYm9keTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBpZHggPSBzb3VyY2UuaW5kZXhPZignPT4nKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBsZWZ0ID0gc291cmNlLnNsaWNlKDAsIGlkeCkudHJpbSgpXG4gIGNvbnN0IHJpZ2h0ID0gc291cmNlLnNsaWNlKGlkeCArIDIpLnRyaW0oKVxuXG4gIGNvbnN0IHBhcmFtUmF3ID0gdW53cmFwUGFyZW5zKGxlZnQpXG4gIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokLy50ZXN0KHBhcmFtUmF3KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIC8vIGJsb2NrIGJvZHk6IHsgcmV0dXJuIGV4cHIgfVxuICBpZiAocmlnaHQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgY29uc3QgbSA9IHJpZ2h0Lm1hdGNoKC9eXFx7XFxzKnJldHVyblxccysoLis/KTs/XFxzKlxcfVxccyokL3MpXG4gICAgaWYgKCFtKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiBtWzFdPy50cmltKCkgPz8gJycgfVxuICB9XG5cbiAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiByaWdodCB9XG59XG5cbnR5cGUgUGFyc2VkU2VsZWN0b3IgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3BhdGgnOyByZWFkb25seSBwYXRoOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3N0cnVjdCc7IHJlYWRvbmx5IGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gfVxuXG5jb25zdCB0cnlQYXJzZVNlbGVjdG9yU291cmNlID0gKHNvdXJjZTogc3RyaW5nKTogUGFyc2VkU2VsZWN0b3IgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhcnJvdyA9IGV4dHJhY3RBcnJvdyhzb3VyY2UpXG4gIGlmICghYXJyb3cpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBleHByID0gdW53cmFwUGFyZW5zKGFycm93LmJvZHkpLnRyaW0oKS5yZXBsYWNlKC87JC8sICcnKS50cmltKClcblxuICAvLyBwYXRoOiBzLmEuYlxuICB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHthcnJvdy5wYXJhbX1cXFxcLihbQS1aYS16MC05XyRdKyg/OlxcXFwuW0EtWmEtejAtOV8kXSspKikkYClcbiAgICBjb25zdCBtID0gZXhwci5tYXRjaChyZSlcbiAgICBpZiAobSkge1xuICAgICAgcmV0dXJuIHsga2luZDogJ3BhdGgnLCBwYXRoOiBtWzFdIH1cbiAgICB9XG4gIH1cblxuICAvLyBzdHJ1Y3Q6ICh7IGE6IHMuYSwgYjogcy5iIH0pXG4gIGlmIChleHByLnN0YXJ0c1dpdGgoJ3snKSAmJiBleHByLmVuZHNXaXRoKCd9JykpIHtcbiAgICBjb25zdCBpbm5lciA9IGV4cHIuc2xpY2UoMSwgLTEpLnRyaW0oKVxuICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHJldHVybiB7IGtpbmQ6ICdzdHJ1Y3QnLCBlbnRyaWVzOiBbXSB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IGlubmVyXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwLmxlbmd0aCA+IDApXG5cbiAgICBjb25zdCBlbnRyaWVzOiBBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHBhcnQuaW5kZXhPZignOicpXG4gICAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgY29uc3Qga2V5ID0gcGFydC5zbGljZSgwLCBpZHgpLnRyaW0oKVxuICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0LnNsaWNlKGlkeCArIDEpLnRyaW0oKVxuXG4gICAgICBpZiAoIS9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC8udGVzdChrZXkpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7YXJyb3cucGFyYW19XFxcXC4oW0EtWmEtejAtOV8kXSsoPzpcXFxcLltBLVphLXowLTlfJF0rKSopJGApXG4gICAgICBjb25zdCBtID0gdmFsdWUubWF0Y2gocmUpXG4gICAgICBpZiAoIW0pIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBtWzFdXSBhcyBjb25zdClcbiAgICB9XG5cbiAgICAvLyBlbnRyaWVzIFx1NjM5Mlx1NUU4Rlx1NEZERFx1OEJDMVx1N0EzM1x1NUI5QSBzZWxlY3RvcklkXG4gICAgZW50cmllcy5zb3J0KChhLCBiKSA9PiBhWzBdLmxvY2FsZUNvbXBhcmUoYlswXSkpXG4gICAgcmV0dXJuIHsga2luZDogJ3N0cnVjdCcsIGVudHJpZXMgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG50eXBlIFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlID0ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSByZWFkc0RpZ2VzdDogUmVhZHNEaWdlc3RcbiAgcmVhZG9ubHkgZXF1YWxzS2luZDogRXF1YWxzS2luZFxufVxuXG5jb25zdCBSRUFEX1FVRVJZX1RFTVBMQVRFX0NBQ0hFX01BWCA9IDIwNDhcbmNvbnN0IHJlYWRRdWVyeVRlbXBsYXRlQnlGbiA9IG5ldyBXZWFrTWFwPEZ1bmN0aW9uLCBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZT4oKVxuY29uc3QgcmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZT4oKVxuXG5jb25zdCBscnVHZXQgPSA8SywgVj4obWFwOiBNYXA8SywgVj4sIGtleTogSyk6IFYgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2YWx1ZSA9IG1hcC5nZXQoa2V5KVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICBtYXAuZGVsZXRlKGtleSlcbiAgbWFwLnNldChrZXksIHZhbHVlKVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgbHJ1U2V0ID0gPEssIFY+KG1hcDogTWFwPEssIFY+LCBrZXk6IEssIHZhbHVlOiBWLCBtYXhTaXplOiBudW1iZXIpID0+IHtcbiAgaWYgKG1hcC5oYXMoa2V5KSkgbWFwLmRlbGV0ZShrZXkpXG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgaWYgKG1hcC5zaXplIDw9IG1heFNpemUpIHJldHVyblxuICBjb25zdCBvbGRlc3RLZXkgPSBtYXAua2V5cygpLm5leHQoKS52YWx1ZSBhcyBLIHwgdW5kZWZpbmVkXG4gIGlmIChvbGRlc3RLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIG1hcC5kZWxldGUob2xkZXN0S2V5KVxuICB9XG59XG5cbmNvbnN0IHNhZmVUb1N0cmluZyA9IChmbjogRnVuY3Rpb24pOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBmbi50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gPFMsIFY+KHNwZWM6IFJlYWRRdWVyeTxTLCBWPik6IFJlYWRRdWVyeTxTLCBWPiA9PiBzcGVjXG5cbmV4cG9ydCBjb25zdCBjb21waWxlID0gPFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+ID0+IHtcbiAgaWYgKGlzUmVhZFF1ZXJ5KGlucHV0KSkge1xuICAgIGNvbnN0IHJlYWRzID0gbm9ybWFsaXplUmVhZHMoaW5wdXQucmVhZHMpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSByZWFkcy5sZW5ndGggPiAwID8gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKSA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZXF1YWxzS2luZCA9IGlucHV0LmVxdWFsc0tpbmRcbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkOiBpbnB1dC5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXk6IGlucHV0LmRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ21hbnVhbCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZCxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5wdXQsXG4gICAgICByZWFkcyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdtYW51YWwnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZWxlY3RvciA9IGlucHV0XG4gIGNvbnN0IGRlYnVnS2V5ID1cbiAgICAodHlwZW9mIChzZWxlY3RvciBhcyBhbnkpPy5kZWJ1Z0tleSA9PT0gJ3N0cmluZycgJiYgKHNlbGVjdG9yIGFzIGFueSkuZGVidWdLZXkubGVuZ3RoID4gMFxuICAgICAgPyAoc2VsZWN0b3IgYXMgYW55KS5kZWJ1Z0tleVxuICAgICAgOiB1bmRlZmluZWQpID8/XG4gICAgKHR5cGVvZiAoc2VsZWN0b3IgYXMgYW55KS5uYW1lID09PSAnc3RyaW5nJyAmJiAoc2VsZWN0b3IgYXMgYW55KS5uYW1lLmxlbmd0aCA+IDAgPyAoc2VsZWN0b3IgYXMgYW55KS5uYW1lIDogdW5kZWZpbmVkKVxuXG4gIGNvbnN0IGRlY2xhcmVkUmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9IEFycmF5LmlzQXJyYXkoKHNlbGVjdG9yIGFzIGFueSk/LmZpZWxkUGF0aHMpXG4gICAgPyAoKHNlbGVjdG9yIGFzIGFueSkuZmllbGRQYXRocyBhcyBSZWFkb25seUFycmF5PHVua25vd24+KS5maWx0ZXIoKHgpOiB4IGlzIHN0cmluZyA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoZGVjbGFyZWRSZWFkcyAmJiBkZWNsYXJlZFJlYWRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZWFkcyA9IG5vcm1hbGl6ZVJlYWRzKGRlY2xhcmVkUmVhZHMpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3JlYWRzJywgcmVhZHMgfSlcblxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHMsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhY2hlZEJ5Rm4gPSByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uZ2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pXG4gIGlmIChjYWNoZWRCeUZuKSB7XG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZDogY2FjaGVkQnlGbi5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeUZuLnJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5Rm4ucmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeUZuLmVxdWFsc0tpbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5Rm4uc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5Rm4ucmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6IGNhY2hlZEJ5Rm4uZXF1YWxzS2luZCxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5Rm4ucmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBzcmNUcmltbWVkID0gc2FmZVRvU3RyaW5nKHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pLnRyaW0oKVxuICBjb25zdCBjYWNoZWRCeVNvdXJjZSA9IHNyY1RyaW1tZWQubGVuZ3RoID4gMCA/IGxydUdldChyZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlLCBzcmNUcmltbWVkKSA6IHVuZGVmaW5lZFxuICBpZiAoY2FjaGVkQnlTb3VyY2UpIHtcbiAgICByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uc2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24sIGNhY2hlZEJ5U291cmNlKVxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5U291cmNlLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5U291cmNlLnJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5U291cmNlLnJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlTb3VyY2UuZXF1YWxzS2luZCxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZDogY2FjaGVkQnlTb3VyY2Uuc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5U291cmNlLnJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeVNvdXJjZS5lcXVhbHNLaW5kLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdDogY2FjaGVkQnlTb3VyY2UucmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBzcmNUcmltbWVkLmxlbmd0aCA+IDAgPyB0cnlQYXJzZVNlbGVjdG9yU291cmNlKHNyY1RyaW1tZWQpIDogdW5kZWZpbmVkXG5cbiAgaWYgKHBhcnNlZD8ua2luZCA9PT0gJ3BhdGgnKSB7XG4gICAgY29uc3QgcmVhZHMgPSBbcGFyc2VkLnBhdGhdXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3BhdGgnLCBwYXRoOiBwYXJzZWQucGF0aCB9KVxuICAgIGNvbnN0IHRlbXBsYXRlOiBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZSA9IHsgc2VsZWN0b3JJZCwgcmVhZHMsIHJlYWRzRGlnZXN0LCBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnIH1cbiAgICByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uc2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24sIHRlbXBsYXRlKVxuICAgIGxydVNldChyZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlLCBzcmNUcmltbWVkLCB0ZW1wbGF0ZSwgUkVBRF9RVUVSWV9URU1QTEFURV9DQUNIRV9NQVgpXG5cbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBpZiAocGFyc2VkPy5raW5kID09PSAnc3RydWN0Jykge1xuICAgIGNvbnN0IHJlYWRzID0gbm9ybWFsaXplUmVhZHMocGFyc2VkLmVudHJpZXMubWFwKChbLCBwYXRoXSkgPT4gcGF0aCkpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3N0cnVjdCcsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH0pXG4gICAgY29uc3QgdGVtcGxhdGU6IFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlID0geyBzZWxlY3RvcklkLCByZWFkcywgcmVhZHNEaWdlc3QsIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyB9XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCB0ZW1wbGF0ZSlcbiAgICBscnVTZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCwgdGVtcGxhdGUsIFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYKVxuXG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogJ3NoYWxsb3dTdHJ1Y3QnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ3NoYWxsb3dTdHJ1Y3QnLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIC8vIER5bmFtaWMgbGFuZSBmYWxsYmFjayAobm8gc3RhYmxlIHJlYWRzIC8gdW5zdXBwb3J0ZWQgc3Vic2V0KVxuICBjb25zdCBiYXNlRmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gZXh0cmFjdEFycm93KHNyY1RyaW1tZWQpID8gJ3Vuc3VwcG9ydGVkU3ludGF4JyA6ICdtaXNzaW5nRGVwcydcblxuICBjb25zdCBsb3dEaXNjcmltaW5hYmlsaXR5U291cmNlID0gc3JjVHJpbW1lZC5sZW5ndGggPT09IDAgfHwgc3JjVHJpbW1lZC5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpXG4gIGNvbnN0IGZhbGxiYWNrUmVhc29uOiBSZWFkUXVlcnlGYWxsYmFja1JlYXNvbiA9XG4gICAgIWRlYnVnS2V5IHx8IGxvd0Rpc2NyaW1pbmFiaWxpdHlTb3VyY2UgPyAndW5zdGFibGVTZWxlY3RvcklkJyA6IGJhc2VGYWxsYmFja1JlYXNvblxuXG4gIGNvbnN0IHNlbGVjdG9ySWQgPVxuICAgIGZhbGxiYWNrUmVhc29uID09PSAndW5zdGFibGVTZWxlY3RvcklkJ1xuICAgICAgPyBjb21wdXRlVW5zdGFibGVTZWxlY3RvcklkKHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pXG4gICAgICA6IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ2R5bmFtaWMnLCBkZWJ1Z0tleSwgc3JjOiBzcmNUcmltbWVkIH0pXG4gIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICBzZWxlY3RvcklkLFxuICAgIGRlYnVnS2V5LFxuICAgIGxhbmU6ICdkeW5hbWljJyxcbiAgICBwcm9kdWNlcjogJ2R5bmFtaWMnLFxuICAgIGZhbGxiYWNrUmVhc29uLFxuICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlbGVjdG9ySWQsXG4gICAgZGVidWdLZXksXG4gICAgcmVhZHM6IFtdLFxuICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgbGFuZTogJ2R5bmFtaWMnLFxuICAgIHByb2R1Y2VyOiAnZHluYW1pYycsXG4gICAgZmFsbGJhY2tSZWFzb24sXG4gICAgc3RhdGljSXIsXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnlTdHJpY3RHYXRlQ29uZmlnIHtcbiAgcmVhZG9ubHkgbW9kZTogJ29mZicgfCAnd2FybicgfCAnZXJyb3InXG4gIHJlYWRvbmx5IHJlcXVpcmVTdGF0aWM/OiB7XG4gICAgcmVhZG9ubHkgc2VsZWN0b3JJZHM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgICByZWFkb25seSBtb2R1bGVzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIH1cbiAgcmVhZG9ubHkgZGVueUZhbGxiYWNrUmVhc29ucz86IFJlYWRvbmx5QXJyYXk8UmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb24+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHMge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IHJ1bGU6ICdkZW55RmFsbGJhY2tSZWFzb24nIHwgJ3JlcXVpcmVTdGF0aWM6Z2xvYmFsJyB8ICdyZXF1aXJlU3RhdGljOnNlbGVjdG9ySWQnIHwgJ3JlcXVpcmVTdGF0aWM6bW9kdWxlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgX3RhZzogJ1JlYWRRdWVyeVN0cmljdEdhdGVFcnJvcidcbiAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbn1cblxuZXhwb3J0IHR5cGUgUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudCA9IEV4dHJhY3Q8RGVidWdTaW5rLkV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdkaWFnbm9zdGljJyB9PlxuXG5leHBvcnQgdHlwZSBSZWFkUXVlcnlTdHJpY3RHYXRlRGVjaXNpb24gPVxuICB8IHsgcmVhZG9ubHkgdmVyZGljdDogJ1BBU1MnIH1cbiAgfCB7IHJlYWRvbmx5IHZlcmRpY3Q6ICdXQVJOJzsgcmVhZG9ubHkgZGlhZ25vc3RpYzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudDsgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHMgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHZlcmRpY3Q6ICdGQUlMJ1xuICAgICAgcmVhZG9ubHkgZGlhZ25vc3RpYzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudFxuICAgICAgcmVhZG9ubHkgZXJyb3I6IFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvclxuICAgICAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbiAgICB9XG5cbmNvbnN0IGZpbHRlck5vbkVtcHR5ID0gKHZhbHVlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBuZXh0ID0gdmFsdWVzLm1hcCgodikgPT4gdi50cmltKCkpLmZpbHRlcigodikgPT4gdi5sZW5ndGggPiAwKVxuICByZXR1cm4gbmV4dC5sZW5ndGggPiAwID8gbmV4dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBtYWtlU3RyaWN0R2F0ZURpYWdub3N0aWMgPSAoYXJnczoge1xuICByZWFkb25seSBjb25maWc6IFJlYWRRdWVyeVN0cmljdEdhdGVDb25maWdcbiAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbn0pOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50ID0+IHtcbiAgY29uc3Qgc2V2ZXJpdHkgPSBhcmdzLmNvbmZpZy5tb2RlID09PSAnd2FybicgPyAoJ3dhcm5pbmcnIGFzIGNvbnN0KSA6ICgnZXJyb3InIGFzIGNvbnN0KVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgIG1vZHVsZUlkOiBhcmdzLmRldGFpbHMubW9kdWxlSWQsXG4gICAgaW5zdGFuY2VJZDogYXJncy5kZXRhaWxzLmluc3RhbmNlSWQsXG4gICAgdHhuU2VxOiBhcmdzLmRldGFpbHMudHhuU2VxLFxuICAgIGNvZGU6ICdyZWFkX3F1ZXJ5OjpzdHJpY3RfZ2F0ZScsXG4gICAgc2V2ZXJpdHksXG4gICAgbWVzc2FnZTogYFJlYWRRdWVyeSBzdHJpY3QgZ2F0ZSB2aW9sYXRlZDogc2VsZWN0b3IgZW50ZXJlZCBkeW5hbWljIGxhbmUgKHNlbGVjdG9ySWQ9JHthcmdzLmRldGFpbHMuc2VsZWN0b3JJZH0sIHJlYXNvbj0ke2FyZ3MuZGV0YWlscy5mYWxsYmFja1JlYXNvbn0pLmAsXG4gICAgaGludDpcbiAgICAgICdGaXg6IG1ha2UgdGhlIHNlbGVjdG9yIHN0YXRpY2FsbHkgY29tcGlsYWJsZSAoQU9UL0pJVCkgb3IgcGFzcyBhbiBleHBsaWNpdCBSZWFkUXVlcnk7ICcgK1xuICAgICAgJ29yIGRpc2FibGUvbmFycm93IHRoZSBnYXRlIHZpYSBSdW50aW1lT3B0aW9ucy5yZWFkUXVlcnkuc3RyaWN0R2F0ZS5yZXF1aXJlU3RhdGljIC8gZGVueUZhbGxiYWNrUmVhc29ucy4nLFxuICAgIGtpbmQ6ICdyZWFkX3F1ZXJ5OnN0cmljdF9nYXRlJyxcbiAgICB0cmlnZ2VyOiB7XG4gICAgICBraW5kOiAncmVhZF9xdWVyeScsXG4gICAgICBuYW1lOiAnc3RyaWN0X2dhdGUnLFxuICAgICAgZGV0YWlsczogYXJncy5kZXRhaWxzLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbWFrZVN0cmljdEdhdGVFcnJvciA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzXG59KTogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24oXG4gICAgbmV3IEVycm9yKFxuICAgICAgYFtSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3JdIHNlbGVjdG9yIGVudGVyZWQgZHluYW1pYyBsYW5lIChzZWxlY3RvcklkPSR7YXJncy5kZXRhaWxzLnNlbGVjdG9ySWR9LCByZWFzb249JHthcmdzLmRldGFpbHMuZmFsbGJhY2tSZWFzb259KS5gLFxuICAgICksXG4gICAge1xuICAgICAgX3RhZzogJ1JlYWRRdWVyeVN0cmljdEdhdGVFcnJvcicgYXMgY29uc3QsXG4gICAgICBkZXRhaWxzOiBhcmdzLmRldGFpbHMsXG4gICAgfSxcbiAgKSBhcyBSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3JcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlU3RyaWN0R2F0ZSA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IGNvbmZpZzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUNvbmZpZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICByZWFkb25seSBjb21waWxlZDogUmVhZFF1ZXJ5Q29tcGlsZWQ8YW55LCBhbnk+XG59KTogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURlY2lzaW9uID0+IHtcbiAgaWYgKGFyZ3MuY29uZmlnLm1vZGUgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1BBU1MnIH1cbiAgfVxuXG4gIGlmIChhcmdzLmNvbXBpbGVkLmxhbmUgIT09ICdkeW5hbWljJykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdQQVNTJyB9XG4gIH1cblxuICBjb25zdCBmYWxsYmFja1JlYXNvbiA9IChhcmdzLmNvbXBpbGVkLmZhbGxiYWNrUmVhc29uID8/ICdtaXNzaW5nRGVwcycpIGFzIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG5cbiAgY29uc3QgZGVueUZhbGxiYWNrUmVhc29ucyA9IGFyZ3MuY29uZmlnLmRlbnlGYWxsYmFja1JlYXNvbnNcbiAgY29uc3QgZGVuaWVkID0gISFkZW55RmFsbGJhY2tSZWFzb25zPy5pbmNsdWRlcyhmYWxsYmFja1JlYXNvbilcblxuICBjb25zdCBzZWxlY3RvcklkcyA9IGZpbHRlck5vbkVtcHR5KGFyZ3MuY29uZmlnLnJlcXVpcmVTdGF0aWM/LnNlbGVjdG9ySWRzKVxuICBjb25zdCBtb2R1bGVzID0gZmlsdGVyTm9uRW1wdHkoYXJncy5jb25maWcucmVxdWlyZVN0YXRpYz8ubW9kdWxlcylcbiAgY29uc3QgaGFzQ292ZXJhZ2VGaWx0ZXIgPSAhIXNlbGVjdG9ySWRzIHx8ICEhbW9kdWxlc1xuXG4gIGNvbnN0IG1hdGNoZWRTZWxlY3RvcklkID0gISFzZWxlY3Rvcklkcz8uaW5jbHVkZXMoYXJncy5jb21waWxlZC5zZWxlY3RvcklkKVxuICBjb25zdCBtYXRjaGVkTW9kdWxlID0gISFtb2R1bGVzPy5pbmNsdWRlcyhhcmdzLm1vZHVsZUlkKVxuICBjb25zdCBjb3ZlcmVkQnlSZXF1aXJlU3RhdGljID0gIWhhc0NvdmVyYWdlRmlsdGVyIHx8IG1hdGNoZWRTZWxlY3RvcklkIHx8IG1hdGNoZWRNb2R1bGVcblxuICBpZiAoIWRlbmllZCAmJiAhY292ZXJlZEJ5UmVxdWlyZVN0YXRpYykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdQQVNTJyB9XG4gIH1cblxuICBjb25zdCBydWxlOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1sncnVsZSddID0gZGVuaWVkXG4gICAgPyAnZGVueUZhbGxiYWNrUmVhc29uJ1xuICAgIDogIWhhc0NvdmVyYWdlRmlsdGVyXG4gICAgICA/ICdyZXF1aXJlU3RhdGljOmdsb2JhbCdcbiAgICAgIDogbWF0Y2hlZFNlbGVjdG9ySWRcbiAgICAgICAgPyAncmVxdWlyZVN0YXRpYzpzZWxlY3RvcklkJ1xuICAgICAgICA6ICdyZXF1aXJlU3RhdGljOm1vZHVsZSdcblxuICBjb25zdCBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlscyA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICBpbnN0YW5jZUlkOiBhcmdzLmluc3RhbmNlSWQsXG4gICAgdHhuU2VxOiBhcmdzLnR4blNlcSxcbiAgICBzZWxlY3RvcklkOiBhcmdzLmNvbXBpbGVkLnNlbGVjdG9ySWQsXG4gICAgZGVidWdLZXk6IGFyZ3MuY29tcGlsZWQuZGVidWdLZXksXG4gICAgZmFsbGJhY2tSZWFzb24sXG4gICAgcnVsZSxcbiAgfVxuXG4gIGNvbnN0IGRpYWdub3N0aWMgPSBtYWtlU3RyaWN0R2F0ZURpYWdub3N0aWMoeyBjb25maWc6IGFyZ3MuY29uZmlnLCBkZXRhaWxzIH0pXG5cbiAgaWYgKGFyZ3MuY29uZmlnLm1vZGUgPT09ICd3YXJuJykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdXQVJOJywgZGlhZ25vc3RpYywgZGV0YWlscyB9XG4gIH1cblxuICBjb25zdCBlcnJvciA9IG1ha2VTdHJpY3RHYXRlRXJyb3IoeyBkZXRhaWxzIH0pXG4gIHJldHVybiB7IHZlcmRpY3Q6ICdGQUlMJywgZGlhZ25vc3RpYywgZXJyb3IsIGRldGFpbHMgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7QUFnRE8sU0FBUyxZQUFZLE9BQThDO0FBQ3hFLE1BQUksQ0FBQyxTQUFVLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxXQUFhLFFBQU87QUFDakYsUUFBTSxRQUFRO0FBQ2QsU0FBTyxPQUFPLE1BQU0sZUFBZSxZQUFZLE9BQU8sTUFBTSxXQUFX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T0FBb0QsU0FDdEQsdUJBQ0EsQ0FBQyxvQkFDQyx5QkFDQSxvQkFDRSw2QkFDQTtBQUVSLFFBQU0sVUFBK0M7QUFBQSxJQUNuRCxVQUFVLEtBQUs7QUFBQSxJQUNmLFlBQVksS0FBSztBQUFBLElBQ2pCLFFBQVEsS0FBSztBQUFBLElBQ2IsWUFBWSxLQUFLLFNBQVM7QUFBQSxJQUMxQixVQUFVLEtBQUssU0FBUztBQUFBLElBQ3hCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWEseUJBQXlCLEVBQUUsUUFBUSxLQUFLLFFBQVEsUUFBUSxDQUFDO0FBRTVFLE1BQUksS0FBSyxPQUFPLFNBQVMsUUFBUTtBQUMvQixXQUFPLEVBQUUsU0FBUyxRQUFRLFlBQVksUUFBUTtBQUFBLEVBQ2hEO0FBRUEsUUFBTSxRQUFRLG9CQUFvQixFQUFFLFFBQVEsQ0FBQztBQUM3QyxTQUFPLEVBQUUsU0FBUyxRQUFRLFlBQVksT0FBTyxRQUFRO0FBQ3ZEOyIsCiAgIm5hbWVzIjogWyJzdGF0aWNJciIsICJzZWxlY3RvcklkIl0KfQo=
|