@arthurzakharov/ui-kit 1.0.2 → 1.0.5
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/dist/assets/box-b_yPaNPs.css +1 -0
- package/dist/assets/button-XGvsKGqH.css +1 -0
- package/dist/assets/certifications-tJ3i72S_.css +1 -0
- package/dist/assets/choice-BEXd0fh0.css +1 -0
- package/dist/assets/hidden-input-DHJQHUKd.css +1 -0
- package/dist/assets/index-CqamBlbE.css +1 -0
- package/dist/assets/input-DTN-3ZET.css +1 -0
- package/dist/assets/label-DF2VBeUr.css +1 -0
- package/dist/assets/main-C0tWHTEq.css +1 -0
- package/dist/assets/radio-label-Bd5UiESO.css +1 -0
- package/dist/assets/radio-text-DAsITkgm.css +1 -0
- package/dist/components/certifications/certifications.component.d.ts +1 -5
- package/dist/components/certifications/certifications.component.js +8 -8
- package/dist/components/certifications/certifications.test.d.ts +1 -0
- package/dist/components/certifications/certifications.test.js +37 -0
- package/dist/components/certifications/certifications.types.d.ts +5 -0
- package/dist/components/certifications/certifications.types.js +2 -0
- package/dist/components/certifications/index.d.ts +1 -0
- package/dist/components/certifications/index.js +5 -0
- package/dist/components/control/components/box/box.component.d.ts +2 -0
- package/dist/components/control/components/box/box.component.js +33 -0
- package/dist/components/control/components/box/box.test.d.ts +1 -0
- package/dist/components/control/components/box/box.test.js +111 -0
- package/dist/components/control/components/box/box.types.d.ts +9 -0
- package/dist/components/control/components/box/box.types.js +2 -0
- package/dist/components/control/components/box/index.d.ts +1 -0
- package/dist/components/control/components/box/index.js +5 -0
- package/dist/components/control/components/button/button.component.d.ts +2 -0
- package/dist/components/control/components/button/button.component.js +54 -0
- package/dist/components/control/components/button/button.test.d.ts +1 -0
- package/dist/components/control/components/button/button.test.js +155 -0
- package/dist/components/control/components/button/button.types.d.ts +16 -0
- package/dist/components/control/components/button/button.types.js +2 -0
- package/dist/components/control/components/button/index.d.ts +1 -0
- package/dist/components/control/components/button/index.js +5 -0
- package/dist/components/control/components/card-image/card-image.component.d.ts +2 -0
- package/dist/components/control/components/card-image/card-image.component.js +8 -0
- package/dist/components/control/components/card-image/card-image.test.d.ts +1 -0
- package/dist/components/control/components/card-image/card-image.test.js +118 -0
- package/dist/components/control/components/card-image/card-image.types.d.ts +6 -0
- package/dist/components/control/components/card-image/card-image.types.js +2 -0
- package/dist/components/control/components/card-image/index.d.ts +1 -0
- package/dist/components/control/components/card-image/index.js +5 -0
- package/dist/components/control/components/card-text/card-text.component.d.ts +2 -0
- package/dist/components/control/components/card-text/card-text.component.js +8 -0
- package/dist/components/control/components/card-text/card-text.test.d.ts +1 -0
- package/dist/components/control/components/card-text/card-text.test.js +109 -0
- package/dist/components/control/components/card-text/card-text.types.d.ts +5 -0
- package/dist/components/control/components/card-text/card-text.types.js +2 -0
- package/dist/components/control/components/card-text/index.d.ts +1 -0
- package/dist/components/control/components/card-text/index.js +5 -0
- package/dist/components/control/components/checkbox/checkbox.component.d.ts +2 -0
- package/dist/components/control/components/checkbox/checkbox.component.js +8 -0
- package/dist/components/control/components/checkbox/checkbox.types.d.ts +5 -0
- package/dist/components/control/components/checkbox/checkbox.types.js +2 -0
- package/dist/components/control/components/checkbox/index.d.ts +1 -0
- package/dist/components/control/components/checkbox/index.js +5 -0
- package/dist/components/control/components/choice/choice.component.d.ts +2 -0
- package/dist/components/control/components/choice/choice.component.js +43 -0
- package/dist/components/control/components/choice/choice.test.d.ts +1 -0
- package/dist/components/control/components/choice/choice.test.js +138 -0
- package/dist/components/control/components/choice/choice.types.d.ts +8 -0
- package/dist/components/control/components/choice/choice.types.js +2 -0
- package/dist/components/control/components/choice/index.d.ts +1 -0
- package/dist/components/control/components/choice/index.js +5 -0
- package/dist/components/control/components/dropdown/dropdown.component.d.ts +2 -0
- package/dist/components/control/components/dropdown/dropdown.component.js +12 -0
- package/dist/components/control/components/dropdown/dropdown.types.d.ts +14 -0
- package/dist/components/control/components/dropdown/dropdown.types.js +2 -0
- package/dist/components/control/components/dropdown/index.d.ts +1 -0
- package/dist/components/control/components/dropdown/index.js +5 -0
- package/dist/components/control/components/hidden-input/hidden-input.component.d.ts +2 -0
- package/dist/components/control/components/hidden-input/hidden-input.component.js +26 -0
- package/dist/components/control/components/hidden-input/hidden-input.test.d.ts +1 -0
- package/dist/components/control/components/hidden-input/hidden-input.test.js +142 -0
- package/dist/components/control/components/hidden-input/hidden-input.types.d.ts +11 -0
- package/dist/components/control/components/hidden-input/hidden-input.types.js +2 -0
- package/dist/components/control/components/hidden-input/index.d.ts +1 -0
- package/dist/components/control/components/hidden-input/index.js +5 -0
- package/dist/components/control/components/input/index.d.ts +1 -0
- package/dist/components/control/components/input/index.js +5 -0
- package/dist/components/control/components/input/input.component.d.ts +2 -0
- package/dist/components/control/components/input/input.component.js +6 -0
- package/dist/components/control/components/input/input.test.d.ts +1 -0
- package/dist/components/control/components/input/input.test.js +104 -0
- package/dist/components/control/components/input/input.types.d.ts +7 -0
- package/dist/components/control/components/input/input.types.js +2 -0
- package/dist/components/control/components/label/index.d.ts +1 -0
- package/dist/components/control/components/label/index.js +5 -0
- package/dist/components/control/components/label/label.component.d.ts +2 -0
- package/dist/components/control/components/label/label.component.js +29 -0
- package/dist/components/control/components/label/label.test.d.ts +1 -0
- package/dist/components/control/components/label/label.test.js +91 -0
- package/dist/components/control/components/label/label.types.d.ts +8 -0
- package/dist/components/control/components/label/label.types.js +2 -0
- package/dist/components/control/components/radio/index.d.ts +1 -0
- package/dist/components/control/components/radio/index.js +5 -0
- package/dist/components/control/components/radio/radio.component.d.ts +2 -0
- package/dist/components/control/components/radio/radio.component.js +8 -0
- package/dist/components/control/components/radio/radio.types.d.ts +6 -0
- package/dist/components/control/components/radio/radio.types.js +2 -0
- package/dist/components/control/components/radio-label/index.d.ts +1 -0
- package/dist/components/control/components/radio-label/index.js +5 -0
- package/dist/components/control/components/radio-label/radio-label.component.d.ts +3 -0
- package/dist/components/control/components/radio-label/radio-label.component.js +38 -0
- package/dist/components/control/components/radio-label/radio-label.test.d.ts +1 -0
- package/dist/components/control/components/radio-label/radio-label.test.js +282 -0
- package/dist/components/control/components/radio-label/radio-label.types.d.ts +17 -0
- package/dist/components/control/components/radio-label/radio-label.types.js +2 -0
- package/dist/components/control/components/radio-text/index.d.ts +1 -0
- package/dist/components/control/components/radio-text/index.js +5 -0
- package/dist/components/control/components/radio-text/radio-text.component.d.ts +2 -0
- package/dist/components/control/components/radio-text/radio-text.component.js +34 -0
- package/dist/components/control/components/radio-text/radio-text.test.d.ts +1 -0
- package/dist/components/control/components/radio-text/radio-text.test.js +82 -0
- package/dist/components/control/components/radio-text/radio-text.types.d.ts +6 -0
- package/dist/components/control/components/radio-text/radio-text.types.js +2 -0
- package/dist/components/control/components/text/index.d.ts +1 -0
- package/dist/components/control/components/text/index.js +5 -0
- package/dist/components/control/components/text/text.component.d.ts +2 -0
- package/dist/components/control/components/text/text.component.js +8 -0
- package/dist/components/control/components/text/text.test.d.ts +1 -0
- package/dist/components/control/components/text/text.test.js +146 -0
- package/dist/components/control/components/text/text.types.d.ts +6 -0
- package/dist/components/control/components/text/text.types.js +2 -0
- package/dist/components/control/components/textarea/index.d.ts +1 -0
- package/dist/components/control/components/textarea/index.js +5 -0
- package/dist/components/control/components/textarea/textarea.component.d.ts +2 -0
- package/dist/components/control/components/textarea/textarea.component.js +7 -0
- package/dist/components/control/components/textarea/textarea.test.d.ts +1 -0
- package/dist/components/control/components/textarea/textarea.test.js +148 -0
- package/dist/components/control/components/textarea/textarea.types.d.ts +8 -0
- package/dist/components/control/components/textarea/textarea.types.js +2 -0
- package/dist/components/control/hooks/index.d.ts +1 -0
- package/dist/components/control/hooks/index.js +5 -0
- package/dist/components/control/hooks/useChoice/index.d.ts +1 -0
- package/dist/components/control/hooks/useChoice/index.js +5 -0
- package/dist/components/control/hooks/useChoice/useChoice.hook.d.ts +5 -0
- package/dist/components/control/hooks/useChoice/useChoice.hook.js +10 -0
- package/dist/components/control/hooks/useChoice/useChoice.hook.test.d.ts +1 -0
- package/dist/components/control/hooks/useChoice/useChoice.hook.test.js +35 -0
- package/dist/components/control/index.d.ts +17 -0
- package/dist/components/control/index.js +13 -0
- package/dist/components/control/types.d.ts +35 -0
- package/dist/components/control/types.js +2 -0
- package/dist/components/control/utils/index.d.ts +1 -0
- package/dist/components/control/utils/index.js +7 -0
- package/dist/components/control/utils/utils.d.ts +4 -0
- package/dist/components/control/utils/utils.js +7 -0
- package/dist/components/control/utils/utils.test.d.ts +1 -0
- package/dist/components/control/utils/utils.test.js +34 -0
- package/dist/enums.d.ts +14 -0
- package/dist/enums.js +5 -0
- package/dist/index-DZTmNCEj.js +407 -0
- package/dist/input.component-Ju0oHzs9.js +38 -0
- package/dist/magic-string.es-uPKorP4O.js +664 -0
- package/dist/main.d.ts +2 -1
- package/dist/main.js +6 -4
- package/dist/react-18-1BDDKgtP.js +41 -0
- package/dist/react.esm-CZ9PjZjp.js +75462 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.js +2 -0
- package/dist/utils/converter/converter.d.ts +37 -0
- package/dist/utils/converter/converter.js +140 -0
- package/dist/utils/converter/converter.test.d.ts +1 -0
- package/dist/utils/converter/converter.test.js +121 -0
- package/dist/utils/converter/index.d.ts +1 -0
- package/dist/utils/converter/index.js +5 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/time/index.d.ts +1 -0
- package/dist/utils/time/index.js +5 -0
- package/dist/utils/time/time.d.ts +7 -0
- package/dist/utils/time/time.js +34 -0
- package/dist/utils/time/time.test.d.ts +1 -0
- package/dist/utils/time/time.test.js +45 -0
- package/dist/vi.2VT5v0um-CyasTEXm.js +10517 -0
- package/package.json +17 -5
- package/dist/assets/certifications-CHPUtPfO.css +0 -1
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
var x = 44, E = 59, m = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", S = new Uint8Array(64), k = new Uint8Array(128);
|
|
2
|
+
for (let u = 0; u < m.length; u++) {
|
|
3
|
+
const t = m.charCodeAt(u);
|
|
4
|
+
S[u] = t, k[t] = u;
|
|
5
|
+
}
|
|
6
|
+
function c(u, t, e) {
|
|
7
|
+
let i = t - e;
|
|
8
|
+
i = i < 0 ? -i << 1 | 1 : i << 1;
|
|
9
|
+
do {
|
|
10
|
+
let n = i & 31;
|
|
11
|
+
i >>>= 5, i > 0 && (n |= 32), u.write(S[n]);
|
|
12
|
+
} while (i > 0);
|
|
13
|
+
return t;
|
|
14
|
+
}
|
|
15
|
+
var b = 1024 * 16, C = typeof TextDecoder < "u" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer < "u" ? {
|
|
16
|
+
decode(u) {
|
|
17
|
+
return Buffer.from(u.buffer, u.byteOffset, u.byteLength).toString();
|
|
18
|
+
}
|
|
19
|
+
} : {
|
|
20
|
+
decode(u) {
|
|
21
|
+
let t = "";
|
|
22
|
+
for (let e = 0; e < u.length; e++)
|
|
23
|
+
t += String.fromCharCode(u[e]);
|
|
24
|
+
return t;
|
|
25
|
+
}
|
|
26
|
+
}, L = class {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.pos = 0, this.out = "", this.buffer = new Uint8Array(b);
|
|
29
|
+
}
|
|
30
|
+
write(u) {
|
|
31
|
+
const { buffer: t } = this;
|
|
32
|
+
t[this.pos++] = u, this.pos === b && (this.out += C.decode(t), this.pos = 0);
|
|
33
|
+
}
|
|
34
|
+
flush() {
|
|
35
|
+
const { buffer: u, out: t, pos: e } = this;
|
|
36
|
+
return e > 0 ? t + C.decode(u.subarray(0, e)) : t;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
function R(u) {
|
|
40
|
+
const t = new L();
|
|
41
|
+
let e = 0, i = 0, n = 0, r = 0;
|
|
42
|
+
for (let s = 0; s < u.length; s++) {
|
|
43
|
+
const h = u[s];
|
|
44
|
+
if (s > 0 && t.write(E), h.length === 0) continue;
|
|
45
|
+
let o = 0;
|
|
46
|
+
for (let l = 0; l < h.length; l++) {
|
|
47
|
+
const a = h[l];
|
|
48
|
+
l > 0 && t.write(x), o = c(t, a[0], o), a.length !== 1 && (e = c(t, a[1], e), i = c(t, a[2], i), n = c(t, a[3], n), a.length !== 4 && (r = c(t, a[4], r)));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return t.flush();
|
|
52
|
+
}
|
|
53
|
+
class p {
|
|
54
|
+
constructor(t) {
|
|
55
|
+
this.bits = t instanceof p ? t.bits.slice() : [];
|
|
56
|
+
}
|
|
57
|
+
add(t) {
|
|
58
|
+
this.bits[t >> 5] |= 1 << (t & 31);
|
|
59
|
+
}
|
|
60
|
+
has(t) {
|
|
61
|
+
return !!(this.bits[t >> 5] & 1 << (t & 31));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
class g {
|
|
65
|
+
constructor(t, e, i) {
|
|
66
|
+
this.start = t, this.end = e, this.original = i, this.intro = "", this.outro = "", this.content = i, this.storeName = !1, this.edited = !1, this.previous = null, this.next = null;
|
|
67
|
+
}
|
|
68
|
+
appendLeft(t) {
|
|
69
|
+
this.outro += t;
|
|
70
|
+
}
|
|
71
|
+
appendRight(t) {
|
|
72
|
+
this.intro = this.intro + t;
|
|
73
|
+
}
|
|
74
|
+
clone() {
|
|
75
|
+
const t = new g(this.start, this.end, this.original);
|
|
76
|
+
return t.intro = this.intro, t.outro = this.outro, t.content = this.content, t.storeName = this.storeName, t.edited = this.edited, t;
|
|
77
|
+
}
|
|
78
|
+
contains(t) {
|
|
79
|
+
return this.start < t && t < this.end;
|
|
80
|
+
}
|
|
81
|
+
eachNext(t) {
|
|
82
|
+
let e = this;
|
|
83
|
+
for (; e; )
|
|
84
|
+
t(e), e = e.next;
|
|
85
|
+
}
|
|
86
|
+
eachPrevious(t) {
|
|
87
|
+
let e = this;
|
|
88
|
+
for (; e; )
|
|
89
|
+
t(e), e = e.previous;
|
|
90
|
+
}
|
|
91
|
+
edit(t, e, i) {
|
|
92
|
+
return this.content = t, i || (this.intro = "", this.outro = ""), this.storeName = e, this.edited = !0, this;
|
|
93
|
+
}
|
|
94
|
+
prependLeft(t) {
|
|
95
|
+
this.outro = t + this.outro;
|
|
96
|
+
}
|
|
97
|
+
prependRight(t) {
|
|
98
|
+
this.intro = t + this.intro;
|
|
99
|
+
}
|
|
100
|
+
reset() {
|
|
101
|
+
this.intro = "", this.outro = "", this.edited && (this.content = this.original, this.storeName = !1, this.edited = !1);
|
|
102
|
+
}
|
|
103
|
+
split(t) {
|
|
104
|
+
const e = t - this.start, i = this.original.slice(0, e), n = this.original.slice(e);
|
|
105
|
+
this.original = i;
|
|
106
|
+
const r = new g(t, this.end, n);
|
|
107
|
+
return r.outro = this.outro, this.outro = "", this.end = t, this.edited ? (r.edit("", !1), this.content = "") : this.content = i, r.next = this.next, r.next && (r.next.previous = r), r.previous = this, this.next = r, r;
|
|
108
|
+
}
|
|
109
|
+
toString() {
|
|
110
|
+
return this.intro + this.content + this.outro;
|
|
111
|
+
}
|
|
112
|
+
trimEnd(t) {
|
|
113
|
+
if (this.outro = this.outro.replace(t, ""), this.outro.length) return !0;
|
|
114
|
+
const e = this.content.replace(t, "");
|
|
115
|
+
if (e.length)
|
|
116
|
+
return e !== this.content && (this.split(this.start + e.length).edit("", void 0, !0), this.edited && this.edit(e, this.storeName, !0)), !0;
|
|
117
|
+
if (this.edit("", void 0, !0), this.intro = this.intro.replace(t, ""), this.intro.length) return !0;
|
|
118
|
+
}
|
|
119
|
+
trimStart(t) {
|
|
120
|
+
if (this.intro = this.intro.replace(t, ""), this.intro.length) return !0;
|
|
121
|
+
const e = this.content.replace(t, "");
|
|
122
|
+
if (e.length) {
|
|
123
|
+
if (e !== this.content) {
|
|
124
|
+
const i = this.split(this.end - e.length);
|
|
125
|
+
this.edited && i.edit(e, this.storeName, !0), this.edit("", void 0, !0);
|
|
126
|
+
}
|
|
127
|
+
return !0;
|
|
128
|
+
} else if (this.edit("", void 0, !0), this.outro = this.outro.replace(t, ""), this.outro.length) return !0;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function _() {
|
|
132
|
+
return typeof globalThis < "u" && typeof globalThis.btoa == "function" ? (u) => globalThis.btoa(unescape(encodeURIComponent(u))) : typeof Buffer == "function" ? (u) => Buffer.from(u, "utf-8").toString("base64") : () => {
|
|
133
|
+
throw new Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.");
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const O = /* @__PURE__ */ _();
|
|
137
|
+
class N {
|
|
138
|
+
constructor(t) {
|
|
139
|
+
this.version = 3, this.file = t.file, this.sources = t.sources, this.sourcesContent = t.sourcesContent, this.names = t.names, this.mappings = R(t.mappings), typeof t.x_google_ignoreList < "u" && (this.x_google_ignoreList = t.x_google_ignoreList), typeof t.debugId < "u" && (this.debugId = t.debugId);
|
|
140
|
+
}
|
|
141
|
+
toString() {
|
|
142
|
+
return JSON.stringify(this);
|
|
143
|
+
}
|
|
144
|
+
toUrl() {
|
|
145
|
+
return "data:application/json;charset=utf-8;base64," + O(this.toString());
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function I(u) {
|
|
149
|
+
const t = u.split(`
|
|
150
|
+
`), e = t.filter((r) => /^\t+/.test(r)), i = t.filter((r) => /^ {2,}/.test(r));
|
|
151
|
+
if (e.length === 0 && i.length === 0)
|
|
152
|
+
return null;
|
|
153
|
+
if (e.length >= i.length)
|
|
154
|
+
return " ";
|
|
155
|
+
const n = i.reduce((r, s) => {
|
|
156
|
+
const h = /^ +/.exec(s)[0].length;
|
|
157
|
+
return Math.min(h, r);
|
|
158
|
+
}, 1 / 0);
|
|
159
|
+
return new Array(n + 1).join(" ");
|
|
160
|
+
}
|
|
161
|
+
function A(u, t) {
|
|
162
|
+
const e = u.split(/[/\\]/), i = t.split(/[/\\]/);
|
|
163
|
+
for (e.pop(); e[0] === i[0]; )
|
|
164
|
+
e.shift(), i.shift();
|
|
165
|
+
if (e.length) {
|
|
166
|
+
let n = e.length;
|
|
167
|
+
for (; n--; ) e[n] = "..";
|
|
168
|
+
}
|
|
169
|
+
return e.concat(i).join("/");
|
|
170
|
+
}
|
|
171
|
+
const T = Object.prototype.toString;
|
|
172
|
+
function j(u) {
|
|
173
|
+
return T.call(u) === "[object Object]";
|
|
174
|
+
}
|
|
175
|
+
function y(u) {
|
|
176
|
+
const t = u.split(`
|
|
177
|
+
`), e = [];
|
|
178
|
+
for (let i = 0, n = 0; i < t.length; i++)
|
|
179
|
+
e.push(n), n += t[i].length + 1;
|
|
180
|
+
return function(n) {
|
|
181
|
+
let r = 0, s = e.length;
|
|
182
|
+
for (; r < s; ) {
|
|
183
|
+
const l = r + s >> 1;
|
|
184
|
+
n < e[l] ? s = l : r = l + 1;
|
|
185
|
+
}
|
|
186
|
+
const h = r - 1, o = n - e[h];
|
|
187
|
+
return { line: h, column: o };
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const $ = /\w/;
|
|
191
|
+
class U {
|
|
192
|
+
constructor(t) {
|
|
193
|
+
this.hires = t, this.generatedCodeLine = 0, this.generatedCodeColumn = 0, this.raw = [], this.rawSegments = this.raw[this.generatedCodeLine] = [], this.pending = null;
|
|
194
|
+
}
|
|
195
|
+
addEdit(t, e, i, n) {
|
|
196
|
+
if (e.length) {
|
|
197
|
+
const r = e.length - 1;
|
|
198
|
+
let s = e.indexOf(`
|
|
199
|
+
`, 0), h = -1;
|
|
200
|
+
for (; s >= 0 && r > s; ) {
|
|
201
|
+
const l = [this.generatedCodeColumn, t, i.line, i.column];
|
|
202
|
+
n >= 0 && l.push(n), this.rawSegments.push(l), this.generatedCodeLine += 1, this.raw[this.generatedCodeLine] = this.rawSegments = [], this.generatedCodeColumn = 0, h = s, s = e.indexOf(`
|
|
203
|
+
`, s + 1);
|
|
204
|
+
}
|
|
205
|
+
const o = [this.generatedCodeColumn, t, i.line, i.column];
|
|
206
|
+
n >= 0 && o.push(n), this.rawSegments.push(o), this.advance(e.slice(h + 1));
|
|
207
|
+
} else this.pending && (this.rawSegments.push(this.pending), this.advance(e));
|
|
208
|
+
this.pending = null;
|
|
209
|
+
}
|
|
210
|
+
addUneditedChunk(t, e, i, n, r) {
|
|
211
|
+
let s = e.start, h = !0, o = !1;
|
|
212
|
+
for (; s < e.end; ) {
|
|
213
|
+
if (i[s] === `
|
|
214
|
+
`)
|
|
215
|
+
n.line += 1, n.column = 0, this.generatedCodeLine += 1, this.raw[this.generatedCodeLine] = this.rawSegments = [], this.generatedCodeColumn = 0, h = !0, o = !1;
|
|
216
|
+
else {
|
|
217
|
+
if (this.hires || h || r.has(s)) {
|
|
218
|
+
const l = [this.generatedCodeColumn, t, n.line, n.column];
|
|
219
|
+
this.hires === "boundary" ? $.test(i[s]) ? o || (this.rawSegments.push(l), o = !0) : (this.rawSegments.push(l), o = !1) : this.rawSegments.push(l);
|
|
220
|
+
}
|
|
221
|
+
n.column += 1, this.generatedCodeColumn += 1, h = !1;
|
|
222
|
+
}
|
|
223
|
+
s += 1;
|
|
224
|
+
}
|
|
225
|
+
this.pending = null;
|
|
226
|
+
}
|
|
227
|
+
advance(t) {
|
|
228
|
+
if (!t) return;
|
|
229
|
+
const e = t.split(`
|
|
230
|
+
`);
|
|
231
|
+
if (e.length > 1) {
|
|
232
|
+
for (let i = 0; i < e.length - 1; i++)
|
|
233
|
+
this.generatedCodeLine++, this.raw[this.generatedCodeLine] = this.rawSegments = [];
|
|
234
|
+
this.generatedCodeColumn = 0;
|
|
235
|
+
}
|
|
236
|
+
this.generatedCodeColumn += e[e.length - 1].length;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const d = `
|
|
240
|
+
`, f = {
|
|
241
|
+
insertLeft: !1,
|
|
242
|
+
insertRight: !1,
|
|
243
|
+
storeName: !1
|
|
244
|
+
};
|
|
245
|
+
class v {
|
|
246
|
+
constructor(t, e = {}) {
|
|
247
|
+
const i = new g(0, t.length, t);
|
|
248
|
+
Object.defineProperties(this, {
|
|
249
|
+
original: { writable: !0, value: t },
|
|
250
|
+
outro: { writable: !0, value: "" },
|
|
251
|
+
intro: { writable: !0, value: "" },
|
|
252
|
+
firstChunk: { writable: !0, value: i },
|
|
253
|
+
lastChunk: { writable: !0, value: i },
|
|
254
|
+
lastSearchedChunk: { writable: !0, value: i },
|
|
255
|
+
byStart: { writable: !0, value: {} },
|
|
256
|
+
byEnd: { writable: !0, value: {} },
|
|
257
|
+
filename: { writable: !0, value: e.filename },
|
|
258
|
+
indentExclusionRanges: { writable: !0, value: e.indentExclusionRanges },
|
|
259
|
+
sourcemapLocations: { writable: !0, value: new p() },
|
|
260
|
+
storedNames: { writable: !0, value: {} },
|
|
261
|
+
indentStr: { writable: !0, value: void 0 },
|
|
262
|
+
ignoreList: { writable: !0, value: e.ignoreList },
|
|
263
|
+
offset: { writable: !0, value: e.offset || 0 }
|
|
264
|
+
}), this.byStart[0] = i, this.byEnd[t.length] = i;
|
|
265
|
+
}
|
|
266
|
+
addSourcemapLocation(t) {
|
|
267
|
+
this.sourcemapLocations.add(t);
|
|
268
|
+
}
|
|
269
|
+
append(t) {
|
|
270
|
+
if (typeof t != "string") throw new TypeError("outro content must be a string");
|
|
271
|
+
return this.outro += t, this;
|
|
272
|
+
}
|
|
273
|
+
appendLeft(t, e) {
|
|
274
|
+
if (t = t + this.offset, typeof e != "string") throw new TypeError("inserted content must be a string");
|
|
275
|
+
this._split(t);
|
|
276
|
+
const i = this.byEnd[t];
|
|
277
|
+
return i ? i.appendLeft(e) : this.intro += e, this;
|
|
278
|
+
}
|
|
279
|
+
appendRight(t, e) {
|
|
280
|
+
if (t = t + this.offset, typeof e != "string") throw new TypeError("inserted content must be a string");
|
|
281
|
+
this._split(t);
|
|
282
|
+
const i = this.byStart[t];
|
|
283
|
+
return i ? i.appendRight(e) : this.outro += e, this;
|
|
284
|
+
}
|
|
285
|
+
clone() {
|
|
286
|
+
const t = new v(this.original, { filename: this.filename, offset: this.offset });
|
|
287
|
+
let e = this.firstChunk, i = t.firstChunk = t.lastSearchedChunk = e.clone();
|
|
288
|
+
for (; e; ) {
|
|
289
|
+
t.byStart[i.start] = i, t.byEnd[i.end] = i;
|
|
290
|
+
const n = e.next, r = n && n.clone();
|
|
291
|
+
r && (i.next = r, r.previous = i, i = r), e = n;
|
|
292
|
+
}
|
|
293
|
+
return t.lastChunk = i, this.indentExclusionRanges && (t.indentExclusionRanges = this.indentExclusionRanges.slice()), t.sourcemapLocations = new p(this.sourcemapLocations), t.intro = this.intro, t.outro = this.outro, t;
|
|
294
|
+
}
|
|
295
|
+
generateDecodedMap(t) {
|
|
296
|
+
t = t || {};
|
|
297
|
+
const e = 0, i = Object.keys(this.storedNames), n = new U(t.hires), r = y(this.original);
|
|
298
|
+
return this.intro && n.advance(this.intro), this.firstChunk.eachNext((s) => {
|
|
299
|
+
const h = r(s.start);
|
|
300
|
+
s.intro.length && n.advance(s.intro), s.edited ? n.addEdit(
|
|
301
|
+
e,
|
|
302
|
+
s.content,
|
|
303
|
+
h,
|
|
304
|
+
s.storeName ? i.indexOf(s.original) : -1
|
|
305
|
+
) : n.addUneditedChunk(e, s, this.original, h, this.sourcemapLocations), s.outro.length && n.advance(s.outro);
|
|
306
|
+
}), this.outro && n.advance(this.outro), {
|
|
307
|
+
file: t.file ? t.file.split(/[/\\]/).pop() : void 0,
|
|
308
|
+
sources: [
|
|
309
|
+
t.source ? A(t.file || "", t.source) : t.file || ""
|
|
310
|
+
],
|
|
311
|
+
sourcesContent: t.includeContent ? [this.original] : void 0,
|
|
312
|
+
names: i,
|
|
313
|
+
mappings: n.raw,
|
|
314
|
+
x_google_ignoreList: this.ignoreList ? [e] : void 0
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
generateMap(t) {
|
|
318
|
+
return new N(this.generateDecodedMap(t));
|
|
319
|
+
}
|
|
320
|
+
_ensureindentStr() {
|
|
321
|
+
this.indentStr === void 0 && (this.indentStr = I(this.original));
|
|
322
|
+
}
|
|
323
|
+
_getRawIndentString() {
|
|
324
|
+
return this._ensureindentStr(), this.indentStr;
|
|
325
|
+
}
|
|
326
|
+
getIndentString() {
|
|
327
|
+
return this._ensureindentStr(), this.indentStr === null ? " " : this.indentStr;
|
|
328
|
+
}
|
|
329
|
+
indent(t, e) {
|
|
330
|
+
const i = /^[^\r\n]/gm;
|
|
331
|
+
if (j(t) && (e = t, t = void 0), t === void 0 && (this._ensureindentStr(), t = this.indentStr || " "), t === "") return this;
|
|
332
|
+
e = e || {};
|
|
333
|
+
const n = {};
|
|
334
|
+
e.exclude && (typeof e.exclude[0] == "number" ? [e.exclude] : e.exclude).forEach((a) => {
|
|
335
|
+
for (let w = a[0]; w < a[1]; w += 1)
|
|
336
|
+
n[w] = !0;
|
|
337
|
+
});
|
|
338
|
+
let r = e.indentStart !== !1;
|
|
339
|
+
const s = (l) => r ? `${t}${l}` : (r = !0, l);
|
|
340
|
+
this.intro = this.intro.replace(i, s);
|
|
341
|
+
let h = 0, o = this.firstChunk;
|
|
342
|
+
for (; o; ) {
|
|
343
|
+
const l = o.end;
|
|
344
|
+
if (o.edited)
|
|
345
|
+
n[h] || (o.content = o.content.replace(i, s), o.content.length && (r = o.content[o.content.length - 1] === `
|
|
346
|
+
`));
|
|
347
|
+
else
|
|
348
|
+
for (h = o.start; h < l; ) {
|
|
349
|
+
if (!n[h]) {
|
|
350
|
+
const a = this.original[h];
|
|
351
|
+
a === `
|
|
352
|
+
` ? r = !0 : a !== "\r" && r && (r = !1, h === o.start || (this._splitChunk(o, h), o = o.next), o.prependRight(t));
|
|
353
|
+
}
|
|
354
|
+
h += 1;
|
|
355
|
+
}
|
|
356
|
+
h = o.end, o = o.next;
|
|
357
|
+
}
|
|
358
|
+
return this.outro = this.outro.replace(i, s), this;
|
|
359
|
+
}
|
|
360
|
+
insert() {
|
|
361
|
+
throw new Error(
|
|
362
|
+
"magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)"
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
insertLeft(t, e) {
|
|
366
|
+
return f.insertLeft || (console.warn(
|
|
367
|
+
"magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead"
|
|
368
|
+
), f.insertLeft = !0), this.appendLeft(t, e);
|
|
369
|
+
}
|
|
370
|
+
insertRight(t, e) {
|
|
371
|
+
return f.insertRight || (console.warn(
|
|
372
|
+
"magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead"
|
|
373
|
+
), f.insertRight = !0), this.prependRight(t, e);
|
|
374
|
+
}
|
|
375
|
+
move(t, e, i) {
|
|
376
|
+
if (t = t + this.offset, e = e + this.offset, i = i + this.offset, i >= t && i <= e) throw new Error("Cannot move a selection inside itself");
|
|
377
|
+
this._split(t), this._split(e), this._split(i);
|
|
378
|
+
const n = this.byStart[t], r = this.byEnd[e], s = n.previous, h = r.next, o = this.byStart[i];
|
|
379
|
+
if (!o && r === this.lastChunk) return this;
|
|
380
|
+
const l = o ? o.previous : this.lastChunk;
|
|
381
|
+
return s && (s.next = h), h && (h.previous = s), l && (l.next = n), o && (o.previous = r), n.previous || (this.firstChunk = r.next), r.next || (this.lastChunk = n.previous, this.lastChunk.next = null), n.previous = l, r.next = o || null, l || (this.firstChunk = n), o || (this.lastChunk = r), this;
|
|
382
|
+
}
|
|
383
|
+
overwrite(t, e, i, n) {
|
|
384
|
+
return n = n || {}, this.update(t, e, i, { ...n, overwrite: !n.contentOnly });
|
|
385
|
+
}
|
|
386
|
+
update(t, e, i, n) {
|
|
387
|
+
if (t = t + this.offset, e = e + this.offset, typeof i != "string") throw new TypeError("replacement content must be a string");
|
|
388
|
+
if (this.original.length !== 0) {
|
|
389
|
+
for (; t < 0; ) t += this.original.length;
|
|
390
|
+
for (; e < 0; ) e += this.original.length;
|
|
391
|
+
}
|
|
392
|
+
if (e > this.original.length) throw new Error("end is out of bounds");
|
|
393
|
+
if (t === e)
|
|
394
|
+
throw new Error(
|
|
395
|
+
"Cannot overwrite a zero-length range – use appendLeft or prependRight instead"
|
|
396
|
+
);
|
|
397
|
+
this._split(t), this._split(e), n === !0 && (f.storeName || (console.warn(
|
|
398
|
+
"The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string"
|
|
399
|
+
), f.storeName = !0), n = { storeName: !0 });
|
|
400
|
+
const r = n !== void 0 ? n.storeName : !1, s = n !== void 0 ? n.overwrite : !1;
|
|
401
|
+
if (r) {
|
|
402
|
+
const l = this.original.slice(t, e);
|
|
403
|
+
Object.defineProperty(this.storedNames, l, {
|
|
404
|
+
writable: !0,
|
|
405
|
+
value: !0,
|
|
406
|
+
enumerable: !0
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
const h = this.byStart[t], o = this.byEnd[e];
|
|
410
|
+
if (h) {
|
|
411
|
+
let l = h;
|
|
412
|
+
for (; l !== o; ) {
|
|
413
|
+
if (l.next !== this.byStart[l.end])
|
|
414
|
+
throw new Error("Cannot overwrite across a split point");
|
|
415
|
+
l = l.next, l.edit("", !1);
|
|
416
|
+
}
|
|
417
|
+
h.edit(i, r, !s);
|
|
418
|
+
} else {
|
|
419
|
+
const l = new g(t, e, "").edit(i, r);
|
|
420
|
+
o.next = l, l.previous = o;
|
|
421
|
+
}
|
|
422
|
+
return this;
|
|
423
|
+
}
|
|
424
|
+
prepend(t) {
|
|
425
|
+
if (typeof t != "string") throw new TypeError("outro content must be a string");
|
|
426
|
+
return this.intro = t + this.intro, this;
|
|
427
|
+
}
|
|
428
|
+
prependLeft(t, e) {
|
|
429
|
+
if (t = t + this.offset, typeof e != "string") throw new TypeError("inserted content must be a string");
|
|
430
|
+
this._split(t);
|
|
431
|
+
const i = this.byEnd[t];
|
|
432
|
+
return i ? i.prependLeft(e) : this.intro = e + this.intro, this;
|
|
433
|
+
}
|
|
434
|
+
prependRight(t, e) {
|
|
435
|
+
if (t = t + this.offset, typeof e != "string") throw new TypeError("inserted content must be a string");
|
|
436
|
+
this._split(t);
|
|
437
|
+
const i = this.byStart[t];
|
|
438
|
+
return i ? i.prependRight(e) : this.outro = e + this.outro, this;
|
|
439
|
+
}
|
|
440
|
+
remove(t, e) {
|
|
441
|
+
if (t = t + this.offset, e = e + this.offset, this.original.length !== 0) {
|
|
442
|
+
for (; t < 0; ) t += this.original.length;
|
|
443
|
+
for (; e < 0; ) e += this.original.length;
|
|
444
|
+
}
|
|
445
|
+
if (t === e) return this;
|
|
446
|
+
if (t < 0 || e > this.original.length) throw new Error("Character is out of bounds");
|
|
447
|
+
if (t > e) throw new Error("end must be greater than start");
|
|
448
|
+
this._split(t), this._split(e);
|
|
449
|
+
let i = this.byStart[t];
|
|
450
|
+
for (; i; )
|
|
451
|
+
i.intro = "", i.outro = "", i.edit(""), i = e > i.end ? this.byStart[i.end] : null;
|
|
452
|
+
return this;
|
|
453
|
+
}
|
|
454
|
+
reset(t, e) {
|
|
455
|
+
if (t = t + this.offset, e = e + this.offset, this.original.length !== 0) {
|
|
456
|
+
for (; t < 0; ) t += this.original.length;
|
|
457
|
+
for (; e < 0; ) e += this.original.length;
|
|
458
|
+
}
|
|
459
|
+
if (t === e) return this;
|
|
460
|
+
if (t < 0 || e > this.original.length) throw new Error("Character is out of bounds");
|
|
461
|
+
if (t > e) throw new Error("end must be greater than start");
|
|
462
|
+
this._split(t), this._split(e);
|
|
463
|
+
let i = this.byStart[t];
|
|
464
|
+
for (; i; )
|
|
465
|
+
i.reset(), i = e > i.end ? this.byStart[i.end] : null;
|
|
466
|
+
return this;
|
|
467
|
+
}
|
|
468
|
+
lastChar() {
|
|
469
|
+
if (this.outro.length) return this.outro[this.outro.length - 1];
|
|
470
|
+
let t = this.lastChunk;
|
|
471
|
+
do {
|
|
472
|
+
if (t.outro.length) return t.outro[t.outro.length - 1];
|
|
473
|
+
if (t.content.length) return t.content[t.content.length - 1];
|
|
474
|
+
if (t.intro.length) return t.intro[t.intro.length - 1];
|
|
475
|
+
} while (t = t.previous);
|
|
476
|
+
return this.intro.length ? this.intro[this.intro.length - 1] : "";
|
|
477
|
+
}
|
|
478
|
+
lastLine() {
|
|
479
|
+
let t = this.outro.lastIndexOf(d);
|
|
480
|
+
if (t !== -1) return this.outro.substr(t + 1);
|
|
481
|
+
let e = this.outro, i = this.lastChunk;
|
|
482
|
+
do {
|
|
483
|
+
if (i.outro.length > 0) {
|
|
484
|
+
if (t = i.outro.lastIndexOf(d), t !== -1) return i.outro.substr(t + 1) + e;
|
|
485
|
+
e = i.outro + e;
|
|
486
|
+
}
|
|
487
|
+
if (i.content.length > 0) {
|
|
488
|
+
if (t = i.content.lastIndexOf(d), t !== -1) return i.content.substr(t + 1) + e;
|
|
489
|
+
e = i.content + e;
|
|
490
|
+
}
|
|
491
|
+
if (i.intro.length > 0) {
|
|
492
|
+
if (t = i.intro.lastIndexOf(d), t !== -1) return i.intro.substr(t + 1) + e;
|
|
493
|
+
e = i.intro + e;
|
|
494
|
+
}
|
|
495
|
+
} while (i = i.previous);
|
|
496
|
+
return t = this.intro.lastIndexOf(d), t !== -1 ? this.intro.substr(t + 1) + e : this.intro + e;
|
|
497
|
+
}
|
|
498
|
+
slice(t = 0, e = this.original.length - this.offset) {
|
|
499
|
+
if (t = t + this.offset, e = e + this.offset, this.original.length !== 0) {
|
|
500
|
+
for (; t < 0; ) t += this.original.length;
|
|
501
|
+
for (; e < 0; ) e += this.original.length;
|
|
502
|
+
}
|
|
503
|
+
let i = "", n = this.firstChunk;
|
|
504
|
+
for (; n && (n.start > t || n.end <= t); ) {
|
|
505
|
+
if (n.start < e && n.end >= e)
|
|
506
|
+
return i;
|
|
507
|
+
n = n.next;
|
|
508
|
+
}
|
|
509
|
+
if (n && n.edited && n.start !== t)
|
|
510
|
+
throw new Error(`Cannot use replaced character ${t} as slice start anchor.`);
|
|
511
|
+
const r = n;
|
|
512
|
+
for (; n; ) {
|
|
513
|
+
n.intro && (r !== n || n.start === t) && (i += n.intro);
|
|
514
|
+
const s = n.start < e && n.end >= e;
|
|
515
|
+
if (s && n.edited && n.end !== e)
|
|
516
|
+
throw new Error(`Cannot use replaced character ${e} as slice end anchor.`);
|
|
517
|
+
const h = r === n ? t - n.start : 0, o = s ? n.content.length + e - n.end : n.content.length;
|
|
518
|
+
if (i += n.content.slice(h, o), n.outro && (!s || n.end === e) && (i += n.outro), s)
|
|
519
|
+
break;
|
|
520
|
+
n = n.next;
|
|
521
|
+
}
|
|
522
|
+
return i;
|
|
523
|
+
}
|
|
524
|
+
// TODO deprecate this? not really very useful
|
|
525
|
+
snip(t, e) {
|
|
526
|
+
const i = this.clone();
|
|
527
|
+
return i.remove(0, t), i.remove(e, i.original.length), i;
|
|
528
|
+
}
|
|
529
|
+
_split(t) {
|
|
530
|
+
if (this.byStart[t] || this.byEnd[t]) return;
|
|
531
|
+
let e = this.lastSearchedChunk, i = e;
|
|
532
|
+
const n = t > e.end;
|
|
533
|
+
for (; e; ) {
|
|
534
|
+
if (e.contains(t)) return this._splitChunk(e, t);
|
|
535
|
+
if (e = n ? this.byStart[e.end] : this.byEnd[e.start], e === i) return;
|
|
536
|
+
i = e;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
_splitChunk(t, e) {
|
|
540
|
+
if (t.edited && t.content.length) {
|
|
541
|
+
const n = y(this.original)(e);
|
|
542
|
+
throw new Error(
|
|
543
|
+
`Cannot split a chunk that has already been edited (${n.line}:${n.column} – "${t.original}")`
|
|
544
|
+
);
|
|
545
|
+
}
|
|
546
|
+
const i = t.split(e);
|
|
547
|
+
return this.byEnd[e] = t, this.byStart[e] = i, this.byEnd[i.end] = i, t === this.lastChunk && (this.lastChunk = i), this.lastSearchedChunk = t, !0;
|
|
548
|
+
}
|
|
549
|
+
toString() {
|
|
550
|
+
let t = this.intro, e = this.firstChunk;
|
|
551
|
+
for (; e; )
|
|
552
|
+
t += e.toString(), e = e.next;
|
|
553
|
+
return t + this.outro;
|
|
554
|
+
}
|
|
555
|
+
isEmpty() {
|
|
556
|
+
let t = this.firstChunk;
|
|
557
|
+
do
|
|
558
|
+
if (t.intro.length && t.intro.trim() || t.content.length && t.content.trim() || t.outro.length && t.outro.trim())
|
|
559
|
+
return !1;
|
|
560
|
+
while (t = t.next);
|
|
561
|
+
return !0;
|
|
562
|
+
}
|
|
563
|
+
length() {
|
|
564
|
+
let t = this.firstChunk, e = 0;
|
|
565
|
+
do
|
|
566
|
+
e += t.intro.length + t.content.length + t.outro.length;
|
|
567
|
+
while (t = t.next);
|
|
568
|
+
return e;
|
|
569
|
+
}
|
|
570
|
+
trimLines() {
|
|
571
|
+
return this.trim("[\\r\\n]");
|
|
572
|
+
}
|
|
573
|
+
trim(t) {
|
|
574
|
+
return this.trimStart(t).trimEnd(t);
|
|
575
|
+
}
|
|
576
|
+
trimEndAborted(t) {
|
|
577
|
+
const e = new RegExp((t || "\\s") + "+$");
|
|
578
|
+
if (this.outro = this.outro.replace(e, ""), this.outro.length) return !0;
|
|
579
|
+
let i = this.lastChunk;
|
|
580
|
+
do {
|
|
581
|
+
const n = i.end, r = i.trimEnd(e);
|
|
582
|
+
if (i.end !== n && (this.lastChunk === i && (this.lastChunk = i.next), this.byEnd[i.end] = i, this.byStart[i.next.start] = i.next, this.byEnd[i.next.end] = i.next), r) return !0;
|
|
583
|
+
i = i.previous;
|
|
584
|
+
} while (i);
|
|
585
|
+
return !1;
|
|
586
|
+
}
|
|
587
|
+
trimEnd(t) {
|
|
588
|
+
return this.trimEndAborted(t), this;
|
|
589
|
+
}
|
|
590
|
+
trimStartAborted(t) {
|
|
591
|
+
const e = new RegExp("^" + (t || "\\s") + "+");
|
|
592
|
+
if (this.intro = this.intro.replace(e, ""), this.intro.length) return !0;
|
|
593
|
+
let i = this.firstChunk;
|
|
594
|
+
do {
|
|
595
|
+
const n = i.end, r = i.trimStart(e);
|
|
596
|
+
if (i.end !== n && (i === this.lastChunk && (this.lastChunk = i.next), this.byEnd[i.end] = i, this.byStart[i.next.start] = i.next, this.byEnd[i.next.end] = i.next), r) return !0;
|
|
597
|
+
i = i.next;
|
|
598
|
+
} while (i);
|
|
599
|
+
return !1;
|
|
600
|
+
}
|
|
601
|
+
trimStart(t) {
|
|
602
|
+
return this.trimStartAborted(t), this;
|
|
603
|
+
}
|
|
604
|
+
hasChanged() {
|
|
605
|
+
return this.original !== this.toString();
|
|
606
|
+
}
|
|
607
|
+
_replaceRegexp(t, e) {
|
|
608
|
+
function i(r, s) {
|
|
609
|
+
return typeof e == "string" ? e.replace(/\$(\$|&|\d+)/g, (h, o) => o === "$" ? "$" : o === "&" ? r[0] : +o < r.length ? r[+o] : `$${o}`) : e(...r, r.index, s, r.groups);
|
|
610
|
+
}
|
|
611
|
+
function n(r, s) {
|
|
612
|
+
let h;
|
|
613
|
+
const o = [];
|
|
614
|
+
for (; h = r.exec(s); )
|
|
615
|
+
o.push(h);
|
|
616
|
+
return o;
|
|
617
|
+
}
|
|
618
|
+
if (t.global)
|
|
619
|
+
n(t, this.original).forEach((s) => {
|
|
620
|
+
if (s.index != null) {
|
|
621
|
+
const h = i(s, this.original);
|
|
622
|
+
h !== s[0] && this.overwrite(s.index, s.index + s[0].length, h);
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
else {
|
|
626
|
+
const r = this.original.match(t);
|
|
627
|
+
if (r && r.index != null) {
|
|
628
|
+
const s = i(r, this.original);
|
|
629
|
+
s !== r[0] && this.overwrite(r.index, r.index + r[0].length, s);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return this;
|
|
633
|
+
}
|
|
634
|
+
_replaceString(t, e) {
|
|
635
|
+
const { original: i } = this, n = i.indexOf(t);
|
|
636
|
+
return n !== -1 && (typeof e == "function" && (e = e(t, n, i)), t !== e && this.overwrite(n, n + t.length, e)), this;
|
|
637
|
+
}
|
|
638
|
+
replace(t, e) {
|
|
639
|
+
return typeof t == "string" ? this._replaceString(t, e) : this._replaceRegexp(t, e);
|
|
640
|
+
}
|
|
641
|
+
_replaceAllString(t, e) {
|
|
642
|
+
const { original: i } = this, n = t.length;
|
|
643
|
+
for (let r = i.indexOf(t); r !== -1; r = i.indexOf(t, r + n)) {
|
|
644
|
+
const s = i.slice(r, r + n);
|
|
645
|
+
let h = e;
|
|
646
|
+
typeof e == "function" && (h = e(s, r, i)), s !== h && this.overwrite(r, r + n, h);
|
|
647
|
+
}
|
|
648
|
+
return this;
|
|
649
|
+
}
|
|
650
|
+
replaceAll(t, e) {
|
|
651
|
+
if (typeof t == "string")
|
|
652
|
+
return this._replaceAllString(t, e);
|
|
653
|
+
if (!t.global)
|
|
654
|
+
throw new TypeError(
|
|
655
|
+
"MagicString.prototype.replaceAll called with a non-global RegExp argument"
|
|
656
|
+
);
|
|
657
|
+
return this._replaceRegexp(t, e);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
export {
|
|
661
|
+
N as SourceMap,
|
|
662
|
+
v as default
|
|
663
|
+
};
|
|
664
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFnaWMtc3RyaW5nLmVzLXVQS29yUDRPLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvQGpyaWRnZXdlbGwvc291cmNlbWFwLWNvZGVjL2Rpc3Qvc291cmNlbWFwLWNvZGVjLm1qcyIsIi4uL25vZGVfbW9kdWxlcy9tYWdpYy1zdHJpbmcvZGlzdC9tYWdpYy1zdHJpbmcuZXMubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy92bHEudHNcbnZhciBjb21tYSA9IFwiLFwiLmNoYXJDb2RlQXQoMCk7XG52YXIgc2VtaWNvbG9uID0gXCI7XCIuY2hhckNvZGVBdCgwKTtcbnZhciBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xudmFyIGludFRvQ2hhciA9IG5ldyBVaW50OEFycmF5KDY0KTtcbnZhciBjaGFyVG9JbnQgPSBuZXcgVWludDhBcnJheSgxMjgpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICBjb25zdCBjID0gY2hhcnMuY2hhckNvZGVBdChpKTtcbiAgaW50VG9DaGFyW2ldID0gYztcbiAgY2hhclRvSW50W2NdID0gaTtcbn1cbmZ1bmN0aW9uIGRlY29kZUludGVnZXIocmVhZGVyLCByZWxhdGl2ZSkge1xuICBsZXQgdmFsdWUgPSAwO1xuICBsZXQgc2hpZnQgPSAwO1xuICBsZXQgaW50ZWdlciA9IDA7XG4gIGRvIHtcbiAgICBjb25zdCBjID0gcmVhZGVyLm5leHQoKTtcbiAgICBpbnRlZ2VyID0gY2hhclRvSW50W2NdO1xuICAgIHZhbHVlIHw9IChpbnRlZ2VyICYgMzEpIDw8IHNoaWZ0O1xuICAgIHNoaWZ0ICs9IDU7XG4gIH0gd2hpbGUgKGludGVnZXIgJiAzMik7XG4gIGNvbnN0IHNob3VsZE5lZ2F0ZSA9IHZhbHVlICYgMTtcbiAgdmFsdWUgPj4+PSAxO1xuICBpZiAoc2hvdWxkTmVnYXRlKSB7XG4gICAgdmFsdWUgPSAtMjE0NzQ4MzY0OCB8IC12YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVsYXRpdmUgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVuY29kZUludGVnZXIoYnVpbGRlciwgbnVtLCByZWxhdGl2ZSkge1xuICBsZXQgZGVsdGEgPSBudW0gLSByZWxhdGl2ZTtcbiAgZGVsdGEgPSBkZWx0YSA8IDAgPyAtZGVsdGEgPDwgMSB8IDEgOiBkZWx0YSA8PCAxO1xuICBkbyB7XG4gICAgbGV0IGNsYW1wZWQgPSBkZWx0YSAmIDMxO1xuICAgIGRlbHRhID4+Pj0gNTtcbiAgICBpZiAoZGVsdGEgPiAwKSBjbGFtcGVkIHw9IDMyO1xuICAgIGJ1aWxkZXIud3JpdGUoaW50VG9DaGFyW2NsYW1wZWRdKTtcbiAgfSB3aGlsZSAoZGVsdGEgPiAwKTtcbiAgcmV0dXJuIG51bTtcbn1cbmZ1bmN0aW9uIGhhc01vcmVWbHEocmVhZGVyLCBtYXgpIHtcbiAgaWYgKHJlYWRlci5wb3MgPj0gbWF4KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByZWFkZXIucGVlaygpICE9PSBjb21tYTtcbn1cblxuLy8gc3JjL3N0cmluZ3MudHNcbnZhciBidWZMZW5ndGggPSAxMDI0ICogMTY7XG52YXIgdGQgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09IFwidW5kZWZpbmVkXCIgPyAvKiBAX19QVVJFX18gKi8gbmV3IFRleHREZWNvZGVyKCkgOiB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiID8ge1xuICBkZWNvZGUoYnVmKSB7XG4gICAgY29uc3Qgb3V0ID0gQnVmZmVyLmZyb20oYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7XG4gIH1cbn0gOiB7XG4gIGRlY29kZShidWYpIHtcbiAgICBsZXQgb3V0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufTtcbnZhciBTdHJpbmdXcml0ZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLm91dCA9IFwiXCI7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheShidWZMZW5ndGgpO1xuICB9XG4gIHdyaXRlKHYpIHtcbiAgICBjb25zdCB7IGJ1ZmZlciB9ID0gdGhpcztcbiAgICBidWZmZXJbdGhpcy5wb3MrK10gPSB2O1xuICAgIGlmICh0aGlzLnBvcyA9PT0gYnVmTGVuZ3RoKSB7XG4gICAgICB0aGlzLm91dCArPSB0ZC5kZWNvZGUoYnVmZmVyKTtcbiAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gIH1cbiAgZmx1c2goKSB7XG4gICAgY29uc3QgeyBidWZmZXIsIG91dCwgcG9zIH0gPSB0aGlzO1xuICAgIHJldHVybiBwb3MgPiAwID8gb3V0ICsgdGQuZGVjb2RlKGJ1ZmZlci5zdWJhcnJheSgwLCBwb3MpKSA6IG91dDtcbiAgfVxufTtcbnZhciBTdHJpbmdSZWFkZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgfVxuICBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5jaGFyQ29kZUF0KHRoaXMucG9zKyspO1xuICB9XG4gIHBlZWsoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICB9XG4gIGluZGV4T2YoY2hhcikge1xuICAgIGNvbnN0IHsgYnVmZmVyLCBwb3MgfSA9IHRoaXM7XG4gICAgY29uc3QgaWR4ID0gYnVmZmVyLmluZGV4T2YoY2hhciwgcG9zKTtcbiAgICByZXR1cm4gaWR4ID09PSAtMSA/IGJ1ZmZlci5sZW5ndGggOiBpZHg7XG4gIH1cbn07XG5cbi8vIHNyYy9zY29wZXMudHNcbnZhciBFTVBUWSA9IFtdO1xuZnVuY3Rpb24gZGVjb2RlT3JpZ2luYWxTY29wZXMoaW5wdXQpIHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGlucHV0O1xuICBjb25zdCByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGlucHV0KTtcbiAgY29uc3Qgc2NvcGVzID0gW107XG4gIGNvbnN0IHN0YWNrID0gW107XG4gIGxldCBsaW5lID0gMDtcbiAgZm9yICg7IHJlYWRlci5wb3MgPCBsZW5ndGg7IHJlYWRlci5wb3MrKykge1xuICAgIGxpbmUgPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgbGluZSk7XG4gICAgY29uc3QgY29sdW1uID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApO1xuICAgIGlmICghaGFzTW9yZVZscShyZWFkZXIsIGxlbmd0aCkpIHtcbiAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgIGxhc3RbMl0gPSBsaW5lO1xuICAgICAgbGFzdFszXSA9IGNvbHVtbjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBraW5kID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApO1xuICAgIGNvbnN0IGZpZWxkcyA9IGRlY29kZUludGVnZXIocmVhZGVyLCAwKTtcbiAgICBjb25zdCBoYXNOYW1lID0gZmllbGRzICYgMTtcbiAgICBjb25zdCBzY29wZSA9IGhhc05hbWUgPyBbbGluZSwgY29sdW1uLCAwLCAwLCBraW5kLCBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgMCldIDogW2xpbmUsIGNvbHVtbiwgMCwgMCwga2luZF07XG4gICAgbGV0IHZhcnMgPSBFTVBUWTtcbiAgICBpZiAoaGFzTW9yZVZscShyZWFkZXIsIGxlbmd0aCkpIHtcbiAgICAgIHZhcnMgPSBbXTtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgdmFyc0luZGV4ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApO1xuICAgICAgICB2YXJzLnB1c2godmFyc0luZGV4KTtcbiAgICAgIH0gd2hpbGUgKGhhc01vcmVWbHEocmVhZGVyLCBsZW5ndGgpKTtcbiAgICB9XG4gICAgc2NvcGUudmFycyA9IHZhcnM7XG4gICAgc2NvcGVzLnB1c2goc2NvcGUpO1xuICAgIHN0YWNrLnB1c2goc2NvcGUpO1xuICB9XG4gIHJldHVybiBzY29wZXM7XG59XG5mdW5jdGlvbiBlbmNvZGVPcmlnaW5hbFNjb3BlcyhzY29wZXMpIHtcbiAgY29uc3Qgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNjb3Blcy5sZW5ndGg7ICkge1xuICAgIGkgPSBfZW5jb2RlT3JpZ2luYWxTY29wZXMoc2NvcGVzLCBpLCB3cml0ZXIsIFswXSk7XG4gIH1cbiAgcmV0dXJuIHdyaXRlci5mbHVzaCgpO1xufVxuZnVuY3Rpb24gX2VuY29kZU9yaWdpbmFsU2NvcGVzKHNjb3BlcywgaW5kZXgsIHdyaXRlciwgc3RhdGUpIHtcbiAgY29uc3Qgc2NvcGUgPSBzY29wZXNbaW5kZXhdO1xuICBjb25zdCB7IDA6IHN0YXJ0TGluZSwgMTogc3RhcnRDb2x1bW4sIDI6IGVuZExpbmUsIDM6IGVuZENvbHVtbiwgNDoga2luZCwgdmFycyB9ID0gc2NvcGU7XG4gIGlmIChpbmRleCA+IDApIHdyaXRlci53cml0ZShjb21tYSk7XG4gIHN0YXRlWzBdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHN0YXJ0TGluZSwgc3RhdGVbMF0pO1xuICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc3RhcnRDb2x1bW4sIDApO1xuICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwga2luZCwgMCk7XG4gIGNvbnN0IGZpZWxkcyA9IHNjb3BlLmxlbmd0aCA9PT0gNiA/IDEgOiAwO1xuICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgZmllbGRzLCAwKTtcbiAgaWYgKHNjb3BlLmxlbmd0aCA9PT0gNikgZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNjb3BlWzVdLCAwKTtcbiAgZm9yIChjb25zdCB2IG9mIHZhcnMpIHtcbiAgICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgdiwgMCk7XG4gIH1cbiAgZm9yIChpbmRleCsrOyBpbmRleCA8IHNjb3Blcy5sZW5ndGg7ICkge1xuICAgIGNvbnN0IG5leHQgPSBzY29wZXNbaW5kZXhdO1xuICAgIGNvbnN0IHsgMDogbCwgMTogYyB9ID0gbmV4dDtcbiAgICBpZiAobCA+IGVuZExpbmUgfHwgbCA9PT0gZW5kTGluZSAmJiBjID49IGVuZENvbHVtbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGluZGV4ID0gX2VuY29kZU9yaWdpbmFsU2NvcGVzKHNjb3BlcywgaW5kZXgsIHdyaXRlciwgc3RhdGUpO1xuICB9XG4gIHdyaXRlci53cml0ZShjb21tYSk7XG4gIHN0YXRlWzBdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIGVuZExpbmUsIHN0YXRlWzBdKTtcbiAgZW5jb2RlSW50ZWdlcih3cml0ZXIsIGVuZENvbHVtbiwgMCk7XG4gIHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIGRlY29kZUdlbmVyYXRlZFJhbmdlcyhpbnB1dCkge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gaW5wdXQ7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpO1xuICBjb25zdCByYW5nZXMgPSBbXTtcbiAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgbGV0IGdlbkxpbmUgPSAwO1xuICBsZXQgZGVmaW5pdGlvblNvdXJjZXNJbmRleCA9IDA7XG4gIGxldCBkZWZpbml0aW9uU2NvcGVJbmRleCA9IDA7XG4gIGxldCBjYWxsc2l0ZVNvdXJjZXNJbmRleCA9IDA7XG4gIGxldCBjYWxsc2l0ZUxpbmUgPSAwO1xuICBsZXQgY2FsbHNpdGVDb2x1bW4gPSAwO1xuICBsZXQgYmluZGluZ0xpbmUgPSAwO1xuICBsZXQgYmluZGluZ0NvbHVtbiA9IDA7XG4gIGRvIHtcbiAgICBjb25zdCBzZW1pID0gcmVhZGVyLmluZGV4T2YoXCI7XCIpO1xuICAgIGxldCBnZW5Db2x1bW4gPSAwO1xuICAgIGZvciAoOyByZWFkZXIucG9zIDwgc2VtaTsgcmVhZGVyLnBvcysrKSB7XG4gICAgICBnZW5Db2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgZ2VuQ29sdW1uKTtcbiAgICAgIGlmICghaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgbGFzdFsyXSA9IGdlbkxpbmU7XG4gICAgICAgIGxhc3RbM10gPSBnZW5Db2x1bW47XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZmllbGRzID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApO1xuICAgICAgY29uc3QgaGFzRGVmaW5pdGlvbiA9IGZpZWxkcyAmIDE7XG4gICAgICBjb25zdCBoYXNDYWxsc2l0ZSA9IGZpZWxkcyAmIDI7XG4gICAgICBjb25zdCBoYXNTY29wZSA9IGZpZWxkcyAmIDQ7XG4gICAgICBsZXQgY2FsbHNpdGUgPSBudWxsO1xuICAgICAgbGV0IGJpbmRpbmdzID0gRU1QVFk7XG4gICAgICBsZXQgcmFuZ2U7XG4gICAgICBpZiAoaGFzRGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBkZWZTb3VyY2VzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgZGVmaW5pdGlvblNvdXJjZXNJbmRleCk7XG4gICAgICAgIGRlZmluaXRpb25TY29wZUluZGV4ID0gZGVjb2RlSW50ZWdlcihcbiAgICAgICAgICByZWFkZXIsXG4gICAgICAgICAgZGVmaW5pdGlvblNvdXJjZXNJbmRleCA9PT0gZGVmU291cmNlc0luZGV4ID8gZGVmaW5pdGlvblNjb3BlSW5kZXggOiAwXG4gICAgICAgICk7XG4gICAgICAgIGRlZmluaXRpb25Tb3VyY2VzSW5kZXggPSBkZWZTb3VyY2VzSW5kZXg7XG4gICAgICAgIHJhbmdlID0gW2dlbkxpbmUsIGdlbkNvbHVtbiwgMCwgMCwgZGVmU291cmNlc0luZGV4LCBkZWZpbml0aW9uU2NvcGVJbmRleF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9IFtnZW5MaW5lLCBnZW5Db2x1bW4sIDAsIDBdO1xuICAgICAgfVxuICAgICAgcmFuZ2UuaXNTY29wZSA9ICEhaGFzU2NvcGU7XG4gICAgICBpZiAoaGFzQ2FsbHNpdGUpIHtcbiAgICAgICAgY29uc3QgcHJldkNzaSA9IGNhbGxzaXRlU291cmNlc0luZGV4O1xuICAgICAgICBjb25zdCBwcmV2TGluZSA9IGNhbGxzaXRlTGluZTtcbiAgICAgICAgY2FsbHNpdGVTb3VyY2VzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgY2FsbHNpdGVTb3VyY2VzSW5kZXgpO1xuICAgICAgICBjb25zdCBzYW1lU291cmNlID0gcHJldkNzaSA9PT0gY2FsbHNpdGVTb3VyY2VzSW5kZXg7XG4gICAgICAgIGNhbGxzaXRlTGluZSA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzYW1lU291cmNlID8gY2FsbHNpdGVMaW5lIDogMCk7XG4gICAgICAgIGNhbGxzaXRlQ29sdW1uID0gZGVjb2RlSW50ZWdlcihcbiAgICAgICAgICByZWFkZXIsXG4gICAgICAgICAgc2FtZVNvdXJjZSAmJiBwcmV2TGluZSA9PT0gY2FsbHNpdGVMaW5lID8gY2FsbHNpdGVDb2x1bW4gOiAwXG4gICAgICAgICk7XG4gICAgICAgIGNhbGxzaXRlID0gW2NhbGxzaXRlU291cmNlc0luZGV4LCBjYWxsc2l0ZUxpbmUsIGNhbGxzaXRlQ29sdW1uXTtcbiAgICAgIH1cbiAgICAgIHJhbmdlLmNhbGxzaXRlID0gY2FsbHNpdGU7XG4gICAgICBpZiAoaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpKSB7XG4gICAgICAgIGJpbmRpbmdzID0gW107XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBiaW5kaW5nTGluZSA9IGdlbkxpbmU7XG4gICAgICAgICAgYmluZGluZ0NvbHVtbiA9IGdlbkNvbHVtbjtcbiAgICAgICAgICBjb25zdCBleHByZXNzaW9uc0NvdW50ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApO1xuICAgICAgICAgIGxldCBleHByZXNzaW9uUmFuZ2VzO1xuICAgICAgICAgIGlmIChleHByZXNzaW9uc0NvdW50IDwgLTEpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25SYW5nZXMgPSBbW2RlY29kZUludGVnZXIocmVhZGVyLCAwKV1dO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IC0xOyBpID4gZXhwcmVzc2lvbnNDb3VudDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZCbCA9IGJpbmRpbmdMaW5lO1xuICAgICAgICAgICAgICBiaW5kaW5nTGluZSA9IGRlY29kZUludGVnZXIocmVhZGVyLCBiaW5kaW5nTGluZSk7XG4gICAgICAgICAgICAgIGJpbmRpbmdDb2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgYmluZGluZ0xpbmUgPT09IHByZXZCbCA/IGJpbmRpbmdDb2x1bW4gOiAwKTtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGRlY29kZUludGVnZXIocmVhZGVyLCAwKTtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvblJhbmdlcy5wdXNoKFtleHByZXNzaW9uLCBiaW5kaW5nTGluZSwgYmluZGluZ0NvbHVtbl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHByZXNzaW9uUmFuZ2VzID0gW1tleHByZXNzaW9uc0NvdW50XV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpbmRpbmdzLnB1c2goZXhwcmVzc2lvblJhbmdlcyk7XG4gICAgICAgIH0gd2hpbGUgKGhhc01vcmVWbHEocmVhZGVyLCBzZW1pKSk7XG4gICAgICB9XG4gICAgICByYW5nZS5iaW5kaW5ncyA9IGJpbmRpbmdzO1xuICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgc3RhY2sucHVzaChyYW5nZSk7XG4gICAgfVxuICAgIGdlbkxpbmUrKztcbiAgICByZWFkZXIucG9zID0gc2VtaSArIDE7XG4gIH0gd2hpbGUgKHJlYWRlci5wb3MgPCBsZW5ndGgpO1xuICByZXR1cm4gcmFuZ2VzO1xufVxuZnVuY3Rpb24gZW5jb2RlR2VuZXJhdGVkUmFuZ2VzKHJhbmdlcykge1xuICBpZiAocmFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyApIHtcbiAgICBpID0gX2VuY29kZUdlbmVyYXRlZFJhbmdlcyhyYW5nZXMsIGksIHdyaXRlciwgWzAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgfVxuICByZXR1cm4gd3JpdGVyLmZsdXNoKCk7XG59XG5mdW5jdGlvbiBfZW5jb2RlR2VuZXJhdGVkUmFuZ2VzKHJhbmdlcywgaW5kZXgsIHdyaXRlciwgc3RhdGUpIHtcbiAgY29uc3QgcmFuZ2UgPSByYW5nZXNbaW5kZXhdO1xuICBjb25zdCB7XG4gICAgMDogc3RhcnRMaW5lLFxuICAgIDE6IHN0YXJ0Q29sdW1uLFxuICAgIDI6IGVuZExpbmUsXG4gICAgMzogZW5kQ29sdW1uLFxuICAgIGlzU2NvcGUsXG4gICAgY2FsbHNpdGUsXG4gICAgYmluZGluZ3NcbiAgfSA9IHJhbmdlO1xuICBpZiAoc3RhdGVbMF0gPCBzdGFydExpbmUpIHtcbiAgICBjYXRjaHVwTGluZSh3cml0ZXIsIHN0YXRlWzBdLCBzdGFydExpbmUpO1xuICAgIHN0YXRlWzBdID0gc3RhcnRMaW5lO1xuICAgIHN0YXRlWzFdID0gMDtcbiAgfSBlbHNlIGlmIChpbmRleCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGUoY29tbWEpO1xuICB9XG4gIHN0YXRlWzFdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHJhbmdlWzFdLCBzdGF0ZVsxXSk7XG4gIGNvbnN0IGZpZWxkcyA9IChyYW5nZS5sZW5ndGggPT09IDYgPyAxIDogMCkgfCAoY2FsbHNpdGUgPyAyIDogMCkgfCAoaXNTY29wZSA/IDQgOiAwKTtcbiAgZW5jb2RlSW50ZWdlcih3cml0ZXIsIGZpZWxkcywgMCk7XG4gIGlmIChyYW5nZS5sZW5ndGggPT09IDYpIHtcbiAgICBjb25zdCB7IDQ6IHNvdXJjZXNJbmRleCwgNTogc2NvcGVzSW5kZXggfSA9IHJhbmdlO1xuICAgIGlmIChzb3VyY2VzSW5kZXggIT09IHN0YXRlWzJdKSB7XG4gICAgICBzdGF0ZVszXSA9IDA7XG4gICAgfVxuICAgIHN0YXRlWzJdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNvdXJjZXNJbmRleCwgc3RhdGVbMl0pO1xuICAgIHN0YXRlWzNdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNjb3Blc0luZGV4LCBzdGF0ZVszXSk7XG4gIH1cbiAgaWYgKGNhbGxzaXRlKSB7XG4gICAgY29uc3QgeyAwOiBzb3VyY2VzSW5kZXgsIDE6IGNhbGxMaW5lLCAyOiBjYWxsQ29sdW1uIH0gPSByYW5nZS5jYWxsc2l0ZTtcbiAgICBpZiAoc291cmNlc0luZGV4ICE9PSBzdGF0ZVs0XSkge1xuICAgICAgc3RhdGVbNV0gPSAwO1xuICAgICAgc3RhdGVbNl0gPSAwO1xuICAgIH0gZWxzZSBpZiAoY2FsbExpbmUgIT09IHN0YXRlWzVdKSB7XG4gICAgICBzdGF0ZVs2XSA9IDA7XG4gICAgfVxuICAgIHN0YXRlWzRdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNvdXJjZXNJbmRleCwgc3RhdGVbNF0pO1xuICAgIHN0YXRlWzVdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIGNhbGxMaW5lLCBzdGF0ZVs1XSk7XG4gICAgc3RhdGVbNl0gPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgY2FsbENvbHVtbiwgc3RhdGVbNl0pO1xuICB9XG4gIGlmIChiaW5kaW5ncykge1xuICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBiaW5kaW5ncykge1xuICAgICAgaWYgKGJpbmRpbmcubGVuZ3RoID4gMSkgZW5jb2RlSW50ZWdlcih3cml0ZXIsIC1iaW5kaW5nLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gYmluZGluZ1swXVswXTtcbiAgICAgIGVuY29kZUludGVnZXIod3JpdGVyLCBleHByZXNzaW9uLCAwKTtcbiAgICAgIGxldCBiaW5kaW5nU3RhcnRMaW5lID0gc3RhcnRMaW5lO1xuICAgICAgbGV0IGJpbmRpbmdTdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uO1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBiaW5kaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV4cFJhbmdlID0gYmluZGluZ1tpXTtcbiAgICAgICAgYmluZGluZ1N0YXJ0TGluZSA9IGVuY29kZUludGVnZXIod3JpdGVyLCBleHBSYW5nZVsxXSwgYmluZGluZ1N0YXJ0TGluZSk7XG4gICAgICAgIGJpbmRpbmdTdGFydENvbHVtbiA9IGVuY29kZUludGVnZXIod3JpdGVyLCBleHBSYW5nZVsyXSwgYmluZGluZ1N0YXJ0Q29sdW1uKTtcbiAgICAgICAgZW5jb2RlSW50ZWdlcih3cml0ZXIsIGV4cFJhbmdlWzBdLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChpbmRleCsrOyBpbmRleCA8IHJhbmdlcy5sZW5ndGg7ICkge1xuICAgIGNvbnN0IG5leHQgPSByYW5nZXNbaW5kZXhdO1xuICAgIGNvbnN0IHsgMDogbCwgMTogYyB9ID0gbmV4dDtcbiAgICBpZiAobCA+IGVuZExpbmUgfHwgbCA9PT0gZW5kTGluZSAmJiBjID49IGVuZENvbHVtbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGluZGV4ID0gX2VuY29kZUdlbmVyYXRlZFJhbmdlcyhyYW5nZXMsIGluZGV4LCB3cml0ZXIsIHN0YXRlKTtcbiAgfVxuICBpZiAoc3RhdGVbMF0gPCBlbmRMaW5lKSB7XG4gICAgY2F0Y2h1cExpbmUod3JpdGVyLCBzdGF0ZVswXSwgZW5kTGluZSk7XG4gICAgc3RhdGVbMF0gPSBlbmRMaW5lO1xuICAgIHN0YXRlWzFdID0gMDtcbiAgfSBlbHNlIHtcbiAgICB3cml0ZXIud3JpdGUoY29tbWEpO1xuICB9XG4gIHN0YXRlWzFdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIGVuZENvbHVtbiwgc3RhdGVbMV0pO1xuICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBjYXRjaHVwTGluZSh3cml0ZXIsIGxhc3RMaW5lLCBsaW5lKSB7XG4gIGRvIHtcbiAgICB3cml0ZXIud3JpdGUoc2VtaWNvbG9uKTtcbiAgfSB3aGlsZSAoKytsYXN0TGluZSA8IGxpbmUpO1xufVxuXG4vLyBzcmMvc291cmNlbWFwLWNvZGVjLnRzXG5mdW5jdGlvbiBkZWNvZGUobWFwcGluZ3MpIHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IG1hcHBpbmdzO1xuICBjb25zdCByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKG1hcHBpbmdzKTtcbiAgY29uc3QgZGVjb2RlZCA9IFtdO1xuICBsZXQgZ2VuQ29sdW1uID0gMDtcbiAgbGV0IHNvdXJjZXNJbmRleCA9IDA7XG4gIGxldCBzb3VyY2VMaW5lID0gMDtcbiAgbGV0IHNvdXJjZUNvbHVtbiA9IDA7XG4gIGxldCBuYW1lc0luZGV4ID0gMDtcbiAgZG8ge1xuICAgIGNvbnN0IHNlbWkgPSByZWFkZXIuaW5kZXhPZihcIjtcIik7XG4gICAgY29uc3QgbGluZSA9IFtdO1xuICAgIGxldCBzb3J0ZWQgPSB0cnVlO1xuICAgIGxldCBsYXN0Q29sID0gMDtcbiAgICBnZW5Db2x1bW4gPSAwO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgc2VtaSkge1xuICAgICAgbGV0IHNlZztcbiAgICAgIGdlbkNvbHVtbiA9IGRlY29kZUludGVnZXIocmVhZGVyLCBnZW5Db2x1bW4pO1xuICAgICAgaWYgKGdlbkNvbHVtbiA8IGxhc3RDb2wpIHNvcnRlZCA9IGZhbHNlO1xuICAgICAgbGFzdENvbCA9IGdlbkNvbHVtbjtcbiAgICAgIGlmIChoYXNNb3JlVmxxKHJlYWRlciwgc2VtaSkpIHtcbiAgICAgICAgc291cmNlc0luZGV4ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNvdXJjZXNJbmRleCk7XG4gICAgICAgIHNvdXJjZUxpbmUgPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc291cmNlTGluZSk7XG4gICAgICAgIHNvdXJjZUNvbHVtbiA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzb3VyY2VDb2x1bW4pO1xuICAgICAgICBpZiAoaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpKSB7XG4gICAgICAgICAgbmFtZXNJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBuYW1lc0luZGV4KTtcbiAgICAgICAgICBzZWcgPSBbZ2VuQ29sdW1uLCBzb3VyY2VzSW5kZXgsIHNvdXJjZUxpbmUsIHNvdXJjZUNvbHVtbiwgbmFtZXNJbmRleF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnID0gW2dlbkNvbHVtbiwgc291cmNlc0luZGV4LCBzb3VyY2VMaW5lLCBzb3VyY2VDb2x1bW5dO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWcgPSBbZ2VuQ29sdW1uXTtcbiAgICAgIH1cbiAgICAgIGxpbmUucHVzaChzZWcpO1xuICAgICAgcmVhZGVyLnBvcysrO1xuICAgIH1cbiAgICBpZiAoIXNvcnRlZCkgc29ydChsaW5lKTtcbiAgICBkZWNvZGVkLnB1c2gobGluZSk7XG4gICAgcmVhZGVyLnBvcyA9IHNlbWkgKyAxO1xuICB9IHdoaWxlIChyZWFkZXIucG9zIDw9IGxlbmd0aCk7XG4gIHJldHVybiBkZWNvZGVkO1xufVxuZnVuY3Rpb24gc29ydChsaW5lKSB7XG4gIGxpbmUuc29ydChzb3J0Q29tcGFyYXRvcik7XG59XG5mdW5jdGlvbiBzb3J0Q29tcGFyYXRvcihhLCBiKSB7XG4gIHJldHVybiBhWzBdIC0gYlswXTtcbn1cbmZ1bmN0aW9uIGVuY29kZShkZWNvZGVkKSB7XG4gIGNvbnN0IHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTtcbiAgbGV0IHNvdXJjZXNJbmRleCA9IDA7XG4gIGxldCBzb3VyY2VMaW5lID0gMDtcbiAgbGV0IHNvdXJjZUNvbHVtbiA9IDA7XG4gIGxldCBuYW1lc0luZGV4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IGRlY29kZWRbaV07XG4gICAgaWYgKGkgPiAwKSB3cml0ZXIud3JpdGUoc2VtaWNvbG9uKTtcbiAgICBpZiAobGluZS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIGxldCBnZW5Db2x1bW4gPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IGxpbmVbal07XG4gICAgICBpZiAoaiA+IDApIHdyaXRlci53cml0ZShjb21tYSk7XG4gICAgICBnZW5Db2x1bW4gPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2VnbWVudFswXSwgZ2VuQ29sdW1uKTtcbiAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMSkgY29udGludWU7XG4gICAgICBzb3VyY2VzSW5kZXggPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2VnbWVudFsxXSwgc291cmNlc0luZGV4KTtcbiAgICAgIHNvdXJjZUxpbmUgPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2VnbWVudFsyXSwgc291cmNlTGluZSk7XG4gICAgICBzb3VyY2VDb2x1bW4gPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2VnbWVudFszXSwgc291cmNlQ29sdW1uKTtcbiAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gNCkgY29udGludWU7XG4gICAgICBuYW1lc0luZGV4ID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNlZ21lbnRbNF0sIG5hbWVzSW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd3JpdGVyLmZsdXNoKCk7XG59XG5leHBvcnQge1xuICBkZWNvZGUsXG4gIGRlY29kZUdlbmVyYXRlZFJhbmdlcyxcbiAgZGVjb2RlT3JpZ2luYWxTY29wZXMsXG4gIGVuY29kZSxcbiAgZW5jb2RlR2VuZXJhdGVkUmFuZ2VzLFxuICBlbmNvZGVPcmlnaW5hbFNjb3Blc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNvdXJjZW1hcC1jb2RlYy5tanMubWFwXG4iLCJpbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdAanJpZGdld2VsbC9zb3VyY2VtYXAtY29kZWMnO1xuXG5jbGFzcyBCaXRTZXQge1xuXHRjb25zdHJ1Y3RvcihhcmcpIHtcblx0XHR0aGlzLmJpdHMgPSBhcmcgaW5zdGFuY2VvZiBCaXRTZXQgPyBhcmcuYml0cy5zbGljZSgpIDogW107XG5cdH1cblxuXHRhZGQobikge1xuXHRcdHRoaXMuYml0c1tuID4+IDVdIHw9IDEgPDwgKG4gJiAzMSk7XG5cdH1cblxuXHRoYXMobikge1xuXHRcdHJldHVybiAhISh0aGlzLmJpdHNbbiA+PiA1XSAmICgxIDw8IChuICYgMzEpKSk7XG5cdH1cbn1cblxuY2xhc3MgQ2h1bmsge1xuXHRjb25zdHJ1Y3RvcihzdGFydCwgZW5kLCBjb250ZW50KSB7XG5cdFx0dGhpcy5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMub3JpZ2luYWwgPSBjb250ZW50O1xuXG5cdFx0dGhpcy5pbnRybyA9ICcnO1xuXHRcdHRoaXMub3V0cm8gPSAnJztcblxuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0dGhpcy5zdG9yZU5hbWUgPSBmYWxzZTtcblx0XHR0aGlzLmVkaXRlZCA9IGZhbHNlO1xuXG5cdFx0e1xuXHRcdFx0dGhpcy5wcmV2aW91cyA9IG51bGw7XG5cdFx0XHR0aGlzLm5leHQgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdGFwcGVuZExlZnQoY29udGVudCkge1xuXHRcdHRoaXMub3V0cm8gKz0gY29udGVudDtcblx0fVxuXG5cdGFwcGVuZFJpZ2h0KGNvbnRlbnQpIHtcblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRybyArIGNvbnRlbnQ7XG5cdH1cblxuXHRjbG9uZSgpIHtcblx0XHRjb25zdCBjaHVuayA9IG5ldyBDaHVuayh0aGlzLnN0YXJ0LCB0aGlzLmVuZCwgdGhpcy5vcmlnaW5hbCk7XG5cblx0XHRjaHVuay5pbnRybyA9IHRoaXMuaW50cm87XG5cdFx0Y2h1bmsub3V0cm8gPSB0aGlzLm91dHJvO1xuXHRcdGNodW5rLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG5cdFx0Y2h1bmsuc3RvcmVOYW1lID0gdGhpcy5zdG9yZU5hbWU7XG5cdFx0Y2h1bmsuZWRpdGVkID0gdGhpcy5lZGl0ZWQ7XG5cblx0XHRyZXR1cm4gY2h1bms7XG5cdH1cblxuXHRjb250YWlucyhpbmRleCkge1xuXHRcdHJldHVybiB0aGlzLnN0YXJ0IDwgaW5kZXggJiYgaW5kZXggPCB0aGlzLmVuZDtcblx0fVxuXG5cdGVhY2hOZXh0KGZuKSB7XG5cdFx0bGV0IGNodW5rID0gdGhpcztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGZuKGNodW5rKTtcblx0XHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0XHR9XG5cdH1cblxuXHRlYWNoUHJldmlvdXMoZm4pIHtcblx0XHRsZXQgY2h1bmsgPSB0aGlzO1xuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0Zm4oY2h1bmspO1xuXHRcdFx0Y2h1bmsgPSBjaHVuay5wcmV2aW91cztcblx0XHR9XG5cdH1cblxuXHRlZGl0KGNvbnRlbnQsIHN0b3JlTmFtZSwgY29udGVudE9ubHkpIHtcblx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdGlmICghY29udGVudE9ubHkpIHtcblx0XHRcdHRoaXMuaW50cm8gPSAnJztcblx0XHRcdHRoaXMub3V0cm8gPSAnJztcblx0XHR9XG5cdFx0dGhpcy5zdG9yZU5hbWUgPSBzdG9yZU5hbWU7XG5cblx0XHR0aGlzLmVkaXRlZCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByZXBlbmRMZWZ0KGNvbnRlbnQpIHtcblx0XHR0aGlzLm91dHJvID0gY29udGVudCArIHRoaXMub3V0cm87XG5cdH1cblxuXHRwcmVwZW5kUmlnaHQoY29udGVudCkge1xuXHRcdHRoaXMuaW50cm8gPSBjb250ZW50ICsgdGhpcy5pbnRybztcblx0fVxuXG5cdHJlc2V0KCkge1xuXHRcdHRoaXMuaW50cm8gPSAnJztcblx0XHR0aGlzLm91dHJvID0gJyc7XG5cdFx0aWYgKHRoaXMuZWRpdGVkKSB7XG5cdFx0XHR0aGlzLmNvbnRlbnQgPSB0aGlzLm9yaWdpbmFsO1xuXHRcdFx0dGhpcy5zdG9yZU5hbWUgPSBmYWxzZTtcblx0XHRcdHRoaXMuZWRpdGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0c3BsaXQoaW5kZXgpIHtcblx0XHRjb25zdCBzbGljZUluZGV4ID0gaW5kZXggLSB0aGlzLnN0YXJ0O1xuXG5cdFx0Y29uc3Qgb3JpZ2luYWxCZWZvcmUgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKDAsIHNsaWNlSW5kZXgpO1xuXHRcdGNvbnN0IG9yaWdpbmFsQWZ0ZXIgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKHNsaWNlSW5kZXgpO1xuXG5cdFx0dGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsQmVmb3JlO1xuXG5cdFx0Y29uc3QgbmV3Q2h1bmsgPSBuZXcgQ2h1bmsoaW5kZXgsIHRoaXMuZW5kLCBvcmlnaW5hbEFmdGVyKTtcblx0XHRuZXdDaHVuay5vdXRybyA9IHRoaXMub3V0cm87XG5cdFx0dGhpcy5vdXRybyA9ICcnO1xuXG5cdFx0dGhpcy5lbmQgPSBpbmRleDtcblxuXHRcdGlmICh0aGlzLmVkaXRlZCkge1xuXHRcdFx0Ly8gYWZ0ZXIgc3BsaXQgd2Ugc2hvdWxkIHNhdmUgdGhlIGVkaXQgY29udGVudCByZWNvcmQgaW50byB0aGUgY29ycmVjdCBjaHVua1xuXHRcdFx0Ly8gdG8gbWFrZSBzdXJlIHNvdXJjZW1hcCBjb3JyZWN0XG5cdFx0XHQvLyBGb3IgZXhhbXBsZTpcblx0XHRcdC8vICcgIHRlc3QnLnRyaW0oKVxuXHRcdFx0Ly8gICAgIHNwbGl0ICAgLT4gJyAgJyArICd0ZXN0J1xuXHRcdFx0Ly8gICDinJTvuI8gZWRpdCAgICAtPiAnJyArICd0ZXN0J1xuXHRcdFx0Ly8gICDinJbvuI8gZWRpdCAgICAtPiAndGVzdCcgKyAnJ1xuXHRcdFx0Ly8gVE9ETyBpcyB0aGlzIGJsb2NrIG5lY2Vzc2FyeT8uLi5cblx0XHRcdG5ld0NodW5rLmVkaXQoJycsIGZhbHNlKTtcblx0XHRcdHRoaXMuY29udGVudCA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbnRlbnQgPSBvcmlnaW5hbEJlZm9yZTtcblx0XHR9XG5cblx0XHRuZXdDaHVuay5uZXh0ID0gdGhpcy5uZXh0O1xuXHRcdGlmIChuZXdDaHVuay5uZXh0KSBuZXdDaHVuay5uZXh0LnByZXZpb3VzID0gbmV3Q2h1bms7XG5cdFx0bmV3Q2h1bmsucHJldmlvdXMgPSB0aGlzO1xuXHRcdHRoaXMubmV4dCA9IG5ld0NodW5rO1xuXG5cdFx0cmV0dXJuIG5ld0NodW5rO1xuXHR9XG5cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaW50cm8gKyB0aGlzLmNvbnRlbnQgKyB0aGlzLm91dHJvO1xuXHR9XG5cblx0dHJpbUVuZChyeCkge1xuXHRcdHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0cnVlO1xuXG5cdFx0Y29uc3QgdHJpbW1lZCA9IHRoaXMuY29udGVudC5yZXBsYWNlKHJ4LCAnJyk7XG5cblx0XHRpZiAodHJpbW1lZC5sZW5ndGgpIHtcblx0XHRcdGlmICh0cmltbWVkICE9PSB0aGlzLmNvbnRlbnQpIHtcblx0XHRcdFx0dGhpcy5zcGxpdCh0aGlzLnN0YXJ0ICsgdHJpbW1lZC5sZW5ndGgpLmVkaXQoJycsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGlmICh0aGlzLmVkaXRlZCkge1xuXHRcdFx0XHRcdC8vIHNhdmUgdGhlIGNoYW5nZSwgaWYgaXQgaGFzIGJlZW4gZWRpdGVkXG5cdFx0XHRcdFx0dGhpcy5lZGl0KHRyaW1tZWQsIHRoaXMuc3RvcmVOYW1lLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdCgnJywgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXHRcdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHR0cmltU3RhcnQocngpIHtcblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGNvbnN0IHRyaW1tZWQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShyeCwgJycpO1xuXG5cdFx0aWYgKHRyaW1tZWQubGVuZ3RoKSB7XG5cdFx0XHRpZiAodHJpbW1lZCAhPT0gdGhpcy5jb250ZW50KSB7XG5cdFx0XHRcdGNvbnN0IG5ld0NodW5rID0gdGhpcy5zcGxpdCh0aGlzLmVuZCAtIHRyaW1tZWQubGVuZ3RoKTtcblx0XHRcdFx0aWYgKHRoaXMuZWRpdGVkKSB7XG5cdFx0XHRcdFx0Ly8gc2F2ZSB0aGUgY2hhbmdlLCBpZiBpdCBoYXMgYmVlbiBlZGl0ZWRcblx0XHRcdFx0XHRuZXdDaHVuay5lZGl0KHRyaW1tZWQsIHRoaXMuc3RvcmVOYW1lLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmVkaXQoJycsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lZGl0KCcnLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHR0aGlzLm91dHJvID0gdGhpcy5vdXRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0XHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBnZXRCdG9hKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxUaGlzLmJ0b2EgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gKHN0cikgPT4gZ2xvYmFsVGhpcy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiAoc3RyKSA9PiBCdWZmZXIuZnJvbShzdHIsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbnZpcm9ubWVudDogYHdpbmRvdy5idG9hYCBvciBgQnVmZmVyYCBzaG91bGQgYmUgc3VwcG9ydGVkLicpO1xuXHRcdH07XG5cdH1cbn1cblxuY29uc3QgYnRvYSA9IC8qI19fUFVSRV9fKi8gZ2V0QnRvYSgpO1xuXG5jbGFzcyBTb3VyY2VNYXAge1xuXHRjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzKSB7XG5cdFx0dGhpcy52ZXJzaW9uID0gMztcblx0XHR0aGlzLmZpbGUgPSBwcm9wZXJ0aWVzLmZpbGU7XG5cdFx0dGhpcy5zb3VyY2VzID0gcHJvcGVydGllcy5zb3VyY2VzO1xuXHRcdHRoaXMuc291cmNlc0NvbnRlbnQgPSBwcm9wZXJ0aWVzLnNvdXJjZXNDb250ZW50O1xuXHRcdHRoaXMubmFtZXMgPSBwcm9wZXJ0aWVzLm5hbWVzO1xuXHRcdHRoaXMubWFwcGluZ3MgPSBlbmNvZGUocHJvcGVydGllcy5tYXBwaW5ncyk7XG5cdFx0aWYgKHR5cGVvZiBwcm9wZXJ0aWVzLnhfZ29vZ2xlX2lnbm9yZUxpc3QgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR0aGlzLnhfZ29vZ2xlX2lnbm9yZUxpc3QgPSBwcm9wZXJ0aWVzLnhfZ29vZ2xlX2lnbm9yZUxpc3Q7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgcHJvcGVydGllcy5kZWJ1Z0lkICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0dGhpcy5kZWJ1Z0lkID0gcHJvcGVydGllcy5kZWJ1Z0lkO1xuXHRcdH1cblx0fVxuXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcblx0fVxuXG5cdHRvVXJsKCkge1xuXHRcdHJldHVybiAnZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCcgKyBidG9hKHRoaXMudG9TdHJpbmcoKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ3Vlc3NJbmRlbnQoY29kZSkge1xuXHRjb25zdCBsaW5lcyA9IGNvZGUuc3BsaXQoJ1xcbicpO1xuXG5cdGNvbnN0IHRhYmJlZCA9IGxpbmVzLmZpbHRlcigobGluZSkgPT4gL15cXHQrLy50ZXN0KGxpbmUpKTtcblx0Y29uc3Qgc3BhY2VkID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiAvXiB7Mix9Ly50ZXN0KGxpbmUpKTtcblxuXHRpZiAodGFiYmVkLmxlbmd0aCA9PT0gMCAmJiBzcGFjZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBNb3JlIGxpbmVzIHRhYmJlZCB0aGFuIHNwYWNlZD8gQXNzdW1lIHRhYnMsIGFuZFxuXHQvLyBkZWZhdWx0IHRvIHRhYnMgaW4gdGhlIGNhc2Ugb2YgYSB0aWUgKG9yIG5vdGhpbmdcblx0Ly8gdG8gZ28gb24pXG5cdGlmICh0YWJiZWQubGVuZ3RoID49IHNwYWNlZC5sZW5ndGgpIHtcblx0XHRyZXR1cm4gJ1xcdCc7XG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZ3Vlc3MgdGhlIG11bHRpcGxlXG5cdGNvbnN0IG1pbiA9IHNwYWNlZC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG5cdFx0Y29uc3QgbnVtU3BhY2VzID0gL14gKy8uZXhlYyhjdXJyZW50KVswXS5sZW5ndGg7XG5cdFx0cmV0dXJuIE1hdGgubWluKG51bVNwYWNlcywgcHJldmlvdXMpO1xuXHR9LCBJbmZpbml0eSk7XG5cblx0cmV0dXJuIG5ldyBBcnJheShtaW4gKyAxKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlUGF0aChmcm9tLCB0bykge1xuXHRjb25zdCBmcm9tUGFydHMgPSBmcm9tLnNwbGl0KC9bL1xcXFxdLyk7XG5cdGNvbnN0IHRvUGFydHMgPSB0by5zcGxpdCgvWy9cXFxcXS8pO1xuXG5cdGZyb21QYXJ0cy5wb3AoKTsgLy8gZ2V0IGRpcm5hbWVcblxuXHR3aGlsZSAoZnJvbVBhcnRzWzBdID09PSB0b1BhcnRzWzBdKSB7XG5cdFx0ZnJvbVBhcnRzLnNoaWZ0KCk7XG5cdFx0dG9QYXJ0cy5zaGlmdCgpO1xuXHR9XG5cblx0aWYgKGZyb21QYXJ0cy5sZW5ndGgpIHtcblx0XHRsZXQgaSA9IGZyb21QYXJ0cy5sZW5ndGg7XG5cdFx0d2hpbGUgKGktLSkgZnJvbVBhcnRzW2ldID0gJy4uJztcblx0fVxuXG5cdHJldHVybiBmcm9tUGFydHMuY29uY2F0KHRvUGFydHMpLmpvaW4oJy8nKTtcbn1cblxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiBpc09iamVjdCh0aGluZykge1xuXHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhdG9yKHNvdXJjZSkge1xuXHRjb25zdCBvcmlnaW5hbExpbmVzID0gc291cmNlLnNwbGl0KCdcXG4nKTtcblx0Y29uc3QgbGluZU9mZnNldHMgPSBbXTtcblxuXHRmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IG9yaWdpbmFsTGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRsaW5lT2Zmc2V0cy5wdXNoKHBvcyk7XG5cdFx0cG9zICs9IG9yaWdpbmFsTGluZXNbaV0ubGVuZ3RoICsgMTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiBsb2NhdGUoaW5kZXgpIHtcblx0XHRsZXQgaSA9IDA7XG5cdFx0bGV0IGogPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG5cdFx0d2hpbGUgKGkgPCBqKSB7XG5cdFx0XHRjb25zdCBtID0gKGkgKyBqKSA+PiAxO1xuXHRcdFx0aWYgKGluZGV4IDwgbGluZU9mZnNldHNbbV0pIHtcblx0XHRcdFx0aiA9IG07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpID0gbSArIDE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGxpbmUgPSBpIC0gMTtcblx0XHRjb25zdCBjb2x1bW4gPSBpbmRleCAtIGxpbmVPZmZzZXRzW2xpbmVdO1xuXHRcdHJldHVybiB7IGxpbmUsIGNvbHVtbiB9O1xuXHR9O1xufVxuXG5jb25zdCB3b3JkUmVnZXggPSAvXFx3LztcblxuY2xhc3MgTWFwcGluZ3Mge1xuXHRjb25zdHJ1Y3RvcihoaXJlcykge1xuXHRcdHRoaXMuaGlyZXMgPSBoaXJlcztcblx0XHR0aGlzLmdlbmVyYXRlZENvZGVMaW5lID0gMDtcblx0XHR0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwO1xuXHRcdHRoaXMucmF3ID0gW107XG5cdFx0dGhpcy5yYXdTZWdtZW50cyA9IHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gW107XG5cdFx0dGhpcy5wZW5kaW5nID0gbnVsbDtcblx0fVxuXG5cdGFkZEVkaXQoc291cmNlSW5kZXgsIGNvbnRlbnQsIGxvYywgbmFtZUluZGV4KSB7XG5cdFx0aWYgKGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBjb250ZW50TGVuZ3RoTWludXNPbmUgPSBjb250ZW50Lmxlbmd0aCAtIDE7XG5cdFx0XHRsZXQgY29udGVudExpbmVFbmQgPSBjb250ZW50LmluZGV4T2YoJ1xcbicsIDApO1xuXHRcdFx0bGV0IHByZXZpb3VzQ29udGVudExpbmVFbmQgPSAtMTtcblx0XHRcdC8vIExvb3AgdGhyb3VnaCBlYWNoIGxpbmUgaW4gdGhlIGNvbnRlbnQgYW5kIGFkZCBhIHNlZ21lbnQsIGJ1dCBzdG9wIGlmIHRoZSBsYXN0IGxpbmUgaXMgZW1wdHksXG5cdFx0XHQvLyBlbHNlIGNvZGUgYWZ0ZXJ3YXJkcyB3b3VsZCBmaWxsIG9uZSBsaW5lIHRvbyBtYW55XG5cdFx0XHR3aGlsZSAoY29udGVudExpbmVFbmQgPj0gMCAmJiBjb250ZW50TGVuZ3RoTWludXNPbmUgPiBjb250ZW50TGluZUVuZCkge1xuXHRcdFx0XHRjb25zdCBzZWdtZW50ID0gW3RoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiwgc291cmNlSW5kZXgsIGxvYy5saW5lLCBsb2MuY29sdW1uXTtcblx0XHRcdFx0aWYgKG5hbWVJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0c2VnbWVudC5wdXNoKG5hbWVJbmRleCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5yYXdTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUxpbmUgKz0gMTtcblx0XHRcdFx0dGhpcy5yYXdbdGhpcy5nZW5lcmF0ZWRDb2RlTGluZV0gPSB0aGlzLnJhd1NlZ21lbnRzID0gW107XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cblx0XHRcdFx0cHJldmlvdXNDb250ZW50TGluZUVuZCA9IGNvbnRlbnRMaW5lRW5kO1xuXHRcdFx0XHRjb250ZW50TGluZUVuZCA9IGNvbnRlbnQuaW5kZXhPZignXFxuJywgY29udGVudExpbmVFbmQgKyAxKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VnbWVudCA9IFt0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4sIHNvdXJjZUluZGV4LCBsb2MubGluZSwgbG9jLmNvbHVtbl07XG5cdFx0XHRpZiAobmFtZUluZGV4ID49IDApIHtcblx0XHRcdFx0c2VnbWVudC5wdXNoKG5hbWVJbmRleCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJhd1NlZ21lbnRzLnB1c2goc2VnbWVudCk7XG5cblx0XHRcdHRoaXMuYWR2YW5jZShjb250ZW50LnNsaWNlKHByZXZpb3VzQ29udGVudExpbmVFbmQgKyAxKSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLnBlbmRpbmcpIHtcblx0XHRcdHRoaXMucmF3U2VnbWVudHMucHVzaCh0aGlzLnBlbmRpbmcpO1xuXHRcdFx0dGhpcy5hZHZhbmNlKGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdH1cblxuXHRhZGRVbmVkaXRlZENodW5rKHNvdXJjZUluZGV4LCBjaHVuaywgb3JpZ2luYWwsIGxvYywgc291cmNlbWFwTG9jYXRpb25zKSB7XG5cdFx0bGV0IG9yaWdpbmFsQ2hhckluZGV4ID0gY2h1bmsuc3RhcnQ7XG5cdFx0bGV0IGZpcnN0ID0gdHJ1ZTtcblx0XHQvLyB3aGVuIGl0ZXJhdGluZyBlYWNoIGNoYXIsIGNoZWNrIGlmIGl0J3MgaW4gYSB3b3JkIGJvdW5kYXJ5XG5cdFx0bGV0IGNoYXJJbkhpcmVzQm91bmRhcnkgPSBmYWxzZTtcblxuXHRcdHdoaWxlIChvcmlnaW5hbENoYXJJbmRleCA8IGNodW5rLmVuZCkge1xuXHRcdFx0aWYgKG9yaWdpbmFsW29yaWdpbmFsQ2hhckluZGV4XSA9PT0gJ1xcbicpIHtcblx0XHRcdFx0bG9jLmxpbmUgKz0gMTtcblx0XHRcdFx0bG9jLmNvbHVtbiA9IDA7XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUxpbmUgKz0gMTtcblx0XHRcdFx0dGhpcy5yYXdbdGhpcy5nZW5lcmF0ZWRDb2RlTGluZV0gPSB0aGlzLnJhd1NlZ21lbnRzID0gW107XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdFx0XHRcdGZpcnN0ID0gdHJ1ZTtcblx0XHRcdFx0Y2hhckluSGlyZXNCb3VuZGFyeSA9IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHRoaXMuaGlyZXMgfHwgZmlyc3QgfHwgc291cmNlbWFwTG9jYXRpb25zLmhhcyhvcmlnaW5hbENoYXJJbmRleCkpIHtcblx0XHRcdFx0XHRjb25zdCBzZWdtZW50ID0gW3RoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiwgc291cmNlSW5kZXgsIGxvYy5saW5lLCBsb2MuY29sdW1uXTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmhpcmVzID09PSAnYm91bmRhcnknKSB7XG5cdFx0XHRcdFx0XHQvLyBpbiBoaXJlcyBcImJvdW5kYXJ5XCIsIGdyb3VwIHNlZ21lbnRzIHBlciB3b3JkIGJvdW5kYXJ5IHRoYW4gcGVyIGNoYXJcblx0XHRcdFx0XHRcdGlmICh3b3JkUmVnZXgudGVzdChvcmlnaW5hbFtvcmlnaW5hbENoYXJJbmRleF0pKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGZvciBmaXJzdCBjaGFyIGluIHRoZSBib3VuZGFyeSBmb3VuZCwgc3RhcnQgdGhlIGJvdW5kYXJ5IGJ5IHB1c2hpbmcgYSBzZWdtZW50XG5cdFx0XHRcdFx0XHRcdGlmICghY2hhckluSGlyZXNCb3VuZGFyeSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucmF3U2VnbWVudHMucHVzaChzZWdtZW50KTtcblx0XHRcdFx0XHRcdFx0XHRjaGFySW5IaXJlc0JvdW5kYXJ5ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIG5vbi13b3JkIGNoYXIsIGVuZCB0aGUgYm91bmRhcnkgYnkgcHVzaGluZyBhIHNlZ21lbnRcblx0XHRcdFx0XHRcdFx0dGhpcy5yYXdTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXHRcdFx0XHRcdFx0XHRjaGFySW5IaXJlc0JvdW5kYXJ5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMucmF3U2VnbWVudHMucHVzaChzZWdtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsb2MuY29sdW1uICs9IDE7XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiArPSAxO1xuXHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRvcmlnaW5hbENoYXJJbmRleCArPSAxO1xuXHRcdH1cblxuXHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdH1cblxuXHRhZHZhbmNlKHN0cikge1xuXHRcdGlmICghc3RyKSByZXR1cm47XG5cblx0XHRjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgnXFxuJyk7XG5cblx0XHRpZiAobGluZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0dGhpcy5nZW5lcmF0ZWRDb2RlTGluZSsrO1xuXHRcdFx0XHR0aGlzLnJhd1t0aGlzLmdlbmVyYXRlZENvZGVMaW5lXSA9IHRoaXMucmF3U2VnbWVudHMgPSBbXTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uICs9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aDtcblx0fVxufVxuXG5jb25zdCBuID0gJ1xcbic7XG5cbmNvbnN0IHdhcm5lZCA9IHtcblx0aW5zZXJ0TGVmdDogZmFsc2UsXG5cdGluc2VydFJpZ2h0OiBmYWxzZSxcblx0c3RvcmVOYW1lOiBmYWxzZSxcbn07XG5cbmNsYXNzIE1hZ2ljU3RyaW5nIHtcblx0Y29uc3RydWN0b3Ioc3RyaW5nLCBvcHRpb25zID0ge30pIHtcblx0XHRjb25zdCBjaHVuayA9IG5ldyBDaHVuaygwLCBzdHJpbmcubGVuZ3RoLCBzdHJpbmcpO1xuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuXHRcdFx0b3JpZ2luYWw6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBzdHJpbmcgfSxcblx0XHRcdG91dHJvOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogJycgfSxcblx0XHRcdGludHJvOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogJycgfSxcblx0XHRcdGZpcnN0Q2h1bms6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBjaHVuayB9LFxuXHRcdFx0bGFzdENodW5rOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSxcblx0XHRcdGxhc3RTZWFyY2hlZENodW5rOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSxcblx0XHRcdGJ5U3RhcnQ6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LFxuXHRcdFx0YnlFbmQ6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LFxuXHRcdFx0ZmlsZW5hbWU6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmZpbGVuYW1lIH0sXG5cdFx0XHRpbmRlbnRFeGNsdXNpb25SYW5nZXM6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmluZGVudEV4Y2x1c2lvblJhbmdlcyB9LFxuXHRcdFx0c291cmNlbWFwTG9jYXRpb25zOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEJpdFNldCgpIH0sXG5cdFx0XHRzdG9yZWROYW1lczogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0sXG5cdFx0XHRpbmRlbnRTdHI6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSxcblx0XHRcdGlnbm9yZUxpc3Q6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmlnbm9yZUxpc3QgfSxcblx0XHRcdG9mZnNldDogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9wdGlvbnMub2Zmc2V0IHx8IDAgfSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYnlTdGFydFswXSA9IGNodW5rO1xuXHRcdHRoaXMuYnlFbmRbc3RyaW5nLmxlbmd0aF0gPSBjaHVuaztcblx0fVxuXG5cdGFkZFNvdXJjZW1hcExvY2F0aW9uKGNoYXIpIHtcblx0XHR0aGlzLnNvdXJjZW1hcExvY2F0aW9ucy5hZGQoY2hhcik7XG5cdH1cblxuXHRhcHBlbmQoY29udGVudCkge1xuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHJvIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0dGhpcy5vdXRybyArPSBjb250ZW50O1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0YXBwZW5kTGVmdChpbmRleCwgY29udGVudCkge1xuXHRcdGluZGV4ID0gaW5kZXggKyB0aGlzLm9mZnNldDtcblxuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luc2VydGVkIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0dGhpcy5fc3BsaXQoaW5kZXgpO1xuXG5cdFx0Y29uc3QgY2h1bmsgPSB0aGlzLmJ5RW5kW2luZGV4XTtcblxuXHRcdGlmIChjaHVuaykge1xuXHRcdFx0Y2h1bmsuYXBwZW5kTGVmdChjb250ZW50KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5pbnRybyArPSBjb250ZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGFwcGVuZFJpZ2h0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aW5kZXggPSBpbmRleCArIHRoaXMub2Zmc2V0O1xuXG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0XHRjb25zdCBjaHVuayA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cblx0XHRpZiAoY2h1bmspIHtcblx0XHRcdGNodW5rLmFwcGVuZFJpZ2h0KGNvbnRlbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm91dHJvICs9IGNvbnRlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Y2xvbmUoKSB7XG5cdFx0Y29uc3QgY2xvbmVkID0gbmV3IE1hZ2ljU3RyaW5nKHRoaXMub3JpZ2luYWwsIHsgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsIG9mZnNldDogdGhpcy5vZmZzZXQgfSk7XG5cblx0XHRsZXQgb3JpZ2luYWxDaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0XHRsZXQgY2xvbmVkQ2h1bmsgPSAoY2xvbmVkLmZpcnN0Q2h1bmsgPSBjbG9uZWQubGFzdFNlYXJjaGVkQ2h1bmsgPSBvcmlnaW5hbENodW5rLmNsb25lKCkpO1xuXG5cdFx0d2hpbGUgKG9yaWdpbmFsQ2h1bmspIHtcblx0XHRcdGNsb25lZC5ieVN0YXJ0W2Nsb25lZENodW5rLnN0YXJ0XSA9IGNsb25lZENodW5rO1xuXHRcdFx0Y2xvbmVkLmJ5RW5kW2Nsb25lZENodW5rLmVuZF0gPSBjbG9uZWRDaHVuaztcblxuXHRcdFx0Y29uc3QgbmV4dE9yaWdpbmFsQ2h1bmsgPSBvcmlnaW5hbENodW5rLm5leHQ7XG5cdFx0XHRjb25zdCBuZXh0Q2xvbmVkQ2h1bmsgPSBuZXh0T3JpZ2luYWxDaHVuayAmJiBuZXh0T3JpZ2luYWxDaHVuay5jbG9uZSgpO1xuXG5cdFx0XHRpZiAobmV4dENsb25lZENodW5rKSB7XG5cdFx0XHRcdGNsb25lZENodW5rLm5leHQgPSBuZXh0Q2xvbmVkQ2h1bms7XG5cdFx0XHRcdG5leHRDbG9uZWRDaHVuay5wcmV2aW91cyA9IGNsb25lZENodW5rO1xuXG5cdFx0XHRcdGNsb25lZENodW5rID0gbmV4dENsb25lZENodW5rO1xuXHRcdFx0fVxuXG5cdFx0XHRvcmlnaW5hbENodW5rID0gbmV4dE9yaWdpbmFsQ2h1bms7XG5cdFx0fVxuXG5cdFx0Y2xvbmVkLmxhc3RDaHVuayA9IGNsb25lZENodW5rO1xuXG5cdFx0aWYgKHRoaXMuaW5kZW50RXhjbHVzaW9uUmFuZ2VzKSB7XG5cdFx0XHRjbG9uZWQuaW5kZW50RXhjbHVzaW9uUmFuZ2VzID0gdGhpcy5pbmRlbnRFeGNsdXNpb25SYW5nZXMuc2xpY2UoKTtcblx0XHR9XG5cblx0XHRjbG9uZWQuc291cmNlbWFwTG9jYXRpb25zID0gbmV3IEJpdFNldCh0aGlzLnNvdXJjZW1hcExvY2F0aW9ucyk7XG5cblx0XHRjbG9uZWQuaW50cm8gPSB0aGlzLmludHJvO1xuXHRcdGNsb25lZC5vdXRybyA9IHRoaXMub3V0cm87XG5cblx0XHRyZXR1cm4gY2xvbmVkO1xuXHR9XG5cblx0Z2VuZXJhdGVEZWNvZGVkTWFwKG9wdGlvbnMpIHtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdGNvbnN0IHNvdXJjZUluZGV4ID0gMDtcblx0XHRjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuc3RvcmVkTmFtZXMpO1xuXHRcdGNvbnN0IG1hcHBpbmdzID0gbmV3IE1hcHBpbmdzKG9wdGlvbnMuaGlyZXMpO1xuXG5cdFx0Y29uc3QgbG9jYXRlID0gZ2V0TG9jYXRvcih0aGlzLm9yaWdpbmFsKTtcblxuXHRcdGlmICh0aGlzLmludHJvKSB7XG5cdFx0XHRtYXBwaW5ncy5hZHZhbmNlKHRoaXMuaW50cm8pO1xuXHRcdH1cblxuXHRcdHRoaXMuZmlyc3RDaHVuay5lYWNoTmV4dCgoY2h1bmspID0+IHtcblx0XHRcdGNvbnN0IGxvYyA9IGxvY2F0ZShjaHVuay5zdGFydCk7XG5cblx0XHRcdGlmIChjaHVuay5pbnRyby5sZW5ndGgpIG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsuaW50cm8pO1xuXG5cdFx0XHRpZiAoY2h1bmsuZWRpdGVkKSB7XG5cdFx0XHRcdG1hcHBpbmdzLmFkZEVkaXQoXG5cdFx0XHRcdFx0c291cmNlSW5kZXgsXG5cdFx0XHRcdFx0Y2h1bmsuY29udGVudCxcblx0XHRcdFx0XHRsb2MsXG5cdFx0XHRcdFx0Y2h1bmsuc3RvcmVOYW1lID8gbmFtZXMuaW5kZXhPZihjaHVuay5vcmlnaW5hbCkgOiAtMSxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hcHBpbmdzLmFkZFVuZWRpdGVkQ2h1bmsoc291cmNlSW5kZXgsIGNodW5rLCB0aGlzLm9yaWdpbmFsLCBsb2MsIHRoaXMuc291cmNlbWFwTG9jYXRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNodW5rLm91dHJvLmxlbmd0aCkgbWFwcGluZ3MuYWR2YW5jZShjaHVuay5vdXRybyk7XG5cdFx0fSk7XG5cblx0XHRpZiAodGhpcy5vdXRybykge1xuXHRcdFx0bWFwcGluZ3MuYWR2YW5jZSh0aGlzLm91dHJvKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmlsZTogb3B0aW9ucy5maWxlID8gb3B0aW9ucy5maWxlLnNwbGl0KC9bL1xcXFxdLykucG9wKCkgOiB1bmRlZmluZWQsXG5cdFx0XHRzb3VyY2VzOiBbXG5cdFx0XHRcdG9wdGlvbnMuc291cmNlID8gZ2V0UmVsYXRpdmVQYXRoKG9wdGlvbnMuZmlsZSB8fCAnJywgb3B0aW9ucy5zb3VyY2UpIDogb3B0aW9ucy5maWxlIHx8ICcnLFxuXHRcdFx0XSxcblx0XHRcdHNvdXJjZXNDb250ZW50OiBvcHRpb25zLmluY2x1ZGVDb250ZW50ID8gW3RoaXMub3JpZ2luYWxdIDogdW5kZWZpbmVkLFxuXHRcdFx0bmFtZXMsXG5cdFx0XHRtYXBwaW5nczogbWFwcGluZ3MucmF3LFxuXHRcdFx0eF9nb29nbGVfaWdub3JlTGlzdDogdGhpcy5pZ25vcmVMaXN0ID8gW3NvdXJjZUluZGV4XSA6IHVuZGVmaW5lZCxcblx0XHR9O1xuXHR9XG5cblx0Z2VuZXJhdGVNYXAob3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgU291cmNlTWFwKHRoaXMuZ2VuZXJhdGVEZWNvZGVkTWFwKG9wdGlvbnMpKTtcblx0fVxuXG5cdF9lbnN1cmVpbmRlbnRTdHIoKSB7XG5cdFx0aWYgKHRoaXMuaW5kZW50U3RyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaW5kZW50U3RyID0gZ3Vlc3NJbmRlbnQodGhpcy5vcmlnaW5hbCk7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJhd0luZGVudFN0cmluZygpIHtcblx0XHR0aGlzLl9lbnN1cmVpbmRlbnRTdHIoKTtcblx0XHRyZXR1cm4gdGhpcy5pbmRlbnRTdHI7XG5cdH1cblxuXHRnZXRJbmRlbnRTdHJpbmcoKSB7XG5cdFx0dGhpcy5fZW5zdXJlaW5kZW50U3RyKCk7XG5cdFx0cmV0dXJuIHRoaXMuaW5kZW50U3RyID09PSBudWxsID8gJ1xcdCcgOiB0aGlzLmluZGVudFN0cjtcblx0fVxuXG5cdGluZGVudChpbmRlbnRTdHIsIG9wdGlvbnMpIHtcblx0XHRjb25zdCBwYXR0ZXJuID0gL15bXlxcclxcbl0vZ207XG5cblx0XHRpZiAoaXNPYmplY3QoaW5kZW50U3RyKSkge1xuXHRcdFx0b3B0aW9ucyA9IGluZGVudFN0cjtcblx0XHRcdGluZGVudFN0ciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoaW5kZW50U3RyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX2Vuc3VyZWluZGVudFN0cigpO1xuXHRcdFx0aW5kZW50U3RyID0gdGhpcy5pbmRlbnRTdHIgfHwgJ1xcdCc7XG5cdFx0fVxuXG5cdFx0aWYgKGluZGVudFN0ciA9PT0gJycpIHJldHVybiB0aGlzOyAvLyBub29wXG5cblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdC8vIFByb2Nlc3MgZXhjbHVzaW9uIHJhbmdlc1xuXHRcdGNvbnN0IGlzRXhjbHVkZWQgPSB7fTtcblxuXHRcdGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcblx0XHRcdGNvbnN0IGV4Y2x1c2lvbnMgPVxuXHRcdFx0XHR0eXBlb2Ygb3B0aW9ucy5leGNsdWRlWzBdID09PSAnbnVtYmVyJyA/IFtvcHRpb25zLmV4Y2x1ZGVdIDogb3B0aW9ucy5leGNsdWRlO1xuXHRcdFx0ZXhjbHVzaW9ucy5mb3JFYWNoKChleGNsdXNpb24pID0+IHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IGV4Y2x1c2lvblswXTsgaSA8IGV4Y2x1c2lvblsxXTsgaSArPSAxKSB7XG5cdFx0XHRcdFx0aXNFeGNsdWRlZFtpXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGxldCBzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyID0gb3B0aW9ucy5pbmRlbnRTdGFydCAhPT0gZmFsc2U7XG5cdFx0Y29uc3QgcmVwbGFjZXIgPSAobWF0Y2gpID0+IHtcblx0XHRcdGlmIChzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyKSByZXR1cm4gYCR7aW5kZW50U3RyfSR7bWF0Y2h9YDtcblx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH07XG5cblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VyKTtcblxuXHRcdGxldCBjaGFySW5kZXggPSAwO1xuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblxuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0Y29uc3QgZW5kID0gY2h1bmsuZW5kO1xuXG5cdFx0XHRpZiAoY2h1bmsuZWRpdGVkKSB7XG5cdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0Y2h1bmsuY29udGVudCA9IGNodW5rLmNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7XG5cblx0XHRcdFx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSBjaHVuay5jb250ZW50W2NodW5rLmNvbnRlbnQubGVuZ3RoIC0gMV0gPT09ICdcXG4nO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2hhckluZGV4ID0gY2h1bmsuc3RhcnQ7XG5cblx0XHRcdFx0d2hpbGUgKGNoYXJJbmRleCA8IGVuZCkge1xuXHRcdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGFyID0gdGhpcy5vcmlnaW5hbFtjaGFySW5kZXhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoY2hhciA9PT0gJ1xcbicpIHtcblx0XHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGNoYXIgIT09ICdcXHInICYmIHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIpIHtcblx0XHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjaGFySW5kZXggPT09IGNodW5rLnN0YXJ0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3BsaXRDaHVuayhjaHVuaywgY2hhckluZGV4KTtcblx0XHRcdFx0XHRcdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaGFySW5kZXggKz0gMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjaGFySW5kZXggPSBjaHVuay5lbmQ7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGluc2VydCgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHQnbWFnaWNTdHJpbmcuaW5zZXJ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIHByZXBlbmRSaWdodCguLi4pIG9yIGFwcGVuZExlZnQoLi4uKScsXG5cdFx0KTtcblx0fVxuXG5cdGluc2VydExlZnQoaW5kZXgsIGNvbnRlbnQpIHtcblx0XHRpZiAoIXdhcm5lZC5pbnNlcnRMZWZ0KSB7XG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdtYWdpY1N0cmluZy5pbnNlcnRMZWZ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoLi4uKSBpbnN0ZWFkJyxcblx0XHRcdCk7XG5cdFx0XHR3YXJuZWQuaW5zZXJ0TGVmdCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBwZW5kTGVmdChpbmRleCwgY29udGVudCk7XG5cdH1cblxuXHRpbnNlcnRSaWdodChpbmRleCwgY29udGVudCkge1xuXHRcdGlmICghd2FybmVkLmluc2VydFJpZ2h0KSB7XG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdtYWdpY1N0cmluZy5pbnNlcnRSaWdodCguLi4pIGlzIGRlcHJlY2F0ZWQuIFVzZSBtYWdpY1N0cmluZy5wcmVwZW5kUmlnaHQoLi4uKSBpbnN0ZWFkJyxcblx0XHRcdCk7XG5cdFx0XHR3YXJuZWQuaW5zZXJ0UmlnaHQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByZXBlbmRSaWdodChpbmRleCwgY29udGVudCk7XG5cdH1cblxuXHRtb3ZlKHN0YXJ0LCBlbmQsIGluZGV4KSB7XG5cdFx0c3RhcnQgPSBzdGFydCArIHRoaXMub2Zmc2V0O1xuXHRcdGVuZCA9IGVuZCArIHRoaXMub2Zmc2V0O1xuXHRcdGluZGV4ID0gaW5kZXggKyB0aGlzLm9mZnNldDtcblxuXHRcdGlmIChpbmRleCA+PSBzdGFydCAmJiBpbmRleCA8PSBlbmQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1vdmUgYSBzZWxlY3Rpb24gaW5zaWRlIGl0c2VsZicpO1xuXG5cdFx0dGhpcy5fc3BsaXQoc3RhcnQpO1xuXHRcdHRoaXMuX3NwbGl0KGVuZCk7XG5cdFx0dGhpcy5fc3BsaXQoaW5kZXgpO1xuXG5cdFx0Y29uc3QgZmlyc3QgPSB0aGlzLmJ5U3RhcnRbc3RhcnRdO1xuXHRcdGNvbnN0IGxhc3QgPSB0aGlzLmJ5RW5kW2VuZF07XG5cblx0XHRjb25zdCBvbGRMZWZ0ID0gZmlyc3QucHJldmlvdXM7XG5cdFx0Y29uc3Qgb2xkUmlnaHQgPSBsYXN0Lm5leHQ7XG5cblx0XHRjb25zdCBuZXdSaWdodCA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cdFx0aWYgKCFuZXdSaWdodCAmJiBsYXN0ID09PSB0aGlzLmxhc3RDaHVuaykgcmV0dXJuIHRoaXM7XG5cdFx0Y29uc3QgbmV3TGVmdCA9IG5ld1JpZ2h0ID8gbmV3UmlnaHQucHJldmlvdXMgOiB0aGlzLmxhc3RDaHVuaztcblxuXHRcdGlmIChvbGRMZWZ0KSBvbGRMZWZ0Lm5leHQgPSBvbGRSaWdodDtcblx0XHRpZiAob2xkUmlnaHQpIG9sZFJpZ2h0LnByZXZpb3VzID0gb2xkTGVmdDtcblxuXHRcdGlmIChuZXdMZWZ0KSBuZXdMZWZ0Lm5leHQgPSBmaXJzdDtcblx0XHRpZiAobmV3UmlnaHQpIG5ld1JpZ2h0LnByZXZpb3VzID0gbGFzdDtcblxuXHRcdGlmICghZmlyc3QucHJldmlvdXMpIHRoaXMuZmlyc3RDaHVuayA9IGxhc3QubmV4dDtcblx0XHRpZiAoIWxhc3QubmV4dCkge1xuXHRcdFx0dGhpcy5sYXN0Q2h1bmsgPSBmaXJzdC5wcmV2aW91cztcblx0XHRcdHRoaXMubGFzdENodW5rLm5leHQgPSBudWxsO1xuXHRcdH1cblxuXHRcdGZpcnN0LnByZXZpb3VzID0gbmV3TGVmdDtcblx0XHRsYXN0Lm5leHQgPSBuZXdSaWdodCB8fCBudWxsO1xuXG5cdFx0aWYgKCFuZXdMZWZ0KSB0aGlzLmZpcnN0Q2h1bmsgPSBmaXJzdDtcblx0XHRpZiAoIW5ld1JpZ2h0KSB0aGlzLmxhc3RDaHVuayA9IGxhc3Q7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRvdmVyd3JpdGUoc3RhcnQsIGVuZCwgY29udGVudCwgb3B0aW9ucykge1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdHJldHVybiB0aGlzLnVwZGF0ZShzdGFydCwgZW5kLCBjb250ZW50LCB7IC4uLm9wdGlvbnMsIG92ZXJ3cml0ZTogIW9wdGlvbnMuY29udGVudE9ubHkgfSk7XG5cdH1cblxuXHR1cGRhdGUoc3RhcnQsIGVuZCwgY29udGVudCwgb3B0aW9ucykge1xuXHRcdHN0YXJ0ID0gc3RhcnQgKyB0aGlzLm9mZnNldDtcblx0XHRlbmQgPSBlbmQgKyB0aGlzLm9mZnNldDtcblxuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcGxhY2VtZW50IGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0aWYgKHRoaXMub3JpZ2luYWwubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHR3aGlsZSAoc3RhcnQgPCAwKSBzdGFydCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDtcblx0XHRcdHdoaWxlIChlbmQgPCAwKSBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0aWYgKGVuZCA+IHRoaXMub3JpZ2luYWwubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZCBpcyBvdXQgb2YgYm91bmRzJyk7XG5cdFx0aWYgKHN0YXJ0ID09PSBlbmQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdCdDYW5ub3Qgb3ZlcndyaXRlIGEgemVyby1sZW5ndGggcmFuZ2Ug4oCTIHVzZSBhcHBlbmRMZWZ0IG9yIHByZXBlbmRSaWdodCBpbnN0ZWFkJyxcblx0XHRcdCk7XG5cblx0XHR0aGlzLl9zcGxpdChzdGFydCk7XG5cdFx0dGhpcy5fc3BsaXQoZW5kKTtcblxuXHRcdGlmIChvcHRpb25zID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoIXdhcm5lZC5zdG9yZU5hbWUpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdCdUaGUgZmluYWwgYXJndW1lbnQgdG8gbWFnaWNTdHJpbmcub3ZlcndyaXRlKC4uLikgc2hvdWxkIGJlIGFuIG9wdGlvbnMgb2JqZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JpY2gtaGFycmlzL21hZ2ljLXN0cmluZycsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHdhcm5lZC5zdG9yZU5hbWUgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRvcHRpb25zID0geyBzdG9yZU5hbWU6IHRydWUgfTtcblx0XHR9XG5cdFx0Y29uc3Qgc3RvcmVOYW1lID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdG9yZU5hbWUgOiBmYWxzZTtcblx0XHRjb25zdCBvdmVyd3JpdGUgPSBvcHRpb25zICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm92ZXJ3cml0ZSA6IGZhbHNlO1xuXG5cdFx0aWYgKHN0b3JlTmFtZSkge1xuXHRcdFx0Y29uc3Qgb3JpZ2luYWwgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuc3RvcmVkTmFtZXMsIG9yaWdpbmFsLCB7XG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHR2YWx1ZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpcnN0ID0gdGhpcy5ieVN0YXJ0W3N0YXJ0XTtcblx0XHRjb25zdCBsYXN0ID0gdGhpcy5ieUVuZFtlbmRdO1xuXG5cdFx0aWYgKGZpcnN0KSB7XG5cdFx0XHRsZXQgY2h1bmsgPSBmaXJzdDtcblx0XHRcdHdoaWxlIChjaHVuayAhPT0gbGFzdCkge1xuXHRcdFx0XHRpZiAoY2h1bmsubmV4dCAhPT0gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBvdmVyd3JpdGUgYWNyb3NzIGEgc3BsaXQgcG9pbnQnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHRcdGNodW5rLmVkaXQoJycsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0Zmlyc3QuZWRpdChjb250ZW50LCBzdG9yZU5hbWUsICFvdmVyd3JpdGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBtdXN0IGJlIGluc2VydGluZyBhdCB0aGUgZW5kXG5cdFx0XHRjb25zdCBuZXdDaHVuayA9IG5ldyBDaHVuayhzdGFydCwgZW5kLCAnJykuZWRpdChjb250ZW50LCBzdG9yZU5hbWUpO1xuXG5cdFx0XHQvLyBUT0RPIGxhc3QgY2h1bmsgaW4gdGhlIGFycmF5IG1heSBub3QgYmUgdGhlIGxhc3QgY2h1bmssIGlmIGl0J3MgbW92ZWQuLi5cblx0XHRcdGxhc3QubmV4dCA9IG5ld0NodW5rO1xuXHRcdFx0bmV3Q2h1bmsucHJldmlvdXMgPSBsYXN0O1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByZXBlbmQoY29udGVudCkge1xuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHJvIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0dGhpcy5pbnRybyA9IGNvbnRlbnQgKyB0aGlzLmludHJvO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJlcGVuZExlZnQoaW5kZXgsIGNvbnRlbnQpIHtcblx0XHRpbmRleCA9IGluZGV4ICsgdGhpcy5vZmZzZXQ7XG5cblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcblxuXHRcdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHRcdGNvbnN0IGNodW5rID0gdGhpcy5ieUVuZFtpbmRleF07XG5cblx0XHRpZiAoY2h1bmspIHtcblx0XHRcdGNodW5rLnByZXBlbmRMZWZ0KGNvbnRlbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmludHJvID0gY29udGVudCArIHRoaXMuaW50cm87XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJlcGVuZFJpZ2h0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aW5kZXggPSBpbmRleCArIHRoaXMub2Zmc2V0O1xuXG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0XHRjb25zdCBjaHVuayA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cblx0XHRpZiAoY2h1bmspIHtcblx0XHRcdGNodW5rLnByZXBlbmRSaWdodChjb250ZW50KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vdXRybyA9IGNvbnRlbnQgKyB0aGlzLm91dHJvO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHJlbW92ZShzdGFydCwgZW5kKSB7XG5cdFx0c3RhcnQgPSBzdGFydCArIHRoaXMub2Zmc2V0O1xuXHRcdGVuZCA9IGVuZCArIHRoaXMub2Zmc2V0O1xuXG5cdFx0aWYgKHRoaXMub3JpZ2luYWwubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHR3aGlsZSAoc3RhcnQgPCAwKSBzdGFydCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDtcblx0XHRcdHdoaWxlIChlbmQgPCAwKSBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0aWYgKHN0YXJ0ID09PSBlbmQpIHJldHVybiB0aGlzO1xuXG5cdFx0aWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0aGlzLm9yaWdpbmFsLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDaGFyYWN0ZXIgaXMgb3V0IG9mIGJvdW5kcycpO1xuXHRcdGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IEVycm9yKCdlbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQnKTtcblxuXHRcdHRoaXMuX3NwbGl0KHN0YXJ0KTtcblx0XHR0aGlzLl9zcGxpdChlbmQpO1xuXG5cdFx0bGV0IGNodW5rID0gdGhpcy5ieVN0YXJ0W3N0YXJ0XTtcblxuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0Y2h1bmsuaW50cm8gPSAnJztcblx0XHRcdGNodW5rLm91dHJvID0gJyc7XG5cdFx0XHRjaHVuay5lZGl0KCcnKTtcblxuXHRcdFx0Y2h1bmsgPSBlbmQgPiBjaHVuay5lbmQgPyB0aGlzLmJ5U3RhcnRbY2h1bmsuZW5kXSA6IG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cmVzZXQoc3RhcnQsIGVuZCkge1xuXHRcdHN0YXJ0ID0gc3RhcnQgKyB0aGlzLm9mZnNldDtcblx0XHRlbmQgPSBlbmQgKyB0aGlzLm9mZnNldDtcblxuXHRcdGlmICh0aGlzLm9yaWdpbmFsLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0d2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoZW5kIDwgMCkgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm4gdGhpcztcblxuXHRcdGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGhpcy5vcmlnaW5hbC5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2hhcmFjdGVyIGlzIG91dCBvZiBib3VuZHMnKTtcblx0XHRpZiAoc3RhcnQgPiBlbmQpIHRocm93IG5ldyBFcnJvcignZW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YXJ0Jyk7XG5cblx0XHR0aGlzLl9zcGxpdChzdGFydCk7XG5cdFx0dGhpcy5fc3BsaXQoZW5kKTtcblxuXHRcdGxldCBjaHVuayA9IHRoaXMuYnlTdGFydFtzdGFydF07XG5cblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGNodW5rLnJlc2V0KCk7XG5cblx0XHRcdGNodW5rID0gZW5kID4gY2h1bmsuZW5kID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGxhc3RDaGFyKCkge1xuXHRcdGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRoaXMub3V0cm9bdGhpcy5vdXRyby5sZW5ndGggLSAxXTtcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmxhc3RDaHVuaztcblx0XHRkbyB7XG5cdFx0XHRpZiAoY2h1bmsub3V0cm8ubGVuZ3RoKSByZXR1cm4gY2h1bmsub3V0cm9bY2h1bmsub3V0cm8ubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGgpIHJldHVybiBjaHVuay5jb250ZW50W2NodW5rLmNvbnRlbnQubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoY2h1bmsuaW50cm8ubGVuZ3RoKSByZXR1cm4gY2h1bmsuaW50cm9bY2h1bmsuaW50cm8ubGVuZ3RoIC0gMV07XG5cdFx0fSB3aGlsZSAoKGNodW5rID0gY2h1bmsucHJldmlvdXMpKTtcblx0XHRpZiAodGhpcy5pbnRyby5sZW5ndGgpIHJldHVybiB0aGlzLmludHJvW3RoaXMuaW50cm8ubGVuZ3RoIC0gMV07XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0bGFzdExpbmUoKSB7XG5cdFx0bGV0IGxpbmVJbmRleCA9IHRoaXMub3V0cm8ubGFzdEluZGV4T2Yobik7XG5cdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiB0aGlzLm91dHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKTtcblx0XHRsZXQgbGluZVN0ciA9IHRoaXMub3V0cm87XG5cdFx0bGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7XG5cdFx0ZG8ge1xuXHRcdFx0aWYgKGNodW5rLm91dHJvLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZUluZGV4ID0gY2h1bmsub3V0cm8ubGFzdEluZGV4T2Yobik7XG5cdFx0XHRcdGlmIChsaW5lSW5kZXggIT09IC0xKSByZXR1cm4gY2h1bmsub3V0cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjtcblx0XHRcdFx0bGluZVN0ciA9IGNodW5rLm91dHJvICsgbGluZVN0cjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNodW5rLmNvbnRlbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lSW5kZXggPSBjaHVuay5jb250ZW50Lmxhc3RJbmRleE9mKG4pO1xuXHRcdFx0XHRpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIGNodW5rLmNvbnRlbnQuc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjtcblx0XHRcdFx0bGluZVN0ciA9IGNodW5rLmNvbnRlbnQgKyBsaW5lU3RyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2h1bmsuaW50cm8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lSW5kZXggPSBjaHVuay5pbnRyby5sYXN0SW5kZXhPZihuKTtcblx0XHRcdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiBjaHVuay5pbnRyby5zdWJzdHIobGluZUluZGV4ICsgMSkgKyBsaW5lU3RyO1xuXHRcdFx0XHRsaW5lU3RyID0gY2h1bmsuaW50cm8gKyBsaW5lU3RyO1xuXHRcdFx0fVxuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLnByZXZpb3VzKSk7XG5cdFx0bGluZUluZGV4ID0gdGhpcy5pbnRyby5sYXN0SW5kZXhPZihuKTtcblx0XHRpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIHRoaXMuaW50cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjtcblx0XHRyZXR1cm4gdGhpcy5pbnRybyArIGxpbmVTdHI7XG5cdH1cblxuXHRzbGljZShzdGFydCA9IDAsIGVuZCA9IHRoaXMub3JpZ2luYWwubGVuZ3RoIC0gdGhpcy5vZmZzZXQpIHtcblx0XHRzdGFydCA9IHN0YXJ0ICsgdGhpcy5vZmZzZXQ7XG5cdFx0ZW5kID0gZW5kICsgdGhpcy5vZmZzZXQ7XG5cblx0XHRpZiAodGhpcy5vcmlnaW5hbC5sZW5ndGggIT09IDApIHtcblx0XHRcdHdoaWxlIChzdGFydCA8IDApIHN0YXJ0ICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGVuZCA8IDApIGVuZCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cblx0XHQvLyBmaW5kIHN0YXJ0IGNodW5rXG5cdFx0bGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rO1xuXHRcdHdoaWxlIChjaHVuayAmJiAoY2h1bmsuc3RhcnQgPiBzdGFydCB8fCBjaHVuay5lbmQgPD0gc3RhcnQpKSB7XG5cdFx0XHQvLyBmb3VuZCBlbmQgY2h1bmsgYmVmb3JlIHN0YXJ0XG5cdFx0XHRpZiAoY2h1bmsuc3RhcnQgPCBlbmQgJiYgY2h1bmsuZW5kID49IGVuZCkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0aWYgKGNodW5rICYmIGNodW5rLmVkaXRlZCAmJiBjaHVuay5zdGFydCAhPT0gc3RhcnQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgcmVwbGFjZWQgY2hhcmFjdGVyICR7c3RhcnR9IGFzIHNsaWNlIHN0YXJ0IGFuY2hvci5gKTtcblxuXHRcdGNvbnN0IHN0YXJ0Q2h1bmsgPSBjaHVuaztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGlmIChjaHVuay5pbnRybyAmJiAoc3RhcnRDaHVuayAhPT0gY2h1bmsgfHwgY2h1bmsuc3RhcnQgPT09IHN0YXJ0KSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gY2h1bmsuaW50cm87XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNvbnRhaW5zRW5kID0gY2h1bmsuc3RhcnQgPCBlbmQgJiYgY2h1bmsuZW5kID49IGVuZDtcblx0XHRcdGlmIChjb250YWluc0VuZCAmJiBjaHVuay5lZGl0ZWQgJiYgY2h1bmsuZW5kICE9PSBlbmQpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSByZXBsYWNlZCBjaGFyYWN0ZXIgJHtlbmR9IGFzIHNsaWNlIGVuZCBhbmNob3IuYCk7XG5cblx0XHRcdGNvbnN0IHNsaWNlU3RhcnQgPSBzdGFydENodW5rID09PSBjaHVuayA/IHN0YXJ0IC0gY2h1bmsuc3RhcnQgOiAwO1xuXHRcdFx0Y29uc3Qgc2xpY2VFbmQgPSBjb250YWluc0VuZCA/IGNodW5rLmNvbnRlbnQubGVuZ3RoICsgZW5kIC0gY2h1bmsuZW5kIDogY2h1bmsuY29udGVudC5sZW5ndGg7XG5cblx0XHRcdHJlc3VsdCArPSBjaHVuay5jb250ZW50LnNsaWNlKHNsaWNlU3RhcnQsIHNsaWNlRW5kKTtcblxuXHRcdFx0aWYgKGNodW5rLm91dHJvICYmICghY29udGFpbnNFbmQgfHwgY2h1bmsuZW5kID09PSBlbmQpKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBjaHVuay5vdXRybztcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbnRhaW5zRW5kKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vIFRPRE8gZGVwcmVjYXRlIHRoaXM/IG5vdCByZWFsbHkgdmVyeSB1c2VmdWxcblx0c25pcChzdGFydCwgZW5kKSB7XG5cdFx0Y29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XG5cdFx0Y2xvbmUucmVtb3ZlKDAsIHN0YXJ0KTtcblx0XHRjbG9uZS5yZW1vdmUoZW5kLCBjbG9uZS5vcmlnaW5hbC5sZW5ndGgpO1xuXG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0X3NwbGl0KGluZGV4KSB7XG5cdFx0aWYgKHRoaXMuYnlTdGFydFtpbmRleF0gfHwgdGhpcy5ieUVuZFtpbmRleF0pIHJldHVybjtcblxuXHRcdGxldCBjaHVuayA9IHRoaXMubGFzdFNlYXJjaGVkQ2h1bms7XG5cdFx0bGV0IHByZXZpb3VzQ2h1bmsgPSBjaHVuaztcblx0XHRjb25zdCBzZWFyY2hGb3J3YXJkID0gaW5kZXggPiBjaHVuay5lbmQ7XG5cblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGlmIChjaHVuay5jb250YWlucyhpbmRleCkpIHJldHVybiB0aGlzLl9zcGxpdENodW5rKGNodW5rLCBpbmRleCk7XG5cblx0XHRcdGNodW5rID0gc2VhcmNoRm9yd2FyZCA/IHRoaXMuYnlTdGFydFtjaHVuay5lbmRdIDogdGhpcy5ieUVuZFtjaHVuay5zdGFydF07XG5cblx0XHRcdC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCAoZS5nLiB2aWEgZW1wdHkgY2h1bmtzLCB3aGVyZSBzdGFydCA9PT0gZW5kKVxuXHRcdFx0aWYgKGNodW5rID09PSBwcmV2aW91c0NodW5rKSByZXR1cm47XG5cblx0XHRcdHByZXZpb3VzQ2h1bmsgPSBjaHVuaztcblx0XHR9XG5cdH1cblxuXHRfc3BsaXRDaHVuayhjaHVuaywgaW5kZXgpIHtcblx0XHRpZiAoY2h1bmsuZWRpdGVkICYmIGNodW5rLmNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHQvLyB6ZXJvLWxlbmd0aCBlZGl0ZWQgY2h1bmtzIGFyZSBhIHNwZWNpYWwgY2FzZSAob3ZlcmxhcHBpbmcgcmVwbGFjZW1lbnRzKVxuXHRcdFx0Y29uc3QgbG9jID0gZ2V0TG9jYXRvcih0aGlzLm9yaWdpbmFsKShpbmRleCk7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBDYW5ub3Qgc3BsaXQgYSBjaHVuayB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZWRpdGVkICgke2xvYy5saW5lfToke2xvYy5jb2x1bW59IOKAkyBcIiR7Y2h1bmsub3JpZ2luYWx9XCIpYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbmV3Q2h1bmsgPSBjaHVuay5zcGxpdChpbmRleCk7XG5cblx0XHR0aGlzLmJ5RW5kW2luZGV4XSA9IGNodW5rO1xuXHRcdHRoaXMuYnlTdGFydFtpbmRleF0gPSBuZXdDaHVuaztcblx0XHR0aGlzLmJ5RW5kW25ld0NodW5rLmVuZF0gPSBuZXdDaHVuaztcblxuXHRcdGlmIChjaHVuayA9PT0gdGhpcy5sYXN0Q2h1bmspIHRoaXMubGFzdENodW5rID0gbmV3Q2h1bms7XG5cblx0XHR0aGlzLmxhc3RTZWFyY2hlZENodW5rID0gY2h1bms7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRsZXQgc3RyID0gdGhpcy5pbnRybztcblxuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdHN0ciArPSBjaHVuay50b1N0cmluZygpO1xuXHRcdFx0Y2h1bmsgPSBjaHVuay5uZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBzdHIgKyB0aGlzLm91dHJvO1xuXHR9XG5cblx0aXNFbXB0eSgpIHtcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdFx0ZG8ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoY2h1bmsuaW50cm8ubGVuZ3RoICYmIGNodW5rLmludHJvLnRyaW0oKSkgfHxcblx0XHRcdFx0KGNodW5rLmNvbnRlbnQubGVuZ3RoICYmIGNodW5rLmNvbnRlbnQudHJpbSgpKSB8fFxuXHRcdFx0XHQoY2h1bmsub3V0cm8ubGVuZ3RoICYmIGNodW5rLm91dHJvLnRyaW0oKSlcblx0XHRcdClcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLm5leHQpKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGxlbmd0aCgpIHtcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdFx0bGV0IGxlbmd0aCA9IDA7XG5cdFx0ZG8ge1xuXHRcdFx0bGVuZ3RoICs9IGNodW5rLmludHJvLmxlbmd0aCArIGNodW5rLmNvbnRlbnQubGVuZ3RoICsgY2h1bmsub3V0cm8ubGVuZ3RoO1xuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLm5leHQpKTtcblx0XHRyZXR1cm4gbGVuZ3RoO1xuXHR9XG5cblx0dHJpbUxpbmVzKCkge1xuXHRcdHJldHVybiB0aGlzLnRyaW0oJ1tcXFxcclxcXFxuXScpO1xuXHR9XG5cblx0dHJpbShjaGFyVHlwZSkge1xuXHRcdHJldHVybiB0aGlzLnRyaW1TdGFydChjaGFyVHlwZSkudHJpbUVuZChjaGFyVHlwZSk7XG5cdH1cblxuXHR0cmltRW5kQWJvcnRlZChjaGFyVHlwZSkge1xuXHRcdGNvbnN0IHJ4ID0gbmV3IFJlZ0V4cCgoY2hhclR5cGUgfHwgJ1xcXFxzJykgKyAnKyQnKTtcblxuXHRcdHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0cnVlO1xuXG5cdFx0bGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7XG5cblx0XHRkbyB7XG5cdFx0XHRjb25zdCBlbmQgPSBjaHVuay5lbmQ7XG5cdFx0XHRjb25zdCBhYm9ydGVkID0gY2h1bmsudHJpbUVuZChyeCk7XG5cblx0XHRcdC8vIGlmIGNodW5rIHdhcyB0cmltbWVkLCB3ZSBoYXZlIGEgbmV3IGxhc3RDaHVua1xuXHRcdFx0aWYgKGNodW5rLmVuZCAhPT0gZW5kKSB7XG5cdFx0XHRcdGlmICh0aGlzLmxhc3RDaHVuayA9PT0gY2h1bmspIHtcblx0XHRcdFx0XHR0aGlzLmxhc3RDaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmJ5RW5kW2NodW5rLmVuZF0gPSBjaHVuaztcblx0XHRcdFx0dGhpcy5ieVN0YXJ0W2NodW5rLm5leHQuc3RhcnRdID0gY2h1bmsubmV4dDtcblx0XHRcdFx0dGhpcy5ieUVuZFtjaHVuay5uZXh0LmVuZF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWJvcnRlZCkgcmV0dXJuIHRydWU7XG5cdFx0XHRjaHVuayA9IGNodW5rLnByZXZpb3VzO1xuXHRcdH0gd2hpbGUgKGNodW5rKTtcblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRyaW1FbmQoY2hhclR5cGUpIHtcblx0XHR0aGlzLnRyaW1FbmRBYm9ydGVkKGNoYXJUeXBlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHR0cmltU3RhcnRBYm9ydGVkKGNoYXJUeXBlKSB7XG5cdFx0Y29uc3QgcnggPSBuZXcgUmVnRXhwKCdeJyArIChjaGFyVHlwZSB8fCAnXFxcXHMnKSArICcrJyk7XG5cblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblxuXHRcdGRvIHtcblx0XHRcdGNvbnN0IGVuZCA9IGNodW5rLmVuZDtcblx0XHRcdGNvbnN0IGFib3J0ZWQgPSBjaHVuay50cmltU3RhcnQocngpO1xuXG5cdFx0XHRpZiAoY2h1bmsuZW5kICE9PSBlbmQpIHtcblx0XHRcdFx0Ly8gc3BlY2lhbCBjYXNlLi4uXG5cdFx0XHRcdGlmIChjaHVuayA9PT0gdGhpcy5sYXN0Q2h1bmspIHRoaXMubGFzdENodW5rID0gY2h1bmsubmV4dDtcblxuXHRcdFx0XHR0aGlzLmJ5RW5kW2NodW5rLmVuZF0gPSBjaHVuaztcblx0XHRcdFx0dGhpcy5ieVN0YXJ0W2NodW5rLm5leHQuc3RhcnRdID0gY2h1bmsubmV4dDtcblx0XHRcdFx0dGhpcy5ieUVuZFtjaHVuay5uZXh0LmVuZF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWJvcnRlZCkgcmV0dXJuIHRydWU7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fSB3aGlsZSAoY2h1bmspO1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dHJpbVN0YXJ0KGNoYXJUeXBlKSB7XG5cdFx0dGhpcy50cmltU3RhcnRBYm9ydGVkKGNoYXJUeXBlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGhhc0NoYW5nZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMub3JpZ2luYWwgIT09IHRoaXMudG9TdHJpbmcoKTtcblx0fVxuXG5cdF9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCkge1xuXHRcdGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50KG1hdGNoLCBzdHIpIHtcblx0XHRcdGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiByZXBsYWNlbWVudC5yZXBsYWNlKC9cXCQoXFwkfCZ8XFxkKykvZywgKF8sIGkpID0+IHtcblx0XHRcdFx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvcmVwbGFjZSNzcGVjaWZ5aW5nX2Ffc3RyaW5nX2FzX2FfcGFyYW1ldGVyXG5cdFx0XHRcdFx0aWYgKGkgPT09ICckJykgcmV0dXJuICckJztcblx0XHRcdFx0XHRpZiAoaSA9PT0gJyYnKSByZXR1cm4gbWF0Y2hbMF07XG5cdFx0XHRcdFx0Y29uc3QgbnVtID0gK2k7XG5cdFx0XHRcdFx0aWYgKG51bSA8IG1hdGNoLmxlbmd0aCkgcmV0dXJuIG1hdGNoWytpXTtcblx0XHRcdFx0XHRyZXR1cm4gYCQke2l9YDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gcmVwbGFjZW1lbnQoLi4ubWF0Y2gsIG1hdGNoLmluZGV4LCBzdHIsIG1hdGNoLmdyb3Vwcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZ1bmN0aW9uIG1hdGNoQWxsKHJlLCBzdHIpIHtcblx0XHRcdGxldCBtYXRjaDtcblx0XHRcdGNvbnN0IG1hdGNoZXMgPSBbXTtcblx0XHRcdHdoaWxlICgobWF0Y2ggPSByZS5leGVjKHN0cikpKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaChtYXRjaCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hlcztcblx0XHR9XG5cdFx0aWYgKHNlYXJjaFZhbHVlLmdsb2JhbCkge1xuXHRcdFx0Y29uc3QgbWF0Y2hlcyA9IG1hdGNoQWxsKHNlYXJjaFZhbHVlLCB0aGlzLm9yaWdpbmFsKTtcblx0XHRcdG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHtcblx0XHRcdFx0aWYgKG1hdGNoLmluZGV4ICE9IG51bGwpIHtcblx0XHRcdFx0XHRjb25zdCByZXBsYWNlbWVudCA9IGdldFJlcGxhY2VtZW50KG1hdGNoLCB0aGlzLm9yaWdpbmFsKTtcblx0XHRcdFx0XHRpZiAocmVwbGFjZW1lbnQgIT09IG1hdGNoWzBdKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm92ZXJ3cml0ZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgsIHJlcGxhY2VtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IHRoaXMub3JpZ2luYWwubWF0Y2goc2VhcmNoVmFsdWUpO1xuXHRcdFx0aWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ICE9IG51bGwpIHtcblx0XHRcdFx0Y29uc3QgcmVwbGFjZW1lbnQgPSBnZXRSZXBsYWNlbWVudChtYXRjaCwgdGhpcy5vcmlnaW5hbCk7XG5cdFx0XHRcdGlmIChyZXBsYWNlbWVudCAhPT0gbWF0Y2hbMF0pIHtcblx0XHRcdFx0XHR0aGlzLm92ZXJ3cml0ZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgsIHJlcGxhY2VtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdF9yZXBsYWNlU3RyaW5nKHN0cmluZywgcmVwbGFjZW1lbnQpIHtcblx0XHRjb25zdCB7IG9yaWdpbmFsIH0gPSB0aGlzO1xuXHRcdGNvbnN0IGluZGV4ID0gb3JpZ2luYWwuaW5kZXhPZihzdHJpbmcpO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0aWYgKHR5cGVvZiByZXBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50KHN0cmluZywgaW5kZXgsIG9yaWdpbmFsKTtcblx0XHRcdH1cblx0XHRcdGlmIChzdHJpbmcgIT09IHJlcGxhY2VtZW50KSB7XG5cdFx0XHRcdHRoaXMub3ZlcndyaXRlKGluZGV4LCBpbmRleCArIHN0cmluZy5sZW5ndGgsIHJlcGxhY2VtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBzZWFyY2hWYWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXBsYWNlU3RyaW5nKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3JlcGxhY2VSZWdleHAoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KTtcblx0fVxuXG5cdF9yZXBsYWNlQWxsU3RyaW5nKHN0cmluZywgcmVwbGFjZW1lbnQpIHtcblx0XHRjb25zdCB7IG9yaWdpbmFsIH0gPSB0aGlzO1xuXHRcdGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cdFx0Zm9yIChcblx0XHRcdGxldCBpbmRleCA9IG9yaWdpbmFsLmluZGV4T2Yoc3RyaW5nKTtcblx0XHRcdGluZGV4ICE9PSAtMTtcblx0XHRcdGluZGV4ID0gb3JpZ2luYWwuaW5kZXhPZihzdHJpbmcsIGluZGV4ICsgc3RyaW5nTGVuZ3RoKVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgcHJldmlvdXMgPSBvcmlnaW5hbC5zbGljZShpbmRleCwgaW5kZXggKyBzdHJpbmdMZW5ndGgpO1xuXHRcdFx0bGV0IF9yZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50O1xuXHRcdFx0aWYgKHR5cGVvZiByZXBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRfcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudChwcmV2aW91cywgaW5kZXgsIG9yaWdpbmFsKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcmV2aW91cyAhPT0gX3JlcGxhY2VtZW50KSB0aGlzLm92ZXJ3cml0ZShpbmRleCwgaW5kZXggKyBzdHJpbmdMZW5ndGgsIF9yZXBsYWNlbWVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRyZXBsYWNlQWxsKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCkge1xuXHRcdGlmICh0eXBlb2Ygc2VhcmNoVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVwbGFjZUFsbFN0cmluZyhzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpO1xuXHRcdH1cblxuXHRcdGlmICghc2VhcmNoVmFsdWUuZ2xvYmFsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0XHQnTWFnaWNTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgY2FsbGVkIHdpdGggYSBub24tZ2xvYmFsIFJlZ0V4cCBhcmd1bWVudCcsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7XG5cdH1cbn1cblxuY29uc3QgaGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmNsYXNzIEJ1bmRsZSB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuXHRcdHRoaXMuaW50cm8gPSBvcHRpb25zLmludHJvIHx8ICcnO1xuXHRcdHRoaXMuc2VwYXJhdG9yID0gb3B0aW9ucy5zZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc2VwYXJhdG9yIDogJ1xcbic7XG5cdFx0dGhpcy5zb3VyY2VzID0gW107XG5cdFx0dGhpcy51bmlxdWVTb3VyY2VzID0gW107XG5cdFx0dGhpcy51bmlxdWVTb3VyY2VJbmRleEJ5RmlsZW5hbWUgPSB7fTtcblx0fVxuXG5cdGFkZFNvdXJjZShzb3VyY2UpIHtcblx0XHRpZiAoc291cmNlIGluc3RhbmNlb2YgTWFnaWNTdHJpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmFkZFNvdXJjZSh7XG5cdFx0XHRcdGNvbnRlbnQ6IHNvdXJjZSxcblx0XHRcdFx0ZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSxcblx0XHRcdFx0c2VwYXJhdG9yOiB0aGlzLnNlcGFyYXRvcixcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICghaXNPYmplY3Qoc291cmNlKSB8fCAhc291cmNlLmNvbnRlbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0J2J1bmRsZS5hZGRTb3VyY2UoKSB0YWtlcyBhbiBvYmplY3Qgd2l0aCBhIGBjb250ZW50YCBwcm9wZXJ0eSwgd2hpY2ggc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIE1hZ2ljU3RyaW5nLCBhbmQgYW4gb3B0aW9uYWwgYGZpbGVuYW1lYCcsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdFsnZmlsZW5hbWUnLCAnaWdub3JlTGlzdCcsICdpbmRlbnRFeGNsdXNpb25SYW5nZXMnLCAnc2VwYXJhdG9yJ10uZm9yRWFjaCgob3B0aW9uKSA9PiB7XG5cdFx0XHRpZiAoIWhhc093blByb3AuY2FsbChzb3VyY2UsIG9wdGlvbikpIHNvdXJjZVtvcHRpb25dID0gc291cmNlLmNvbnRlbnRbb3B0aW9uXTtcblx0XHR9KTtcblxuXHRcdGlmIChzb3VyY2Uuc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFRPRE8gdGhlcmUncyBhIGJ1bmNoIG9mIHRoaXMgc29ydCBvZiB0aGluZywgbmVlZHMgY2xlYW5pbmcgdXBcblx0XHRcdHNvdXJjZS5zZXBhcmF0b3IgPSB0aGlzLnNlcGFyYXRvcjtcblx0XHR9XG5cblx0XHRpZiAoc291cmNlLmZpbGVuYW1lKSB7XG5cdFx0XHRpZiAoIWhhc093blByb3AuY2FsbCh0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZSwgc291cmNlLmZpbGVuYW1lKSkge1xuXHRcdFx0XHR0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZVtzb3VyY2UuZmlsZW5hbWVdID0gdGhpcy51bmlxdWVTb3VyY2VzLmxlbmd0aDtcblx0XHRcdFx0dGhpcy51bmlxdWVTb3VyY2VzLnB1c2goeyBmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLCBjb250ZW50OiBzb3VyY2UuY29udGVudC5vcmlnaW5hbCB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHVuaXF1ZVNvdXJjZSA9IHRoaXMudW5pcXVlU291cmNlc1t0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZVtzb3VyY2UuZmlsZW5hbWVdXTtcblx0XHRcdFx0aWYgKHNvdXJjZS5jb250ZW50Lm9yaWdpbmFsICE9PSB1bmlxdWVTb3VyY2UuY29udGVudCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSWxsZWdhbCBzb3VyY2U6IHNhbWUgZmlsZW5hbWUgKCR7c291cmNlLmZpbGVuYW1lfSksIGRpZmZlcmVudCBjb250ZW50c2ApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5zb3VyY2VzLnB1c2goc291cmNlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGFwcGVuZChzdHIsIG9wdGlvbnMpIHtcblx0XHR0aGlzLmFkZFNvdXJjZSh7XG5cdFx0XHRjb250ZW50OiBuZXcgTWFnaWNTdHJpbmcoc3RyKSxcblx0XHRcdHNlcGFyYXRvcjogKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXBhcmF0b3IpIHx8ICcnLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRjbG9uZSgpIHtcblx0XHRjb25zdCBidW5kbGUgPSBuZXcgQnVuZGxlKHtcblx0XHRcdGludHJvOiB0aGlzLmludHJvLFxuXHRcdFx0c2VwYXJhdG9yOiB0aGlzLnNlcGFyYXRvcixcblx0XHR9KTtcblxuXHRcdHRoaXMuc291cmNlcy5mb3JFYWNoKChzb3VyY2UpID0+IHtcblx0XHRcdGJ1bmRsZS5hZGRTb3VyY2Uoe1xuXHRcdFx0XHRmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLFxuXHRcdFx0XHRjb250ZW50OiBzb3VyY2UuY29udGVudC5jbG9uZSgpLFxuXHRcdFx0XHRzZXBhcmF0b3I6IHNvdXJjZS5zZXBhcmF0b3IsXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBidW5kbGU7XG5cdH1cblxuXHRnZW5lcmF0ZURlY29kZWRNYXAob3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3QgbmFtZXMgPSBbXTtcblx0XHRsZXQgeF9nb29nbGVfaWdub3JlTGlzdCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLnNvdXJjZXMuZm9yRWFjaCgoc291cmNlKSA9PiB7XG5cdFx0XHRPYmplY3Qua2V5cyhzb3VyY2UuY29udGVudC5zdG9yZWROYW1lcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRpZiAoIX5uYW1lcy5pbmRleE9mKG5hbWUpKSBuYW1lcy5wdXNoKG5hbWUpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBtYXBwaW5ncyA9IG5ldyBNYXBwaW5ncyhvcHRpb25zLmhpcmVzKTtcblxuXHRcdGlmICh0aGlzLmludHJvKSB7XG5cdFx0XHRtYXBwaW5ncy5hZHZhbmNlKHRoaXMuaW50cm8pO1xuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGkpID0+IHtcblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRtYXBwaW5ncy5hZHZhbmNlKHRoaXMuc2VwYXJhdG9yKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc291cmNlSW5kZXggPSBzb3VyY2UuZmlsZW5hbWUgPyB0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZVtzb3VyY2UuZmlsZW5hbWVdIDogLTE7XG5cdFx0XHRjb25zdCBtYWdpY1N0cmluZyA9IHNvdXJjZS5jb250ZW50O1xuXHRcdFx0Y29uc3QgbG9jYXRlID0gZ2V0TG9jYXRvcihtYWdpY1N0cmluZy5vcmlnaW5hbCk7XG5cblx0XHRcdGlmIChtYWdpY1N0cmluZy5pbnRybykge1xuXHRcdFx0XHRtYXBwaW5ncy5hZHZhbmNlKG1hZ2ljU3RyaW5nLmludHJvKTtcblx0XHRcdH1cblxuXHRcdFx0bWFnaWNTdHJpbmcuZmlyc3RDaHVuay5lYWNoTmV4dCgoY2h1bmspID0+IHtcblx0XHRcdFx0Y29uc3QgbG9jID0gbG9jYXRlKGNodW5rLnN0YXJ0KTtcblxuXHRcdFx0XHRpZiAoY2h1bmsuaW50cm8ubGVuZ3RoKSBtYXBwaW5ncy5hZHZhbmNlKGNodW5rLmludHJvKTtcblxuXHRcdFx0XHRpZiAoc291cmNlLmZpbGVuYW1lKSB7XG5cdFx0XHRcdFx0aWYgKGNodW5rLmVkaXRlZCkge1xuXHRcdFx0XHRcdFx0bWFwcGluZ3MuYWRkRWRpdChcblx0XHRcdFx0XHRcdFx0c291cmNlSW5kZXgsXG5cdFx0XHRcdFx0XHRcdGNodW5rLmNvbnRlbnQsXG5cdFx0XHRcdFx0XHRcdGxvYyxcblx0XHRcdFx0XHRcdFx0Y2h1bmsuc3RvcmVOYW1lID8gbmFtZXMuaW5kZXhPZihjaHVuay5vcmlnaW5hbCkgOiAtMSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1hcHBpbmdzLmFkZFVuZWRpdGVkQ2h1bmsoXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUluZGV4LFxuXHRcdFx0XHRcdFx0XHRjaHVuayxcblx0XHRcdFx0XHRcdFx0bWFnaWNTdHJpbmcub3JpZ2luYWwsXG5cdFx0XHRcdFx0XHRcdGxvYyxcblx0XHRcdFx0XHRcdFx0bWFnaWNTdHJpbmcuc291cmNlbWFwTG9jYXRpb25zLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWFwcGluZ3MuYWR2YW5jZShjaHVuay5jb250ZW50KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjaHVuay5vdXRyby5sZW5ndGgpIG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsub3V0cm8pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChtYWdpY1N0cmluZy5vdXRybykge1xuXHRcdFx0XHRtYXBwaW5ncy5hZHZhbmNlKG1hZ2ljU3RyaW5nLm91dHJvKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNvdXJjZS5pZ25vcmVMaXN0ICYmIHNvdXJjZUluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRpZiAoeF9nb29nbGVfaWdub3JlTGlzdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0eF9nb29nbGVfaWdub3JlTGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHhfZ29vZ2xlX2lnbm9yZUxpc3QucHVzaChzb3VyY2VJbmRleCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmlsZTogb3B0aW9ucy5maWxlID8gb3B0aW9ucy5maWxlLnNwbGl0KC9bL1xcXFxdLykucG9wKCkgOiB1bmRlZmluZWQsXG5cdFx0XHRzb3VyY2VzOiB0aGlzLnVuaXF1ZVNvdXJjZXMubWFwKChzb3VyY2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG9wdGlvbnMuZmlsZSA/IGdldFJlbGF0aXZlUGF0aChvcHRpb25zLmZpbGUsIHNvdXJjZS5maWxlbmFtZSkgOiBzb3VyY2UuZmlsZW5hbWU7XG5cdFx0XHR9KSxcblx0XHRcdHNvdXJjZXNDb250ZW50OiB0aGlzLnVuaXF1ZVNvdXJjZXMubWFwKChzb3VyY2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG9wdGlvbnMuaW5jbHVkZUNvbnRlbnQgPyBzb3VyY2UuY29udGVudCA6IG51bGw7XG5cdFx0XHR9KSxcblx0XHRcdG5hbWVzLFxuXHRcdFx0bWFwcGluZ3M6IG1hcHBpbmdzLnJhdyxcblx0XHRcdHhfZ29vZ2xlX2lnbm9yZUxpc3QsXG5cdFx0fTtcblx0fVxuXG5cdGdlbmVyYXRlTWFwKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IFNvdXJjZU1hcCh0aGlzLmdlbmVyYXRlRGVjb2RlZE1hcChvcHRpb25zKSk7XG5cdH1cblxuXHRnZXRJbmRlbnRTdHJpbmcoKSB7XG5cdFx0Y29uc3QgaW5kZW50U3RyaW5nQ291bnRzID0ge307XG5cblx0XHR0aGlzLnNvdXJjZXMuZm9yRWFjaCgoc291cmNlKSA9PiB7XG5cdFx0XHRjb25zdCBpbmRlbnRTdHIgPSBzb3VyY2UuY29udGVudC5fZ2V0UmF3SW5kZW50U3RyaW5nKCk7XG5cblx0XHRcdGlmIChpbmRlbnRTdHIgPT09IG51bGwpIHJldHVybjtcblxuXHRcdFx0aWYgKCFpbmRlbnRTdHJpbmdDb3VudHNbaW5kZW50U3RyXSkgaW5kZW50U3RyaW5nQ291bnRzW2luZGVudFN0cl0gPSAwO1xuXHRcdFx0aW5kZW50U3RyaW5nQ291bnRzW2luZGVudFN0cl0gKz0gMTtcblx0XHR9KTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRPYmplY3Qua2V5cyhpbmRlbnRTdHJpbmdDb3VudHMpLnNvcnQoKGEsIGIpID0+IHtcblx0XHRcdFx0cmV0dXJuIGluZGVudFN0cmluZ0NvdW50c1thXSAtIGluZGVudFN0cmluZ0NvdW50c1tiXTtcblx0XHRcdH0pWzBdIHx8ICdcXHQnXG5cdFx0KTtcblx0fVxuXG5cdGluZGVudChpbmRlbnRTdHIpIHtcblx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGluZGVudFN0ciA9IHRoaXMuZ2V0SW5kZW50U3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKGluZGVudFN0ciA9PT0gJycpIHJldHVybiB0aGlzOyAvLyBub29wXG5cblx0XHRsZXQgdHJhaWxpbmdOZXdsaW5lID0gIXRoaXMuaW50cm8gfHwgdGhpcy5pbnRyby5zbGljZSgtMSkgPT09ICdcXG4nO1xuXG5cdFx0dGhpcy5zb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuXHRcdFx0Y29uc3Qgc2VwYXJhdG9yID0gc291cmNlLnNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gc291cmNlLnNlcGFyYXRvciA6IHRoaXMuc2VwYXJhdG9yO1xuXHRcdFx0Y29uc3QgaW5kZW50U3RhcnQgPSB0cmFpbGluZ05ld2xpbmUgfHwgKGkgPiAwICYmIC9cXHI/XFxuJC8udGVzdChzZXBhcmF0b3IpKTtcblxuXHRcdFx0c291cmNlLmNvbnRlbnQuaW5kZW50KGluZGVudFN0ciwge1xuXHRcdFx0XHRleGNsdWRlOiBzb3VyY2UuaW5kZW50RXhjbHVzaW9uUmFuZ2VzLFxuXHRcdFx0XHRpbmRlbnRTdGFydCwgLy86IHRyYWlsaW5nTmV3bGluZSB8fCAvXFxyP1xcbiQvLnRlc3QoIHNlcGFyYXRvciApICAvL3RydWUvLy9cXHI/XFxuLy50ZXN0KCBzZXBhcmF0b3IgKVxuXHRcdFx0fSk7XG5cblx0XHRcdHRyYWlsaW5nTmV3bGluZSA9IHNvdXJjZS5jb250ZW50Lmxhc3RDaGFyKCkgPT09ICdcXG4nO1xuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMuaW50cm8pIHtcblx0XHRcdHRoaXMuaW50cm8gPVxuXHRcdFx0XHRpbmRlbnRTdHIgK1xuXHRcdFx0XHR0aGlzLmludHJvLnJlcGxhY2UoL15bXlxcbl0vZ20sIChtYXRjaCwgaW5kZXgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gaW5kZXggPiAwID8gaW5kZW50U3RyICsgbWF0Y2ggOiBtYXRjaDtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwcmVwZW5kKHN0cikge1xuXHRcdHRoaXMuaW50cm8gPSBzdHIgKyB0aGlzLmludHJvO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0dG9TdHJpbmcoKSB7XG5cdFx0Y29uc3QgYm9keSA9IHRoaXMuc291cmNlc1xuXHRcdFx0Lm1hcCgoc291cmNlLCBpKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHNlcGFyYXRvciA9IHNvdXJjZS5zZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IHNvdXJjZS5zZXBhcmF0b3IgOiB0aGlzLnNlcGFyYXRvcjtcblx0XHRcdFx0Y29uc3Qgc3RyID0gKGkgPiAwID8gc2VwYXJhdG9yIDogJycpICsgc291cmNlLmNvbnRlbnQudG9TdHJpbmcoKTtcblxuXHRcdFx0XHRyZXR1cm4gc3RyO1xuXHRcdFx0fSlcblx0XHRcdC5qb2luKCcnKTtcblxuXHRcdHJldHVybiB0aGlzLmludHJvICsgYm9keTtcblx0fVxuXG5cdGlzRW1wdHkoKSB7XG5cdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoICYmIHRoaXMuaW50cm8udHJpbSgpKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKHRoaXMuc291cmNlcy5zb21lKChzb3VyY2UpID0+ICFzb3VyY2UuY29udGVudC5pc0VtcHR5KCkpKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlcy5yZWR1Y2UoXG5cdFx0XHQobGVuZ3RoLCBzb3VyY2UpID0+IGxlbmd0aCArIHNvdXJjZS5jb250ZW50Lmxlbmd0aCgpLFxuXHRcdFx0dGhpcy5pbnRyby5sZW5ndGgsXG5cdFx0KTtcblx0fVxuXG5cdHRyaW1MaW5lcygpIHtcblx0XHRyZXR1cm4gdGhpcy50cmltKCdbXFxcXHJcXFxcbl0nKTtcblx0fVxuXG5cdHRyaW0oY2hhclR5cGUpIHtcblx0XHRyZXR1cm4gdGhpcy50cmltU3RhcnQoY2hhclR5cGUpLnRyaW1FbmQoY2hhclR5cGUpO1xuXHR9XG5cblx0dHJpbVN0YXJ0KGNoYXJUeXBlKSB7XG5cdFx0Y29uc3QgcnggPSBuZXcgUmVnRXhwKCdeJyArIChjaGFyVHlwZSB8fCAnXFxcXHMnKSArICcrJyk7XG5cdFx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXG5cdFx0aWYgKCF0aGlzLmludHJvKSB7XG5cdFx0XHRsZXQgc291cmNlO1xuXHRcdFx0bGV0IGkgPSAwO1xuXG5cdFx0XHRkbyB7XG5cdFx0XHRcdHNvdXJjZSA9IHRoaXMuc291cmNlc1tpKytdO1xuXHRcdFx0XHRpZiAoIXNvdXJjZSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IHdoaWxlICghc291cmNlLmNvbnRlbnQudHJpbVN0YXJ0QWJvcnRlZChjaGFyVHlwZSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0dHJpbUVuZChjaGFyVHlwZSkge1xuXHRcdGNvbnN0IHJ4ID0gbmV3IFJlZ0V4cCgoY2hhclR5cGUgfHwgJ1xcXFxzJykgKyAnKyQnKTtcblxuXHRcdGxldCBzb3VyY2U7XG5cdFx0bGV0IGkgPSB0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMTtcblxuXHRcdGRvIHtcblx0XHRcdHNvdXJjZSA9IHRoaXMuc291cmNlc1tpLS1dO1xuXHRcdFx0aWYgKCFzb3VyY2UpIHtcblx0XHRcdFx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9IHdoaWxlICghc291cmNlLmNvbnRlbnQudHJpbUVuZEFib3J0ZWQoY2hhclR5cGUpKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmV4cG9ydCB7IEJ1bmRsZSwgU291cmNlTWFwLCBNYWdpY1N0cmluZyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWdpYy1zdHJpbmcuZXMubWpzLm1hcFxuIl0sIm5hbWVzIjpbImNvbW1hIiwic2VtaWNvbG9uIiwiY2hhcnMiLCJpbnRUb0NoYXIiLCJjaGFyVG9JbnQiLCJpIiwiYyIsImVuY29kZUludGVnZXIiLCJidWlsZGVyIiwibnVtIiwicmVsYXRpdmUiLCJkZWx0YSIsImNsYW1wZWQiLCJidWZMZW5ndGgiLCJ0ZCIsImJ1ZiIsIm91dCIsIlN0cmluZ1dyaXRlciIsInYiLCJidWZmZXIiLCJwb3MiLCJlbmNvZGUiLCJkZWNvZGVkIiwid3JpdGVyIiwic291cmNlc0luZGV4Iiwic291cmNlTGluZSIsInNvdXJjZUNvbHVtbiIsIm5hbWVzSW5kZXgiLCJsaW5lIiwiZ2VuQ29sdW1uIiwiaiIsInNlZ21lbnQiLCJCaXRTZXQiLCJhcmciLCJuIiwiQ2h1bmsiLCJzdGFydCIsImVuZCIsImNvbnRlbnQiLCJjaHVuayIsImluZGV4IiwiZm4iLCJzdG9yZU5hbWUiLCJjb250ZW50T25seSIsInNsaWNlSW5kZXgiLCJvcmlnaW5hbEJlZm9yZSIsIm9yaWdpbmFsQWZ0ZXIiLCJuZXdDaHVuayIsInJ4IiwidHJpbW1lZCIsImdldEJ0b2EiLCJzdHIiLCJidG9hIiwiU291cmNlTWFwIiwicHJvcGVydGllcyIsImd1ZXNzSW5kZW50IiwiY29kZSIsImxpbmVzIiwidGFiYmVkIiwic3BhY2VkIiwibWluIiwicHJldmlvdXMiLCJjdXJyZW50IiwibnVtU3BhY2VzIiwiZ2V0UmVsYXRpdmVQYXRoIiwiZnJvbSIsInRvIiwiZnJvbVBhcnRzIiwidG9QYXJ0cyIsInRvU3RyaW5nIiwiaXNPYmplY3QiLCJ0aGluZyIsImdldExvY2F0b3IiLCJzb3VyY2UiLCJvcmlnaW5hbExpbmVzIiwibGluZU9mZnNldHMiLCJtIiwiY29sdW1uIiwid29yZFJlZ2V4IiwiTWFwcGluZ3MiLCJoaXJlcyIsInNvdXJjZUluZGV4IiwibG9jIiwibmFtZUluZGV4IiwiY29udGVudExlbmd0aE1pbnVzT25lIiwiY29udGVudExpbmVFbmQiLCJwcmV2aW91c0NvbnRlbnRMaW5lRW5kIiwib3JpZ2luYWwiLCJzb3VyY2VtYXBMb2NhdGlvbnMiLCJvcmlnaW5hbENoYXJJbmRleCIsImZpcnN0IiwiY2hhckluSGlyZXNCb3VuZGFyeSIsIndhcm5lZCIsIk1hZ2ljU3RyaW5nIiwic3RyaW5nIiwib3B0aW9ucyIsImNoYXIiLCJjbG9uZWQiLCJvcmlnaW5hbENodW5rIiwiY2xvbmVkQ2h1bmsiLCJuZXh0T3JpZ2luYWxDaHVuayIsIm5leHRDbG9uZWRDaHVuayIsIm5hbWVzIiwibWFwcGluZ3MiLCJsb2NhdGUiLCJpbmRlbnRTdHIiLCJwYXR0ZXJuIiwiaXNFeGNsdWRlZCIsImV4Y2x1c2lvbiIsInNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIiLCJyZXBsYWNlciIsIm1hdGNoIiwiY2hhckluZGV4IiwibGFzdCIsIm9sZExlZnQiLCJvbGRSaWdodCIsIm5ld1JpZ2h0IiwibmV3TGVmdCIsIm92ZXJ3cml0ZSIsImxpbmVJbmRleCIsImxpbmVTdHIiLCJyZXN1bHQiLCJzdGFydENodW5rIiwiY29udGFpbnNFbmQiLCJzbGljZVN0YXJ0Iiwic2xpY2VFbmQiLCJjbG9uZSIsInByZXZpb3VzQ2h1bmsiLCJzZWFyY2hGb3J3YXJkIiwibGVuZ3RoIiwiY2hhclR5cGUiLCJhYm9ydGVkIiwic2VhcmNoVmFsdWUiLCJyZXBsYWNlbWVudCIsImdldFJlcGxhY2VtZW50IiwiXyIsIm1hdGNoQWxsIiwicmUiLCJtYXRjaGVzIiwic3RyaW5nTGVuZ3RoIiwiX3JlcGxhY2VtZW50Il0sIm1hcHBpbmdzIjoiQUFDQSxJQUFJQSxJQUFRLElBQ1JDLElBQVksSUFDWkMsSUFBUSxvRUFDUkMsSUFBWSxJQUFJLFdBQVcsRUFBRSxHQUM3QkMsSUFBWSxJQUFJLFdBQVcsR0FBRztBQUNsQyxTQUFTQyxJQUFJLEdBQUdBLElBQUlILEVBQU0sUUFBUUcsS0FBSztBQUNyQyxRQUFNQyxJQUFJSixFQUFNLFdBQVdHLENBQUM7QUFDNUIsRUFBQUYsRUFBVUUsQ0FBQyxJQUFJQyxHQUNmRixFQUFVRSxDQUFDLElBQUlEO0FBQ2pCO0FBa0JBLFNBQVNFLEVBQWNDLEdBQVNDLEdBQUtDLEdBQVU7QUFDN0MsTUFBSUMsSUFBUUYsSUFBTUM7QUFDbEIsRUFBQUMsSUFBUUEsSUFBUSxJQUFJLENBQUNBLEtBQVMsSUFBSSxJQUFJQSxLQUFTO0FBQy9DLEtBQUc7QUFDRCxRQUFJQyxJQUFVRCxJQUFRO0FBQ3RCLElBQUFBLE9BQVcsR0FDUEEsSUFBUSxNQUFHQyxLQUFXLEtBQzFCSixFQUFRLE1BQU1MLEVBQVVTLENBQU8sQ0FBQztBQUFBLEVBQ2xDLFNBQVNELElBQVE7QUFDakIsU0FBT0Y7QUFDVDtBQU9BLElBQUlJLElBQVksT0FBTyxJQUNuQkMsSUFBSyxPQUFPLGNBQWdCLE1BQThCLG9CQUFJLGdCQUFnQixPQUFPLFNBQVcsTUFBYztBQUFBLEVBQ2hILE9BQU9DLEdBQUs7QUFFVixXQURZLE9BQU8sS0FBS0EsRUFBSSxRQUFRQSxFQUFJLFlBQVlBLEVBQUksVUFBVSxFQUN2RCxTQUFRO0FBQUEsRUFDckI7QUFDRixJQUFJO0FBQUEsRUFDRixPQUFPQSxHQUFLO0FBQ1YsUUFBSUMsSUFBTTtBQUNWLGFBQVNYLElBQUksR0FBR0EsSUFBSVUsRUFBSSxR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Q3ZELFFBQUlzQixNQUFnQnRCLEVBQU0sQ0FBQyxLQUMxQixLQUFLLFVBQVVBLEVBQU0sT0FBT0EsRUFBTSxRQUFRQSxFQUFNLENBQUMsRUFBRSxRQUFRc0IsQ0FBVztBQUFBLE1BRXhFO0FBQUEsSUFDRDtBQUNBLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFFQSxlQUFldkMsR0FBUXVDLEdBQWE7QUFDbkMsVUFBTSxFQUFFLFVBQUE5QyxFQUFRLElBQUssTUFDZi9DLElBQVErQyxFQUFTLFFBQVFPLENBQU07QUFFckMsV0FBSXRELE1BQVUsT0FDVCxPQUFPNkYsS0FBZ0IsZUFDMUJBLElBQWNBLEVBQVl2QyxHQUFRdEQsR0FBTytDLENBQVEsSUFFOUNPLE1BQVd1QyxLQUNkLEtBQUssVUFBVTdGLEdBQU9BLElBQVFzRCxFQUFPLFFBQVF1QyxDQUFXLElBSW5EO0FBQUEsRUFDUjtBQUFBLEVBRUEsUUFBUUQsR0FBYUMsR0FBYTtBQUNqQyxXQUFJLE9BQU9ELEtBQWdCLFdBQ25CLEtBQUssZUFBZUEsR0FBYUMsQ0FBVyxJQUc3QyxLQUFLLGVBQWVELEdBQWFDLENBQVc7QUFBQSxFQUNwRDtBQUFBLEVBRUEsa0JBQWtCdkMsR0FBUXVDLEdBQWE7QUFDdEMsVUFBTSxFQUFFLFVBQUE5QyxFQUFRLElBQUssTUFDZm9ELElBQWU3QyxFQUFPO0FBQzVCLGFBQ0t0RCxJQUFRK0MsRUFBUyxRQUFRTyxDQUFNLEdBQ25DdEQsTUFBVSxJQUNWQSxJQUFRK0MsRUFBUyxRQUFRTyxHQUFRdEQsSUFBUW1HLENBQVksR0FDcEQ7QUFDRCxZQUFNOUUsSUFBVzBCLEVBQVMsTUFBTS9DLEdBQU9BLElBQVFtRyxDQUFZO0FBQzNELFVBQUlDLElBQWVQO0FBQ25CLE1BQUksT0FBT0EsS0FBZ0IsZUFDMUJPLElBQWVQLEVBQVl4RSxHQUFVckIsR0FBTytDLENBQVEsSUFFakQxQixNQUFhK0UsS0FBYyxLQUFLLFVBQVVwRyxHQUFPQSxJQUFRbUcsR0FBY0MsQ0FBWTtBQUFBLElBQ3hGO0FBRUEsV0FBTztBQUFBLEVBQ1I7QUFBQSxFQUVBLFdBQVdSLEdBQWFDLEdBQWE7QUFDcEMsUUFBSSxPQUFPRCxLQUFnQjtBQUMxQixhQUFPLEtBQUssa0JBQWtCQSxHQUFhQyxDQUFXO0FBR3ZELFFBQUksQ0FBQ0QsRUFBWTtBQUNoQixZQUFNLElBQUk7QUFBQSxRQUNUO0FBQUEsTUFDSjtBQUdFLFdBQU8sS0FBSyxlQUFlQSxHQUFhQyxDQUFXO0FBQUEsRUFDcEQ7QUFDRDsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxXX0=
|