@pathscale/rsbuild-plugin-ui-css-purge 0.9.2 → 0.9.4
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/README.md +80 -70
- package/dist/generate-manifest.d.ts +4 -4
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1435 -73
- package/dist/postbuild-purge.d.ts +51 -39
- package/dist/postbuild-purge.js +444 -320
- package/dist/scan-consumer.d.ts +38 -11
- package/package.json +31 -32
- package/src/generate-manifest.ts +428 -183
package/dist/index.js
CHANGED
|
@@ -4,26 +4,862 @@ var __getProtoOf = Object.getPrototypeOf;
|
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
7
12
|
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
8
20
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
21
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
22
|
for (let key of __getOwnPropNames(mod))
|
|
11
23
|
if (!__hasOwnProp.call(to, key))
|
|
12
24
|
__defProp(to, key, {
|
|
13
|
-
get: (
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
14
26
|
enumerable: true
|
|
15
27
|
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
16
30
|
return to;
|
|
17
31
|
};
|
|
18
32
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
19
33
|
var __require = import.meta.require;
|
|
20
34
|
|
|
35
|
+
// node_modules/detect-libc/lib/process.js
|
|
36
|
+
var require_process = __commonJS((exports, module) => {
|
|
37
|
+
var isLinux = () => process.platform === "linux";
|
|
38
|
+
var report = null;
|
|
39
|
+
var getReport = () => {
|
|
40
|
+
if (!report) {
|
|
41
|
+
if (isLinux() && process.report) {
|
|
42
|
+
const orig = process.report.excludeNetwork;
|
|
43
|
+
process.report.excludeNetwork = true;
|
|
44
|
+
report = process.report.getReport();
|
|
45
|
+
process.report.excludeNetwork = orig;
|
|
46
|
+
} else {
|
|
47
|
+
report = {};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return report;
|
|
51
|
+
};
|
|
52
|
+
module.exports = { isLinux, getReport };
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// node_modules/detect-libc/lib/filesystem.js
|
|
56
|
+
var require_filesystem = __commonJS((exports, module) => {
|
|
57
|
+
var fs = __require("fs");
|
|
58
|
+
var LDD_PATH = "/usr/bin/ldd";
|
|
59
|
+
var SELF_PATH = "/proc/self/exe";
|
|
60
|
+
var MAX_LENGTH = 2048;
|
|
61
|
+
var readFileSync = (path) => {
|
|
62
|
+
const fd = fs.openSync(path, "r");
|
|
63
|
+
const buffer = Buffer.alloc(MAX_LENGTH);
|
|
64
|
+
const bytesRead = fs.readSync(fd, buffer, 0, MAX_LENGTH, 0);
|
|
65
|
+
fs.close(fd, () => {});
|
|
66
|
+
return buffer.subarray(0, bytesRead);
|
|
67
|
+
};
|
|
68
|
+
var readFile = (path) => new Promise((resolve, reject) => {
|
|
69
|
+
fs.open(path, "r", (err, fd) => {
|
|
70
|
+
if (err) {
|
|
71
|
+
reject(err);
|
|
72
|
+
} else {
|
|
73
|
+
const buffer = Buffer.alloc(MAX_LENGTH);
|
|
74
|
+
fs.read(fd, buffer, 0, MAX_LENGTH, 0, (_, bytesRead) => {
|
|
75
|
+
resolve(buffer.subarray(0, bytesRead));
|
|
76
|
+
fs.close(fd, () => {});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
module.exports = {
|
|
82
|
+
LDD_PATH,
|
|
83
|
+
SELF_PATH,
|
|
84
|
+
readFileSync,
|
|
85
|
+
readFile
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// node_modules/detect-libc/lib/elf.js
|
|
90
|
+
var require_elf = __commonJS((exports, module) => {
|
|
91
|
+
var interpreterPath = (elf) => {
|
|
92
|
+
if (elf.length < 64) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
if (elf.readUInt32BE(0) !== 2135247942) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
if (elf.readUInt8(4) !== 2) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
if (elf.readUInt8(5) !== 1) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const offset = elf.readUInt32LE(32);
|
|
105
|
+
const size = elf.readUInt16LE(54);
|
|
106
|
+
const count = elf.readUInt16LE(56);
|
|
107
|
+
for (let i = 0;i < count; i++) {
|
|
108
|
+
const headerOffset = offset + i * size;
|
|
109
|
+
const type = elf.readUInt32LE(headerOffset);
|
|
110
|
+
if (type === 3) {
|
|
111
|
+
const fileOffset = elf.readUInt32LE(headerOffset + 8);
|
|
112
|
+
const fileSize = elf.readUInt32LE(headerOffset + 32);
|
|
113
|
+
return elf.subarray(fileOffset, fileOffset + fileSize).toString().replace(/\0.*$/g, "");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
};
|
|
118
|
+
module.exports = {
|
|
119
|
+
interpreterPath
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// node_modules/detect-libc/lib/detect-libc.js
|
|
124
|
+
var require_detect_libc = __commonJS((exports, module) => {
|
|
125
|
+
var childProcess = __require("child_process");
|
|
126
|
+
var { isLinux, getReport } = require_process();
|
|
127
|
+
var { LDD_PATH, SELF_PATH, readFile, readFileSync } = require_filesystem();
|
|
128
|
+
var { interpreterPath } = require_elf();
|
|
129
|
+
var cachedFamilyInterpreter;
|
|
130
|
+
var cachedFamilyFilesystem;
|
|
131
|
+
var cachedVersionFilesystem;
|
|
132
|
+
var command = "getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true";
|
|
133
|
+
var commandOut = "";
|
|
134
|
+
var safeCommand = () => {
|
|
135
|
+
if (!commandOut) {
|
|
136
|
+
return new Promise((resolve) => {
|
|
137
|
+
childProcess.exec(command, (err, out) => {
|
|
138
|
+
commandOut = err ? " " : out;
|
|
139
|
+
resolve(commandOut);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return commandOut;
|
|
144
|
+
};
|
|
145
|
+
var safeCommandSync = () => {
|
|
146
|
+
if (!commandOut) {
|
|
147
|
+
try {
|
|
148
|
+
commandOut = childProcess.execSync(command, { encoding: "utf8" });
|
|
149
|
+
} catch (_err) {
|
|
150
|
+
commandOut = " ";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return commandOut;
|
|
154
|
+
};
|
|
155
|
+
var GLIBC = "glibc";
|
|
156
|
+
var RE_GLIBC_VERSION = /LIBC[a-z0-9 \-).]*?(\d+\.\d+)/i;
|
|
157
|
+
var MUSL = "musl";
|
|
158
|
+
var isFileMusl = (f) => f.includes("libc.musl-") || f.includes("ld-musl-");
|
|
159
|
+
var familyFromReport = () => {
|
|
160
|
+
const report = getReport();
|
|
161
|
+
if (report.header && report.header.glibcVersionRuntime) {
|
|
162
|
+
return GLIBC;
|
|
163
|
+
}
|
|
164
|
+
if (Array.isArray(report.sharedObjects)) {
|
|
165
|
+
if (report.sharedObjects.some(isFileMusl)) {
|
|
166
|
+
return MUSL;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
};
|
|
171
|
+
var familyFromCommand = (out) => {
|
|
172
|
+
const [getconf, ldd1] = out.split(/[\r\n]+/);
|
|
173
|
+
if (getconf && getconf.includes(GLIBC)) {
|
|
174
|
+
return GLIBC;
|
|
175
|
+
}
|
|
176
|
+
if (ldd1 && ldd1.includes(MUSL)) {
|
|
177
|
+
return MUSL;
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
};
|
|
181
|
+
var familyFromInterpreterPath = (path) => {
|
|
182
|
+
if (path) {
|
|
183
|
+
if (path.includes("/ld-musl-")) {
|
|
184
|
+
return MUSL;
|
|
185
|
+
} else if (path.includes("/ld-linux-")) {
|
|
186
|
+
return GLIBC;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
};
|
|
191
|
+
var getFamilyFromLddContent = (content) => {
|
|
192
|
+
content = content.toString();
|
|
193
|
+
if (content.includes("musl")) {
|
|
194
|
+
return MUSL;
|
|
195
|
+
}
|
|
196
|
+
if (content.includes("GNU C Library")) {
|
|
197
|
+
return GLIBC;
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
};
|
|
201
|
+
var familyFromFilesystem = async () => {
|
|
202
|
+
if (cachedFamilyFilesystem !== undefined) {
|
|
203
|
+
return cachedFamilyFilesystem;
|
|
204
|
+
}
|
|
205
|
+
cachedFamilyFilesystem = null;
|
|
206
|
+
try {
|
|
207
|
+
const lddContent = await readFile(LDD_PATH);
|
|
208
|
+
cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
|
|
209
|
+
} catch (e) {}
|
|
210
|
+
return cachedFamilyFilesystem;
|
|
211
|
+
};
|
|
212
|
+
var familyFromFilesystemSync = () => {
|
|
213
|
+
if (cachedFamilyFilesystem !== undefined) {
|
|
214
|
+
return cachedFamilyFilesystem;
|
|
215
|
+
}
|
|
216
|
+
cachedFamilyFilesystem = null;
|
|
217
|
+
try {
|
|
218
|
+
const lddContent = readFileSync(LDD_PATH);
|
|
219
|
+
cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
|
|
220
|
+
} catch (e) {}
|
|
221
|
+
return cachedFamilyFilesystem;
|
|
222
|
+
};
|
|
223
|
+
var familyFromInterpreter = async () => {
|
|
224
|
+
if (cachedFamilyInterpreter !== undefined) {
|
|
225
|
+
return cachedFamilyInterpreter;
|
|
226
|
+
}
|
|
227
|
+
cachedFamilyInterpreter = null;
|
|
228
|
+
try {
|
|
229
|
+
const selfContent = await readFile(SELF_PATH);
|
|
230
|
+
const path = interpreterPath(selfContent);
|
|
231
|
+
cachedFamilyInterpreter = familyFromInterpreterPath(path);
|
|
232
|
+
} catch (e) {}
|
|
233
|
+
return cachedFamilyInterpreter;
|
|
234
|
+
};
|
|
235
|
+
var familyFromInterpreterSync = () => {
|
|
236
|
+
if (cachedFamilyInterpreter !== undefined) {
|
|
237
|
+
return cachedFamilyInterpreter;
|
|
238
|
+
}
|
|
239
|
+
cachedFamilyInterpreter = null;
|
|
240
|
+
try {
|
|
241
|
+
const selfContent = readFileSync(SELF_PATH);
|
|
242
|
+
const path = interpreterPath(selfContent);
|
|
243
|
+
cachedFamilyInterpreter = familyFromInterpreterPath(path);
|
|
244
|
+
} catch (e) {}
|
|
245
|
+
return cachedFamilyInterpreter;
|
|
246
|
+
};
|
|
247
|
+
var family = async () => {
|
|
248
|
+
let family2 = null;
|
|
249
|
+
if (isLinux()) {
|
|
250
|
+
family2 = await familyFromInterpreter();
|
|
251
|
+
if (!family2) {
|
|
252
|
+
family2 = await familyFromFilesystem();
|
|
253
|
+
if (!family2) {
|
|
254
|
+
family2 = familyFromReport();
|
|
255
|
+
}
|
|
256
|
+
if (!family2) {
|
|
257
|
+
const out = await safeCommand();
|
|
258
|
+
family2 = familyFromCommand(out);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return family2;
|
|
263
|
+
};
|
|
264
|
+
var familySync = () => {
|
|
265
|
+
let family2 = null;
|
|
266
|
+
if (isLinux()) {
|
|
267
|
+
family2 = familyFromInterpreterSync();
|
|
268
|
+
if (!family2) {
|
|
269
|
+
family2 = familyFromFilesystemSync();
|
|
270
|
+
if (!family2) {
|
|
271
|
+
family2 = familyFromReport();
|
|
272
|
+
}
|
|
273
|
+
if (!family2) {
|
|
274
|
+
const out = safeCommandSync();
|
|
275
|
+
family2 = familyFromCommand(out);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return family2;
|
|
280
|
+
};
|
|
281
|
+
var isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;
|
|
282
|
+
var isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;
|
|
283
|
+
var versionFromFilesystem = async () => {
|
|
284
|
+
if (cachedVersionFilesystem !== undefined) {
|
|
285
|
+
return cachedVersionFilesystem;
|
|
286
|
+
}
|
|
287
|
+
cachedVersionFilesystem = null;
|
|
288
|
+
try {
|
|
289
|
+
const lddContent = await readFile(LDD_PATH);
|
|
290
|
+
const versionMatch = lddContent.match(RE_GLIBC_VERSION);
|
|
291
|
+
if (versionMatch) {
|
|
292
|
+
cachedVersionFilesystem = versionMatch[1];
|
|
293
|
+
}
|
|
294
|
+
} catch (e) {}
|
|
295
|
+
return cachedVersionFilesystem;
|
|
296
|
+
};
|
|
297
|
+
var versionFromFilesystemSync = () => {
|
|
298
|
+
if (cachedVersionFilesystem !== undefined) {
|
|
299
|
+
return cachedVersionFilesystem;
|
|
300
|
+
}
|
|
301
|
+
cachedVersionFilesystem = null;
|
|
302
|
+
try {
|
|
303
|
+
const lddContent = readFileSync(LDD_PATH);
|
|
304
|
+
const versionMatch = lddContent.match(RE_GLIBC_VERSION);
|
|
305
|
+
if (versionMatch) {
|
|
306
|
+
cachedVersionFilesystem = versionMatch[1];
|
|
307
|
+
}
|
|
308
|
+
} catch (e) {}
|
|
309
|
+
return cachedVersionFilesystem;
|
|
310
|
+
};
|
|
311
|
+
var versionFromReport = () => {
|
|
312
|
+
const report = getReport();
|
|
313
|
+
if (report.header && report.header.glibcVersionRuntime) {
|
|
314
|
+
return report.header.glibcVersionRuntime;
|
|
315
|
+
}
|
|
316
|
+
return null;
|
|
317
|
+
};
|
|
318
|
+
var versionSuffix = (s) => s.trim().split(/\s+/)[1];
|
|
319
|
+
var versionFromCommand = (out) => {
|
|
320
|
+
const [getconf, ldd1, ldd2] = out.split(/[\r\n]+/);
|
|
321
|
+
if (getconf && getconf.includes(GLIBC)) {
|
|
322
|
+
return versionSuffix(getconf);
|
|
323
|
+
}
|
|
324
|
+
if (ldd1 && ldd2 && ldd1.includes(MUSL)) {
|
|
325
|
+
return versionSuffix(ldd2);
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
};
|
|
329
|
+
var version = async () => {
|
|
330
|
+
let version2 = null;
|
|
331
|
+
if (isLinux()) {
|
|
332
|
+
version2 = await versionFromFilesystem();
|
|
333
|
+
if (!version2) {
|
|
334
|
+
version2 = versionFromReport();
|
|
335
|
+
}
|
|
336
|
+
if (!version2) {
|
|
337
|
+
const out = await safeCommand();
|
|
338
|
+
version2 = versionFromCommand(out);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return version2;
|
|
342
|
+
};
|
|
343
|
+
var versionSync = () => {
|
|
344
|
+
let version2 = null;
|
|
345
|
+
if (isLinux()) {
|
|
346
|
+
version2 = versionFromFilesystemSync();
|
|
347
|
+
if (!version2) {
|
|
348
|
+
version2 = versionFromReport();
|
|
349
|
+
}
|
|
350
|
+
if (!version2) {
|
|
351
|
+
const out = safeCommandSync();
|
|
352
|
+
version2 = versionFromCommand(out);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return version2;
|
|
356
|
+
};
|
|
357
|
+
module.exports = {
|
|
358
|
+
GLIBC,
|
|
359
|
+
MUSL,
|
|
360
|
+
family,
|
|
361
|
+
familySync,
|
|
362
|
+
isNonGlibcLinux,
|
|
363
|
+
isNonGlibcLinuxSync,
|
|
364
|
+
version,
|
|
365
|
+
versionSync
|
|
366
|
+
};
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// node_modules/lightningcss/node/browserslistToTargets.js
|
|
370
|
+
var require_browserslistToTargets = __commonJS((exports, module) => {
|
|
371
|
+
var BROWSER_MAPPING = {
|
|
372
|
+
and_chr: "chrome",
|
|
373
|
+
and_ff: "firefox",
|
|
374
|
+
ie_mob: "ie",
|
|
375
|
+
op_mob: "opera",
|
|
376
|
+
and_qq: null,
|
|
377
|
+
and_uc: null,
|
|
378
|
+
baidu: null,
|
|
379
|
+
bb: null,
|
|
380
|
+
kaios: null,
|
|
381
|
+
op_mini: null
|
|
382
|
+
};
|
|
383
|
+
function browserslistToTargets(browserslist) {
|
|
384
|
+
let targets = {};
|
|
385
|
+
for (let browser of browserslist) {
|
|
386
|
+
let [name, v] = browser.split(" ");
|
|
387
|
+
if (BROWSER_MAPPING[name] === null) {
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
let version = parseVersion(v);
|
|
391
|
+
if (version == null) {
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
if (targets[name] == null || version < targets[name]) {
|
|
395
|
+
targets[name] = version;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return targets;
|
|
399
|
+
}
|
|
400
|
+
function parseVersion(version) {
|
|
401
|
+
let [major, minor = 0, patch = 0] = version.split("-")[0].split(".").map((v) => parseInt(v, 10));
|
|
402
|
+
if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
return major << 16 | minor << 8 | patch;
|
|
406
|
+
}
|
|
407
|
+
module.exports = browserslistToTargets;
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// node_modules/lightningcss/node/composeVisitors.js
|
|
411
|
+
var require_composeVisitors = __commonJS((exports, module) => {
|
|
412
|
+
function composeVisitors(visitors) {
|
|
413
|
+
if (visitors.length === 1) {
|
|
414
|
+
return visitors[0];
|
|
415
|
+
}
|
|
416
|
+
if (visitors.some((v) => typeof v === "function")) {
|
|
417
|
+
return (opts) => {
|
|
418
|
+
let v = visitors.map((v2) => typeof v2 === "function" ? v2(opts) : v2);
|
|
419
|
+
return composeVisitors(v);
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
let res = {};
|
|
423
|
+
composeSimpleVisitors(res, visitors, "StyleSheet");
|
|
424
|
+
composeSimpleVisitors(res, visitors, "StyleSheetExit");
|
|
425
|
+
composeObjectVisitors(res, visitors, "Rule", ruleVisitor, wrapCustomAndUnknownAtRule);
|
|
426
|
+
composeObjectVisitors(res, visitors, "RuleExit", ruleVisitor, wrapCustomAndUnknownAtRule);
|
|
427
|
+
composeObjectVisitors(res, visitors, "Declaration", declarationVisitor, wrapCustomProperty);
|
|
428
|
+
composeObjectVisitors(res, visitors, "DeclarationExit", declarationVisitor, wrapCustomProperty);
|
|
429
|
+
composeSimpleVisitors(res, visitors, "Url");
|
|
430
|
+
composeSimpleVisitors(res, visitors, "Color");
|
|
431
|
+
composeSimpleVisitors(res, visitors, "Image");
|
|
432
|
+
composeSimpleVisitors(res, visitors, "ImageExit");
|
|
433
|
+
composeSimpleVisitors(res, visitors, "Length");
|
|
434
|
+
composeSimpleVisitors(res, visitors, "Angle");
|
|
435
|
+
composeSimpleVisitors(res, visitors, "Ratio");
|
|
436
|
+
composeSimpleVisitors(res, visitors, "Resolution");
|
|
437
|
+
composeSimpleVisitors(res, visitors, "Time");
|
|
438
|
+
composeSimpleVisitors(res, visitors, "CustomIdent");
|
|
439
|
+
composeSimpleVisitors(res, visitors, "DashedIdent");
|
|
440
|
+
composeArrayFunctions(res, visitors, "MediaQuery");
|
|
441
|
+
composeArrayFunctions(res, visitors, "MediaQueryExit");
|
|
442
|
+
composeSimpleVisitors(res, visitors, "SupportsCondition");
|
|
443
|
+
composeSimpleVisitors(res, visitors, "SupportsConditionExit");
|
|
444
|
+
composeArrayFunctions(res, visitors, "Selector");
|
|
445
|
+
composeTokenVisitors(res, visitors, "Token", "token", false);
|
|
446
|
+
composeTokenVisitors(res, visitors, "Function", "function", false);
|
|
447
|
+
composeTokenVisitors(res, visitors, "FunctionExit", "function", true);
|
|
448
|
+
composeTokenVisitors(res, visitors, "Variable", "var", false);
|
|
449
|
+
composeTokenVisitors(res, visitors, "VariableExit", "var", true);
|
|
450
|
+
composeTokenVisitors(res, visitors, "EnvironmentVariable", "env", false);
|
|
451
|
+
composeTokenVisitors(res, visitors, "EnvironmentVariableExit", "env", true);
|
|
452
|
+
return res;
|
|
453
|
+
}
|
|
454
|
+
module.exports = composeVisitors;
|
|
455
|
+
function wrapCustomAndUnknownAtRule(k, f) {
|
|
456
|
+
if (k === "unknown") {
|
|
457
|
+
return (value) => f({ type: "unknown", value });
|
|
458
|
+
}
|
|
459
|
+
if (k === "custom") {
|
|
460
|
+
return (value) => f({ type: "custom", value });
|
|
461
|
+
}
|
|
462
|
+
return f;
|
|
463
|
+
}
|
|
464
|
+
function wrapCustomProperty(k, f) {
|
|
465
|
+
return k === "custom" ? (value) => f({ property: "custom", value }) : f;
|
|
466
|
+
}
|
|
467
|
+
function ruleVisitor(f, item) {
|
|
468
|
+
if (typeof f === "object") {
|
|
469
|
+
if (item.type === "unknown") {
|
|
470
|
+
let v = f.unknown;
|
|
471
|
+
if (typeof v === "object") {
|
|
472
|
+
v = v[item.value.name];
|
|
473
|
+
}
|
|
474
|
+
return v?.(item.value);
|
|
475
|
+
}
|
|
476
|
+
if (item.type === "custom") {
|
|
477
|
+
let v = f.custom;
|
|
478
|
+
if (typeof v === "object") {
|
|
479
|
+
v = v[item.value.name];
|
|
480
|
+
}
|
|
481
|
+
return v?.(item.value);
|
|
482
|
+
}
|
|
483
|
+
return f[item.type]?.(item);
|
|
484
|
+
}
|
|
485
|
+
return f?.(item);
|
|
486
|
+
}
|
|
487
|
+
function declarationVisitor(f, item) {
|
|
488
|
+
if (typeof f === "object") {
|
|
489
|
+
let name = item.property;
|
|
490
|
+
if (item.property === "unparsed") {
|
|
491
|
+
name = item.value.propertyId.property;
|
|
492
|
+
} else if (item.property === "custom") {
|
|
493
|
+
let v = f.custom;
|
|
494
|
+
if (typeof v === "object") {
|
|
495
|
+
v = v[item.value.name];
|
|
496
|
+
}
|
|
497
|
+
return v?.(item.value);
|
|
498
|
+
}
|
|
499
|
+
return f[name]?.(item);
|
|
500
|
+
}
|
|
501
|
+
return f?.(item);
|
|
502
|
+
}
|
|
503
|
+
function extractObjectsOrFunctions(visitors, key) {
|
|
504
|
+
let values = [];
|
|
505
|
+
let hasFunction = false;
|
|
506
|
+
let allKeys = new Set;
|
|
507
|
+
for (let visitor of visitors) {
|
|
508
|
+
let v = visitor[key];
|
|
509
|
+
if (v) {
|
|
510
|
+
if (typeof v === "function") {
|
|
511
|
+
hasFunction = true;
|
|
512
|
+
} else {
|
|
513
|
+
for (let key2 in v) {
|
|
514
|
+
allKeys.add(key2);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
values.push(v);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
return [values, hasFunction, allKeys];
|
|
521
|
+
}
|
|
522
|
+
function composeObjectVisitors(res, visitors, key, apply, wrapKey) {
|
|
523
|
+
let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);
|
|
524
|
+
if (values.length === 0) {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
if (values.length === 1) {
|
|
528
|
+
res[key] = values[0];
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
let f = createArrayVisitor(visitors, (visitor, item) => apply(visitor[key], item));
|
|
532
|
+
if (hasFunction) {
|
|
533
|
+
res[key] = f;
|
|
534
|
+
} else {
|
|
535
|
+
let v = {};
|
|
536
|
+
for (let k of allKeys) {
|
|
537
|
+
v[k] = wrapKey(k, f);
|
|
538
|
+
}
|
|
539
|
+
res[key] = v;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function composeTokenVisitors(res, visitors, key, type, isExit) {
|
|
543
|
+
let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);
|
|
544
|
+
if (values.length === 0) {
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
if (values.length === 1) {
|
|
548
|
+
res[key] = values[0];
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
let f = createTokenVisitor(visitors, type, isExit);
|
|
552
|
+
if (hasFunction) {
|
|
553
|
+
res[key] = f;
|
|
554
|
+
} else {
|
|
555
|
+
let v = {};
|
|
556
|
+
for (let key2 of allKeys) {
|
|
557
|
+
v[key2] = f;
|
|
558
|
+
}
|
|
559
|
+
res[key] = v;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
function createTokenVisitor(visitors, type, isExit) {
|
|
563
|
+
let v = createArrayVisitor(visitors, (visitor, item) => {
|
|
564
|
+
let f;
|
|
565
|
+
switch (item.type) {
|
|
566
|
+
case "token":
|
|
567
|
+
f = visitor.Token;
|
|
568
|
+
if (typeof f === "object") {
|
|
569
|
+
f = f[item.value.type];
|
|
570
|
+
}
|
|
571
|
+
break;
|
|
572
|
+
case "function":
|
|
573
|
+
f = isExit ? visitor.FunctionExit : visitor.Function;
|
|
574
|
+
if (typeof f === "object") {
|
|
575
|
+
f = f[item.value.name];
|
|
576
|
+
}
|
|
577
|
+
break;
|
|
578
|
+
case "var":
|
|
579
|
+
f = isExit ? visitor.VariableExit : visitor.Variable;
|
|
580
|
+
break;
|
|
581
|
+
case "env":
|
|
582
|
+
f = isExit ? visitor.EnvironmentVariableExit : visitor.EnvironmentVariable;
|
|
583
|
+
if (typeof f === "object") {
|
|
584
|
+
let name;
|
|
585
|
+
switch (item.value.name.type) {
|
|
586
|
+
case "ua":
|
|
587
|
+
case "unknown":
|
|
588
|
+
name = item.value.name.value;
|
|
589
|
+
break;
|
|
590
|
+
case "custom":
|
|
591
|
+
name = item.value.name.ident;
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
f = f[name];
|
|
595
|
+
}
|
|
596
|
+
break;
|
|
597
|
+
case "color":
|
|
598
|
+
f = visitor.Color;
|
|
599
|
+
break;
|
|
600
|
+
case "url":
|
|
601
|
+
f = visitor.Url;
|
|
602
|
+
break;
|
|
603
|
+
case "length":
|
|
604
|
+
f = visitor.Length;
|
|
605
|
+
break;
|
|
606
|
+
case "angle":
|
|
607
|
+
f = visitor.Angle;
|
|
608
|
+
break;
|
|
609
|
+
case "time":
|
|
610
|
+
f = visitor.Time;
|
|
611
|
+
break;
|
|
612
|
+
case "resolution":
|
|
613
|
+
f = visitor.Resolution;
|
|
614
|
+
break;
|
|
615
|
+
case "dashed-ident":
|
|
616
|
+
f = visitor.DashedIdent;
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
if (!f) {
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
let res = f(item.value);
|
|
623
|
+
switch (item.type) {
|
|
624
|
+
case "color":
|
|
625
|
+
case "url":
|
|
626
|
+
case "length":
|
|
627
|
+
case "angle":
|
|
628
|
+
case "time":
|
|
629
|
+
case "resolution":
|
|
630
|
+
case "dashed-ident":
|
|
631
|
+
if (Array.isArray(res)) {
|
|
632
|
+
res = res.map((value) => ({ type: item.type, value }));
|
|
633
|
+
} else if (res) {
|
|
634
|
+
res = { type: item.type, value: res };
|
|
635
|
+
}
|
|
636
|
+
break;
|
|
637
|
+
}
|
|
638
|
+
return res;
|
|
639
|
+
});
|
|
640
|
+
return (value) => v({ type, value });
|
|
641
|
+
}
|
|
642
|
+
function extractFunctions(visitors, key) {
|
|
643
|
+
let functions = [];
|
|
644
|
+
for (let visitor of visitors) {
|
|
645
|
+
let f = visitor[key];
|
|
646
|
+
if (f) {
|
|
647
|
+
functions.push(f);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
return functions;
|
|
651
|
+
}
|
|
652
|
+
function composeSimpleVisitors(res, visitors, key) {
|
|
653
|
+
let functions = extractFunctions(visitors, key);
|
|
654
|
+
if (functions.length === 0) {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
if (functions.length === 1) {
|
|
658
|
+
res[key] = functions[0];
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
res[key] = (arg) => {
|
|
662
|
+
let mutated = false;
|
|
663
|
+
for (let f of functions) {
|
|
664
|
+
let res2 = f(arg);
|
|
665
|
+
if (res2) {
|
|
666
|
+
arg = res2;
|
|
667
|
+
mutated = true;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
return mutated ? arg : undefined;
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
function composeArrayFunctions(res, visitors, key) {
|
|
674
|
+
let functions = extractFunctions(visitors, key);
|
|
675
|
+
if (functions.length === 0) {
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
if (functions.length === 1) {
|
|
679
|
+
res[key] = functions[0];
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
res[key] = createArrayVisitor(functions, (f, item) => f(item));
|
|
683
|
+
}
|
|
684
|
+
function createArrayVisitor(visitors, apply) {
|
|
685
|
+
let seen = new Bitset(visitors.length);
|
|
686
|
+
return (arg) => {
|
|
687
|
+
let arr = [arg];
|
|
688
|
+
let mutated = false;
|
|
689
|
+
seen.clear();
|
|
690
|
+
for (let i = 0;i < arr.length; i++) {
|
|
691
|
+
for (let v = 0;v < visitors.length && i < arr.length; ) {
|
|
692
|
+
if (seen.get(v)) {
|
|
693
|
+
v++;
|
|
694
|
+
continue;
|
|
695
|
+
}
|
|
696
|
+
let item = arr[i];
|
|
697
|
+
let visitor = visitors[v];
|
|
698
|
+
let res = apply(visitor, item);
|
|
699
|
+
if (Array.isArray(res)) {
|
|
700
|
+
if (res.length === 0) {
|
|
701
|
+
arr.splice(i, 1);
|
|
702
|
+
} else if (res.length === 1) {
|
|
703
|
+
arr[i] = res[0];
|
|
704
|
+
} else {
|
|
705
|
+
arr.splice(i, 1, ...res);
|
|
706
|
+
}
|
|
707
|
+
mutated = true;
|
|
708
|
+
seen.set(v);
|
|
709
|
+
v = 0;
|
|
710
|
+
} else if (res) {
|
|
711
|
+
arr[i] = res;
|
|
712
|
+
mutated = true;
|
|
713
|
+
seen.set(v);
|
|
714
|
+
v = 0;
|
|
715
|
+
} else {
|
|
716
|
+
v++;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
if (!mutated) {
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
return arr.length === 1 ? arr[0] : arr;
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
class Bitset {
|
|
728
|
+
constructor(maxBits = 32) {
|
|
729
|
+
this.bits = 0;
|
|
730
|
+
this.more = maxBits > 32 ? new Uint32Array(Math.ceil((maxBits - 32) / 32)) : null;
|
|
731
|
+
}
|
|
732
|
+
get(bit) {
|
|
733
|
+
if (bit >= 32 && this.more) {
|
|
734
|
+
let i = Math.floor((bit - 32) / 32);
|
|
735
|
+
let b = bit % 32;
|
|
736
|
+
return Boolean(this.more[i] & 1 << b);
|
|
737
|
+
} else {
|
|
738
|
+
return Boolean(this.bits & 1 << bit);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
set(bit) {
|
|
742
|
+
if (bit >= 32 && this.more) {
|
|
743
|
+
let i = Math.floor((bit - 32) / 32);
|
|
744
|
+
let b = bit % 32;
|
|
745
|
+
this.more[i] |= 1 << b;
|
|
746
|
+
} else {
|
|
747
|
+
this.bits |= 1 << bit;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
clear() {
|
|
751
|
+
this.bits = 0;
|
|
752
|
+
if (this.more) {
|
|
753
|
+
this.more.fill(0);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
// node_modules/lightningcss/node/flags.js
|
|
760
|
+
var require_flags = __commonJS((exports) => {
|
|
761
|
+
exports.Features = {
|
|
762
|
+
Nesting: 1,
|
|
763
|
+
NotSelectorList: 2,
|
|
764
|
+
DirSelector: 4,
|
|
765
|
+
LangSelectorList: 8,
|
|
766
|
+
IsSelector: 16,
|
|
767
|
+
TextDecorationThicknessPercent: 32,
|
|
768
|
+
MediaIntervalSyntax: 64,
|
|
769
|
+
MediaRangeSyntax: 128,
|
|
770
|
+
CustomMediaQueries: 256,
|
|
771
|
+
ClampFunction: 512,
|
|
772
|
+
ColorFunction: 1024,
|
|
773
|
+
OklabColors: 2048,
|
|
774
|
+
LabColors: 4096,
|
|
775
|
+
P3Colors: 8192,
|
|
776
|
+
HexAlphaColors: 16384,
|
|
777
|
+
SpaceSeparatedColorNotation: 32768,
|
|
778
|
+
FontFamilySystemUi: 65536,
|
|
779
|
+
DoublePositionGradients: 131072,
|
|
780
|
+
VendorPrefixes: 262144,
|
|
781
|
+
LogicalProperties: 524288,
|
|
782
|
+
LightDark: 1048576,
|
|
783
|
+
Selectors: 31,
|
|
784
|
+
MediaQueries: 448,
|
|
785
|
+
Colors: 1113088
|
|
786
|
+
};
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
// node_modules/lightningcss/node/index.js
|
|
790
|
+
var require_node = __commonJS((exports, module) => {
|
|
791
|
+
var parts = [process.platform, process.arch];
|
|
792
|
+
if (process.platform === "linux") {
|
|
793
|
+
const { MUSL, familySync } = require_detect_libc();
|
|
794
|
+
const family = familySync();
|
|
795
|
+
if (family === MUSL) {
|
|
796
|
+
parts.push("musl");
|
|
797
|
+
} else if (process.arch === "arm") {
|
|
798
|
+
parts.push("gnueabihf");
|
|
799
|
+
} else {
|
|
800
|
+
parts.push("gnu");
|
|
801
|
+
}
|
|
802
|
+
} else if (process.platform === "win32") {
|
|
803
|
+
parts.push("msvc");
|
|
804
|
+
}
|
|
805
|
+
var native;
|
|
806
|
+
try {
|
|
807
|
+
native = __require(`lightningcss-${parts.join("-")}`);
|
|
808
|
+
} catch (err) {
|
|
809
|
+
native = __require(`../lightningcss.${parts.join("-")}.node`);
|
|
810
|
+
}
|
|
811
|
+
exports.transform = wrap(native.transform);
|
|
812
|
+
exports.transformStyleAttribute = wrap(native.transformStyleAttribute);
|
|
813
|
+
exports.bundle = wrap(native.bundle);
|
|
814
|
+
exports.bundleAsync = wrap(native.bundleAsync);
|
|
815
|
+
exports.browserslistToTargets = require_browserslistToTargets();
|
|
816
|
+
exports.composeVisitors = require_composeVisitors();
|
|
817
|
+
exports.Features = require_flags().Features;
|
|
818
|
+
function wrap(call) {
|
|
819
|
+
return (options) => {
|
|
820
|
+
if (typeof options.visitor === "function") {
|
|
821
|
+
let deps = [];
|
|
822
|
+
options.visitor = options.visitor({
|
|
823
|
+
addDependency(dep) {
|
|
824
|
+
deps.push(dep);
|
|
825
|
+
}
|
|
826
|
+
});
|
|
827
|
+
let result = call(options);
|
|
828
|
+
if (result instanceof Promise) {
|
|
829
|
+
result = result.then((res) => {
|
|
830
|
+
if (deps.length) {
|
|
831
|
+
res.dependencies ??= [];
|
|
832
|
+
res.dependencies.push(...deps);
|
|
833
|
+
}
|
|
834
|
+
return res;
|
|
835
|
+
});
|
|
836
|
+
} else if (deps.length) {
|
|
837
|
+
result.dependencies ??= [];
|
|
838
|
+
result.dependencies.push(...deps);
|
|
839
|
+
}
|
|
840
|
+
return result;
|
|
841
|
+
} else {
|
|
842
|
+
return call(options);
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
|
|
848
|
+
// src/postbuild-purge.ts
|
|
849
|
+
var {Glob: Glob2 } = globalThis.Bun;
|
|
850
|
+
|
|
851
|
+
// node_modules/lightningcss/node/index.mjs
|
|
852
|
+
var import__ = __toESM(require_node(), 1);
|
|
853
|
+
var { transform, transformStyleAttribute, bundle, bundleAsync, browserslistToTargets, composeVisitors, Features } = import__.default;
|
|
854
|
+
|
|
855
|
+
// src/postbuild-purge.ts
|
|
856
|
+
import postcss from "postcss";
|
|
857
|
+
|
|
21
858
|
// src/scan-consumer.ts
|
|
22
859
|
import swc from "@swc/core";
|
|
23
860
|
var {Glob } = globalThis.Bun;
|
|
24
|
-
import path from "path";
|
|
25
861
|
function walkAST(node, visitor) {
|
|
26
|
-
if (!node
|
|
862
|
+
if (!isRecord(node))
|
|
27
863
|
return;
|
|
28
864
|
visitor(node);
|
|
29
865
|
for (const key of Object.keys(node)) {
|
|
@@ -38,74 +874,197 @@ function walkAST(node, visitor) {
|
|
|
38
874
|
}
|
|
39
875
|
}
|
|
40
876
|
}
|
|
41
|
-
function
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
877
|
+
function kebabToPascal(s) {
|
|
878
|
+
return s.split("-").filter(Boolean).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
|
|
879
|
+
}
|
|
880
|
+
function componentFromDeepImport(source) {
|
|
881
|
+
const match = source.match(/^@pathscale\/ui\/components\/([^/]+)/);
|
|
882
|
+
if (!match)
|
|
883
|
+
return null;
|
|
884
|
+
return kebabToPascal(match[1]);
|
|
885
|
+
}
|
|
886
|
+
function isUiImport(source) {
|
|
887
|
+
return Boolean(source?.startsWith("@pathscale/ui"));
|
|
888
|
+
}
|
|
889
|
+
function isRecord(v) {
|
|
890
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
891
|
+
}
|
|
892
|
+
function getString(value, key) {
|
|
893
|
+
if (!isRecord(value))
|
|
894
|
+
return;
|
|
895
|
+
const prop = value[key];
|
|
896
|
+
return typeof prop === "string" ? prop : undefined;
|
|
897
|
+
}
|
|
898
|
+
function getBoolean(value, key) {
|
|
899
|
+
if (!isRecord(value))
|
|
900
|
+
return false;
|
|
901
|
+
return value[key] === true;
|
|
902
|
+
}
|
|
903
|
+
function getPathString(value, ...keys) {
|
|
904
|
+
let current = value;
|
|
905
|
+
for (const key of keys) {
|
|
906
|
+
if (!isRecord(current))
|
|
907
|
+
return;
|
|
908
|
+
current = current[key];
|
|
909
|
+
}
|
|
910
|
+
return typeof current === "string" ? current : undefined;
|
|
911
|
+
}
|
|
912
|
+
function getArray(value, key) {
|
|
913
|
+
if (!isRecord(value))
|
|
914
|
+
return [];
|
|
915
|
+
const prop = value[key];
|
|
916
|
+
return Array.isArray(prop) ? prop : [];
|
|
917
|
+
}
|
|
918
|
+
function joinPath(base, rel) {
|
|
919
|
+
return `${base.replace(/\/+$/, "")}/${rel.replace(/^\/+/, "")}`;
|
|
920
|
+
}
|
|
921
|
+
function canonicalImportedName(spec, source) {
|
|
922
|
+
const type = getString(spec, "type");
|
|
923
|
+
if (getBoolean(spec, "isTypeOnly"))
|
|
924
|
+
return null;
|
|
925
|
+
const deepComponent = componentFromDeepImport(source);
|
|
926
|
+
if (deepComponent) {
|
|
927
|
+
return deepComponent;
|
|
928
|
+
}
|
|
929
|
+
if (source === "@pathscale/ui" && type === "ImportSpecifier") {
|
|
930
|
+
return getPathString(spec, "imported", "value") ?? getPathString(spec, "local", "value") ?? null;
|
|
931
|
+
}
|
|
932
|
+
return null;
|
|
933
|
+
}
|
|
934
|
+
function conservativeUsage(component, source) {
|
|
935
|
+
return {
|
|
936
|
+
component,
|
|
937
|
+
props: new Map,
|
|
938
|
+
booleanProps: new Set,
|
|
939
|
+
hasSpread: true,
|
|
940
|
+
source
|
|
941
|
+
};
|
|
942
|
+
}
|
|
943
|
+
function extractUIBindings(ast) {
|
|
944
|
+
const bindings = {
|
|
945
|
+
components: new Map,
|
|
946
|
+
namespaces: new Map,
|
|
947
|
+
conservativeUsages: []
|
|
948
|
+
};
|
|
949
|
+
for (const node of getArray(ast, "body")) {
|
|
950
|
+
const nodeType = getString(node, "type");
|
|
951
|
+
if (nodeType === "ImportDeclaration") {
|
|
952
|
+
const source = getPathString(node, "source", "value");
|
|
953
|
+
if (!isUiImport(source))
|
|
954
|
+
continue;
|
|
955
|
+
for (const spec of getArray(node, "specifiers")) {
|
|
956
|
+
const specType = getString(spec, "type");
|
|
957
|
+
if (specType === "ImportSpecifier") {
|
|
958
|
+
const local = getPathString(spec, "local", "value");
|
|
959
|
+
const canonical = canonicalImportedName(spec, source);
|
|
960
|
+
if (local && canonical)
|
|
961
|
+
bindings.components.set(local, canonical);
|
|
962
|
+
} else if (specType === "ImportDefaultSpecifier") {
|
|
963
|
+
const local = getPathString(spec, "local", "value");
|
|
964
|
+
const canonical = componentFromDeepImport(source) ?? local;
|
|
965
|
+
if (local && canonical)
|
|
966
|
+
bindings.components.set(local, canonical);
|
|
967
|
+
} else if (specType === "ImportNamespaceSpecifier") {
|
|
968
|
+
const local = getPathString(spec, "local", "value");
|
|
969
|
+
if (local)
|
|
970
|
+
bindings.namespaces.set(local, componentFromDeepImport(source));
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
if (nodeType === "ExportNamedDeclaration" && isUiImport(getPathString(node, "source", "value"))) {
|
|
975
|
+
const source = getPathString(node, "source", "value");
|
|
976
|
+
if (!source)
|
|
977
|
+
continue;
|
|
978
|
+
const deepComponent = componentFromDeepImport(source);
|
|
979
|
+
for (const spec of getArray(node, "specifiers")) {
|
|
980
|
+
const exported = getPathString(spec, "orig", "value") ?? getPathString(spec, "local", "value") ?? getPathString(spec, "exported", "value") ?? deepComponent;
|
|
981
|
+
const canonical = deepComponent ?? exported;
|
|
982
|
+
if (canonical)
|
|
983
|
+
bindings.conservativeUsages.push(conservativeUsage(canonical, source));
|
|
59
984
|
}
|
|
60
985
|
}
|
|
986
|
+
if (nodeType === "ExportAllDeclaration" && isUiImport(getPathString(node, "source", "value"))) {
|
|
987
|
+
const source = getPathString(node, "source", "value");
|
|
988
|
+
if (!source)
|
|
989
|
+
continue;
|
|
990
|
+
const deepComponent = componentFromDeepImport(source);
|
|
991
|
+
if (deepComponent) {
|
|
992
|
+
bindings.conservativeUsages.push(conservativeUsage(deepComponent, source));
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
return bindings;
|
|
997
|
+
}
|
|
998
|
+
function extractUIImports(ast) {
|
|
999
|
+
return extractUIBindings(ast).components;
|
|
1000
|
+
}
|
|
1001
|
+
function jsxNameParts(name) {
|
|
1002
|
+
if (!name)
|
|
1003
|
+
return [];
|
|
1004
|
+
const type = getString(name, "type");
|
|
1005
|
+
const value = getString(name, "value");
|
|
1006
|
+
if ((type === "Identifier" || type === "JSXIdentifier") && value)
|
|
1007
|
+
return [value];
|
|
1008
|
+
if (type === "JSXMemberExpression") {
|
|
1009
|
+
return [
|
|
1010
|
+
...jsxNameParts(isRecord(name) ? name.object : undefined),
|
|
1011
|
+
...jsxNameParts(isRecord(name) ? name.property : undefined)
|
|
1012
|
+
];
|
|
1013
|
+
}
|
|
1014
|
+
return [];
|
|
1015
|
+
}
|
|
1016
|
+
function canonicalComponentFromJsx(parts, bindings) {
|
|
1017
|
+
if (parts.length === 0)
|
|
1018
|
+
return null;
|
|
1019
|
+
const [root, ...members] = parts;
|
|
1020
|
+
const namespaceComponent = bindings.namespaces.get(root);
|
|
1021
|
+
if (bindings.namespaces.has(root)) {
|
|
1022
|
+
if (namespaceComponent) {
|
|
1023
|
+
return [namespaceComponent, ...members].join(".");
|
|
1024
|
+
}
|
|
1025
|
+
return members.join(".") || null;
|
|
61
1026
|
}
|
|
62
|
-
|
|
1027
|
+
const rootComponent = bindings.components.get(root);
|
|
1028
|
+
if (!rootComponent)
|
|
1029
|
+
return null;
|
|
1030
|
+
return [rootComponent, ...members].join(".");
|
|
63
1031
|
}
|
|
64
1032
|
function extractJSXUsages(ast, uiComponents) {
|
|
1033
|
+
const bindings = {
|
|
1034
|
+
components: uiComponents,
|
|
1035
|
+
namespaces: extractUIBindings(ast).namespaces,
|
|
1036
|
+
conservativeUsages: []
|
|
1037
|
+
};
|
|
65
1038
|
const usages = [];
|
|
66
1039
|
walkAST(ast, (node) => {
|
|
67
|
-
if (node
|
|
1040
|
+
if (getString(node, "type") !== "JSXOpeningElement")
|
|
68
1041
|
return;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (node.name?.type === "Identifier") {
|
|
72
|
-
elementName = node.name.value;
|
|
73
|
-
rootName = elementName;
|
|
74
|
-
} else if (node.name?.type === "JSXMemberExpression") {
|
|
75
|
-
const parts = [];
|
|
76
|
-
let cursor = node.name;
|
|
77
|
-
while (cursor?.type === "JSXMemberExpression") {
|
|
78
|
-
parts.unshift(cursor.property?.value);
|
|
79
|
-
cursor = cursor.object;
|
|
80
|
-
}
|
|
81
|
-
if (cursor?.type === "Identifier") {
|
|
82
|
-
parts.unshift(cursor.value);
|
|
83
|
-
rootName = cursor.value;
|
|
84
|
-
}
|
|
85
|
-
elementName = parts.join(".");
|
|
86
|
-
}
|
|
87
|
-
if (!rootName || !uiComponents.has(rootName))
|
|
1042
|
+
const component = canonicalComponentFromJsx(jsxNameParts(node.name), bindings);
|
|
1043
|
+
if (!component)
|
|
88
1044
|
return;
|
|
89
1045
|
const usage = {
|
|
90
|
-
component
|
|
1046
|
+
component,
|
|
91
1047
|
props: new Map,
|
|
92
1048
|
booleanProps: new Set,
|
|
93
1049
|
hasSpread: false
|
|
94
1050
|
};
|
|
95
|
-
for (const attr of node
|
|
96
|
-
|
|
1051
|
+
for (const attr of getArray(node, "attributes")) {
|
|
1052
|
+
const attrType = getString(attr, "type");
|
|
1053
|
+
if (attrType === "SpreadElement" || attrType === "JSXSpreadAttribute") {
|
|
97
1054
|
usage.hasSpread = true;
|
|
98
1055
|
continue;
|
|
99
1056
|
}
|
|
100
|
-
if (
|
|
1057
|
+
if (attrType !== "JSXAttribute")
|
|
101
1058
|
continue;
|
|
102
|
-
const propName = attr
|
|
1059
|
+
const propName = getPathString(attr, "name", "value");
|
|
103
1060
|
if (!propName)
|
|
104
1061
|
continue;
|
|
105
|
-
|
|
1062
|
+
const attrValue = isRecord(attr) ? attr.value : undefined;
|
|
1063
|
+
const attrValueType = getString(attrValue, "type");
|
|
1064
|
+
if (!attrValue) {
|
|
106
1065
|
usage.booleanProps.add(propName);
|
|
107
|
-
} else if (
|
|
108
|
-
usage.props.set(propName,
|
|
1066
|
+
} else if (attrValueType === "StringLiteral") {
|
|
1067
|
+
usage.props.set(propName, getString(attrValue, "value") ?? "");
|
|
109
1068
|
} else {
|
|
110
1069
|
usage.props.set(propName, "DYNAMIC");
|
|
111
1070
|
}
|
|
@@ -114,20 +1073,36 @@ function extractJSXUsages(ast, uiComponents) {
|
|
|
114
1073
|
});
|
|
115
1074
|
return usages;
|
|
116
1075
|
}
|
|
1076
|
+
function manifestComponents(manifest) {
|
|
1077
|
+
if (isPurgeDatabaseV2(manifest)) {
|
|
1078
|
+
return manifest.components;
|
|
1079
|
+
}
|
|
1080
|
+
return manifest;
|
|
1081
|
+
}
|
|
1082
|
+
function isPurgeDatabaseV2(manifest) {
|
|
1083
|
+
return manifest.version === 2 && isRecord(manifest.components);
|
|
1084
|
+
}
|
|
117
1085
|
function buildSafelists(allUsages, manifest) {
|
|
118
1086
|
const classSafelist = new Set;
|
|
119
1087
|
const attrSafelist = new Set;
|
|
1088
|
+
const usedComponents = new Set;
|
|
1089
|
+
const dynamicComponents = new Set;
|
|
120
1090
|
const componentUsages = new Map;
|
|
121
|
-
|
|
1091
|
+
const components = manifestComponents(manifest);
|
|
1092
|
+
for (const usage of expandDependencyUsages(allUsages, components)) {
|
|
122
1093
|
const existing = componentUsages.get(usage.component) ?? [];
|
|
123
1094
|
existing.push(usage);
|
|
124
1095
|
componentUsages.set(usage.component, existing);
|
|
1096
|
+
usedComponents.add(usage.component);
|
|
1097
|
+
if (usage.hasSpread || [...usage.props.values()].includes("DYNAMIC")) {
|
|
1098
|
+
dynamicComponents.add(usage.component);
|
|
1099
|
+
}
|
|
125
1100
|
}
|
|
126
|
-
for (const [entryName, entry] of Object.entries(
|
|
1101
|
+
for (const [entryName, entry] of Object.entries(components)) {
|
|
127
1102
|
const matchingUsages = findMatchingUsages(entryName, componentUsages);
|
|
128
|
-
if (matchingUsages.length === 0)
|
|
1103
|
+
if (matchingUsages.length === 0)
|
|
129
1104
|
continue;
|
|
130
|
-
|
|
1105
|
+
usedComponents.add(entryName);
|
|
131
1106
|
for (const cls of entry.classes.always) {
|
|
132
1107
|
classSafelist.add(cls);
|
|
133
1108
|
}
|
|
@@ -158,28 +1133,65 @@ function buildSafelists(allUsages, manifest) {
|
|
|
158
1133
|
for (const [propName, attrMap] of Object.entries(entry.attrs)) {
|
|
159
1134
|
if (isPropUsed(propName, matchingUsages)) {
|
|
160
1135
|
for (const [attr, val] of Object.entries(attrMap)) {
|
|
161
|
-
attrSafelist.add(
|
|
1136
|
+
attrSafelist.add(`[${attr}="${val}"]`);
|
|
162
1137
|
}
|
|
163
1138
|
}
|
|
164
1139
|
}
|
|
165
1140
|
}
|
|
166
1141
|
}
|
|
167
|
-
return { classSafelist, attrSafelist };
|
|
1142
|
+
return { classSafelist, attrSafelist, usedComponents, dynamicComponents };
|
|
168
1143
|
}
|
|
169
|
-
function
|
|
170
|
-
|
|
171
|
-
|
|
1144
|
+
function expandDependencyUsages(allUsages, manifest) {
|
|
1145
|
+
const result = [...allUsages];
|
|
1146
|
+
const queue = [...allUsages.map((usage) => rootComponent(usage.component))];
|
|
1147
|
+
const seen = new Set(queue);
|
|
1148
|
+
while (queue.length > 0) {
|
|
1149
|
+
const root = queue.pop();
|
|
1150
|
+
if (!root)
|
|
1151
|
+
continue;
|
|
1152
|
+
const deps = depsForRoot(root, manifest);
|
|
1153
|
+
for (const dep of deps) {
|
|
1154
|
+
if (seen.has(dep))
|
|
1155
|
+
continue;
|
|
1156
|
+
seen.add(dep);
|
|
1157
|
+
queue.push(dep);
|
|
1158
|
+
result.push(conservativeUsage(dep, "manifest-dependency"));
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
return result;
|
|
1162
|
+
}
|
|
1163
|
+
function depsForRoot(root, manifest) {
|
|
1164
|
+
const deps = new Set;
|
|
1165
|
+
for (const [key, entry] of Object.entries(manifest)) {
|
|
1166
|
+
if (rootComponent(key) !== root)
|
|
1167
|
+
continue;
|
|
1168
|
+
for (const dep of entry.deps ?? [])
|
|
1169
|
+
deps.add(dep);
|
|
172
1170
|
}
|
|
173
|
-
|
|
1171
|
+
return [...deps];
|
|
1172
|
+
}
|
|
1173
|
+
function rootComponent(component) {
|
|
1174
|
+
return component.split(".")[0];
|
|
1175
|
+
}
|
|
1176
|
+
function findMatchingUsages(entryName, usageMap) {
|
|
1177
|
+
const direct = usageMap.get(entryName) ?? [];
|
|
1178
|
+
const results = [...direct];
|
|
1179
|
+
const entryRoot = rootComponent(entryName);
|
|
174
1180
|
for (const [usageName, usages] of usageMap) {
|
|
175
|
-
if (usageName === entryName)
|
|
176
|
-
|
|
1181
|
+
if (usageName === entryName)
|
|
1182
|
+
continue;
|
|
1183
|
+
if (!entryName.includes(".") && rootComponent(usageName) === entryName) {
|
|
1184
|
+
results.push(...usages.map((usage) => ({
|
|
1185
|
+
...usage,
|
|
1186
|
+
component: entryName,
|
|
1187
|
+
props: new Map([...usage.props, ["slot", "DYNAMIC"]])
|
|
1188
|
+
})));
|
|
177
1189
|
}
|
|
178
|
-
if (entryName.includes(".")) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
1190
|
+
if (entryName.includes(".") && (usageName === entryRoot || rootComponent(usageName) === entryRoot)) {
|
|
1191
|
+
results.push(...usages.map((usage) => ({
|
|
1192
|
+
...usage,
|
|
1193
|
+
hasSpread: true
|
|
1194
|
+
})));
|
|
183
1195
|
}
|
|
184
1196
|
}
|
|
185
1197
|
return results;
|
|
@@ -216,26 +1228,376 @@ async function scanConsumerSource(srcDir) {
|
|
|
216
1228
|
for await (const relPath of glob.scan({ cwd: srcDir })) {
|
|
217
1229
|
if (relPath.includes("node_modules"))
|
|
218
1230
|
continue;
|
|
219
|
-
const fullPath =
|
|
1231
|
+
const fullPath = joinPath(srcDir, relPath);
|
|
220
1232
|
const code = await Bun.file(fullPath).text();
|
|
221
1233
|
if (!code.includes("@pathscale/ui"))
|
|
222
1234
|
continue;
|
|
223
1235
|
const isTsx = /\.[tj]sx$/.test(relPath);
|
|
224
1236
|
const ast = await swc.parse(code, { syntax: "typescript", tsx: isTsx });
|
|
225
|
-
const
|
|
226
|
-
if (
|
|
1237
|
+
const bindings = extractUIBindings(ast);
|
|
1238
|
+
if (bindings.components.size === 0 && bindings.namespaces.size === 0 && bindings.conservativeUsages.length === 0) {
|
|
227
1239
|
continue;
|
|
228
|
-
|
|
1240
|
+
}
|
|
1241
|
+
allUsages.push(...bindings.conservativeUsages);
|
|
1242
|
+
const jsxUsages = extractJSXUsages(ast, bindings.components);
|
|
1243
|
+
allUsages.push(...jsxUsages);
|
|
1244
|
+
for (const component of bindings.components.values()) {
|
|
1245
|
+
if (jsxUsages.some((usage) => usage.component === component || usage.component.startsWith(`${component}.`))) {
|
|
1246
|
+
continue;
|
|
1247
|
+
}
|
|
1248
|
+
allUsages.push(conservativeUsage(component, "import-without-direct-jsx"));
|
|
1249
|
+
}
|
|
229
1250
|
}
|
|
230
1251
|
return allUsages;
|
|
231
1252
|
}
|
|
232
1253
|
if (false) {}
|
|
1254
|
+
|
|
1255
|
+
// src/postbuild-purge.ts
|
|
1256
|
+
function parseArgs(argv) {
|
|
1257
|
+
const args = argv.slice(2);
|
|
1258
|
+
let distDir = "./dist";
|
|
1259
|
+
let srcDir = "./src";
|
|
1260
|
+
let manifestPath = "";
|
|
1261
|
+
for (let i = 0;i < args.length; i++) {
|
|
1262
|
+
if (args[i] === "--dist" && args[i + 1])
|
|
1263
|
+
distDir = args[++i];
|
|
1264
|
+
else if (args[i] === "--src" && args[i + 1])
|
|
1265
|
+
srcDir = args[++i];
|
|
1266
|
+
else if (args[i] === "--manifest" && args[i + 1])
|
|
1267
|
+
manifestPath = args[++i];
|
|
1268
|
+
}
|
|
1269
|
+
if (!manifestPath) {
|
|
1270
|
+
console.error("Usage: bunx @pathscale/rsbuild-plugin-ui-css-purge --manifest <path> [--dist <path>] [--src <path>]");
|
|
1271
|
+
process.exit(1);
|
|
1272
|
+
}
|
|
1273
|
+
return { distDir, srcDir, manifestPath };
|
|
1274
|
+
}
|
|
1275
|
+
function normalizePurgeDatabase(manifest) {
|
|
1276
|
+
const rawComponents = "version" in manifest && manifest.version === 2 ? manifest.components : manifest;
|
|
1277
|
+
const components = {};
|
|
1278
|
+
for (const [key, record] of Object.entries(rawComponents)) {
|
|
1279
|
+
const maybeV2 = record;
|
|
1280
|
+
const [fallbackComponent, fallbackPart] = splitComponentKey(key);
|
|
1281
|
+
components[key] = {
|
|
1282
|
+
...record,
|
|
1283
|
+
key: maybeV2.key ?? key,
|
|
1284
|
+
component: maybeV2.component ?? fallbackComponent,
|
|
1285
|
+
part: maybeV2.part ?? fallbackPart,
|
|
1286
|
+
selectors: maybeV2.selectors ?? [],
|
|
1287
|
+
attributeSelectors: maybeV2.attributeSelectors ?? [],
|
|
1288
|
+
cssVars: {
|
|
1289
|
+
declared: maybeV2.cssVars?.declared ?? [],
|
|
1290
|
+
referenced: maybeV2.cssVars?.referenced ?? []
|
|
1291
|
+
},
|
|
1292
|
+
keyframes: {
|
|
1293
|
+
declared: maybeV2.keyframes?.declared ?? [],
|
|
1294
|
+
referenced: maybeV2.keyframes?.referenced ?? []
|
|
1295
|
+
}
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
1298
|
+
return { version: 2, components };
|
|
1299
|
+
}
|
|
1300
|
+
function splitComponentKey(key) {
|
|
1301
|
+
const [component, ...part] = key.split(".");
|
|
1302
|
+
return [component, part.length > 0 ? part.join(".") : undefined];
|
|
1303
|
+
}
|
|
1304
|
+
function rootComponent2(key) {
|
|
1305
|
+
return key.split(".")[0];
|
|
1306
|
+
}
|
|
1307
|
+
function collectClassesFromEntry(entry) {
|
|
1308
|
+
const result = [...entry.classes.always];
|
|
1309
|
+
for (const value of Object.values(entry.classes.byProp)) {
|
|
1310
|
+
if (Array.isArray(value)) {
|
|
1311
|
+
result.push(...value);
|
|
1312
|
+
} else {
|
|
1313
|
+
for (const classes of Object.values(value)) {
|
|
1314
|
+
result.push(...classes);
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
return [...new Set(result)];
|
|
1319
|
+
}
|
|
1320
|
+
function buildClassOwners(database) {
|
|
1321
|
+
const owners = new Map;
|
|
1322
|
+
for (const [key, entry] of Object.entries(database.components)) {
|
|
1323
|
+
for (const cls of collectClassesFromEntry(entry)) {
|
|
1324
|
+
const existing = owners.get(cls) ?? new Set;
|
|
1325
|
+
existing.add(key);
|
|
1326
|
+
owners.set(cls, existing);
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
return owners;
|
|
1330
|
+
}
|
|
1331
|
+
function isRecordUsed(recordKey, safelists) {
|
|
1332
|
+
return safelists.usedComponents.has(recordKey) || safelists.usedComponents.has(rootComponent2(recordKey));
|
|
1333
|
+
}
|
|
1334
|
+
function isClassAllowed(cls, owners, safelists) {
|
|
1335
|
+
const classOwners = owners.get(cls);
|
|
1336
|
+
if (!classOwners)
|
|
1337
|
+
return true;
|
|
1338
|
+
for (const owner of classOwners) {
|
|
1339
|
+
if (isRecordUsed(owner, safelists) && safelists.classSafelist.has(cls)) {
|
|
1340
|
+
return true;
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
return false;
|
|
1344
|
+
}
|
|
1345
|
+
function emptySelectorReport() {
|
|
1346
|
+
return {
|
|
1347
|
+
selectorsKeptKnown: 0,
|
|
1348
|
+
selectorsKeptUnknown: 0,
|
|
1349
|
+
selectorsRemoved: 0,
|
|
1350
|
+
selectorsRemovedUnusedComponent: 0,
|
|
1351
|
+
selectorsRemovedUnusedVariant: 0,
|
|
1352
|
+
attrSelectorsSeen: 0,
|
|
1353
|
+
keyframesRemoved: 0,
|
|
1354
|
+
fontFacesRemoved: 0
|
|
1355
|
+
};
|
|
1356
|
+
}
|
|
1357
|
+
function unescapeCss(s) {
|
|
1358
|
+
return s.replace(/\\(.)/g, "$1");
|
|
1359
|
+
}
|
|
1360
|
+
function extractClassesFromSelector(selector) {
|
|
1361
|
+
const matches = selector.matchAll(/\.([a-zA-Z_-](?:[a-zA-Z0-9_-]|\\[^\s.#:[>+~,)]*)*)/g);
|
|
1362
|
+
return [...matches].map((m) => unescapeCss(m[1]));
|
|
1363
|
+
}
|
|
1364
|
+
function extractAttrsFromSelector(selector) {
|
|
1365
|
+
const matches = selector.matchAll(/\[(data-[a-zA-Z0-9_-]+|aria-[a-zA-Z0-9_-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\]]+)))?\]/g);
|
|
1366
|
+
return [...matches].map((m) => {
|
|
1367
|
+
const value = m[2] ?? m[3] ?? m[4];
|
|
1368
|
+
return value === undefined ? `[${m[1]}]` : `[${m[1]}="${value.trim()}"]`;
|
|
1369
|
+
});
|
|
1370
|
+
}
|
|
1371
|
+
function selectorDecision(selector, owners, safelists) {
|
|
1372
|
+
const classes = extractClassesFromSelector(selector);
|
|
1373
|
+
if (classes.length === 0)
|
|
1374
|
+
return "keep-unknown";
|
|
1375
|
+
const hasUnknownClass = classes.some((cls) => !owners.has(cls));
|
|
1376
|
+
if (hasUnknownClass)
|
|
1377
|
+
return "keep-unknown";
|
|
1378
|
+
const hasUsedOwner = classes.some((cls) => {
|
|
1379
|
+
const classOwners = owners.get(cls);
|
|
1380
|
+
return [...classOwners ?? []].some((owner) => isRecordUsed(owner, safelists));
|
|
1381
|
+
});
|
|
1382
|
+
if (!hasUsedOwner)
|
|
1383
|
+
return "remove-unused-component";
|
|
1384
|
+
if (classes.every((cls) => isClassAllowed(cls, owners, safelists))) {
|
|
1385
|
+
return "keep-known";
|
|
1386
|
+
}
|
|
1387
|
+
return "remove-unused-variant";
|
|
1388
|
+
}
|
|
1389
|
+
function purgeCssWithDatabase(css, manifest, safelists) {
|
|
1390
|
+
const database = normalizePurgeDatabase(manifest);
|
|
1391
|
+
const classOwners = buildClassOwners(database);
|
|
1392
|
+
const report = emptySelectorReport();
|
|
1393
|
+
const root = postcss.parse(css);
|
|
1394
|
+
root.walkRules((rule) => {
|
|
1395
|
+
const selectors = rule.selectors;
|
|
1396
|
+
const kept = [];
|
|
1397
|
+
for (const selector of selectors) {
|
|
1398
|
+
report.attrSelectorsSeen += extractAttrsFromSelector(selector).length;
|
|
1399
|
+
const decision = selectorDecision(selector, classOwners, safelists);
|
|
1400
|
+
if (decision === "keep-known") {
|
|
1401
|
+
report.selectorsKeptKnown++;
|
|
1402
|
+
kept.push(selector);
|
|
1403
|
+
} else if (decision === "keep-unknown") {
|
|
1404
|
+
report.selectorsKeptUnknown++;
|
|
1405
|
+
kept.push(selector);
|
|
1406
|
+
} else {
|
|
1407
|
+
report.selectorsRemoved++;
|
|
1408
|
+
if (decision === "remove-unused-component") {
|
|
1409
|
+
report.selectorsRemovedUnusedComponent++;
|
|
1410
|
+
} else {
|
|
1411
|
+
report.selectorsRemovedUnusedVariant++;
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
if (kept.length === 0) {
|
|
1416
|
+
rule.remove();
|
|
1417
|
+
} else if (kept.length < selectors.length) {
|
|
1418
|
+
rule.selectors = kept;
|
|
1419
|
+
}
|
|
1420
|
+
});
|
|
1421
|
+
removeUnusedKeyframes(root, report);
|
|
1422
|
+
removeUnusedFontFaces(root, report);
|
|
1423
|
+
removeEmptyAtRules(root);
|
|
1424
|
+
return { css: root.toString(), report };
|
|
1425
|
+
}
|
|
1426
|
+
function removeUnusedKeyframes(root, report) {
|
|
1427
|
+
const usedKeyframes = new Set;
|
|
1428
|
+
root.walkDecls(/^animation(-name)?$/, (decl) => {
|
|
1429
|
+
for (const part of decl.value.split(",")) {
|
|
1430
|
+
const name = part.trim().split(/\s+/)[0];
|
|
1431
|
+
if (name && !["none", "initial", "inherit", "unset"].includes(name)) {
|
|
1432
|
+
usedKeyframes.add(name);
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
});
|
|
1436
|
+
root.walkAtRules("keyframes", (atRule) => {
|
|
1437
|
+
if (!usedKeyframes.has(atRule.params.trim())) {
|
|
1438
|
+
atRule.remove();
|
|
1439
|
+
report.keyframesRemoved++;
|
|
1440
|
+
}
|
|
1441
|
+
});
|
|
1442
|
+
}
|
|
1443
|
+
function removeUnusedFontFaces(root, report) {
|
|
1444
|
+
const usedFonts = new Set;
|
|
1445
|
+
root.walkDecls(/^font(-family)?$/, (decl) => {
|
|
1446
|
+
for (const part of decl.value.split(",")) {
|
|
1447
|
+
const name = part.trim().replace(/^["']|["']$/g, "");
|
|
1448
|
+
if (name)
|
|
1449
|
+
usedFonts.add(name);
|
|
1450
|
+
}
|
|
1451
|
+
});
|
|
1452
|
+
root.walkAtRules("font-face", (atRule) => {
|
|
1453
|
+
let family = "";
|
|
1454
|
+
atRule.walkDecls("font-family", (decl) => {
|
|
1455
|
+
family = decl.value.trim().replace(/^["']|["']$/g, "");
|
|
1456
|
+
});
|
|
1457
|
+
if (family && !usedFonts.has(family)) {
|
|
1458
|
+
atRule.remove();
|
|
1459
|
+
report.fontFacesRemoved++;
|
|
1460
|
+
}
|
|
1461
|
+
});
|
|
1462
|
+
}
|
|
1463
|
+
function removeEmptyAtRules(root) {
|
|
1464
|
+
let cleaned = true;
|
|
1465
|
+
while (cleaned) {
|
|
1466
|
+
cleaned = false;
|
|
1467
|
+
root.walkAtRules((atRule) => {
|
|
1468
|
+
if (atRule.nodes && atRule.nodes.length === 0) {
|
|
1469
|
+
atRule.remove();
|
|
1470
|
+
cleaned = true;
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
async function collectRuntimeCssVarRefs(distDir) {
|
|
1476
|
+
const refs = new Set;
|
|
1477
|
+
const glob = new Glob2("**/*.{js,mjs,cjs}");
|
|
1478
|
+
for await (const relPath of glob.scan({ cwd: distDir })) {
|
|
1479
|
+
const fullPath = `${distDir}/${relPath}`;
|
|
1480
|
+
const code = await Bun.file(fullPath).text();
|
|
1481
|
+
for (const match of code.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g)) {
|
|
1482
|
+
refs.add(match[1]);
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
return refs;
|
|
1486
|
+
}
|
|
1487
|
+
function cleanUnusedVarsWithReport(css, externallyReferencedVars) {
|
|
1488
|
+
let changed = true;
|
|
1489
|
+
let result = css;
|
|
1490
|
+
let removed = 0;
|
|
1491
|
+
while (changed) {
|
|
1492
|
+
changed = false;
|
|
1493
|
+
const root = postcss.parse(result);
|
|
1494
|
+
const declared = new Map;
|
|
1495
|
+
root.walkDecls(/^--/, (decl) => {
|
|
1496
|
+
const entries = declared.get(decl.prop) ?? [];
|
|
1497
|
+
entries.push({ rule: decl.parent, prop: decl.prop });
|
|
1498
|
+
declared.set(decl.prop, entries);
|
|
1499
|
+
});
|
|
1500
|
+
const referenced = new Set(externallyReferencedVars);
|
|
1501
|
+
root.walkDecls((decl) => {
|
|
1502
|
+
for (const ref of decl.value.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g)) {
|
|
1503
|
+
referenced.add(ref[1]);
|
|
1504
|
+
}
|
|
1505
|
+
});
|
|
1506
|
+
for (const [varName, entries] of declared) {
|
|
1507
|
+
if (!referenced.has(varName)) {
|
|
1508
|
+
for (const entry of entries) {
|
|
1509
|
+
entry.rule.walkDecls(entry.prop, (decl) => {
|
|
1510
|
+
decl.remove();
|
|
1511
|
+
changed = true;
|
|
1512
|
+
removed++;
|
|
1513
|
+
});
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
root.walkRules((rule) => {
|
|
1518
|
+
if (rule.nodes && rule.nodes.length === 0)
|
|
1519
|
+
rule.remove();
|
|
1520
|
+
});
|
|
1521
|
+
removeEmptyAtRules(root);
|
|
1522
|
+
result = root.toString();
|
|
1523
|
+
}
|
|
1524
|
+
return { css: result, removed };
|
|
1525
|
+
}
|
|
1526
|
+
function cleanUnusedVars(css, externallyReferencedVars) {
|
|
1527
|
+
return cleanUnusedVarsWithReport(css, externallyReferencedVars).css;
|
|
1528
|
+
}
|
|
1529
|
+
function minify(css) {
|
|
1530
|
+
const { code } = transform({
|
|
1531
|
+
filename: "purged.css",
|
|
1532
|
+
code: Buffer.from(css),
|
|
1533
|
+
minify: true,
|
|
1534
|
+
errorRecovery: true
|
|
1535
|
+
});
|
|
1536
|
+
return code.toString();
|
|
1537
|
+
}
|
|
1538
|
+
async function main() {
|
|
1539
|
+
const { distDir, srcDir, manifestPath } = parseArgs(process.argv);
|
|
1540
|
+
const manifest = JSON.parse(await Bun.file(manifestPath).text());
|
|
1541
|
+
const database = normalizePurgeDatabase(manifest);
|
|
1542
|
+
const roots = new Set(Object.keys(database.components).map(rootComponent2));
|
|
1543
|
+
console.log(`[css-purge] Database loaded: ${Object.keys(database.components).length} records (${roots.size} components)`);
|
|
1544
|
+
const usages = await scanConsumerSource(srcDir);
|
|
1545
|
+
const safelists = buildSafelists(usages, manifest);
|
|
1546
|
+
const usedRoots = new Set([...safelists.usedComponents].map(rootComponent2));
|
|
1547
|
+
const removedRoots = [...roots].filter((root) => !usedRoots.has(root));
|
|
1548
|
+
console.log(`[css-purge] Components detected: ${usedRoots.size} used, ${removedRoots.length} removable`);
|
|
1549
|
+
if (usedRoots.size > 0) {
|
|
1550
|
+
console.log(`[css-purge] used: ${[...usedRoots].sort().join(", ")}`);
|
|
1551
|
+
}
|
|
1552
|
+
if (removedRoots.length > 0) {
|
|
1553
|
+
console.log(`[css-purge] removable: ${removedRoots.sort().join(", ")}`);
|
|
1554
|
+
}
|
|
1555
|
+
console.log(`[css-purge] Safelist facts: ${safelists.classSafelist.size} classes, ${safelists.attrSafelist.size} attr selectors`);
|
|
1556
|
+
const runtimeCssVarRefs = await collectRuntimeCssVarRefs(distDir);
|
|
1557
|
+
if (runtimeCssVarRefs.size > 0) {
|
|
1558
|
+
console.log(`[css-purge] Runtime CSS vars referenced from JS: ${runtimeCssVarRefs.size}`);
|
|
1559
|
+
}
|
|
1560
|
+
const glob = new Glob2("**/*.css");
|
|
1561
|
+
let totalBefore = 0;
|
|
1562
|
+
let totalAfter = 0;
|
|
1563
|
+
for await (const relPath of glob.scan({ cwd: distDir })) {
|
|
1564
|
+
const fullPath = `${distDir}/${relPath}`;
|
|
1565
|
+
const originalCss = await Bun.file(fullPath).text();
|
|
1566
|
+
const originalSize = Buffer.byteLength(originalCss, "utf-8");
|
|
1567
|
+
totalBefore += originalSize;
|
|
1568
|
+
console.log(`[css-purge] Processing ${relPath} (${(originalSize / 1024).toFixed(1)} KB)`);
|
|
1569
|
+
const purged = purgeCssWithDatabase(originalCss, database, safelists);
|
|
1570
|
+
let purgedCss = purged.css;
|
|
1571
|
+
const afterSelectors = Buffer.byteLength(purgedCss, "utf-8");
|
|
1572
|
+
console.log(`[css-purge] selectors: ${(originalSize / 1024).toFixed(1)} -> ${(afterSelectors / 1024).toFixed(1)} KB (${purged.report.selectorsRemoved} removed, ${purged.report.selectorsKeptUnknown} kept unknown)`);
|
|
1573
|
+
console.log(`[css-purge] attrs seen: ${purged.report.attrSelectorsSeen}; keyframes removed: ${purged.report.keyframesRemoved}`);
|
|
1574
|
+
const vars = cleanUnusedVarsWithReport(purgedCss, runtimeCssVarRefs);
|
|
1575
|
+
purgedCss = vars.css;
|
|
1576
|
+
const afterVars = Buffer.byteLength(purgedCss, "utf-8");
|
|
1577
|
+
console.log(`[css-purge] vars: ${(afterSelectors / 1024).toFixed(1)} -> ${(afterVars / 1024).toFixed(1)} KB (${vars.removed} removed)`);
|
|
1578
|
+
purgedCss = minify(purgedCss);
|
|
1579
|
+
const finalSize = Buffer.byteLength(purgedCss, "utf-8");
|
|
1580
|
+
totalAfter += finalSize;
|
|
1581
|
+
console.log(`[css-purge] minify: -> ${(finalSize / 1024).toFixed(1)} KB`);
|
|
1582
|
+
console.log(`[css-purge] final: ${(originalSize / 1024).toFixed(1)} -> ${(finalSize / 1024).toFixed(1)} KB (${((1 - finalSize / originalSize) * 100).toFixed(1)}% reduction)`);
|
|
1583
|
+
await Bun.write(fullPath, purgedCss);
|
|
1584
|
+
}
|
|
1585
|
+
console.log(`
|
|
1586
|
+
[css-purge] Total: ${(totalBefore / 1024).toFixed(1)} -> ${(totalAfter / 1024).toFixed(1)} KB (${((1 - totalAfter / totalBefore) * 100).toFixed(1)}% reduction)`);
|
|
1587
|
+
}
|
|
1588
|
+
if (import.meta.main) {
|
|
1589
|
+
main();
|
|
1590
|
+
}
|
|
233
1591
|
export {
|
|
234
1592
|
scanConsumerSource,
|
|
1593
|
+
purgeCssWithDatabase,
|
|
1594
|
+
normalizePurgeDatabase,
|
|
235
1595
|
extractUIImports,
|
|
236
1596
|
extractJSXUsages,
|
|
1597
|
+
cleanUnusedVarsWithReport,
|
|
1598
|
+
cleanUnusedVars,
|
|
237
1599
|
buildSafelists
|
|
238
1600
|
};
|
|
239
1601
|
|
|
240
|
-
//# debugId=
|
|
241
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NjYW4tY29uc3VtZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBDb25zdW1lci1zaWRlIEpTWCBzY2FubmVyLlxuICpcbiAqIFdhbGtzIGEgY29uc3VtZXIncyBzb3VyY2UgdHJlZSwgZmluZHMgY29tcG9uZW50IGltcG9ydHMgZnJvbSBAcGF0aHNjYWxlL3VpLFxuICogY29sbGVjdHMgcHJvcCB2YWx1ZXMsIGFuZCBjcm9zcy1yZWZlcmVuY2VzIHdpdGggdGhlIHB1cmdlIG1hbmlmZXN0IHRvIGJ1aWxkXG4gKiBMZXZlbCAxIChjbGFzcykgYW5kIExldmVsIDIgKGF0dHJpYnV0ZSkgc2FmZWxpc3RzLlxuICpcbiAqIFVzYWdlOiAgYnVuIHJ1biBzcmMvc2Nhbi1jb25zdW1lci50cyA8Y29uc3VtZXItc3JjLWRpcj4gPHB1cmdlLW1hbmlmZXN0Lmpzb24+XG4gKi9cblxuaW1wb3J0IHN3YyBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQgeyBHbG9iIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgQ29tcG9uZW50TWFuaWZlc3Qge1xuICBjbGFzc2VzOiB7XG4gICAgYWx3YXlzOiBzdHJpbmdbXTtcbiAgICBieVByb3A6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+PjtcbiAgfTtcbiAgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgZGVwcz86IHN0cmluZ1tdO1xufVxuXG50eXBlIFB1cmdlTWFuaWZlc3QgPSBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRNYW5pZmVzdD47XG5cbi8qKiBXaGF0IHdlIGNvbGxlY3QgcGVyIGNvbXBvbmVudCB1c2FnZSBmcm9tIEpTWCAqL1xuaW50ZXJmYWNlIFByb3BVc2FnZSB7XG4gIGNvbXBvbmVudDogc3RyaW5nO1xuICBwcm9wczogTWFwPHN0cmluZywgc3RyaW5nIHwgXCJEWU5BTUlDXCI+OyAvLyBwcm9wTmFtZSDihpIgbGl0ZXJhbCB2YWx1ZSBvciBEWU5BTUlDXG4gIGJvb2xlYW5Qcm9wczogU2V0PHN0cmluZz47IC8vIHByb3BzIHByZXNlbnQgd2l0aG91dCBhIHZhbHVlICh0cnV0aHkpXG4gIGhhc1NwcmVhZDogYm9vbGVhbjtcbn1cblxuLy8g4pSA4pSAIEFTVCB3YWxrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIHdhbGtBU1Qobm9kZTogYW55LCB2aXNpdG9yOiAobm9kZTogYW55KSA9PiB2b2lkKSB7XG4gIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuICB2aXNpdG9yKG5vZGUpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgIGlmIChrZXkgPT09IFwic3BhblwiKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWwgPSBub2RlW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2Fsa0FTVChpdGVtLCB2aXNpdG9yKTtcbiAgICB9IGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB3YWxrQVNUKHZhbCwgdmlzaXRvcik7XG4gICAgfVxuICB9XG59XG5cbi8qKiBFeHRyYWN0IEBwYXRoc2NhbGUvdWkgaW1wb3J0cyBmcm9tIGEgcGFyc2VkIG1vZHVsZSAqL1xuZnVuY3Rpb24gZXh0cmFjdFVJSW1wb3J0cyhhc3Q6IGFueSk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBpbXBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBub2RlIG9mIGFzdC5ib2R5KSB7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbXBvcnREZWNsYXJhdGlvblwiKSBjb250aW51ZTtcbiAgICBjb25zdCBzcmMgPSBub2RlLnNvdXJjZT8udmFsdWUgYXMgc3RyaW5nO1xuICAgIGlmICghc3JjIHx8ICFzcmMuc3RhcnRzV2l0aChcIkBwYXRoc2NhbGUvdWlcIikpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIG5vZGUuc3BlY2lmaWVycykge1xuICAgICAgaWYgKHNwZWMudHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICBjb25zdCBpbXBvcnRlZCA9IHNwZWMuaW1wb3J0ZWQ/LnZhbHVlID8/IHNwZWMubG9jYWw/LnZhbHVlO1xuICAgICAgICBjb25zdCBsb2NhbCA9IHNwZWMubG9jYWw/LnZhbHVlO1xuICAgICAgICBpZiAobG9jYWwgJiYgaW1wb3J0ZWQpIGltcG9ydHMuc2V0KGxvY2FsLCBpbXBvcnRlZCk7XG4gICAgICB9IGVsc2UgaWYgKHNwZWMudHlwZSA9PT0gXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpIHtcbiAgICAgICAgY29uc3QgbG9jYWwgPSBzcGVjLmxvY2FsPy52YWx1ZTtcbiAgICAgICAgaWYgKGxvY2FsKSBpbXBvcnRzLnNldChsb2NhbCwgbG9jYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW1wb3J0cztcbn1cblxuLyoqIEV4dHJhY3QgSlNYIHVzYWdlcyBvZiBVSSBjb21wb25lbnRzICovXG5mdW5jdGlvbiBleHRyYWN0SlNYVXNhZ2VzKGFzdDogYW55LCB1aUNvbXBvbmVudHM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9wVXNhZ2VbXSB7XG4gIGNvbnN0IHVzYWdlczogUHJvcFVzYWdlW10gPSBbXTtcblxuICB3YWxrQVNUKGFzdCwgKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlICE9PSBcIkpTWE9wZW5pbmdFbGVtZW50XCIpIHJldHVybjtcblxuICAgIGxldCBlbGVtZW50TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHJvb3ROYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChub2RlLm5hbWU/LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICBlbGVtZW50TmFtZSA9IG5vZGUubmFtZS52YWx1ZTtcbiAgICAgIHJvb3ROYW1lID0gZWxlbWVudE5hbWU7XG4gICAgfSBlbHNlIGlmIChub2RlLm5hbWU/LnR5cGUgPT09IFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBjdXJzb3IgPSBub2RlLm5hbWU7XG4gICAgICB3aGlsZSAoY3Vyc29yPy50eXBlID09PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KGN1cnNvci5wcm9wZXJ0eT8udmFsdWUpO1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3Iub2JqZWN0O1xuICAgICAgfVxuICAgICAgaWYgKGN1cnNvcj8udHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgICAgcGFydHMudW5zaGlmdChjdXJzb3IudmFsdWUpO1xuICAgICAgICByb290TmFtZSA9IGN1cnNvci52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnROYW1lID0gcGFydHMuam9pbihcIi5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFyb290TmFtZSB8fCAhdWlDb21wb25lbnRzLmhhcyhyb290TmFtZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHVzYWdlOiBQcm9wVXNhZ2UgPSB7XG4gICAgICBjb21wb25lbnQ6IGVsZW1lbnROYW1lISxcbiAgICAgIHByb3BzOiBuZXcgTWFwKCksXG4gICAgICBib29sZWFuUHJvcHM6IG5ldyBTZXQoKSxcbiAgICAgIGhhc1NwcmVhZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgYXR0ciBvZiBub2RlLmF0dHJpYnV0ZXMgfHwgW10pIHtcbiAgICAgIGlmIChhdHRyLnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8IGF0dHIudHlwZSA9PT0gXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIikge1xuICAgICAgICB1c2FnZS5oYXNTcHJlYWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyLnR5cGUgIT09IFwiSlNYQXR0cmlidXRlXCIpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGF0dHIubmFtZT8udmFsdWU7XG4gICAgICBpZiAoIXByb3BOYW1lKSBjb250aW51ZTtcblxuICAgICAgaWYgKCFhdHRyLnZhbHVlKSB7XG4gICAgICAgIHVzYWdlLmJvb2xlYW5Qcm9wcy5hZGQocHJvcE5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChhdHRyLnZhbHVlLnR5cGUgPT09IFwiU3RyaW5nTGl0ZXJhbFwiKSB7XG4gICAgICAgIHVzYWdlLnByb3BzLnNldChwcm9wTmFtZSwgYXR0ci52YWx1ZS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2FnZS5wcm9wcy5zZXQocHJvcE5hbWUsIFwiRFlOQU1JQ1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1c2FnZXMucHVzaCh1c2FnZSk7XG4gIH0pO1xuXG4gIHJldHVybiB1c2FnZXM7XG59XG5cbi8vIOKUgOKUgCBTYWZlbGlzdCBidWlsZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgU2FmZWxpc3RzIHtcbiAgY2xhc3NTYWZlbGlzdDogU2V0PHN0cmluZz47XG4gIGF0dHJTYWZlbGlzdDogU2V0PHN0cmluZz47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2FmZWxpc3RzKFxuICBhbGxVc2FnZXM6IFByb3BVc2FnZVtdLFxuICBtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCxcbik6IFNhZmVsaXN0cyB7XG4gIGNvbnN0IGNsYXNzU2FmZWxpc3QgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgYXR0clNhZmVsaXN0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgY29tcG9uZW50VXNhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPigpO1xuICBmb3IgKGNvbnN0IHVzYWdlIG9mIGFsbFVzYWdlcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50VXNhZ2VzLmdldCh1c2FnZS5jb21wb25lbnQpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2godXNhZ2UpO1xuICAgIGNvbXBvbmVudFVzYWdlcy5zZXQodXNhZ2UuY29tcG9uZW50LCBleGlzdGluZyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtlbnRyeU5hbWUsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdCkpIHtcbiAgICBjb25zdCBtYXRjaGluZ1VzYWdlcyA9IGZpbmRNYXRjaGluZ1VzYWdlcyhlbnRyeU5hbWUsIGNvbXBvbmVudFVzYWdlcyk7XG5cbiAgICBpZiAobWF0Y2hpbmdVc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNscyBvZiBlbnRyeS5jbGFzc2VzLmFsd2F5cykge1xuICAgICAgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wT3JTbG90LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkuY2xhc3Nlcy5ieVByb3ApKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGlzUHJvcFVzZWQocHJvcE9yU2xvdCwgbWF0Y2hpbmdVc2FnZXMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjbHMgb2YgdmFsdWUpIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVzZWRWYWx1ZXMgPSBnZXRVc2VkRW51bVZhbHVlcyhwcm9wT3JTbG90LCBtYXRjaGluZ1VzYWdlcyk7XG4gICAgICAgIGlmICh1c2VkVmFsdWVzID09PSBcIkFMTFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjbGFzc2VzIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiBjbGFzc2VzKSBjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB1c2VkVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbdmFsXSkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiB2YWx1ZVt2YWxdKSBjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5hdHRycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGF0dHJNYXBdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJ5LmF0dHJzKSkge1xuICAgICAgICBpZiAoaXNQcm9wVXNlZChwcm9wTmFtZSwgbWF0Y2hpbmdVc2FnZXMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbYXR0ciwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRyTWFwKSkge1xuICAgICAgICAgICAgYXR0clNhZmVsaXN0LmFkZChgJHthdHRyfT0ke3ZhbH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjbGFzc1NhZmVsaXN0LCBhdHRyU2FmZWxpc3QgfTtcbn1cblxuZnVuY3Rpb24gZmluZE1hdGNoaW5nVXNhZ2VzKFxuICBlbnRyeU5hbWU6IHN0cmluZyxcbiAgdXNhZ2VNYXA6IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPixcbik6IFByb3BVc2FnZVtdIHtcbiAgaWYgKHVzYWdlTWFwLmhhcyhlbnRyeU5hbWUpKSB7XG4gICAgcmV0dXJuIHVzYWdlTWFwLmdldChlbnRyeU5hbWUpITtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdHM6IFByb3BVc2FnZVtdID0gW107XG4gIGZvciAoY29uc3QgW3VzYWdlTmFtZSwgdXNhZ2VzXSBvZiB1c2FnZU1hcCkge1xuICAgIGlmICh1c2FnZU5hbWUgPT09IGVudHJ5TmFtZSkge1xuICAgICAgcmVzdWx0cy5wdXNoKC4uLnVzYWdlcyk7XG4gICAgfVxuICAgIGlmIChlbnRyeU5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBjb25zdCBbZmFtaWx5LCBwYXJ0XSA9IGVudHJ5TmFtZS5zcGxpdChcIi5cIik7XG4gICAgICBpZiAocGFydCA9PT0gZmFtaWx5ICYmIHVzYWdlTmFtZSA9PT0gZmFtaWx5KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCguLi51c2FnZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gaXNQcm9wVXNlZChwcm9wTmFtZTogc3RyaW5nLCB1c2FnZXM6IFByb3BVc2FnZVtdKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG4gICAgaWYgKHVzYWdlLmhhc1NwcmVhZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHVzYWdlLmJvb2xlYW5Qcm9wcy5oYXMocHJvcE5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodXNhZ2UucHJvcHMuaGFzKHByb3BOYW1lKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRVc2VkRW51bVZhbHVlcyhzbG90TmFtZTogc3RyaW5nLCB1c2FnZXM6IFByb3BVc2FnZVtdKTogU2V0PHN0cmluZz4gfCBcIkFMTFwiIHtcbiAgY29uc3QgdmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG4gICAgaWYgKHVzYWdlLmhhc1NwcmVhZCkgcmV0dXJuIFwiQUxMXCI7XG4gICAgY29uc3QgdmFsID0gdXNhZ2UucHJvcHMuZ2V0KHNsb3ROYW1lKTtcbiAgICBpZiAodmFsID09PSBcIkRZTkFNSUNcIikgcmV0dXJuIFwiQUxMXCI7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB2YWx1ZXMuYWRkKHZhbCk7XG4gICAgaWYgKHVzYWdlLmJvb2xlYW5Qcm9wcy5oYXMoc2xvdE5hbWUpKSByZXR1cm4gXCJBTExcIjtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG4vLyDilIDilIAgQ29uc3VtZXIgc291cmNlIHNjYW5uaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBzY2FuQ29uc3VtZXJTb3VyY2Uoc3JjRGlyOiBzdHJpbmcpOiBQcm9taXNlPFByb3BVc2FnZVtdPiB7XG4gIGNvbnN0IGFsbFVzYWdlczogUHJvcFVzYWdlW10gPSBbXTtcbiAgY29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi57dHN4LHRzLGpzeCxqc31cIik7XG5cbiAgZm9yIGF3YWl0IChjb25zdCByZWxQYXRoIG9mIGdsb2Iuc2Nhbih7IGN3ZDogc3JjRGlyIH0pKSB7XG4gICAgaWYgKHJlbFBhdGguaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHNyY0RpciwgcmVsUGF0aCk7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG4gICAgaWYgKCFjb2RlLmluY2x1ZGVzKFwiQHBhdGhzY2FsZS91aVwiKSkgY29udGludWU7XG5cbiAgICBjb25zdCBpc1RzeCA9IC9cXC5bdGpdc3gkLy50ZXN0KHJlbFBhdGgpO1xuICAgIGNvbnN0IGFzdCA9IGF3YWl0IHN3Yy5wYXJzZShjb2RlLCB7IHN5bnRheDogXCJ0eXBlc2NyaXB0XCIsIHRzeDogaXNUc3ggfSk7XG4gICAgY29uc3QgdWlJbXBvcnRzID0gZXh0cmFjdFVJSW1wb3J0cyhhc3QpO1xuICAgIGlmICh1aUltcG9ydHMuc2l6ZSA9PT0gMCkgY29udGludWU7XG5cbiAgICBhbGxVc2FnZXMucHVzaCguLi5leHRyYWN0SlNYVXNhZ2VzKGFzdCwgdWlJbXBvcnRzKSk7XG4gIH1cblxuICByZXR1cm4gYWxsVXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFpbiAoc3RhbmRhbG9uZSBDTEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCBbc3JjRGlyLCBtYW5pZmVzdFBhdGhdID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICBpZiAoIXNyY0RpciB8fCAhbWFuaWZlc3RQYXRoKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlVzYWdlOiBidW4gcnVuIHNyYy9zY2FuLWNvbnN1bWVyLnRzIDxjb25zdW1lci1zcmMtZGlyPiA8cHVyZ2UtbWFuaWZlc3QuanNvbj5cIik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgIGF3YWl0IEJ1bi5maWxlKG1hbmlmZXN0UGF0aCkudGV4dCgpLFxuICApO1xuICBjb25zdCByZXNvbHZlZFNyYyA9IHBhdGgucmVzb2x2ZShzcmNEaXIpO1xuICBjb25zb2xlLmxvZyhgU2Nhbm5pbmcgJHtyZXNvbHZlZFNyY30gZm9yIEBwYXRoc2NhbGUvdWkgY29tcG9uZW50IHVzYWdl4oCmYCk7XG4gIGNvbnNvbGUubG9nKGBNYW5pZmVzdDogJHtPYmplY3Qua2V5cyhtYW5pZmVzdCkubGVuZ3RofSBlbnRyaWVzXFxuYCk7XG5cbiAgY29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHJlc29sdmVkU3JjKTtcbiAgY29uc3QgeyBjbGFzc1NhZmVsaXN0LCBhdHRyU2FmZWxpc3QgfSA9IGJ1aWxkU2FmZWxpc3RzKHVzYWdlcywgbWFuaWZlc3QpO1xuXG4gIGNvbnNvbGUubG9nKFwiPT09IENsYXNzIFNhZmVsaXN0ID09PVwiKTtcbiAgZm9yIChjb25zdCBjbHMgb2YgWy4uLmNsYXNzU2FmZWxpc3RdLnNvcnQoKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Y2xzfWApO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFxcbj09PSBBdHRyaWJ1dGUgU2FmZWxpc3QgPT09YCk7XG4gIGZvciAoY29uc3QgYXR0ciBvZiBbLi4uYXR0clNhZmVsaXN0XS5zb3J0KCkpIHtcbiAgICBjb25zb2xlLmxvZyhgICBbJHthdHRyfV1gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcXG5Ub3RhbDogJHtjbGFzc1NhZmVsaXN0LnNpemV9IGNsYXNzZXMsICR7YXR0clNhZmVsaXN0LnNpemV9IGF0dHJpYnV0ZSBzZWxlY3RvcnNgKTtcbn1cblxuLy8gT25seSBydW4gQ0xJIHdoZW4gaW52b2tlZCBkaXJlY3RseSAobm90IHdoZW4gaW1wb3J0ZWQgYXMgYSBtb2R1bGUpXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBtYWluKCk7XG59XG5cbmV4cG9ydCB7IGV4dHJhY3RVSUltcG9ydHMsIGV4dHJhY3RKU1hVc2FnZXMsIGJ1aWxkU2FmZWxpc3RzLCBzY2FuQ29uc3VtZXJTb3VyY2UgfTtcbmV4cG9ydCB0eXBlIHsgUHJvcFVzYWdlLCBQdXJnZU1hbmlmZXN0LCBDb21wb25lbnRNYW5pZmVzdCwgU2FmZWxpc3RzIH07XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7QUF5QkEsU0FBUyxPQUFPLENBQUMsTUFBVyxTQUE4QjtBQUFBLEVBQ3hELElBQUksQ0FBQyxRQUFRLE9BQU8sU0FBUztBQUFBLElBQVU7QUFBQSxFQUN2QyxRQUFRLElBQUk7QUFBQSxFQUNaLFdBQVcsT0FBTyxPQUFPLEtBQUssSUFBSSxHQUFHO0FBQUEsSUFDbkMsSUFBSSxRQUFRO0FBQUEsTUFBUTtBQUFBLElBQ3BCLE1BQU0sTUFBTSxLQUFLO0FBQUEsSUFDakIsSUFBSSxNQUFNLFFBQVEsR0FBRyxHQUFHO0FBQUEsTUFDdEIsV0FBVyxRQUFRO0FBQUEsUUFBSyxRQUFRLE1BQU0sT0FBTztBQUFBLElBQy9DLEVBQU8sU0FBSSxPQUFPLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDekMsUUFBUSxLQUFLLE9BQU87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QUMxQixJQUFJLE1BQU07QUFBQSxNQUFXLE9BQU87QUFBQSxJQUM1QixJQUFJLE1BQU0sYUFBYSxJQUFJLFFBQVE7QUFBQSxNQUFHLE9BQU87QUFBQSxJQUM3QyxJQUFJLE1BQU0sTUFBTSxJQUFJLFFBQVE7QUFBQSxNQUFHLE9BQU87QUFBQSxFQUN4QztBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR1QsU0FBUyxpQkFBaUIsQ0FBQyxVQUFrQixRQUEwQztBQUFBLEVBQ3JGLE1BQU0sU0FBUyxJQUFJO0FBQUEsRUFDbkIsV0FBVyxTQUFTLFFBQVE7QUFBQSxJQUMxQixJQUFJLE1BQU07QUFBQSxNQUFXLE9BQU87QUFBQSxJQUM1QixNQUFNLE1BQU0sTUFBTSxNQUFNLElBQUksUUFBUTtBQUFBLElBQ3BDLElBQUksUUFBUTtBQUFBLE1BQVcsT0FBTztBQUFBLElBQzlCLElBQUksUUFBUTtBQUFBLE1BQVcsT0FBTyxJQUFJLEdBQUc7QUFBQSxJQUNyQyxJQUFJLE1BQU0sYUFBYSxJQUFJLFFBQVE7QUFBQSxNQUFHLE9BQU87QUFBQSxFQUMvQztBQUFBLEVBQ0EsT0FBTztBQUFBO0FBS1QsZUFBZSxrQkFBa0IsQ0FBQyxRQUFzQztBQUFBLEVBQ3RFLE1BQU0sWUFBeUIsQ0FBQztBQUFBLEVBQ2hDLE1BQU0sT0FBTyxJQUFJLEtBQUssc0JBQXNCO0FBQUEsRUFFNUMsaUJBQWlCLFdBQVcsS0FBSyxLQUFLLEVBQUUsS0FBSyxPQUFPLENBQUMsR0FBRztBQUFBLElBQ3RELElBQUksUUFBUSxTQUFTLGNBQWM7QUFBQSxNQUFHO0FBQUEsSUFDdEMsTUFBTSxXQUFXLEtBQUssS0FBSyxRQUFRLE9BQU87QUFBQSxJQUMxQyxNQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUssUUFBUSxFQUFFLEtBQUs7QUFBQSxJQUMzQyxJQUFJLENBQUMsS0FBSyxTQUFTLGVBQWU7QUFBQSxNQUFHO0FBQUEsSUFFckMsTUFBTSxRQUFRLFlBQVksS0FBSyxPQUFPO0FBQUEsSUFDdEMsTUFBTSxNQUFNLE1BQU0sSUFBSSxNQUFNLE1BQU0sRUFBRSxRQUFRLGNBQWMsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUN0RSxNQUFNLFlBQVksaUJBQWlCLEdBQUc7QUFBQSxJQUN0QyxJQUFJLFVBQVUsU0FBUztBQUFBLE1BQUc7QUFBQSxJQUUxQixVQUFVLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxTQUFTLENBQUM7QUFBQSxFQUNwRDtBQUFBLEVBRUEsT0FBTztBQUFBO0FBb0NULElBQUksT0FBa0IsQ0FFdEI7IiwKICAiZGVidWdJZCI6ICIwMzg4MjgzM0ZCQjgzOUU2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
1602
|
+
//# debugId=C5D888B99300CEF964756E2164756E21
|
|
1603
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1saWJjL2xpYi9wcm9jZXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZXRlY3QtbGliYy9saWIvZmlsZXN5c3RlbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2VsZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2RldGVjdC1saWJjLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9saWdodG5pbmdjc3Mvbm9kZS9icm93c2Vyc2xpc3RUb1RhcmdldHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2NvbXBvc2VWaXNpdG9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbGlnaHRuaW5nY3NzL25vZGUvZmxhZ3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4LmpzIiwgIi4uL3NyYy9wb3N0YnVpbGQtcHVyZ2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4Lm1qcyIsICIuLi9zcmMvc2Nhbi1jb25zdW1lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTGludXggPSAoKSA9PiBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnO1xuXG5sZXQgcmVwb3J0ID0gbnVsbDtcbmNvbnN0IGdldFJlcG9ydCA9ICgpID0+IHtcbiAgaWYgKCFyZXBvcnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChpc0xpbnV4KCkgJiYgcHJvY2Vzcy5yZXBvcnQpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSBwcm9jZXNzLnJlcG9ydC5leGNsdWRlTmV0d29yaztcbiAgICAgIHByb2Nlc3MucmVwb3J0LmV4Y2x1ZGVOZXR3b3JrID0gdHJ1ZTtcbiAgICAgIHJlcG9ydCA9IHByb2Nlc3MucmVwb3J0LmdldFJlcG9ydCgpO1xuICAgICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSBvcmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXBvcnQgPSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcG9ydDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBpc0xpbnV4LCBnZXRSZXBvcnQgfTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTcgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IExERF9QQVRIID0gJy91c3IvYmluL2xkZCc7XG5jb25zdCBTRUxGX1BBVEggPSAnL3Byb2Mvc2VsZi9leGUnO1xuY29uc3QgTUFYX0xFTkdUSCA9IDIwNDg7XG5cbi8qKlxuICogUmVhZCB0aGUgY29udGVudCBvZiBhIGZpbGUgc3luY2hyb25vdXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuY29uc3QgcmVhZEZpbGVTeW5jID0gKHBhdGgpID0+IHtcbiAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCAncicpO1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoTUFYX0xFTkdUSCk7XG4gIGNvbnN0IGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBidWZmZXIsIDAsIE1BWF9MRU5HVEgsIDApO1xuICBmcy5jbG9zZShmZCwgKCkgPT4ge30pO1xuICByZXR1cm4gYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCk7XG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59XG4gKi9cbmNvbnN0IHJlYWRGaWxlID0gKHBhdGgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgZnMub3BlbihwYXRoLCAncicsIChlcnIsIGZkKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhNQVhfTEVOR1RIKTtcbiAgICAgIGZzLnJlYWQoZmQsIGJ1ZmZlciwgMCwgTUFYX0xFTkdUSCwgMCwgKF8sIGJ5dGVzUmVhZCkgPT4ge1xuICAgICAgICByZXNvbHZlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgZnMuY2xvc2UoZmQsICgpID0+IHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIExERF9QQVRILFxuICBTRUxGX1BBVEgsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhZEZpbGVcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDE3IExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW50ZXJwcmV0ZXJQYXRoID0gKGVsZikgPT4ge1xuICBpZiAoZWxmLmxlbmd0aCA8IDY0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDMyQkUoMCkgIT09IDB4N0Y0NTRDNDYpIHtcbiAgICAvLyBVbmV4cGVjdGVkIG1hZ2ljIGJ5dGVzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNCkgIT09IDIpIHtcbiAgICAvLyBOb3QgYSA2NC1iaXQgRUxGXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNSkgIT09IDEpIHtcbiAgICAvLyBOb3QgbGl0dGxlLWVuZGlhblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoMzIpO1xuICBjb25zdCBzaXplID0gZWxmLnJlYWRVSW50MTZMRSg1NCk7XG4gIGNvbnN0IGNvdW50ID0gZWxmLnJlYWRVSW50MTZMRSg1Nik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGhlYWRlck9mZnNldCA9IG9mZnNldCArIChpICogc2l6ZSk7XG4gICAgY29uc3QgdHlwZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0KTtcbiAgICBpZiAodHlwZSA9PT0gMykge1xuICAgICAgY29uc3QgZmlsZU9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgOCk7XG4gICAgICBjb25zdCBmaWxlU2l6ZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgMzIpO1xuICAgICAgcmV0dXJuIGVsZi5zdWJhcnJheShmaWxlT2Zmc2V0LCBmaWxlT2Zmc2V0ICsgZmlsZVNpemUpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwwLiokL2csICcnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW50ZXJwcmV0ZXJQYXRoXG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHsgaXNMaW51eCwgZ2V0UmVwb3J0IH0gPSByZXF1aXJlKCcuL3Byb2Nlc3MnKTtcbmNvbnN0IHsgTEREX1BBVEgsIFNFTEZfUEFUSCwgcmVhZEZpbGUsIHJlYWRGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlc3lzdGVtJyk7XG5jb25zdCB7IGludGVycHJldGVyUGF0aCB9ID0gcmVxdWlyZSgnLi9lbGYnKTtcblxubGV0IGNhY2hlZEZhbWlseUludGVycHJldGVyO1xubGV0IGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG5sZXQgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG5cbmNvbnN0IGNvbW1hbmQgPSAnZ2V0Y29uZiBHTlVfTElCQ19WRVJTSU9OIDI+JjEgfHwgdHJ1ZTsgbGRkIC0tdmVyc2lvbiAyPiYxIHx8IHRydWUnO1xubGV0IGNvbW1hbmRPdXQgPSAnJztcblxuY29uc3Qgc2FmZUNvbW1hbmQgPSAoKSA9PiB7XG4gIGlmICghY29tbWFuZE91dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2hpbGRQcm9jZXNzLmV4ZWMoY29tbWFuZCwgKGVyciwgb3V0KSA9PiB7XG4gICAgICAgIGNvbW1hbmRPdXQgPSBlcnIgPyAnICcgOiBvdXQ7XG4gICAgICAgIHJlc29sdmUoY29tbWFuZE91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tbWFuZE91dDtcbn07XG5cbmNvbnN0IHNhZmVDb21tYW5kU3luYyA9ICgpID0+IHtcbiAgaWYgKCFjb21tYW5kT3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1hbmRPdXQgPSBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIGNvbW1hbmRPdXQgPSAnICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kT3V0O1xufTtcblxuLyoqXG4gKiBBIFN0cmluZyBjb25zdGFudCBjb250YWluaW5nIHRoZSB2YWx1ZSBgZ2xpYmNgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgR0xJQkMgPSAnZ2xpYmMnO1xuXG4vKipcbiAqIEEgUmVnZXhwIGNvbnN0YW50IHRvIGdldCB0aGUgR0xJQkMgVmVyc2lvbi5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJFX0dMSUJDX1ZFUlNJT04gPSAvTElCQ1thLXowLTkgXFwtKS5dKj8oXFxkK1xcLlxcZCspL2k7XG5cbi8qKlxuICogQSBTdHJpbmcgY29uc3RhbnQgY29udGFpbmluZyB0aGUgdmFsdWUgYG11c2xgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgTVVTTCA9ICdtdXNsJztcblxuY29uc3QgaXNGaWxlTXVzbCA9IChmKSA9PiBmLmluY2x1ZGVzKCdsaWJjLm11c2wtJykgfHwgZi5pbmNsdWRlcygnbGQtbXVzbC0nKTtcblxuY29uc3QgZmFtaWx5RnJvbVJlcG9ydCA9ICgpID0+IHtcbiAgY29uc3QgcmVwb3J0ID0gZ2V0UmVwb3J0KCk7XG4gIGlmIChyZXBvcnQuaGVhZGVyICYmIHJlcG9ydC5oZWFkZXIuZ2xpYmNWZXJzaW9uUnVudGltZSkge1xuICAgIHJldHVybiBHTElCQztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXBvcnQuc2hhcmVkT2JqZWN0cykpIHtcbiAgICBpZiAocmVwb3J0LnNoYXJlZE9iamVjdHMuc29tZShpc0ZpbGVNdXNsKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIGlmIChsZGQxICYmIGxkZDEuaW5jbHVkZXMoTVVTTCkpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21JbnRlcnByZXRlclBhdGggPSAocGF0aCkgPT4ge1xuICBpZiAocGF0aCkge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbXVzbC0nKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbGludXgtJykpIHtcbiAgICAgIHJldHVybiBHTElCQztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBnZXRGYW1pbHlGcm9tTGRkQ29udGVudCA9IChjb250ZW50KSA9PiB7XG4gIGNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCk7XG4gIGlmIChjb250ZW50LmluY2x1ZGVzKCdtdXNsJykpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICBpZiAoY29udGVudC5pbmNsdWRlcygnR05VIEMgTGlicmFyeScpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUZpbGVzeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoTEREX1BBVEgpO1xuICAgIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW0gPSBnZXRGYW1pbHlGcm9tTGRkQ29udGVudChsZGRDb250ZW50KTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG59O1xuXG5jb25zdCBmYW1pbHlGcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gZ2V0RmFtaWx5RnJvbUxkZENvbnRlbnQobGRkQ29udGVudCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyID0gYXN5bmMgKCkgPT4ge1xuICBpZiAoY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRGYW1pbHlJbnRlcnByZXRlcjtcbiAgfVxuICBjYWNoZWRGYW1pbHlJbnRlcnByZXRlciA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShTRUxGX1BBVEgpO1xuICAgIGNvbnN0IHBhdGggPSBpbnRlcnByZXRlclBhdGgoc2VsZkNvbnRlbnQpO1xuICAgIGNhY2hlZEZhbWlseUludGVycHJldGVyID0gZmFtaWx5RnJvbUludGVycHJldGVyUGF0aChwYXRoKTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUludGVycHJldGVyO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyU3luYyA9ICgpID0+IHtcbiAgaWYgKGNhY2hlZEZhbWlseUludGVycHJldGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG4gIH1cbiAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHNlbGZDb250ZW50ID0gcmVhZEZpbGVTeW5jKFNFTEZfUEFUSCk7XG4gICAgY29uc3QgcGF0aCA9IGludGVycHJldGVyUGF0aChzZWxmQ29udGVudCk7XG4gICAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBmYW1pbHlGcm9tSW50ZXJwcmV0ZXJQYXRoKHBhdGgpO1xuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgZmFtaWx5IHdoZW4gaXQgY2FuIGJlIGRldGVybWluZWQsIGBudWxsYCBvdGhlcndpc2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTw/c3RyaW5nPn1cbiAqL1xuY29uc3QgZmFtaWx5ID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGF3YWl0IGZhbWlseUZyb21JbnRlcnByZXRlcigpO1xuICAgIGlmICghZmFtaWx5KSB7XG4gICAgICBmYW1pbHkgPSBhd2FpdCBmYW1pbHlGcm9tRmlsZXN5c3RlbSgpO1xuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbVJlcG9ydCgpO1xuICAgICAgfVxuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gYXdhaXQgc2FmZUNvbW1hbmQoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGliYyBmYW1pbHkgd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCBmYW1pbHlTeW5jID0gKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGZhbWlseUZyb21JbnRlcnByZXRlclN5bmMoKTtcbiAgICBpZiAoIWZhbWlseSkge1xuICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUZpbGVzeXN0ZW1TeW5jKCk7XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBmYW1pbHkgPSBmYW1pbHlGcm9tUmVwb3J0KCk7XG4gICAgICB9XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzYWZlQ29tbWFuZFN5bmMoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXggPSBhc3luYyAoKSA9PiBpc0xpbnV4KCkgJiYgYXdhaXQgZmFtaWx5KCkgIT09IEdMSUJDO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXhTeW5jID0gKCkgPT4gaXNMaW51eCgpICYmIGZhbWlseVN5bmMoKSAhPT0gR0xJQkM7XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbSA9IGFzeW5jICgpID0+IHtcbiAgaWYgKGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG4gIH1cbiAgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW0gPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGxkZENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShMRERfUEFUSCk7XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gbGRkQ29udGVudC5tYXRjaChSRV9HTElCQ19WRVJTSU9OKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbTtcbn07XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xuICB9XG4gIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBsZGRDb250ZW50Lm1hdGNoKFJFX0dMSUJDX1ZFUlNJT04pO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xufTtcblxuY29uc3QgdmVyc2lvbkZyb21SZXBvcnQgPSAoKSA9PiB7XG4gIGNvbnN0IHJlcG9ydCA9IGdldFJlcG9ydCgpO1xuICBpZiAocmVwb3J0LmhlYWRlciAmJiByZXBvcnQuaGVhZGVyLmdsaWJjVmVyc2lvblJ1bnRpbWUpIHtcbiAgICByZXR1cm4gcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgdmVyc2lvblN1ZmZpeCA9IChzKSA9PiBzLnRyaW0oKS5zcGxpdCgvXFxzKy8pWzFdO1xuXG5jb25zdCB2ZXJzaW9uRnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxLCBsZGQyXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgoZ2V0Y29uZik7XG4gIH1cbiAgaWYgKGxkZDEgJiYgbGRkMiAmJiBsZGQxLmluY2x1ZGVzKE1VU0wpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgobGRkMik7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgdmVyc2lvbiB3aGVuIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBgbnVsbGAgb3RoZXJ3aXNlLlxuICogQHJldHVybnMge1Byb21pc2U8P3N0cmluZz59XG4gKi9cbmNvbnN0IHZlcnNpb24gPSBhc3luYyAoKSA9PiB7XG4gIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIHZlcnNpb24gPSBhd2FpdCB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW0oKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IHNhZmVDb21tYW5kKCk7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbkZyb21Db21tYW5kKG91dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsaWJjIHZlcnNpb24gd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCB2ZXJzaW9uU3luYyA9ICgpID0+IHtcbiAgbGV0IHZlcnNpb24gPSBudWxsO1xuICBpZiAoaXNMaW51eCgpKSB7XG4gICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMoKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IHNhZmVDb21tYW5kU3luYygpO1xuICAgICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tQ29tbWFuZChvdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBHTElCQyxcbiAgTVVTTCxcbiAgZmFtaWx5LFxuICBmYW1pbHlTeW5jLFxuICBpc05vbkdsaWJjTGludXgsXG4gIGlzTm9uR2xpYmNMaW51eFN5bmMsXG4gIHZlcnNpb24sXG4gIHZlcnNpb25TeW5jXG59O1xuIiwKICAgICJjb25zdCBCUk9XU0VSX01BUFBJTkcgPSB7XG4gIGFuZF9jaHI6ICdjaHJvbWUnLFxuICBhbmRfZmY6ICdmaXJlZm94JyxcbiAgaWVfbW9iOiAnaWUnLFxuICBvcF9tb2I6ICdvcGVyYScsXG4gIGFuZF9xcTogbnVsbCxcbiAgYW5kX3VjOiBudWxsLFxuICBiYWlkdTogbnVsbCxcbiAgYmI6IG51bGwsXG4gIGthaW9zOiBudWxsLFxuICBvcF9taW5pOiBudWxsLFxufTtcblxuZnVuY3Rpb24gYnJvd3NlcnNsaXN0VG9UYXJnZXRzKGJyb3dzZXJzbGlzdCkge1xuICBsZXQgdGFyZ2V0cyA9IHt9O1xuICBmb3IgKGxldCBicm93c2VyIG9mIGJyb3dzZXJzbGlzdCkge1xuICAgIGxldCBbbmFtZSwgdl0gPSBicm93c2VyLnNwbGl0KCcgJyk7XG4gICAgaWYgKEJST1dTRVJfTUFQUElOR1tuYW1lXSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb24gPSBwYXJzZVZlcnNpb24odik7XG4gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldHNbbmFtZV0gPT0gbnVsbCB8fCB2ZXJzaW9uIDwgdGFyZ2V0c1tuYW1lXSkge1xuICAgICAgdGFyZ2V0c1tuYW1lXSA9IHZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmVyc2lvbih2ZXJzaW9uKSB7XG4gIGxldCBbbWFqb3IsIG1pbm9yID0gMCwgcGF0Y2ggPSAwXSA9IHZlcnNpb25cbiAgICAuc3BsaXQoJy0nKVswXVxuICAgIC5zcGxpdCgnLicpXG4gICAgLm1hcCh2ID0+IHBhcnNlSW50KHYsIDEwKSk7XG5cbiAgaWYgKGlzTmFOKG1ham9yKSB8fCBpc05hTihtaW5vcikgfHwgaXNOYU4ocGF0Y2gpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKG1ham9yIDw8IDE2KSB8IChtaW5vciA8PCA4KSB8IHBhdGNoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJyb3dzZXJzbGlzdFRvVGFyZ2V0cztcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLlZpc2l0b3J9IFZpc2l0b3IgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvckZ1bmN0aW9ufSBWaXNpdG9yRnVuY3Rpb24gKi9cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSB2aXNpdG9yIG9iamVjdHMgaW50byBhIHNpbmdsZSBvbmUuXG4gKiBAcGFyYW0geyhWaXNpdG9yIHwgVmlzaXRvckZ1bmN0aW9uKVtdfSB2aXNpdG9ycyBcbiAqIEByZXR1cm4ge1Zpc2l0b3IgfCBWaXNpdG9yRnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VWaXNpdG9ycyh2aXNpdG9ycykge1xuICBpZiAodmlzaXRvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHZpc2l0b3JzWzBdO1xuICB9XG4gIFxuICBpZiAodmlzaXRvcnMuc29tZSh2ID0+IHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiAob3B0cykgPT4ge1xuICAgICAgbGV0IHYgPSB2aXNpdG9ycy5tYXAodiA9PiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyA/IHYob3B0cykgOiB2KTtcbiAgICAgIHJldHVybiBjb21wb3NlVmlzaXRvcnModik7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAdHlwZSBWaXNpdG9yICovXG4gIGxldCByZXMgPSB7fTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdHlsZVNoZWV0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3R5bGVTaGVldEV4aXQnKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlJywgcnVsZVZpc2l0b3IsIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlRXhpdCcsIHJ1bGVWaXNpdG9yLCB3cmFwQ3VzdG9tQW5kVW5rbm93bkF0UnVsZSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb24nLCBkZWNsYXJhdGlvblZpc2l0b3IsIHdyYXBDdXN0b21Qcm9wZXJ0eSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb25FeGl0JywgZGVjbGFyYXRpb25WaXNpdG9yLCB3cmFwQ3VzdG9tUHJvcGVydHkpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1VybCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0NvbG9yJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnSW1hZ2UnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdJbWFnZUV4aXQnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdMZW5ndGgnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdBbmdsZScpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1JhdGlvJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnUmVzb2x1dGlvbicpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1RpbWUnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdDdXN0b21JZGVudCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Rhc2hlZElkZW50Jyk7XG4gIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCAnTWVkaWFRdWVyeScpO1xuICBjb21wb3NlQXJyYXlGdW5jdGlvbnMocmVzLCB2aXNpdG9ycywgJ01lZGlhUXVlcnlFeGl0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3VwcG9ydHNDb25kaXRpb24nKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdXBwb3J0c0NvbmRpdGlvbkV4aXQnKTtcbiAgY29tcG9zZUFycmF5RnVuY3Rpb25zKHJlcywgdmlzaXRvcnMsICdTZWxlY3RvcicpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVG9rZW4nLCAndG9rZW4nLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdGdW5jdGlvbicsICdmdW5jdGlvbicsIGZhbHNlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Z1bmN0aW9uRXhpdCcsICdmdW5jdGlvbicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGUnLCAndmFyJywgZmFsc2UpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGVFeGl0JywgJ3ZhcicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRW52aXJvbm1lbnRWYXJpYWJsZScsICdlbnYnLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdFbnZpcm9ubWVudFZhcmlhYmxlRXhpdCcsICdlbnYnLCB0cnVlKTtcbiAgcmV0dXJuIHJlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb3NlVmlzaXRvcnM7XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKGssIGYpIHtcbiAgaWYgKGsgPT09ICd1bmtub3duJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICd1bmtub3duJywgdmFsdWUgfSkpO1xuICB9XG4gIGlmIChrID09PSAnY3VzdG9tJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICdjdXN0b20nLCB2YWx1ZSB9KSk7XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21Qcm9wZXJ0eShrLCBmKSB7XG4gIHJldHVybiBrID09PSAnY3VzdG9tJyA/ICh2YWx1ZSA9PiBmKHsgcHJvcGVydHk6ICdjdXN0b20nLCB2YWx1ZSB9KSkgOiBmO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvclsnUnVsZSddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuUnVsZX0gaXRlbSBcbiAqL1xuZnVuY3Rpb24gcnVsZVZpc2l0b3IoZiwgaXRlbSkge1xuICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3Vua25vd24nKSB7XG4gICAgICBsZXQgdiA9IGYudW5rbm93bjtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICBsZXQgdiA9IGYuY3VzdG9tO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2ID0gdltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY/LihpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZbaXRlbS50eXBlXT8uKGl0ZW0pO1xuICB9XG4gIHJldHVybiBmPy4oaXRlbSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5WaXNpdG9yWydEZWNsYXJhdGlvbiddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuRGVjbGFyYXRpb259IGl0ZW0gXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVmlzaXRvcihmLCBpdGVtKSB7XG4gIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgbmFtZSA9IGl0ZW0ucHJvcGVydHk7XG4gICAgaWYgKGl0ZW0ucHJvcGVydHkgPT09ICd1bnBhcnNlZCcpIHtcbiAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLnByb3BlcnR5SWQucHJvcGVydHk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnByb3BlcnR5ID09PSAnY3VzdG9tJykge1xuICAgICAgbGV0IHYgPSBmLmN1c3RvbTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmW25hbWVdPy4oaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGY/LihpdGVtKTtcbn1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKiBAcmV0dXJucyB7W2FueVtdLCBib29sZWFuLCBTZXQ8c3RyaW5nPl19XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RPYmplY3RzT3JGdW5jdGlvbnModmlzaXRvcnMsIGtleSkge1xuICBsZXQgdmFsdWVzID0gW107XG4gIGxldCBoYXNGdW5jdGlvbiA9IGZhbHNlO1xuICBsZXQgYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCB2ID0gdmlzaXRvcltrZXldO1xuICAgIGlmICh2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHYpIHtcbiAgICAgICAgICBhbGxLZXlzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZXMsIGhhc0Z1bmN0aW9uLCBhbGxLZXlzXTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge2tleW9mIFZpc2l0b3J9IEtcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnNcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyh2aXNpdG9yOiBWaXNpdG9yW0tdLCBpdGVtOiBhbnkpID0+IGFueSB8IGFueVtdIHwgdm9pZH0gYXBwbHkgXG4gKiBAcGFyYW0geyhrOiBzdHJpbmcsIGY6IGFueSkgPT4gYW55fSB3cmFwS2V5IFxuICovXG5mdW5jdGlvbiBjb21wb3NlT2JqZWN0VmlzaXRvcnMocmVzLCB2aXNpdG9ycywga2V5LCBhcHBseSwgd3JhcEtleSkge1xuICBsZXQgW3ZhbHVlcywgaGFzRnVuY3Rpb24sIGFsbEtleXNdID0gZXh0cmFjdE9iamVjdHNPckZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJlc1trZXldID0gdmFsdWVzWzBdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBmID0gY3JlYXRlQXJyYXlWaXNpdG9yKHZpc2l0b3JzLCAodmlzaXRvciwgaXRlbSkgPT4gYXBwbHkodmlzaXRvcltrZXldLCBpdGVtKSk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGsgb2YgYWxsS2V5cykge1xuICAgICAgdltrXSA9IHdyYXBLZXkoaywgZik7XG4gICAgfVxuICAgIHJlc1trZXldID0gdjtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzIFxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2FzdCcpLlRva2VuT3JWYWx1ZVsndHlwZSddfSB0eXBlIFxuICogQHBhcmFtIHtib29sZWFufSBpc0V4aXQgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsIGtleSwgdHlwZSwgaXNFeGl0KSB7XG4gIGxldCBbdmFsdWVzLCBoYXNGdW5jdGlvbiwgYWxsS2V5c10gPSBleHRyYWN0T2JqZWN0c09yRnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpO1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzW2tleV0gPSB2YWx1ZXNbMF07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGYgPSBjcmVhdGVUb2tlblZpc2l0b3IodmlzaXRvcnMsIHR5cGUsIGlzRXhpdCk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgICB2W2tleV0gPSBmO1xuICAgIH1cbiAgICByZXNba2V5XSA9IHY7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWVbJ3R5cGUnXX0gdHlwZSBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVG9rZW5WaXNpdG9yKHZpc2l0b3JzLCB0eXBlLCBpc0V4aXQpIHtcbiAgbGV0IHYgPSBjcmVhdGVBcnJheVZpc2l0b3IodmlzaXRvcnMsICh2aXNpdG9yLCAvKiogQHR5cGUge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWV9ICovIGl0ZW0pID0+IHtcbiAgICBsZXQgZjtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAndG9rZW4nOlxuICAgICAgICBmID0gdmlzaXRvci5Ub2tlbjtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGYgPSBmW2l0ZW0udmFsdWUudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIGYgPSBpc0V4aXQgPyB2aXNpdG9yLkZ1bmN0aW9uRXhpdCA6IHZpc2l0b3IuRnVuY3Rpb247XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmID0gZltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmFyJzpcbiAgICAgICAgZiA9IGlzRXhpdCA/IHZpc2l0b3IuVmFyaWFibGVFeGl0IDogdmlzaXRvci5WYXJpYWJsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbnYnOlxuICAgICAgICBmID0gaXNFeGl0ID8gdmlzaXRvci5FbnZpcm9ubWVudFZhcmlhYmxlRXhpdCA6IHZpc2l0b3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGxldCBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAoaXRlbS52YWx1ZS5uYW1lLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VhJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgICAgICAgICBuYW1lID0gaXRlbS52YWx1ZS5uYW1lLnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbSc6XG4gICAgICAgICAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLm5hbWUuaWRlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmID0gZltuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuVXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkFuZ2xlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICBmID0gdmlzaXRvci5UaW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgICBmID0gdmlzaXRvci5SZXNvbHV0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rhc2hlZC1pZGVudCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkRhc2hlZElkZW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzID0gZihpdGVtLnZhbHVlKTtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgY2FzZSAndXJsJzpcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgY2FzZSAnZGFzaGVkLWlkZW50JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHJlcyA9IHJlcy5tYXAodmFsdWUgPT4gKHsgdHlwZTogaXRlbS50eXBlLCB2YWx1ZSB9KSlcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICByZXMgPSB7IHR5cGU6IGl0ZW0udHlwZSwgdmFsdWU6IHJlcyB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA9PiB2KHsgdHlwZSwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KSB7XG4gIGxldCBmdW5jdGlvbnMgPSBbXTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCBmID0gdmlzaXRvcltrZXldO1xuICAgIGlmIChmKSB7XG4gICAgICBmdW5jdGlvbnMucHVzaChmKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGFyZyA9PiB7XG4gICAgbGV0IG11dGF0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBmIG9mIGZ1bmN0aW9ucykge1xuICAgICAgbGV0IHJlcyA9IGYoYXJnKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgYXJnID0gcmVzO1xuICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbXV0YXRlZCA/IGFyZyA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGNyZWF0ZUFycmF5VmlzaXRvcihmdW5jdGlvbnMsIChmLCBpdGVtKSA9PiBmKGl0ZW0pKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7VFtdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7KHZpc2l0b3I6IFQsIGl0ZW06IFYpID0+IFYgfCBWW10gfCB2b2lkfSBhcHBseSBcbiAqIEByZXR1cm5zIHsoaXRlbTogVikgPT4gViB8IFZbXSB8IHZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5VmlzaXRvcih2aXNpdG9ycywgYXBwbHkpIHtcbiAgbGV0IHNlZW4gPSBuZXcgQml0c2V0KHZpc2l0b3JzLmxlbmd0aCk7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIGxldCBhcnIgPSBbYXJnXTtcbiAgICBsZXQgbXV0YXRlZCA9IGZhbHNlO1xuICAgIHNlZW4uY2xlYXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gRm9yIGVhY2ggdmFsdWUsIGNhbGwgYWxsIHZpc2l0b3JzLiBJZiBhIHZpc2l0b3IgcmV0dXJucyBhIG5ldyB2YWx1ZSxcbiAgICAgIC8vIHdlIHN0YXJ0IG92ZXIsIGJ1dCBza2lwIHRoZSB2aXNpdG9yIHRoYXQgZ2VuZXJhdGVkIHRoZSB2YWx1ZSBvciBzYXdcbiAgICAgIC8vIGl0IGJlZm9yZSAodG8gYXZvaWQgY3ljbGVzKS4gVGhpcyB3YXksIHZpc2l0b3JzIGNhbiBiZSBjb21wb3NlZCBpbiBhbnkgb3JkZXIuIFxuICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCB2aXNpdG9ycy5sZW5ndGggJiYgaSA8IGFyci5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChzZWVuLmdldCh2KSkge1xuICAgICAgICAgIHYrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpdGVtID0gYXJyW2ldO1xuICAgICAgICBsZXQgdmlzaXRvciA9IHZpc2l0b3JzW3ZdO1xuICAgICAgICBsZXQgcmVzID0gYXBwbHkodmlzaXRvciwgaXRlbSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGFycltpXSA9IHJlc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxLCAuLi5yZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZWVuLnNldCh2KTtcbiAgICAgICAgICB2ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICBhcnJbaV0gPSByZXM7XG4gICAgICAgICAgbXV0YXRlZCA9IHRydWU7XG4gICAgICAgICAgc2Vlbi5zZXQodik7XG4gICAgICAgICAgdiA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtdXRhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyci5sZW5ndGggPT09IDEgPyBhcnJbMF0gOiBhcnI7XG4gIH07XG59XG5cbmNsYXNzIEJpdHNldCB7XG4gIGNvbnN0cnVjdG9yKG1heEJpdHMgPSAzMikge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgdGhpcy5tb3JlID0gbWF4Qml0cyA+IDMyID8gbmV3IFVpbnQzMkFycmF5KE1hdGguY2VpbCgobWF4Qml0cyAtIDMyKSAvIDMyKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7bnVtYmVyfSBiaXQgKi9cbiAgZ2V0KGJpdCkge1xuICAgIGlmIChiaXQgPj0gMzIgJiYgdGhpcy5tb3JlKSB7XG4gICAgICBsZXQgaSA9IE1hdGguZmxvb3IoKGJpdCAtIDMyKSAvIDMyKTtcbiAgICAgIGxldCBiID0gYml0ICUgMzI7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLm1vcmVbaV0gJiAoMSA8PCBiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYml0cyAmICgxIDw8IGJpdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gYml0ICovXG4gIHNldChiaXQpIHtcbiAgICBpZiAoYml0ID49IDMyICYmIHRoaXMubW9yZSkge1xuICAgICAgbGV0IGkgPSBNYXRoLmZsb29yKChiaXQgLSAzMikgLyAzMik7XG4gICAgICBsZXQgYiA9IGJpdCAlIDMyO1xuICAgICAgdGhpcy5tb3JlW2ldIHw9IDEgPDwgYjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaXRzIHw9IDEgPDwgYml0O1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgaWYgKHRoaXMubW9yZSkge1xuICAgICAgdGhpcy5tb3JlLmZpbGwoMCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGJ1aWxkLXByZWZpeGVzLmpzLiBETyBOT1QgRURJVCFcblxuZXhwb3J0cy5GZWF0dXJlcyA9IHtcbiAgTmVzdGluZzogMSxcbiAgTm90U2VsZWN0b3JMaXN0OiAyLFxuICBEaXJTZWxlY3RvcjogNCxcbiAgTGFuZ1NlbGVjdG9yTGlzdDogOCxcbiAgSXNTZWxlY3RvcjogMTYsXG4gIFRleHREZWNvcmF0aW9uVGhpY2tuZXNzUGVyY2VudDogMzIsXG4gIE1lZGlhSW50ZXJ2YWxTeW50YXg6IDY0LFxuICBNZWRpYVJhbmdlU3ludGF4OiAxMjgsXG4gIEN1c3RvbU1lZGlhUXVlcmllczogMjU2LFxuICBDbGFtcEZ1bmN0aW9uOiA1MTIsXG4gIENvbG9yRnVuY3Rpb246IDEwMjQsXG4gIE9rbGFiQ29sb3JzOiAyMDQ4LFxuICBMYWJDb2xvcnM6IDQwOTYsXG4gIFAzQ29sb3JzOiA4MTkyLFxuICBIZXhBbHBoYUNvbG9yczogMTYzODQsXG4gIFNwYWNlU2VwYXJhdGVkQ29sb3JOb3RhdGlvbjogMzI3NjgsXG4gIEZvbnRGYW1pbHlTeXN0ZW1VaTogNjU1MzYsXG4gIERvdWJsZVBvc2l0aW9uR3JhZGllbnRzOiAxMzEwNzIsXG4gIFZlbmRvclByZWZpeGVzOiAyNjIxNDQsXG4gIExvZ2ljYWxQcm9wZXJ0aWVzOiA1MjQyODgsXG4gIExpZ2h0RGFyazogMTA0ODU3NixcbiAgU2VsZWN0b3JzOiAzMSxcbiAgTWVkaWFRdWVyaWVzOiA0NDgsXG4gIENvbG9yczogMTExMzA4OCxcbn07XG4iLAogICAgImxldCBwYXJ0cyA9IFtwcm9jZXNzLnBsYXRmb3JtLCBwcm9jZXNzLmFyY2hdO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgY29uc3QgeyBNVVNMLCBmYW1pbHlTeW5jIH0gPSByZXF1aXJlKCdkZXRlY3QtbGliYycpO1xuICBjb25zdCBmYW1pbHkgPSBmYW1pbHlTeW5jKCk7XG4gIGlmIChmYW1pbHkgPT09IE1VU0wpIHtcbiAgICBwYXJ0cy5wdXNoKCdtdXNsJyk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgIHBhcnRzLnB1c2goJ2dudWVhYmloZicpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goJ2dudScpO1xuICB9XG59IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgcGFydHMucHVzaCgnbXN2YycpO1xufVxuXG5sZXQgbmF0aXZlO1xudHJ5IHtcbiAgbmF0aXZlID0gcmVxdWlyZShgbGlnaHRuaW5nY3NzLSR7cGFydHMuam9pbignLScpfWApO1xufSBjYXRjaCAoZXJyKSB7XG4gIG5hdGl2ZSA9IHJlcXVpcmUoYC4uL2xpZ2h0bmluZ2Nzcy4ke3BhcnRzLmpvaW4oJy0nKX0ubm9kZWApO1xufVxuXG5tb2R1bGUuZXhwb3J0cy50cmFuc2Zvcm0gPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm0pO1xubW9kdWxlLmV4cG9ydHMudHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUgPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSk7XG5tb2R1bGUuZXhwb3J0cy5idW5kbGUgPSB3cmFwKG5hdGl2ZS5idW5kbGUpO1xubW9kdWxlLmV4cG9ydHMuYnVuZGxlQXN5bmMgPSB3cmFwKG5hdGl2ZS5idW5kbGVBc3luYyk7XG5tb2R1bGUuZXhwb3J0cy5icm93c2Vyc2xpc3RUb1RhcmdldHMgPSByZXF1aXJlKCcuL2Jyb3dzZXJzbGlzdFRvVGFyZ2V0cycpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZVZpc2l0b3JzID0gcmVxdWlyZSgnLi9jb21wb3NlVmlzaXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzLkZlYXR1cmVzID0gcmVxdWlyZSgnLi9mbGFncycpLkZlYXR1cmVzO1xuXG5mdW5jdGlvbiB3cmFwKGNhbGwpIHtcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnZpc2l0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkZXBzID0gW107XG4gICAgICBvcHRpb25zLnZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3Ioe1xuICAgICAgICBhZGREZXBlbmRlbmN5KGRlcCkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHJlc3VsdCA9IGNhbGwob3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzLmRlcGVuZGVuY2llcyA/Pz0gW107XG4gICAgICAgICAgICByZXMuZGVwZW5kZW5jaWVzLnB1c2goLi4uZGVwcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQuZGVwZW5kZW5jaWVzID8/PSBbXTtcbiAgICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcy5wdXNoKC4uLmRlcHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNhbGwob3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cbi8qKlxuICogUG9zdGJ1aWxkIENTUyBwdXJnZSDigJQgc3RhbmRhbG9uZSBCdW4gc2NyaXB0LlxuICpcbiAqIFJ1bnMgYWZ0ZXIgcnNidWlsZCBidWlsZCwgcHVyZ2VzIENTUyBmaWxlcyBpbiBkaXN0LyB1c2luZyBhIGRhdGFiYXNlLWZpcnN0XG4gKiBjb21wb25lbnQgbWFuaWZlc3QgYW5kIGNvbnN1bWVyIEpTWCB1c2FnZSBhbmFseXNpcy5cbiAqXG4gKiBDb25zZXJ2YXRpdmUgcnVsZXM6XG4gKiAgIC0gc2VsZWN0b3JzIG93bmVkIG9ubHkgYnkgdW51c2VkIGtub3duIGNvbXBvbmVudHMgY2FuIGJlIHJlbW92ZWRcbiAqICAgLSBzZWxlY3RvcnMgb3duZWQgYnkgdXNlZCBjb21wb25lbnRzIGJ1dCB1bnVzZWQga25vd24gcHJvcCB2YXJpYW50cyBjYW4gYmUgcmVtb3ZlZFxuICogICAtIHNlbGVjdG9ycyB3aXRoIHVua25vd24gb3duZXJzaGlwIGFyZSBrZXB0XG4gKiAgIC0gZGF0YS9hcmlhIHJ1bnRpbWUgc3RhdGUgaXMga2VwdCB3aGVuIHRoZSBvd25pbmcgY29tcG9uZW50IHNlbGVjdG9yIGlzIGtlcHRcbiAqICAgLSB2YXJzL2tleWZyYW1lcyBhcmUgcmVtb3ZlZCBvbmx5IGFmdGVyIHNlbGVjdG9yIHB1cmdlIHByb3ZlcyB0aGVtIHVucmVmZXJlbmNlZFxuICovXG5cbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tIFwibGlnaHRuaW5nY3NzXCI7XG5pbXBvcnQgcG9zdGNzcyBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHR5cGUgeyBBdFJ1bGUsIFJ1bGUgfSBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHsgYnVpbGRTYWZlbGlzdHMsIHNjYW5Db25zdW1lclNvdXJjZSB9IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29tcG9uZW50UHVyZ2VSZWNvcmQsXG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0LFxuXHRQdXJnZU1hbmlmZXN0LFxuXHRTYWZlbGlzdHMsXG59IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcblxuLy8g4pSA4pSAIENMSSBhcmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiB7XG5cdGRpc3REaXI6IHN0cmluZztcblx0c3JjRGlyOiBzdHJpbmc7XG5cdG1hbmlmZXN0UGF0aDogc3RyaW5nO1xufSB7XG5cdGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuXHRsZXQgZGlzdERpciA9IFwiLi9kaXN0XCI7XG5cdGxldCBzcmNEaXIgPSBcIi4vc3JjXCI7XG5cdGxldCBtYW5pZmVzdFBhdGggPSBcIlwiO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChhcmdzW2ldID09PSBcIi0tZGlzdFwiICYmIGFyZ3NbaSArIDFdKSBkaXN0RGlyID0gYXJnc1srK2ldO1xuXHRcdGVsc2UgaWYgKGFyZ3NbaV0gPT09IFwiLS1zcmNcIiAmJiBhcmdzW2kgKyAxXSkgc3JjRGlyID0gYXJnc1srK2ldO1xuXHRcdGVsc2UgaWYgKGFyZ3NbaV0gPT09IFwiLS1tYW5pZmVzdFwiICYmIGFyZ3NbaSArIDFdKSBtYW5pZmVzdFBhdGggPSBhcmdzWysraV07XG5cdH1cblxuXHRpZiAoIW1hbmlmZXN0UGF0aCkge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcIlVzYWdlOiBidW54IEBwYXRoc2NhbGUvcnNidWlsZC1wbHVnaW4tdWktY3NzLXB1cmdlIC0tbWFuaWZlc3QgPHBhdGg+IFstLWRpc3QgPHBhdGg+XSBbLS1zcmMgPHBhdGg+XVwiLFxuXHRcdCk7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cblx0cmV0dXJuIHsgZGlzdERpciwgc3JjRGlyLCBtYW5pZmVzdFBhdGggfTtcbn1cblxuLy8g4pSA4pSAIERhdGFiYXNlIG5vcm1hbGl6YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBOb3JtYWxpemVkQ29tcG9uZW50UmVjb3JkIGV4dGVuZHMgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Qge1xuXHRrZXk6IHN0cmluZztcblx0Y29tcG9uZW50OiBzdHJpbmc7XG5cdHBhcnQ/OiBzdHJpbmc7XG5cdHNlbGVjdG9yczogc3RyaW5nW107XG5cdGF0dHJpYnV0ZVNlbGVjdG9yczogc3RyaW5nW107XG5cdGNzc1ZhcnM6IHtcblx0XHRkZWNsYXJlZDogc3RyaW5nW107XG5cdFx0cmVmZXJlbmNlZDogc3RyaW5nW107XG5cdH07XG5cdGtleWZyYW1lczoge1xuXHRcdGRlY2xhcmVkOiBzdHJpbmdbXTtcblx0XHRyZWZlcmVuY2VkOiBzdHJpbmdbXTtcblx0fTtcbn1cblxuaW50ZXJmYWNlIE5vcm1hbGl6ZWRQdXJnZURhdGFiYXNlIHtcblx0dmVyc2lvbjogMjtcblx0Y29tcG9uZW50czogUmVjb3JkPHN0cmluZywgTm9ybWFsaXplZENvbXBvbmVudFJlY29yZD47XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVB1cmdlRGF0YWJhc2UoXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0LFxuKTogTm9ybWFsaXplZFB1cmdlRGF0YWJhc2Uge1xuXHRjb25zdCByYXdDb21wb25lbnRzID1cblx0XHRcInZlcnNpb25cIiBpbiBtYW5pZmVzdCAmJiBtYW5pZmVzdC52ZXJzaW9uID09PSAyXG5cdFx0XHQ/IG1hbmlmZXN0LmNvbXBvbmVudHNcblx0XHRcdDogbWFuaWZlc3Q7XG5cdGNvbnN0IGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIE5vcm1hbGl6ZWRDb21wb25lbnRSZWNvcmQ+ID0ge307XG5cblx0Zm9yIChjb25zdCBba2V5LCByZWNvcmRdIG9mIE9iamVjdC5lbnRyaWVzKHJhd0NvbXBvbmVudHMpKSB7XG5cdFx0Y29uc3QgbWF5YmVWMiA9IHJlY29yZCBhcyBDb21wb25lbnRQdXJnZVJlY29yZDtcblx0XHRjb25zdCBbZmFsbGJhY2tDb21wb25lbnQsIGZhbGxiYWNrUGFydF0gPSBzcGxpdENvbXBvbmVudEtleShrZXkpO1xuXHRcdGNvbXBvbmVudHNba2V5XSA9IHtcblx0XHRcdC4uLnJlY29yZCxcblx0XHRcdGtleTogbWF5YmVWMi5rZXkgPz8ga2V5LFxuXHRcdFx0Y29tcG9uZW50OiBtYXliZVYyLmNvbXBvbmVudCA/PyBmYWxsYmFja0NvbXBvbmVudCxcblx0XHRcdHBhcnQ6IG1heWJlVjIucGFydCA/PyBmYWxsYmFja1BhcnQsXG5cdFx0XHRzZWxlY3RvcnM6IG1heWJlVjIuc2VsZWN0b3JzID8/IFtdLFxuXHRcdFx0YXR0cmlidXRlU2VsZWN0b3JzOiBtYXliZVYyLmF0dHJpYnV0ZVNlbGVjdG9ycyA/PyBbXSxcblx0XHRcdGNzc1ZhcnM6IHtcblx0XHRcdFx0ZGVjbGFyZWQ6IG1heWJlVjIuY3NzVmFycz8uZGVjbGFyZWQgPz8gW10sXG5cdFx0XHRcdHJlZmVyZW5jZWQ6IG1heWJlVjIuY3NzVmFycz8ucmVmZXJlbmNlZCA/PyBbXSxcblx0XHRcdH0sXG5cdFx0XHRrZXlmcmFtZXM6IHtcblx0XHRcdFx0ZGVjbGFyZWQ6IG1heWJlVjIua2V5ZnJhbWVzPy5kZWNsYXJlZCA/PyBbXSxcblx0XHRcdFx0cmVmZXJlbmNlZDogbWF5YmVWMi5rZXlmcmFtZXM/LnJlZmVyZW5jZWQgPz8gW10sXG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4geyB2ZXJzaW9uOiAyLCBjb21wb25lbnRzIH07XG59XG5cbmZ1bmN0aW9uIHNwbGl0Q29tcG9uZW50S2V5KGtleTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXSB7XG5cdGNvbnN0IFtjb21wb25lbnQsIC4uLnBhcnRdID0ga2V5LnNwbGl0KFwiLlwiKTtcblx0cmV0dXJuIFtjb21wb25lbnQsIHBhcnQubGVuZ3RoID4gMCA/IHBhcnQuam9pbihcIi5cIikgOiB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiByb290Q29tcG9uZW50KGtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIGtleS5zcGxpdChcIi5cIilbMF07XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDbGFzc2VzRnJvbUVudHJ5KGVudHJ5OiBMZWdhY3lDb21wb25lbnRNYW5pZmVzdCk6IHN0cmluZ1tdIHtcblx0Y29uc3QgcmVzdWx0ID0gWy4uLmVudHJ5LmNsYXNzZXMuYWx3YXlzXTtcblx0Zm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGVudHJ5LmNsYXNzZXMuYnlQcm9wKSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmVzdWx0LnB1c2goLi4udmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goLi4uY2xhc3Nlcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBbLi4ubmV3IFNldChyZXN1bHQpXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc093bmVycyhcblx0ZGF0YWJhc2U6IE5vcm1hbGl6ZWRQdXJnZURhdGFiYXNlLFxuKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcblx0Y29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXHRmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhkYXRhYmFzZS5jb21wb25lbnRzKSkge1xuXHRcdGZvciAoY29uc3QgY2xzIG9mIGNvbGxlY3RDbGFzc2VzRnJvbUVudHJ5KGVudHJ5KSkge1xuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSBvd25lcnMuZ2V0KGNscykgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0XHRleGlzdGluZy5hZGQoa2V5KTtcblx0XHRcdG93bmVycy5zZXQoY2xzLCBleGlzdGluZyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvd25lcnM7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkVXNlZChyZWNvcmRLZXk6IHN0cmluZywgc2FmZWxpc3RzOiBTYWZlbGlzdHMpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRzYWZlbGlzdHMudXNlZENvbXBvbmVudHMuaGFzKHJlY29yZEtleSkgfHxcblx0XHRzYWZlbGlzdHMudXNlZENvbXBvbmVudHMuaGFzKHJvb3RDb21wb25lbnQocmVjb3JkS2V5KSlcblx0KTtcbn1cblxuZnVuY3Rpb24gaXNDbGFzc0FsbG93ZWQoXG5cdGNsczogc3RyaW5nLFxuXHRvd25lcnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pixcblx0c2FmZWxpc3RzOiBTYWZlbGlzdHMsXG4pOiBib29sZWFuIHtcblx0Y29uc3QgY2xhc3NPd25lcnMgPSBvd25lcnMuZ2V0KGNscyk7XG5cdGlmICghY2xhc3NPd25lcnMpIHJldHVybiB0cnVlO1xuXHRmb3IgKGNvbnN0IG93bmVyIG9mIGNsYXNzT3duZXJzKSB7XG5cdFx0aWYgKGlzUmVjb3JkVXNlZChvd25lciwgc2FmZWxpc3RzKSAmJiBzYWZlbGlzdHMuY2xhc3NTYWZlbGlzdC5oYXMoY2xzKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8g4pSA4pSAIFNlbGVjdG9yIHB1cmdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgU2VsZWN0b3JQdXJnZVJlcG9ydCB7XG5cdHNlbGVjdG9yc0tlcHRLbm93bjogbnVtYmVyO1xuXHRzZWxlY3RvcnNLZXB0VW5rbm93bjogbnVtYmVyO1xuXHRzZWxlY3RvcnNSZW1vdmVkOiBudW1iZXI7XG5cdHNlbGVjdG9yc1JlbW92ZWRVbnVzZWRDb21wb25lbnQ6IG51bWJlcjtcblx0c2VsZWN0b3JzUmVtb3ZlZFVudXNlZFZhcmlhbnQ6IG51bWJlcjtcblx0YXR0clNlbGVjdG9yc1NlZW46IG51bWJlcjtcblx0a2V5ZnJhbWVzUmVtb3ZlZDogbnVtYmVyO1xuXHRmb250RmFjZXNSZW1vdmVkOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQdXJnZVJlc3VsdCB7XG5cdGNzczogc3RyaW5nO1xuXHRyZXBvcnQ6IFNlbGVjdG9yUHVyZ2VSZXBvcnQ7XG59XG5cbmZ1bmN0aW9uIGVtcHR5U2VsZWN0b3JSZXBvcnQoKTogU2VsZWN0b3JQdXJnZVJlcG9ydCB7XG5cdHJldHVybiB7XG5cdFx0c2VsZWN0b3JzS2VwdEtub3duOiAwLFxuXHRcdHNlbGVjdG9yc0tlcHRVbmtub3duOiAwLFxuXHRcdHNlbGVjdG9yc1JlbW92ZWQ6IDAsXG5cdFx0c2VsZWN0b3JzUmVtb3ZlZFVudXNlZENvbXBvbmVudDogMCxcblx0XHRzZWxlY3RvcnNSZW1vdmVkVW51c2VkVmFyaWFudDogMCxcblx0XHRhdHRyU2VsZWN0b3JzU2VlbjogMCxcblx0XHRrZXlmcmFtZXNSZW1vdmVkOiAwLFxuXHRcdGZvbnRGYWNlc1JlbW92ZWQ6IDAsXG5cdH07XG59XG5cbi8qKiBVbmVzY2FwZSBDU1MgaWRlbnRpZmllcnM6IGBpY29uLVxcW21kaS0tY29nXFxdYCAtPiBgaWNvbi1bbWRpLS1jb2ddYCAqL1xuZnVuY3Rpb24gdW5lc2NhcGVDc3Moczogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHMucmVwbGFjZSgvXFxcXCguKS9nLCBcIiQxXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q2xhc3Nlc0Zyb21TZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBtYXRjaGVzID0gc2VsZWN0b3IubWF0Y2hBbGwoXG5cdFx0L1xcLihbYS16QS1aXy1dKD86W2EtekEtWjAtOV8tXXxcXFxcW15cXHMuIzpbPit+LCldKikqKS9nLFxuXHQpO1xuXHRyZXR1cm4gWy4uLm1hdGNoZXNdLm1hcCgobSkgPT4gdW5lc2NhcGVDc3MobVsxXSkpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QXR0cnNGcm9tU2VsZWN0b3Ioc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgbWF0Y2hlcyA9IHNlbGVjdG9yLm1hdGNoQWxsKFxuXHRcdC9cXFsoZGF0YS1bYS16QS1aMC05Xy1dK3xhcmlhLVthLXpBLVowLTlfLV0rKSg/Oj0oPzpcIihbXlwiXSopXCJ8JyhbXiddKiknfChbXlxcXV0rKSkpP1xcXS9nLFxuXHQpO1xuXHRyZXR1cm4gWy4uLm1hdGNoZXNdLm1hcCgobSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gbVsyXSA/PyBtWzNdID8/IG1bNF07XG5cdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBgWyR7bVsxXX1dYCA6IGBbJHttWzFdfT1cIiR7dmFsdWUudHJpbSgpfVwiXWA7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RvckRlY2lzaW9uKFxuXHRzZWxlY3Rvcjogc3RyaW5nLFxuXHRvd25lcnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pixcblx0c2FmZWxpc3RzOiBTYWZlbGlzdHMsXG4pOlxuXHR8IFwia2VlcC1rbm93blwiXG5cdHwgXCJrZWVwLXVua25vd25cIlxuXHR8IFwicmVtb3ZlLXVudXNlZC1jb21wb25lbnRcIlxuXHR8IFwicmVtb3ZlLXVudXNlZC12YXJpYW50XCIge1xuXHRjb25zdCBjbGFzc2VzID0gZXh0cmFjdENsYXNzZXNGcm9tU2VsZWN0b3Ioc2VsZWN0b3IpO1xuXHRpZiAoY2xhc3Nlcy5sZW5ndGggPT09IDApIHJldHVybiBcImtlZXAtdW5rbm93blwiO1xuXG5cdGNvbnN0IGhhc1Vua25vd25DbGFzcyA9IGNsYXNzZXMuc29tZSgoY2xzKSA9PiAhb3duZXJzLmhhcyhjbHMpKTtcblx0aWYgKGhhc1Vua25vd25DbGFzcykgcmV0dXJuIFwia2VlcC11bmtub3duXCI7XG5cblx0Y29uc3QgaGFzVXNlZE93bmVyID0gY2xhc3Nlcy5zb21lKChjbHMpID0+IHtcblx0XHRjb25zdCBjbGFzc093bmVycyA9IG93bmVycy5nZXQoY2xzKTtcblx0XHRyZXR1cm4gWy4uLihjbGFzc093bmVycyA/PyBbXSldLnNvbWUoKG93bmVyKSA9PlxuXHRcdFx0aXNSZWNvcmRVc2VkKG93bmVyLCBzYWZlbGlzdHMpLFxuXHRcdCk7XG5cdH0pO1xuXG5cdGlmICghaGFzVXNlZE93bmVyKSByZXR1cm4gXCJyZW1vdmUtdW51c2VkLWNvbXBvbmVudFwiO1xuXG5cdGlmIChjbGFzc2VzLmV2ZXJ5KChjbHMpID0+IGlzQ2xhc3NBbGxvd2VkKGNscywgb3duZXJzLCBzYWZlbGlzdHMpKSkge1xuXHRcdHJldHVybiBcImtlZXAta25vd25cIjtcblx0fVxuXG5cdHJldHVybiBcInJlbW92ZS11bnVzZWQtdmFyaWFudFwiO1xufVxuXG5mdW5jdGlvbiBwdXJnZUNzc1dpdGhEYXRhYmFzZShcblx0Y3NzOiBzdHJpbmcsXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0IHwgTm9ybWFsaXplZFB1cmdlRGF0YWJhc2UsXG5cdHNhZmVsaXN0czogU2FmZWxpc3RzLFxuKTogUHVyZ2VSZXN1bHQge1xuXHRjb25zdCBkYXRhYmFzZSA9IG5vcm1hbGl6ZVB1cmdlRGF0YWJhc2UobWFuaWZlc3QgYXMgUHVyZ2VNYW5pZmVzdCk7XG5cdGNvbnN0IGNsYXNzT3duZXJzID0gYnVpbGRDbGFzc093bmVycyhkYXRhYmFzZSk7XG5cdGNvbnN0IHJlcG9ydCA9IGVtcHR5U2VsZWN0b3JSZXBvcnQoKTtcblx0Y29uc3Qgcm9vdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuXHRyb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuXHRcdGNvbnN0IHNlbGVjdG9ycyA9IHJ1bGUuc2VsZWN0b3JzO1xuXHRcdGNvbnN0IGtlcHQ6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuXHRcdFx0cmVwb3J0LmF0dHJTZWxlY3RvcnNTZWVuICs9IGV4dHJhY3RBdHRyc0Zyb21TZWxlY3RvcihzZWxlY3RvcikubGVuZ3RoO1xuXHRcdFx0Y29uc3QgZGVjaXNpb24gPSBzZWxlY3RvckRlY2lzaW9uKHNlbGVjdG9yLCBjbGFzc093bmVycywgc2FmZWxpc3RzKTtcblx0XHRcdGlmIChkZWNpc2lvbiA9PT0gXCJrZWVwLWtub3duXCIpIHtcblx0XHRcdFx0cmVwb3J0LnNlbGVjdG9yc0tlcHRLbm93bisrO1xuXHRcdFx0XHRrZXB0LnB1c2goc2VsZWN0b3IpO1xuXHRcdFx0fSBlbHNlIGlmIChkZWNpc2lvbiA9PT0gXCJrZWVwLXVua25vd25cIikge1xuXHRcdFx0XHRyZXBvcnQuc2VsZWN0b3JzS2VwdFVua25vd24rKztcblx0XHRcdFx0a2VwdC5wdXNoKHNlbGVjdG9yKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlcG9ydC5zZWxlY3RvcnNSZW1vdmVkKys7XG5cdFx0XHRcdGlmIChkZWNpc2lvbiA9PT0gXCJyZW1vdmUtdW51c2VkLWNvbXBvbmVudFwiKSB7XG5cdFx0XHRcdFx0cmVwb3J0LnNlbGVjdG9yc1JlbW92ZWRVbnVzZWRDb21wb25lbnQrKztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXBvcnQuc2VsZWN0b3JzUmVtb3ZlZFVudXNlZFZhcmlhbnQrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChrZXB0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cnVsZS5yZW1vdmUoKTtcblx0XHR9IGVsc2UgaWYgKGtlcHQubGVuZ3RoIDwgc2VsZWN0b3JzLmxlbmd0aCkge1xuXHRcdFx0cnVsZS5zZWxlY3RvcnMgPSBrZXB0O1xuXHRcdH1cblx0fSk7XG5cblx0cmVtb3ZlVW51c2VkS2V5ZnJhbWVzKHJvb3QsIHJlcG9ydCk7XG5cdHJlbW92ZVVudXNlZEZvbnRGYWNlcyhyb290LCByZXBvcnQpO1xuXHRyZW1vdmVFbXB0eUF0UnVsZXMocm9vdCk7XG5cblx0cmV0dXJuIHsgY3NzOiByb290LnRvU3RyaW5nKCksIHJlcG9ydCB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbnVzZWRLZXlmcmFtZXMoXG5cdHJvb3Q6IHBvc3Rjc3MuUm9vdCxcblx0cmVwb3J0OiBTZWxlY3RvclB1cmdlUmVwb3J0LFxuKSB7XG5cdGNvbnN0IHVzZWRLZXlmcmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cm9vdC53YWxrRGVjbHMoL15hbmltYXRpb24oLW5hbWUpPyQvLCAoZGVjbCkgPT4ge1xuXHRcdGZvciAoY29uc3QgcGFydCBvZiBkZWNsLnZhbHVlLnNwbGl0KFwiLFwiKSkge1xuXHRcdFx0Y29uc3QgbmFtZSA9IHBhcnQudHJpbSgpLnNwbGl0KC9cXHMrLylbMF07XG5cdFx0XHRpZiAobmFtZSAmJiAhW1wibm9uZVwiLCBcImluaXRpYWxcIiwgXCJpbmhlcml0XCIsIFwidW5zZXRcIl0uaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dXNlZEtleWZyYW1lcy5hZGQobmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRyb290LndhbGtBdFJ1bGVzKFwia2V5ZnJhbWVzXCIsIChhdFJ1bGUpID0+IHtcblx0XHRpZiAoIXVzZWRLZXlmcmFtZXMuaGFzKGF0UnVsZS5wYXJhbXMudHJpbSgpKSkge1xuXHRcdFx0YXRSdWxlLnJlbW92ZSgpO1xuXHRcdFx0cmVwb3J0LmtleWZyYW1lc1JlbW92ZWQrKztcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbnVzZWRGb250RmFjZXMoXG5cdHJvb3Q6IHBvc3Rjc3MuUm9vdCxcblx0cmVwb3J0OiBTZWxlY3RvclB1cmdlUmVwb3J0LFxuKSB7XG5cdGNvbnN0IHVzZWRGb250cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRyb290LndhbGtEZWNscygvXmZvbnQoLWZhbWlseSk/JC8sIChkZWNsKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBwYXJ0IG9mIGRlY2wudmFsdWUuc3BsaXQoXCIsXCIpKSB7XG5cdFx0XHRjb25zdCBuYW1lID0gcGFydC50cmltKCkucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCBcIlwiKTtcblx0XHRcdGlmIChuYW1lKSB1c2VkRm9udHMuYWRkKG5hbWUpO1xuXHRcdH1cblx0fSk7XG5cblx0cm9vdC53YWxrQXRSdWxlcyhcImZvbnQtZmFjZVwiLCAoYXRSdWxlKSA9PiB7XG5cdFx0bGV0IGZhbWlseSA9IFwiXCI7XG5cdFx0YXRSdWxlLndhbGtEZWNscyhcImZvbnQtZmFtaWx5XCIsIChkZWNsKSA9PiB7XG5cdFx0XHRmYW1pbHkgPSBkZWNsLnZhbHVlLnRyaW0oKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuXHRcdH0pO1xuXHRcdGlmIChmYW1pbHkgJiYgIXVzZWRGb250cy5oYXMoZmFtaWx5KSkge1xuXHRcdFx0YXRSdWxlLnJlbW92ZSgpO1xuXHRcdFx0cmVwb3J0LmZvbnRGYWNlc1JlbW92ZWQrKztcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eUF0UnVsZXMocm9vdDogcG9zdGNzcy5Sb290KSB7XG5cdGxldCBjbGVhbmVkID0gdHJ1ZTtcblx0d2hpbGUgKGNsZWFuZWQpIHtcblx0XHRjbGVhbmVkID0gZmFsc2U7XG5cdFx0cm9vdC53YWxrQXRSdWxlcygoYXRSdWxlKSA9PiB7XG5cdFx0XHRpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0YXRSdWxlLnJlbW92ZSgpO1xuXHRcdFx0XHRjbGVhbmVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG4vLyDilIDilIAgUnVudGltZSBDU1MgdmFyaWFibGUgcmVmZXJlbmNlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFJ1bnRpbWVDc3NWYXJSZWZzKGRpc3REaXI6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcblx0Y29uc3QgcmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRjb25zdCBnbG9iID0gbmV3IEdsb2IoXCIqKi8qLntqcyxtanMsY2pzfVwiKTtcblxuXHRmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBkaXN0RGlyIH0pKSB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtkaXN0RGlyfS8ke3JlbFBhdGh9YDtcblx0XHRjb25zdCBjb2RlID0gYXdhaXQgQnVuLmZpbGUoZnVsbFBhdGgpLnRleHQoKTtcblx0XHRmb3IgKGNvbnN0IG1hdGNoIG9mIGNvZGUubWF0Y2hBbGwoL3ZhclxcKFxccyooLS1bYS16QS1aMC05Xy1dKykvZykpIHtcblx0XHRcdHJlZnMuYWRkKG1hdGNoWzFdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVmcztcbn1cblxuLy8g4pSA4pSAIFVudXNlZCBDU1MgdmFyaWFibGUgY2xlYW51cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFZhckNsZWFudXBSZXN1bHQge1xuXHRjc3M6IHN0cmluZztcblx0cmVtb3ZlZDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBjbGVhblVudXNlZFZhcnNXaXRoUmVwb3J0KFxuXHRjc3M6IHN0cmluZyxcblx0ZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzOiBTZXQ8c3RyaW5nPixcbik6IFZhckNsZWFudXBSZXN1bHQge1xuXHRsZXQgY2hhbmdlZCA9IHRydWU7XG5cdGxldCByZXN1bHQgPSBjc3M7XG5cdGxldCByZW1vdmVkID0gMDtcblxuXHR3aGlsZSAoY2hhbmdlZCkge1xuXHRcdGNoYW5nZWQgPSBmYWxzZTtcblx0XHRjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShyZXN1bHQpO1xuXG5cdFx0Y29uc3QgZGVjbGFyZWQgPSBuZXcgTWFwPHN0cmluZywgeyBydWxlOiBSdWxlIHwgQXRSdWxlOyBwcm9wOiBzdHJpbmcgfVtdPigpO1xuXHRcdHJvb3Qud2Fsa0RlY2xzKC9eLS0vLCAoZGVjbCkgPT4ge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGRlY2xhcmVkLmdldChkZWNsLnByb3ApID8/IFtdO1xuXHRcdFx0ZW50cmllcy5wdXNoKHsgcnVsZTogZGVjbC5wYXJlbnQgYXMgUnVsZSwgcHJvcDogZGVjbC5wcm9wIH0pO1xuXHRcdFx0ZGVjbGFyZWQuc2V0KGRlY2wucHJvcCwgZW50cmllcyk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KGV4dGVybmFsbHlSZWZlcmVuY2VkVmFycyk7XG5cdFx0cm9vdC53YWxrRGVjbHMoKGRlY2wpID0+IHtcblx0XHRcdGZvciAoY29uc3QgcmVmIG9mIGRlY2wudmFsdWUubWF0Y2hBbGwoL3ZhclxcKFxccyooLS1bYS16QS1aMC05Xy1dKykvZykpIHtcblx0XHRcdFx0cmVmZXJlbmNlZC5hZGQocmVmWzFdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGZvciAoY29uc3QgW3Zhck5hbWUsIGVudHJpZXNdIG9mIGRlY2xhcmVkKSB7XG5cdFx0XHRpZiAoIXJlZmVyZW5jZWQuaGFzKHZhck5hbWUpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0XHRcdGVudHJ5LnJ1bGUud2Fsa0RlY2xzKGVudHJ5LnByb3AsIChkZWNsKSA9PiB7XG5cdFx0XHRcdFx0XHRkZWNsLnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRyZW1vdmVkKys7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuXHRcdFx0aWYgKHJ1bGUubm9kZXMgJiYgcnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHJ1bGUucmVtb3ZlKCk7XG5cdFx0fSk7XG5cdFx0cmVtb3ZlRW1wdHlBdFJ1bGVzKHJvb3QpO1xuXG5cdFx0cmVzdWx0ID0gcm9vdC50b1N0cmluZygpO1xuXHR9XG5cblx0cmV0dXJuIHsgY3NzOiByZXN1bHQsIHJlbW92ZWQgfTtcbn1cblxuZnVuY3Rpb24gY2xlYW5VbnVzZWRWYXJzKFxuXHRjc3M6IHN0cmluZyxcblx0ZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzOiBTZXQ8c3RyaW5nPixcbik6IHN0cmluZyB7XG5cdHJldHVybiBjbGVhblVudXNlZFZhcnNXaXRoUmVwb3J0KGNzcywgZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzKS5jc3M7XG59XG5cbi8vIOKUgOKUgCBNaW5pZmljYXRpb246IExpZ2h0bmluZyBDU1Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIG1pbmlmeShjc3M6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHsgY29kZSB9ID0gdHJhbnNmb3JtKHtcblx0XHRmaWxlbmFtZTogXCJwdXJnZWQuY3NzXCIsXG5cdFx0Y29kZTogQnVmZmVyLmZyb20oY3NzKSxcblx0XHRtaW5pZnk6IHRydWUsXG5cdFx0ZXJyb3JSZWNvdmVyeTogdHJ1ZSxcblx0fSk7XG5cdHJldHVybiBjb2RlLnRvU3RyaW5nKCk7XG59XG5cbi8vIOKUgOKUgCBNYWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRjb25zdCB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH0gPSBwYXJzZUFyZ3MocHJvY2Vzcy5hcmd2KTtcblxuXHRjb25zdCBtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCA9IEpTT04ucGFyc2UoXG5cdFx0YXdhaXQgQnVuLmZpbGUobWFuaWZlc3RQYXRoKS50ZXh0KCksXG5cdCk7XG5cdGNvbnN0IGRhdGFiYXNlID0gbm9ybWFsaXplUHVyZ2VEYXRhYmFzZShtYW5pZmVzdCk7XG5cdGNvbnN0IHJvb3RzID0gbmV3IFNldChPYmplY3Qua2V5cyhkYXRhYmFzZS5jb21wb25lbnRzKS5tYXAocm9vdENvbXBvbmVudCkpO1xuXHRjb25zb2xlLmxvZyhcblx0XHRgW2Nzcy1wdXJnZV0gRGF0YWJhc2UgbG9hZGVkOiAke09iamVjdC5rZXlzKGRhdGFiYXNlLmNvbXBvbmVudHMpLmxlbmd0aH0gcmVjb3JkcyAoJHtyb290cy5zaXplfSBjb21wb25lbnRzKWAsXG5cdCk7XG5cblx0Y29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcik7XG5cdGNvbnN0IHNhZmVsaXN0cyA9IGJ1aWxkU2FmZWxpc3RzKHVzYWdlcywgbWFuaWZlc3QpO1xuXHRjb25zdCB1c2VkUm9vdHMgPSBuZXcgU2V0KFsuLi5zYWZlbGlzdHMudXNlZENvbXBvbmVudHNdLm1hcChyb290Q29tcG9uZW50KSk7XG5cdGNvbnN0IHJlbW92ZWRSb290cyA9IFsuLi5yb290c10uZmlsdGVyKChyb290KSA9PiAhdXNlZFJvb3RzLmhhcyhyb290KSk7XG5cblx0Y29uc29sZS5sb2coXG5cdFx0YFtjc3MtcHVyZ2VdIENvbXBvbmVudHMgZGV0ZWN0ZWQ6ICR7dXNlZFJvb3RzLnNpemV9IHVzZWQsICR7cmVtb3ZlZFJvb3RzLmxlbmd0aH0gcmVtb3ZhYmxlYCxcblx0KTtcblx0aWYgKHVzZWRSb290cy5zaXplID4gMCkge1xuXHRcdGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIHVzZWQ6ICR7Wy4uLnVzZWRSb290c10uc29ydCgpLmpvaW4oXCIsIFwiKX1gKTtcblx0fVxuXHRpZiAocmVtb3ZlZFJvb3RzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICByZW1vdmFibGU6ICR7cmVtb3ZlZFJvb3RzLnNvcnQoKS5qb2luKFwiLCBcIil9YCk7XG5cdH1cblx0Y29uc29sZS5sb2coXG5cdFx0YFtjc3MtcHVyZ2VdIFNhZmVsaXN0IGZhY3RzOiAke3NhZmVsaXN0cy5jbGFzc1NhZmVsaXN0LnNpemV9IGNsYXNzZXMsICR7c2FmZWxpc3RzLmF0dHJTYWZlbGlzdC5zaXplfSBhdHRyIHNlbGVjdG9yc2AsXG5cdCk7XG5cblx0Y29uc3QgcnVudGltZUNzc1ZhclJlZnMgPSBhd2FpdCBjb2xsZWN0UnVudGltZUNzc1ZhclJlZnMoZGlzdERpcik7XG5cdGlmIChydW50aW1lQ3NzVmFyUmVmcy5zaXplID4gMCkge1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtjc3MtcHVyZ2VdIFJ1bnRpbWUgQ1NTIHZhcnMgcmVmZXJlbmNlZCBmcm9tIEpTOiAke3J1bnRpbWVDc3NWYXJSZWZzLnNpemV9YCxcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi5jc3NcIik7XG5cdGxldCB0b3RhbEJlZm9yZSA9IDA7XG5cdGxldCB0b3RhbEFmdGVyID0gMDtcblxuXHRmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBkaXN0RGlyIH0pKSB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtkaXN0RGlyfS8ke3JlbFBhdGh9YDtcblx0XHRjb25zdCBvcmlnaW5hbENzcyA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgob3JpZ2luYWxDc3MsIFwidXRmLThcIik7XG5cdFx0dG90YWxCZWZvcmUgKz0gb3JpZ2luYWxTaXplO1xuXG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gUHJvY2Vzc2luZyAke3JlbFBhdGh9ICgkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQilgLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwdXJnZWQgPSBwdXJnZUNzc1dpdGhEYXRhYmFzZShvcmlnaW5hbENzcywgZGF0YWJhc2UsIHNhZmVsaXN0cyk7XG5cdFx0bGV0IHB1cmdlZENzcyA9IHB1cmdlZC5jc3M7XG5cdFx0Y29uc3QgYWZ0ZXJTZWxlY3RvcnMgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gICBzZWxlY3RvcnM6ICR7KG9yaWdpbmFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IC0+ICR7KGFmdGVyU2VsZWN0b3JzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7cHVyZ2VkLnJlcG9ydC5zZWxlY3RvcnNSZW1vdmVkfSByZW1vdmVkLCAke3B1cmdlZC5yZXBvcnQuc2VsZWN0b3JzS2VwdFVua25vd259IGtlcHQgdW5rbm93bilgLFxuXHRcdCk7XG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gICBhdHRycyBzZWVuOiAke3B1cmdlZC5yZXBvcnQuYXR0clNlbGVjdG9yc1NlZW59OyBrZXlmcmFtZXMgcmVtb3ZlZDogJHtwdXJnZWQucmVwb3J0LmtleWZyYW1lc1JlbW92ZWR9YCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdmFycyA9IGNsZWFuVW51c2VkVmFyc1dpdGhSZXBvcnQocHVyZ2VkQ3NzLCBydW50aW1lQ3NzVmFyUmVmcyk7XG5cdFx0cHVyZ2VkQ3NzID0gdmFycy5jc3M7XG5cdFx0Y29uc3QgYWZ0ZXJWYXJzID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtjc3MtcHVyZ2VdICAgdmFyczogJHsoYWZ0ZXJTZWxlY3RvcnMgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyhhZnRlclZhcnMgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHt2YXJzLnJlbW92ZWR9IHJlbW92ZWQpYCxcblx0XHQpO1xuXG5cdFx0cHVyZ2VkQ3NzID0gbWluaWZ5KHB1cmdlZENzcyk7XG5cdFx0Y29uc3QgZmluYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuXHRcdHRvdGFsQWZ0ZXIgKz0gZmluYWxTaXplO1xuXHRcdGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIG1pbmlmeTogLT4gJHsoZmluYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGBbY3NzLXB1cmdlXSAgIGZpbmFsOiAkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyhmaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHsoKDEgLSBmaW5hbFNpemUgLyBvcmlnaW5hbFNpemUpICogMTAwKS50b0ZpeGVkKDEpfSUgcmVkdWN0aW9uKWAsXG5cdFx0KTtcblxuXHRcdGF3YWl0IEJ1bi53cml0ZShmdWxsUGF0aCwgcHVyZ2VkQ3NzKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFxuXHRcdGBcXG5bY3NzLXB1cmdlXSBUb3RhbDogJHsodG90YWxCZWZvcmUgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyh0b3RhbEFmdGVyIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7KCgxIC0gdG90YWxBZnRlciAvIHRvdGFsQmVmb3JlKSAqIDEwMCkudG9GaXhlZCgxKX0lIHJlZHVjdGlvbilgLFxuXHQpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuXHRtYWluKCk7XG59XG5cbmV4cG9ydCB7XG5cdGNsZWFuVW51c2VkVmFycyxcblx0Y2xlYW5VbnVzZWRWYXJzV2l0aFJlcG9ydCxcblx0bm9ybWFsaXplUHVyZ2VEYXRhYmFzZSxcblx0cHVyZ2VDc3NXaXRoRGF0YWJhc2UsXG59O1xuZXhwb3J0IHR5cGUge1xuXHROb3JtYWxpemVkUHVyZ2VEYXRhYmFzZSxcblx0UHVyZ2VSZXN1bHQsXG5cdFNlbGVjdG9yUHVyZ2VSZXBvcnQsXG5cdFZhckNsZWFudXBSZXN1bHQsXG59O1xuIiwKICAgICJpbXBvcnQgaW5kZXggZnJvbSAnLi9pbmRleC5qcyc7XG5cbmNvbnN0IHsgdHJhbnNmb3JtLCB0cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSwgYnVuZGxlLCBidW5kbGVBc3luYywgYnJvd3NlcnNsaXN0VG9UYXJnZXRzLCBjb21wb3NlVmlzaXRvcnMsIEZlYXR1cmVzIH0gPSBpbmRleDtcbmV4cG9ydCB7IHRyYW5zZm9ybSwgdHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUsIGJ1bmRsZSwgYnVuZGxlQXN5bmMsIGJyb3dzZXJzbGlzdFRvVGFyZ2V0cywgY29tcG9zZVZpc2l0b3JzLCBGZWF0dXJlcyB9O1xuIiwKICAgICIvKipcbiAqIENvbnN1bWVyLXNpZGUgSlNYIHNjYW5uZXIuXG4gKlxuICogV2Fsa3MgYSBjb25zdW1lciBzb3VyY2UgdHJlZSwgcmVzb2x2ZXMgQHBhdGhzY2FsZS91aSBpbXBvcnRzIHdpdGggU1dDLCBhbmRcbiAqIHJlY29yZHMgY2Fub25pY2FsIGNvbXBvbmVudC9wYXJ0IHVzYWdlIHBsdXMgcHJvcCBmYWN0cyBmb3IgZGF0YWJhc2UtZmlyc3QgQ1NTXG4gKiBwdXJnZSBkZWNpc2lvbnMuXG4gKlxuICogVXNhZ2U6ICBidW4gcnVuIHNyYy9zY2FuLWNvbnN1bWVyLnRzIDxjb25zdW1lci1zcmMtZGlyPiA8cHVyZ2UtbWFuaWZlc3QuanNvbj5cbiAqL1xuXG5pbXBvcnQgc3djIGZyb20gXCJAc3djL2NvcmVcIjtcbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0IHtcblx0Y2xhc3Nlczoge1xuXHRcdGFsd2F5czogc3RyaW5nW107XG5cdFx0YnlQcm9wOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj47XG5cdH07XG5cdGF0dHJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cdGRlcHM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbXBvbmVudFB1cmdlUmVjb3JkIGV4dGVuZHMgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Qge1xuXHRrZXk/OiBzdHJpbmc7XG5cdGNvbXBvbmVudD86IHN0cmluZztcblx0cGFydD86IHN0cmluZztcblx0c2VsZWN0b3JzPzogc3RyaW5nW107XG5cdGF0dHJpYnV0ZVNlbGVjdG9ycz86IHN0cmluZ1tdO1xuXHRjc3NWYXJzPzoge1xuXHRcdGRlY2xhcmVkPzogc3RyaW5nW107XG5cdFx0cmVmZXJlbmNlZD86IHN0cmluZ1tdO1xuXHR9O1xuXHRrZXlmcmFtZXM/OiB7XG5cdFx0ZGVjbGFyZWQ/OiBzdHJpbmdbXTtcblx0XHRyZWZlcmVuY2VkPzogc3RyaW5nW107XG5cdH07XG59XG5cbmludGVyZmFjZSBQdXJnZURhdGFiYXNlVjIge1xuXHR2ZXJzaW9uOiAyO1xuXHRjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRQdXJnZVJlY29yZD47XG5cdHNoYXJlZD86IHtcblx0XHRzZWxlY3RvcnM/OiB1bmtub3duW107XG5cdFx0Y3NzVmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGtleWZyYW1lcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHR9O1xufVxuXG50eXBlIFB1cmdlTWFuaWZlc3QgPSBSZWNvcmQ8c3RyaW5nLCBMZWdhY3lDb21wb25lbnRNYW5pZmVzdD4gfCBQdXJnZURhdGFiYXNlVjI7XG5cbi8qKiBXaGF0IHdlIGNvbGxlY3QgcGVyIGNvbXBvbmVudCB1c2FnZSBmcm9tIEpTWCAqL1xuaW50ZXJmYWNlIFByb3BVc2FnZSB7XG5cdGNvbXBvbmVudDogc3RyaW5nO1xuXHRwcm9wczogTWFwPHN0cmluZywgc3RyaW5nIHwgXCJEWU5BTUlDXCI+O1xuXHRib29sZWFuUHJvcHM6IFNldDxzdHJpbmc+O1xuXHRoYXNTcHJlYWQ6IGJvb2xlYW47XG5cdHNvdXJjZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEltcG9ydEJpbmRpbmdzIHtcblx0Y29tcG9uZW50czogTWFwPHN0cmluZywgc3RyaW5nPjtcblx0bmFtZXNwYWNlczogTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG5cdGNvbnNlcnZhdGl2ZVVzYWdlczogUHJvcFVzYWdlW107XG59XG5cbmludGVyZmFjZSBTYWZlbGlzdHMge1xuXHRjbGFzc1NhZmVsaXN0OiBTZXQ8c3RyaW5nPjtcblx0YXR0clNhZmVsaXN0OiBTZXQ8c3RyaW5nPjtcblx0dXNlZENvbXBvbmVudHM6IFNldDxzdHJpbmc+O1xuXHRkeW5hbWljQ29tcG9uZW50czogU2V0PHN0cmluZz47XG59XG5cbnR5cGUgQXN0Tm9kZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLyDilIDilIAgQVNUIHdhbGtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gd2Fsa0FTVChub2RlOiB1bmtub3duLCB2aXNpdG9yOiAobm9kZTogQXN0Tm9kZSkgPT4gdm9pZCkge1xuXHRpZiAoIWlzUmVjb3JkKG5vZGUpKSByZXR1cm47XG5cdHZpc2l0b3Iobm9kZSk7XG5cdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG5cdFx0aWYgKGtleSA9PT0gXCJzcGFuXCIpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbCA9IG5vZGVba2V5XTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrQVNUKGl0ZW0sIHZpc2l0b3IpO1xuXHRcdH0gZWxzZSBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdHdhbGtBU1QodmFsLCB2aXNpdG9yKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24ga2ViYWJUb1Bhc2NhbChzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc1xuXHRcdC5zcGxpdChcIi1cIilcblx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0Lm1hcCgocCkgPT4gcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSkpXG5cdFx0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eQHBhdGhzY2FsZVxcL3VpXFwvY29tcG9uZW50c1xcLyhbXi9dKykvKTtcblx0aWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBrZWJhYlRvUGFzY2FsKG1hdGNoWzFdKTtcbn1cblxuZnVuY3Rpb24gaXNVaUltcG9ydChzb3VyY2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHNvdXJjZSBpcyBzdHJpbmcge1xuXHRyZXR1cm4gQm9vbGVhbihzb3VyY2U/LnN0YXJ0c1dpdGgoXCJAcGF0aHNjYWxlL3VpXCIpKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCBwcm9wID0gdmFsdWVba2V5XTtcblx0cmV0dXJuIHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiID8gcHJvcCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Qm9vbGVhbih2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHZhbHVlW2tleV0gPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldFBhdGhTdHJpbmcodmFsdWU6IHVua25vd24sIC4uLmtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGN1cnJlbnQgPSB2YWx1ZTtcblx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXHRcdGlmICghaXNSZWNvcmQoY3VycmVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y3VycmVudCA9IGN1cnJlbnRba2V5XTtcblx0fVxuXHRyZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRBcnJheSh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB1bmtub3duW10ge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFtdO1xuXHRjb25zdCBwcm9wID0gdmFsdWVba2V5XTtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcCkgPyBwcm9wIDogW107XG59XG5cbmZ1bmN0aW9uIGpvaW5QYXRoKGJhc2U6IHN0cmluZywgcmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gYCR7YmFzZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS8ke3JlbC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWA7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbEltcG9ydGVkTmFtZShzcGVjOiB1bmtub3duLCBzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCB0eXBlID0gZ2V0U3RyaW5nKHNwZWMsIFwidHlwZVwiKTtcblx0aWYgKGdldEJvb2xlYW4oc3BlYywgXCJpc1R5cGVPbmx5XCIpKSByZXR1cm4gbnVsbDtcblx0Y29uc3QgZGVlcENvbXBvbmVudCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSk7XG5cdGlmIChkZWVwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuIGRlZXBDb21wb25lbnQ7XG5cdH1cblxuXHRpZiAoc291cmNlID09PSBcIkBwYXRoc2NhbGUvdWlcIiAmJiB0eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJpbXBvcnRlZFwiLCBcInZhbHVlXCIpID8/XG5cdFx0XHRnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKSA/P1xuXHRcdFx0bnVsbFxuXHRcdCk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29uc2VydmF0aXZlVXNhZ2UoY29tcG9uZW50OiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogUHJvcFVzYWdlIHtcblx0cmV0dXJuIHtcblx0XHRjb21wb25lbnQsXG5cdFx0cHJvcHM6IG5ldyBNYXAoKSxcblx0XHRib29sZWFuUHJvcHM6IG5ldyBTZXQoKSxcblx0XHRoYXNTcHJlYWQ6IHRydWUsXG5cdFx0c291cmNlLFxuXHR9O1xufVxuXG4vKiogRXh0cmFjdCBAcGF0aHNjYWxlL3VpIGJpbmRpbmdzIGZyb20gYSBwYXJzZWQgbW9kdWxlLiAqL1xuZnVuY3Rpb24gZXh0cmFjdFVJQmluZGluZ3MoYXN0OiB1bmtub3duKTogSW1wb3J0QmluZGluZ3Mge1xuXHRjb25zdCBiaW5kaW5nczogSW1wb3J0QmluZGluZ3MgPSB7XG5cdFx0Y29tcG9uZW50czogbmV3IE1hcCgpLFxuXHRcdG5hbWVzcGFjZXM6IG5ldyBNYXAoKSxcblx0XHRjb25zZXJ2YXRpdmVVc2FnZXM6IFtdLFxuXHR9O1xuXG5cdGZvciAoY29uc3Qgbm9kZSBvZiBnZXRBcnJheShhc3QsIFwiYm9keVwiKSkge1xuXHRcdGNvbnN0IG5vZGVUeXBlID0gZ2V0U3RyaW5nKG5vZGUsIFwidHlwZVwiKTtcblx0XHRpZiAobm9kZVR5cGUgPT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIikge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFpc1VpSW1wb3J0KHNvdXJjZSkpIGNvbnRpbnVlO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHNwZWMgb2YgZ2V0QXJyYXkobm9kZSwgXCJzcGVjaWZpZXJzXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHNwZWNUeXBlID0gZ2V0U3RyaW5nKHNwZWMsIFwidHlwZVwiKTtcblx0XHRcdFx0aWYgKHNwZWNUeXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgbG9jYWwgPSBnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRjb25zdCBjYW5vbmljYWwgPSBjYW5vbmljYWxJbXBvcnRlZE5hbWUoc3BlYywgc291cmNlKTtcblx0XHRcdFx0XHRpZiAobG9jYWwgJiYgY2Fub25pY2FsKSBiaW5kaW5ncy5jb21wb25lbnRzLnNldChsb2NhbCwgY2Fub25pY2FsKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzcGVjVHlwZSA9PT0gXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpIHtcblx0XHRcdFx0XHRjb25zdCBsb2NhbCA9IGdldFBhdGhTdHJpbmcoc3BlYywgXCJsb2NhbFwiLCBcInZhbHVlXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGNhbm9uaWNhbCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSkgPz8gbG9jYWw7XG5cdFx0XHRcdFx0aWYgKGxvY2FsICYmIGNhbm9uaWNhbCkgYmluZGluZ3MuY29tcG9uZW50cy5zZXQobG9jYWwsIGNhbm9uaWNhbCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc3BlY1R5cGUgPT09IFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpIHtcblx0XHRcdFx0XHRjb25zdCBsb2NhbCA9IGdldFBhdGhTdHJpbmcoc3BlYywgXCJsb2NhbFwiLCBcInZhbHVlXCIpO1xuXHRcdFx0XHRcdGlmIChsb2NhbClcblx0XHRcdFx0XHRcdGJpbmRpbmdzLm5hbWVzcGFjZXMuc2V0KGxvY2FsLCBjb21wb25lbnRGcm9tRGVlcEltcG9ydChzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdG5vZGVUeXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIiAmJlxuXHRcdFx0aXNVaUltcG9ydChnZXRQYXRoU3RyaW5nKG5vZGUsIFwic291cmNlXCIsIFwidmFsdWVcIikpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBnZXRQYXRoU3RyaW5nKG5vZGUsIFwic291cmNlXCIsIFwidmFsdWVcIik7XG5cdFx0XHRpZiAoIXNvdXJjZSkgY29udGludWU7XG5cdFx0XHRjb25zdCBkZWVwQ29tcG9uZW50ID0gY29tcG9uZW50RnJvbURlZXBJbXBvcnQoc291cmNlKTtcblx0XHRcdGZvciAoY29uc3Qgc3BlYyBvZiBnZXRBcnJheShub2RlLCBcInNwZWNpZmllcnNcIikpIHtcblx0XHRcdFx0Y29uc3QgZXhwb3J0ZWQgPVxuXHRcdFx0XHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJvcmlnXCIsIFwidmFsdWVcIikgPz9cblx0XHRcdFx0XHRnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKSA/P1xuXHRcdFx0XHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJleHBvcnRlZFwiLCBcInZhbHVlXCIpID8/XG5cdFx0XHRcdFx0ZGVlcENvbXBvbmVudDtcblx0XHRcdFx0Y29uc3QgY2Fub25pY2FsID0gZGVlcENvbXBvbmVudCA/PyBleHBvcnRlZDtcblx0XHRcdFx0aWYgKGNhbm9uaWNhbClcblx0XHRcdFx0XHRiaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMucHVzaChcblx0XHRcdFx0XHRcdGNvbnNlcnZhdGl2ZVVzYWdlKGNhbm9uaWNhbCwgc291cmNlKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdG5vZGVUeXBlID09PSBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIgJiZcblx0XHRcdGlzVWlJbXBvcnQoZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFzb3VyY2UpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZGVlcENvbXBvbmVudCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSk7XG5cdFx0XHRpZiAoZGVlcENvbXBvbmVudCkge1xuXHRcdFx0XHRiaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMucHVzaChcblx0XHRcdFx0XHRjb25zZXJ2YXRpdmVVc2FnZShkZWVwQ29tcG9uZW50LCBzb3VyY2UpLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBiaW5kaW5ncztcbn1cblxuLyoqIEJhY2stY29tcGF0aWJsZSBpbXBvcnQgZXh0cmFjdGlvbiBBUEk6IGxvY2FsIGJpbmRpbmcgLT4gY2Fub25pY2FsIGNvbXBvbmVudC4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RVSUltcG9ydHMoYXN0OiB1bmtub3duKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG5cdHJldHVybiBleHRyYWN0VUlCaW5kaW5ncyhhc3QpLmNvbXBvbmVudHM7XG59XG5cbmZ1bmN0aW9uIGpzeE5hbWVQYXJ0cyhuYW1lOiB1bmtub3duKTogc3RyaW5nW10ge1xuXHRpZiAoIW5hbWUpIHJldHVybiBbXTtcblx0Y29uc3QgdHlwZSA9IGdldFN0cmluZyhuYW1lLCBcInR5cGVcIik7XG5cdGNvbnN0IHZhbHVlID0gZ2V0U3RyaW5nKG5hbWUsIFwidmFsdWVcIik7XG5cdGlmICgodHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgfHwgdHlwZSA9PT0gXCJKU1hJZGVudGlmaWVyXCIpICYmIHZhbHVlKVxuXHRcdHJldHVybiBbdmFsdWVdO1xuXHRpZiAodHlwZSA9PT0gXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0Li4uanN4TmFtZVBhcnRzKGlzUmVjb3JkKG5hbWUpID8gbmFtZS5vYmplY3QgOiB1bmRlZmluZWQpLFxuXHRcdFx0Li4uanN4TmFtZVBhcnRzKGlzUmVjb3JkKG5hbWUpID8gbmFtZS5wcm9wZXJ0eSA6IHVuZGVmaW5lZCksXG5cdFx0XTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbENvbXBvbmVudEZyb21Kc3goXG5cdHBhcnRzOiBzdHJpbmdbXSxcblx0YmluZGluZ3M6IEltcG9ydEJpbmRpbmdzLFxuKTogc3RyaW5nIHwgbnVsbCB7XG5cdGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXHRjb25zdCBbcm9vdCwgLi4ubWVtYmVyc10gPSBwYXJ0cztcblxuXHRjb25zdCBuYW1lc3BhY2VDb21wb25lbnQgPSBiaW5kaW5ncy5uYW1lc3BhY2VzLmdldChyb290KTtcblx0aWYgKGJpbmRpbmdzLm5hbWVzcGFjZXMuaGFzKHJvb3QpKSB7XG5cdFx0aWYgKG5hbWVzcGFjZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIFtuYW1lc3BhY2VDb21wb25lbnQsIC4uLm1lbWJlcnNdLmpvaW4oXCIuXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtYmVycy5qb2luKFwiLlwiKSB8fCBudWxsO1xuXHR9XG5cblx0Y29uc3Qgcm9vdENvbXBvbmVudCA9IGJpbmRpbmdzLmNvbXBvbmVudHMuZ2V0KHJvb3QpO1xuXHRpZiAoIXJvb3RDb21wb25lbnQpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gW3Jvb3RDb21wb25lbnQsIC4uLm1lbWJlcnNdLmpvaW4oXCIuXCIpO1xufVxuXG4vKiogRXh0cmFjdCBKU1ggdXNhZ2VzIG9mIFVJIGNvbXBvbmVudHMuICovXG5mdW5jdGlvbiBleHRyYWN0SlNYVXNhZ2VzKFxuXHRhc3Q6IHVua25vd24sXG5cdHVpQ29tcG9uZW50czogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IFByb3BVc2FnZVtdIHtcblx0Y29uc3QgYmluZGluZ3M6IEltcG9ydEJpbmRpbmdzID0ge1xuXHRcdGNvbXBvbmVudHM6IHVpQ29tcG9uZW50cyxcblx0XHRuYW1lc3BhY2VzOiBleHRyYWN0VUlCaW5kaW5ncyhhc3QpLm5hbWVzcGFjZXMsXG5cdFx0Y29uc2VydmF0aXZlVXNhZ2VzOiBbXSxcblx0fTtcblx0Y29uc3QgdXNhZ2VzOiBQcm9wVXNhZ2VbXSA9IFtdO1xuXG5cdHdhbGtBU1QoYXN0LCAobm9kZSkgPT4ge1xuXHRcdGlmIChnZXRTdHJpbmcobm9kZSwgXCJ0eXBlXCIpICE9PSBcIkpTWE9wZW5pbmdFbGVtZW50XCIpIHJldHVybjtcblxuXHRcdGNvbnN0IGNvbXBvbmVudCA9IGNhbm9uaWNhbENvbXBvbmVudEZyb21Kc3goXG5cdFx0XHRqc3hOYW1lUGFydHMobm9kZS5uYW1lKSxcblx0XHRcdGJpbmRpbmdzLFxuXHRcdCk7XG5cdFx0aWYgKCFjb21wb25lbnQpIHJldHVybjtcblxuXHRcdGNvbnN0IHVzYWdlOiBQcm9wVXNhZ2UgPSB7XG5cdFx0XHRjb21wb25lbnQsXG5cdFx0XHRwcm9wczogbmV3IE1hcCgpLFxuXHRcdFx0Ym9vbGVhblByb3BzOiBuZXcgU2V0KCksXG5cdFx0XHRoYXNTcHJlYWQ6IGZhbHNlLFxuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IGF0dHIgb2YgZ2V0QXJyYXkobm9kZSwgXCJhdHRyaWJ1dGVzXCIpKSB7XG5cdFx0XHRjb25zdCBhdHRyVHlwZSA9IGdldFN0cmluZyhhdHRyLCBcInR5cGVcIik7XG5cdFx0XHRpZiAoYXR0clR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8IGF0dHJUeXBlID09PSBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSB7XG5cdFx0XHRcdHVzYWdlLmhhc1NwcmVhZCA9IHRydWU7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGF0dHJUeXBlICE9PSBcIkpTWEF0dHJpYnV0ZVwiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgcHJvcE5hbWUgPSBnZXRQYXRoU3RyaW5nKGF0dHIsIFwibmFtZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFwcm9wTmFtZSkgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGF0dHJWYWx1ZSA9IGlzUmVjb3JkKGF0dHIpID8gYXR0ci52YWx1ZSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGF0dHJWYWx1ZVR5cGUgPSBnZXRTdHJpbmcoYXR0clZhbHVlLCBcInR5cGVcIik7XG5cdFx0XHRpZiAoIWF0dHJWYWx1ZSkge1xuXHRcdFx0XHR1c2FnZS5ib29sZWFuUHJvcHMuYWRkKHByb3BOYW1lKTtcblx0XHRcdH0gZWxzZSBpZiAoYXR0clZhbHVlVHlwZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcblx0XHRcdFx0dXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBnZXRTdHJpbmcoYXR0clZhbHVlLCBcInZhbHVlXCIpID8/IFwiXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBcIkRZTkFNSUNcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dXNhZ2VzLnB1c2godXNhZ2UpO1xuXHR9KTtcblxuXHRyZXR1cm4gdXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFuaWZlc3QgY29tcGF0aWJpbGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gbWFuaWZlc3RDb21wb25lbnRzKFxuXHRtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCxcbik6IFJlY29yZDxzdHJpbmcsIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0PiB7XG5cdGlmIChpc1B1cmdlRGF0YWJhc2VWMihtYW5pZmVzdCkpIHtcblx0XHRyZXR1cm4gbWFuaWZlc3QuY29tcG9uZW50cztcblx0fVxuXHRyZXR1cm4gbWFuaWZlc3QgYXMgUmVjb3JkPHN0cmluZywgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Q+O1xufVxuXG5mdW5jdGlvbiBpc1B1cmdlRGF0YWJhc2VWMihcblx0bWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QsXG4pOiBtYW5pZmVzdCBpcyBQdXJnZURhdGFiYXNlVjIge1xuXHRyZXR1cm4gKFxuXHRcdChtYW5pZmVzdCBhcyBQdXJnZURhdGFiYXNlVjIpLnZlcnNpb24gPT09IDIgJiZcblx0XHRpc1JlY29yZCgobWFuaWZlc3QgYXMgUHVyZ2VEYXRhYmFzZVYyKS5jb21wb25lbnRzKVxuXHQpO1xufVxuXG4vLyDilIDilIAgU2FmZWxpc3QgYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYnVpbGRTYWZlbGlzdHMoXG5cdGFsbFVzYWdlczogUHJvcFVzYWdlW10sXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0LFxuKTogU2FmZWxpc3RzIHtcblx0Y29uc3QgY2xhc3NTYWZlbGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRjb25zdCBhdHRyU2FmZWxpc3QgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgdXNlZENvbXBvbmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgZHluYW1pY0NvbXBvbmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgY29tcG9uZW50VXNhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPigpO1xuXHRjb25zdCBjb21wb25lbnRzID0gbWFuaWZlc3RDb21wb25lbnRzKG1hbmlmZXN0KTtcblxuXHRmb3IgKGNvbnN0IHVzYWdlIG9mIGV4cGFuZERlcGVuZGVuY3lVc2FnZXMoYWxsVXNhZ2VzLCBjb21wb25lbnRzKSkge1xuXHRcdGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50VXNhZ2VzLmdldCh1c2FnZS5jb21wb25lbnQpID8/IFtdO1xuXHRcdGV4aXN0aW5nLnB1c2godXNhZ2UpO1xuXHRcdGNvbXBvbmVudFVzYWdlcy5zZXQodXNhZ2UuY29tcG9uZW50LCBleGlzdGluZyk7XG5cdFx0dXNlZENvbXBvbmVudHMuYWRkKHVzYWdlLmNvbXBvbmVudCk7XG5cdFx0aWYgKHVzYWdlLmhhc1NwcmVhZCB8fCBbLi4udXNhZ2UucHJvcHMudmFsdWVzKCldLmluY2x1ZGVzKFwiRFlOQU1JQ1wiKSkge1xuXHRcdFx0ZHluYW1pY0NvbXBvbmVudHMuYWRkKHVzYWdlLmNvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChjb25zdCBbZW50cnlOYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcblx0XHRjb25zdCBtYXRjaGluZ1VzYWdlcyA9IGZpbmRNYXRjaGluZ1VzYWdlcyhlbnRyeU5hbWUsIGNvbXBvbmVudFVzYWdlcyk7XG5cdFx0aWYgKG1hdGNoaW5nVXNhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cblx0XHR1c2VkQ29tcG9uZW50cy5hZGQoZW50cnlOYW1lKTtcblxuXHRcdGZvciAoY29uc3QgY2xzIG9mIGVudHJ5LmNsYXNzZXMuYWx3YXlzKSB7XG5cdFx0XHRjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgW3Byb3BPclNsb3QsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyeS5jbGFzc2VzLmJ5UHJvcCkpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoaXNQcm9wVXNlZChwcm9wT3JTbG90LCBtYXRjaGluZ1VzYWdlcykpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNscyBvZiB2YWx1ZSkgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdXNlZFZhbHVlcyA9IGdldFVzZWRFbnVtVmFsdWVzKHByb3BPclNsb3QsIG1hdGNoaW5nVXNhZ2VzKTtcblx0XHRcdFx0aWYgKHVzZWRWYWx1ZXMgPT09IFwiQUxMXCIpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY2xzIG9mIGNsYXNzZXMpIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdmFsIG9mIHVzZWRWYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZVt2YWxdKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY2xzIG9mIHZhbHVlW3ZhbF0pIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGVudHJ5LmF0dHJzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtwcm9wTmFtZSwgYXR0ck1hcF0gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkuYXR0cnMpKSB7XG5cdFx0XHRcdGlmIChpc1Byb3BVc2VkKHByb3BOYW1lLCBtYXRjaGluZ1VzYWdlcykpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IFthdHRyLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJNYXApKSB7XG5cdFx0XHRcdFx0XHRhdHRyU2FmZWxpc3QuYWRkKGBbJHthdHRyfT1cIiR7dmFsfVwiXWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IGNsYXNzU2FmZWxpc3QsIGF0dHJTYWZlbGlzdCwgdXNlZENvbXBvbmVudHMsIGR5bmFtaWNDb21wb25lbnRzIH07XG59XG5cbmZ1bmN0aW9uIGV4cGFuZERlcGVuZGVuY3lVc2FnZXMoXG5cdGFsbFVzYWdlczogUHJvcFVzYWdlW10sXG5cdG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBMZWdhY3lDb21wb25lbnRNYW5pZmVzdD4sXG4pOiBQcm9wVXNhZ2VbXSB7XG5cdGNvbnN0IHJlc3VsdCA9IFsuLi5hbGxVc2FnZXNdO1xuXHRjb25zdCBxdWV1ZSA9IFsuLi5hbGxVc2FnZXMubWFwKCh1c2FnZSkgPT4gcm9vdENvbXBvbmVudCh1c2FnZS5jb21wb25lbnQpKV07XG5cdGNvbnN0IHNlZW4gPSBuZXcgU2V0KHF1ZXVlKTtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHJvb3QgPSBxdWV1ZS5wb3AoKTtcblx0XHRpZiAoIXJvb3QpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IGRlcHMgPSBkZXBzRm9yUm9vdChyb290LCBtYW5pZmVzdCk7XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuXHRcdFx0aWYgKHNlZW4uaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0c2Vlbi5hZGQoZGVwKTtcblx0XHRcdHF1ZXVlLnB1c2goZGVwKTtcblx0XHRcdHJlc3VsdC5wdXNoKGNvbnNlcnZhdGl2ZVVzYWdlKGRlcCwgXCJtYW5pZmVzdC1kZXBlbmRlbmN5XCIpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBkZXBzRm9yUm9vdChcblx0cm9vdDogc3RyaW5nLFxuXHRtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Q+LFxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBkZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0KSkge1xuXHRcdGlmIChyb290Q29tcG9uZW50KGtleSkgIT09IHJvb3QpIGNvbnRpbnVlO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIGVudHJ5LmRlcHMgPz8gW10pIGRlcHMuYWRkKGRlcCk7XG5cdH1cblx0cmV0dXJuIFsuLi5kZXBzXTtcbn1cblxuZnVuY3Rpb24gcm9vdENvbXBvbmVudChjb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBjb21wb25lbnQuc3BsaXQoXCIuXCIpWzBdO1xufVxuXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdVc2FnZXMoXG5cdGVudHJ5TmFtZTogc3RyaW5nLFxuXHR1c2FnZU1hcDogTWFwPHN0cmluZywgUHJvcFVzYWdlW10+LFxuKTogUHJvcFVzYWdlW10ge1xuXHRjb25zdCBkaXJlY3QgPSB1c2FnZU1hcC5nZXQoZW50cnlOYW1lKSA/PyBbXTtcblx0Y29uc3QgcmVzdWx0cyA9IFsuLi5kaXJlY3RdO1xuXHRjb25zdCBlbnRyeVJvb3QgPSByb290Q29tcG9uZW50KGVudHJ5TmFtZSk7XG5cblx0Zm9yIChjb25zdCBbdXNhZ2VOYW1lLCB1c2FnZXNdIG9mIHVzYWdlTWFwKSB7XG5cdFx0aWYgKHVzYWdlTmFtZSA9PT0gZW50cnlOYW1lKSBjb250aW51ZTtcblx0XHRpZiAoIWVudHJ5TmFtZS5pbmNsdWRlcyhcIi5cIikgJiYgcm9vdENvbXBvbmVudCh1c2FnZU5hbWUpID09PSBlbnRyeU5hbWUpIHtcblx0XHRcdHJlc3VsdHMucHVzaChcblx0XHRcdFx0Li4udXNhZ2VzLm1hcCgodXNhZ2UpID0+ICh7XG5cdFx0XHRcdFx0Li4udXNhZ2UsXG5cdFx0XHRcdFx0Y29tcG9uZW50OiBlbnRyeU5hbWUsXG5cdFx0XHRcdFx0cHJvcHM6IG5ldyBNYXAoWy4uLnVzYWdlLnByb3BzLCBbXCJzbG90XCIsIFwiRFlOQU1JQ1wiXV0pLFxuXHRcdFx0XHR9KSksXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRlbnRyeU5hbWUuaW5jbHVkZXMoXCIuXCIpICYmXG5cdFx0XHQodXNhZ2VOYW1lID09PSBlbnRyeVJvb3QgfHwgcm9vdENvbXBvbmVudCh1c2FnZU5hbWUpID09PSBlbnRyeVJvb3QpXG5cdFx0KSB7XG5cdFx0XHRyZXN1bHRzLnB1c2goXG5cdFx0XHRcdC4uLnVzYWdlcy5tYXAoKHVzYWdlKSA9PiAoe1xuXHRcdFx0XHRcdC4uLnVzYWdlLFxuXHRcdFx0XHRcdGhhc1NwcmVhZDogdHJ1ZSxcblx0XHRcdFx0fSkpLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gaXNQcm9wVXNlZChwcm9wTmFtZTogc3RyaW5nLCB1c2FnZXM6IFByb3BVc2FnZVtdKTogYm9vbGVhbiB7XG5cdGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG5cdFx0aWYgKHVzYWdlLmhhc1NwcmVhZCkgcmV0dXJuIHRydWU7XG5cdFx0aWYgKHVzYWdlLmJvb2xlYW5Qcm9wcy5oYXMocHJvcE5hbWUpKSByZXR1cm4gdHJ1ZTtcblx0XHRpZiAodXNhZ2UucHJvcHMuaGFzKHByb3BOYW1lKSkgcmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRVc2VkRW51bVZhbHVlcyhcblx0c2xvdE5hbWU6IHN0cmluZyxcblx0dXNhZ2VzOiBQcm9wVXNhZ2VbXSxcbik6IFNldDxzdHJpbmc+IHwgXCJBTExcIiB7XG5cdGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRmb3IgKGNvbnN0IHVzYWdlIG9mIHVzYWdlcykge1xuXHRcdGlmICh1c2FnZS5oYXNTcHJlYWQpIHJldHVybiBcIkFMTFwiO1xuXHRcdGNvbnN0IHZhbCA9IHVzYWdlLnByb3BzLmdldChzbG90TmFtZSk7XG5cdFx0aWYgKHZhbCA9PT0gXCJEWU5BTUlDXCIpIHJldHVybiBcIkFMTFwiO1xuXHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCkgdmFsdWVzLmFkZCh2YWwpO1xuXHRcdGlmICh1c2FnZS5ib29sZWFuUHJvcHMuaGFzKHNsb3ROYW1lKSkgcmV0dXJuIFwiQUxMXCI7XG5cdH1cblx0cmV0dXJuIHZhbHVlcztcbn1cblxuLy8g4pSA4pSAIENvbnN1bWVyIHNvdXJjZSBzY2FubmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcjogc3RyaW5nKTogUHJvbWlzZTxQcm9wVXNhZ2VbXT4ge1xuXHRjb25zdCBhbGxVc2FnZXM6IFByb3BVc2FnZVtdID0gW107XG5cdGNvbnN0IGdsb2IgPSBuZXcgR2xvYihcIioqLyoue3RzeCx0cyxqc3gsanN9XCIpO1xuXG5cdGZvciBhd2FpdCAoY29uc3QgcmVsUGF0aCBvZiBnbG9iLnNjYW4oeyBjd2Q6IHNyY0RpciB9KSkge1xuXHRcdGlmIChyZWxQYXRoLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpKSBjb250aW51ZTtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW5QYXRoKHNyY0RpciwgcmVsUGF0aCk7XG5cdFx0Y29uc3QgY29kZSA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG5cdFx0aWYgKCFjb2RlLmluY2x1ZGVzKFwiQHBhdGhzY2FsZS91aVwiKSkgY29udGludWU7XG5cblx0XHRjb25zdCBpc1RzeCA9IC9cXC5bdGpdc3gkLy50ZXN0KHJlbFBhdGgpO1xuXHRcdGNvbnN0IGFzdCA9IGF3YWl0IHN3Yy5wYXJzZShjb2RlLCB7IHN5bnRheDogXCJ0eXBlc2NyaXB0XCIsIHRzeDogaXNUc3ggfSk7XG5cdFx0Y29uc3QgYmluZGluZ3MgPSBleHRyYWN0VUlCaW5kaW5ncyhhc3QpO1xuXHRcdGlmIChcblx0XHRcdGJpbmRpbmdzLmNvbXBvbmVudHMuc2l6ZSA9PT0gMCAmJlxuXHRcdFx0YmluZGluZ3MubmFtZXNwYWNlcy5zaXplID09PSAwICYmXG5cdFx0XHRiaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMubGVuZ3RoID09PSAwXG5cdFx0KSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRhbGxVc2FnZXMucHVzaCguLi5iaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMpO1xuXHRcdGNvbnN0IGpzeFVzYWdlcyA9IGV4dHJhY3RKU1hVc2FnZXMoYXN0LCBiaW5kaW5ncy5jb21wb25lbnRzKTtcblx0XHRhbGxVc2FnZXMucHVzaCguLi5qc3hVc2FnZXMpO1xuXHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGJpbmRpbmdzLmNvbXBvbmVudHMudmFsdWVzKCkpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0anN4VXNhZ2VzLnNvbWUoXG5cdFx0XHRcdFx0KHVzYWdlKSA9PlxuXHRcdFx0XHRcdFx0dXNhZ2UuY29tcG9uZW50ID09PSBjb21wb25lbnQgfHxcblx0XHRcdFx0XHRcdHVzYWdlLmNvbXBvbmVudC5zdGFydHNXaXRoKGAke2NvbXBvbmVudH0uYCksXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGFsbFVzYWdlcy5wdXNoKGNvbnNlcnZhdGl2ZVVzYWdlKGNvbXBvbmVudCwgXCJpbXBvcnQtd2l0aG91dC1kaXJlY3QtanN4XCIpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYWxsVXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFpbiAoc3RhbmRhbG9uZSBDTEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRjb25zdCBbc3JjRGlyLCBtYW5pZmVzdFBhdGhdID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuXHRpZiAoIXNyY0RpciB8fCAhbWFuaWZlc3RQYXRoKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFwiVXNhZ2U6IGJ1biBydW4gc3JjL3NjYW4tY29uc3VtZXIudHMgPGNvbnN1bWVyLXNyYy1kaXI+IDxwdXJnZS1tYW5pZmVzdC5qc29uPlwiLFxuXHRcdCk7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cblx0Y29uc3QgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuXHRcdGF3YWl0IEJ1bi5maWxlKG1hbmlmZXN0UGF0aCkudGV4dCgpLFxuXHQpO1xuXHRjb25zdCByZXNvbHZlZFNyYyA9IHNyY0Rpcjtcblx0Y29uc3QgbWFuaWZlc3RTaXplID0gT2JqZWN0LmtleXMobWFuaWZlc3RDb21wb25lbnRzKG1hbmlmZXN0KSkubGVuZ3RoO1xuXHRjb25zb2xlLmxvZyhgU2Nhbm5pbmcgJHtyZXNvbHZlZFNyY30gZm9yIEBwYXRoc2NhbGUvdWkgY29tcG9uZW50IHVzYWdlLi4uYCk7XG5cdGNvbnNvbGUubG9nKGBNYW5pZmVzdDogJHttYW5pZmVzdFNpemV9IGVudHJpZXNcXG5gKTtcblxuXHRjb25zdCB1c2FnZXMgPSBhd2FpdCBzY2FuQ29uc3VtZXJTb3VyY2UocmVzb2x2ZWRTcmMpO1xuXHRjb25zdCB7IGNsYXNzU2FmZWxpc3QsIGF0dHJTYWZlbGlzdCwgdXNlZENvbXBvbmVudHMgfSA9IGJ1aWxkU2FmZWxpc3RzKFxuXHRcdHVzYWdlcyxcblx0XHRtYW5pZmVzdCxcblx0KTtcblxuXHRjb25zb2xlLmxvZyhcIj09PSBDb21wb25lbnRzIERldGVjdGVkID09PVwiKTtcblx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgWy4uLnVzZWRDb21wb25lbnRzXS5zb3J0KCkpIHtcblx0XHRjb25zb2xlLmxvZyhgICAke2NvbXBvbmVudH1gKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFwiXFxuPT09IENsYXNzIFNhZmVsaXN0ID09PVwiKTtcblx0Zm9yIChjb25zdCBjbHMgb2YgWy4uLmNsYXNzU2FmZWxpc3RdLnNvcnQoKSkge1xuXHRcdGNvbnNvbGUubG9nKGAgICR7Y2xzfWApO1xuXHR9XG5cblx0Y29uc29sZS5sb2coXCJcXG49PT0gQXR0cmlidXRlIFNhZmVsaXN0ID09PVwiKTtcblx0Zm9yIChjb25zdCBhdHRyIG9mIFsuLi5hdHRyU2FmZWxpc3RdLnNvcnQoKSkge1xuXHRcdGNvbnNvbGUubG9nKGAgICR7YXR0cn1gKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFxuXHRcdGBcXG5Ub3RhbDogJHt1c2VkQ29tcG9uZW50cy5zaXplfSBjb21wb25lbnRzLCAke2NsYXNzU2FmZWxpc3Quc2l6ZX0gY2xhc3NlcywgJHthdHRyU2FmZWxpc3Quc2l6ZX0gYXR0cmlidXRlIHNlbGVjdG9yc2AsXG5cdCk7XG59XG5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG5cdG1haW4oKTtcbn1cblxuZXhwb3J0IHtcblx0ZXh0cmFjdFVJSW1wb3J0cyxcblx0ZXh0cmFjdEpTWFVzYWdlcyxcblx0YnVpbGRTYWZlbGlzdHMsXG5cdHNjYW5Db25zdW1lclNvdXJjZSxcbn07XG5leHBvcnQgdHlwZSB7XG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0LFxuXHRQcm9wVXNhZ2UsXG5cdFB1cmdlTWFuaWZlc3QsXG5cdFB1cmdlRGF0YWJhc2VWMixcblx0Q29tcG9uZW50UHVyZ2VSZWNvcmQsXG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0IGFzIENvbXBvbmVudE1hbmlmZXN0LFxuXHRTYWZlbGlzdHMsXG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBS0EsSUFBTSxVQUFVLE1BQU0sUUFBUSxhQUFhO0FBQUEsRUFFM0MsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFNLFlBQVksTUFBTTtBQUFBLElBQ3RCLElBQUksQ0FBQyxRQUFRO0FBQUEsTUFFWCxJQUFJLFFBQVEsS0FBSyxRQUFRLFFBQVE7QUFBQSxRQUMvQixNQUFNLE9BQU8sUUFBUSxPQUFPO0FBQUEsUUFDNUIsUUFBUSxPQUFPLGlCQUFpQjtBQUFBLFFBQ2hDLFNBQVMsUUFBUSxPQUFPLFVBQVU7QUFBQSxRQUNsQyxRQUFRLE9BQU8saUJBQWlCO0FBQUEsTUFDbEMsRUFBTztBQUFBLFFBQ0wsU0FBUyxDQUFDO0FBQUE7QUFBQSxJQUVkO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdULE9BQU8sVUFBVSxFQUFFLFNBQVMsVUFBVTtBQUFBOzs7O0VDbEJ0QyxJQUFNO0FBQUEsRUFFTixJQUFNLFdBQVc7QUFBQSxFQUNqQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLGFBQWE7QUFBQSxFQVFuQixJQUFNLGVBQWUsQ0FBQyxTQUFTO0FBQUEsSUFDN0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxNQUFNLEdBQUc7QUFBQSxJQUNoQyxNQUFNLFNBQVMsT0FB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
|