@launchdarkly/session-replay 0.2.1 → 0.2.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/CHANGELOG.md +12 -0
- package/README.md +2 -4
- package/dist/{LDObserve-BrEGi-h9.js → LDObserve-Bg1A5bz4.js} +2 -2
- package/dist/{LDObserve-BrEGi-h9.js.map → LDObserve-Bg1A5bz4.js.map} +1 -1
- package/dist/{index-1OdmzmZU.js → index-BnOFliqz.js} +568 -551
- package/dist/index-BnOFliqz.js.map +1 -0
- package/dist/session-replay.js +1 -1
- package/package.json +2 -2
- package/dist/index-1OdmzmZU.js.map +0 -1
|
@@ -14,14 +14,14 @@ var Wc = Object.defineProperty, Cc = (e, t, i) => t in e ? Wc(e, t, { enumerable
|
|
|
14
14
|
}, o = (a) => a.done ? s(a.value) : Promise.resolve(a.value).then(r, l);
|
|
15
15
|
o((i = i.apply(e, t)).next());
|
|
16
16
|
});
|
|
17
|
-
const Sr = /* @__PURE__ */ Object.create(null),
|
|
17
|
+
const Sr = /* @__PURE__ */ Object.create(null), Ze = (e, t, ...i) => {
|
|
18
18
|
const s = `[@launchdarkly plugins]: (${e}): `;
|
|
19
19
|
console[t].apply(console, [s, ...i]), kc(s, ...i);
|
|
20
20
|
}, Jt = (e, t, i, ...s) => {
|
|
21
|
-
Sr[`${e}-${t}`] || (Sr[`${e}-${t}`] = !0,
|
|
21
|
+
Sr[`${e}-${t}`] || (Sr[`${e}-${t}`] = !0, Ze(e, i, ...s));
|
|
22
22
|
}, kc = (e, ...t) => Rc(void 0, null, function* () {
|
|
23
23
|
try {
|
|
24
|
-
const { LDObserve: i } = yield import("./LDObserve-
|
|
24
|
+
const { LDObserve: i } = yield import("./LDObserve-Bg1A5bz4.js");
|
|
25
25
|
i.recordLog(`${e}${t}`, "warn");
|
|
26
26
|
} catch {
|
|
27
27
|
}
|
|
@@ -50,7 +50,7 @@ class Bo {
|
|
|
50
50
|
try {
|
|
51
51
|
return this._sdk[t](...i);
|
|
52
52
|
} catch (s) {
|
|
53
|
-
|
|
53
|
+
Ze(
|
|
54
54
|
`Error executing buffered call to ${t}:`,
|
|
55
55
|
"error",
|
|
56
56
|
s
|
|
@@ -62,7 +62,7 @@ class Bo {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
_enqueue(t) {
|
|
65
|
-
this._callBuffer.length < this._capacity ? (this._callBuffer.push(t), this._exceededCapacity = !1) : (this._exceededCapacity || (this._exceededCapacity = !0,
|
|
65
|
+
this._callBuffer.length < this._capacity ? (this._callBuffer.push(t), this._exceededCapacity = !1) : (this._exceededCapacity || (this._exceededCapacity = !0, Ze(
|
|
66
66
|
"Exceeded event queue capacity. Increase capacity to avoid dropping events.",
|
|
67
67
|
"warn"
|
|
68
68
|
)), this._droppedEvents += 1);
|
|
@@ -73,7 +73,7 @@ class Bo {
|
|
|
73
73
|
try {
|
|
74
74
|
this._sdk[i](...s);
|
|
75
75
|
} catch (n) {
|
|
76
|
-
|
|
76
|
+
Ze(
|
|
77
77
|
`Error executing buffered call to ${i}:`,
|
|
78
78
|
"error",
|
|
79
79
|
n
|
|
@@ -1043,7 +1043,7 @@ function cu(e) {
|
|
|
1043
1043
|
function rl(e, t) {
|
|
1044
1044
|
return new uu(e, t).parseDocument();
|
|
1045
1045
|
}
|
|
1046
|
-
|
|
1046
|
+
class uu {
|
|
1047
1047
|
constructor(t, i = {}) {
|
|
1048
1048
|
const s = cu(t) ? t : new nl(t);
|
|
1049
1049
|
this._lexer = new Pc(s), this._options = i, this._tokenCounter = 0;
|
|
@@ -2143,7 +2143,7 @@ let uu = class {
|
|
|
2143
2143
|
`Document contains more that ${t} tokens. Parsing aborted.`
|
|
2144
2144
|
);
|
|
2145
2145
|
}
|
|
2146
|
-
}
|
|
2146
|
+
}
|
|
2147
2147
|
function ni(e) {
|
|
2148
2148
|
const t = e.value;
|
|
2149
2149
|
return ol(e.kind) + (t != null ? ` "${t}"` : "");
|
|
@@ -2435,7 +2435,7 @@ const gu = 80, Zu = {
|
|
|
2435
2435
|
leave: ({ variable: e, type: t, defaultValue: i, directives: s }) => e + ": " + t + O(" = ", i) + O(" ", C(s, " "))
|
|
2436
2436
|
},
|
|
2437
2437
|
SelectionSet: {
|
|
2438
|
-
leave: ({ selections: e }) =>
|
|
2438
|
+
leave: ({ selections: e }) => Xe(e)
|
|
2439
2439
|
},
|
|
2440
2440
|
Field: {
|
|
2441
2441
|
leave({ alias: e, name: t, arguments: i, directives: s, selectionSet: n }) {
|
|
@@ -2516,7 +2516,7 @@ const gu = 80, Zu = {
|
|
|
2516
2516
|
// Type System Definitions
|
|
2517
2517
|
SchemaDefinition: {
|
|
2518
2518
|
leave: ({ description: e, directives: t, operationTypes: i }) => O("", e, `
|
|
2519
|
-
`) + C(["schema", C(t, " "),
|
|
2519
|
+
`) + C(["schema", C(t, " "), Xe(i)], " ")
|
|
2520
2520
|
},
|
|
2521
2521
|
OperationTypeDefinition: {
|
|
2522
2522
|
leave: ({ operation: e, type: t }) => e + ": " + t
|
|
@@ -2533,7 +2533,7 @@ const gu = 80, Zu = {
|
|
|
2533
2533
|
t,
|
|
2534
2534
|
O("implements ", C(i, " & ")),
|
|
2535
2535
|
C(s, " "),
|
|
2536
|
-
|
|
2536
|
+
Xe(n)
|
|
2537
2537
|
],
|
|
2538
2538
|
" "
|
|
2539
2539
|
)
|
|
@@ -2560,7 +2560,7 @@ const gu = 80, Zu = {
|
|
|
2560
2560
|
t,
|
|
2561
2561
|
O("implements ", C(i, " & ")),
|
|
2562
2562
|
C(s, " "),
|
|
2563
|
-
|
|
2563
|
+
Xe(n)
|
|
2564
2564
|
],
|
|
2565
2565
|
" "
|
|
2566
2566
|
)
|
|
@@ -2574,7 +2574,7 @@ const gu = 80, Zu = {
|
|
|
2574
2574
|
},
|
|
2575
2575
|
EnumTypeDefinition: {
|
|
2576
2576
|
leave: ({ description: e, name: t, directives: i, values: s }) => O("", e, `
|
|
2577
|
-
`) + C(["enum", t, C(i, " "),
|
|
2577
|
+
`) + C(["enum", t, C(i, " "), Xe(s)], " ")
|
|
2578
2578
|
},
|
|
2579
2579
|
EnumValueDefinition: {
|
|
2580
2580
|
leave: ({ description: e, name: t, directives: i }) => O("", e, `
|
|
@@ -2582,7 +2582,7 @@ const gu = 80, Zu = {
|
|
|
2582
2582
|
},
|
|
2583
2583
|
InputObjectTypeDefinition: {
|
|
2584
2584
|
leave: ({ description: e, name: t, directives: i, fields: s }) => O("", e, `
|
|
2585
|
-
`) + C(["input", t, C(i, " "),
|
|
2585
|
+
`) + C(["input", t, C(i, " "), Xe(s)], " ")
|
|
2586
2586
|
},
|
|
2587
2587
|
DirectiveDefinition: {
|
|
2588
2588
|
leave: ({ description: e, name: t, arguments: i, repeatable: s, locations: n }) => O("", e, `
|
|
@@ -2593,7 +2593,7 @@ const gu = 80, Zu = {
|
|
|
2593
2593
|
},
|
|
2594
2594
|
SchemaExtension: {
|
|
2595
2595
|
leave: ({ directives: e, operationTypes: t }) => C(
|
|
2596
|
-
["extend schema", C(e, " "),
|
|
2596
|
+
["extend schema", C(e, " "), Xe(t)],
|
|
2597
2597
|
" "
|
|
2598
2598
|
)
|
|
2599
2599
|
},
|
|
@@ -2607,7 +2607,7 @@ const gu = 80, Zu = {
|
|
|
2607
2607
|
e,
|
|
2608
2608
|
O("implements ", C(t, " & ")),
|
|
2609
2609
|
C(i, " "),
|
|
2610
|
-
|
|
2610
|
+
Xe(s)
|
|
2611
2611
|
],
|
|
2612
2612
|
" "
|
|
2613
2613
|
)
|
|
@@ -2619,7 +2619,7 @@ const gu = 80, Zu = {
|
|
|
2619
2619
|
e,
|
|
2620
2620
|
O("implements ", C(t, " & ")),
|
|
2621
2621
|
C(i, " "),
|
|
2622
|
-
|
|
2622
|
+
Xe(s)
|
|
2623
2623
|
],
|
|
2624
2624
|
" "
|
|
2625
2625
|
)
|
|
@@ -2636,17 +2636,17 @@ const gu = 80, Zu = {
|
|
|
2636
2636
|
)
|
|
2637
2637
|
},
|
|
2638
2638
|
EnumTypeExtension: {
|
|
2639
|
-
leave: ({ name: e, directives: t, values: i }) => C(["extend enum", e, C(t, " "),
|
|
2639
|
+
leave: ({ name: e, directives: t, values: i }) => C(["extend enum", e, C(t, " "), Xe(i)], " ")
|
|
2640
2640
|
},
|
|
2641
2641
|
InputObjectTypeExtension: {
|
|
2642
|
-
leave: ({ name: e, directives: t, fields: i }) => C(["extend input", e, C(t, " "),
|
|
2642
|
+
leave: ({ name: e, directives: t, fields: i }) => C(["extend input", e, C(t, " "), Xe(i)], " ")
|
|
2643
2643
|
}
|
|
2644
2644
|
};
|
|
2645
2645
|
function C(e, t = "") {
|
|
2646
2646
|
var i;
|
|
2647
2647
|
return (i = e?.filter((s) => s).join(t)) !== null && i !== void 0 ? i : "";
|
|
2648
2648
|
}
|
|
2649
|
-
function
|
|
2649
|
+
function Xe(e) {
|
|
2650
2650
|
return O(`{
|
|
2651
2651
|
`, wi(C(e, `
|
|
2652
2652
|
`)), `
|
|
@@ -2969,16 +2969,16 @@ var $s = { exports: {} };
|
|
|
2969
2969
|
headers: k(U.getAllResponseHeaders() || "")
|
|
2970
2970
|
};
|
|
2971
2971
|
ie.url = "responseURL" in U ? U.responseURL : ie.headers.get("X-Request-URL");
|
|
2972
|
-
var
|
|
2973
|
-
T(new Y(
|
|
2972
|
+
var Ge = "response" in U ? U.response : U.responseText;
|
|
2973
|
+
T(new Y(Ge, ie));
|
|
2974
2974
|
}, U.onerror = function() {
|
|
2975
2975
|
_(new TypeError("Network request failed"));
|
|
2976
2976
|
}, U.ontimeout = function() {
|
|
2977
2977
|
_(new TypeError("Network request failed"));
|
|
2978
2978
|
}, U.onabort = function() {
|
|
2979
2979
|
_(new l.DOMException("Aborted", "AbortError"));
|
|
2980
|
-
}, U.open(B.method, B.url, !0), B.credentials === "include" ? U.withCredentials = !0 : B.credentials === "omit" && (U.withCredentials = !1), "responseType" in U && o.blob && (U.responseType = "blob"), B.headers.forEach(function(ie,
|
|
2981
|
-
U.setRequestHeader(
|
|
2980
|
+
}, U.open(B.method, B.url, !0), B.credentials === "include" ? U.withCredentials = !0 : B.credentials === "omit" && (U.withCredentials = !1), "responseType" in U && o.blob && (U.responseType = "blob"), B.headers.forEach(function(ie, Ge) {
|
|
2981
|
+
U.setRequestHeader(Ge, ie);
|
|
2982
2982
|
}), B.signal && (B.signal.addEventListener("abort", $), U.onreadystatechange = function() {
|
|
2983
2983
|
U.readyState === 4 && B.signal.removeEventListener("abort", $);
|
|
2984
2984
|
}), U.send(typeof B._bodyInit > "u" ? null : B._bodyInit);
|
|
@@ -3606,7 +3606,7 @@ const wr = 1e3, ed = 1e3 * 2, td = 4 * 60 * 60 * 1e3, bl = 15 * 60 * 1e3, vr = {
|
|
|
3606
3606
|
bytes: 16e6,
|
|
3607
3607
|
time: 5e3
|
|
3608
3608
|
}
|
|
3609
|
-
}, id = 100, xr = "app.highlight.io", sd = "app.launchdarkly.com", nd = {
|
|
3609
|
+
}, id = 100, xr = "app.highlight.io", sd = "https://app.launchdarkly.com", nd = {
|
|
3610
3610
|
"observability.ld-stg.launchdarkly.com": "ld-stg.launchdarkly.com",
|
|
3611
3611
|
"observability.app.launchdarkly.com": "app.launchdarkly.com",
|
|
3612
3612
|
"observability.app.ld.catamorphic.com": "app.ld.catamorphic.com"
|
|
@@ -3742,7 +3742,7 @@ const Ut = new ad(), Pi = new cd(), Pn = () => {
|
|
|
3742
3742
|
zi = e;
|
|
3743
3743
|
}, Tr = (e) => {
|
|
3744
3744
|
nn = e;
|
|
3745
|
-
},
|
|
3745
|
+
}, Se = (e) => {
|
|
3746
3746
|
try {
|
|
3747
3747
|
return Pn().getItem(e);
|
|
3748
3748
|
} catch (t) {
|
|
@@ -3801,12 +3801,12 @@ const ds = (e) => `${ye.SESSION_DATA}_${e}`, hd = () => {
|
|
|
3801
3801
|
typeof globalThis < "u" && e != null && e.length && (globalThis.persistentSessionSecureID = e);
|
|
3802
3802
|
}, fl = () => {
|
|
3803
3803
|
var e;
|
|
3804
|
-
return (e =
|
|
3804
|
+
return (e = Se(ye.SESSION_ID)) != null ? e : "";
|
|
3805
3805
|
}, wt = (e) => {
|
|
3806
3806
|
Je(ye.SESSION_ID, e);
|
|
3807
3807
|
}, md = (e) => {
|
|
3808
3808
|
const t = ds(e);
|
|
3809
|
-
return JSON.parse(
|
|
3809
|
+
return JSON.parse(Se(t) || "{}");
|
|
3810
3810
|
}, Ni = (e) => {
|
|
3811
3811
|
e || (e = fl());
|
|
3812
3812
|
let t = md(e);
|
|
@@ -3875,7 +3875,7 @@ function Rd(e) {
|
|
|
3875
3875
|
[t]: gl(e[t].key)
|
|
3876
3876
|
})).reduce((t, i) => M(M({}, t), i), {}) : e.key;
|
|
3877
3877
|
}
|
|
3878
|
-
|
|
3878
|
+
class kd {
|
|
3879
3879
|
constructor(t, i) {
|
|
3880
3880
|
Lt(this, "client"), Lt(this, "metadata"), this.client = t, this.metadata = i;
|
|
3881
3881
|
}
|
|
@@ -3915,8 +3915,8 @@ let kd = class {
|
|
|
3915
3915
|
})
|
|
3916
3916
|
);
|
|
3917
3917
|
}
|
|
3918
|
-
}
|
|
3919
|
-
|
|
3918
|
+
}
|
|
3919
|
+
let wd = class extends Bo {
|
|
3920
3920
|
constructor(t, i) {
|
|
3921
3921
|
super(), Lt(this, "client"), this.client = new kd(t, i);
|
|
3922
3922
|
}
|
|
@@ -3950,11 +3950,14 @@ class wd extends Bo {
|
|
|
3950
3950
|
track(t, i) {
|
|
3951
3951
|
return this._bufferCall("track", [t, i]);
|
|
3952
3952
|
}
|
|
3953
|
-
}
|
|
3953
|
+
};
|
|
3954
|
+
const vd = "9.18.15", xd = {
|
|
3955
|
+
version: vd
|
|
3956
|
+
}, Td = xd.version;
|
|
3954
3957
|
function Il(e, t) {
|
|
3955
|
-
return
|
|
3958
|
+
return Jd(e);
|
|
3956
3959
|
}
|
|
3957
|
-
function
|
|
3960
|
+
function Nd(e) {
|
|
3958
3961
|
if (e.id.length)
|
|
3959
3962
|
return `#${e.id}`;
|
|
3960
3963
|
if (e.classList.length) {
|
|
@@ -3965,11 +3968,11 @@ function vd(e) {
|
|
|
3965
3968
|
}
|
|
3966
3969
|
return e.nodeName.toLowerCase();
|
|
3967
3970
|
}
|
|
3968
|
-
const
|
|
3971
|
+
const Jd = (e) => {
|
|
3969
3972
|
let t = "";
|
|
3970
3973
|
const i = e.getAttribute("class"), s = e.getAttribute("id");
|
|
3971
3974
|
return s && (t = t.concat(Jr(s, "#"))), i && (t = t.concat(Jr(i, "."))), t === "" && (t = t.concat(e.tagName.toLowerCase())), t;
|
|
3972
|
-
}, Jr = (e, t) => `${t}${e.trim().split(" ").join(t)}`,
|
|
3975
|
+
}, Jr = (e, t) => `${t}${e.trim().split(" ").join(t)}`, Ld = (e) => {
|
|
3973
3976
|
let t;
|
|
3974
3977
|
const i = () => {
|
|
3975
3978
|
clearTimeout(t), t = setTimeout(() => {
|
|
@@ -4000,7 +4003,7 @@ const xd = (e) => {
|
|
|
4000
4003
|
);
|
|
4001
4004
|
return i;
|
|
4002
4005
|
};
|
|
4003
|
-
let
|
|
4006
|
+
let Yd = class {
|
|
4004
4007
|
constructor(t) {
|
|
4005
4008
|
Lt(this, "sessionSecureID");
|
|
4006
4009
|
try {
|
|
@@ -4017,7 +4020,7 @@ let Nd = class {
|
|
|
4017
4020
|
lastPushTime: Date.now()
|
|
4018
4021
|
}));
|
|
4019
4022
|
} catch (i) {
|
|
4020
|
-
|
|
4023
|
+
Ze(
|
|
4021
4024
|
"Error initializing @launchdarkly observability plugin",
|
|
4022
4025
|
"error",
|
|
4023
4026
|
i
|
|
@@ -4025,7 +4028,7 @@ let Nd = class {
|
|
|
4025
4028
|
}
|
|
4026
4029
|
}
|
|
4027
4030
|
};
|
|
4028
|
-
var
|
|
4031
|
+
var Ud = (e, t, i) => new Promise((s, n) => {
|
|
4029
4032
|
var r = (a) => {
|
|
4030
4033
|
try {
|
|
4031
4034
|
o(i.next(a));
|
|
@@ -4046,7 +4049,7 @@ class Lr extends Bo {
|
|
|
4046
4049
|
return this._isLoaded ? this._bufferCall("getSession", []) : null;
|
|
4047
4050
|
}
|
|
4048
4051
|
start(t) {
|
|
4049
|
-
return
|
|
4052
|
+
return Ud(this, null, function* () {
|
|
4050
4053
|
return this._bufferCall("start", [t]);
|
|
4051
4054
|
});
|
|
4052
4055
|
}
|
|
@@ -4065,14 +4068,14 @@ class Lr extends Bo {
|
|
|
4065
4068
|
}
|
|
4066
4069
|
let Rt;
|
|
4067
4070
|
typeof globalThis < "u" ? globalThis.LDRecord ? Rt = globalThis.LDRecord : (Rt = new Lr(), globalThis.LDRecord = Rt) : Rt = new Lr();
|
|
4068
|
-
var
|
|
4071
|
+
var Fd = Object.defineProperty, Kd = Object.defineProperties, Od = Object.getOwnPropertyDescriptors, Bi = Object.getOwnPropertySymbols, Sl = Object.prototype.hasOwnProperty, Gl = Object.prototype.propertyIsEnumerable, ln = (e, t, i) => t in e ? Fd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, F = (e, t) => {
|
|
4069
4072
|
for (var i in t || (t = {}))
|
|
4070
4073
|
Sl.call(t, i) && ln(e, i, t[i]);
|
|
4071
4074
|
if (Bi)
|
|
4072
4075
|
for (var i of Bi(t))
|
|
4073
4076
|
Gl.call(t, i) && ln(e, i, t[i]);
|
|
4074
4077
|
return e;
|
|
4075
|
-
}, ge = (e, t) =>
|
|
4078
|
+
}, ge = (e, t) => Kd(e, Od(t)), ot = (e, t) => {
|
|
4076
4079
|
var i = {};
|
|
4077
4080
|
for (var s in e)
|
|
4078
4081
|
Sl.call(e, s) && t.indexOf(s) < 0 && (i[s] = e[s]);
|
|
@@ -4096,13 +4099,13 @@ var Ld = Object.defineProperty, Yd = Object.defineProperties, Ud = Object.getOwn
|
|
|
4096
4099
|
}, o = (a) => a.done ? s(a.value) : Promise.resolve(a.value).then(r, l);
|
|
4097
4100
|
o((i = i.apply(e, t)).next());
|
|
4098
4101
|
});
|
|
4099
|
-
const
|
|
4102
|
+
const Md = {
|
|
4100
4103
|
key: "_sid"
|
|
4101
|
-
},
|
|
4102
|
-
const t =
|
|
4104
|
+
}, Ed = "rrweb/sequential-id@1", Hd = (e) => {
|
|
4105
|
+
const t = Md;
|
|
4103
4106
|
let i = 0;
|
|
4104
4107
|
return {
|
|
4105
|
-
name:
|
|
4108
|
+
name: Ed,
|
|
4106
4109
|
eventProcessor(s) {
|
|
4107
4110
|
return Object.assign(s, {
|
|
4108
4111
|
[t.key]: ++i
|
|
@@ -4111,7 +4114,7 @@ const Fd = {
|
|
|
4111
4114
|
options: t
|
|
4112
4115
|
};
|
|
4113
4116
|
};
|
|
4114
|
-
var
|
|
4117
|
+
var zd = Object.defineProperty, Pd = (e, t, i) => t in e ? zd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, S = (e, t, i) => Pd(e, typeof t != "symbol" ? t + "" : t, i), Yr, Bd = Object.defineProperty, Dd = (e, t, i) => t in e ? Bd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, Ur = (e, t, i) => Dd(e, typeof t != "symbol" ? t + "" : t, i), le = /* @__PURE__ */ ((e) => (e[e.Document = 0] = "Document", e[e.DocumentType = 1] = "DocumentType", e[e.Element = 2] = "Element", e[e.Text = 3] = "Text", e[e.CDATA = 4] = "CDATA", e[e.Comment = 5] = "Comment", e))(le || {});
|
|
4115
4118
|
const Fr = {
|
|
4116
4119
|
Node: ["childNodes", "parentNode", "parentElement", "textContent"],
|
|
4117
4120
|
ShadowRoot: ["host", "styleSheets"],
|
|
@@ -4122,7 +4125,7 @@ const Fr = {
|
|
|
4122
4125
|
ShadowRoot: ["getSelection"],
|
|
4123
4126
|
Element: [],
|
|
4124
4127
|
MutationObserver: ["constructor"]
|
|
4125
|
-
}, oi = {},
|
|
4128
|
+
}, oi = {}, jd = () => !!globalThis.Zone;
|
|
4126
4129
|
function Bn(e) {
|
|
4127
4130
|
if (oi[e])
|
|
4128
4131
|
return oi[e];
|
|
@@ -4139,7 +4142,7 @@ function Bn(e) {
|
|
|
4139
4142
|
return typeof i[o] == "function" && ((a = i[o]) == null ? void 0 : a.toString().includes("[native code]"));
|
|
4140
4143
|
}
|
|
4141
4144
|
));
|
|
4142
|
-
if (n && l && !
|
|
4145
|
+
if (n && l && !jd())
|
|
4143
4146
|
return oi[e] = t.prototype, t.prototype;
|
|
4144
4147
|
try {
|
|
4145
4148
|
const o = document.createElement("iframe");
|
|
@@ -4176,43 +4179,43 @@ function Vl(e, t, i) {
|
|
|
4176
4179
|
const n = Bn(e)[i];
|
|
4177
4180
|
return typeof n != "function" ? t[i] : (Js[s] = n, n.bind(t));
|
|
4178
4181
|
}
|
|
4179
|
-
function
|
|
4182
|
+
function Qd(e) {
|
|
4180
4183
|
return Me("Node", e, "childNodes");
|
|
4181
4184
|
}
|
|
4182
|
-
function
|
|
4185
|
+
function Ad(e) {
|
|
4183
4186
|
return Me("Node", e, "parentNode");
|
|
4184
4187
|
}
|
|
4185
|
-
function
|
|
4188
|
+
function _d(e) {
|
|
4186
4189
|
return Me("Node", e, "parentElement");
|
|
4187
4190
|
}
|
|
4188
|
-
function
|
|
4191
|
+
function $d(e) {
|
|
4189
4192
|
return Me("Node", e, "textContent");
|
|
4190
4193
|
}
|
|
4191
|
-
function
|
|
4194
|
+
function qd(e, t) {
|
|
4192
4195
|
return Vl("Node", e, "contains")(t);
|
|
4193
4196
|
}
|
|
4194
|
-
function
|
|
4197
|
+
function eh(e) {
|
|
4195
4198
|
return Vl("Node", e, "getRootNode")();
|
|
4196
4199
|
}
|
|
4197
|
-
function
|
|
4200
|
+
function th(e) {
|
|
4198
4201
|
return !e || !("host" in e) ? null : Me("ShadowRoot", e, "host");
|
|
4199
4202
|
}
|
|
4200
|
-
function
|
|
4203
|
+
function ih(e) {
|
|
4201
4204
|
return e.styleSheets;
|
|
4202
4205
|
}
|
|
4203
|
-
function
|
|
4206
|
+
function sh(e) {
|
|
4204
4207
|
return !e || !("shadowRoot" in e) ? null : Me("Element", e, "shadowRoot");
|
|
4205
4208
|
}
|
|
4206
|
-
function
|
|
4209
|
+
function nh(e, t) {
|
|
4207
4210
|
return Me("Element", e, "querySelector")(t);
|
|
4208
4211
|
}
|
|
4209
|
-
function
|
|
4212
|
+
function rh(e, t) {
|
|
4210
4213
|
return Me("Element", e, "querySelectorAll")(t);
|
|
4211
4214
|
}
|
|
4212
|
-
function
|
|
4215
|
+
function oh() {
|
|
4213
4216
|
return Bn("MutationObserver").constructor;
|
|
4214
4217
|
}
|
|
4215
|
-
function
|
|
4218
|
+
function lh(e, t, i) {
|
|
4216
4219
|
try {
|
|
4217
4220
|
if (!(t in e))
|
|
4218
4221
|
return () => {
|
|
@@ -4232,19 +4235,19 @@ function nh(e, t, i) {
|
|
|
4232
4235
|
}
|
|
4233
4236
|
}
|
|
4234
4237
|
const ce = {
|
|
4235
|
-
childNodes:
|
|
4236
|
-
parentNode:
|
|
4237
|
-
parentElement:
|
|
4238
|
-
textContent:
|
|
4239
|
-
contains:
|
|
4240
|
-
getRootNode:
|
|
4241
|
-
host:
|
|
4242
|
-
styleSheets:
|
|
4243
|
-
shadowRoot:
|
|
4244
|
-
querySelector:
|
|
4245
|
-
querySelectorAll:
|
|
4246
|
-
mutationObserver:
|
|
4247
|
-
patch:
|
|
4238
|
+
childNodes: Qd,
|
|
4239
|
+
parentNode: Ad,
|
|
4240
|
+
parentElement: _d,
|
|
4241
|
+
textContent: $d,
|
|
4242
|
+
contains: qd,
|
|
4243
|
+
getRootNode: eh,
|
|
4244
|
+
host: th,
|
|
4245
|
+
styleSheets: ih,
|
|
4246
|
+
shadowRoot: sh,
|
|
4247
|
+
querySelector: nh,
|
|
4248
|
+
querySelectorAll: rh,
|
|
4249
|
+
mutationObserver: oh,
|
|
4250
|
+
patch: lh
|
|
4248
4251
|
};
|
|
4249
4252
|
function Xl(e) {
|
|
4250
4253
|
return e.nodeType === e.ELEMENT_NODE;
|
|
@@ -4260,13 +4263,13 @@ function vt(e) {
|
|
|
4260
4263
|
function xt(e) {
|
|
4261
4264
|
return Object.prototype.toString.call(e) === "[object ShadowRoot]";
|
|
4262
4265
|
}
|
|
4263
|
-
function
|
|
4266
|
+
function ah(e) {
|
|
4264
4267
|
return e.includes(" background-clip: text;") && !e.includes(" -webkit-background-clip: text;") && (e = e.replace(
|
|
4265
4268
|
/\sbackground-clip:\s*text;/g,
|
|
4266
4269
|
" -webkit-background-clip: text; background-clip: text;"
|
|
4267
4270
|
)), e;
|
|
4268
4271
|
}
|
|
4269
|
-
function
|
|
4272
|
+
function ch(e) {
|
|
4270
4273
|
const { cssText: t } = e;
|
|
4271
4274
|
if (t.split('"').length < 3) return t;
|
|
4272
4275
|
const i = ["@import", `url(${JSON.stringify(e.href)})`];
|
|
@@ -4283,36 +4286,36 @@ function an(e) {
|
|
|
4283
4286
|
t,
|
|
4284
4287
|
(n) => Wl(n, i)
|
|
4285
4288
|
).join("");
|
|
4286
|
-
return
|
|
4289
|
+
return ah(s);
|
|
4287
4290
|
} catch {
|
|
4288
4291
|
return null;
|
|
4289
4292
|
}
|
|
4290
4293
|
}
|
|
4291
4294
|
function Wl(e, t) {
|
|
4292
|
-
if (
|
|
4295
|
+
if (dh(e)) {
|
|
4293
4296
|
let i;
|
|
4294
4297
|
try {
|
|
4295
4298
|
i = // for same-origin stylesheets,
|
|
4296
4299
|
// we can access the imported stylesheet rules directly
|
|
4297
4300
|
an(e.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement
|
|
4298
|
-
|
|
4301
|
+
ch(e);
|
|
4299
4302
|
} catch {
|
|
4300
4303
|
i = e.cssText;
|
|
4301
4304
|
}
|
|
4302
4305
|
return e.styleSheet.href ? Qi(i, e.styleSheet.href) : i;
|
|
4303
4306
|
} else {
|
|
4304
4307
|
let i = e.cssText;
|
|
4305
|
-
return
|
|
4308
|
+
return hh(e) && e.selectorText.includes(":") && (i = uh(i)), t ? Qi(i, t) : i;
|
|
4306
4309
|
}
|
|
4307
4310
|
}
|
|
4308
|
-
function
|
|
4311
|
+
function uh(e) {
|
|
4309
4312
|
const t = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;
|
|
4310
4313
|
return e.replace(t, "$1\\$2");
|
|
4311
4314
|
}
|
|
4312
|
-
function
|
|
4315
|
+
function dh(e) {
|
|
4313
4316
|
return "styleSheet" in e;
|
|
4314
4317
|
}
|
|
4315
|
-
function
|
|
4318
|
+
function hh(e) {
|
|
4316
4319
|
return "selectorText" in e;
|
|
4317
4320
|
}
|
|
4318
4321
|
class Cl {
|
|
@@ -4364,7 +4367,7 @@ class Cl {
|
|
|
4364
4367
|
this.idNodeMap = /* @__PURE__ */ new Map(), this.nodeMetaMap = /* @__PURE__ */ new WeakMap();
|
|
4365
4368
|
}
|
|
4366
4369
|
}
|
|
4367
|
-
function
|
|
4370
|
+
function ph() {
|
|
4368
4371
|
return new Cl();
|
|
4369
4372
|
}
|
|
4370
4373
|
function Di({
|
|
@@ -4388,7 +4391,7 @@ function lt(e) {
|
|
|
4388
4391
|
return e.toLowerCase();
|
|
4389
4392
|
}
|
|
4390
4393
|
const Or = "__rrweb_original__";
|
|
4391
|
-
function
|
|
4394
|
+
function mh(e) {
|
|
4392
4395
|
const t = e.getContext("2d");
|
|
4393
4396
|
if (!t) return !0;
|
|
4394
4397
|
const i = 50;
|
|
@@ -4426,24 +4429,24 @@ function Rl(e, t) {
|
|
|
4426
4429
|
const n = /\.([0-9a-z]+)(?:$)/i, r = s.pathname.match(n);
|
|
4427
4430
|
return (i = r?.[1]) != null ? i : null;
|
|
4428
4431
|
}
|
|
4429
|
-
function
|
|
4432
|
+
function bh(e) {
|
|
4430
4433
|
let t = "";
|
|
4431
4434
|
return e.indexOf("//") > -1 ? t = e.split("/").slice(0, 3).join("/") : t = e.split("/")[0], t = t.split("?")[0], t;
|
|
4432
4435
|
}
|
|
4433
|
-
const
|
|
4436
|
+
const fh = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm, yh = /^(?:[a-z+]+:)?\/\//i, gh = /^www\..*/i, Zh = /^(data:)([^,]*),(.*)/i;
|
|
4434
4437
|
function Qi(e, t) {
|
|
4435
4438
|
return (e || "").replace(
|
|
4436
|
-
|
|
4439
|
+
fh,
|
|
4437
4440
|
(i, s, n, r, l, o) => {
|
|
4438
4441
|
const a = n || l || o, c = s || r || "";
|
|
4439
4442
|
if (!a)
|
|
4440
4443
|
return i;
|
|
4441
|
-
if (
|
|
4444
|
+
if (yh.test(a) || gh.test(a))
|
|
4442
4445
|
return `url(${c}${a}${c})`;
|
|
4443
|
-
if (
|
|
4446
|
+
if (Zh.test(a))
|
|
4444
4447
|
return `url(${c}${a}${c})`;
|
|
4445
4448
|
if (a[0] === "/")
|
|
4446
|
-
return `url(${c}${
|
|
4449
|
+
return `url(${c}${bh(t) + a}${c})`;
|
|
4447
4450
|
const u = t.split("/"), h = a.split("/");
|
|
4448
4451
|
u.pop();
|
|
4449
4452
|
for (const m of h)
|
|
@@ -4455,7 +4458,7 @@ function Qi(e, t) {
|
|
|
4455
4458
|
function li(e, t = !1) {
|
|
4456
4459
|
return t ? e.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "") : e.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "").replace(/0px/g, "0");
|
|
4457
4460
|
}
|
|
4458
|
-
function
|
|
4461
|
+
function Ih(e, t, i = !1) {
|
|
4459
4462
|
const s = Array.from(t.childNodes), n = [];
|
|
4460
4463
|
let r = 0;
|
|
4461
4464
|
if (s.length > 1 && e && typeof e == "string") {
|
|
@@ -4521,8 +4524,8 @@ function yh(e, t, i = !1) {
|
|
|
4521
4524
|
}
|
|
4522
4525
|
return n.push(e), n;
|
|
4523
4526
|
}
|
|
4524
|
-
function
|
|
4525
|
-
return
|
|
4527
|
+
function Sh(e, t) {
|
|
4528
|
+
return Ih(e, t).join("/* rr_split */");
|
|
4526
4529
|
}
|
|
4527
4530
|
function Dn(e) {
|
|
4528
4531
|
return e = e.replace(/[^ -~]+/g, ""), e = e?.split(" ").map((t) => Math.random().toString(20).substring(2, t.length)).join(" ") || "", e;
|
|
@@ -4530,23 +4533,23 @@ function Dn(e) {
|
|
|
4530
4533
|
function cn(e) {
|
|
4531
4534
|
return e === "img" || e === "video" || e === "audio" || e === "source";
|
|
4532
4535
|
}
|
|
4533
|
-
const
|
|
4536
|
+
const Gh = new RegExp(
|
|
4534
4537
|
/[a-zA-Z0-9.!#$%&'*+=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*/
|
|
4535
|
-
),
|
|
4538
|
+
), Vh = new RegExp(/[0-9]{9,16}/), Xh = new RegExp(/[0-9]{3}-?[0-9]{2}-?[0-9]{4}/), Wh = new RegExp(
|
|
4536
4539
|
/[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}/
|
|
4537
|
-
),
|
|
4540
|
+
), Ch = new RegExp(/[0-9]{4}-?[0-9]{4}-?[0-9]{4}-?[0-9]{4}/), Rh = new RegExp(
|
|
4538
4541
|
/[0-9]{1,5}.?[0-9]{0,3}\s[a-zA-Z]{2,30}\s[a-zA-Z]{2,15}/
|
|
4539
|
-
),
|
|
4540
|
-
Zh,
|
|
4541
|
-
Ih,
|
|
4542
|
-
Sh,
|
|
4542
|
+
), kh = new RegExp(/(?:[0-9]{1,3}.){3}[0-9]{1,3}/), wh = [
|
|
4543
4543
|
Gh,
|
|
4544
4544
|
Vh,
|
|
4545
4545
|
Xh,
|
|
4546
|
-
Wh
|
|
4546
|
+
Wh,
|
|
4547
|
+
Ch,
|
|
4548
|
+
Rh,
|
|
4549
|
+
kh
|
|
4547
4550
|
];
|
|
4548
4551
|
function kl(e) {
|
|
4549
|
-
return e ?
|
|
4552
|
+
return e ? wh.some((t) => t.test(e)) : !1;
|
|
4550
4553
|
}
|
|
4551
4554
|
const wl = ({
|
|
4552
4555
|
maskInputOptions: e,
|
|
@@ -4557,20 +4560,20 @@ const wl = ({
|
|
|
4557
4560
|
const n = i && i.toLowerCase();
|
|
4558
4561
|
return s !== "true" && (!!e[t.toLowerCase()] || !!(n && e[n]));
|
|
4559
4562
|
};
|
|
4560
|
-
let
|
|
4561
|
-
const
|
|
4563
|
+
let vh = 1;
|
|
4564
|
+
const xh = new RegExp("[^a-z0-9-_:]"), Ft = -2;
|
|
4562
4565
|
function vl() {
|
|
4563
|
-
return
|
|
4566
|
+
return vh++;
|
|
4564
4567
|
}
|
|
4565
|
-
function
|
|
4568
|
+
function Th(e) {
|
|
4566
4569
|
if (e instanceof HTMLFormElement)
|
|
4567
4570
|
return "form";
|
|
4568
4571
|
const t = lt(e.tagName);
|
|
4569
|
-
return
|
|
4572
|
+
return xh.test(t) ? "div" : t;
|
|
4570
4573
|
}
|
|
4571
4574
|
let $e, Mr;
|
|
4572
|
-
const
|
|
4573
|
-
function
|
|
4575
|
+
const Nh = /^[^ \t\n\r\u000c]+/, Jh = /^[, \t\n\r\u000c]+/;
|
|
4576
|
+
function Lh(e, t) {
|
|
4574
4577
|
if (t.trim() === "")
|
|
4575
4578
|
return t;
|
|
4576
4579
|
let i = 0;
|
|
@@ -4580,8 +4583,8 @@ function Th(e, t) {
|
|
|
4580
4583
|
return o ? (l = o[0], i += l.length, l) : "";
|
|
4581
4584
|
}
|
|
4582
4585
|
const n = [];
|
|
4583
|
-
for (; s(
|
|
4584
|
-
let r = s(
|
|
4586
|
+
for (; s(Jh), !(i >= t.length); ) {
|
|
4587
|
+
let r = s(Nh);
|
|
4585
4588
|
if (r.slice(-1) === ",")
|
|
4586
4589
|
r = Ai(e, r.substring(0, r.length - 1)), n.push(r);
|
|
4587
4590
|
else {
|
|
@@ -4609,7 +4612,7 @@ const Er = /* @__PURE__ */ new WeakMap();
|
|
|
4609
4612
|
function Ai(e, t) {
|
|
4610
4613
|
return !t || t.trim() === "" ? t : jn(e, t);
|
|
4611
4614
|
}
|
|
4612
|
-
function
|
|
4615
|
+
function Yh(e) {
|
|
4613
4616
|
return !!(e.tagName === "svg" || e.ownerSVGElement);
|
|
4614
4617
|
}
|
|
4615
4618
|
function jn(e, t) {
|
|
@@ -4621,7 +4624,7 @@ function jn(e, t) {
|
|
|
4621
4624
|
return i.setAttribute("href", t), i.href;
|
|
4622
4625
|
}
|
|
4623
4626
|
function xl(e, t, i, s) {
|
|
4624
|
-
return s && (i === "src" || i === "href" && !(t === "use" && s[0] === "#") || i === "xlink:href" && s[0] !== "#" || i === "background" && (t === "table" || t === "td" || t === "th") ? Ai(e, s) : i === "srcset" ?
|
|
4627
|
+
return s && (i === "src" || i === "href" && !(t === "use" && s[0] === "#") || i === "xlink:href" && s[0] !== "#" || i === "background" && (t === "table" || t === "td" || t === "th") ? Ai(e, s) : i === "srcset" ? Lh(e, s) : i === "style" ? Qi(s, jn(e)) : t === "object" && i === "data" ? Ai(e, s) : s);
|
|
4625
4628
|
}
|
|
4626
4629
|
function Tl(e, t, i) {
|
|
4627
4630
|
return (e === "video" || e === "audio") && t === "autoplay";
|
|
@@ -4679,7 +4682,7 @@ function Nl(e, t, i, s) {
|
|
|
4679
4682
|
}
|
|
4680
4683
|
return !1;
|
|
4681
4684
|
}
|
|
4682
|
-
function
|
|
4685
|
+
function Uh(e, t, i) {
|
|
4683
4686
|
const s = e.contentWindow;
|
|
4684
4687
|
if (!s)
|
|
4685
4688
|
return;
|
|
@@ -4703,7 +4706,7 @@ function Jh(e, t, i) {
|
|
|
4703
4706
|
return setTimeout(t, 0), e.addEventListener("load", t);
|
|
4704
4707
|
e.addEventListener("load", t);
|
|
4705
4708
|
}
|
|
4706
|
-
function
|
|
4709
|
+
function Fh(e, t, i) {
|
|
4707
4710
|
let s = !1, n;
|
|
4708
4711
|
try {
|
|
4709
4712
|
n = e.sheet;
|
|
@@ -4718,7 +4721,7 @@ function Lh(e, t, i) {
|
|
|
4718
4721
|
clearTimeout(r), s = !0, t();
|
|
4719
4722
|
});
|
|
4720
4723
|
}
|
|
4721
|
-
function
|
|
4724
|
+
function Kh(e, t) {
|
|
4722
4725
|
const {
|
|
4723
4726
|
doc: i,
|
|
4724
4727
|
mirror: s,
|
|
@@ -4738,7 +4741,7 @@ function Yh(e, t) {
|
|
|
4738
4741
|
newlyAddedElement: Z = !1,
|
|
4739
4742
|
cssCaptured: X = !1,
|
|
4740
4743
|
privacySetting: R
|
|
4741
|
-
} = t, W =
|
|
4744
|
+
} = t, W = Oh(i, s);
|
|
4742
4745
|
switch (e.nodeType) {
|
|
4743
4746
|
case e.DOCUMENT_NODE:
|
|
4744
4747
|
return e.compatMode !== "CSS1Compat" ? {
|
|
@@ -4759,7 +4762,7 @@ function Yh(e, t) {
|
|
|
4759
4762
|
rootId: W
|
|
4760
4763
|
};
|
|
4761
4764
|
case e.ELEMENT_NODE:
|
|
4762
|
-
return
|
|
4765
|
+
return Eh(e, {
|
|
4763
4766
|
doc: i,
|
|
4764
4767
|
blockClass: n,
|
|
4765
4768
|
blockSelector: r,
|
|
@@ -4777,7 +4780,7 @@ function Yh(e, t) {
|
|
|
4777
4780
|
rootId: W
|
|
4778
4781
|
});
|
|
4779
4782
|
case e.TEXT_NODE:
|
|
4780
|
-
return
|
|
4783
|
+
return Mh(e, {
|
|
4781
4784
|
doc: i,
|
|
4782
4785
|
needsMask: l,
|
|
4783
4786
|
maskTextFn: u,
|
|
@@ -4801,12 +4804,12 @@ function Yh(e, t) {
|
|
|
4801
4804
|
return !1;
|
|
4802
4805
|
}
|
|
4803
4806
|
}
|
|
4804
|
-
function
|
|
4807
|
+
function Oh(e, t) {
|
|
4805
4808
|
if (!t.hasNode(e)) return;
|
|
4806
4809
|
const i = t.getId(e);
|
|
4807
4810
|
return i === 1 ? void 0 : i;
|
|
4808
4811
|
}
|
|
4809
|
-
function
|
|
4812
|
+
function Mh(e, t) {
|
|
4810
4813
|
var i;
|
|
4811
4814
|
const { needsMask: s, maskTextFn: n, privacySetting: r, rootId: l, cssCaptured: o } = t, a = ce.parentNode(e), c = a && a.tagName;
|
|
4812
4815
|
let u = "";
|
|
@@ -4827,7 +4830,7 @@ function Fh(e, t) {
|
|
|
4827
4830
|
rootId: l
|
|
4828
4831
|
};
|
|
4829
4832
|
}
|
|
4830
|
-
function
|
|
4833
|
+
function Eh(e, t) {
|
|
4831
4834
|
const {
|
|
4832
4835
|
doc: i,
|
|
4833
4836
|
blockClass: s,
|
|
@@ -4847,7 +4850,7 @@ function Kh(e, t) {
|
|
|
4847
4850
|
} = t;
|
|
4848
4851
|
let Z = Hr(e, s, n);
|
|
4849
4852
|
const X = Hr(e, a, null), R = d === "strict";
|
|
4850
|
-
let W =
|
|
4853
|
+
let W = Th(e), G = {};
|
|
4851
4854
|
const w = e.attributes.length;
|
|
4852
4855
|
for (let V = 0; V < w; V++) {
|
|
4853
4856
|
const k = e.attributes[V];
|
|
@@ -4867,7 +4870,7 @@ function Kh(e, t) {
|
|
|
4867
4870
|
let V = an(
|
|
4868
4871
|
e.sheet
|
|
4869
4872
|
);
|
|
4870
|
-
V && (e.childNodes.length > 1 && (V =
|
|
4873
|
+
V && (e.childNodes.length > 1 && (V = Sh(V, e)), G._cssText = V);
|
|
4871
4874
|
}
|
|
4872
4875
|
if (W === "input" || W === "textarea" || W === "select") {
|
|
4873
4876
|
const V = e.value, k = e.checked;
|
|
@@ -4883,7 +4886,7 @@ function Kh(e, t) {
|
|
|
4883
4886
|
}
|
|
4884
4887
|
if (W === "option" && (e.selected && !l.select ? G.selected = !0 : delete G.selected), W === "dialog" && e.open && (G.rr_open_mode = e.matches("dialog:modal") ? "modal" : "non-modal"), W === "canvas" && m) {
|
|
4885
4888
|
if (e.__context === "2d")
|
|
4886
|
-
|
|
4889
|
+
mh(e);
|
|
4887
4890
|
else if (!("__context" in e)) {
|
|
4888
4891
|
const V = e.toDataURL(
|
|
4889
4892
|
c.type,
|
|
@@ -4963,7 +4966,7 @@ function Kh(e, t) {
|
|
|
4963
4966
|
tagName: W,
|
|
4964
4967
|
attributes: G,
|
|
4965
4968
|
childNodes: [],
|
|
4966
|
-
isSVG:
|
|
4969
|
+
isSVG: Yh(e) || void 0,
|
|
4967
4970
|
needBlock: Z,
|
|
4968
4971
|
needMask: X,
|
|
4969
4972
|
rootId: I,
|
|
@@ -4973,7 +4976,7 @@ function Kh(e, t) {
|
|
|
4973
4976
|
function q(e) {
|
|
4974
4977
|
return e == null ? "" : e.toLowerCase();
|
|
4975
4978
|
}
|
|
4976
|
-
function
|
|
4979
|
+
function Hh(e, t) {
|
|
4977
4980
|
return !!(t.comment && e.type === le.Comment || e.type === le.Element && (t.script && // script tag
|
|
4978
4981
|
(e.tagName === "script" || // (module)preload link
|
|
4979
4982
|
e.tagName === "link" && (e.attributes.rel === "preload" && e.attributes.as === "script" || e.attributes.rel === "modulepreload") || // prefetch link
|
|
@@ -5017,7 +5020,7 @@ function it(e, t) {
|
|
|
5017
5020
|
o,
|
|
5018
5021
|
Y === void 0
|
|
5019
5022
|
));
|
|
5020
|
-
const te =
|
|
5023
|
+
const te = Kh(e, {
|
|
5021
5024
|
doc: i,
|
|
5022
5025
|
mirror: s,
|
|
5023
5026
|
blockClass: n,
|
|
@@ -5040,7 +5043,7 @@ function it(e, t) {
|
|
|
5040
5043
|
if (!te)
|
|
5041
5044
|
return console.warn(e, "not serialized"), null;
|
|
5042
5045
|
let f;
|
|
5043
|
-
s.hasNode(e) ? f = s.getId(e) :
|
|
5046
|
+
s.hasNode(e) ? f = s.getId(e) : Hh(te, p) || !ee && te.type === le.Text && !te.textContent.replace(/^\s+|\s+$/gm, "").length ? f = Ft : f = vl();
|
|
5044
5047
|
const y = Object.assign(te, { id: f });
|
|
5045
5048
|
if (s.add(e, y), f === Ft)
|
|
5046
5049
|
return null;
|
|
@@ -5087,20 +5090,20 @@ function it(e, t) {
|
|
|
5087
5090
|
};
|
|
5088
5091
|
if (!(y.type === le.Element && y.tagName === "textarea" && y.attributes.value !== void 0)) {
|
|
5089
5092
|
y.type === le.Element && y.attributes._cssText !== void 0 && typeof y.attributes._cssText == "string" && ($.cssCaptured = !0);
|
|
5090
|
-
for (const
|
|
5091
|
-
const Fe = it(
|
|
5093
|
+
for (const Ge of Array.from(ce.childNodes(e))) {
|
|
5094
|
+
const Fe = it(Ge, $);
|
|
5092
5095
|
Fe && y.childNodes.push(Fe);
|
|
5093
5096
|
}
|
|
5094
5097
|
}
|
|
5095
5098
|
let ie = null;
|
|
5096
5099
|
if (Xl(e) && (ie = ce.shadowRoot(e)))
|
|
5097
|
-
for (const
|
|
5098
|
-
const Fe = it(
|
|
5100
|
+
for (const Ge of Array.from(ce.childNodes(ie))) {
|
|
5101
|
+
const Fe = it(Ge, $);
|
|
5099
5102
|
Fe && (xt(ie) && (Fe.isShadow = !0), y.childNodes.push(Fe));
|
|
5100
5103
|
}
|
|
5101
5104
|
}
|
|
5102
5105
|
const U = ce.parentNode(e);
|
|
5103
|
-
return U && vt(U) && xt(U) && (y.isShadow = !0), y.type === le.Element && y.tagName === "iframe" &&
|
|
5106
|
+
return U && vt(U) && xt(U) && (y.isShadow = !0), y.type === le.Element && y.tagName === "iframe" && Uh(
|
|
5104
5107
|
e,
|
|
5105
5108
|
() => {
|
|
5106
5109
|
const $ = e.contentDocument;
|
|
@@ -5139,7 +5142,7 @@ function it(e, t) {
|
|
|
5139
5142
|
}
|
|
5140
5143
|
},
|
|
5141
5144
|
W
|
|
5142
|
-
), y.type === le.Element && y.tagName === "link" && typeof y.attributes.rel == "string" && (y.attributes.rel === "stylesheet" || y.attributes.rel === "preload" && typeof y.attributes.href == "string" && Rl(y.attributes.href) === "css") &&
|
|
5145
|
+
), y.type === le.Element && y.tagName === "link" && typeof y.attributes.rel == "string" && (y.attributes.rel === "stylesheet" || y.attributes.rel === "preload" && typeof y.attributes.href == "string" && Rl(y.attributes.href) === "css") && Fh(
|
|
5143
5146
|
e,
|
|
5144
5147
|
() => {
|
|
5145
5148
|
if (G) {
|
|
@@ -5179,7 +5182,7 @@ function it(e, t) {
|
|
|
5179
5182
|
w
|
|
5180
5183
|
), y;
|
|
5181
5184
|
}
|
|
5182
|
-
function
|
|
5185
|
+
function zh(e, t) {
|
|
5183
5186
|
const {
|
|
5184
5187
|
mirror: i = new Cl(),
|
|
5185
5188
|
blockClass: s = "highlight-block",
|
|
@@ -5266,7 +5269,7 @@ function Mh(e, t) {
|
|
|
5266
5269
|
privacySetting: v
|
|
5267
5270
|
});
|
|
5268
5271
|
}
|
|
5269
|
-
function
|
|
5272
|
+
function Ph(e) {
|
|
5270
5273
|
if (e.__esModule) return e;
|
|
5271
5274
|
var t = e.default;
|
|
5272
5275
|
if (typeof t == "function") {
|
|
@@ -5290,12 +5293,12 @@ var Qn = { exports: {} }, J = String, Jl = function() {
|
|
|
5290
5293
|
};
|
|
5291
5294
|
Qn.exports = Jl();
|
|
5292
5295
|
Qn.exports.createColors = Jl;
|
|
5293
|
-
var
|
|
5294
|
-
const
|
|
5296
|
+
var Bh = Qn.exports;
|
|
5297
|
+
const Dh = {}, jh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
5295
5298
|
__proto__: null,
|
|
5296
|
-
default:
|
|
5297
|
-
}, Symbol.toStringTag, { value: "Module" })), Ce = /* @__PURE__ */
|
|
5298
|
-
let zr =
|
|
5299
|
+
default: Dh
|
|
5300
|
+
}, Symbol.toStringTag, { value: "Module" })), Ce = /* @__PURE__ */ Ph(jh);
|
|
5301
|
+
let zr = Bh, Pr = Ce, un = class Ll extends Error {
|
|
5299
5302
|
constructor(t, i, s, n, r, l) {
|
|
5300
5303
|
super(t), this.name = "CssSyntaxError", this.reason = t, r && (this.file = r), n && (this.source = n), l && (this.plugin = l), typeof i < "u" && typeof s < "u" && (typeof i == "number" ? (this.line = i, this.column = s) : (this.line = i.line, this.column = i.column, this.endLine = s.line, this.endColumn = s.column)), this.setMessage(), Error.captureStackTrace && Error.captureStackTrace(this, Ll);
|
|
5301
5304
|
}
|
|
@@ -5360,7 +5363,7 @@ const Br = {
|
|
|
5360
5363
|
indent: " ",
|
|
5361
5364
|
semicolon: !1
|
|
5362
5365
|
};
|
|
5363
|
-
function
|
|
5366
|
+
function Qh(e) {
|
|
5364
5367
|
return e[0].toUpperCase() + e.slice(1);
|
|
5365
5368
|
}
|
|
5366
5369
|
let dn = class {
|
|
@@ -5431,7 +5434,7 @@ let dn = class {
|
|
|
5431
5434
|
if (i === "before" || i === "after")
|
|
5432
5435
|
return this.beforeAfter(e, i);
|
|
5433
5436
|
{
|
|
5434
|
-
let l = "raw" +
|
|
5437
|
+
let l = "raw" + Qh(i);
|
|
5435
5438
|
this[l] ? s = this[l](r, e) : r.walk((o) => {
|
|
5436
5439
|
if (s = o.raws[t], typeof s < "u") return !1;
|
|
5437
5440
|
});
|
|
@@ -5530,16 +5533,16 @@ let dn = class {
|
|
|
5530
5533
|
};
|
|
5531
5534
|
var Yl = dn;
|
|
5532
5535
|
dn.default = dn;
|
|
5533
|
-
let
|
|
5536
|
+
let Ah = Yl;
|
|
5534
5537
|
function hn(e, t) {
|
|
5535
|
-
new
|
|
5538
|
+
new Ah(t).stringify(e);
|
|
5536
5539
|
}
|
|
5537
5540
|
var hs = hn;
|
|
5538
5541
|
hn.default = hn;
|
|
5539
5542
|
var Qt = {};
|
|
5540
5543
|
Qt.isClean = Symbol("isClean");
|
|
5541
5544
|
Qt.my = Symbol("my");
|
|
5542
|
-
let
|
|
5545
|
+
let _h = An, $h = Yl, qh = hs, { isClean: gt, my: ep } = Qt;
|
|
5543
5546
|
function pn(e, t) {
|
|
5544
5547
|
let i = new e.constructor();
|
|
5545
5548
|
for (let s in e) {
|
|
@@ -5568,7 +5571,7 @@ let mn = class {
|
|
|
5568
5571
|
return this;
|
|
5569
5572
|
}
|
|
5570
5573
|
constructor(e = {}) {
|
|
5571
|
-
this.raws = {}, this[gt] = !1, this[
|
|
5574
|
+
this.raws = {}, this[gt] = !1, this[ep] = !0;
|
|
5572
5575
|
for (let t in e)
|
|
5573
5576
|
if (t === "nodes") {
|
|
5574
5577
|
this.nodes = [];
|
|
@@ -5625,7 +5628,7 @@ let mn = class {
|
|
|
5625
5628
|
t
|
|
5626
5629
|
);
|
|
5627
5630
|
}
|
|
5628
|
-
return new
|
|
5631
|
+
return new _h(e);
|
|
5629
5632
|
}
|
|
5630
5633
|
getProxyProcessor() {
|
|
5631
5634
|
return {
|
|
@@ -5710,7 +5713,7 @@ let mn = class {
|
|
|
5710
5713
|
return (i.line < t.line || i.line === t.line && i.column <= t.column) && (i = { column: t.column + 1, line: t.line }), { end: i, start: t };
|
|
5711
5714
|
}
|
|
5712
5715
|
raw(e, t) {
|
|
5713
|
-
return new
|
|
5716
|
+
return new $h().raw(this, e, t);
|
|
5714
5717
|
}
|
|
5715
5718
|
remove() {
|
|
5716
5719
|
return this.parent && this.parent.removeChild(this), this.parent = void 0, this;
|
|
@@ -5756,7 +5759,7 @@ let mn = class {
|
|
|
5756
5759
|
toProxy() {
|
|
5757
5760
|
return this.proxyCache || (this.proxyCache = new Proxy(this, this.getProxyProcessor())), this.proxyCache;
|
|
5758
5761
|
}
|
|
5759
|
-
toString(e =
|
|
5762
|
+
toString(e = qh) {
|
|
5760
5763
|
e.stringify && (e = e.stringify);
|
|
5761
5764
|
let t = "";
|
|
5762
5765
|
return e(this, (i) => {
|
|
@@ -5771,14 +5774,14 @@ let mn = class {
|
|
|
5771
5774
|
};
|
|
5772
5775
|
var ps = mn;
|
|
5773
5776
|
mn.default = mn;
|
|
5774
|
-
let
|
|
5777
|
+
let tp = ps, bn = class extends tp {
|
|
5775
5778
|
constructor(e) {
|
|
5776
5779
|
super(e), this.type = "comment";
|
|
5777
5780
|
}
|
|
5778
5781
|
};
|
|
5779
5782
|
var ms = bn;
|
|
5780
5783
|
bn.default = bn;
|
|
5781
|
-
let
|
|
5784
|
+
let ip = ps, fn = class extends ip {
|
|
5782
5785
|
get variable() {
|
|
5783
5786
|
return this.prop.startsWith("--") || this.prop[0] === "$";
|
|
5784
5787
|
}
|
|
@@ -5788,7 +5791,7 @@ let qh = ps, fn = class extends qh {
|
|
|
5788
5791
|
};
|
|
5789
5792
|
var bs = fn;
|
|
5790
5793
|
fn.default = fn;
|
|
5791
|
-
let Ul = ms, Fl = bs,
|
|
5794
|
+
let Ul = ms, Fl = bs, sp = ps, { isClean: Kl, my: Ol } = Qt, _n, Ml, El, $n;
|
|
5792
5795
|
function Hl(e) {
|
|
5793
5796
|
return e.map((t) => (t.nodes && (t.nodes = Hl(t.nodes)), delete t.source, t));
|
|
5794
5797
|
}
|
|
@@ -5797,7 +5800,7 @@ function zl(e) {
|
|
|
5797
5800
|
for (let t of e.proxyOf.nodes)
|
|
5798
5801
|
zl(t);
|
|
5799
5802
|
}
|
|
5800
|
-
let Ye = class Pl extends
|
|
5803
|
+
let Ye = class Pl extends sp {
|
|
5801
5804
|
get first() {
|
|
5802
5805
|
if (this.proxyOf.nodes)
|
|
5803
5806
|
return this.proxyOf.nodes[0];
|
|
@@ -6019,7 +6022,7 @@ let Bl = je, $i = class extends Bl {
|
|
|
6019
6022
|
var qn = $i;
|
|
6020
6023
|
$i.default = $i;
|
|
6021
6024
|
Bl.registerAtRule($i);
|
|
6022
|
-
let
|
|
6025
|
+
let np = je, Dl, jl, Kt = class extends np {
|
|
6023
6026
|
constructor(e) {
|
|
6024
6027
|
super(F({ type: "document" }, e)), this.nodes || (this.nodes = []);
|
|
6025
6028
|
}
|
|
@@ -6035,15 +6038,15 @@ Kt.registerProcessor = (e) => {
|
|
|
6035
6038
|
};
|
|
6036
6039
|
var er = Kt;
|
|
6037
6040
|
Kt.default = Kt;
|
|
6038
|
-
let
|
|
6041
|
+
let rp = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", op = (e = 21) => {
|
|
6039
6042
|
let t = "", i = e | 0;
|
|
6040
6043
|
for (; i--; )
|
|
6041
|
-
t +=
|
|
6044
|
+
t += rp[Math.random() * 64 | 0];
|
|
6042
6045
|
return t;
|
|
6043
6046
|
};
|
|
6044
|
-
var
|
|
6045
|
-
let { existsSync:
|
|
6046
|
-
function
|
|
6047
|
+
var lp = { nanoid: op };
|
|
6048
|
+
let { existsSync: ap, readFileSync: cp } = Ce, { dirname: Ls, join: up } = Ce, { SourceMapConsumer: Dr, SourceMapGenerator: jr } = Ce;
|
|
6049
|
+
function dp(e) {
|
|
6047
6050
|
return Buffer ? Buffer.from(e, "base64").toString() : window.atob(e);
|
|
6048
6051
|
}
|
|
6049
6052
|
let yn = class {
|
|
@@ -6062,7 +6065,7 @@ let yn = class {
|
|
|
6062
6065
|
return decodeURIComponent(e.substr(r[0].length));
|
|
6063
6066
|
let l = e.match(t) || e.match(i);
|
|
6064
6067
|
if (l)
|
|
6065
|
-
return
|
|
6068
|
+
return dp(e.substr(l[0].length));
|
|
6066
6069
|
let o = e.match(/data:application\/json;([^,]+),/)[1];
|
|
6067
6070
|
throw new Error("Unsupported source map encoding " + o);
|
|
6068
6071
|
}
|
|
@@ -6079,8 +6082,8 @@ let yn = class {
|
|
|
6079
6082
|
i > -1 && s > -1 && (this.annotation = this.getAnnotationURL(e.substring(i, s)));
|
|
6080
6083
|
}
|
|
6081
6084
|
loadFile(e) {
|
|
6082
|
-
if (this.root = Ls(e),
|
|
6083
|
-
return this.mapFile = e,
|
|
6085
|
+
if (this.root = Ls(e), ap(e))
|
|
6086
|
+
return this.mapFile = e, cp(e, "utf-8").toString().trim();
|
|
6084
6087
|
}
|
|
6085
6088
|
loadMap(e, t) {
|
|
6086
6089
|
if (t === !1) return !1;
|
|
@@ -6113,7 +6116,7 @@ let yn = class {
|
|
|
6113
6116
|
return this.decodeInline(this.annotation);
|
|
6114
6117
|
if (this.annotation) {
|
|
6115
6118
|
let i = this.annotation;
|
|
6116
|
-
return e && (i =
|
|
6119
|
+
return e && (i = up(Ls(e), i)), this.loadFile(i);
|
|
6117
6120
|
}
|
|
6118
6121
|
}
|
|
6119
6122
|
}
|
|
@@ -6126,22 +6129,22 @@ let yn = class {
|
|
|
6126
6129
|
};
|
|
6127
6130
|
var Ql = yn;
|
|
6128
6131
|
yn.default = yn;
|
|
6129
|
-
let { nanoid:
|
|
6132
|
+
let { nanoid: hp } = lp, { isAbsolute: gn, resolve: Zn } = Ce, { SourceMapConsumer: pp, SourceMapGenerator: mp } = Ce, { fileURLToPath: Qr, pathToFileURL: ai } = Ce, Ar = An, bp = Ql, Ys = Ce, Us = Symbol("fromOffsetCache"), fp = !!(pp && mp), _r = !!(Zn && gn), qi = class {
|
|
6130
6133
|
get from() {
|
|
6131
6134
|
return this.file || this.id;
|
|
6132
6135
|
}
|
|
6133
6136
|
constructor(e, t = {}) {
|
|
6134
6137
|
if (e === null || typeof e > "u" || typeof e == "object" && !e.toString)
|
|
6135
6138
|
throw new Error(`PostCSS received ${e} instead of CSS string`);
|
|
6136
|
-
if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!_r || /^\w+:\/\//.test(t.from) || gn(t.from) ? this.file = t.from : this.file = Zn(t.from)), _r &&
|
|
6137
|
-
let i = new
|
|
6139
|
+
if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!_r || /^\w+:\/\//.test(t.from) || gn(t.from) ? this.file = t.from : this.file = Zn(t.from)), _r && fp) {
|
|
6140
|
+
let i = new bp(this.css, t);
|
|
6138
6141
|
if (i.text) {
|
|
6139
6142
|
this.map = i;
|
|
6140
6143
|
let s = i.consumer().file;
|
|
6141
6144
|
!this.file && s && (this.file = this.mapResolve(s));
|
|
6142
6145
|
}
|
|
6143
6146
|
}
|
|
6144
|
-
this.file || (this.id = "<input css " +
|
|
6147
|
+
this.file || (this.id = "<input css " + hp(6) + ">"), this.map && (this.map.file = this.from);
|
|
6145
6148
|
}
|
|
6146
6149
|
error(e, t, i, s = {}) {
|
|
6147
6150
|
let n, r, l;
|
|
@@ -6301,9 +6304,9 @@ let Ot = {
|
|
|
6301
6304
|
};
|
|
6302
6305
|
var ql = Ot;
|
|
6303
6306
|
Ot.default = Ot;
|
|
6304
|
-
let ea = je,
|
|
6307
|
+
let ea = je, yp = ql, es = class extends ea {
|
|
6305
6308
|
get selectors() {
|
|
6306
|
-
return
|
|
6309
|
+
return yp.comma(this.selector);
|
|
6307
6310
|
}
|
|
6308
6311
|
set selectors(e) {
|
|
6309
6312
|
let t = this.selector ? this.selector.match(/,\s*/) : null, i = t ? t[0] : "," + this.raw("between", "beforeOpen");
|
|
@@ -6316,16 +6319,16 @@ let ea = je, mp = ql, es = class extends ea {
|
|
|
6316
6319
|
var tr = es;
|
|
6317
6320
|
es.default = es;
|
|
6318
6321
|
ea.registerRule(es);
|
|
6319
|
-
let
|
|
6322
|
+
let gp = qn, Zp = ms, Ip = bs, Sp = fs, Gp = Ql, Vp = At, Xp = tr;
|
|
6320
6323
|
function Mt(e, t) {
|
|
6321
6324
|
if (Array.isArray(e)) return e.map((r) => Mt(r));
|
|
6322
6325
|
let i = e, { inputs: s } = i, n = ot(i, ["inputs"]);
|
|
6323
6326
|
if (s) {
|
|
6324
6327
|
t = [];
|
|
6325
6328
|
for (let r of s) {
|
|
6326
|
-
let l = ge(F({}, r), { __proto__:
|
|
6329
|
+
let l = ge(F({}, r), { __proto__: Sp.prototype });
|
|
6327
6330
|
l.map && (l.map = ge(F({}, l.map), {
|
|
6328
|
-
__proto__:
|
|
6331
|
+
__proto__: Gp.prototype
|
|
6329
6332
|
})), t.push(l);
|
|
6330
6333
|
}
|
|
6331
6334
|
}
|
|
@@ -6334,20 +6337,20 @@ function Mt(e, t) {
|
|
|
6334
6337
|
n.source = o, l != null && (n.source.input = t[l]);
|
|
6335
6338
|
}
|
|
6336
6339
|
if (n.type === "root")
|
|
6337
|
-
return new
|
|
6340
|
+
return new Vp(n);
|
|
6338
6341
|
if (n.type === "decl")
|
|
6339
|
-
return new
|
|
6342
|
+
return new Ip(n);
|
|
6340
6343
|
if (n.type === "rule")
|
|
6341
|
-
return new
|
|
6344
|
+
return new Xp(n);
|
|
6342
6345
|
if (n.type === "comment")
|
|
6343
|
-
return new
|
|
6346
|
+
return new Zp(n);
|
|
6344
6347
|
if (n.type === "atrule")
|
|
6345
|
-
return new
|
|
6348
|
+
return new gp(n);
|
|
6346
6349
|
throw new Error("Unknown node type: " + e.type);
|
|
6347
6350
|
}
|
|
6348
|
-
var
|
|
6351
|
+
var Wp = Mt;
|
|
6349
6352
|
Mt.default = Mt;
|
|
6350
|
-
let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsumer: na, SourceMapGenerator: Li } = Ce, { pathToFileURL: $r } = Ce,
|
|
6353
|
+
let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsumer: na, SourceMapGenerator: Li } = Ce, { pathToFileURL: $r } = Ce, Cp = fs, Rp = !!(na && Li), kp = !!(Ji && ia && ta && sa), wp = class {
|
|
6351
6354
|
constructor(e, t, i, s) {
|
|
6352
6355
|
this.stringify = e, this.mapOpts = i.map || {}, this.root = t, this.opts = i, this.css = s, this.originalCSS = s, this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute, this.memoizedFileURLs = /* @__PURE__ */ new Map(), this.memoizedPaths = /* @__PURE__ */ new Map(), this.memoizedURLs = /* @__PURE__ */ new Map();
|
|
6353
6356
|
}
|
|
@@ -6375,7 +6378,7 @@ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsume
|
|
|
6375
6378
|
} else this.css && (this.css = this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm, ""));
|
|
6376
6379
|
}
|
|
6377
6380
|
generate() {
|
|
6378
|
-
if (this.clearAnnotation(),
|
|
6381
|
+
if (this.clearAnnotation(), kp && Rp && this.isMap())
|
|
6379
6382
|
return this.generateMap();
|
|
6380
6383
|
{
|
|
6381
6384
|
let e = "";
|
|
@@ -6458,7 +6461,7 @@ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsume
|
|
|
6458
6461
|
}
|
|
6459
6462
|
});
|
|
6460
6463
|
else {
|
|
6461
|
-
let e = new
|
|
6464
|
+
let e = new Cp(this.originalCSS, this.opts);
|
|
6462
6465
|
e.map && this.previousMaps.push(e.map);
|
|
6463
6466
|
}
|
|
6464
6467
|
return this.previousMaps;
|
|
@@ -6506,9 +6509,9 @@ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsume
|
|
|
6506
6509
|
return this.memoizedURLs.set(e, i), i;
|
|
6507
6510
|
}
|
|
6508
6511
|
};
|
|
6509
|
-
var ra =
|
|
6510
|
-
const Fs = 39, qr = 34, ci = 92, eo = 47, ui = 10, It = 32, di = 12, hi = 9, pi = 13,
|
|
6511
|
-
var
|
|
6512
|
+
var ra = wp;
|
|
6513
|
+
const Fs = 39, qr = 34, ci = 92, eo = 47, ui = 10, It = 32, di = 12, hi = 9, pi = 13, vp = 91, xp = 93, Tp = 40, Np = 41, Jp = 123, Lp = 125, Yp = 59, Up = 42, Fp = 58, Kp = 64, mi = /[\t\n\f\r "#'()/;[\\\]{}]/g, bi = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, Op = /.[\r\n"'(/\\]/, to = /[\da-f]/i;
|
|
6514
|
+
var Mp = function(e, t = {}) {
|
|
6512
6515
|
let i = e.css.valueOf(), s = t.ignoreErrors, n, r, l, o, a, c, u, h, m, p, b = i.length, d = 0, I = [], Z = [];
|
|
6513
6516
|
function X() {
|
|
6514
6517
|
return d;
|
|
@@ -6536,18 +6539,18 @@ var Fp = function(e, t = {}) {
|
|
|
6536
6539
|
c = ["space", i.slice(d, o)], d = o - 1;
|
|
6537
6540
|
break;
|
|
6538
6541
|
}
|
|
6539
|
-
case
|
|
6540
|
-
case kp:
|
|
6542
|
+
case vp:
|
|
6541
6543
|
case xp:
|
|
6542
|
-
case
|
|
6544
|
+
case Jp:
|
|
6543
6545
|
case Lp:
|
|
6544
|
-
case
|
|
6545
|
-
case
|
|
6546
|
+
case Fp:
|
|
6547
|
+
case Yp:
|
|
6548
|
+
case Np: {
|
|
6546
6549
|
let V = String.fromCharCode(n);
|
|
6547
6550
|
c = [V, V, d];
|
|
6548
6551
|
break;
|
|
6549
6552
|
}
|
|
6550
|
-
case
|
|
6553
|
+
case Tp: {
|
|
6551
6554
|
if (p = I.length ? I.pop()[1] : "", m = i.charCodeAt(d + 1), p === "url" && m !== Fs && m !== qr && m !== It && m !== ui && m !== hi && m !== di && m !== pi) {
|
|
6552
6555
|
o = d;
|
|
6553
6556
|
do {
|
|
@@ -6562,7 +6565,7 @@ var Fp = function(e, t = {}) {
|
|
|
6562
6565
|
} while (u);
|
|
6563
6566
|
c = ["brackets", i.slice(d, o + 1), d, o], d = o;
|
|
6564
6567
|
} else
|
|
6565
|
-
o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 ||
|
|
6568
|
+
o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 || Op.test(r) ? c = ["(", "(", d] : (c = ["brackets", r, d, o], d = o);
|
|
6566
6569
|
break;
|
|
6567
6570
|
}
|
|
6568
6571
|
case Fs:
|
|
@@ -6581,7 +6584,7 @@ var Fp = function(e, t = {}) {
|
|
|
6581
6584
|
c = ["string", i.slice(d, o + 1), d, o], d = o;
|
|
6582
6585
|
break;
|
|
6583
6586
|
}
|
|
6584
|
-
case
|
|
6587
|
+
case Kp: {
|
|
6585
6588
|
mi.lastIndex = d + 1, mi.test(i), mi.lastIndex === 0 ? o = i.length - 1 : o = mi.lastIndex - 2, c = ["at-word", i.slice(d, o + 1), d, o], d = o;
|
|
6586
6589
|
break;
|
|
6587
6590
|
}
|
|
@@ -6597,7 +6600,7 @@ var Fp = function(e, t = {}) {
|
|
|
6597
6600
|
break;
|
|
6598
6601
|
}
|
|
6599
6602
|
default: {
|
|
6600
|
-
n === eo && i.charCodeAt(d + 1) ===
|
|
6603
|
+
n === eo && i.charCodeAt(d + 1) === Up ? (o = i.indexOf("*/", d + 2) + 1, o === 0 && (s || K ? o = i.length : R("comment")), c = ["comment", i.slice(d, o + 1), d, o], d = o) : (bi.lastIndex = d + 1, bi.test(i), bi.lastIndex === 0 ? o = i.length - 1 : o = bi.lastIndex - 2, c = ["word", i.slice(d, o + 1), d, o], I.push(c), d = o);
|
|
6601
6604
|
break;
|
|
6602
6605
|
}
|
|
6603
6606
|
}
|
|
@@ -6613,23 +6616,23 @@ var Fp = function(e, t = {}) {
|
|
|
6613
6616
|
position: X
|
|
6614
6617
|
};
|
|
6615
6618
|
};
|
|
6616
|
-
let
|
|
6619
|
+
let Ep = qn, Hp = ms, zp = bs, Pp = At, io = tr, Bp = Mp;
|
|
6617
6620
|
const so = {
|
|
6618
6621
|
empty: !0,
|
|
6619
6622
|
space: !0
|
|
6620
6623
|
};
|
|
6621
|
-
function
|
|
6624
|
+
function Dp(e) {
|
|
6622
6625
|
for (let t = e.length - 1; t >= 0; t--) {
|
|
6623
6626
|
let i = e[t], s = i[3] || i[2];
|
|
6624
6627
|
if (s) return s;
|
|
6625
6628
|
}
|
|
6626
6629
|
}
|
|
6627
|
-
let
|
|
6630
|
+
let jp = class {
|
|
6628
6631
|
constructor(e) {
|
|
6629
|
-
this.input = e, this.root = new
|
|
6632
|
+
this.input = e, this.root = new Pp(), this.current = this.root, this.spaces = "", this.semicolon = !1, this.createTokenizer(), this.root.source = { input: e, start: { column: 1, line: 1, offset: 0 } };
|
|
6630
6633
|
}
|
|
6631
6634
|
atrule(e) {
|
|
6632
|
-
let t = new
|
|
6635
|
+
let t = new Ep();
|
|
6633
6636
|
t.name = e[1].slice(1), t.name === "" && this.unnamedAtrule(t, e), this.init(t, e[2]);
|
|
6634
6637
|
let i, s, n, r = !1, l = !1, o = [], a = [];
|
|
6635
6638
|
for (; !this.tokenizer.endOfFile(); ) {
|
|
@@ -6686,7 +6689,7 @@ let Pp = class {
|
|
|
6686
6689
|
return !1;
|
|
6687
6690
|
}
|
|
6688
6691
|
comment(e) {
|
|
6689
|
-
let t = new
|
|
6692
|
+
let t = new Hp();
|
|
6690
6693
|
this.init(t, e[2]), t.source.end = this.getPosition(e[3] || e[2]), t.source.end.offset++;
|
|
6691
6694
|
let i = e[1].slice(2, -2);
|
|
6692
6695
|
if (/^\s*$/.test(i))
|
|
@@ -6697,14 +6700,14 @@ let Pp = class {
|
|
|
6697
6700
|
}
|
|
6698
6701
|
}
|
|
6699
6702
|
createTokenizer() {
|
|
6700
|
-
this.tokenizer =
|
|
6703
|
+
this.tokenizer = Bp(this.input);
|
|
6701
6704
|
}
|
|
6702
6705
|
decl(e, t) {
|
|
6703
|
-
let i = new
|
|
6706
|
+
let i = new zp();
|
|
6704
6707
|
this.init(i, e[0][2]);
|
|
6705
6708
|
let s = e[e.length - 1];
|
|
6706
6709
|
for (s[0] === ";" && (this.semicolon = !0, e.pop()), i.source.end = this.getPosition(
|
|
6707
|
-
s[3] || s[2] ||
|
|
6710
|
+
s[3] || s[2] || Dp(e)
|
|
6708
6711
|
), i.source.end.offset++; e[0][0] !== "word"; )
|
|
6709
6712
|
e.length === 1 && this.unknownWord(e), i.raws.before += e.shift()[1];
|
|
6710
6713
|
for (i.source.start = this.getPosition(e[0][2]), i.prop = ""; e.length; ) {
|
|
@@ -6920,10 +6923,10 @@ let Pp = class {
|
|
|
6920
6923
|
);
|
|
6921
6924
|
}
|
|
6922
6925
|
};
|
|
6923
|
-
var
|
|
6924
|
-
let
|
|
6926
|
+
var Qp = jp;
|
|
6927
|
+
let Ap = je, _p = fs, $p = Qp;
|
|
6925
6928
|
function ts(e, t) {
|
|
6926
|
-
let i = new
|
|
6929
|
+
let i = new _p(e, t), s = new $p(i);
|
|
6927
6930
|
try {
|
|
6928
6931
|
s.parse();
|
|
6929
6932
|
} catch (n) {
|
|
@@ -6936,7 +6939,7 @@ You tried to parse Less with the standard CSS parser; try again with the postcss
|
|
|
6936
6939
|
}
|
|
6937
6940
|
var ir = ts;
|
|
6938
6941
|
ts.default = ts;
|
|
6939
|
-
|
|
6942
|
+
Ap.registerParse(ts);
|
|
6940
6943
|
let In = class {
|
|
6941
6944
|
constructor(e, t = {}) {
|
|
6942
6945
|
if (this.type = "warning", this.text = e, t.node && t.node.source) {
|
|
@@ -6955,7 +6958,7 @@ let In = class {
|
|
|
6955
6958
|
};
|
|
6956
6959
|
var oa = In;
|
|
6957
6960
|
In.default = In;
|
|
6958
|
-
let
|
|
6961
|
+
let qp = oa, Sn = class {
|
|
6959
6962
|
get content() {
|
|
6960
6963
|
return this.css;
|
|
6961
6964
|
}
|
|
@@ -6967,7 +6970,7 @@ let Ap = oa, Sn = class {
|
|
|
6967
6970
|
}
|
|
6968
6971
|
warn(e, t = {}) {
|
|
6969
6972
|
t.plugin || this.lastPlugin && this.lastPlugin.postcssPlugin && (t.plugin = this.lastPlugin.postcssPlugin);
|
|
6970
|
-
let i = new
|
|
6973
|
+
let i = new qp(e, t);
|
|
6971
6974
|
return this.messages.push(i), i;
|
|
6972
6975
|
}
|
|
6973
6976
|
warnings() {
|
|
@@ -6980,15 +6983,15 @@ let no = {};
|
|
|
6980
6983
|
var la = function(e) {
|
|
6981
6984
|
no[e] || (no[e] = !0, typeof console < "u" && console.warn && console.warn(e));
|
|
6982
6985
|
};
|
|
6983
|
-
let
|
|
6984
|
-
const
|
|
6986
|
+
let em = je, tm = er, im = ra, sm = ir, ro = sr, nm = At, rm = hs, { isClean: we, my: om } = Qt, lm = la;
|
|
6987
|
+
const am = {
|
|
6985
6988
|
atrule: "AtRule",
|
|
6986
6989
|
comment: "Comment",
|
|
6987
6990
|
decl: "Declaration",
|
|
6988
6991
|
document: "Document",
|
|
6989
6992
|
root: "Root",
|
|
6990
6993
|
rule: "Rule"
|
|
6991
|
-
},
|
|
6994
|
+
}, cm = {
|
|
6992
6995
|
AtRule: !0,
|
|
6993
6996
|
AtRuleExit: !0,
|
|
6994
6997
|
Comment: !0,
|
|
@@ -7005,7 +7008,7 @@ const rm = {
|
|
|
7005
7008
|
RootExit: !0,
|
|
7006
7009
|
Rule: !0,
|
|
7007
7010
|
RuleExit: !0
|
|
7008
|
-
},
|
|
7011
|
+
}, um = {
|
|
7009
7012
|
Once: !0,
|
|
7010
7013
|
postcssPlugin: !0,
|
|
7011
7014
|
prepare: !0
|
|
@@ -7014,7 +7017,7 @@ function St(e) {
|
|
|
7014
7017
|
return typeof e == "object" && typeof e.then == "function";
|
|
7015
7018
|
}
|
|
7016
7019
|
function aa(e) {
|
|
7017
|
-
let t = !1, i =
|
|
7020
|
+
let t = !1, i = am[e.type];
|
|
7018
7021
|
return e.type === "decl" ? t = e.prop.toLowerCase() : e.type === "atrule" && (t = e.name.toLowerCase()), t && e.append ? [
|
|
7019
7022
|
i,
|
|
7020
7023
|
i + "-" + t,
|
|
@@ -7070,14 +7073,14 @@ let Vn = {}, ut = class ca {
|
|
|
7070
7073
|
else if (i instanceof ca || i instanceof ro)
|
|
7071
7074
|
n = Gn(i.root), i.map && (typeof s.map > "u" && (s.map = {}), s.map.inline || (s.map.inline = !1), s.map.prev = i.map);
|
|
7072
7075
|
else {
|
|
7073
|
-
let r =
|
|
7076
|
+
let r = sm;
|
|
7074
7077
|
s.syntax && (r = s.syntax.parse), s.parser && (r = s.parser), r.parse && (r = r.parse);
|
|
7075
7078
|
try {
|
|
7076
7079
|
n = r(i, s);
|
|
7077
7080
|
} catch (l) {
|
|
7078
7081
|
this.processed = !0, this.error = l;
|
|
7079
7082
|
}
|
|
7080
|
-
n && !n[
|
|
7083
|
+
n && !n[om] && em.rebuild(n);
|
|
7081
7084
|
}
|
|
7082
7085
|
this.result = new ro(t, n, s), this.helpers = ge(F({}, Vn), { postcss: Vn, result: this.result }), this.plugins = this.processor.plugins.map((r) => typeof r == "object" && r.prepare ? F(F({}, r), r.prepare(this.result)) : r);
|
|
7083
7086
|
}
|
|
@@ -7117,11 +7120,11 @@ let Vn = {}, ut = class ca {
|
|
|
7117
7120
|
for (let i of this.plugins)
|
|
7118
7121
|
if (typeof i == "object")
|
|
7119
7122
|
for (let s in i) {
|
|
7120
|
-
if (!
|
|
7123
|
+
if (!cm[s] && /^[A-Z]/.test(s))
|
|
7121
7124
|
throw new Error(
|
|
7122
7125
|
`Unknown event ${s} in ${i.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`
|
|
7123
7126
|
);
|
|
7124
|
-
if (!
|
|
7127
|
+
if (!um[s])
|
|
7125
7128
|
if (typeof i[s] == "object")
|
|
7126
7129
|
for (let n in i[s])
|
|
7127
7130
|
n === "*" ? t(i, s, i[s][n]) : t(
|
|
@@ -7201,9 +7204,9 @@ let Vn = {}, ut = class ca {
|
|
|
7201
7204
|
if (this.error) throw this.error;
|
|
7202
7205
|
if (this.stringified) return this.result;
|
|
7203
7206
|
this.stringified = !0, this.sync();
|
|
7204
|
-
let t = this.result.opts, i =
|
|
7207
|
+
let t = this.result.opts, i = rm;
|
|
7205
7208
|
t.syntax && (i = t.syntax.stringify), t.stringifier && (i = t.stringifier), i.stringify && (i = i.stringify);
|
|
7206
|
-
let s = new
|
|
7209
|
+
let s = new im(i, this.result.root, this.result.opts).generate();
|
|
7207
7210
|
return this.result.css = s[0], this.result.map = s[1], this.result;
|
|
7208
7211
|
}
|
|
7209
7212
|
sync() {
|
|
@@ -7230,7 +7233,7 @@ let Vn = {}, ut = class ca {
|
|
|
7230
7233
|
return this.result;
|
|
7231
7234
|
}
|
|
7232
7235
|
then(t, i) {
|
|
7233
|
-
return process.env.NODE_ENV !== "production" && ("from" in this.opts ||
|
|
7236
|
+
return process.env.NODE_ENV !== "production" && ("from" in this.opts || lm(
|
|
7234
7237
|
"Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
|
|
7235
7238
|
)), this.async().then(t, i);
|
|
7236
7239
|
}
|
|
@@ -7312,11 +7315,11 @@ ut.registerPostcss = (e) => {
|
|
|
7312
7315
|
};
|
|
7313
7316
|
var ua = ut;
|
|
7314
7317
|
ut.default = ut;
|
|
7318
|
+
nm.registerLazyResult(ut);
|
|
7315
7319
|
tm.registerLazyResult(ut);
|
|
7316
|
-
|
|
7317
|
-
|
|
7318
|
-
|
|
7319
|
-
let dm = hs, hm = la, Xn = class {
|
|
7320
|
+
let dm = ra, hm = ir;
|
|
7321
|
+
const pm = sr;
|
|
7322
|
+
let mm = hs, bm = la, Xn = class {
|
|
7320
7323
|
get content() {
|
|
7321
7324
|
return this.result.css;
|
|
7322
7325
|
}
|
|
@@ -7338,7 +7341,7 @@ let dm = hs, hm = la, Xn = class {
|
|
|
7338
7341
|
get root() {
|
|
7339
7342
|
if (this._root)
|
|
7340
7343
|
return this._root;
|
|
7341
|
-
let e, t =
|
|
7344
|
+
let e, t = hm;
|
|
7342
7345
|
try {
|
|
7343
7346
|
e = t(this._css, this._opts);
|
|
7344
7347
|
} catch (i) {
|
|
@@ -7353,15 +7356,15 @@ let dm = hs, hm = la, Xn = class {
|
|
|
7353
7356
|
}
|
|
7354
7357
|
constructor(e, t, i) {
|
|
7355
7358
|
t = t.toString(), this.stringified = !1, this._processor = e, this._css = t, this._opts = i, this._map = void 0;
|
|
7356
|
-
let s, n =
|
|
7357
|
-
this.result = new
|
|
7359
|
+
let s, n = mm;
|
|
7360
|
+
this.result = new pm(this._processor, s, this._opts), this.result.css = t;
|
|
7358
7361
|
let r = this;
|
|
7359
7362
|
Object.defineProperty(this.result, "root", {
|
|
7360
7363
|
get() {
|
|
7361
7364
|
return r.root;
|
|
7362
7365
|
}
|
|
7363
7366
|
});
|
|
7364
|
-
let l = new
|
|
7367
|
+
let l = new dm(n, s, this._opts, t);
|
|
7365
7368
|
if (l.isMap()) {
|
|
7366
7369
|
let [o, a] = l.generate();
|
|
7367
7370
|
o && (this.result.css = o), a && (this.result.map = a);
|
|
@@ -7382,7 +7385,7 @@ let dm = hs, hm = la, Xn = class {
|
|
|
7382
7385
|
return this.result;
|
|
7383
7386
|
}
|
|
7384
7387
|
then(e, t) {
|
|
7385
|
-
return process.env.NODE_ENV !== "production" && ("from" in this._opts ||
|
|
7388
|
+
return process.env.NODE_ENV !== "production" && ("from" in this._opts || bm(
|
|
7386
7389
|
"Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
|
|
7387
7390
|
)), this.async().then(e, t);
|
|
7388
7391
|
}
|
|
@@ -7393,9 +7396,9 @@ let dm = hs, hm = la, Xn = class {
|
|
|
7393
7396
|
return [];
|
|
7394
7397
|
}
|
|
7395
7398
|
};
|
|
7396
|
-
var
|
|
7399
|
+
var fm = Xn;
|
|
7397
7400
|
Xn.default = Xn;
|
|
7398
|
-
let
|
|
7401
|
+
let ym = er, gm = ua, Zm = fm, Im = At, Et = class {
|
|
7399
7402
|
constructor(e = []) {
|
|
7400
7403
|
this.version = "8.5.3", this.plugins = this.normalize(e);
|
|
7401
7404
|
}
|
|
@@ -7418,17 +7421,17 @@ let mm = er, bm = ua, fm = pm, ym = At, Et = class {
|
|
|
7418
7421
|
return t;
|
|
7419
7422
|
}
|
|
7420
7423
|
process(e, t = {}) {
|
|
7421
|
-
return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new
|
|
7424
|
+
return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new Zm(this, e, t) : new gm(this, e, t);
|
|
7422
7425
|
}
|
|
7423
7426
|
use(e) {
|
|
7424
7427
|
return this.plugins = this.plugins.concat(this.normalize([e])), this;
|
|
7425
7428
|
}
|
|
7426
7429
|
};
|
|
7427
|
-
var
|
|
7430
|
+
var Sm = Et;
|
|
7428
7431
|
Et.default = Et;
|
|
7432
|
+
Im.registerProcessor(Et);
|
|
7429
7433
|
ym.registerProcessor(Et);
|
|
7430
|
-
|
|
7431
|
-
let da = qn, ha = ms, Zm = je, Im = An, pa = bs, ma = er, Sm = Gp, Gm = fs, Vm = ua, Xm = ql, Wm = ps, Cm = ir, nr = gm, Rm = sr, ba = At, fa = tr, km = hs, wm = oa;
|
|
7434
|
+
let da = qn, ha = ms, Gm = je, Vm = An, pa = bs, ma = er, Xm = Wp, Wm = fs, Cm = ua, Rm = ql, km = ps, wm = ir, nr = Sm, vm = sr, ba = At, fa = tr, xm = hs, Tm = oa;
|
|
7432
7435
|
function j(...e) {
|
|
7433
7436
|
return e.length === 1 && Array.isArray(e[0]) && (e = e[0]), new nr(e);
|
|
7434
7437
|
}
|
|
@@ -7454,33 +7457,33 @@ https://www.w3ctech.com/topic/2226`
|
|
|
7454
7457
|
return j([s(o)]).process(r, l);
|
|
7455
7458
|
}, s;
|
|
7456
7459
|
};
|
|
7457
|
-
j.stringify =
|
|
7458
|
-
j.parse =
|
|
7459
|
-
j.fromJSON =
|
|
7460
|
-
j.list =
|
|
7460
|
+
j.stringify = xm;
|
|
7461
|
+
j.parse = wm;
|
|
7462
|
+
j.fromJSON = Xm;
|
|
7463
|
+
j.list = Rm;
|
|
7461
7464
|
j.comment = (e) => new ha(e);
|
|
7462
7465
|
j.atRule = (e) => new da(e);
|
|
7463
7466
|
j.decl = (e) => new pa(e);
|
|
7464
7467
|
j.rule = (e) => new fa(e);
|
|
7465
7468
|
j.root = (e) => new ba(e);
|
|
7466
7469
|
j.document = (e) => new ma(e);
|
|
7467
|
-
j.CssSyntaxError =
|
|
7470
|
+
j.CssSyntaxError = Vm;
|
|
7468
7471
|
j.Declaration = pa;
|
|
7469
|
-
j.Container =
|
|
7472
|
+
j.Container = Gm;
|
|
7470
7473
|
j.Processor = nr;
|
|
7471
7474
|
j.Document = ma;
|
|
7472
7475
|
j.Comment = ha;
|
|
7473
|
-
j.Warning =
|
|
7476
|
+
j.Warning = Tm;
|
|
7474
7477
|
j.AtRule = da;
|
|
7475
|
-
j.Result =
|
|
7476
|
-
j.Input =
|
|
7478
|
+
j.Result = vm;
|
|
7479
|
+
j.Input = Wm;
|
|
7477
7480
|
j.Rule = fa;
|
|
7478
7481
|
j.Root = ba;
|
|
7479
|
-
j.Node =
|
|
7480
|
-
|
|
7482
|
+
j.Node = km;
|
|
7483
|
+
Cm.registerPostcss(j);
|
|
7481
7484
|
j.default = j;
|
|
7482
|
-
var
|
|
7483
|
-
function
|
|
7485
|
+
var Nm = Object.defineProperty, Jm = (e, t, i) => t in e ? Nm(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, Ie = (e, t, i) => Jm(e, typeof t != "symbol" ? t + "" : t, i);
|
|
7486
|
+
function Lm(e) {
|
|
7484
7487
|
if (e.__esModule) return e;
|
|
7485
7488
|
var t = e.default;
|
|
7486
7489
|
if (typeof t == "function") {
|
|
@@ -7504,12 +7507,12 @@ var rr = { exports: {} }, L = String, ya = function() {
|
|
|
7504
7507
|
};
|
|
7505
7508
|
rr.exports = ya();
|
|
7506
7509
|
rr.exports.createColors = ya;
|
|
7507
|
-
var
|
|
7508
|
-
const
|
|
7510
|
+
var Ym = rr.exports;
|
|
7511
|
+
const Um = {}, Fm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
7509
7512
|
__proto__: null,
|
|
7510
|
-
default:
|
|
7511
|
-
}, Symbol.toStringTag, { value: "Module" })), Re = /* @__PURE__ */
|
|
7512
|
-
let lo =
|
|
7513
|
+
default: Um
|
|
7514
|
+
}, Symbol.toStringTag, { value: "Module" })), Re = /* @__PURE__ */ Lm(Fm);
|
|
7515
|
+
let lo = Ym, ao = Re, Wn = class ga extends Error {
|
|
7513
7516
|
constructor(t, i, s, n, r, l) {
|
|
7514
7517
|
super(t), this.name = "CssSyntaxError", this.reason = t, r && (this.file = r), n && (this.source = n), l && (this.plugin = l), typeof i < "u" && typeof s < "u" && (typeof i == "number" ? (this.line = i, this.column = s) : (this.line = i.line, this.column = i.column, this.endLine = s.line, this.endColumn = s.column)), this.setMessage(), Error.captureStackTrace && Error.captureStackTrace(this, ga);
|
|
7515
7518
|
}
|
|
@@ -7574,7 +7577,7 @@ const co = {
|
|
|
7574
7577
|
indent: " ",
|
|
7575
7578
|
semicolon: !1
|
|
7576
7579
|
};
|
|
7577
|
-
function
|
|
7580
|
+
function Km(e) {
|
|
7578
7581
|
return e[0].toUpperCase() + e.slice(1);
|
|
7579
7582
|
}
|
|
7580
7583
|
let Cn = class {
|
|
@@ -7645,7 +7648,7 @@ let Cn = class {
|
|
|
7645
7648
|
if (i === "before" || i === "after")
|
|
7646
7649
|
return this.beforeAfter(e, i);
|
|
7647
7650
|
{
|
|
7648
|
-
let l = "raw" +
|
|
7651
|
+
let l = "raw" + Km(i);
|
|
7649
7652
|
this[l] ? s = this[l](r, e) : r.walk((o) => {
|
|
7650
7653
|
if (s = o.raws[t], typeof s < "u") return !1;
|
|
7651
7654
|
});
|
|
@@ -7744,16 +7747,16 @@ let Cn = class {
|
|
|
7744
7747
|
};
|
|
7745
7748
|
var Za = Cn;
|
|
7746
7749
|
Cn.default = Cn;
|
|
7747
|
-
let
|
|
7750
|
+
let Om = Za;
|
|
7748
7751
|
function Rn(e, t) {
|
|
7749
|
-
new
|
|
7752
|
+
new Om(t).stringify(e);
|
|
7750
7753
|
}
|
|
7751
7754
|
var ys = Rn;
|
|
7752
7755
|
Rn.default = Rn;
|
|
7753
7756
|
var _t = {};
|
|
7754
7757
|
_t.isClean = Symbol("isClean");
|
|
7755
7758
|
_t.my = Symbol("my");
|
|
7756
|
-
let
|
|
7759
|
+
let Mm = or, Em = Za, Hm = ys, { isClean: Gt, my: zm } = _t;
|
|
7757
7760
|
function kn(e, t) {
|
|
7758
7761
|
let i = new e.constructor();
|
|
7759
7762
|
for (let s in e) {
|
|
@@ -7782,7 +7785,7 @@ let wn = class {
|
|
|
7782
7785
|
return this;
|
|
7783
7786
|
}
|
|
7784
7787
|
constructor(e = {}) {
|
|
7785
|
-
this.raws = {}, this[Gt] = !1, this[
|
|
7788
|
+
this.raws = {}, this[Gt] = !1, this[zm] = !0;
|
|
7786
7789
|
for (let t in e)
|
|
7787
7790
|
if (t === "nodes") {
|
|
7788
7791
|
this.nodes = [];
|
|
@@ -7839,7 +7842,7 @@ let wn = class {
|
|
|
7839
7842
|
t
|
|
7840
7843
|
);
|
|
7841
7844
|
}
|
|
7842
|
-
return new
|
|
7845
|
+
return new Mm(e);
|
|
7843
7846
|
}
|
|
7844
7847
|
getProxyProcessor() {
|
|
7845
7848
|
return {
|
|
@@ -7924,7 +7927,7 @@ let wn = class {
|
|
|
7924
7927
|
return (i.line < t.line || i.line === t.line && i.column <= t.column) && (i = { column: t.column + 1, line: t.line }), { end: i, start: t };
|
|
7925
7928
|
}
|
|
7926
7929
|
raw(e, t) {
|
|
7927
|
-
return new
|
|
7930
|
+
return new Em().raw(this, e, t);
|
|
7928
7931
|
}
|
|
7929
7932
|
remove() {
|
|
7930
7933
|
return this.parent && this.parent.removeChild(this), this.parent = void 0, this;
|
|
@@ -7970,7 +7973,7 @@ let wn = class {
|
|
|
7970
7973
|
toProxy() {
|
|
7971
7974
|
return this.proxyCache || (this.proxyCache = new Proxy(this, this.getProxyProcessor())), this.proxyCache;
|
|
7972
7975
|
}
|
|
7973
|
-
toString(e =
|
|
7976
|
+
toString(e = Hm) {
|
|
7974
7977
|
e.stringify && (e = e.stringify);
|
|
7975
7978
|
let t = "";
|
|
7976
7979
|
return e(this, (i) => {
|
|
@@ -7985,14 +7988,14 @@ let wn = class {
|
|
|
7985
7988
|
};
|
|
7986
7989
|
var gs = wn;
|
|
7987
7990
|
wn.default = wn;
|
|
7988
|
-
let
|
|
7991
|
+
let Pm = gs, vn = class extends Pm {
|
|
7989
7992
|
constructor(e) {
|
|
7990
7993
|
super(e), this.type = "comment";
|
|
7991
7994
|
}
|
|
7992
7995
|
};
|
|
7993
7996
|
var Zs = vn;
|
|
7994
7997
|
vn.default = vn;
|
|
7995
|
-
let
|
|
7998
|
+
let Bm = gs, xn = class extends Bm {
|
|
7996
7999
|
get variable() {
|
|
7997
8000
|
return this.prop.startsWith("--") || this.prop[0] === "$";
|
|
7998
8001
|
}
|
|
@@ -8002,7 +8005,7 @@ let Hm = gs, xn = class extends Hm {
|
|
|
8002
8005
|
};
|
|
8003
8006
|
var Is = xn;
|
|
8004
8007
|
xn.default = xn;
|
|
8005
|
-
let Ia = Zs, Sa = Is,
|
|
8008
|
+
let Ia = Zs, Sa = Is, Dm = gs, { isClean: Ga, my: Va } = _t, lr, Xa, Wa, ar;
|
|
8006
8009
|
function Ca(e) {
|
|
8007
8010
|
return e.map((t) => (t.nodes && (t.nodes = Ca(t.nodes)), delete t.source, t));
|
|
8008
8011
|
}
|
|
@@ -8011,7 +8014,7 @@ function Ra(e) {
|
|
|
8011
8014
|
for (let t of e.proxyOf.nodes)
|
|
8012
8015
|
Ra(t);
|
|
8013
8016
|
}
|
|
8014
|
-
let Ue = class ka extends
|
|
8017
|
+
let Ue = class ka extends Dm {
|
|
8015
8018
|
get first() {
|
|
8016
8019
|
if (this.proxyOf.nodes)
|
|
8017
8020
|
return this.proxyOf.nodes[0];
|
|
@@ -8233,7 +8236,7 @@ let wa = Qe, is = class extends wa {
|
|
|
8233
8236
|
var cr = is;
|
|
8234
8237
|
is.default = is;
|
|
8235
8238
|
wa.registerAtRule(is);
|
|
8236
|
-
let
|
|
8239
|
+
let jm = Qe, va, xa, Ht = class extends jm {
|
|
8237
8240
|
constructor(e) {
|
|
8238
8241
|
super(F({ type: "document" }, e)), this.nodes || (this.nodes = []);
|
|
8239
8242
|
}
|
|
@@ -8249,15 +8252,15 @@ Ht.registerProcessor = (e) => {
|
|
|
8249
8252
|
};
|
|
8250
8253
|
var ur = Ht;
|
|
8251
8254
|
Ht.default = Ht;
|
|
8252
|
-
let
|
|
8255
|
+
let Qm = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", Am = (e = 21) => {
|
|
8253
8256
|
let t = "", i = e | 0;
|
|
8254
8257
|
for (; i--; )
|
|
8255
|
-
t +=
|
|
8258
|
+
t += Qm[Math.random() * 64 | 0];
|
|
8256
8259
|
return t;
|
|
8257
8260
|
};
|
|
8258
|
-
var
|
|
8259
|
-
let { existsSync:
|
|
8260
|
-
function
|
|
8261
|
+
var _m = { nanoid: Am };
|
|
8262
|
+
let { existsSync: $m, readFileSync: qm } = Re, { dirname: Ks, join: eb } = Re, { SourceMapConsumer: uo, SourceMapGenerator: ho } = Re;
|
|
8263
|
+
function tb(e) {
|
|
8261
8264
|
return Buffer ? Buffer.from(e, "base64").toString() : window.atob(e);
|
|
8262
8265
|
}
|
|
8263
8266
|
let Tn = class {
|
|
@@ -8276,7 +8279,7 @@ let Tn = class {
|
|
|
8276
8279
|
return decodeURIComponent(e.substr(r[0].length));
|
|
8277
8280
|
let l = e.match(t) || e.match(i);
|
|
8278
8281
|
if (l)
|
|
8279
|
-
return
|
|
8282
|
+
return tb(e.substr(l[0].length));
|
|
8280
8283
|
let o = e.match(/data:application\/json;([^,]+),/)[1];
|
|
8281
8284
|
throw new Error("Unsupported source map encoding " + o);
|
|
8282
8285
|
}
|
|
@@ -8293,8 +8296,8 @@ let Tn = class {
|
|
|
8293
8296
|
i > -1 && s > -1 && (this.annotation = this.getAnnotationURL(e.substring(i, s)));
|
|
8294
8297
|
}
|
|
8295
8298
|
loadFile(e) {
|
|
8296
|
-
if (this.root = Ks(e),
|
|
8297
|
-
return this.mapFile = e,
|
|
8299
|
+
if (this.root = Ks(e), $m(e))
|
|
8300
|
+
return this.mapFile = e, qm(e, "utf-8").toString().trim();
|
|
8298
8301
|
}
|
|
8299
8302
|
loadMap(e, t) {
|
|
8300
8303
|
if (t === !1) return !1;
|
|
@@ -8327,7 +8330,7 @@ let Tn = class {
|
|
|
8327
8330
|
return this.decodeInline(this.annotation);
|
|
8328
8331
|
if (this.annotation) {
|
|
8329
8332
|
let i = this.annotation;
|
|
8330
|
-
return e && (i =
|
|
8333
|
+
return e && (i = eb(Ks(e), i)), this.loadFile(i);
|
|
8331
8334
|
}
|
|
8332
8335
|
}
|
|
8333
8336
|
}
|
|
@@ -8340,22 +8343,22 @@ let Tn = class {
|
|
|
8340
8343
|
};
|
|
8341
8344
|
var Ta = Tn;
|
|
8342
8345
|
Tn.default = Tn;
|
|
8343
|
-
let { nanoid:
|
|
8346
|
+
let { nanoid: ib } = _m, { isAbsolute: Nn, resolve: Jn } = Re, { SourceMapConsumer: sb, SourceMapGenerator: nb } = Re, { fileURLToPath: po, pathToFileURL: fi } = Re, mo = or, rb = Ta, Os = Re, Ms = Symbol("fromOffsetCache"), ob = !!(sb && nb), bo = !!(Jn && Nn), ss = class {
|
|
8344
8347
|
get from() {
|
|
8345
8348
|
return this.file || this.id;
|
|
8346
8349
|
}
|
|
8347
8350
|
constructor(e, t = {}) {
|
|
8348
8351
|
if (e === null || typeof e > "u" || typeof e == "object" && !e.toString)
|
|
8349
8352
|
throw new Error(`PostCSS received ${e} instead of CSS string`);
|
|
8350
|
-
if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!bo || /^\w+:\/\//.test(t.from) || Nn(t.from) ? this.file = t.from : this.file = Jn(t.from)), bo &&
|
|
8351
|
-
let i = new
|
|
8353
|
+
if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!bo || /^\w+:\/\//.test(t.from) || Nn(t.from) ? this.file = t.from : this.file = Jn(t.from)), bo && ob) {
|
|
8354
|
+
let i = new rb(this.css, t);
|
|
8352
8355
|
if (i.text) {
|
|
8353
8356
|
this.map = i;
|
|
8354
8357
|
let s = i.consumer().file;
|
|
8355
8358
|
!this.file && s && (this.file = this.mapResolve(s));
|
|
8356
8359
|
}
|
|
8357
8360
|
}
|
|
8358
|
-
this.file || (this.id = "<input css " +
|
|
8361
|
+
this.file || (this.id = "<input css " + ib(6) + ">"), this.map && (this.map.file = this.from);
|
|
8359
8362
|
}
|
|
8360
8363
|
error(e, t, i, s = {}) {
|
|
8361
8364
|
let n, r, l;
|
|
@@ -8515,9 +8518,9 @@ let zt = {
|
|
|
8515
8518
|
};
|
|
8516
8519
|
var Ya = zt;
|
|
8517
8520
|
zt.default = zt;
|
|
8518
|
-
let Ua = Qe,
|
|
8521
|
+
let Ua = Qe, lb = Ya, ns = class extends Ua {
|
|
8519
8522
|
get selectors() {
|
|
8520
|
-
return
|
|
8523
|
+
return lb.comma(this.selector);
|
|
8521
8524
|
}
|
|
8522
8525
|
set selectors(e) {
|
|
8523
8526
|
let t = this.selector ? this.selector.match(/,\s*/) : null, i = t ? t[0] : "," + this.raw("between", "beforeOpen");
|
|
@@ -8530,16 +8533,16 @@ let Ua = Qe, nb = Ya, ns = class extends Ua {
|
|
|
8530
8533
|
var dr = ns;
|
|
8531
8534
|
ns.default = ns;
|
|
8532
8535
|
Ua.registerRule(ns);
|
|
8533
|
-
let
|
|
8536
|
+
let ab = cr, cb = Zs, ub = Is, db = Ss, hb = Ta, pb = $t, mb = dr;
|
|
8534
8537
|
function Pt(e, t) {
|
|
8535
8538
|
if (Array.isArray(e)) return e.map((r) => Pt(r));
|
|
8536
8539
|
let i = e, { inputs: s } = i, n = ot(i, ["inputs"]);
|
|
8537
8540
|
if (s) {
|
|
8538
8541
|
t = [];
|
|
8539
8542
|
for (let r of s) {
|
|
8540
|
-
let l = ge(F({}, r), { __proto__:
|
|
8543
|
+
let l = ge(F({}, r), { __proto__: db.prototype });
|
|
8541
8544
|
l.map && (l.map = ge(F({}, l.map), {
|
|
8542
|
-
__proto__:
|
|
8545
|
+
__proto__: hb.prototype
|
|
8543
8546
|
})), t.push(l);
|
|
8544
8547
|
}
|
|
8545
8548
|
}
|
|
@@ -8548,20 +8551,20 @@ function Pt(e, t) {
|
|
|
8548
8551
|
n.source = o, l != null && (n.source.input = t[l]);
|
|
8549
8552
|
}
|
|
8550
8553
|
if (n.type === "root")
|
|
8551
|
-
return new
|
|
8554
|
+
return new pb(n);
|
|
8552
8555
|
if (n.type === "decl")
|
|
8553
|
-
return new
|
|
8556
|
+
return new ub(n);
|
|
8554
8557
|
if (n.type === "rule")
|
|
8555
|
-
return new
|
|
8558
|
+
return new mb(n);
|
|
8556
8559
|
if (n.type === "comment")
|
|
8557
|
-
return new
|
|
8560
|
+
return new cb(n);
|
|
8558
8561
|
if (n.type === "atrule")
|
|
8559
|
-
return new
|
|
8562
|
+
return new ab(n);
|
|
8560
8563
|
throw new Error("Unknown node type: " + e.type);
|
|
8561
8564
|
}
|
|
8562
|
-
var
|
|
8565
|
+
var bb = Pt;
|
|
8563
8566
|
Pt.default = Pt;
|
|
8564
|
-
let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsumer: Ma, SourceMapGenerator: Ui } = Re, { pathToFileURL: fo } = Re,
|
|
8567
|
+
let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsumer: Ma, SourceMapGenerator: Ui } = Re, { pathToFileURL: fo } = Re, fb = Ss, yb = !!(Ma && Ui), gb = !!(Yi && Ka && Fa && Oa), Zb = class {
|
|
8565
8568
|
constructor(e, t, i, s) {
|
|
8566
8569
|
this.stringify = e, this.mapOpts = i.map || {}, this.root = t, this.opts = i, this.css = s, this.originalCSS = s, this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute, this.memoizedFileURLs = /* @__PURE__ */ new Map(), this.memoizedPaths = /* @__PURE__ */ new Map(), this.memoizedURLs = /* @__PURE__ */ new Map();
|
|
8567
8570
|
}
|
|
@@ -8589,7 +8592,7 @@ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsume
|
|
|
8589
8592
|
} else this.css && (this.css = this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm, ""));
|
|
8590
8593
|
}
|
|
8591
8594
|
generate() {
|
|
8592
|
-
if (this.clearAnnotation(),
|
|
8595
|
+
if (this.clearAnnotation(), gb && yb && this.isMap())
|
|
8593
8596
|
return this.generateMap();
|
|
8594
8597
|
{
|
|
8595
8598
|
let e = "";
|
|
@@ -8672,7 +8675,7 @@ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsume
|
|
|
8672
8675
|
}
|
|
8673
8676
|
});
|
|
8674
8677
|
else {
|
|
8675
|
-
let e = new
|
|
8678
|
+
let e = new fb(this.originalCSS, this.opts);
|
|
8676
8679
|
e.map && this.previousMaps.push(e.map);
|
|
8677
8680
|
}
|
|
8678
8681
|
return this.previousMaps;
|
|
@@ -8720,9 +8723,9 @@ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsume
|
|
|
8720
8723
|
return this.memoizedURLs.set(e, i), i;
|
|
8721
8724
|
}
|
|
8722
8725
|
};
|
|
8723
|
-
var Ea =
|
|
8724
|
-
const Es = 39, yo = 34, yi = 92, go = 47, gi = 10, Xt = 32, Zi = 12, Ii = 9, Si = 13,
|
|
8725
|
-
var
|
|
8726
|
+
var Ea = Zb;
|
|
8727
|
+
const Es = 39, yo = 34, yi = 92, go = 47, gi = 10, Xt = 32, Zi = 12, Ii = 9, Si = 13, Ib = 91, Sb = 93, Gb = 40, Vb = 41, Xb = 123, Wb = 125, Cb = 59, Rb = 42, kb = 58, wb = 64, Gi = /[\t\n\f\r "#'()/;[\\\]{}]/g, Vi = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, vb = /.[\r\n"'(/\\]/, Zo = /[\da-f]/i;
|
|
8728
|
+
var xb = function(e, t = {}) {
|
|
8726
8729
|
let i = e.css.valueOf(), s = t.ignoreErrors, n, r, l, o, a, c, u, h, m, p, b = i.length, d = 0, I = [], Z = [];
|
|
8727
8730
|
function X() {
|
|
8728
8731
|
return d;
|
|
@@ -8750,18 +8753,18 @@ var kb = function(e, t = {}) {
|
|
|
8750
8753
|
c = ["space", i.slice(d, o)], d = o - 1;
|
|
8751
8754
|
break;
|
|
8752
8755
|
}
|
|
8753
|
-
case
|
|
8754
|
-
case gb:
|
|
8756
|
+
case Ib:
|
|
8755
8757
|
case Sb:
|
|
8756
|
-
case
|
|
8758
|
+
case Xb:
|
|
8757
8759
|
case Wb:
|
|
8758
|
-
case
|
|
8759
|
-
case
|
|
8760
|
+
case kb:
|
|
8761
|
+
case Cb:
|
|
8762
|
+
case Vb: {
|
|
8760
8763
|
let V = String.fromCharCode(n);
|
|
8761
8764
|
c = [V, V, d];
|
|
8762
8765
|
break;
|
|
8763
8766
|
}
|
|
8764
|
-
case
|
|
8767
|
+
case Gb: {
|
|
8765
8768
|
if (p = I.length ? I.pop()[1] : "", m = i.charCodeAt(d + 1), p === "url" && m !== Es && m !== yo && m !== Xt && m !== gi && m !== Ii && m !== Zi && m !== Si) {
|
|
8766
8769
|
o = d;
|
|
8767
8770
|
do {
|
|
@@ -8776,7 +8779,7 @@ var kb = function(e, t = {}) {
|
|
|
8776
8779
|
} while (u);
|
|
8777
8780
|
c = ["brackets", i.slice(d, o + 1), d, o], d = o;
|
|
8778
8781
|
} else
|
|
8779
|
-
o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 ||
|
|
8782
|
+
o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 || vb.test(r) ? c = ["(", "(", d] : (c = ["brackets", r, d, o], d = o);
|
|
8780
8783
|
break;
|
|
8781
8784
|
}
|
|
8782
8785
|
case Es:
|
|
@@ -8795,7 +8798,7 @@ var kb = function(e, t = {}) {
|
|
|
8795
8798
|
c = ["string", i.slice(d, o + 1), d, o], d = o;
|
|
8796
8799
|
break;
|
|
8797
8800
|
}
|
|
8798
|
-
case
|
|
8801
|
+
case wb: {
|
|
8799
8802
|
Gi.lastIndex = d + 1, Gi.test(i), Gi.lastIndex === 0 ? o = i.length - 1 : o = Gi.lastIndex - 2, c = ["at-word", i.slice(d, o + 1), d, o], d = o;
|
|
8800
8803
|
break;
|
|
8801
8804
|
}
|
|
@@ -8811,7 +8814,7 @@ var kb = function(e, t = {}) {
|
|
|
8811
8814
|
break;
|
|
8812
8815
|
}
|
|
8813
8816
|
default: {
|
|
8814
|
-
n === go && i.charCodeAt(d + 1) ===
|
|
8817
|
+
n === go && i.charCodeAt(d + 1) === Rb ? (o = i.indexOf("*/", d + 2) + 1, o === 0 && (s || K ? o = i.length : R("comment")), c = ["comment", i.slice(d, o + 1), d, o], d = o) : (Vi.lastIndex = d + 1, Vi.test(i), Vi.lastIndex === 0 ? o = i.length - 1 : o = Vi.lastIndex - 2, c = ["word", i.slice(d, o + 1), d, o], I.push(c), d = o);
|
|
8815
8818
|
break;
|
|
8816
8819
|
}
|
|
8817
8820
|
}
|
|
@@ -8827,23 +8830,23 @@ var kb = function(e, t = {}) {
|
|
|
8827
8830
|
position: X
|
|
8828
8831
|
};
|
|
8829
8832
|
};
|
|
8830
|
-
let
|
|
8833
|
+
let Tb = cr, Nb = Zs, Jb = Is, Lb = $t, Io = dr, Yb = xb;
|
|
8831
8834
|
const So = {
|
|
8832
8835
|
empty: !0,
|
|
8833
8836
|
space: !0
|
|
8834
8837
|
};
|
|
8835
|
-
function
|
|
8838
|
+
function Ub(e) {
|
|
8836
8839
|
for (let t = e.length - 1; t >= 0; t--) {
|
|
8837
8840
|
let i = e[t], s = i[3] || i[2];
|
|
8838
8841
|
if (s) return s;
|
|
8839
8842
|
}
|
|
8840
8843
|
}
|
|
8841
|
-
let
|
|
8844
|
+
let Fb = class {
|
|
8842
8845
|
constructor(e) {
|
|
8843
|
-
this.input = e, this.root = new
|
|
8846
|
+
this.input = e, this.root = new Lb(), this.current = this.root, this.spaces = "", this.semicolon = !1, this.createTokenizer(), this.root.source = { input: e, start: { column: 1, line: 1, offset: 0 } };
|
|
8844
8847
|
}
|
|
8845
8848
|
atrule(e) {
|
|
8846
|
-
let t = new
|
|
8849
|
+
let t = new Tb();
|
|
8847
8850
|
t.name = e[1].slice(1), t.name === "" && this.unnamedAtrule(t, e), this.init(t, e[2]);
|
|
8848
8851
|
let i, s, n, r = !1, l = !1, o = [], a = [];
|
|
8849
8852
|
for (; !this.tokenizer.endOfFile(); ) {
|
|
@@ -8900,7 +8903,7 @@ let Lb = class {
|
|
|
8900
8903
|
return !1;
|
|
8901
8904
|
}
|
|
8902
8905
|
comment(e) {
|
|
8903
|
-
let t = new
|
|
8906
|
+
let t = new Nb();
|
|
8904
8907
|
this.init(t, e[2]), t.source.end = this.getPosition(e[3] || e[2]), t.source.end.offset++;
|
|
8905
8908
|
let i = e[1].slice(2, -2);
|
|
8906
8909
|
if (/^\s*$/.test(i))
|
|
@@ -8911,14 +8914,14 @@ let Lb = class {
|
|
|
8911
8914
|
}
|
|
8912
8915
|
}
|
|
8913
8916
|
createTokenizer() {
|
|
8914
|
-
this.tokenizer =
|
|
8917
|
+
this.tokenizer = Yb(this.input);
|
|
8915
8918
|
}
|
|
8916
8919
|
decl(e, t) {
|
|
8917
|
-
let i = new
|
|
8920
|
+
let i = new Jb();
|
|
8918
8921
|
this.init(i, e[0][2]);
|
|
8919
8922
|
let s = e[e.length - 1];
|
|
8920
8923
|
for (s[0] === ";" && (this.semicolon = !0, e.pop()), i.source.end = this.getPosition(
|
|
8921
|
-
s[3] || s[2] ||
|
|
8924
|
+
s[3] || s[2] || Ub(e)
|
|
8922
8925
|
), i.source.end.offset++; e[0][0] !== "word"; )
|
|
8923
8926
|
e.length === 1 && this.unknownWord(e), i.raws.before += e.shift()[1];
|
|
8924
8927
|
for (i.source.start = this.getPosition(e[0][2]), i.prop = ""; e.length; ) {
|
|
@@ -9134,10 +9137,10 @@ let Lb = class {
|
|
|
9134
9137
|
);
|
|
9135
9138
|
}
|
|
9136
9139
|
};
|
|
9137
|
-
var
|
|
9138
|
-
let
|
|
9140
|
+
var Kb = Fb;
|
|
9141
|
+
let Ob = Qe, Mb = Ss, Eb = Kb;
|
|
9139
9142
|
function rs(e, t) {
|
|
9140
|
-
let i = new
|
|
9143
|
+
let i = new Mb(e, t), s = new Eb(i);
|
|
9141
9144
|
try {
|
|
9142
9145
|
s.parse();
|
|
9143
9146
|
} catch (n) {
|
|
@@ -9150,7 +9153,7 @@ You tried to parse Less with the standard CSS parser; try again with the postcss
|
|
|
9150
9153
|
}
|
|
9151
9154
|
var hr = rs;
|
|
9152
9155
|
rs.default = rs;
|
|
9153
|
-
|
|
9156
|
+
Ob.registerParse(rs);
|
|
9154
9157
|
let Ln = class {
|
|
9155
9158
|
constructor(e, t = {}) {
|
|
9156
9159
|
if (this.type = "warning", this.text = e, t.node && t.node.source) {
|
|
@@ -9169,7 +9172,7 @@ let Ln = class {
|
|
|
9169
9172
|
};
|
|
9170
9173
|
var Ha = Ln;
|
|
9171
9174
|
Ln.default = Ln;
|
|
9172
|
-
let
|
|
9175
|
+
let Hb = Ha, Yn = class {
|
|
9173
9176
|
get content() {
|
|
9174
9177
|
return this.css;
|
|
9175
9178
|
}
|
|
@@ -9181,7 +9184,7 @@ let Ob = Ha, Yn = class {
|
|
|
9181
9184
|
}
|
|
9182
9185
|
warn(e, t = {}) {
|
|
9183
9186
|
t.plugin || this.lastPlugin && this.lastPlugin.postcssPlugin && (t.plugin = this.lastPlugin.postcssPlugin);
|
|
9184
|
-
let i = new
|
|
9187
|
+
let i = new Hb(e, t);
|
|
9185
9188
|
return this.messages.push(i), i;
|
|
9186
9189
|
}
|
|
9187
9190
|
warnings() {
|
|
@@ -9194,15 +9197,15 @@ let Go = {};
|
|
|
9194
9197
|
var za = function(e) {
|
|
9195
9198
|
Go[e] || (Go[e] = !0, typeof console < "u" && console.warn && console.warn(e));
|
|
9196
9199
|
};
|
|
9197
|
-
let
|
|
9198
|
-
const
|
|
9200
|
+
let zb = Qe, Pb = ur, Bb = Ea, Db = hr, Vo = pr, jb = $t, Qb = ys, { isClean: ve, my: Ab } = _t, _b = za;
|
|
9201
|
+
const $b = {
|
|
9199
9202
|
atrule: "AtRule",
|
|
9200
9203
|
comment: "Comment",
|
|
9201
9204
|
decl: "Declaration",
|
|
9202
9205
|
document: "Document",
|
|
9203
9206
|
root: "Root",
|
|
9204
9207
|
rule: "Rule"
|
|
9205
|
-
},
|
|
9208
|
+
}, qb = {
|
|
9206
9209
|
AtRule: !0,
|
|
9207
9210
|
AtRuleExit: !0,
|
|
9208
9211
|
Comment: !0,
|
|
@@ -9219,7 +9222,7 @@ const Qb = {
|
|
|
9219
9222
|
RootExit: !0,
|
|
9220
9223
|
Rule: !0,
|
|
9221
9224
|
RuleExit: !0
|
|
9222
|
-
},
|
|
9225
|
+
}, ef = {
|
|
9223
9226
|
Once: !0,
|
|
9224
9227
|
postcssPlugin: !0,
|
|
9225
9228
|
prepare: !0
|
|
@@ -9228,7 +9231,7 @@ function Wt(e) {
|
|
|
9228
9231
|
return typeof e == "object" && typeof e.then == "function";
|
|
9229
9232
|
}
|
|
9230
9233
|
function Pa(e) {
|
|
9231
|
-
let t = !1, i =
|
|
9234
|
+
let t = !1, i = $b[e.type];
|
|
9232
9235
|
return e.type === "decl" ? t = e.prop.toLowerCase() : e.type === "atrule" && (t = e.name.toLowerCase()), t && e.append ? [
|
|
9233
9236
|
i,
|
|
9234
9237
|
i + "-" + t,
|
|
@@ -9284,14 +9287,14 @@ let Fn = {}, pt = class Ba {
|
|
|
9284
9287
|
else if (i instanceof Ba || i instanceof Vo)
|
|
9285
9288
|
n = Un(i.root), i.map && (typeof s.map > "u" && (s.map = {}), s.map.inline || (s.map.inline = !1), s.map.prev = i.map);
|
|
9286
9289
|
else {
|
|
9287
|
-
let r =
|
|
9290
|
+
let r = Db;
|
|
9288
9291
|
s.syntax && (r = s.syntax.parse), s.parser && (r = s.parser), r.parse && (r = r.parse);
|
|
9289
9292
|
try {
|
|
9290
9293
|
n = r(i, s);
|
|
9291
9294
|
} catch (l) {
|
|
9292
9295
|
this.processed = !0, this.error = l;
|
|
9293
9296
|
}
|
|
9294
|
-
n && !n[
|
|
9297
|
+
n && !n[Ab] && zb.rebuild(n);
|
|
9295
9298
|
}
|
|
9296
9299
|
this.result = new Vo(t, n, s), this.helpers = ge(F({}, Fn), { postcss: Fn, result: this.result }), this.plugins = this.processor.plugins.map((r) => typeof r == "object" && r.prepare ? F(F({}, r), r.prepare(this.result)) : r);
|
|
9297
9300
|
}
|
|
@@ -9331,11 +9334,11 @@ let Fn = {}, pt = class Ba {
|
|
|
9331
9334
|
for (let i of this.plugins)
|
|
9332
9335
|
if (typeof i == "object")
|
|
9333
9336
|
for (let s in i) {
|
|
9334
|
-
if (!
|
|
9337
|
+
if (!qb[s] && /^[A-Z]/.test(s))
|
|
9335
9338
|
throw new Error(
|
|
9336
9339
|
`Unknown event ${s} in ${i.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`
|
|
9337
9340
|
);
|
|
9338
|
-
if (!
|
|
9341
|
+
if (!ef[s])
|
|
9339
9342
|
if (typeof i[s] == "object")
|
|
9340
9343
|
for (let n in i[s])
|
|
9341
9344
|
n === "*" ? t(i, s, i[s][n]) : t(
|
|
@@ -9415,9 +9418,9 @@ let Fn = {}, pt = class Ba {
|
|
|
9415
9418
|
if (this.error) throw this.error;
|
|
9416
9419
|
if (this.stringified) return this.result;
|
|
9417
9420
|
this.stringified = !0, this.sync();
|
|
9418
|
-
let t = this.result.opts, i =
|
|
9421
|
+
let t = this.result.opts, i = Qb;
|
|
9419
9422
|
t.syntax && (i = t.syntax.stringify), t.stringifier && (i = t.stringifier), i.stringify && (i = i.stringify);
|
|
9420
|
-
let s = new
|
|
9423
|
+
let s = new Bb(i, this.result.root, this.result.opts).generate();
|
|
9421
9424
|
return this.result.css = s[0], this.result.map = s[1], this.result;
|
|
9422
9425
|
}
|
|
9423
9426
|
sync() {
|
|
@@ -9444,7 +9447,7 @@ let Fn = {}, pt = class Ba {
|
|
|
9444
9447
|
return this.result;
|
|
9445
9448
|
}
|
|
9446
9449
|
then(t, i) {
|
|
9447
|
-
return process.env.NODE_ENV !== "production" && ("from" in this.opts ||
|
|
9450
|
+
return process.env.NODE_ENV !== "production" && ("from" in this.opts || _b(
|
|
9448
9451
|
"Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
|
|
9449
9452
|
)), this.async().then(t, i);
|
|
9450
9453
|
}
|
|
@@ -9526,11 +9529,11 @@ pt.registerPostcss = (e) => {
|
|
|
9526
9529
|
};
|
|
9527
9530
|
var Da = pt;
|
|
9528
9531
|
pt.default = pt;
|
|
9532
|
+
jb.registerLazyResult(pt);
|
|
9529
9533
|
Pb.registerLazyResult(pt);
|
|
9530
|
-
|
|
9531
|
-
|
|
9532
|
-
|
|
9533
|
-
let tf = ys, sf = za, Kn = class {
|
|
9534
|
+
let tf = Ea, sf = hr;
|
|
9535
|
+
const nf = pr;
|
|
9536
|
+
let rf = ys, of = za, Kn = class {
|
|
9534
9537
|
get content() {
|
|
9535
9538
|
return this.result.css;
|
|
9536
9539
|
}
|
|
@@ -9552,7 +9555,7 @@ let tf = ys, sf = za, Kn = class {
|
|
|
9552
9555
|
get root() {
|
|
9553
9556
|
if (this._root)
|
|
9554
9557
|
return this._root;
|
|
9555
|
-
let e, t =
|
|
9558
|
+
let e, t = sf;
|
|
9556
9559
|
try {
|
|
9557
9560
|
e = t(this._css, this._opts);
|
|
9558
9561
|
} catch (i) {
|
|
@@ -9567,15 +9570,15 @@ let tf = ys, sf = za, Kn = class {
|
|
|
9567
9570
|
}
|
|
9568
9571
|
constructor(e, t, i) {
|
|
9569
9572
|
t = t.toString(), this.stringified = !1, this._processor = e, this._css = t, this._opts = i, this._map = void 0;
|
|
9570
|
-
let s, n =
|
|
9571
|
-
this.result = new
|
|
9573
|
+
let s, n = rf;
|
|
9574
|
+
this.result = new nf(this._processor, s, this._opts), this.result.css = t;
|
|
9572
9575
|
let r = this;
|
|
9573
9576
|
Object.defineProperty(this.result, "root", {
|
|
9574
9577
|
get() {
|
|
9575
9578
|
return r.root;
|
|
9576
9579
|
}
|
|
9577
9580
|
});
|
|
9578
|
-
let l = new
|
|
9581
|
+
let l = new tf(n, s, this._opts, t);
|
|
9579
9582
|
if (l.isMap()) {
|
|
9580
9583
|
let [o, a] = l.generate();
|
|
9581
9584
|
o && (this.result.css = o), a && (this.result.map = a);
|
|
@@ -9596,7 +9599,7 @@ let tf = ys, sf = za, Kn = class {
|
|
|
9596
9599
|
return this.result;
|
|
9597
9600
|
}
|
|
9598
9601
|
then(e, t) {
|
|
9599
|
-
return process.env.NODE_ENV !== "production" && ("from" in this._opts ||
|
|
9602
|
+
return process.env.NODE_ENV !== "production" && ("from" in this._opts || of(
|
|
9600
9603
|
"Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
|
|
9601
9604
|
)), this.async().then(e, t);
|
|
9602
9605
|
}
|
|
@@ -9607,9 +9610,9 @@ let tf = ys, sf = za, Kn = class {
|
|
|
9607
9610
|
return [];
|
|
9608
9611
|
}
|
|
9609
9612
|
};
|
|
9610
|
-
var
|
|
9613
|
+
var lf = Kn;
|
|
9611
9614
|
Kn.default = Kn;
|
|
9612
|
-
let
|
|
9615
|
+
let af = ur, cf = Da, uf = lf, df = $t, Bt = class {
|
|
9613
9616
|
constructor(e = []) {
|
|
9614
9617
|
this.version = "8.5.3", this.plugins = this.normalize(e);
|
|
9615
9618
|
}
|
|
@@ -9632,17 +9635,17 @@ let rf = ur, of = Da, lf = nf, af = $t, Bt = class {
|
|
|
9632
9635
|
return t;
|
|
9633
9636
|
}
|
|
9634
9637
|
process(e, t = {}) {
|
|
9635
|
-
return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new
|
|
9638
|
+
return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new uf(this, e, t) : new cf(this, e, t);
|
|
9636
9639
|
}
|
|
9637
9640
|
use(e) {
|
|
9638
9641
|
return this.plugins = this.plugins.concat(this.normalize([e])), this;
|
|
9639
9642
|
}
|
|
9640
9643
|
};
|
|
9641
|
-
var
|
|
9644
|
+
var hf = Bt;
|
|
9642
9645
|
Bt.default = Bt;
|
|
9646
|
+
df.registerProcessor(Bt);
|
|
9643
9647
|
af.registerProcessor(Bt);
|
|
9644
|
-
|
|
9645
|
-
let ja = cr, Qa = Zs, uf = Qe, df = or, Aa = Is, _a = ur, hf = hb, pf = Ss, mf = Da, bf = Ya, ff = gs, yf = hr, mr = cf, gf = pr, $a = $t, qa = dr, Zf = ys, If = Ha;
|
|
9648
|
+
let ja = cr, Qa = Zs, pf = Qe, mf = or, Aa = Is, _a = ur, bf = bb, ff = Ss, yf = Da, gf = Ya, Zf = gs, If = hr, mr = hf, Sf = pr, $a = $t, qa = dr, Gf = ys, Vf = Ha;
|
|
9646
9649
|
function Q(...e) {
|
|
9647
9650
|
return e.length === 1 && Array.isArray(e[0]) && (e = e[0]), new mr(e);
|
|
9648
9651
|
}
|
|
@@ -9668,35 +9671,35 @@ https://www.w3ctech.com/topic/2226`
|
|
|
9668
9671
|
return Q([s(o)]).process(r, l);
|
|
9669
9672
|
}, s;
|
|
9670
9673
|
};
|
|
9671
|
-
Q.stringify =
|
|
9672
|
-
Q.parse =
|
|
9673
|
-
Q.fromJSON =
|
|
9674
|
-
Q.list =
|
|
9674
|
+
Q.stringify = Gf;
|
|
9675
|
+
Q.parse = If;
|
|
9676
|
+
Q.fromJSON = bf;
|
|
9677
|
+
Q.list = gf;
|
|
9675
9678
|
Q.comment = (e) => new Qa(e);
|
|
9676
9679
|
Q.atRule = (e) => new ja(e);
|
|
9677
9680
|
Q.decl = (e) => new Aa(e);
|
|
9678
9681
|
Q.rule = (e) => new qa(e);
|
|
9679
9682
|
Q.root = (e) => new $a(e);
|
|
9680
9683
|
Q.document = (e) => new _a(e);
|
|
9681
|
-
Q.CssSyntaxError =
|
|
9684
|
+
Q.CssSyntaxError = mf;
|
|
9682
9685
|
Q.Declaration = Aa;
|
|
9683
|
-
Q.Container =
|
|
9686
|
+
Q.Container = pf;
|
|
9684
9687
|
Q.Processor = mr;
|
|
9685
9688
|
Q.Document = _a;
|
|
9686
9689
|
Q.Comment = Qa;
|
|
9687
|
-
Q.Warning =
|
|
9690
|
+
Q.Warning = Vf;
|
|
9688
9691
|
Q.AtRule = ja;
|
|
9689
|
-
Q.Result =
|
|
9690
|
-
Q.Input =
|
|
9692
|
+
Q.Result = Sf;
|
|
9693
|
+
Q.Input = ff;
|
|
9691
9694
|
Q.Rule = qa;
|
|
9692
9695
|
Q.Root = $a;
|
|
9693
|
-
Q.Node =
|
|
9694
|
-
|
|
9696
|
+
Q.Node = Zf;
|
|
9697
|
+
yf.registerPostcss(Q);
|
|
9695
9698
|
Q.default = Q;
|
|
9696
9699
|
class br {
|
|
9697
9700
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
9698
9701
|
constructor(...t) {
|
|
9699
|
-
|
|
9702
|
+
Ie(this, "parentElement", null), Ie(this, "parentNode", null), Ie(this, "ownerDocument"), Ie(this, "firstChild", null), Ie(this, "lastChild", null), Ie(this, "previousSibling", null), Ie(this, "nextSibling", null), Ie(this, "ELEMENT_NODE", 1), Ie(this, "TEXT_NODE", 3), Ie(this, "nodeType"), Ie(this, "nodeName"), Ie(this, "RRNodeType");
|
|
9700
9703
|
}
|
|
9701
9704
|
get childNodes() {
|
|
9702
9705
|
const t = [];
|
|
@@ -9748,7 +9751,7 @@ const Wo = {
|
|
|
9748
9751
|
ShadowRoot: ["getSelection"],
|
|
9749
9752
|
Element: [],
|
|
9750
9753
|
MutationObserver: ["constructor"]
|
|
9751
|
-
}, Xi = {},
|
|
9754
|
+
}, Xi = {}, Xf = () => !!globalThis.Zone;
|
|
9752
9755
|
function fr(e) {
|
|
9753
9756
|
if (Xi[e])
|
|
9754
9757
|
return Xi[e];
|
|
@@ -9765,7 +9768,7 @@ function fr(e) {
|
|
|
9765
9768
|
return typeof i[o] == "function" && ((a = i[o]) == null ? void 0 : a.toString().includes("[native code]"));
|
|
9766
9769
|
}
|
|
9767
9770
|
));
|
|
9768
|
-
if (n && l && !
|
|
9771
|
+
if (n && l && !Xf())
|
|
9769
9772
|
return Xi[e] = t.prototype, t.prototype;
|
|
9770
9773
|
try {
|
|
9771
9774
|
const o = document.createElement("iframe");
|
|
@@ -9802,37 +9805,37 @@ function ec(e, t, i) {
|
|
|
9802
9805
|
const n = fr(e)[i];
|
|
9803
9806
|
return typeof n != "function" ? t[i] : (zs[s] = n, n.bind(t));
|
|
9804
9807
|
}
|
|
9805
|
-
function
|
|
9808
|
+
function Wf(e) {
|
|
9806
9809
|
return Ee("Node", e, "childNodes");
|
|
9807
9810
|
}
|
|
9808
|
-
function
|
|
9811
|
+
function Cf(e) {
|
|
9809
9812
|
return Ee("Node", e, "parentNode");
|
|
9810
9813
|
}
|
|
9811
|
-
function
|
|
9814
|
+
function Rf(e) {
|
|
9812
9815
|
return Ee("Node", e, "parentElement");
|
|
9813
9816
|
}
|
|
9814
|
-
function
|
|
9817
|
+
function kf(e) {
|
|
9815
9818
|
return Ee("Node", e, "textContent");
|
|
9816
9819
|
}
|
|
9817
|
-
function
|
|
9820
|
+
function wf(e, t) {
|
|
9818
9821
|
return ec("Node", e, "contains")(t);
|
|
9819
9822
|
}
|
|
9820
|
-
function
|
|
9823
|
+
function vf(e) {
|
|
9821
9824
|
return ec("Node", e, "getRootNode")();
|
|
9822
9825
|
}
|
|
9823
|
-
function
|
|
9826
|
+
function xf(e) {
|
|
9824
9827
|
return !e || !("host" in e) ? null : Ee("ShadowRoot", e, "host");
|
|
9825
9828
|
}
|
|
9826
|
-
function
|
|
9829
|
+
function Tf(e) {
|
|
9827
9830
|
return e.styleSheets;
|
|
9828
9831
|
}
|
|
9829
|
-
function
|
|
9832
|
+
function Nf(e) {
|
|
9830
9833
|
return !e || !("shadowRoot" in e) ? null : Ee("Element", e, "shadowRoot");
|
|
9831
9834
|
}
|
|
9832
|
-
function
|
|
9835
|
+
function Jf(e, t) {
|
|
9833
9836
|
return Ee("Element", e, "querySelector")(t);
|
|
9834
9837
|
}
|
|
9835
|
-
function
|
|
9838
|
+
function Lf(e, t) {
|
|
9836
9839
|
return Ee("Element", e, "querySelectorAll")(t);
|
|
9837
9840
|
}
|
|
9838
9841
|
function tc() {
|
|
@@ -9858,17 +9861,17 @@ function Ae(e, t, i) {
|
|
|
9858
9861
|
}
|
|
9859
9862
|
}
|
|
9860
9863
|
const E = {
|
|
9861
|
-
childNodes:
|
|
9862
|
-
parentNode:
|
|
9863
|
-
parentElement:
|
|
9864
|
-
textContent:
|
|
9865
|
-
contains:
|
|
9866
|
-
getRootNode:
|
|
9867
|
-
host:
|
|
9868
|
-
styleSheets:
|
|
9869
|
-
shadowRoot:
|
|
9870
|
-
querySelector:
|
|
9871
|
-
querySelectorAll:
|
|
9864
|
+
childNodes: Wf,
|
|
9865
|
+
parentNode: Cf,
|
|
9866
|
+
parentElement: Rf,
|
|
9867
|
+
textContent: kf,
|
|
9868
|
+
contains: wf,
|
|
9869
|
+
getRootNode: vf,
|
|
9870
|
+
host: xf,
|
|
9871
|
+
styleSheets: Tf,
|
|
9872
|
+
shadowRoot: Nf,
|
|
9873
|
+
querySelector: Jf,
|
|
9874
|
+
querySelectorAll: Lf,
|
|
9872
9875
|
mutationObserver: tc,
|
|
9873
9876
|
patch: Ae
|
|
9874
9877
|
};
|
|
@@ -9946,7 +9949,7 @@ function nc() {
|
|
|
9946
9949
|
function rc(e) {
|
|
9947
9950
|
return e ? e.nodeType === e.ELEMENT_NODE ? e : E.parentElement(e) : null;
|
|
9948
9951
|
}
|
|
9949
|
-
const
|
|
9952
|
+
const Yf = (e) => {
|
|
9950
9953
|
try {
|
|
9951
9954
|
if (e instanceof HTMLElement)
|
|
9952
9955
|
return e.tagName === "CANVAS";
|
|
@@ -9969,7 +9972,7 @@ function ue(e, t, i, s) {
|
|
|
9969
9972
|
}
|
|
9970
9973
|
return !!(i && (n.matches(i) || s && n.closest(i) !== null));
|
|
9971
9974
|
}
|
|
9972
|
-
function
|
|
9975
|
+
function Uf(e, t) {
|
|
9973
9976
|
return t.getId(e) !== -1;
|
|
9974
9977
|
}
|
|
9975
9978
|
function Ps(e, t, i) {
|
|
@@ -9987,7 +9990,7 @@ function oc(e, t) {
|
|
|
9987
9990
|
function On(e) {
|
|
9988
9991
|
return !!e.changedTouches;
|
|
9989
9992
|
}
|
|
9990
|
-
function
|
|
9993
|
+
function Ff(e = window) {
|
|
9991
9994
|
"NodeList" in e && !e.NodeList.prototype.forEach && (e.NodeList.prototype.forEach = Array.prototype.forEach), "DOMTokenList" in e && !e.DOMTokenList.prototype.forEach && (e.DOMTokenList.prototype.forEach = Array.prototype.forEach);
|
|
9992
9995
|
}
|
|
9993
9996
|
function lc(e, t) {
|
|
@@ -9999,7 +10002,7 @@ function ac(e, t) {
|
|
|
9999
10002
|
function Mn(e) {
|
|
10000
10003
|
return e ? e instanceof br && "shadowRoot" in e ? !!e.shadowRoot : !!E.shadowRoot(e) : !1;
|
|
10001
10004
|
}
|
|
10002
|
-
class
|
|
10005
|
+
class Kf {
|
|
10003
10006
|
constructor() {
|
|
10004
10007
|
S(this, "id", 1), S(this, "styleIDMap", /* @__PURE__ */ new WeakMap()), S(this, "idStyleMap", /* @__PURE__ */ new Map());
|
|
10005
10008
|
}
|
|
@@ -10033,27 +10036,27 @@ function cc(e) {
|
|
|
10033
10036
|
let i = null;
|
|
10034
10037
|
return "getRootNode" in e && ((t = E.getRootNode(e)) == null ? void 0 : t.nodeType) === Node.DOCUMENT_FRAGMENT_NODE && E.host(E.getRootNode(e)) && (i = E.host(E.getRootNode(e))), i;
|
|
10035
10038
|
}
|
|
10036
|
-
function
|
|
10039
|
+
function Of(e) {
|
|
10037
10040
|
let t = e, i;
|
|
10038
10041
|
for (; i = cc(t); )
|
|
10039
10042
|
t = i;
|
|
10040
10043
|
return t;
|
|
10041
10044
|
}
|
|
10042
|
-
function
|
|
10045
|
+
function Mf(e) {
|
|
10043
10046
|
const t = e.ownerDocument;
|
|
10044
10047
|
if (!t) return !1;
|
|
10045
|
-
const i =
|
|
10048
|
+
const i = Of(e);
|
|
10046
10049
|
return E.contains(t, i);
|
|
10047
10050
|
}
|
|
10048
10051
|
function uc(e) {
|
|
10049
10052
|
const t = e.ownerDocument;
|
|
10050
|
-
return t ? E.contains(t, e) ||
|
|
10053
|
+
return t ? E.contains(t, e) || Mf(e) : !1;
|
|
10051
10054
|
}
|
|
10052
10055
|
var P = /* @__PURE__ */ ((e) => (e[e.DomContentLoaded = 0] = "DomContentLoaded", e[e.Load = 1] = "Load", e[e.FullSnapshot = 2] = "FullSnapshot", e[e.IncrementalSnapshot = 3] = "IncrementalSnapshot", e[e.Meta = 4] = "Meta", e[e.Custom = 5] = "Custom", e[e.Plugin = 6] = "Plugin", e))(P || {}), H = /* @__PURE__ */ ((e) => (e[e.Mutation = 0] = "Mutation", e[e.MouseMove = 1] = "MouseMove", e[e.MouseInteraction = 2] = "MouseInteraction", e[e.Scroll = 3] = "Scroll", e[e.ViewportResize = 4] = "ViewportResize", e[e.Input = 5] = "Input", e[e.TouchMove = 6] = "TouchMove", e[e.MediaInteraction = 7] = "MediaInteraction", e[e.StyleSheetRule = 8] = "StyleSheetRule", e[e.CanvasMutation = 9] = "CanvasMutation", e[e.Font = 10] = "Font", e[e.Log = 11] = "Log", e[e.Drag = 12] = "Drag", e[e.StyleDeclaration = 13] = "StyleDeclaration", e[e.Selection = 14] = "Selection", e[e.AdoptedStyleSheet = 15] = "AdoptedStyleSheet", e[e.CustomElement = 16] = "CustomElement", e))(H || {}), be = /* @__PURE__ */ ((e) => (e[e.MouseUp = 0] = "MouseUp", e[e.MouseDown = 1] = "MouseDown", e[e.Click = 2] = "Click", e[e.ContextMenu = 3] = "ContextMenu", e[e.DblClick = 4] = "DblClick", e[e.Focus = 5] = "Focus", e[e.Blur = 6] = "Blur", e[e.TouchStart = 7] = "TouchStart", e[e.TouchMove_Departed = 8] = "TouchMove_Departed", e[e.TouchEnd = 9] = "TouchEnd", e[e.TouchCancel = 10] = "TouchCancel", e))(be || {}), Ke = /* @__PURE__ */ ((e) => (e[e.Mouse = 0] = "Mouse", e[e.Pen = 1] = "Pen", e[e.Touch = 2] = "Touch", e))(Ke || {}), mt = /* @__PURE__ */ ((e) => (e[e["2D"] = 0] = "2D", e[e.WebGL = 1] = "WebGL", e[e.WebGL2 = 2] = "WebGL2", e))(mt || {}), et = /* @__PURE__ */ ((e) => (e[e.Play = 0] = "Play", e[e.Pause = 1] = "Pause", e[e.Seeked = 2] = "Seeked", e[e.VolumeChange = 3] = "VolumeChange", e[e.RateChange = 4] = "RateChange", e))(et || {}), dc = /* @__PURE__ */ ((e) => (e[e.Document = 0] = "Document", e[e.DocumentType = 1] = "DocumentType", e[e.Element = 2] = "Element", e[e.Text = 3] = "Text", e[e.CDATA = 4] = "CDATA", e[e.Comment = 5] = "Comment", e))(dc || {});
|
|
10053
10056
|
function ko(e) {
|
|
10054
10057
|
return "__ln" in e;
|
|
10055
10058
|
}
|
|
10056
|
-
class
|
|
10059
|
+
class Ef {
|
|
10057
10060
|
constructor() {
|
|
10058
10061
|
S(this, "length", 0), S(this, "head", null), S(this, "tail", null);
|
|
10059
10062
|
}
|
|
@@ -10087,14 +10090,14 @@ class Kf {
|
|
|
10087
10090
|
}
|
|
10088
10091
|
}
|
|
10089
10092
|
const wo = (e, t) => `${e}@${t}`;
|
|
10090
|
-
class
|
|
10093
|
+
class Hf {
|
|
10091
10094
|
constructor() {
|
|
10092
10095
|
S(this, "frozen", !1), S(this, "locked", !1), S(this, "texts", []), S(this, "attributes", []), S(this, "attributeMap", /* @__PURE__ */ new WeakMap()), S(this, "removes", []), S(this, "mapRemoves", []), S(this, "movedMap", {}), S(this, "addedSet", /* @__PURE__ */ new Set()), S(this, "movedSet", /* @__PURE__ */ new Set()), S(this, "droppedSet", /* @__PURE__ */ new Set()), S(this, "removesSubTreeCache", /* @__PURE__ */ new Set()), S(this, "mutationCb"), S(this, "blockClass"), S(this, "blockSelector"), S(this, "maskTextClass"), S(this, "maskTextSelector"), S(this, "inlineStylesheet"), S(this, "maskInputOptions"), S(this, "maskTextFn"), S(this, "maskInputFn"), S(this, "keepIframeSrcFn"), S(this, "recordCanvas"), S(this, "inlineImages"), S(this, "inlineVideos"), S(this, "privacySetting"), S(this, "slimDOMOptions"), S(this, "dataURLOptions"), S(this, "doc"), S(this, "mirror"), S(this, "iframeManager"), S(this, "stylesheetManager"), S(this, "shadowDomManager"), S(this, "canvasManager"), S(this, "processedNodeManager"), S(this, "unattachedDoc"), S(this, "processMutations", (t) => {
|
|
10093
10096
|
t.forEach(this.processMutation), this.emit();
|
|
10094
10097
|
}), S(this, "emit", () => {
|
|
10095
10098
|
if (this.frozen || this.locked)
|
|
10096
10099
|
return;
|
|
10097
|
-
const t = [], i = /* @__PURE__ */ new Set(), s = new
|
|
10100
|
+
const t = [], i = /* @__PURE__ */ new Set(), s = new Ef(), n = (a) => {
|
|
10098
10101
|
let c = a, u = Ft;
|
|
10099
10102
|
for (; u === Ft; )
|
|
10100
10103
|
c = c && c.nextSibling, u = c && this.mirror.getId(c);
|
|
@@ -10328,11 +10331,11 @@ class Of {
|
|
|
10328
10331
|
}
|
|
10329
10332
|
t.addedNodes.forEach((i) => this.genAdds(i, t.target)), t.removedNodes.forEach((i) => {
|
|
10330
10333
|
const s = this.mirror.getId(i), n = vt(t.target) ? this.mirror.getId(E.host(t.target)) : this.mirror.getId(t.target);
|
|
10331
|
-
ue(t.target, this.blockClass, this.blockSelector, !1) || Ps(i, this.mirror, this.slimDOMOptions) || !
|
|
10334
|
+
ue(t.target, this.blockClass, this.blockSelector, !1) || Ps(i, this.mirror, this.slimDOMOptions) || !Uf(i, this.mirror) || (this.addedSet.has(i) ? (En(this.addedSet, i), this.droppedSet.add(i)) : this.addedSet.has(t.target) && s === -1 || oc(t.target, this.mirror) || (this.movedSet.has(i) && this.movedMap[wo(s, n)] ? En(this.movedSet, i) : (this.removes.push({
|
|
10332
10335
|
parentId: n,
|
|
10333
10336
|
id: s,
|
|
10334
10337
|
isShadow: vt(t.target) && xt(t.target) ? !0 : void 0
|
|
10335
|
-
}),
|
|
10338
|
+
}), zf(i, this.removesSubTreeCache))), this.mapRemoves.push(i));
|
|
10336
10339
|
});
|
|
10337
10340
|
break;
|
|
10338
10341
|
}
|
|
@@ -10404,7 +10407,7 @@ class Of {
|
|
|
10404
10407
|
function En(e, t) {
|
|
10405
10408
|
e.delete(t), E.childNodes(t).forEach((i) => En(e, i));
|
|
10406
10409
|
}
|
|
10407
|
-
function
|
|
10410
|
+
function zf(e, t) {
|
|
10408
10411
|
const i = [e];
|
|
10409
10412
|
for (; i.length; ) {
|
|
10410
10413
|
const s = i.pop();
|
|
@@ -10412,9 +10415,9 @@ function Mf(e, t) {
|
|
|
10412
10415
|
}
|
|
10413
10416
|
}
|
|
10414
10417
|
function vo(e, t, i) {
|
|
10415
|
-
return e.size === 0 ? !1 :
|
|
10418
|
+
return e.size === 0 ? !1 : Pf(e, t);
|
|
10416
10419
|
}
|
|
10417
|
-
function
|
|
10420
|
+
function Pf(e, t, i) {
|
|
10418
10421
|
const s = E.parentNode(t);
|
|
10419
10422
|
return s ? e.has(s) : !1;
|
|
10420
10423
|
}
|
|
@@ -10426,10 +10429,10 @@ function hc(e, t) {
|
|
|
10426
10429
|
return i ? e.has(i) ? !0 : hc(e, i) : !1;
|
|
10427
10430
|
}
|
|
10428
10431
|
let Tt;
|
|
10429
|
-
function
|
|
10432
|
+
function Bf(e) {
|
|
10430
10433
|
Tt = e;
|
|
10431
10434
|
}
|
|
10432
|
-
function
|
|
10435
|
+
function Df() {
|
|
10433
10436
|
Tt = void 0;
|
|
10434
10437
|
}
|
|
10435
10438
|
const z = (e) => Tt ? (...t) => {
|
|
@@ -10454,7 +10457,7 @@ function qt(e) {
|
|
|
10454
10457
|
return e && e.target;
|
|
10455
10458
|
}
|
|
10456
10459
|
function pc(e, t) {
|
|
10457
|
-
const i = new
|
|
10460
|
+
const i = new Hf();
|
|
10458
10461
|
Be.push(i), i.init(e);
|
|
10459
10462
|
const s = new (tc())(
|
|
10460
10463
|
z(i.processMutations.bind(i))
|
|
@@ -10468,7 +10471,7 @@ function pc(e, t) {
|
|
|
10468
10471
|
subtree: !0
|
|
10469
10472
|
}), s;
|
|
10470
10473
|
}
|
|
10471
|
-
function
|
|
10474
|
+
function jf({
|
|
10472
10475
|
mousemoveCb: e,
|
|
10473
10476
|
sampling: t,
|
|
10474
10477
|
doc: i,
|
|
@@ -10517,7 +10520,7 @@ function Pf({
|
|
|
10517
10520
|
u.forEach((h) => h());
|
|
10518
10521
|
});
|
|
10519
10522
|
}
|
|
10520
|
-
function
|
|
10523
|
+
function Qf({
|
|
10521
10524
|
mouseInteractionCb: e,
|
|
10522
10525
|
doc: t,
|
|
10523
10526
|
mirror: i,
|
|
@@ -10533,7 +10536,7 @@ function Bf({
|
|
|
10533
10536
|
const c = (u) => (h) => {
|
|
10534
10537
|
const m = qt(h);
|
|
10535
10538
|
if (ue(m, s, n, !0) || // We ignore canvas elements for rage click detection because we cannot infer what inside the canvas is getting interacted with.
|
|
10536
|
-
|
|
10539
|
+
Yf(m))
|
|
10537
10540
|
return;
|
|
10538
10541
|
let p = null, b = u;
|
|
10539
10542
|
if ("pointerType" in h) {
|
|
@@ -10619,7 +10622,7 @@ function mc({
|
|
|
10619
10622
|
);
|
|
10620
10623
|
return pe("scroll", l, t);
|
|
10621
10624
|
}
|
|
10622
|
-
function
|
|
10625
|
+
function Af({ viewportResizeCb: e }, { win: t }) {
|
|
10623
10626
|
let i = -1, s = -1;
|
|
10624
10627
|
const n = z(
|
|
10625
10628
|
Dt(
|
|
@@ -10635,8 +10638,8 @@ function Df({ viewportResizeCb: e }, { win: t }) {
|
|
|
10635
10638
|
);
|
|
10636
10639
|
return pe("resize", n, t);
|
|
10637
10640
|
}
|
|
10638
|
-
const
|
|
10639
|
-
function
|
|
10641
|
+
const _f = ["INPUT", "TEXTAREA", "SELECT"], To = /* @__PURE__ */ new WeakMap();
|
|
10642
|
+
function $f({
|
|
10640
10643
|
inputCb: e,
|
|
10641
10644
|
doc: t,
|
|
10642
10645
|
mirror: i,
|
|
@@ -10652,7 +10655,7 @@ function Qf({
|
|
|
10652
10655
|
function h(Z) {
|
|
10653
10656
|
let X = qt(Z);
|
|
10654
10657
|
const R = Z.isTrusted, W = X && X.tagName;
|
|
10655
|
-
if (X && W === "OPTION" && (X = E.parentElement(X)), !X || !W ||
|
|
10658
|
+
if (X && W === "OPTION" && (X = E.parentElement(X)), !X || !W || _f.indexOf(W) < 0 || ue(X, s, n, !0) || X.classList.contains(r) || l && X.matches(l))
|
|
10656
10659
|
return;
|
|
10657
10660
|
let G = X.value, w = !1;
|
|
10658
10661
|
const v = ji(X) || "", K = X.getAttribute("data-hl-record");
|
|
@@ -10758,7 +10761,7 @@ function Oe(e, t, i) {
|
|
|
10758
10761
|
id: s
|
|
10759
10762
|
}) : {};
|
|
10760
10763
|
}
|
|
10761
|
-
function
|
|
10764
|
+
function qf({ styleSheetRuleCb: e, mirror: t, stylesheetManager: i }, { win: s }) {
|
|
10762
10765
|
if (!s.CSSStyleSheet || !s.CSSStyleSheet.prototype)
|
|
10763
10766
|
return () => {
|
|
10764
10767
|
};
|
|
@@ -10938,7 +10941,7 @@ function bc({
|
|
|
10938
10941
|
});
|
|
10939
10942
|
}));
|
|
10940
10943
|
}
|
|
10941
|
-
function
|
|
10944
|
+
function ey({
|
|
10942
10945
|
styleDeclarationCb: e,
|
|
10943
10946
|
mirror: t,
|
|
10944
10947
|
ignoreCSSAttributes: i,
|
|
@@ -10999,7 +11002,7 @@ function _f({
|
|
|
10999
11002
|
n.CSSStyleDeclaration.prototype.setProperty = r, n.CSSStyleDeclaration.prototype.removeProperty = l;
|
|
11000
11003
|
});
|
|
11001
11004
|
}
|
|
11002
|
-
function
|
|
11005
|
+
function ty({
|
|
11003
11006
|
mediaInteractionCb: e,
|
|
11004
11007
|
blockClass: t,
|
|
11005
11008
|
blockSelector: i,
|
|
@@ -11037,7 +11040,7 @@ function $f({
|
|
|
11037
11040
|
o.forEach((a) => a());
|
|
11038
11041
|
});
|
|
11039
11042
|
}
|
|
11040
|
-
function
|
|
11043
|
+
function iy({ fontCb: e, doc: t }) {
|
|
11041
11044
|
const i = t.defaultView;
|
|
11042
11045
|
if (!i)
|
|
11043
11046
|
return () => {
|
|
@@ -11073,7 +11076,7 @@ function qf({ fontCb: e, doc: t }) {
|
|
|
11073
11076
|
s.forEach((o) => o());
|
|
11074
11077
|
});
|
|
11075
11078
|
}
|
|
11076
|
-
function
|
|
11079
|
+
function sy(e) {
|
|
11077
11080
|
const { doc: t, mirror: i, blockClass: s, blockSelector: n, selectionCb: r } = e;
|
|
11078
11081
|
let l = !0;
|
|
11079
11082
|
const o = z(() => {
|
|
@@ -11094,7 +11097,7 @@ function ey(e) {
|
|
|
11094
11097
|
});
|
|
11095
11098
|
return o(), pe("selectionchange", o);
|
|
11096
11099
|
}
|
|
11097
|
-
function
|
|
11100
|
+
function ny({
|
|
11098
11101
|
doc: e,
|
|
11099
11102
|
customElementCb: t
|
|
11100
11103
|
}) {
|
|
@@ -11119,7 +11122,7 @@ function ty({
|
|
|
11119
11122
|
}
|
|
11120
11123
|
);
|
|
11121
11124
|
}
|
|
11122
|
-
function
|
|
11125
|
+
function ry(e, t) {
|
|
11123
11126
|
const {
|
|
11124
11127
|
mutationCb: i,
|
|
11125
11128
|
mousemoveCb: s,
|
|
@@ -11163,26 +11166,26 @@ function iy(e, t) {
|
|
|
11163
11166
|
t.customElement && t.customElement(...d), b(...d);
|
|
11164
11167
|
};
|
|
11165
11168
|
}
|
|
11166
|
-
function
|
|
11169
|
+
function oy(e, t = {}) {
|
|
11167
11170
|
const i = e.doc.defaultView;
|
|
11168
11171
|
if (!i)
|
|
11169
11172
|
return () => {
|
|
11170
11173
|
};
|
|
11171
|
-
|
|
11174
|
+
ry(e, t);
|
|
11172
11175
|
let s;
|
|
11173
11176
|
e.recordDOM && (s = pc(e, e.doc));
|
|
11174
|
-
const n =
|
|
11177
|
+
const n = jf(e), r = Qf(e), l = mc(e), o = Af(e, {
|
|
11175
11178
|
win: i
|
|
11176
|
-
}), a =
|
|
11179
|
+
}), a = $f(e), c = ty(e);
|
|
11177
11180
|
let u = () => {
|
|
11178
11181
|
}, h = () => {
|
|
11179
11182
|
}, m = () => {
|
|
11180
11183
|
}, p = () => {
|
|
11181
11184
|
};
|
|
11182
|
-
e.recordDOM && (u =
|
|
11185
|
+
e.recordDOM && (u = qf(e, { win: i }), h = bc(e, e.doc), m = ey(e, {
|
|
11183
11186
|
win: i
|
|
11184
|
-
}), e.collectFonts && (p =
|
|
11185
|
-
const b =
|
|
11187
|
+
}), e.collectFonts && (p = iy(e)));
|
|
11188
|
+
const b = sy(e), d = ny(e), I = [];
|
|
11186
11189
|
for (const Z of e.plugins)
|
|
11187
11190
|
I.push(
|
|
11188
11191
|
Z.observer(Z.callback, i, Z.options)
|
|
@@ -11238,7 +11241,7 @@ class No {
|
|
|
11238
11241
|
return i || (i = /* @__PURE__ */ new Map(), this.iframeRemoteIdToIdMap.set(t, i)), i;
|
|
11239
11242
|
}
|
|
11240
11243
|
}
|
|
11241
|
-
class
|
|
11244
|
+
class ly {
|
|
11242
11245
|
constructor(t) {
|
|
11243
11246
|
S(this, "iframes", /* @__PURE__ */ new WeakMap()), S(this, "crossOriginIframeMap", /* @__PURE__ */ new WeakMap()), S(this, "crossOriginIframeMirror", new No(vl)), S(this, "crossOriginIframeStyleMirror"), S(this, "crossOriginIframeRootIdMap", /* @__PURE__ */ new WeakMap()), S(this, "mirror"), S(this, "mutationCb"), S(this, "wrappedEmit"), S(this, "loadListener"), S(this, "stylesheetManager"), S(this, "recordCrossOriginIframes"), this.mutationCb = t.mutationCb, this.wrappedEmit = t.wrappedEmit, this.stylesheetManager = t.stylesheetManager, this.recordCrossOriginIframes = t.recordCrossOriginIframes, this.crossOriginIframeStyleMirror = new No(
|
|
11244
11247
|
this.stylesheetManager.styleMirror.generateId.bind(
|
|
@@ -11403,7 +11406,7 @@ class ny {
|
|
|
11403
11406
|
});
|
|
11404
11407
|
}
|
|
11405
11408
|
}
|
|
11406
|
-
class
|
|
11409
|
+
class ay {
|
|
11407
11410
|
constructor(t) {
|
|
11408
11411
|
S(this, "shadowDoms", /* @__PURE__ */ new WeakSet()), S(this, "mutationCb"), S(this, "scrollCb"), S(this, "bypassOptions"), S(this, "mirror"), S(this, "restoreHandlers", []), this.mutationCb = t.mutationCb, this.scrollCb = t.scrollCb, this.bypassOptions = t.bypassOptions, this.mirror = t.mirror, this.init();
|
|
11409
11412
|
}
|
|
@@ -11481,24 +11484,24 @@ class ry {
|
|
|
11481
11484
|
}), this.restoreHandlers = [], this.shadowDoms = /* @__PURE__ */ new WeakSet();
|
|
11482
11485
|
}
|
|
11483
11486
|
}
|
|
11484
|
-
var st = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
|
|
11487
|
+
var st = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", cy = typeof Uint8Array > "u" ? [] : new Uint8Array(256);
|
|
11485
11488
|
for (var Ri = 0; Ri < st.length; Ri++)
|
|
11486
|
-
|
|
11487
|
-
var
|
|
11489
|
+
cy[st.charCodeAt(Ri)] = Ri;
|
|
11490
|
+
var uy = function(e) {
|
|
11488
11491
|
var t = new Uint8Array(e), i, s = t.length, n = "";
|
|
11489
11492
|
for (i = 0; i < s; i += 3)
|
|
11490
11493
|
n += st[t[i] >> 2], n += st[(t[i] & 3) << 4 | t[i + 1] >> 4], n += st[(t[i + 1] & 15) << 2 | t[i + 2] >> 6], n += st[t[i + 2] & 63];
|
|
11491
11494
|
return s % 3 === 2 ? n = n.substring(0, n.length - 1) + "=" : s % 3 === 1 && (n = n.substring(0, n.length - 2) + "=="), n;
|
|
11492
11495
|
};
|
|
11493
11496
|
const Jo = /* @__PURE__ */ new Map();
|
|
11494
|
-
function
|
|
11497
|
+
function dy(e, t) {
|
|
11495
11498
|
let i = Jo.get(e);
|
|
11496
11499
|
return i || (i = /* @__PURE__ */ new Map(), Jo.set(e, i)), i.has(t) || i.set(t, []), i.get(t);
|
|
11497
11500
|
}
|
|
11498
11501
|
const fc = (e, t, i) => {
|
|
11499
11502
|
if (!e || !(gc(e, t) || typeof e == "object"))
|
|
11500
11503
|
return;
|
|
11501
|
-
const s = e.constructor.name, n =
|
|
11504
|
+
const s = e.constructor.name, n = dy(i, s);
|
|
11502
11505
|
let r = n.indexOf(e);
|
|
11503
11506
|
return r === -1 && (r = n.length, n.push(e)), r;
|
|
11504
11507
|
};
|
|
@@ -11518,7 +11521,7 @@ function Fi(e, t, i) {
|
|
|
11518
11521
|
// value instanceof SharedArrayBuffer ||
|
|
11519
11522
|
e instanceof ArrayBuffer
|
|
11520
11523
|
) {
|
|
11521
|
-
const s = e.constructor.name, n =
|
|
11524
|
+
const s = e.constructor.name, n = uy(e);
|
|
11522
11525
|
return {
|
|
11523
11526
|
rr_type: s,
|
|
11524
11527
|
base64: n
|
|
@@ -11580,7 +11583,7 @@ const yc = (e, t, i) => e.map((s) => Fi(s, t, i)), gc = (e, t) => !![
|
|
|
11580
11583
|
).find(
|
|
11581
11584
|
(i) => e instanceof t[i]
|
|
11582
11585
|
);
|
|
11583
|
-
function
|
|
11586
|
+
function hy(e, t, i, s) {
|
|
11584
11587
|
const n = [], r = Object.getOwnPropertyNames(
|
|
11585
11588
|
t.CanvasRenderingContext2D.prototype
|
|
11586
11589
|
);
|
|
@@ -11626,7 +11629,7 @@ function cy(e, t, i, s) {
|
|
|
11626
11629
|
n.forEach((l) => l());
|
|
11627
11630
|
};
|
|
11628
11631
|
}
|
|
11629
|
-
function
|
|
11632
|
+
function py(e) {
|
|
11630
11633
|
return e === "experimental-webgl" ? "webgl" : e;
|
|
11631
11634
|
}
|
|
11632
11635
|
function Lo(e, t, i, s) {
|
|
@@ -11638,7 +11641,7 @@ function Lo(e, t, i, s) {
|
|
|
11638
11641
|
function(l) {
|
|
11639
11642
|
return function(o, ...a) {
|
|
11640
11643
|
if (!ue(this, t, i, !0)) {
|
|
11641
|
-
const c =
|
|
11644
|
+
const c = py(o);
|
|
11642
11645
|
if ("__context" in this || (this.__context = c), s && ["webgl", "webgl2"].includes(c))
|
|
11643
11646
|
if (a[0] && typeof a[0] == "object") {
|
|
11644
11647
|
const u = a[0];
|
|
@@ -11714,7 +11717,7 @@ function Yo(e, t, i, s, n, r) {
|
|
|
11714
11717
|
}
|
|
11715
11718
|
return l;
|
|
11716
11719
|
}
|
|
11717
|
-
function
|
|
11720
|
+
function my(e, t, i, s) {
|
|
11718
11721
|
const n = [];
|
|
11719
11722
|
return n.push(
|
|
11720
11723
|
...Yo(
|
|
@@ -11738,8 +11741,8 @@ function dy(e, t, i, s) {
|
|
|
11738
11741
|
n.forEach((r) => r());
|
|
11739
11742
|
};
|
|
11740
11743
|
}
|
|
11741
|
-
const Zc = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIGxldCBsb2dEZWJ1ZyA9IGZhbHNlOwogIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHsKICAgIGlmIChsb2dEZWJ1ZykgewogICAgICBjb25zb2xlLmRlYnVnKC4uLmFyZ3MpOwogICAgfQogIH07CiAgd29ya2VyLm9ubWVzc2FnZSA9IGFzeW5jIGZ1bmN0aW9uKGUpIHsKICAgIGxvZ0RlYnVnID0gISFlLmRhdGEubG9nRGVidWc7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGR4LCBkeSwgZHcsIGRoLCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOwogICAgICBjb25zdCB0cmFuc3BhcmVudEJhc2U2NCA9IGdldFRyYW5zcGFyZW50QmxvYkZvcigKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgZGF0YVVSTE9wdGlvbnMKICAgICAgKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgYXdhaXQgdHJhbnNwYXJlbnRCYXNlNjQgPT09IGJhc2U2NCkgewogICAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBpcyB0cmFuc3BhcmVudCIsIHsKICAgICAgICAgIGlkLAogICAgICAgICAgYmFzZTY0CiAgICAgICAgfSk7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCwgc3RhdHVzOiAidHJhbnNwYXJlbnQiIH0pOwogICAgICB9CiAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpIHsKICAgICAgICBkZWJ1ZygiW2hpZ2hsaWdodC13b3JrZXJdIGNhbnZhcyBiaXRtYXAgaXMgdW5jaGFuZ2VkIiwgewogICAgICAgICAgaWQsCiAgICAgICAgICBiYXNlNjQKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBtc2cgPSB7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGR4LAogICAgICAgIGR5LAogICAgICAgIGR3LAogICAgICAgIGRoCiAgICAgIH07CiAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBwcm9jZXNzZWQiLCBtc2cpOwogICAgICB3b3JrZXIucG9zdE1lc3NhZ2UobXNnKTsKICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgfSBlbHNlIHsKICAgICAgZGVidWcoIltoaWdobGlnaHQtd29ya2VyXSBubyBvZmZzY3JlZW5jYW52YXMgc3VwcG9ydCIsIHsKICAgICAgICBpZDogZS5kYXRhLmlkCiAgICAgIH0pOwogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCwgc3RhdHVzOiAidW5zdXBwb3J0ZWQiIH0pOwogICAgfQogIH07Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWltYWdlLWJpdG1hcC1kYXRhLXVybC13b3JrZXItRHd0SzhBMHouanMubWFwCg==",
|
|
11742
|
-
function
|
|
11744
|
+
const Zc = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIGxldCBsb2dEZWJ1ZyA9IGZhbHNlOwogIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHsKICAgIGlmIChsb2dEZWJ1ZykgewogICAgICBjb25zb2xlLmRlYnVnKC4uLmFyZ3MpOwogICAgfQogIH07CiAgd29ya2VyLm9ubWVzc2FnZSA9IGFzeW5jIGZ1bmN0aW9uKGUpIHsKICAgIGxvZ0RlYnVnID0gISFlLmRhdGEubG9nRGVidWc7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGR4LCBkeSwgZHcsIGRoLCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOwogICAgICBjb25zdCB0cmFuc3BhcmVudEJhc2U2NCA9IGdldFRyYW5zcGFyZW50QmxvYkZvcigKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgZGF0YVVSTE9wdGlvbnMKICAgICAgKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgYXdhaXQgdHJhbnNwYXJlbnRCYXNlNjQgPT09IGJhc2U2NCkgewogICAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBpcyB0cmFuc3BhcmVudCIsIHsKICAgICAgICAgIGlkLAogICAgICAgICAgYmFzZTY0CiAgICAgICAgfSk7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCwgc3RhdHVzOiAidHJhbnNwYXJlbnQiIH0pOwogICAgICB9CiAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpIHsKICAgICAgICBkZWJ1ZygiW2hpZ2hsaWdodC13b3JrZXJdIGNhbnZhcyBiaXRtYXAgaXMgdW5jaGFuZ2VkIiwgewogICAgICAgICAgaWQsCiAgICAgICAgICBiYXNlNjQKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBtc2cgPSB7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGR4LAogICAgICAgIGR5LAogICAgICAgIGR3LAogICAgICAgIGRoCiAgICAgIH07CiAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBwcm9jZXNzZWQiLCBtc2cpOwogICAgICB3b3JrZXIucG9zdE1lc3NhZ2UobXNnKTsKICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgfSBlbHNlIHsKICAgICAgZGVidWcoIltoaWdobGlnaHQtd29ya2VyXSBubyBvZmZzY3JlZW5jYW52YXMgc3VwcG9ydCIsIHsKICAgICAgICBpZDogZS5kYXRhLmlkCiAgICAgIH0pOwogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCwgc3RhdHVzOiAidW5zdXBwb3J0ZWQiIH0pOwogICAgfQogIH07Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWltYWdlLWJpdG1hcC1kYXRhLXVybC13b3JrZXItRHd0SzhBMHouanMubWFwCg==", by = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), Uo = typeof self < "u" && self.Blob && new Blob([by(Zc)], { type: "text/javascript;charset=utf-8" });
|
|
11745
|
+
function fy(e) {
|
|
11743
11746
|
let t;
|
|
11744
11747
|
try {
|
|
11745
11748
|
if (t = Uo && (self.URL || self.webkitURL).createObjectURL(Uo), !t) throw "";
|
|
@@ -11760,7 +11763,7 @@ function py(e) {
|
|
|
11760
11763
|
t && (self.URL || self.webkitURL).revokeObjectURL(t);
|
|
11761
11764
|
}
|
|
11762
11765
|
}
|
|
11763
|
-
class
|
|
11766
|
+
class yy {
|
|
11764
11767
|
constructor(t) {
|
|
11765
11768
|
S(this, "pendingCanvasMutations", /* @__PURE__ */ new Map()), S(this, "rafStamps", { latestId: 0, invokeId: null }), S(this, "mirror"), S(this, "logger"), S(this, "worker"), S(this, "snapshotInProgressMap", /* @__PURE__ */ new Map()), S(this, "lastSnapshotTime", /* @__PURE__ */ new Map()), S(this, "options"), S(this, "mutationCb"), S(this, "resetObservers"), S(this, "frozen", !1), S(this, "locked", !1), S(this, "processMutation", (h, m) => {
|
|
11766
11769
|
(this.rafStamps.invokeId && this.rafStamps.latestId !== this.rafStamps.invokeId || !this.rafStamps.invokeId) && (this.rafStamps.invokeId = this.rafStamps.latestId), this.pendingCanvasMutations.has(h) || this.pendingCanvasMutations.set(h, []), this.pendingCanvasMutations.get(h).push(m);
|
|
@@ -11776,7 +11779,7 @@ class my {
|
|
|
11776
11779
|
initialSnapshotDelay: c,
|
|
11777
11780
|
dataURLOptions: u
|
|
11778
11781
|
} = t;
|
|
11779
|
-
this.mutationCb = t.mutationCb, this.mirror = t.mirror, this.logger = t.logger, this.worker = new
|
|
11782
|
+
this.mutationCb = t.mutationCb, this.mirror = t.mirror, this.logger = t.logger, this.worker = new fy(), this.worker.onmessage = (h) => {
|
|
11780
11783
|
const { id: m } = h.data;
|
|
11781
11784
|
if (this.snapshotInProgressMap.set(m, !1), !("base64" in h.data)) {
|
|
11782
11785
|
this.debug(null, "canvas worker received empty message", {
|
|
@@ -12053,12 +12056,12 @@ class my {
|
|
|
12053
12056
|
i,
|
|
12054
12057
|
s,
|
|
12055
12058
|
!1
|
|
12056
|
-
), r =
|
|
12059
|
+
), r = hy(
|
|
12057
12060
|
this.processMutation.bind(this),
|
|
12058
12061
|
t,
|
|
12059
12062
|
i,
|
|
12060
12063
|
s
|
|
12061
|
-
), l =
|
|
12064
|
+
), l = my(
|
|
12062
12065
|
this.processMutation.bind(this),
|
|
12063
12066
|
t,
|
|
12064
12067
|
i,
|
|
@@ -12094,9 +12097,9 @@ class my {
|
|
|
12094
12097
|
this.mutationCb({ id: i, type: r, commands: n }), this.pendingCanvasMutations.delete(t);
|
|
12095
12098
|
}
|
|
12096
12099
|
}
|
|
12097
|
-
class
|
|
12100
|
+
class gy {
|
|
12098
12101
|
constructor(t) {
|
|
12099
|
-
S(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()), S(this, "mutationCb"), S(this, "adoptedStyleSheetCb"), S(this, "styleMirror", new
|
|
12102
|
+
S(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()), S(this, "mutationCb"), S(this, "adoptedStyleSheetCb"), S(this, "styleMirror", new Kf()), this.mutationCb = t.mutationCb, this.adoptedStyleSheetCb = t.adoptedStyleSheetCb;
|
|
12100
12103
|
}
|
|
12101
12104
|
attachLinkElement(t, i) {
|
|
12102
12105
|
"_cssText" in i.attributes && this.mutationCb({
|
|
@@ -12139,7 +12142,7 @@ class by {
|
|
|
12139
12142
|
trackStylesheetInLinkElement(t) {
|
|
12140
12143
|
}
|
|
12141
12144
|
}
|
|
12142
|
-
class
|
|
12145
|
+
class Zy {
|
|
12143
12146
|
constructor() {
|
|
12144
12147
|
S(this, "nodeMap", /* @__PURE__ */ new WeakMap()), S(this, "active", !1);
|
|
12145
12148
|
}
|
|
@@ -12164,7 +12167,7 @@ try {
|
|
|
12164
12167
|
} catch (e) {
|
|
12165
12168
|
console.debug("Unable to override Array.from", e);
|
|
12166
12169
|
}
|
|
12167
|
-
const
|
|
12170
|
+
const We = ph();
|
|
12168
12171
|
function Le(e = {}) {
|
|
12169
12172
|
var t, i, s, n, r, l, o, a;
|
|
12170
12173
|
const {
|
|
@@ -12197,12 +12200,12 @@ function Le(e = {}) {
|
|
|
12197
12200
|
inlineVideos: U = !1,
|
|
12198
12201
|
plugins: $,
|
|
12199
12202
|
keepIframeSrcFn: ie = () => !1,
|
|
12200
|
-
privacySetting:
|
|
12203
|
+
privacySetting: Ge = "default",
|
|
12201
12204
|
ignoreCSSAttributes: Fe = /* @__PURE__ */ new Set([]),
|
|
12202
12205
|
errorHandler: Gc,
|
|
12203
12206
|
logger: Vc
|
|
12204
12207
|
} = e, ei = F(F({}, e.dataURLOptions), (i = (t = e.sampling) == null ? void 0 : t.canvas) == null ? void 0 : i.dataURLOptions);
|
|
12205
|
-
|
|
12208
|
+
Bf(Gc);
|
|
12206
12209
|
const ti = f ? window.parent === window : !0;
|
|
12207
12210
|
let ft = !1;
|
|
12208
12211
|
if (!ti)
|
|
@@ -12216,7 +12219,7 @@ function Le(e = {}) {
|
|
|
12216
12219
|
if (!ti && !ft)
|
|
12217
12220
|
return () => {
|
|
12218
12221
|
};
|
|
12219
|
-
Y !== void 0 && k.mousemove === void 0 && (k.mousemove = Y),
|
|
12222
|
+
Y !== void 0 && k.mousemove === void 0 && (k.mousemove = Y), We.reset();
|
|
12220
12223
|
const Vs = R === !0 ? {
|
|
12221
12224
|
color: !0,
|
|
12222
12225
|
date: !0,
|
|
@@ -12249,25 +12252,25 @@ function Le(e = {}) {
|
|
|
12249
12252
|
headMetaDescKeywords: G === "all",
|
|
12250
12253
|
headTitleMutations: G === "all"
|
|
12251
12254
|
} : G || {};
|
|
12252
|
-
|
|
12255
|
+
Ff();
|
|
12253
12256
|
let yr, Ws = 0;
|
|
12254
12257
|
const gr = (D) => {
|
|
12255
|
-
for (const
|
|
12256
|
-
|
|
12258
|
+
for (const Ve of $ || [])
|
|
12259
|
+
Ve.eventProcessor && (D = Ve.eventProcessor(D));
|
|
12257
12260
|
return V && // Disable packing events which will be emitted to parent frames.
|
|
12258
12261
|
!ft && (D = V(D)), D;
|
|
12259
12262
|
};
|
|
12260
|
-
re = (D,
|
|
12263
|
+
re = (D, Ve) => {
|
|
12261
12264
|
var se;
|
|
12262
12265
|
const ne = D;
|
|
12263
12266
|
if (ne.timestamp = os(), (se = Be[0]) != null && se.isFrozen() && ne.type !== P.FullSnapshot && !(ne.type === P.IncrementalSnapshot && ne.data.source === H.Mutation) && Be.forEach((ke) => ke.unfreeze()), ti)
|
|
12264
|
-
c?.(gr(ne),
|
|
12267
|
+
c?.(gr(ne), Ve);
|
|
12265
12268
|
else if (ft) {
|
|
12266
12269
|
const ke = {
|
|
12267
12270
|
type: "rrweb",
|
|
12268
12271
|
event: gr(ne),
|
|
12269
12272
|
origin: window.location.origin,
|
|
12270
|
-
isCheckout:
|
|
12273
|
+
isCheckout: Ve
|
|
12271
12274
|
};
|
|
12272
12275
|
window.parent.postMessage(ke, "*");
|
|
12273
12276
|
}
|
|
@@ -12303,11 +12306,11 @@ function Le(e = {}) {
|
|
|
12303
12306
|
data: F({
|
|
12304
12307
|
source: H.AdoptedStyleSheet
|
|
12305
12308
|
}, D)
|
|
12306
|
-
}), He = new
|
|
12309
|
+
}), He = new gy({
|
|
12307
12310
|
mutationCb: ii,
|
|
12308
12311
|
adoptedStyleSheetCb: Xc
|
|
12309
|
-
}), ze = new
|
|
12310
|
-
mirror:
|
|
12312
|
+
}), ze = new ly({
|
|
12313
|
+
mirror: We,
|
|
12311
12314
|
mutationCb: ii,
|
|
12312
12315
|
stylesheetManager: He,
|
|
12313
12316
|
recordCrossOriginIframes: f,
|
|
@@ -12315,12 +12318,12 @@ function Le(e = {}) {
|
|
|
12315
12318
|
});
|
|
12316
12319
|
for (const D of $ || [])
|
|
12317
12320
|
D.getMirror && D.getMirror({
|
|
12318
|
-
nodeMirror:
|
|
12321
|
+
nodeMirror: We,
|
|
12319
12322
|
crossOriginIframeMirror: ze.crossOriginIframeMirror,
|
|
12320
12323
|
crossOriginIframeStyleMirror: ze.crossOriginIframeStyleMirror
|
|
12321
12324
|
});
|
|
12322
|
-
const Cs = new
|
|
12323
|
-
Nt = new
|
|
12325
|
+
const Cs = new Zy();
|
|
12326
|
+
Nt = new yy({
|
|
12324
12327
|
recordCanvas: te,
|
|
12325
12328
|
recordLocalVideos: B,
|
|
12326
12329
|
recordRemoteVideos: U,
|
|
@@ -12328,7 +12331,7 @@ function Le(e = {}) {
|
|
|
12328
12331
|
win: window,
|
|
12329
12332
|
blockClass: m,
|
|
12330
12333
|
blockSelector: p,
|
|
12331
|
-
mirror:
|
|
12334
|
+
mirror: We,
|
|
12332
12335
|
sampling: (s = k?.canvas) == null ? void 0 : s.fps,
|
|
12333
12336
|
samplingManual: (n = k?.canvas) == null ? void 0 : n.fpsManual,
|
|
12334
12337
|
clearWebGLBuffer: (r = k?.canvas) == null ? void 0 : r.clearWebGLBuffer,
|
|
@@ -12338,7 +12341,7 @@ function Le(e = {}) {
|
|
|
12338
12341
|
maxSnapshotDimension: (a = k?.canvas) == null ? void 0 : a.maxSnapshotDimension,
|
|
12339
12342
|
logger: Vc
|
|
12340
12343
|
});
|
|
12341
|
-
const si = new
|
|
12344
|
+
const si = new ay({
|
|
12342
12345
|
mutationCb: ii,
|
|
12343
12346
|
scrollCb: Zr,
|
|
12344
12347
|
bypassOptions: {
|
|
@@ -12354,7 +12357,7 @@ function Le(e = {}) {
|
|
|
12354
12357
|
recordCanvas: te,
|
|
12355
12358
|
inlineImages: B,
|
|
12356
12359
|
inlineVideos: U,
|
|
12357
|
-
privacySetting:
|
|
12360
|
+
privacySetting: Ge,
|
|
12358
12361
|
sampling: k,
|
|
12359
12362
|
slimDOMOptions: Xs,
|
|
12360
12363
|
iframeManager: ze,
|
|
@@ -12363,7 +12366,7 @@ function Le(e = {}) {
|
|
|
12363
12366
|
keepIframeSrcFn: ie,
|
|
12364
12367
|
processedNodeManager: Cs
|
|
12365
12368
|
},
|
|
12366
|
-
mirror:
|
|
12369
|
+
mirror: We
|
|
12367
12370
|
});
|
|
12368
12371
|
Ki = (D = !1) => {
|
|
12369
12372
|
if (!ee)
|
|
@@ -12379,8 +12382,8 @@ function Le(e = {}) {
|
|
|
12379
12382
|
},
|
|
12380
12383
|
D
|
|
12381
12384
|
), He.reset(), si.init(), Be.forEach((se) => se.lock());
|
|
12382
|
-
const
|
|
12383
|
-
mirror:
|
|
12385
|
+
const Ve = zh(document, {
|
|
12386
|
+
mirror: We,
|
|
12384
12387
|
blockClass: m,
|
|
12385
12388
|
blockSelector: p,
|
|
12386
12389
|
maskTextClass: I,
|
|
@@ -12394,9 +12397,9 @@ function Le(e = {}) {
|
|
|
12394
12397
|
recordCanvas: te,
|
|
12395
12398
|
inlineImages: B,
|
|
12396
12399
|
inlineVideos: U,
|
|
12397
|
-
privacySetting:
|
|
12400
|
+
privacySetting: Ge,
|
|
12398
12401
|
onSerialize: (se) => {
|
|
12399
|
-
lc(se,
|
|
12402
|
+
lc(se, We) && ze.addIframe(se), ac(se, We) && He.trackLinkElement(se), Mn(se) && si.addShadowRoot(E.shadowRoot(se), document);
|
|
12400
12403
|
},
|
|
12401
12404
|
onIframeLoad: (se, ne) => {
|
|
12402
12405
|
ze.attachIframe(se, ne), si.observeAttachShadow(se);
|
|
@@ -12406,26 +12409,26 @@ function Le(e = {}) {
|
|
|
12406
12409
|
},
|
|
12407
12410
|
keepIframeSrcFn: ie
|
|
12408
12411
|
});
|
|
12409
|
-
if (!
|
|
12412
|
+
if (!Ve)
|
|
12410
12413
|
return console.warn("Failed to snapshot the document");
|
|
12411
12414
|
re(
|
|
12412
12415
|
{
|
|
12413
12416
|
type: P.FullSnapshot,
|
|
12414
12417
|
data: {
|
|
12415
|
-
node:
|
|
12418
|
+
node: Ve,
|
|
12416
12419
|
initialOffset: ic(window)
|
|
12417
12420
|
}
|
|
12418
12421
|
},
|
|
12419
12422
|
D
|
|
12420
12423
|
), Be.forEach((se) => se.unlock()), document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0 && He.adoptStyleSheets(
|
|
12421
12424
|
document.adoptedStyleSheets,
|
|
12422
|
-
|
|
12425
|
+
We.getId(document)
|
|
12423
12426
|
);
|
|
12424
12427
|
};
|
|
12425
12428
|
try {
|
|
12426
|
-
const D = [],
|
|
12429
|
+
const D = [], Ve = (ne) => {
|
|
12427
12430
|
var ke;
|
|
12428
|
-
return z(
|
|
12431
|
+
return z(oy)(
|
|
12429
12432
|
{
|
|
12430
12433
|
mutationCb: ii,
|
|
12431
12434
|
mousemoveCb: (A, Rs) => re({
|
|
@@ -12516,14 +12519,14 @@ function Le(e = {}) {
|
|
|
12516
12519
|
blockSelector: p,
|
|
12517
12520
|
slimDOMOptions: Xs,
|
|
12518
12521
|
dataURLOptions: ei,
|
|
12519
|
-
mirror:
|
|
12522
|
+
mirror: We,
|
|
12520
12523
|
iframeManager: ze,
|
|
12521
12524
|
stylesheetManager: He,
|
|
12522
12525
|
shadowDomManager: si,
|
|
12523
12526
|
processedNodeManager: Cs,
|
|
12524
12527
|
canvasManager: Nt,
|
|
12525
12528
|
ignoreCSSAttributes: Fe,
|
|
12526
|
-
privacySetting:
|
|
12529
|
+
privacySetting: Ge,
|
|
12527
12530
|
plugins: ((ke = $?.filter((A) => A.observer)) == null ? void 0 : ke.map((A) => ({
|
|
12528
12531
|
observer: A.observer,
|
|
12529
12532
|
options: A.options,
|
|
@@ -12541,13 +12544,13 @@ function Le(e = {}) {
|
|
|
12541
12544
|
};
|
|
12542
12545
|
ze.addLoadListener((ne) => {
|
|
12543
12546
|
try {
|
|
12544
|
-
D.push(
|
|
12547
|
+
D.push(Ve(ne.contentDocument));
|
|
12545
12548
|
} catch (ke) {
|
|
12546
12549
|
console.warn(ke);
|
|
12547
12550
|
}
|
|
12548
12551
|
});
|
|
12549
12552
|
const se = () => {
|
|
12550
|
-
Ki(), D.push(
|
|
12553
|
+
Ki(), D.push(Ve(document)), as = !0;
|
|
12551
12554
|
};
|
|
12552
12555
|
return document.readyState === "interactive" || document.readyState === "complete" ? se() : (D.push(
|
|
12553
12556
|
pe("DOMContentLoaded", () => {
|
|
@@ -12568,7 +12571,7 @@ function Le(e = {}) {
|
|
|
12568
12571
|
window
|
|
12569
12572
|
)
|
|
12570
12573
|
)), () => {
|
|
12571
|
-
D.forEach((ne) => ne()), Cs.destroy(), as = !1,
|
|
12574
|
+
D.forEach((ne) => ne()), Cs.destroy(), as = !1, Df();
|
|
12572
12575
|
};
|
|
12573
12576
|
} catch (D) {
|
|
12574
12577
|
console.warn(D);
|
|
@@ -12596,12 +12599,12 @@ Le.snapshotCanvas = (e) => fe(void 0, null, function* () {
|
|
|
12596
12599
|
throw new Error("canvas manager is not initialized");
|
|
12597
12600
|
yield Nt.snapshot(e);
|
|
12598
12601
|
});
|
|
12599
|
-
Le.mirror =
|
|
12602
|
+
Le.mirror = We;
|
|
12600
12603
|
var Fo;
|
|
12601
12604
|
(function(e) {
|
|
12602
12605
|
e[e.NotStarted = 0] = "NotStarted", e[e.Running = 1] = "Running", e[e.Stopped = 2] = "Stopped";
|
|
12603
12606
|
})(Fo || (Fo = {}));
|
|
12604
|
-
const { addCustomEvent: Ko } = Le,
|
|
12607
|
+
const { addCustomEvent: Ko } = Le, Iy = (e) => {
|
|
12605
12608
|
e(window.location.href);
|
|
12606
12609
|
const t = history.pushState;
|
|
12607
12610
|
history.pushState = /* @__PURE__ */ ((r) => function() {
|
|
@@ -12623,7 +12626,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12623
12626
|
return window.addEventListener("locationchange", n), () => {
|
|
12624
12627
|
window.removeEventListener("popstate", s), window.removeEventListener("locationchange", n), history.pushState = t, history.replaceState = i;
|
|
12625
12628
|
};
|
|
12626
|
-
},
|
|
12629
|
+
}, Sy = (e) => {
|
|
12627
12630
|
switch (e) {
|
|
12628
12631
|
case "strict":
|
|
12629
12632
|
return [!0, void 0];
|
|
@@ -12632,7 +12635,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12632
12635
|
case "none":
|
|
12633
12636
|
return [!1, { password: !0 }];
|
|
12634
12637
|
}
|
|
12635
|
-
},
|
|
12638
|
+
}, Gy = (e) => {
|
|
12636
12639
|
const t = (i) => {
|
|
12637
12640
|
if (i.target) {
|
|
12638
12641
|
const s = i.target, n = Il(s);
|
|
@@ -12640,7 +12643,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12640
12643
|
}
|
|
12641
12644
|
};
|
|
12642
12645
|
return window.addEventListener("click", t), () => window.removeEventListener("click", t);
|
|
12643
|
-
},
|
|
12646
|
+
}, Vy = (e) => {
|
|
12644
12647
|
const t = (i) => {
|
|
12645
12648
|
if (i.target) {
|
|
12646
12649
|
const s = Il(i.target);
|
|
@@ -12648,7 +12651,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12648
12651
|
}
|
|
12649
12652
|
};
|
|
12650
12653
|
return window.addEventListener("focusin", t), () => window.removeEventListener("focusin", t);
|
|
12651
|
-
},
|
|
12654
|
+
}, Xy = (e) => {
|
|
12652
12655
|
let t, i;
|
|
12653
12656
|
if (typeof document.hidden < "u" ? (t = "hidden", i = "visibilitychange") : typeof document.msHidden < "u" ? (t = "msHidden", i = "msvisibilitychange") : typeof document.webkitHidden < "u" && (t = "webkitHidden", i = "webkitvisibilitychange"), i === void 0)
|
|
12654
12657
|
return () => {
|
|
@@ -12663,7 +12666,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12663
12666
|
document.addEventListener(i, n);
|
|
12664
12667
|
const r = i;
|
|
12665
12668
|
return () => document.removeEventListener(r, n);
|
|
12666
|
-
},
|
|
12669
|
+
}, Wy = (e) => {
|
|
12667
12670
|
e(window.location.href);
|
|
12668
12671
|
var t = XMLHttpRequest.prototype.send;
|
|
12669
12672
|
XMLHttpRequest.prototype.send = function(r) {
|
|
@@ -12710,13 +12713,13 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12710
12713
|
window.removeEventListener("storage", i), XMLHttpRequest.prototype.send = t;
|
|
12711
12714
|
};
|
|
12712
12715
|
}, Oo = () => {
|
|
12713
|
-
const e =
|
|
12716
|
+
const e = Se(
|
|
12714
12717
|
"ajs_user_id"
|
|
12715
12718
|
/* USER_ID */
|
|
12716
|
-
), t =
|
|
12719
|
+
), t = Se(
|
|
12717
12720
|
"ajs_user_traits"
|
|
12718
12721
|
/* USER_TRAITS */
|
|
12719
|
-
), i =
|
|
12722
|
+
), i = Se(
|
|
12720
12723
|
"ajs_anonymous_id"
|
|
12721
12724
|
/* ANONYMOUS_ID */
|
|
12722
12725
|
);
|
|
@@ -12734,21 +12737,21 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12734
12737
|
} catch {
|
|
12735
12738
|
return !1;
|
|
12736
12739
|
}
|
|
12737
|
-
const i =
|
|
12740
|
+
const i = Cy(t), s = Se(
|
|
12738
12741
|
ye.SEGMENT_LAST_SENT_HASH_KEY
|
|
12739
12742
|
);
|
|
12740
12743
|
return s === void 0 || i !== s ? (Je(ye.SEGMENT_LAST_SENT_HASH_KEY, i), !0) : !1;
|
|
12741
|
-
},
|
|
12744
|
+
}, Cy = (e) => {
|
|
12742
12745
|
var t = 0, i = e.length, s = 0;
|
|
12743
12746
|
if (i > 0) for (; s < i; ) t = (t << 5) - t + e.charCodeAt(s++) | 0;
|
|
12744
12747
|
return t.toString();
|
|
12745
|
-
},
|
|
12746
|
-
const i =
|
|
12748
|
+
}, Ry = (e, t) => {
|
|
12749
|
+
const i = ky(e);
|
|
12747
12750
|
let s = [];
|
|
12748
12751
|
const n = !1, r = !0;
|
|
12749
12752
|
for (let l = 0; l < i.length; l++) {
|
|
12750
12753
|
let o = i[l].split("+");
|
|
12751
|
-
s = [], o.length > 1 && (s =
|
|
12754
|
+
s = [], o.length > 1 && (s = xy(Ic, o)), o = o[o.length - 1], o = o === "*" ? "*" : vy(o), o in xe || (xe[o] = []), xe[o].push({
|
|
12752
12755
|
mods: s,
|
|
12753
12756
|
shortcut: i[l],
|
|
12754
12757
|
key: i[l],
|
|
@@ -12759,12 +12762,12 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
|
|
|
12759
12762
|
splitKey: "+"
|
|
12760
12763
|
});
|
|
12761
12764
|
}
|
|
12762
|
-
|
|
12763
|
-
|
|
12765
|
+
Ty(document, "keydown", (l) => {
|
|
12766
|
+
Jy(l);
|
|
12764
12767
|
});
|
|
12765
12768
|
};
|
|
12766
12769
|
let de = [];
|
|
12767
|
-
function
|
|
12770
|
+
function ky(e) {
|
|
12768
12771
|
typeof e != "string" && (e = ""), e = e.replace(/\s/g, "");
|
|
12769
12772
|
const t = e.split(",");
|
|
12770
12773
|
let i = t.lastIndexOf("");
|
|
@@ -12772,7 +12775,7 @@ function Wy(e) {
|
|
|
12772
12775
|
t[i - 1] += ",", t.splice(i, 1), i = t.lastIndexOf("");
|
|
12773
12776
|
return t;
|
|
12774
12777
|
}
|
|
12775
|
-
const xe = {}, Ds = typeof navigator < "u" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1,
|
|
12778
|
+
const xe = {}, Ds = typeof navigator < "u" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1, wy = {
|
|
12776
12779
|
backspace: 8,
|
|
12777
12780
|
tab: 9,
|
|
12778
12781
|
clear: 12,
|
|
@@ -12852,23 +12855,23 @@ const xe = {}, Ds = typeof navigator < "u" ? navigator.userAgent.toLowerCase().i
|
|
|
12852
12855
|
"⌘": 91,
|
|
12853
12856
|
cmd: 91,
|
|
12854
12857
|
command: 91
|
|
12855
|
-
},
|
|
12858
|
+
}, vy = (e) => (
|
|
12856
12859
|
// @ts-expect-error
|
|
12857
|
-
|
|
12860
|
+
wy[e.toLowerCase()] || // @ts-expect-error
|
|
12858
12861
|
Ic[e.toLowerCase()] || e.toUpperCase().charCodeAt(0)
|
|
12859
12862
|
);
|
|
12860
|
-
function
|
|
12863
|
+
function xy(e, t) {
|
|
12861
12864
|
const i = t.slice(0, t.length - 1);
|
|
12862
12865
|
for (let s = 0; s < i.length; s++)
|
|
12863
12866
|
i[s] = e[i[s].toLowerCase()];
|
|
12864
12867
|
return i;
|
|
12865
12868
|
}
|
|
12866
|
-
function
|
|
12869
|
+
function Ty(e, t, i) {
|
|
12867
12870
|
e.addEventListener ? e.addEventListener(t, i, !1) : e.attachEvent && e.attachEvent(`on${t}`, () => {
|
|
12868
12871
|
i(window.event);
|
|
12869
12872
|
});
|
|
12870
12873
|
}
|
|
12871
|
-
function
|
|
12874
|
+
function Ny(e, t, i) {
|
|
12872
12875
|
let s;
|
|
12873
12876
|
if (t.scope === i || t.scope === "all") {
|
|
12874
12877
|
s = t.mods.length > 0;
|
|
@@ -12879,7 +12882,7 @@ function vy(e, t, i) {
|
|
|
12879
12882
|
(t.mods.length === 0 && !he[16] && !he[18] && !he[17] && !he[91] || s || t.shortcut === "*") && t.method(e, t) === !1 && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.stopPropagation && e.stopPropagation(), e.cancelBubble && (e.cancelBubble = !0));
|
|
12880
12883
|
}
|
|
12881
12884
|
}
|
|
12882
|
-
function
|
|
12885
|
+
function Jy(e) {
|
|
12883
12886
|
const t = xe["*"];
|
|
12884
12887
|
let i = e.keyCode || e.which || e.charCode;
|
|
12885
12888
|
if ((i === 93 || i === 224) && (i = 91), de.indexOf(i) === -1 && i !== 229 && de.push(i), ["ctrlKey", "altKey", "shiftKey", "metaKey"].forEach((s) => {
|
|
@@ -12896,26 +12899,26 @@ function xy(e) {
|
|
|
12896
12899
|
e.type === "keyup" && xe[i][s].keyup) && xe[i][s].key
|
|
12897
12900
|
) {
|
|
12898
12901
|
const n = xe[i][s];
|
|
12899
|
-
|
|
12902
|
+
Ny(e, n, "all");
|
|
12900
12903
|
}
|
|
12901
12904
|
}
|
|
12902
12905
|
}
|
|
12903
12906
|
}
|
|
12904
|
-
const Eo = "iframe parent ready", Ho = "iframe ok", jt = "highlightLogs",
|
|
12905
|
-
let t =
|
|
12907
|
+
const Eo = "iframe parent ready", Ho = "iframe ok", jt = "highlightLogs", Ly = (e) => {
|
|
12908
|
+
let t = Se(jt) || "";
|
|
12906
12909
|
t = t + "[" + (/* @__PURE__ */ new Date()).getTime() + "] " + e + `
|
|
12907
12910
|
`, Je(jt, t);
|
|
12908
|
-
},
|
|
12911
|
+
}, Yy = () => Se(jt) || "", Uy = (e) => {
|
|
12909
12912
|
if (!e)
|
|
12910
12913
|
return;
|
|
12911
|
-
let t =
|
|
12912
|
-
t && (t.startsWith(e) ? (t = t.slice(e.length), Je(jt, t)) :
|
|
12914
|
+
let t = Se(jt) || "";
|
|
12915
|
+
t && (t.startsWith(e) ? (t = t.slice(e.length), Je(jt, t)) : Ly(
|
|
12913
12916
|
"Unable to clear logs " + e.replace(`
|
|
12914
12917
|
`, " ") + " from " + t.replace(`
|
|
12915
12918
|
`, " ")
|
|
12916
12919
|
));
|
|
12917
|
-
}, Sc = "dmFyIFZyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqcj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgcXI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIEJlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFF0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksWHQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgY3Q9KE0sRCxDKT0+RCBpbiBNP1ZyKE0sRCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Q30pOk1bRF09QyxQPShNLEQpPT57Zm9yKHZhciBDIGluIER8fChEPXt9KSlRdC5jYWxsKEQsQykmJmN0KE0sQyxEW0NdKTtpZihCZSlmb3IodmFyIEMgb2YgQmUoRCkpWHQuY2FsbChELEMpJiZjdChNLEMsRFtDXSk7cmV0dXJuIE19LFVlPShNLEQpPT5qcihNLHFyKEQpKTt2YXIgZ2U9KE0sRCk9Pnt2YXIgQz17fTtmb3IodmFyIEogaW4gTSlRdC5jYWxsKE0sSikmJkQuaW5kZXhPZihKKTwwJiYoQ1tKXT1NW0pdKTtpZihNIT1udWxsJiZCZSlmb3IodmFyIEogb2YgQmUoTSkpRC5pbmRleE9mKEopPDAmJlh0LmNhbGwoTSxKKSYmKENbSl09TVtKXSk7cmV0dXJuIEN9O3ZhciB1dD0oTSxELEMpPT5jdChNLHR5cGVvZiBEIT0ic3ltYm9sIj9EKyIiOkQsQyk7dmFyIFc9KE0sRCxDKT0+bmV3IFByb21pc2UoKEosY2UpPT57dmFyIHZlPWVlPT57dHJ5e3VlKEMubmV4dChlZSkpfWNhdGNoKEVlKXtjZShFZSl9fSxJZT1lZT0+e3RyeXt1ZShDLnRocm93KGVlKSl9Y2F0Y2goRWUpe2NlKEVlKX19LHVlPWVlPT5lZS5kb25lP0ooZWUudmFsdWUpOlByb21pc2UucmVzb2x2ZShlZS52YWx1ZSkudGhlbih2ZSxJZSk7dWUoKEM9Qy5hcHBseShNLEQpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE0oZSx0KXtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJnR5cGVvZiBuIT0ic3RyaW5nIiYmIUFycmF5LmlzQXJyYXkobikmJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oaSl7aWYoaSE9PSJkZWZhdWx0IiYmIShpIGluIGUpKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4saSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxyLmdldD9yOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuW2ldfX0pfX0pfSksT2JqZWN0LmZyZWV6ZShlKX12YXIgRD1VaW50OEFycmF5LEM9VWludDE2QXJyYXksSj1JbnQzMkFycmF5LGNlPW5ldyBEKFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdKSx2ZT1uZXcgRChbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdKSxJZT1uZXcgRChbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHVlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPW5ldyBDKDMxKSxpPTA7aTwzMTsrK2kpbltpXT10Kz0xPDxlW2ktMV07Zm9yKHZhciByPW5ldyBKKG5bMzBdKSxpPTE7aTwzMDsrK2kpZm9yKHZhciBzPW5baV07czxuW2krMV07KytzKXJbc109cy1uW2ldPDw1fGk7cmV0dXJue2I6bixyfX0sZWU9dWUoY2UsMiksRWU9ZWUuYixWZT1lZS5yO0VlWzI4XT0yNTgsVmVbMjU4XT0yODtmb3IodmFyIFd0PXVlKHZlLDApLGx0PVd0LnIsamU9bmV3IEMoMzI3NjgpLEY9MDtGPDMyNzY4OysrRil7dmFyIGllPShGJjQzNjkwKT4+MXwoRiYyMTg0NSk8PDE7aWU9KGllJjUyNDI4KT4+MnwoaWUmMTMxMDcpPDwyLGllPShpZSY2MTY4MCk+PjR8KGllJjM4NTUpPDw0LGplW0ZdPSgoaWUmNjUyODApPj44fChpZSYyNTUpPDw4KT4+MX1mb3IodmFyIF9lPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9ZS5sZW5ndGgscj0wLHM9bmV3IEModCk7cjxpOysrcillW3JdJiYrK3NbZVtyXS0xXTt2YXIgYT1uZXcgQyh0KTtmb3Iocj0xO3I8dDsrK3IpYVtyXT1hW3ItMV0rc1tyLTFdPDwxO3ZhciBjO2lmKG4pe2M9bmV3IEMoMTw8dCk7dmFyIGY9MTUtdDtmb3Iocj0wO3I8aTsrK3IpaWYoZVtyXSlmb3IodmFyIGQ9cjw8NHxlW3JdLHU9dC1lW3JdLHk9YVtlW3JdLTFdKys8PHUsdj15fCgxPDx1KS0xO3k8PXY7Kyt5KWNbamVbeV0+PmZdPWR9ZWxzZSBmb3IoYz1uZXcgQyhpKSxyPTA7cjxpOysrcillW3JdJiYoY1tyXT1qZVthW2Vbcl0tMV0rK10+PjE1LWVbcl0pO3JldHVybiBjfSxhZT1uZXcgRCgyODgpLEY9MDtGPDE0NDsrK0YpYWVbRl09ODtmb3IodmFyIEY9MTQ0O0Y8MjU2OysrRilhZVtGXT05O2Zvcih2YXIgRj0yNTY7RjwyODA7KytGKWFlW0ZdPTc7Zm9yKHZhciBGPTI4MDtGPDI4ODsrK0YpYWVbRl09ODtmb3IodmFyIE9lPW5ldyBEKDMyKSxGPTA7RjwzMjsrK0YpT2VbRl09NTt2YXIgWnQ9X2UoYWUsOSwwKSxLdD1fZShPZSw1LDApLGZ0PWZ1bmN0aW9uKGUpe3JldHVybihlKzcpLzh8MH0saHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybihuPT1udWxsfHxuPmUubGVuZ3RoKSYmKG49ZS5sZW5ndGgpLG5ldyBEKGUuc3ViYXJyYXkodCxuKSl9LG5lPWZ1bmN0aW9uKGUsdCxuKXtuPDw9dCY3O3ZhciBpPXQvOHwwO2VbaV18PW4sZVtpKzFdfD1uPj44fSxUZT1mdW5jdGlvbihlLHQsbil7bjw8PXQmNzt2YXIgaT10Lzh8MDtlW2ldfD1uLGVbaSsxXXw9bj4+OCxlW2krMl18PW4+PjE2fSxxZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXSYmbi5wdXNoKHtzOmksZjplW2ldfSk7dmFyIHI9bi5sZW5ndGgscz1uLnNsaWNlKCk7aWYoIXIpcmV0dXJue3Q6eXQsbDowfTtpZihyPT0xKXt2YXIgYT1uZXcgRChuWzBdLnMrMSk7cmV0dXJuIGFbblswXS5zXT0xLHt0OmEsbDoxfX1uLnNvcnQoZnVuY3Rpb24oJCxxKXtyZXR1cm4gJC5mLXEuZn0pLG4ucHVzaCh7czotMSxmOjI1MDAxfSk7dmFyIGM9blswXSxmPW5bMV0sZD0wLHU9MSx5PTI7Zm9yKG5bMF09e3M6LTEsZjpjLmYrZi5mLGw6YyxyOmZ9O3UhPXItMTspYz1uW25bZF0uZjxuW3ldLmY/ZCsrOnkrK10sZj1uW2QhPXUmJm5bZF0uZjxuW3ldLmY/ZCsrOnkrK10sblt1KytdPXtzOi0xLGY6Yy5mK2YuZixsOmMscjpmfTtmb3IodmFyIHY9c1swXS5zLGk9MTtpPHI7KytpKXNbaV0ucz52JiYodj1zW2ldLnMpO3ZhciBiPW5ldyBDKHYrMSksbT1HZShuW3UtMV0sYiwwKTtpZihtPnQpe3ZhciBpPTAsTj0wLGc9bS10LEU9MTw8Zztmb3Iocy5zb3J0KGZ1bmN0aW9uKHEsQil7cmV0dXJuIGJbQi5zXS1iW3Euc118fHEuZi1CLmZ9KTtpPHI7KytpKXt2YXIgaz1zW2ldLnM7aWYoYltrXT50KU4rPUUtKDE8PG0tYltrXSksYltrXT10O2Vsc2UgYnJlYWt9Zm9yKE4+Pj1nO04+MDspe3ZhciB3PXNbaV0ucztiW3ddPHQ/Ti09MTw8dC1iW3ddKystMTorK2l9Zm9yKDtpPj0wJiZOOy0taSl7dmFyIEw9c1tpXS5zO2JbTF09PXQmJigtLWJbTF0sKytOKX1tPXR9cmV0dXJue3Q6bmV3IEQoYiksbDptfX0sR2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnM9PS0xP01hdGgubWF4KEdlKGUubCx0LG4rMSksR2UoZS5yLHQsbisxKSk6dFtlLnNdPW59LGR0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0JiYhZVstLXRdOyk7Zm9yKHZhciBuPW5ldyBDKCsrdCksaT0wLHI9ZVswXSxzPTEsYT1mdW5jdGlvbihmKXtuW2krK109Zn0sYz0xO2M8PXQ7KytjKWlmKGVbY109PXImJmMhPXQpKytzO2Vsc2V7aWYoIXImJnM+Mil7Zm9yKDtzPjEzODtzLT0xMzgpYSgzMjc1NCk7cz4yJiYoYShzPjEwP3MtMTE8PDV8Mjg2OTA6cy0zPDw1fDEyMzA1KSxzPTApfWVsc2UgaWYocz4zKXtmb3IoYShyKSwtLXM7cz42O3MtPTYpYSg4MzA0KTtzPjImJihhKHMtMzw8NXw4MjA4KSxzPTApfWZvcig7cy0tOylhKHIpO3M9MSxyPWVbY119cmV0dXJue2M6bi5zdWJhcnJheSgwLGkpLG46dH19LGJlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsaT0wO2k8dC5sZW5ndGg7KytpKW4rPWVbaV0qdFtpXTtyZXR1cm4gbn0scHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4ubGVuZ3RoLHI9ZnQodCsyKTtlW3JdPWkmMjU1LGVbcisxXT1pPj44LGVbcisyXT1lW3JdXjI1NSxlW3IrM109ZVtyKzFdXjI1NTtmb3IodmFyIHM9MDtzPGk7KytzKWVbcitzKzRdPW5bc107cmV0dXJuKHIrNCtpKSo4fSxtdD1mdW5jdGlvbihlLHQsbixpLHIscyxhLGMsZixkLHUpe25lKHQsdSsrLG4pLCsrclsyNTZdO2Zvcih2YXIgeT1xZShyLDE1KSx2PXkudCxiPXkubCxtPXFlKHMsMTUpLE49bS50LGc9bS5sLEU9ZHQodiksaz1FLmMsdz1FLm4sTD1kdChOKSwkPUwuYyxxPUwubixCPW5ldyBDKDE5KSxJPTA7STxrLmxlbmd0aDsrK0kpKytCW2tbSV0mMzFdO2Zvcih2YXIgST0wO0k8JC5sZW5ndGg7KytJKSsrQlskW0ldJjMxXTtmb3IodmFyIE89cWUoQiw3KSxqPU8udCxVPU8ubCx6PTE5O3o+NCYmIWpbSWVbei0xXV07LS16KTt2YXIgWD1kKzU8PDMsbz1iZShyLGFlKStiZShzLE9lKSthLGg9YmUocix2KStiZShzLE4pK2ErMTQrMyp6K2JlKEIsaikrMipCWzE2XSszKkJbMTddKzcqQlsxOF07aWYoZj49MCYmWDw9byYmWDw9aClyZXR1cm4gcHQodCx1LGUuc3ViYXJyYXkoZixmK2QpKTt2YXIgXyxBLFIseDtpZihuZSh0LHUsMSsoaDxvKSksdSs9MixoPG8pe189X2UodixiLDApLEE9dixSPV9lKE4sZywwKSx4PU47dmFyIHNlPV9lKGosVSwwKTtuZSh0LHUsdy0yNTcpLG5lKHQsdSs1LHEtMSksbmUodCx1KzEwLHotNCksdSs9MTQ7Zm9yKHZhciBJPTA7STx6OysrSSluZSh0LHUrMypJLGpbSWVbSV1dKTt1Kz0zKno7Zm9yKHZhciBIPVtrLCRdLHJlPTA7cmU8MjsrK3JlKWZvcih2YXIgbWU9SFtyZV0sST0wO0k8bWUubGVuZ3RoOysrSSl7dmFyIHRlPW1lW0ldJjMxO25lKHQsdSxzZVt0ZV0pLHUrPWpbdGVdLHRlPjE1JiYobmUodCx1LG1lW0ldPj41JjEyNyksdSs9bWVbSV0+PjEyKX19ZWxzZSBfPVp0LEE9YWUsUj1LdCx4PU9lO2Zvcih2YXIgST0wO0k8YzsrK0kpe3ZhciBZPWlbSV07aWYoWT4yNTUpe3ZhciB0ZT1ZPj4xOCYzMTtUZSh0LHUsX1t0ZSsyNTddKSx1Kz1BW3RlKzI1N10sdGU+NyYmKG5lKHQsdSxZPj4yMyYzMSksdSs9Y2VbdGVdKTt2YXIgeWU9WSYzMTtUZSh0LHUsUlt5ZV0pLHUrPXhbeWVdLHllPjMmJihUZSh0LHUsWT4+NSY4MTkxKSx1Kz12ZVt5ZV0pfWVsc2UgVGUodCx1LF9bWV0pLHUrPUFbWV19cmV0dXJuIFRlKHQsdSxfWzI1Nl0pLHUrQVsyNTZdfSxlbj1uZXcgSihbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSx5dD1uZXcgRCgwKSx0bj1mdW5jdGlvbihlLHQsbixpLHIscyl7dmFyIGE9cy56fHxlLmxlbmd0aCxjPW5ldyBEKGkrYSs1KigxK01hdGguY2VpbChhLzdlMykpK3IpLGY9Yy5zdWJhcnJheShpLGMubGVuZ3RoLXIpLGQ9cy5sLHU9KHMucnx8MCkmNztpZih0KXt1JiYoZlswXT1zLnI+PjMpO2Zvcih2YXIgeT1lblt0LTFdLHY9eT4+MTMsYj15JjgxOTEsbT0oMTw8biktMSxOPXMucHx8bmV3IEMoMzI3NjgpLGc9cy5ofHxuZXcgQyhtKzEpLEU9TWF0aC5jZWlsKG4vMyksaz0yKkUsdz1mdW5jdGlvbihvdCl7cmV0dXJuKGVbb3RdXmVbb3QrMV08PEVeZVtvdCsyXTw8aykmbX0sTD1uZXcgSigyNWUzKSwkPW5ldyBDKDI4OCkscT1uZXcgQygzMiksQj0wLEk9MCxPPXMuaXx8MCxqPTAsVT1zLnd8fDAsej0wO08rMjxhOysrTyl7dmFyIFg9dyhPKSxvPU8mMzI3NjcsaD1nW1hdO2lmKE5bb109aCxnW1hdPW8sVTw9Tyl7dmFyIF89YS1PO2lmKChCPjdlM3x8aj4yNDU3NikmJihfPjQyM3x8IWQpKXt1PW10KGUsZiwwLEwsJCxxLEksaix6LE8teix1KSxqPUI9ST0wLHo9Tztmb3IodmFyIEE9MDtBPDI4NjsrK0EpJFtBXT0wO2Zvcih2YXIgQT0wO0E8MzA7KytBKXFbQV09MH12YXIgUj0yLHg9MCxzZT1iLEg9by1oJjMyNzY3O2lmKF8+MiYmWD09dyhPLUgpKWZvcih2YXIgcmU9TWF0aC5taW4odixfKS0xLG1lPU1hdGgubWluKDMyNzY3LE8pLHRlPU1hdGgubWluKDI1OCxfKTtIPD1tZSYmLS1zZSYmbyE9aDspe2lmKGVbTytSXT09ZVtPK1ItSF0pe2Zvcih2YXIgWT0wO1k8dGUmJmVbTytZXT09ZVtPK1ktSF07KytZKTtpZihZPlIpe2lmKFI9WSx4PUgsWT5yZSlicmVhaztmb3IodmFyIHllPU1hdGgubWluKEgsWS0yKSx6dD0wLEE9MDtBPHllOysrQSl7dmFyIHN0PU8tSCtBJjMyNzY3LFVyPU5bc3RdLEh0PXN0LVVyJjMyNzY3O0h0Pnp0JiYoenQ9SHQsaD1zdCl9fX1vPWgsaD1OW29dLEgrPW8taCYzMjc2N31pZih4KXtMW2orK109MjY4NDM1NDU2fFZlW1JdPDwxOHxsdFt4XTt2YXIgWXQ9VmVbUl0mMzEsSnQ9bHRbeF0mMzE7SSs9Y2VbWXRdK3ZlW0p0XSwrKyRbMjU3K1l0XSwrK3FbSnRdLFU9TytSLCsrQn1lbHNlIExbaisrXT1lW09dLCsrJFtlW09dXX19Zm9yKE89TWF0aC5tYXgoTyxVKTtPPGE7KytPKUxbaisrXT1lW09dLCsrJFtlW09dXTt1PW10KGUsZixkLEwsJCxxLEksaix6LE8teix1KSxkfHwocy5yPXUmN3xmW3UvOHwwXTw8Myx1LT03LHMuaD1nLHMucD1OLHMuaT1PLHMudz1VKX1lbHNle2Zvcih2YXIgTz1zLnd8fDA7TzxhK2Q7Tys9NjU1MzUpe3ZhciBhdD1PKzY1NTM1O2F0Pj1hJiYoZlt1Lzh8MF09ZCxhdD1hKSx1PXB0KGYsdSsxLGUuc3ViYXJyYXkoTyxhdCkpfXMuaT1hfXJldHVybiBodChjLDAsaStmdCh1KStyKX0sbm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEludDMyQXJyYXkoMjU2KSx0PTA7dDwyNTY7Kyt0KXtmb3IodmFyIG49dCxpPTk7LS1pOyluPShuJjEmJi0zMDY2NzQ5MTIpXm4+Pj4xO2VbdF09bn1yZXR1cm4gZX0oKSxybj1mdW5jdGlvbigpe3ZhciBlPS0xO3JldHVybntwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLGk9MDtpPHQubGVuZ3RoOysraSluPW5uW24mMjU1XnRbaV1dXm4+Pj44O2U9bn0sZDpmdW5jdGlvbigpe3JldHVybn5lfX19LHNuPWZ1bmN0aW9uKGUsdCxuLGkscil7aWYoIXImJihyPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBzPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLGE9bmV3IEQocy5sZW5ndGgrZS5sZW5ndGgpO2Euc2V0KHMpLGEuc2V0KGUscy5sZW5ndGgpLGU9YSxyLnc9cy5sZW5ndGh9cmV0dXJuIHRuKGUsdC5sZXZlbD09bnVsbD82OnQubGV2ZWwsdC5tZW09PW51bGw/ci5sP01hdGguY2VpbChNYXRoLm1heCg4LE1hdGgubWluKDEzLE1hdGgubG9nKGUubGVuZ3RoKSkpKjEuNSk6MjA6MTIrdC5tZW0sbixpLHIpfSx6ZT1mdW5jdGlvbihlLHQsbil7Zm9yKDtuOysrdCllW3RdPW4sbj4+Pj04fSxhbj1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZmlsZW5hbWU7aWYoZVswXT0zMSxlWzFdPTEzOSxlWzJdPTgsZVs4XT10LmxldmVsPDI/NDp0LmxldmVsPT05PzI6MCxlWzldPTMsdC5tdGltZSE9MCYmemUoZSw0LE1hdGguZmxvb3IobmV3IERhdGUodC5tdGltZXx8RGF0ZS5ub3coKSkvMWUzKSksbil7ZVszXT04O2Zvcih2YXIgaT0wO2k8PW4ubGVuZ3RoOysraSllW2krMTBdPW4uY2hhckNvZGVBdChpKX19LG9uPWZ1bmN0aW9uKGUpe3JldHVybiAxMCsoZS5maWxlbmFtZT9lLmZpbGVuYW1lLmxlbmd0aCsxOjApfTtmdW5jdGlvbiBjbihlLHQpe3R8fCh0PXt9KTt2YXIgbj1ybigpLGk9ZS5sZW5ndGg7bi5wKGUpO3ZhciByPXNuKGUsdCxvbih0KSw4KSxzPXIubGVuZ3RoO3JldHVybiBhbihyLHQpLHplKHIscy04LG4uZCgpKSx6ZShyLHMtNCxpKSxyfXZhciBndD10eXBlb2YgVGV4dEVuY29kZXIhPSJ1bmRlZmluZWQiJiZuZXcgVGV4dEVuY29kZXIsdW49dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIiYmbmV3IFRleHREZWNvZGVyLGxuPTA7dHJ5e3VuLmRlY29kZSh5dCx7c3RyZWFtOiEwfSksbG49MX1jYXRjaChlKXt9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbjtpZihndClyZXR1cm4gZ3QuZW5jb2RlKGUpO2Zvcih2YXIgaT1lLmxlbmd0aCxyPW5ldyBEKGUubGVuZ3RoKyhlLmxlbmd0aD4+MSkpLHM9MCxhPWZ1bmN0aW9uKGQpe3JbcysrXT1kfSxuPTA7bjxpOysrbil7aWYocys1PnIubGVuZ3RoKXt2YXIgYz1uZXcgRChzKzgrKGktbjw8MSkpO2Muc2V0KHIpLHI9Y312YXIgZj1lLmNoYXJDb2RlQXQobik7ZjwxMjh8fHQ/YShmKTpmPDIwNDg/KGEoMTkyfGY+PjYpLGEoMTI4fGYmNjMpKTpmPjU1Mjk1JiZmPDU3MzQ0PyhmPTY1NTM2KyhmJjEwNDc1NTIpfGUuY2hhckNvZGVBdCgrK24pJjEwMjMsYSgyNDB8Zj4+MTgpLGEoMTI4fGY+PjEyJjYzKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSk6KGEoMjI0fGY+PjEyKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSl9cmV0dXJuIGh0KHIsMCxzKX1jb25zdCBIZT1KU09OLGhuPWU9PmUudG9VcHBlckNhc2UoKSxkbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChuLGkpPT57dFtpXT1ufSksdH0scG49KGUsdCxuKT0+ZS5kb2N1bWVudD9lOntkb2N1bWVudDplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0sbW49KGUsdCxuKT0+ZS5xdWVyeT9lOntxdWVyeTplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0seW49KGUsdCk9PmUuZG9jdW1lbnRzP2U6e2RvY3VtZW50czplLHJlcXVlc3RIZWFkZXJzOnQsc2lnbmFsOnZvaWQgMH07ZnVuY3Rpb24gU2UoZSx0KXtpZighISFlKXRocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbH1mdW5jdGlvbiB2bihlLHQpe2lmKCEhIWUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGludmFyaWFudCB0cmlnZ2VyZWQuIil9Y29uc3QgRW49L1xyXG58W1xuXHJdL2c7ZnVuY3Rpb24gWWUoZSx0KXtsZXQgbj0wLGk9MTtmb3IoY29uc3QgciBvZiBlLmJvZHkubWF0Y2hBbGwoRW4pKXtpZih0eXBlb2Ygci5pbmRleD09Im51bWJlciJ8fHZuKCExKSxyLmluZGV4Pj10KWJyZWFrO249ci5pbmRleCtyWzBdLmxlbmd0aCxpKz0xfXJldHVybntsaW5lOmksY29sdW1uOnQrMS1ufX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gdnQoZS5zb3VyY2UsWWUoZS5zb3VyY2UsZS5zdGFydCkpfWZ1bmN0aW9uIHZ0KGUsdCl7Y29uc3Qgbj1lLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbi0xLGk9IiIucGFkU3RhcnQobikrZS5ib2R5LHI9dC5saW5lLTEscz1lLmxvY2F0aW9uT2Zmc2V0LmxpbmUtMSxhPXQubGluZStzLGM9dC5saW5lPT09MT9uOjAsZj10LmNvbHVtbitjLGQ9YCR7ZS5uYW1lfToke2F9OiR7Zn0KYCx1PWkuc3BsaXQoL1xyXG58W1xuXHJdL2cpLHk9dVtyXTtpZih5Lmxlbmd0aD4xMjApe2NvbnN0IHY9TWF0aC5mbG9vcihmLzgwKSxiPWYlODAsbT1bXTtmb3IobGV0IE49MDtOPHkubGVuZ3RoO04rPTgwKW0ucHVzaCh5LnNsaWNlKE4sTis4MCkpO3JldHVybiBkK0V0KFtbYCR7YX0gfGAsbVswXV0sLi4ubS5zbGljZSgxLHYrMSkubWFwKE49PlsifCIsTl0pLFsifCIsIl4iLnBhZFN0YXJ0KGIpXSxbInwiLG1bdisxXV1dKX1yZXR1cm4gZCtFdChbW2Ake2EtMX0gfGAsdVtyLTFdXSxbYCR7YX0gfGAseV0sWyJ8IiwiXiIucGFkU3RhcnQoZildLFtgJHthKzF9IHxgLHVbcisxXV1dKX1mdW5jdGlvbiBFdChlKXtjb25zdCB0PWUuZmlsdGVyKChbaSxyXSk9PnIhPT12b2lkIDApLG49TWF0aC5tYXgoLi4udC5tYXAoKFtpXSk9PmkubGVuZ3RoKSk7cmV0dXJuIHQubWFwKChbaSxyXSk9PmkucGFkU3RhcnQobikrKHI/IiAiK3I6IiIpKS5qb2luKGAKYCl9ZnVuY3Rpb24gVG4oZSl7Y29uc3QgdD1lWzBdO3JldHVybiB0PT1udWxsfHwia2luZCJpbiB0fHwibGVuZ3RoImluIHQ/e25vZGVzOnQsc291cmNlOmVbMV0scG9zaXRpb25zOmVbMl0scGF0aDplWzNdLG9yaWdpbmFsRXJyb3I6ZVs0XSxleHRlbnNpb25zOmVbNV19OnR9Y2xhc3MgSmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LC4uLm4pe3ZhciBpLHIscztjb25zdHtub2RlczphLHNvdXJjZTpjLHBvc2l0aW9uczpmLHBhdGg6ZCxvcmlnaW5hbEVycm9yOnUsZXh0ZW5zaW9uczp5fT1UbihuKTtzdXBlcih0KSx0aGlzLm5hbWU9IkdyYXBoUUxFcnJvciIsdGhpcy5wYXRoPWQhPW51bGw/ZDp2b2lkIDAsdGhpcy5vcmlnaW5hbEVycm9yPXUhPW51bGw/dTp2b2lkIDAsdGhpcy5ub2Rlcz1fdChBcnJheS5pc0FycmF5KGEpP2E6YT9bYV06dm9pZCAwKTtjb25zdCB2PV90KChpPXRoaXMubm9kZXMpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS5tYXAobT0+bS5sb2MpLmZpbHRlcihtPT5tIT1udWxsKSk7dGhpcy5zb3VyY2U9YyE9bnVsbD9jOnY9PW51bGx8fChyPXZbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zb3VyY2UsdGhpcy5wb3NpdGlvbnM9ZiE9bnVsbD9mOnY9PW51bGw/dm9pZCAwOnYubWFwKG09Pm0uc3RhcnQpLHRoaXMubG9jYXRpb25zPWYmJmM/Zi5tYXAobT0+WWUoYyxtKSk6dj09bnVsbD92b2lkIDA6di5tYXAobT0+WWUobS5zb3VyY2UsbS5zdGFydCkpO2NvbnN0IGI9Z24odT09bnVsbD92b2lkIDA6dS5leHRlbnNpb25zKT91PT1udWxsP3ZvaWQgMDp1LmV4dGVuc2lvbnM6dm9pZCAwO3RoaXMuZXh0ZW5zaW9ucz0ocz15IT1udWxsP3k6YikhPT1udWxsJiZzIT09dm9pZCAwP3M6T2JqZWN0LmNyZWF0ZShudWxsKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHttZXNzYWdlOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwfSxuYW1lOntlbnVtZXJhYmxlOiExfSxub2Rlczp7ZW51bWVyYWJsZTohMX0sc291cmNlOntlbnVtZXJhYmxlOiExfSxwb3NpdGlvbnM6e2VudW1lcmFibGU6ITF9LG9yaWdpbmFsRXJyb3I6e2VudW1lcmFibGU6ITF9fSksdSE9bnVsbCYmdS5zdGFjaz9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhY2siLHt2YWx1ZTp1LnN0YWNrLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOkVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsSmUpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOkVycm9yKCkuc3RhY2ssd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iR3JhcGhRTEVycm9yIn10b1N0cmluZygpe2xldCB0PXRoaXMubWVzc2FnZTtpZih0aGlzLm5vZGVzKWZvcihjb25zdCBuIG9mIHRoaXMubm9kZXMpbi5sb2MmJih0Kz1gCgpgK19uKG4ubG9jKSk7ZWxzZSBpZih0aGlzLnNvdXJjZSYmdGhpcy5sb2NhdGlvbnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5sb2NhdGlvbnMpdCs9YAoKYCt2dCh0aGlzLnNvdXJjZSxuKTtyZXR1cm4gdH10b0pTT04oKXtjb25zdCB0PXttZXNzYWdlOnRoaXMubWVzc2FnZX07cmV0dXJuIHRoaXMubG9jYXRpb25zIT1udWxsJiYodC5sb2NhdGlvbnM9dGhpcy5sb2NhdGlvbnMpLHRoaXMucGF0aCE9bnVsbCYmKHQucGF0aD10aGlzLnBhdGgpLHRoaXMuZXh0ZW5zaW9ucyE9bnVsbCYmT2JqZWN0LmtleXModGhpcy5leHRlbnNpb25zKS5sZW5ndGg+MCYmKHQuZXh0ZW5zaW9ucz10aGlzLmV4dGVuc2lvbnMpLHR9fWZ1bmN0aW9uIF90KGUpe3JldHVybiBlPT09dm9pZCAwfHxlLmxlbmd0aD09PTA/dm9pZCAwOmV9ZnVuY3Rpb24gRyhlLHQsbil7cmV0dXJuIG5ldyBKZShgU3ludGF4IEVycm9yOiAke259YCx7c291cmNlOmUscG9zaXRpb25zOlt0XX0pfWNsYXNzIGJue2NvbnN0cnVjdG9yKHQsbixpKXt0aGlzLnN0YXJ0PXQuc3RhcnQsdGhpcy5lbmQ9bi5lbmQsdGhpcy5zdGFydFRva2VuPXQsdGhpcy5lbmRUb2tlbj1uLHRoaXMuc291cmNlPWl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTG9jYXRpb24ifXRvSlNPTigpe3JldHVybntzdGFydDp0aGlzLnN0YXJ0LGVuZDp0aGlzLmVuZH19fWNsYXNzIFR0e2NvbnN0cnVjdG9yKHQsbixpLHIscyxhKXt0aGlzLmtpbmQ9dCx0aGlzLnN0YXJ0PW4sdGhpcy5lbmQ9aSx0aGlzLmxpbmU9cix0aGlzLmNvbHVtbj1zLHRoaXMudmFsdWU9YSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJUb2tlbiJ9dG9KU09OKCl7cmV0dXJue2tpbmQ6dGhpcy5raW5kLHZhbHVlOnRoaXMudmFsdWUsbGluZTp0aGlzLmxpbmUsY29sdW1uOnRoaXMuY29sdW1ufX19Y29uc3QgYnQ9e05hbWU6W10sRG9jdW1lbnQ6WyJkZWZpbml0aW9ucyJdLE9wZXJhdGlvbkRlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxWYXJpYWJsZURlZmluaXRpb246WyJ2YXJpYWJsZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sVmFyaWFibGU6WyJuYW1lIl0sU2VsZWN0aW9uU2V0Olsic2VsZWN0aW9ucyJdLEZpZWxkOlsiYWxpYXMiLCJuYW1lIiwiYXJndW1lbnRzIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLEFyZ3VtZW50OlsibmFtZSIsInZhbHVlIl0sRnJhZ21lbnRTcHJlYWQ6WyJuYW1lIiwiZGlyZWN0aXZlcyJdLElubGluZUZyYWdtZW50OlsidHlwZUNvbmRpdGlvbiIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxGcmFnbWVudERlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsInR5cGVDb25kaXRpb24iLCJkaXJlY3RpdmVzIiwic2VsZWN0aW9uU2V0Il0sSW50VmFsdWU6W10sRmxvYXRWYWx1ZTpbXSxTdHJpbmdWYWx1ZTpbXSxCb29sZWFuVmFsdWU6W10sTnVsbFZhbHVlOltdLEVudW1WYWx1ZTpbXSxMaXN0VmFsdWU6WyJ2YWx1ZXMiXSxPYmplY3RWYWx1ZTpbImZpZWxkcyJdLE9iamVjdEZpZWxkOlsibmFtZSIsInZhbHVlIl0sRGlyZWN0aXZlOlsibmFtZSIsImFyZ3VtZW50cyJdLE5hbWVkVHlwZTpbIm5hbWUiXSxMaXN0VHlwZTpbInR5cGUiXSxOb25OdWxsVHlwZTpbInR5cGUiXSxTY2hlbWFEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxPcGVyYXRpb25UeXBlRGVmaW5pdGlvbjpbInR5cGUiXSxTY2FsYXJUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sRmllbGREZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiYXJndW1lbnRzIiwidHlwZSIsImRpcmVjdGl2ZXMiXSxJbnB1dFZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sSW50ZXJmYWNlVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sRW51bVZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLERpcmVjdGl2ZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJhcmd1bWVudHMiLCJsb2NhdGlvbnMiXSxTY2hlbWFFeHRlbnNpb246WyJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxTY2FsYXJUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sSW50ZXJmYWNlVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXX0sTm49bmV3IFNldChPYmplY3Qua2V5cyhidCkpO2Z1bmN0aW9uIE50KGUpe2NvbnN0IHQ9ZT09bnVsbD92b2lkIDA6ZS5raW5kO3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJk5uLmhhcyh0KX12YXIgbGU7KGZ1bmN0aW9uKGUpe2UuUVVFUlk9InF1ZXJ5IixlLk1VVEFUSU9OPSJtdXRhdGlvbiIsZS5TVUJTQ1JJUFRJT049InN1YnNjcmlwdGlvbiJ9KShsZXx8KGxlPXt9KSk7dmFyIFFlOyhmdW5jdGlvbihlKXtlLlFVRVJZPSJRVUVSWSIsZS5NVVRBVElPTj0iTVVUQVRJT04iLGUuU1VCU0NSSVBUSU9OPSJTVUJTQ1JJUFRJT04iLGUuRklFTEQ9IkZJRUxEIixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZSQUdNRU5UX0RFRklOSVRJT04iLGUuRlJBR01FTlRfU1BSRUFEPSJGUkFHTUVOVF9TUFJFQUQiLGUuSU5MSU5FX0ZSQUdNRU5UPSJJTkxJTkVfRlJBR01FTlQiLGUuVkFSSUFCTEVfREVGSU5JVElPTj0iVkFSSUFCTEVfREVGSU5JVElPTiIsZS5TQ0hFTUE9IlNDSEVNQSIsZS5TQ0FMQVI9IlNDQUxBUiIsZS5PQkpFQ1Q9Ik9CSkVDVCIsZS5GSUVMRF9ERUZJTklUSU9OPSJGSUVMRF9ERUZJTklUSU9OIixlLkFSR1VNRU5UX0RFRklOSVRJT049IkFSR1VNRU5UX0RFRklOSVRJT04iLGUuSU5URVJGQUNFPSJJTlRFUkZBQ0UiLGUuVU5JT049IlVOSU9OIixlLkVOVU09IkVOVU0iLGUuRU5VTV9WQUxVRT0iRU5VTV9WQUxVRSIsZS5JTlBVVF9PQkpFQ1Q9IklOUFVUX09CSkVDVCIsZS5JTlBVVF9GSUVMRF9ERUZJTklUSU9OPSJJTlBVVF9GSUVMRF9ERUZJTklUSU9OIn0pKFFlfHwoUWU9e30pKTt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5OQU1FPSJOYW1lIixlLkRPQ1VNRU5UPSJEb2N1bWVudCIsZS5PUEVSQVRJT05fREVGSU5JVElPTj0iT3BlcmF0aW9uRGVmaW5pdGlvbiIsZS5WQVJJQUJMRV9ERUZJTklUSU9OPSJWYXJpYWJsZURlZmluaXRpb24iLGUuU0VMRUNUSU9OX1NFVD0iU2VsZWN0aW9uU2V0IixlLkZJRUxEPSJGaWVsZCIsZS5BUkdVTUVOVD0iQXJndW1lbnQiLGUuRlJBR01FTlRfU1BSRUFEPSJGcmFnbWVudFNwcmVhZCIsZS5JTkxJTkVfRlJBR01FTlQ9IklubGluZUZyYWdtZW50IixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZyYWdtZW50RGVmaW5pdGlvbiIsZS5WQVJJQUJMRT0iVmFyaWFibGUiLGUuSU5UPSJJbnRWYWx1ZSIsZS5GTE9BVD0iRmxvYXRWYWx1ZSIsZS5TVFJJTkc9IlN0cmluZ1ZhbHVlIixlLkJPT0xFQU49IkJvb2xlYW5WYWx1ZSIsZS5OVUxMPSJOdWxsVmFsdWUiLGUuRU5VTT0iRW51bVZhbHVlIixlLkxJU1Q9Ikxpc3RWYWx1ZSIsZS5PQkpFQ1Q9Ik9iamVjdFZhbHVlIixlLk9CSkVDVF9GSUVMRD0iT2JqZWN0RmllbGQiLGUuRElSRUNUSVZFPSJEaXJlY3RpdmUiLGUuTkFNRURfVFlQRT0iTmFtZWRUeXBlIixlLkxJU1RfVFlQRT0iTGlzdFR5cGUiLGUuTk9OX05VTExfVFlQRT0iTm9uTnVsbFR5cGUiLGUuU0NIRU1BX0RFRklOSVRJT049IlNjaGVtYURlZmluaXRpb24iLGUuT1BFUkFUSU9OX1RZUEVfREVGSU5JVElPTj0iT3BlcmF0aW9uVHlwZURlZmluaXRpb24iLGUuU0NBTEFSX1RZUEVfREVGSU5JVElPTj0iU2NhbGFyVHlwZURlZmluaXRpb24iLGUuT0JKRUNUX1RZUEVfREVGSU5JVElPTj0iT2JqZWN0VHlwZURlZmluaXRpb24iLGUuRklFTERfREVGSU5JVElPTj0iRmllbGREZWZpbml0aW9uIixlLklOUFVUX1ZBTFVFX0RFRklOSVRJT049IklucHV0VmFsdWVEZWZpbml0aW9uIixlLklOVEVSRkFDRV9UWVBFX0RFRklOSVRJT049IkludGVyZmFjZVR5cGVEZWZpbml0aW9uIixlLlVOSU9OX1RZUEVfREVGSU5JVElPTj0iVW5pb25UeXBlRGVmaW5pdGlvbiIsZS5FTlVNX1RZUEVfREVGSU5JVElPTj0iRW51bVR5cGVEZWZpbml0aW9uIixlLkVOVU1fVkFMVUVfREVGSU5JVElPTj0iRW51bVZhbHVlRGVmaW5pdGlvbiIsZS5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OPSJJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uIixlLkRJUkVDVElWRV9ERUZJTklUSU9OPSJEaXJlY3RpdmVEZWZpbml0aW9uIixlLlNDSEVNQV9FWFRFTlNJT049IlNjaGVtYUV4dGVuc2lvbiIsZS5TQ0FMQVJfVFlQRV9FWFRFTlNJT049IlNjYWxhclR5cGVFeHRlbnNpb24iLGUuT0JKRUNUX1RZUEVfRVhURU5TSU9OPSJPYmplY3RUeXBlRXh0ZW5zaW9uIixlLklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTj0iSW50ZXJmYWNlVHlwZUV4dGVuc2lvbiIsZS5VTklPTl9UWVBFX0VYVEVOU0lPTj0iVW5pb25UeXBlRXh0ZW5zaW9uIixlLkVOVU1fVFlQRV9FWFRFTlNJT049IkVudW1UeXBlRXh0ZW5zaW9uIixlLklOUFVUX09CSkVDVF9UWVBFX0VYVEVOU0lPTj0iSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uIn0pKFR8fChUPXt9KSk7ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIGU9PT05fHxlPT09MzJ9ZnVuY3Rpb24gTmUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01N31mdW5jdGlvbiB4dChlKXtyZXR1cm4gZT49OTcmJmU8PTEyMnx8ZT49NjUmJmU8PTkwfWZ1bmN0aW9uIEF0KGUpe3JldHVybiB4dChlKXx8ZT09PTk1fWZ1bmN0aW9uIHhuKGUpe3JldHVybiB4dChlKXx8TmUoZSl8fGU9PT05NX1mdW5jdGlvbiBBbihlKXt2YXIgdDtsZXQgbj1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixpPW51bGwscj0tMTtmb3IobGV0IGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIHM7Y29uc3QgYz1lW2FdLGY9SW4oYyk7ZiE9PWMubGVuZ3RoJiYoaT0ocz1pKSE9PW51bGwmJnMhPT12b2lkIDA/czphLHI9YSxhIT09MCYmZjxuJiYobj1mKSl9cmV0dXJuIGUubWFwKChhLGMpPT5jPT09MD9hOmEuc2xpY2UobikpLnNsaWNlKCh0PWkpIT09bnVsbCYmdCE9PXZvaWQgMD90OjAscisxKX1mdW5jdGlvbiBJbihlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aCYmWGUoZS5jaGFyQ29kZUF0KHQpKTspKyt0O3JldHVybiB0fWZ1bmN0aW9uIE9uKGUsdCl7Y29uc3Qgbj1lLnJlcGxhY2UoLyIiIi9nLCdcXCIiIicpLGk9bi5zcGxpdCgvXHJcbnxbXG5ccl0vZykscj1pLmxlbmd0aD09PTEscz1pLmxlbmd0aD4xJiZpLnNsaWNlKDEpLmV2ZXJ5KGI9PmIubGVuZ3RoPT09MHx8WGUoYi5jaGFyQ29kZUF0KDApKSksYT1uLmVuZHNXaXRoKCdcXCIiIicpLGM9ZS5lbmRzV2l0aCgnIicpJiYhYSxmPWUuZW5kc1dpdGgoIlxcIiksZD1jfHxmLHU9IXJ8fGUubGVuZ3RoPjcwfHxkfHxzfHxhO2xldCB5PSIiO2NvbnN0IHY9ciYmWGUoZS5jaGFyQ29kZUF0KDApKTtyZXR1cm4odSYmIXZ8fHMpJiYoeSs9YApgKSx5Kz1uLCh1fHxkKSYmKHkrPWAKYCksJyIiIicreSsnIiIiJ312YXIgbDsoZnVuY3Rpb24oZSl7ZS5TT0Y9IjxTT0Y+IixlLkVPRj0iPEVPRj4iLGUuQkFORz0iISIsZS5ET0xMQVI9IiQiLGUuQU1QPSImIixlLlBBUkVOX0w9IigiLGUuUEFSRU5fUj0iKSIsZS5TUFJFQUQ9Ii4uLiIsZS5DT0xPTj0iOiIsZS5FUVVBTFM9Ij0iLGUuQVQ9IkAiLGUuQlJBQ0tFVF9MPSJbIixlLkJSQUNLRVRfUj0iXSIsZS5CUkFDRV9MPSJ7IixlLlBJUEU9InwiLGUuQlJBQ0VfUj0ifSIsZS5OQU1FPSJOYW1lIixlLklOVD0iSW50IixlLkZMT0FUPSJGbG9hdCIsZS5TVFJJTkc9IlN0cmluZyIsZS5CTE9DS19TVFJJTkc9IkJsb2NrU3RyaW5nIixlLkNPTU1FTlQ9IkNvbW1lbnQifSkobHx8KGw9e30pKTtjbGFzcyBTbntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPW5ldyBUdChsLlNPRiwwLDAsMCwwKTt0aGlzLnNvdXJjZT10LHRoaXMubGFzdFRva2VuPW4sdGhpcy50b2tlbj1uLHRoaXMubGluZT0xLHRoaXMubGluZVN0YXJ0PTB9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTGV4ZXIifWFkdmFuY2UoKXtyZXR1cm4gdGhpcy5sYXN0VG9rZW49dGhpcy50b2tlbix0aGlzLnRva2VuPXRoaXMubG9va2FoZWFkKCl9bG9va2FoZWFkKCl7bGV0IHQ9dGhpcy50b2tlbjtpZih0LmtpbmQhPT1sLkVPRilkbyBpZih0Lm5leHQpdD10Lm5leHQ7ZWxzZXtjb25zdCBuPURuKHRoaXMsdC5lbmQpO3QubmV4dD1uLG4ucHJldj10LHQ9bn13aGlsZSh0LmtpbmQ9PT1sLkNPTU1FTlQpO3JldHVybiB0fX1mdW5jdGlvbiB3bihlKXtyZXR1cm4gZT09PWwuQkFOR3x8ZT09PWwuRE9MTEFSfHxlPT09bC5BTVB8fGU9PT1sLlBBUkVOX0x8fGU9PT1sLlBBUkVOX1J8fGU9PT1sLlNQUkVBRHx8ZT09PWwuQ09MT058fGU9PT1sLkVRVUFMU3x8ZT09PWwuQVR8fGU9PT1sLkJSQUNLRVRfTHx8ZT09PWwuQlJBQ0tFVF9SfHxlPT09bC5CUkFDRV9MfHxlPT09bC5QSVBFfHxlPT09bC5CUkFDRV9SfWZ1bmN0aW9uIGZlKGUpe3JldHVybiBlPj0wJiZlPD01NTI5NXx8ZT49NTczNDQmJmU8PTExMTQxMTF9ZnVuY3Rpb24gd2UoZSx0KXtyZXR1cm4gSXQoZS5jaGFyQ29kZUF0KHQpKSYmT3QoZS5jaGFyQ29kZUF0KHQrMSkpfWZ1bmN0aW9uIEl0KGUpe3JldHVybiBlPj01NTI5NiYmZTw9NTYzMTl9ZnVuY3Rpb24gT3QoZSl7cmV0dXJuIGU+PTU2MzIwJiZlPD01NzM0M31mdW5jdGlvbiBvZShlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keS5jb2RlUG9pbnRBdCh0KTtpZihuPT09dm9pZCAwKXJldHVybiBsLkVPRjtpZihuPj0zMiYmbjw9MTI2KXtjb25zdCBpPVN0cmluZy5mcm9tQ29kZVBvaW50KG4pO3JldHVybiBpPT09JyInP2AnIidgOmAiJHtpfSJgfXJldHVybiJVKyIrbi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRTdGFydCg0LCIwIil9ZnVuY3Rpb24gVihlLHQsbixpLHIpe2NvbnN0IHM9ZS5saW5lLGE9MStuLWUubGluZVN0YXJ0O3JldHVybiBuZXcgVHQodCxuLGkscyxhLHIpfWZ1bmN0aW9uIERuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dDtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO3N3aXRjaChzKXtjYXNlIDY1Mjc5OmNhc2UgOTpjYXNlIDMyOmNhc2UgNDQ6KytyO2NvbnRpbnVlO2Nhc2UgMTA6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAxMzpuLmNoYXJDb2RlQXQocisxKT09PTEwP3IrPTI6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAzNTpyZXR1cm4gQ24oZSxyKTtjYXNlIDMzOnJldHVybiBWKGUsbC5CQU5HLHIscisxKTtjYXNlIDM2OnJldHVybiBWKGUsbC5ET0xMQVIscixyKzEpO2Nhc2UgMzg6cmV0dXJuIFYoZSxsLkFNUCxyLHIrMSk7Y2FzZSA0MDpyZXR1cm4gVihlLGwuUEFSRU5fTCxyLHIrMSk7Y2FzZSA0MTpyZXR1cm4gVihlLGwuUEFSRU5fUixyLHIrMSk7Y2FzZSA0NjppZihuLmNoYXJDb2RlQXQocisxKT09PTQ2JiZuLmNoYXJDb2RlQXQocisyKT09PTQ2KXJldHVybiBWKGUsbC5TUFJFQUQscixyKzMpO2JyZWFrO2Nhc2UgNTg6cmV0dXJuIFYoZSxsLkNPTE9OLHIscisxKTtjYXNlIDYxOnJldHVybiBWKGUsbC5FUVVBTFMscixyKzEpO2Nhc2UgNjQ6cmV0dXJuIFYoZSxsLkFULHIscisxKTtjYXNlIDkxOnJldHVybiBWKGUsbC5CUkFDS0VUX0wscixyKzEpO2Nhc2UgOTM6cmV0dXJuIFYoZSxsLkJSQUNLRVRfUixyLHIrMSk7Y2FzZSAxMjM6cmV0dXJuIFYoZSxsLkJSQUNFX0wscixyKzEpO2Nhc2UgMTI0OnJldHVybiBWKGUsbC5QSVBFLHIscisxKTtjYXNlIDEyNTpyZXR1cm4gVihlLGwuQlJBQ0VfUixyLHIrMSk7Y2FzZSAzNDpyZXR1cm4gbi5jaGFyQ29kZUF0KHIrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHIrMik9PT0zND9NbihlLHIpOlJuKGUscil9aWYoTmUocyl8fHM9PT00NSlyZXR1cm4ga24oZSxyLHMpO2lmKEF0KHMpKXJldHVybiAkbihlLHIpO3Rocm93IEcoZS5zb3VyY2UscixzPT09Mzk/YFVuZXhwZWN0ZWQgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciAoJyksIGRpZCB5b3UgbWVhbiB0byB1c2UgYSBkb3VibGUgcXVvdGUgKCIpP2A6ZmUocyl8fHdlKG4scik/YFVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAke29lKGUscil9LmA6YEludmFsaWQgY2hhcmFjdGVyOiAke29lKGUscil9LmApfXJldHVybiBWKGUsbC5FT0YsaSxpKX1mdW5jdGlvbiBDbihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keSxpPW4ubGVuZ3RoO2xldCByPXQrMTtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO2lmKHM9PT0xMHx8cz09PTEzKWJyZWFrO2lmKGZlKHMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIGJyZWFrfXJldHVybiBWKGUsbC5DT01NRU5ULHQscixuLnNsaWNlKHQrMSxyKSl9ZnVuY3Rpb24ga24oZSx0LG4pe2NvbnN0IGk9ZS5zb3VyY2UuYm9keTtsZXQgcj10LHM9bixhPSExO2lmKHM9PT00NSYmKHM9aS5jaGFyQ29kZUF0KCsrcikpLHM9PT00OCl7aWYocz1pLmNoYXJDb2RlQXQoKytyKSxOZShzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCB1bmV4cGVjdGVkIGRpZ2l0IGFmdGVyIDA6ICR7b2UoZSxyKX0uYCl9ZWxzZSByPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKTtpZihzPT09NDYmJihhPSEwLHM9aS5jaGFyQ29kZUF0KCsrcikscj1XZShlLHIscykscz1pLmNoYXJDb2RlQXQocikpLChzPT09Njl8fHM9PT0xMDEpJiYoYT0hMCxzPWkuY2hhckNvZGVBdCgrK3IpLChzPT09NDN8fHM9PT00NSkmJihzPWkuY2hhckNvZGVBdCgrK3IpKSxyPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKSkscz09PTQ2fHxBdChzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCBleHBlY3RlZCBkaWdpdCBidXQgZ290OiAke29lKGUscil9LmApO3JldHVybiBWKGUsYT9sLkZMT0FUOmwuSU5ULHQscixpLnNsaWNlKHQscikpfWZ1bmN0aW9uIFdlKGUsdCxuKXtpZighTmUobikpdGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIG51bWJlciwgZXhwZWN0ZWQgZGlnaXQgYnV0IGdvdDogJHtvZShlLHQpfS5gKTtjb25zdCBpPWUuc291cmNlLmJvZHk7bGV0IHI9dCsxO2Zvcig7TmUoaS5jaGFyQ29kZUF0KHIpKTspKytyO3JldHVybiByfWZ1bmN0aW9uIFJuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxLHM9cixhPSIiO2Zvcig7cjxpOyl7Y29uc3QgYz1uLmNoYXJDb2RlQXQocik7aWYoYz09PTM0KXJldHVybiBhKz1uLnNsaWNlKHMsciksVihlLGwuU1RSSU5HLHQscisxLGEpO2lmKGM9PT05Mil7YSs9bi5zbGljZShzLHIpO2NvbnN0IGY9bi5jaGFyQ29kZUF0KHIrMSk9PT0xMTc/bi5jaGFyQ29kZUF0KHIrMik9PT0xMjM/UG4oZSxyKTpMbihlLHIpOkZuKGUscik7YSs9Zi52YWx1ZSxyKz1mLnNpemUscz1yO2NvbnRpbnVlfWlmKGM9PT0xMHx8Yz09PTEzKWJyZWFrO2lmKGZlKGMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIHRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBjaGFyYWN0ZXIgd2l0aGluIFN0cmluZzogJHtvZShlLHIpfS5gKX10aHJvdyBHKGUuc291cmNlLHIsIlVudGVybWluYXRlZCBzdHJpbmcuIil9ZnVuY3Rpb24gUG4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7bGV0IGk9MCxyPTM7Zm9yKDtyPDEyOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQodCtyKyspO2lmKHM9PT0xMjUpe2lmKHI8NXx8IWZlKGkpKWJyZWFrO3JldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOnJ9fWlmKGk9aTw8NHx4ZShzKSxpPDApYnJlYWt9dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCtyKX0iLmApfWZ1bmN0aW9uIExuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9U3Qobix0KzIpO2lmKGZlKGkpKXJldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOjZ9O2lmKEl0KGkpJiZuLmNoYXJDb2RlQXQodCs2KT09PTkyJiZuLmNoYXJDb2RlQXQodCs3KT09PTExNyl7Y29uc3Qgcj1TdChuLHQrOCk7aWYoT3QocikpcmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGksciksc2l6ZToxMn19dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCs2KX0iLmApfWZ1bmN0aW9uIFN0KGUsdCl7cmV0dXJuIHhlKGUuY2hhckNvZGVBdCh0KSk8PDEyfHhlKGUuY2hhckNvZGVBdCh0KzEpKTw8OHx4ZShlLmNoYXJDb2RlQXQodCsyKSk8PDR8eGUoZS5jaGFyQ29kZUF0KHQrMykpfWZ1bmN0aW9uIHhlKGUpe3JldHVybiBlPj00OCYmZTw9NTc/ZS00ODplPj02NSYmZTw9NzA/ZS01NTplPj05NyYmZTw9MTAyP2UtODc6LTF9ZnVuY3Rpb24gRm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7c3dpdGNoKG4uY2hhckNvZGVBdCh0KzEpKXtjYXNlIDM0OnJldHVybnt2YWx1ZTonIicsc2l6ZToyfTtjYXNlIDkyOnJldHVybnt2YWx1ZToiXFwiLHNpemU6Mn07Y2FzZSA0NzpyZXR1cm57dmFsdWU6Ii8iLHNpemU6Mn07Y2FzZSA5ODpyZXR1cm57dmFsdWU6IlxiIixzaXplOjJ9O2Nhc2UgMTAyOnJldHVybnt2YWx1ZToiXGYiLHNpemU6Mn07Y2FzZSAxMTA6cmV0dXJue3ZhbHVlOmAKYCxzaXplOjJ9O2Nhc2UgMTE0OnJldHVybnt2YWx1ZToiXHIiLHNpemU6Mn07Y2FzZSAxMTY6cmV0dXJue3ZhbHVlOiIJIixzaXplOjJ9fXRocm93IEcoZS5zb3VyY2UsdCxgSW52YWxpZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCsyKX0iLmApfWZ1bmN0aW9uIE1uKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9ZS5saW5lU3RhcnQscz10KzMsYT1zLGM9IiI7Y29uc3QgZj1bXTtmb3IoO3M8aTspe2NvbnN0IGQ9bi5jaGFyQ29kZUF0KHMpO2lmKGQ9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCl7Yys9bi5zbGljZShhLHMpLGYucHVzaChjKTtjb25zdCB1PVYoZSxsLkJMT0NLX1NUUklORyx0LHMrMyxBbihmKS5qb2luKGAKYCkpO3JldHVybiBlLmxpbmUrPWYubGVuZ3RoLTEsZS5saW5lU3RhcnQ9cix1fWlmKGQ9PT05MiYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMyk9PT0zNCl7Yys9bi5zbGljZShhLHMpLGE9cysxLHMrPTQ7Y29udGludWV9aWYoZD09PTEwfHxkPT09MTMpe2MrPW4uc2xpY2UoYSxzKSxmLnB1c2goYyksZD09PTEzJiZuLmNoYXJDb2RlQXQocysxKT09PTEwP3MrPTI6KytzLGM9IiIsYT1zLHI9cztjb250aW51ZX1pZihmZShkKSkrK3M7ZWxzZSBpZih3ZShuLHMpKXMrPTI7ZWxzZSB0aHJvdyBHKGUuc291cmNlLHMsYEludmFsaWQgY2hhcmFjdGVyIHdpdGhpbiBTdHJpbmc6ICR7b2UoZSxzKX0uYCl9dGhyb3cgRyhlLnNvdXJjZSxzLCJVbnRlcm1pbmF0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uICRuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxO2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7aWYoeG4ocykpKytyO2Vsc2UgYnJlYWt9cmV0dXJuIFYoZSxsLk5BTUUsdCxyLG4uc2xpY2UodCxyKSl9Y29uc3QgQm49MTAsd3Q9MjtmdW5jdGlvbiBaZShlKXtyZXR1cm4gRGUoZSxbXSl9ZnVuY3Rpb24gRGUoZSx0KXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7Y2FzZSJmdW5jdGlvbiI6cmV0dXJuIGUubmFtZT9gW2Z1bmN0aW9uICR7ZS5uYW1lfV1gOiJbZnVuY3Rpb25dIjtjYXNlIm9iamVjdCI6cmV0dXJuIFVuKGUsdCk7ZGVmYXVsdDpyZXR1cm4gU3RyaW5nKGUpfX1mdW5jdGlvbiBVbihlLHQpe2lmKGU9PT1udWxsKXJldHVybiJudWxsIjtpZih0LmluY2x1ZGVzKGUpKXJldHVybiJbQ2lyY3VsYXJdIjtjb25zdCBuPVsuLi50LGVdO2lmKFZuKGUpKXtjb25zdCBpPWUudG9KU09OKCk7aWYoaSE9PWUpcmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOkRlKGksbil9ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxbihlLG4pO3JldHVybiBqbihlLG4pfWZ1bmN0aW9uIFZuKGUpe3JldHVybiB0eXBlb2YgZS50b0pTT049PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gam4oZSx0KXtjb25zdCBuPU9iamVjdC5lbnRyaWVzKGUpO3JldHVybiBuLmxlbmd0aD09PTA/Int9Ijp0Lmxlbmd0aD53dD8iWyIrR24oZSkrIl0iOiJ7ICIrbi5tYXAoKFtyLHNdKT0+cisiOiAiK0RlKHMsdCkpLmpvaW4oIiwgIikrIiB9In1mdW5jdGlvbiBxbihlLHQpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iW10iO2lmKHQubGVuZ3RoPnd0KXJldHVybiJbQXJyYXldIjtjb25zdCBuPU1hdGgubWluKEJuLGUubGVuZ3RoKSxpPWUubGVuZ3RoLW4scj1bXTtmb3IobGV0IHM9MDtzPG47KytzKXIucHVzaChEZShlW3NdLHQpKTtyZXR1cm4gaT09PTE/ci5wdXNoKCIuLi4gMSBtb3JlIGl0ZW0iKTppPjEmJnIucHVzaChgLi4uICR7aX0gbW9yZSBpdGVtc2ApLCJbIityLmpvaW4oIiwgIikrIl0ifWZ1bmN0aW9uIEduKGUpe2NvbnN0IHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnJlcGxhY2UoL15cW29iamVjdCAvLCIiKS5yZXBsYWNlKC9dJC8sIiIpO2lmKHQ9PT0iT2JqZWN0IiYmdHlwZW9mIGUuY29uc3RydWN0b3I9PSJmdW5jdGlvbiIpe2NvbnN0IG49ZS5jb25zdHJ1Y3Rvci5uYW1lO2lmKHR5cGVvZiBuPT0ic3RyaW5nIiYmbiE9PSIiKXJldHVybiBufXJldHVybiB0fWNvbnN0IHpuPWdsb2JhbFRoaXMucHJvY2VzcyYmZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5OT0RFX0VOVj09PSJwcm9kdWN0aW9uIj9mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2Ygbn06ZnVuY3Rpb24odCxuKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4hMDtpZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXt2YXIgaTtjb25zdCByPW4ucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10scz1TeW1ib2wudG9TdHJpbmdUYWcgaW4gdD90W1N5bWJvbC50b1N0cmluZ1RhZ106KGk9dC5jb25zdHJ1Y3Rvcik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm5hbWU7aWYocj09PXMpe2NvbnN0IGE9WmUodCk7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlICR7cn0gIiR7YX0iIGZyb20gYW5vdGhlciBtb2R1bGUgb3IgcmVhbG0uCgpFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiAiZ3JhcGhxbCIgaW4gdGhlIG5vZGVfbW9kdWxlcwpkaXJlY3RvcnkuIElmIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiAiZ3JhcGhxbCIgYXJlIHRoZSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIKcmVsaWVkIG9uIG1vZHVsZXMsIHVzZSAicmVzb2x1dGlvbnMiIHRvIGVuc3VyZSBvbmx5IG9uZSB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KCmh0dHBzOi8veWFybnBrZy5jb20vZW4vZG9jcy9zZWxlY3RpdmUtdmVyc2lvbi1yZXNvbHV0aW9ucwoKRHVwbGljYXRlICJncmFwaHFsIiBtb2R1bGVzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZGlmZmVyZW50CnZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgYW5kIGJlaGF2aW9yLiBUaGUgZGF0YSBmcm9tIG9uZQp2ZXJzaW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBjb3VsZCBwcm9kdWNlIGNvbmZ1c2luZyBhbmQKc3B1cmlvdXMgcmVzdWx0cy5gKX19cmV0dXJuITF9O2NsYXNzIER0e2NvbnN0cnVjdG9yKHQsbj0iR3JhcGhRTCByZXF1ZXN0IixpPXtsaW5lOjEsY29sdW1uOjF9KXt0eXBlb2YgdD09InN0cmluZyJ8fFNlKCExLGBCb2R5IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkOiAke1plKHQpfS5gKSx0aGlzLmJvZHk9dCx0aGlzLm5hbWU9bix0aGlzLmxvY2F0aW9uT2Zmc2V0PWksdGhpcy5sb2NhdGlvbk9mZnNldC5saW5lPjB8fFNlKCExLCJsaW5lIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKSx0aGlzLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbj4wfHxTZSghMSwiY29sdW1uIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJTb3VyY2UifX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gem4oZSxEdCl9ZnVuY3Rpb24gQ3QoZSx0KXtyZXR1cm4gbmV3IFluKGUsdCkucGFyc2VEb2N1bWVudCgpfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQsbj17fSl7Y29uc3QgaT1Ibih0KT90Om5ldyBEdCh0KTt0aGlzLl9sZXhlcj1uZXcgU24oaSksdGhpcy5fb3B0aW9ucz1uLHRoaXMuX3Rva2VuQ291bnRlcj0wfXBhcnNlTmFtZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk5BTUUsdmFsdWU6dC52YWx1ZX0pfXBhcnNlRG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuRE9DVU1FTlQsZGVmaW5pdGlvbnM6dGhpcy5tYW55KGwuU09GLHRoaXMucGFyc2VEZWZpbml0aW9uLGwuRU9GKX0pfXBhcnNlRGVmaW5pdGlvbigpe2lmKHRoaXMucGVlayhsLkJSQUNFX0wpKXJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2NvbnN0IHQ9dGhpcy5wZWVrRGVzY3JpcHRpb24oKSxuPXQ/dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk6dGhpcy5fbGV4ZXIudG9rZW47aWYobi5raW5kPT09bC5OQU1FKXtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJzY2hlbWEiOnJldHVybiB0aGlzLnBhcnNlU2NoZW1hRGVmaW5pdGlvbigpO2Nhc2Uic2NhbGFyIjpyZXR1cm4gdGhpcy5wYXJzZVNjYWxhclR5cGVEZWZpbml0aW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnRlcmZhY2UiOnJldHVybiB0aGlzLnBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKTtjYXNlInVuaW9uIjpyZXR1cm4gdGhpcy5wYXJzZVVuaW9uVHlwZURlZmluaXRpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnB1dCI6cmV0dXJuIHRoaXMucGFyc2VJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJkaXJlY3RpdmUiOnJldHVybiB0aGlzLnBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpfWlmKHQpdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2UsdGhpcy5fbGV4ZXIudG9rZW4uc3RhcnQsIlVuZXhwZWN0ZWQgZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gdHlwZSBkZWZpbml0aW9ucy4iKTtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJxdWVyeSI6Y2FzZSJtdXRhdGlvbiI6Y2FzZSJzdWJzY3JpcHRpb24iOnJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2Nhc2UiZnJhZ21lbnQiOnJldHVybiB0aGlzLnBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCk7Y2FzZSJleHRlbmQiOnJldHVybiB0aGlzLnBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpfX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQobil9cGFyc2VPcGVyYXRpb25EZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtpZih0aGlzLnBlZWsobC5CUkFDRV9MKSlyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5PUEVSQVRJT05fREVGSU5JVElPTixvcGVyYXRpb246bGUuUVVFUlksbmFtZTp2b2lkIDAsdmFyaWFibGVEZWZpbml0aW9uczpbXSxkaXJlY3RpdmVzOltdLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KTtjb25zdCBuPXRoaXMucGFyc2VPcGVyYXRpb25UeXBlKCk7bGV0IGk7cmV0dXJuIHRoaXMucGVlayhsLk5BTUUpJiYoaT10aGlzLnBhcnNlTmFtZSgpKSx0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9ERUZJTklUSU9OLG9wZXJhdGlvbjpuLG5hbWU6aSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlT3BlcmF0aW9uVHlwZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3N3aXRjaCh0LnZhbHVlKXtjYXNlInF1ZXJ5IjpyZXR1cm4gbGUuUVVFUlk7Y2FzZSJtdXRhdGlvbiI6cmV0dXJuIGxlLk1VVEFUSU9OO2Nhc2Uic3Vic2NyaXB0aW9uIjpyZXR1cm4gbGUuU1VCU0NSSVBUSU9OfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbnMoKXtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5QQVJFTl9MLHRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb24sbC5QQVJFTl9SKX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm5vZGUodGhpcy5fbGV4ZXIudG9rZW4se2tpbmQ6VC5WQVJJQUJMRV9ERUZJTklUSU9OLHZhcmlhYmxlOnRoaXMucGFyc2VWYXJpYWJsZSgpLHR5cGU6KHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKSksZGVmYXVsdFZhbHVlOnRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkVRVUFMUyk/dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCk6dm9pZCAwLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpfSl9cGFyc2VWYXJpYWJsZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5ET0xMQVIpLHRoaXMubm9kZSh0LHtraW5kOlQuVkFSSUFCTEUsbmFtZTp0aGlzLnBhcnNlTmFtZSgpfSl9cGFyc2VTZWxlY3Rpb25TZXQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuU0VMRUNUSU9OX1NFVCxzZWxlY3Rpb25zOnRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZVNlbGVjdGlvbixsLkJSQUNFX1IpfSl9cGFyc2VTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1BSRUFEKT90aGlzLnBhcnNlRnJhZ21lbnQoKTp0aGlzLnBhcnNlRmllbGQoKX1wYXJzZUZpZWxkKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VOYW1lKCk7bGV0IGkscjtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQ09MT04pPyhpPW4scj10aGlzLnBhcnNlTmFtZSgpKTpyPW4sdGhpcy5ub2RlKHQse2tpbmQ6VC5GSUVMRCxhbGlhczppLG5hbWU6cixhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyghMSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGVlayhsLkJSQUNFX0wpP3RoaXMucGFyc2VTZWxlY3Rpb25TZXQoKTp2b2lkIDB9KX1wYXJzZUFyZ3VtZW50cyh0KXtjb25zdCBuPXQ/dGhpcy5wYXJzZUNvbnN0QXJndW1lbnQ6dGhpcy5wYXJzZUFyZ3VtZW50O3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLlBBUkVOX0wsbixsLlBBUkVOX1IpfXBhcnNlQXJndW1lbnQodD0hMSl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5BUkdVTUVOVCxuYW1lOmksdmFsdWU6dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KX0pfXBhcnNlQ29uc3RBcmd1bWVudCgpe3JldHVybiB0aGlzLnBhcnNlQXJndW1lbnQoITApfXBhcnNlRnJhZ21lbnQoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0VG9rZW4obC5TUFJFQUQpO2NvbnN0IG49dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoIm9uIik7cmV0dXJuIW4mJnRoaXMucGVlayhsLk5BTUUpP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfU1BSRUFELG5hbWU6dGhpcy5wYXJzZUZyYWdtZW50TmFtZSgpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpfSk6dGhpcy5ub2RlKHQse2tpbmQ6VC5JTkxJTkVfRlJBR01FTlQsdHlwZUNvbmRpdGlvbjpuP3RoaXMucGFyc2VOYW1lZFR5cGUoKTp2b2lkIDAsZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5leHBlY3RLZXl3b3JkKCJmcmFnbWVudCIpLHRoaXMuX29wdGlvbnMuYWxsb3dMZWdhY3lGcmFnbWVudFZhcmlhYmxlcz09PSEwP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksdHlwZUNvbmRpdGlvbjoodGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpLHRoaXMucGFyc2VOYW1lZFR5cGUoKSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pOnRoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx0eXBlQ29uZGl0aW9uOih0aGlzLmV4cGVjdEtleXdvcmQoIm9uIiksdGhpcy5wYXJzZU5hbWVkVHlwZSgpKSxkaXJlY3RpdmVzOnRoaXMucGFyc2VEaXJlY3RpdmVzKCExKSxzZWxlY3Rpb25TZXQ6dGhpcy5wYXJzZVNlbGVjdGlvblNldCgpfSl9cGFyc2VGcmFnbWVudE5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJvbiIpdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMucGFyc2VOYW1lKCl9cGFyc2VWYWx1ZUxpdGVyYWwodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtzd2l0Y2gobi5raW5kKXtjYXNlIGwuQlJBQ0tFVF9MOnJldHVybiB0aGlzLnBhcnNlTGlzdCh0KTtjYXNlIGwuQlJBQ0VfTDpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdCh0KTtjYXNlIGwuSU5UOnJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZShuLHtraW5kOlQuSU5ULHZhbHVlOm4udmFsdWV9KTtjYXNlIGwuRkxPQVQ6cmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksdGhpcy5ub2RlKG4se2tpbmQ6VC5GTE9BVCx2YWx1ZTpuLnZhbHVlfSk7Y2FzZSBsLlNUUklORzpjYXNlIGwuQkxPQ0tfU1RSSU5HOnJldHVybiB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCgpO2Nhc2UgbC5OQU1FOnN3aXRjaCh0aGlzLmFkdmFuY2VMZXhlcigpLG4udmFsdWUpe2Nhc2UidHJ1ZSI6cmV0dXJuIHRoaXMubm9kZShuLHtraW5kOlQuQk9PTEVBTix2YWx1ZTohMH0pO2Nhc2UiZmFsc2UiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkJPT0xFQU4sdmFsdWU6ITF9KTtjYXNlIm51bGwiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULk5VTEx9KTtkZWZhdWx0OnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkVOVU0sdmFsdWU6bi52YWx1ZX0pfWNhc2UgbC5ET0xMQVI6aWYodClpZih0aGlzLmV4cGVjdFRva2VuKGwuRE9MTEFSKSx0aGlzLl9sZXhlci50b2tlbi5raW5kPT09bC5OQU1FKXtjb25zdCBpPXRoaXMuX2xleGVyLnRva2VuLnZhbHVlO3Rocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYFVuZXhwZWN0ZWQgdmFyaWFibGUgIiQke2l9IiBpbiBjb25zdGFudCB2YWx1ZS5gKX1lbHNlIHRocm93IHRoaXMudW5leHBlY3RlZChuKTtyZXR1cm4gdGhpcy5wYXJzZVZhcmlhYmxlKCk7ZGVmYXVsdDp0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKX19cGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpe3JldHVybiB0aGlzLnBhcnNlVmFsdWVMaXRlcmFsKCEwKX1wYXJzZVN0cmluZ0xpdGVyYWwoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZSh0LHtraW5kOlQuU1RSSU5HLHZhbHVlOnQudmFsdWUsYmxvY2s6dC5raW5kPT09bC5CTE9DS19TVFJJTkd9KX1wYXJzZUxpc3QodCl7Y29uc3Qgbj0oKT0+dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KTtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTElTVCx2YWx1ZXM6dGhpcy5hbnkobC5CUkFDS0VUX0wsbixsLkJSQUNLRVRfUil9KX1wYXJzZU9iamVjdCh0KXtjb25zdCBuPSgpPT50aGlzLnBhcnNlT2JqZWN0RmllbGQodCk7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpULk9CSkVDVCxmaWVsZHM6dGhpcy5hbnkobC5CUkFDRV9MLG4sbC5CUkFDRV9SKX0pfXBhcnNlT2JqZWN0RmllbGQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5PQkpFQ1RfRklFTEQsbmFtZTppLHZhbHVlOnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCl9KX1wYXJzZURpcmVjdGl2ZXModCl7Y29uc3Qgbj1bXTtmb3IoO3RoaXMucGVlayhsLkFUKTspbi5wdXNoKHRoaXMucGFyc2VEaXJlY3RpdmUodCkpO3JldHVybiBufXBhcnNlQ29uc3REaXJlY3RpdmVzKCl7cmV0dXJuIHRoaXMucGFyc2VEaXJlY3RpdmVzKCEwKX1wYXJzZURpcmVjdGl2ZSh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQVQpLHRoaXMubm9kZShuLHtraW5kOlQuRElSRUNUSVZFLG5hbWU6dGhpcy5wYXJzZU5hbWUoKSxhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyh0KX0pfXBhcnNlVHlwZVJlZmVyZW5jZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47bGV0IG47aWYodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQlJBQ0tFVF9MKSl7Y29uc3QgaT10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpO3RoaXMuZXhwZWN0VG9rZW4obC5CUkFDS0VUX1IpLG49dGhpcy5ub2RlKHQse2tpbmQ6VC5MSVNUX1RZUEUsdHlwZTppfSl9ZWxzZSBuPXRoaXMucGFyc2VOYW1lZFR5cGUoKTtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQkFORyk/dGhpcy5ub2RlKHQse2tpbmQ6VC5OT05fTlVMTF9UWVBFLHR5cGU6bn0pOm59cGFyc2VOYW1lZFR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTkFNRURfVFlQRSxuYW1lOnRoaXMucGFyc2VOYW1lKCl9KX1wZWVrRGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1RSSU5HKXx8dGhpcy5wZWVrKGwuQkxPQ0tfU1RSSU5HKX1wYXJzZURlc2NyaXB0aW9uKCl7aWYodGhpcy5wZWVrRGVzY3JpcHRpb24oKSlyZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoKX1wYXJzZVNjaGVtYURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJzY2hlbWEiKTtjb25zdCBpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZU9wZXJhdGlvblR5cGVEZWZpbml0aW9uLGwuQlJBQ0VfUik7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuU0NIRU1BX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixkaXJlY3RpdmVzOmksb3BlcmF0aW9uVHlwZXM6cn0pfXBhcnNlT3BlcmF0aW9uVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU9wZXJhdGlvblR5cGUoKTt0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWVkVHlwZSgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9UWVBFX0RFRklOSVRJT04sb3BlcmF0aW9uOm4sdHlwZTppfSl9cGFyc2VTY2FsYXJUeXBlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoInNjYWxhciIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5TQ0FMQVJfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cn0pfXBhcnNlT2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJ0eXBlIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCkscz10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCksYT10aGlzLnBhcnNlRmllbGRzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksaW50ZXJmYWNlczpyLGRpcmVjdGl2ZXM6cyxmaWVsZHM6YX0pfXBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKXtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoImltcGxlbWVudHMiKT90aGlzLmRlbGltaXRlZE1hbnkobC5BTVAsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlRmllbGREZWZpbml0aW9uLGwuQlJBQ0VfUil9cGFyc2VGaWVsZERlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpO3RoaXMuZXhwZWN0VG9rZW4obC5DT0xPTik7Y29uc3Qgcz10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpLGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkZJRUxEX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIsdHlwZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlQXJndW1lbnREZWZzKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuUEFSRU5fTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLlBBUkVOX1IpfXBhcnNlSW5wdXRWYWx1ZURlZigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKSxpPXRoaXMucGFyc2VOYW1lKCk7dGhpcy5leHBlY3RUb2tlbihsLkNPTE9OKTtjb25zdCByPXRoaXMucGFyc2VUeXBlUmVmZXJlbmNlKCk7bGV0IHM7dGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuRVFVQUxTKSYmKHM9dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCkpO2NvbnN0IGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOUFVUX1ZBTFVFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksdHlwZTpyLGRlZmF1bHRWYWx1ZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnRlcmZhY2UiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxzPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxhPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuSU5URVJGQUNFX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxpbnRlcmZhY2VzOnIsZGlyZWN0aXZlczpzLGZpZWxkczphfSl9cGFyc2VVbmlvblR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscz10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnIsdHlwZXM6c30pfXBhcnNlVW5pb25NZW1iZXJUeXBlcygpe3JldHVybiB0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4obC5FUVVBTFMpP3RoaXMuZGVsaW1pdGVkTWFueShsLlBJUEUsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VFbnVtVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyLHZhbHVlczpzfSl9cGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUVudW1WYWx1ZURlZmluaXRpb24sbC5CUkFDRV9SKX1wYXJzZUVudW1WYWx1ZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlRW51bVZhbHVlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkVOVU1fVkFMVUVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnJ9KX1wYXJzZUVudW1WYWx1ZU5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJ0cnVlInx8dGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0iZmFsc2UifHx0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJudWxsIil0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSx0aGlzLl9sZXhlci50b2tlbi5zdGFydCxgJHtDZSh0aGlzLl9sZXhlci50b2tlbil9IGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgYW4gZW51bSB2YWx1ZS5gKTtyZXR1cm4gdGhpcy5wYXJzZU5hbWUoKX1wYXJzZUlucHV0T2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLkJSQUNFX1IpfXBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk7aWYodC5raW5kPT09bC5OQU1FKXN3aXRjaCh0LnZhbHVlKXtjYXNlInNjaGVtYSI6cmV0dXJuIHRoaXMucGFyc2VTY2hlbWFFeHRlbnNpb24oKTtjYXNlInNjYWxhciI6cmV0dXJuIHRoaXMucGFyc2VTY2FsYXJUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVFeHRlbnNpb24oKTtjYXNlImludGVyZmFjZSI6cmV0dXJuIHRoaXMucGFyc2VJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ1bmlvbiI6cmV0dXJuIHRoaXMucGFyc2VVbmlvblR5cGVFeHRlbnNpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVFeHRlbnNpb24oKTtjYXNlImlucHV0IjpyZXR1cm4gdGhpcy5wYXJzZUlucHV0T2JqZWN0VHlwZUV4dGVuc2lvbigpfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVNjaGVtYUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInNjaGVtYSIpO2NvbnN0IG49dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLGk9dGhpcy5vcHRpb25hbE1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VPcGVyYXRpb25UeXBlRGVmaW5pdGlvbixsLkJSQUNFX1IpO2lmKG4ubGVuZ3RoPT09MCYmaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDSEVNQV9FWFRFTlNJT04sZGlyZWN0aXZlczpuLG9wZXJhdGlvblR5cGVzOml9KX1wYXJzZVNjYWxhclR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJzY2FsYXIiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCk7aWYoaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDQUxBUl9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppfSl9cGFyc2VPYmplY3RUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidHlwZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW50ZXJmYWNlVHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoImludGVyZmFjZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlVW5pb25UeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO2lmKGkubGVuZ3RoPT09MCYmci5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfRVhURU5TSU9OLG5hbWU6bixkaXJlY3RpdmVzOmksdHlwZXM6cn0pfXBhcnNlRW51bVR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHI9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTApdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppLHZhbHVlczpyfSl9cGFyc2VJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pfXBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoImRpcmVjdGl2ZSIpLHRoaXMuZXhwZWN0VG9rZW4obC5BVCk7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpLHM9dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoInJlcGVhdGFibGUiKTt0aGlzLmV4cGVjdEtleXdvcmQoIm9uIik7Y29uc3QgYT10aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb25zKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRElSRUNUSVZFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIscmVwZWF0YWJsZTpzLGxvY2F0aW9uczphfSl9cGFyc2VEaXJlY3RpdmVMb2NhdGlvbnMoKXtyZXR1cm4gdGhpcy5kZWxpbWl0ZWRNYW55KGwuUElQRSx0aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb24pfXBhcnNlRGlyZWN0aXZlTG9jYXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU5hbWUoKTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUWUsbi52YWx1ZSkpcmV0dXJuIG47dGhyb3cgdGhpcy51bmV4cGVjdGVkKHQpfW5vZGUodCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5ub0xvY2F0aW9uIT09ITAmJihuLmxvYz1uZXcgYm4odCx0aGlzLl9sZXhlci5sYXN0VG9rZW4sdGhpcy5fbGV4ZXIuc291cmNlKSksbn1wZWVrKHQpe3JldHVybiB0aGlzLl9sZXhlci50b2tlbi5raW5kPT09dH1leHBlY3RUb2tlbih0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO2lmKG4ua2luZD09PXQpcmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksbjt0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAke2t0KHQpfSwgZm91bmQgJHtDZShuKX0uYCl9ZXhwZWN0T3B0aW9uYWxUb2tlbih0KXtyZXR1cm4gdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PXQ/KHRoaXMuYWR2YW5jZUxleGVyKCksITApOiExfWV4cGVjdEtleXdvcmQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtpZihuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10KXRoaXMuYWR2YW5jZUxleGVyKCk7ZWxzZSB0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAiJHt0fSIsIGZvdW5kICR7Q2Uobil9LmApfWV4cGVjdE9wdGlvbmFsS2V5d29yZCh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiBuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10Pyh0aGlzLmFkdmFuY2VMZXhlcigpLCEwKTohMX11bmV4cGVjdGVkKHQpe2NvbnN0IG49dCE9bnVsbD90OnRoaXMuX2xleGVyLnRva2VuO3JldHVybiBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBVbmV4cGVjdGVkICR7Q2Uobil9LmApfWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2Zvcig7IXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKTspci5wdXNoKG4uY2FsbCh0aGlzKSk7cmV0dXJuIHJ9b3B0aW9uYWxNYW55KHQsbixpKXtpZih0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpe2NvbnN0IHI9W107ZG8gci5wdXNoKG4uY2FsbCh0aGlzKSk7d2hpbGUoIXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKSk7cmV0dXJuIHJ9cmV0dXJuW119bWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2RvIHIucHVzaChuLmNhbGwodGhpcykpO3doaWxlKCF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSkpO3JldHVybiByfWRlbGltaXRlZE1hbnkodCxuKXt0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCk7Y29uc3QgaT1bXTtkbyBpLnB1c2gobi5jYWxsKHRoaXMpKTt3aGlsZSh0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpO3JldHVybiBpfWFkdmFuY2VMZXhlcigpe2NvbnN0e21heFRva2Vuczp0fT10aGlzLl9vcHRpb25zLG49dGhpcy5fbGV4ZXIuYWR2YW5jZSgpO2lmKHQhPT12b2lkIDAmJm4ua2luZCE9PWwuRU9GJiYoKyt0aGlzLl90b2tlbkNvdW50ZXIsdGhpcy5fdG9rZW5Db3VudGVyPnQpKXRocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYERvY3VtZW50IGNvbnRhaW5zIG1vcmUgdGhhdCAke3R9IHRva2Vucy4gUGFyc2luZyBhYm9ydGVkLmApfX1mdW5jdGlvbiBDZShlKXtjb25zdCB0PWUudmFsdWU7cmV0dXJuIGt0KGUua2luZCkrKHQhPW51bGw/YCAiJHt0fSJgOiIiKX1mdW5jdGlvbiBrdChlKXtyZXR1cm4gd24oZSk/YCIke2V9ImA6ZX1mdW5jdGlvbiBKbihlKXtyZXR1cm5gIiR7ZS5yZXBsYWNlKFFuLFhuKX0iYH1jb25zdCBRbj0vW1x4MDAtXHgxZlx4MjJceDVjXHg3Zi1ceDlmXS9nO2Z1bmN0aW9uIFhuKGUpe3JldHVybiBXbltlLmNoYXJDb2RlQXQoMCldfWNvbnN0IFduPVsiXFx1MDAwMCIsIlxcdTAwMDEiLCJcXHUwMDAyIiwiXFx1MDAwMyIsIlxcdTAwMDQiLCJcXHUwMDA1IiwiXFx1MDAwNiIsIlxcdTAwMDciLCJcXGIiLCJcXHQiLCJcXG4iLCJcXHUwMDBCIiwiXFxmIiwiXFxyIiwiXFx1MDAwRSIsIlxcdTAwMEYiLCJcXHUwMDEwIiwiXFx1MDAxMSIsIlxcdTAwMTIiLCJcXHUwMDEzIiwiXFx1MDAxNCIsIlxcdTAwMTUiLCJcXHUwMDE2IiwiXFx1MDAxNyIsIlxcdTAwMTgiLCJcXHUwMDE5IiwiXFx1MDAxQSIsIlxcdTAwMUIiLCJcXHUwMDFDIiwiXFx1MDAxRCIsIlxcdTAwMUUiLCJcXHUwMDFGIiwiIiwiIiwnXFwiJywiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiXFxcXCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIlxcdTAwN0YiLCJcXHUwMDgwIiwiXFx1MDA4MSIsIlxcdTAwODIiLCJcXHUwMDgzIiwiXFx1MDA4NCIsIlxcdTAwODUiLCJcXHUwMDg2IiwiXFx1MDA4NyIsIlxcdTAwODgiLCJcXHUwMDg5IiwiXFx1MDA4QSIsIlxcdTAwOEIiLCJcXHUwMDhDIiwiXFx1MDA4RCIsIlxcdTAwOEUiLCJcXHUwMDhGIiwiXFx1MDA5MCIsIlxcdTAwOTEiLCJcXHUwMDkyIiwiXFx1MDA5MyIsIlxcdTAwOTQiLCJcXHUwMDk1IiwiXFx1MDA5NiIsIlxcdTAwOTciLCJcXHUwMDk4IiwiXFx1MDA5OSIsIlxcdTAwOUEiLCJcXHUwMDlCIiwiXFx1MDA5QyIsIlxcdTAwOUQiLCJcXHUwMDlFIiwiXFx1MDA5RiJdLFpuPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEtuKGUsdCxuPWJ0KXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IEUgb2YgT2JqZWN0LnZhbHVlcyhUKSlpLnNldChFLGVyKHQsRSkpO2xldCByLHM9QXJyYXkuaXNBcnJheShlKSxhPVtlXSxjPS0xLGY9W10sZD1lLHUseTtjb25zdCB2PVtdLGI9W107ZG97YysrO2NvbnN0IEU9Yz09PWEubGVuZ3RoLGs9RSYmZi5sZW5ndGghPT0wO2lmKEUpe2lmKHU9Yi5sZW5ndGg9PT0wP3ZvaWQgMDp2W3YubGVuZ3RoLTFdLGQ9eSx5PWIucG9wKCksaylpZihzKXtkPWQuc2xpY2UoKTtsZXQgTD0wO2Zvcihjb25zdFskLHFdb2YgZil7Y29uc3QgQj0kLUw7cT09PW51bGw/KGQuc3BsaWNlKEIsMSksTCsrKTpkW0JdPXF9fWVsc2V7ZD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkKSk7Zm9yKGNvbnN0W0wsJF1vZiBmKWRbTF09JH1jPXIuaW5kZXgsYT1yLmtleXMsZj1yLmVkaXRzLHM9ci5pbkFycmF5LHI9ci5wcmV2fWVsc2UgaWYoeSl7aWYodT1zP2M6YVtjXSxkPXlbdV0sZD09bnVsbCljb250aW51ZTt2LnB1c2godSl9bGV0IHc7aWYoIUFycmF5LmlzQXJyYXkoZCkpe3ZhciBtLE47TnQoZCl8fFNlKCExLGBJbnZhbGlkIEFTVCBOb2RlOiAke1plKGQpfS5gKTtjb25zdCBMPUU/KG09aS5nZXQoZC5raW5kKSk9PT1udWxsfHxtPT09dm9pZCAwP3ZvaWQgMDptLmxlYXZlOihOPWkuZ2V0KGQua2luZCkpPT09bnVsbHx8Tj09PXZvaWQgMD92b2lkIDA6Ti5lbnRlcjtpZih3PUw9PW51bGw/dm9pZCAwOkwuY2FsbCh0LGQsdSx5LHYsYiksdz09PVpuKWJyZWFrO2lmKHc9PT0hMSl7aWYoIUUpe3YucG9wKCk7Y29udGludWV9fWVsc2UgaWYodyE9PXZvaWQgMCYmKGYucHVzaChbdSx3XSksIUUpKWlmKE50KHcpKWQ9dztlbHNle3YucG9wKCk7Y29udGludWV9fWlmKHc9PT12b2lkIDAmJmsmJmYucHVzaChbdSxkXSksRSl2LnBvcCgpO2Vsc2V7dmFyIGc7cj17aW5BcnJheTpzLGluZGV4OmMsa2V5czphLGVkaXRzOmYscHJldjpyfSxzPUFycmF5LmlzQXJyYXkoZCksYT1zP2Q6KGc9bltkLmtpbmRdKSE9PW51bGwmJmchPT12b2lkIDA/ZzpbXSxjPS0xLGY9W10seSYmYi5wdXNoKHkpLHk9ZH19d2hpbGUociE9PXZvaWQgMCk7cmV0dXJuIGYubGVuZ3RoIT09MD9mW2YubGVuZ3RoLTFdWzFdOmV9ZnVuY3Rpb24gZXIoZSx0KXtjb25zdCBuPWVbdF07cmV0dXJuIHR5cGVvZiBuPT0ib2JqZWN0Ij9uOnR5cGVvZiBuPT0iZnVuY3Rpb24iP3tlbnRlcjpuLGxlYXZlOnZvaWQgMH06e2VudGVyOmUuZW50ZXIsbGVhdmU6ZS5sZWF2ZX19ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIEtuKGUscnIpfWNvbnN0IG5yPTgwLHJyPXtOYW1lOntsZWF2ZTplPT5lLnZhbHVlfSxWYXJpYWJsZTp7bGVhdmU6ZT0+IiQiK2UubmFtZX0sRG9jdW1lbnQ6e2xlYXZlOmU9PnAoZS5kZWZpbml0aW9ucyxgCgpgKX0sT3BlcmF0aW9uRGVmaW5pdGlvbjp7bGVhdmUoZSl7Y29uc3QgdD1TKCIoIixwKGUudmFyaWFibGVEZWZpbml0aW9ucywiLCAiKSwiKSIpLG49cChbZS5vcGVyYXRpb24scChbZS5uYW1lLHRdKSxwKGUuZGlyZWN0aXZlcywiICIpXSwiICIpO3JldHVybihuPT09InF1ZXJ5Ij8iIjpuKyIgIikrZS5zZWxlY3Rpb25TZXR9fSxWYXJpYWJsZURlZmluaXRpb246e2xlYXZlOih7dmFyaWFibGU6ZSx0eXBlOnQsZGVmYXVsdFZhbHVlOm4sZGlyZWN0aXZlczppfSk9PmUrIjogIit0K1MoIiA9ICIsbikrUygiICIscChpLCIgIikpfSxTZWxlY3Rpb25TZXQ6e2xlYXZlOih7c2VsZWN0aW9uczplfSk9PlooZSl9LEZpZWxkOntsZWF2ZSh7YWxpYXM6ZSxuYW1lOnQsYXJndW1lbnRzOm4sZGlyZWN0aXZlczppLHNlbGVjdGlvblNldDpyfSl7Y29uc3Qgcz1TKCIiLGUsIjogIikrdDtsZXQgYT1zK1MoIigiLHAobiwiLCAiKSwiKSIpO3JldHVybiBhLmxlbmd0aD5uciYmKGE9cytTKGAoCmAsa2UocChuLGAKYCkpLGAKKWApKSxwKFthLHAoaSwiICIpLHJdLCIgIil9fSxBcmd1bWVudDp7bGVhdmU6KHtuYW1lOmUsdmFsdWU6dH0pPT5lKyI6ICIrdH0sRnJhZ21lbnRTcHJlYWQ6e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT4iLi4uIitlK1MoIiAiLHAodCwiICIpKX0sSW5saW5lRnJhZ21lbnQ6e2xlYXZlOih7dHlwZUNvbmRpdGlvbjplLGRpcmVjdGl2ZXM6dCxzZWxlY3Rpb25TZXQ6bn0pPT5wKFsiLi4uIixTKCJvbiAiLGUpLHAodCwiICIpLG5dLCIgIil9LEZyYWdtZW50RGVmaW5pdGlvbjp7bGVhdmU6KHtuYW1lOmUsdHlwZUNvbmRpdGlvbjp0LHZhcmlhYmxlRGVmaW5pdGlvbnM6bixkaXJlY3RpdmVzOmksc2VsZWN0aW9uU2V0OnJ9KT0+YGZyYWdtZW50ICR7ZX0ke1MoIigiLHAobiwiLCAiKSwiKSIpfSBvbiAke3R9ICR7UygiIixwKGksIiAiKSwiICIpfWArcn0sSW50VmFsdWU6e2xlYXZlOih7dmFsdWU6ZX0pPT5lfSxGbG9hdFZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sU3RyaW5nVmFsdWU6e2xlYXZlOih7dmFsdWU6ZSxibG9jazp0fSk9PnQ/T24oZSk6Sm4oZSl9LEJvb2xlYW5WYWx1ZTp7bGVhdmU6KHt2YWx1ZTplfSk9PmU/InRydWUiOiJmYWxzZSJ9LE51bGxWYWx1ZTp7bGVhdmU6KCk9PiJudWxsIn0sRW51bVZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sTGlzdFZhbHVlOntsZWF2ZTooe3ZhbHVlczplfSk9PiJbIitwKGUsIiwgIikrIl0ifSxPYmplY3RWYWx1ZTp7bGVhdmU6KHtmaWVsZHM6ZX0pPT4ieyIrcChlLCIsICIpKyJ9In0sT2JqZWN0RmllbGQ6e2xlYXZlOih7bmFtZTplLHZhbHVlOnR9KT0+ZSsiOiAiK3R9LERpcmVjdGl2ZTp7bGVhdmU6KHtuYW1lOmUsYXJndW1lbnRzOnR9KT0+IkAiK2UrUygiKCIscCh0LCIsICIpLCIpIil9LE5hbWVkVHlwZTp7bGVhdmU6KHtuYW1lOmV9KT0+ZX0sTGlzdFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PiJbIitlKyJdIn0sTm9uTnVsbFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PmUrIiEifSxTY2hlbWFEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsZGlyZWN0aXZlczp0LG9wZXJhdGlvblR5cGVzOm59KT0+UygiIixlLGAKYCkrcChbInNjaGVtYSIscCh0LCIgIiksWihuKV0sIiAiKX0sT3BlcmF0aW9uVHlwZURlZmluaXRpb246e2xlYXZlOih7b3BlcmF0aW9uOmUsdHlwZTp0fSk9PmUrIjogIit0fSxTY2FsYXJUeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm59KT0+UygiIixlLGAKYCkrcChbInNjYWxhciIsdCxwKG4sIiAiKV0sIiAiKX0sT2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsaW50ZXJmYWNlczpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pPT5TKCIiLGUsYApgKStwKFsidHlwZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sRmllbGREZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHR5cGU6aSxkaXJlY3RpdmVzOnJ9KT0+UygiIixlLGAKYCkrdCsoUnQobik/UyhgKApgLGtlKHAobixgCmApKSxgCilgKTpTKCIoIixwKG4sIiwgIiksIikiKSkrIjogIitpK1MoIiAiLHAociwiICIpKX0sSW5wdXRWYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsdHlwZTpuLGRlZmF1bHRWYWx1ZTppLGRpcmVjdGl2ZXM6cn0pPT5TKCIiLGUsYApgKStwKFt0KyI6ICIrbixTKCI9ICIsaSkscChyLCIgIildLCIgIil9LEludGVyZmFjZVR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGludGVyZmFjZXM6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KT0+UygiIixlLGAKYCkrcChbImludGVyZmFjZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sVW5pb25UeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm4sdHlwZXM6aX0pPT5TKCIiLGUsYApgKStwKFsidW5pb24iLHQscChuLCIgIiksUygiPSAiLHAoaSwiIHwgIikpXSwiICIpfSxFbnVtVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLHZhbHVlczppfSk9PlMoIiIsZSxgCmApK3AoWyJlbnVtIix0LHAobiwiICIpLFooaSldLCIgIil9LEVudW1WYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpufSk9PlMoIiIsZSxgCmApK3AoW3QscChuLCIgIildLCIgIil9LElucHV0T2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLGZpZWxkczppfSk9PlMoIiIsZSxgCmApK3AoWyJpbnB1dCIsdCxwKG4sIiAiKSxaKGkpXSwiICIpfSxEaXJlY3RpdmVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHJlcGVhdGFibGU6aSxsb2NhdGlvbnM6cn0pPT5TKCIiLGUsYApgKSsiZGlyZWN0aXZlIEAiK3QrKFJ0KG4pP1MoYCgKYCxrZShwKG4sYApgKSksYAopYCk6UygiKCIscChuLCIsICIpLCIpIikpKyhpPyIgcmVwZWF0YWJsZSI6IiIpKyIgb24gIitwKHIsIiB8ICIpfSxTY2hlbWFFeHRlbnNpb246e2xlYXZlOih7ZGlyZWN0aXZlczplLG9wZXJhdGlvblR5cGVzOnR9KT0+cChbImV4dGVuZCBzY2hlbWEiLHAoZSwiICIpLFoodCldLCIgIil9LFNjYWxhclR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT5wKFsiZXh0ZW5kIHNjYWxhciIsZSxwKHQsIiAiKV0sIiAiKX0sT2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsaW50ZXJmYWNlczp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5wKFsiZXh0ZW5kIHR5cGUiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LEludGVyZmFjZVR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGludGVyZmFjZXM6dCxkaXJlY3RpdmVzOm4sZmllbGRzOml9KT0+cChbImV4dGVuZCBpbnRlcmZhY2UiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LFVuaW9uVHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LHR5cGVzOm59KT0+cChbImV4dGVuZCB1bmlvbiIsZSxwKHQsIiAiKSxTKCI9ICIscChuLCIgfCAiKSldLCIgIil9LEVudW1UeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxkaXJlY3RpdmVzOnQsdmFsdWVzOm59KT0+cChbImV4dGVuZCBlbnVtIixlLHAodCwiICIpLFoobildLCIgIil9LElucHV0T2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LGZpZWxkczpufSk9PnAoWyJleHRlbmQgaW5wdXQiLGUscCh0LCIgIiksWihuKV0sIiAiKX19O2Z1bmN0aW9uIHAoZSx0PSIiKXt2YXIgbjtyZXR1cm4obj1lPT1udWxsP3ZvaWQgMDplLmZpbHRlcihpPT5pKS5qb2luKHQpKSE9PW51bGwmJm4hPT12b2lkIDA/bjoiIn1mdW5jdGlvbiBaKGUpe3JldHVybiBTKGB7CmAsa2UocChlLGAKYCkpLGAKfWApfWZ1bmN0aW9uIFMoZSx0LG49IiIpe3JldHVybiB0IT1udWxsJiZ0IT09IiI/ZSt0K246IiJ9ZnVuY3Rpb24ga2UoZSl7cmV0dXJuIFMoIiAgIixlLnJlcGxhY2UoL1xuL2csYAogIGApKX1mdW5jdGlvbiBSdChlKXt2YXIgdDtyZXR1cm4odD1lPT1udWxsP3ZvaWQgMDplLnNvbWUobj0+bi5pbmNsdWRlcyhgCmApKSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6ITF9Y29uc3QgUHQ9ZT0+e3ZhciBpLHI7bGV0IHQ7Y29uc3Qgbj1lLmRlZmluaXRpb25zLmZpbHRlcihzPT5zLmtpbmQ9PT0iT3BlcmF0aW9uRGVmaW5pdGlvbiIpO3JldHVybiBuLmxlbmd0aD09PTEmJih0PShyPShpPW5bMF0pPT1udWxsP3ZvaWQgMDppLm5hbWUpPT1udWxsP3ZvaWQgMDpyLnZhbHVlKSx0fSxLZT1lPT57aWYodHlwZW9mIGU9PSJzdHJpbmciKXtsZXQgbjt0cnl7Y29uc3QgaT1DdChlKTtuPVB0KGkpfWNhdGNoKGkpe31yZXR1cm57cXVlcnk6ZSxvcGVyYXRpb25OYW1lOm59fWNvbnN0IHQ9UHQoZSk7cmV0dXJue3F1ZXJ5OnRyKGUpLG9wZXJhdGlvbk5hbWU6dH19O2NsYXNzIGhlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtjb25zdCBpPWAke2hlLmV4dHJhY3RNZXNzYWdlKHQpfTogJHtKU09OLnN0cmluZ2lmeSh7cmVzcG9uc2U6dCxyZXF1ZXN0Om59KX1gO3N1cGVyKGkpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGhlLnByb3RvdHlwZSksdGhpcy5yZXNwb25zZT10LHRoaXMucmVxdWVzdD1uLHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT09ImZ1bmN0aW9uIiYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxoZSl9c3RhdGljIGV4dHJhY3RNZXNzYWdlKHQpe3ZhciBuLGkscjtyZXR1cm4ocj0oaT0obj10LmVycm9ycyk9PW51bGw/dm9pZCAwOm5bMF0pPT1udWxsP3ZvaWQgMDppLm1lc3NhZ2UpIT1udWxsP3I6YEdyYXBoUUwgRXJyb3IgKENvZGU6ICR7dC5zdGF0dXN9KWB9fXZhciBpcj10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOnt9O2Z1bmN0aW9uIEx0KGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIGV0PXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjppcixpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcygpe3RoaXMuZmV0Y2g9ITEsdGhpcy5ET01FeGNlcHRpb249bi5ET01FeGNlcHRpb259cmV0dXJuIHMucHJvdG90eXBlPW4sbmV3IHN9KCk7KGZ1bmN0aW9uKHMpeyhmdW5jdGlvbihhKXt2YXIgYz17c2VhcmNoUGFyYW1zOiJVUkxTZWFyY2hQYXJhbXMiaW4gcyxpdGVyYWJsZToiU3ltYm9sImluIHMmJiJpdGVyYXRvciJpbiBTeW1ib2wsYmxvYjoiRmlsZVJlYWRlciJpbiBzJiYiQmxvYiJpbiBzJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2gobyl7cmV0dXJuITF9fSgpLGZvcm1EYXRhOiJGb3JtRGF0YSJpbiBzLGFycmF5QnVmZmVyOiJBcnJheUJ1ZmZlciJpbiBzfTtmdW5jdGlvbiBmKG8pe3JldHVybiBvJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKX1pZihjLmFycmF5QnVmZmVyKXZhciBkPVsiW29iamVjdCBJbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OEFycmF5XSIsIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwiW29iamVjdCBJbnQxNkFycmF5XSIsIltvYmplY3QgVWludDE2QXJyYXldIiwiW29iamVjdCBJbnQzMkFycmF5XSIsIltvYmplY3QgVWludDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDY0QXJyYXldIl0sdT1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKG8pe3JldHVybiBvJiZkLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKT4tMX07ZnVuY3Rpb24geShvKXtpZih0eXBlb2YgbyE9InN0cmluZyImJihvPVN0cmluZyhvKSksL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gby50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHYobyl7cmV0dXJuIHR5cGVvZiBvIT0ic3RyaW5nIiYmKG89U3RyaW5nKG8pKSxvfWZ1bmN0aW9uIGIobyl7dmFyIGg9e25leHQ6ZnVuY3Rpb24oKXt2YXIgXz1vLnNoaWZ0KCk7cmV0dXJue2RvbmU6Xz09PXZvaWQgMCx2YWx1ZTpffX19O3JldHVybiBjLml0ZXJhYmxlJiYoaFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIGh9KSxofWZ1bmN0aW9uIG0obyl7dGhpcy5tYXA9e30sbyBpbnN0YW5jZW9mIG0/by5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7dGhpcy5hcHBlbmQoXyxoKX0sdGhpcyk6QXJyYXkuaXNBcnJheShvKT9vLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5hcHBlbmQoaFswXSxoWzFdKX0sdGhpcyk6byYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihoKXt0aGlzLmFwcGVuZChoLG9baF0pfSx0aGlzKX1tLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obyxoKXtvPXkobyksaD12KGgpO3ZhciBfPXRoaXMubWFwW29dO3RoaXMubWFwW29dPV8/XysiLCAiK2g6aH0sbS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG8pe2RlbGV0ZSB0aGlzLm1hcFt5KG8pXX0sbS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG8pe3JldHVybiBvPXkobyksdGhpcy5oYXMobyk/dGhpcy5tYXBbb106bnVsbH0sbS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eSh5KG8pKX0sbS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG8saCl7dGhpcy5tYXBbeShvKV09dihoKX0sbS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihvLGgpe2Zvcih2YXIgXyBpbiB0aGlzLm1hcCl0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShfKSYmby5jYWxsKGgsdGhpcy5tYXBbX10sXyx0aGlzKX0sbS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBvPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaCxfKXtvLnB1c2goXyl9KSxiKG8pfSxtLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe28ucHVzaChoKX0pLGIobyl9LG0ucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7by5wdXNoKFtfLGhdKX0pLGIobyl9LGMuaXRlcmFibGUmJihtLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPW0ucHJvdG90eXBlLmVudHJpZXMpO2Z1bmN0aW9uIE4obyl7aWYoby5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO28uYm9keVVzZWQ9ITB9ZnVuY3Rpb24gZyhvKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oaCxfKXtvLm9ubG9hZD1mdW5jdGlvbigpe2goby5yZXN1bHQpfSxvLm9uZXJyb3I9ZnVuY3Rpb24oKXtfKG8uZXJyb3IpfX0pfWZ1bmN0aW9uIEUobyl7dmFyIGg9bmV3IEZpbGVSZWFkZXIsXz1nKGgpO3JldHVybiBoLnJlYWRBc0FycmF5QnVmZmVyKG8pLF99ZnVuY3Rpb24gayhvKXt2YXIgaD1uZXcgRmlsZVJlYWRlcixfPWcoaCk7cmV0dXJuIGgucmVhZEFzVGV4dChvKSxffWZ1bmN0aW9uIHcobyl7Zm9yKHZhciBoPW5ldyBVaW50OEFycmF5KG8pLF89bmV3IEFycmF5KGgubGVuZ3RoKSxBPTA7QTxoLmxlbmd0aDtBKyspX1tBXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGhbQV0pO3JldHVybiBfLmpvaW4oIiIpfWZ1bmN0aW9uIEwobyl7aWYoby5zbGljZSlyZXR1cm4gby5zbGljZSgwKTt2YXIgaD1uZXcgVWludDhBcnJheShvLmJ5dGVMZW5ndGgpO3JldHVybiBoLnNldChuZXcgVWludDhBcnJheShvKSksaC5idWZmZXJ9ZnVuY3Rpb24gJCgpe3JldHVybiB0aGlzLmJvZHlVc2VkPSExLHRoaXMuX2luaXRCb2R5PWZ1bmN0aW9uKG8pe3RoaXMuX2JvZHlJbml0PW8sbz90eXBlb2Ygbz09InN0cmluZyI/dGhpcy5fYm9keVRleHQ9bzpjLmJsb2ImJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yobyk/dGhpcy5fYm9keUJsb2I9bzpjLmZvcm1EYXRhJiZGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKT90aGlzLl9ib2R5Rm9ybURhdGE9bzpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pP3RoaXMuX2JvZHlUZXh0PW8udG9TdHJpbmcoKTpjLmFycmF5QnVmZmVyJiZjLmJsb2ImJmYobyk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj1MKG8uYnVmZmVyKSx0aGlzLl9ib2R5SW5pdD1uZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpOmMuYXJyYXlCdWZmZXImJihBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKXx8dShvKSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPUwobyk6dGhpcy5fYm9keVRleHQ9bz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk6dGhpcy5fYm9keVRleHQ9IiIsdGhpcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIil8fCh0eXBlb2Ygbz09InN0cmluZyI/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5fYm9keUJsb2ImJnRoaXMuX2JvZHlCbG9iLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLl9ib2R5QmxvYi50eXBlKTpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX0sYy5ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIG89Tih0aGlzKTtpZihvKXJldHVybiBvO2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm9keUFycmF5QnVmZmVyP04odGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpOnRoaXMuYmxvYigpLnRoZW4oRSl9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgbz1OKHRoaXMpO2lmKG8pcmV0dXJuIG87aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIGsodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHcodGhpcy5fYm9keUFycmF5QnVmZmVyKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dCl9LGMuZm9ybURhdGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oTyl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc312YXIgcT1bIkRFTEVURSIsIkdFVCIsIkhFQUQiLCJPUFRJT05TIiwiUE9TVCIsIlBVVCJdO2Z1bmN0aW9uIEIobyl7dmFyIGg9by50b1VwcGVyQ2FzZSgpO3JldHVybiBxLmluZGV4T2YoaCk+LTE/aDpvfWZ1bmN0aW9uIEkobyxoKXtoPWh8fHt9O3ZhciBfPWguYm9keTtpZihvIGluc3RhbmNlb2YgSSl7aWYoby5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKTt0aGlzLnVybD1vLnVybCx0aGlzLmNyZWRlbnRpYWxzPW8uY3JlZGVudGlhbHMsaC5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBtKG8uaGVhZGVycykpLHRoaXMubWV0aG9kPW8ubWV0aG9kLHRoaXMubW9kZT1vLm1vZGUsdGhpcy5zaWduYWw9by5zaWduYWwsIV8mJm8uX2JvZHlJbml0IT1udWxsJiYoXz1vLl9ib2R5SW5pdCxvLmJvZHlVc2VkPSEwKX1lbHNlIHRoaXMudXJsPVN0cmluZyhvKTtpZih0aGlzLmNyZWRlbnRpYWxzPWguY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fCJzYW1lLW9yaWdpbiIsKGguaGVhZGVyc3x8IXRoaXMuaGVhZGVycykmJih0aGlzLmhlYWRlcnM9bmV3IG0oaC5oZWFkZXJzKSksdGhpcy5tZXRob2Q9QihoLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiKSx0aGlzLm1vZGU9aC5tb2RlfHx0aGlzLm1vZGV8fG51bGwsdGhpcy5zaWduYWw9aC5zaWduYWx8fHRoaXMuc2lnbmFsLHRoaXMucmVmZXJyZXI9bnVsbCwodGhpcy5tZXRob2Q9PT0iR0VUInx8dGhpcy5tZXRob2Q9PT0iSEVBRCIpJiZfKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5faW5pdEJvZHkoXyl9SS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEkodGhpcyx7Ym9keTp0aGlzLl9ib2R5SW5pdH0pfTtmdW5jdGlvbiBPKG8pe3ZhciBoPW5ldyBGb3JtRGF0YTtyZXR1cm4gby50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKF8pe2lmKF8pe3ZhciBBPV8uc3BsaXQoIj0iKSxSPUEuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCIgIikseD1BLmpvaW4oIj0iKS5yZXBsYWNlKC9cKy9nLCIgIik7aC5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KFIpLGRlY29kZVVSSUNvbXBvbmVudCh4KSl9fSksaH1mdW5jdGlvbiBqKG8pe3ZhciBoPW5ldyBtLF89by5yZXBsYWNlKC9ccj9cbltcdCBdKy9nLCIgIik7cmV0dXJuIF8uc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihBKXt2YXIgUj1BLnNwbGl0KCI6IikseD1SLnNoaWZ0KCkudHJpbSgpO2lmKHgpe3ZhciBzZT1SLmpvaW4oIjoiKS50cmltKCk7aC5hcHBlbmQoeCxzZSl9fSksaH0kLmNhbGwoSS5wcm90b3R5cGUpO2Z1bmN0aW9uIFUobyxoKXtofHwoaD17fSksdGhpcy50eXBlPSJkZWZhdWx0Iix0aGlzLnN0YXR1cz1oLnN0YXR1cz09PXZvaWQgMD8yMDA6aC5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIGg/aC5zdGF0dXNUZXh0OiJPSyIsdGhpcy5oZWFkZXJzPW5ldyBtKGguaGVhZGVycyksdGhpcy51cmw9aC51cmx8fCIiLHRoaXMuX2luaXRCb2R5KG8pfSQuY2FsbChVLnByb3RvdHlwZSksVS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFUodGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBtKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LFUuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgbz1uZXcgVShudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIG8udHlwZT0iZXJyb3IiLG99O3ZhciB6PVszMDEsMzAyLDMwMywzMDcsMzA4XTtVLnJlZGlyZWN0PWZ1bmN0aW9uKG8saCl7aWYoei5pbmRleE9mKGgpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IFUobnVsbCx7c3RhdHVzOmgsaGVhZGVyczp7bG9jYXRpb246b319KX0sYS5ET01FeGNlcHRpb249cy5ET01FeGNlcHRpb247dHJ5e25ldyBhLkRPTUV4Y2VwdGlvbn1jYXRjaChvKXthLkRPTUV4Y2VwdGlvbj1mdW5jdGlvbihoLF8pe3RoaXMubWVzc2FnZT1oLHRoaXMubmFtZT1fO3ZhciBBPUVycm9yKGgpO3RoaXMuc3RhY2s9QS5zdGFja30sYS5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5ET01FeGNlcHRpb259ZnVuY3Rpb24gWChvLGgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihfLEEpe3ZhciBSPW5ldyBJKG8saCk7aWYoUi5zaWduYWwmJlIuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIEEobmV3IGEuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgeD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gc2UoKXt4LmFib3J0KCl9eC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgSD17c3RhdHVzOnguc3RhdHVzLHN0YXR1c1RleHQ6eC5zdGF0dXNUZXh0LGhlYWRlcnM6aih4LmdldEFsbFJlc3BvbnNlSGVhZGVycygpfHwiIil9O0gudXJsPSJyZXNwb25zZVVSTCJpbiB4P3gucmVzcG9uc2VVUkw6SC5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO3ZhciByZT0icmVzcG9uc2UiaW4geD94LnJlc3BvbnNlOngucmVzcG9uc2VUZXh0O18obmV3IFUocmUsSCkpfSx4Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LHgub250aW1lb3V0PWZ1bmN0aW9uKCl7QShuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSx4Lm9uYWJvcnQ9ZnVuY3Rpb24oKXtBKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LHgub3BlbihSLm1ldGhvZCxSLnVybCwhMCksUi5jcmVkZW50aWFscz09PSJpbmNsdWRlIj94LndpdGhDcmVkZW50aWFscz0hMDpSLmNyZWRlbnRpYWxzPT09Im9taXQiJiYoeC53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4geCYmYy5ibG9iJiYoeC5yZXNwb25zZVR5cGU9ImJsb2IiKSxSLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihILHJlKXt4LnNldFJlcXVlc3RIZWFkZXIocmUsSCl9KSxSLnNpZ25hbCYmKFIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzZSkseC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt4LnJlYWR5U3RhdGU9PT00JiZSLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsc2UpfSkseC5zZW5kKHR5cGVvZiBSLl9ib2R5SW5pdD09InVuZGVmaW5lZCI/bnVsbDpSLl9ib2R5SW5pdCl9KX1yZXR1cm4gWC5wb2x5ZmlsbD0hMCxzLmZldGNofHwocy5mZXRjaD1YLHMuSGVhZGVycz1tLHMuUmVxdWVzdD1JLHMuUmVzcG9uc2U9VSksYS5IZWFkZXJzPW0sYS5SZXF1ZXN0PUksYS5SZXNwb25zZT1VLGEuZmV0Y2g9WCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYX0pKHt9KX0pKGkpLGkuZmV0Y2gucG9ueWZpbGw9ITAsZGVsZXRlIGkuZmV0Y2gucG9seWZpbGw7dmFyIHI9aTt0PXIuZmV0Y2gsdC5kZWZhdWx0PXIuZmV0Y2gsdC5mZXRjaD1yLmZldGNoLHQuSGVhZGVycz1yLkhlYWRlcnMsdC5SZXF1ZXN0PXIuUmVxdWVzdCx0LlJlc3BvbnNlPXIuUmVzcG9uc2UsZS5leHBvcnRzPXR9KShldCxldC5leHBvcnRzKTt2YXIgUmU9ZXQuZXhwb3J0cyxQZT1MdChSZSksc3I9TSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpQZX0sW1JlXSk7Y29uc3QgZGU9ZT0+e2xldCB0PXt9O3JldHVybiBlJiYodHlwZW9mIEhlYWRlcnMhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSGVhZGVyc3x8c3ImJlJlLkhlYWRlcnMmJmUgaW5zdGFuY2VvZiBSZS5IZWFkZXJzP3Q9ZG4oZSk6QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goKFtuLGldKT0+e24mJmkhPT12b2lkIDAmJih0W25dPWkpfSk6dD1lKSx0fSxGdD1lPT5lLnJlcGxhY2UoLyhbXHMsXXwjW15cblxyXSspKy9nLCIgIikudHJpbSgpLGFyPWU9PntpZighQXJyYXkuaXNBcnJheShlLnF1ZXJ5KSl7Y29uc3QgaT1lLHI9W2BxdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChGdChpLnF1ZXJ5KSl9YF07cmV0dXJuIGUudmFyaWFibGVzJiZyLnB1c2goYHZhcmlhYmxlcz0ke2VuY29kZVVSSUNvbXBvbmVudChpLmpzb25TZXJpYWxpemVyLnN0cmluZ2lmeShpLnZhcmlhYmxlcykpfWApLGkub3BlcmF0aW9uTmFtZSYmci5wdXNoKGBvcGVyYXRpb25OYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGkub3BlcmF0aW9uTmFtZSl9YCksci5qb2luKCImIil9aWYodHlwZW9mIGUudmFyaWFibGVzIT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkoZS52YXJpYWJsZXMpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSBxdWVyeSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3QgdD1lLG49ZS5xdWVyeS5yZWR1Y2UoKGkscixzKT0+KGkucHVzaCh7cXVlcnk6RnQociksdmFyaWFibGVzOnQudmFyaWFibGVzP3QuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KHQudmFyaWFibGVzW3NdKTp2b2lkIDB9KSxpKSxbXSk7cmV0dXJuYHF1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KG4pKX1gfSxvcj1lPT50PT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgTjtjb25zdHt1cmw6bixxdWVyeTppLHZhcmlhYmxlczpyLG9wZXJhdGlvbk5hbWU6cyxmZXRjaDphLGZldGNoT3B0aW9uczpjLG1pZGRsZXdhcmU6Zn09dCxkPVAoe30sdC5oZWFkZXJzKTtsZXQgdT0iIix5O2U9PT0iUE9TVCI/KHk9dXIoaSxyLHMsYy5qc29uU2VyaWFsaXplciksdHlwZW9mIHk9PSJzdHJpbmciJiYoZFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSk6dT1hcih7cXVlcnk6aSx2YXJpYWJsZXM6cixvcGVyYXRpb25OYW1lOnMsanNvblNlcmlhbGl6ZXI6KE49Yy5qc29uU2VyaWFsaXplcikhPW51bGw/TjpIZX0pO2NvbnN0IHY9UCh7bWV0aG9kOmUsaGVhZGVyczpkLGJvZHk6eX0sYyk7bGV0IGI9bixtPXY7aWYoZil7Y29uc3QgZz15aWVsZCBQcm9taXNlLnJlc29sdmUoZihVZShQKHt9LHYpLHt1cmw6bixvcGVyYXRpb25OYW1lOnMsdmFyaWFibGVzOnJ9KSkpLHt1cmw6a309Zyx3PWdlKGcsWyJ1cmwiXSk7Yj1rLG09d31yZXR1cm4gdSYmKGI9YCR7Yn0/JHt1fWApLHlpZWxkIGEoYixtKX0pO2NsYXNzIGNye2NvbnN0cnVjdG9yKHQsbj17fSl7dGhpcy51cmw9dCx0aGlzLnJlcXVlc3RDb25maWc9bix0aGlzLnJhd1JlcXVlc3Q9KC4uLmkpPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtyLHMsYV09aSxjPW1uKHIscyxhKSxnPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpmLGZldGNoOmQ9UGUsbWV0aG9kOnU9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOnkscmVzcG9uc2VNaWRkbGV3YXJlOnZ9PWcsYj1nZShnLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDptfT10aGlzO2Muc2lnbmFsIT09dm9pZCAwJiYoYi5zaWduYWw9Yy5zaWduYWwpO2NvbnN0e29wZXJhdGlvbk5hbWU6Tn09S2UoYy5xdWVyeSk7cmV0dXJuIHR0KHt1cmw6bSxxdWVyeTpjLnF1ZXJ5LHZhcmlhYmxlczpjLnZhcmlhYmxlcyxoZWFkZXJzOlAoUCh7fSxkZShudChmKSkpLGRlKGMucmVxdWVzdEhlYWRlcnMpKSxvcGVyYXRpb25OYW1lOk4sZmV0Y2g6ZCxtZXRob2Q6dSxmZXRjaE9wdGlvbnM6YixtaWRkbGV3YXJlOnl9KS50aGVuKEU9Pih2JiZ2KEUpLEUpKS5jYXRjaChFPT57dGhyb3cgdiYmdihFKSxFfSl9KX1yZXF1ZXN0KHQsLi4ubil7cmV0dXJuIFcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W2kscl09bixzPXBuKHQsaSxyKSxOPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczphLGZldGNoOmM9UGUsbWV0aG9kOmY9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOmQscmVzcG9uc2VNaWRkbGV3YXJlOnV9PU4seT1nZShOLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDp2fT10aGlzO3Muc2lnbmFsIT09dm9pZCAwJiYoeS5zaWduYWw9cy5zaWduYWwpO2NvbnN0e3F1ZXJ5OmIsb3BlcmF0aW9uTmFtZTptfT1LZShzLmRvY3VtZW50KTtyZXR1cm4gdHQoe3VybDp2LHF1ZXJ5OmIsdmFyaWFibGVzOnMudmFyaWFibGVzLGhlYWRlcnM6UChQKHt9LGRlKG50KGEpKSksZGUocy5yZXF1ZXN0SGVhZGVycykpLG9wZXJhdGlvbk5hbWU6bSxmZXRjaDpjLG1ldGhvZDpmLGZldGNoT3B0aW9uczp5LG1pZGRsZXdhcmU6ZH0pLnRoZW4oZz0+KHUmJnUoZyksZy5kYXRhKSkuY2F0Y2goZz0+e3Rocm93IHUmJnUoZyksZ30pfSl9YmF0Y2hSZXF1ZXN0cyh0LG4pe3ZhciBkO2NvbnN0IGk9eW4odCxuKSxmPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpyfT1mLHM9Z2UoZixbImhlYWRlcnMiXSk7aS5zaWduYWwhPT12b2lkIDAmJihzLnNpZ25hbD1pLnNpZ25hbCk7Y29uc3QgYT1pLmRvY3VtZW50cy5tYXAoKHtkb2N1bWVudDp1fSk9PktlKHUpLnF1ZXJ5KSxjPWkuZG9jdW1lbnRzLm1hcCgoe3ZhcmlhYmxlczp1fSk9PnUpO3JldHVybiB0dCh7dXJsOnRoaXMudXJsLHF1ZXJ5OmEsdmFyaWFibGVzOmMsaGVhZGVyczpQKFAoe30sZGUobnQocikpKSxkZShpLnJlcXVlc3RIZWFkZXJzKSksb3BlcmF0aW9uTmFtZTp2b2lkIDAsZmV0Y2g6KGQ9dGhpcy5yZXF1ZXN0Q29uZmlnLmZldGNoKSE9bnVsbD9kOlBlLG1ldGhvZDp0aGlzLnJlcXVlc3RDb25maWcubWV0aG9kfHwiUE9TVCIsZmV0Y2hPcHRpb25zOnMsbWlkZGxld2FyZTp0aGlzLnJlcXVlc3RDb25maWcucmVxdWVzdE1pZGRsZXdhcmV9KS50aGVuKHU9Pih0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHUuZGF0YSkpLmNhdGNoKHU9Pnt0aHJvdyB0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHV9KX1zZXRIZWFkZXJzKHQpe3JldHVybiB0aGlzLnJlcXVlc3RDb25maWcuaGVhZGVycz10LHRoaXN9c2V0SGVhZGVyKHQsbil7Y29uc3R7aGVhZGVyczppfT10aGlzLnJlcXVlc3RDb25maWc7cmV0dXJuIGk/aVt0XT1uOnRoaXMucmVxdWVzdENvbmZpZy5oZWFkZXJzPXtbdF06bn0sdGhpc31zZXRFbmRwb2ludCh0KXtyZXR1cm4gdGhpcy51cmw9dCx0aGlzfX1jb25zdCB0dD1lPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgdSx5O2NvbnN0e3F1ZXJ5OnQsdmFyaWFibGVzOm4sZmV0Y2hPcHRpb25zOml9PWUscj1vcihobigodT1lLm1ldGhvZCkhPW51bGw/dToicG9zdCIpKSxzPUFycmF5LmlzQXJyYXkoZS5xdWVyeSksYT15aWVsZCByKGUpLGM9eWllbGQgbHIoYSwoeT1pLmpzb25TZXJpYWxpemVyKSE9bnVsbD95OkhlKSxmPUFycmF5LmlzQXJyYXkoYyk/IWMuc29tZSgoe2RhdGE6Yn0pPT4hYik6ISFjLmRhdGEsZD1BcnJheS5pc0FycmF5KGMpfHwhYy5lcnJvcnN8fEFycmF5LmlzQXJyYXkoYy5lcnJvcnMpJiYhYy5lcnJvcnMubGVuZ3RofHxpLmVycm9yUG9saWN5PT09ImFsbCJ8fGkuZXJyb3JQb2xpY3k9PT0iaWdub3JlIjtpZihhLm9rJiZkJiZmKXtjb25zdCB2PShBcnJheS5pc0FycmF5KGMpLGMpLHtlcnJvcnM6Yn09dixtPWdlKHYsWyJlcnJvcnMiXSksTj1pLmVycm9yUG9saWN5PT09Imlnbm9yZSI/bTpjO3JldHVybiBVZShQKHt9LHM/e2RhdGE6Tn06Tikse2hlYWRlcnM6YS5oZWFkZXJzLHN0YXR1czphLnN0YXR1c30pfWVsc2V7Y29uc3QgYj10eXBlb2YgYz09InN0cmluZyI/e2Vycm9yOmN9OmM7dGhyb3cgbmV3IGhlKFVlKFAoe30sYikse3N0YXR1czphLnN0YXR1cyxoZWFkZXJzOmEuaGVhZGVyc30pLHtxdWVyeTp0LHZhcmlhYmxlczpufSl9fSksdXI9KGUsdCxuLGkpPT57Y29uc3Qgcj1pIT1udWxsP2k6SGU7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHIuc3RyaW5naWZ5KHtxdWVyeTplLHZhcmlhYmxlczp0LG9wZXJhdGlvbk5hbWU6bn0pO2lmKHR5cGVvZiB0IT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIHJlcXVlc3QgYm9keSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3Qgcz1lLnJlZHVjZSgoYSxjLGYpPT4oYS5wdXNoKHtxdWVyeTpjLHZhcmlhYmxlczp0P3RbZl06dm9pZCAwfSksYSksW10pO3JldHVybiByLnN0cmluZ2lmeShzKX0sbHI9KGUsdCk9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2xldCBuO3JldHVybiBlLmhlYWRlcnMuZm9yRWFjaCgoaSxyKT0+e3IudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiJiYobj1pKX0pLG4mJihuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vanNvbiIpfHxuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vZ3JhcGhxbCtqc29uIil8fG4udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi9ncmFwaHFsLXJlc3BvbnNlK2pzb24iKSk/dC5wYXJzZSh5aWVsZCBlLnRleHQoKSk6ZS50ZXh0KCl9KSxudD1lPT50eXBlb2YgZT09ImZ1bmN0aW9uIj9lKCk6ZTt2YXIgcnQ9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlLHQpe3Q9ZS5leHBvcnRzPW4sdC5nZXRTZXJpYWxpemU9aTtmdW5jdGlvbiBuKHIscyxhLGMpe3JldHVybiBKU09OLnN0cmluZ2lmeShyLGkocyxjKSxhKX1mdW5jdGlvbiBpKHIscyl7dmFyIGE9W10sYz1bXTtyZXR1cm4gcz09bnVsbCYmKHM9ZnVuY3Rpb24oZixkKXtyZXR1cm4gYVswXT09PWQ/IltDaXJjdWxhciB+XSI6IltDaXJjdWxhciB+LiIrYy5zbGljZSgwLGEuaW5kZXhPZihkKSkuam9pbigiLiIpKyJdIn0pLGZ1bmN0aW9uKGYsZCl7aWYoYS5sZW5ndGg+MCl7dmFyIHU9YS5pbmRleE9mKHRoaXMpO351P2Euc3BsaWNlKHUrMSk6YS5wdXNoKHRoaXMpLH51P2Muc3BsaWNlKHUsMS8wLGYpOmMucHVzaChmKSx+YS5pbmRleE9mKGQpJiYoZD1zLmNhbGwodGhpcyxmLGQpKX1lbHNlIGEucHVzaChkKTtyZXR1cm4gcj09bnVsbD9kOnIuY2FsbCh0aGlzLGYsZCl9fX0pKHJ0LHJ0LmV4cG9ydHMpO3ZhciBmcj1ydC5leHBvcnRzLHBlPUx0KGZyKTtjb25zdCBNdD0xZTMqMTU7dmFyIExlPWZ1bmN0aW9uKCl7cmV0dXJuIExlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTEscj1hcmd1bWVudHMubGVuZ3RoO2k8cjtpKyspe249YXJndW1lbnRzW2ldO2Zvcih2YXIgcyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHMpJiYodFtzXT1uW3NdKX1yZXR1cm4gdH0sTGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIEZlPW5ldyBNYXAsaXQ9bmV3IE1hcCwkdD0hMCxNZT0hMTtmdW5jdGlvbiBCdChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXHMsXSsvZywiICIpLnRyaW0oKX1mdW5jdGlvbiBocihlKXtyZXR1cm4gQnQoZS5zb3VyY2UuYm9keS5zdWJzdHJpbmcoZS5zdGFydCxlLmVuZCkpfWZ1bmN0aW9uIGRyKGUpe3ZhciB0PW5ldyBTZXQsbj1bXTtyZXR1cm4gZS5kZWZpbml0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGkpe2lmKGkua2luZD09PSJGcmFnbWVudERlZmluaXRpb24iKXt2YXIgcj1pLm5hbWUudmFsdWUscz1ocihpLmxvYyksYT1pdC5nZXQocik7YSYmIWEuaGFzKHMpPyR0JiZjb25zb2xlLndhcm4oIldhcm5pbmc6IGZyYWdtZW50IHdpdGggbmFtZSAiK3IrYCBhbHJlYWR5IGV4aXN0cy4KZ3JhcGhxbC10YWcgZW5mb3JjZXMgYWxsIGZyYWdtZW50IG5hbWVzIGFjcm9zcyB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIHVuaXF1ZTsgcmVhZCBtb3JlIGFib3V0CnRoaXMgaW4gdGhlIGRvY3M6IGh0dHA6Ly9kZXYuYXBvbGxvZGF0YS5jb20vY29yZS9mcmFnbWVudHMuaHRtbCN1bmlxdWUtbmFtZXNgKTphfHxpdC5zZXQocixhPW5ldyBTZXQpLGEuYWRkKHMpLHQuaGFzKHMpfHwodC5hZGQocyksbi5wdXNoKGkpKX1lbHNlIG4ucHVzaChpKX0pLExlKExlKHt9LGUpLHtkZWZpbml0aW9uczpufSl9ZnVuY3Rpb24gcHIoZSl7dmFyIHQ9bmV3IFNldChlLmRlZmluaXRpb25zKTt0LmZvckVhY2goZnVuY3Rpb24oaSl7aS5sb2MmJmRlbGV0ZSBpLmxvYyxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBzPWlbcl07cyYmdHlwZW9mIHM9PSJvYmplY3QiJiZ0LmFkZChzKX0pfSk7dmFyIG49ZS5sb2M7cmV0dXJuIG4mJihkZWxldGUgbi5zdGFydFRva2VuLGRlbGV0ZSBuLmVuZFRva2VuKSxlfWZ1bmN0aW9uIG1yKGUpe3ZhciB0PUJ0KGUpO2lmKCFGZS5oYXModCkpe3ZhciBuPUN0KGUse2V4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOk1lLGFsbG93TGVnYWN5RnJhZ21lbnRWYXJpYWJsZXM6TWV9KTtpZighbnx8bi5raW5kIT09IkRvY3VtZW50Iil0aHJvdyBuZXcgRXJyb3IoIk5vdCBhIHZhbGlkIEdyYXBoUUwgZG9jdW1lbnQuIik7RmUuc2V0KHQscHIoZHIobikpKX1yZXR1cm4gRmUuZ2V0KHQpfWZ1bmN0aW9uIFEoZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pO3ZhciBpPWVbMF07cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihyLHMpe3ImJnIua2luZD09PSJEb2N1bWVudCI/aSs9ci5sb2Muc291cmNlLmJvZHk6aSs9cixpKz1lW3MrMV19KSxtcihpKX1mdW5jdGlvbiB5cigpe0ZlLmNsZWFyKCksaXQuY2xlYXIoKX1mdW5jdGlvbiBncigpeyR0PSExfWZ1bmN0aW9uIHZyKCl7TWU9ITB9ZnVuY3Rpb24gRXIoKXtNZT0hMX12YXIgQWU9e2dxbDpRLHJlc2V0Q2FjaGVzOnlyLGRpc2FibGVGcmFnbWVudFdhcm5pbmdzOmdyLGVuYWJsZUV4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOnZyLGRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpFcn07KGZ1bmN0aW9uKGUpe2UuZ3FsPUFlLmdxbCxlLnJlc2V0Q2FjaGVzPUFlLnJlc2V0Q2FjaGVzLGUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3M9QWUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3MsZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcyxlLmRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5kaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXN9KShRfHwoUT17fSkpLFEuZGVmYXVsdD1RO2NvbnN0IFV0PVFgCglmcmFnbWVudCBNYXRjaFBhcnRzIG9uIE1hdGNoQ29uZmlnIHsKCQlyZWdleFZhbHVlCgkJbWF0Y2hWYWx1ZQoJfQpgLF9yPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZCgKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkcGF5bG9hZF9pZDogSUQhCgkJJGV2ZW50czogUmVwbGF5RXZlbnRzSW5wdXQhCgkJJG1lc3NhZ2VzOiBTdHJpbmchCgkJJHJlc291cmNlczogU3RyaW5nIQoJCSR3ZWJfc29ja2V0X2V2ZW50czogU3RyaW5nIQoJCSRlcnJvcnM6IFtFcnJvck9iamVjdElucHV0XSEKCQkkaXNfYmVhY29uOiBCb29sZWFuCgkJJGhhc19zZXNzaW9uX3VubG9hZGVkOiBCb29sZWFuCgkJJGhpZ2hsaWdodF9sb2dzOiBTdHJpbmcKCSkgewoJCXB1c2hQYXlsb2FkKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXBheWxvYWRfaWQ6ICRwYXlsb2FkX2lkCgkJCWV2ZW50czogJGV2ZW50cwoJCQltZXNzYWdlczogJG1lc3NhZ2VzCgkJCXJlc291cmNlczogJHJlc291cmNlcwoJCQl3ZWJfc29ja2V0X2V2ZW50czogJHdlYl9zb2NrZXRfZXZlbnRzCgkJCWVycm9yczogJGVycm9ycwoJCQlpc19iZWFjb246ICRpc19iZWFjb24KCQkJaGFzX3Nlc3Npb25fdW5sb2FkZWQ6ICRoYXNfc2Vzc2lvbl91bmxvYWRlZAoJCQloaWdobGlnaHRfbG9nczogJGhpZ2hsaWdodF9sb2dzCgkJKQoJfQpgLFRyPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IElEIQoJCSRkYXRhOiBTdHJpbmchCgkpIHsKCQlwdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJcGF5bG9hZF9pZDogJHBheWxvYWRfaWQKCQkJZGF0YTogJGRhdGEKCQkpCgl9CmAsYnI9UWAKCW11dGF0aW9uIGlkZW50aWZ5U2Vzc2lvbigKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkdXNlcl9pZGVudGlmaWVyOiBTdHJpbmchCgkJJHVzZXJfb2JqZWN0OiBBbnkKCSkgewoJCWlkZW50aWZ5U2Vzc2lvbigKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX2lkZW50aWZpZXI6ICR1c2VyX2lkZW50aWZpZXIKCQkJdXNlcl9vYmplY3Q6ICR1c2VyX29iamVjdAoJCSkKCX0KYCxOcj1RYAoJbXV0YXRpb24gYWRkU2Vzc2lvblByb3BlcnRpZXMoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHByb3BlcnRpZXNfb2JqZWN0OiBBbnkKCSkgewoJCWFkZFNlc3Npb25Qcm9wZXJ0aWVzKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXByb3BlcnRpZXNfb2JqZWN0OiAkcHJvcGVydGllc19vYmplY3QKCQkpCgl9CmAseHI9UWAKCW11dGF0aW9uIHB1c2hNZXRyaWNzKCRtZXRyaWNzOiBbTWV0cmljSW5wdXRdISkgewoJCXB1c2hNZXRyaWNzKG1ldHJpY3M6ICRtZXRyaWNzKQoJfQpgLEFyPVFgCgltdXRhdGlvbiBhZGRTZXNzaW9uRmVlZGJhY2soCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHVzZXJfbmFtZTogU3RyaW5nCgkJJHVzZXJfZW1haWw6IFN0cmluZwoJCSR2ZXJiYXRpbTogU3RyaW5nIQoJCSR0aW1lc3RhbXA6IFRpbWVzdGFtcCEKCSkgewoJCWFkZFNlc3Npb25GZWVkYmFjaygKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX25hbWU6ICR1c2VyX25hbWUKCQkJdXNlcl9lbWFpbDogJHVzZXJfZW1haWwKCQkJdmVyYmF0aW06ICR2ZXJiYXRpbQoJCQl0aW1lc3RhbXA6ICR0aW1lc3RhbXAKCQkpCgl9CmAsSXI9UWAKCW11dGF0aW9uIGluaXRpYWxpemVTZXNzaW9uKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nIQoJCSRlbmFibGVfc3RyaWN0X3ByaXZhY3k6IEJvb2xlYW4hCgkJJHByaXZhY3lfc2V0dGluZzogU3RyaW5nIQoJCSRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6IEJvb2xlYW4hCgkJJGNsaWVudFZlcnNpb246IFN0cmluZyEKCQkkZmlyc3Rsb2FkVmVyc2lvbjogU3RyaW5nIQoJCSRjbGllbnRDb25maWc6IFN0cmluZyEKCQkkZW52aXJvbm1lbnQ6IFN0cmluZyEKCQkkaWQ6IFN0cmluZyEKCQkkYXBwVmVyc2lvbjogU3RyaW5nCgkJJHNlcnZpY2VOYW1lOiBTdHJpbmchCgkJJGNsaWVudF9pZDogU3RyaW5nIQoJCSRuZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiBbU3RyaW5nIV0KCQkkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogQm9vbGVhbgoJKSB7CgkJaW5pdGlhbGl6ZVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQ6ICRvcmdhbml6YXRpb25fdmVyYm9zZV9pZAoJCQllbmFibGVfc3RyaWN0X3ByaXZhY3k6ICRlbmFibGVfc3RyaWN0X3ByaXZhY3kKCQkJZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzOiAkZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzCgkJCWNsaWVudFZlcnNpb246ICRjbGllbnRWZXJzaW9uCgkJCWZpcnN0bG9hZFZlcnNpb246ICRmaXJzdGxvYWRWZXJzaW9uCgkJCWNsaWVudENvbmZpZzogJGNsaWVudENvbmZpZwoJCQllbnZpcm9ubWVudDogJGVudmlyb25tZW50CgkJCWFwcFZlcnNpb246ICRhcHBWZXJzaW9uCgkJCXNlcnZpY2VOYW1lOiAkc2VydmljZU5hbWUKCQkJZmluZ2VycHJpbnQ6ICRpZAoJCQljbGllbnRfaWQ6ICRjbGllbnRfaWQKCQkJbmV0d29ya19yZWNvcmRpbmdfZG9tYWluczogJG5ldHdvcmtfcmVjb3JkaW5nX2RvbWFpbnMKCQkJZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogJGRpc2FibGVfc2Vzc2lvbl9yZWNvcmRpbmcKCQkJcHJpdmFjeV9zZXR0aW5nOiAkcHJpdmFjeV9zZXR0aW5nCgkJKSB7CgkJCXNlY3VyZV9pZAoJCQlwcm9qZWN0X2lkCgkJCXNhbXBsaW5nIHsKCQkJCXNwYW5zIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJCWV2ZW50cyB7CgkJCQkJCW5hbWUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQkJa2V5IHsKCQkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCQl9CgkJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlzYW1wbGluZ1JhdGlvCgkJCQl9CgkJCQlsb2dzIHsKCQkJCQltZXNzYWdlIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlzZXZlcml0eVRleHQgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQkJc2FtcGxpbmdSYXRpbwoJCQkJfQoJCQl9CgkJfQoJfQoJJHtVdH0KYCxPcj1RYAoJcXVlcnkgSWdub3JlKCRpZDogSUQhKSB7CgkJaWdub3JlKGlkOiAkaWQpCgl9CmAsU3I9UWAKCXF1ZXJ5IEdldFNhbXBsaW5nQ29uZmlnKCRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nISkgewoJCXNhbXBsaW5nKG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkOiAkb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQpIHsKCQkJc3BhbnMgewoJCQkJbmFtZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJYXR0cmlidXRlcyB7CgkJCQkJa2V5IHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJfQoJCQkJZXZlbnRzIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJc2FtcGxpbmdSYXRpbwoJCQl9CgkJCWxvZ3MgewoJCQkJbWVzc2FnZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJc2V2ZXJpdHlUZXh0IHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlhdHRyaWJ1dGVzIHsKCQkJCQlrZXkgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQl9CgkJCQlzYW1wbGluZ1JhdGlvCgkJCX0KCQl9Cgl9Cgkke1V0fQpgLHdyPShlLHQsbixpKT0+ZSgpO2Z1bmN0aW9uIERyKGUsdD13cil7cmV0dXJue1B1c2hQYXlsb2FkKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KF9yLG4sUChQKHt9LGkpLHIpKSwiUHVzaFBheWxvYWQiLCJtdXRhdGlvbiIsbil9LFB1c2hQYXlsb2FkQ29tcHJlc3NlZChuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChUcixuLFAoUCh7fSxpKSxyKSksIlB1c2hQYXlsb2FkQ29tcHJlc3NlZCIsIm11dGF0aW9uIixuKX0saWRlbnRpZnlTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KGJyLG4sUChQKHt9LGkpLHIpKSwiaWRlbnRpZnlTZXNzaW9uIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uUHJvcGVydGllcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChOcixuLFAoUCh7fSxpKSxyKSksImFkZFNlc3Npb25Qcm9wZXJ0aWVzIiwibXV0YXRpb24iLG4pfSxwdXNoTWV0cmljcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdCh4cixuLFAoUCh7fSxpKSxyKSksInB1c2hNZXRyaWNzIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uRmVlZGJhY2sobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoQXIsbixQKFAoe30saSkscikpLCJhZGRTZXNzaW9uRmVlZGJhY2siLCJtdXRhdGlvbiIsbil9LGluaXRpYWxpemVTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KElyLG4sUChQKHt9LGkpLHIpKSwiaW5pdGlhbGl6ZVNlc3Npb24iLCJtdXRhdGlvbiIsbil9LElnbm9yZShuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChPcixuLFAoUCh7fSxpKSxyKSksIklnbm9yZSIsInF1ZXJ5IixuKX0sR2V0U2FtcGxpbmdDb25maWcobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoU3IsbixQKFAoe30saSkscikpLCJHZXRTYW1wbGluZ0NvbmZpZyIsInF1ZXJ5IixuKX19fWNsYXNzIENye2NvbnN0cnVjdG9yKHQsbil7dXQodGhpcywiZGVidWciKTt1dCh0aGlzLCJuYW1lIik7dGhpcy5kZWJ1Zz10LHRoaXMubmFtZT1ufWxvZyguLi50KXtpZih0aGlzLmRlYnVnKXtsZXQgbj1gWyR7RGF0ZS5ub3coKX1dYDt0aGlzLm5hbWUmJihuKz1gIC0gJHt0aGlzLm5hbWV9YCksY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxbbiwuLi50XSl9fXdhcm4oLi4udCl7bGV0IG49YFske0RhdGUubm93KCl9XWA7dGhpcy5uYW1lJiYobis9YCAtICR7dGhpcy5uYW1lfWApLGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLFtuLC4uLnRdKX19dmFyIFZ0PShlPT4oZS5CaWxsaW5nUXVvdGFFeGNlZWRlZD0iQmlsbGluZ1F1b3RhRXhjZWVkZWQiLGUpKShWdHx8e30pO2NvbnN0IGtyPTEwLFJyPTFlMyxQcj01MDAsTHI9W1Z0LkJpbGxpbmdRdW90YUV4Y2VlZGVkLnRvU3RyaW5nKCldLEZyPWU9Pnt2YXIgbjtyZXR1cm4oKG49ZS5yZXNwb25zZS5lcnJvcnMpPT1udWxsP3ZvaWQgMDpuLmZpbmQoaT0+THIuaW5jbHVkZXMoaS5tZXNzYWdlKSkpPT09dm9pZCAwfSxNcj0oKT0+e2NvbnN0IGU9KHQsbixpLHIscz0wKT0+Vyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e3JldHVybiB5aWVsZCB0KCl9Y2F0Y2goYSl7aWYoYSBpbnN0YW5jZW9mIGhlJiYhRnIoYSkpdGhyb3cgYTtpZihzPGtyKXJldHVybiB5aWVsZCBuZXcgUHJvbWlzZShjPT5zZXRUaW1lb3V0KGMsUnIrUHIqTWF0aC5wb3coMixzKSkpLHlpZWxkIGUodCxuLGkscixzKzEpO3Rocm93IGNvbnNvbGUuZXJyb3IoYGhpZ2hsaWdodC5pbzogZGF0YSByZXF1ZXN0IGZhaWxlZCBhZnRlciAke3N9IHJldHJpZXNgKSxhfX0pO3JldHVybiBlfSxqdD01LHF0PTJlMywkcj1bIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXTt2YXIgSz0oZT0+KGVbZS5Jbml0aWFsaXplPTBdPSJJbml0aWFsaXplIixlW2UuQXN5bmNFdmVudHM9MV09IkFzeW5jRXZlbnRzIixlW2UuSWRlbnRpZnk9Ml09IklkZW50aWZ5IixlW2UuUHJvcGVydGllcz0zXT0iUHJvcGVydGllcyIsZVtlLk1ldHJpY3M9NF09Ik1ldHJpY3MiLGVbZS5GZWVkYmFjaz01XT0iRmVlZGJhY2siLGVbZS5DdXN0b21FdmVudD02XT0iQ3VzdG9tRXZlbnQiLGVbZS5TdG9wPTddPSJTdG9wIixlKSkoS3x8e30pO2Z1bmN0aW9uIEJyKGUpe3JldHVybiBXKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIG5ldyBQcm9taXNlKG49Pntjb25zdCBpPW5ldyBGaWxlUmVhZGVyO2kub25sb2FkPSgpPT5uKGkucmVzdWx0KSxpLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoW2VdKSl9KTtyZXR1cm4gdC5zbGljZSh0LmluZGV4T2YoIiwiKSsxKX0pfWNvbnN0ICRlPXNlbGY7ZnVuY3Rpb24gR3QoZSx0KXtjb25zdCBuPXt9LGk9W10scj1bXTtmb3IoY29uc3RbcyxhXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtpZihhPT1udWxsKWNvbnRpbnVlOyRyLmluY2x1ZGVzKHR5cGVvZiBhKXx8aS5wdXNoKHtbc106YX0pO2xldCBjO3R5cGVvZiBhPT0ic3RyaW5nIj9jPWE6Yz1wZShhKSxjLmxlbmd0aD5xdCYmKHIucHVzaCh7W3NdOmF9KSxjPWMuc3Vic3RyaW5nKDAscXQpKSxuW3NdPWN9cmV0dXJuIHQhPT0ic2Vzc2lvbiImJihpLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oYEhpZ2hsaWdodCB3YXMgcGFzc2VkIG9uZSBvciBtb3JlICR7dH0gcHJvcGVydGllcyBub3Qgb2YgdHlwZSBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbi5gLGkpLHIubGVuZ3RoPjAmJmNvbnNvbGUud2FybihgSGlnaGxpZ2h0IHdhcyBwYXNzZWQgb25lIG9yIG1vcmUgJHt0fSBwcm9wZXJ0aWVzIGV4Y2VlZGluZyAyMDAwIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgdHJ1bmNhdGVkLmAscikpLG59e2xldCBlLHQsbixpPTAscj0wLHM9ITEsYT0wLGM9bmV3IENyKCExLCJbd29ya2VyXSIpO2NvbnN0IGY9W10sZD0oKT0+YSE9PTAmJmk8anQmJiEhKG4hPW51bGwmJm4ubGVuZ3RoKSx1PShnLEUpPT57JGUucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOnt0eXBlOksuQ3VzdG9tRXZlbnQsdGFnOmcscGF5bG9hZDpFfX0pfSx5PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOkUsZXZlbnRzOmssbWVzc2FnZXM6dyxlcnJvcnM6TCxyZXNvdXJjZXNTdHJpbmc6JCx3ZWJTb2NrZXRFdmVudHNTdHJpbmc6cSxoYXNTZXNzaW9uVW5sb2FkZWQ6QixoaWdobGlnaHRMb2dzOkl9PWcsTz1wZSh7bWVzc2FnZXM6d30pO2xldCBqPXtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGV2ZW50czp7ZXZlbnRzOmt9LG1lc3NhZ2VzOk8scmVzb3VyY2VzOiQsd2ViX3NvY2tldF9ldmVudHM6cSxlcnJvcnM6TCxpc19iZWFjb246ITEsaGFzX3Nlc3Npb25fdW5sb2FkZWQ6Qn07SSYmKGouaGlnaGxpZ2h0X2xvZ3M9SSk7Y29uc3QgVT1mbihKU09OLnN0cmluZ2lmeShqKSksej1jbihVKSxYPXlpZWxkIEJyKHopLG89e3R5cGU6Sy5Bc3luY0V2ZW50cyxpZDpFLGV2ZW50c1NpemU6VS5sZW5ndGgsY29tcHJlc3NlZFNpemU6WC5sZW5ndGh9O2MubG9nKGBQdXNoaW5nIHBheWxvYWQ6ICR7SlNPTi5zdHJpbmdpZnkoe3Nlc3Npb25TZWN1cmVJRDpuLGlkOkUsZmlyc3RTSUQ6TWF0aC5taW4oLi4uai5ldmVudHMuZXZlbnRzLm1hcCh4PT54PT1udWxsP3ZvaWQgMDp4Ll9zaWQpLmZpbHRlcih4PT4hIXgpKSxldmVudHNMZW5ndGg6ai5ldmVudHMuZXZlbnRzLmxlbmd0aCxtZXNzYWdlc0xlbmd0aDp3Lmxlbmd0aCxyZXNvdXJjZXNMZW5ndGg6JC5sZW5ndGgsd2ViU29ja2V0TGVuZ3RoOnEubGVuZ3RoLGVycm9yc0xlbmd0aDpMLmxlbmd0aCxidWZMZW5ndGg6VS5sZW5ndGgsY29tcHJlc3NlZExlbmd0aDp6Lmxlbmd0aCxjb21wcmVzc2VkQmFzZTY0TGVuZ3RoOlgubGVuZ3RofSx2b2lkIDAsMil9YCk7Y29uc3QgaD1lLlB1c2hQYXlsb2FkQ29tcHJlc3NlZCh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwYXlsb2FkX2lkOkUudG9TdHJpbmcoKSxkYXRhOlh9KTtsZXQgXz1Qcm9taXNlLnJlc29sdmUoKTtmLmxlbmd0aCYmKF89ZS5wdXNoTWV0cmljcyh7bWV0cmljczpmfSksZi5zcGxpY2UoMCkpO2xldCBBPXBlcmZvcm1hbmNlLm5vdygpO2NvbnN0IFI9c2V0SW50ZXJ2YWwoKCk9PntBJiZwZXJmb3JtYW5jZS5ub3coKS1BPk10JiYoY29uc29sZS53YXJuKGBVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgZmFpbHVyZSBudW1iZXIgIyR7cn0uYCkscis9MSxjbGVhckludGVydmFsKFIpLHI+PWp0JiYoY29uc29sZS53YXJuKCJVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgc3RvcHBpbmcgcmVjb3JkaW5nIHRvIGF2b2lkIE9PTS4iKSwkZS5wb3N0TWVzc2FnZSh7cmVzcG9uc2U6e3R5cGU6Sy5TdG9wLHJlcXVlc3RTdGFydDpBLGFzeW5jRXZlbnRzUmVzcG9uc2U6b319KSxiKHt0eXBlOksuUHJvcGVydGllcyxwcm9wZXJ0aWVzT2JqZWN0OntzdG9wUmVhc29uOiJQdXNoIFBheWxvYWQgVGltZW91dCJ9LHByb3BlcnR5VHlwZTp7dHlwZToidHJhY2sifX0pKSl9LDEwMCk7dHJ5e3lpZWxkIFByb21pc2UuYWxsKFtoLF9dKSxyJiZwZXJmb3JtYW5jZS5ub3coKS1BPD1NdCYmKGNvbnNvbGUud2FybihgcHVzaFBheWxvYWQgc3VjY2VlZGVkIGFmdGVyICMke3J9IGZhaWx1cmVzLCByZXNldHRpbmcgc3RvcCBzd2l0Y2guYCkscj0wKX1maW5hbGx5e0E9MCxjbGVhckludGVydmFsKFIpfSRlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTpvfSl9KSx2PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3VzZXJPYmplY3Q6RSx1c2VySWRlbnRpZmllcjprLHNvdXJjZTp3fT1nO3c9PT0ic2VnbWVudCI/dSgiU2VnbWVudCBJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKTp1KCJJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKSx5aWVsZCBlLmlkZW50aWZ5U2Vzc2lvbih7c2Vzc2lvbl9zZWN1cmVfaWQ6bix1c2VyX2lkZW50aWZpZXI6ayx1c2VyX29iamVjdDpHdChFLCJ1c2VyIil9KTtjb25zdCBMPXc9PT0ic2VnbWVudCI/dzoiZGVmYXVsdCI7Yy5sb2coYElkZW50aWZ5ICgke2t9LCBzb3VyY2U6ICR7TH0pIHcvIG9iajogJHtwZShFKX0gQCAke3R9YCl9KSxiPWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3Byb3BlcnRpZXNPYmplY3Q6RSxwcm9wZXJ0eVR5cGU6a309ZztsZXQgdzsoaz09bnVsbD92b2lkIDA6ay50eXBlKT09PSJzZXNzaW9uIj8odz0iU2Vzc2lvbiIseWllbGQgZS5hZGRTZXNzaW9uUHJvcGVydGllcyh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwcm9wZXJ0aWVzX29iamVjdDpHdChFLCJzZXNzaW9uIil9KSk6KGs9PW51bGw/dm9pZCAwOmsuc291cmNlKT09PSJzZWdtZW50Ij93PSJTZWdtZW50Ijp3PSJUcmFjayIsdyE9PSJTZXNzaW9uIiYmdSh3LHBlKEUpKSxjLmxvZyhgQWRkaW5nICR7d30gUHJvcGVydGllcyB0byBzZXNzaW9uICgke259KSB3LyBvYmo6ICR7SlNPTi5zdHJpbmdpZnkoRSl9IEAgJHt0fWApfSksbT1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmLnB1c2goLi4uZy5tZXRyaWNzLm1hcChFPT4oe25hbWU6RS5uYW1lLHZhbHVlOkUudmFsdWUsc2Vzc2lvbl9zZWN1cmVfaWQ6bixjYXRlZ29yeTpFLmNhdGVnb3J5LGdyb3VwOkUuZ3JvdXAsdGltZXN0YW1wOkUudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksdGFnczpFLnRhZ3N9KSkpfSksTj1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdHt0aW1lc3RhbXA6RSx2ZXJiYXRpbTprLHVzZXJFbWFpbDp3LHVzZXJOYW1lOkx9PWc7eWllbGQgZS5hZGRTZXNzaW9uRmVlZGJhY2soe3Nlc3Npb25fc2VjdXJlX2lkOm4sdGltZXN0YW1wOkUsdmVyYmF0aW06ayx1c2VyX2VtYWlsOncsdXNlcl9uYW1lOkx9KX0pOyRlLm9ubWVzc2FnZT1mdW5jdGlvbihnKXtyZXR1cm4gVyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoZy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuSW5pdGlhbGl6ZSl7dD1nLmRhdGEubWVzc2FnZS5iYWNrZW5kLG49Zy5kYXRhLm1lc3NhZ2Uuc2Vzc2lvblNlY3VyZUlELHM9Zy5kYXRhLm1lc3NhZ2UuZGVidWcsYT1nLmRhdGEubWVzc2FnZS5yZWNvcmRpbmdTdGFydFRpbWUsYy5kZWJ1Zz1zLGU9RHIobmV3IGNyKHQse2hlYWRlcnM6e319KSxNcigpKTtyZXR1cm59aWYoZCgpKXRyeXtnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Bc3luY0V2ZW50cz95aWVsZCB5KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5JZGVudGlmeT95aWVsZCB2KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Qcm9wZXJ0aWVzP3lpZWxkIGIoZy5kYXRhLm1lc3NhZ2UpOmcuZGF0YS5tZXNzYWdlLnR5cGU9PT1LLk1ldHJpY3M/eWllbGQgbShnLmRhdGEubWVzc2FnZSk6Zy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuRmVlZGJhY2smJih5aWVsZCBOKGcuZGF0YS5tZXNzYWdlKSksaT0wfWNhdGNoKEUpe3MmJmNvbnNvbGUuZXJyb3IoRSksaSs9MX19KX19fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGlnaGxpZ2h0LWNsaWVudC13b3JrZXItQ3BtbDJKMXQuanMubWFwCg==", Ly = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), zo = typeof self < "u" && self.Blob && new Blob([Ly(Sc)], { type: "text/javascript;charset=utf-8" });
|
|
12918
|
-
function
|
|
12920
|
+
}, Sc = "dmFyIFZyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqcj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgcXI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIEJlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFF0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksWHQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgY3Q9KE0sRCxDKT0+RCBpbiBNP1ZyKE0sRCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Q30pOk1bRF09QyxQPShNLEQpPT57Zm9yKHZhciBDIGluIER8fChEPXt9KSlRdC5jYWxsKEQsQykmJmN0KE0sQyxEW0NdKTtpZihCZSlmb3IodmFyIEMgb2YgQmUoRCkpWHQuY2FsbChELEMpJiZjdChNLEMsRFtDXSk7cmV0dXJuIE19LFVlPShNLEQpPT5qcihNLHFyKEQpKTt2YXIgZ2U9KE0sRCk9Pnt2YXIgQz17fTtmb3IodmFyIEogaW4gTSlRdC5jYWxsKE0sSikmJkQuaW5kZXhPZihKKTwwJiYoQ1tKXT1NW0pdKTtpZihNIT1udWxsJiZCZSlmb3IodmFyIEogb2YgQmUoTSkpRC5pbmRleE9mKEopPDAmJlh0LmNhbGwoTSxKKSYmKENbSl09TVtKXSk7cmV0dXJuIEN9O3ZhciB1dD0oTSxELEMpPT5jdChNLHR5cGVvZiBEIT0ic3ltYm9sIj9EKyIiOkQsQyk7dmFyIFc9KE0sRCxDKT0+bmV3IFByb21pc2UoKEosY2UpPT57dmFyIHZlPWVlPT57dHJ5e3VlKEMubmV4dChlZSkpfWNhdGNoKEVlKXtjZShFZSl9fSxJZT1lZT0+e3RyeXt1ZShDLnRocm93KGVlKSl9Y2F0Y2goRWUpe2NlKEVlKX19LHVlPWVlPT5lZS5kb25lP0ooZWUudmFsdWUpOlByb21pc2UucmVzb2x2ZShlZS52YWx1ZSkudGhlbih2ZSxJZSk7dWUoKEM9Qy5hcHBseShNLEQpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE0oZSx0KXtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJnR5cGVvZiBuIT0ic3RyaW5nIiYmIUFycmF5LmlzQXJyYXkobikmJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oaSl7aWYoaSE9PSJkZWZhdWx0IiYmIShpIGluIGUpKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4saSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxyLmdldD9yOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuW2ldfX0pfX0pfSksT2JqZWN0LmZyZWV6ZShlKX12YXIgRD1VaW50OEFycmF5LEM9VWludDE2QXJyYXksSj1JbnQzMkFycmF5LGNlPW5ldyBEKFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdKSx2ZT1uZXcgRChbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdKSxJZT1uZXcgRChbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHVlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPW5ldyBDKDMxKSxpPTA7aTwzMTsrK2kpbltpXT10Kz0xPDxlW2ktMV07Zm9yKHZhciByPW5ldyBKKG5bMzBdKSxpPTE7aTwzMDsrK2kpZm9yKHZhciBzPW5baV07czxuW2krMV07KytzKXJbc109cy1uW2ldPDw1fGk7cmV0dXJue2I6bixyfX0sZWU9dWUoY2UsMiksRWU9ZWUuYixWZT1lZS5yO0VlWzI4XT0yNTgsVmVbMjU4XT0yODtmb3IodmFyIFd0PXVlKHZlLDApLGx0PVd0LnIsamU9bmV3IEMoMzI3NjgpLEY9MDtGPDMyNzY4OysrRil7dmFyIGllPShGJjQzNjkwKT4+MXwoRiYyMTg0NSk8PDE7aWU9KGllJjUyNDI4KT4+MnwoaWUmMTMxMDcpPDwyLGllPShpZSY2MTY4MCk+PjR8KGllJjM4NTUpPDw0LGplW0ZdPSgoaWUmNjUyODApPj44fChpZSYyNTUpPDw4KT4+MX1mb3IodmFyIF9lPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9ZS5sZW5ndGgscj0wLHM9bmV3IEModCk7cjxpOysrcillW3JdJiYrK3NbZVtyXS0xXTt2YXIgYT1uZXcgQyh0KTtmb3Iocj0xO3I8dDsrK3IpYVtyXT1hW3ItMV0rc1tyLTFdPDwxO3ZhciBjO2lmKG4pe2M9bmV3IEMoMTw8dCk7dmFyIGY9MTUtdDtmb3Iocj0wO3I8aTsrK3IpaWYoZVtyXSlmb3IodmFyIGQ9cjw8NHxlW3JdLHU9dC1lW3JdLHk9YVtlW3JdLTFdKys8PHUsdj15fCgxPDx1KS0xO3k8PXY7Kyt5KWNbamVbeV0+PmZdPWR9ZWxzZSBmb3IoYz1uZXcgQyhpKSxyPTA7cjxpOysrcillW3JdJiYoY1tyXT1qZVthW2Vbcl0tMV0rK10+PjE1LWVbcl0pO3JldHVybiBjfSxhZT1uZXcgRCgyODgpLEY9MDtGPDE0NDsrK0YpYWVbRl09ODtmb3IodmFyIEY9MTQ0O0Y8MjU2OysrRilhZVtGXT05O2Zvcih2YXIgRj0yNTY7RjwyODA7KytGKWFlW0ZdPTc7Zm9yKHZhciBGPTI4MDtGPDI4ODsrK0YpYWVbRl09ODtmb3IodmFyIE9lPW5ldyBEKDMyKSxGPTA7RjwzMjsrK0YpT2VbRl09NTt2YXIgWnQ9X2UoYWUsOSwwKSxLdD1fZShPZSw1LDApLGZ0PWZ1bmN0aW9uKGUpe3JldHVybihlKzcpLzh8MH0saHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybihuPT1udWxsfHxuPmUubGVuZ3RoKSYmKG49ZS5sZW5ndGgpLG5ldyBEKGUuc3ViYXJyYXkodCxuKSl9LG5lPWZ1bmN0aW9uKGUsdCxuKXtuPDw9dCY3O3ZhciBpPXQvOHwwO2VbaV18PW4sZVtpKzFdfD1uPj44fSxUZT1mdW5jdGlvbihlLHQsbil7bjw8PXQmNzt2YXIgaT10Lzh8MDtlW2ldfD1uLGVbaSsxXXw9bj4+OCxlW2krMl18PW4+PjE2fSxxZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXSYmbi5wdXNoKHtzOmksZjplW2ldfSk7dmFyIHI9bi5sZW5ndGgscz1uLnNsaWNlKCk7aWYoIXIpcmV0dXJue3Q6eXQsbDowfTtpZihyPT0xKXt2YXIgYT1uZXcgRChuWzBdLnMrMSk7cmV0dXJuIGFbblswXS5zXT0xLHt0OmEsbDoxfX1uLnNvcnQoZnVuY3Rpb24oJCxxKXtyZXR1cm4gJC5mLXEuZn0pLG4ucHVzaCh7czotMSxmOjI1MDAxfSk7dmFyIGM9blswXSxmPW5bMV0sZD0wLHU9MSx5PTI7Zm9yKG5bMF09e3M6LTEsZjpjLmYrZi5mLGw6YyxyOmZ9O3UhPXItMTspYz1uW25bZF0uZjxuW3ldLmY/ZCsrOnkrK10sZj1uW2QhPXUmJm5bZF0uZjxuW3ldLmY/ZCsrOnkrK10sblt1KytdPXtzOi0xLGY6Yy5mK2YuZixsOmMscjpmfTtmb3IodmFyIHY9c1swXS5zLGk9MTtpPHI7KytpKXNbaV0ucz52JiYodj1zW2ldLnMpO3ZhciBiPW5ldyBDKHYrMSksbT1HZShuW3UtMV0sYiwwKTtpZihtPnQpe3ZhciBpPTAsTj0wLGc9bS10LEU9MTw8Zztmb3Iocy5zb3J0KGZ1bmN0aW9uKHEsQil7cmV0dXJuIGJbQi5zXS1iW3Euc118fHEuZi1CLmZ9KTtpPHI7KytpKXt2YXIgaz1zW2ldLnM7aWYoYltrXT50KU4rPUUtKDE8PG0tYltrXSksYltrXT10O2Vsc2UgYnJlYWt9Zm9yKE4+Pj1nO04+MDspe3ZhciB3PXNbaV0ucztiW3ddPHQ/Ti09MTw8dC1iW3ddKystMTorK2l9Zm9yKDtpPj0wJiZOOy0taSl7dmFyIEw9c1tpXS5zO2JbTF09PXQmJigtLWJbTF0sKytOKX1tPXR9cmV0dXJue3Q6bmV3IEQoYiksbDptfX0sR2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnM9PS0xP01hdGgubWF4KEdlKGUubCx0LG4rMSksR2UoZS5yLHQsbisxKSk6dFtlLnNdPW59LGR0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0JiYhZVstLXRdOyk7Zm9yKHZhciBuPW5ldyBDKCsrdCksaT0wLHI9ZVswXSxzPTEsYT1mdW5jdGlvbihmKXtuW2krK109Zn0sYz0xO2M8PXQ7KytjKWlmKGVbY109PXImJmMhPXQpKytzO2Vsc2V7aWYoIXImJnM+Mil7Zm9yKDtzPjEzODtzLT0xMzgpYSgzMjc1NCk7cz4yJiYoYShzPjEwP3MtMTE8PDV8Mjg2OTA6cy0zPDw1fDEyMzA1KSxzPTApfWVsc2UgaWYocz4zKXtmb3IoYShyKSwtLXM7cz42O3MtPTYpYSg4MzA0KTtzPjImJihhKHMtMzw8NXw4MjA4KSxzPTApfWZvcig7cy0tOylhKHIpO3M9MSxyPWVbY119cmV0dXJue2M6bi5zdWJhcnJheSgwLGkpLG46dH19LGJlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsaT0wO2k8dC5sZW5ndGg7KytpKW4rPWVbaV0qdFtpXTtyZXR1cm4gbn0scHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4ubGVuZ3RoLHI9ZnQodCsyKTtlW3JdPWkmMjU1LGVbcisxXT1pPj44LGVbcisyXT1lW3JdXjI1NSxlW3IrM109ZVtyKzFdXjI1NTtmb3IodmFyIHM9MDtzPGk7KytzKWVbcitzKzRdPW5bc107cmV0dXJuKHIrNCtpKSo4fSxtdD1mdW5jdGlvbihlLHQsbixpLHIscyxhLGMsZixkLHUpe25lKHQsdSsrLG4pLCsrclsyNTZdO2Zvcih2YXIgeT1xZShyLDE1KSx2PXkudCxiPXkubCxtPXFlKHMsMTUpLE49bS50LGc9bS5sLEU9ZHQodiksaz1FLmMsdz1FLm4sTD1kdChOKSwkPUwuYyxxPUwubixCPW5ldyBDKDE5KSxJPTA7STxrLmxlbmd0aDsrK0kpKytCW2tbSV0mMzFdO2Zvcih2YXIgST0wO0k8JC5sZW5ndGg7KytJKSsrQlskW0ldJjMxXTtmb3IodmFyIE89cWUoQiw3KSxqPU8udCxVPU8ubCx6PTE5O3o+NCYmIWpbSWVbei0xXV07LS16KTt2YXIgWD1kKzU8PDMsbz1iZShyLGFlKStiZShzLE9lKSthLGg9YmUocix2KStiZShzLE4pK2ErMTQrMyp6K2JlKEIsaikrMipCWzE2XSszKkJbMTddKzcqQlsxOF07aWYoZj49MCYmWDw9byYmWDw9aClyZXR1cm4gcHQodCx1LGUuc3ViYXJyYXkoZixmK2QpKTt2YXIgXyxBLFIseDtpZihuZSh0LHUsMSsoaDxvKSksdSs9MixoPG8pe189X2UodixiLDApLEE9dixSPV9lKE4sZywwKSx4PU47dmFyIHNlPV9lKGosVSwwKTtuZSh0LHUsdy0yNTcpLG5lKHQsdSs1LHEtMSksbmUodCx1KzEwLHotNCksdSs9MTQ7Zm9yKHZhciBJPTA7STx6OysrSSluZSh0LHUrMypJLGpbSWVbSV1dKTt1Kz0zKno7Zm9yKHZhciBIPVtrLCRdLHJlPTA7cmU8MjsrK3JlKWZvcih2YXIgbWU9SFtyZV0sST0wO0k8bWUubGVuZ3RoOysrSSl7dmFyIHRlPW1lW0ldJjMxO25lKHQsdSxzZVt0ZV0pLHUrPWpbdGVdLHRlPjE1JiYobmUodCx1LG1lW0ldPj41JjEyNyksdSs9bWVbSV0+PjEyKX19ZWxzZSBfPVp0LEE9YWUsUj1LdCx4PU9lO2Zvcih2YXIgST0wO0k8YzsrK0kpe3ZhciBZPWlbSV07aWYoWT4yNTUpe3ZhciB0ZT1ZPj4xOCYzMTtUZSh0LHUsX1t0ZSsyNTddKSx1Kz1BW3RlKzI1N10sdGU+NyYmKG5lKHQsdSxZPj4yMyYzMSksdSs9Y2VbdGVdKTt2YXIgeWU9WSYzMTtUZSh0LHUsUlt5ZV0pLHUrPXhbeWVdLHllPjMmJihUZSh0LHUsWT4+NSY4MTkxKSx1Kz12ZVt5ZV0pfWVsc2UgVGUodCx1LF9bWV0pLHUrPUFbWV19cmV0dXJuIFRlKHQsdSxfWzI1Nl0pLHUrQVsyNTZdfSxlbj1uZXcgSihbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSx5dD1uZXcgRCgwKSx0bj1mdW5jdGlvbihlLHQsbixpLHIscyl7dmFyIGE9cy56fHxlLmxlbmd0aCxjPW5ldyBEKGkrYSs1KigxK01hdGguY2VpbChhLzdlMykpK3IpLGY9Yy5zdWJhcnJheShpLGMubGVuZ3RoLXIpLGQ9cy5sLHU9KHMucnx8MCkmNztpZih0KXt1JiYoZlswXT1zLnI+PjMpO2Zvcih2YXIgeT1lblt0LTFdLHY9eT4+MTMsYj15JjgxOTEsbT0oMTw8biktMSxOPXMucHx8bmV3IEMoMzI3NjgpLGc9cy5ofHxuZXcgQyhtKzEpLEU9TWF0aC5jZWlsKG4vMyksaz0yKkUsdz1mdW5jdGlvbihvdCl7cmV0dXJuKGVbb3RdXmVbb3QrMV08PEVeZVtvdCsyXTw8aykmbX0sTD1uZXcgSigyNWUzKSwkPW5ldyBDKDI4OCkscT1uZXcgQygzMiksQj0wLEk9MCxPPXMuaXx8MCxqPTAsVT1zLnd8fDAsej0wO08rMjxhOysrTyl7dmFyIFg9dyhPKSxvPU8mMzI3NjcsaD1nW1hdO2lmKE5bb109aCxnW1hdPW8sVTw9Tyl7dmFyIF89YS1PO2lmKChCPjdlM3x8aj4yNDU3NikmJihfPjQyM3x8IWQpKXt1PW10KGUsZiwwLEwsJCxxLEksaix6LE8teix1KSxqPUI9ST0wLHo9Tztmb3IodmFyIEE9MDtBPDI4NjsrK0EpJFtBXT0wO2Zvcih2YXIgQT0wO0E8MzA7KytBKXFbQV09MH12YXIgUj0yLHg9MCxzZT1iLEg9by1oJjMyNzY3O2lmKF8+MiYmWD09dyhPLUgpKWZvcih2YXIgcmU9TWF0aC5taW4odixfKS0xLG1lPU1hdGgubWluKDMyNzY3LE8pLHRlPU1hdGgubWluKDI1OCxfKTtIPD1tZSYmLS1zZSYmbyE9aDspe2lmKGVbTytSXT09ZVtPK1ItSF0pe2Zvcih2YXIgWT0wO1k8dGUmJmVbTytZXT09ZVtPK1ktSF07KytZKTtpZihZPlIpe2lmKFI9WSx4PUgsWT5yZSlicmVhaztmb3IodmFyIHllPU1hdGgubWluKEgsWS0yKSx6dD0wLEE9MDtBPHllOysrQSl7dmFyIHN0PU8tSCtBJjMyNzY3LFVyPU5bc3RdLEh0PXN0LVVyJjMyNzY3O0h0Pnp0JiYoenQ9SHQsaD1zdCl9fX1vPWgsaD1OW29dLEgrPW8taCYzMjc2N31pZih4KXtMW2orK109MjY4NDM1NDU2fFZlW1JdPDwxOHxsdFt4XTt2YXIgWXQ9VmVbUl0mMzEsSnQ9bHRbeF0mMzE7SSs9Y2VbWXRdK3ZlW0p0XSwrKyRbMjU3K1l0XSwrK3FbSnRdLFU9TytSLCsrQn1lbHNlIExbaisrXT1lW09dLCsrJFtlW09dXX19Zm9yKE89TWF0aC5tYXgoTyxVKTtPPGE7KytPKUxbaisrXT1lW09dLCsrJFtlW09dXTt1PW10KGUsZixkLEwsJCxxLEksaix6LE8teix1KSxkfHwocy5yPXUmN3xmW3UvOHwwXTw8Myx1LT03LHMuaD1nLHMucD1OLHMuaT1PLHMudz1VKX1lbHNle2Zvcih2YXIgTz1zLnd8fDA7TzxhK2Q7Tys9NjU1MzUpe3ZhciBhdD1PKzY1NTM1O2F0Pj1hJiYoZlt1Lzh8MF09ZCxhdD1hKSx1PXB0KGYsdSsxLGUuc3ViYXJyYXkoTyxhdCkpfXMuaT1hfXJldHVybiBodChjLDAsaStmdCh1KStyKX0sbm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEludDMyQXJyYXkoMjU2KSx0PTA7dDwyNTY7Kyt0KXtmb3IodmFyIG49dCxpPTk7LS1pOyluPShuJjEmJi0zMDY2NzQ5MTIpXm4+Pj4xO2VbdF09bn1yZXR1cm4gZX0oKSxybj1mdW5jdGlvbigpe3ZhciBlPS0xO3JldHVybntwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLGk9MDtpPHQubGVuZ3RoOysraSluPW5uW24mMjU1XnRbaV1dXm4+Pj44O2U9bn0sZDpmdW5jdGlvbigpe3JldHVybn5lfX19LHNuPWZ1bmN0aW9uKGUsdCxuLGkscil7aWYoIXImJihyPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBzPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLGE9bmV3IEQocy5sZW5ndGgrZS5sZW5ndGgpO2Euc2V0KHMpLGEuc2V0KGUscy5sZW5ndGgpLGU9YSxyLnc9cy5sZW5ndGh9cmV0dXJuIHRuKGUsdC5sZXZlbD09bnVsbD82OnQubGV2ZWwsdC5tZW09PW51bGw/ci5sP01hdGguY2VpbChNYXRoLm1heCg4LE1hdGgubWluKDEzLE1hdGgubG9nKGUubGVuZ3RoKSkpKjEuNSk6MjA6MTIrdC5tZW0sbixpLHIpfSx6ZT1mdW5jdGlvbihlLHQsbil7Zm9yKDtuOysrdCllW3RdPW4sbj4+Pj04fSxhbj1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZmlsZW5hbWU7aWYoZVswXT0zMSxlWzFdPTEzOSxlWzJdPTgsZVs4XT10LmxldmVsPDI/NDp0LmxldmVsPT05PzI6MCxlWzldPTMsdC5tdGltZSE9MCYmemUoZSw0LE1hdGguZmxvb3IobmV3IERhdGUodC5tdGltZXx8RGF0ZS5ub3coKSkvMWUzKSksbil7ZVszXT04O2Zvcih2YXIgaT0wO2k8PW4ubGVuZ3RoOysraSllW2krMTBdPW4uY2hhckNvZGVBdChpKX19LG9uPWZ1bmN0aW9uKGUpe3JldHVybiAxMCsoZS5maWxlbmFtZT9lLmZpbGVuYW1lLmxlbmd0aCsxOjApfTtmdW5jdGlvbiBjbihlLHQpe3R8fCh0PXt9KTt2YXIgbj1ybigpLGk9ZS5sZW5ndGg7bi5wKGUpO3ZhciByPXNuKGUsdCxvbih0KSw4KSxzPXIubGVuZ3RoO3JldHVybiBhbihyLHQpLHplKHIscy04LG4uZCgpKSx6ZShyLHMtNCxpKSxyfXZhciBndD10eXBlb2YgVGV4dEVuY29kZXIhPSJ1bmRlZmluZWQiJiZuZXcgVGV4dEVuY29kZXIsdW49dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIiYmbmV3IFRleHREZWNvZGVyLGxuPTA7dHJ5e3VuLmRlY29kZSh5dCx7c3RyZWFtOiEwfSksbG49MX1jYXRjaChlKXt9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbjtpZihndClyZXR1cm4gZ3QuZW5jb2RlKGUpO2Zvcih2YXIgaT1lLmxlbmd0aCxyPW5ldyBEKGUubGVuZ3RoKyhlLmxlbmd0aD4+MSkpLHM9MCxhPWZ1bmN0aW9uKGQpe3JbcysrXT1kfSxuPTA7bjxpOysrbil7aWYocys1PnIubGVuZ3RoKXt2YXIgYz1uZXcgRChzKzgrKGktbjw8MSkpO2Muc2V0KHIpLHI9Y312YXIgZj1lLmNoYXJDb2RlQXQobik7ZjwxMjh8fHQ/YShmKTpmPDIwNDg/KGEoMTkyfGY+PjYpLGEoMTI4fGYmNjMpKTpmPjU1Mjk1JiZmPDU3MzQ0PyhmPTY1NTM2KyhmJjEwNDc1NTIpfGUuY2hhckNvZGVBdCgrK24pJjEwMjMsYSgyNDB8Zj4+MTgpLGEoMTI4fGY+PjEyJjYzKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSk6KGEoMjI0fGY+PjEyKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSl9cmV0dXJuIGh0KHIsMCxzKX1jb25zdCBIZT1KU09OLGhuPWU9PmUudG9VcHBlckNhc2UoKSxkbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChuLGkpPT57dFtpXT1ufSksdH0scG49KGUsdCxuKT0+ZS5kb2N1bWVudD9lOntkb2N1bWVudDplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0sbW49KGUsdCxuKT0+ZS5xdWVyeT9lOntxdWVyeTplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0seW49KGUsdCk9PmUuZG9jdW1lbnRzP2U6e2RvY3VtZW50czplLHJlcXVlc3RIZWFkZXJzOnQsc2lnbmFsOnZvaWQgMH07ZnVuY3Rpb24gU2UoZSx0KXtpZighISFlKXRocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbH1mdW5jdGlvbiB2bihlLHQpe2lmKCEhIWUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGludmFyaWFudCB0cmlnZ2VyZWQuIil9Y29uc3QgRW49L1xyXG58W1xuXHJdL2c7ZnVuY3Rpb24gWWUoZSx0KXtsZXQgbj0wLGk9MTtmb3IoY29uc3QgciBvZiBlLmJvZHkubWF0Y2hBbGwoRW4pKXtpZih0eXBlb2Ygci5pbmRleD09Im51bWJlciJ8fHZuKCExKSxyLmluZGV4Pj10KWJyZWFrO249ci5pbmRleCtyWzBdLmxlbmd0aCxpKz0xfXJldHVybntsaW5lOmksY29sdW1uOnQrMS1ufX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gdnQoZS5zb3VyY2UsWWUoZS5zb3VyY2UsZS5zdGFydCkpfWZ1bmN0aW9uIHZ0KGUsdCl7Y29uc3Qgbj1lLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbi0xLGk9IiIucGFkU3RhcnQobikrZS5ib2R5LHI9dC5saW5lLTEscz1lLmxvY2F0aW9uT2Zmc2V0LmxpbmUtMSxhPXQubGluZStzLGM9dC5saW5lPT09MT9uOjAsZj10LmNvbHVtbitjLGQ9YCR7ZS5uYW1lfToke2F9OiR7Zn0KYCx1PWkuc3BsaXQoL1xyXG58W1xuXHJdL2cpLHk9dVtyXTtpZih5Lmxlbmd0aD4xMjApe2NvbnN0IHY9TWF0aC5mbG9vcihmLzgwKSxiPWYlODAsbT1bXTtmb3IobGV0IE49MDtOPHkubGVuZ3RoO04rPTgwKW0ucHVzaCh5LnNsaWNlKE4sTis4MCkpO3JldHVybiBkK0V0KFtbYCR7YX0gfGAsbVswXV0sLi4ubS5zbGljZSgxLHYrMSkubWFwKE49PlsifCIsTl0pLFsifCIsIl4iLnBhZFN0YXJ0KGIpXSxbInwiLG1bdisxXV1dKX1yZXR1cm4gZCtFdChbW2Ake2EtMX0gfGAsdVtyLTFdXSxbYCR7YX0gfGAseV0sWyJ8IiwiXiIucGFkU3RhcnQoZildLFtgJHthKzF9IHxgLHVbcisxXV1dKX1mdW5jdGlvbiBFdChlKXtjb25zdCB0PWUuZmlsdGVyKChbaSxyXSk9PnIhPT12b2lkIDApLG49TWF0aC5tYXgoLi4udC5tYXAoKFtpXSk9PmkubGVuZ3RoKSk7cmV0dXJuIHQubWFwKChbaSxyXSk9PmkucGFkU3RhcnQobikrKHI/IiAiK3I6IiIpKS5qb2luKGAKYCl9ZnVuY3Rpb24gVG4oZSl7Y29uc3QgdD1lWzBdO3JldHVybiB0PT1udWxsfHwia2luZCJpbiB0fHwibGVuZ3RoImluIHQ/e25vZGVzOnQsc291cmNlOmVbMV0scG9zaXRpb25zOmVbMl0scGF0aDplWzNdLG9yaWdpbmFsRXJyb3I6ZVs0XSxleHRlbnNpb25zOmVbNV19OnR9Y2xhc3MgSmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LC4uLm4pe3ZhciBpLHIscztjb25zdHtub2RlczphLHNvdXJjZTpjLHBvc2l0aW9uczpmLHBhdGg6ZCxvcmlnaW5hbEVycm9yOnUsZXh0ZW5zaW9uczp5fT1UbihuKTtzdXBlcih0KSx0aGlzLm5hbWU9IkdyYXBoUUxFcnJvciIsdGhpcy5wYXRoPWQhPW51bGw/ZDp2b2lkIDAsdGhpcy5vcmlnaW5hbEVycm9yPXUhPW51bGw/dTp2b2lkIDAsdGhpcy5ub2Rlcz1fdChBcnJheS5pc0FycmF5KGEpP2E6YT9bYV06dm9pZCAwKTtjb25zdCB2PV90KChpPXRoaXMubm9kZXMpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS5tYXAobT0+bS5sb2MpLmZpbHRlcihtPT5tIT1udWxsKSk7dGhpcy5zb3VyY2U9YyE9bnVsbD9jOnY9PW51bGx8fChyPXZbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zb3VyY2UsdGhpcy5wb3NpdGlvbnM9ZiE9bnVsbD9mOnY9PW51bGw/dm9pZCAwOnYubWFwKG09Pm0uc3RhcnQpLHRoaXMubG9jYXRpb25zPWYmJmM/Zi5tYXAobT0+WWUoYyxtKSk6dj09bnVsbD92b2lkIDA6di5tYXAobT0+WWUobS5zb3VyY2UsbS5zdGFydCkpO2NvbnN0IGI9Z24odT09bnVsbD92b2lkIDA6dS5leHRlbnNpb25zKT91PT1udWxsP3ZvaWQgMDp1LmV4dGVuc2lvbnM6dm9pZCAwO3RoaXMuZXh0ZW5zaW9ucz0ocz15IT1udWxsP3k6YikhPT1udWxsJiZzIT09dm9pZCAwP3M6T2JqZWN0LmNyZWF0ZShudWxsKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHttZXNzYWdlOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwfSxuYW1lOntlbnVtZXJhYmxlOiExfSxub2Rlczp7ZW51bWVyYWJsZTohMX0sc291cmNlOntlbnVtZXJhYmxlOiExfSxwb3NpdGlvbnM6e2VudW1lcmFibGU6ITF9LG9yaWdpbmFsRXJyb3I6e2VudW1lcmFibGU6ITF9fSksdSE9bnVsbCYmdS5zdGFjaz9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhY2siLHt2YWx1ZTp1LnN0YWNrLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOkVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsSmUpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOkVycm9yKCkuc3RhY2ssd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iR3JhcGhRTEVycm9yIn10b1N0cmluZygpe2xldCB0PXRoaXMubWVzc2FnZTtpZih0aGlzLm5vZGVzKWZvcihjb25zdCBuIG9mIHRoaXMubm9kZXMpbi5sb2MmJih0Kz1gCgpgK19uKG4ubG9jKSk7ZWxzZSBpZih0aGlzLnNvdXJjZSYmdGhpcy5sb2NhdGlvbnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5sb2NhdGlvbnMpdCs9YAoKYCt2dCh0aGlzLnNvdXJjZSxuKTtyZXR1cm4gdH10b0pTT04oKXtjb25zdCB0PXttZXNzYWdlOnRoaXMubWVzc2FnZX07cmV0dXJuIHRoaXMubG9jYXRpb25zIT1udWxsJiYodC5sb2NhdGlvbnM9dGhpcy5sb2NhdGlvbnMpLHRoaXMucGF0aCE9bnVsbCYmKHQucGF0aD10aGlzLnBhdGgpLHRoaXMuZXh0ZW5zaW9ucyE9bnVsbCYmT2JqZWN0LmtleXModGhpcy5leHRlbnNpb25zKS5sZW5ndGg+MCYmKHQuZXh0ZW5zaW9ucz10aGlzLmV4dGVuc2lvbnMpLHR9fWZ1bmN0aW9uIF90KGUpe3JldHVybiBlPT09dm9pZCAwfHxlLmxlbmd0aD09PTA/dm9pZCAwOmV9ZnVuY3Rpb24gRyhlLHQsbil7cmV0dXJuIG5ldyBKZShgU3ludGF4IEVycm9yOiAke259YCx7c291cmNlOmUscG9zaXRpb25zOlt0XX0pfWNsYXNzIGJue2NvbnN0cnVjdG9yKHQsbixpKXt0aGlzLnN0YXJ0PXQuc3RhcnQsdGhpcy5lbmQ9bi5lbmQsdGhpcy5zdGFydFRva2VuPXQsdGhpcy5lbmRUb2tlbj1uLHRoaXMuc291cmNlPWl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTG9jYXRpb24ifXRvSlNPTigpe3JldHVybntzdGFydDp0aGlzLnN0YXJ0LGVuZDp0aGlzLmVuZH19fWNsYXNzIFR0e2NvbnN0cnVjdG9yKHQsbixpLHIscyxhKXt0aGlzLmtpbmQ9dCx0aGlzLnN0YXJ0PW4sdGhpcy5lbmQ9aSx0aGlzLmxpbmU9cix0aGlzLmNvbHVtbj1zLHRoaXMudmFsdWU9YSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJUb2tlbiJ9dG9KU09OKCl7cmV0dXJue2tpbmQ6dGhpcy5raW5kLHZhbHVlOnRoaXMudmFsdWUsbGluZTp0aGlzLmxpbmUsY29sdW1uOnRoaXMuY29sdW1ufX19Y29uc3QgYnQ9e05hbWU6W10sRG9jdW1lbnQ6WyJkZWZpbml0aW9ucyJdLE9wZXJhdGlvbkRlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxWYXJpYWJsZURlZmluaXRpb246WyJ2YXJpYWJsZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sVmFyaWFibGU6WyJuYW1lIl0sU2VsZWN0aW9uU2V0Olsic2VsZWN0aW9ucyJdLEZpZWxkOlsiYWxpYXMiLCJuYW1lIiwiYXJndW1lbnRzIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLEFyZ3VtZW50OlsibmFtZSIsInZhbHVlIl0sRnJhZ21lbnRTcHJlYWQ6WyJuYW1lIiwiZGlyZWN0aXZlcyJdLElubGluZUZyYWdtZW50OlsidHlwZUNvbmRpdGlvbiIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxGcmFnbWVudERlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsInR5cGVDb25kaXRpb24iLCJkaXJlY3RpdmVzIiwic2VsZWN0aW9uU2V0Il0sSW50VmFsdWU6W10sRmxvYXRWYWx1ZTpbXSxTdHJpbmdWYWx1ZTpbXSxCb29sZWFuVmFsdWU6W10sTnVsbFZhbHVlOltdLEVudW1WYWx1ZTpbXSxMaXN0VmFsdWU6WyJ2YWx1ZXMiXSxPYmplY3RWYWx1ZTpbImZpZWxkcyJdLE9iamVjdEZpZWxkOlsibmFtZSIsInZhbHVlIl0sRGlyZWN0aXZlOlsibmFtZSIsImFyZ3VtZW50cyJdLE5hbWVkVHlwZTpbIm5hbWUiXSxMaXN0VHlwZTpbInR5cGUiXSxOb25OdWxsVHlwZTpbInR5cGUiXSxTY2hlbWFEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxPcGVyYXRpb25UeXBlRGVmaW5pdGlvbjpbInR5cGUiXSxTY2FsYXJUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sRmllbGREZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiYXJndW1lbnRzIiwidHlwZSIsImRpcmVjdGl2ZXMiXSxJbnB1dFZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sSW50ZXJmYWNlVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sRW51bVZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLERpcmVjdGl2ZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJhcmd1bWVudHMiLCJsb2NhdGlvbnMiXSxTY2hlbWFFeHRlbnNpb246WyJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxTY2FsYXJUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sSW50ZXJmYWNlVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXX0sTm49bmV3IFNldChPYmplY3Qua2V5cyhidCkpO2Z1bmN0aW9uIE50KGUpe2NvbnN0IHQ9ZT09bnVsbD92b2lkIDA6ZS5raW5kO3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJk5uLmhhcyh0KX12YXIgbGU7KGZ1bmN0aW9uKGUpe2UuUVVFUlk9InF1ZXJ5IixlLk1VVEFUSU9OPSJtdXRhdGlvbiIsZS5TVUJTQ1JJUFRJT049InN1YnNjcmlwdGlvbiJ9KShsZXx8KGxlPXt9KSk7dmFyIFFlOyhmdW5jdGlvbihlKXtlLlFVRVJZPSJRVUVSWSIsZS5NVVRBVElPTj0iTVVUQVRJT04iLGUuU1VCU0NSSVBUSU9OPSJTVUJTQ1JJUFRJT04iLGUuRklFTEQ9IkZJRUxEIixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZSQUdNRU5UX0RFRklOSVRJT04iLGUuRlJBR01FTlRfU1BSRUFEPSJGUkFHTUVOVF9TUFJFQUQiLGUuSU5MSU5FX0ZSQUdNRU5UPSJJTkxJTkVfRlJBR01FTlQiLGUuVkFSSUFCTEVfREVGSU5JVElPTj0iVkFSSUFCTEVfREVGSU5JVElPTiIsZS5TQ0hFTUE9IlNDSEVNQSIsZS5TQ0FMQVI9IlNDQUxBUiIsZS5PQkpFQ1Q9Ik9CSkVDVCIsZS5GSUVMRF9ERUZJTklUSU9OPSJGSUVMRF9ERUZJTklUSU9OIixlLkFSR1VNRU5UX0RFRklOSVRJT049IkFSR1VNRU5UX0RFRklOSVRJT04iLGUuSU5URVJGQUNFPSJJTlRFUkZBQ0UiLGUuVU5JT049IlVOSU9OIixlLkVOVU09IkVOVU0iLGUuRU5VTV9WQUxVRT0iRU5VTV9WQUxVRSIsZS5JTlBVVF9PQkpFQ1Q9IklOUFVUX09CSkVDVCIsZS5JTlBVVF9GSUVMRF9ERUZJTklUSU9OPSJJTlBVVF9GSUVMRF9ERUZJTklUSU9OIn0pKFFlfHwoUWU9e30pKTt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5OQU1FPSJOYW1lIixlLkRPQ1VNRU5UPSJEb2N1bWVudCIsZS5PUEVSQVRJT05fREVGSU5JVElPTj0iT3BlcmF0aW9uRGVmaW5pdGlvbiIsZS5WQVJJQUJMRV9ERUZJTklUSU9OPSJWYXJpYWJsZURlZmluaXRpb24iLGUuU0VMRUNUSU9OX1NFVD0iU2VsZWN0aW9uU2V0IixlLkZJRUxEPSJGaWVsZCIsZS5BUkdVTUVOVD0iQXJndW1lbnQiLGUuRlJBR01FTlRfU1BSRUFEPSJGcmFnbWVudFNwcmVhZCIsZS5JTkxJTkVfRlJBR01FTlQ9IklubGluZUZyYWdtZW50IixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZyYWdtZW50RGVmaW5pdGlvbiIsZS5WQVJJQUJMRT0iVmFyaWFibGUiLGUuSU5UPSJJbnRWYWx1ZSIsZS5GTE9BVD0iRmxvYXRWYWx1ZSIsZS5TVFJJTkc9IlN0cmluZ1ZhbHVlIixlLkJPT0xFQU49IkJvb2xlYW5WYWx1ZSIsZS5OVUxMPSJOdWxsVmFsdWUiLGUuRU5VTT0iRW51bVZhbHVlIixlLkxJU1Q9Ikxpc3RWYWx1ZSIsZS5PQkpFQ1Q9Ik9iamVjdFZhbHVlIixlLk9CSkVDVF9GSUVMRD0iT2JqZWN0RmllbGQiLGUuRElSRUNUSVZFPSJEaXJlY3RpdmUiLGUuTkFNRURfVFlQRT0iTmFtZWRUeXBlIixlLkxJU1RfVFlQRT0iTGlzdFR5cGUiLGUuTk9OX05VTExfVFlQRT0iTm9uTnVsbFR5cGUiLGUuU0NIRU1BX0RFRklOSVRJT049IlNjaGVtYURlZmluaXRpb24iLGUuT1BFUkFUSU9OX1RZUEVfREVGSU5JVElPTj0iT3BlcmF0aW9uVHlwZURlZmluaXRpb24iLGUuU0NBTEFSX1RZUEVfREVGSU5JVElPTj0iU2NhbGFyVHlwZURlZmluaXRpb24iLGUuT0JKRUNUX1RZUEVfREVGSU5JVElPTj0iT2JqZWN0VHlwZURlZmluaXRpb24iLGUuRklFTERfREVGSU5JVElPTj0iRmllbGREZWZpbml0aW9uIixlLklOUFVUX1ZBTFVFX0RFRklOSVRJT049IklucHV0VmFsdWVEZWZpbml0aW9uIixlLklOVEVSRkFDRV9UWVBFX0RFRklOSVRJT049IkludGVyZmFjZVR5cGVEZWZpbml0aW9uIixlLlVOSU9OX1RZUEVfREVGSU5JVElPTj0iVW5pb25UeXBlRGVmaW5pdGlvbiIsZS5FTlVNX1RZUEVfREVGSU5JVElPTj0iRW51bVR5cGVEZWZpbml0aW9uIixlLkVOVU1fVkFMVUVfREVGSU5JVElPTj0iRW51bVZhbHVlRGVmaW5pdGlvbiIsZS5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OPSJJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uIixlLkRJUkVDVElWRV9ERUZJTklUSU9OPSJEaXJlY3RpdmVEZWZpbml0aW9uIixlLlNDSEVNQV9FWFRFTlNJT049IlNjaGVtYUV4dGVuc2lvbiIsZS5TQ0FMQVJfVFlQRV9FWFRFTlNJT049IlNjYWxhclR5cGVFeHRlbnNpb24iLGUuT0JKRUNUX1RZUEVfRVhURU5TSU9OPSJPYmplY3RUeXBlRXh0ZW5zaW9uIixlLklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTj0iSW50ZXJmYWNlVHlwZUV4dGVuc2lvbiIsZS5VTklPTl9UWVBFX0VYVEVOU0lPTj0iVW5pb25UeXBlRXh0ZW5zaW9uIixlLkVOVU1fVFlQRV9FWFRFTlNJT049IkVudW1UeXBlRXh0ZW5zaW9uIixlLklOUFVUX09CSkVDVF9UWVBFX0VYVEVOU0lPTj0iSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uIn0pKFR8fChUPXt9KSk7ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIGU9PT05fHxlPT09MzJ9ZnVuY3Rpb24gTmUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01N31mdW5jdGlvbiB4dChlKXtyZXR1cm4gZT49OTcmJmU8PTEyMnx8ZT49NjUmJmU8PTkwfWZ1bmN0aW9uIEF0KGUpe3JldHVybiB4dChlKXx8ZT09PTk1fWZ1bmN0aW9uIHhuKGUpe3JldHVybiB4dChlKXx8TmUoZSl8fGU9PT05NX1mdW5jdGlvbiBBbihlKXt2YXIgdDtsZXQgbj1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixpPW51bGwscj0tMTtmb3IobGV0IGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIHM7Y29uc3QgYz1lW2FdLGY9SW4oYyk7ZiE9PWMubGVuZ3RoJiYoaT0ocz1pKSE9PW51bGwmJnMhPT12b2lkIDA/czphLHI9YSxhIT09MCYmZjxuJiYobj1mKSl9cmV0dXJuIGUubWFwKChhLGMpPT5jPT09MD9hOmEuc2xpY2UobikpLnNsaWNlKCh0PWkpIT09bnVsbCYmdCE9PXZvaWQgMD90OjAscisxKX1mdW5jdGlvbiBJbihlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aCYmWGUoZS5jaGFyQ29kZUF0KHQpKTspKyt0O3JldHVybiB0fWZ1bmN0aW9uIE9uKGUsdCl7Y29uc3Qgbj1lLnJlcGxhY2UoLyIiIi9nLCdcXCIiIicpLGk9bi5zcGxpdCgvXHJcbnxbXG5ccl0vZykscj1pLmxlbmd0aD09PTEscz1pLmxlbmd0aD4xJiZpLnNsaWNlKDEpLmV2ZXJ5KGI9PmIubGVuZ3RoPT09MHx8WGUoYi5jaGFyQ29kZUF0KDApKSksYT1uLmVuZHNXaXRoKCdcXCIiIicpLGM9ZS5lbmRzV2l0aCgnIicpJiYhYSxmPWUuZW5kc1dpdGgoIlxcIiksZD1jfHxmLHU9IXJ8fGUubGVuZ3RoPjcwfHxkfHxzfHxhO2xldCB5PSIiO2NvbnN0IHY9ciYmWGUoZS5jaGFyQ29kZUF0KDApKTtyZXR1cm4odSYmIXZ8fHMpJiYoeSs9YApgKSx5Kz1uLCh1fHxkKSYmKHkrPWAKYCksJyIiIicreSsnIiIiJ312YXIgbDsoZnVuY3Rpb24oZSl7ZS5TT0Y9IjxTT0Y+IixlLkVPRj0iPEVPRj4iLGUuQkFORz0iISIsZS5ET0xMQVI9IiQiLGUuQU1QPSImIixlLlBBUkVOX0w9IigiLGUuUEFSRU5fUj0iKSIsZS5TUFJFQUQ9Ii4uLiIsZS5DT0xPTj0iOiIsZS5FUVVBTFM9Ij0iLGUuQVQ9IkAiLGUuQlJBQ0tFVF9MPSJbIixlLkJSQUNLRVRfUj0iXSIsZS5CUkFDRV9MPSJ7IixlLlBJUEU9InwiLGUuQlJBQ0VfUj0ifSIsZS5OQU1FPSJOYW1lIixlLklOVD0iSW50IixlLkZMT0FUPSJGbG9hdCIsZS5TVFJJTkc9IlN0cmluZyIsZS5CTE9DS19TVFJJTkc9IkJsb2NrU3RyaW5nIixlLkNPTU1FTlQ9IkNvbW1lbnQifSkobHx8KGw9e30pKTtjbGFzcyBTbntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPW5ldyBUdChsLlNPRiwwLDAsMCwwKTt0aGlzLnNvdXJjZT10LHRoaXMubGFzdFRva2VuPW4sdGhpcy50b2tlbj1uLHRoaXMubGluZT0xLHRoaXMubGluZVN0YXJ0PTB9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTGV4ZXIifWFkdmFuY2UoKXtyZXR1cm4gdGhpcy5sYXN0VG9rZW49dGhpcy50b2tlbix0aGlzLnRva2VuPXRoaXMubG9va2FoZWFkKCl9bG9va2FoZWFkKCl7bGV0IHQ9dGhpcy50b2tlbjtpZih0LmtpbmQhPT1sLkVPRilkbyBpZih0Lm5leHQpdD10Lm5leHQ7ZWxzZXtjb25zdCBuPURuKHRoaXMsdC5lbmQpO3QubmV4dD1uLG4ucHJldj10LHQ9bn13aGlsZSh0LmtpbmQ9PT1sLkNPTU1FTlQpO3JldHVybiB0fX1mdW5jdGlvbiB3bihlKXtyZXR1cm4gZT09PWwuQkFOR3x8ZT09PWwuRE9MTEFSfHxlPT09bC5BTVB8fGU9PT1sLlBBUkVOX0x8fGU9PT1sLlBBUkVOX1J8fGU9PT1sLlNQUkVBRHx8ZT09PWwuQ09MT058fGU9PT1sLkVRVUFMU3x8ZT09PWwuQVR8fGU9PT1sLkJSQUNLRVRfTHx8ZT09PWwuQlJBQ0tFVF9SfHxlPT09bC5CUkFDRV9MfHxlPT09bC5QSVBFfHxlPT09bC5CUkFDRV9SfWZ1bmN0aW9uIGZlKGUpe3JldHVybiBlPj0wJiZlPD01NTI5NXx8ZT49NTczNDQmJmU8PTExMTQxMTF9ZnVuY3Rpb24gd2UoZSx0KXtyZXR1cm4gSXQoZS5jaGFyQ29kZUF0KHQpKSYmT3QoZS5jaGFyQ29kZUF0KHQrMSkpfWZ1bmN0aW9uIEl0KGUpe3JldHVybiBlPj01NTI5NiYmZTw9NTYzMTl9ZnVuY3Rpb24gT3QoZSl7cmV0dXJuIGU+PTU2MzIwJiZlPD01NzM0M31mdW5jdGlvbiBvZShlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keS5jb2RlUG9pbnRBdCh0KTtpZihuPT09dm9pZCAwKXJldHVybiBsLkVPRjtpZihuPj0zMiYmbjw9MTI2KXtjb25zdCBpPVN0cmluZy5mcm9tQ29kZVBvaW50KG4pO3JldHVybiBpPT09JyInP2AnIidgOmAiJHtpfSJgfXJldHVybiJVKyIrbi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRTdGFydCg0LCIwIil9ZnVuY3Rpb24gVihlLHQsbixpLHIpe2NvbnN0IHM9ZS5saW5lLGE9MStuLWUubGluZVN0YXJ0O3JldHVybiBuZXcgVHQodCxuLGkscyxhLHIpfWZ1bmN0aW9uIERuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dDtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO3N3aXRjaChzKXtjYXNlIDY1Mjc5OmNhc2UgOTpjYXNlIDMyOmNhc2UgNDQ6KytyO2NvbnRpbnVlO2Nhc2UgMTA6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAxMzpuLmNoYXJDb2RlQXQocisxKT09PTEwP3IrPTI6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAzNTpyZXR1cm4gQ24oZSxyKTtjYXNlIDMzOnJldHVybiBWKGUsbC5CQU5HLHIscisxKTtjYXNlIDM2OnJldHVybiBWKGUsbC5ET0xMQVIscixyKzEpO2Nhc2UgMzg6cmV0dXJuIFYoZSxsLkFNUCxyLHIrMSk7Y2FzZSA0MDpyZXR1cm4gVihlLGwuUEFSRU5fTCxyLHIrMSk7Y2FzZSA0MTpyZXR1cm4gVihlLGwuUEFSRU5fUixyLHIrMSk7Y2FzZSA0NjppZihuLmNoYXJDb2RlQXQocisxKT09PTQ2JiZuLmNoYXJDb2RlQXQocisyKT09PTQ2KXJldHVybiBWKGUsbC5TUFJFQUQscixyKzMpO2JyZWFrO2Nhc2UgNTg6cmV0dXJuIFYoZSxsLkNPTE9OLHIscisxKTtjYXNlIDYxOnJldHVybiBWKGUsbC5FUVVBTFMscixyKzEpO2Nhc2UgNjQ6cmV0dXJuIFYoZSxsLkFULHIscisxKTtjYXNlIDkxOnJldHVybiBWKGUsbC5CUkFDS0VUX0wscixyKzEpO2Nhc2UgOTM6cmV0dXJuIFYoZSxsLkJSQUNLRVRfUixyLHIrMSk7Y2FzZSAxMjM6cmV0dXJuIFYoZSxsLkJSQUNFX0wscixyKzEpO2Nhc2UgMTI0OnJldHVybiBWKGUsbC5QSVBFLHIscisxKTtjYXNlIDEyNTpyZXR1cm4gVihlLGwuQlJBQ0VfUixyLHIrMSk7Y2FzZSAzNDpyZXR1cm4gbi5jaGFyQ29kZUF0KHIrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHIrMik9PT0zND9NbihlLHIpOlJuKGUscil9aWYoTmUocyl8fHM9PT00NSlyZXR1cm4ga24oZSxyLHMpO2lmKEF0KHMpKXJldHVybiAkbihlLHIpO3Rocm93IEcoZS5zb3VyY2UscixzPT09Mzk/YFVuZXhwZWN0ZWQgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciAoJyksIGRpZCB5b3UgbWVhbiB0byB1c2UgYSBkb3VibGUgcXVvdGUgKCIpP2A6ZmUocyl8fHdlKG4scik/YFVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAke29lKGUscil9LmA6YEludmFsaWQgY2hhcmFjdGVyOiAke29lKGUscil9LmApfXJldHVybiBWKGUsbC5FT0YsaSxpKX1mdW5jdGlvbiBDbihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keSxpPW4ubGVuZ3RoO2xldCByPXQrMTtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO2lmKHM9PT0xMHx8cz09PTEzKWJyZWFrO2lmKGZlKHMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIGJyZWFrfXJldHVybiBWKGUsbC5DT01NRU5ULHQscixuLnNsaWNlKHQrMSxyKSl9ZnVuY3Rpb24ga24oZSx0LG4pe2NvbnN0IGk9ZS5zb3VyY2UuYm9keTtsZXQgcj10LHM9bixhPSExO2lmKHM9PT00NSYmKHM9aS5jaGFyQ29kZUF0KCsrcikpLHM9PT00OCl7aWYocz1pLmNoYXJDb2RlQXQoKytyKSxOZShzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCB1bmV4cGVjdGVkIGRpZ2l0IGFmdGVyIDA6ICR7b2UoZSxyKX0uYCl9ZWxzZSByPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKTtpZihzPT09NDYmJihhPSEwLHM9aS5jaGFyQ29kZUF0KCsrcikscj1XZShlLHIscykscz1pLmNoYXJDb2RlQXQocikpLChzPT09Njl8fHM9PT0xMDEpJiYoYT0hMCxzPWkuY2hhckNvZGVBdCgrK3IpLChzPT09NDN8fHM9PT00NSkmJihzPWkuY2hhckNvZGVBdCgrK3IpKSxyPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKSkscz09PTQ2fHxBdChzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCBleHBlY3RlZCBkaWdpdCBidXQgZ290OiAke29lKGUscil9LmApO3JldHVybiBWKGUsYT9sLkZMT0FUOmwuSU5ULHQscixpLnNsaWNlKHQscikpfWZ1bmN0aW9uIFdlKGUsdCxuKXtpZighTmUobikpdGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIG51bWJlciwgZXhwZWN0ZWQgZGlnaXQgYnV0IGdvdDogJHtvZShlLHQpfS5gKTtjb25zdCBpPWUuc291cmNlLmJvZHk7bGV0IHI9dCsxO2Zvcig7TmUoaS5jaGFyQ29kZUF0KHIpKTspKytyO3JldHVybiByfWZ1bmN0aW9uIFJuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxLHM9cixhPSIiO2Zvcig7cjxpOyl7Y29uc3QgYz1uLmNoYXJDb2RlQXQocik7aWYoYz09PTM0KXJldHVybiBhKz1uLnNsaWNlKHMsciksVihlLGwuU1RSSU5HLHQscisxLGEpO2lmKGM9PT05Mil7YSs9bi5zbGljZShzLHIpO2NvbnN0IGY9bi5jaGFyQ29kZUF0KHIrMSk9PT0xMTc/bi5jaGFyQ29kZUF0KHIrMik9PT0xMjM/UG4oZSxyKTpMbihlLHIpOkZuKGUscik7YSs9Zi52YWx1ZSxyKz1mLnNpemUscz1yO2NvbnRpbnVlfWlmKGM9PT0xMHx8Yz09PTEzKWJyZWFrO2lmKGZlKGMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIHRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBjaGFyYWN0ZXIgd2l0aGluIFN0cmluZzogJHtvZShlLHIpfS5gKX10aHJvdyBHKGUuc291cmNlLHIsIlVudGVybWluYXRlZCBzdHJpbmcuIil9ZnVuY3Rpb24gUG4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7bGV0IGk9MCxyPTM7Zm9yKDtyPDEyOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQodCtyKyspO2lmKHM9PT0xMjUpe2lmKHI8NXx8IWZlKGkpKWJyZWFrO3JldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOnJ9fWlmKGk9aTw8NHx4ZShzKSxpPDApYnJlYWt9dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCtyKX0iLmApfWZ1bmN0aW9uIExuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9U3Qobix0KzIpO2lmKGZlKGkpKXJldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOjZ9O2lmKEl0KGkpJiZuLmNoYXJDb2RlQXQodCs2KT09PTkyJiZuLmNoYXJDb2RlQXQodCs3KT09PTExNyl7Y29uc3Qgcj1TdChuLHQrOCk7aWYoT3QocikpcmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGksciksc2l6ZToxMn19dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCs2KX0iLmApfWZ1bmN0aW9uIFN0KGUsdCl7cmV0dXJuIHhlKGUuY2hhckNvZGVBdCh0KSk8PDEyfHhlKGUuY2hhckNvZGVBdCh0KzEpKTw8OHx4ZShlLmNoYXJDb2RlQXQodCsyKSk8PDR8eGUoZS5jaGFyQ29kZUF0KHQrMykpfWZ1bmN0aW9uIHhlKGUpe3JldHVybiBlPj00OCYmZTw9NTc/ZS00ODplPj02NSYmZTw9NzA/ZS01NTplPj05NyYmZTw9MTAyP2UtODc6LTF9ZnVuY3Rpb24gRm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7c3dpdGNoKG4uY2hhckNvZGVBdCh0KzEpKXtjYXNlIDM0OnJldHVybnt2YWx1ZTonIicsc2l6ZToyfTtjYXNlIDkyOnJldHVybnt2YWx1ZToiXFwiLHNpemU6Mn07Y2FzZSA0NzpyZXR1cm57dmFsdWU6Ii8iLHNpemU6Mn07Y2FzZSA5ODpyZXR1cm57dmFsdWU6IlxiIixzaXplOjJ9O2Nhc2UgMTAyOnJldHVybnt2YWx1ZToiXGYiLHNpemU6Mn07Y2FzZSAxMTA6cmV0dXJue3ZhbHVlOmAKYCxzaXplOjJ9O2Nhc2UgMTE0OnJldHVybnt2YWx1ZToiXHIiLHNpemU6Mn07Y2FzZSAxMTY6cmV0dXJue3ZhbHVlOiIJIixzaXplOjJ9fXRocm93IEcoZS5zb3VyY2UsdCxgSW52YWxpZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCsyKX0iLmApfWZ1bmN0aW9uIE1uKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9ZS5saW5lU3RhcnQscz10KzMsYT1zLGM9IiI7Y29uc3QgZj1bXTtmb3IoO3M8aTspe2NvbnN0IGQ9bi5jaGFyQ29kZUF0KHMpO2lmKGQ9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCl7Yys9bi5zbGljZShhLHMpLGYucHVzaChjKTtjb25zdCB1PVYoZSxsLkJMT0NLX1NUUklORyx0LHMrMyxBbihmKS5qb2luKGAKYCkpO3JldHVybiBlLmxpbmUrPWYubGVuZ3RoLTEsZS5saW5lU3RhcnQ9cix1fWlmKGQ9PT05MiYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMyk9PT0zNCl7Yys9bi5zbGljZShhLHMpLGE9cysxLHMrPTQ7Y29udGludWV9aWYoZD09PTEwfHxkPT09MTMpe2MrPW4uc2xpY2UoYSxzKSxmLnB1c2goYyksZD09PTEzJiZuLmNoYXJDb2RlQXQocysxKT09PTEwP3MrPTI6KytzLGM9IiIsYT1zLHI9cztjb250aW51ZX1pZihmZShkKSkrK3M7ZWxzZSBpZih3ZShuLHMpKXMrPTI7ZWxzZSB0aHJvdyBHKGUuc291cmNlLHMsYEludmFsaWQgY2hhcmFjdGVyIHdpdGhpbiBTdHJpbmc6ICR7b2UoZSxzKX0uYCl9dGhyb3cgRyhlLnNvdXJjZSxzLCJVbnRlcm1pbmF0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uICRuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxO2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7aWYoeG4ocykpKytyO2Vsc2UgYnJlYWt9cmV0dXJuIFYoZSxsLk5BTUUsdCxyLG4uc2xpY2UodCxyKSl9Y29uc3QgQm49MTAsd3Q9MjtmdW5jdGlvbiBaZShlKXtyZXR1cm4gRGUoZSxbXSl9ZnVuY3Rpb24gRGUoZSx0KXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7Y2FzZSJmdW5jdGlvbiI6cmV0dXJuIGUubmFtZT9gW2Z1bmN0aW9uICR7ZS5uYW1lfV1gOiJbZnVuY3Rpb25dIjtjYXNlIm9iamVjdCI6cmV0dXJuIFVuKGUsdCk7ZGVmYXVsdDpyZXR1cm4gU3RyaW5nKGUpfX1mdW5jdGlvbiBVbihlLHQpe2lmKGU9PT1udWxsKXJldHVybiJudWxsIjtpZih0LmluY2x1ZGVzKGUpKXJldHVybiJbQ2lyY3VsYXJdIjtjb25zdCBuPVsuLi50LGVdO2lmKFZuKGUpKXtjb25zdCBpPWUudG9KU09OKCk7aWYoaSE9PWUpcmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOkRlKGksbil9ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxbihlLG4pO3JldHVybiBqbihlLG4pfWZ1bmN0aW9uIFZuKGUpe3JldHVybiB0eXBlb2YgZS50b0pTT049PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gam4oZSx0KXtjb25zdCBuPU9iamVjdC5lbnRyaWVzKGUpO3JldHVybiBuLmxlbmd0aD09PTA/Int9Ijp0Lmxlbmd0aD53dD8iWyIrR24oZSkrIl0iOiJ7ICIrbi5tYXAoKFtyLHNdKT0+cisiOiAiK0RlKHMsdCkpLmpvaW4oIiwgIikrIiB9In1mdW5jdGlvbiBxbihlLHQpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iW10iO2lmKHQubGVuZ3RoPnd0KXJldHVybiJbQXJyYXldIjtjb25zdCBuPU1hdGgubWluKEJuLGUubGVuZ3RoKSxpPWUubGVuZ3RoLW4scj1bXTtmb3IobGV0IHM9MDtzPG47KytzKXIucHVzaChEZShlW3NdLHQpKTtyZXR1cm4gaT09PTE/ci5wdXNoKCIuLi4gMSBtb3JlIGl0ZW0iKTppPjEmJnIucHVzaChgLi4uICR7aX0gbW9yZSBpdGVtc2ApLCJbIityLmpvaW4oIiwgIikrIl0ifWZ1bmN0aW9uIEduKGUpe2NvbnN0IHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnJlcGxhY2UoL15cW29iamVjdCAvLCIiKS5yZXBsYWNlKC9dJC8sIiIpO2lmKHQ9PT0iT2JqZWN0IiYmdHlwZW9mIGUuY29uc3RydWN0b3I9PSJmdW5jdGlvbiIpe2NvbnN0IG49ZS5jb25zdHJ1Y3Rvci5uYW1lO2lmKHR5cGVvZiBuPT0ic3RyaW5nIiYmbiE9PSIiKXJldHVybiBufXJldHVybiB0fWNvbnN0IHpuPWdsb2JhbFRoaXMucHJvY2VzcyYmZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5OT0RFX0VOVj09PSJwcm9kdWN0aW9uIj9mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2Ygbn06ZnVuY3Rpb24odCxuKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4hMDtpZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXt2YXIgaTtjb25zdCByPW4ucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10scz1TeW1ib2wudG9TdHJpbmdUYWcgaW4gdD90W1N5bWJvbC50b1N0cmluZ1RhZ106KGk9dC5jb25zdHJ1Y3Rvcik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm5hbWU7aWYocj09PXMpe2NvbnN0IGE9WmUodCk7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlICR7cn0gIiR7YX0iIGZyb20gYW5vdGhlciBtb2R1bGUgb3IgcmVhbG0uCgpFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiAiZ3JhcGhxbCIgaW4gdGhlIG5vZGVfbW9kdWxlcwpkaXJlY3RvcnkuIElmIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiAiZ3JhcGhxbCIgYXJlIHRoZSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIKcmVsaWVkIG9uIG1vZHVsZXMsIHVzZSAicmVzb2x1dGlvbnMiIHRvIGVuc3VyZSBvbmx5IG9uZSB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KCmh0dHBzOi8veWFybnBrZy5jb20vZW4vZG9jcy9zZWxlY3RpdmUtdmVyc2lvbi1yZXNvbHV0aW9ucwoKRHVwbGljYXRlICJncmFwaHFsIiBtb2R1bGVzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZGlmZmVyZW50CnZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgYW5kIGJlaGF2aW9yLiBUaGUgZGF0YSBmcm9tIG9uZQp2ZXJzaW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBjb3VsZCBwcm9kdWNlIGNvbmZ1c2luZyBhbmQKc3B1cmlvdXMgcmVzdWx0cy5gKX19cmV0dXJuITF9O2NsYXNzIER0e2NvbnN0cnVjdG9yKHQsbj0iR3JhcGhRTCByZXF1ZXN0IixpPXtsaW5lOjEsY29sdW1uOjF9KXt0eXBlb2YgdD09InN0cmluZyJ8fFNlKCExLGBCb2R5IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkOiAke1plKHQpfS5gKSx0aGlzLmJvZHk9dCx0aGlzLm5hbWU9bix0aGlzLmxvY2F0aW9uT2Zmc2V0PWksdGhpcy5sb2NhdGlvbk9mZnNldC5saW5lPjB8fFNlKCExLCJsaW5lIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKSx0aGlzLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbj4wfHxTZSghMSwiY29sdW1uIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJTb3VyY2UifX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gem4oZSxEdCl9ZnVuY3Rpb24gQ3QoZSx0KXtyZXR1cm4gbmV3IFluKGUsdCkucGFyc2VEb2N1bWVudCgpfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQsbj17fSl7Y29uc3QgaT1Ibih0KT90Om5ldyBEdCh0KTt0aGlzLl9sZXhlcj1uZXcgU24oaSksdGhpcy5fb3B0aW9ucz1uLHRoaXMuX3Rva2VuQ291bnRlcj0wfXBhcnNlTmFtZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk5BTUUsdmFsdWU6dC52YWx1ZX0pfXBhcnNlRG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuRE9DVU1FTlQsZGVmaW5pdGlvbnM6dGhpcy5tYW55KGwuU09GLHRoaXMucGFyc2VEZWZpbml0aW9uLGwuRU9GKX0pfXBhcnNlRGVmaW5pdGlvbigpe2lmKHRoaXMucGVlayhsLkJSQUNFX0wpKXJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2NvbnN0IHQ9dGhpcy5wZWVrRGVzY3JpcHRpb24oKSxuPXQ/dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk6dGhpcy5fbGV4ZXIudG9rZW47aWYobi5raW5kPT09bC5OQU1FKXtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJzY2hlbWEiOnJldHVybiB0aGlzLnBhcnNlU2NoZW1hRGVmaW5pdGlvbigpO2Nhc2Uic2NhbGFyIjpyZXR1cm4gdGhpcy5wYXJzZVNjYWxhclR5cGVEZWZpbml0aW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnRlcmZhY2UiOnJldHVybiB0aGlzLnBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKTtjYXNlInVuaW9uIjpyZXR1cm4gdGhpcy5wYXJzZVVuaW9uVHlwZURlZmluaXRpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnB1dCI6cmV0dXJuIHRoaXMucGFyc2VJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJkaXJlY3RpdmUiOnJldHVybiB0aGlzLnBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpfWlmKHQpdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2UsdGhpcy5fbGV4ZXIudG9rZW4uc3RhcnQsIlVuZXhwZWN0ZWQgZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gdHlwZSBkZWZpbml0aW9ucy4iKTtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJxdWVyeSI6Y2FzZSJtdXRhdGlvbiI6Y2FzZSJzdWJzY3JpcHRpb24iOnJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2Nhc2UiZnJhZ21lbnQiOnJldHVybiB0aGlzLnBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCk7Y2FzZSJleHRlbmQiOnJldHVybiB0aGlzLnBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpfX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQobil9cGFyc2VPcGVyYXRpb25EZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtpZih0aGlzLnBlZWsobC5CUkFDRV9MKSlyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5PUEVSQVRJT05fREVGSU5JVElPTixvcGVyYXRpb246bGUuUVVFUlksbmFtZTp2b2lkIDAsdmFyaWFibGVEZWZpbml0aW9uczpbXSxkaXJlY3RpdmVzOltdLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KTtjb25zdCBuPXRoaXMucGFyc2VPcGVyYXRpb25UeXBlKCk7bGV0IGk7cmV0dXJuIHRoaXMucGVlayhsLk5BTUUpJiYoaT10aGlzLnBhcnNlTmFtZSgpKSx0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9ERUZJTklUSU9OLG9wZXJhdGlvbjpuLG5hbWU6aSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlT3BlcmF0aW9uVHlwZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3N3aXRjaCh0LnZhbHVlKXtjYXNlInF1ZXJ5IjpyZXR1cm4gbGUuUVVFUlk7Y2FzZSJtdXRhdGlvbiI6cmV0dXJuIGxlLk1VVEFUSU9OO2Nhc2Uic3Vic2NyaXB0aW9uIjpyZXR1cm4gbGUuU1VCU0NSSVBUSU9OfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbnMoKXtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5QQVJFTl9MLHRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb24sbC5QQVJFTl9SKX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm5vZGUodGhpcy5fbGV4ZXIudG9rZW4se2tpbmQ6VC5WQVJJQUJMRV9ERUZJTklUSU9OLHZhcmlhYmxlOnRoaXMucGFyc2VWYXJpYWJsZSgpLHR5cGU6KHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKSksZGVmYXVsdFZhbHVlOnRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkVRVUFMUyk/dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCk6dm9pZCAwLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpfSl9cGFyc2VWYXJpYWJsZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5ET0xMQVIpLHRoaXMubm9kZSh0LHtraW5kOlQuVkFSSUFCTEUsbmFtZTp0aGlzLnBhcnNlTmFtZSgpfSl9cGFyc2VTZWxlY3Rpb25TZXQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuU0VMRUNUSU9OX1NFVCxzZWxlY3Rpb25zOnRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZVNlbGVjdGlvbixsLkJSQUNFX1IpfSl9cGFyc2VTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1BSRUFEKT90aGlzLnBhcnNlRnJhZ21lbnQoKTp0aGlzLnBhcnNlRmllbGQoKX1wYXJzZUZpZWxkKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VOYW1lKCk7bGV0IGkscjtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQ09MT04pPyhpPW4scj10aGlzLnBhcnNlTmFtZSgpKTpyPW4sdGhpcy5ub2RlKHQse2tpbmQ6VC5GSUVMRCxhbGlhczppLG5hbWU6cixhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyghMSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGVlayhsLkJSQUNFX0wpP3RoaXMucGFyc2VTZWxlY3Rpb25TZXQoKTp2b2lkIDB9KX1wYXJzZUFyZ3VtZW50cyh0KXtjb25zdCBuPXQ/dGhpcy5wYXJzZUNvbnN0QXJndW1lbnQ6dGhpcy5wYXJzZUFyZ3VtZW50O3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLlBBUkVOX0wsbixsLlBBUkVOX1IpfXBhcnNlQXJndW1lbnQodD0hMSl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5BUkdVTUVOVCxuYW1lOmksdmFsdWU6dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KX0pfXBhcnNlQ29uc3RBcmd1bWVudCgpe3JldHVybiB0aGlzLnBhcnNlQXJndW1lbnQoITApfXBhcnNlRnJhZ21lbnQoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0VG9rZW4obC5TUFJFQUQpO2NvbnN0IG49dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoIm9uIik7cmV0dXJuIW4mJnRoaXMucGVlayhsLk5BTUUpP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfU1BSRUFELG5hbWU6dGhpcy5wYXJzZUZyYWdtZW50TmFtZSgpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpfSk6dGhpcy5ub2RlKHQse2tpbmQ6VC5JTkxJTkVfRlJBR01FTlQsdHlwZUNvbmRpdGlvbjpuP3RoaXMucGFyc2VOYW1lZFR5cGUoKTp2b2lkIDAsZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5leHBlY3RLZXl3b3JkKCJmcmFnbWVudCIpLHRoaXMuX29wdGlvbnMuYWxsb3dMZWdhY3lGcmFnbWVudFZhcmlhYmxlcz09PSEwP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksdHlwZUNvbmRpdGlvbjoodGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpLHRoaXMucGFyc2VOYW1lZFR5cGUoKSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pOnRoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx0eXBlQ29uZGl0aW9uOih0aGlzLmV4cGVjdEtleXdvcmQoIm9uIiksdGhpcy5wYXJzZU5hbWVkVHlwZSgpKSxkaXJlY3RpdmVzOnRoaXMucGFyc2VEaXJlY3RpdmVzKCExKSxzZWxlY3Rpb25TZXQ6dGhpcy5wYXJzZVNlbGVjdGlvblNldCgpfSl9cGFyc2VGcmFnbWVudE5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJvbiIpdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMucGFyc2VOYW1lKCl9cGFyc2VWYWx1ZUxpdGVyYWwodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtzd2l0Y2gobi5raW5kKXtjYXNlIGwuQlJBQ0tFVF9MOnJldHVybiB0aGlzLnBhcnNlTGlzdCh0KTtjYXNlIGwuQlJBQ0VfTDpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdCh0KTtjYXNlIGwuSU5UOnJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZShuLHtraW5kOlQuSU5ULHZhbHVlOm4udmFsdWV9KTtjYXNlIGwuRkxPQVQ6cmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksdGhpcy5ub2RlKG4se2tpbmQ6VC5GTE9BVCx2YWx1ZTpuLnZhbHVlfSk7Y2FzZSBsLlNUUklORzpjYXNlIGwuQkxPQ0tfU1RSSU5HOnJldHVybiB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCgpO2Nhc2UgbC5OQU1FOnN3aXRjaCh0aGlzLmFkdmFuY2VMZXhlcigpLG4udmFsdWUpe2Nhc2UidHJ1ZSI6cmV0dXJuIHRoaXMubm9kZShuLHtraW5kOlQuQk9PTEVBTix2YWx1ZTohMH0pO2Nhc2UiZmFsc2UiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkJPT0xFQU4sdmFsdWU6ITF9KTtjYXNlIm51bGwiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULk5VTEx9KTtkZWZhdWx0OnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkVOVU0sdmFsdWU6bi52YWx1ZX0pfWNhc2UgbC5ET0xMQVI6aWYodClpZih0aGlzLmV4cGVjdFRva2VuKGwuRE9MTEFSKSx0aGlzLl9sZXhlci50b2tlbi5raW5kPT09bC5OQU1FKXtjb25zdCBpPXRoaXMuX2xleGVyLnRva2VuLnZhbHVlO3Rocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYFVuZXhwZWN0ZWQgdmFyaWFibGUgIiQke2l9IiBpbiBjb25zdGFudCB2YWx1ZS5gKX1lbHNlIHRocm93IHRoaXMudW5leHBlY3RlZChuKTtyZXR1cm4gdGhpcy5wYXJzZVZhcmlhYmxlKCk7ZGVmYXVsdDp0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKX19cGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpe3JldHVybiB0aGlzLnBhcnNlVmFsdWVMaXRlcmFsKCEwKX1wYXJzZVN0cmluZ0xpdGVyYWwoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZSh0LHtraW5kOlQuU1RSSU5HLHZhbHVlOnQudmFsdWUsYmxvY2s6dC5raW5kPT09bC5CTE9DS19TVFJJTkd9KX1wYXJzZUxpc3QodCl7Y29uc3Qgbj0oKT0+dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KTtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTElTVCx2YWx1ZXM6dGhpcy5hbnkobC5CUkFDS0VUX0wsbixsLkJSQUNLRVRfUil9KX1wYXJzZU9iamVjdCh0KXtjb25zdCBuPSgpPT50aGlzLnBhcnNlT2JqZWN0RmllbGQodCk7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpULk9CSkVDVCxmaWVsZHM6dGhpcy5hbnkobC5CUkFDRV9MLG4sbC5CUkFDRV9SKX0pfXBhcnNlT2JqZWN0RmllbGQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5PQkpFQ1RfRklFTEQsbmFtZTppLHZhbHVlOnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCl9KX1wYXJzZURpcmVjdGl2ZXModCl7Y29uc3Qgbj1bXTtmb3IoO3RoaXMucGVlayhsLkFUKTspbi5wdXNoKHRoaXMucGFyc2VEaXJlY3RpdmUodCkpO3JldHVybiBufXBhcnNlQ29uc3REaXJlY3RpdmVzKCl7cmV0dXJuIHRoaXMucGFyc2VEaXJlY3RpdmVzKCEwKX1wYXJzZURpcmVjdGl2ZSh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQVQpLHRoaXMubm9kZShuLHtraW5kOlQuRElSRUNUSVZFLG5hbWU6dGhpcy5wYXJzZU5hbWUoKSxhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyh0KX0pfXBhcnNlVHlwZVJlZmVyZW5jZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47bGV0IG47aWYodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQlJBQ0tFVF9MKSl7Y29uc3QgaT10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpO3RoaXMuZXhwZWN0VG9rZW4obC5CUkFDS0VUX1IpLG49dGhpcy5ub2RlKHQse2tpbmQ6VC5MSVNUX1RZUEUsdHlwZTppfSl9ZWxzZSBuPXRoaXMucGFyc2VOYW1lZFR5cGUoKTtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQkFORyk/dGhpcy5ub2RlKHQse2tpbmQ6VC5OT05fTlVMTF9UWVBFLHR5cGU6bn0pOm59cGFyc2VOYW1lZFR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTkFNRURfVFlQRSxuYW1lOnRoaXMucGFyc2VOYW1lKCl9KX1wZWVrRGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1RSSU5HKXx8dGhpcy5wZWVrKGwuQkxPQ0tfU1RSSU5HKX1wYXJzZURlc2NyaXB0aW9uKCl7aWYodGhpcy5wZWVrRGVzY3JpcHRpb24oKSlyZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoKX1wYXJzZVNjaGVtYURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJzY2hlbWEiKTtjb25zdCBpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZU9wZXJhdGlvblR5cGVEZWZpbml0aW9uLGwuQlJBQ0VfUik7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuU0NIRU1BX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixkaXJlY3RpdmVzOmksb3BlcmF0aW9uVHlwZXM6cn0pfXBhcnNlT3BlcmF0aW9uVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU9wZXJhdGlvblR5cGUoKTt0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWVkVHlwZSgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9UWVBFX0RFRklOSVRJT04sb3BlcmF0aW9uOm4sdHlwZTppfSl9cGFyc2VTY2FsYXJUeXBlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoInNjYWxhciIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5TQ0FMQVJfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cn0pfXBhcnNlT2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJ0eXBlIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCkscz10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCksYT10aGlzLnBhcnNlRmllbGRzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksaW50ZXJmYWNlczpyLGRpcmVjdGl2ZXM6cyxmaWVsZHM6YX0pfXBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKXtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoImltcGxlbWVudHMiKT90aGlzLmRlbGltaXRlZE1hbnkobC5BTVAsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlRmllbGREZWZpbml0aW9uLGwuQlJBQ0VfUil9cGFyc2VGaWVsZERlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpO3RoaXMuZXhwZWN0VG9rZW4obC5DT0xPTik7Y29uc3Qgcz10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpLGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkZJRUxEX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIsdHlwZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlQXJndW1lbnREZWZzKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuUEFSRU5fTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLlBBUkVOX1IpfXBhcnNlSW5wdXRWYWx1ZURlZigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKSxpPXRoaXMucGFyc2VOYW1lKCk7dGhpcy5leHBlY3RUb2tlbihsLkNPTE9OKTtjb25zdCByPXRoaXMucGFyc2VUeXBlUmVmZXJlbmNlKCk7bGV0IHM7dGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuRVFVQUxTKSYmKHM9dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCkpO2NvbnN0IGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOUFVUX1ZBTFVFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksdHlwZTpyLGRlZmF1bHRWYWx1ZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnRlcmZhY2UiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxzPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxhPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuSU5URVJGQUNFX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxpbnRlcmZhY2VzOnIsZGlyZWN0aXZlczpzLGZpZWxkczphfSl9cGFyc2VVbmlvblR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscz10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnIsdHlwZXM6c30pfXBhcnNlVW5pb25NZW1iZXJUeXBlcygpe3JldHVybiB0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4obC5FUVVBTFMpP3RoaXMuZGVsaW1pdGVkTWFueShsLlBJUEUsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VFbnVtVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyLHZhbHVlczpzfSl9cGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUVudW1WYWx1ZURlZmluaXRpb24sbC5CUkFDRV9SKX1wYXJzZUVudW1WYWx1ZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlRW51bVZhbHVlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkVOVU1fVkFMVUVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnJ9KX1wYXJzZUVudW1WYWx1ZU5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJ0cnVlInx8dGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0iZmFsc2UifHx0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJudWxsIil0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSx0aGlzLl9sZXhlci50b2tlbi5zdGFydCxgJHtDZSh0aGlzLl9sZXhlci50b2tlbil9IGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgYW4gZW51bSB2YWx1ZS5gKTtyZXR1cm4gdGhpcy5wYXJzZU5hbWUoKX1wYXJzZUlucHV0T2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLkJSQUNFX1IpfXBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk7aWYodC5raW5kPT09bC5OQU1FKXN3aXRjaCh0LnZhbHVlKXtjYXNlInNjaGVtYSI6cmV0dXJuIHRoaXMucGFyc2VTY2hlbWFFeHRlbnNpb24oKTtjYXNlInNjYWxhciI6cmV0dXJuIHRoaXMucGFyc2VTY2FsYXJUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVFeHRlbnNpb24oKTtjYXNlImludGVyZmFjZSI6cmV0dXJuIHRoaXMucGFyc2VJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ1bmlvbiI6cmV0dXJuIHRoaXMucGFyc2VVbmlvblR5cGVFeHRlbnNpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVFeHRlbnNpb24oKTtjYXNlImlucHV0IjpyZXR1cm4gdGhpcy5wYXJzZUlucHV0T2JqZWN0VHlwZUV4dGVuc2lvbigpfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVNjaGVtYUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInNjaGVtYSIpO2NvbnN0IG49dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLGk9dGhpcy5vcHRpb25hbE1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VPcGVyYXRpb25UeXBlRGVmaW5pdGlvbixsLkJSQUNFX1IpO2lmKG4ubGVuZ3RoPT09MCYmaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDSEVNQV9FWFRFTlNJT04sZGlyZWN0aXZlczpuLG9wZXJhdGlvblR5cGVzOml9KX1wYXJzZVNjYWxhclR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJzY2FsYXIiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCk7aWYoaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDQUxBUl9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppfSl9cGFyc2VPYmplY3RUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidHlwZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW50ZXJmYWNlVHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoImludGVyZmFjZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlVW5pb25UeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO2lmKGkubGVuZ3RoPT09MCYmci5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfRVhURU5TSU9OLG5hbWU6bixkaXJlY3RpdmVzOmksdHlwZXM6cn0pfXBhcnNlRW51bVR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHI9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTApdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppLHZhbHVlczpyfSl9cGFyc2VJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pfXBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoImRpcmVjdGl2ZSIpLHRoaXMuZXhwZWN0VG9rZW4obC5BVCk7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpLHM9dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoInJlcGVhdGFibGUiKTt0aGlzLmV4cGVjdEtleXdvcmQoIm9uIik7Y29uc3QgYT10aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb25zKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRElSRUNUSVZFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIscmVwZWF0YWJsZTpzLGxvY2F0aW9uczphfSl9cGFyc2VEaXJlY3RpdmVMb2NhdGlvbnMoKXtyZXR1cm4gdGhpcy5kZWxpbWl0ZWRNYW55KGwuUElQRSx0aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb24pfXBhcnNlRGlyZWN0aXZlTG9jYXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU5hbWUoKTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUWUsbi52YWx1ZSkpcmV0dXJuIG47dGhyb3cgdGhpcy51bmV4cGVjdGVkKHQpfW5vZGUodCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5ub0xvY2F0aW9uIT09ITAmJihuLmxvYz1uZXcgYm4odCx0aGlzLl9sZXhlci5sYXN0VG9rZW4sdGhpcy5fbGV4ZXIuc291cmNlKSksbn1wZWVrKHQpe3JldHVybiB0aGlzLl9sZXhlci50b2tlbi5raW5kPT09dH1leHBlY3RUb2tlbih0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO2lmKG4ua2luZD09PXQpcmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksbjt0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAke2t0KHQpfSwgZm91bmQgJHtDZShuKX0uYCl9ZXhwZWN0T3B0aW9uYWxUb2tlbih0KXtyZXR1cm4gdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PXQ/KHRoaXMuYWR2YW5jZUxleGVyKCksITApOiExfWV4cGVjdEtleXdvcmQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtpZihuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10KXRoaXMuYWR2YW5jZUxleGVyKCk7ZWxzZSB0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAiJHt0fSIsIGZvdW5kICR7Q2Uobil9LmApfWV4cGVjdE9wdGlvbmFsS2V5d29yZCh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiBuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10Pyh0aGlzLmFkdmFuY2VMZXhlcigpLCEwKTohMX11bmV4cGVjdGVkKHQpe2NvbnN0IG49dCE9bnVsbD90OnRoaXMuX2xleGVyLnRva2VuO3JldHVybiBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBVbmV4cGVjdGVkICR7Q2Uobil9LmApfWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2Zvcig7IXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKTspci5wdXNoKG4uY2FsbCh0aGlzKSk7cmV0dXJuIHJ9b3B0aW9uYWxNYW55KHQsbixpKXtpZih0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpe2NvbnN0IHI9W107ZG8gci5wdXNoKG4uY2FsbCh0aGlzKSk7d2hpbGUoIXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKSk7cmV0dXJuIHJ9cmV0dXJuW119bWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2RvIHIucHVzaChuLmNhbGwodGhpcykpO3doaWxlKCF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSkpO3JldHVybiByfWRlbGltaXRlZE1hbnkodCxuKXt0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCk7Y29uc3QgaT1bXTtkbyBpLnB1c2gobi5jYWxsKHRoaXMpKTt3aGlsZSh0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpO3JldHVybiBpfWFkdmFuY2VMZXhlcigpe2NvbnN0e21heFRva2Vuczp0fT10aGlzLl9vcHRpb25zLG49dGhpcy5fbGV4ZXIuYWR2YW5jZSgpO2lmKHQhPT12b2lkIDAmJm4ua2luZCE9PWwuRU9GJiYoKyt0aGlzLl90b2tlbkNvdW50ZXIsdGhpcy5fdG9rZW5Db3VudGVyPnQpKXRocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYERvY3VtZW50IGNvbnRhaW5zIG1vcmUgdGhhdCAke3R9IHRva2Vucy4gUGFyc2luZyBhYm9ydGVkLmApfX1mdW5jdGlvbiBDZShlKXtjb25zdCB0PWUudmFsdWU7cmV0dXJuIGt0KGUua2luZCkrKHQhPW51bGw/YCAiJHt0fSJgOiIiKX1mdW5jdGlvbiBrdChlKXtyZXR1cm4gd24oZSk/YCIke2V9ImA6ZX1mdW5jdGlvbiBKbihlKXtyZXR1cm5gIiR7ZS5yZXBsYWNlKFFuLFhuKX0iYH1jb25zdCBRbj0vW1x4MDAtXHgxZlx4MjJceDVjXHg3Zi1ceDlmXS9nO2Z1bmN0aW9uIFhuKGUpe3JldHVybiBXbltlLmNoYXJDb2RlQXQoMCldfWNvbnN0IFduPVsiXFx1MDAwMCIsIlxcdTAwMDEiLCJcXHUwMDAyIiwiXFx1MDAwMyIsIlxcdTAwMDQiLCJcXHUwMDA1IiwiXFx1MDAwNiIsIlxcdTAwMDciLCJcXGIiLCJcXHQiLCJcXG4iLCJcXHUwMDBCIiwiXFxmIiwiXFxyIiwiXFx1MDAwRSIsIlxcdTAwMEYiLCJcXHUwMDEwIiwiXFx1MDAxMSIsIlxcdTAwMTIiLCJcXHUwMDEzIiwiXFx1MDAxNCIsIlxcdTAwMTUiLCJcXHUwMDE2IiwiXFx1MDAxNyIsIlxcdTAwMTgiLCJcXHUwMDE5IiwiXFx1MDAxQSIsIlxcdTAwMUIiLCJcXHUwMDFDIiwiXFx1MDAxRCIsIlxcdTAwMUUiLCJcXHUwMDFGIiwiIiwiIiwnXFwiJywiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiXFxcXCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIlxcdTAwN0YiLCJcXHUwMDgwIiwiXFx1MDA4MSIsIlxcdTAwODIiLCJcXHUwMDgzIiwiXFx1MDA4NCIsIlxcdTAwODUiLCJcXHUwMDg2IiwiXFx1MDA4NyIsIlxcdTAwODgiLCJcXHUwMDg5IiwiXFx1MDA4QSIsIlxcdTAwOEIiLCJcXHUwMDhDIiwiXFx1MDA4RCIsIlxcdTAwOEUiLCJcXHUwMDhGIiwiXFx1MDA5MCIsIlxcdTAwOTEiLCJcXHUwMDkyIiwiXFx1MDA5MyIsIlxcdTAwOTQiLCJcXHUwMDk1IiwiXFx1MDA5NiIsIlxcdTAwOTciLCJcXHUwMDk4IiwiXFx1MDA5OSIsIlxcdTAwOUEiLCJcXHUwMDlCIiwiXFx1MDA5QyIsIlxcdTAwOUQiLCJcXHUwMDlFIiwiXFx1MDA5RiJdLFpuPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEtuKGUsdCxuPWJ0KXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IEUgb2YgT2JqZWN0LnZhbHVlcyhUKSlpLnNldChFLGVyKHQsRSkpO2xldCByLHM9QXJyYXkuaXNBcnJheShlKSxhPVtlXSxjPS0xLGY9W10sZD1lLHUseTtjb25zdCB2PVtdLGI9W107ZG97YysrO2NvbnN0IEU9Yz09PWEubGVuZ3RoLGs9RSYmZi5sZW5ndGghPT0wO2lmKEUpe2lmKHU9Yi5sZW5ndGg9PT0wP3ZvaWQgMDp2W3YubGVuZ3RoLTFdLGQ9eSx5PWIucG9wKCksaylpZihzKXtkPWQuc2xpY2UoKTtsZXQgTD0wO2Zvcihjb25zdFskLHFdb2YgZil7Y29uc3QgQj0kLUw7cT09PW51bGw/KGQuc3BsaWNlKEIsMSksTCsrKTpkW0JdPXF9fWVsc2V7ZD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkKSk7Zm9yKGNvbnN0W0wsJF1vZiBmKWRbTF09JH1jPXIuaW5kZXgsYT1yLmtleXMsZj1yLmVkaXRzLHM9ci5pbkFycmF5LHI9ci5wcmV2fWVsc2UgaWYoeSl7aWYodT1zP2M6YVtjXSxkPXlbdV0sZD09bnVsbCljb250aW51ZTt2LnB1c2godSl9bGV0IHc7aWYoIUFycmF5LmlzQXJyYXkoZCkpe3ZhciBtLE47TnQoZCl8fFNlKCExLGBJbnZhbGlkIEFTVCBOb2RlOiAke1plKGQpfS5gKTtjb25zdCBMPUU/KG09aS5nZXQoZC5raW5kKSk9PT1udWxsfHxtPT09dm9pZCAwP3ZvaWQgMDptLmxlYXZlOihOPWkuZ2V0KGQua2luZCkpPT09bnVsbHx8Tj09PXZvaWQgMD92b2lkIDA6Ti5lbnRlcjtpZih3PUw9PW51bGw/dm9pZCAwOkwuY2FsbCh0LGQsdSx5LHYsYiksdz09PVpuKWJyZWFrO2lmKHc9PT0hMSl7aWYoIUUpe3YucG9wKCk7Y29udGludWV9fWVsc2UgaWYodyE9PXZvaWQgMCYmKGYucHVzaChbdSx3XSksIUUpKWlmKE50KHcpKWQ9dztlbHNle3YucG9wKCk7Y29udGludWV9fWlmKHc9PT12b2lkIDAmJmsmJmYucHVzaChbdSxkXSksRSl2LnBvcCgpO2Vsc2V7dmFyIGc7cj17aW5BcnJheTpzLGluZGV4OmMsa2V5czphLGVkaXRzOmYscHJldjpyfSxzPUFycmF5LmlzQXJyYXkoZCksYT1zP2Q6KGc9bltkLmtpbmRdKSE9PW51bGwmJmchPT12b2lkIDA/ZzpbXSxjPS0xLGY9W10seSYmYi5wdXNoKHkpLHk9ZH19d2hpbGUociE9PXZvaWQgMCk7cmV0dXJuIGYubGVuZ3RoIT09MD9mW2YubGVuZ3RoLTFdWzFdOmV9ZnVuY3Rpb24gZXIoZSx0KXtjb25zdCBuPWVbdF07cmV0dXJuIHR5cGVvZiBuPT0ib2JqZWN0Ij9uOnR5cGVvZiBuPT0iZnVuY3Rpb24iP3tlbnRlcjpuLGxlYXZlOnZvaWQgMH06e2VudGVyOmUuZW50ZXIsbGVhdmU6ZS5sZWF2ZX19ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIEtuKGUscnIpfWNvbnN0IG5yPTgwLHJyPXtOYW1lOntsZWF2ZTplPT5lLnZhbHVlfSxWYXJpYWJsZTp7bGVhdmU6ZT0+IiQiK2UubmFtZX0sRG9jdW1lbnQ6e2xlYXZlOmU9PnAoZS5kZWZpbml0aW9ucyxgCgpgKX0sT3BlcmF0aW9uRGVmaW5pdGlvbjp7bGVhdmUoZSl7Y29uc3QgdD1TKCIoIixwKGUudmFyaWFibGVEZWZpbml0aW9ucywiLCAiKSwiKSIpLG49cChbZS5vcGVyYXRpb24scChbZS5uYW1lLHRdKSxwKGUuZGlyZWN0aXZlcywiICIpXSwiICIpO3JldHVybihuPT09InF1ZXJ5Ij8iIjpuKyIgIikrZS5zZWxlY3Rpb25TZXR9fSxWYXJpYWJsZURlZmluaXRpb246e2xlYXZlOih7dmFyaWFibGU6ZSx0eXBlOnQsZGVmYXVsdFZhbHVlOm4sZGlyZWN0aXZlczppfSk9PmUrIjogIit0K1MoIiA9ICIsbikrUygiICIscChpLCIgIikpfSxTZWxlY3Rpb25TZXQ6e2xlYXZlOih7c2VsZWN0aW9uczplfSk9PlooZSl9LEZpZWxkOntsZWF2ZSh7YWxpYXM6ZSxuYW1lOnQsYXJndW1lbnRzOm4sZGlyZWN0aXZlczppLHNlbGVjdGlvblNldDpyfSl7Y29uc3Qgcz1TKCIiLGUsIjogIikrdDtsZXQgYT1zK1MoIigiLHAobiwiLCAiKSwiKSIpO3JldHVybiBhLmxlbmd0aD5uciYmKGE9cytTKGAoCmAsa2UocChuLGAKYCkpLGAKKWApKSxwKFthLHAoaSwiICIpLHJdLCIgIil9fSxBcmd1bWVudDp7bGVhdmU6KHtuYW1lOmUsdmFsdWU6dH0pPT5lKyI6ICIrdH0sRnJhZ21lbnRTcHJlYWQ6e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT4iLi4uIitlK1MoIiAiLHAodCwiICIpKX0sSW5saW5lRnJhZ21lbnQ6e2xlYXZlOih7dHlwZUNvbmRpdGlvbjplLGRpcmVjdGl2ZXM6dCxzZWxlY3Rpb25TZXQ6bn0pPT5wKFsiLi4uIixTKCJvbiAiLGUpLHAodCwiICIpLG5dLCIgIil9LEZyYWdtZW50RGVmaW5pdGlvbjp7bGVhdmU6KHtuYW1lOmUsdHlwZUNvbmRpdGlvbjp0LHZhcmlhYmxlRGVmaW5pdGlvbnM6bixkaXJlY3RpdmVzOmksc2VsZWN0aW9uU2V0OnJ9KT0+YGZyYWdtZW50ICR7ZX0ke1MoIigiLHAobiwiLCAiKSwiKSIpfSBvbiAke3R9ICR7UygiIixwKGksIiAiKSwiICIpfWArcn0sSW50VmFsdWU6e2xlYXZlOih7dmFsdWU6ZX0pPT5lfSxGbG9hdFZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sU3RyaW5nVmFsdWU6e2xlYXZlOih7dmFsdWU6ZSxibG9jazp0fSk9PnQ/T24oZSk6Sm4oZSl9LEJvb2xlYW5WYWx1ZTp7bGVhdmU6KHt2YWx1ZTplfSk9PmU/InRydWUiOiJmYWxzZSJ9LE51bGxWYWx1ZTp7bGVhdmU6KCk9PiJudWxsIn0sRW51bVZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sTGlzdFZhbHVlOntsZWF2ZTooe3ZhbHVlczplfSk9PiJbIitwKGUsIiwgIikrIl0ifSxPYmplY3RWYWx1ZTp7bGVhdmU6KHtmaWVsZHM6ZX0pPT4ieyIrcChlLCIsICIpKyJ9In0sT2JqZWN0RmllbGQ6e2xlYXZlOih7bmFtZTplLHZhbHVlOnR9KT0+ZSsiOiAiK3R9LERpcmVjdGl2ZTp7bGVhdmU6KHtuYW1lOmUsYXJndW1lbnRzOnR9KT0+IkAiK2UrUygiKCIscCh0LCIsICIpLCIpIil9LE5hbWVkVHlwZTp7bGVhdmU6KHtuYW1lOmV9KT0+ZX0sTGlzdFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PiJbIitlKyJdIn0sTm9uTnVsbFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PmUrIiEifSxTY2hlbWFEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsZGlyZWN0aXZlczp0LG9wZXJhdGlvblR5cGVzOm59KT0+UygiIixlLGAKYCkrcChbInNjaGVtYSIscCh0LCIgIiksWihuKV0sIiAiKX0sT3BlcmF0aW9uVHlwZURlZmluaXRpb246e2xlYXZlOih7b3BlcmF0aW9uOmUsdHlwZTp0fSk9PmUrIjogIit0fSxTY2FsYXJUeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm59KT0+UygiIixlLGAKYCkrcChbInNjYWxhciIsdCxwKG4sIiAiKV0sIiAiKX0sT2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsaW50ZXJmYWNlczpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pPT5TKCIiLGUsYApgKStwKFsidHlwZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sRmllbGREZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHR5cGU6aSxkaXJlY3RpdmVzOnJ9KT0+UygiIixlLGAKYCkrdCsoUnQobik/UyhgKApgLGtlKHAobixgCmApKSxgCilgKTpTKCIoIixwKG4sIiwgIiksIikiKSkrIjogIitpK1MoIiAiLHAociwiICIpKX0sSW5wdXRWYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsdHlwZTpuLGRlZmF1bHRWYWx1ZTppLGRpcmVjdGl2ZXM6cn0pPT5TKCIiLGUsYApgKStwKFt0KyI6ICIrbixTKCI9ICIsaSkscChyLCIgIildLCIgIil9LEludGVyZmFjZVR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGludGVyZmFjZXM6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KT0+UygiIixlLGAKYCkrcChbImludGVyZmFjZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sVW5pb25UeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm4sdHlwZXM6aX0pPT5TKCIiLGUsYApgKStwKFsidW5pb24iLHQscChuLCIgIiksUygiPSAiLHAoaSwiIHwgIikpXSwiICIpfSxFbnVtVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLHZhbHVlczppfSk9PlMoIiIsZSxgCmApK3AoWyJlbnVtIix0LHAobiwiICIpLFooaSldLCIgIil9LEVudW1WYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpufSk9PlMoIiIsZSxgCmApK3AoW3QscChuLCIgIildLCIgIil9LElucHV0T2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLGZpZWxkczppfSk9PlMoIiIsZSxgCmApK3AoWyJpbnB1dCIsdCxwKG4sIiAiKSxaKGkpXSwiICIpfSxEaXJlY3RpdmVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHJlcGVhdGFibGU6aSxsb2NhdGlvbnM6cn0pPT5TKCIiLGUsYApgKSsiZGlyZWN0aXZlIEAiK3QrKFJ0KG4pP1MoYCgKYCxrZShwKG4sYApgKSksYAopYCk6UygiKCIscChuLCIsICIpLCIpIikpKyhpPyIgcmVwZWF0YWJsZSI6IiIpKyIgb24gIitwKHIsIiB8ICIpfSxTY2hlbWFFeHRlbnNpb246e2xlYXZlOih7ZGlyZWN0aXZlczplLG9wZXJhdGlvblR5cGVzOnR9KT0+cChbImV4dGVuZCBzY2hlbWEiLHAoZSwiICIpLFoodCldLCIgIil9LFNjYWxhclR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT5wKFsiZXh0ZW5kIHNjYWxhciIsZSxwKHQsIiAiKV0sIiAiKX0sT2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsaW50ZXJmYWNlczp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5wKFsiZXh0ZW5kIHR5cGUiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LEludGVyZmFjZVR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGludGVyZmFjZXM6dCxkaXJlY3RpdmVzOm4sZmllbGRzOml9KT0+cChbImV4dGVuZCBpbnRlcmZhY2UiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LFVuaW9uVHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LHR5cGVzOm59KT0+cChbImV4dGVuZCB1bmlvbiIsZSxwKHQsIiAiKSxTKCI9ICIscChuLCIgfCAiKSldLCIgIil9LEVudW1UeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxkaXJlY3RpdmVzOnQsdmFsdWVzOm59KT0+cChbImV4dGVuZCBlbnVtIixlLHAodCwiICIpLFoobildLCIgIil9LElucHV0T2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LGZpZWxkczpufSk9PnAoWyJleHRlbmQgaW5wdXQiLGUscCh0LCIgIiksWihuKV0sIiAiKX19O2Z1bmN0aW9uIHAoZSx0PSIiKXt2YXIgbjtyZXR1cm4obj1lPT1udWxsP3ZvaWQgMDplLmZpbHRlcihpPT5pKS5qb2luKHQpKSE9PW51bGwmJm4hPT12b2lkIDA/bjoiIn1mdW5jdGlvbiBaKGUpe3JldHVybiBTKGB7CmAsa2UocChlLGAKYCkpLGAKfWApfWZ1bmN0aW9uIFMoZSx0LG49IiIpe3JldHVybiB0IT1udWxsJiZ0IT09IiI/ZSt0K246IiJ9ZnVuY3Rpb24ga2UoZSl7cmV0dXJuIFMoIiAgIixlLnJlcGxhY2UoL1xuL2csYAogIGApKX1mdW5jdGlvbiBSdChlKXt2YXIgdDtyZXR1cm4odD1lPT1udWxsP3ZvaWQgMDplLnNvbWUobj0+bi5pbmNsdWRlcyhgCmApKSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6ITF9Y29uc3QgUHQ9ZT0+e3ZhciBpLHI7bGV0IHQ7Y29uc3Qgbj1lLmRlZmluaXRpb25zLmZpbHRlcihzPT5zLmtpbmQ9PT0iT3BlcmF0aW9uRGVmaW5pdGlvbiIpO3JldHVybiBuLmxlbmd0aD09PTEmJih0PShyPShpPW5bMF0pPT1udWxsP3ZvaWQgMDppLm5hbWUpPT1udWxsP3ZvaWQgMDpyLnZhbHVlKSx0fSxLZT1lPT57aWYodHlwZW9mIGU9PSJzdHJpbmciKXtsZXQgbjt0cnl7Y29uc3QgaT1DdChlKTtuPVB0KGkpfWNhdGNoKGkpe31yZXR1cm57cXVlcnk6ZSxvcGVyYXRpb25OYW1lOm59fWNvbnN0IHQ9UHQoZSk7cmV0dXJue3F1ZXJ5OnRyKGUpLG9wZXJhdGlvbk5hbWU6dH19O2NsYXNzIGhlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtjb25zdCBpPWAke2hlLmV4dHJhY3RNZXNzYWdlKHQpfTogJHtKU09OLnN0cmluZ2lmeSh7cmVzcG9uc2U6dCxyZXF1ZXN0Om59KX1gO3N1cGVyKGkpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGhlLnByb3RvdHlwZSksdGhpcy5yZXNwb25zZT10LHRoaXMucmVxdWVzdD1uLHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT09ImZ1bmN0aW9uIiYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxoZSl9c3RhdGljIGV4dHJhY3RNZXNzYWdlKHQpe3ZhciBuLGkscjtyZXR1cm4ocj0oaT0obj10LmVycm9ycyk9PW51bGw/dm9pZCAwOm5bMF0pPT1udWxsP3ZvaWQgMDppLm1lc3NhZ2UpIT1udWxsP3I6YEdyYXBoUUwgRXJyb3IgKENvZGU6ICR7dC5zdGF0dXN9KWB9fXZhciBpcj10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOnt9O2Z1bmN0aW9uIEx0KGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIGV0PXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjppcixpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcygpe3RoaXMuZmV0Y2g9ITEsdGhpcy5ET01FeGNlcHRpb249bi5ET01FeGNlcHRpb259cmV0dXJuIHMucHJvdG90eXBlPW4sbmV3IHN9KCk7KGZ1bmN0aW9uKHMpeyhmdW5jdGlvbihhKXt2YXIgYz17c2VhcmNoUGFyYW1zOiJVUkxTZWFyY2hQYXJhbXMiaW4gcyxpdGVyYWJsZToiU3ltYm9sImluIHMmJiJpdGVyYXRvciJpbiBTeW1ib2wsYmxvYjoiRmlsZVJlYWRlciJpbiBzJiYiQmxvYiJpbiBzJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2gobyl7cmV0dXJuITF9fSgpLGZvcm1EYXRhOiJGb3JtRGF0YSJpbiBzLGFycmF5QnVmZmVyOiJBcnJheUJ1ZmZlciJpbiBzfTtmdW5jdGlvbiBmKG8pe3JldHVybiBvJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKX1pZihjLmFycmF5QnVmZmVyKXZhciBkPVsiW29iamVjdCBJbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OEFycmF5XSIsIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwiW29iamVjdCBJbnQxNkFycmF5XSIsIltvYmplY3QgVWludDE2QXJyYXldIiwiW29iamVjdCBJbnQzMkFycmF5XSIsIltvYmplY3QgVWludDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDY0QXJyYXldIl0sdT1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKG8pe3JldHVybiBvJiZkLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKT4tMX07ZnVuY3Rpb24geShvKXtpZih0eXBlb2YgbyE9InN0cmluZyImJihvPVN0cmluZyhvKSksL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gby50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHYobyl7cmV0dXJuIHR5cGVvZiBvIT0ic3RyaW5nIiYmKG89U3RyaW5nKG8pKSxvfWZ1bmN0aW9uIGIobyl7dmFyIGg9e25leHQ6ZnVuY3Rpb24oKXt2YXIgXz1vLnNoaWZ0KCk7cmV0dXJue2RvbmU6Xz09PXZvaWQgMCx2YWx1ZTpffX19O3JldHVybiBjLml0ZXJhYmxlJiYoaFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIGh9KSxofWZ1bmN0aW9uIG0obyl7dGhpcy5tYXA9e30sbyBpbnN0YW5jZW9mIG0/by5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7dGhpcy5hcHBlbmQoXyxoKX0sdGhpcyk6QXJyYXkuaXNBcnJheShvKT9vLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5hcHBlbmQoaFswXSxoWzFdKX0sdGhpcyk6byYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihoKXt0aGlzLmFwcGVuZChoLG9baF0pfSx0aGlzKX1tLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obyxoKXtvPXkobyksaD12KGgpO3ZhciBfPXRoaXMubWFwW29dO3RoaXMubWFwW29dPV8/XysiLCAiK2g6aH0sbS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG8pe2RlbGV0ZSB0aGlzLm1hcFt5KG8pXX0sbS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG8pe3JldHVybiBvPXkobyksdGhpcy5oYXMobyk/dGhpcy5tYXBbb106bnVsbH0sbS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eSh5KG8pKX0sbS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG8saCl7dGhpcy5tYXBbeShvKV09dihoKX0sbS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihvLGgpe2Zvcih2YXIgXyBpbiB0aGlzLm1hcCl0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShfKSYmby5jYWxsKGgsdGhpcy5tYXBbX10sXyx0aGlzKX0sbS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBvPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaCxfKXtvLnB1c2goXyl9KSxiKG8pfSxtLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe28ucHVzaChoKX0pLGIobyl9LG0ucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7by5wdXNoKFtfLGhdKX0pLGIobyl9LGMuaXRlcmFibGUmJihtLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPW0ucHJvdG90eXBlLmVudHJpZXMpO2Z1bmN0aW9uIE4obyl7aWYoby5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO28uYm9keVVzZWQ9ITB9ZnVuY3Rpb24gZyhvKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oaCxfKXtvLm9ubG9hZD1mdW5jdGlvbigpe2goby5yZXN1bHQpfSxvLm9uZXJyb3I9ZnVuY3Rpb24oKXtfKG8uZXJyb3IpfX0pfWZ1bmN0aW9uIEUobyl7dmFyIGg9bmV3IEZpbGVSZWFkZXIsXz1nKGgpO3JldHVybiBoLnJlYWRBc0FycmF5QnVmZmVyKG8pLF99ZnVuY3Rpb24gayhvKXt2YXIgaD1uZXcgRmlsZVJlYWRlcixfPWcoaCk7cmV0dXJuIGgucmVhZEFzVGV4dChvKSxffWZ1bmN0aW9uIHcobyl7Zm9yKHZhciBoPW5ldyBVaW50OEFycmF5KG8pLF89bmV3IEFycmF5KGgubGVuZ3RoKSxBPTA7QTxoLmxlbmd0aDtBKyspX1tBXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGhbQV0pO3JldHVybiBfLmpvaW4oIiIpfWZ1bmN0aW9uIEwobyl7aWYoby5zbGljZSlyZXR1cm4gby5zbGljZSgwKTt2YXIgaD1uZXcgVWludDhBcnJheShvLmJ5dGVMZW5ndGgpO3JldHVybiBoLnNldChuZXcgVWludDhBcnJheShvKSksaC5idWZmZXJ9ZnVuY3Rpb24gJCgpe3JldHVybiB0aGlzLmJvZHlVc2VkPSExLHRoaXMuX2luaXRCb2R5PWZ1bmN0aW9uKG8pe3RoaXMuX2JvZHlJbml0PW8sbz90eXBlb2Ygbz09InN0cmluZyI/dGhpcy5fYm9keVRleHQ9bzpjLmJsb2ImJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yobyk/dGhpcy5fYm9keUJsb2I9bzpjLmZvcm1EYXRhJiZGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKT90aGlzLl9ib2R5Rm9ybURhdGE9bzpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pP3RoaXMuX2JvZHlUZXh0PW8udG9TdHJpbmcoKTpjLmFycmF5QnVmZmVyJiZjLmJsb2ImJmYobyk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj1MKG8uYnVmZmVyKSx0aGlzLl9ib2R5SW5pdD1uZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpOmMuYXJyYXlCdWZmZXImJihBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKXx8dShvKSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPUwobyk6dGhpcy5fYm9keVRleHQ9bz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk6dGhpcy5fYm9keVRleHQ9IiIsdGhpcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIil8fCh0eXBlb2Ygbz09InN0cmluZyI/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5fYm9keUJsb2ImJnRoaXMuX2JvZHlCbG9iLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLl9ib2R5QmxvYi50eXBlKTpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX0sYy5ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIG89Tih0aGlzKTtpZihvKXJldHVybiBvO2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm9keUFycmF5QnVmZmVyP04odGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpOnRoaXMuYmxvYigpLnRoZW4oRSl9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgbz1OKHRoaXMpO2lmKG8pcmV0dXJuIG87aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIGsodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHcodGhpcy5fYm9keUFycmF5QnVmZmVyKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dCl9LGMuZm9ybURhdGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oTyl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc312YXIgcT1bIkRFTEVURSIsIkdFVCIsIkhFQUQiLCJPUFRJT05TIiwiUE9TVCIsIlBVVCJdO2Z1bmN0aW9uIEIobyl7dmFyIGg9by50b1VwcGVyQ2FzZSgpO3JldHVybiBxLmluZGV4T2YoaCk+LTE/aDpvfWZ1bmN0aW9uIEkobyxoKXtoPWh8fHt9O3ZhciBfPWguYm9keTtpZihvIGluc3RhbmNlb2YgSSl7aWYoby5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKTt0aGlzLnVybD1vLnVybCx0aGlzLmNyZWRlbnRpYWxzPW8uY3JlZGVudGlhbHMsaC5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBtKG8uaGVhZGVycykpLHRoaXMubWV0aG9kPW8ubWV0aG9kLHRoaXMubW9kZT1vLm1vZGUsdGhpcy5zaWduYWw9by5zaWduYWwsIV8mJm8uX2JvZHlJbml0IT1udWxsJiYoXz1vLl9ib2R5SW5pdCxvLmJvZHlVc2VkPSEwKX1lbHNlIHRoaXMudXJsPVN0cmluZyhvKTtpZih0aGlzLmNyZWRlbnRpYWxzPWguY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fCJzYW1lLW9yaWdpbiIsKGguaGVhZGVyc3x8IXRoaXMuaGVhZGVycykmJih0aGlzLmhlYWRlcnM9bmV3IG0oaC5oZWFkZXJzKSksdGhpcy5tZXRob2Q9QihoLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiKSx0aGlzLm1vZGU9aC5tb2RlfHx0aGlzLm1vZGV8fG51bGwsdGhpcy5zaWduYWw9aC5zaWduYWx8fHRoaXMuc2lnbmFsLHRoaXMucmVmZXJyZXI9bnVsbCwodGhpcy5tZXRob2Q9PT0iR0VUInx8dGhpcy5tZXRob2Q9PT0iSEVBRCIpJiZfKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5faW5pdEJvZHkoXyl9SS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEkodGhpcyx7Ym9keTp0aGlzLl9ib2R5SW5pdH0pfTtmdW5jdGlvbiBPKG8pe3ZhciBoPW5ldyBGb3JtRGF0YTtyZXR1cm4gby50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKF8pe2lmKF8pe3ZhciBBPV8uc3BsaXQoIj0iKSxSPUEuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCIgIikseD1BLmpvaW4oIj0iKS5yZXBsYWNlKC9cKy9nLCIgIik7aC5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KFIpLGRlY29kZVVSSUNvbXBvbmVudCh4KSl9fSksaH1mdW5jdGlvbiBqKG8pe3ZhciBoPW5ldyBtLF89by5yZXBsYWNlKC9ccj9cbltcdCBdKy9nLCIgIik7cmV0dXJuIF8uc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihBKXt2YXIgUj1BLnNwbGl0KCI6IikseD1SLnNoaWZ0KCkudHJpbSgpO2lmKHgpe3ZhciBzZT1SLmpvaW4oIjoiKS50cmltKCk7aC5hcHBlbmQoeCxzZSl9fSksaH0kLmNhbGwoSS5wcm90b3R5cGUpO2Z1bmN0aW9uIFUobyxoKXtofHwoaD17fSksdGhpcy50eXBlPSJkZWZhdWx0Iix0aGlzLnN0YXR1cz1oLnN0YXR1cz09PXZvaWQgMD8yMDA6aC5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIGg/aC5zdGF0dXNUZXh0OiJPSyIsdGhpcy5oZWFkZXJzPW5ldyBtKGguaGVhZGVycyksdGhpcy51cmw9aC51cmx8fCIiLHRoaXMuX2luaXRCb2R5KG8pfSQuY2FsbChVLnByb3RvdHlwZSksVS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFUodGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBtKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LFUuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgbz1uZXcgVShudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIG8udHlwZT0iZXJyb3IiLG99O3ZhciB6PVszMDEsMzAyLDMwMywzMDcsMzA4XTtVLnJlZGlyZWN0PWZ1bmN0aW9uKG8saCl7aWYoei5pbmRleE9mKGgpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IFUobnVsbCx7c3RhdHVzOmgsaGVhZGVyczp7bG9jYXRpb246b319KX0sYS5ET01FeGNlcHRpb249cy5ET01FeGNlcHRpb247dHJ5e25ldyBhLkRPTUV4Y2VwdGlvbn1jYXRjaChvKXthLkRPTUV4Y2VwdGlvbj1mdW5jdGlvbihoLF8pe3RoaXMubWVzc2FnZT1oLHRoaXMubmFtZT1fO3ZhciBBPUVycm9yKGgpO3RoaXMuc3RhY2s9QS5zdGFja30sYS5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5ET01FeGNlcHRpb259ZnVuY3Rpb24gWChvLGgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihfLEEpe3ZhciBSPW5ldyBJKG8saCk7aWYoUi5zaWduYWwmJlIuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIEEobmV3IGEuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgeD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gc2UoKXt4LmFib3J0KCl9eC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgSD17c3RhdHVzOnguc3RhdHVzLHN0YXR1c1RleHQ6eC5zdGF0dXNUZXh0LGhlYWRlcnM6aih4LmdldEFsbFJlc3BvbnNlSGVhZGVycygpfHwiIil9O0gudXJsPSJyZXNwb25zZVVSTCJpbiB4P3gucmVzcG9uc2VVUkw6SC5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO3ZhciByZT0icmVzcG9uc2UiaW4geD94LnJlc3BvbnNlOngucmVzcG9uc2VUZXh0O18obmV3IFUocmUsSCkpfSx4Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LHgub250aW1lb3V0PWZ1bmN0aW9uKCl7QShuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSx4Lm9uYWJvcnQ9ZnVuY3Rpb24oKXtBKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LHgub3BlbihSLm1ldGhvZCxSLnVybCwhMCksUi5jcmVkZW50aWFscz09PSJpbmNsdWRlIj94LndpdGhDcmVkZW50aWFscz0hMDpSLmNyZWRlbnRpYWxzPT09Im9taXQiJiYoeC53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4geCYmYy5ibG9iJiYoeC5yZXNwb25zZVR5cGU9ImJsb2IiKSxSLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihILHJlKXt4LnNldFJlcXVlc3RIZWFkZXIocmUsSCl9KSxSLnNpZ25hbCYmKFIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzZSkseC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt4LnJlYWR5U3RhdGU9PT00JiZSLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsc2UpfSkseC5zZW5kKHR5cGVvZiBSLl9ib2R5SW5pdD09InVuZGVmaW5lZCI/bnVsbDpSLl9ib2R5SW5pdCl9KX1yZXR1cm4gWC5wb2x5ZmlsbD0hMCxzLmZldGNofHwocy5mZXRjaD1YLHMuSGVhZGVycz1tLHMuUmVxdWVzdD1JLHMuUmVzcG9uc2U9VSksYS5IZWFkZXJzPW0sYS5SZXF1ZXN0PUksYS5SZXNwb25zZT1VLGEuZmV0Y2g9WCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYX0pKHt9KX0pKGkpLGkuZmV0Y2gucG9ueWZpbGw9ITAsZGVsZXRlIGkuZmV0Y2gucG9seWZpbGw7dmFyIHI9aTt0PXIuZmV0Y2gsdC5kZWZhdWx0PXIuZmV0Y2gsdC5mZXRjaD1yLmZldGNoLHQuSGVhZGVycz1yLkhlYWRlcnMsdC5SZXF1ZXN0PXIuUmVxdWVzdCx0LlJlc3BvbnNlPXIuUmVzcG9uc2UsZS5leHBvcnRzPXR9KShldCxldC5leHBvcnRzKTt2YXIgUmU9ZXQuZXhwb3J0cyxQZT1MdChSZSksc3I9TSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpQZX0sW1JlXSk7Y29uc3QgZGU9ZT0+e2xldCB0PXt9O3JldHVybiBlJiYodHlwZW9mIEhlYWRlcnMhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSGVhZGVyc3x8c3ImJlJlLkhlYWRlcnMmJmUgaW5zdGFuY2VvZiBSZS5IZWFkZXJzP3Q9ZG4oZSk6QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goKFtuLGldKT0+e24mJmkhPT12b2lkIDAmJih0W25dPWkpfSk6dD1lKSx0fSxGdD1lPT5lLnJlcGxhY2UoLyhbXHMsXXwjW15cblxyXSspKy9nLCIgIikudHJpbSgpLGFyPWU9PntpZighQXJyYXkuaXNBcnJheShlLnF1ZXJ5KSl7Y29uc3QgaT1lLHI9W2BxdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChGdChpLnF1ZXJ5KSl9YF07cmV0dXJuIGUudmFyaWFibGVzJiZyLnB1c2goYHZhcmlhYmxlcz0ke2VuY29kZVVSSUNvbXBvbmVudChpLmpzb25TZXJpYWxpemVyLnN0cmluZ2lmeShpLnZhcmlhYmxlcykpfWApLGkub3BlcmF0aW9uTmFtZSYmci5wdXNoKGBvcGVyYXRpb25OYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGkub3BlcmF0aW9uTmFtZSl9YCksci5qb2luKCImIil9aWYodHlwZW9mIGUudmFyaWFibGVzIT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkoZS52YXJpYWJsZXMpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSBxdWVyeSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3QgdD1lLG49ZS5xdWVyeS5yZWR1Y2UoKGkscixzKT0+KGkucHVzaCh7cXVlcnk6RnQociksdmFyaWFibGVzOnQudmFyaWFibGVzP3QuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KHQudmFyaWFibGVzW3NdKTp2b2lkIDB9KSxpKSxbXSk7cmV0dXJuYHF1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KG4pKX1gfSxvcj1lPT50PT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgTjtjb25zdHt1cmw6bixxdWVyeTppLHZhcmlhYmxlczpyLG9wZXJhdGlvbk5hbWU6cyxmZXRjaDphLGZldGNoT3B0aW9uczpjLG1pZGRsZXdhcmU6Zn09dCxkPVAoe30sdC5oZWFkZXJzKTtsZXQgdT0iIix5O2U9PT0iUE9TVCI/KHk9dXIoaSxyLHMsYy5qc29uU2VyaWFsaXplciksdHlwZW9mIHk9PSJzdHJpbmciJiYoZFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSk6dT1hcih7cXVlcnk6aSx2YXJpYWJsZXM6cixvcGVyYXRpb25OYW1lOnMsanNvblNlcmlhbGl6ZXI6KE49Yy5qc29uU2VyaWFsaXplcikhPW51bGw/TjpIZX0pO2NvbnN0IHY9UCh7bWV0aG9kOmUsaGVhZGVyczpkLGJvZHk6eX0sYyk7bGV0IGI9bixtPXY7aWYoZil7Y29uc3QgZz15aWVsZCBQcm9taXNlLnJlc29sdmUoZihVZShQKHt9LHYpLHt1cmw6bixvcGVyYXRpb25OYW1lOnMsdmFyaWFibGVzOnJ9KSkpLHt1cmw6a309Zyx3PWdlKGcsWyJ1cmwiXSk7Yj1rLG09d31yZXR1cm4gdSYmKGI9YCR7Yn0/JHt1fWApLHlpZWxkIGEoYixtKX0pO2NsYXNzIGNye2NvbnN0cnVjdG9yKHQsbj17fSl7dGhpcy51cmw9dCx0aGlzLnJlcXVlc3RDb25maWc9bix0aGlzLnJhd1JlcXVlc3Q9KC4uLmkpPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtyLHMsYV09aSxjPW1uKHIscyxhKSxnPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpmLGZldGNoOmQ9UGUsbWV0aG9kOnU9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOnkscmVzcG9uc2VNaWRkbGV3YXJlOnZ9PWcsYj1nZShnLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDptfT10aGlzO2Muc2lnbmFsIT09dm9pZCAwJiYoYi5zaWduYWw9Yy5zaWduYWwpO2NvbnN0e29wZXJhdGlvbk5hbWU6Tn09S2UoYy5xdWVyeSk7cmV0dXJuIHR0KHt1cmw6bSxxdWVyeTpjLnF1ZXJ5LHZhcmlhYmxlczpjLnZhcmlhYmxlcyxoZWFkZXJzOlAoUCh7fSxkZShudChmKSkpLGRlKGMucmVxdWVzdEhlYWRlcnMpKSxvcGVyYXRpb25OYW1lOk4sZmV0Y2g6ZCxtZXRob2Q6dSxmZXRjaE9wdGlvbnM6YixtaWRkbGV3YXJlOnl9KS50aGVuKEU9Pih2JiZ2KEUpLEUpKS5jYXRjaChFPT57dGhyb3cgdiYmdihFKSxFfSl9KX1yZXF1ZXN0KHQsLi4ubil7cmV0dXJuIFcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W2kscl09bixzPXBuKHQsaSxyKSxOPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczphLGZldGNoOmM9UGUsbWV0aG9kOmY9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOmQscmVzcG9uc2VNaWRkbGV3YXJlOnV9PU4seT1nZShOLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDp2fT10aGlzO3Muc2lnbmFsIT09dm9pZCAwJiYoeS5zaWduYWw9cy5zaWduYWwpO2NvbnN0e3F1ZXJ5OmIsb3BlcmF0aW9uTmFtZTptfT1LZShzLmRvY3VtZW50KTtyZXR1cm4gdHQoe3VybDp2LHF1ZXJ5OmIsdmFyaWFibGVzOnMudmFyaWFibGVzLGhlYWRlcnM6UChQKHt9LGRlKG50KGEpKSksZGUocy5yZXF1ZXN0SGVhZGVycykpLG9wZXJhdGlvbk5hbWU6bSxmZXRjaDpjLG1ldGhvZDpmLGZldGNoT3B0aW9uczp5LG1pZGRsZXdhcmU6ZH0pLnRoZW4oZz0+KHUmJnUoZyksZy5kYXRhKSkuY2F0Y2goZz0+e3Rocm93IHUmJnUoZyksZ30pfSl9YmF0Y2hSZXF1ZXN0cyh0LG4pe3ZhciBkO2NvbnN0IGk9eW4odCxuKSxmPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpyfT1mLHM9Z2UoZixbImhlYWRlcnMiXSk7aS5zaWduYWwhPT12b2lkIDAmJihzLnNpZ25hbD1pLnNpZ25hbCk7Y29uc3QgYT1pLmRvY3VtZW50cy5tYXAoKHtkb2N1bWVudDp1fSk9PktlKHUpLnF1ZXJ5KSxjPWkuZG9jdW1lbnRzLm1hcCgoe3ZhcmlhYmxlczp1fSk9PnUpO3JldHVybiB0dCh7dXJsOnRoaXMudXJsLHF1ZXJ5OmEsdmFyaWFibGVzOmMsaGVhZGVyczpQKFAoe30sZGUobnQocikpKSxkZShpLnJlcXVlc3RIZWFkZXJzKSksb3BlcmF0aW9uTmFtZTp2b2lkIDAsZmV0Y2g6KGQ9dGhpcy5yZXF1ZXN0Q29uZmlnLmZldGNoKSE9bnVsbD9kOlBlLG1ldGhvZDp0aGlzLnJlcXVlc3RDb25maWcubWV0aG9kfHwiUE9TVCIsZmV0Y2hPcHRpb25zOnMsbWlkZGxld2FyZTp0aGlzLnJlcXVlc3RDb25maWcucmVxdWVzdE1pZGRsZXdhcmV9KS50aGVuKHU9Pih0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHUuZGF0YSkpLmNhdGNoKHU9Pnt0aHJvdyB0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHV9KX1zZXRIZWFkZXJzKHQpe3JldHVybiB0aGlzLnJlcXVlc3RDb25maWcuaGVhZGVycz10LHRoaXN9c2V0SGVhZGVyKHQsbil7Y29uc3R7aGVhZGVyczppfT10aGlzLnJlcXVlc3RDb25maWc7cmV0dXJuIGk/aVt0XT1uOnRoaXMucmVxdWVzdENvbmZpZy5oZWFkZXJzPXtbdF06bn0sdGhpc31zZXRFbmRwb2ludCh0KXtyZXR1cm4gdGhpcy51cmw9dCx0aGlzfX1jb25zdCB0dD1lPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgdSx5O2NvbnN0e3F1ZXJ5OnQsdmFyaWFibGVzOm4sZmV0Y2hPcHRpb25zOml9PWUscj1vcihobigodT1lLm1ldGhvZCkhPW51bGw/dToicG9zdCIpKSxzPUFycmF5LmlzQXJyYXkoZS5xdWVyeSksYT15aWVsZCByKGUpLGM9eWllbGQgbHIoYSwoeT1pLmpzb25TZXJpYWxpemVyKSE9bnVsbD95OkhlKSxmPUFycmF5LmlzQXJyYXkoYyk/IWMuc29tZSgoe2RhdGE6Yn0pPT4hYik6ISFjLmRhdGEsZD1BcnJheS5pc0FycmF5KGMpfHwhYy5lcnJvcnN8fEFycmF5LmlzQXJyYXkoYy5lcnJvcnMpJiYhYy5lcnJvcnMubGVuZ3RofHxpLmVycm9yUG9saWN5PT09ImFsbCJ8fGkuZXJyb3JQb2xpY3k9PT0iaWdub3JlIjtpZihhLm9rJiZkJiZmKXtjb25zdCB2PShBcnJheS5pc0FycmF5KGMpLGMpLHtlcnJvcnM6Yn09dixtPWdlKHYsWyJlcnJvcnMiXSksTj1pLmVycm9yUG9saWN5PT09Imlnbm9yZSI/bTpjO3JldHVybiBVZShQKHt9LHM/e2RhdGE6Tn06Tikse2hlYWRlcnM6YS5oZWFkZXJzLHN0YXR1czphLnN0YXR1c30pfWVsc2V7Y29uc3QgYj10eXBlb2YgYz09InN0cmluZyI/e2Vycm9yOmN9OmM7dGhyb3cgbmV3IGhlKFVlKFAoe30sYikse3N0YXR1czphLnN0YXR1cyxoZWFkZXJzOmEuaGVhZGVyc30pLHtxdWVyeTp0LHZhcmlhYmxlczpufSl9fSksdXI9KGUsdCxuLGkpPT57Y29uc3Qgcj1pIT1udWxsP2k6SGU7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHIuc3RyaW5naWZ5KHtxdWVyeTplLHZhcmlhYmxlczp0LG9wZXJhdGlvbk5hbWU6bn0pO2lmKHR5cGVvZiB0IT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIHJlcXVlc3QgYm9keSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3Qgcz1lLnJlZHVjZSgoYSxjLGYpPT4oYS5wdXNoKHtxdWVyeTpjLHZhcmlhYmxlczp0P3RbZl06dm9pZCAwfSksYSksW10pO3JldHVybiByLnN0cmluZ2lmeShzKX0sbHI9KGUsdCk9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2xldCBuO3JldHVybiBlLmhlYWRlcnMuZm9yRWFjaCgoaSxyKT0+e3IudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiJiYobj1pKX0pLG4mJihuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vanNvbiIpfHxuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vZ3JhcGhxbCtqc29uIil8fG4udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi9ncmFwaHFsLXJlc3BvbnNlK2pzb24iKSk/dC5wYXJzZSh5aWVsZCBlLnRleHQoKSk6ZS50ZXh0KCl9KSxudD1lPT50eXBlb2YgZT09ImZ1bmN0aW9uIj9lKCk6ZTt2YXIgcnQ9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlLHQpe3Q9ZS5leHBvcnRzPW4sdC5nZXRTZXJpYWxpemU9aTtmdW5jdGlvbiBuKHIscyxhLGMpe3JldHVybiBKU09OLnN0cmluZ2lmeShyLGkocyxjKSxhKX1mdW5jdGlvbiBpKHIscyl7dmFyIGE9W10sYz1bXTtyZXR1cm4gcz09bnVsbCYmKHM9ZnVuY3Rpb24oZixkKXtyZXR1cm4gYVswXT09PWQ/IltDaXJjdWxhciB+XSI6IltDaXJjdWxhciB+LiIrYy5zbGljZSgwLGEuaW5kZXhPZihkKSkuam9pbigiLiIpKyJdIn0pLGZ1bmN0aW9uKGYsZCl7aWYoYS5sZW5ndGg+MCl7dmFyIHU9YS5pbmRleE9mKHRoaXMpO351P2Euc3BsaWNlKHUrMSk6YS5wdXNoKHRoaXMpLH51P2Muc3BsaWNlKHUsMS8wLGYpOmMucHVzaChmKSx+YS5pbmRleE9mKGQpJiYoZD1zLmNhbGwodGhpcyxmLGQpKX1lbHNlIGEucHVzaChkKTtyZXR1cm4gcj09bnVsbD9kOnIuY2FsbCh0aGlzLGYsZCl9fX0pKHJ0LHJ0LmV4cG9ydHMpO3ZhciBmcj1ydC5leHBvcnRzLHBlPUx0KGZyKTtjb25zdCBNdD0xZTMqMTU7dmFyIExlPWZ1bmN0aW9uKCl7cmV0dXJuIExlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTEscj1hcmd1bWVudHMubGVuZ3RoO2k8cjtpKyspe249YXJndW1lbnRzW2ldO2Zvcih2YXIgcyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHMpJiYodFtzXT1uW3NdKX1yZXR1cm4gdH0sTGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIEZlPW5ldyBNYXAsaXQ9bmV3IE1hcCwkdD0hMCxNZT0hMTtmdW5jdGlvbiBCdChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXHMsXSsvZywiICIpLnRyaW0oKX1mdW5jdGlvbiBocihlKXtyZXR1cm4gQnQoZS5zb3VyY2UuYm9keS5zdWJzdHJpbmcoZS5zdGFydCxlLmVuZCkpfWZ1bmN0aW9uIGRyKGUpe3ZhciB0PW5ldyBTZXQsbj1bXTtyZXR1cm4gZS5kZWZpbml0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGkpe2lmKGkua2luZD09PSJGcmFnbWVudERlZmluaXRpb24iKXt2YXIgcj1pLm5hbWUudmFsdWUscz1ocihpLmxvYyksYT1pdC5nZXQocik7YSYmIWEuaGFzKHMpPyR0JiZjb25zb2xlLndhcm4oIldhcm5pbmc6IGZyYWdtZW50IHdpdGggbmFtZSAiK3IrYCBhbHJlYWR5IGV4aXN0cy4KZ3JhcGhxbC10YWcgZW5mb3JjZXMgYWxsIGZyYWdtZW50IG5hbWVzIGFjcm9zcyB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIHVuaXF1ZTsgcmVhZCBtb3JlIGFib3V0CnRoaXMgaW4gdGhlIGRvY3M6IGh0dHA6Ly9kZXYuYXBvbGxvZGF0YS5jb20vY29yZS9mcmFnbWVudHMuaHRtbCN1bmlxdWUtbmFtZXNgKTphfHxpdC5zZXQocixhPW5ldyBTZXQpLGEuYWRkKHMpLHQuaGFzKHMpfHwodC5hZGQocyksbi5wdXNoKGkpKX1lbHNlIG4ucHVzaChpKX0pLExlKExlKHt9LGUpLHtkZWZpbml0aW9uczpufSl9ZnVuY3Rpb24gcHIoZSl7dmFyIHQ9bmV3IFNldChlLmRlZmluaXRpb25zKTt0LmZvckVhY2goZnVuY3Rpb24oaSl7aS5sb2MmJmRlbGV0ZSBpLmxvYyxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBzPWlbcl07cyYmdHlwZW9mIHM9PSJvYmplY3QiJiZ0LmFkZChzKX0pfSk7dmFyIG49ZS5sb2M7cmV0dXJuIG4mJihkZWxldGUgbi5zdGFydFRva2VuLGRlbGV0ZSBuLmVuZFRva2VuKSxlfWZ1bmN0aW9uIG1yKGUpe3ZhciB0PUJ0KGUpO2lmKCFGZS5oYXModCkpe3ZhciBuPUN0KGUse2V4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOk1lLGFsbG93TGVnYWN5RnJhZ21lbnRWYXJpYWJsZXM6TWV9KTtpZighbnx8bi5raW5kIT09IkRvY3VtZW50Iil0aHJvdyBuZXcgRXJyb3IoIk5vdCBhIHZhbGlkIEdyYXBoUUwgZG9jdW1lbnQuIik7RmUuc2V0KHQscHIoZHIobikpKX1yZXR1cm4gRmUuZ2V0KHQpfWZ1bmN0aW9uIFEoZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pO3ZhciBpPWVbMF07cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihyLHMpe3ImJnIua2luZD09PSJEb2N1bWVudCI/aSs9ci5sb2Muc291cmNlLmJvZHk6aSs9cixpKz1lW3MrMV19KSxtcihpKX1mdW5jdGlvbiB5cigpe0ZlLmNsZWFyKCksaXQuY2xlYXIoKX1mdW5jdGlvbiBncigpeyR0PSExfWZ1bmN0aW9uIHZyKCl7TWU9ITB9ZnVuY3Rpb24gRXIoKXtNZT0hMX12YXIgQWU9e2dxbDpRLHJlc2V0Q2FjaGVzOnlyLGRpc2FibGVGcmFnbWVudFdhcm5pbmdzOmdyLGVuYWJsZUV4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOnZyLGRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpFcn07KGZ1bmN0aW9uKGUpe2UuZ3FsPUFlLmdxbCxlLnJlc2V0Q2FjaGVzPUFlLnJlc2V0Q2FjaGVzLGUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3M9QWUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3MsZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcyxlLmRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5kaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXN9KShRfHwoUT17fSkpLFEuZGVmYXVsdD1RO2NvbnN0IFV0PVFgCglmcmFnbWVudCBNYXRjaFBhcnRzIG9uIE1hdGNoQ29uZmlnIHsKCQlyZWdleFZhbHVlCgkJbWF0Y2hWYWx1ZQoJfQpgLF9yPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZCgKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkcGF5bG9hZF9pZDogSUQhCgkJJGV2ZW50czogUmVwbGF5RXZlbnRzSW5wdXQhCgkJJG1lc3NhZ2VzOiBTdHJpbmchCgkJJHJlc291cmNlczogU3RyaW5nIQoJCSR3ZWJfc29ja2V0X2V2ZW50czogU3RyaW5nIQoJCSRlcnJvcnM6IFtFcnJvck9iamVjdElucHV0XSEKCQkkaXNfYmVhY29uOiBCb29sZWFuCgkJJGhhc19zZXNzaW9uX3VubG9hZGVkOiBCb29sZWFuCgkJJGhpZ2hsaWdodF9sb2dzOiBTdHJpbmcKCSkgewoJCXB1c2hQYXlsb2FkKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXBheWxvYWRfaWQ6ICRwYXlsb2FkX2lkCgkJCWV2ZW50czogJGV2ZW50cwoJCQltZXNzYWdlczogJG1lc3NhZ2VzCgkJCXJlc291cmNlczogJHJlc291cmNlcwoJCQl3ZWJfc29ja2V0X2V2ZW50czogJHdlYl9zb2NrZXRfZXZlbnRzCgkJCWVycm9yczogJGVycm9ycwoJCQlpc19iZWFjb246ICRpc19iZWFjb24KCQkJaGFzX3Nlc3Npb25fdW5sb2FkZWQ6ICRoYXNfc2Vzc2lvbl91bmxvYWRlZAoJCQloaWdobGlnaHRfbG9nczogJGhpZ2hsaWdodF9sb2dzCgkJKQoJfQpgLFRyPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IElEIQoJCSRkYXRhOiBTdHJpbmchCgkpIHsKCQlwdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJcGF5bG9hZF9pZDogJHBheWxvYWRfaWQKCQkJZGF0YTogJGRhdGEKCQkpCgl9CmAsYnI9UWAKCW11dGF0aW9uIGlkZW50aWZ5U2Vzc2lvbigKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkdXNlcl9pZGVudGlmaWVyOiBTdHJpbmchCgkJJHVzZXJfb2JqZWN0OiBBbnkKCSkgewoJCWlkZW50aWZ5U2Vzc2lvbigKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX2lkZW50aWZpZXI6ICR1c2VyX2lkZW50aWZpZXIKCQkJdXNlcl9vYmplY3Q6ICR1c2VyX29iamVjdAoJCSkKCX0KYCxOcj1RYAoJbXV0YXRpb24gYWRkU2Vzc2lvblByb3BlcnRpZXMoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHByb3BlcnRpZXNfb2JqZWN0OiBBbnkKCSkgewoJCWFkZFNlc3Npb25Qcm9wZXJ0aWVzKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXByb3BlcnRpZXNfb2JqZWN0OiAkcHJvcGVydGllc19vYmplY3QKCQkpCgl9CmAseHI9UWAKCW11dGF0aW9uIHB1c2hNZXRyaWNzKCRtZXRyaWNzOiBbTWV0cmljSW5wdXRdISkgewoJCXB1c2hNZXRyaWNzKG1ldHJpY3M6ICRtZXRyaWNzKQoJfQpgLEFyPVFgCgltdXRhdGlvbiBhZGRTZXNzaW9uRmVlZGJhY2soCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHVzZXJfbmFtZTogU3RyaW5nCgkJJHVzZXJfZW1haWw6IFN0cmluZwoJCSR2ZXJiYXRpbTogU3RyaW5nIQoJCSR0aW1lc3RhbXA6IFRpbWVzdGFtcCEKCSkgewoJCWFkZFNlc3Npb25GZWVkYmFjaygKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX25hbWU6ICR1c2VyX25hbWUKCQkJdXNlcl9lbWFpbDogJHVzZXJfZW1haWwKCQkJdmVyYmF0aW06ICR2ZXJiYXRpbQoJCQl0aW1lc3RhbXA6ICR0aW1lc3RhbXAKCQkpCgl9CmAsSXI9UWAKCW11dGF0aW9uIGluaXRpYWxpemVTZXNzaW9uKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nIQoJCSRlbmFibGVfc3RyaWN0X3ByaXZhY3k6IEJvb2xlYW4hCgkJJHByaXZhY3lfc2V0dGluZzogU3RyaW5nIQoJCSRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6IEJvb2xlYW4hCgkJJGNsaWVudFZlcnNpb246IFN0cmluZyEKCQkkZmlyc3Rsb2FkVmVyc2lvbjogU3RyaW5nIQoJCSRjbGllbnRDb25maWc6IFN0cmluZyEKCQkkZW52aXJvbm1lbnQ6IFN0cmluZyEKCQkkaWQ6IFN0cmluZyEKCQkkYXBwVmVyc2lvbjogU3RyaW5nCgkJJHNlcnZpY2VOYW1lOiBTdHJpbmchCgkJJGNsaWVudF9pZDogU3RyaW5nIQoJCSRuZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiBbU3RyaW5nIV0KCQkkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogQm9vbGVhbgoJKSB7CgkJaW5pdGlhbGl6ZVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQ6ICRvcmdhbml6YXRpb25fdmVyYm9zZV9pZAoJCQllbmFibGVfc3RyaWN0X3ByaXZhY3k6ICRlbmFibGVfc3RyaWN0X3ByaXZhY3kKCQkJZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzOiAkZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzCgkJCWNsaWVudFZlcnNpb246ICRjbGllbnRWZXJzaW9uCgkJCWZpcnN0bG9hZFZlcnNpb246ICRmaXJzdGxvYWRWZXJzaW9uCgkJCWNsaWVudENvbmZpZzogJGNsaWVudENvbmZpZwoJCQllbnZpcm9ubWVudDogJGVudmlyb25tZW50CgkJCWFwcFZlcnNpb246ICRhcHBWZXJzaW9uCgkJCXNlcnZpY2VOYW1lOiAkc2VydmljZU5hbWUKCQkJZmluZ2VycHJpbnQ6ICRpZAoJCQljbGllbnRfaWQ6ICRjbGllbnRfaWQKCQkJbmV0d29ya19yZWNvcmRpbmdfZG9tYWluczogJG5ldHdvcmtfcmVjb3JkaW5nX2RvbWFpbnMKCQkJZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogJGRpc2FibGVfc2Vzc2lvbl9yZWNvcmRpbmcKCQkJcHJpdmFjeV9zZXR0aW5nOiAkcHJpdmFjeV9zZXR0aW5nCgkJKSB7CgkJCXNlY3VyZV9pZAoJCQlwcm9qZWN0X2lkCgkJCXNhbXBsaW5nIHsKCQkJCXNwYW5zIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJCWV2ZW50cyB7CgkJCQkJCW5hbWUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQkJa2V5IHsKCQkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCQl9CgkJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlzYW1wbGluZ1JhdGlvCgkJCQl9CgkJCQlsb2dzIHsKCQkJCQltZXNzYWdlIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlzZXZlcml0eVRleHQgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQkJc2FtcGxpbmdSYXRpbwoJCQkJfQoJCQl9CgkJfQoJfQoJJHtVdH0KYCxPcj1RYAoJcXVlcnkgSWdub3JlKCRpZDogSUQhKSB7CgkJaWdub3JlKGlkOiAkaWQpCgl9CmAsU3I9UWAKCXF1ZXJ5IEdldFNhbXBsaW5nQ29uZmlnKCRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nISkgewoJCXNhbXBsaW5nKG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkOiAkb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQpIHsKCQkJc3BhbnMgewoJCQkJbmFtZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJYXR0cmlidXRlcyB7CgkJCQkJa2V5IHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJfQoJCQkJZXZlbnRzIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJc2FtcGxpbmdSYXRpbwoJCQl9CgkJCWxvZ3MgewoJCQkJbWVzc2FnZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJc2V2ZXJpdHlUZXh0IHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlhdHRyaWJ1dGVzIHsKCQkJCQlrZXkgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQl9CgkJCQlzYW1wbGluZ1JhdGlvCgkJCX0KCQl9Cgl9Cgkke1V0fQpgLHdyPShlLHQsbixpKT0+ZSgpO2Z1bmN0aW9uIERyKGUsdD13cil7cmV0dXJue1B1c2hQYXlsb2FkKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KF9yLG4sUChQKHt9LGkpLHIpKSwiUHVzaFBheWxvYWQiLCJtdXRhdGlvbiIsbil9LFB1c2hQYXlsb2FkQ29tcHJlc3NlZChuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChUcixuLFAoUCh7fSxpKSxyKSksIlB1c2hQYXlsb2FkQ29tcHJlc3NlZCIsIm11dGF0aW9uIixuKX0saWRlbnRpZnlTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KGJyLG4sUChQKHt9LGkpLHIpKSwiaWRlbnRpZnlTZXNzaW9uIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uUHJvcGVydGllcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChOcixuLFAoUCh7fSxpKSxyKSksImFkZFNlc3Npb25Qcm9wZXJ0aWVzIiwibXV0YXRpb24iLG4pfSxwdXNoTWV0cmljcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdCh4cixuLFAoUCh7fSxpKSxyKSksInB1c2hNZXRyaWNzIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uRmVlZGJhY2sobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoQXIsbixQKFAoe30saSkscikpLCJhZGRTZXNzaW9uRmVlZGJhY2siLCJtdXRhdGlvbiIsbil9LGluaXRpYWxpemVTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KElyLG4sUChQKHt9LGkpLHIpKSwiaW5pdGlhbGl6ZVNlc3Npb24iLCJtdXRhdGlvbiIsbil9LElnbm9yZShuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChPcixuLFAoUCh7fSxpKSxyKSksIklnbm9yZSIsInF1ZXJ5IixuKX0sR2V0U2FtcGxpbmdDb25maWcobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoU3IsbixQKFAoe30saSkscikpLCJHZXRTYW1wbGluZ0NvbmZpZyIsInF1ZXJ5IixuKX19fWNsYXNzIENye2NvbnN0cnVjdG9yKHQsbil7dXQodGhpcywiZGVidWciKTt1dCh0aGlzLCJuYW1lIik7dGhpcy5kZWJ1Zz10LHRoaXMubmFtZT1ufWxvZyguLi50KXtpZih0aGlzLmRlYnVnKXtsZXQgbj1gWyR7RGF0ZS5ub3coKX1dYDt0aGlzLm5hbWUmJihuKz1gIC0gJHt0aGlzLm5hbWV9YCksY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxbbiwuLi50XSl9fXdhcm4oLi4udCl7bGV0IG49YFske0RhdGUubm93KCl9XWA7dGhpcy5uYW1lJiYobis9YCAtICR7dGhpcy5uYW1lfWApLGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLFtuLC4uLnRdKX19dmFyIFZ0PShlPT4oZS5CaWxsaW5nUXVvdGFFeGNlZWRlZD0iQmlsbGluZ1F1b3RhRXhjZWVkZWQiLGUpKShWdHx8e30pO2NvbnN0IGtyPTEwLFJyPTFlMyxQcj01MDAsTHI9W1Z0LkJpbGxpbmdRdW90YUV4Y2VlZGVkLnRvU3RyaW5nKCldLEZyPWU9Pnt2YXIgbjtyZXR1cm4oKG49ZS5yZXNwb25zZS5lcnJvcnMpPT1udWxsP3ZvaWQgMDpuLmZpbmQoaT0+THIuaW5jbHVkZXMoaS5tZXNzYWdlKSkpPT09dm9pZCAwfSxNcj0oKT0+e2NvbnN0IGU9KHQsbixpLHIscz0wKT0+Vyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e3JldHVybiB5aWVsZCB0KCl9Y2F0Y2goYSl7aWYoYSBpbnN0YW5jZW9mIGhlJiYhRnIoYSkpdGhyb3cgYTtpZihzPGtyKXJldHVybiB5aWVsZCBuZXcgUHJvbWlzZShjPT5zZXRUaW1lb3V0KGMsUnIrUHIqTWF0aC5wb3coMixzKSkpLHlpZWxkIGUodCxuLGkscixzKzEpO3Rocm93IGNvbnNvbGUuZXJyb3IoYGhpZ2hsaWdodC5pbzogZGF0YSByZXF1ZXN0IGZhaWxlZCBhZnRlciAke3N9IHJldHJpZXNgKSxhfX0pO3JldHVybiBlfSxqdD01LHF0PTJlMywkcj1bIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXTt2YXIgSz0oZT0+KGVbZS5Jbml0aWFsaXplPTBdPSJJbml0aWFsaXplIixlW2UuQXN5bmNFdmVudHM9MV09IkFzeW5jRXZlbnRzIixlW2UuSWRlbnRpZnk9Ml09IklkZW50aWZ5IixlW2UuUHJvcGVydGllcz0zXT0iUHJvcGVydGllcyIsZVtlLk1ldHJpY3M9NF09Ik1ldHJpY3MiLGVbZS5GZWVkYmFjaz01XT0iRmVlZGJhY2siLGVbZS5DdXN0b21FdmVudD02XT0iQ3VzdG9tRXZlbnQiLGVbZS5TdG9wPTddPSJTdG9wIixlKSkoS3x8e30pO2Z1bmN0aW9uIEJyKGUpe3JldHVybiBXKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIG5ldyBQcm9taXNlKG49Pntjb25zdCBpPW5ldyBGaWxlUmVhZGVyO2kub25sb2FkPSgpPT5uKGkucmVzdWx0KSxpLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoW2VdKSl9KTtyZXR1cm4gdC5zbGljZSh0LmluZGV4T2YoIiwiKSsxKX0pfWNvbnN0ICRlPXNlbGY7ZnVuY3Rpb24gR3QoZSx0KXtjb25zdCBuPXt9LGk9W10scj1bXTtmb3IoY29uc3RbcyxhXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtpZihhPT1udWxsKWNvbnRpbnVlOyRyLmluY2x1ZGVzKHR5cGVvZiBhKXx8aS5wdXNoKHtbc106YX0pO2xldCBjO3R5cGVvZiBhPT0ic3RyaW5nIj9jPWE6Yz1wZShhKSxjLmxlbmd0aD5xdCYmKHIucHVzaCh7W3NdOmF9KSxjPWMuc3Vic3RyaW5nKDAscXQpKSxuW3NdPWN9cmV0dXJuIHQhPT0ic2Vzc2lvbiImJihpLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oYEhpZ2hsaWdodCB3YXMgcGFzc2VkIG9uZSBvciBtb3JlICR7dH0gcHJvcGVydGllcyBub3Qgb2YgdHlwZSBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbi5gLGkpLHIubGVuZ3RoPjAmJmNvbnNvbGUud2FybihgSGlnaGxpZ2h0IHdhcyBwYXNzZWQgb25lIG9yIG1vcmUgJHt0fSBwcm9wZXJ0aWVzIGV4Y2VlZGluZyAyMDAwIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgdHJ1bmNhdGVkLmAscikpLG59e2xldCBlLHQsbixpPTAscj0wLHM9ITEsYT0wLGM9bmV3IENyKCExLCJbd29ya2VyXSIpO2NvbnN0IGY9W10sZD0oKT0+YSE9PTAmJmk8anQmJiEhKG4hPW51bGwmJm4ubGVuZ3RoKSx1PShnLEUpPT57JGUucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOnt0eXBlOksuQ3VzdG9tRXZlbnQsdGFnOmcscGF5bG9hZDpFfX0pfSx5PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOkUsZXZlbnRzOmssbWVzc2FnZXM6dyxlcnJvcnM6TCxyZXNvdXJjZXNTdHJpbmc6JCx3ZWJTb2NrZXRFdmVudHNTdHJpbmc6cSxoYXNTZXNzaW9uVW5sb2FkZWQ6QixoaWdobGlnaHRMb2dzOkl9PWcsTz1wZSh7bWVzc2FnZXM6d30pO2xldCBqPXtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGV2ZW50czp7ZXZlbnRzOmt9LG1lc3NhZ2VzOk8scmVzb3VyY2VzOiQsd2ViX3NvY2tldF9ldmVudHM6cSxlcnJvcnM6TCxpc19iZWFjb246ITEsaGFzX3Nlc3Npb25fdW5sb2FkZWQ6Qn07SSYmKGouaGlnaGxpZ2h0X2xvZ3M9SSk7Y29uc3QgVT1mbihKU09OLnN0cmluZ2lmeShqKSksej1jbihVKSxYPXlpZWxkIEJyKHopLG89e3R5cGU6Sy5Bc3luY0V2ZW50cyxpZDpFLGV2ZW50c1NpemU6VS5sZW5ndGgsY29tcHJlc3NlZFNpemU6WC5sZW5ndGh9O2MubG9nKGBQdXNoaW5nIHBheWxvYWQ6ICR7SlNPTi5zdHJpbmdpZnkoe3Nlc3Npb25TZWN1cmVJRDpuLGlkOkUsZmlyc3RTSUQ6TWF0aC5taW4oLi4uai5ldmVudHMuZXZlbnRzLm1hcCh4PT54PT1udWxsP3ZvaWQgMDp4Ll9zaWQpLmZpbHRlcih4PT4hIXgpKSxldmVudHNMZW5ndGg6ai5ldmVudHMuZXZlbnRzLmxlbmd0aCxtZXNzYWdlc0xlbmd0aDp3Lmxlbmd0aCxyZXNvdXJjZXNMZW5ndGg6JC5sZW5ndGgsd2ViU29ja2V0TGVuZ3RoOnEubGVuZ3RoLGVycm9yc0xlbmd0aDpMLmxlbmd0aCxidWZMZW5ndGg6VS5sZW5ndGgsY29tcHJlc3NlZExlbmd0aDp6Lmxlbmd0aCxjb21wcmVzc2VkQmFzZTY0TGVuZ3RoOlgubGVuZ3RofSx2b2lkIDAsMil9YCk7Y29uc3QgaD1lLlB1c2hQYXlsb2FkQ29tcHJlc3NlZCh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwYXlsb2FkX2lkOkUudG9TdHJpbmcoKSxkYXRhOlh9KTtsZXQgXz1Qcm9taXNlLnJlc29sdmUoKTtmLmxlbmd0aCYmKF89ZS5wdXNoTWV0cmljcyh7bWV0cmljczpmfSksZi5zcGxpY2UoMCkpO2xldCBBPXBlcmZvcm1hbmNlLm5vdygpO2NvbnN0IFI9c2V0SW50ZXJ2YWwoKCk9PntBJiZwZXJmb3JtYW5jZS5ub3coKS1BPk10JiYoY29uc29sZS53YXJuKGBVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgZmFpbHVyZSBudW1iZXIgIyR7cn0uYCkscis9MSxjbGVhckludGVydmFsKFIpLHI+PWp0JiYoY29uc29sZS53YXJuKCJVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgc3RvcHBpbmcgcmVjb3JkaW5nIHRvIGF2b2lkIE9PTS4iKSwkZS5wb3N0TWVzc2FnZSh7cmVzcG9uc2U6e3R5cGU6Sy5TdG9wLHJlcXVlc3RTdGFydDpBLGFzeW5jRXZlbnRzUmVzcG9uc2U6b319KSxiKHt0eXBlOksuUHJvcGVydGllcyxwcm9wZXJ0aWVzT2JqZWN0OntzdG9wUmVhc29uOiJQdXNoIFBheWxvYWQgVGltZW91dCJ9LHByb3BlcnR5VHlwZTp7dHlwZToidHJhY2sifX0pKSl9LDEwMCk7dHJ5e3lpZWxkIFByb21pc2UuYWxsKFtoLF9dKSxyJiZwZXJmb3JtYW5jZS5ub3coKS1BPD1NdCYmKGNvbnNvbGUud2FybihgcHVzaFBheWxvYWQgc3VjY2VlZGVkIGFmdGVyICMke3J9IGZhaWx1cmVzLCByZXNldHRpbmcgc3RvcCBzd2l0Y2guYCkscj0wKX1maW5hbGx5e0E9MCxjbGVhckludGVydmFsKFIpfSRlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTpvfSl9KSx2PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3VzZXJPYmplY3Q6RSx1c2VySWRlbnRpZmllcjprLHNvdXJjZTp3fT1nO3c9PT0ic2VnbWVudCI/dSgiU2VnbWVudCBJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKTp1KCJJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKSx5aWVsZCBlLmlkZW50aWZ5U2Vzc2lvbih7c2Vzc2lvbl9zZWN1cmVfaWQ6bix1c2VyX2lkZW50aWZpZXI6ayx1c2VyX29iamVjdDpHdChFLCJ1c2VyIil9KTtjb25zdCBMPXc9PT0ic2VnbWVudCI/dzoiZGVmYXVsdCI7Yy5sb2coYElkZW50aWZ5ICgke2t9LCBzb3VyY2U6ICR7TH0pIHcvIG9iajogJHtwZShFKX0gQCAke3R9YCl9KSxiPWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3Byb3BlcnRpZXNPYmplY3Q6RSxwcm9wZXJ0eVR5cGU6a309ZztsZXQgdzsoaz09bnVsbD92b2lkIDA6ay50eXBlKT09PSJzZXNzaW9uIj8odz0iU2Vzc2lvbiIseWllbGQgZS5hZGRTZXNzaW9uUHJvcGVydGllcyh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwcm9wZXJ0aWVzX29iamVjdDpHdChFLCJzZXNzaW9uIil9KSk6KGs9PW51bGw/dm9pZCAwOmsuc291cmNlKT09PSJzZWdtZW50Ij93PSJTZWdtZW50Ijp3PSJUcmFjayIsdyE9PSJTZXNzaW9uIiYmdSh3LHBlKEUpKSxjLmxvZyhgQWRkaW5nICR7d30gUHJvcGVydGllcyB0byBzZXNzaW9uICgke259KSB3LyBvYmo6ICR7SlNPTi5zdHJpbmdpZnkoRSl9IEAgJHt0fWApfSksbT1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmLnB1c2goLi4uZy5tZXRyaWNzLm1hcChFPT4oe25hbWU6RS5uYW1lLHZhbHVlOkUudmFsdWUsc2Vzc2lvbl9zZWN1cmVfaWQ6bixjYXRlZ29yeTpFLmNhdGVnb3J5LGdyb3VwOkUuZ3JvdXAsdGltZXN0YW1wOkUudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksdGFnczpFLnRhZ3N9KSkpfSksTj1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdHt0aW1lc3RhbXA6RSx2ZXJiYXRpbTprLHVzZXJFbWFpbDp3LHVzZXJOYW1lOkx9PWc7eWllbGQgZS5hZGRTZXNzaW9uRmVlZGJhY2soe3Nlc3Npb25fc2VjdXJlX2lkOm4sdGltZXN0YW1wOkUsdmVyYmF0aW06ayx1c2VyX2VtYWlsOncsdXNlcl9uYW1lOkx9KX0pOyRlLm9ubWVzc2FnZT1mdW5jdGlvbihnKXtyZXR1cm4gVyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoZy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuSW5pdGlhbGl6ZSl7dD1nLmRhdGEubWVzc2FnZS5iYWNrZW5kLG49Zy5kYXRhLm1lc3NhZ2Uuc2Vzc2lvblNlY3VyZUlELHM9Zy5kYXRhLm1lc3NhZ2UuZGVidWcsYT1nLmRhdGEubWVzc2FnZS5yZWNvcmRpbmdTdGFydFRpbWUsYy5kZWJ1Zz1zLGU9RHIobmV3IGNyKHQse2hlYWRlcnM6e319KSxNcigpKTtyZXR1cm59aWYoZCgpKXRyeXtnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Bc3luY0V2ZW50cz95aWVsZCB5KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5JZGVudGlmeT95aWVsZCB2KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Qcm9wZXJ0aWVzP3lpZWxkIGIoZy5kYXRhLm1lc3NhZ2UpOmcuZGF0YS5tZXNzYWdlLnR5cGU9PT1LLk1ldHJpY3M/eWllbGQgbShnLmRhdGEubWVzc2FnZSk6Zy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuRmVlZGJhY2smJih5aWVsZCBOKGcuZGF0YS5tZXNzYWdlKSksaT0wfWNhdGNoKEUpe3MmJmNvbnNvbGUuZXJyb3IoRSksaSs9MX19KX19fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGlnaGxpZ2h0LWNsaWVudC13b3JrZXItQ3BtbDJKMXQuanMubWFwCg==", Fy = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), zo = typeof self < "u" && self.Blob && new Blob([Fy(Sc)], { type: "text/javascript;charset=utf-8" });
|
|
12921
|
+
function Ky(e) {
|
|
12919
12922
|
let t;
|
|
12920
12923
|
try {
|
|
12921
12924
|
if (t = zo && (self.URL || self.webkitURL).createObjectURL(zo), !t) throw "";
|
|
@@ -12937,7 +12940,7 @@ function Yy(e) {
|
|
|
12937
12940
|
}
|
|
12938
12941
|
}
|
|
12939
12942
|
var Te = /* @__PURE__ */ ((e) => (e[e.Initialize = 0] = "Initialize", e[e.AsyncEvents = 1] = "AsyncEvents", e[e.Identify = 2] = "Identify", e[e.Properties = 3] = "Properties", e[e.Metrics = 4] = "Metrics", e[e.Feedback = 5] = "Feedback", e[e.CustomEvent = 6] = "CustomEvent", e[e.Stop = 7] = "Stop", e))(Te || {});
|
|
12940
|
-
const
|
|
12943
|
+
const Oy = ({
|
|
12941
12944
|
apiKey: e
|
|
12942
12945
|
}) => {
|
|
12943
12946
|
(function(t, i) {
|
|
@@ -13020,7 +13023,7 @@ const Uy = ({
|
|
|
13020
13023
|
return d = (!d || d.length === 0 ? "$default_instance" : d).toLowerCase(), Object.prototype.hasOwnProperty.call(s._iq, d) || (s._iq[d] = { _q: [] }, b(s._iq[d])), s._iq[d];
|
|
13021
13024
|
}, t.amplitude = s;
|
|
13022
13025
|
})(window, document);
|
|
13023
|
-
},
|
|
13026
|
+
}, My = ({
|
|
13024
13027
|
projectToken: e
|
|
13025
13028
|
}) => {
|
|
13026
13029
|
if (window.mixpanel)
|
|
@@ -13067,16 +13070,16 @@ const Uy = ({
|
|
|
13067
13070
|
}
|
|
13068
13071
|
})(document, window.mixpanel || []);
|
|
13069
13072
|
const t = document.createElement("script");
|
|
13070
|
-
t.src =
|
|
13073
|
+
t.src = Ey, document.head.appendChild(t), t.addEventListener("load", () => {
|
|
13071
13074
|
var i;
|
|
13072
13075
|
(i = window.mixpanel) == null || i.init(e);
|
|
13073
13076
|
});
|
|
13074
|
-
},
|
|
13075
|
-
class
|
|
13077
|
+
}, Ey = "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";
|
|
13078
|
+
class Hy {
|
|
13076
13079
|
constructor(t) {
|
|
13077
13080
|
N(this, "options"), N(this, "isRunningOnHighlight"), N(this, "organizationID"), N(this, "graphqlSDK"), N(this, "events"), N(this, "sessionData"), N(this, "ready"), N(this, "manualStopped"), N(this, "state"), N(this, "logger"), N(this, "enableSegmentIntegration"), N(this, "privacySetting"), N(this, "enableCanvasRecording"), N(this, "samplingStrategy"), N(this, "inlineImages"), N(this, "inlineVideos"), N(this, "inlineStylesheet"), N(this, "debugOptions"), N(this, "listeners"), N(this, "firstloadVersion"), N(this, "environment"), N(this, "sessionShortcut"), N(this, "appVersion"), N(this, "serviceName"), N(this, "_worker"), N(this, "_optionsInternal"), N(this, "_backendUrl"), N(this, "_recordingStartTime"), N(this, "_isOnLocalHost"), N(this, "_onToggleFeedbackFormVisibility"), N(this, "_isCrossOriginIframe"), N(this, "_eventBytesSinceSnapshot"), N(this, "_lastSnapshotTime"), N(this, "_lastVisibilityChangeTime"), N(this, "pushPayloadTimerId"), N(this, "hasSessionUnloaded"), N(this, "hasPushedData"), N(this, "reloaded"), N(this, "_hasPreviouslyInitialized"), N(this, "_recordStop"), N(this, "_integrations", []);
|
|
13078
13081
|
var i, s, n, r, l;
|
|
13079
|
-
this.options = t, typeof ((i = this.options) == null ? void 0 : i.debug) == "boolean" ? this.debugOptions = this.options.debug ? { clientInteractions: !0 } : {} : this.debugOptions = (n = (s = this.options) == null ? void 0 : s.debug) != null ? n : {}, this.logger = new Po(this.debugOptions.clientInteractions), this._worker = new
|
|
13082
|
+
this.options = t, typeof ((i = this.options) == null ? void 0 : i.debug) == "boolean" ? this.debugOptions = this.options.debug ? { clientInteractions: !0 } : {} : this.debugOptions = (n = (s = this.options) == null ? void 0 : s.debug) != null ? n : {}, this.logger = new Po(this.debugOptions.clientInteractions), this._worker = new Ky(), this._worker.onmessage = (a) => {
|
|
13080
13083
|
var c, u, h;
|
|
13081
13084
|
((c = a.data.response) == null ? void 0 : c.type) === Te.AsyncEvents ? (this._eventBytesSinceSnapshot += a.data.response.eventsSize, this.logger.log(
|
|
13082
13085
|
`Web worker sent payloadID ${a.data.response.id} size ${a.data.response.eventsSize} bytes, compression ratio ${a.data.response.eventsSize / a.data.response.compressedSize}.
|
|
@@ -13084,7 +13087,7 @@ class My {
|
|
|
13084
13087
|
)) : ((u = a.data.response) == null ? void 0 : u.type) === Te.CustomEvent ? this.addCustomEvent(
|
|
13085
13088
|
a.data.response.tag,
|
|
13086
13089
|
a.data.response.payload
|
|
13087
|
-
) : ((h = a.data.response) == null ? void 0 : h.type) === Te.Stop && (
|
|
13090
|
+
) : ((h = a.data.response) == null ? void 0 : h.type) === Te.Stop && (Ze(
|
|
13088
13091
|
"worker.onmessage",
|
|
13089
13092
|
"warn",
|
|
13090
13093
|
"Stopping recording due to worker failure",
|
|
@@ -13121,8 +13124,8 @@ class My {
|
|
|
13121
13124
|
let s, n;
|
|
13122
13125
|
if (!i)
|
|
13123
13126
|
try {
|
|
13124
|
-
s =
|
|
13125
|
-
const r =
|
|
13127
|
+
s = Se(ye.USER_IDENTIFIER);
|
|
13128
|
+
const r = Se(
|
|
13126
13129
|
ye.USER_OBJECT
|
|
13127
13130
|
);
|
|
13128
13131
|
r && (n = JSON.parse(r));
|
|
@@ -13157,7 +13160,9 @@ class My {
|
|
|
13157
13160
|
}
|
|
13158
13161
|
identify(t, i = {}, s) {
|
|
13159
13162
|
if (!t || t === "") {
|
|
13160
|
-
|
|
13163
|
+
Ze(
|
|
13164
|
+
"identify",
|
|
13165
|
+
"warn",
|
|
13161
13166
|
"Highlight's identify() call was passed an empty identifier.",
|
|
13162
13167
|
{ user_identifier: t, user_object: i }
|
|
13163
13168
|
);
|
|
@@ -13197,7 +13202,7 @@ class My {
|
|
|
13197
13202
|
start(t) {
|
|
13198
13203
|
return fe(this, null, function* () {
|
|
13199
13204
|
var i, s, n, r, l, o, a, c;
|
|
13200
|
-
if (!(
|
|
13205
|
+
if (!((i = navigator?.userAgent) != null && i.includes("Googlebot") || (s = navigator?.userAgent) != null && s.includes("AdsBot")))
|
|
13201
13206
|
try {
|
|
13202
13207
|
if (t != null && t.forceNew) {
|
|
13203
13208
|
yield this._reset(t);
|
|
@@ -13209,7 +13214,7 @@ class My {
|
|
|
13209
13214
|
this.sessionData,
|
|
13210
13215
|
this.options
|
|
13211
13216
|
), this.sessionData = (n = Ni(this.sessionData.sessionSecureID)) != null ? n : this.sessionData, (r = this.sessionData) != null && r.sessionStartTime ? this._recordingStartTime = (l = this.sessionData) == null ? void 0 : l.sessionStartTime : (this._recordingStartTime = (/* @__PURE__ */ new Date()).getTime(), this.sessionData.sessionStartTime = this._recordingStartTime);
|
|
13212
|
-
let u =
|
|
13217
|
+
let u = Se(sn.CLIENT_ID);
|
|
13213
13218
|
u || (u = on(), Je(sn.CLIENT_ID, u));
|
|
13214
13219
|
let h;
|
|
13215
13220
|
this.options.disableSessionRecording || this.options.disableNetworkRecording !== void 0 || typeof this.options.networkRecording == "boolean" ? h = !1 : h = ((o = this.options.networkRecording) == null ? void 0 : o.recordHeadersAndBody) || !1;
|
|
@@ -13279,7 +13284,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13279
13284
|
p.bind(this);
|
|
13280
13285
|
const b = !!this._recordStop;
|
|
13281
13286
|
this._recordStop && (this._recordStop(), this._recordStop = void 0);
|
|
13282
|
-
const [d, I] =
|
|
13287
|
+
const [d, I] = Sy(
|
|
13283
13288
|
this.privacySetting
|
|
13284
13289
|
);
|
|
13285
13290
|
this._recordStop = Le({
|
|
@@ -13307,17 +13312,17 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13307
13312
|
inlineVideos: this.inlineVideos,
|
|
13308
13313
|
collectFonts: this.inlineImages,
|
|
13309
13314
|
inlineStylesheet: this.inlineStylesheet,
|
|
13310
|
-
plugins: [
|
|
13315
|
+
plugins: [Hd()],
|
|
13311
13316
|
logger: typeof this.options.debug == "boolean" && this.options.debug || typeof this.options.debug == "object" && this.options.debug.domRecording ? {
|
|
13312
13317
|
debug: this.logger.log,
|
|
13313
|
-
warn:
|
|
13318
|
+
warn: Ze.bind("RecordSDK", "warn")
|
|
13314
13319
|
} : void 0
|
|
13315
13320
|
}), b || this.options.recordCrossOriginIframe && this._setupCrossOriginIframeParent(), document.referrer && (window && document.referrer.includes(window.location.origin) || (this.addCustomEvent("Referrer", document.referrer), this.addProperties(
|
|
13316
13321
|
{ referrer: document.referrer },
|
|
13317
13322
|
{ type: "session" }
|
|
13318
13323
|
))), this._setupWindowListeners(), this.ready = !0, this.state = "Recording", this.manualStopped = !1;
|
|
13319
13324
|
} catch (u) {
|
|
13320
|
-
|
|
13325
|
+
Ze("initializeSession _setupWindowListeners", "warn", u);
|
|
13321
13326
|
}
|
|
13322
13327
|
});
|
|
13323
13328
|
}
|
|
@@ -13374,7 +13379,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13374
13379
|
try {
|
|
13375
13380
|
const s = this;
|
|
13376
13381
|
this.enableSegmentIntegration && this.listeners.push(
|
|
13377
|
-
|
|
13382
|
+
Wy((r) => {
|
|
13378
13383
|
if (r.type === "track") {
|
|
13379
13384
|
const l = {};
|
|
13380
13385
|
l["segment-event"] = r.event, s.addProperties(l, {
|
|
@@ -13394,24 +13399,24 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13394
13399
|
}
|
|
13395
13400
|
})
|
|
13396
13401
|
), this.listeners.push(
|
|
13397
|
-
|
|
13402
|
+
Iy((r) => {
|
|
13398
13403
|
this.reloaded ? (this.addCustomEvent("Reload", r), this.reloaded = !1, s.addProperties(
|
|
13399
13404
|
{ reload: !0 },
|
|
13400
13405
|
{ type: "session" }
|
|
13401
13406
|
)) : this.addCustomEvent("Navigate", r);
|
|
13402
13407
|
})
|
|
13403
13408
|
), this.listeners.push(
|
|
13404
|
-
|
|
13409
|
+
Ld(
|
|
13405
13410
|
(r) => {
|
|
13406
13411
|
this.addCustomEvent("Viewport", r);
|
|
13407
13412
|
}
|
|
13408
13413
|
)
|
|
13409
13414
|
), this.listeners.push(
|
|
13410
|
-
|
|
13415
|
+
Gy((r, l) => {
|
|
13411
13416
|
let o = null, a = null;
|
|
13412
13417
|
if (l && l.target) {
|
|
13413
13418
|
const c = l.target;
|
|
13414
|
-
o =
|
|
13419
|
+
o = Nd(c), a = c.textContent, a && a.length > 2e3 && (a = a.substring(0, 2e3));
|
|
13415
13420
|
}
|
|
13416
13421
|
this.addCustomEvent("Click", {
|
|
13417
13422
|
clickTarget: r,
|
|
@@ -13420,10 +13425,10 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13420
13425
|
});
|
|
13421
13426
|
})
|
|
13422
13427
|
), this.listeners.push(
|
|
13423
|
-
|
|
13428
|
+
Vy((r) => {
|
|
13424
13429
|
r && this.addCustomEvent("Focus", r);
|
|
13425
13430
|
})
|
|
13426
|
-
), this.sessionShortcut &&
|
|
13431
|
+
), this.sessionShortcut && Ry(this.sessionShortcut, () => {
|
|
13427
13432
|
window.open(
|
|
13428
13433
|
this.getCurrentSessionURLWithTimestamp(),
|
|
13429
13434
|
"_blank"
|
|
@@ -13433,7 +13438,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13433
13438
|
({ visible: r }) => {
|
|
13434
13439
|
this._visibilityHandler(!r);
|
|
13435
13440
|
}
|
|
13436
|
-
), this.logger.log("Set up Electron highlight.run events.")) : (
|
|
13441
|
+
), this.logger.log("Set up Electron highlight.run events.")) : (Xy(
|
|
13437
13442
|
(r) => this._visibilityHandler(r)
|
|
13438
13443
|
), this.logger.log("Set up document visibility listener.")), this._hasPreviouslyInitialized = !0);
|
|
13439
13444
|
const n = () => {
|
|
@@ -13443,7 +13448,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13443
13448
|
() => window.removeEventListener("beforeunload", n)
|
|
13444
13449
|
);
|
|
13445
13450
|
} catch (s) {
|
|
13446
|
-
|
|
13451
|
+
Ze("initializeSession _setupWindowListeners", "warn", s);
|
|
13447
13452
|
}
|
|
13448
13453
|
const i = () => {
|
|
13449
13454
|
this.addCustomEvent("Page Unload", ""), wt(this.sessionData.sessionSecureID), Pe(this.sessionData);
|
|
@@ -13529,7 +13534,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13529
13534
|
}), 0;
|
|
13530
13535
|
})), yield this._sendPayload({ sendFn: i }), this.hasPushedData = !0, this.sessionData.lastPushTime = Date.now(), Pe(this.sessionData);
|
|
13531
13536
|
} catch (i) {
|
|
13532
|
-
|
|
13537
|
+
Ze("_save", "warn", i);
|
|
13533
13538
|
}
|
|
13534
13539
|
this.state === "Recording" && (this.pushPayloadTimerId && (clearTimeout(this.pushPayloadTimerId), this.pushPayloadTimerId = void 0), this.pushPayloadTimerId = setTimeout(() => {
|
|
13535
13540
|
this._save();
|
|
@@ -13560,7 +13565,7 @@ To: ${this._backendUrl}
|
|
|
13560
13565
|
Org: ${this.organizationID}
|
|
13561
13566
|
SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
13562
13567
|
);
|
|
13563
|
-
const l =
|
|
13568
|
+
const l = Yy();
|
|
13564
13569
|
i ? yield i({
|
|
13565
13570
|
session_secure_id: this.sessionData.sessionSecureID,
|
|
13566
13571
|
payload_id: (this.sessionData.payloadID++).toString(),
|
|
@@ -13588,7 +13593,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13588
13593
|
hasSessionUnloaded: this.hasSessionUnloaded,
|
|
13589
13594
|
highlightLogs: l
|
|
13590
13595
|
}
|
|
13591
|
-
}), Pe(this.sessionData), this.events = this.events.slice(s.length),
|
|
13596
|
+
}), Pe(this.sessionData), this.events = this.events.slice(s.length), Uy(l);
|
|
13592
13597
|
});
|
|
13593
13598
|
}
|
|
13594
13599
|
takeFullSnapshot() {
|
|
@@ -13621,7 +13626,19 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13621
13626
|
const s = `${this.getFrontendUrl()}/sessions/${t}`;
|
|
13622
13627
|
if (!s || !i?.sessionStartTime)
|
|
13623
13628
|
return null;
|
|
13624
|
-
const n = (/* @__PURE__ */ new Date()).getTime()
|
|
13629
|
+
const n = (/* @__PURE__ */ new Date()).getTime();
|
|
13630
|
+
let r;
|
|
13631
|
+
try {
|
|
13632
|
+
r = new URL(s);
|
|
13633
|
+
} catch (a) {
|
|
13634
|
+
return Ze(
|
|
13635
|
+
"identify",
|
|
13636
|
+
"warn",
|
|
13637
|
+
`failed to construct session url from ${s}`,
|
|
13638
|
+
a
|
|
13639
|
+
), null;
|
|
13640
|
+
}
|
|
13641
|
+
const l = new URL(r), o = (n - this._recordingStartTime) / 1e3;
|
|
13625
13642
|
return l.searchParams.set("ts", o.toString()), {
|
|
13626
13643
|
url: r.toString(),
|
|
13627
13644
|
urlWithTimestamp: l.toString(),
|
|
@@ -13638,7 +13655,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
|
|
|
13638
13655
|
return sd;
|
|
13639
13656
|
}
|
|
13640
13657
|
}
|
|
13641
|
-
class
|
|
13658
|
+
class eg extends Yd {
|
|
13642
13659
|
constructor(t, i) {
|
|
13643
13660
|
var s = (...p) => (super(...p), N(this, "record"), this), n, r, l, o, a, c, u, h, m;
|
|
13644
13661
|
try {
|
|
@@ -13662,15 +13679,15 @@ class qy extends Nd {
|
|
|
13662
13679
|
}
|
|
13663
13680
|
const p = ge(F({}, i), {
|
|
13664
13681
|
organizationID: t,
|
|
13665
|
-
firstloadVersion:
|
|
13682
|
+
firstloadVersion: Td,
|
|
13666
13683
|
environment: i?.environment || "production",
|
|
13667
13684
|
appVersion: i?.version,
|
|
13668
13685
|
sessionSecureID: this.sessionSecureID,
|
|
13669
13686
|
privacySetting: (n = i?.privacySetting) != null ? n : "strict"
|
|
13670
13687
|
});
|
|
13671
|
-
this.record = new
|
|
13688
|
+
this.record = new Hy(p), i != null && i.manualStart || this.record.start(), Rt.load(this.record), !((l = (r = i?.integrations) == null ? void 0 : r.mixpanel) != null && l.disabled) && (a = (o = i?.integrations) == null ? void 0 : o.mixpanel) != null && a.projectToken && My(i.integrations.mixpanel), !((u = (c = i?.integrations) == null ? void 0 : c.amplitude) != null && u.disabled) && (m = (h = i?.integrations) == null ? void 0 : h.amplitude) != null && m.apiKey && Oy(i.integrations.amplitude);
|
|
13672
13689
|
} catch (p) {
|
|
13673
|
-
|
|
13690
|
+
Ze(
|
|
13674
13691
|
"Error initializing @launchdarkly/session-replay SDK",
|
|
13675
13692
|
"error",
|
|
13676
13693
|
p
|
|
@@ -13730,8 +13747,8 @@ class qy extends Nd {
|
|
|
13730
13747
|
}
|
|
13731
13748
|
}
|
|
13732
13749
|
export {
|
|
13733
|
-
|
|
13750
|
+
eg as E,
|
|
13734
13751
|
Rt as r,
|
|
13735
13752
|
Bo as x
|
|
13736
13753
|
};
|
|
13737
|
-
//# sourceMappingURL=index-
|
|
13754
|
+
//# sourceMappingURL=index-BnOFliqz.js.map
|