@milkio/vite-plugin-milkio 1.3.36 → 1.3.40

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/chunk-3k49pqb5.js DELETED
@@ -1,2372 +0,0 @@
1
- import {
2
- __commonJS,
3
- __require,
4
- __toESM
5
- } from "./chunk-d85ypywj.js";
6
-
7
- // node_modules/esbuild/lib/main.js
8
- var require_main = __commonJS((exports, module) => {
9
- var __dirname = "/home/runner/work/milkio/milkio/node_modules/esbuild/lib", __filename = "/home/runner/work/milkio/milkio/node_modules/esbuild/lib/main.js";
10
- var __defProp = Object.defineProperty;
11
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
- var __getOwnPropNames = Object.getOwnPropertyNames;
13
- var __hasOwnProp = Object.prototype.hasOwnProperty;
14
- var __export = (target, all) => {
15
- for (var name in all)
16
- __defProp(target, name, { get: all[name], enumerable: true });
17
- };
18
- var __copyProps = (to, from, except, desc) => {
19
- if (from && typeof from === "object" || typeof from === "function") {
20
- for (let key of __getOwnPropNames(from))
21
- if (!__hasOwnProp.call(to, key) && key !== except)
22
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
- }
24
- return to;
25
- };
26
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
- var node_exports = {};
28
- __export(node_exports, {
29
- analyzeMetafile: () => analyzeMetafile,
30
- analyzeMetafileSync: () => analyzeMetafileSync,
31
- build: () => build,
32
- buildSync: () => buildSync,
33
- context: () => context,
34
- default: () => node_default,
35
- formatMessages: () => formatMessages,
36
- formatMessagesSync: () => formatMessagesSync,
37
- initialize: () => initialize,
38
- stop: () => stop,
39
- transform: () => transform,
40
- transformSync: () => transformSync,
41
- version: () => version
42
- });
43
- module.exports = __toCommonJS(node_exports);
44
- function encodePacket(packet) {
45
- let visit = (value) => {
46
- if (value === null) {
47
- bb.write8(0);
48
- } else if (typeof value === "boolean") {
49
- bb.write8(1);
50
- bb.write8(+value);
51
- } else if (typeof value === "number") {
52
- bb.write8(2);
53
- bb.write32(value | 0);
54
- } else if (typeof value === "string") {
55
- bb.write8(3);
56
- bb.write(encodeUTF8(value));
57
- } else if (value instanceof Uint8Array) {
58
- bb.write8(4);
59
- bb.write(value);
60
- } else if (value instanceof Array) {
61
- bb.write8(5);
62
- bb.write32(value.length);
63
- for (let item of value) {
64
- visit(item);
65
- }
66
- } else {
67
- let keys = Object.keys(value);
68
- bb.write8(6);
69
- bb.write32(keys.length);
70
- for (let key of keys) {
71
- bb.write(encodeUTF8(key));
72
- visit(value[key]);
73
- }
74
- }
75
- };
76
- let bb = new ByteBuffer;
77
- bb.write32(0);
78
- bb.write32(packet.id << 1 | +!packet.isRequest);
79
- visit(packet.value);
80
- writeUInt32LE(bb.buf, bb.len - 4, 0);
81
- return bb.buf.subarray(0, bb.len);
82
- }
83
- function decodePacket(bytes) {
84
- let visit = () => {
85
- switch (bb.read8()) {
86
- case 0:
87
- return null;
88
- case 1:
89
- return !!bb.read8();
90
- case 2:
91
- return bb.read32();
92
- case 3:
93
- return decodeUTF8(bb.read());
94
- case 4:
95
- return bb.read();
96
- case 5: {
97
- let count = bb.read32();
98
- let value2 = [];
99
- for (let i = 0;i < count; i++) {
100
- value2.push(visit());
101
- }
102
- return value2;
103
- }
104
- case 6: {
105
- let count = bb.read32();
106
- let value2 = {};
107
- for (let i = 0;i < count; i++) {
108
- value2[decodeUTF8(bb.read())] = visit();
109
- }
110
- return value2;
111
- }
112
- default:
113
- throw new Error("Invalid packet");
114
- }
115
- };
116
- let bb = new ByteBuffer(bytes);
117
- let id = bb.read32();
118
- let isRequest = (id & 1) === 0;
119
- id >>>= 1;
120
- let value = visit();
121
- if (bb.ptr !== bytes.length) {
122
- throw new Error("Invalid packet");
123
- }
124
- return { id, isRequest, value };
125
- }
126
- var ByteBuffer = class {
127
- constructor(buf = new Uint8Array(1024)) {
128
- this.buf = buf;
129
- this.len = 0;
130
- this.ptr = 0;
131
- }
132
- _write(delta) {
133
- if (this.len + delta > this.buf.length) {
134
- let clone = new Uint8Array((this.len + delta) * 2);
135
- clone.set(this.buf);
136
- this.buf = clone;
137
- }
138
- this.len += delta;
139
- return this.len - delta;
140
- }
141
- write8(value) {
142
- let offset = this._write(1);
143
- this.buf[offset] = value;
144
- }
145
- write32(value) {
146
- let offset = this._write(4);
147
- writeUInt32LE(this.buf, value, offset);
148
- }
149
- write(bytes) {
150
- let offset = this._write(4 + bytes.length);
151
- writeUInt32LE(this.buf, bytes.length, offset);
152
- this.buf.set(bytes, offset + 4);
153
- }
154
- _read(delta) {
155
- if (this.ptr + delta > this.buf.length) {
156
- throw new Error("Invalid packet");
157
- }
158
- this.ptr += delta;
159
- return this.ptr - delta;
160
- }
161
- read8() {
162
- return this.buf[this._read(1)];
163
- }
164
- read32() {
165
- return readUInt32LE(this.buf, this._read(4));
166
- }
167
- read() {
168
- let length = this.read32();
169
- let bytes = new Uint8Array(length);
170
- let ptr = this._read(bytes.length);
171
- bytes.set(this.buf.subarray(ptr, ptr + length));
172
- return bytes;
173
- }
174
- };
175
- var encodeUTF8;
176
- var decodeUTF8;
177
- var encodeInvariant;
178
- if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") {
179
- let encoder = new TextEncoder;
180
- let decoder = new TextDecoder;
181
- encodeUTF8 = (text) => encoder.encode(text);
182
- decodeUTF8 = (bytes) => decoder.decode(bytes);
183
- encodeInvariant = 'new TextEncoder().encode("")';
184
- } else if (typeof Buffer !== "undefined") {
185
- encodeUTF8 = (text) => Buffer.from(text);
186
- decodeUTF8 = (bytes) => {
187
- let { buffer, byteOffset, byteLength } = bytes;
188
- return Buffer.from(buffer, byteOffset, byteLength).toString();
189
- };
190
- encodeInvariant = 'Buffer.from("")';
191
- } else {
192
- throw new Error("No UTF-8 codec found");
193
- }
194
- if (!(encodeUTF8("") instanceof Uint8Array))
195
- throw new Error(`Invariant violation: "${encodeInvariant} instanceof Uint8Array" is incorrectly false
196
-
197
- This indicates that your JavaScript environment is broken. You cannot use
198
- esbuild in this environment because esbuild relies on this invariant. This
199
- is not a problem with esbuild. You need to fix your environment instead.
200
- `);
201
- function readUInt32LE(buffer, offset) {
202
- return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24;
203
- }
204
- function writeUInt32LE(buffer, value, offset) {
205
- buffer[offset++] = value;
206
- buffer[offset++] = value >> 8;
207
- buffer[offset++] = value >> 16;
208
- buffer[offset++] = value >> 24;
209
- }
210
- var quote = JSON.stringify;
211
- var buildLogLevelDefault = "warning";
212
- var transformLogLevelDefault = "silent";
213
- function validateAndJoinStringArray(values, what) {
214
- const toJoin = [];
215
- for (const value of values) {
216
- validateStringValue(value, what);
217
- if (value.indexOf(",") >= 0)
218
- throw new Error(`Invalid ${what}: ${value}`);
219
- toJoin.push(value);
220
- }
221
- return toJoin.join(",");
222
- }
223
- var canBeAnything = () => null;
224
- var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean";
225
- var mustBeString = (value) => typeof value === "string" ? null : "a string";
226
- var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object";
227
- var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer";
228
- var mustBeValidPortNumber = (value) => typeof value === "number" && value === (value | 0) && value >= 0 && value <= 65535 ? null : "a valid port number";
229
- var mustBeFunction = (value) => typeof value === "function" ? null : "a function";
230
- var mustBeArray = (value) => Array.isArray(value) ? null : "an array";
231
- var mustBeArrayOfStrings = (value) => Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "an array of strings";
232
- var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object";
233
- var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object";
234
- var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module";
235
- var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null";
236
- var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean";
237
- var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object";
238
- var mustBeStringOrArrayOfStrings = (value) => typeof value === "string" || Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "a string or an array of strings";
239
- var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array";
240
- var mustBeStringOrURL = (value) => typeof value === "string" || value instanceof URL ? null : "a string or a URL";
241
- function getFlag(object, keys, key, mustBeFn) {
242
- let value = object[key];
243
- keys[key + ""] = true;
244
- if (value === undefined)
245
- return;
246
- let mustBe = mustBeFn(value);
247
- if (mustBe !== null)
248
- throw new Error(`${quote(key)} must be ${mustBe}`);
249
- return value;
250
- }
251
- function checkForInvalidFlags(object, keys, where) {
252
- for (let key in object) {
253
- if (!(key in keys)) {
254
- throw new Error(`Invalid option ${where}: ${quote(key)}`);
255
- }
256
- }
257
- }
258
- function validateInitializeOptions(options) {
259
- let keys = /* @__PURE__ */ Object.create(null);
260
- let wasmURL = getFlag(options, keys, "wasmURL", mustBeStringOrURL);
261
- let wasmModule = getFlag(options, keys, "wasmModule", mustBeWebAssemblyModule);
262
- let worker = getFlag(options, keys, "worker", mustBeBoolean);
263
- checkForInvalidFlags(options, keys, "in initialize() call");
264
- return {
265
- wasmURL,
266
- wasmModule,
267
- worker
268
- };
269
- }
270
- function validateMangleCache(mangleCache) {
271
- let validated;
272
- if (mangleCache !== undefined) {
273
- validated = /* @__PURE__ */ Object.create(null);
274
- for (let key in mangleCache) {
275
- let value = mangleCache[key];
276
- if (typeof value === "string" || value === false) {
277
- validated[key] = value;
278
- } else {
279
- throw new Error(`Expected ${quote(key)} in mangle cache to map to either a string or false`);
280
- }
281
- }
282
- }
283
- return validated;
284
- }
285
- function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) {
286
- let color = getFlag(options, keys, "color", mustBeBoolean);
287
- let logLevel = getFlag(options, keys, "logLevel", mustBeString);
288
- let logLimit = getFlag(options, keys, "logLimit", mustBeInteger);
289
- if (color !== undefined)
290
- flags.push(`--color=${color}`);
291
- else if (isTTY2)
292
- flags.push(`--color=true`);
293
- flags.push(`--log-level=${logLevel || logLevelDefault}`);
294
- flags.push(`--log-limit=${logLimit || 0}`);
295
- }
296
- function validateStringValue(value, what, key) {
297
- if (typeof value !== "string") {
298
- throw new Error(`Expected value for ${what}${key !== undefined ? " " + quote(key) : ""} to be a string, got ${typeof value} instead`);
299
- }
300
- return value;
301
- }
302
- function pushCommonFlags(flags, options, keys) {
303
- let legalComments = getFlag(options, keys, "legalComments", mustBeString);
304
- let sourceRoot = getFlag(options, keys, "sourceRoot", mustBeString);
305
- let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean);
306
- let target = getFlag(options, keys, "target", mustBeStringOrArrayOfStrings);
307
- let format = getFlag(options, keys, "format", mustBeString);
308
- let globalName = getFlag(options, keys, "globalName", mustBeString);
309
- let mangleProps = getFlag(options, keys, "mangleProps", mustBeRegExp);
310
- let reserveProps = getFlag(options, keys, "reserveProps", mustBeRegExp);
311
- let mangleQuoted = getFlag(options, keys, "mangleQuoted", mustBeBoolean);
312
- let minify = getFlag(options, keys, "minify", mustBeBoolean);
313
- let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean);
314
- let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean);
315
- let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean);
316
- let lineLimit = getFlag(options, keys, "lineLimit", mustBeInteger);
317
- let drop = getFlag(options, keys, "drop", mustBeArrayOfStrings);
318
- let dropLabels = getFlag(options, keys, "dropLabels", mustBeArrayOfStrings);
319
- let charset = getFlag(options, keys, "charset", mustBeString);
320
- let treeShaking = getFlag(options, keys, "treeShaking", mustBeBoolean);
321
- let ignoreAnnotations = getFlag(options, keys, "ignoreAnnotations", mustBeBoolean);
322
- let jsx = getFlag(options, keys, "jsx", mustBeString);
323
- let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString);
324
- let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString);
325
- let jsxImportSource = getFlag(options, keys, "jsxImportSource", mustBeString);
326
- let jsxDev = getFlag(options, keys, "jsxDev", mustBeBoolean);
327
- let jsxSideEffects = getFlag(options, keys, "jsxSideEffects", mustBeBoolean);
328
- let define = getFlag(options, keys, "define", mustBeObject);
329
- let logOverride = getFlag(options, keys, "logOverride", mustBeObject);
330
- let supported = getFlag(options, keys, "supported", mustBeObject);
331
- let pure = getFlag(options, keys, "pure", mustBeArrayOfStrings);
332
- let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean);
333
- let platform = getFlag(options, keys, "platform", mustBeString);
334
- let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject);
335
- let absPaths = getFlag(options, keys, "absPaths", mustBeArrayOfStrings);
336
- if (legalComments)
337
- flags.push(`--legal-comments=${legalComments}`);
338
- if (sourceRoot !== undefined)
339
- flags.push(`--source-root=${sourceRoot}`);
340
- if (sourcesContent !== undefined)
341
- flags.push(`--sources-content=${sourcesContent}`);
342
- if (target)
343
- flags.push(`--target=${validateAndJoinStringArray(Array.isArray(target) ? target : [target], "target")}`);
344
- if (format)
345
- flags.push(`--format=${format}`);
346
- if (globalName)
347
- flags.push(`--global-name=${globalName}`);
348
- if (platform)
349
- flags.push(`--platform=${platform}`);
350
- if (tsconfigRaw)
351
- flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`);
352
- if (minify)
353
- flags.push("--minify");
354
- if (minifySyntax)
355
- flags.push("--minify-syntax");
356
- if (minifyWhitespace)
357
- flags.push("--minify-whitespace");
358
- if (minifyIdentifiers)
359
- flags.push("--minify-identifiers");
360
- if (lineLimit)
361
- flags.push(`--line-limit=${lineLimit}`);
362
- if (charset)
363
- flags.push(`--charset=${charset}`);
364
- if (treeShaking !== undefined)
365
- flags.push(`--tree-shaking=${treeShaking}`);
366
- if (ignoreAnnotations)
367
- flags.push(`--ignore-annotations`);
368
- if (drop)
369
- for (let what of drop)
370
- flags.push(`--drop:${validateStringValue(what, "drop")}`);
371
- if (dropLabels)
372
- flags.push(`--drop-labels=${validateAndJoinStringArray(dropLabels, "drop label")}`);
373
- if (absPaths)
374
- flags.push(`--abs-paths=${validateAndJoinStringArray(absPaths, "abs paths")}`);
375
- if (mangleProps)
376
- flags.push(`--mangle-props=${jsRegExpToGoRegExp(mangleProps)}`);
377
- if (reserveProps)
378
- flags.push(`--reserve-props=${jsRegExpToGoRegExp(reserveProps)}`);
379
- if (mangleQuoted !== undefined)
380
- flags.push(`--mangle-quoted=${mangleQuoted}`);
381
- if (jsx)
382
- flags.push(`--jsx=${jsx}`);
383
- if (jsxFactory)
384
- flags.push(`--jsx-factory=${jsxFactory}`);
385
- if (jsxFragment)
386
- flags.push(`--jsx-fragment=${jsxFragment}`);
387
- if (jsxImportSource)
388
- flags.push(`--jsx-import-source=${jsxImportSource}`);
389
- if (jsxDev)
390
- flags.push(`--jsx-dev`);
391
- if (jsxSideEffects)
392
- flags.push(`--jsx-side-effects`);
393
- if (define) {
394
- for (let key in define) {
395
- if (key.indexOf("=") >= 0)
396
- throw new Error(`Invalid define: ${key}`);
397
- flags.push(`--define:${key}=${validateStringValue(define[key], "define", key)}`);
398
- }
399
- }
400
- if (logOverride) {
401
- for (let key in logOverride) {
402
- if (key.indexOf("=") >= 0)
403
- throw new Error(`Invalid log override: ${key}`);
404
- flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], "log override", key)}`);
405
- }
406
- }
407
- if (supported) {
408
- for (let key in supported) {
409
- if (key.indexOf("=") >= 0)
410
- throw new Error(`Invalid supported: ${key}`);
411
- const value = supported[key];
412
- if (typeof value !== "boolean")
413
- throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`);
414
- flags.push(`--supported:${key}=${value}`);
415
- }
416
- }
417
- if (pure)
418
- for (let fn of pure)
419
- flags.push(`--pure:${validateStringValue(fn, "pure")}`);
420
- if (keepNames)
421
- flags.push(`--keep-names`);
422
- }
423
- function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) {
424
- var _a2;
425
- let flags = [];
426
- let entries = [];
427
- let keys = /* @__PURE__ */ Object.create(null);
428
- let stdinContents = null;
429
- let stdinResolveDir = null;
430
- pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
431
- pushCommonFlags(flags, options, keys);
432
- let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
433
- let bundle = getFlag(options, keys, "bundle", mustBeBoolean);
434
- let splitting = getFlag(options, keys, "splitting", mustBeBoolean);
435
- let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean);
436
- let metafile = getFlag(options, keys, "metafile", mustBeBoolean);
437
- let outfile = getFlag(options, keys, "outfile", mustBeString);
438
- let outdir = getFlag(options, keys, "outdir", mustBeString);
439
- let outbase = getFlag(options, keys, "outbase", mustBeString);
440
- let tsconfig = getFlag(options, keys, "tsconfig", mustBeString);
441
- let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArrayOfStrings);
442
- let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArrayOfStrings);
443
- let mainFields = getFlag(options, keys, "mainFields", mustBeArrayOfStrings);
444
- let conditions = getFlag(options, keys, "conditions", mustBeArrayOfStrings);
445
- let external = getFlag(options, keys, "external", mustBeArrayOfStrings);
446
- let packages = getFlag(options, keys, "packages", mustBeString);
447
- let alias = getFlag(options, keys, "alias", mustBeObject);
448
- let loader = getFlag(options, keys, "loader", mustBeObject);
449
- let outExtension = getFlag(options, keys, "outExtension", mustBeObject);
450
- let publicPath = getFlag(options, keys, "publicPath", mustBeString);
451
- let entryNames = getFlag(options, keys, "entryNames", mustBeString);
452
- let chunkNames = getFlag(options, keys, "chunkNames", mustBeString);
453
- let assetNames = getFlag(options, keys, "assetNames", mustBeString);
454
- let inject = getFlag(options, keys, "inject", mustBeArrayOfStrings);
455
- let banner = getFlag(options, keys, "banner", mustBeObject);
456
- let footer = getFlag(options, keys, "footer", mustBeObject);
457
- let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints);
458
- let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString);
459
- let stdin = getFlag(options, keys, "stdin", mustBeObject);
460
- let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault;
461
- let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean);
462
- let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
463
- keys.plugins = true;
464
- checkForInvalidFlags(options, keys, `in ${callName}() call`);
465
- if (sourcemap)
466
- flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`);
467
- if (bundle)
468
- flags.push("--bundle");
469
- if (allowOverwrite)
470
- flags.push("--allow-overwrite");
471
- if (splitting)
472
- flags.push("--splitting");
473
- if (preserveSymlinks)
474
- flags.push("--preserve-symlinks");
475
- if (metafile)
476
- flags.push(`--metafile`);
477
- if (outfile)
478
- flags.push(`--outfile=${outfile}`);
479
- if (outdir)
480
- flags.push(`--outdir=${outdir}`);
481
- if (outbase)
482
- flags.push(`--outbase=${outbase}`);
483
- if (tsconfig)
484
- flags.push(`--tsconfig=${tsconfig}`);
485
- if (packages)
486
- flags.push(`--packages=${packages}`);
487
- if (resolveExtensions)
488
- flags.push(`--resolve-extensions=${validateAndJoinStringArray(resolveExtensions, "resolve extension")}`);
489
- if (publicPath)
490
- flags.push(`--public-path=${publicPath}`);
491
- if (entryNames)
492
- flags.push(`--entry-names=${entryNames}`);
493
- if (chunkNames)
494
- flags.push(`--chunk-names=${chunkNames}`);
495
- if (assetNames)
496
- flags.push(`--asset-names=${assetNames}`);
497
- if (mainFields)
498
- flags.push(`--main-fields=${validateAndJoinStringArray(mainFields, "main field")}`);
499
- if (conditions)
500
- flags.push(`--conditions=${validateAndJoinStringArray(conditions, "condition")}`);
501
- if (external)
502
- for (let name of external)
503
- flags.push(`--external:${validateStringValue(name, "external")}`);
504
- if (alias) {
505
- for (let old in alias) {
506
- if (old.indexOf("=") >= 0)
507
- throw new Error(`Invalid package name in alias: ${old}`);
508
- flags.push(`--alias:${old}=${validateStringValue(alias[old], "alias", old)}`);
509
- }
510
- }
511
- if (banner) {
512
- for (let type in banner) {
513
- if (type.indexOf("=") >= 0)
514
- throw new Error(`Invalid banner file type: ${type}`);
515
- flags.push(`--banner:${type}=${validateStringValue(banner[type], "banner", type)}`);
516
- }
517
- }
518
- if (footer) {
519
- for (let type in footer) {
520
- if (type.indexOf("=") >= 0)
521
- throw new Error(`Invalid footer file type: ${type}`);
522
- flags.push(`--footer:${type}=${validateStringValue(footer[type], "footer", type)}`);
523
- }
524
- }
525
- if (inject)
526
- for (let path3 of inject)
527
- flags.push(`--inject:${validateStringValue(path3, "inject")}`);
528
- if (loader) {
529
- for (let ext in loader) {
530
- if (ext.indexOf("=") >= 0)
531
- throw new Error(`Invalid loader extension: ${ext}`);
532
- flags.push(`--loader:${ext}=${validateStringValue(loader[ext], "loader", ext)}`);
533
- }
534
- }
535
- if (outExtension) {
536
- for (let ext in outExtension) {
537
- if (ext.indexOf("=") >= 0)
538
- throw new Error(`Invalid out extension: ${ext}`);
539
- flags.push(`--out-extension:${ext}=${validateStringValue(outExtension[ext], "out extension", ext)}`);
540
- }
541
- }
542
- if (entryPoints) {
543
- if (Array.isArray(entryPoints)) {
544
- for (let i = 0, n = entryPoints.length;i < n; i++) {
545
- let entryPoint = entryPoints[i];
546
- if (typeof entryPoint === "object" && entryPoint !== null) {
547
- let entryPointKeys = /* @__PURE__ */ Object.create(null);
548
- let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString);
549
- let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString);
550
- checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i);
551
- if (input === undefined)
552
- throw new Error('Missing property "in" for entry point at index ' + i);
553
- if (output === undefined)
554
- throw new Error('Missing property "out" for entry point at index ' + i);
555
- entries.push([output, input]);
556
- } else {
557
- entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]);
558
- }
559
- }
560
- } else {
561
- for (let key in entryPoints) {
562
- entries.push([key, validateStringValue(entryPoints[key], "entry point", key)]);
563
- }
564
- }
565
- }
566
- if (stdin) {
567
- let stdinKeys = /* @__PURE__ */ Object.create(null);
568
- let contents = getFlag(stdin, stdinKeys, "contents", mustBeStringOrUint8Array);
569
- let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString);
570
- let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString);
571
- let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString);
572
- checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object');
573
- if (sourcefile)
574
- flags.push(`--sourcefile=${sourcefile}`);
575
- if (loader2)
576
- flags.push(`--loader=${loader2}`);
577
- if (resolveDir)
578
- stdinResolveDir = resolveDir;
579
- if (typeof contents === "string")
580
- stdinContents = encodeUTF8(contents);
581
- else if (contents instanceof Uint8Array)
582
- stdinContents = contents;
583
- }
584
- let nodePaths = [];
585
- if (nodePathsInput) {
586
- for (let value of nodePathsInput) {
587
- value += "";
588
- nodePaths.push(value);
589
- }
590
- }
591
- return {
592
- entries,
593
- flags,
594
- write,
595
- stdinContents,
596
- stdinResolveDir,
597
- absWorkingDir,
598
- nodePaths,
599
- mangleCache: validateMangleCache(mangleCache)
600
- };
601
- }
602
- function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) {
603
- let flags = [];
604
- let keys = /* @__PURE__ */ Object.create(null);
605
- pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
606
- pushCommonFlags(flags, options, keys);
607
- let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
608
- let sourcefile = getFlag(options, keys, "sourcefile", mustBeString);
609
- let loader = getFlag(options, keys, "loader", mustBeString);
610
- let banner = getFlag(options, keys, "banner", mustBeString);
611
- let footer = getFlag(options, keys, "footer", mustBeString);
612
- let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
613
- checkForInvalidFlags(options, keys, `in ${callName}() call`);
614
- if (sourcemap)
615
- flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`);
616
- if (sourcefile)
617
- flags.push(`--sourcefile=${sourcefile}`);
618
- if (loader)
619
- flags.push(`--loader=${loader}`);
620
- if (banner)
621
- flags.push(`--banner=${banner}`);
622
- if (footer)
623
- flags.push(`--footer=${footer}`);
624
- return {
625
- flags,
626
- mangleCache: validateMangleCache(mangleCache)
627
- };
628
- }
629
- function createChannel(streamIn) {
630
- const requestCallbacksByKey = {};
631
- const closeData = { didClose: false, reason: "" };
632
- let responseCallbacks = {};
633
- let nextRequestID = 0;
634
- let nextBuildKey = 0;
635
- let stdout = new Uint8Array(16 * 1024);
636
- let stdoutUsed = 0;
637
- let readFromStdout = (chunk) => {
638
- let limit = stdoutUsed + chunk.length;
639
- if (limit > stdout.length) {
640
- let swap = new Uint8Array(limit * 2);
641
- swap.set(stdout);
642
- stdout = swap;
643
- }
644
- stdout.set(chunk, stdoutUsed);
645
- stdoutUsed += chunk.length;
646
- let offset = 0;
647
- while (offset + 4 <= stdoutUsed) {
648
- let length = readUInt32LE(stdout, offset);
649
- if (offset + 4 + length > stdoutUsed) {
650
- break;
651
- }
652
- offset += 4;
653
- handleIncomingPacket(stdout.subarray(offset, offset + length));
654
- offset += length;
655
- }
656
- if (offset > 0) {
657
- stdout.copyWithin(0, offset, stdoutUsed);
658
- stdoutUsed -= offset;
659
- }
660
- };
661
- let afterClose = (error) => {
662
- closeData.didClose = true;
663
- if (error)
664
- closeData.reason = ": " + (error.message || error);
665
- const text = "The service was stopped" + closeData.reason;
666
- for (let id in responseCallbacks) {
667
- responseCallbacks[id](text, null);
668
- }
669
- responseCallbacks = {};
670
- };
671
- let sendRequest = (refs, value, callback) => {
672
- if (closeData.didClose)
673
- return callback("The service is no longer running" + closeData.reason, null);
674
- let id = nextRequestID++;
675
- responseCallbacks[id] = (error, response) => {
676
- try {
677
- callback(error, response);
678
- } finally {
679
- if (refs)
680
- refs.unref();
681
- }
682
- };
683
- if (refs)
684
- refs.ref();
685
- streamIn.writeToStdin(encodePacket({ id, isRequest: true, value }));
686
- };
687
- let sendResponse = (id, value) => {
688
- if (closeData.didClose)
689
- throw new Error("The service is no longer running" + closeData.reason);
690
- streamIn.writeToStdin(encodePacket({ id, isRequest: false, value }));
691
- };
692
- let handleRequest = async (id, request) => {
693
- try {
694
- if (request.command === "ping") {
695
- sendResponse(id, {});
696
- return;
697
- }
698
- if (typeof request.key === "number") {
699
- const requestCallbacks = requestCallbacksByKey[request.key];
700
- if (!requestCallbacks) {
701
- return;
702
- }
703
- const callback = requestCallbacks[request.command];
704
- if (callback) {
705
- await callback(id, request);
706
- return;
707
- }
708
- }
709
- throw new Error(`Invalid command: ` + request.command);
710
- } catch (e) {
711
- const errors = [extractErrorMessageV8(e, streamIn, null, undefined, "")];
712
- try {
713
- sendResponse(id, { errors });
714
- } catch {}
715
- }
716
- };
717
- let isFirstPacket = true;
718
- let handleIncomingPacket = (bytes) => {
719
- if (isFirstPacket) {
720
- isFirstPacket = false;
721
- let binaryVersion = String.fromCharCode(...bytes);
722
- if (binaryVersion !== "0.25.12") {
723
- throw new Error(`Cannot start service: Host version "${"0.25.12"}" does not match binary version ${quote(binaryVersion)}`);
724
- }
725
- return;
726
- }
727
- let packet = decodePacket(bytes);
728
- if (packet.isRequest) {
729
- handleRequest(packet.id, packet.value);
730
- } else {
731
- let callback = responseCallbacks[packet.id];
732
- delete responseCallbacks[packet.id];
733
- if (packet.value.error)
734
- callback(packet.value.error, {});
735
- else
736
- callback(null, packet.value);
737
- }
738
- };
739
- let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => {
740
- let refCount = 0;
741
- const buildKey = nextBuildKey++;
742
- const requestCallbacks = {};
743
- const buildRefs = {
744
- ref() {
745
- if (++refCount === 1) {
746
- if (refs)
747
- refs.ref();
748
- }
749
- },
750
- unref() {
751
- if (--refCount === 0) {
752
- delete requestCallbacksByKey[buildKey];
753
- if (refs)
754
- refs.unref();
755
- }
756
- }
757
- };
758
- requestCallbacksByKey[buildKey] = requestCallbacks;
759
- buildRefs.ref();
760
- buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, buildRefs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, (err, res) => {
761
- try {
762
- callback(err, res);
763
- } finally {
764
- buildRefs.unref();
765
- }
766
- });
767
- };
768
- let transform2 = ({ callName, refs, input, options, isTTY: isTTY2, fs: fs3, callback }) => {
769
- const details = createObjectStash();
770
- let start = (inputPath) => {
771
- try {
772
- if (typeof input !== "string" && !(input instanceof Uint8Array))
773
- throw new Error('The input to "transform" must be a string or a Uint8Array');
774
- let {
775
- flags,
776
- mangleCache
777
- } = flagsForTransformOptions(callName, options, isTTY2, transformLogLevelDefault);
778
- let request = {
779
- command: "transform",
780
- flags,
781
- inputFS: inputPath !== null,
782
- input: inputPath !== null ? encodeUTF8(inputPath) : typeof input === "string" ? encodeUTF8(input) : input
783
- };
784
- if (mangleCache)
785
- request.mangleCache = mangleCache;
786
- sendRequest(refs, request, (error, response) => {
787
- if (error)
788
- return callback(new Error(error), null);
789
- let errors = replaceDetailsInMessages(response.errors, details);
790
- let warnings = replaceDetailsInMessages(response.warnings, details);
791
- let outstanding = 1;
792
- let next = () => {
793
- if (--outstanding === 0) {
794
- let result = {
795
- warnings,
796
- code: response.code,
797
- map: response.map,
798
- mangleCache: undefined,
799
- legalComments: undefined
800
- };
801
- if ("legalComments" in response)
802
- result.legalComments = response == null ? undefined : response.legalComments;
803
- if (response.mangleCache)
804
- result.mangleCache = response == null ? undefined : response.mangleCache;
805
- callback(null, result);
806
- }
807
- };
808
- if (errors.length > 0)
809
- return callback(failureErrorWithLog("Transform failed", errors, warnings), null);
810
- if (response.codeFS) {
811
- outstanding++;
812
- fs3.readFile(response.code, (err, contents) => {
813
- if (err !== null) {
814
- callback(err, null);
815
- } else {
816
- response.code = contents;
817
- next();
818
- }
819
- });
820
- }
821
- if (response.mapFS) {
822
- outstanding++;
823
- fs3.readFile(response.map, (err, contents) => {
824
- if (err !== null) {
825
- callback(err, null);
826
- } else {
827
- response.map = contents;
828
- next();
829
- }
830
- });
831
- }
832
- next();
833
- });
834
- } catch (e) {
835
- let flags = [];
836
- try {
837
- pushLogFlags(flags, options, {}, isTTY2, transformLogLevelDefault);
838
- } catch {}
839
- const error = extractErrorMessageV8(e, streamIn, details, undefined, "");
840
- sendRequest(refs, { command: "error", flags, error }, () => {
841
- error.detail = details.load(error.detail);
842
- callback(failureErrorWithLog("Transform failed", [error], []), null);
843
- });
844
- }
845
- };
846
- if ((typeof input === "string" || input instanceof Uint8Array) && input.length > 1024 * 1024) {
847
- let next = start;
848
- start = () => fs3.writeFile(input, next);
849
- }
850
- start(null);
851
- };
852
- let formatMessages2 = ({ callName, refs, messages, options, callback }) => {
853
- if (!options)
854
- throw new Error(`Missing second argument in ${callName}() call`);
855
- let keys = {};
856
- let kind = getFlag(options, keys, "kind", mustBeString);
857
- let color = getFlag(options, keys, "color", mustBeBoolean);
858
- let terminalWidth = getFlag(options, keys, "terminalWidth", mustBeInteger);
859
- checkForInvalidFlags(options, keys, `in ${callName}() call`);
860
- if (kind === undefined)
861
- throw new Error(`Missing "kind" in ${callName}() call`);
862
- if (kind !== "error" && kind !== "warning")
863
- throw new Error(`Expected "kind" to be "error" or "warning" in ${callName}() call`);
864
- let request = {
865
- command: "format-msgs",
866
- messages: sanitizeMessages(messages, "messages", null, "", terminalWidth),
867
- isWarning: kind === "warning"
868
- };
869
- if (color !== undefined)
870
- request.color = color;
871
- if (terminalWidth !== undefined)
872
- request.terminalWidth = terminalWidth;
873
- sendRequest(refs, request, (error, response) => {
874
- if (error)
875
- return callback(new Error(error), null);
876
- callback(null, response.messages);
877
- });
878
- };
879
- let analyzeMetafile2 = ({ callName, refs, metafile, options, callback }) => {
880
- if (options === undefined)
881
- options = {};
882
- let keys = {};
883
- let color = getFlag(options, keys, "color", mustBeBoolean);
884
- let verbose = getFlag(options, keys, "verbose", mustBeBoolean);
885
- checkForInvalidFlags(options, keys, `in ${callName}() call`);
886
- let request = {
887
- command: "analyze-metafile",
888
- metafile
889
- };
890
- if (color !== undefined)
891
- request.color = color;
892
- if (verbose !== undefined)
893
- request.verbose = verbose;
894
- sendRequest(refs, request, (error, response) => {
895
- if (error)
896
- return callback(new Error(error), null);
897
- callback(null, response.result);
898
- });
899
- };
900
- return {
901
- readFromStdout,
902
- afterClose,
903
- service: {
904
- buildOrContext,
905
- transform: transform2,
906
- formatMessages: formatMessages2,
907
- analyzeMetafile: analyzeMetafile2
908
- }
909
- };
910
- }
911
- function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) {
912
- const details = createObjectStash();
913
- const isContext = callName === "context";
914
- const handleError = (e, pluginName) => {
915
- const flags = [];
916
- try {
917
- pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault);
918
- } catch {}
919
- const message = extractErrorMessageV8(e, streamIn, details, undefined, pluginName);
920
- sendRequest(refs, { command: "error", flags, error: message }, () => {
921
- message.detail = details.load(message.detail);
922
- callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null);
923
- });
924
- };
925
- let plugins;
926
- if (typeof options === "object") {
927
- const value = options.plugins;
928
- if (value !== undefined) {
929
- if (!Array.isArray(value))
930
- return handleError(new Error(`"plugins" must be an array`), "");
931
- plugins = value;
932
- }
933
- }
934
- if (plugins && plugins.length > 0) {
935
- if (streamIn.isSync)
936
- return handleError(new Error("Cannot use plugins in synchronous API calls"), "");
937
- handlePlugins(buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, plugins, details).then((result) => {
938
- if (!result.ok)
939
- return handleError(result.error, result.pluginName);
940
- try {
941
- buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks);
942
- } catch (e) {
943
- handleError(e, "");
944
- }
945
- }, (e) => handleError(e, ""));
946
- return;
947
- }
948
- try {
949
- buildOrContextContinue(null, (result, done) => done([], []), () => {});
950
- } catch (e) {
951
- handleError(e, "");
952
- }
953
- function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) {
954
- const writeDefault = streamIn.hasFS;
955
- const {
956
- entries,
957
- flags,
958
- write,
959
- stdinContents,
960
- stdinResolveDir,
961
- absWorkingDir,
962
- nodePaths,
963
- mangleCache
964
- } = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault);
965
- if (write && !streamIn.hasFS)
966
- throw new Error(`The "write" option is unavailable in this environment`);
967
- const request = {
968
- command: "build",
969
- key: buildKey,
970
- entries,
971
- flags,
972
- write,
973
- stdinContents,
974
- stdinResolveDir,
975
- absWorkingDir: absWorkingDir || defaultWD2,
976
- nodePaths,
977
- context: isContext
978
- };
979
- if (requestPlugins)
980
- request.plugins = requestPlugins;
981
- if (mangleCache)
982
- request.mangleCache = mangleCache;
983
- const buildResponseToResult = (response, callback2) => {
984
- const result = {
985
- errors: replaceDetailsInMessages(response.errors, details),
986
- warnings: replaceDetailsInMessages(response.warnings, details),
987
- outputFiles: undefined,
988
- metafile: undefined,
989
- mangleCache: undefined
990
- };
991
- const originalErrors = result.errors.slice();
992
- const originalWarnings = result.warnings.slice();
993
- if (response.outputFiles)
994
- result.outputFiles = response.outputFiles.map(convertOutputFiles);
995
- if (response.metafile)
996
- result.metafile = JSON.parse(response.metafile);
997
- if (response.mangleCache)
998
- result.mangleCache = response.mangleCache;
999
- if (response.writeToStdout !== undefined)
1000
- console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, ""));
1001
- runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => {
1002
- if (originalErrors.length > 0 || onEndErrors.length > 0) {
1003
- const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings));
1004
- return callback2(error, null, onEndErrors, onEndWarnings);
1005
- }
1006
- callback2(null, result, onEndErrors, onEndWarnings);
1007
- });
1008
- };
1009
- let latestResultPromise;
1010
- let provideLatestResult;
1011
- if (isContext)
1012
- requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => {
1013
- buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => {
1014
- const response = {
1015
- errors: onEndErrors,
1016
- warnings: onEndWarnings
1017
- };
1018
- if (provideLatestResult)
1019
- provideLatestResult(err, result);
1020
- latestResultPromise = undefined;
1021
- provideLatestResult = undefined;
1022
- sendResponse(id, response);
1023
- resolve();
1024
- });
1025
- });
1026
- sendRequest(refs, request, (error, response) => {
1027
- if (error)
1028
- return callback(new Error(error), null);
1029
- if (!isContext) {
1030
- return buildResponseToResult(response, (err, res) => {
1031
- scheduleOnDisposeCallbacks();
1032
- return callback(err, res);
1033
- });
1034
- }
1035
- if (response.errors.length > 0) {
1036
- return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null);
1037
- }
1038
- let didDispose = false;
1039
- const result = {
1040
- rebuild: () => {
1041
- if (!latestResultPromise)
1042
- latestResultPromise = new Promise((resolve, reject) => {
1043
- let settlePromise;
1044
- provideLatestResult = (err, result2) => {
1045
- if (!settlePromise)
1046
- settlePromise = () => err ? reject(err) : resolve(result2);
1047
- };
1048
- const triggerAnotherBuild = () => {
1049
- const request2 = {
1050
- command: "rebuild",
1051
- key: buildKey
1052
- };
1053
- sendRequest(refs, request2, (error2, response2) => {
1054
- if (error2) {
1055
- reject(new Error(error2));
1056
- } else if (settlePromise) {
1057
- settlePromise();
1058
- } else {
1059
- triggerAnotherBuild();
1060
- }
1061
- });
1062
- };
1063
- triggerAnotherBuild();
1064
- });
1065
- return latestResultPromise;
1066
- },
1067
- watch: (options2 = {}) => new Promise((resolve, reject) => {
1068
- if (!streamIn.hasFS)
1069
- throw new Error(`Cannot use the "watch" API in this environment`);
1070
- const keys = {};
1071
- const delay = getFlag(options2, keys, "delay", mustBeInteger);
1072
- checkForInvalidFlags(options2, keys, `in watch() call`);
1073
- const request2 = {
1074
- command: "watch",
1075
- key: buildKey
1076
- };
1077
- if (delay)
1078
- request2.delay = delay;
1079
- sendRequest(refs, request2, (error2) => {
1080
- if (error2)
1081
- reject(new Error(error2));
1082
- else
1083
- resolve(undefined);
1084
- });
1085
- }),
1086
- serve: (options2 = {}) => new Promise((resolve, reject) => {
1087
- if (!streamIn.hasFS)
1088
- throw new Error(`Cannot use the "serve" API in this environment`);
1089
- const keys = {};
1090
- const port = getFlag(options2, keys, "port", mustBeValidPortNumber);
1091
- const host = getFlag(options2, keys, "host", mustBeString);
1092
- const servedir = getFlag(options2, keys, "servedir", mustBeString);
1093
- const keyfile = getFlag(options2, keys, "keyfile", mustBeString);
1094
- const certfile = getFlag(options2, keys, "certfile", mustBeString);
1095
- const fallback = getFlag(options2, keys, "fallback", mustBeString);
1096
- const cors = getFlag(options2, keys, "cors", mustBeObject);
1097
- const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction);
1098
- checkForInvalidFlags(options2, keys, `in serve() call`);
1099
- const request2 = {
1100
- command: "serve",
1101
- key: buildKey,
1102
- onRequest: !!onRequest
1103
- };
1104
- if (port !== undefined)
1105
- request2.port = port;
1106
- if (host !== undefined)
1107
- request2.host = host;
1108
- if (servedir !== undefined)
1109
- request2.servedir = servedir;
1110
- if (keyfile !== undefined)
1111
- request2.keyfile = keyfile;
1112
- if (certfile !== undefined)
1113
- request2.certfile = certfile;
1114
- if (fallback !== undefined)
1115
- request2.fallback = fallback;
1116
- if (cors) {
1117
- const corsKeys = {};
1118
- const origin = getFlag(cors, corsKeys, "origin", mustBeStringOrArrayOfStrings);
1119
- checkForInvalidFlags(cors, corsKeys, `on "cors" object`);
1120
- if (Array.isArray(origin))
1121
- request2.corsOrigin = origin;
1122
- else if (origin !== undefined)
1123
- request2.corsOrigin = [origin];
1124
- }
1125
- sendRequest(refs, request2, (error2, response2) => {
1126
- if (error2)
1127
- return reject(new Error(error2));
1128
- if (onRequest) {
1129
- requestCallbacks["serve-request"] = (id, request3) => {
1130
- onRequest(request3.args);
1131
- sendResponse(id, {});
1132
- };
1133
- }
1134
- resolve(response2);
1135
- });
1136
- }),
1137
- cancel: () => new Promise((resolve) => {
1138
- if (didDispose)
1139
- return resolve();
1140
- const request2 = {
1141
- command: "cancel",
1142
- key: buildKey
1143
- };
1144
- sendRequest(refs, request2, () => {
1145
- resolve();
1146
- });
1147
- }),
1148
- dispose: () => new Promise((resolve) => {
1149
- if (didDispose)
1150
- return resolve();
1151
- didDispose = true;
1152
- const request2 = {
1153
- command: "dispose",
1154
- key: buildKey
1155
- };
1156
- sendRequest(refs, request2, () => {
1157
- resolve();
1158
- scheduleOnDisposeCallbacks();
1159
- refs.unref();
1160
- });
1161
- })
1162
- };
1163
- refs.ref();
1164
- callback(null, result);
1165
- });
1166
- }
1167
- }
1168
- var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => {
1169
- let onStartCallbacks = [];
1170
- let onEndCallbacks = [];
1171
- let onResolveCallbacks = {};
1172
- let onLoadCallbacks = {};
1173
- let onDisposeCallbacks = [];
1174
- let nextCallbackID = 0;
1175
- let i = 0;
1176
- let requestPlugins = [];
1177
- let isSetupDone = false;
1178
- plugins = [...plugins];
1179
- for (let item of plugins) {
1180
- let keys = {};
1181
- if (typeof item !== "object")
1182
- throw new Error(`Plugin at index ${i} must be an object`);
1183
- const name = getFlag(item, keys, "name", mustBeString);
1184
- if (typeof name !== "string" || name === "")
1185
- throw new Error(`Plugin at index ${i} is missing a name`);
1186
- try {
1187
- let setup = getFlag(item, keys, "setup", mustBeFunction);
1188
- if (typeof setup !== "function")
1189
- throw new Error(`Plugin is missing a setup function`);
1190
- checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`);
1191
- let plugin = {
1192
- name,
1193
- onStart: false,
1194
- onEnd: false,
1195
- onResolve: [],
1196
- onLoad: []
1197
- };
1198
- i++;
1199
- let resolve = (path3, options = {}) => {
1200
- if (!isSetupDone)
1201
- throw new Error('Cannot call "resolve" before plugin setup has completed');
1202
- if (typeof path3 !== "string")
1203
- throw new Error(`The path to resolve must be a string`);
1204
- let keys2 = /* @__PURE__ */ Object.create(null);
1205
- let pluginName = getFlag(options, keys2, "pluginName", mustBeString);
1206
- let importer = getFlag(options, keys2, "importer", mustBeString);
1207
- let namespace = getFlag(options, keys2, "namespace", mustBeString);
1208
- let resolveDir = getFlag(options, keys2, "resolveDir", mustBeString);
1209
- let kind = getFlag(options, keys2, "kind", mustBeString);
1210
- let pluginData = getFlag(options, keys2, "pluginData", canBeAnything);
1211
- let importAttributes = getFlag(options, keys2, "with", mustBeObject);
1212
- checkForInvalidFlags(options, keys2, "in resolve() call");
1213
- return new Promise((resolve2, reject) => {
1214
- const request = {
1215
- command: "resolve",
1216
- path: path3,
1217
- key: buildKey,
1218
- pluginName: name
1219
- };
1220
- if (pluginName != null)
1221
- request.pluginName = pluginName;
1222
- if (importer != null)
1223
- request.importer = importer;
1224
- if (namespace != null)
1225
- request.namespace = namespace;
1226
- if (resolveDir != null)
1227
- request.resolveDir = resolveDir;
1228
- if (kind != null)
1229
- request.kind = kind;
1230
- else
1231
- throw new Error(`Must specify "kind" when calling "resolve"`);
1232
- if (pluginData != null)
1233
- request.pluginData = details.store(pluginData);
1234
- if (importAttributes != null)
1235
- request.with = sanitizeStringMap(importAttributes, "with");
1236
- sendRequest(refs, request, (error, response) => {
1237
- if (error !== null)
1238
- reject(new Error(error));
1239
- else
1240
- resolve2({
1241
- errors: replaceDetailsInMessages(response.errors, details),
1242
- warnings: replaceDetailsInMessages(response.warnings, details),
1243
- path: response.path,
1244
- external: response.external,
1245
- sideEffects: response.sideEffects,
1246
- namespace: response.namespace,
1247
- suffix: response.suffix,
1248
- pluginData: details.load(response.pluginData)
1249
- });
1250
- });
1251
- });
1252
- };
1253
- let promise = setup({
1254
- initialOptions,
1255
- resolve,
1256
- onStart(callback) {
1257
- let registeredText = `This error came from the "onStart" callback registered here:`;
1258
- let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart");
1259
- onStartCallbacks.push({ name, callback, note: registeredNote });
1260
- plugin.onStart = true;
1261
- },
1262
- onEnd(callback) {
1263
- let registeredText = `This error came from the "onEnd" callback registered here:`;
1264
- let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd");
1265
- onEndCallbacks.push({ name, callback, note: registeredNote });
1266
- plugin.onEnd = true;
1267
- },
1268
- onResolve(options, callback) {
1269
- let registeredText = `This error came from the "onResolve" callback registered here:`;
1270
- let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve");
1271
- let keys2 = {};
1272
- let filter = getFlag(options, keys2, "filter", mustBeRegExp);
1273
- let namespace = getFlag(options, keys2, "namespace", mustBeString);
1274
- checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${quote(name)}`);
1275
- if (filter == null)
1276
- throw new Error(`onResolve() call is missing a filter`);
1277
- let id = nextCallbackID++;
1278
- onResolveCallbacks[id] = { name, callback, note: registeredNote };
1279
- plugin.onResolve.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" });
1280
- },
1281
- onLoad(options, callback) {
1282
- let registeredText = `This error came from the "onLoad" callback registered here:`;
1283
- let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad");
1284
- let keys2 = {};
1285
- let filter = getFlag(options, keys2, "filter", mustBeRegExp);
1286
- let namespace = getFlag(options, keys2, "namespace", mustBeString);
1287
- checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${quote(name)}`);
1288
- if (filter == null)
1289
- throw new Error(`onLoad() call is missing a filter`);
1290
- let id = nextCallbackID++;
1291
- onLoadCallbacks[id] = { name, callback, note: registeredNote };
1292
- plugin.onLoad.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" });
1293
- },
1294
- onDispose(callback) {
1295
- onDisposeCallbacks.push(callback);
1296
- },
1297
- esbuild: streamIn.esbuild
1298
- });
1299
- if (promise)
1300
- await promise;
1301
- requestPlugins.push(plugin);
1302
- } catch (e) {
1303
- return { ok: false, error: e, pluginName: name };
1304
- }
1305
- }
1306
- requestCallbacks["on-start"] = async (id, request) => {
1307
- details.clear();
1308
- let response = { errors: [], warnings: [] };
1309
- await Promise.all(onStartCallbacks.map(async ({ name, callback, note }) => {
1310
- try {
1311
- let result = await callback();
1312
- if (result != null) {
1313
- if (typeof result !== "object")
1314
- throw new Error(`Expected onStart() callback in plugin ${quote(name)} to return an object`);
1315
- let keys = {};
1316
- let errors = getFlag(result, keys, "errors", mustBeArray);
1317
- let warnings = getFlag(result, keys, "warnings", mustBeArray);
1318
- checkForInvalidFlags(result, keys, `from onStart() callback in plugin ${quote(name)}`);
1319
- if (errors != null)
1320
- response.errors.push(...sanitizeMessages(errors, "errors", details, name, undefined));
1321
- if (warnings != null)
1322
- response.warnings.push(...sanitizeMessages(warnings, "warnings", details, name, undefined));
1323
- }
1324
- } catch (e) {
1325
- response.errors.push(extractErrorMessageV8(e, streamIn, details, note && note(), name));
1326
- }
1327
- }));
1328
- sendResponse(id, response);
1329
- };
1330
- requestCallbacks["on-resolve"] = async (id, request) => {
1331
- let response = {}, name = "", callback, note;
1332
- for (let id2 of request.ids) {
1333
- try {
1334
- ({ name, callback, note } = onResolveCallbacks[id2]);
1335
- let result = await callback({
1336
- path: request.path,
1337
- importer: request.importer,
1338
- namespace: request.namespace,
1339
- resolveDir: request.resolveDir,
1340
- kind: request.kind,
1341
- pluginData: details.load(request.pluginData),
1342
- with: request.with
1343
- });
1344
- if (result != null) {
1345
- if (typeof result !== "object")
1346
- throw new Error(`Expected onResolve() callback in plugin ${quote(name)} to return an object`);
1347
- let keys = {};
1348
- let pluginName = getFlag(result, keys, "pluginName", mustBeString);
1349
- let path3 = getFlag(result, keys, "path", mustBeString);
1350
- let namespace = getFlag(result, keys, "namespace", mustBeString);
1351
- let suffix = getFlag(result, keys, "suffix", mustBeString);
1352
- let external = getFlag(result, keys, "external", mustBeBoolean);
1353
- let sideEffects = getFlag(result, keys, "sideEffects", mustBeBoolean);
1354
- let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
1355
- let errors = getFlag(result, keys, "errors", mustBeArray);
1356
- let warnings = getFlag(result, keys, "warnings", mustBeArray);
1357
- let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings);
1358
- let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings);
1359
- checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${quote(name)}`);
1360
- response.id = id2;
1361
- if (pluginName != null)
1362
- response.pluginName = pluginName;
1363
- if (path3 != null)
1364
- response.path = path3;
1365
- if (namespace != null)
1366
- response.namespace = namespace;
1367
- if (suffix != null)
1368
- response.suffix = suffix;
1369
- if (external != null)
1370
- response.external = external;
1371
- if (sideEffects != null)
1372
- response.sideEffects = sideEffects;
1373
- if (pluginData != null)
1374
- response.pluginData = details.store(pluginData);
1375
- if (errors != null)
1376
- response.errors = sanitizeMessages(errors, "errors", details, name, undefined);
1377
- if (warnings != null)
1378
- response.warnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
1379
- if (watchFiles != null)
1380
- response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles");
1381
- if (watchDirs != null)
1382
- response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs");
1383
- break;
1384
- }
1385
- } catch (e) {
1386
- response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] };
1387
- break;
1388
- }
1389
- }
1390
- sendResponse(id, response);
1391
- };
1392
- requestCallbacks["on-load"] = async (id, request) => {
1393
- let response = {}, name = "", callback, note;
1394
- for (let id2 of request.ids) {
1395
- try {
1396
- ({ name, callback, note } = onLoadCallbacks[id2]);
1397
- let result = await callback({
1398
- path: request.path,
1399
- namespace: request.namespace,
1400
- suffix: request.suffix,
1401
- pluginData: details.load(request.pluginData),
1402
- with: request.with
1403
- });
1404
- if (result != null) {
1405
- if (typeof result !== "object")
1406
- throw new Error(`Expected onLoad() callback in plugin ${quote(name)} to return an object`);
1407
- let keys = {};
1408
- let pluginName = getFlag(result, keys, "pluginName", mustBeString);
1409
- let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array);
1410
- let resolveDir = getFlag(result, keys, "resolveDir", mustBeString);
1411
- let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
1412
- let loader = getFlag(result, keys, "loader", mustBeString);
1413
- let errors = getFlag(result, keys, "errors", mustBeArray);
1414
- let warnings = getFlag(result, keys, "warnings", mustBeArray);
1415
- let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings);
1416
- let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings);
1417
- checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${quote(name)}`);
1418
- response.id = id2;
1419
- if (pluginName != null)
1420
- response.pluginName = pluginName;
1421
- if (contents instanceof Uint8Array)
1422
- response.contents = contents;
1423
- else if (contents != null)
1424
- response.contents = encodeUTF8(contents);
1425
- if (resolveDir != null)
1426
- response.resolveDir = resolveDir;
1427
- if (pluginData != null)
1428
- response.pluginData = details.store(pluginData);
1429
- if (loader != null)
1430
- response.loader = loader;
1431
- if (errors != null)
1432
- response.errors = sanitizeMessages(errors, "errors", details, name, undefined);
1433
- if (warnings != null)
1434
- response.warnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
1435
- if (watchFiles != null)
1436
- response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles");
1437
- if (watchDirs != null)
1438
- response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs");
1439
- break;
1440
- }
1441
- } catch (e) {
1442
- response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] };
1443
- break;
1444
- }
1445
- }
1446
- sendResponse(id, response);
1447
- };
1448
- let runOnEndCallbacks = (result, done) => done([], []);
1449
- if (onEndCallbacks.length > 0) {
1450
- runOnEndCallbacks = (result, done) => {
1451
- (async () => {
1452
- const onEndErrors = [];
1453
- const onEndWarnings = [];
1454
- for (const { name, callback, note } of onEndCallbacks) {
1455
- let newErrors;
1456
- let newWarnings;
1457
- try {
1458
- const value = await callback(result);
1459
- if (value != null) {
1460
- if (typeof value !== "object")
1461
- throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`);
1462
- let keys = {};
1463
- let errors = getFlag(value, keys, "errors", mustBeArray);
1464
- let warnings = getFlag(value, keys, "warnings", mustBeArray);
1465
- checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`);
1466
- if (errors != null)
1467
- newErrors = sanitizeMessages(errors, "errors", details, name, undefined);
1468
- if (warnings != null)
1469
- newWarnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
1470
- }
1471
- } catch (e) {
1472
- newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)];
1473
- }
1474
- if (newErrors) {
1475
- onEndErrors.push(...newErrors);
1476
- try {
1477
- result.errors.push(...newErrors);
1478
- } catch {}
1479
- }
1480
- if (newWarnings) {
1481
- onEndWarnings.push(...newWarnings);
1482
- try {
1483
- result.warnings.push(...newWarnings);
1484
- } catch {}
1485
- }
1486
- }
1487
- done(onEndErrors, onEndWarnings);
1488
- })();
1489
- };
1490
- }
1491
- let scheduleOnDisposeCallbacks = () => {
1492
- for (const cb of onDisposeCallbacks) {
1493
- setTimeout(() => cb(), 0);
1494
- }
1495
- };
1496
- isSetupDone = true;
1497
- return {
1498
- ok: true,
1499
- requestPlugins,
1500
- runOnEndCallbacks,
1501
- scheduleOnDisposeCallbacks
1502
- };
1503
- };
1504
- function createObjectStash() {
1505
- const map = /* @__PURE__ */ new Map;
1506
- let nextID = 0;
1507
- return {
1508
- clear() {
1509
- map.clear();
1510
- },
1511
- load(id) {
1512
- return map.get(id);
1513
- },
1514
- store(value) {
1515
- if (value === undefined)
1516
- return -1;
1517
- const id = nextID++;
1518
- map.set(id, value);
1519
- return id;
1520
- }
1521
- };
1522
- }
1523
- function extractCallerV8(e, streamIn, ident) {
1524
- let note;
1525
- let tried = false;
1526
- return () => {
1527
- if (tried)
1528
- return note;
1529
- tried = true;
1530
- try {
1531
- let lines = (e.stack + "").split(`
1532
- `);
1533
- lines.splice(1, 1);
1534
- let location = parseStackLinesV8(streamIn, lines, ident);
1535
- if (location) {
1536
- note = { text: e.message, location };
1537
- return note;
1538
- }
1539
- } catch {}
1540
- };
1541
- }
1542
- function extractErrorMessageV8(e, streamIn, stash, note, pluginName) {
1543
- let text = "Internal error";
1544
- let location = null;
1545
- try {
1546
- text = (e && e.message || e) + "";
1547
- } catch {}
1548
- try {
1549
- location = parseStackLinesV8(streamIn, (e.stack + "").split(`
1550
- `), "");
1551
- } catch {}
1552
- return { id: "", pluginName, text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1 };
1553
- }
1554
- function parseStackLinesV8(streamIn, lines, ident) {
1555
- let at = " at ";
1556
- if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) {
1557
- for (let i = 1;i < lines.length; i++) {
1558
- let line = lines[i];
1559
- if (!line.startsWith(at))
1560
- continue;
1561
- line = line.slice(at.length);
1562
- while (true) {
1563
- let match = /^(?:new |async )?\S+ \((.*)\)$/.exec(line);
1564
- if (match) {
1565
- line = match[1];
1566
- continue;
1567
- }
1568
- match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line);
1569
- if (match) {
1570
- line = match[1];
1571
- continue;
1572
- }
1573
- match = /^(\S+):(\d+):(\d+)$/.exec(line);
1574
- if (match) {
1575
- let contents;
1576
- try {
1577
- contents = streamIn.readFileSync(match[1], "utf8");
1578
- } catch {
1579
- break;
1580
- }
1581
- let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || "";
1582
- let column = +match[3] - 1;
1583
- let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0;
1584
- return {
1585
- file: match[1],
1586
- namespace: "file",
1587
- line: +match[2],
1588
- column: encodeUTF8(lineText.slice(0, column)).length,
1589
- length: encodeUTF8(lineText.slice(column, column + length)).length,
1590
- lineText: lineText + `
1591
- ` + lines.slice(1).join(`
1592
- `),
1593
- suggestion: ""
1594
- };
1595
- }
1596
- break;
1597
- }
1598
- }
1599
- }
1600
- return null;
1601
- }
1602
- function failureErrorWithLog(text, errors, warnings) {
1603
- let limit = 5;
1604
- text += errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => {
1605
- if (i === limit)
1606
- return `
1607
- ...`;
1608
- if (!e.location)
1609
- return `
1610
- error: ${e.text}`;
1611
- let { file, line, column } = e.location;
1612
- let pluginText = e.pluginName ? `[plugin: ${e.pluginName}] ` : "";
1613
- return `
1614
- ${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`;
1615
- }).join("");
1616
- let error = new Error(text);
1617
- for (const [key, value] of [["errors", errors], ["warnings", warnings]]) {
1618
- Object.defineProperty(error, key, {
1619
- configurable: true,
1620
- enumerable: true,
1621
- get: () => value,
1622
- set: (value2) => Object.defineProperty(error, key, {
1623
- configurable: true,
1624
- enumerable: true,
1625
- value: value2
1626
- })
1627
- });
1628
- }
1629
- return error;
1630
- }
1631
- function replaceDetailsInMessages(messages, stash) {
1632
- for (const message of messages) {
1633
- message.detail = stash.load(message.detail);
1634
- }
1635
- return messages;
1636
- }
1637
- function sanitizeLocation(location, where, terminalWidth) {
1638
- if (location == null)
1639
- return null;
1640
- let keys = {};
1641
- let file = getFlag(location, keys, "file", mustBeString);
1642
- let namespace = getFlag(location, keys, "namespace", mustBeString);
1643
- let line = getFlag(location, keys, "line", mustBeInteger);
1644
- let column = getFlag(location, keys, "column", mustBeInteger);
1645
- let length = getFlag(location, keys, "length", mustBeInteger);
1646
- let lineText = getFlag(location, keys, "lineText", mustBeString);
1647
- let suggestion = getFlag(location, keys, "suggestion", mustBeString);
1648
- checkForInvalidFlags(location, keys, where);
1649
- if (lineText) {
1650
- const relevantASCII = lineText.slice(0, (column && column > 0 ? column : 0) + (length && length > 0 ? length : 0) + (terminalWidth && terminalWidth > 0 ? terminalWidth : 80));
1651
- if (!/[\x7F-\uFFFF]/.test(relevantASCII) && !/\n/.test(lineText)) {
1652
- lineText = relevantASCII;
1653
- }
1654
- }
1655
- return {
1656
- file: file || "",
1657
- namespace: namespace || "",
1658
- line: line || 0,
1659
- column: column || 0,
1660
- length: length || 0,
1661
- lineText: lineText || "",
1662
- suggestion: suggestion || ""
1663
- };
1664
- }
1665
- function sanitizeMessages(messages, property, stash, fallbackPluginName, terminalWidth) {
1666
- let messagesClone = [];
1667
- let index = 0;
1668
- for (const message of messages) {
1669
- let keys = {};
1670
- let id = getFlag(message, keys, "id", mustBeString);
1671
- let pluginName = getFlag(message, keys, "pluginName", mustBeString);
1672
- let text = getFlag(message, keys, "text", mustBeString);
1673
- let location = getFlag(message, keys, "location", mustBeObjectOrNull);
1674
- let notes = getFlag(message, keys, "notes", mustBeArray);
1675
- let detail = getFlag(message, keys, "detail", canBeAnything);
1676
- let where = `in element ${index} of "${property}"`;
1677
- checkForInvalidFlags(message, keys, where);
1678
- let notesClone = [];
1679
- if (notes) {
1680
- for (const note of notes) {
1681
- let noteKeys = {};
1682
- let noteText = getFlag(note, noteKeys, "text", mustBeString);
1683
- let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull);
1684
- checkForInvalidFlags(note, noteKeys, where);
1685
- notesClone.push({
1686
- text: noteText || "",
1687
- location: sanitizeLocation(noteLocation, where, terminalWidth)
1688
- });
1689
- }
1690
- }
1691
- messagesClone.push({
1692
- id: id || "",
1693
- pluginName: pluginName || fallbackPluginName,
1694
- text: text || "",
1695
- location: sanitizeLocation(location, where, terminalWidth),
1696
- notes: notesClone,
1697
- detail: stash ? stash.store(detail) : -1
1698
- });
1699
- index++;
1700
- }
1701
- return messagesClone;
1702
- }
1703
- function sanitizeStringArray(values, property) {
1704
- const result = [];
1705
- for (const value of values) {
1706
- if (typeof value !== "string")
1707
- throw new Error(`${quote(property)} must be an array of strings`);
1708
- result.push(value);
1709
- }
1710
- return result;
1711
- }
1712
- function sanitizeStringMap(map, property) {
1713
- const result = /* @__PURE__ */ Object.create(null);
1714
- for (const key in map) {
1715
- const value = map[key];
1716
- if (typeof value !== "string")
1717
- throw new Error(`key ${quote(key)} in object ${quote(property)} must be a string`);
1718
- result[key] = value;
1719
- }
1720
- return result;
1721
- }
1722
- function convertOutputFiles({ path: path3, contents, hash }) {
1723
- let text = null;
1724
- return {
1725
- path: path3,
1726
- contents,
1727
- hash,
1728
- get text() {
1729
- const binary = this.contents;
1730
- if (text === null || binary !== contents) {
1731
- contents = binary;
1732
- text = decodeUTF8(binary);
1733
- }
1734
- return text;
1735
- }
1736
- };
1737
- }
1738
- function jsRegExpToGoRegExp(regexp) {
1739
- let result = regexp.source;
1740
- if (regexp.flags)
1741
- result = `(?${regexp.flags})${result}`;
1742
- return result;
1743
- }
1744
- var fs = __require("fs");
1745
- var os = __require("os");
1746
- var path = __require("path");
1747
- var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH;
1748
- var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild";
1749
- var packageDarwin_arm64 = "@esbuild/darwin-arm64";
1750
- var packageDarwin_x64 = "@esbuild/darwin-x64";
1751
- var knownWindowsPackages = {
1752
- "win32 arm64 LE": "@esbuild/win32-arm64",
1753
- "win32 ia32 LE": "@esbuild/win32-ia32",
1754
- "win32 x64 LE": "@esbuild/win32-x64"
1755
- };
1756
- var knownUnixlikePackages = {
1757
- "aix ppc64 BE": "@esbuild/aix-ppc64",
1758
- "android arm64 LE": "@esbuild/android-arm64",
1759
- "darwin arm64 LE": "@esbuild/darwin-arm64",
1760
- "darwin x64 LE": "@esbuild/darwin-x64",
1761
- "freebsd arm64 LE": "@esbuild/freebsd-arm64",
1762
- "freebsd x64 LE": "@esbuild/freebsd-x64",
1763
- "linux arm LE": "@esbuild/linux-arm",
1764
- "linux arm64 LE": "@esbuild/linux-arm64",
1765
- "linux ia32 LE": "@esbuild/linux-ia32",
1766
- "linux mips64el LE": "@esbuild/linux-mips64el",
1767
- "linux ppc64 LE": "@esbuild/linux-ppc64",
1768
- "linux riscv64 LE": "@esbuild/linux-riscv64",
1769
- "linux s390x BE": "@esbuild/linux-s390x",
1770
- "linux x64 LE": "@esbuild/linux-x64",
1771
- "linux loong64 LE": "@esbuild/linux-loong64",
1772
- "netbsd arm64 LE": "@esbuild/netbsd-arm64",
1773
- "netbsd x64 LE": "@esbuild/netbsd-x64",
1774
- "openbsd arm64 LE": "@esbuild/openbsd-arm64",
1775
- "openbsd x64 LE": "@esbuild/openbsd-x64",
1776
- "sunos x64 LE": "@esbuild/sunos-x64"
1777
- };
1778
- var knownWebAssemblyFallbackPackages = {
1779
- "android arm LE": "@esbuild/android-arm",
1780
- "android x64 LE": "@esbuild/android-x64",
1781
- "openharmony arm64 LE": "@esbuild/openharmony-arm64"
1782
- };
1783
- function pkgAndSubpathForCurrentPlatform() {
1784
- let pkg;
1785
- let subpath;
1786
- let isWASM = false;
1787
- let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`;
1788
- if (platformKey in knownWindowsPackages) {
1789
- pkg = knownWindowsPackages[platformKey];
1790
- subpath = "esbuild.exe";
1791
- } else if (platformKey in knownUnixlikePackages) {
1792
- pkg = knownUnixlikePackages[platformKey];
1793
- subpath = "bin/esbuild";
1794
- } else if (platformKey in knownWebAssemblyFallbackPackages) {
1795
- pkg = knownWebAssemblyFallbackPackages[platformKey];
1796
- subpath = "bin/esbuild";
1797
- isWASM = true;
1798
- } else {
1799
- throw new Error(`Unsupported platform: ${platformKey}`);
1800
- }
1801
- return { pkg, subpath, isWASM };
1802
- }
1803
- function pkgForSomeOtherPlatform() {
1804
- const libMainJS = __require.resolve("esbuild");
1805
- const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS)));
1806
- if (path.basename(nodeModulesDirectory) === "node_modules") {
1807
- for (const unixKey in knownUnixlikePackages) {
1808
- try {
1809
- const pkg = knownUnixlikePackages[unixKey];
1810
- if (fs.existsSync(path.join(nodeModulesDirectory, pkg)))
1811
- return pkg;
1812
- } catch {}
1813
- }
1814
- for (const windowsKey in knownWindowsPackages) {
1815
- try {
1816
- const pkg = knownWindowsPackages[windowsKey];
1817
- if (fs.existsSync(path.join(nodeModulesDirectory, pkg)))
1818
- return pkg;
1819
- } catch {}
1820
- }
1821
- }
1822
- return null;
1823
- }
1824
- function downloadedBinPath(pkg, subpath) {
1825
- const esbuildLibDir = path.dirname(__require.resolve("esbuild"));
1826
- return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`);
1827
- }
1828
- function generateBinPath() {
1829
- if (isValidBinaryPath(ESBUILD_BINARY_PATH)) {
1830
- if (!fs.existsSync(ESBUILD_BINARY_PATH)) {
1831
- console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`);
1832
- } else {
1833
- return { binPath: ESBUILD_BINARY_PATH, isWASM: false };
1834
- }
1835
- }
1836
- const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform();
1837
- let binPath;
1838
- try {
1839
- binPath = __require.resolve(`${pkg}/${subpath}`);
1840
- } catch (e) {
1841
- binPath = downloadedBinPath(pkg, subpath);
1842
- if (!fs.existsSync(binPath)) {
1843
- try {
1844
- __require.resolve(pkg);
1845
- } catch {
1846
- const otherPkg = pkgForSomeOtherPlatform();
1847
- if (otherPkg) {
1848
- let suggestions = `
1849
- Specifically the "${otherPkg}" package is present but this platform
1850
- needs the "${pkg}" package instead. People often get into this
1851
- situation by installing esbuild on Windows or macOS and copying "node_modules"
1852
- into a Docker image that runs Linux, or by copying "node_modules" between
1853
- Windows and WSL environments.
1854
-
1855
- If you are installing with npm, you can try not copying the "node_modules"
1856
- directory when you copy the files over, and running "npm ci" or "npm install"
1857
- on the destination platform after the copy. Or you could consider using yarn
1858
- instead of npm which has built-in support for installing a package on multiple
1859
- platforms simultaneously.
1860
-
1861
- If you are installing with yarn, you can try listing both this platform and the
1862
- other platform in your ".yarnrc.yml" file using the "supportedArchitectures"
1863
- feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures
1864
- Keep in mind that this means multiple copies of esbuild will be present.
1865
- `;
1866
- if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) {
1867
- suggestions = `
1868
- Specifically the "${otherPkg}" package is present but this platform
1869
- needs the "${pkg}" package instead. People often get into this
1870
- situation by installing esbuild with npm running inside of Rosetta 2 and then
1871
- trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta
1872
- 2 is Apple's on-the-fly x86_64-to-arm64 translation service).
1873
-
1874
- If you are installing with npm, you can try ensuring that both npm and node are
1875
- not running under Rosetta 2 and then reinstalling esbuild. This likely involves
1876
- changing how you installed npm and/or node. For example, installing node with
1877
- the universal installer here should work: https://nodejs.org/en/download/. Or
1878
- you could consider using yarn instead of npm which has built-in support for
1879
- installing a package on multiple platforms simultaneously.
1880
-
1881
- If you are installing with yarn, you can try listing both "arm64" and "x64"
1882
- in your ".yarnrc.yml" file using the "supportedArchitectures" feature:
1883
- https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures
1884
- Keep in mind that this means multiple copies of esbuild will be present.
1885
- `;
1886
- }
1887
- throw new Error(`
1888
- You installed esbuild for another platform than the one you're currently using.
1889
- This won't work because esbuild is written with native code and needs to
1890
- install a platform-specific binary executable.
1891
- ${suggestions}
1892
- Another alternative is to use the "esbuild-wasm" package instead, which works
1893
- the same way on all platforms. But it comes with a heavy performance cost and
1894
- can sometimes be 10x slower than the "esbuild" package, so you may also not
1895
- want to do that.
1896
- `);
1897
- }
1898
- throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild.
1899
-
1900
- If you are installing esbuild with npm, make sure that you don't specify the
1901
- "--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature
1902
- of "package.json" is used by esbuild to install the correct binary executable
1903
- for your current platform.`);
1904
- }
1905
- throw e;
1906
- }
1907
- }
1908
- if (/\.zip\//.test(binPath)) {
1909
- let pnpapi;
1910
- try {
1911
- pnpapi = (()=>{throw new Error("Cannot require module "+"pnpapi");})();
1912
- } catch (e) {}
1913
- if (pnpapi) {
1914
- const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation;
1915
- const binTargetPath = path.join(root, "node_modules", ".cache", "esbuild", `pnpapi-${pkg.replace("/", "-")}-${"0.25.12"}-${path.basename(subpath)}`);
1916
- if (!fs.existsSync(binTargetPath)) {
1917
- fs.mkdirSync(path.dirname(binTargetPath), { recursive: true });
1918
- fs.copyFileSync(binPath, binTargetPath);
1919
- fs.chmodSync(binTargetPath, 493);
1920
- }
1921
- return { binPath: binTargetPath, isWASM };
1922
- }
1923
- }
1924
- return { binPath, isWASM };
1925
- }
1926
- var child_process = __require("child_process");
1927
- var crypto = __require("crypto");
1928
- var path2 = __require("path");
1929
- var fs2 = __require("fs");
1930
- var os2 = __require("os");
1931
- var tty = __require("tty");
1932
- var worker_threads;
1933
- if (process.env.ESBUILD_WORKER_THREADS !== "0") {
1934
- try {
1935
- worker_threads = __require("worker_threads");
1936
- } catch {}
1937
- let [major, minor] = process.versions.node.split(".");
1938
- if (+major < 12 || +major === 12 && +minor < 17 || +major === 13 && +minor < 13) {
1939
- worker_threads = undefined;
1940
- }
1941
- }
1942
- var _a;
1943
- var isInternalWorkerThread = ((_a = worker_threads == null ? undefined : worker_threads.workerData) == null ? undefined : _a.esbuildVersion) === "0.25.12";
1944
- var esbuildCommandAndArgs = () => {
1945
- if ((!ESBUILD_BINARY_PATH || false) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) {
1946
- throw new Error(`The esbuild JavaScript API cannot be bundled. Please mark the "esbuild" package as external so it's not included in the bundle.
1947
-
1948
- More information: The file containing the code for esbuild's JavaScript API (${__filename}) does not appear to be inside the esbuild package on the file system, which usually means that the esbuild package was bundled into another file. This is problematic because the API needs to run a binary executable inside the esbuild package which is located using a relative path from the API code to the executable. If the esbuild package is bundled, the relative path will be incorrect and the executable won't be found.`);
1949
- }
1950
- if (false) {} else {
1951
- const { binPath, isWASM } = generateBinPath();
1952
- if (isWASM) {
1953
- return ["node", [binPath]];
1954
- } else {
1955
- return [binPath, []];
1956
- }
1957
- }
1958
- };
1959
- var isTTY = () => tty.isatty(2);
1960
- var fsSync = {
1961
- readFile(tempFile, callback) {
1962
- try {
1963
- let contents = fs2.readFileSync(tempFile, "utf8");
1964
- try {
1965
- fs2.unlinkSync(tempFile);
1966
- } catch {}
1967
- callback(null, contents);
1968
- } catch (err) {
1969
- callback(err, null);
1970
- }
1971
- },
1972
- writeFile(contents, callback) {
1973
- try {
1974
- let tempFile = randomFileName();
1975
- fs2.writeFileSync(tempFile, contents);
1976
- callback(tempFile);
1977
- } catch {
1978
- callback(null);
1979
- }
1980
- }
1981
- };
1982
- var fsAsync = {
1983
- readFile(tempFile, callback) {
1984
- try {
1985
- fs2.readFile(tempFile, "utf8", (err, contents) => {
1986
- try {
1987
- fs2.unlink(tempFile, () => callback(err, contents));
1988
- } catch {
1989
- callback(err, contents);
1990
- }
1991
- });
1992
- } catch (err) {
1993
- callback(err, null);
1994
- }
1995
- },
1996
- writeFile(contents, callback) {
1997
- try {
1998
- let tempFile = randomFileName();
1999
- fs2.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile));
2000
- } catch {
2001
- callback(null);
2002
- }
2003
- }
2004
- };
2005
- var version = "0.25.12";
2006
- var build = (options) => ensureServiceIsRunning().build(options);
2007
- var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions);
2008
- var transform = (input, options) => ensureServiceIsRunning().transform(input, options);
2009
- var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options);
2010
- var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options);
2011
- var buildSync = (options) => {
2012
- if (worker_threads && !isInternalWorkerThread) {
2013
- if (!workerThreadService)
2014
- workerThreadService = startWorkerThreadService(worker_threads);
2015
- return workerThreadService.buildSync(options);
2016
- }
2017
- let result;
2018
- runServiceSync((service) => service.buildOrContext({
2019
- callName: "buildSync",
2020
- refs: null,
2021
- options,
2022
- isTTY: isTTY(),
2023
- defaultWD,
2024
- callback: (err, res) => {
2025
- if (err)
2026
- throw err;
2027
- result = res;
2028
- }
2029
- }));
2030
- return result;
2031
- };
2032
- var transformSync = (input, options) => {
2033
- if (worker_threads && !isInternalWorkerThread) {
2034
- if (!workerThreadService)
2035
- workerThreadService = startWorkerThreadService(worker_threads);
2036
- return workerThreadService.transformSync(input, options);
2037
- }
2038
- let result;
2039
- runServiceSync((service) => service.transform({
2040
- callName: "transformSync",
2041
- refs: null,
2042
- input,
2043
- options: options || {},
2044
- isTTY: isTTY(),
2045
- fs: fsSync,
2046
- callback: (err, res) => {
2047
- if (err)
2048
- throw err;
2049
- result = res;
2050
- }
2051
- }));
2052
- return result;
2053
- };
2054
- var formatMessagesSync = (messages, options) => {
2055
- if (worker_threads && !isInternalWorkerThread) {
2056
- if (!workerThreadService)
2057
- workerThreadService = startWorkerThreadService(worker_threads);
2058
- return workerThreadService.formatMessagesSync(messages, options);
2059
- }
2060
- let result;
2061
- runServiceSync((service) => service.formatMessages({
2062
- callName: "formatMessagesSync",
2063
- refs: null,
2064
- messages,
2065
- options,
2066
- callback: (err, res) => {
2067
- if (err)
2068
- throw err;
2069
- result = res;
2070
- }
2071
- }));
2072
- return result;
2073
- };
2074
- var analyzeMetafileSync = (metafile, options) => {
2075
- if (worker_threads && !isInternalWorkerThread) {
2076
- if (!workerThreadService)
2077
- workerThreadService = startWorkerThreadService(worker_threads);
2078
- return workerThreadService.analyzeMetafileSync(metafile, options);
2079
- }
2080
- let result;
2081
- runServiceSync((service) => service.analyzeMetafile({
2082
- callName: "analyzeMetafileSync",
2083
- refs: null,
2084
- metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
2085
- options,
2086
- callback: (err, res) => {
2087
- if (err)
2088
- throw err;
2089
- result = res;
2090
- }
2091
- }));
2092
- return result;
2093
- };
2094
- var stop = () => {
2095
- if (stopService)
2096
- stopService();
2097
- if (workerThreadService)
2098
- workerThreadService.stop();
2099
- return Promise.resolve();
2100
- };
2101
- var initializeWasCalled = false;
2102
- var initialize = (options) => {
2103
- options = validateInitializeOptions(options || {});
2104
- if (options.wasmURL)
2105
- throw new Error(`The "wasmURL" option only works in the browser`);
2106
- if (options.wasmModule)
2107
- throw new Error(`The "wasmModule" option only works in the browser`);
2108
- if (options.worker)
2109
- throw new Error(`The "worker" option only works in the browser`);
2110
- if (initializeWasCalled)
2111
- throw new Error('Cannot call "initialize" more than once');
2112
- ensureServiceIsRunning();
2113
- initializeWasCalled = true;
2114
- return Promise.resolve();
2115
- };
2116
- var defaultWD = process.cwd();
2117
- var longLivedService;
2118
- var stopService;
2119
- var ensureServiceIsRunning = () => {
2120
- if (longLivedService)
2121
- return longLivedService;
2122
- let [command, args] = esbuildCommandAndArgs();
2123
- let child = child_process.spawn(command, args.concat(`--service=${"0.25.12"}`, "--ping"), {
2124
- windowsHide: true,
2125
- stdio: ["pipe", "pipe", "inherit"],
2126
- cwd: defaultWD
2127
- });
2128
- let { readFromStdout, afterClose, service } = createChannel({
2129
- writeToStdin(bytes) {
2130
- child.stdin.write(bytes, (err) => {
2131
- if (err)
2132
- afterClose(err);
2133
- });
2134
- },
2135
- readFileSync: fs2.readFileSync,
2136
- isSync: false,
2137
- hasFS: true,
2138
- esbuild: node_exports
2139
- });
2140
- child.stdin.on("error", afterClose);
2141
- child.on("error", afterClose);
2142
- const stdin = child.stdin;
2143
- const stdout = child.stdout;
2144
- stdout.on("data", readFromStdout);
2145
- stdout.on("end", afterClose);
2146
- stopService = () => {
2147
- stdin.destroy();
2148
- stdout.destroy();
2149
- child.kill();
2150
- initializeWasCalled = false;
2151
- longLivedService = undefined;
2152
- stopService = undefined;
2153
- };
2154
- let refCount = 0;
2155
- child.unref();
2156
- if (stdin.unref) {
2157
- stdin.unref();
2158
- }
2159
- if (stdout.unref) {
2160
- stdout.unref();
2161
- }
2162
- const refs = {
2163
- ref() {
2164
- if (++refCount === 1)
2165
- child.ref();
2166
- },
2167
- unref() {
2168
- if (--refCount === 0)
2169
- child.unref();
2170
- }
2171
- };
2172
- longLivedService = {
2173
- build: (options) => new Promise((resolve, reject) => {
2174
- service.buildOrContext({
2175
- callName: "build",
2176
- refs,
2177
- options,
2178
- isTTY: isTTY(),
2179
- defaultWD,
2180
- callback: (err, res) => err ? reject(err) : resolve(res)
2181
- });
2182
- }),
2183
- context: (options) => new Promise((resolve, reject) => service.buildOrContext({
2184
- callName: "context",
2185
- refs,
2186
- options,
2187
- isTTY: isTTY(),
2188
- defaultWD,
2189
- callback: (err, res) => err ? reject(err) : resolve(res)
2190
- })),
2191
- transform: (input, options) => new Promise((resolve, reject) => service.transform({
2192
- callName: "transform",
2193
- refs,
2194
- input,
2195
- options: options || {},
2196
- isTTY: isTTY(),
2197
- fs: fsAsync,
2198
- callback: (err, res) => err ? reject(err) : resolve(res)
2199
- })),
2200
- formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({
2201
- callName: "formatMessages",
2202
- refs,
2203
- messages,
2204
- options,
2205
- callback: (err, res) => err ? reject(err) : resolve(res)
2206
- })),
2207
- analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({
2208
- callName: "analyzeMetafile",
2209
- refs,
2210
- metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
2211
- options,
2212
- callback: (err, res) => err ? reject(err) : resolve(res)
2213
- }))
2214
- };
2215
- return longLivedService;
2216
- };
2217
- var runServiceSync = (callback) => {
2218
- let [command, args] = esbuildCommandAndArgs();
2219
- let stdin = new Uint8Array;
2220
- let { readFromStdout, afterClose, service } = createChannel({
2221
- writeToStdin(bytes) {
2222
- if (stdin.length !== 0)
2223
- throw new Error("Must run at most one command");
2224
- stdin = bytes;
2225
- },
2226
- isSync: true,
2227
- hasFS: true,
2228
- esbuild: node_exports
2229
- });
2230
- callback(service);
2231
- let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.25.12"}`), {
2232
- cwd: defaultWD,
2233
- windowsHide: true,
2234
- input: stdin,
2235
- maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024
2236
- });
2237
- readFromStdout(stdout);
2238
- afterClose(null);
2239
- };
2240
- var randomFileName = () => {
2241
- return path2.join(os2.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`);
2242
- };
2243
- var workerThreadService = null;
2244
- var startWorkerThreadService = (worker_threads2) => {
2245
- let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel;
2246
- let worker = new worker_threads2.Worker(__filename, {
2247
- workerData: { workerPort, defaultWD, esbuildVersion: "0.25.12" },
2248
- transferList: [workerPort],
2249
- execArgv: []
2250
- });
2251
- let nextID = 0;
2252
- let fakeBuildError = (text) => {
2253
- let error = new Error(`Build failed with 1 error:
2254
- error: ${text}`);
2255
- let errors = [{ id: "", pluginName: "", text, location: null, notes: [], detail: undefined }];
2256
- error.errors = errors;
2257
- error.warnings = [];
2258
- return error;
2259
- };
2260
- let validateBuildSyncOptions = (options) => {
2261
- if (!options)
2262
- return;
2263
- let plugins = options.plugins;
2264
- if (plugins && plugins.length > 0)
2265
- throw fakeBuildError(`Cannot use plugins in synchronous API calls`);
2266
- };
2267
- let applyProperties = (object, properties) => {
2268
- for (let key in properties) {
2269
- object[key] = properties[key];
2270
- }
2271
- };
2272
- let runCallSync = (command, args) => {
2273
- let id = nextID++;
2274
- let sharedBuffer = new SharedArrayBuffer(8);
2275
- let sharedBufferView = new Int32Array(sharedBuffer);
2276
- let msg = { sharedBuffer, id, command, args };
2277
- worker.postMessage(msg);
2278
- let status = Atomics.wait(sharedBufferView, 0, 0);
2279
- if (status !== "ok" && status !== "not-equal")
2280
- throw new Error("Internal error: Atomics.wait() failed: " + status);
2281
- let { message: { id: id2, resolve, reject, properties } } = worker_threads2.receiveMessageOnPort(mainPort);
2282
- if (id !== id2)
2283
- throw new Error(`Internal error: Expected id ${id} but got id ${id2}`);
2284
- if (reject) {
2285
- applyProperties(reject, properties);
2286
- throw reject;
2287
- }
2288
- return resolve;
2289
- };
2290
- worker.unref();
2291
- return {
2292
- buildSync(options) {
2293
- validateBuildSyncOptions(options);
2294
- return runCallSync("build", [options]);
2295
- },
2296
- transformSync(input, options) {
2297
- return runCallSync("transform", [input, options]);
2298
- },
2299
- formatMessagesSync(messages, options) {
2300
- return runCallSync("formatMessages", [messages, options]);
2301
- },
2302
- analyzeMetafileSync(metafile, options) {
2303
- return runCallSync("analyzeMetafile", [metafile, options]);
2304
- },
2305
- stop() {
2306
- worker.terminate();
2307
- workerThreadService = null;
2308
- }
2309
- };
2310
- };
2311
- var startSyncServiceWorker = () => {
2312
- let workerPort = worker_threads.workerData.workerPort;
2313
- let parentPort = worker_threads.parentPort;
2314
- let extractProperties = (object) => {
2315
- let properties = {};
2316
- if (object && typeof object === "object") {
2317
- for (let key in object) {
2318
- properties[key] = object[key];
2319
- }
2320
- }
2321
- return properties;
2322
- };
2323
- try {
2324
- let service = ensureServiceIsRunning();
2325
- defaultWD = worker_threads.workerData.defaultWD;
2326
- parentPort.on("message", (msg) => {
2327
- (async () => {
2328
- let { sharedBuffer, id, command, args } = msg;
2329
- let sharedBufferView = new Int32Array(sharedBuffer);
2330
- try {
2331
- switch (command) {
2332
- case "build":
2333
- workerPort.postMessage({ id, resolve: await service.build(args[0]) });
2334
- break;
2335
- case "transform":
2336
- workerPort.postMessage({ id, resolve: await service.transform(args[0], args[1]) });
2337
- break;
2338
- case "formatMessages":
2339
- workerPort.postMessage({ id, resolve: await service.formatMessages(args[0], args[1]) });
2340
- break;
2341
- case "analyzeMetafile":
2342
- workerPort.postMessage({ id, resolve: await service.analyzeMetafile(args[0], args[1]) });
2343
- break;
2344
- default:
2345
- throw new Error(`Invalid command: ${command}`);
2346
- }
2347
- } catch (reject) {
2348
- workerPort.postMessage({ id, reject, properties: extractProperties(reject) });
2349
- }
2350
- Atomics.add(sharedBufferView, 0, 1);
2351
- Atomics.notify(sharedBufferView, 0, Infinity);
2352
- })();
2353
- });
2354
- } catch (reject) {
2355
- parentPort.on("message", (msg) => {
2356
- let { sharedBuffer, id } = msg;
2357
- let sharedBufferView = new Int32Array(sharedBuffer);
2358
- workerPort.postMessage({ id, reject, properties: extractProperties(reject) });
2359
- Atomics.add(sharedBufferView, 0, 1);
2360
- Atomics.notify(sharedBufferView, 0, Infinity);
2361
- });
2362
- }
2363
- };
2364
- if (isInternalWorkerThread) {
2365
- startSyncServiceWorker();
2366
- }
2367
- var node_default = node_exports;
2368
- });
2369
- export default require_main();
2370
-
2371
- //# debugId=F026D32E880DFAD264756E2164756E21
2372
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2VzYnVpbGQvbGliL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcbnZhciBfX3RvQ29tbW9uSlMgPSAobW9kKSA9PiBfX2NvcHlQcm9wcyhfX2RlZlByb3Aoe30sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpO1xuXG4vLyBsaWIvbnBtL25vZGUudHNcbnZhciBub2RlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG5vZGVfZXhwb3J0cywge1xuICBhbmFseXplTWV0YWZpbGU6ICgpID0+IGFuYWx5emVNZXRhZmlsZSxcbiAgYW5hbHl6ZU1ldGFmaWxlU3luYzogKCkgPT4gYW5hbHl6ZU1ldGFmaWxlU3luYyxcbiAgYnVpbGQ6ICgpID0+IGJ1aWxkLFxuICBidWlsZFN5bmM6ICgpID0+IGJ1aWxkU3luYyxcbiAgY29udGV4dDogKCkgPT4gY29udGV4dCxcbiAgZGVmYXVsdDogKCkgPT4gbm9kZV9kZWZhdWx0LFxuICBmb3JtYXRNZXNzYWdlczogKCkgPT4gZm9ybWF0TWVzc2FnZXMsXG4gIGZvcm1hdE1lc3NhZ2VzU3luYzogKCkgPT4gZm9ybWF0TWVzc2FnZXNTeW5jLFxuICBpbml0aWFsaXplOiAoKSA9PiBpbml0aWFsaXplLFxuICBzdG9wOiAoKSA9PiBzdG9wLFxuICB0cmFuc2Zvcm06ICgpID0+IHRyYW5zZm9ybSxcbiAgdHJhbnNmb3JtU3luYzogKCkgPT4gdHJhbnNmb3JtU3luYyxcbiAgdmVyc2lvbjogKCkgPT4gdmVyc2lvblxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhub2RlX2V4cG9ydHMpO1xuXG4vLyBsaWIvc2hhcmVkL3N0ZGlvX3Byb3RvY29sLnRzXG5mdW5jdGlvbiBlbmNvZGVQYWNrZXQocGFja2V0KSB7XG4gIGxldCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYmIud3JpdGU4KDApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgYmIud3JpdGU4KDEpO1xuICAgICAgYmIud3JpdGU4KCt2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGJiLndyaXRlOCgyKTtcbiAgICAgIGJiLndyaXRlMzIodmFsdWUgfCAwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgYmIud3JpdGU4KDMpO1xuICAgICAgYmIud3JpdGUoZW5jb2RlVVRGOCh2YWx1ZSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICBiYi53cml0ZTgoNCk7XG4gICAgICBiYi53cml0ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBiYi53cml0ZTgoNSk7XG4gICAgICBiYi53cml0ZTMyKHZhbHVlLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHZpc2l0KGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGJiLndyaXRlOCg2KTtcbiAgICAgIGJiLndyaXRlMzIoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgYmIud3JpdGUoZW5jb2RlVVRGOChrZXkpKTtcbiAgICAgICAgdmlzaXQodmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBsZXQgYmIgPSBuZXcgQnl0ZUJ1ZmZlcigpO1xuICBiYi53cml0ZTMyKDApO1xuICBiYi53cml0ZTMyKHBhY2tldC5pZCA8PCAxIHwgKyFwYWNrZXQuaXNSZXF1ZXN0KTtcbiAgdmlzaXQocGFja2V0LnZhbHVlKTtcbiAgd3JpdGVVSW50MzJMRShiYi5idWYsIGJiLmxlbiAtIDQsIDApO1xuICByZXR1cm4gYmIuYnVmLnN1YmFycmF5KDAsIGJiLmxlbik7XG59XG5mdW5jdGlvbiBkZWNvZGVQYWNrZXQoYnl0ZXMpIHtcbiAgbGV0IHZpc2l0ID0gKCkgPT4ge1xuICAgIHN3aXRjaCAoYmIucmVhZDgoKSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuICEhYmIucmVhZDgoKTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIGJiLnJlYWQzMigpO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gZGVjb2RlVVRGOChiYi5yZWFkKCkpO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gYmIucmVhZCgpO1xuICAgICAgY2FzZSA1OiB7XG4gICAgICAgIGxldCBjb3VudCA9IGJiLnJlYWQzMigpO1xuICAgICAgICBsZXQgdmFsdWUyID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIHZhbHVlMi5wdXNoKHZpc2l0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTI7XG4gICAgICB9XG4gICAgICBjYXNlIDY6IHtcbiAgICAgICAgbGV0IGNvdW50ID0gYmIucmVhZDMyKCk7XG4gICAgICAgIGxldCB2YWx1ZTIgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFsdWUyW2RlY29kZVVURjgoYmIucmVhZCgpKV0gPSB2aXNpdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTI7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgICB9XG4gIH07XG4gIGxldCBiYiA9IG5ldyBCeXRlQnVmZmVyKGJ5dGVzKTtcbiAgbGV0IGlkID0gYmIucmVhZDMyKCk7XG4gIGxldCBpc1JlcXVlc3QgPSAoaWQgJiAxKSA9PT0gMDtcbiAgaWQgPj4+PSAxO1xuICBsZXQgdmFsdWUgPSB2aXNpdCgpO1xuICBpZiAoYmIucHRyICE9PSBieXRlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgfVxuICByZXR1cm4geyBpZCwgaXNSZXF1ZXN0LCB2YWx1ZSB9O1xufVxudmFyIEJ5dGVCdWZmZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGJ1ZiA9IG5ldyBVaW50OEFycmF5KDEwMjQpKSB7XG4gICAgdGhpcy5idWYgPSBidWY7XG4gICAgdGhpcy5sZW4gPSAwO1xuICAgIHRoaXMucHRyID0gMDtcbiAgfVxuICBfd3JpdGUoZGVsdGEpIHtcbiAgICBpZiAodGhpcy5sZW4gKyBkZWx0YSA+IHRoaXMuYnVmLmxlbmd0aCkge1xuICAgICAgbGV0IGNsb25lID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuICsgZGVsdGEpICogMik7XG4gICAgICBjbG9uZS5zZXQodGhpcy5idWYpO1xuICAgICAgdGhpcy5idWYgPSBjbG9uZTtcbiAgICB9XG4gICAgdGhpcy5sZW4gKz0gZGVsdGE7XG4gICAgcmV0dXJuIHRoaXMubGVuIC0gZGVsdGE7XG4gIH1cbiAgd3JpdGU4KHZhbHVlKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDEpO1xuICAgIHRoaXMuYnVmW29mZnNldF0gPSB2YWx1ZTtcbiAgfVxuICB3cml0ZTMyKHZhbHVlKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDQpO1xuICAgIHdyaXRlVUludDMyTEUodGhpcy5idWYsIHZhbHVlLCBvZmZzZXQpO1xuICB9XG4gIHdyaXRlKGJ5dGVzKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDQgKyBieXRlcy5sZW5ndGgpO1xuICAgIHdyaXRlVUludDMyTEUodGhpcy5idWYsIGJ5dGVzLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICB0aGlzLmJ1Zi5zZXQoYnl0ZXMsIG9mZnNldCArIDQpO1xuICB9XG4gIF9yZWFkKGRlbHRhKSB7XG4gICAgaWYgKHRoaXMucHRyICsgZGVsdGEgPiB0aGlzLmJ1Zi5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFja2V0XCIpO1xuICAgIH1cbiAgICB0aGlzLnB0ciArPSBkZWx0YTtcbiAgICByZXR1cm4gdGhpcy5wdHIgLSBkZWx0YTtcbiAgfVxuICByZWFkOCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZbdGhpcy5fcmVhZCgxKV07XG4gIH1cbiAgcmVhZDMyKCkge1xuICAgIHJldHVybiByZWFkVUludDMyTEUodGhpcy5idWYsIHRoaXMuX3JlYWQoNCkpO1xuICB9XG4gIHJlYWQoKSB7XG4gICAgbGV0IGxlbmd0aCA9IHRoaXMucmVhZDMyKCk7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICBsZXQgcHRyID0gdGhpcy5fcmVhZChieXRlcy5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldCh0aGlzLmJ1Zi5zdWJhcnJheShwdHIsIHB0ciArIGxlbmd0aCkpO1xuICAgIHJldHVybiBieXRlcztcbiAgfVxufTtcbnZhciBlbmNvZGVVVEY4O1xudmFyIGRlY29kZVVURjg7XG52YXIgZW5jb2RlSW52YXJpYW50O1xuaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgVGV4dERlY29kZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbGV0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgbGV0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgZW5jb2RlVVRGOCA9ICh0ZXh0KSA9PiBlbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgZGVjb2RlVVRGOCA9IChieXRlcykgPT4gZGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBlbmNvZGVJbnZhcmlhbnQgPSAnbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFwiXCIpJztcbn0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBlbmNvZGVVVEY4ID0gKHRleHQpID0+IEJ1ZmZlci5mcm9tKHRleHQpO1xuICBkZWNvZGVVVEY4ID0gKGJ5dGVzKSA9PiB7XG4gICAgbGV0IHsgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIH0gPSBieXRlcztcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKS50b1N0cmluZygpO1xuICB9O1xuICBlbmNvZGVJbnZhcmlhbnQgPSAnQnVmZmVyLmZyb20oXCJcIiknO1xufSBlbHNlIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiTm8gVVRGLTggY29kZWMgZm91bmRcIik7XG59XG5pZiAoIShlbmNvZGVVVEY4KFwiXCIpIGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gIHRocm93IG5ldyBFcnJvcihgSW52YXJpYW50IHZpb2xhdGlvbjogXCIke2VuY29kZUludmFyaWFudH0gaW5zdGFuY2VvZiBVaW50OEFycmF5XCIgaXMgaW5jb3JyZWN0bHkgZmFsc2VcblxuVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3VyIEphdmFTY3JpcHQgZW52aXJvbm1lbnQgaXMgYnJva2VuLiBZb3UgY2Fubm90IHVzZVxuZXNidWlsZCBpbiB0aGlzIGVudmlyb25tZW50IGJlY2F1c2UgZXNidWlsZCByZWxpZXMgb24gdGhpcyBpbnZhcmlhbnQuIFRoaXNcbmlzIG5vdCBhIHByb2JsZW0gd2l0aCBlc2J1aWxkLiBZb3UgbmVlZCB0byBmaXggeW91ciBlbnZpcm9ubWVudCBpbnN0ZWFkLlxuYCk7XG5mdW5jdGlvbiByZWFkVUludDMyTEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGJ1ZmZlcltvZmZzZXQrK10gfCBidWZmZXJbb2Zmc2V0KytdIDw8IDggfCBidWZmZXJbb2Zmc2V0KytdIDw8IDE2IHwgYnVmZmVyW29mZnNldCsrXSA8PCAyNDtcbn1cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZTtcbiAgYnVmZmVyW29mZnNldCsrXSA9IHZhbHVlID4+IDg7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiAxNjtcbiAgYnVmZmVyW29mZnNldCsrXSA9IHZhbHVlID4+IDI0O1xufVxuXG4vLyBsaWIvc2hhcmVkL2NvbW1vbi50c1xudmFyIHF1b3RlID0gSlNPTi5zdHJpbmdpZnk7XG52YXIgYnVpbGRMb2dMZXZlbERlZmF1bHQgPSBcIndhcm5pbmdcIjtcbnZhciB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQgPSBcInNpbGVudFwiO1xuZnVuY3Rpb24gdmFsaWRhdGVBbmRKb2luU3RyaW5nQXJyYXkodmFsdWVzLCB3aGF0KSB7XG4gIGNvbnN0IHRvSm9pbiA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIHZhbGlkYXRlU3RyaW5nVmFsdWUodmFsdWUsIHdoYXQpO1xuICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiLFwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt3aGF0fTogJHt2YWx1ZX1gKTtcbiAgICB0b0pvaW4ucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRvSm9pbi5qb2luKFwiLFwiKTtcbn1cbnZhciBjYW5CZUFueXRoaW5nID0gKCkgPT4gbnVsbDtcbnZhciBtdXN0QmVCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gbnVsbCA6IFwiYSBib29sZWFuXCI7XG52YXIgbXVzdEJlU3RyaW5nID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBudWxsIDogXCJhIHN0cmluZ1wiO1xudmFyIG11c3RCZVJlZ0V4cCA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyBudWxsIDogXCJhIFJlZ0V4cCBvYmplY3RcIjtcbnZhciBtdXN0QmVJbnRlZ2VyID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgPT09ICh2YWx1ZSB8IDApID8gbnVsbCA6IFwiYW4gaW50ZWdlclwiO1xudmFyIG11c3RCZVZhbGlkUG9ydE51bWJlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID09PSAodmFsdWUgfCAwKSAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY1NTM1ID8gbnVsbCA6IFwiYSB2YWxpZCBwb3J0IG51bWJlclwiO1xudmFyIG11c3RCZUZ1bmN0aW9uID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IG51bGwgOiBcImEgZnVuY3Rpb25cIjtcbnZhciBtdXN0QmVBcnJheSA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBhcnJheVwiO1xudmFyIG11c3RCZUFycmF5T2ZTdHJpbmdzID0gKHZhbHVlKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpID8gbnVsbCA6IFwiYW4gYXJyYXkgb2Ygc3RyaW5nc1wiO1xudmFyIG11c3RCZU9iamVjdCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImFuIG9iamVjdFwiO1xudmFyIG11c3RCZUVudHJ5UG9pbnRzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgPyBudWxsIDogXCJhbiBhcnJheSBvciBhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVXZWJBc3NlbWJseU1vZHVsZSA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5Nb2R1bGUgPyBudWxsIDogXCJhIFdlYkFzc2VtYmx5Lk1vZHVsZVwiO1xudmFyIG11c3RCZU9iamVjdE9yTnVsbCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImFuIG9iamVjdCBvciBudWxsXCI7XG52YXIgbXVzdEJlU3RyaW5nT3JCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGEgYm9vbGVhblwiO1xudmFyIG11c3RCZVN0cmluZ09yT2JqZWN0ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGFuIG9iamVjdFwiO1xudmFyIG11c3RCZVN0cmluZ09yQXJyYXlPZlN0cmluZ3MgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpID8gbnVsbCA6IFwiYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1wiO1xudmFyIG11c3RCZVN0cmluZ09yVWludDhBcnJheSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGEgVWludDhBcnJheVwiO1xudmFyIG11c3RCZVN0cmluZ09yVVJMID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBVUkwgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIFVSTFwiO1xuZnVuY3Rpb24gZ2V0RmxhZyhvYmplY3QsIGtleXMsIGtleSwgbXVzdEJlRm4pIHtcbiAgbGV0IHZhbHVlID0gb2JqZWN0W2tleV07XG4gIGtleXNba2V5ICsgXCJcIl0gPSB0cnVlO1xuICBpZiAodmFsdWUgPT09IHZvaWQgMCkgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IG11c3RCZSA9IG11c3RCZUZuKHZhbHVlKTtcbiAgaWYgKG11c3RCZSAhPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGAke3F1b3RlKGtleSl9IG11c3QgYmUgJHttdXN0QmV9YCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9iamVjdCwga2V5cywgd2hlcmUpIHtcbiAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSBpbiBrZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbiAke3doZXJlfTogJHtxdW90ZShrZXkpfWApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVJbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKSB7XG4gIGxldCBrZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGxldCB3YXNtVVJMID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIndhc21VUkxcIiwgbXVzdEJlU3RyaW5nT3JVUkwpO1xuICBsZXQgd2FzbU1vZHVsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3YXNtTW9kdWxlXCIsIG11c3RCZVdlYkFzc2VtYmx5TW9kdWxlKTtcbiAgbGV0IHdvcmtlciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3b3JrZXJcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIFwiaW4gaW5pdGlhbGl6ZSgpIGNhbGxcIik7XG4gIHJldHVybiB7XG4gICAgd2FzbVVSTCxcbiAgICB3YXNtTW9kdWxlLFxuICAgIHdvcmtlclxuICB9O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYW5nbGVDYWNoZShtYW5nbGVDYWNoZSkge1xuICBsZXQgdmFsaWRhdGVkO1xuICBpZiAobWFuZ2xlQ2FjaGUgIT09IHZvaWQgMCkge1xuICAgIHZhbGlkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGtleSBpbiBtYW5nbGVDYWNoZSkge1xuICAgICAgbGV0IHZhbHVlID0gbWFuZ2xlQ2FjaGVba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHZhbGlkYXRlZFtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cXVvdGUoa2V5KX0gaW4gbWFuZ2xlIGNhY2hlIHRvIG1hcCB0byBlaXRoZXIgYSBzdHJpbmcgb3IgZmFsc2VgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn1cbmZ1bmN0aW9uIHB1c2hMb2dGbGFncyhmbGFncywgb3B0aW9ucywga2V5cywgaXNUVFkyLCBsb2dMZXZlbERlZmF1bHQpIHtcbiAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbG9nTGV2ZWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nTGV2ZWxcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxvZ0xpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ0xpbWl0XCIsIG11c3RCZUludGVnZXIpO1xuICBpZiAoY29sb3IgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1jb2xvcj0ke2NvbG9yfWApO1xuICBlbHNlIGlmIChpc1RUWTIpIGZsYWdzLnB1c2goYC0tY29sb3I9dHJ1ZWApO1xuICBmbGFncy5wdXNoKGAtLWxvZy1sZXZlbD0ke2xvZ0xldmVsIHx8IGxvZ0xldmVsRGVmYXVsdH1gKTtcbiAgZmxhZ3MucHVzaChgLS1sb2ctbGltaXQ9JHtsb2dMaW1pdCB8fCAwfWApO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdWYWx1ZSh2YWx1ZSwgd2hhdCwga2V5KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHZhbHVlIGZvciAke3doYXR9JHtrZXkgIT09IHZvaWQgMCA/IFwiIFwiICsgcXVvdGUoa2V5KSA6IFwiXCJ9IHRvIGJlIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGluc3RlYWRgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpIHtcbiAgbGV0IGxlZ2FsQ29tbWVudHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibGVnYWxDb21tZW50c1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc291cmNlUm9vdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VSb290XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzb3VyY2VzQ29udGVudCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VzQ29udGVudFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHRhcmdldCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0YXJnZXRcIiwgbXVzdEJlU3RyaW5nT3JBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBmb3JtYXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZm9ybWF0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBnbG9iYWxOYW1lID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImdsb2JhbE5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG1hbmdsZVByb3BzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1hbmdsZVByb3BzXCIsIG11c3RCZVJlZ0V4cCk7XG4gIGxldCByZXNlcnZlUHJvcHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicmVzZXJ2ZVByb3BzXCIsIG11c3RCZVJlZ0V4cCk7XG4gIGxldCBtYW5nbGVRdW90ZWQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlUXVvdGVkXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWluaWZ5ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeVN5bnRheCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtaW5pZnlTeW50YXhcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnlXaGl0ZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVdoaXRlc3BhY2VcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnlJZGVudGlmaWVycyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtaW5pZnlJZGVudGlmaWVyc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGxpbmVMaW1pdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJsaW5lTGltaXRcIiwgbXVzdEJlSW50ZWdlcik7XG4gIGxldCBkcm9wID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRyb3BcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgZHJvcExhYmVscyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJkcm9wTGFiZWxzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGNoYXJzZXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY2hhcnNldFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgdHJlZVNoYWtpbmcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidHJlZVNoYWtpbmdcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBpZ25vcmVBbm5vdGF0aW9ucyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJpZ25vcmVBbm5vdGF0aW9uc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGpzeCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeEZhY3RvcnkgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwianN4RmFjdG9yeVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RnJhZ21lbnQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwianN4RnJhZ21lbnRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeEltcG9ydFNvdXJjZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hJbXBvcnRTb3VyY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeERldiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hEZXZcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBqc3hTaWRlRWZmZWN0cyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hTaWRlRWZmZWN0c1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGRlZmluZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJkZWZpbmVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGxvZ092ZXJyaWRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ092ZXJyaWRlXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBzdXBwb3J0ZWQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3VwcG9ydGVkXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBwdXJlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInB1cmVcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQga2VlcE5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImtlZXBOYW1lc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHBsYXRmb3JtID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInBsYXRmb3JtXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0c2NvbmZpZ1JhdyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0c2NvbmZpZ1Jhd1wiLCBtdXN0QmVTdHJpbmdPck9iamVjdCk7XG4gIGxldCBhYnNQYXRocyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhYnNQYXRoc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGlmIChsZWdhbENvbW1lbnRzKSBmbGFncy5wdXNoKGAtLWxlZ2FsLWNvbW1lbnRzPSR7bGVnYWxDb21tZW50c31gKTtcbiAgaWYgKHNvdXJjZVJvb3QgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1zb3VyY2Utcm9vdD0ke3NvdXJjZVJvb3R9YCk7XG4gIGlmIChzb3VyY2VzQ29udGVudCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXNvdXJjZXMtY29udGVudD0ke3NvdXJjZXNDb250ZW50fWApO1xuICBpZiAodGFyZ2V0KSBmbGFncy5wdXNoKGAtLXRhcmdldD0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLCBcInRhcmdldFwiKX1gKTtcbiAgaWYgKGZvcm1hdCkgZmxhZ3MucHVzaChgLS1mb3JtYXQ9JHtmb3JtYXR9YCk7XG4gIGlmIChnbG9iYWxOYW1lKSBmbGFncy5wdXNoKGAtLWdsb2JhbC1uYW1lPSR7Z2xvYmFsTmFtZX1gKTtcbiAgaWYgKHBsYXRmb3JtKSBmbGFncy5wdXNoKGAtLXBsYXRmb3JtPSR7cGxhdGZvcm19YCk7XG4gIGlmICh0c2NvbmZpZ1JhdykgZmxhZ3MucHVzaChgLS10c2NvbmZpZy1yYXc9JHt0eXBlb2YgdHNjb25maWdSYXcgPT09IFwic3RyaW5nXCIgPyB0c2NvbmZpZ1JhdyA6IEpTT04uc3RyaW5naWZ5KHRzY29uZmlnUmF3KX1gKTtcbiAgaWYgKG1pbmlmeSkgZmxhZ3MucHVzaChcIi0tbWluaWZ5XCIpO1xuICBpZiAobWluaWZ5U3ludGF4KSBmbGFncy5wdXNoKFwiLS1taW5pZnktc3ludGF4XCIpO1xuICBpZiAobWluaWZ5V2hpdGVzcGFjZSkgZmxhZ3MucHVzaChcIi0tbWluaWZ5LXdoaXRlc3BhY2VcIik7XG4gIGlmIChtaW5pZnlJZGVudGlmaWVycykgZmxhZ3MucHVzaChcIi0tbWluaWZ5LWlkZW50aWZpZXJzXCIpO1xuICBpZiAobGluZUxpbWl0KSBmbGFncy5wdXNoKGAtLWxpbmUtbGltaXQ9JHtsaW5lTGltaXR9YCk7XG4gIGlmIChjaGFyc2V0KSBmbGFncy5wdXNoKGAtLWNoYXJzZXQ9JHtjaGFyc2V0fWApO1xuICBpZiAodHJlZVNoYWtpbmcgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS10cmVlLXNoYWtpbmc9JHt0cmVlU2hha2luZ31gKTtcbiAgaWYgKGlnbm9yZUFubm90YXRpb25zKSBmbGFncy5wdXNoKGAtLWlnbm9yZS1hbm5vdGF0aW9uc2ApO1xuICBpZiAoZHJvcCkgZm9yIChsZXQgd2hhdCBvZiBkcm9wKSBmbGFncy5wdXNoKGAtLWRyb3A6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKHdoYXQsIFwiZHJvcFwiKX1gKTtcbiAgaWYgKGRyb3BMYWJlbHMpIGZsYWdzLnB1c2goYC0tZHJvcC1sYWJlbHM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShkcm9wTGFiZWxzLCBcImRyb3AgbGFiZWxcIil9YCk7XG4gIGlmIChhYnNQYXRocykgZmxhZ3MucHVzaChgLS1hYnMtcGF0aHM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShhYnNQYXRocywgXCJhYnMgcGF0aHNcIil9YCk7XG4gIGlmIChtYW5nbGVQcm9wcykgZmxhZ3MucHVzaChgLS1tYW5nbGUtcHJvcHM9JHtqc1JlZ0V4cFRvR29SZWdFeHAobWFuZ2xlUHJvcHMpfWApO1xuICBpZiAocmVzZXJ2ZVByb3BzKSBmbGFncy5wdXNoKGAtLXJlc2VydmUtcHJvcHM9JHtqc1JlZ0V4cFRvR29SZWdFeHAocmVzZXJ2ZVByb3BzKX1gKTtcbiAgaWYgKG1hbmdsZVF1b3RlZCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLW1hbmdsZS1xdW90ZWQ9JHttYW5nbGVRdW90ZWR9YCk7XG4gIGlmIChqc3gpIGZsYWdzLnB1c2goYC0tanN4PSR7anN4fWApO1xuICBpZiAoanN4RmFjdG9yeSkgZmxhZ3MucHVzaChgLS1qc3gtZmFjdG9yeT0ke2pzeEZhY3Rvcnl9YCk7XG4gIGlmIChqc3hGcmFnbWVudCkgZmxhZ3MucHVzaChgLS1qc3gtZnJhZ21lbnQ9JHtqc3hGcmFnbWVudH1gKTtcbiAgaWYgKGpzeEltcG9ydFNvdXJjZSkgZmxhZ3MucHVzaChgLS1qc3gtaW1wb3J0LXNvdXJjZT0ke2pzeEltcG9ydFNvdXJjZX1gKTtcbiAgaWYgKGpzeERldikgZmxhZ3MucHVzaChgLS1qc3gtZGV2YCk7XG4gIGlmIChqc3hTaWRlRWZmZWN0cykgZmxhZ3MucHVzaChgLS1qc3gtc2lkZS1lZmZlY3RzYCk7XG4gIGlmIChkZWZpbmUpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmaW5lKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZWZpbmU6ICR7a2V5fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1kZWZpbmU6JHtrZXl9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShkZWZpbmVba2V5XSwgXCJkZWZpbmVcIiwga2V5KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGxvZ092ZXJyaWRlKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGxvZ092ZXJyaWRlKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2cgb3ZlcnJpZGU6ICR7a2V5fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1sb2ctb3ZlcnJpZGU6JHtrZXl9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShsb2dPdmVycmlkZVtrZXldLCBcImxvZyBvdmVycmlkZVwiLCBrZXkpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoc3VwcG9ydGVkKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHN1cHBvcnRlZCkge1xuICAgICAgaWYgKGtleS5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3VwcG9ydGVkOiAke2tleX1gKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VwcG9ydGVkW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB2YWx1ZSBmb3Igc3VwcG9ydGVkICR7cXVvdGUoa2V5KX0gdG8gYmUgYSBib29sZWFuLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGluc3RlYWRgKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tc3VwcG9ydGVkOiR7a2V5fT0ke3ZhbHVlfWApO1xuICAgIH1cbiAgfVxuICBpZiAocHVyZSkgZm9yIChsZXQgZm4gb2YgcHVyZSkgZmxhZ3MucHVzaChgLS1wdXJlOiR7dmFsaWRhdGVTdHJpbmdWYWx1ZShmbiwgXCJwdXJlXCIpfWApO1xuICBpZiAoa2VlcE5hbWVzKSBmbGFncy5wdXNoKGAtLWtlZXAtbmFtZXNgKTtcbn1cbmZ1bmN0aW9uIGZsYWdzRm9yQnVpbGRPcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWTIsIGxvZ0xldmVsRGVmYXVsdCwgd3JpdGVEZWZhdWx0KSB7XG4gIHZhciBfYTI7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgc3RkaW5Db250ZW50cyA9IG51bGw7XG4gIGxldCBzdGRpblJlc29sdmVEaXIgPSBudWxsO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KTtcbiAgcHVzaENvbW1vbkZsYWdzKGZsYWdzLCBvcHRpb25zLCBrZXlzKTtcbiAgbGV0IHNvdXJjZW1hcCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VtYXBcIiwgbXVzdEJlU3RyaW5nT3JCb29sZWFuKTtcbiAgbGV0IGJ1bmRsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJidW5kbGVcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBzcGxpdHRpbmcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3BsaXR0aW5nXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgcHJlc2VydmVTeW1saW5rcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJwcmVzZXJ2ZVN5bWxpbmtzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWV0YWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWV0YWZpbGVcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBvdXRmaWxlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dGZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG91dGRpciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJvdXRkaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG91dGJhc2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0YmFzZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgdHNjb25maWcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidHNjb25maWdcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHJlc29sdmVFeHRlbnNpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInJlc29sdmVFeHRlbnNpb25zXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IG5vZGVQYXRoc0lucHV0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm5vZGVQYXRoc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBtYWluRmllbGRzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1haW5GaWVsZHNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgY29uZGl0aW9ucyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb25kaXRpb25zXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGV4dGVybmFsID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImV4dGVybmFsXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IHBhY2thZ2VzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInBhY2thZ2VzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBhbGlhcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhbGlhc1wiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgbG9hZGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvYWRlclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgb3V0RXh0ZW5zaW9uID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dEV4dGVuc2lvblwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgcHVibGljUGF0aCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJwdWJsaWNQYXRoXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBlbnRyeU5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImVudHJ5TmFtZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGNodW5rTmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY2h1bmtOYW1lc1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgYXNzZXROYW1lcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhc3NldE5hbWVzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBpbmplY3QgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiaW5qZWN0XCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGJhbm5lciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJiYW5uZXJcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGZvb3RlciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJmb290ZXJcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGVudHJ5UG9pbnRzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImVudHJ5UG9pbnRzXCIsIG11c3RCZUVudHJ5UG9pbnRzKTtcbiAgbGV0IGFic1dvcmtpbmdEaXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiYWJzV29ya2luZ0RpclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc3RkaW4gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3RkaW5cIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHdyaXRlID0gKF9hMiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3cml0ZVwiLCBtdXN0QmVCb29sZWFuKSkgIT0gbnVsbCA/IF9hMiA6IHdyaXRlRGVmYXVsdDtcbiAgbGV0IGFsbG93T3ZlcndyaXRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsbG93T3ZlcndyaXRlXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAga2V5cy5wbHVnaW5zID0gdHJ1ZTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcCR7c291cmNlbWFwID09PSB0cnVlID8gXCJcIiA6IGA9JHtzb3VyY2VtYXB9YH1gKTtcbiAgaWYgKGJ1bmRsZSkgZmxhZ3MucHVzaChcIi0tYnVuZGxlXCIpO1xuICBpZiAoYWxsb3dPdmVyd3JpdGUpIGZsYWdzLnB1c2goXCItLWFsbG93LW92ZXJ3cml0ZVwiKTtcbiAgaWYgKHNwbGl0dGluZykgZmxhZ3MucHVzaChcIi0tc3BsaXR0aW5nXCIpO1xuICBpZiAocHJlc2VydmVTeW1saW5rcykgZmxhZ3MucHVzaChcIi0tcHJlc2VydmUtc3ltbGlua3NcIik7XG4gIGlmIChtZXRhZmlsZSkgZmxhZ3MucHVzaChgLS1tZXRhZmlsZWApO1xuICBpZiAob3V0ZmlsZSkgZmxhZ3MucHVzaChgLS1vdXRmaWxlPSR7b3V0ZmlsZX1gKTtcbiAgaWYgKG91dGRpcikgZmxhZ3MucHVzaChgLS1vdXRkaXI9JHtvdXRkaXJ9YCk7XG4gIGlmIChvdXRiYXNlKSBmbGFncy5wdXNoKGAtLW91dGJhc2U9JHtvdXRiYXNlfWApO1xuICBpZiAodHNjb25maWcpIGZsYWdzLnB1c2goYC0tdHNjb25maWc9JHt0c2NvbmZpZ31gKTtcbiAgaWYgKHBhY2thZ2VzKSBmbGFncy5wdXNoKGAtLXBhY2thZ2VzPSR7cGFja2FnZXN9YCk7XG4gIGlmIChyZXNvbHZlRXh0ZW5zaW9ucykgZmxhZ3MucHVzaChgLS1yZXNvbHZlLWV4dGVuc2lvbnM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShyZXNvbHZlRXh0ZW5zaW9ucywgXCJyZXNvbHZlIGV4dGVuc2lvblwiKX1gKTtcbiAgaWYgKHB1YmxpY1BhdGgpIGZsYWdzLnB1c2goYC0tcHVibGljLXBhdGg9JHtwdWJsaWNQYXRofWApO1xuICBpZiAoZW50cnlOYW1lcykgZmxhZ3MucHVzaChgLS1lbnRyeS1uYW1lcz0ke2VudHJ5TmFtZXN9YCk7XG4gIGlmIChjaHVua05hbWVzKSBmbGFncy5wdXNoKGAtLWNodW5rLW5hbWVzPSR7Y2h1bmtOYW1lc31gKTtcbiAgaWYgKGFzc2V0TmFtZXMpIGZsYWdzLnB1c2goYC0tYXNzZXQtbmFtZXM9JHthc3NldE5hbWVzfWApO1xuICBpZiAobWFpbkZpZWxkcykgZmxhZ3MucHVzaChgLS1tYWluLWZpZWxkcz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KG1haW5GaWVsZHMsIFwibWFpbiBmaWVsZFwiKX1gKTtcbiAgaWYgKGNvbmRpdGlvbnMpIGZsYWdzLnB1c2goYC0tY29uZGl0aW9ucz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGNvbmRpdGlvbnMsIFwiY29uZGl0aW9uXCIpfWApO1xuICBpZiAoZXh0ZXJuYWwpIGZvciAobGV0IG5hbWUgb2YgZXh0ZXJuYWwpIGZsYWdzLnB1c2goYC0tZXh0ZXJuYWw6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG5hbWUsIFwiZXh0ZXJuYWxcIil9YCk7XG4gIGlmIChhbGlhcykge1xuICAgIGZvciAobGV0IG9sZCBpbiBhbGlhcykge1xuICAgICAgaWYgKG9sZC5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBuYW1lIGluIGFsaWFzOiAke29sZH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYWxpYXM6JHtvbGR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShhbGlhc1tvbGRdLCBcImFsaWFzXCIsIG9sZCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChiYW5uZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGJhbm5lcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhbm5lciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGJhbm5lclt0eXBlXSwgXCJiYW5uZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGZvb3Rlcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvb3RlciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tZm9vdGVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZvb3Rlclt0eXBlXSwgXCJmb290ZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3QpIGZvciAobGV0IHBhdGgzIG9mIGluamVjdCkgZmxhZ3MucHVzaChgLS1pbmplY3Q6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKHBhdGgzLCBcImluamVjdFwiKX1gKTtcbiAgaWYgKGxvYWRlcikge1xuICAgIGZvciAobGV0IGV4dCBpbiBsb2FkZXIpIHtcbiAgICAgIGlmIChleHQuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxvYWRlciBleHRlbnNpb246ICR7ZXh0fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1sb2FkZXI6JHtleHR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShsb2FkZXJbZXh0XSwgXCJsb2FkZXJcIiwgZXh0KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKG91dEV4dGVuc2lvbikge1xuICAgIGZvciAobGV0IGV4dCBpbiBvdXRFeHRlbnNpb24pIHtcbiAgICAgIGlmIChleHQuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG91dCBleHRlbnNpb246ICR7ZXh0fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1vdXQtZXh0ZW5zaW9uOiR7ZXh0fT0ke3ZhbGlkYXRlU3RyaW5nVmFsdWUob3V0RXh0ZW5zaW9uW2V4dF0sIFwib3V0IGV4dGVuc2lvblwiLCBleHQpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW50cnlQb2ludHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeVBvaW50cykpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZW50cnlQb2ludHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGxldCBlbnRyeVBvaW50ID0gZW50cnlQb2ludHNbaV07XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlQb2ludCA9PT0gXCJvYmplY3RcIiAmJiBlbnRyeVBvaW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbGV0IGVudHJ5UG9pbnRLZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgbGV0IGlucHV0ID0gZ2V0RmxhZyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJpblwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBvdXRwdXQgPSBnZXRGbGFnKGVudHJ5UG9pbnQsIGVudHJ5UG9pbnRLZXlzLCBcIm91dFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKGVudHJ5UG9pbnQsIGVudHJ5UG9pbnRLZXlzLCBcImluIGVudHJ5IHBvaW50IGF0IGluZGV4IFwiICsgaSk7XG4gICAgICAgICAgaWYgKGlucHV0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcm9wZXJ0eSBcImluXCIgZm9yIGVudHJ5IHBvaW50IGF0IGluZGV4ICcgKyBpKTtcbiAgICAgICAgICBpZiAob3V0cHV0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcm9wZXJ0eSBcIm91dFwiIGZvciBlbnRyeSBwb2ludCBhdCBpbmRleCAnICsgaSk7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtvdXRwdXQsIGlucHV0XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtcIlwiLCB2YWxpZGF0ZVN0cmluZ1ZhbHVlKGVudHJ5UG9pbnQsIFwiZW50cnkgcG9pbnQgYXQgaW5kZXggXCIgKyBpKV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBlbnRyeVBvaW50cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsaWRhdGVTdHJpbmdWYWx1ZShlbnRyeVBvaW50c1trZXldLCBcImVudHJ5IHBvaW50XCIsIGtleSldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHN0ZGluKSB7XG4gICAgbGV0IHN0ZGluS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJjb250ZW50c1wiLCBtdXN0QmVTdHJpbmdPclVpbnQ4QXJyYXkpO1xuICAgIGxldCByZXNvbHZlRGlyID0gZ2V0RmxhZyhzdGRpbiwgc3RkaW5LZXlzLCBcInJlc29sdmVEaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgc291cmNlZmlsZSA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJzb3VyY2VmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IGxvYWRlcjIgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwibG9hZGVyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Moc3RkaW4sIHN0ZGluS2V5cywgJ2luIFwic3RkaW5cIiBvYmplY3QnKTtcbiAgICBpZiAoc291cmNlZmlsZSkgZmxhZ3MucHVzaChgLS1zb3VyY2VmaWxlPSR7c291cmNlZmlsZX1gKTtcbiAgICBpZiAobG9hZGVyMikgZmxhZ3MucHVzaChgLS1sb2FkZXI9JHtsb2FkZXIyfWApO1xuICAgIGlmIChyZXNvbHZlRGlyKSBzdGRpblJlc29sdmVEaXIgPSByZXNvbHZlRGlyO1xuICAgIGlmICh0eXBlb2YgY29udGVudHMgPT09IFwic3RyaW5nXCIpIHN0ZGluQ29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICBlbHNlIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHN0ZGluQ29udGVudHMgPSBjb250ZW50cztcbiAgfVxuICBsZXQgbm9kZVBhdGhzID0gW107XG4gIGlmIChub2RlUGF0aHNJbnB1dCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIG5vZGVQYXRoc0lucHV0KSB7XG4gICAgICB2YWx1ZSArPSBcIlwiO1xuICAgICAgbm9kZVBhdGhzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGVudHJpZXMsXG4gICAgZmxhZ3MsXG4gICAgd3JpdGUsXG4gICAgc3RkaW5Db250ZW50cyxcbiAgICBzdGRpblJlc29sdmVEaXIsXG4gICAgYWJzV29ya2luZ0RpcixcbiAgICBub2RlUGF0aHMsXG4gICAgbWFuZ2xlQ2FjaGU6IHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpXG4gIH07XG59XG5mdW5jdGlvbiBmbGFnc0ZvclRyYW5zZm9ybU9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KSB7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KTtcbiAgcHVzaENvbW1vbkZsYWdzKGZsYWdzLCBvcHRpb25zLCBrZXlzKTtcbiAgbGV0IHNvdXJjZW1hcCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VtYXBcIiwgbXVzdEJlU3RyaW5nT3JCb29sZWFuKTtcbiAgbGV0IHNvdXJjZWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic291cmNlZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbG9hZGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvYWRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgYmFubmVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJhbm5lclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgZm9vdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImZvb3RlclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcD0ke3NvdXJjZW1hcCA9PT0gdHJ1ZSA/IFwiZXh0ZXJuYWxcIiA6IHNvdXJjZW1hcH1gKTtcbiAgaWYgKHNvdXJjZWZpbGUpIGZsYWdzLnB1c2goYC0tc291cmNlZmlsZT0ke3NvdXJjZWZpbGV9YCk7XG4gIGlmIChsb2FkZXIpIGZsYWdzLnB1c2goYC0tbG9hZGVyPSR7bG9hZGVyfWApO1xuICBpZiAoYmFubmVyKSBmbGFncy5wdXNoKGAtLWJhbm5lcj0ke2Jhbm5lcn1gKTtcbiAgaWYgKGZvb3RlcikgZmxhZ3MucHVzaChgLS1mb290ZXI9JHtmb290ZXJ9YCk7XG4gIHJldHVybiB7XG4gICAgZmxhZ3MsXG4gICAgbWFuZ2xlQ2FjaGU6IHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDaGFubmVsKHN0cmVhbUluKSB7XG4gIGNvbnN0IHJlcXVlc3RDYWxsYmFja3NCeUtleSA9IHt9O1xuICBjb25zdCBjbG9zZURhdGEgPSB7IGRpZENsb3NlOiBmYWxzZSwgcmVhc29uOiBcIlwiIH07XG4gIGxldCByZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICBsZXQgbmV4dFJlcXVlc3RJRCA9IDA7XG4gIGxldCBuZXh0QnVpbGRLZXkgPSAwO1xuICBsZXQgc3Rkb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMTYgKiAxMDI0KTtcbiAgbGV0IHN0ZG91dFVzZWQgPSAwO1xuICBsZXQgcmVhZEZyb21TdGRvdXQgPSAoY2h1bmspID0+IHtcbiAgICBsZXQgbGltaXQgPSBzdGRvdXRVc2VkICsgY2h1bmsubGVuZ3RoO1xuICAgIGlmIChsaW1pdCA+IHN0ZG91dC5sZW5ndGgpIHtcbiAgICAgIGxldCBzd2FwID0gbmV3IFVpbnQ4QXJyYXkobGltaXQgKiAyKTtcbiAgICAgIHN3YXAuc2V0KHN0ZG91dCk7XG4gICAgICBzdGRvdXQgPSBzd2FwO1xuICAgIH1cbiAgICBzdGRvdXQuc2V0KGNodW5rLCBzdGRvdXRVc2VkKTtcbiAgICBzdGRvdXRVc2VkICs9IGNodW5rLmxlbmd0aDtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0ICsgNCA8PSBzdGRvdXRVc2VkKSB7XG4gICAgICBsZXQgbGVuZ3RoID0gcmVhZFVJbnQzMkxFKHN0ZG91dCwgb2Zmc2V0KTtcbiAgICAgIGlmIChvZmZzZXQgKyA0ICsgbGVuZ3RoID4gc3Rkb3V0VXNlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSA0O1xuICAgICAgaGFuZGxlSW5jb21pbmdQYWNrZXQoc3Rkb3V0LnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7XG4gICAgICBvZmZzZXQgKz0gbGVuZ3RoO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgc3Rkb3V0LmNvcHlXaXRoaW4oMCwgb2Zmc2V0LCBzdGRvdXRVc2VkKTtcbiAgICAgIHN0ZG91dFVzZWQgLT0gb2Zmc2V0O1xuICAgIH1cbiAgfTtcbiAgbGV0IGFmdGVyQ2xvc2UgPSAoZXJyb3IpID0+IHtcbiAgICBjbG9zZURhdGEuZGlkQ2xvc2UgPSB0cnVlO1xuICAgIGlmIChlcnJvcikgY2xvc2VEYXRhLnJlYXNvbiA9IFwiOiBcIiArIChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgICBjb25zdCB0ZXh0ID0gXCJUaGUgc2VydmljZSB3YXMgc3RvcHBlZFwiICsgY2xvc2VEYXRhLnJlYXNvbjtcbiAgICBmb3IgKGxldCBpZCBpbiByZXNwb25zZUNhbGxiYWNrcykge1xuICAgICAgcmVzcG9uc2VDYWxsYmFja3NbaWRdKHRleHQsIG51bGwpO1xuICAgIH1cbiAgICByZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICB9O1xuICBsZXQgc2VuZFJlcXVlc3QgPSAocmVmcywgdmFsdWUsIGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKGNsb3NlRGF0YS5kaWRDbG9zZSkgcmV0dXJuIGNhbGxiYWNrKFwiVGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmdcIiArIGNsb3NlRGF0YS5yZWFzb24sIG51bGwpO1xuICAgIGxldCBpZCA9IG5leHRSZXF1ZXN0SUQrKztcbiAgICByZXNwb25zZUNhbGxiYWNrc1tpZF0gPSAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHJlZnMpIHJlZnMudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChyZWZzKSByZWZzLnJlZigpO1xuICAgIHN0cmVhbUluLndyaXRlVG9TdGRpbihlbmNvZGVQYWNrZXQoeyBpZCwgaXNSZXF1ZXN0OiB0cnVlLCB2YWx1ZSB9KSk7XG4gIH07XG4gIGxldCBzZW5kUmVzcG9uc2UgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgaWYgKGNsb3NlRGF0YS5kaWRDbG9zZSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmdcIiArIGNsb3NlRGF0YS5yZWFzb24pO1xuICAgIHN0cmVhbUluLndyaXRlVG9TdGRpbihlbmNvZGVQYWNrZXQoeyBpZCwgaXNSZXF1ZXN0OiBmYWxzZSwgdmFsdWUgfSkpO1xuICB9O1xuICBsZXQgaGFuZGxlUmVxdWVzdCA9IGFzeW5jIChpZCwgcmVxdWVzdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVxdWVzdC5jb21tYW5kID09PSBcInBpbmdcIikge1xuICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmtleSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q2FsbGJhY2tzID0gcmVxdWVzdENhbGxiYWNrc0J5S2V5W3JlcXVlc3Qua2V5XTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVxdWVzdENhbGxiYWNrc1tyZXF1ZXN0LmNvbW1hbmRdO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCBjYWxsYmFjayhpZCwgcmVxdWVzdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbWFuZDogYCArIHJlcXVlc3QuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgbnVsbCwgdm9pZCAwLCBcIlwiKV07XG4gICAgICB0cnkge1xuICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHsgZXJyb3JzIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBsZXQgaXNGaXJzdFBhY2tldCA9IHRydWU7XG4gIGxldCBoYW5kbGVJbmNvbWluZ1BhY2tldCA9IChieXRlcykgPT4ge1xuICAgIGlmIChpc0ZpcnN0UGFja2V0KSB7XG4gICAgICBpc0ZpcnN0UGFja2V0ID0gZmFsc2U7XG4gICAgICBsZXQgYmluYXJ5VmVyc2lvbiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpO1xuICAgICAgaWYgKGJpbmFyeVZlcnNpb24gIT09IFwiMC4yNS4xMlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0YXJ0IHNlcnZpY2U6IEhvc3QgdmVyc2lvbiBcIiR7XCIwLjI1LjEyXCJ9XCIgZG9lcyBub3QgbWF0Y2ggYmluYXJ5IHZlcnNpb24gJHtxdW90ZShiaW5hcnlWZXJzaW9uKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhY2tldCA9IGRlY29kZVBhY2tldChieXRlcyk7XG4gICAgaWYgKHBhY2tldC5pc1JlcXVlc3QpIHtcbiAgICAgIGhhbmRsZVJlcXVlc3QocGFja2V0LmlkLCBwYWNrZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2FsbGJhY2sgPSByZXNwb25zZUNhbGxiYWNrc1twYWNrZXQuaWRdO1xuICAgICAgZGVsZXRlIHJlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldC5pZF07XG4gICAgICBpZiAocGFja2V0LnZhbHVlLmVycm9yKSBjYWxsYmFjayhwYWNrZXQudmFsdWUuZXJyb3IsIHt9KTtcbiAgICAgIGVsc2UgY2FsbGJhY2sobnVsbCwgcGFja2V0LnZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGxldCBidWlsZE9yQ29udGV4dCA9ICh7IGNhbGxOYW1lLCByZWZzLCBvcHRpb25zLCBpc1RUWTogaXNUVFkyLCBkZWZhdWx0V0Q6IGRlZmF1bHRXRDIsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBsZXQgcmVmQ291bnQgPSAwO1xuICAgIGNvbnN0IGJ1aWxkS2V5ID0gbmV4dEJ1aWxkS2V5Kys7XG4gICAgY29uc3QgcmVxdWVzdENhbGxiYWNrcyA9IHt9O1xuICAgIGNvbnN0IGJ1aWxkUmVmcyA9IHtcbiAgICAgIHJlZigpIHtcbiAgICAgICAgaWYgKCsrcmVmQ291bnQgPT09IDEpIHtcbiAgICAgICAgICBpZiAocmVmcykgcmVmcy5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVucmVmKCkge1xuICAgICAgICBpZiAoLS1yZWZDb3VudCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbYnVpbGRLZXldO1xuICAgICAgICAgIGlmIChyZWZzKSByZWZzLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3RDYWxsYmFja3NCeUtleVtidWlsZEtleV0gPSByZXF1ZXN0Q2FsbGJhY2tzO1xuICAgIGJ1aWxkUmVmcy5yZWYoKTtcbiAgICBidWlsZE9yQ29udGV4dEltcGwoXG4gICAgICBjYWxsTmFtZSxcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICBidWlsZFJlZnMsXG4gICAgICBzdHJlYW1JbixcbiAgICAgIHJlcXVlc3RDYWxsYmFja3MsXG4gICAgICBvcHRpb25zLFxuICAgICAgaXNUVFkyLFxuICAgICAgZGVmYXVsdFdEMixcbiAgICAgIChlcnIsIHJlcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBidWlsZFJlZnMudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH07XG4gIGxldCB0cmFuc2Zvcm0yID0gKHsgY2FsbE5hbWUsIHJlZnMsIGlucHV0LCBvcHRpb25zLCBpc1RUWTogaXNUVFkyLCBmczogZnMzLCBjYWxsYmFjayB9KSA9PiB7XG4gICAgY29uc3QgZGV0YWlscyA9IGNyZWF0ZU9iamVjdFN0YXNoKCk7XG4gICAgbGV0IHN0YXJ0ID0gKGlucHV0UGF0aCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIiAmJiAhKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaW5wdXQgdG8gXCJ0cmFuc2Zvcm1cIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheScpO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgIG1hbmdsZUNhY2hlXG4gICAgICAgIH0gPSBmbGFnc0ZvclRyYW5zZm9ybU9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZMiwgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0KTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29tbWFuZDogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBpbnB1dEZTOiBpbnB1dFBhdGggIT09IG51bGwsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0UGF0aCAhPT0gbnVsbCA/IGVuY29kZVVURjgoaW5wdXRQYXRoKSA6IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGVuY29kZVVURjgoaW5wdXQpIDogaW5wdXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLmVycm9ycywgZGV0YWlscyk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKTtcbiAgICAgICAgICBsZXQgb3V0c3RhbmRpbmcgPSAxO1xuICAgICAgICAgIGxldCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tb3V0c3RhbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXNwb25zZS5jb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogcmVzcG9uc2UubWFwLFxuICAgICAgICAgICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbGVnYWxDb21tZW50czogdm9pZCAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChcImxlZ2FsQ29tbWVudHNcIiBpbiByZXNwb25zZSkgcmVzdWx0LmxlZ2FsQ29tbWVudHMgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubGVnYWxDb21tZW50cztcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubWFuZ2xlQ2FjaGU7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBlcnJvcnMsIHdhcm5pbmdzKSwgbnVsbCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGVGUykge1xuICAgICAgICAgICAgb3V0c3RhbmRpbmcrKztcbiAgICAgICAgICAgIGZzMy5yZWFkRmlsZShyZXNwb25zZS5jb2RlLCAoZXJyLCBjb250ZW50cykgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5jb2RlID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLm1hcEZTKSB7XG4gICAgICAgICAgICBvdXRzdGFuZGluZysrO1xuICAgICAgICAgICAgZnMzLnJlYWRGaWxlKHJlc3BvbnNlLm1hcCwgKGVyciwgY29udGVudHMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVyciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubWFwID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVzaExvZ0ZsYWdzKGZsYWdzLCBvcHRpb25zLCB7fSwgaXNUVFkyLCB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgdm9pZCAwLCBcIlwiKTtcbiAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvciB9LCAoKSA9PiB7XG4gICAgICAgICAgZXJyb3IuZGV0YWlsID0gZGV0YWlscy5sb2FkKGVycm9yLmRldGFpbCk7XG4gICAgICAgICAgY2FsbGJhY2soZmFpbHVyZUVycm9yV2l0aExvZyhcIlRyYW5zZm9ybSBmYWlsZWRcIiwgW2Vycm9yXSwgW10pLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiB8fCBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmIGlucHV0Lmxlbmd0aCA+IDEwMjQgKiAxMDI0KSB7XG4gICAgICBsZXQgbmV4dCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAoKSA9PiBmczMud3JpdGVGaWxlKGlucHV0LCBuZXh0KTtcbiAgICB9XG4gICAgc3RhcnQobnVsbCk7XG4gIH07XG4gIGxldCBmb3JtYXRNZXNzYWdlczIgPSAoeyBjYWxsTmFtZSwgcmVmcywgbWVzc2FnZXMsIG9wdGlvbnMsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBzZWNvbmQgYXJndW1lbnQgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IGtleXMgPSB7fTtcbiAgICBsZXQga2luZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJraW5kXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICAgIGxldCB0ZXJtaW5hbFdpZHRoID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRlcm1pbmFsV2lkdGhcIiwgbXVzdEJlSW50ZWdlcik7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICAgIGlmIChraW5kID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcImtpbmRcIiBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBpZiAoa2luZCAhPT0gXCJlcnJvclwiICYmIGtpbmQgIT09IFwid2FybmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFwia2luZFwiIHRvIGJlIFwiZXJyb3JcIiBvciBcIndhcm5pbmdcIiBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBsZXQgcmVxdWVzdCA9IHtcbiAgICAgIGNvbW1hbmQ6IFwiZm9ybWF0LW1zZ3NcIixcbiAgICAgIG1lc3NhZ2VzOiBzYW5pdGl6ZU1lc3NhZ2VzKG1lc3NhZ2VzLCBcIm1lc3NhZ2VzXCIsIG51bGwsIFwiXCIsIHRlcm1pbmFsV2lkdGgpLFxuICAgICAgaXNXYXJuaW5nOiBraW5kID09PSBcIndhcm5pbmdcIlxuICAgIH07XG4gICAgaWYgKGNvbG9yICE9PSB2b2lkIDApIHJlcXVlc3QuY29sb3IgPSBjb2xvcjtcbiAgICBpZiAodGVybWluYWxXaWR0aCAhPT0gdm9pZCAwKSByZXF1ZXN0LnRlcm1pbmFsV2lkdGggPSB0ZXJtaW5hbFdpZHRoO1xuICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvciksIG51bGwpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UubWVzc2FnZXMpO1xuICAgIH0pO1xuICB9O1xuICBsZXQgYW5hbHl6ZU1ldGFmaWxlMiA9ICh7IGNhbGxOYW1lLCByZWZzLCBtZXRhZmlsZSwgb3B0aW9ucywgY2FsbGJhY2sgfSkgPT4ge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIG9wdGlvbnMgPSB7fTtcbiAgICBsZXQga2V5cyA9IHt9O1xuICAgIGxldCBjb2xvciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb2xvclwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBsZXQgdmVyYm9zZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ2ZXJib3NlXCIsIG11c3RCZUJvb2xlYW4pO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIGBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBsZXQgcmVxdWVzdCA9IHtcbiAgICAgIGNvbW1hbmQ6IFwiYW5hbHl6ZS1tZXRhZmlsZVwiLFxuICAgICAgbWV0YWZpbGVcbiAgICB9O1xuICAgIGlmIChjb2xvciAhPT0gdm9pZCAwKSByZXF1ZXN0LmNvbG9yID0gY29sb3I7XG4gICAgaWYgKHZlcmJvc2UgIT09IHZvaWQgMCkgcmVxdWVzdC52ZXJib3NlID0gdmVyYm9zZTtcbiAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLnJlc3VsdCk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgcmVhZEZyb21TdGRvdXQsXG4gICAgYWZ0ZXJDbG9zZSxcbiAgICBzZXJ2aWNlOiB7XG4gICAgICBidWlsZE9yQ29udGV4dCxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMixcbiAgICAgIGZvcm1hdE1lc3NhZ2VzOiBmb3JtYXRNZXNzYWdlczIsXG4gICAgICBhbmFseXplTWV0YWZpbGU6IGFuYWx5emVNZXRhZmlsZTJcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBidWlsZE9yQ29udGV4dEltcGwoY2FsbE5hbWUsIGJ1aWxkS2V5LCBzZW5kUmVxdWVzdCwgc2VuZFJlc3BvbnNlLCByZWZzLCBzdHJlYW1JbiwgcmVxdWVzdENhbGxiYWNrcywgb3B0aW9ucywgaXNUVFkyLCBkZWZhdWx0V0QyLCBjYWxsYmFjaykge1xuICBjb25zdCBkZXRhaWxzID0gY3JlYXRlT2JqZWN0U3Rhc2goKTtcbiAgY29uc3QgaXNDb250ZXh0ID0gY2FsbE5hbWUgPT09IFwiY29udGV4dFwiO1xuICBjb25zdCBoYW5kbGVFcnJvciA9IChlLCBwbHVnaW5OYW1lKSA9PiB7XG4gICAgY29uc3QgZmxhZ3MgPSBbXTtcbiAgICB0cnkge1xuICAgICAgcHVzaExvZ0ZsYWdzKGZsYWdzLCBvcHRpb25zLCB7fSwgaXNUVFkyLCBidWlsZExvZ0xldmVsRGVmYXVsdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIHZvaWQgMCwgcGx1Z2luTmFtZSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvcjogbWVzc2FnZSB9LCAoKSA9PiB7XG4gICAgICBtZXNzYWdlLmRldGFpbCA9IGRldGFpbHMubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKGlzQ29udGV4dCA/IFwiQ29udGV4dCBmYWlsZWRcIiA6IFwiQnVpbGQgZmFpbGVkXCIsIFttZXNzYWdlXSwgW10pLCBudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHBsdWdpbnM7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5wbHVnaW5zO1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKGBcInBsdWdpbnNcIiBtdXN0IGJlIGFuIGFycmF5YCksIFwiXCIpO1xuICAgICAgcGx1Z2lucyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RyZWFtSW4uaXNTeW5jKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKFwiQ2Fubm90IHVzZSBwbHVnaW5zIGluIHN5bmNocm9ub3VzIEFQSSBjYWxsc1wiKSwgXCJcIik7XG4gICAgaGFuZGxlUGx1Z2lucyhcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICByZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBsdWdpbnMsXG4gICAgICBkZXRhaWxzXG4gICAgKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykgcmV0dXJuIGhhbmRsZUVycm9yKHJlc3VsdC5lcnJvciwgcmVzdWx0LnBsdWdpbk5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVzdWx0LnJlcXVlc3RQbHVnaW5zLCByZXN1bHQucnVuT25FbmRDYWxsYmFja3MsIHJlc3VsdC5zY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlKSA9PiBoYW5kbGVFcnJvcihlLCBcIlwiKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYnVpbGRPckNvbnRleHRDb250aW51ZShudWxsLCAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSksICgpID0+IHtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVxdWVzdFBsdWdpbnMsIHJ1bk9uRW5kQ2FsbGJhY2tzLCBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcykge1xuICAgIGNvbnN0IHdyaXRlRGVmYXVsdCA9IHN0cmVhbUluLmhhc0ZTO1xuICAgIGNvbnN0IHtcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXIsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBtYW5nbGVDYWNoZVxuICAgIH0gPSBmbGFnc0ZvckJ1aWxkT3B0aW9ucyhjYWxsTmFtZSwgb3B0aW9ucywgaXNUVFkyLCBidWlsZExvZ0xldmVsRGVmYXVsdCwgd3JpdGVEZWZhdWx0KTtcbiAgICBpZiAod3JpdGUgJiYgIXN0cmVhbUluLmhhc0ZTKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIndyaXRlXCIgb3B0aW9uIGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgY29tbWFuZDogXCJidWlsZFwiLFxuICAgICAga2V5OiBidWlsZEtleSxcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXI6IGFic1dvcmtpbmdEaXIgfHwgZGVmYXVsdFdEMixcbiAgICAgIG5vZGVQYXRocyxcbiAgICAgIGNvbnRleHQ6IGlzQ29udGV4dFxuICAgIH07XG4gICAgaWYgKHJlcXVlc3RQbHVnaW5zKSByZXF1ZXN0LnBsdWdpbnMgPSByZXF1ZXN0UGx1Z2lucztcbiAgICBpZiAobWFuZ2xlQ2FjaGUpIHJlcXVlc3QubWFuZ2xlQ2FjaGUgPSBtYW5nbGVDYWNoZTtcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlVG9SZXN1bHQgPSAocmVzcG9uc2UsIGNhbGxiYWNrMikgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS5lcnJvcnMsIGRldGFpbHMpLFxuICAgICAgICB3YXJuaW5nczogcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKSxcbiAgICAgICAgb3V0cHV0RmlsZXM6IHZvaWQgMCxcbiAgICAgICAgbWV0YWZpbGU6IHZvaWQgMCxcbiAgICAgICAgbWFuZ2xlQ2FjaGU6IHZvaWQgMFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3JzID0gcmVzdWx0LmVycm9ycy5zbGljZSgpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxXYXJuaW5ncyA9IHJlc3VsdC53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgaWYgKHJlc3BvbnNlLm91dHB1dEZpbGVzKSByZXN1bHQub3V0cHV0RmlsZXMgPSByZXNwb25zZS5vdXRwdXRGaWxlcy5tYXAoY29udmVydE91dHB1dEZpbGVzKTtcbiAgICAgIGlmIChyZXNwb25zZS5tZXRhZmlsZSkgcmVzdWx0Lm1ldGFmaWxlID0gSlNPTi5wYXJzZShyZXNwb25zZS5tZXRhZmlsZSk7XG4gICAgICBpZiAocmVzcG9uc2UubWFuZ2xlQ2FjaGUpIHJlc3VsdC5tYW5nbGVDYWNoZSA9IHJlc3BvbnNlLm1hbmdsZUNhY2hlO1xuICAgICAgaWYgKHJlc3BvbnNlLndyaXRlVG9TdGRvdXQgIT09IHZvaWQgMCkgY29uc29sZS5sb2coZGVjb2RlVVRGOChyZXNwb25zZS53cml0ZVRvU3Rkb3V0KS5yZXBsYWNlKC9cXG4kLywgXCJcIikpO1xuICAgICAgcnVuT25FbmRDYWxsYmFja3MocmVzdWx0LCAob25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpID0+IHtcbiAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JzLmxlbmd0aCA+IDAgfHwgb25FbmRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZmFpbHVyZUVycm9yV2l0aExvZyhcIkJ1aWxkIGZhaWxlZFwiLCBvcmlnaW5hbEVycm9ycy5jb25jYXQob25FbmRFcnJvcnMpLCBvcmlnaW5hbFdhcm5pbmdzLmNvbmNhdChvbkVuZFdhcm5pbmdzKSk7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrMihlcnJvciwgbnVsbCwgb25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrMihudWxsLCByZXN1bHQsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgbGV0IGxhdGVzdFJlc3VsdFByb21pc2U7XG4gICAgbGV0IHByb3ZpZGVMYXRlc3RSZXN1bHQ7XG4gICAgaWYgKGlzQ29udGV4dClcbiAgICAgIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1lbmRcIl0gPSAoaWQsIHJlcXVlc3QyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBidWlsZFJlc3BvbnNlVG9SZXN1bHQocmVxdWVzdDIsIChlcnIsIHJlc3VsdCwgb25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGVycm9yczogb25FbmRFcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogb25FbmRXYXJuaW5nc1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHByb3ZpZGVMYXRlc3RSZXN1bHQpIHByb3ZpZGVMYXRlc3RSZXN1bHQoZXJyLCByZXN1bHQpO1xuICAgICAgICAgIGxhdGVzdFJlc3VsdFByb21pc2UgPSB2b2lkIDA7XG4gICAgICAgICAgcHJvdmlkZUxhdGVzdFJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGVycm9yKSwgbnVsbCk7XG4gICAgICBpZiAoIWlzQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gYnVpbGRSZXNwb25zZVRvUmVzdWx0KHJlc3BvbnNlLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcygpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiQ29udGV4dCBmYWlsZWRcIiwgcmVzcG9uc2UuZXJyb3JzLCByZXNwb25zZS53YXJuaW5ncyksIG51bGwpO1xuICAgICAgfVxuICAgICAgbGV0IGRpZERpc3Bvc2UgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgcmVidWlsZDogKCkgPT4ge1xuICAgICAgICAgIGlmICghbGF0ZXN0UmVzdWx0UHJvbWlzZSkgbGF0ZXN0UmVzdWx0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBzZXR0bGVQcm9taXNlO1xuICAgICAgICAgICAgcHJvdmlkZUxhdGVzdFJlc3VsdCA9IChlcnIsIHJlc3VsdDIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFzZXR0bGVQcm9taXNlKSBzZXR0bGVQcm9taXNlID0gKCkgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlc3VsdDIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJBbm90aGVyQnVpbGQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFwicmVidWlsZFwiLFxuICAgICAgICAgICAgICAgIGtleTogYnVpbGRLZXlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIsIHJlc3BvbnNlMikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcjIpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0bGVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBzZXR0bGVQcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJBbm90aGVyQnVpbGQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyaWdnZXJBbm90aGVyQnVpbGQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbGF0ZXN0UmVzdWx0UHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgICAgd2F0Y2g6IChvcHRpb25zMiA9IHt9KSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaWYgKCFzdHJlYW1Jbi5oYXNGUykgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIHRoZSBcIndhdGNoXCIgQVBJIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0ge307XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImRlbGF5XCIsIG11c3RCZUludGVnZXIpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMyLCBrZXlzLCBgaW4gd2F0Y2goKSBjYWxsYCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdDIgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcIndhdGNoXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZGVsYXkpIHJlcXVlc3QyLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcjIpIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICBlbHNlIHJlc29sdmUodm9pZCAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHNlcnZlOiAob3B0aW9uczIgPSB7fSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmICghc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSB0aGUgXCJzZXJ2ZVwiIEFQSSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcInBvcnRcIiwgbXVzdEJlVmFsaWRQb3J0TnVtYmVyKTtcbiAgICAgICAgICBjb25zdCBob3N0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJob3N0XCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgY29uc3Qgc2VydmVkaXIgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcInNlcnZlZGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgY29uc3Qga2V5ZmlsZSA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwia2V5ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGNlcnRmaWxlID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJjZXJ0ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJmYWxsYmFja1wiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGNvcnMgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImNvcnNcIiwgbXVzdEJlT2JqZWN0KTtcbiAgICAgICAgICBjb25zdCBvblJlcXVlc3QgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcIm9uUmVxdWVzdFwiLCBtdXN0QmVGdW5jdGlvbik7XG4gICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9uczIsIGtleXMsIGBpbiBzZXJ2ZSgpIGNhbGxgKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwic2VydmVcIixcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXksXG4gICAgICAgICAgICBvblJlcXVlc3Q6ICEhb25SZXF1ZXN0XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocG9ydCAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5wb3J0ID0gcG9ydDtcbiAgICAgICAgICBpZiAoaG9zdCAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5ob3N0ID0gaG9zdDtcbiAgICAgICAgICBpZiAoc2VydmVkaXIgIT09IHZvaWQgMCkgcmVxdWVzdDIuc2VydmVkaXIgPSBzZXJ2ZWRpcjtcbiAgICAgICAgICBpZiAoa2V5ZmlsZSAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5rZXlmaWxlID0ga2V5ZmlsZTtcbiAgICAgICAgICBpZiAoY2VydGZpbGUgIT09IHZvaWQgMCkgcmVxdWVzdDIuY2VydGZpbGUgPSBjZXJ0ZmlsZTtcbiAgICAgICAgICBpZiAoZmFsbGJhY2sgIT09IHZvaWQgMCkgcmVxdWVzdDIuZmFsbGJhY2sgPSBmYWxsYmFjaztcbiAgICAgICAgICBpZiAoY29ycykge1xuICAgICAgICAgICAgY29uc3QgY29yc0tleXMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGdldEZsYWcoY29ycywgY29yc0tleXMsIFwib3JpZ2luXCIsIG11c3RCZVN0cmluZ09yQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MoY29ycywgY29yc0tleXMsIGBvbiBcImNvcnNcIiBvYmplY3RgKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yaWdpbikpIHJlcXVlc3QyLmNvcnNPcmlnaW4gPSBvcmlnaW47XG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW4gIT09IHZvaWQgMCkgcmVxdWVzdDIuY29yc09yaWdpbiA9IFtvcmlnaW5dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKGVycm9yMiwgcmVzcG9uc2UyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IyKSByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihlcnJvcjIpKTtcbiAgICAgICAgICAgIGlmIChvblJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbGxiYWNrc1tcInNlcnZlLXJlcXVlc3RcIl0gPSAoaWQsIHJlcXVlc3QzKSA9PiB7XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0KHJlcXVlc3QzLmFyZ3MpO1xuICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShpZCwge30pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZTIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGlmIChkaWREaXNwb3NlKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJjYW5jZWxcIixcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGlmIChkaWREaXNwb3NlKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIGRpZERpc3Bvc2UgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJkaXNwb3NlXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MoKTtcbiAgICAgICAgICAgIHJlZnMudW5yZWYoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICByZWZzLnJlZigpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICB9KTtcbiAgfVxufVxudmFyIGhhbmRsZVBsdWdpbnMgPSBhc3luYyAoYnVpbGRLZXksIHNlbmRSZXF1ZXN0LCBzZW5kUmVzcG9uc2UsIHJlZnMsIHN0cmVhbUluLCByZXF1ZXN0Q2FsbGJhY2tzLCBpbml0aWFsT3B0aW9ucywgcGx1Z2lucywgZGV0YWlscykgPT4ge1xuICBsZXQgb25TdGFydENhbGxiYWNrcyA9IFtdO1xuICBsZXQgb25FbmRDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG9uUmVzb2x2ZUNhbGxiYWNrcyA9IHt9O1xuICBsZXQgb25Mb2FkQ2FsbGJhY2tzID0ge307XG4gIGxldCBvbkRpc3Bvc2VDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG5leHRDYWxsYmFja0lEID0gMDtcbiAgbGV0IGkgPSAwO1xuICBsZXQgcmVxdWVzdFBsdWdpbnMgPSBbXTtcbiAgbGV0IGlzU2V0dXBEb25lID0gZmFsc2U7XG4gIHBsdWdpbnMgPSBbLi4ucGx1Z2luc107XG4gIGZvciAobGV0IGl0ZW0gb2YgcGx1Z2lucykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgaWYgKHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBhdCBpbmRleCAke2l9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgY29uc3QgbmFtZSA9IGdldEZsYWcoaXRlbSwga2V5cywgXCJuYW1lXCIsIG11c3RCZVN0cmluZyk7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiIHx8IG5hbWUgPT09IFwiXCIpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGF0IGluZGV4ICR7aX0gaXMgbWlzc2luZyBhIG5hbWVgKTtcbiAgICB0cnkge1xuICAgICAgbGV0IHNldHVwID0gZ2V0RmxhZyhpdGVtLCBrZXlzLCBcInNldHVwXCIsIG11c3RCZUZ1bmN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2Ygc2V0dXAgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gaXMgbWlzc2luZyBhIHNldHVwIGZ1bmN0aW9uYCk7XG4gICAgICBjaGVja0ZvckludmFsaWRGbGFncyhpdGVtLCBrZXlzLCBgb24gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICBsZXQgcGx1Z2luID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBvblN0YXJ0OiBmYWxzZSxcbiAgICAgICAgb25FbmQ6IGZhbHNlLFxuICAgICAgICBvblJlc29sdmU6IFtdLFxuICAgICAgICBvbkxvYWQ6IFtdXG4gICAgICB9O1xuICAgICAgaSsrO1xuICAgICAgbGV0IHJlc29sdmUgPSAocGF0aDMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAoIWlzU2V0dXBEb25lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwicmVzb2x2ZVwiIGJlZm9yZSBwbHVnaW4gc2V0dXAgaGFzIGNvbXBsZXRlZCcpO1xuICAgICAgICBpZiAodHlwZW9mIHBhdGgzICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYXRoIHRvIHJlc29sdmUgbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICBsZXQga2V5czIgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInBsdWdpbk5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IGltcG9ydGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJpbXBvcnRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInJlc29sdmVEaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IGtpbmQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImtpbmRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInBsdWdpbkRhdGFcIiwgY2FuQmVBbnl0aGluZyk7XG4gICAgICAgIGxldCBpbXBvcnRBdHRyaWJ1dGVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJ3aXRoXCIsIG11c3RCZU9iamVjdCk7XG4gICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBcImluIHJlc29sdmUoKSBjYWxsXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJyZXNvbHZlXCIsXG4gICAgICAgICAgICBwYXRoOiBwYXRoMyxcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXksXG4gICAgICAgICAgICBwbHVnaW5OYW1lOiBuYW1lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsKSByZXF1ZXN0LnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChpbXBvcnRlciAhPSBudWxsKSByZXF1ZXN0LmltcG9ydGVyID0gaW1wb3J0ZXI7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSByZXF1ZXN0Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXF1ZXN0LnJlc29sdmVEaXIgPSByZXNvbHZlRGlyO1xuICAgICAgICAgIGlmIChraW5kICE9IG51bGwpIHJlcXVlc3Qua2luZCA9IGtpbmQ7XG4gICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoYE11c3Qgc3BlY2lmeSBcImtpbmRcIiB3aGVuIGNhbGxpbmcgXCJyZXNvbHZlXCJgKTtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXF1ZXN0LnBsdWdpbkRhdGEgPSBkZXRhaWxzLnN0b3JlKHBsdWdpbkRhdGEpO1xuICAgICAgICAgIGlmIChpbXBvcnRBdHRyaWJ1dGVzICE9IG51bGwpIHJlcXVlc3Qud2l0aCA9IHNhbml0aXplU3RyaW5nTWFwKGltcG9ydEF0dHJpYnV0ZXMsIFwid2l0aFwiKTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgIGVsc2UgcmVzb2x2ZTIoe1xuICAgICAgICAgICAgICBlcnJvcnM6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS5lcnJvcnMsIGRldGFpbHMpLFxuICAgICAgICAgICAgICB3YXJuaW5nczogcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKSxcbiAgICAgICAgICAgICAgcGF0aDogcmVzcG9uc2UucGF0aCxcbiAgICAgICAgICAgICAgZXh0ZXJuYWw6IHJlc3BvbnNlLmV4dGVybmFsLFxuICAgICAgICAgICAgICBzaWRlRWZmZWN0czogcmVzcG9uc2Uuc2lkZUVmZmVjdHMsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogcmVzcG9uc2UubmFtZXNwYWNlLFxuICAgICAgICAgICAgICBzdWZmaXg6IHJlc3BvbnNlLnN1ZmZpeCxcbiAgICAgICAgICAgICAgcGx1Z2luRGF0YTogZGV0YWlscy5sb2FkKHJlc3BvbnNlLnBsdWdpbkRhdGEpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IHByb21pc2UgPSBzZXR1cCh7XG4gICAgICAgIGluaXRpYWxPcHRpb25zLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICBvblN0YXJ0KGNhbGxiYWNrKSB7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWRUZXh0ID0gYFRoaXMgZXJyb3IgY2FtZSBmcm9tIHRoZSBcIm9uU3RhcnRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25TdGFydFwiKTtcbiAgICAgICAgICBvblN0YXJ0Q2FsbGJhY2tzLnB1c2goeyBuYW1lLCBjYWxsYmFjaywgbm90ZTogcmVnaXN0ZXJlZE5vdGUgfSk7XG4gICAgICAgICAgcGx1Z2luLm9uU3RhcnQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVuZChjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvbkVuZFwiIGNhbGxiYWNrIHJlZ2lzdGVyZWQgaGVyZTpgO1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkTm90ZSA9IGV4dHJhY3RDYWxsZXJWOChuZXcgRXJyb3IocmVnaXN0ZXJlZFRleHQpLCBzdHJlYW1JbiwgXCJvbkVuZFwiKTtcbiAgICAgICAgICBvbkVuZENhbGxiYWNrcy5wdXNoKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH0pO1xuICAgICAgICAgIHBsdWdpbi5vbkVuZCA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVzb2x2ZShvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvblJlc29sdmVcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25SZXNvbHZlXCIpO1xuICAgICAgICAgIGxldCBrZXlzMiA9IHt9O1xuICAgICAgICAgIGxldCBmaWx0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImZpbHRlclwiLCBtdXN0QmVSZWdFeHApO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBgaW4gb25SZXNvbHZlKCkgY2FsbCBmb3IgcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYG9uUmVzb2x2ZSgpIGNhbGwgaXMgbWlzc2luZyBhIGZpbHRlcmApO1xuICAgICAgICAgIGxldCBpZCA9IG5leHRDYWxsYmFja0lEKys7XG4gICAgICAgICAgb25SZXNvbHZlQ2FsbGJhY2tzW2lkXSA9IHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH07XG4gICAgICAgICAgcGx1Z2luLm9uUmVzb2x2ZS5wdXNoKHsgaWQsIGZpbHRlcjoganNSZWdFeHBUb0dvUmVnRXhwKGZpbHRlciksIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTG9hZChvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvbkxvYWRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25Mb2FkXCIpO1xuICAgICAgICAgIGxldCBrZXlzMiA9IHt9O1xuICAgICAgICAgIGxldCBmaWx0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImZpbHRlclwiLCBtdXN0QmVSZWdFeHApO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBgaW4gb25Mb2FkKCkgY2FsbCBmb3IgcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYG9uTG9hZCgpIGNhbGwgaXMgbWlzc2luZyBhIGZpbHRlcmApO1xuICAgICAgICAgIGxldCBpZCA9IG5leHRDYWxsYmFja0lEKys7XG4gICAgICAgICAgb25Mb2FkQ2FsbGJhY2tzW2lkXSA9IHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH07XG4gICAgICAgICAgcGx1Z2luLm9uTG9hZC5wdXNoKHsgaWQsIGZpbHRlcjoganNSZWdFeHBUb0dvUmVnRXhwKGZpbHRlciksIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRGlzcG9zZShjYWxsYmFjaykge1xuICAgICAgICAgIG9uRGlzcG9zZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXNidWlsZDogc3RyZWFtSW4uZXNidWlsZFxuICAgICAgfSk7XG4gICAgICBpZiAocHJvbWlzZSkgYXdhaXQgcHJvbWlzZTtcbiAgICAgIHJlcXVlc3RQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBlLCBwbHVnaW5OYW1lOiBuYW1lIH07XG4gICAgfVxuICB9XG4gIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1zdGFydFwiXSA9IGFzeW5jIChpZCwgcmVxdWVzdCkgPT4ge1xuICAgIGRldGFpbHMuY2xlYXIoKTtcbiAgICBsZXQgcmVzcG9uc2UgPSB7IGVycm9yczogW10sIHdhcm5pbmdzOiBbXSB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG9uU3RhcnRDYWxsYmFja3MubWFwKGFzeW5jICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjaygpO1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvblN0YXJ0KCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uU3RhcnQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycy5wdXNoKC4uLnNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MucHVzaCguLi5zYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlLmVycm9ycy5wdXNoKGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH07XG4gIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1yZXNvbHZlXCJdID0gYXN5bmMgKGlkLCByZXF1ZXN0KSA9PiB7XG4gICAgbGV0IHJlc3BvbnNlID0ge30sIG5hbWUgPSBcIlwiLCBjYWxsYmFjaywgbm90ZTtcbiAgICBmb3IgKGxldCBpZDIgb2YgcmVxdWVzdC5pZHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0gPSBvblJlc29sdmVDYWxsYmFja3NbaWQyXSk7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjayh7XG4gICAgICAgICAgcGF0aDogcmVxdWVzdC5wYXRoLFxuICAgICAgICAgIGltcG9ydGVyOiByZXF1ZXN0LmltcG9ydGVyLFxuICAgICAgICAgIG5hbWVzcGFjZTogcmVxdWVzdC5uYW1lc3BhY2UsXG4gICAgICAgICAgcmVzb2x2ZURpcjogcmVxdWVzdC5yZXNvbHZlRGlyLFxuICAgICAgICAgIGtpbmQ6IHJlcXVlc3Qua2luZCxcbiAgICAgICAgICBwbHVnaW5EYXRhOiBkZXRhaWxzLmxvYWQocmVxdWVzdC5wbHVnaW5EYXRhKSxcbiAgICAgICAgICB3aXRoOiByZXF1ZXN0LndpdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9uUmVzb2x2ZSgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfSB0byByZXR1cm4gYW4gb2JqZWN0YCk7XG4gICAgICAgICAgbGV0IGtleXMgPSB7fTtcbiAgICAgICAgICBsZXQgcGx1Z2luTmFtZSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcInBsdWdpbk5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgcGF0aDMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwYXRoXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IG5hbWVzcGFjZSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBzdWZmaXggPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJzdWZmaXhcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXh0ZXJuYWwgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJleHRlcm5hbFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICAgICAgICBsZXQgc2lkZUVmZmVjdHMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJzaWRlRWZmZWN0c1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgICAgICAgICBsZXQgcGx1Z2luRGF0YSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcInBsdWdpbkRhdGFcIiwgY2FuQmVBbnl0aGluZyk7XG4gICAgICAgICAgbGV0IGVycm9ycyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImVycm9yc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2FybmluZ3NcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXRjaEZpbGVzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hGaWxlc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gICAgICAgICAgbGV0IHdhdGNoRGlycyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhdGNoRGlyc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MocmVzdWx0LCBrZXlzLCBgZnJvbSBvblJlc29sdmUoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICByZXNwb25zZS5pZCA9IGlkMjtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTtcbiAgICAgICAgICBpZiAocGF0aDMgIT0gbnVsbCkgcmVzcG9uc2UucGF0aCA9IHBhdGgzO1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgcmVzcG9uc2UubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICAgIGlmIChzdWZmaXggIT0gbnVsbCkgcmVzcG9uc2Uuc3VmZml4ID0gc3VmZml4O1xuICAgICAgICAgIGlmIChleHRlcm5hbCAhPSBudWxsKSByZXNwb25zZS5leHRlcm5hbCA9IGV4dGVybmFsO1xuICAgICAgICAgIGlmIChzaWRlRWZmZWN0cyAhPSBudWxsKSByZXNwb25zZS5zaWRlRWZmZWN0cyA9IHNpZGVFZmZlY3RzO1xuICAgICAgICAgIGlmIChwbHVnaW5EYXRhICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbkRhdGEgPSBkZXRhaWxzLnN0b3JlKHBsdWdpbkRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkgcmVzcG9uc2UuZXJyb3JzID0gc2FuaXRpemVNZXNzYWdlcyhlcnJvcnMsIFwiZXJyb3JzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpIHJlc3BvbnNlLndhcm5pbmdzID0gc2FuaXRpemVNZXNzYWdlcyh3YXJuaW5ncywgXCJ3YXJuaW5nc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXRjaEZpbGVzICE9IG51bGwpIHJlc3BvbnNlLndhdGNoRmlsZXMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRmlsZXMsIFwid2F0Y2hGaWxlc1wiKTtcbiAgICAgICAgICBpZiAod2F0Y2hEaXJzICE9IG51bGwpIHJlc3BvbnNlLndhdGNoRGlycyA9IHNhbml0aXplU3RyaW5nQXJyYXkod2F0Y2hEaXJzLCBcIndhdGNoRGlyc1wiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXNwb25zZSA9IHsgaWQ6IGlkMiwgZXJyb3JzOiBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCBub3RlICYmIG5vdGUoKSwgbmFtZSldIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBzZW5kUmVzcG9uc2UoaWQsIHJlc3BvbnNlKTtcbiAgfTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLWxvYWRcIl0gPSBhc3luYyAoaWQsIHJlcXVlc3QpID0+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uTG9hZENhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICBzdWZmaXg6IHJlcXVlc3Quc3VmZml4LFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25Mb2FkKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImNvbnRlbnRzXCIsIG11c3RCZVN0cmluZ09yVWludDhBcnJheSk7XG4gICAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBsb2FkZXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJsb2FkZXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXJyb3JzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXJuaW5nc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhdGNoRmlsZXMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaEZpbGVzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBsZXQgd2F0Y2hEaXJzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hEaXJzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uTG9hZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIHJlc3BvbnNlLmlkID0gaWQyO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJlc3BvbnNlLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgIT0gbnVsbCkgcmVzcG9uc2UuY29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXNwb25zZS5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHJlc3BvbnNlLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycyA9IHNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSByZXNwb25zZS53YXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2F0Y2hGaWxlcyAhPSBudWxsKSByZXNwb25zZS53YXRjaEZpbGVzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaEZpbGVzLCBcIndhdGNoRmlsZXNcIik7XG4gICAgICAgICAgaWYgKHdhdGNoRGlycyAhPSBudWxsKSByZXNwb25zZS53YXRjaERpcnMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRGlycywgXCJ3YXRjaERpcnNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7IGlkOiBpZDIsIGVycm9yczogW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpXSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH07XG4gIGxldCBydW5PbkVuZENhbGxiYWNrcyA9IChyZXN1bHQsIGRvbmUpID0+IGRvbmUoW10sIFtdKTtcbiAgaWYgKG9uRW5kQ2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBydW5PbkVuZENhbGxiYWNrcyA9IChyZXN1bHQsIGRvbmUpID0+IHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uRW5kRXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IG9uRW5kV2FybmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0gb2Ygb25FbmRDYWxsYmFja3MpIHtcbiAgICAgICAgICBsZXQgbmV3RXJyb3JzO1xuICAgICAgICAgIGxldCBuZXdXYXJuaW5ncztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbkVuZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfSB0byByZXR1cm4gYW4gb2JqZWN0YCk7XG4gICAgICAgICAgICAgIGxldCBrZXlzID0ge307XG4gICAgICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHZhbHVlLCBrZXlzLCBcImVycm9yc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcodmFsdWUsIGtleXMsIFwid2FybmluZ3NcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyh2YWx1ZSwga2V5cywgYGZyb20gb25FbmQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKSBuZXdFcnJvcnMgPSBzYW5pdGl6ZU1lc3NhZ2VzKGVycm9ycywgXCJlcnJvcnNcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICAgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpIG5ld1dhcm5pbmdzID0gc2FuaXRpemVNZXNzYWdlcyh3YXJuaW5ncywgXCJ3YXJuaW5nc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG5ld0Vycm9ycyA9IFtleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIG5vdGUgJiYgbm90ZSgpLCBuYW1lKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdFcnJvcnMpIHtcbiAgICAgICAgICAgIG9uRW5kRXJyb3JzLnB1c2goLi4ubmV3RXJyb3JzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCguLi5uZXdFcnJvcnMpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdXYXJuaW5ncykge1xuICAgICAgICAgICAgb25FbmRXYXJuaW5ncy5wdXNoKC4uLm5ld1dhcm5pbmdzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKC4uLm5ld1dhcm5pbmdzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgfVxuICBsZXQgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjYiBvZiBvbkRpc3Bvc2VDYWxsYmFja3MpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoKSwgMCk7XG4gICAgfVxuICB9O1xuICBpc1NldHVwRG9uZSA9IHRydWU7XG4gIHJldHVybiB7XG4gICAgb2s6IHRydWUsXG4gICAgcmVxdWVzdFBsdWdpbnMsXG4gICAgcnVuT25FbmRDYWxsYmFja3MsXG4gICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3NcbiAgfTtcbn07XG5mdW5jdGlvbiBjcmVhdGVPYmplY3RTdGFzaCgpIHtcbiAgY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRJRCA9IDA7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBtYXAuY2xlYXIoKTtcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIHJldHVybiBtYXAuZ2V0KGlkKTtcbiAgICB9LFxuICAgIHN0b3JlKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgcmV0dXJuIC0xO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SUQrKztcbiAgICAgIG1hcC5zZXQoaWQsIHZhbHVlKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0Q2FsbGVyVjgoZSwgc3RyZWFtSW4sIGlkZW50KSB7XG4gIGxldCBub3RlO1xuICBsZXQgdHJpZWQgPSBmYWxzZTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAodHJpZWQpIHJldHVybiBub3RlO1xuICAgIHRyaWVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgbGV0IGxpbmVzID0gKGUuc3RhY2sgKyBcIlwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgIGxpbmVzLnNwbGljZSgxLCAxKTtcbiAgICAgIGxldCBsb2NhdGlvbiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpO1xuICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgIG5vdGUgPSB7IHRleHQ6IGUubWVzc2FnZSwgbG9jYXRpb24gfTtcbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBzdGFzaCwgbm90ZSwgcGx1Z2luTmFtZSkge1xuICBsZXQgdGV4dCA9IFwiSW50ZXJuYWwgZXJyb3JcIjtcbiAgbGV0IGxvY2F0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZXh0ID0gKGUgJiYgZS5tZXNzYWdlIHx8IGUpICsgXCJcIjtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgdHJ5IHtcbiAgICBsb2NhdGlvbiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpLCBcIlwiKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgcmV0dXJuIHsgaWQ6IFwiXCIsIHBsdWdpbk5hbWUsIHRleHQsIGxvY2F0aW9uLCBub3Rlczogbm90ZSA/IFtub3RlXSA6IFtdLCBkZXRhaWw6IHN0YXNoID8gc3Rhc2guc3RvcmUoZSkgOiAtMSB9O1xufVxuZnVuY3Rpb24gcGFyc2VTdGFja0xpbmVzVjgoc3RyZWFtSW4sIGxpbmVzLCBpZGVudCkge1xuICBsZXQgYXQgPSBcIiAgICBhdCBcIjtcbiAgaWYgKHN0cmVhbUluLnJlYWRGaWxlU3luYyAmJiAhbGluZXNbMF0uc3RhcnRzV2l0aChhdCkgJiYgbGluZXNbMV0uc3RhcnRzV2l0aChhdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoYXQpKSBjb250aW51ZTtcbiAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKGF0Lmxlbmd0aCk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXig/Om5ldyB8YXN5bmMgKT9cXFMrIFxcKCguKilcXCkkLy5leGVjKGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsaW5lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2ggPSAvXmV2YWwgYXQgXFxTKyBcXCgoLiopXFwpKD86LCBcXFMrOlxcZCs6XFxkKyk/JC8uZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbGluZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoID0gL14oXFxTKyk6KFxcZCspOihcXGQrKSQvLmV4ZWMobGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29udGVudHMgPSBzdHJlYW1Jbi5yZWFkRmlsZVN5bmMobWF0Y2hbMV0sIFwidXRmOFwiKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgbGluZVRleHQgPSBjb250ZW50cy5zcGxpdCgvXFxyXFxufFxccnxcXG58XFx1MjAyOHxcXHUyMDI5LylbK21hdGNoWzJdIC0gMV0gfHwgXCJcIjtcbiAgICAgICAgICBsZXQgY29sdW1uID0gK21hdGNoWzNdIC0gMTtcbiAgICAgICAgICBsZXQgbGVuZ3RoID0gbGluZVRleHQuc2xpY2UoY29sdW1uLCBjb2x1bW4gKyBpZGVudC5sZW5ndGgpID09PSBpZGVudCA/IGlkZW50Lmxlbmd0aCA6IDA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiBcImZpbGVcIixcbiAgICAgICAgICAgIGxpbmU6ICttYXRjaFsyXSxcbiAgICAgICAgICAgIGNvbHVtbjogZW5jb2RlVVRGOChsaW5lVGV4dC5zbGljZSgwLCBjb2x1bW4pKS5sZW5ndGgsXG4gICAgICAgICAgICBsZW5ndGg6IGVuY29kZVVURjgobGluZVRleHQuc2xpY2UoY29sdW1uLCBjb2x1bW4gKyBsZW5ndGgpKS5sZW5ndGgsXG4gICAgICAgICAgICBsaW5lVGV4dDogbGluZVRleHQgKyBcIlxcblwiICsgbGluZXMuc2xpY2UoMSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb246IFwiXCJcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZhaWx1cmVFcnJvcldpdGhMb2codGV4dCwgZXJyb3JzLCB3YXJuaW5ncykge1xuICBsZXQgbGltaXQgPSA1O1xuICB0ZXh0ICs9IGVycm9ycy5sZW5ndGggPCAxID8gXCJcIiA6IGAgd2l0aCAke2Vycm9ycy5sZW5ndGh9IGVycm9yJHtlcnJvcnMubGVuZ3RoIDwgMiA/IFwiXCIgOiBcInNcIn06YCArIGVycm9ycy5zbGljZSgwLCBsaW1pdCArIDEpLm1hcCgoZSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBsaW1pdCkgcmV0dXJuIFwiXFxuLi4uXCI7XG4gICAgaWYgKCFlLmxvY2F0aW9uKSByZXR1cm4gYFxuZXJyb3I6ICR7ZS50ZXh0fWA7XG4gICAgbGV0IHsgZmlsZSwgbGluZSwgY29sdW1uIH0gPSBlLmxvY2F0aW9uO1xuICAgIGxldCBwbHVnaW5UZXh0ID0gZS5wbHVnaW5OYW1lID8gYFtwbHVnaW46ICR7ZS5wbHVnaW5OYW1lfV0gYCA6IFwiXCI7XG4gICAgcmV0dXJuIGBcbiR7ZmlsZX06JHtsaW5lfToke2NvbHVtbn06IEVSUk9SOiAke3BsdWdpblRleHR9JHtlLnRleHR9YDtcbiAgfSkuam9pbihcIlwiKTtcbiAgbGV0IGVycm9yID0gbmV3IEVycm9yKHRleHQpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBbW1wiZXJyb3JzXCIsIGVycm9yc10sIFtcIndhcm5pbmdzXCIsIHdhcm5pbmdzXV0pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgICBzZXQ6ICh2YWx1ZTIpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlMlxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5mdW5jdGlvbiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMobWVzc2FnZXMsIHN0YXNoKSB7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIG1lc3NhZ2UuZGV0YWlsID0gc3Rhc2gubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzO1xufVxuZnVuY3Rpb24gc2FuaXRpemVMb2NhdGlvbihsb2NhdGlvbiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpIHtcbiAgaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBudWxsO1xuICBsZXQga2V5cyA9IHt9O1xuICBsZXQgZmlsZSA9IGdldEZsYWcobG9jYXRpb24sIGtleXMsIFwiZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhsb2NhdGlvbiwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxpbmUgPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImxpbmVcIiwgbXVzdEJlSW50ZWdlcik7XG4gIGxldCBjb2x1bW4gPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImNvbHVtblwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgbGV0IGxlbmd0aCA9IGdldEZsYWcobG9jYXRpb24sIGtleXMsIFwibGVuZ3RoXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGluZVRleHQgPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImxpbmVUZXh0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzdWdnZXN0aW9uID0gZ2V0RmxhZyhsb2NhdGlvbiwga2V5cywgXCJzdWdnZXN0aW9uXCIsIG11c3RCZVN0cmluZyk7XG4gIGNoZWNrRm9ySW52YWxpZEZsYWdzKGxvY2F0aW9uLCBrZXlzLCB3aGVyZSk7XG4gIGlmIChsaW5lVGV4dCkge1xuICAgIGNvbnN0IHJlbGV2YW50QVNDSUkgPSBsaW5lVGV4dC5zbGljZShcbiAgICAgIDAsXG4gICAgICAoY29sdW1uICYmIGNvbHVtbiA+IDAgPyBjb2x1bW4gOiAwKSArIChsZW5ndGggJiYgbGVuZ3RoID4gMCA/IGxlbmd0aCA6IDApICsgKHRlcm1pbmFsV2lkdGggJiYgdGVybWluYWxXaWR0aCA+IDAgPyB0ZXJtaW5hbFdpZHRoIDogODApXG4gICAgKTtcbiAgICBpZiAoIS9bXFx4N0YtXFx1RkZGRl0vLnRlc3QocmVsZXZhbnRBU0NJSSkgJiYgIS9cXG4vLnRlc3QobGluZVRleHQpKSB7XG4gICAgICBsaW5lVGV4dCA9IHJlbGV2YW50QVNDSUk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZTogZmlsZSB8fCBcIlwiLFxuICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIsXG4gICAgbGluZTogbGluZSB8fCAwLFxuICAgIGNvbHVtbjogY29sdW1uIHx8IDAsXG4gICAgbGVuZ3RoOiBsZW5ndGggfHwgMCxcbiAgICBsaW5lVGV4dDogbGluZVRleHQgfHwgXCJcIixcbiAgICBzdWdnZXN0aW9uOiBzdWdnZXN0aW9uIHx8IFwiXCJcbiAgfTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplTWVzc2FnZXMobWVzc2FnZXMsIHByb3BlcnR5LCBzdGFzaCwgZmFsbGJhY2tQbHVnaW5OYW1lLCB0ZXJtaW5hbFdpZHRoKSB7XG4gIGxldCBtZXNzYWdlc0Nsb25lID0gW107XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGlkID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImlkXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCB0ZXh0ID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgbG9jYXRpb24gPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwibG9jYXRpb25cIiwgbXVzdEJlT2JqZWN0T3JOdWxsKTtcbiAgICBsZXQgbm90ZXMgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwibm90ZXNcIiwgbXVzdEJlQXJyYXkpO1xuICAgIGxldCBkZXRhaWwgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwiZGV0YWlsXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgIGxldCB3aGVyZSA9IGBpbiBlbGVtZW50ICR7aW5kZXh9IG9mIFwiJHtwcm9wZXJ0eX1cImA7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MobWVzc2FnZSwga2V5cywgd2hlcmUpO1xuICAgIGxldCBub3Rlc0Nsb25lID0gW107XG4gICAgaWYgKG5vdGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgICAgbGV0IG5vdGVLZXlzID0ge307XG4gICAgICAgIGxldCBub3RlVGV4dCA9IGdldEZsYWcobm90ZSwgbm90ZUtleXMsIFwidGV4dFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgbm90ZUxvY2F0aW9uID0gZ2V0RmxhZyhub3RlLCBub3RlS2V5cywgXCJsb2NhdGlvblwiLCBtdXN0QmVPYmplY3RPck51bGwpO1xuICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhub3RlLCBub3RlS2V5cywgd2hlcmUpO1xuICAgICAgICBub3Rlc0Nsb25lLnB1c2goe1xuICAgICAgICAgIHRleHQ6IG5vdGVUZXh0IHx8IFwiXCIsXG4gICAgICAgICAgbG9jYXRpb246IHNhbml0aXplTG9jYXRpb24obm90ZUxvY2F0aW9uLCB3aGVyZSwgdGVybWluYWxXaWR0aClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIG1lc3NhZ2VzQ2xvbmUucHVzaCh7XG4gICAgICBpZDogaWQgfHwgXCJcIixcbiAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbk5hbWUgfHwgZmFsbGJhY2tQbHVnaW5OYW1lLFxuICAgICAgdGV4dDogdGV4dCB8fCBcIlwiLFxuICAgICAgbG9jYXRpb246IHNhbml0aXplTG9jYXRpb24obG9jYXRpb24sIHdoZXJlLCB0ZXJtaW5hbFdpZHRoKSxcbiAgICAgIG5vdGVzOiBub3Rlc0Nsb25lLFxuICAgICAgZGV0YWlsOiBzdGFzaCA/IHN0YXNoLnN0b3JlKGRldGFpbCkgOiAtMVxuICAgIH0pO1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzQ2xvbmU7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZ0FycmF5KHZhbHVlcywgcHJvcGVydHkpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKGAke3F1b3RlKHByb3BlcnR5KX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZ01hcChtYXAsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihga2V5ICR7cXVvdGUoa2V5KX0gaW4gb2JqZWN0ICR7cXVvdGUocHJvcGVydHkpfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29udmVydE91dHB1dEZpbGVzKHsgcGF0aDogcGF0aDMsIGNvbnRlbnRzLCBoYXNoIH0pIHtcbiAgbGV0IHRleHQgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIHBhdGg6IHBhdGgzLFxuICAgIGNvbnRlbnRzLFxuICAgIGhhc2gsXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmNvbnRlbnRzO1xuICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgYmluYXJ5ICE9PSBjb250ZW50cykge1xuICAgICAgICBjb250ZW50cyA9IGJpbmFyeTtcbiAgICAgICAgdGV4dCA9IGRlY29kZVVURjgoYmluYXJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGpzUmVnRXhwVG9Hb1JlZ0V4cChyZWdleHApIHtcbiAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5zb3VyY2U7XG4gIGlmIChyZWdleHAuZmxhZ3MpIHJlc3VsdCA9IGAoPyR7cmVnZXhwLmZsYWdzfSkke3Jlc3VsdH1gO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBsaWIvbnBtL25vZGUtcGxhdGZvcm0udHNcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbnZhciBvcyA9IHJlcXVpcmUoXCJvc1wiKTtcbnZhciBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG52YXIgRVNCVUlMRF9CSU5BUllfUEFUSCA9IHByb2Nlc3MuZW52LkVTQlVJTERfQklOQVJZX1BBVEggfHwgRVNCVUlMRF9CSU5BUllfUEFUSDtcbnZhciBpc1ZhbGlkQmluYXJ5UGF0aCA9ICh4KSA9PiAhIXggJiYgeCAhPT0gXCIvdXNyL2Jpbi9lc2J1aWxkXCI7XG52YXIgcGFja2FnZURhcndpbl9hcm02NCA9IFwiQGVzYnVpbGQvZGFyd2luLWFybTY0XCI7XG52YXIgcGFja2FnZURhcndpbl94NjQgPSBcIkBlc2J1aWxkL2Rhcndpbi14NjRcIjtcbnZhciBrbm93bldpbmRvd3NQYWNrYWdlcyA9IHtcbiAgXCJ3aW4zMiBhcm02NCBMRVwiOiBcIkBlc2J1aWxkL3dpbjMyLWFybTY0XCIsXG4gIFwid2luMzIgaWEzMiBMRVwiOiBcIkBlc2J1aWxkL3dpbjMyLWlhMzJcIixcbiAgXCJ3aW4zMiB4NjQgTEVcIjogXCJAZXNidWlsZC93aW4zMi14NjRcIlxufTtcbnZhciBrbm93blVuaXhsaWtlUGFja2FnZXMgPSB7XG4gIFwiYWl4IHBwYzY0IEJFXCI6IFwiQGVzYnVpbGQvYWl4LXBwYzY0XCIsXG4gIFwiYW5kcm9pZCBhcm02NCBMRVwiOiBcIkBlc2J1aWxkL2FuZHJvaWQtYXJtNjRcIixcbiAgXCJkYXJ3aW4gYXJtNjQgTEVcIjogXCJAZXNidWlsZC9kYXJ3aW4tYXJtNjRcIixcbiAgXCJkYXJ3aW4geDY0IExFXCI6IFwiQGVzYnVpbGQvZGFyd2luLXg2NFwiLFxuICBcImZyZWVic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9mcmVlYnNkLWFybTY0XCIsXG4gIFwiZnJlZWJzZCB4NjQgTEVcIjogXCJAZXNidWlsZC9mcmVlYnNkLXg2NFwiLFxuICBcImxpbnV4IGFybSBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LWFybVwiLFxuICBcImxpbnV4IGFybTY0IExFXCI6IFwiQGVzYnVpbGQvbGludXgtYXJtNjRcIixcbiAgXCJsaW51eCBpYTMyIExFXCI6IFwiQGVzYnVpbGQvbGludXgtaWEzMlwiLFxuICBcImxpbnV4IG1pcHM2NGVsIExFXCI6IFwiQGVzYnVpbGQvbGludXgtbWlwczY0ZWxcIixcbiAgXCJsaW51eCBwcGM2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXBwYzY0XCIsXG4gIFwibGludXggcmlzY3Y2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXJpc2N2NjRcIixcbiAgXCJsaW51eCBzMzkweCBCRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXMzOTB4XCIsXG4gIFwibGludXggeDY0IExFXCI6IFwiQGVzYnVpbGQvbGludXgteDY0XCIsXG4gIFwibGludXggbG9vbmc2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LWxvb25nNjRcIixcbiAgXCJuZXRic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9uZXRic2QtYXJtNjRcIixcbiAgXCJuZXRic2QgeDY0IExFXCI6IFwiQGVzYnVpbGQvbmV0YnNkLXg2NFwiLFxuICBcIm9wZW5ic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9vcGVuYnNkLWFybTY0XCIsXG4gIFwib3BlbmJzZCB4NjQgTEVcIjogXCJAZXNidWlsZC9vcGVuYnNkLXg2NFwiLFxuICBcInN1bm9zIHg2NCBMRVwiOiBcIkBlc2J1aWxkL3N1bm9zLXg2NFwiXG59O1xudmFyIGtub3duV2ViQXNzZW1ibHlGYWxsYmFja1BhY2thZ2VzID0ge1xuICBcImFuZHJvaWQgYXJtIExFXCI6IFwiQGVzYnVpbGQvYW5kcm9pZC1hcm1cIixcbiAgXCJhbmRyb2lkIHg2NCBMRVwiOiBcIkBlc2J1aWxkL2FuZHJvaWQteDY0XCIsXG4gIFwib3Blbmhhcm1vbnkgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9vcGVuaGFybW9ueS1hcm02NFwiXG59O1xuZnVuY3Rpb24gcGtnQW5kU3VicGF0aEZvckN1cnJlbnRQbGF0Zm9ybSgpIHtcbiAgbGV0IHBrZztcbiAgbGV0IHN1YnBhdGg7XG4gIGxldCBpc1dBU00gPSBmYWxzZTtcbiAgbGV0IHBsYXRmb3JtS2V5ID0gYCR7cHJvY2Vzcy5wbGF0Zm9ybX0gJHtvcy5hcmNoKCl9ICR7b3MuZW5kaWFubmVzcygpfWA7XG4gIGlmIChwbGF0Zm9ybUtleSBpbiBrbm93bldpbmRvd3NQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duV2luZG93c1BhY2thZ2VzW3BsYXRmb3JtS2V5XTtcbiAgICBzdWJwYXRoID0gXCJlc2J1aWxkLmV4ZVwiO1xuICB9IGVsc2UgaWYgKHBsYXRmb3JtS2V5IGluIGtub3duVW5peGxpa2VQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duVW5peGxpa2VQYWNrYWdlc1twbGF0Zm9ybUtleV07XG4gICAgc3VicGF0aCA9IFwiYmluL2VzYnVpbGRcIjtcbiAgfSBlbHNlIGlmIChwbGF0Zm9ybUtleSBpbiBrbm93bldlYkFzc2VtYmx5RmFsbGJhY2tQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duV2ViQXNzZW1ibHlGYWxsYmFja1BhY2thZ2VzW3BsYXRmb3JtS2V5XTtcbiAgICBzdWJwYXRoID0gXCJiaW4vZXNidWlsZFwiO1xuICAgIGlzV0FTTSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwbGF0Zm9ybTogJHtwbGF0Zm9ybUtleX1gKTtcbiAgfVxuICByZXR1cm4geyBwa2csIHN1YnBhdGgsIGlzV0FTTSB9O1xufVxuZnVuY3Rpb24gcGtnRm9yU29tZU90aGVyUGxhdGZvcm0oKSB7XG4gIGNvbnN0IGxpYk1haW5KUyA9IHJlcXVpcmUucmVzb2x2ZShcImVzYnVpbGRcIik7XG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUobGliTWFpbkpTKSkpO1xuICBpZiAocGF0aC5iYXNlbmFtZShub2RlTW9kdWxlc0RpcmVjdG9yeSkgPT09IFwibm9kZV9tb2R1bGVzXCIpIHtcbiAgICBmb3IgKGNvbnN0IHVuaXhLZXkgaW4ga25vd25Vbml4bGlrZVBhY2thZ2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBrbm93blVuaXhsaWtlUGFja2FnZXNbdW5peEtleV07XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihub2RlTW9kdWxlc0RpcmVjdG9yeSwgcGtnKSkpIHJldHVybiBwa2c7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB3aW5kb3dzS2V5IGluIGtub3duV2luZG93c1BhY2thZ2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBrbm93bldpbmRvd3NQYWNrYWdlc1t3aW5kb3dzS2V5XTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKG5vZGVNb2R1bGVzRGlyZWN0b3J5LCBwa2cpKSkgcmV0dXJuIHBrZztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRvd25sb2FkZWRCaW5QYXRoKHBrZywgc3VicGF0aCkge1xuICBjb25zdCBlc2J1aWxkTGliRGlyID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcImVzYnVpbGRcIikpO1xuICByZXR1cm4gcGF0aC5qb2luKGVzYnVpbGRMaWJEaXIsIGBkb3dubG9hZGVkLSR7cGtnLnJlcGxhY2UoXCIvXCIsIFwiLVwiKX0tJHtwYXRoLmJhc2VuYW1lKHN1YnBhdGgpfWApO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVCaW5QYXRoKCkge1xuICBpZiAoaXNWYWxpZEJpbmFyeVBhdGgoRVNCVUlMRF9CSU5BUllfUEFUSCkpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoRVNCVUlMRF9CSU5BUllfUEFUSCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2VzYnVpbGRdIElnbm9yaW5nIGJhZCBjb25maWd1cmF0aW9uOiBFU0JVSUxEX0JJTkFSWV9QQVRIPSR7RVNCVUlMRF9CSU5BUllfUEFUSH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgYmluUGF0aDogRVNCVUlMRF9CSU5BUllfUEFUSCwgaXNXQVNNOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuICBjb25zdCB7IHBrZywgc3VicGF0aCwgaXNXQVNNIH0gPSBwa2dBbmRTdWJwYXRoRm9yQ3VycmVudFBsYXRmb3JtKCk7XG4gIGxldCBiaW5QYXRoO1xuICB0cnkge1xuICAgIGJpblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS8ke3N1YnBhdGh9YCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBiaW5QYXRoID0gZG93bmxvYWRlZEJpblBhdGgocGtnLCBzdWJwYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZShwa2cpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IG90aGVyUGtnID0gcGtnRm9yU29tZU90aGVyUGxhdGZvcm0oKTtcbiAgICAgICAgaWYgKG90aGVyUGtnKSB7XG4gICAgICAgICAgbGV0IHN1Z2dlc3Rpb25zID0gYFxuU3BlY2lmaWNhbGx5IHRoZSBcIiR7b3RoZXJQa2d9XCIgcGFja2FnZSBpcyBwcmVzZW50IGJ1dCB0aGlzIHBsYXRmb3JtXG5uZWVkcyB0aGUgXCIke3BrZ31cIiBwYWNrYWdlIGluc3RlYWQuIFBlb3BsZSBvZnRlbiBnZXQgaW50byB0aGlzXG5zaXR1YXRpb24gYnkgaW5zdGFsbGluZyBlc2J1aWxkIG9uIFdpbmRvd3Mgb3IgbWFjT1MgYW5kIGNvcHlpbmcgXCJub2RlX21vZHVsZXNcIlxuaW50byBhIERvY2tlciBpbWFnZSB0aGF0IHJ1bnMgTGludXgsIG9yIGJ5IGNvcHlpbmcgXCJub2RlX21vZHVsZXNcIiBiZXR3ZWVuXG5XaW5kb3dzIGFuZCBXU0wgZW52aXJvbm1lbnRzLlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCBucG0sIHlvdSBjYW4gdHJ5IG5vdCBjb3B5aW5nIHRoZSBcIm5vZGVfbW9kdWxlc1wiXG5kaXJlY3Rvcnkgd2hlbiB5b3UgY29weSB0aGUgZmlsZXMgb3ZlciwgYW5kIHJ1bm5pbmcgXCJucG0gY2lcIiBvciBcIm5wbSBpbnN0YWxsXCJcbm9uIHRoZSBkZXN0aW5hdGlvbiBwbGF0Zm9ybSBhZnRlciB0aGUgY29weS4gT3IgeW91IGNvdWxkIGNvbnNpZGVyIHVzaW5nIHlhcm5cbmluc3RlYWQgb2YgbnBtIHdoaWNoIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGEgcGFja2FnZSBvbiBtdWx0aXBsZVxucGxhdGZvcm1zIHNpbXVsdGFuZW91c2x5LlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCB5YXJuLCB5b3UgY2FuIHRyeSBsaXN0aW5nIGJvdGggdGhpcyBwbGF0Zm9ybSBhbmQgdGhlXG5vdGhlciBwbGF0Zm9ybSBpbiB5b3VyIFwiLnlhcm5yYy55bWxcIiBmaWxlIHVzaW5nIHRoZSBcInN1cHBvcnRlZEFyY2hpdGVjdHVyZXNcIlxuZmVhdHVyZTogaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYy8jc3VwcG9ydGVkQXJjaGl0ZWN0dXJlc1xuS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgZXNidWlsZCB3aWxsIGJlIHByZXNlbnQuXG5gO1xuICAgICAgICAgIGlmIChwa2cgPT09IHBhY2thZ2VEYXJ3aW5feDY0ICYmIG90aGVyUGtnID09PSBwYWNrYWdlRGFyd2luX2FybTY0IHx8IHBrZyA9PT0gcGFja2FnZURhcndpbl9hcm02NCAmJiBvdGhlclBrZyA9PT0gcGFja2FnZURhcndpbl94NjQpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gYFxuU3BlY2lmaWNhbGx5IHRoZSBcIiR7b3RoZXJQa2d9XCIgcGFja2FnZSBpcyBwcmVzZW50IGJ1dCB0aGlzIHBsYXRmb3JtXG5uZWVkcyB0aGUgXCIke3BrZ31cIiBwYWNrYWdlIGluc3RlYWQuIFBlb3BsZSBvZnRlbiBnZXQgaW50byB0aGlzXG5zaXR1YXRpb24gYnkgaW5zdGFsbGluZyBlc2J1aWxkIHdpdGggbnBtIHJ1bm5pbmcgaW5zaWRlIG9mIFJvc2V0dGEgMiBhbmQgdGhlblxudHJ5aW5nIHRvIHVzZSBpdCB3aXRoIG5vZGUgcnVubmluZyBvdXRzaWRlIG9mIFJvc2V0dGEgMiwgb3IgdmljZSB2ZXJzYSAoUm9zZXR0YVxuMiBpcyBBcHBsZSdzIG9uLXRoZS1mbHkgeDg2XzY0LXRvLWFybTY0IHRyYW5zbGF0aW9uIHNlcnZpY2UpLlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCBucG0sIHlvdSBjYW4gdHJ5IGVuc3VyaW5nIHRoYXQgYm90aCBucG0gYW5kIG5vZGUgYXJlXG5ub3QgcnVubmluZyB1bmRlciBSb3NldHRhIDIgYW5kIHRoZW4gcmVpbnN0YWxsaW5nIGVzYnVpbGQuIFRoaXMgbGlrZWx5IGludm9sdmVzXG5jaGFuZ2luZyBob3cgeW91IGluc3RhbGxlZCBucG0gYW5kL29yIG5vZGUuIEZvciBleGFtcGxlLCBpbnN0YWxsaW5nIG5vZGUgd2l0aFxudGhlIHVuaXZlcnNhbCBpbnN0YWxsZXIgaGVyZSBzaG91bGQgd29yazogaHR0cHM6Ly9ub2RlanMub3JnL2VuL2Rvd25sb2FkLy4gT3JcbnlvdSBjb3VsZCBjb25zaWRlciB1c2luZyB5YXJuIGluc3RlYWQgb2YgbnBtIHdoaWNoIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvclxuaW5zdGFsbGluZyBhIHBhY2thZ2Ugb24gbXVsdGlwbGUgcGxhdGZvcm1zIHNpbXVsdGFuZW91c2x5LlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCB5YXJuLCB5b3UgY2FuIHRyeSBsaXN0aW5nIGJvdGggXCJhcm02NFwiIGFuZCBcIng2NFwiXG5pbiB5b3VyIFwiLnlhcm5yYy55bWxcIiBmaWxlIHVzaW5nIHRoZSBcInN1cHBvcnRlZEFyY2hpdGVjdHVyZXNcIiBmZWF0dXJlOlxuaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYy8jc3VwcG9ydGVkQXJjaGl0ZWN0dXJlc1xuS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgZXNidWlsZCB3aWxsIGJlIHByZXNlbnQuXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuWW91IGluc3RhbGxlZCBlc2J1aWxkIGZvciBhbm90aGVyIHBsYXRmb3JtIHRoYW4gdGhlIG9uZSB5b3UncmUgY3VycmVudGx5IHVzaW5nLlxuVGhpcyB3b24ndCB3b3JrIGJlY2F1c2UgZXNidWlsZCBpcyB3cml0dGVuIHdpdGggbmF0aXZlIGNvZGUgYW5kIG5lZWRzIHRvXG5pbnN0YWxsIGEgcGxhdGZvcm0tc3BlY2lmaWMgYmluYXJ5IGV4ZWN1dGFibGUuXG4ke3N1Z2dlc3Rpb25zfVxuQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyB0byB1c2UgdGhlIFwiZXNidWlsZC13YXNtXCIgcGFja2FnZSBpbnN0ZWFkLCB3aGljaCB3b3Jrc1xudGhlIHNhbWUgd2F5IG9uIGFsbCBwbGF0Zm9ybXMuIEJ1dCBpdCBjb21lcyB3aXRoIGEgaGVhdnkgcGVyZm9ybWFuY2UgY29zdCBhbmRcbmNhbiBzb21ldGltZXMgYmUgMTB4IHNsb3dlciB0aGFuIHRoZSBcImVzYnVpbGRcIiBwYWNrYWdlLCBzbyB5b3UgbWF5IGFsc28gbm90XG53YW50IHRvIGRvIHRoYXQuXG5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYWNrYWdlIFwiJHtwa2d9XCIgY291bGQgbm90IGJlIGZvdW5kLCBhbmQgaXMgbmVlZGVkIGJ5IGVzYnVpbGQuXG5cbklmIHlvdSBhcmUgaW5zdGFsbGluZyBlc2J1aWxkIHdpdGggbnBtLCBtYWtlIHN1cmUgdGhhdCB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGVcblwiLS1uby1vcHRpb25hbFwiIG9yIFwiLS1vbWl0PW9wdGlvbmFsXCIgZmxhZ3MuIFRoZSBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCIgZmVhdHVyZVxub2YgXCJwYWNrYWdlLmpzb25cIiBpcyB1c2VkIGJ5IGVzYnVpbGQgdG8gaW5zdGFsbCB0aGUgY29ycmVjdCBiaW5hcnkgZXhlY3V0YWJsZVxuZm9yIHlvdXIgY3VycmVudCBwbGF0Zm9ybS5gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIGlmICgvXFwuemlwXFwvLy50ZXN0KGJpblBhdGgpKSB7XG4gICAgbGV0IHBucGFwaTtcbiAgICB0cnkge1xuICAgICAgcG5wYXBpID0gcmVxdWlyZShcInBucGFwaVwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuICAgIGlmIChwbnBhcGkpIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBwbnBhcGkuZ2V0UGFja2FnZUluZm9ybWF0aW9uKHBucGFwaS50b3BMZXZlbCkucGFja2FnZUxvY2F0aW9uO1xuICAgICAgY29uc3QgYmluVGFyZ2V0UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcm9vdCxcbiAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgXCIuY2FjaGVcIixcbiAgICAgICAgXCJlc2J1aWxkXCIsXG4gICAgICAgIGBwbnBhcGktJHtwa2cucmVwbGFjZShcIi9cIiwgXCItXCIpfS0ke1wiMC4yNS4xMlwifS0ke3BhdGguYmFzZW5hbWUoc3VicGF0aCl9YFxuICAgICAgKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiaW5UYXJnZXRQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGJpblRhcmdldFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgZnMuY29weUZpbGVTeW5jKGJpblBhdGgsIGJpblRhcmdldFBhdGgpO1xuICAgICAgICBmcy5jaG1vZFN5bmMoYmluVGFyZ2V0UGF0aCwgNDkzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGJpblBhdGg6IGJpblRhcmdldFBhdGgsIGlzV0FTTSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBiaW5QYXRoLCBpc1dBU00gfTtcbn1cblxuLy8gbGliL25wbS9ub2RlLnRzXG52YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG52YXIgcGF0aDIgPSByZXF1aXJlKFwicGF0aFwiKTtcbnZhciBmczIgPSByZXF1aXJlKFwiZnNcIik7XG52YXIgb3MyID0gcmVxdWlyZShcIm9zXCIpO1xudmFyIHR0eSA9IHJlcXVpcmUoXCJ0dHlcIik7XG52YXIgd29ya2VyX3RocmVhZHM7XG5pZiAocHJvY2Vzcy5lbnYuRVNCVUlMRF9XT1JLRVJfVEhSRUFEUyAhPT0gXCIwXCIpIHtcbiAgdHJ5IHtcbiAgICB3b3JrZXJfdGhyZWFkcyA9IHJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgbGV0IFttYWpvciwgbWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFwiLlwiKTtcbiAgaWYgKFxuICAgIC8vIDx2MTIuMTcuMCBkb2VzIG5vdCB3b3JrXG4gICAgK21ham9yIDwgMTIgfHwgK21ham9yID09PSAxMiAmJiArbWlub3IgPCAxNyB8fCArbWFqb3IgPT09IDEzICYmICttaW5vciA8IDEzXG4gICkge1xuICAgIHdvcmtlcl90aHJlYWRzID0gdm9pZCAwO1xuICB9XG59XG52YXIgX2E7XG52YXIgaXNJbnRlcm5hbFdvcmtlclRocmVhZCA9ICgoX2EgPSB3b3JrZXJfdGhyZWFkcyA9PSBudWxsID8gdm9pZCAwIDogd29ya2VyX3RocmVhZHMud29ya2VyRGF0YSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmVzYnVpbGRWZXJzaW9uKSA9PT0gXCIwLjI1LjEyXCI7XG52YXIgZXNidWlsZENvbW1hbmRBbmRBcmdzID0gKCkgPT4ge1xuICBpZiAoKCFFU0JVSUxEX0JJTkFSWV9QQVRIIHx8IGZhbHNlKSAmJiAocGF0aDIuYmFzZW5hbWUoX19maWxlbmFtZSkgIT09IFwibWFpbi5qc1wiIHx8IHBhdGgyLmJhc2VuYW1lKF9fZGlybmFtZSkgIT09IFwibGliXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBlc2J1aWxkIEphdmFTY3JpcHQgQVBJIGNhbm5vdCBiZSBidW5kbGVkLiBQbGVhc2UgbWFyayB0aGUgXCJlc2J1aWxkXCIgcGFja2FnZSBhcyBleHRlcm5hbCBzbyBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYnVuZGxlLlxuXG5Nb3JlIGluZm9ybWF0aW9uOiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGZvciBlc2J1aWxkJ3MgSmF2YVNjcmlwdCBBUEkgKCR7X19maWxlbmFtZX0pIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbnNpZGUgdGhlIGVzYnVpbGQgcGFja2FnZSBvbiB0aGUgZmlsZSBzeXN0ZW0sIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdCB0aGUgZXNidWlsZCBwYWNrYWdlIHdhcyBidW5kbGVkIGludG8gYW5vdGhlciBmaWxlLiBUaGlzIGlzIHByb2JsZW1hdGljIGJlY2F1c2UgdGhlIEFQSSBuZWVkcyB0byBydW4gYSBiaW5hcnkgZXhlY3V0YWJsZSBpbnNpZGUgdGhlIGVzYnVpbGQgcGFja2FnZSB3aGljaCBpcyBsb2NhdGVkIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBBUEkgY29kZSB0byB0aGUgZXhlY3V0YWJsZS4gSWYgdGhlIGVzYnVpbGQgcGFja2FnZSBpcyBidW5kbGVkLCB0aGUgcmVsYXRpdmUgcGF0aCB3aWxsIGJlIGluY29ycmVjdCBhbmQgdGhlIGV4ZWN1dGFibGUgd29uJ3QgYmUgZm91bmQuYFxuICAgICk7XG4gIH1cbiAgaWYgKGZhbHNlKSB7XG4gICAgcmV0dXJuIFtcIm5vZGVcIiwgW3BhdGgyLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiYmluXCIsIFwiZXNidWlsZFwiKV1dO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgYmluUGF0aCwgaXNXQVNNIH0gPSBnZW5lcmF0ZUJpblBhdGgoKTtcbiAgICBpZiAoaXNXQVNNKSB7XG4gICAgICByZXR1cm4gW1wibm9kZVwiLCBbYmluUGF0aF1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2JpblBhdGgsIFtdXTtcbiAgICB9XG4gIH1cbn07XG52YXIgaXNUVFkgPSAoKSA9PiB0dHkuaXNhdHR5KDIpO1xudmFyIGZzU3luYyA9IHtcbiAgcmVhZEZpbGUodGVtcEZpbGUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50cyA9IGZzMi5yZWFkRmlsZVN5bmModGVtcEZpbGUsIFwidXRmOFwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzMi51bmxpbmtTeW5jKHRlbXBGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgY29udGVudHMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICB9XG4gIH0sXG4gIHdyaXRlRmlsZShjb250ZW50cywgY2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRlbXBGaWxlID0gcmFuZG9tRmlsZU5hbWUoKTtcbiAgICAgIGZzMi53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCBjb250ZW50cyk7XG4gICAgICBjYWxsYmFjayh0ZW1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjYWxsYmFjayhudWxsKTtcbiAgICB9XG4gIH1cbn07XG52YXIgZnNBc3luYyA9IHtcbiAgcmVhZEZpbGUodGVtcEZpbGUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzMi5yZWFkRmlsZSh0ZW1wRmlsZSwgXCJ1dGY4XCIsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZnMyLnVubGluayh0ZW1wRmlsZSwgKCkgPT4gY2FsbGJhY2soZXJyLCBjb250ZW50cykpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIsIGNvbnRlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgIH1cbiAgfSxcbiAgd3JpdGVGaWxlKGNvbnRlbnRzLCBjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICBsZXQgdGVtcEZpbGUgPSByYW5kb21GaWxlTmFtZSgpO1xuICAgICAgZnMyLndyaXRlRmlsZSh0ZW1wRmlsZSwgY29udGVudHMsIChlcnIpID0+IGVyciAhPT0gbnVsbCA/IGNhbGxiYWNrKG51bGwpIDogY2FsbGJhY2sodGVtcEZpbGUpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfVxufTtcbnZhciB2ZXJzaW9uID0gXCIwLjI1LjEyXCI7XG52YXIgYnVpbGQgPSAob3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLmJ1aWxkKG9wdGlvbnMpO1xudmFyIGNvbnRleHQgPSAoYnVpbGRPcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuY29udGV4dChidWlsZE9wdGlvbnMpO1xudmFyIHRyYW5zZm9ybSA9IChpbnB1dCwgb3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLnRyYW5zZm9ybShpbnB1dCwgb3B0aW9ucyk7XG52YXIgZm9ybWF0TWVzc2FnZXMgPSAobWVzc2FnZXMsIG9wdGlvbnMpID0+IGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKS5mb3JtYXRNZXNzYWdlcyhtZXNzYWdlcywgb3B0aW9ucyk7XG52YXIgYW5hbHl6ZU1ldGFmaWxlID0gKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuYW5hbHl6ZU1ldGFmaWxlKG1lc3NhZ2VzLCBvcHRpb25zKTtcbnZhciBidWlsZFN5bmMgPSAob3B0aW9ucykgPT4ge1xuICBpZiAod29ya2VyX3RocmVhZHMgJiYgIWlzSW50ZXJuYWxXb3JrZXJUaHJlYWQpIHtcbiAgICBpZiAoIXdvcmtlclRocmVhZFNlcnZpY2UpIHdvcmtlclRocmVhZFNlcnZpY2UgPSBzdGFydFdvcmtlclRocmVhZFNlcnZpY2Uod29ya2VyX3RocmVhZHMpO1xuICAgIHJldHVybiB3b3JrZXJUaHJlYWRTZXJ2aWNlLmJ1aWxkU3luYyhvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS5idWlsZE9yQ29udGV4dCh7XG4gICAgY2FsbE5hbWU6IFwiYnVpbGRTeW5jXCIsXG4gICAgcmVmczogbnVsbCxcbiAgICBvcHRpb25zLFxuICAgIGlzVFRZOiBpc1RUWSgpLFxuICAgIGRlZmF1bHRXRCxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHRyYW5zZm9ybVN5bmMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHdvcmtlcl90aHJlYWRzICYmICFpc0ludGVybmFsV29ya2VyVGhyZWFkKSB7XG4gICAgaWYgKCF3b3JrZXJUaHJlYWRTZXJ2aWNlKSB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlKHdvcmtlcl90aHJlYWRzKTtcbiAgICByZXR1cm4gd29ya2VyVGhyZWFkU2VydmljZS50cmFuc2Zvcm1TeW5jKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS50cmFuc2Zvcm0oe1xuICAgIGNhbGxOYW1lOiBcInRyYW5zZm9ybVN5bmNcIixcbiAgICByZWZzOiBudWxsLFxuICAgIGlucHV0LFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgaXNUVFk6IGlzVFRZKCksXG4gICAgZnM6IGZzU3luYyxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGZvcm1hdE1lc3NhZ2VzU3luYyA9IChtZXNzYWdlcywgb3B0aW9ucykgPT4ge1xuICBpZiAod29ya2VyX3RocmVhZHMgJiYgIWlzSW50ZXJuYWxXb3JrZXJUaHJlYWQpIHtcbiAgICBpZiAoIXdvcmtlclRocmVhZFNlcnZpY2UpIHdvcmtlclRocmVhZFNlcnZpY2UgPSBzdGFydFdvcmtlclRocmVhZFNlcnZpY2Uod29ya2VyX3RocmVhZHMpO1xuICAgIHJldHVybiB3b3JrZXJUaHJlYWRTZXJ2aWNlLmZvcm1hdE1lc3NhZ2VzU3luYyhtZXNzYWdlcywgb3B0aW9ucyk7XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgcnVuU2VydmljZVN5bmMoKHNlcnZpY2UpID0+IHNlcnZpY2UuZm9ybWF0TWVzc2FnZXMoe1xuICAgIGNhbGxOYW1lOiBcImZvcm1hdE1lc3NhZ2VzU3luY1wiLFxuICAgIHJlZnM6IG51bGwsXG4gICAgbWVzc2FnZXMsXG4gICAgb3B0aW9ucyxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGFuYWx5emVNZXRhZmlsZVN5bmMgPSAobWV0YWZpbGUsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHdvcmtlcl90aHJlYWRzICYmICFpc0ludGVybmFsV29ya2VyVGhyZWFkKSB7XG4gICAgaWYgKCF3b3JrZXJUaHJlYWRTZXJ2aWNlKSB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlKHdvcmtlcl90aHJlYWRzKTtcbiAgICByZXR1cm4gd29ya2VyVGhyZWFkU2VydmljZS5hbmFseXplTWV0YWZpbGVTeW5jKG1ldGFmaWxlLCBvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS5hbmFseXplTWV0YWZpbGUoe1xuICAgIGNhbGxOYW1lOiBcImFuYWx5emVNZXRhZmlsZVN5bmNcIixcbiAgICByZWZzOiBudWxsLFxuICAgIG1ldGFmaWxlOiB0eXBlb2YgbWV0YWZpbGUgPT09IFwic3RyaW5nXCIgPyBtZXRhZmlsZSA6IEpTT04uc3RyaW5naWZ5KG1ldGFmaWxlKSxcbiAgICBvcHRpb25zLFxuICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IHtcbiAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIHJlc3VsdCA9IHJlcztcbiAgICB9XG4gIH0pKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgc3RvcCA9ICgpID0+IHtcbiAgaWYgKHN0b3BTZXJ2aWNlKSBzdG9wU2VydmljZSgpO1xuICBpZiAod29ya2VyVGhyZWFkU2VydmljZSkgd29ya2VyVGhyZWFkU2VydmljZS5zdG9wKCk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG52YXIgaW5pdGlhbGl6ZVdhc0NhbGxlZCA9IGZhbHNlO1xudmFyIGluaXRpYWxpemUgPSAob3B0aW9ucykgPT4ge1xuICBvcHRpb25zID0gdmFsaWRhdGVJbml0aWFsaXplT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgaWYgKG9wdGlvbnMud2FzbVVSTCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ3YXNtVVJMXCIgb3B0aW9uIG9ubHkgd29ya3MgaW4gdGhlIGJyb3dzZXJgKTtcbiAgaWYgKG9wdGlvbnMud2FzbU1vZHVsZSkgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ3YXNtTW9kdWxlXCIgb3B0aW9uIG9ubHkgd29ya3MgaW4gdGhlIGJyb3dzZXJgKTtcbiAgaWYgKG9wdGlvbnMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIndvcmtlclwiIG9wdGlvbiBvbmx5IHdvcmtzIGluIHRoZSBicm93c2VyYCk7XG4gIGlmIChpbml0aWFsaXplV2FzQ2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwiaW5pdGlhbGl6ZVwiIG1vcmUgdGhhbiBvbmNlJyk7XG4gIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKTtcbiAgaW5pdGlhbGl6ZVdhc0NhbGxlZCA9IHRydWU7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG52YXIgZGVmYXVsdFdEID0gcHJvY2Vzcy5jd2QoKTtcbnZhciBsb25nTGl2ZWRTZXJ2aWNlO1xudmFyIHN0b3BTZXJ2aWNlO1xudmFyIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcgPSAoKSA9PiB7XG4gIGlmIChsb25nTGl2ZWRTZXJ2aWNlKSByZXR1cm4gbG9uZ0xpdmVkU2VydmljZTtcbiAgbGV0IFtjb21tYW5kLCBhcmdzXSA9IGVzYnVpbGRDb21tYW5kQW5kQXJncygpO1xuICBsZXQgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MuY29uY2F0KGAtLXNlcnZpY2U9JHtcIjAuMjUuMTJcIn1gLCBcIi0tcGluZ1wiKSwge1xuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcImluaGVyaXRcIl0sXG4gICAgY3dkOiBkZWZhdWx0V0RcbiAgfSk7XG4gIGxldCB7IHJlYWRGcm9tU3Rkb3V0LCBhZnRlckNsb3NlLCBzZXJ2aWNlIH0gPSBjcmVhdGVDaGFubmVsKHtcbiAgICB3cml0ZVRvU3RkaW4oYnl0ZXMpIHtcbiAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGJ5dGVzLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIGFmdGVyQ2xvc2UoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVhZEZpbGVTeW5jOiBmczIucmVhZEZpbGVTeW5jLFxuICAgIGlzU3luYzogZmFsc2UsXG4gICAgaGFzRlM6IHRydWUsXG4gICAgZXNidWlsZDogbm9kZV9leHBvcnRzXG4gIH0pO1xuICBjaGlsZC5zdGRpbi5vbihcImVycm9yXCIsIGFmdGVyQ2xvc2UpO1xuICBjaGlsZC5vbihcImVycm9yXCIsIGFmdGVyQ2xvc2UpO1xuICBjb25zdCBzdGRpbiA9IGNoaWxkLnN0ZGluO1xuICBjb25zdCBzdGRvdXQgPSBjaGlsZC5zdGRvdXQ7XG4gIHN0ZG91dC5vbihcImRhdGFcIiwgcmVhZEZyb21TdGRvdXQpO1xuICBzdGRvdXQub24oXCJlbmRcIiwgYWZ0ZXJDbG9zZSk7XG4gIHN0b3BTZXJ2aWNlID0gKCkgPT4ge1xuICAgIHN0ZGluLmRlc3Ryb3koKTtcbiAgICBzdGRvdXQuZGVzdHJveSgpO1xuICAgIGNoaWxkLmtpbGwoKTtcbiAgICBpbml0aWFsaXplV2FzQ2FsbGVkID0gZmFsc2U7XG4gICAgbG9uZ0xpdmVkU2VydmljZSA9IHZvaWQgMDtcbiAgICBzdG9wU2VydmljZSA9IHZvaWQgMDtcbiAgfTtcbiAgbGV0IHJlZkNvdW50ID0gMDtcbiAgY2hpbGQudW5yZWYoKTtcbiAgaWYgKHN0ZGluLnVucmVmKSB7XG4gICAgc3RkaW4udW5yZWYoKTtcbiAgfVxuICBpZiAoc3Rkb3V0LnVucmVmKSB7XG4gICAgc3Rkb3V0LnVucmVmKCk7XG4gIH1cbiAgY29uc3QgcmVmcyA9IHtcbiAgICByZWYoKSB7XG4gICAgICBpZiAoKytyZWZDb3VudCA9PT0gMSkgY2hpbGQucmVmKCk7XG4gICAgfSxcbiAgICB1bnJlZigpIHtcbiAgICAgIGlmICgtLXJlZkNvdW50ID09PSAwKSBjaGlsZC51bnJlZigpO1xuICAgIH1cbiAgfTtcbiAgbG9uZ0xpdmVkU2VydmljZSA9IHtcbiAgICBidWlsZDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlcnZpY2UuYnVpbGRPckNvbnRleHQoe1xuICAgICAgICBjYWxsTmFtZTogXCJidWlsZFwiLFxuICAgICAgICByZWZzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgICAgZGVmYXVsdFdELFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgY29udGV4dDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHNlcnZpY2UuYnVpbGRPckNvbnRleHQoe1xuICAgICAgY2FsbE5hbWU6IFwiY29udGV4dFwiLFxuICAgICAgcmVmcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgIGRlZmF1bHRXRCxcbiAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgfSkpLFxuICAgIHRyYW5zZm9ybTogKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXJ2aWNlLnRyYW5zZm9ybSh7XG4gICAgICBjYWxsTmFtZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgIHJlZnMsXG4gICAgICBpbnB1dCxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgIGZzOiBmc0FzeW5jLFxuICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICB9KSksXG4gICAgZm9ybWF0TWVzc2FnZXM6IChtZXNzYWdlcywgb3B0aW9ucykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2VydmljZS5mb3JtYXRNZXNzYWdlcyh7XG4gICAgICBjYWxsTmFtZTogXCJmb3JtYXRNZXNzYWdlc1wiLFxuICAgICAgcmVmcyxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgfSkpLFxuICAgIGFuYWx5emVNZXRhZmlsZTogKG1ldGFmaWxlLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXJ2aWNlLmFuYWx5emVNZXRhZmlsZSh7XG4gICAgICBjYWxsTmFtZTogXCJhbmFseXplTWV0YWZpbGVcIixcbiAgICAgIHJlZnMsXG4gICAgICBtZXRhZmlsZTogdHlwZW9mIG1ldGFmaWxlID09PSBcInN0cmluZ1wiID8gbWV0YWZpbGUgOiBKU09OLnN0cmluZ2lmeShtZXRhZmlsZSksXG4gICAgICBvcHRpb25zLFxuICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICB9KSlcbiAgfTtcbiAgcmV0dXJuIGxvbmdMaXZlZFNlcnZpY2U7XG59O1xudmFyIHJ1blNlcnZpY2VTeW5jID0gKGNhbGxiYWNrKSA9PiB7XG4gIGxldCBbY29tbWFuZCwgYXJnc10gPSBlc2J1aWxkQ29tbWFuZEFuZEFyZ3MoKTtcbiAgbGV0IHN0ZGluID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgbGV0IHsgcmVhZEZyb21TdGRvdXQsIGFmdGVyQ2xvc2UsIHNlcnZpY2UgfSA9IGNyZWF0ZUNoYW5uZWwoe1xuICAgIHdyaXRlVG9TdGRpbihieXRlcykge1xuICAgICAgaWYgKHN0ZGluLmxlbmd0aCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBydW4gYXQgbW9zdCBvbmUgY29tbWFuZFwiKTtcbiAgICAgIHN0ZGluID0gYnl0ZXM7XG4gICAgfSxcbiAgICBpc1N5bmM6IHRydWUsXG4gICAgaGFzRlM6IHRydWUsXG4gICAgZXNidWlsZDogbm9kZV9leHBvcnRzXG4gIH0pO1xuICBjYWxsYmFjayhzZXJ2aWNlKTtcbiAgbGV0IHN0ZG91dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIGFyZ3MuY29uY2F0KGAtLXNlcnZpY2U9JHtcIjAuMjUuMTJcIn1gKSwge1xuICAgIGN3ZDogZGVmYXVsdFdELFxuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICAgIGlucHV0OiBzdGRpbixcbiAgICAvLyBXZSBkb24ndCBrbm93IGhvdyBsYXJnZSB0aGUgb3V0cHV0IGNvdWxkIGJlLiBJZiBpdCdzIHRvbyBsYXJnZSwgdGhlXG4gICAgLy8gY29tbWFuZCB3aWxsIGZhaWwgd2l0aCBFTk9CVUZTLiBSZXNlcnZlIDE2bWIgZm9yIG5vdyBzaW5jZSB0aGF0IGZlZWxzXG4gICAgLy8gbGlrZSBpdCBzaG91bGQgYmUgZW5vdWdoLiBBbHNvIGFsbG93IG92ZXJyaWRpbmcgdGhpcyB3aXRoIGFuIGVudmlyb25tZW50XG4gICAgLy8gdmFyaWFibGUuXG4gICAgbWF4QnVmZmVyOiArcHJvY2Vzcy5lbnYuRVNCVUlMRF9NQVhfQlVGRkVSIHx8IDE2ICogMTAyNCAqIDEwMjRcbiAgfSk7XG4gIHJlYWRGcm9tU3Rkb3V0KHN0ZG91dCk7XG4gIGFmdGVyQ2xvc2UobnVsbCk7XG59O1xudmFyIHJhbmRvbUZpbGVOYW1lID0gKCkgPT4ge1xuICByZXR1cm4gcGF0aDIuam9pbihvczIudG1wZGlyKCksIGBlc2J1aWxkLSR7Y3J5cHRvLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImhleFwiKX1gKTtcbn07XG52YXIgd29ya2VyVGhyZWFkU2VydmljZSA9IG51bGw7XG52YXIgc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlID0gKHdvcmtlcl90aHJlYWRzMikgPT4ge1xuICBsZXQgeyBwb3J0MTogbWFpblBvcnQsIHBvcnQyOiB3b3JrZXJQb3J0IH0gPSBuZXcgd29ya2VyX3RocmVhZHMyLk1lc3NhZ2VDaGFubmVsKCk7XG4gIGxldCB3b3JrZXIgPSBuZXcgd29ya2VyX3RocmVhZHMyLldvcmtlcihfX2ZpbGVuYW1lLCB7XG4gICAgd29ya2VyRGF0YTogeyB3b3JrZXJQb3J0LCBkZWZhdWx0V0QsIGVzYnVpbGRWZXJzaW9uOiBcIjAuMjUuMTJcIiB9LFxuICAgIHRyYW5zZmVyTGlzdDogW3dvcmtlclBvcnRdLFxuICAgIC8vIEZyb20gbm9kZSdzIGRvY3VtZW50YXRpb246IGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbFxuICAgIC8vXG4gICAgLy8gICBUYWtlIGNhcmUgd2hlbiBsYXVuY2hpbmcgd29ya2VyIHRocmVhZHMgZnJvbSBwcmVsb2FkIHNjcmlwdHMgKHNjcmlwdHMgbG9hZGVkXG4gICAgLy8gICBhbmQgcnVuIHVzaW5nIHRoZSBgLXJgIGNvbW1hbmQgbGluZSBmbGFnKS4gVW5sZXNzIHRoZSBgZXhlY0FyZ3ZgIG9wdGlvbiBpc1xuICAgIC8vICAgZXhwbGljaXRseSBzZXQsIG5ldyBXb3JrZXIgdGhyZWFkcyBhdXRvbWF0aWNhbGx5IGluaGVyaXQgdGhlIGNvbW1hbmQgbGluZSBmbGFnc1xuICAgIC8vICAgZnJvbSB0aGUgcnVubmluZyBwcm9jZXNzIGFuZCB3aWxsIHByZWxvYWQgdGhlIHNhbWUgcHJlbG9hZCBzY3JpcHRzIGFzIHRoZSBtYWluXG4gICAgLy8gICB0aHJlYWQuIElmIHRoZSBwcmVsb2FkIHNjcmlwdCB1bmNvbmRpdGlvbmFsbHkgbGF1bmNoZXMgYSB3b3JrZXIgdGhyZWFkLCBldmVyeVxuICAgIC8vICAgdGhyZWFkIHNwYXduZWQgd2lsbCBzcGF3biBhbm90aGVyIHVudGlsIHRoZSBhcHBsaWNhdGlvbiBjcmFzaGVzLlxuICAgIC8vXG4gICAgZXhlY0FyZ3Y6IFtdXG4gIH0pO1xuICBsZXQgbmV4dElEID0gMDtcbiAgbGV0IGZha2VCdWlsZEVycm9yID0gKHRleHQpID0+IHtcbiAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYEJ1aWxkIGZhaWxlZCB3aXRoIDEgZXJyb3I6XG5lcnJvcjogJHt0ZXh0fWApO1xuICAgIGxldCBlcnJvcnMgPSBbeyBpZDogXCJcIiwgcGx1Z2luTmFtZTogXCJcIiwgdGV4dCwgbG9jYXRpb246IG51bGwsIG5vdGVzOiBbXSwgZGV0YWlsOiB2b2lkIDAgfV07XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIGVycm9yLndhcm5pbmdzID0gW107XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xuICBsZXQgdmFsaWRhdGVCdWlsZFN5bmNPcHRpb25zID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcbiAgICBsZXQgcGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucztcbiAgICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHRocm93IGZha2VCdWlsZEVycm9yKGBDYW5ub3QgdXNlIHBsdWdpbnMgaW4gc3luY2hyb25vdXMgQVBJIGNhbGxzYCk7XG4gIH07XG4gIGxldCBhcHBseVByb3BlcnRpZXMgPSAob2JqZWN0LCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgZm9yIChsZXQga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgIG9iamVjdFtrZXldID0gcHJvcGVydGllc1trZXldO1xuICAgIH1cbiAgfTtcbiAgbGV0IHJ1bkNhbGxTeW5jID0gKGNvbW1hbmQsIGFyZ3MpID0+IHtcbiAgICBsZXQgaWQgPSBuZXh0SUQrKztcbiAgICBsZXQgc2hhcmVkQnVmZmVyID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDgpO1xuICAgIGxldCBzaGFyZWRCdWZmZXJWaWV3ID0gbmV3IEludDMyQXJyYXkoc2hhcmVkQnVmZmVyKTtcbiAgICBsZXQgbXNnID0geyBzaGFyZWRCdWZmZXIsIGlkLCBjb21tYW5kLCBhcmdzIH07XG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgbGV0IHN0YXR1cyA9IEF0b21pY3Mud2FpdChzaGFyZWRCdWZmZXJWaWV3LCAwLCAwKTtcbiAgICBpZiAoc3RhdHVzICE9PSBcIm9rXCIgJiYgc3RhdHVzICE9PSBcIm5vdC1lcXVhbFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogQXRvbWljcy53YWl0KCkgZmFpbGVkOiBcIiArIHN0YXR1cyk7XG4gICAgbGV0IHsgbWVzc2FnZTogeyBpZDogaWQyLCByZXNvbHZlLCByZWplY3QsIHByb3BlcnRpZXMgfSB9ID0gd29ya2VyX3RocmVhZHMyLnJlY2VpdmVNZXNzYWdlT25Qb3J0KG1haW5Qb3J0KTtcbiAgICBpZiAoaWQgIT09IGlkMikgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgaWQgJHtpZH0gYnV0IGdvdCBpZCAke2lkMn1gKTtcbiAgICBpZiAocmVqZWN0KSB7XG4gICAgICBhcHBseVByb3BlcnRpZXMocmVqZWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgIHRocm93IHJlamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmU7XG4gIH07XG4gIHdvcmtlci51bnJlZigpO1xuICByZXR1cm4ge1xuICAgIGJ1aWxkU3luYyhvcHRpb25zKSB7XG4gICAgICB2YWxpZGF0ZUJ1aWxkU3luY09wdGlvbnMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gcnVuQ2FsbFN5bmMoXCJidWlsZFwiLCBbb3B0aW9uc10pO1xuICAgIH0sXG4gICAgdHJhbnNmb3JtU3luYyhpbnB1dCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIHJ1bkNhbGxTeW5jKFwidHJhbnNmb3JtXCIsIFtpbnB1dCwgb3B0aW9uc10pO1xuICAgIH0sXG4gICAgZm9ybWF0TWVzc2FnZXNTeW5jKG1lc3NhZ2VzLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gcnVuQ2FsbFN5bmMoXCJmb3JtYXRNZXNzYWdlc1wiLCBbbWVzc2FnZXMsIG9wdGlvbnNdKTtcbiAgICB9LFxuICAgIGFuYWx5emVNZXRhZmlsZVN5bmMobWV0YWZpbGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBydW5DYWxsU3luYyhcImFuYWx5emVNZXRhZmlsZVwiLCBbbWV0YWZpbGUsIG9wdGlvbnNdKTtcbiAgICB9LFxuICAgIHN0b3AoKSB7XG4gICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gbnVsbDtcbiAgICB9XG4gIH07XG59O1xudmFyIHN0YXJ0U3luY1NlcnZpY2VXb3JrZXIgPSAoKSA9PiB7XG4gIGxldCB3b3JrZXJQb3J0ID0gd29ya2VyX3RocmVhZHMud29ya2VyRGF0YS53b3JrZXJQb3J0O1xuICBsZXQgcGFyZW50UG9ydCA9IHdvcmtlcl90aHJlYWRzLnBhcmVudFBvcnQ7XG4gIGxldCBleHRyYWN0UHJvcGVydGllcyA9IChvYmplY3QpID0+IHtcbiAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH07XG4gIHRyeSB7XG4gICAgbGV0IHNlcnZpY2UgPSBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCk7XG4gICAgZGVmYXVsdFdEID0gd29ya2VyX3RocmVhZHMud29ya2VyRGF0YS5kZWZhdWx0V0Q7XG4gICAgcGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIiwgKG1zZykgPT4ge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHsgc2hhcmVkQnVmZmVyLCBpZCwgY29tbWFuZCwgYXJncyB9ID0gbXNnO1xuICAgICAgICBsZXQgc2hhcmVkQnVmZmVyVmlldyA9IG5ldyBJbnQzMkFycmF5KHNoYXJlZEJ1ZmZlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiYnVpbGRcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmJ1aWxkKGFyZ3NbMF0pIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0cmFuc2Zvcm1cIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLnRyYW5zZm9ybShhcmdzWzBdLCBhcmdzWzFdKSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9ybWF0TWVzc2FnZXNcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmZvcm1hdE1lc3NhZ2VzKGFyZ3NbMF0sIGFyZ3NbMV0pIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhbmFseXplTWV0YWZpbGVcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmFuYWx5emVNZXRhZmlsZShhcmdzWzBdLCBhcmdzWzFdKSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocmVqZWN0KSB7XG4gICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZWplY3QsIHByb3BlcnRpZXM6IGV4dHJhY3RQcm9wZXJ0aWVzKHJlamVjdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgQXRvbWljcy5hZGQoc2hhcmVkQnVmZmVyVmlldywgMCwgMSk7XG4gICAgICAgIEF0b21pY3Mubm90aWZ5KHNoYXJlZEJ1ZmZlclZpZXcsIDAsIEluZmluaXR5KTtcbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKHJlamVjdCkge1xuICAgIHBhcmVudFBvcnQub24oXCJtZXNzYWdlXCIsIChtc2cpID0+IHtcbiAgICAgIGxldCB7IHNoYXJlZEJ1ZmZlciwgaWQgfSA9IG1zZztcbiAgICAgIGxldCBzaGFyZWRCdWZmZXJWaWV3ID0gbmV3IEludDMyQXJyYXkoc2hhcmVkQnVmZmVyKTtcbiAgICAgIHdvcmtlclBvcnQucG9zdE1lc3NhZ2UoeyBpZCwgcmVqZWN0LCBwcm9wZXJ0aWVzOiBleHRyYWN0UHJvcGVydGllcyhyZWplY3QpIH0pO1xuICAgICAgQXRvbWljcy5hZGQoc2hhcmVkQnVmZmVyVmlldywgMCwgMSk7XG4gICAgICBBdG9taWNzLm5vdGlmeShzaGFyZWRCdWZmZXJWaWV3LCAwLCBJbmZpbml0eSk7XG4gICAgfSk7XG4gIH1cbn07XG5pZiAoaXNJbnRlcm5hbFdvcmtlclRocmVhZCkge1xuICBzdGFydFN5bmNTZXJ2aWNlV29ya2VyKCk7XG59XG52YXIgbm9kZV9kZWZhdWx0ID0gbm9kZV9leHBvcnRzO1xuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFuYWx5emVNZXRhZmlsZSxcbiAgYW5hbHl6ZU1ldGFmaWxlU3luYyxcbiAgYnVpbGQsXG4gIGJ1aWxkU3luYyxcbiAgY29udGV4dCxcbiAgZm9ybWF0TWVzc2FnZXMsXG4gIGZvcm1hdE1lc3NhZ2VzU3luYyxcbiAgaW5pdGlhbGl6ZSxcbiAgc3RvcCxcbiAgdHJhbnNmb3JtLFxuICB0cmFuc2Zvcm1TeW5jLFxuICB2ZXJzaW9uXG59KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztFQUVBLElBQUksWUFBWSxPQUFPO0FBQUEsRUFDdkIsSUFBSSxtQkFBbUIsT0FBTztBQUFBLEVBQzlCLElBQUksb0JBQW9CLE9BQU87QUFBQSxFQUUvQixJQUFJLGVBQWUsT0FBTyxVQUFVO0FBQUEsRUFDcEMsSUFBSSxXQUFXLENBQUMsUUFBUSxRQUFRO0FBQUEsSUFDOUIsU0FBUyxRQUFRO0FBQUEsTUFDZixVQUFVLFFBQVEsTUFBTSxFQUFFLEtBQUssSUFBSSxPQUFPLFlBQVksS0FBSyxDQUFDO0FBQUE7QUFBQSxFQUVoRSxJQUFJLGNBQWMsQ0FBQyxJQUFJLE1BQU0sUUFBUSxTQUFTO0FBQUEsSUFDNUMsSUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxZQUFZO0FBQUEsTUFDbEUsU0FBUyxPQUFPLGtCQUFrQixJQUFJO0FBQUEsUUFDcEMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEdBQUcsS0FBSyxRQUFRO0FBQUEsVUFDekMsVUFBVSxJQUFJLEtBQUssRUFBRSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksRUFBRSxPQUFP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QVEsWUFBWSxrQkFBa0IsTUFBTSxFQUFFLENBQUM7QUFBQTtBQUFBLFVBRTlFLFFBQVEsSUFBSSxrQkFBa0IsR0FBRyxDQUFDO0FBQUEsVUFDbEMsUUFBUSxPQUFPLGtCQUFrQixHQUFHLFFBQVE7QUFBQSxXQUMzQztBQUFBLE9BQ0o7QUFBQSxNQUNELE9BQU8sUUFBUTtBQUFBLE1BQ2YsV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFRO0FBQUEsUUFDaEMsTUFBTSxjQUFjLE9BQU87QUFBQSxRQUMzQixJQUFJLG1CQUFtQixJQUFJLFdBQVcsWUFBWTtBQUFBLFFBQ2xELFdBQVcsWUFBWSxFQUFFLElBQUksUUFBUSxZQUFZLGtCQUFrQixNQUFNLEVBQUUsQ0FBQztBQUFBLFFBQzVFLFFBQVEsSUFBSSxrQkFBa0IsR0FBRyxDQUFDO0FBQUEsUUFDbEMsUUFBUSxPQUFPLGtCQUFrQixHQUFHLFFBQVE7QUFBQSxPQUM3QztBQUFBO0FBQUE7QUFBQSxFQUdMLElBQUksd0JBQXdCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsRUFDekI7QUFBQSxFQUNBLElBQUksZUFBZTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiRjAyNkQzMkU4ODBERkFEMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=