@milkio/vite-plugin-milkio 1.3.35 → 1.3.36

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.
@@ -0,0 +1,533 @@
1
+ import {
2
+ require_lib
3
+ } from "./chunk-grxb9rka.js";
4
+ import {
5
+ __commonJSMin,
6
+ __require
7
+ } from "./chunk-716p476m.js";
8
+ import"./chunk-hnjvhpbj.js";
9
+ import"./chunk-53gf2b22.js";
10
+ import"./chunk-d85ypywj.js";
11
+
12
+ // node_modules/vite/dist/node/chunks/postcss-import.js
13
+ var require_format_import_prelude = /* @__PURE__ */ __commonJSMin((exports, module) => {
14
+ module.exports = function formatImportPrelude(layer, media, supports) {
15
+ const parts = [];
16
+ if (typeof layer !== "undefined") {
17
+ let layerParams = "layer";
18
+ if (layer)
19
+ layerParams = `layer(${layer})`;
20
+ parts.push(layerParams);
21
+ }
22
+ if (typeof supports !== "undefined")
23
+ parts.push(`supports(${supports})`);
24
+ if (typeof media !== "undefined")
25
+ parts.push(media);
26
+ return parts.join(" ");
27
+ };
28
+ });
29
+ var require_base64_encoded_import = /* @__PURE__ */ __commonJSMin((exports, module) => {
30
+ const formatImportPrelude = require_format_import_prelude();
31
+ module.exports = function base64EncodedConditionalImport(prelude, conditions) {
32
+ if (!conditions?.length)
33
+ return prelude;
34
+ conditions.reverse();
35
+ const first = conditions.pop();
36
+ let params = `${prelude} ${formatImportPrelude(first.layer, first.media, first.supports)}`;
37
+ for (const condition of conditions)
38
+ params = `'data:text/css;base64,${Buffer.from(`@import ${params}`).toString("base64")}' ${formatImportPrelude(condition.layer, condition.media, condition.supports)}`;
39
+ return params;
40
+ };
41
+ });
42
+ var require_apply_conditions = /* @__PURE__ */ __commonJSMin((exports, module) => {
43
+ const base64EncodedConditionalImport = require_base64_encoded_import();
44
+ module.exports = function applyConditions(bundle, atRule) {
45
+ const firstImportStatementIndex = bundle.findIndex((stmt) => stmt.type === "import");
46
+ const lastImportStatementIndex = bundle.findLastIndex((stmt) => stmt.type === "import");
47
+ bundle.forEach((stmt, index) => {
48
+ if (stmt.type === "charset" || stmt.type === "warning")
49
+ return;
50
+ if (stmt.type === "layer" && (index < lastImportStatementIndex && stmt.conditions?.length || index > firstImportStatementIndex && index < lastImportStatementIndex)) {
51
+ stmt.type = "import";
52
+ stmt.node = stmt.node.clone({
53
+ name: "import",
54
+ params: base64EncodedConditionalImport(`'data:text/css;base64,${Buffer.from(stmt.node.toString()).toString("base64")}'`, stmt.conditions)
55
+ });
56
+ return;
57
+ }
58
+ if (!stmt.conditions?.length)
59
+ return;
60
+ if (stmt.type === "import") {
61
+ stmt.node.params = base64EncodedConditionalImport(stmt.fullUri, stmt.conditions);
62
+ return;
63
+ }
64
+ let nodes;
65
+ let parent;
66
+ if (stmt.type === "layer") {
67
+ nodes = [stmt.node];
68
+ parent = stmt.node.parent;
69
+ } else {
70
+ nodes = stmt.nodes;
71
+ parent = nodes[0].parent;
72
+ }
73
+ const atRules = [];
74
+ for (const condition of stmt.conditions) {
75
+ if (typeof condition.media !== "undefined") {
76
+ const mediaNode = atRule({
77
+ name: "media",
78
+ params: condition.media,
79
+ source: parent.source
80
+ });
81
+ atRules.push(mediaNode);
82
+ }
83
+ if (typeof condition.supports !== "undefined") {
84
+ const supportsNode = atRule({
85
+ name: "supports",
86
+ params: `(${condition.supports})`,
87
+ source: parent.source
88
+ });
89
+ atRules.push(supportsNode);
90
+ }
91
+ if (typeof condition.layer !== "undefined") {
92
+ const layerNode = atRule({
93
+ name: "layer",
94
+ params: condition.layer,
95
+ source: parent.source
96
+ });
97
+ atRules.push(layerNode);
98
+ }
99
+ }
100
+ const outerAtRule = atRules.shift();
101
+ const innerAtRule = atRules.reduce((previous, next) => {
102
+ previous.append(next);
103
+ return next;
104
+ }, outerAtRule);
105
+ parent.insertBefore(nodes[0], outerAtRule);
106
+ nodes.forEach((node) => {
107
+ node.parent = undefined;
108
+ });
109
+ nodes[0].raws.before = nodes[0].raws.before || `
110
+ `;
111
+ innerAtRule.append(nodes);
112
+ stmt.type = "nodes";
113
+ stmt.nodes = [outerAtRule];
114
+ delete stmt.node;
115
+ });
116
+ };
117
+ });
118
+ var require_apply_raws = /* @__PURE__ */ __commonJSMin((exports, module) => {
119
+ module.exports = function applyRaws(bundle) {
120
+ bundle.forEach((stmt, index) => {
121
+ if (index === 0)
122
+ return;
123
+ if (stmt.parent) {
124
+ const { before } = stmt.parent.node.raws;
125
+ if (stmt.type === "nodes")
126
+ stmt.nodes[0].raws.before = before;
127
+ else
128
+ stmt.node.raws.before = before;
129
+ } else if (stmt.type === "nodes")
130
+ stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || `
131
+ `;
132
+ });
133
+ };
134
+ });
135
+ var require_apply_styles = /* @__PURE__ */ __commonJSMin((exports, module) => {
136
+ module.exports = function applyStyles(bundle, styles) {
137
+ styles.nodes = [];
138
+ bundle.forEach((stmt) => {
139
+ if ([
140
+ "charset",
141
+ "import",
142
+ "layer"
143
+ ].includes(stmt.type)) {
144
+ stmt.node.parent = undefined;
145
+ styles.append(stmt.node);
146
+ } else if (stmt.type === "nodes")
147
+ stmt.nodes.forEach((node) => {
148
+ node.parent = undefined;
149
+ styles.append(node);
150
+ });
151
+ });
152
+ };
153
+ });
154
+ var require_data_url = /* @__PURE__ */ __commonJSMin((exports, module) => {
155
+ const anyDataURLRegexp = /^data:text\/css(?:;(base64|plain))?,/i;
156
+ const base64DataURLRegexp = /^data:text\/css;base64,/i;
157
+ const plainDataURLRegexp = /^data:text\/css;plain,/i;
158
+ function isValid(url) {
159
+ return anyDataURLRegexp.test(url);
160
+ }
161
+ function contents(url) {
162
+ if (base64DataURLRegexp.test(url))
163
+ return Buffer.from(url.slice(21), "base64").toString();
164
+ if (plainDataURLRegexp.test(url))
165
+ return decodeURIComponent(url.slice(20));
166
+ return decodeURIComponent(url.slice(14));
167
+ }
168
+ module.exports = {
169
+ isValid,
170
+ contents
171
+ };
172
+ });
173
+ var require_parse_statements = /* @__PURE__ */ __commonJSMin((exports, module) => {
174
+ const valueParser = require_lib();
175
+ const { stringify } = valueParser;
176
+ module.exports = function parseStatements(result, styles, conditions, from) {
177
+ const statements = [];
178
+ let nodes = [];
179
+ let encounteredNonImportNodes = false;
180
+ styles.each((node) => {
181
+ let stmt;
182
+ if (node.type === "atrule") {
183
+ if (node.name === "import")
184
+ stmt = parseImport(result, node, conditions, from);
185
+ else if (node.name === "charset")
186
+ stmt = parseCharset(result, node, conditions, from);
187
+ else if (node.name === "layer" && !encounteredNonImportNodes && !node.nodes)
188
+ stmt = parseLayer(result, node, conditions, from);
189
+ } else if (node.type !== "comment")
190
+ encounteredNonImportNodes = true;
191
+ if (stmt) {
192
+ if (nodes.length) {
193
+ statements.push({
194
+ type: "nodes",
195
+ nodes,
196
+ conditions: [...conditions],
197
+ from
198
+ });
199
+ nodes = [];
200
+ }
201
+ statements.push(stmt);
202
+ } else
203
+ nodes.push(node);
204
+ });
205
+ if (nodes.length)
206
+ statements.push({
207
+ type: "nodes",
208
+ nodes,
209
+ conditions: [...conditions],
210
+ from
211
+ });
212
+ return statements;
213
+ };
214
+ function parseCharset(result, atRule, conditions, from) {
215
+ if (atRule.prev())
216
+ return result.warn("@charset must precede all other statements", { node: atRule });
217
+ return {
218
+ type: "charset",
219
+ node: atRule,
220
+ conditions: [...conditions],
221
+ from
222
+ };
223
+ }
224
+ function parseImport(result, atRule, conditions, from) {
225
+ let prev = atRule.prev();
226
+ if (prev)
227
+ do {
228
+ if (prev.type === "comment" || prev.type === "atrule" && prev.name === "import") {
229
+ prev = prev.prev();
230
+ continue;
231
+ }
232
+ break;
233
+ } while (prev);
234
+ if (prev)
235
+ do {
236
+ if (prev.type === "comment" || prev.type === "atrule" && (prev.name === "charset" || prev.name === "layer" && !prev.nodes)) {
237
+ prev = prev.prev();
238
+ continue;
239
+ }
240
+ return result.warn("@import must precede all other statements (besides @charset or empty @layer)", { node: atRule });
241
+ } while (prev);
242
+ if (atRule.nodes)
243
+ return result.warn("It looks like you didn't end your @import statement correctly. Child nodes are attached to it.", { node: atRule });
244
+ const params = valueParser(atRule.params).nodes;
245
+ const stmt = {
246
+ type: "import",
247
+ uri: "",
248
+ fullUri: "",
249
+ node: atRule,
250
+ conditions: [...conditions],
251
+ from
252
+ };
253
+ let layer;
254
+ let media;
255
+ let supports;
256
+ for (let i = 0;i < params.length; i++) {
257
+ const node = params[i];
258
+ if (node.type === "space" || node.type === "comment")
259
+ continue;
260
+ if (node.type === "string") {
261
+ if (stmt.uri)
262
+ return result.warn(`Multiple url's in '${atRule.toString()}'`, { node: atRule });
263
+ if (!node.value)
264
+ return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
265
+ stmt.uri = node.value;
266
+ stmt.fullUri = stringify(node);
267
+ continue;
268
+ }
269
+ if (node.type === "function" && /^url$/i.test(node.value)) {
270
+ if (stmt.uri)
271
+ return result.warn(`Multiple url's in '${atRule.toString()}'`, { node: atRule });
272
+ if (!node.nodes?.[0]?.value)
273
+ return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
274
+ stmt.uri = node.nodes[0].value;
275
+ stmt.fullUri = stringify(node);
276
+ continue;
277
+ }
278
+ if (!stmt.uri)
279
+ return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
280
+ if ((node.type === "word" || node.type === "function") && /^layer$/i.test(node.value)) {
281
+ if (typeof layer !== "undefined")
282
+ return result.warn(`Multiple layers in '${atRule.toString()}'`, { node: atRule });
283
+ if (typeof supports !== "undefined")
284
+ return result.warn(`layers must be defined before support conditions in '${atRule.toString()}'`, { node: atRule });
285
+ if (node.nodes)
286
+ layer = stringify(node.nodes);
287
+ else
288
+ layer = "";
289
+ continue;
290
+ }
291
+ if (node.type === "function" && /^supports$/i.test(node.value)) {
292
+ if (typeof supports !== "undefined")
293
+ return result.warn(`Multiple support conditions in '${atRule.toString()}'`, { node: atRule });
294
+ supports = stringify(node.nodes);
295
+ continue;
296
+ }
297
+ media = stringify(params.slice(i));
298
+ break;
299
+ }
300
+ if (!stmt.uri)
301
+ return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
302
+ if (typeof media !== "undefined" || typeof layer !== "undefined" || typeof supports !== "undefined")
303
+ stmt.conditions.push({
304
+ layer,
305
+ media,
306
+ supports
307
+ });
308
+ return stmt;
309
+ }
310
+ function parseLayer(result, atRule, conditions, from) {
311
+ return {
312
+ type: "layer",
313
+ node: atRule,
314
+ conditions: [...conditions],
315
+ from
316
+ };
317
+ }
318
+ });
319
+ var require_process_content = /* @__PURE__ */ __commonJSMin((exports, module) => {
320
+ const path$2 = __require("path");
321
+ let sugarss;
322
+ module.exports = function processContent(result, content, filename, options, postcss) {
323
+ const { plugins } = options;
324
+ const ext = path$2.extname(filename);
325
+ const parserList = [];
326
+ if (ext === ".sss") {
327
+ if (!sugarss)
328
+ try {
329
+ sugarss = __require("sugarss");
330
+ } catch {}
331
+ if (sugarss)
332
+ return runPostcss(postcss, content, filename, plugins, [sugarss]);
333
+ }
334
+ if (result.opts.syntax?.parse)
335
+ parserList.push(result.opts.syntax.parse);
336
+ if (result.opts.parser)
337
+ parserList.push(result.opts.parser);
338
+ parserList.push(null);
339
+ return runPostcss(postcss, content, filename, plugins, parserList);
340
+ };
341
+ function runPostcss(postcss, content, filename, plugins, parsers, index) {
342
+ if (!index)
343
+ index = 0;
344
+ return postcss(plugins).process(content, {
345
+ from: filename,
346
+ parser: parsers[index]
347
+ }).catch((err) => {
348
+ index++;
349
+ if (index === parsers.length)
350
+ throw err;
351
+ return runPostcss(postcss, content, filename, plugins, parsers, index);
352
+ });
353
+ }
354
+ });
355
+ var require_parse_styles = /* @__PURE__ */ __commonJSMin((exports, module) => {
356
+ const path$1 = __require("path");
357
+ const dataURL = require_data_url();
358
+ const parseStatements = require_parse_statements();
359
+ const processContent = require_process_content();
360
+ const resolveId = (id) => id;
361
+ const formatImportPrelude = require_format_import_prelude();
362
+ async function parseStyles(result, styles, options, state, conditions, from, postcss) {
363
+ const statements = parseStatements(result, styles, conditions, from);
364
+ for (const stmt of statements) {
365
+ if (stmt.type !== "import" || !isProcessableURL(stmt.uri))
366
+ continue;
367
+ if (options.filter && !options.filter(stmt.uri))
368
+ continue;
369
+ await resolveImportId(result, stmt, options, state, postcss);
370
+ }
371
+ let charset;
372
+ const beforeBundle = [];
373
+ const bundle = [];
374
+ function handleCharset(stmt) {
375
+ if (!charset)
376
+ charset = stmt;
377
+ else if (stmt.node.params.toLowerCase() !== charset.node.params.toLowerCase())
378
+ throw stmt.node.error(`Incompatible @charset statements:
379
+ ${stmt.node.params} specified in ${stmt.node.source.input.file}
380
+ ${charset.node.params} specified in ${charset.node.source.input.file}`);
381
+ }
382
+ statements.forEach((stmt) => {
383
+ if (stmt.type === "charset")
384
+ handleCharset(stmt);
385
+ else if (stmt.type === "import")
386
+ if (stmt.children)
387
+ stmt.children.forEach((child, index) => {
388
+ if (child.type === "import")
389
+ beforeBundle.push(child);
390
+ else if (child.type === "layer")
391
+ beforeBundle.push(child);
392
+ else if (child.type === "charset")
393
+ handleCharset(child);
394
+ else
395
+ bundle.push(child);
396
+ if (index === 0)
397
+ child.parent = stmt;
398
+ });
399
+ else
400
+ beforeBundle.push(stmt);
401
+ else if (stmt.type === "layer")
402
+ beforeBundle.push(stmt);
403
+ else if (stmt.type === "nodes")
404
+ bundle.push(stmt);
405
+ });
406
+ return charset ? [charset, ...beforeBundle.concat(bundle)] : beforeBundle.concat(bundle);
407
+ }
408
+ async function resolveImportId(result, stmt, options, state, postcss) {
409
+ if (dataURL.isValid(stmt.uri)) {
410
+ stmt.children = await loadImportContent(result, stmt, stmt.uri, options, state, postcss);
411
+ return;
412
+ } else if (dataURL.isValid(stmt.from.slice(-1)))
413
+ throw stmt.node.error(`Unable to import '${stmt.uri}' from a stylesheet that is embedded in a data url`);
414
+ const atRule = stmt.node;
415
+ let sourceFile;
416
+ if (atRule.source?.input?.file)
417
+ sourceFile = atRule.source.input.file;
418
+ const base = sourceFile ? path$1.dirname(atRule.source.input.file) : options.root;
419
+ const paths = [await options.resolve(stmt.uri, base, options, atRule)].flat();
420
+ const resolved = await Promise.all(paths.map((file) => {
421
+ return !path$1.isAbsolute(file) ? resolveId(file, base, options, atRule) : file;
422
+ }));
423
+ resolved.forEach((file) => {
424
+ result.messages.push({
425
+ type: "dependency",
426
+ plugin: "postcss-import",
427
+ file,
428
+ parent: sourceFile
429
+ });
430
+ });
431
+ stmt.children = (await Promise.all(resolved.map((file) => {
432
+ return loadImportContent(result, stmt, file, options, state, postcss);
433
+ }))).flat().filter((x) => !!x);
434
+ }
435
+ async function loadImportContent(result, stmt, filename, options, state, postcss) {
436
+ const atRule = stmt.node;
437
+ const { conditions, from } = stmt;
438
+ const stmtDuplicateCheckKey = conditions.map((condition) => formatImportPrelude(condition.layer, condition.media, condition.supports)).join(":");
439
+ if (options.skipDuplicates) {
440
+ if (state.importedFiles[filename]?.[stmtDuplicateCheckKey])
441
+ return;
442
+ if (!state.importedFiles[filename])
443
+ state.importedFiles[filename] = {};
444
+ state.importedFiles[filename][stmtDuplicateCheckKey] = true;
445
+ }
446
+ if (from.includes(filename))
447
+ return;
448
+ const content = await options.load(filename, options);
449
+ if (content.trim() === "" && options.warnOnEmpty) {
450
+ result.warn(`${filename} is empty`, { node: atRule });
451
+ return;
452
+ }
453
+ if (options.skipDuplicates && state.hashFiles[content]?.[stmtDuplicateCheckKey])
454
+ return;
455
+ const importedResult = await processContent(result, content, filename, options, postcss);
456
+ const styles = importedResult.root;
457
+ result.messages = result.messages.concat(importedResult.messages);
458
+ if (options.skipDuplicates) {
459
+ if (!styles.some((child) => {
460
+ return child.type === "atrule" && child.name === "import";
461
+ })) {
462
+ if (!state.hashFiles[content])
463
+ state.hashFiles[content] = {};
464
+ state.hashFiles[content][stmtDuplicateCheckKey] = true;
465
+ }
466
+ }
467
+ return parseStyles(result, styles, options, state, conditions, [...from, filename], postcss);
468
+ }
469
+ function isProcessableURL(uri) {
470
+ if (/^(?:[a-z]+:)?\/\//i.test(uri))
471
+ return false;
472
+ try {
473
+ if (new URL(uri, "https://example.com").search)
474
+ return false;
475
+ } catch {}
476
+ return true;
477
+ }
478
+ module.exports = parseStyles;
479
+ });
480
+ var require_postcss_import = /* @__PURE__ */ __commonJSMin((exports, module) => {
481
+ const path = __require("path");
482
+ const applyConditions = require_apply_conditions();
483
+ const applyRaws = require_apply_raws();
484
+ const applyStyles = require_apply_styles();
485
+ const loadContent = () => "";
486
+ const parseStyles = require_parse_styles();
487
+ const resolveId = (id) => id;
488
+ function AtImport(options) {
489
+ options = {
490
+ root: process.cwd(),
491
+ path: [],
492
+ skipDuplicates: true,
493
+ resolve: resolveId,
494
+ load: loadContent,
495
+ plugins: [],
496
+ addModulesDirectories: [],
497
+ warnOnEmpty: true,
498
+ ...options
499
+ };
500
+ options.root = path.resolve(options.root);
501
+ if (typeof options.path === "string")
502
+ options.path = [options.path];
503
+ if (!Array.isArray(options.path))
504
+ options.path = [];
505
+ options.path = options.path.map((p) => path.resolve(options.root, p));
506
+ return {
507
+ postcssPlugin: "postcss-import",
508
+ async Once(styles, { result, atRule, postcss }) {
509
+ const state = {
510
+ importedFiles: {},
511
+ hashFiles: {}
512
+ };
513
+ if (styles.source?.input?.file)
514
+ state.importedFiles[styles.source.input.file] = {};
515
+ if (options.plugins && !Array.isArray(options.plugins))
516
+ throw new Error("plugins option must be an array");
517
+ const bundle = await parseStyles(result, styles, options, state, [], [], postcss);
518
+ applyRaws(bundle);
519
+ applyConditions(bundle, atRule);
520
+ applyStyles(bundle, styles);
521
+ }
522
+ };
523
+ }
524
+ AtImport.postcss = true;
525
+ module.exports = AtImport;
526
+ });
527
+ var postcss_import_default = require_postcss_import();
528
+ export {
529
+ postcss_import_default as default
530
+ };
531
+
532
+ //# debugId=709DA938C4F70D1F64756E2164756E21
533
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3ZpdGUvZGlzdC9ub2RlL2NodW5rcy9wb3N0Y3NzLWltcG9ydC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBmdCBhcyBfX2NvbW1vbkpTTWluLCBwdCBhcyBfX3JlcXVpcmUgfSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgeyB0IGFzIHJlcXVpcmVfbGliIH0gZnJvbSBcIi4vbGliLmpzXCI7XG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Bvc3Rjc3MtaW1wb3J0QDE2LjEuMV9wb3N0Y3NzQDguNS4xNy9ub2RlX21vZHVsZXMvcG9zdGNzcy1pbXBvcnQvbGliL2Zvcm1hdC1pbXBvcnQtcHJlbHVkZS5qc1xudmFyIHJlcXVpcmVfZm9ybWF0X2ltcG9ydF9wcmVsdWRlID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JtYXRJbXBvcnRQcmVsdWRlKGxheWVyLCBtZWRpYSwgc3VwcG9ydHMpIHtcblx0XHRjb25zdCBwYXJ0cyA9IFtdO1xuXHRcdGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdGxldCBsYXllclBhcmFtcyA9IFwibGF5ZXJcIjtcblx0XHRcdGlmIChsYXllcikgbGF5ZXJQYXJhbXMgPSBgbGF5ZXIoJHtsYXllcn0pYDtcblx0XHRcdHBhcnRzLnB1c2gobGF5ZXJQYXJhbXMpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHN1cHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSBwYXJ0cy5wdXNoKGBzdXBwb3J0cygke3N1cHBvcnRzfSlgKTtcblx0XHRpZiAodHlwZW9mIG1lZGlhICE9PSBcInVuZGVmaW5lZFwiKSBwYXJ0cy5wdXNoKG1lZGlhKTtcblx0XHRyZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG5cdH07XG59KSk7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcG9zdGNzcy1pbXBvcnRAMTYuMS4xX3Bvc3Rjc3NAOC41LjE3L25vZGVfbW9kdWxlcy9wb3N0Y3NzLWltcG9ydC9saWIvYmFzZTY0LWVuY29kZWQtaW1wb3J0LmpzXG52YXIgcmVxdWlyZV9iYXNlNjRfZW5jb2RlZF9pbXBvcnQgPSAvKiBAX19QVVJFX18gKi8gX19jb21tb25KU01pbigoKGV4cG9ydHMsIG1vZHVsZSkgPT4ge1xuXHRjb25zdCBmb3JtYXRJbXBvcnRQcmVsdWRlID0gcmVxdWlyZV9mb3JtYXRfaW1wb3J0X3ByZWx1ZGUoKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiYXNlNjRFbmNvZGVkQ29uZGl0aW9uYWxJbXBvcnQocHJlbHVkZSwgY29uZGl0aW9ucykge1xuXHRcdGlmICghY29uZGl0aW9ucz8ubGVuZ3RoKSByZXR1cm4gcHJlbHVkZTtcblx0XHRjb25kaXRpb25zLnJldmVyc2UoKTtcblx0XHRjb25zdCBmaXJzdCA9IGNvbmRpdGlvbnMucG9wKCk7XG5cdFx0bGV0IHBhcmFtcyA9IGAke3ByZWx1ZGV9ICR7Zm9ybWF0SW1wb3J0UHJlbHVkZShmaXJzdC5sYXllciwgZmlyc3QubWVkaWEsIGZpcnN0LnN1cHBvcnRzKX1gO1xuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHBhcmFtcyA9IGAnZGF0YTp0ZXh0L2NzcztiYXNlNjQsJHtCdWZmZXIuZnJvbShgQGltcG9ydCAke3BhcmFtc31gKS50b1N0cmluZyhcImJhc2U2NFwiKX0nICR7Zm9ybWF0SW1wb3J0UHJlbHVkZShjb25kaXRpb24ubGF5ZXIsIGNvbmRpdGlvbi5tZWRpYSwgY29uZGl0aW9uLnN1cHBvcnRzKX1gO1xuXHRcdHJldHVybiBwYXJhbXM7XG5cdH07XG59KSk7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcG9zdGNzcy1pbXBvcnRAMTYuMS4xX3Bvc3Rjc3NAOC41LjE3L25vZGVfbW9kdWxlcy9wb3N0Y3NzLWltcG9ydC9saWIvYXBwbHktY29uZGl0aW9ucy5qc1xudmFyIHJlcXVpcmVfYXBwbHlfY29uZGl0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdGNvbnN0IGJhc2U2NEVuY29kZWRDb25kaXRpb25hbEltcG9ydCA9IHJlcXVpcmVfYmFzZTY0X2VuY29kZWRfaW1wb3J0KCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXBwbHlDb25kaXRpb25zKGJ1bmRsZSwgYXRSdWxlKSB7XG5cdFx0Y29uc3QgZmlyc3RJbXBvcnRTdGF0ZW1lbnRJbmRleCA9IGJ1bmRsZS5maW5kSW5kZXgoKHN0bXQpID0+IHN0bXQudHlwZSA9PT0gXCJpbXBvcnRcIik7XG5cdFx0Y29uc3QgbGFzdEltcG9ydFN0YXRlbWVudEluZGV4ID0gYnVuZGxlLmZpbmRMYXN0SW5kZXgoKHN0bXQpID0+IHN0bXQudHlwZSA9PT0gXCJpbXBvcnRcIik7XG5cdFx0YnVuZGxlLmZvckVhY2goKHN0bXQsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoc3RtdC50eXBlID09PSBcImNoYXJzZXRcIiB8fCBzdG10LnR5cGUgPT09IFwid2FybmluZ1wiKSByZXR1cm47XG5cdFx0XHRpZiAoc3RtdC50eXBlID09PSBcImxheWVyXCIgJiYgKGluZGV4IDwgbGFzdEltcG9ydFN0YXRlbWVudEluZGV4ICYmIHN0bXQuY29uZGl0aW9ucz8ubGVuZ3RoIHx8IGluZGV4ID4gZmlyc3RJbXBvcnRTdGF0ZW1lbnRJbmRleCAmJiBpbmRleCA8IGxhc3RJbXBvcnRTdGF0ZW1lbnRJbmRleCkpIHtcblx0XHRcdFx0c3RtdC50eXBlID0gXCJpbXBvcnRcIjtcblx0XHRcdFx0c3RtdC5ub2RlID0gc3RtdC5ub2RlLmNsb25lKHtcblx0XHRcdFx0XHRuYW1lOiBcImltcG9ydFwiLFxuXHRcdFx0XHRcdHBhcmFtczogYmFzZTY0RW5jb2RlZENvbmRpdGlvbmFsSW1wb3J0KGAnZGF0YTp0ZXh0L2NzcztiYXNlNjQsJHtCdWZmZXIuZnJvbShzdG10Lm5vZGUudG9TdHJpbmcoKSkudG9TdHJpbmcoXCJiYXNlNjRcIil9J2AsIHN0bXQuY29uZGl0aW9ucylcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICghc3RtdC5jb25kaXRpb25zPy5sZW5ndGgpIHJldHVybjtcblx0XHRcdGlmIChzdG10LnR5cGUgPT09IFwiaW1wb3J0XCIpIHtcblx0XHRcdFx0c3RtdC5ub2RlLnBhcmFtcyA9IGJhc2U2NEVuY29kZWRDb25kaXRpb25hbEltcG9ydChzdG10LmZ1bGxVcmksIHN0bXQuY29uZGl0aW9ucyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBub2Rlcztcblx0XHRcdGxldCBwYXJlbnQ7XG5cdFx0XHRpZiAoc3RtdC50eXBlID09PSBcImxheWVyXCIpIHtcblx0XHRcdFx0bm9kZXMgPSBbc3RtdC5ub2RlXTtcblx0XHRcdFx0cGFyZW50ID0gc3RtdC5ub2RlLnBhcmVudDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vZGVzID0gc3RtdC5ub2Rlcztcblx0XHRcdFx0cGFyZW50ID0gbm9kZXNbMF0ucGFyZW50O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYXRSdWxlcyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2Ygc3RtdC5jb25kaXRpb25zKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29uZGl0aW9uLm1lZGlhICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWVkaWFOb2RlID0gYXRSdWxlKHtcblx0XHRcdFx0XHRcdG5hbWU6IFwibWVkaWFcIixcblx0XHRcdFx0XHRcdHBhcmFtczogY29uZGl0aW9uLm1lZGlhLFxuXHRcdFx0XHRcdFx0c291cmNlOiBwYXJlbnQuc291cmNlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXRSdWxlcy5wdXNoKG1lZGlhTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiBjb25kaXRpb24uc3VwcG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRjb25zdCBzdXBwb3J0c05vZGUgPSBhdFJ1bGUoe1xuXHRcdFx0XHRcdFx0bmFtZTogXCJzdXBwb3J0c1wiLFxuXHRcdFx0XHRcdFx0cGFyYW1zOiBgKCR7Y29uZGl0aW9uLnN1cHBvcnRzfSlgLFxuXHRcdFx0XHRcdFx0c291cmNlOiBwYXJlbnQuc291cmNlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXRSdWxlcy5wdXNoKHN1cHBvcnRzTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiBjb25kaXRpb24ubGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRjb25zdCBsYXllck5vZGUgPSBhdFJ1bGUoe1xuXHRcdFx0XHRcdFx0bmFtZTogXCJsYXllclwiLFxuXHRcdFx0XHRcdFx0cGFyYW1zOiBjb25kaXRpb24ubGF5ZXIsXG5cdFx0XHRcdFx0XHRzb3VyY2U6IHBhcmVudC5zb3VyY2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhdFJ1bGVzLnB1c2gobGF5ZXJOb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3V0ZXJBdFJ1bGUgPSBhdFJ1bGVzLnNoaWZ0KCk7XG5cdFx0XHRjb25zdCBpbm5lckF0UnVsZSA9IGF0UnVsZXMucmVkdWNlKChwcmV2aW91cywgbmV4dCkgPT4ge1xuXHRcdFx0XHRwcmV2aW91cy5hcHBlbmQobmV4dCk7XG5cdFx0XHRcdHJldHVybiBuZXh0O1xuXHRcdFx0fSwgb3V0ZXJBdFJ1bGUpO1xuXHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZShub2Rlc1swXSwgb3V0ZXJBdFJ1bGUpO1xuXHRcdFx0bm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0XHRub2RlLnBhcmVudCA9IHZvaWQgMDtcblx0XHRcdH0pO1xuXHRcdFx0bm9kZXNbMF0ucmF3cy5iZWZvcmUgPSBub2Rlc1swXS5yYXdzLmJlZm9yZSB8fCBcIlxcblwiO1xuXHRcdFx0aW5uZXJBdFJ1bGUuYXBwZW5kKG5vZGVzKTtcblx0XHRcdHN0bXQudHlwZSA9IFwibm9kZXNcIjtcblx0XHRcdHN0bXQubm9kZXMgPSBbb3V0ZXJBdFJ1bGVdO1xuXHRcdFx0ZGVsZXRlIHN0bXQubm9kZTtcblx0XHR9KTtcblx0fTtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9hcHBseS1yYXdzLmpzXG52YXIgcmVxdWlyZV9hcHBseV9yYXdzID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhcHBseVJhd3MoYnVuZGxlKSB7XG5cdFx0YnVuZGxlLmZvckVhY2goKHN0bXQsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggPT09IDApIHJldHVybjtcblx0XHRcdGlmIChzdG10LnBhcmVudCkge1xuXHRcdFx0XHRjb25zdCB7IGJlZm9yZSB9ID0gc3RtdC5wYXJlbnQubm9kZS5yYXdzO1xuXHRcdFx0XHRpZiAoc3RtdC50eXBlID09PSBcIm5vZGVzXCIpIHN0bXQubm9kZXNbMF0ucmF3cy5iZWZvcmUgPSBiZWZvcmU7XG5cdFx0XHRcdGVsc2Ugc3RtdC5ub2RlLnJhd3MuYmVmb3JlID0gYmVmb3JlO1xuXHRcdFx0fSBlbHNlIGlmIChzdG10LnR5cGUgPT09IFwibm9kZXNcIikgc3RtdC5ub2Rlc1swXS5yYXdzLmJlZm9yZSA9IHN0bXQubm9kZXNbMF0ucmF3cy5iZWZvcmUgfHwgXCJcXG5cIjtcblx0XHR9KTtcblx0fTtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9hcHBseS1zdHlsZXMuanNcbnZhciByZXF1aXJlX2FwcGx5X3N0eWxlcyA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXBwbHlTdHlsZXMoYnVuZGxlLCBzdHlsZXMpIHtcblx0XHRzdHlsZXMubm9kZXMgPSBbXTtcblx0XHRidW5kbGUuZm9yRWFjaCgoc3RtdCkgPT4ge1xuXHRcdFx0aWYgKFtcblx0XHRcdFx0XCJjaGFyc2V0XCIsXG5cdFx0XHRcdFwiaW1wb3J0XCIsXG5cdFx0XHRcdFwibGF5ZXJcIlxuXHRcdFx0XS5pbmNsdWRlcyhzdG10LnR5cGUpKSB7XG5cdFx0XHRcdHN0bXQubm9kZS5wYXJlbnQgPSB2b2lkIDA7XG5cdFx0XHRcdHN0eWxlcy5hcHBlbmQoc3RtdC5ub2RlKTtcblx0XHRcdH0gZWxzZSBpZiAoc3RtdC50eXBlID09PSBcIm5vZGVzXCIpIHN0bXQubm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0XHRub2RlLnBhcmVudCA9IHZvaWQgMDtcblx0XHRcdFx0c3R5bGVzLmFwcGVuZChub2RlKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xufSkpO1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Bvc3Rjc3MtaW1wb3J0QDE2LjEuMV9wb3N0Y3NzQDguNS4xNy9ub2RlX21vZHVsZXMvcG9zdGNzcy1pbXBvcnQvbGliL2RhdGEtdXJsLmpzXG52YXIgcmVxdWlyZV9kYXRhX3VybCA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdGNvbnN0IGFueURhdGFVUkxSZWdleHAgPSAvXmRhdGE6dGV4dFxcL2Nzcyg/OjsoYmFzZTY0fHBsYWluKSk/LC9pO1xuXHRjb25zdCBiYXNlNjREYXRhVVJMUmVnZXhwID0gL15kYXRhOnRleHRcXC9jc3M7YmFzZTY0LC9pO1xuXHRjb25zdCBwbGFpbkRhdGFVUkxSZWdleHAgPSAvXmRhdGE6dGV4dFxcL2NzcztwbGFpbiwvaTtcblx0ZnVuY3Rpb24gaXNWYWxpZCh1cmwpIHtcblx0XHRyZXR1cm4gYW55RGF0YVVSTFJlZ2V4cC50ZXN0KHVybCk7XG5cdH1cblx0ZnVuY3Rpb24gY29udGVudHModXJsKSB7XG5cdFx0aWYgKGJhc2U2NERhdGFVUkxSZWdleHAudGVzdCh1cmwpKSByZXR1cm4gQnVmZmVyLmZyb20odXJsLnNsaWNlKDIxKSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcblx0XHRpZiAocGxhaW5EYXRhVVJMUmVnZXhwLnRlc3QodXJsKSkgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmwuc2xpY2UoMjApKTtcblx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5zbGljZSgxNCkpO1xuXHR9XG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdGlzVmFsaWQsXG5cdFx0Y29udGVudHNcblx0fTtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9wYXJzZS1zdGF0ZW1lbnRzLmpzXG52YXIgcmVxdWlyZV9wYXJzZV9zdGF0ZW1lbnRzID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0Y29uc3QgdmFsdWVQYXJzZXIgPSByZXF1aXJlX2xpYigpO1xuXHRjb25zdCB7IHN0cmluZ2lmeSB9ID0gdmFsdWVQYXJzZXI7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRzKHJlc3VsdCwgc3R5bGVzLCBjb25kaXRpb25zLCBmcm9tKSB7XG5cdFx0Y29uc3Qgc3RhdGVtZW50cyA9IFtdO1xuXHRcdGxldCBub2RlcyA9IFtdO1xuXHRcdGxldCBlbmNvdW50ZXJlZE5vbkltcG9ydE5vZGVzID0gZmFsc2U7XG5cdFx0c3R5bGVzLmVhY2goKG5vZGUpID0+IHtcblx0XHRcdGxldCBzdG10O1xuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJhdHJ1bGVcIikge1xuXHRcdFx0XHRpZiAobm9kZS5uYW1lID09PSBcImltcG9ydFwiKSBzdG10ID0gcGFyc2VJbXBvcnQocmVzdWx0LCBub2RlLCBjb25kaXRpb25zLCBmcm9tKTtcblx0XHRcdFx0ZWxzZSBpZiAobm9kZS5uYW1lID09PSBcImNoYXJzZXRcIikgc3RtdCA9IHBhcnNlQ2hhcnNldChyZXN1bHQsIG5vZGUsIGNvbmRpdGlvbnMsIGZyb20pO1xuXHRcdFx0XHRlbHNlIGlmIChub2RlLm5hbWUgPT09IFwibGF5ZXJcIiAmJiAhZW5jb3VudGVyZWROb25JbXBvcnROb2RlcyAmJiAhbm9kZS5ub2Rlcykgc3RtdCA9IHBhcnNlTGF5ZXIocmVzdWx0LCBub2RlLCBjb25kaXRpb25zLCBmcm9tKTtcblx0XHRcdH0gZWxzZSBpZiAobm9kZS50eXBlICE9PSBcImNvbW1lbnRcIikgZW5jb3VudGVyZWROb25JbXBvcnROb2RlcyA9IHRydWU7XG5cdFx0XHRpZiAoc3RtdCkge1xuXHRcdFx0XHRpZiAobm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0c3RhdGVtZW50cy5wdXNoKHtcblx0XHRcdFx0XHRcdHR5cGU6IFwibm9kZXNcIixcblx0XHRcdFx0XHRcdG5vZGVzLFxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uczogWy4uLmNvbmRpdGlvbnNdLFxuXHRcdFx0XHRcdFx0ZnJvbVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG5vZGVzID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhdGVtZW50cy5wdXNoKHN0bXQpO1xuXHRcdFx0fSBlbHNlIG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0fSk7XG5cdFx0aWYgKG5vZGVzLmxlbmd0aCkgc3RhdGVtZW50cy5wdXNoKHtcblx0XHRcdHR5cGU6IFwibm9kZXNcIixcblx0XHRcdG5vZGVzLFxuXHRcdFx0Y29uZGl0aW9uczogWy4uLmNvbmRpdGlvbnNdLFxuXHRcdFx0ZnJvbVxuXHRcdH0pO1xuXHRcdHJldHVybiBzdGF0ZW1lbnRzO1xuXHR9O1xuXHRmdW5jdGlvbiBwYXJzZUNoYXJzZXQocmVzdWx0LCBhdFJ1bGUsIGNvbmRpdGlvbnMsIGZyb20pIHtcblx0XHRpZiAoYXRSdWxlLnByZXYoKSkgcmV0dXJuIHJlc3VsdC53YXJuKFwiQGNoYXJzZXQgbXVzdCBwcmVjZWRlIGFsbCBvdGhlciBzdGF0ZW1lbnRzXCIsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiBcImNoYXJzZXRcIixcblx0XHRcdG5vZGU6IGF0UnVsZSxcblx0XHRcdGNvbmRpdGlvbnM6IFsuLi5jb25kaXRpb25zXSxcblx0XHRcdGZyb21cblx0XHR9O1xuXHR9XG5cdGZ1bmN0aW9uIHBhcnNlSW1wb3J0KHJlc3VsdCwgYXRSdWxlLCBjb25kaXRpb25zLCBmcm9tKSB7XG5cdFx0bGV0IHByZXYgPSBhdFJ1bGUucHJldigpO1xuXHRcdGlmIChwcmV2KSBkbyB7XG5cdFx0XHRpZiAocHJldi50eXBlID09PSBcImNvbW1lbnRcIiB8fCBwcmV2LnR5cGUgPT09IFwiYXRydWxlXCIgJiYgcHJldi5uYW1lID09PSBcImltcG9ydFwiKSB7XG5cdFx0XHRcdHByZXYgPSBwcmV2LnByZXYoKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHR9IHdoaWxlIChwcmV2KTtcblx0XHRpZiAocHJldikgZG8ge1xuXHRcdFx0aWYgKHByZXYudHlwZSA9PT0gXCJjb21tZW50XCIgfHwgcHJldi50eXBlID09PSBcImF0cnVsZVwiICYmIChwcmV2Lm5hbWUgPT09IFwiY2hhcnNldFwiIHx8IHByZXYubmFtZSA9PT0gXCJsYXllclwiICYmICFwcmV2Lm5vZGVzKSkge1xuXHRcdFx0XHRwcmV2ID0gcHJldi5wcmV2KCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdC53YXJuKFwiQGltcG9ydCBtdXN0IHByZWNlZGUgYWxsIG90aGVyIHN0YXRlbWVudHMgKGJlc2lkZXMgQGNoYXJzZXQgb3IgZW1wdHkgQGxheWVyKVwiLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHR9IHdoaWxlIChwcmV2KTtcblx0XHRpZiAoYXRSdWxlLm5vZGVzKSByZXR1cm4gcmVzdWx0Lndhcm4oXCJJdCBsb29rcyBsaWtlIHlvdSBkaWRuJ3QgZW5kIHlvdXIgQGltcG9ydCBzdGF0ZW1lbnQgY29ycmVjdGx5LiBDaGlsZCBub2RlcyBhcmUgYXR0YWNoZWQgdG8gaXQuXCIsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdGNvbnN0IHBhcmFtcyA9IHZhbHVlUGFyc2VyKGF0UnVsZS5wYXJhbXMpLm5vZGVzO1xuXHRcdGNvbnN0IHN0bXQgPSB7XG5cdFx0XHR0eXBlOiBcImltcG9ydFwiLFxuXHRcdFx0dXJpOiBcIlwiLFxuXHRcdFx0ZnVsbFVyaTogXCJcIixcblx0XHRcdG5vZGU6IGF0UnVsZSxcblx0XHRcdGNvbmRpdGlvbnM6IFsuLi5jb25kaXRpb25zXSxcblx0XHRcdGZyb21cblx0XHR9O1xuXHRcdGxldCBsYXllcjtcblx0XHRsZXQgbWVkaWE7XG5cdFx0bGV0IHN1cHBvcnRzO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBub2RlID0gcGFyYW1zW2ldO1xuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJzcGFjZVwiIHx8IG5vZGUudHlwZSA9PT0gXCJjb21tZW50XCIpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRpZiAoc3RtdC51cmkpIHJldHVybiByZXN1bHQud2FybihgTXVsdGlwbGUgdXJsJ3MgaW4gJyR7YXRSdWxlLnRvU3RyaW5nKCl9J2AsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdFx0XHRpZiAoIW5vZGUudmFsdWUpIHJldHVybiByZXN1bHQud2FybihgVW5hYmxlIHRvIGZpbmQgdXJpIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdFx0c3RtdC51cmkgPSBub2RlLnZhbHVlO1xuXHRcdFx0XHRzdG10LmZ1bGxVcmkgPSBzdHJpbmdpZnkobm9kZSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJmdW5jdGlvblwiICYmIC9edXJsJC9pLnRlc3Qobm9kZS52YWx1ZSkpIHtcblx0XHRcdFx0aWYgKHN0bXQudXJpKSByZXR1cm4gcmVzdWx0Lndhcm4oYE11bHRpcGxlIHVybCdzIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdFx0aWYgKCFub2RlLm5vZGVzPy5bMF0/LnZhbHVlKSByZXR1cm4gcmVzdWx0Lndhcm4oYFVuYWJsZSB0byBmaW5kIHVyaSBpbiAnJHthdFJ1bGUudG9TdHJpbmcoKX0nYCwgeyBub2RlOiBhdFJ1bGUgfSk7XG5cdFx0XHRcdHN0bXQudXJpID0gbm9kZS5ub2Rlc1swXS52YWx1ZTtcblx0XHRcdFx0c3RtdC5mdWxsVXJpID0gc3RyaW5naWZ5KG5vZGUpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICghc3RtdC51cmkpIHJldHVybiByZXN1bHQud2FybihgVW5hYmxlIHRvIGZpbmQgdXJpIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdGlmICgobm9kZS50eXBlID09PSBcIndvcmRcIiB8fCBub2RlLnR5cGUgPT09IFwiZnVuY3Rpb25cIikgJiYgL15sYXllciQvaS50ZXN0KG5vZGUudmFsdWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiByZXN1bHQud2FybihgTXVsdGlwbGUgbGF5ZXJzIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdFx0aWYgKHR5cGVvZiBzdXBwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHJlc3VsdC53YXJuKGBsYXllcnMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBzdXBwb3J0IGNvbmRpdGlvbnMgaW4gJyR7YXRSdWxlLnRvU3RyaW5nKCl9J2AsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdFx0XHRpZiAobm9kZS5ub2RlcykgbGF5ZXIgPSBzdHJpbmdpZnkobm9kZS5ub2Rlcyk7XG5cdFx0XHRcdGVsc2UgbGF5ZXIgPSBcIlwiO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChub2RlLnR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAvXnN1cHBvcnRzJC9pLnRlc3Qobm9kZS52YWx1ZSkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBzdXBwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHJlc3VsdC53YXJuKGBNdWx0aXBsZSBzdXBwb3J0IGNvbmRpdGlvbnMgaW4gJyR7YXRSdWxlLnRvU3RyaW5nKCl9J2AsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdFx0XHRzdXBwb3J0cyA9IHN0cmluZ2lmeShub2RlLm5vZGVzKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRtZWRpYSA9IHN0cmluZ2lmeShwYXJhbXMuc2xpY2UoaSkpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghc3RtdC51cmkpIHJldHVybiByZXN1bHQud2FybihgVW5hYmxlIHRvIGZpbmQgdXJpIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRpZiAodHlwZW9mIG1lZGlhICE9PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygc3VwcG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHN0bXQuY29uZGl0aW9ucy5wdXNoKHtcblx0XHRcdGxheWVyLFxuXHRcdFx0bWVkaWEsXG5cdFx0XHRzdXBwb3J0c1xuXHRcdH0pO1xuXHRcdHJldHVybiBzdG10O1xuXHR9XG5cdGZ1bmN0aW9uIHBhcnNlTGF5ZXIocmVzdWx0LCBhdFJ1bGUsIGNvbmRpdGlvbnMsIGZyb20pIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogXCJsYXllclwiLFxuXHRcdFx0bm9kZTogYXRSdWxlLFxuXHRcdFx0Y29uZGl0aW9uczogWy4uLmNvbmRpdGlvbnNdLFxuXHRcdFx0ZnJvbVxuXHRcdH07XG5cdH1cbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9wcm9jZXNzLWNvbnRlbnQuanNcbnZhciByZXF1aXJlX3Byb2Nlc3NfY29udGVudCA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdGNvbnN0IHBhdGgkMiA9IF9fcmVxdWlyZShcInBhdGhcIik7XG5cdGxldCBzdWdhcnNzO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb250ZW50KHJlc3VsdCwgY29udGVudCwgZmlsZW5hbWUsIG9wdGlvbnMsIHBvc3Rjc3MpIHtcblx0XHRjb25zdCB7IHBsdWdpbnMgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgZXh0ID0gcGF0aCQyLmV4dG5hbWUoZmlsZW5hbWUpO1xuXHRcdGNvbnN0IHBhcnNlckxpc3QgPSBbXTtcblx0XHRpZiAoZXh0ID09PSBcIi5zc3NcIikge1xuXHRcdFx0aWYgKCFzdWdhcnNzKVxuIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN1Z2Fyc3MgPSBfX3JlcXVpcmUoXCJzdWdhcnNzXCIpO1xuXHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0aWYgKHN1Z2Fyc3MpIHJldHVybiBydW5Qb3N0Y3NzKHBvc3Rjc3MsIGNvbnRlbnQsIGZpbGVuYW1lLCBwbHVnaW5zLCBbc3VnYXJzc10pO1xuXHRcdH1cblx0XHRpZiAocmVzdWx0Lm9wdHMuc3ludGF4Py5wYXJzZSkgcGFyc2VyTGlzdC5wdXNoKHJlc3VsdC5vcHRzLnN5bnRheC5wYXJzZSk7XG5cdFx0aWYgKHJlc3VsdC5vcHRzLnBhcnNlcikgcGFyc2VyTGlzdC5wdXNoKHJlc3VsdC5vcHRzLnBhcnNlcik7XG5cdFx0cGFyc2VyTGlzdC5wdXNoKG51bGwpO1xuXHRcdHJldHVybiBydW5Qb3N0Y3NzKHBvc3Rjc3MsIGNvbnRlbnQsIGZpbGVuYW1lLCBwbHVnaW5zLCBwYXJzZXJMaXN0KTtcblx0fTtcblx0ZnVuY3Rpb24gcnVuUG9zdGNzcyhwb3N0Y3NzLCBjb250ZW50LCBmaWxlbmFtZSwgcGx1Z2lucywgcGFyc2VycywgaW5kZXgpIHtcblx0XHRpZiAoIWluZGV4KSBpbmRleCA9IDA7XG5cdFx0cmV0dXJuIHBvc3Rjc3MocGx1Z2lucykucHJvY2Vzcyhjb250ZW50LCB7XG5cdFx0XHRmcm9tOiBmaWxlbmFtZSxcblx0XHRcdHBhcnNlcjogcGFyc2Vyc1tpbmRleF1cblx0XHR9KS5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRpbmRleCsrO1xuXHRcdFx0aWYgKGluZGV4ID09PSBwYXJzZXJzLmxlbmd0aCkgdGhyb3cgZXJyO1xuXHRcdFx0cmV0dXJuIHJ1blBvc3Rjc3MocG9zdGNzcywgY29udGVudCwgZmlsZW5hbWUsIHBsdWdpbnMsIHBhcnNlcnMsIGluZGV4KTtcblx0XHR9KTtcblx0fVxufSkpO1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Bvc3Rjc3MtaW1wb3J0QDE2LjEuMV9wb3N0Y3NzQDguNS4xNy9ub2RlX21vZHVsZXMvcG9zdGNzcy1pbXBvcnQvbGliL3BhcnNlLXN0eWxlcy5qc1xudmFyIHJlcXVpcmVfcGFyc2Vfc3R5bGVzID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0Y29uc3QgcGF0aCQxID0gX19yZXF1aXJlKFwicGF0aFwiKTtcblx0Y29uc3QgZGF0YVVSTCA9IHJlcXVpcmVfZGF0YV91cmwoKTtcblx0Y29uc3QgcGFyc2VTdGF0ZW1lbnRzID0gcmVxdWlyZV9wYXJzZV9zdGF0ZW1lbnRzKCk7XG5cdGNvbnN0IHByb2Nlc3NDb250ZW50ID0gcmVxdWlyZV9wcm9jZXNzX2NvbnRlbnQoKTtcblx0Y29uc3QgcmVzb2x2ZUlkID0gKGlkKSA9PiBpZDtcblx0Y29uc3QgZm9ybWF0SW1wb3J0UHJlbHVkZSA9IHJlcXVpcmVfZm9ybWF0X2ltcG9ydF9wcmVsdWRlKCk7XG5cdGFzeW5jIGZ1bmN0aW9uIHBhcnNlU3R5bGVzKHJlc3VsdCwgc3R5bGVzLCBvcHRpb25zLCBzdGF0ZSwgY29uZGl0aW9ucywgZnJvbSwgcG9zdGNzcykge1xuXHRcdGNvbnN0IHN0YXRlbWVudHMgPSBwYXJzZVN0YXRlbWVudHMocmVzdWx0LCBzdHlsZXMsIGNvbmRpdGlvbnMsIGZyb20pO1xuXHRcdGZvciAoY29uc3Qgc3RtdCBvZiBzdGF0ZW1lbnRzKSB7XG5cdFx0XHRpZiAoc3RtdC50eXBlICE9PSBcImltcG9ydFwiIHx8ICFpc1Byb2Nlc3NhYmxlVVJMKHN0bXQudXJpKSkgY29udGludWU7XG5cdFx0XHRpZiAob3B0aW9ucy5maWx0ZXIgJiYgIW9wdGlvbnMuZmlsdGVyKHN0bXQudXJpKSkgY29udGludWU7XG5cdFx0XHRhd2FpdCByZXNvbHZlSW1wb3J0SWQocmVzdWx0LCBzdG10LCBvcHRpb25zLCBzdGF0ZSwgcG9zdGNzcyk7XG5cdFx0fVxuXHRcdGxldCBjaGFyc2V0O1xuXHRcdGNvbnN0IGJlZm9yZUJ1bmRsZSA9IFtdO1xuXHRcdGNvbnN0IGJ1bmRsZSA9IFtdO1xuXHRcdGZ1bmN0aW9uIGhhbmRsZUNoYXJzZXQoc3RtdCkge1xuXHRcdFx0aWYgKCFjaGFyc2V0KSBjaGFyc2V0ID0gc3RtdDtcblx0XHRcdGVsc2UgaWYgKHN0bXQubm9kZS5wYXJhbXMudG9Mb3dlckNhc2UoKSAhPT0gY2hhcnNldC5ub2RlLnBhcmFtcy50b0xvd2VyQ2FzZSgpKSB0aHJvdyBzdG10Lm5vZGUuZXJyb3IoYEluY29tcGF0aWJsZSBAY2hhcnNldCBzdGF0ZW1lbnRzOlxuICAke3N0bXQubm9kZS5wYXJhbXN9IHNwZWNpZmllZCBpbiAke3N0bXQubm9kZS5zb3VyY2UuaW5wdXQuZmlsZX1cbiAgJHtjaGFyc2V0Lm5vZGUucGFyYW1zfSBzcGVjaWZpZWQgaW4gJHtjaGFyc2V0Lm5vZGUuc291cmNlLmlucHV0LmZpbGV9YCk7XG5cdFx0fVxuXHRcdHN0YXRlbWVudHMuZm9yRWFjaCgoc3RtdCkgPT4ge1xuXHRcdFx0aWYgKHN0bXQudHlwZSA9PT0gXCJjaGFyc2V0XCIpIGhhbmRsZUNoYXJzZXQoc3RtdCk7XG5cdFx0XHRlbHNlIGlmIChzdG10LnR5cGUgPT09IFwiaW1wb3J0XCIpIGlmIChzdG10LmNoaWxkcmVuKSBzdG10LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRpZiAoY2hpbGQudHlwZSA9PT0gXCJpbXBvcnRcIikgYmVmb3JlQnVuZGxlLnB1c2goY2hpbGQpO1xuXHRcdFx0XHRlbHNlIGlmIChjaGlsZC50eXBlID09PSBcImxheWVyXCIpIGJlZm9yZUJ1bmRsZS5wdXNoKGNoaWxkKTtcblx0XHRcdFx0ZWxzZSBpZiAoY2hpbGQudHlwZSA9PT0gXCJjaGFyc2V0XCIpIGhhbmRsZUNoYXJzZXQoY2hpbGQpO1xuXHRcdFx0XHRlbHNlIGJ1bmRsZS5wdXNoKGNoaWxkKTtcblx0XHRcdFx0aWYgKGluZGV4ID09PSAwKSBjaGlsZC5wYXJlbnQgPSBzdG10O1xuXHRcdFx0fSk7XG5cdFx0XHRlbHNlIGJlZm9yZUJ1bmRsZS5wdXNoKHN0bXQpO1xuXHRcdFx0ZWxzZSBpZiAoc3RtdC50eXBlID09PSBcImxheWVyXCIpIGJlZm9yZUJ1bmRsZS5wdXNoKHN0bXQpO1xuXHRcdFx0ZWxzZSBpZiAoc3RtdC50eXBlID09PSBcIm5vZGVzXCIpIGJ1bmRsZS5wdXNoKHN0bXQpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBjaGFyc2V0ID8gW2NoYXJzZXQsIC4uLmJlZm9yZUJ1bmRsZS5jb25jYXQoYnVuZGxlKV0gOiBiZWZvcmVCdW5kbGUuY29uY2F0KGJ1bmRsZSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUltcG9ydElkKHJlc3VsdCwgc3RtdCwgb3B0aW9ucywgc3RhdGUsIHBvc3Rjc3MpIHtcblx0XHRpZiAoZGF0YVVSTC5pc1ZhbGlkKHN0bXQudXJpKSkge1xuXHRcdFx0c3RtdC5jaGlsZHJlbiA9IGF3YWl0IGxvYWRJbXBvcnRDb250ZW50KHJlc3VsdCwgc3RtdCwgc3RtdC51cmksIG9wdGlvbnMsIHN0YXRlLCBwb3N0Y3NzKTtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2UgaWYgKGRhdGFVUkwuaXNWYWxpZChzdG10LmZyb20uc2xpY2UoLTEpKSkgdGhyb3cgc3RtdC5ub2RlLmVycm9yKGBVbmFibGUgdG8gaW1wb3J0ICcke3N0bXQudXJpfScgZnJvbSBhIHN0eWxlc2hlZXQgdGhhdCBpcyBlbWJlZGRlZCBpbiBhIGRhdGEgdXJsYCk7XG5cdFx0Y29uc3QgYXRSdWxlID0gc3RtdC5ub2RlO1xuXHRcdGxldCBzb3VyY2VGaWxlO1xuXHRcdGlmIChhdFJ1bGUuc291cmNlPy5pbnB1dD8uZmlsZSkgc291cmNlRmlsZSA9IGF0UnVsZS5zb3VyY2UuaW5wdXQuZmlsZTtcblx0XHRjb25zdCBiYXNlID0gc291cmNlRmlsZSA/IHBhdGgkMS5kaXJuYW1lKGF0UnVsZS5zb3VyY2UuaW5wdXQuZmlsZSkgOiBvcHRpb25zLnJvb3Q7XG5cdFx0Y29uc3QgcGF0aHMgPSBbYXdhaXQgb3B0aW9ucy5yZXNvbHZlKHN0bXQudXJpLCBiYXNlLCBvcHRpb25zLCBhdFJ1bGUpXS5mbGF0KCk7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChwYXRocy5tYXAoKGZpbGUpID0+IHtcblx0XHRcdHJldHVybiAhcGF0aCQxLmlzQWJzb2x1dGUoZmlsZSkgPyByZXNvbHZlSWQoZmlsZSwgYmFzZSwgb3B0aW9ucywgYXRSdWxlKSA6IGZpbGU7XG5cdFx0fSkpO1xuXHRcdHJlc29sdmVkLmZvckVhY2goKGZpbGUpID0+IHtcblx0XHRcdHJlc3VsdC5tZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0dHlwZTogXCJkZXBlbmRlbmN5XCIsXG5cdFx0XHRcdHBsdWdpbjogXCJwb3N0Y3NzLWltcG9ydFwiLFxuXHRcdFx0XHRmaWxlLFxuXHRcdFx0XHRwYXJlbnQ6IHNvdXJjZUZpbGVcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdHN0bXQuY2hpbGRyZW4gPSAoYXdhaXQgUHJvbWlzZS5hbGwocmVzb2x2ZWQubWFwKChmaWxlKSA9PiB7XG5cdFx0XHRyZXR1cm4gbG9hZEltcG9ydENvbnRlbnQocmVzdWx0LCBzdG10LCBmaWxlLCBvcHRpb25zLCBzdGF0ZSwgcG9zdGNzcyk7XG5cdFx0fSkpKS5mbGF0KCkuZmlsdGVyKCh4KSA9PiAhIXgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGxvYWRJbXBvcnRDb250ZW50KHJlc3VsdCwgc3RtdCwgZmlsZW5hbWUsIG9wdGlvbnMsIHN0YXRlLCBwb3N0Y3NzKSB7XG5cdFx0Y29uc3QgYXRSdWxlID0gc3RtdC5ub2RlO1xuXHRcdGNvbnN0IHsgY29uZGl0aW9ucywgZnJvbSB9ID0gc3RtdDtcblx0XHRjb25zdCBzdG10RHVwbGljYXRlQ2hlY2tLZXkgPSBjb25kaXRpb25zLm1hcCgoY29uZGl0aW9uKSA9PiBmb3JtYXRJbXBvcnRQcmVsdWRlKGNvbmRpdGlvbi5sYXllciwgY29uZGl0aW9uLm1lZGlhLCBjb25kaXRpb24uc3VwcG9ydHMpKS5qb2luKFwiOlwiKTtcblx0XHRpZiAob3B0aW9ucy5za2lwRHVwbGljYXRlcykge1xuXHRcdFx0aWYgKHN0YXRlLmltcG9ydGVkRmlsZXNbZmlsZW5hbWVdPy5bc3RtdER1cGxpY2F0ZUNoZWNrS2V5XSkgcmV0dXJuO1xuXHRcdFx0aWYgKCFzdGF0ZS5pbXBvcnRlZEZpbGVzW2ZpbGVuYW1lXSkgc3RhdGUuaW1wb3J0ZWRGaWxlc1tmaWxlbmFtZV0gPSB7fTtcblx0XHRcdHN0YXRlLmltcG9ydGVkRmlsZXNbZmlsZW5hbWVdW3N0bXREdXBsaWNhdGVDaGVja0tleV0gPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoZnJvbS5pbmNsdWRlcyhmaWxlbmFtZSkpIHJldHVybjtcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgb3B0aW9ucy5sb2FkKGZpbGVuYW1lLCBvcHRpb25zKTtcblx0XHRpZiAoY29udGVudC50cmltKCkgPT09IFwiXCIgJiYgb3B0aW9ucy53YXJuT25FbXB0eSkge1xuXHRcdFx0cmVzdWx0Lndhcm4oYCR7ZmlsZW5hbWV9IGlzIGVtcHR5YCwgeyBub2RlOiBhdFJ1bGUgfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChvcHRpb25zLnNraXBEdXBsaWNhdGVzICYmIHN0YXRlLmhhc2hGaWxlc1tjb250ZW50XT8uW3N0bXREdXBsaWNhdGVDaGVja0tleV0pIHJldHVybjtcblx0XHRjb25zdCBpbXBvcnRlZFJlc3VsdCA9IGF3YWl0IHByb2Nlc3NDb250ZW50KHJlc3VsdCwgY29udGVudCwgZmlsZW5hbWUsIG9wdGlvbnMsIHBvc3Rjc3MpO1xuXHRcdGNvbnN0IHN0eWxlcyA9IGltcG9ydGVkUmVzdWx0LnJvb3Q7XG5cdFx0cmVzdWx0Lm1lc3NhZ2VzID0gcmVzdWx0Lm1lc3NhZ2VzLmNvbmNhdChpbXBvcnRlZFJlc3VsdC5tZXNzYWdlcyk7XG5cdFx0aWYgKG9wdGlvbnMuc2tpcER1cGxpY2F0ZXMpIHtcblx0XHRcdGlmICghc3R5bGVzLnNvbWUoKGNoaWxkKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjaGlsZC50eXBlID09PSBcImF0cnVsZVwiICYmIGNoaWxkLm5hbWUgPT09IFwiaW1wb3J0XCI7XG5cdFx0XHR9KSkge1xuXHRcdFx0XHRpZiAoIXN0YXRlLmhhc2hGaWxlc1tjb250ZW50XSkgc3RhdGUuaGFzaEZpbGVzW2NvbnRlbnRdID0ge307XG5cdFx0XHRcdHN0YXRlLmhhc2hGaWxlc1tjb250ZW50XVtzdG10RHVwbGljYXRlQ2hlY2tLZXldID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHBhcnNlU3R5bGVzKHJlc3VsdCwgc3R5bGVzLCBvcHRpb25zLCBzdGF0ZSwgY29uZGl0aW9ucywgWy4uLmZyb20sIGZpbGVuYW1lXSwgcG9zdGNzcyk7XG5cdH1cblx0ZnVuY3Rpb24gaXNQcm9jZXNzYWJsZVVSTCh1cmkpIHtcblx0XHRpZiAoL14oPzpbYS16XSs6KT9cXC9cXC8vaS50ZXN0KHVyaSkpIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG5ldyBVUkwodXJpLCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIikuc2VhcmNoKSByZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCB7fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdG1vZHVsZS5leHBvcnRzID0gcGFyc2VTdHlsZXM7XG59KSk7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcG9zdGNzcy1pbXBvcnRAMTYuMS4xX3Bvc3Rjc3NAOC41LjE3L25vZGVfbW9kdWxlcy9wb3N0Y3NzLWltcG9ydC9pbmRleC5qc1xudmFyIHJlcXVpcmVfcG9zdGNzc19pbXBvcnQgPSAvKiBAX19QVVJFX18gKi8gX19jb21tb25KU01pbigoKGV4cG9ydHMsIG1vZHVsZSkgPT4ge1xuXHRjb25zdCBwYXRoID0gX19yZXF1aXJlKFwicGF0aFwiKTtcblx0Y29uc3QgYXBwbHlDb25kaXRpb25zID0gcmVxdWlyZV9hcHBseV9jb25kaXRpb25zKCk7XG5cdGNvbnN0IGFwcGx5UmF3cyA9IHJlcXVpcmVfYXBwbHlfcmF3cygpO1xuXHRjb25zdCBhcHBseVN0eWxlcyA9IHJlcXVpcmVfYXBwbHlfc3R5bGVzKCk7XG5cdGNvbnN0IGxvYWRDb250ZW50ID0gKCkgPT4gXCJcIjtcblx0Y29uc3QgcGFyc2VTdHlsZXMgPSByZXF1aXJlX3BhcnNlX3N0eWxlcygpO1xuXHRjb25zdCByZXNvbHZlSWQgPSAoaWQpID0+IGlkO1xuXHRmdW5jdGlvbiBBdEltcG9ydChvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IHtcblx0XHRcdHJvb3Q6IHByb2Nlc3MuY3dkKCksXG5cdFx0XHRwYXRoOiBbXSxcblx0XHRcdHNraXBEdXBsaWNhdGVzOiB0cnVlLFxuXHRcdFx0cmVzb2x2ZTogcmVzb2x2ZUlkLFxuXHRcdFx0bG9hZDogbG9hZENvbnRlbnQsXG5cdFx0XHRwbHVnaW5zOiBbXSxcblx0XHRcdGFkZE1vZHVsZXNEaXJlY3RvcmllczogW10sXG5cdFx0XHR3YXJuT25FbXB0eTogdHJ1ZSxcblx0XHRcdC4uLm9wdGlvbnNcblx0XHR9O1xuXHRcdG9wdGlvbnMucm9vdCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnJvb3QpO1xuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5wYXRoID09PSBcInN0cmluZ1wiKSBvcHRpb25zLnBhdGggPSBbb3B0aW9ucy5wYXRoXTtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5wYXRoKSkgb3B0aW9ucy5wYXRoID0gW107XG5cdFx0b3B0aW9ucy5wYXRoID0gb3B0aW9ucy5wYXRoLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKG9wdGlvbnMucm9vdCwgcCkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRwb3N0Y3NzUGx1Z2luOiBcInBvc3Rjc3MtaW1wb3J0XCIsXG5cdFx0XHRhc3luYyBPbmNlKHN0eWxlcywgeyByZXN1bHQsIGF0UnVsZSwgcG9zdGNzcyB9KSB7XG5cdFx0XHRcdGNvbnN0IHN0YXRlID0ge1xuXHRcdFx0XHRcdGltcG9ydGVkRmlsZXM6IHt9LFxuXHRcdFx0XHRcdGhhc2hGaWxlczoge31cblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHN0eWxlcy5zb3VyY2U/LmlucHV0Py5maWxlKSBzdGF0ZS5pbXBvcnRlZEZpbGVzW3N0eWxlcy5zb3VyY2UuaW5wdXQuZmlsZV0gPSB7fTtcblx0XHRcdFx0aWYgKG9wdGlvbnMucGx1Z2lucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLnBsdWdpbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJwbHVnaW5zIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5XCIpO1xuXHRcdFx0XHRjb25zdCBidW5kbGUgPSBhd2FpdCBwYXJzZVN0eWxlcyhyZXN1bHQsIHN0eWxlcywgb3B0aW9ucywgc3RhdGUsIFtdLCBbXSwgcG9zdGNzcyk7XG5cdFx0XHRcdGFwcGx5UmF3cyhidW5kbGUpO1xuXHRcdFx0XHRhcHBseUNvbmRpdGlvbnMoYnVuZGxlLCBhdFJ1bGUpO1xuXHRcdFx0XHRhcHBseVN0eWxlcyhidW5kbGUsIHN0eWxlcyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRBdEltcG9ydC5wb3N0Y3NzID0gdHJ1ZTtcblx0bW9kdWxlLmV4cG9ydHMgPSBBdEltcG9ydDtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuZXhwb3J0IGRlZmF1bHQgcmVxdWlyZV9wb3N0Y3NzX2ltcG9ydCgpO1xuZXhwb3J0IHt9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSSxnREFBZ0QsY0FBZSxDQUFDLFNBQVMsV0FBVztBQUFBLEVBQ3ZGLE9BQU8sVUFBVSxTQUFTLG1CQUFtQixDQUFDLE9BQU8sT0FBTyxVQUFVO0FBQUEsSUFDckUsTUFBTSxRQUFRLENBQUM7QUFBQSxJQUNmLElBQUksT0FBTyxVQUFVLGFBQWE7QUFBQSxNQUNqQyxJQUFJLGNBQWM7QUFBQSxNQUNsQixJQUFJO0FBQUEsUUFBTyxjQUFjLFNBQVM7QUFBQSxNQUNsQyxNQUFNLEtBQUssV0FBVztBQUFBLElBQ3ZCO0FBQUEsSUFDQSxJQUFJLE9BQU8sYUFBYTtBQUFBLE1BQWEsTUFBTSxLQUFLLFlB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