@kulupu-linku/sona 0.1.10 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2777 @@
1
+ var g;
2
+ (function(r) {
3
+ r.assertEqual = (n) => n;
4
+ function e(n) {
5
+ }
6
+ r.assertIs = e;
7
+ function t(n) {
8
+ throw new Error();
9
+ }
10
+ r.assertNever = t, r.arrayToEnum = (n) => {
11
+ const a = {};
12
+ for (const i of n)
13
+ a[i] = i;
14
+ return a;
15
+ }, r.getValidEnumValues = (n) => {
16
+ const a = r.objectKeys(n).filter((o) => typeof n[n[o]] != "number"), i = {};
17
+ for (const o of a)
18
+ i[o] = n[o];
19
+ return r.objectValues(i);
20
+ }, r.objectValues = (n) => r.objectKeys(n).map(function(a) {
21
+ return n[a];
22
+ }), r.objectKeys = typeof Object.keys == "function" ? (n) => Object.keys(n) : (n) => {
23
+ const a = [];
24
+ for (const i in n)
25
+ Object.prototype.hasOwnProperty.call(n, i) && a.push(i);
26
+ return a;
27
+ }, r.find = (n, a) => {
28
+ for (const i of n)
29
+ if (a(i))
30
+ return i;
31
+ }, r.isInteger = typeof Number.isInteger == "function" ? (n) => Number.isInteger(n) : (n) => typeof n == "number" && isFinite(n) && Math.floor(n) === n;
32
+ function s(n, a = " | ") {
33
+ return n.map((i) => typeof i == "string" ? `'${i}'` : i).join(a);
34
+ }
35
+ r.joinValues = s, r.jsonStringifyReplacer = (n, a) => typeof a == "bigint" ? a.toString() : a;
36
+ })(g || (g = {}));
37
+ var ve;
38
+ (function(r) {
39
+ r.mergeShapes = (e, t) => ({
40
+ ...e,
41
+ ...t
42
+ // second overwrites first
43
+ });
44
+ })(ve || (ve = {}));
45
+ const u = g.arrayToEnum([
46
+ "string",
47
+ "nan",
48
+ "number",
49
+ "integer",
50
+ "float",
51
+ "boolean",
52
+ "date",
53
+ "bigint",
54
+ "symbol",
55
+ "function",
56
+ "undefined",
57
+ "null",
58
+ "array",
59
+ "object",
60
+ "unknown",
61
+ "promise",
62
+ "void",
63
+ "never",
64
+ "map",
65
+ "set"
66
+ ]), j = (r) => {
67
+ switch (typeof r) {
68
+ case "undefined":
69
+ return u.undefined;
70
+ case "string":
71
+ return u.string;
72
+ case "number":
73
+ return isNaN(r) ? u.nan : u.number;
74
+ case "boolean":
75
+ return u.boolean;
76
+ case "function":
77
+ return u.function;
78
+ case "bigint":
79
+ return u.bigint;
80
+ case "symbol":
81
+ return u.symbol;
82
+ case "object":
83
+ return Array.isArray(r) ? u.array : r === null ? u.null : r.then && typeof r.then == "function" && r.catch && typeof r.catch == "function" ? u.promise : typeof Map < "u" && r instanceof Map ? u.map : typeof Set < "u" && r instanceof Set ? u.set : typeof Date < "u" && r instanceof Date ? u.date : u.object;
84
+ default:
85
+ return u.unknown;
86
+ }
87
+ }, c = g.arrayToEnum([
88
+ "invalid_type",
89
+ "invalid_literal",
90
+ "custom",
91
+ "invalid_union",
92
+ "invalid_union_discriminator",
93
+ "invalid_enum_value",
94
+ "unrecognized_keys",
95
+ "invalid_arguments",
96
+ "invalid_return_type",
97
+ "invalid_date",
98
+ "invalid_string",
99
+ "too_small",
100
+ "too_big",
101
+ "invalid_intersection_types",
102
+ "not_multiple_of",
103
+ "not_finite"
104
+ ]), Ie = (r) => JSON.stringify(r, null, 2).replace(/"([^"]+)":/g, "$1:");
105
+ class S extends Error {
106
+ constructor(e) {
107
+ super(), this.issues = [], this.addIssue = (s) => {
108
+ this.issues = [...this.issues, s];
109
+ }, this.addIssues = (s = []) => {
110
+ this.issues = [...this.issues, ...s];
111
+ };
112
+ const t = new.target.prototype;
113
+ Object.setPrototypeOf ? Object.setPrototypeOf(this, t) : this.__proto__ = t, this.name = "ZodError", this.issues = e;
114
+ }
115
+ get errors() {
116
+ return this.issues;
117
+ }
118
+ format(e) {
119
+ const t = e || function(a) {
120
+ return a.message;
121
+ }, s = { _errors: [] }, n = (a) => {
122
+ for (const i of a.issues)
123
+ if (i.code === "invalid_union")
124
+ i.unionErrors.map(n);
125
+ else if (i.code === "invalid_return_type")
126
+ n(i.returnTypeError);
127
+ else if (i.code === "invalid_arguments")
128
+ n(i.argumentsError);
129
+ else if (i.path.length === 0)
130
+ s._errors.push(t(i));
131
+ else {
132
+ let o = s, f = 0;
133
+ for (; f < i.path.length; ) {
134
+ const d = i.path[f];
135
+ f === i.path.length - 1 ? (o[d] = o[d] || { _errors: [] }, o[d]._errors.push(t(i))) : o[d] = o[d] || { _errors: [] }, o = o[d], f++;
136
+ }
137
+ }
138
+ };
139
+ return n(this), s;
140
+ }
141
+ toString() {
142
+ return this.message;
143
+ }
144
+ get message() {
145
+ return JSON.stringify(this.issues, g.jsonStringifyReplacer, 2);
146
+ }
147
+ get isEmpty() {
148
+ return this.issues.length === 0;
149
+ }
150
+ flatten(e = (t) => t.message) {
151
+ const t = {}, s = [];
152
+ for (const n of this.issues)
153
+ n.path.length > 0 ? (t[n.path[0]] = t[n.path[0]] || [], t[n.path[0]].push(e(n))) : s.push(e(n));
154
+ return { formErrors: s, fieldErrors: t };
155
+ }
156
+ get formErrors() {
157
+ return this.flatten();
158
+ }
159
+ }
160
+ S.create = (r) => new S(r);
161
+ const q = (r, e) => {
162
+ let t;
163
+ switch (r.code) {
164
+ case c.invalid_type:
165
+ r.received === u.undefined ? t = "Required" : t = `Expected ${r.expected}, received ${r.received}`;
166
+ break;
167
+ case c.invalid_literal:
168
+ t = `Invalid literal value, expected ${JSON.stringify(r.expected, g.jsonStringifyReplacer)}`;
169
+ break;
170
+ case c.unrecognized_keys:
171
+ t = `Unrecognized key(s) in object: ${g.joinValues(r.keys, ", ")}`;
172
+ break;
173
+ case c.invalid_union:
174
+ t = "Invalid input";
175
+ break;
176
+ case c.invalid_union_discriminator:
177
+ t = `Invalid discriminator value. Expected ${g.joinValues(r.options)}`;
178
+ break;
179
+ case c.invalid_enum_value:
180
+ t = `Invalid enum value. Expected ${g.joinValues(r.options)}, received '${r.received}'`;
181
+ break;
182
+ case c.invalid_arguments:
183
+ t = "Invalid function arguments";
184
+ break;
185
+ case c.invalid_return_type:
186
+ t = "Invalid function return type";
187
+ break;
188
+ case c.invalid_date:
189
+ t = "Invalid date";
190
+ break;
191
+ case c.invalid_string:
192
+ typeof r.validation == "object" ? "includes" in r.validation ? (t = `Invalid input: must include "${r.validation.includes}"`, typeof r.validation.position == "number" && (t = `${t} at one or more positions greater than or equal to ${r.validation.position}`)) : "startsWith" in r.validation ? t = `Invalid input: must start with "${r.validation.startsWith}"` : "endsWith" in r.validation ? t = `Invalid input: must end with "${r.validation.endsWith}"` : g.assertNever(r.validation) : r.validation !== "regex" ? t = `Invalid ${r.validation}` : t = "Invalid";
193
+ break;
194
+ case c.too_small:
195
+ r.type === "array" ? t = `Array must contain ${r.exact ? "exactly" : r.inclusive ? "at least" : "more than"} ${r.minimum} element(s)` : r.type === "string" ? t = `String must contain ${r.exact ? "exactly" : r.inclusive ? "at least" : "over"} ${r.minimum} character(s)` : r.type === "number" ? t = `Number must be ${r.exact ? "exactly equal to " : r.inclusive ? "greater than or equal to " : "greater than "}${r.minimum}` : r.type === "date" ? t = `Date must be ${r.exact ? "exactly equal to " : r.inclusive ? "greater than or equal to " : "greater than "}${new Date(Number(r.minimum))}` : t = "Invalid input";
196
+ break;
197
+ case c.too_big:
198
+ r.type === "array" ? t = `Array must contain ${r.exact ? "exactly" : r.inclusive ? "at most" : "less than"} ${r.maximum} element(s)` : r.type === "string" ? t = `String must contain ${r.exact ? "exactly" : r.inclusive ? "at most" : "under"} ${r.maximum} character(s)` : r.type === "number" ? t = `Number must be ${r.exact ? "exactly" : r.inclusive ? "less than or equal to" : "less than"} ${r.maximum}` : r.type === "bigint" ? t = `BigInt must be ${r.exact ? "exactly" : r.inclusive ? "less than or equal to" : "less than"} ${r.maximum}` : r.type === "date" ? t = `Date must be ${r.exact ? "exactly" : r.inclusive ? "smaller than or equal to" : "smaller than"} ${new Date(Number(r.maximum))}` : t = "Invalid input";
199
+ break;
200
+ case c.custom:
201
+ t = "Invalid input";
202
+ break;
203
+ case c.invalid_intersection_types:
204
+ t = "Intersection results could not be merged";
205
+ break;
206
+ case c.not_multiple_of:
207
+ t = `Number must be a multiple of ${r.multipleOf}`;
208
+ break;
209
+ case c.not_finite:
210
+ t = "Number must be finite";
211
+ break;
212
+ default:
213
+ t = e.defaultError, g.assertNever(r);
214
+ }
215
+ return { message: t };
216
+ };
217
+ let we = q;
218
+ function Re(r) {
219
+ we = r;
220
+ }
221
+ function ae() {
222
+ return we;
223
+ }
224
+ const ie = (r) => {
225
+ const { data: e, path: t, errorMaps: s, issueData: n } = r, a = [...t, ...n.path || []], i = {
226
+ ...n,
227
+ path: a
228
+ };
229
+ let o = "";
230
+ const f = s.filter((d) => !!d).slice().reverse();
231
+ for (const d of f)
232
+ o = d(i, { data: e, defaultError: o }).message;
233
+ return {
234
+ ...n,
235
+ path: a,
236
+ message: n.message || o
237
+ };
238
+ }, je = [];
239
+ function l(r, e) {
240
+ const t = ie({
241
+ issueData: e,
242
+ data: r.data,
243
+ path: r.path,
244
+ errorMaps: [
245
+ r.common.contextualErrorMap,
246
+ r.schemaErrorMap,
247
+ ae(),
248
+ q
249
+ // then global default map
250
+ ].filter((s) => !!s)
251
+ });
252
+ r.common.issues.push(t);
253
+ }
254
+ class b {
255
+ constructor() {
256
+ this.value = "valid";
257
+ }
258
+ dirty() {
259
+ this.value === "valid" && (this.value = "dirty");
260
+ }
261
+ abort() {
262
+ this.value !== "aborted" && (this.value = "aborted");
263
+ }
264
+ static mergeArray(e, t) {
265
+ const s = [];
266
+ for (const n of t) {
267
+ if (n.status === "aborted")
268
+ return m;
269
+ n.status === "dirty" && e.dirty(), s.push(n.value);
270
+ }
271
+ return { status: e.value, value: s };
272
+ }
273
+ static async mergeObjectAsync(e, t) {
274
+ const s = [];
275
+ for (const n of t)
276
+ s.push({
277
+ key: await n.key,
278
+ value: await n.value
279
+ });
280
+ return b.mergeObjectSync(e, s);
281
+ }
282
+ static mergeObjectSync(e, t) {
283
+ const s = {};
284
+ for (const n of t) {
285
+ const { key: a, value: i } = n;
286
+ if (a.status === "aborted" || i.status === "aborted")
287
+ return m;
288
+ a.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), a.value !== "__proto__" && (typeof i.value < "u" || n.alwaysSet) && (s[a.value] = i.value);
289
+ }
290
+ return { status: e.value, value: s };
291
+ }
292
+ }
293
+ const m = Object.freeze({
294
+ status: "aborted"
295
+ }), Te = (r) => ({ status: "dirty", value: r }), w = (r) => ({ status: "valid", value: r }), _e = (r) => r.status === "aborted", ge = (r) => r.status === "dirty", J = (r) => r.status === "valid", oe = (r) => typeof Promise < "u" && r instanceof Promise;
296
+ var h;
297
+ (function(r) {
298
+ r.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, r.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message;
299
+ })(h || (h = {}));
300
+ class O {
301
+ constructor(e, t, s, n) {
302
+ this._cachedPath = [], this.parent = e, this.data = t, this._path = s, this._key = n;
303
+ }
304
+ get path() {
305
+ return this._cachedPath.length || (this._key instanceof Array ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath;
306
+ }
307
+ }
308
+ const ke = (r, e) => {
309
+ if (J(e))
310
+ return { success: !0, data: e.value };
311
+ if (!r.common.issues.length)
312
+ throw new Error("Validation failed but no issues detected.");
313
+ return {
314
+ success: !1,
315
+ get error() {
316
+ if (this._error)
317
+ return this._error;
318
+ const t = new S(r.common.issues);
319
+ return this._error = t, this._error;
320
+ }
321
+ };
322
+ };
323
+ function y(r) {
324
+ if (!r)
325
+ return {};
326
+ const { errorMap: e, invalid_type_error: t, required_error: s, description: n } = r;
327
+ if (e && (t || s))
328
+ throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);
329
+ return e ? { errorMap: e, description: n } : { errorMap: (i, o) => i.code !== "invalid_type" ? { message: o.defaultError } : typeof o.data > "u" ? { message: s ?? o.defaultError } : { message: t ?? o.defaultError }, description: n };
330
+ }
331
+ class v {
332
+ constructor(e) {
333
+ this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this);
334
+ }
335
+ get description() {
336
+ return this._def.description;
337
+ }
338
+ _getType(e) {
339
+ return j(e.data);
340
+ }
341
+ _getOrReturnCtx(e, t) {
342
+ return t || {
343
+ common: e.parent.common,
344
+ data: e.data,
345
+ parsedType: j(e.data),
346
+ schemaErrorMap: this._def.errorMap,
347
+ path: e.path,
348
+ parent: e.parent
349
+ };
350
+ }
351
+ _processInputParams(e) {
352
+ return {
353
+ status: new b(),
354
+ ctx: {
355
+ common: e.parent.common,
356
+ data: e.data,
357
+ parsedType: j(e.data),
358
+ schemaErrorMap: this._def.errorMap,
359
+ path: e.path,
360
+ parent: e.parent
361
+ }
362
+ };
363
+ }
364
+ _parseSync(e) {
365
+ const t = this._parse(e);
366
+ if (oe(t))
367
+ throw new Error("Synchronous parse encountered promise.");
368
+ return t;
369
+ }
370
+ _parseAsync(e) {
371
+ const t = this._parse(e);
372
+ return Promise.resolve(t);
373
+ }
374
+ parse(e, t) {
375
+ const s = this.safeParse(e, t);
376
+ if (s.success)
377
+ return s.data;
378
+ throw s.error;
379
+ }
380
+ safeParse(e, t) {
381
+ var s;
382
+ const n = {
383
+ common: {
384
+ issues: [],
385
+ async: (s = t == null ? void 0 : t.async) !== null && s !== void 0 ? s : !1,
386
+ contextualErrorMap: t == null ? void 0 : t.errorMap
387
+ },
388
+ path: (t == null ? void 0 : t.path) || [],
389
+ schemaErrorMap: this._def.errorMap,
390
+ parent: null,
391
+ data: e,
392
+ parsedType: j(e)
393
+ }, a = this._parseSync({ data: e, path: n.path, parent: n });
394
+ return ke(n, a);
395
+ }
396
+ async parseAsync(e, t) {
397
+ const s = await this.safeParseAsync(e, t);
398
+ if (s.success)
399
+ return s.data;
400
+ throw s.error;
401
+ }
402
+ async safeParseAsync(e, t) {
403
+ const s = {
404
+ common: {
405
+ issues: [],
406
+ contextualErrorMap: t == null ? void 0 : t.errorMap,
407
+ async: !0
408
+ },
409
+ path: (t == null ? void 0 : t.path) || [],
410
+ schemaErrorMap: this._def.errorMap,
411
+ parent: null,
412
+ data: e,
413
+ parsedType: j(e)
414
+ }, n = this._parse({ data: e, path: s.path, parent: s }), a = await (oe(n) ? n : Promise.resolve(n));
415
+ return ke(s, a);
416
+ }
417
+ refine(e, t) {
418
+ const s = (n) => typeof t == "string" || typeof t > "u" ? { message: t } : typeof t == "function" ? t(n) : t;
419
+ return this._refinement((n, a) => {
420
+ const i = e(n), o = () => a.addIssue({
421
+ code: c.custom,
422
+ ...s(n)
423
+ });
424
+ return typeof Promise < "u" && i instanceof Promise ? i.then((f) => f ? !0 : (o(), !1)) : i ? !0 : (o(), !1);
425
+ });
426
+ }
427
+ refinement(e, t) {
428
+ return this._refinement((s, n) => e(s) ? !0 : (n.addIssue(typeof t == "function" ? t(s, n) : t), !1));
429
+ }
430
+ _refinement(e) {
431
+ return new C({
432
+ schema: this,
433
+ typeName: p.ZodEffects,
434
+ effect: { type: "refinement", refinement: e }
435
+ });
436
+ }
437
+ superRefine(e) {
438
+ return this._refinement(e);
439
+ }
440
+ optional() {
441
+ return I.create(this, this._def);
442
+ }
443
+ nullable() {
444
+ return D.create(this, this._def);
445
+ }
446
+ nullish() {
447
+ return this.nullable().optional();
448
+ }
449
+ array() {
450
+ return N.create(this, this._def);
451
+ }
452
+ promise() {
453
+ return W.create(this, this._def);
454
+ }
455
+ or(e) {
456
+ return X.create([this, e], this._def);
457
+ }
458
+ and(e) {
459
+ return Q.create(this, e, this._def);
460
+ }
461
+ transform(e) {
462
+ return new C({
463
+ ...y(this._def),
464
+ schema: this,
465
+ typeName: p.ZodEffects,
466
+ effect: { type: "transform", transform: e }
467
+ });
468
+ }
469
+ default(e) {
470
+ const t = typeof e == "function" ? e : () => e;
471
+ return new re({
472
+ ...y(this._def),
473
+ innerType: this,
474
+ defaultValue: t,
475
+ typeName: p.ZodDefault
476
+ });
477
+ }
478
+ brand() {
479
+ return new Se({
480
+ typeName: p.ZodBranded,
481
+ type: this,
482
+ ...y(this._def)
483
+ });
484
+ }
485
+ catch(e) {
486
+ const t = typeof e == "function" ? e : () => e;
487
+ return new le({
488
+ ...y(this._def),
489
+ innerType: this,
490
+ catchValue: t,
491
+ typeName: p.ZodCatch
492
+ });
493
+ }
494
+ describe(e) {
495
+ const t = this.constructor;
496
+ return new t({
497
+ ...this._def,
498
+ description: e
499
+ });
500
+ }
501
+ pipe(e) {
502
+ return se.create(this, e);
503
+ }
504
+ readonly() {
505
+ return he.create(this);
506
+ }
507
+ isOptional() {
508
+ return this.safeParse(void 0).success;
509
+ }
510
+ isNullable() {
511
+ return this.safeParse(null).success;
512
+ }
513
+ }
514
+ const Ae = /^c[^\s-]{8,}$/i, Me = /^[a-z][a-z0-9]*$/, Pe = /^[0-9A-HJKMNP-TV-Z]{26}$/, Ve = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, $e = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Le = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";
515
+ let ye;
516
+ const De = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/, ze = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Ue = (r) => r.precision ? r.offset ? new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${r.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`) : new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${r.precision}}Z$`) : r.precision === 0 ? r.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$") : r.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");
517
+ function Be(r, e) {
518
+ return !!((e === "v4" || !e) && De.test(r) || (e === "v6" || !e) && ze.test(r));
519
+ }
520
+ class Z extends v {
521
+ _parse(e) {
522
+ if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== u.string) {
523
+ const a = this._getOrReturnCtx(e);
524
+ return l(
525
+ a,
526
+ {
527
+ code: c.invalid_type,
528
+ expected: u.string,
529
+ received: a.parsedType
530
+ }
531
+ //
532
+ ), m;
533
+ }
534
+ const s = new b();
535
+ let n;
536
+ for (const a of this._def.checks)
537
+ if (a.kind === "min")
538
+ e.data.length < a.value && (n = this._getOrReturnCtx(e, n), l(n, {
539
+ code: c.too_small,
540
+ minimum: a.value,
541
+ type: "string",
542
+ inclusive: !0,
543
+ exact: !1,
544
+ message: a.message
545
+ }), s.dirty());
546
+ else if (a.kind === "max")
547
+ e.data.length > a.value && (n = this._getOrReturnCtx(e, n), l(n, {
548
+ code: c.too_big,
549
+ maximum: a.value,
550
+ type: "string",
551
+ inclusive: !0,
552
+ exact: !1,
553
+ message: a.message
554
+ }), s.dirty());
555
+ else if (a.kind === "length") {
556
+ const i = e.data.length > a.value, o = e.data.length < a.value;
557
+ (i || o) && (n = this._getOrReturnCtx(e, n), i ? l(n, {
558
+ code: c.too_big,
559
+ maximum: a.value,
560
+ type: "string",
561
+ inclusive: !0,
562
+ exact: !0,
563
+ message: a.message
564
+ }) : o && l(n, {
565
+ code: c.too_small,
566
+ minimum: a.value,
567
+ type: "string",
568
+ inclusive: !0,
569
+ exact: !0,
570
+ message: a.message
571
+ }), s.dirty());
572
+ } else if (a.kind === "email")
573
+ $e.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
574
+ validation: "email",
575
+ code: c.invalid_string,
576
+ message: a.message
577
+ }), s.dirty());
578
+ else if (a.kind === "emoji")
579
+ ye || (ye = new RegExp(Le, "u")), ye.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
580
+ validation: "emoji",
581
+ code: c.invalid_string,
582
+ message: a.message
583
+ }), s.dirty());
584
+ else if (a.kind === "uuid")
585
+ Ve.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
586
+ validation: "uuid",
587
+ code: c.invalid_string,
588
+ message: a.message
589
+ }), s.dirty());
590
+ else if (a.kind === "cuid")
591
+ Ae.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
592
+ validation: "cuid",
593
+ code: c.invalid_string,
594
+ message: a.message
595
+ }), s.dirty());
596
+ else if (a.kind === "cuid2")
597
+ Me.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
598
+ validation: "cuid2",
599
+ code: c.invalid_string,
600
+ message: a.message
601
+ }), s.dirty());
602
+ else if (a.kind === "ulid")
603
+ Pe.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
604
+ validation: "ulid",
605
+ code: c.invalid_string,
606
+ message: a.message
607
+ }), s.dirty());
608
+ else if (a.kind === "url")
609
+ try {
610
+ new URL(e.data);
611
+ } catch {
612
+ n = this._getOrReturnCtx(e, n), l(n, {
613
+ validation: "url",
614
+ code: c.invalid_string,
615
+ message: a.message
616
+ }), s.dirty();
617
+ }
618
+ else
619
+ a.kind === "regex" ? (a.regex.lastIndex = 0, a.regex.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
620
+ validation: "regex",
621
+ code: c.invalid_string,
622
+ message: a.message
623
+ }), s.dirty())) : a.kind === "trim" ? e.data = e.data.trim() : a.kind === "includes" ? e.data.includes(a.value, a.position) || (n = this._getOrReturnCtx(e, n), l(n, {
624
+ code: c.invalid_string,
625
+ validation: { includes: a.value, position: a.position },
626
+ message: a.message
627
+ }), s.dirty()) : a.kind === "toLowerCase" ? e.data = e.data.toLowerCase() : a.kind === "toUpperCase" ? e.data = e.data.toUpperCase() : a.kind === "startsWith" ? e.data.startsWith(a.value) || (n = this._getOrReturnCtx(e, n), l(n, {
628
+ code: c.invalid_string,
629
+ validation: { startsWith: a.value },
630
+ message: a.message
631
+ }), s.dirty()) : a.kind === "endsWith" ? e.data.endsWith(a.value) || (n = this._getOrReturnCtx(e, n), l(n, {
632
+ code: c.invalid_string,
633
+ validation: { endsWith: a.value },
634
+ message: a.message
635
+ }), s.dirty()) : a.kind === "datetime" ? Ue(a).test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
636
+ code: c.invalid_string,
637
+ validation: "datetime",
638
+ message: a.message
639
+ }), s.dirty()) : a.kind === "ip" ? Be(e.data, a.version) || (n = this._getOrReturnCtx(e, n), l(n, {
640
+ validation: "ip",
641
+ code: c.invalid_string,
642
+ message: a.message
643
+ }), s.dirty()) : g.assertNever(a);
644
+ return { status: s.value, value: e.data };
645
+ }
646
+ _regex(e, t, s) {
647
+ return this.refinement((n) => e.test(n), {
648
+ validation: t,
649
+ code: c.invalid_string,
650
+ ...h.errToObj(s)
651
+ });
652
+ }
653
+ _addCheck(e) {
654
+ return new Z({
655
+ ...this._def,
656
+ checks: [...this._def.checks, e]
657
+ });
658
+ }
659
+ email(e) {
660
+ return this._addCheck({ kind: "email", ...h.errToObj(e) });
661
+ }
662
+ url(e) {
663
+ return this._addCheck({ kind: "url", ...h.errToObj(e) });
664
+ }
665
+ emoji(e) {
666
+ return this._addCheck({ kind: "emoji", ...h.errToObj(e) });
667
+ }
668
+ uuid(e) {
669
+ return this._addCheck({ kind: "uuid", ...h.errToObj(e) });
670
+ }
671
+ cuid(e) {
672
+ return this._addCheck({ kind: "cuid", ...h.errToObj(e) });
673
+ }
674
+ cuid2(e) {
675
+ return this._addCheck({ kind: "cuid2", ...h.errToObj(e) });
676
+ }
677
+ ulid(e) {
678
+ return this._addCheck({ kind: "ulid", ...h.errToObj(e) });
679
+ }
680
+ ip(e) {
681
+ return this._addCheck({ kind: "ip", ...h.errToObj(e) });
682
+ }
683
+ datetime(e) {
684
+ var t;
685
+ return typeof e == "string" ? this._addCheck({
686
+ kind: "datetime",
687
+ precision: null,
688
+ offset: !1,
689
+ message: e
690
+ }) : this._addCheck({
691
+ kind: "datetime",
692
+ precision: typeof (e == null ? void 0 : e.precision) > "u" ? null : e == null ? void 0 : e.precision,
693
+ offset: (t = e == null ? void 0 : e.offset) !== null && t !== void 0 ? t : !1,
694
+ ...h.errToObj(e == null ? void 0 : e.message)
695
+ });
696
+ }
697
+ regex(e, t) {
698
+ return this._addCheck({
699
+ kind: "regex",
700
+ regex: e,
701
+ ...h.errToObj(t)
702
+ });
703
+ }
704
+ includes(e, t) {
705
+ return this._addCheck({
706
+ kind: "includes",
707
+ value: e,
708
+ position: t == null ? void 0 : t.position,
709
+ ...h.errToObj(t == null ? void 0 : t.message)
710
+ });
711
+ }
712
+ startsWith(e, t) {
713
+ return this._addCheck({
714
+ kind: "startsWith",
715
+ value: e,
716
+ ...h.errToObj(t)
717
+ });
718
+ }
719
+ endsWith(e, t) {
720
+ return this._addCheck({
721
+ kind: "endsWith",
722
+ value: e,
723
+ ...h.errToObj(t)
724
+ });
725
+ }
726
+ min(e, t) {
727
+ return this._addCheck({
728
+ kind: "min",
729
+ value: e,
730
+ ...h.errToObj(t)
731
+ });
732
+ }
733
+ max(e, t) {
734
+ return this._addCheck({
735
+ kind: "max",
736
+ value: e,
737
+ ...h.errToObj(t)
738
+ });
739
+ }
740
+ length(e, t) {
741
+ return this._addCheck({
742
+ kind: "length",
743
+ value: e,
744
+ ...h.errToObj(t)
745
+ });
746
+ }
747
+ /**
748
+ * @deprecated Use z.string().min(1) instead.
749
+ * @see {@link ZodString.min}
750
+ */
751
+ nonempty(e) {
752
+ return this.min(1, h.errToObj(e));
753
+ }
754
+ trim() {
755
+ return new Z({
756
+ ...this._def,
757
+ checks: [...this._def.checks, { kind: "trim" }]
758
+ });
759
+ }
760
+ toLowerCase() {
761
+ return new Z({
762
+ ...this._def,
763
+ checks: [...this._def.checks, { kind: "toLowerCase" }]
764
+ });
765
+ }
766
+ toUpperCase() {
767
+ return new Z({
768
+ ...this._def,
769
+ checks: [...this._def.checks, { kind: "toUpperCase" }]
770
+ });
771
+ }
772
+ get isDatetime() {
773
+ return !!this._def.checks.find((e) => e.kind === "datetime");
774
+ }
775
+ get isEmail() {
776
+ return !!this._def.checks.find((e) => e.kind === "email");
777
+ }
778
+ get isURL() {
779
+ return !!this._def.checks.find((e) => e.kind === "url");
780
+ }
781
+ get isEmoji() {
782
+ return !!this._def.checks.find((e) => e.kind === "emoji");
783
+ }
784
+ get isUUID() {
785
+ return !!this._def.checks.find((e) => e.kind === "uuid");
786
+ }
787
+ get isCUID() {
788
+ return !!this._def.checks.find((e) => e.kind === "cuid");
789
+ }
790
+ get isCUID2() {
791
+ return !!this._def.checks.find((e) => e.kind === "cuid2");
792
+ }
793
+ get isULID() {
794
+ return !!this._def.checks.find((e) => e.kind === "ulid");
795
+ }
796
+ get isIP() {
797
+ return !!this._def.checks.find((e) => e.kind === "ip");
798
+ }
799
+ get minLength() {
800
+ let e = null;
801
+ for (const t of this._def.checks)
802
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
803
+ return e;
804
+ }
805
+ get maxLength() {
806
+ let e = null;
807
+ for (const t of this._def.checks)
808
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
809
+ return e;
810
+ }
811
+ }
812
+ Z.create = (r) => {
813
+ var e;
814
+ return new Z({
815
+ checks: [],
816
+ typeName: p.ZodString,
817
+ coerce: (e = r == null ? void 0 : r.coerce) !== null && e !== void 0 ? e : !1,
818
+ ...y(r)
819
+ });
820
+ };
821
+ function We(r, e) {
822
+ const t = (r.toString().split(".")[1] || "").length, s = (e.toString().split(".")[1] || "").length, n = t > s ? t : s, a = parseInt(r.toFixed(n).replace(".", "")), i = parseInt(e.toFixed(n).replace(".", ""));
823
+ return a % i / Math.pow(10, n);
824
+ }
825
+ class A extends v {
826
+ constructor() {
827
+ super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;
828
+ }
829
+ _parse(e) {
830
+ if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== u.number) {
831
+ const a = this._getOrReturnCtx(e);
832
+ return l(a, {
833
+ code: c.invalid_type,
834
+ expected: u.number,
835
+ received: a.parsedType
836
+ }), m;
837
+ }
838
+ let s;
839
+ const n = new b();
840
+ for (const a of this._def.checks)
841
+ a.kind === "int" ? g.isInteger(e.data) || (s = this._getOrReturnCtx(e, s), l(s, {
842
+ code: c.invalid_type,
843
+ expected: "integer",
844
+ received: "float",
845
+ message: a.message
846
+ }), n.dirty()) : a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
847
+ code: c.too_small,
848
+ minimum: a.value,
849
+ type: "number",
850
+ inclusive: a.inclusive,
851
+ exact: !1,
852
+ message: a.message
853
+ }), n.dirty()) : a.kind === "max" ? (a.inclusive ? e.data > a.value : e.data >= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
854
+ code: c.too_big,
855
+ maximum: a.value,
856
+ type: "number",
857
+ inclusive: a.inclusive,
858
+ exact: !1,
859
+ message: a.message
860
+ }), n.dirty()) : a.kind === "multipleOf" ? We(e.data, a.value) !== 0 && (s = this._getOrReturnCtx(e, s), l(s, {
861
+ code: c.not_multiple_of,
862
+ multipleOf: a.value,
863
+ message: a.message
864
+ }), n.dirty()) : a.kind === "finite" ? Number.isFinite(e.data) || (s = this._getOrReturnCtx(e, s), l(s, {
865
+ code: c.not_finite,
866
+ message: a.message
867
+ }), n.dirty()) : g.assertNever(a);
868
+ return { status: n.value, value: e.data };
869
+ }
870
+ gte(e, t) {
871
+ return this.setLimit("min", e, !0, h.toString(t));
872
+ }
873
+ gt(e, t) {
874
+ return this.setLimit("min", e, !1, h.toString(t));
875
+ }
876
+ lte(e, t) {
877
+ return this.setLimit("max", e, !0, h.toString(t));
878
+ }
879
+ lt(e, t) {
880
+ return this.setLimit("max", e, !1, h.toString(t));
881
+ }
882
+ setLimit(e, t, s, n) {
883
+ return new A({
884
+ ...this._def,
885
+ checks: [
886
+ ...this._def.checks,
887
+ {
888
+ kind: e,
889
+ value: t,
890
+ inclusive: s,
891
+ message: h.toString(n)
892
+ }
893
+ ]
894
+ });
895
+ }
896
+ _addCheck(e) {
897
+ return new A({
898
+ ...this._def,
899
+ checks: [...this._def.checks, e]
900
+ });
901
+ }
902
+ int(e) {
903
+ return this._addCheck({
904
+ kind: "int",
905
+ message: h.toString(e)
906
+ });
907
+ }
908
+ positive(e) {
909
+ return this._addCheck({
910
+ kind: "min",
911
+ value: 0,
912
+ inclusive: !1,
913
+ message: h.toString(e)
914
+ });
915
+ }
916
+ negative(e) {
917
+ return this._addCheck({
918
+ kind: "max",
919
+ value: 0,
920
+ inclusive: !1,
921
+ message: h.toString(e)
922
+ });
923
+ }
924
+ nonpositive(e) {
925
+ return this._addCheck({
926
+ kind: "max",
927
+ value: 0,
928
+ inclusive: !0,
929
+ message: h.toString(e)
930
+ });
931
+ }
932
+ nonnegative(e) {
933
+ return this._addCheck({
934
+ kind: "min",
935
+ value: 0,
936
+ inclusive: !0,
937
+ message: h.toString(e)
938
+ });
939
+ }
940
+ multipleOf(e, t) {
941
+ return this._addCheck({
942
+ kind: "multipleOf",
943
+ value: e,
944
+ message: h.toString(t)
945
+ });
946
+ }
947
+ finite(e) {
948
+ return this._addCheck({
949
+ kind: "finite",
950
+ message: h.toString(e)
951
+ });
952
+ }
953
+ safe(e) {
954
+ return this._addCheck({
955
+ kind: "min",
956
+ inclusive: !0,
957
+ value: Number.MIN_SAFE_INTEGER,
958
+ message: h.toString(e)
959
+ })._addCheck({
960
+ kind: "max",
961
+ inclusive: !0,
962
+ value: Number.MAX_SAFE_INTEGER,
963
+ message: h.toString(e)
964
+ });
965
+ }
966
+ get minValue() {
967
+ let e = null;
968
+ for (const t of this._def.checks)
969
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
970
+ return e;
971
+ }
972
+ get maxValue() {
973
+ let e = null;
974
+ for (const t of this._def.checks)
975
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
976
+ return e;
977
+ }
978
+ get isInt() {
979
+ return !!this._def.checks.find((e) => e.kind === "int" || e.kind === "multipleOf" && g.isInteger(e.value));
980
+ }
981
+ get isFinite() {
982
+ let e = null, t = null;
983
+ for (const s of this._def.checks) {
984
+ if (s.kind === "finite" || s.kind === "int" || s.kind === "multipleOf")
985
+ return !0;
986
+ s.kind === "min" ? (t === null || s.value > t) && (t = s.value) : s.kind === "max" && (e === null || s.value < e) && (e = s.value);
987
+ }
988
+ return Number.isFinite(t) && Number.isFinite(e);
989
+ }
990
+ }
991
+ A.create = (r) => new A({
992
+ checks: [],
993
+ typeName: p.ZodNumber,
994
+ coerce: (r == null ? void 0 : r.coerce) || !1,
995
+ ...y(r)
996
+ });
997
+ class M extends v {
998
+ constructor() {
999
+ super(...arguments), this.min = this.gte, this.max = this.lte;
1000
+ }
1001
+ _parse(e) {
1002
+ if (this._def.coerce && (e.data = BigInt(e.data)), this._getType(e) !== u.bigint) {
1003
+ const a = this._getOrReturnCtx(e);
1004
+ return l(a, {
1005
+ code: c.invalid_type,
1006
+ expected: u.bigint,
1007
+ received: a.parsedType
1008
+ }), m;
1009
+ }
1010
+ let s;
1011
+ const n = new b();
1012
+ for (const a of this._def.checks)
1013
+ a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
1014
+ code: c.too_small,
1015
+ type: "bigint",
1016
+ minimum: a.value,
1017
+ inclusive: a.inclusive,
1018
+ message: a.message
1019
+ }), n.dirty()) : a.kind === "max" ? (a.inclusive ? e.data > a.value : e.data >= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
1020
+ code: c.too_big,
1021
+ type: "bigint",
1022
+ maximum: a.value,
1023
+ inclusive: a.inclusive,
1024
+ message: a.message
1025
+ }), n.dirty()) : a.kind === "multipleOf" ? e.data % a.value !== BigInt(0) && (s = this._getOrReturnCtx(e, s), l(s, {
1026
+ code: c.not_multiple_of,
1027
+ multipleOf: a.value,
1028
+ message: a.message
1029
+ }), n.dirty()) : g.assertNever(a);
1030
+ return { status: n.value, value: e.data };
1031
+ }
1032
+ gte(e, t) {
1033
+ return this.setLimit("min", e, !0, h.toString(t));
1034
+ }
1035
+ gt(e, t) {
1036
+ return this.setLimit("min", e, !1, h.toString(t));
1037
+ }
1038
+ lte(e, t) {
1039
+ return this.setLimit("max", e, !0, h.toString(t));
1040
+ }
1041
+ lt(e, t) {
1042
+ return this.setLimit("max", e, !1, h.toString(t));
1043
+ }
1044
+ setLimit(e, t, s, n) {
1045
+ return new M({
1046
+ ...this._def,
1047
+ checks: [
1048
+ ...this._def.checks,
1049
+ {
1050
+ kind: e,
1051
+ value: t,
1052
+ inclusive: s,
1053
+ message: h.toString(n)
1054
+ }
1055
+ ]
1056
+ });
1057
+ }
1058
+ _addCheck(e) {
1059
+ return new M({
1060
+ ...this._def,
1061
+ checks: [...this._def.checks, e]
1062
+ });
1063
+ }
1064
+ positive(e) {
1065
+ return this._addCheck({
1066
+ kind: "min",
1067
+ value: BigInt(0),
1068
+ inclusive: !1,
1069
+ message: h.toString(e)
1070
+ });
1071
+ }
1072
+ negative(e) {
1073
+ return this._addCheck({
1074
+ kind: "max",
1075
+ value: BigInt(0),
1076
+ inclusive: !1,
1077
+ message: h.toString(e)
1078
+ });
1079
+ }
1080
+ nonpositive(e) {
1081
+ return this._addCheck({
1082
+ kind: "max",
1083
+ value: BigInt(0),
1084
+ inclusive: !0,
1085
+ message: h.toString(e)
1086
+ });
1087
+ }
1088
+ nonnegative(e) {
1089
+ return this._addCheck({
1090
+ kind: "min",
1091
+ value: BigInt(0),
1092
+ inclusive: !0,
1093
+ message: h.toString(e)
1094
+ });
1095
+ }
1096
+ multipleOf(e, t) {
1097
+ return this._addCheck({
1098
+ kind: "multipleOf",
1099
+ value: e,
1100
+ message: h.toString(t)
1101
+ });
1102
+ }
1103
+ get minValue() {
1104
+ let e = null;
1105
+ for (const t of this._def.checks)
1106
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1107
+ return e;
1108
+ }
1109
+ get maxValue() {
1110
+ let e = null;
1111
+ for (const t of this._def.checks)
1112
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1113
+ return e;
1114
+ }
1115
+ }
1116
+ M.create = (r) => {
1117
+ var e;
1118
+ return new M({
1119
+ checks: [],
1120
+ typeName: p.ZodBigInt,
1121
+ coerce: (e = r == null ? void 0 : r.coerce) !== null && e !== void 0 ? e : !1,
1122
+ ...y(r)
1123
+ });
1124
+ };
1125
+ class Y extends v {
1126
+ _parse(e) {
1127
+ if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== u.boolean) {
1128
+ const s = this._getOrReturnCtx(e);
1129
+ return l(s, {
1130
+ code: c.invalid_type,
1131
+ expected: u.boolean,
1132
+ received: s.parsedType
1133
+ }), m;
1134
+ }
1135
+ return w(e.data);
1136
+ }
1137
+ }
1138
+ Y.create = (r) => new Y({
1139
+ typeName: p.ZodBoolean,
1140
+ coerce: (r == null ? void 0 : r.coerce) || !1,
1141
+ ...y(r)
1142
+ });
1143
+ class $ extends v {
1144
+ _parse(e) {
1145
+ if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== u.date) {
1146
+ const a = this._getOrReturnCtx(e);
1147
+ return l(a, {
1148
+ code: c.invalid_type,
1149
+ expected: u.date,
1150
+ received: a.parsedType
1151
+ }), m;
1152
+ }
1153
+ if (isNaN(e.data.getTime())) {
1154
+ const a = this._getOrReturnCtx(e);
1155
+ return l(a, {
1156
+ code: c.invalid_date
1157
+ }), m;
1158
+ }
1159
+ const s = new b();
1160
+ let n;
1161
+ for (const a of this._def.checks)
1162
+ a.kind === "min" ? e.data.getTime() < a.value && (n = this._getOrReturnCtx(e, n), l(n, {
1163
+ code: c.too_small,
1164
+ message: a.message,
1165
+ inclusive: !0,
1166
+ exact: !1,
1167
+ minimum: a.value,
1168
+ type: "date"
1169
+ }), s.dirty()) : a.kind === "max" ? e.data.getTime() > a.value && (n = this._getOrReturnCtx(e, n), l(n, {
1170
+ code: c.too_big,
1171
+ message: a.message,
1172
+ inclusive: !0,
1173
+ exact: !1,
1174
+ maximum: a.value,
1175
+ type: "date"
1176
+ }), s.dirty()) : g.assertNever(a);
1177
+ return {
1178
+ status: s.value,
1179
+ value: new Date(e.data.getTime())
1180
+ };
1181
+ }
1182
+ _addCheck(e) {
1183
+ return new $({
1184
+ ...this._def,
1185
+ checks: [...this._def.checks, e]
1186
+ });
1187
+ }
1188
+ min(e, t) {
1189
+ return this._addCheck({
1190
+ kind: "min",
1191
+ value: e.getTime(),
1192
+ message: h.toString(t)
1193
+ });
1194
+ }
1195
+ max(e, t) {
1196
+ return this._addCheck({
1197
+ kind: "max",
1198
+ value: e.getTime(),
1199
+ message: h.toString(t)
1200
+ });
1201
+ }
1202
+ get minDate() {
1203
+ let e = null;
1204
+ for (const t of this._def.checks)
1205
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1206
+ return e != null ? new Date(e) : null;
1207
+ }
1208
+ get maxDate() {
1209
+ let e = null;
1210
+ for (const t of this._def.checks)
1211
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1212
+ return e != null ? new Date(e) : null;
1213
+ }
1214
+ }
1215
+ $.create = (r) => new $({
1216
+ checks: [],
1217
+ coerce: (r == null ? void 0 : r.coerce) || !1,
1218
+ typeName: p.ZodDate,
1219
+ ...y(r)
1220
+ });
1221
+ class ce extends v {
1222
+ _parse(e) {
1223
+ if (this._getType(e) !== u.symbol) {
1224
+ const s = this._getOrReturnCtx(e);
1225
+ return l(s, {
1226
+ code: c.invalid_type,
1227
+ expected: u.symbol,
1228
+ received: s.parsedType
1229
+ }), m;
1230
+ }
1231
+ return w(e.data);
1232
+ }
1233
+ }
1234
+ ce.create = (r) => new ce({
1235
+ typeName: p.ZodSymbol,
1236
+ ...y(r)
1237
+ });
1238
+ class H extends v {
1239
+ _parse(e) {
1240
+ if (this._getType(e) !== u.undefined) {
1241
+ const s = this._getOrReturnCtx(e);
1242
+ return l(s, {
1243
+ code: c.invalid_type,
1244
+ expected: u.undefined,
1245
+ received: s.parsedType
1246
+ }), m;
1247
+ }
1248
+ return w(e.data);
1249
+ }
1250
+ }
1251
+ H.create = (r) => new H({
1252
+ typeName: p.ZodUndefined,
1253
+ ...y(r)
1254
+ });
1255
+ class G extends v {
1256
+ _parse(e) {
1257
+ if (this._getType(e) !== u.null) {
1258
+ const s = this._getOrReturnCtx(e);
1259
+ return l(s, {
1260
+ code: c.invalid_type,
1261
+ expected: u.null,
1262
+ received: s.parsedType
1263
+ }), m;
1264
+ }
1265
+ return w(e.data);
1266
+ }
1267
+ }
1268
+ G.create = (r) => new G({
1269
+ typeName: p.ZodNull,
1270
+ ...y(r)
1271
+ });
1272
+ class B extends v {
1273
+ constructor() {
1274
+ super(...arguments), this._any = !0;
1275
+ }
1276
+ _parse(e) {
1277
+ return w(e.data);
1278
+ }
1279
+ }
1280
+ B.create = (r) => new B({
1281
+ typeName: p.ZodAny,
1282
+ ...y(r)
1283
+ });
1284
+ class V extends v {
1285
+ constructor() {
1286
+ super(...arguments), this._unknown = !0;
1287
+ }
1288
+ _parse(e) {
1289
+ return w(e.data);
1290
+ }
1291
+ }
1292
+ V.create = (r) => new V({
1293
+ typeName: p.ZodUnknown,
1294
+ ...y(r)
1295
+ });
1296
+ class R extends v {
1297
+ _parse(e) {
1298
+ const t = this._getOrReturnCtx(e);
1299
+ return l(t, {
1300
+ code: c.invalid_type,
1301
+ expected: u.never,
1302
+ received: t.parsedType
1303
+ }), m;
1304
+ }
1305
+ }
1306
+ R.create = (r) => new R({
1307
+ typeName: p.ZodNever,
1308
+ ...y(r)
1309
+ });
1310
+ class de extends v {
1311
+ _parse(e) {
1312
+ if (this._getType(e) !== u.undefined) {
1313
+ const s = this._getOrReturnCtx(e);
1314
+ return l(s, {
1315
+ code: c.invalid_type,
1316
+ expected: u.void,
1317
+ received: s.parsedType
1318
+ }), m;
1319
+ }
1320
+ return w(e.data);
1321
+ }
1322
+ }
1323
+ de.create = (r) => new de({
1324
+ typeName: p.ZodVoid,
1325
+ ...y(r)
1326
+ });
1327
+ class N extends v {
1328
+ _parse(e) {
1329
+ const { ctx: t, status: s } = this._processInputParams(e), n = this._def;
1330
+ if (t.parsedType !== u.array)
1331
+ return l(t, {
1332
+ code: c.invalid_type,
1333
+ expected: u.array,
1334
+ received: t.parsedType
1335
+ }), m;
1336
+ if (n.exactLength !== null) {
1337
+ const i = t.data.length > n.exactLength.value, o = t.data.length < n.exactLength.value;
1338
+ (i || o) && (l(t, {
1339
+ code: i ? c.too_big : c.too_small,
1340
+ minimum: o ? n.exactLength.value : void 0,
1341
+ maximum: i ? n.exactLength.value : void 0,
1342
+ type: "array",
1343
+ inclusive: !0,
1344
+ exact: !0,
1345
+ message: n.exactLength.message
1346
+ }), s.dirty());
1347
+ }
1348
+ if (n.minLength !== null && t.data.length < n.minLength.value && (l(t, {
1349
+ code: c.too_small,
1350
+ minimum: n.minLength.value,
1351
+ type: "array",
1352
+ inclusive: !0,
1353
+ exact: !1,
1354
+ message: n.minLength.message
1355
+ }), s.dirty()), n.maxLength !== null && t.data.length > n.maxLength.value && (l(t, {
1356
+ code: c.too_big,
1357
+ maximum: n.maxLength.value,
1358
+ type: "array",
1359
+ inclusive: !0,
1360
+ exact: !1,
1361
+ message: n.maxLength.message
1362
+ }), s.dirty()), t.common.async)
1363
+ return Promise.all([...t.data].map((i, o) => n.type._parseAsync(new O(t, i, t.path, o)))).then((i) => b.mergeArray(s, i));
1364
+ const a = [...t.data].map((i, o) => n.type._parseSync(new O(t, i, t.path, o)));
1365
+ return b.mergeArray(s, a);
1366
+ }
1367
+ get element() {
1368
+ return this._def.type;
1369
+ }
1370
+ min(e, t) {
1371
+ return new N({
1372
+ ...this._def,
1373
+ minLength: { value: e, message: h.toString(t) }
1374
+ });
1375
+ }
1376
+ max(e, t) {
1377
+ return new N({
1378
+ ...this._def,
1379
+ maxLength: { value: e, message: h.toString(t) }
1380
+ });
1381
+ }
1382
+ length(e, t) {
1383
+ return new N({
1384
+ ...this._def,
1385
+ exactLength: { value: e, message: h.toString(t) }
1386
+ });
1387
+ }
1388
+ nonempty(e) {
1389
+ return this.min(1, e);
1390
+ }
1391
+ }
1392
+ N.create = (r, e) => new N({
1393
+ type: r,
1394
+ minLength: null,
1395
+ maxLength: null,
1396
+ exactLength: null,
1397
+ typeName: p.ZodArray,
1398
+ ...y(e)
1399
+ });
1400
+ function z(r) {
1401
+ if (r instanceof x) {
1402
+ const e = {};
1403
+ for (const t in r.shape) {
1404
+ const s = r.shape[t];
1405
+ e[t] = I.create(z(s));
1406
+ }
1407
+ return new x({
1408
+ ...r._def,
1409
+ shape: () => e
1410
+ });
1411
+ } else
1412
+ return r instanceof N ? new N({
1413
+ ...r._def,
1414
+ type: z(r.element)
1415
+ }) : r instanceof I ? I.create(z(r.unwrap())) : r instanceof D ? D.create(z(r.unwrap())) : r instanceof E ? E.create(r.items.map((e) => z(e))) : r;
1416
+ }
1417
+ class x extends v {
1418
+ constructor() {
1419
+ super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend;
1420
+ }
1421
+ _getCached() {
1422
+ if (this._cached !== null)
1423
+ return this._cached;
1424
+ const e = this._def.shape(), t = g.objectKeys(e);
1425
+ return this._cached = { shape: e, keys: t };
1426
+ }
1427
+ _parse(e) {
1428
+ if (this._getType(e) !== u.object) {
1429
+ const d = this._getOrReturnCtx(e);
1430
+ return l(d, {
1431
+ code: c.invalid_type,
1432
+ expected: u.object,
1433
+ received: d.parsedType
1434
+ }), m;
1435
+ }
1436
+ const { status: s, ctx: n } = this._processInputParams(e), { shape: a, keys: i } = this._getCached(), o = [];
1437
+ if (!(this._def.catchall instanceof R && this._def.unknownKeys === "strip"))
1438
+ for (const d in n.data)
1439
+ i.includes(d) || o.push(d);
1440
+ const f = [];
1441
+ for (const d of i) {
1442
+ const _ = a[d], T = n.data[d];
1443
+ f.push({
1444
+ key: { status: "valid", value: d },
1445
+ value: _._parse(new O(n, T, n.path, d)),
1446
+ alwaysSet: d in n.data
1447
+ });
1448
+ }
1449
+ if (this._def.catchall instanceof R) {
1450
+ const d = this._def.unknownKeys;
1451
+ if (d === "passthrough")
1452
+ for (const _ of o)
1453
+ f.push({
1454
+ key: { status: "valid", value: _ },
1455
+ value: { status: "valid", value: n.data[_] }
1456
+ });
1457
+ else if (d === "strict")
1458
+ o.length > 0 && (l(n, {
1459
+ code: c.unrecognized_keys,
1460
+ keys: o
1461
+ }), s.dirty());
1462
+ else if (d !== "strip")
1463
+ throw new Error("Internal ZodObject error: invalid unknownKeys value.");
1464
+ } else {
1465
+ const d = this._def.catchall;
1466
+ for (const _ of o) {
1467
+ const T = n.data[_];
1468
+ f.push({
1469
+ key: { status: "valid", value: _ },
1470
+ value: d._parse(
1471
+ new O(n, T, n.path, _)
1472
+ //, ctx.child(key), value, getParsedType(value)
1473
+ ),
1474
+ alwaysSet: _ in n.data
1475
+ });
1476
+ }
1477
+ }
1478
+ return n.common.async ? Promise.resolve().then(async () => {
1479
+ const d = [];
1480
+ for (const _ of f) {
1481
+ const T = await _.key;
1482
+ d.push({
1483
+ key: T,
1484
+ value: await _.value,
1485
+ alwaysSet: _.alwaysSet
1486
+ });
1487
+ }
1488
+ return d;
1489
+ }).then((d) => b.mergeObjectSync(s, d)) : b.mergeObjectSync(s, f);
1490
+ }
1491
+ get shape() {
1492
+ return this._def.shape();
1493
+ }
1494
+ strict(e) {
1495
+ return h.errToObj, new x({
1496
+ ...this._def,
1497
+ unknownKeys: "strict",
1498
+ ...e !== void 0 ? {
1499
+ errorMap: (t, s) => {
1500
+ var n, a, i, o;
1501
+ const f = (i = (a = (n = this._def).errorMap) === null || a === void 0 ? void 0 : a.call(n, t, s).message) !== null && i !== void 0 ? i : s.defaultError;
1502
+ return t.code === "unrecognized_keys" ? {
1503
+ message: (o = h.errToObj(e).message) !== null && o !== void 0 ? o : f
1504
+ } : {
1505
+ message: f
1506
+ };
1507
+ }
1508
+ } : {}
1509
+ });
1510
+ }
1511
+ strip() {
1512
+ return new x({
1513
+ ...this._def,
1514
+ unknownKeys: "strip"
1515
+ });
1516
+ }
1517
+ passthrough() {
1518
+ return new x({
1519
+ ...this._def,
1520
+ unknownKeys: "passthrough"
1521
+ });
1522
+ }
1523
+ // const AugmentFactory =
1524
+ // <Def extends ZodObjectDef>(def: Def) =>
1525
+ // <Augmentation extends ZodRawShape>(
1526
+ // augmentation: Augmentation
1527
+ // ): ZodObject<
1528
+ // extendShape<ReturnType<Def["shape"]>, Augmentation>,
1529
+ // Def["unknownKeys"],
1530
+ // Def["catchall"]
1531
+ // > => {
1532
+ // return new ZodObject({
1533
+ // ...def,
1534
+ // shape: () => ({
1535
+ // ...def.shape(),
1536
+ // ...augmentation,
1537
+ // }),
1538
+ // }) as any;
1539
+ // };
1540
+ extend(e) {
1541
+ return new x({
1542
+ ...this._def,
1543
+ shape: () => ({
1544
+ ...this._def.shape(),
1545
+ ...e
1546
+ })
1547
+ });
1548
+ }
1549
+ /**
1550
+ * Prior to zod@1.0.12 there was a bug in the
1551
+ * inferred type of merged objects. Please
1552
+ * upgrade if you are experiencing issues.
1553
+ */
1554
+ merge(e) {
1555
+ return new x({
1556
+ unknownKeys: e._def.unknownKeys,
1557
+ catchall: e._def.catchall,
1558
+ shape: () => ({
1559
+ ...this._def.shape(),
1560
+ ...e._def.shape()
1561
+ }),
1562
+ typeName: p.ZodObject
1563
+ });
1564
+ }
1565
+ // merge<
1566
+ // Incoming extends AnyZodObject,
1567
+ // Augmentation extends Incoming["shape"],
1568
+ // NewOutput extends {
1569
+ // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation
1570
+ // ? Augmentation[k]["_output"]
1571
+ // : k extends keyof Output
1572
+ // ? Output[k]
1573
+ // : never;
1574
+ // },
1575
+ // NewInput extends {
1576
+ // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation
1577
+ // ? Augmentation[k]["_input"]
1578
+ // : k extends keyof Input
1579
+ // ? Input[k]
1580
+ // : never;
1581
+ // }
1582
+ // >(
1583
+ // merging: Incoming
1584
+ // ): ZodObject<
1585
+ // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
1586
+ // Incoming["_def"]["unknownKeys"],
1587
+ // Incoming["_def"]["catchall"],
1588
+ // NewOutput,
1589
+ // NewInput
1590
+ // > {
1591
+ // const merged: any = new ZodObject({
1592
+ // unknownKeys: merging._def.unknownKeys,
1593
+ // catchall: merging._def.catchall,
1594
+ // shape: () =>
1595
+ // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
1596
+ // typeName: ZodFirstPartyTypeKind.ZodObject,
1597
+ // }) as any;
1598
+ // return merged;
1599
+ // }
1600
+ setKey(e, t) {
1601
+ return this.augment({ [e]: t });
1602
+ }
1603
+ // merge<Incoming extends AnyZodObject>(
1604
+ // merging: Incoming
1605
+ // ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => {
1606
+ // ZodObject<
1607
+ // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
1608
+ // Incoming["_def"]["unknownKeys"],
1609
+ // Incoming["_def"]["catchall"]
1610
+ // > {
1611
+ // // const mergedShape = objectUtil.mergeShapes(
1612
+ // // this._def.shape(),
1613
+ // // merging._def.shape()
1614
+ // // );
1615
+ // const merged: any = new ZodObject({
1616
+ // unknownKeys: merging._def.unknownKeys,
1617
+ // catchall: merging._def.catchall,
1618
+ // shape: () =>
1619
+ // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
1620
+ // typeName: ZodFirstPartyTypeKind.ZodObject,
1621
+ // }) as any;
1622
+ // return merged;
1623
+ // }
1624
+ catchall(e) {
1625
+ return new x({
1626
+ ...this._def,
1627
+ catchall: e
1628
+ });
1629
+ }
1630
+ pick(e) {
1631
+ const t = {};
1632
+ return g.objectKeys(e).forEach((s) => {
1633
+ e[s] && this.shape[s] && (t[s] = this.shape[s]);
1634
+ }), new x({
1635
+ ...this._def,
1636
+ shape: () => t
1637
+ });
1638
+ }
1639
+ omit(e) {
1640
+ const t = {};
1641
+ return g.objectKeys(this.shape).forEach((s) => {
1642
+ e[s] || (t[s] = this.shape[s]);
1643
+ }), new x({
1644
+ ...this._def,
1645
+ shape: () => t
1646
+ });
1647
+ }
1648
+ /**
1649
+ * @deprecated
1650
+ */
1651
+ deepPartial() {
1652
+ return z(this);
1653
+ }
1654
+ partial(e) {
1655
+ const t = {};
1656
+ return g.objectKeys(this.shape).forEach((s) => {
1657
+ const n = this.shape[s];
1658
+ e && !e[s] ? t[s] = n : t[s] = n.optional();
1659
+ }), new x({
1660
+ ...this._def,
1661
+ shape: () => t
1662
+ });
1663
+ }
1664
+ required(e) {
1665
+ const t = {};
1666
+ return g.objectKeys(this.shape).forEach((s) => {
1667
+ if (e && !e[s])
1668
+ t[s] = this.shape[s];
1669
+ else {
1670
+ let a = this.shape[s];
1671
+ for (; a instanceof I; )
1672
+ a = a._def.innerType;
1673
+ t[s] = a;
1674
+ }
1675
+ }), new x({
1676
+ ...this._def,
1677
+ shape: () => t
1678
+ });
1679
+ }
1680
+ keyof() {
1681
+ return Ze(g.objectKeys(this.shape));
1682
+ }
1683
+ }
1684
+ x.create = (r, e) => new x({
1685
+ shape: () => r,
1686
+ unknownKeys: "strip",
1687
+ catchall: R.create(),
1688
+ typeName: p.ZodObject,
1689
+ ...y(e)
1690
+ });
1691
+ x.strictCreate = (r, e) => new x({
1692
+ shape: () => r,
1693
+ unknownKeys: "strict",
1694
+ catchall: R.create(),
1695
+ typeName: p.ZodObject,
1696
+ ...y(e)
1697
+ });
1698
+ x.lazycreate = (r, e) => new x({
1699
+ shape: r,
1700
+ unknownKeys: "strip",
1701
+ catchall: R.create(),
1702
+ typeName: p.ZodObject,
1703
+ ...y(e)
1704
+ });
1705
+ class X extends v {
1706
+ _parse(e) {
1707
+ const { ctx: t } = this._processInputParams(e), s = this._def.options;
1708
+ function n(a) {
1709
+ for (const o of a)
1710
+ if (o.result.status === "valid")
1711
+ return o.result;
1712
+ for (const o of a)
1713
+ if (o.result.status === "dirty")
1714
+ return t.common.issues.push(...o.ctx.common.issues), o.result;
1715
+ const i = a.map((o) => new S(o.ctx.common.issues));
1716
+ return l(t, {
1717
+ code: c.invalid_union,
1718
+ unionErrors: i
1719
+ }), m;
1720
+ }
1721
+ if (t.common.async)
1722
+ return Promise.all(s.map(async (a) => {
1723
+ const i = {
1724
+ ...t,
1725
+ common: {
1726
+ ...t.common,
1727
+ issues: []
1728
+ },
1729
+ parent: null
1730
+ };
1731
+ return {
1732
+ result: await a._parseAsync({
1733
+ data: t.data,
1734
+ path: t.path,
1735
+ parent: i
1736
+ }),
1737
+ ctx: i
1738
+ };
1739
+ })).then(n);
1740
+ {
1741
+ let a;
1742
+ const i = [];
1743
+ for (const f of s) {
1744
+ const d = {
1745
+ ...t,
1746
+ common: {
1747
+ ...t.common,
1748
+ issues: []
1749
+ },
1750
+ parent: null
1751
+ }, _ = f._parseSync({
1752
+ data: t.data,
1753
+ path: t.path,
1754
+ parent: d
1755
+ });
1756
+ if (_.status === "valid")
1757
+ return _;
1758
+ _.status === "dirty" && !a && (a = { result: _, ctx: d }), d.common.issues.length && i.push(d.common.issues);
1759
+ }
1760
+ if (a)
1761
+ return t.common.issues.push(...a.ctx.common.issues), a.result;
1762
+ const o = i.map((f) => new S(f));
1763
+ return l(t, {
1764
+ code: c.invalid_union,
1765
+ unionErrors: o
1766
+ }), m;
1767
+ }
1768
+ }
1769
+ get options() {
1770
+ return this._def.options;
1771
+ }
1772
+ }
1773
+ X.create = (r, e) => new X({
1774
+ options: r,
1775
+ typeName: p.ZodUnion,
1776
+ ...y(e)
1777
+ });
1778
+ const ne = (r) => r instanceof F ? ne(r.schema) : r instanceof C ? ne(r.innerType()) : r instanceof ee ? [r.value] : r instanceof P ? r.options : r instanceof te ? Object.keys(r.enum) : r instanceof re ? ne(r._def.innerType) : r instanceof H ? [void 0] : r instanceof G ? [null] : null;
1779
+ class pe extends v {
1780
+ _parse(e) {
1781
+ const { ctx: t } = this._processInputParams(e);
1782
+ if (t.parsedType !== u.object)
1783
+ return l(t, {
1784
+ code: c.invalid_type,
1785
+ expected: u.object,
1786
+ received: t.parsedType
1787
+ }), m;
1788
+ const s = this.discriminator, n = t.data[s], a = this.optionsMap.get(n);
1789
+ return a ? t.common.async ? a._parseAsync({
1790
+ data: t.data,
1791
+ path: t.path,
1792
+ parent: t
1793
+ }) : a._parseSync({
1794
+ data: t.data,
1795
+ path: t.path,
1796
+ parent: t
1797
+ }) : (l(t, {
1798
+ code: c.invalid_union_discriminator,
1799
+ options: Array.from(this.optionsMap.keys()),
1800
+ path: [s]
1801
+ }), m);
1802
+ }
1803
+ get discriminator() {
1804
+ return this._def.discriminator;
1805
+ }
1806
+ get options() {
1807
+ return this._def.options;
1808
+ }
1809
+ get optionsMap() {
1810
+ return this._def.optionsMap;
1811
+ }
1812
+ /**
1813
+ * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.
1814
+ * However, it only allows a union of objects, all of which need to share a discriminator property. This property must
1815
+ * have a different value for each object in the union.
1816
+ * @param discriminator the name of the discriminator property
1817
+ * @param types an array of object schemas
1818
+ * @param params
1819
+ */
1820
+ static create(e, t, s) {
1821
+ const n = /* @__PURE__ */ new Map();
1822
+ for (const a of t) {
1823
+ const i = ne(a.shape[e]);
1824
+ if (!i)
1825
+ throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);
1826
+ for (const o of i) {
1827
+ if (n.has(o))
1828
+ throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);
1829
+ n.set(o, a);
1830
+ }
1831
+ }
1832
+ return new pe({
1833
+ typeName: p.ZodDiscriminatedUnion,
1834
+ discriminator: e,
1835
+ options: t,
1836
+ optionsMap: n,
1837
+ ...y(s)
1838
+ });
1839
+ }
1840
+ }
1841
+ function xe(r, e) {
1842
+ const t = j(r), s = j(e);
1843
+ if (r === e)
1844
+ return { valid: !0, data: r };
1845
+ if (t === u.object && s === u.object) {
1846
+ const n = g.objectKeys(e), a = g.objectKeys(r).filter((o) => n.indexOf(o) !== -1), i = { ...r, ...e };
1847
+ for (const o of a) {
1848
+ const f = xe(r[o], e[o]);
1849
+ if (!f.valid)
1850
+ return { valid: !1 };
1851
+ i[o] = f.data;
1852
+ }
1853
+ return { valid: !0, data: i };
1854
+ } else if (t === u.array && s === u.array) {
1855
+ if (r.length !== e.length)
1856
+ return { valid: !1 };
1857
+ const n = [];
1858
+ for (let a = 0; a < r.length; a++) {
1859
+ const i = r[a], o = e[a], f = xe(i, o);
1860
+ if (!f.valid)
1861
+ return { valid: !1 };
1862
+ n.push(f.data);
1863
+ }
1864
+ return { valid: !0, data: n };
1865
+ } else
1866
+ return t === u.date && s === u.date && +r == +e ? { valid: !0, data: r } : { valid: !1 };
1867
+ }
1868
+ class Q extends v {
1869
+ _parse(e) {
1870
+ const { status: t, ctx: s } = this._processInputParams(e), n = (a, i) => {
1871
+ if (_e(a) || _e(i))
1872
+ return m;
1873
+ const o = xe(a.value, i.value);
1874
+ return o.valid ? ((ge(a) || ge(i)) && t.dirty(), { status: t.value, value: o.data }) : (l(s, {
1875
+ code: c.invalid_intersection_types
1876
+ }), m);
1877
+ };
1878
+ return s.common.async ? Promise.all([
1879
+ this._def.left._parseAsync({
1880
+ data: s.data,
1881
+ path: s.path,
1882
+ parent: s
1883
+ }),
1884
+ this._def.right._parseAsync({
1885
+ data: s.data,
1886
+ path: s.path,
1887
+ parent: s
1888
+ })
1889
+ ]).then(([a, i]) => n(a, i)) : n(this._def.left._parseSync({
1890
+ data: s.data,
1891
+ path: s.path,
1892
+ parent: s
1893
+ }), this._def.right._parseSync({
1894
+ data: s.data,
1895
+ path: s.path,
1896
+ parent: s
1897
+ }));
1898
+ }
1899
+ }
1900
+ Q.create = (r, e, t) => new Q({
1901
+ left: r,
1902
+ right: e,
1903
+ typeName: p.ZodIntersection,
1904
+ ...y(t)
1905
+ });
1906
+ class E extends v {
1907
+ _parse(e) {
1908
+ const { status: t, ctx: s } = this._processInputParams(e);
1909
+ if (s.parsedType !== u.array)
1910
+ return l(s, {
1911
+ code: c.invalid_type,
1912
+ expected: u.array,
1913
+ received: s.parsedType
1914
+ }), m;
1915
+ if (s.data.length < this._def.items.length)
1916
+ return l(s, {
1917
+ code: c.too_small,
1918
+ minimum: this._def.items.length,
1919
+ inclusive: !0,
1920
+ exact: !1,
1921
+ type: "array"
1922
+ }), m;
1923
+ !this._def.rest && s.data.length > this._def.items.length && (l(s, {
1924
+ code: c.too_big,
1925
+ maximum: this._def.items.length,
1926
+ inclusive: !0,
1927
+ exact: !1,
1928
+ type: "array"
1929
+ }), t.dirty());
1930
+ const a = [...s.data].map((i, o) => {
1931
+ const f = this._def.items[o] || this._def.rest;
1932
+ return f ? f._parse(new O(s, i, s.path, o)) : null;
1933
+ }).filter((i) => !!i);
1934
+ return s.common.async ? Promise.all(a).then((i) => b.mergeArray(t, i)) : b.mergeArray(t, a);
1935
+ }
1936
+ get items() {
1937
+ return this._def.items;
1938
+ }
1939
+ rest(e) {
1940
+ return new E({
1941
+ ...this._def,
1942
+ rest: e
1943
+ });
1944
+ }
1945
+ }
1946
+ E.create = (r, e) => {
1947
+ if (!Array.isArray(r))
1948
+ throw new Error("You must pass an array of schemas to z.tuple([ ... ])");
1949
+ return new E({
1950
+ items: r,
1951
+ typeName: p.ZodTuple,
1952
+ rest: null,
1953
+ ...y(e)
1954
+ });
1955
+ };
1956
+ class K extends v {
1957
+ get keySchema() {
1958
+ return this._def.keyType;
1959
+ }
1960
+ get valueSchema() {
1961
+ return this._def.valueType;
1962
+ }
1963
+ _parse(e) {
1964
+ const { status: t, ctx: s } = this._processInputParams(e);
1965
+ if (s.parsedType !== u.object)
1966
+ return l(s, {
1967
+ code: c.invalid_type,
1968
+ expected: u.object,
1969
+ received: s.parsedType
1970
+ }), m;
1971
+ const n = [], a = this._def.keyType, i = this._def.valueType;
1972
+ for (const o in s.data)
1973
+ n.push({
1974
+ key: a._parse(new O(s, o, s.path, o)),
1975
+ value: i._parse(new O(s, s.data[o], s.path, o))
1976
+ });
1977
+ return s.common.async ? b.mergeObjectAsync(t, n) : b.mergeObjectSync(t, n);
1978
+ }
1979
+ get element() {
1980
+ return this._def.valueType;
1981
+ }
1982
+ static create(e, t, s) {
1983
+ return t instanceof v ? new K({
1984
+ keyType: e,
1985
+ valueType: t,
1986
+ typeName: p.ZodRecord,
1987
+ ...y(s)
1988
+ }) : new K({
1989
+ keyType: Z.create(),
1990
+ valueType: e,
1991
+ typeName: p.ZodRecord,
1992
+ ...y(t)
1993
+ });
1994
+ }
1995
+ }
1996
+ class ue extends v {
1997
+ get keySchema() {
1998
+ return this._def.keyType;
1999
+ }
2000
+ get valueSchema() {
2001
+ return this._def.valueType;
2002
+ }
2003
+ _parse(e) {
2004
+ const { status: t, ctx: s } = this._processInputParams(e);
2005
+ if (s.parsedType !== u.map)
2006
+ return l(s, {
2007
+ code: c.invalid_type,
2008
+ expected: u.map,
2009
+ received: s.parsedType
2010
+ }), m;
2011
+ const n = this._def.keyType, a = this._def.valueType, i = [...s.data.entries()].map(([o, f], d) => ({
2012
+ key: n._parse(new O(s, o, s.path, [d, "key"])),
2013
+ value: a._parse(new O(s, f, s.path, [d, "value"]))
2014
+ }));
2015
+ if (s.common.async) {
2016
+ const o = /* @__PURE__ */ new Map();
2017
+ return Promise.resolve().then(async () => {
2018
+ for (const f of i) {
2019
+ const d = await f.key, _ = await f.value;
2020
+ if (d.status === "aborted" || _.status === "aborted")
2021
+ return m;
2022
+ (d.status === "dirty" || _.status === "dirty") && t.dirty(), o.set(d.value, _.value);
2023
+ }
2024
+ return { status: t.value, value: o };
2025
+ });
2026
+ } else {
2027
+ const o = /* @__PURE__ */ new Map();
2028
+ for (const f of i) {
2029
+ const d = f.key, _ = f.value;
2030
+ if (d.status === "aborted" || _.status === "aborted")
2031
+ return m;
2032
+ (d.status === "dirty" || _.status === "dirty") && t.dirty(), o.set(d.value, _.value);
2033
+ }
2034
+ return { status: t.value, value: o };
2035
+ }
2036
+ }
2037
+ }
2038
+ ue.create = (r, e, t) => new ue({
2039
+ valueType: e,
2040
+ keyType: r,
2041
+ typeName: p.ZodMap,
2042
+ ...y(t)
2043
+ });
2044
+ class L extends v {
2045
+ _parse(e) {
2046
+ const { status: t, ctx: s } = this._processInputParams(e);
2047
+ if (s.parsedType !== u.set)
2048
+ return l(s, {
2049
+ code: c.invalid_type,
2050
+ expected: u.set,
2051
+ received: s.parsedType
2052
+ }), m;
2053
+ const n = this._def;
2054
+ n.minSize !== null && s.data.size < n.minSize.value && (l(s, {
2055
+ code: c.too_small,
2056
+ minimum: n.minSize.value,
2057
+ type: "set",
2058
+ inclusive: !0,
2059
+ exact: !1,
2060
+ message: n.minSize.message
2061
+ }), t.dirty()), n.maxSize !== null && s.data.size > n.maxSize.value && (l(s, {
2062
+ code: c.too_big,
2063
+ maximum: n.maxSize.value,
2064
+ type: "set",
2065
+ inclusive: !0,
2066
+ exact: !1,
2067
+ message: n.maxSize.message
2068
+ }), t.dirty());
2069
+ const a = this._def.valueType;
2070
+ function i(f) {
2071
+ const d = /* @__PURE__ */ new Set();
2072
+ for (const _ of f) {
2073
+ if (_.status === "aborted")
2074
+ return m;
2075
+ _.status === "dirty" && t.dirty(), d.add(_.value);
2076
+ }
2077
+ return { status: t.value, value: d };
2078
+ }
2079
+ const o = [...s.data.values()].map((f, d) => a._parse(new O(s, f, s.path, d)));
2080
+ return s.common.async ? Promise.all(o).then((f) => i(f)) : i(o);
2081
+ }
2082
+ min(e, t) {
2083
+ return new L({
2084
+ ...this._def,
2085
+ minSize: { value: e, message: h.toString(t) }
2086
+ });
2087
+ }
2088
+ max(e, t) {
2089
+ return new L({
2090
+ ...this._def,
2091
+ maxSize: { value: e, message: h.toString(t) }
2092
+ });
2093
+ }
2094
+ size(e, t) {
2095
+ return this.min(e, t).max(e, t);
2096
+ }
2097
+ nonempty(e) {
2098
+ return this.min(1, e);
2099
+ }
2100
+ }
2101
+ L.create = (r, e) => new L({
2102
+ valueType: r,
2103
+ minSize: null,
2104
+ maxSize: null,
2105
+ typeName: p.ZodSet,
2106
+ ...y(e)
2107
+ });
2108
+ class U extends v {
2109
+ constructor() {
2110
+ super(...arguments), this.validate = this.implement;
2111
+ }
2112
+ _parse(e) {
2113
+ const { ctx: t } = this._processInputParams(e);
2114
+ if (t.parsedType !== u.function)
2115
+ return l(t, {
2116
+ code: c.invalid_type,
2117
+ expected: u.function,
2118
+ received: t.parsedType
2119
+ }), m;
2120
+ function s(o, f) {
2121
+ return ie({
2122
+ data: o,
2123
+ path: t.path,
2124
+ errorMaps: [
2125
+ t.common.contextualErrorMap,
2126
+ t.schemaErrorMap,
2127
+ ae(),
2128
+ q
2129
+ ].filter((d) => !!d),
2130
+ issueData: {
2131
+ code: c.invalid_arguments,
2132
+ argumentsError: f
2133
+ }
2134
+ });
2135
+ }
2136
+ function n(o, f) {
2137
+ return ie({
2138
+ data: o,
2139
+ path: t.path,
2140
+ errorMaps: [
2141
+ t.common.contextualErrorMap,
2142
+ t.schemaErrorMap,
2143
+ ae(),
2144
+ q
2145
+ ].filter((d) => !!d),
2146
+ issueData: {
2147
+ code: c.invalid_return_type,
2148
+ returnTypeError: f
2149
+ }
2150
+ });
2151
+ }
2152
+ const a = { errorMap: t.common.contextualErrorMap }, i = t.data;
2153
+ if (this._def.returns instanceof W) {
2154
+ const o = this;
2155
+ return w(async function(...f) {
2156
+ const d = new S([]), _ = await o._def.args.parseAsync(f, a).catch((me) => {
2157
+ throw d.addIssue(s(f, me)), d;
2158
+ }), T = await Reflect.apply(i, this, _);
2159
+ return await o._def.returns._def.type.parseAsync(T, a).catch((me) => {
2160
+ throw d.addIssue(n(T, me)), d;
2161
+ });
2162
+ });
2163
+ } else {
2164
+ const o = this;
2165
+ return w(function(...f) {
2166
+ const d = o._def.args.safeParse(f, a);
2167
+ if (!d.success)
2168
+ throw new S([s(f, d.error)]);
2169
+ const _ = Reflect.apply(i, this, d.data), T = o._def.returns.safeParse(_, a);
2170
+ if (!T.success)
2171
+ throw new S([n(_, T.error)]);
2172
+ return T.data;
2173
+ });
2174
+ }
2175
+ }
2176
+ parameters() {
2177
+ return this._def.args;
2178
+ }
2179
+ returnType() {
2180
+ return this._def.returns;
2181
+ }
2182
+ args(...e) {
2183
+ return new U({
2184
+ ...this._def,
2185
+ args: E.create(e).rest(V.create())
2186
+ });
2187
+ }
2188
+ returns(e) {
2189
+ return new U({
2190
+ ...this._def,
2191
+ returns: e
2192
+ });
2193
+ }
2194
+ implement(e) {
2195
+ return this.parse(e);
2196
+ }
2197
+ strictImplement(e) {
2198
+ return this.parse(e);
2199
+ }
2200
+ static create(e, t, s) {
2201
+ return new U({
2202
+ args: e || E.create([]).rest(V.create()),
2203
+ returns: t || V.create(),
2204
+ typeName: p.ZodFunction,
2205
+ ...y(s)
2206
+ });
2207
+ }
2208
+ }
2209
+ class F extends v {
2210
+ get schema() {
2211
+ return this._def.getter();
2212
+ }
2213
+ _parse(e) {
2214
+ const { ctx: t } = this._processInputParams(e);
2215
+ return this._def.getter()._parse({ data: t.data, path: t.path, parent: t });
2216
+ }
2217
+ }
2218
+ F.create = (r, e) => new F({
2219
+ getter: r,
2220
+ typeName: p.ZodLazy,
2221
+ ...y(e)
2222
+ });
2223
+ class ee extends v {
2224
+ _parse(e) {
2225
+ if (e.data !== this._def.value) {
2226
+ const t = this._getOrReturnCtx(e);
2227
+ return l(t, {
2228
+ received: t.data,
2229
+ code: c.invalid_literal,
2230
+ expected: this._def.value
2231
+ }), m;
2232
+ }
2233
+ return { status: "valid", value: e.data };
2234
+ }
2235
+ get value() {
2236
+ return this._def.value;
2237
+ }
2238
+ }
2239
+ ee.create = (r, e) => new ee({
2240
+ value: r,
2241
+ typeName: p.ZodLiteral,
2242
+ ...y(e)
2243
+ });
2244
+ function Ze(r, e) {
2245
+ return new P({
2246
+ values: r,
2247
+ typeName: p.ZodEnum,
2248
+ ...y(e)
2249
+ });
2250
+ }
2251
+ class P extends v {
2252
+ _parse(e) {
2253
+ if (typeof e.data != "string") {
2254
+ const t = this._getOrReturnCtx(e), s = this._def.values;
2255
+ return l(t, {
2256
+ expected: g.joinValues(s),
2257
+ received: t.parsedType,
2258
+ code: c.invalid_type
2259
+ }), m;
2260
+ }
2261
+ if (this._def.values.indexOf(e.data) === -1) {
2262
+ const t = this._getOrReturnCtx(e), s = this._def.values;
2263
+ return l(t, {
2264
+ received: t.data,
2265
+ code: c.invalid_enum_value,
2266
+ options: s
2267
+ }), m;
2268
+ }
2269
+ return w(e.data);
2270
+ }
2271
+ get options() {
2272
+ return this._def.values;
2273
+ }
2274
+ get enum() {
2275
+ const e = {};
2276
+ for (const t of this._def.values)
2277
+ e[t] = t;
2278
+ return e;
2279
+ }
2280
+ get Values() {
2281
+ const e = {};
2282
+ for (const t of this._def.values)
2283
+ e[t] = t;
2284
+ return e;
2285
+ }
2286
+ get Enum() {
2287
+ const e = {};
2288
+ for (const t of this._def.values)
2289
+ e[t] = t;
2290
+ return e;
2291
+ }
2292
+ extract(e) {
2293
+ return P.create(e);
2294
+ }
2295
+ exclude(e) {
2296
+ return P.create(this.options.filter((t) => !e.includes(t)));
2297
+ }
2298
+ }
2299
+ P.create = Ze;
2300
+ class te extends v {
2301
+ _parse(e) {
2302
+ const t = g.getValidEnumValues(this._def.values), s = this._getOrReturnCtx(e);
2303
+ if (s.parsedType !== u.string && s.parsedType !== u.number) {
2304
+ const n = g.objectValues(t);
2305
+ return l(s, {
2306
+ expected: g.joinValues(n),
2307
+ received: s.parsedType,
2308
+ code: c.invalid_type
2309
+ }), m;
2310
+ }
2311
+ if (t.indexOf(e.data) === -1) {
2312
+ const n = g.objectValues(t);
2313
+ return l(s, {
2314
+ received: s.data,
2315
+ code: c.invalid_enum_value,
2316
+ options: n
2317
+ }), m;
2318
+ }
2319
+ return w(e.data);
2320
+ }
2321
+ get enum() {
2322
+ return this._def.values;
2323
+ }
2324
+ }
2325
+ te.create = (r, e) => new te({
2326
+ values: r,
2327
+ typeName: p.ZodNativeEnum,
2328
+ ...y(e)
2329
+ });
2330
+ class W extends v {
2331
+ unwrap() {
2332
+ return this._def.type;
2333
+ }
2334
+ _parse(e) {
2335
+ const { ctx: t } = this._processInputParams(e);
2336
+ if (t.parsedType !== u.promise && t.common.async === !1)
2337
+ return l(t, {
2338
+ code: c.invalid_type,
2339
+ expected: u.promise,
2340
+ received: t.parsedType
2341
+ }), m;
2342
+ const s = t.parsedType === u.promise ? t.data : Promise.resolve(t.data);
2343
+ return w(s.then((n) => this._def.type.parseAsync(n, {
2344
+ path: t.path,
2345
+ errorMap: t.common.contextualErrorMap
2346
+ })));
2347
+ }
2348
+ }
2349
+ W.create = (r, e) => new W({
2350
+ type: r,
2351
+ typeName: p.ZodPromise,
2352
+ ...y(e)
2353
+ });
2354
+ class C extends v {
2355
+ innerType() {
2356
+ return this._def.schema;
2357
+ }
2358
+ sourceType() {
2359
+ return this._def.schema._def.typeName === p.ZodEffects ? this._def.schema.sourceType() : this._def.schema;
2360
+ }
2361
+ _parse(e) {
2362
+ const { status: t, ctx: s } = this._processInputParams(e), n = this._def.effect || null, a = {
2363
+ addIssue: (i) => {
2364
+ l(s, i), i.fatal ? t.abort() : t.dirty();
2365
+ },
2366
+ get path() {
2367
+ return s.path;
2368
+ }
2369
+ };
2370
+ if (a.addIssue = a.addIssue.bind(a), n.type === "preprocess") {
2371
+ const i = n.transform(s.data, a);
2372
+ return s.common.issues.length ? {
2373
+ status: "dirty",
2374
+ value: s.data
2375
+ } : s.common.async ? Promise.resolve(i).then((o) => this._def.schema._parseAsync({
2376
+ data: o,
2377
+ path: s.path,
2378
+ parent: s
2379
+ })) : this._def.schema._parseSync({
2380
+ data: i,
2381
+ path: s.path,
2382
+ parent: s
2383
+ });
2384
+ }
2385
+ if (n.type === "refinement") {
2386
+ const i = (o) => {
2387
+ const f = n.refinement(o, a);
2388
+ if (s.common.async)
2389
+ return Promise.resolve(f);
2390
+ if (f instanceof Promise)
2391
+ throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");
2392
+ return o;
2393
+ };
2394
+ if (s.common.async === !1) {
2395
+ const o = this._def.schema._parseSync({
2396
+ data: s.data,
2397
+ path: s.path,
2398
+ parent: s
2399
+ });
2400
+ return o.status === "aborted" ? m : (o.status === "dirty" && t.dirty(), i(o.value), { status: t.value, value: o.value });
2401
+ } else
2402
+ return this._def.schema._parseAsync({ data: s.data, path: s.path, parent: s }).then((o) => o.status === "aborted" ? m : (o.status === "dirty" && t.dirty(), i(o.value).then(() => ({ status: t.value, value: o.value }))));
2403
+ }
2404
+ if (n.type === "transform")
2405
+ if (s.common.async === !1) {
2406
+ const i = this._def.schema._parseSync({
2407
+ data: s.data,
2408
+ path: s.path,
2409
+ parent: s
2410
+ });
2411
+ if (!J(i))
2412
+ return i;
2413
+ const o = n.transform(i.value, a);
2414
+ if (o instanceof Promise)
2415
+ throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");
2416
+ return { status: t.value, value: o };
2417
+ } else
2418
+ return this._def.schema._parseAsync({ data: s.data, path: s.path, parent: s }).then((i) => J(i) ? Promise.resolve(n.transform(i.value, a)).then((o) => ({ status: t.value, value: o })) : i);
2419
+ g.assertNever(n);
2420
+ }
2421
+ }
2422
+ C.create = (r, e, t) => new C({
2423
+ schema: r,
2424
+ typeName: p.ZodEffects,
2425
+ effect: e,
2426
+ ...y(t)
2427
+ });
2428
+ C.createWithPreprocess = (r, e, t) => new C({
2429
+ schema: e,
2430
+ effect: { type: "preprocess", transform: r },
2431
+ typeName: p.ZodEffects,
2432
+ ...y(t)
2433
+ });
2434
+ class I extends v {
2435
+ _parse(e) {
2436
+ return this._getType(e) === u.undefined ? w(void 0) : this._def.innerType._parse(e);
2437
+ }
2438
+ unwrap() {
2439
+ return this._def.innerType;
2440
+ }
2441
+ }
2442
+ I.create = (r, e) => new I({
2443
+ innerType: r,
2444
+ typeName: p.ZodOptional,
2445
+ ...y(e)
2446
+ });
2447
+ class D extends v {
2448
+ _parse(e) {
2449
+ return this._getType(e) === u.null ? w(null) : this._def.innerType._parse(e);
2450
+ }
2451
+ unwrap() {
2452
+ return this._def.innerType;
2453
+ }
2454
+ }
2455
+ D.create = (r, e) => new D({
2456
+ innerType: r,
2457
+ typeName: p.ZodNullable,
2458
+ ...y(e)
2459
+ });
2460
+ class re extends v {
2461
+ _parse(e) {
2462
+ const { ctx: t } = this._processInputParams(e);
2463
+ let s = t.data;
2464
+ return t.parsedType === u.undefined && (s = this._def.defaultValue()), this._def.innerType._parse({
2465
+ data: s,
2466
+ path: t.path,
2467
+ parent: t
2468
+ });
2469
+ }
2470
+ removeDefault() {
2471
+ return this._def.innerType;
2472
+ }
2473
+ }
2474
+ re.create = (r, e) => new re({
2475
+ innerType: r,
2476
+ typeName: p.ZodDefault,
2477
+ defaultValue: typeof e.default == "function" ? e.default : () => e.default,
2478
+ ...y(e)
2479
+ });
2480
+ class le extends v {
2481
+ _parse(e) {
2482
+ const { ctx: t } = this._processInputParams(e), s = {
2483
+ ...t,
2484
+ common: {
2485
+ ...t.common,
2486
+ issues: []
2487
+ }
2488
+ }, n = this._def.innerType._parse({
2489
+ data: s.data,
2490
+ path: s.path,
2491
+ parent: {
2492
+ ...s
2493
+ }
2494
+ });
2495
+ return oe(n) ? n.then((a) => ({
2496
+ status: "valid",
2497
+ value: a.status === "valid" ? a.value : this._def.catchValue({
2498
+ get error() {
2499
+ return new S(s.common.issues);
2500
+ },
2501
+ input: s.data
2502
+ })
2503
+ })) : {
2504
+ status: "valid",
2505
+ value: n.status === "valid" ? n.value : this._def.catchValue({
2506
+ get error() {
2507
+ return new S(s.common.issues);
2508
+ },
2509
+ input: s.data
2510
+ })
2511
+ };
2512
+ }
2513
+ removeCatch() {
2514
+ return this._def.innerType;
2515
+ }
2516
+ }
2517
+ le.create = (r, e) => new le({
2518
+ innerType: r,
2519
+ typeName: p.ZodCatch,
2520
+ catchValue: typeof e.catch == "function" ? e.catch : () => e.catch,
2521
+ ...y(e)
2522
+ });
2523
+ class fe extends v {
2524
+ _parse(e) {
2525
+ if (this._getType(e) !== u.nan) {
2526
+ const s = this._getOrReturnCtx(e);
2527
+ return l(s, {
2528
+ code: c.invalid_type,
2529
+ expected: u.nan,
2530
+ received: s.parsedType
2531
+ }), m;
2532
+ }
2533
+ return { status: "valid", value: e.data };
2534
+ }
2535
+ }
2536
+ fe.create = (r) => new fe({
2537
+ typeName: p.ZodNaN,
2538
+ ...y(r)
2539
+ });
2540
+ const qe = Symbol("zod_brand");
2541
+ class Se extends v {
2542
+ _parse(e) {
2543
+ const { ctx: t } = this._processInputParams(e), s = t.data;
2544
+ return this._def.type._parse({
2545
+ data: s,
2546
+ path: t.path,
2547
+ parent: t
2548
+ });
2549
+ }
2550
+ unwrap() {
2551
+ return this._def.type;
2552
+ }
2553
+ }
2554
+ class se extends v {
2555
+ _parse(e) {
2556
+ const { status: t, ctx: s } = this._processInputParams(e);
2557
+ if (s.common.async)
2558
+ return (async () => {
2559
+ const a = await this._def.in._parseAsync({
2560
+ data: s.data,
2561
+ path: s.path,
2562
+ parent: s
2563
+ });
2564
+ return a.status === "aborted" ? m : a.status === "dirty" ? (t.dirty(), Te(a.value)) : this._def.out._parseAsync({
2565
+ data: a.value,
2566
+ path: s.path,
2567
+ parent: s
2568
+ });
2569
+ })();
2570
+ {
2571
+ const n = this._def.in._parseSync({
2572
+ data: s.data,
2573
+ path: s.path,
2574
+ parent: s
2575
+ });
2576
+ return n.status === "aborted" ? m : n.status === "dirty" ? (t.dirty(), {
2577
+ status: "dirty",
2578
+ value: n.value
2579
+ }) : this._def.out._parseSync({
2580
+ data: n.value,
2581
+ path: s.path,
2582
+ parent: s
2583
+ });
2584
+ }
2585
+ }
2586
+ static create(e, t) {
2587
+ return new se({
2588
+ in: e,
2589
+ out: t,
2590
+ typeName: p.ZodPipeline
2591
+ });
2592
+ }
2593
+ }
2594
+ class he extends v {
2595
+ _parse(e) {
2596
+ const t = this._def.innerType._parse(e);
2597
+ return J(t) && (t.value = Object.freeze(t.value)), t;
2598
+ }
2599
+ }
2600
+ he.create = (r, e) => new he({
2601
+ innerType: r,
2602
+ typeName: p.ZodReadonly,
2603
+ ...y(e)
2604
+ });
2605
+ const Ne = (r, e = {}, t) => r ? B.create().superRefine((s, n) => {
2606
+ var a, i;
2607
+ if (!r(s)) {
2608
+ const o = typeof e == "function" ? e(s) : typeof e == "string" ? { message: e } : e, f = (i = (a = o.fatal) !== null && a !== void 0 ? a : t) !== null && i !== void 0 ? i : !0, d = typeof o == "string" ? { message: o } : o;
2609
+ n.addIssue({ code: "custom", ...d, fatal: f });
2610
+ }
2611
+ }) : B.create(), Je = {
2612
+ object: x.lazycreate
2613
+ };
2614
+ var p;
2615
+ (function(r) {
2616
+ r.ZodString = "ZodString", r.ZodNumber = "ZodNumber", r.ZodNaN = "ZodNaN", r.ZodBigInt = "ZodBigInt", r.ZodBoolean = "ZodBoolean", r.ZodDate = "ZodDate", r.ZodSymbol = "ZodSymbol", r.ZodUndefined = "ZodUndefined", r.ZodNull = "ZodNull", r.ZodAny = "ZodAny", r.ZodUnknown = "ZodUnknown", r.ZodNever = "ZodNever", r.ZodVoid = "ZodVoid", r.ZodArray = "ZodArray", r.ZodObject = "ZodObject", r.ZodUnion = "ZodUnion", r.ZodDiscriminatedUnion = "ZodDiscriminatedUnion", r.ZodIntersection = "ZodIntersection", r.ZodTuple = "ZodTuple", r.ZodRecord = "ZodRecord", r.ZodMap = "ZodMap", r.ZodSet = "ZodSet", r.ZodFunction = "ZodFunction", r.ZodLazy = "ZodLazy", r.ZodLiteral = "ZodLiteral", r.ZodEnum = "ZodEnum", r.ZodEffects = "ZodEffects", r.ZodNativeEnum = "ZodNativeEnum", r.ZodOptional = "ZodOptional", r.ZodNullable = "ZodNullable", r.ZodDefault = "ZodDefault", r.ZodCatch = "ZodCatch", r.ZodPromise = "ZodPromise", r.ZodBranded = "ZodBranded", r.ZodPipeline = "ZodPipeline", r.ZodReadonly = "ZodReadonly";
2617
+ })(p || (p = {}));
2618
+ const Ye = (r, e = {
2619
+ message: `Input not instance of ${r.name}`
2620
+ }) => Ne((t) => t instanceof r, e), Ce = Z.create, Oe = A.create, He = fe.create, Ge = M.create, Ee = Y.create, Xe = $.create, Qe = ce.create, Ke = H.create, Fe = G.create, et = B.create, tt = V.create, rt = R.create, st = de.create, nt = N.create, at = x.create, it = x.strictCreate, ot = X.create, ct = pe.create, dt = Q.create, ut = E.create, lt = K.create, ft = ue.create, ht = L.create, pt = U.create, mt = F.create, yt = ee.create, vt = P.create, _t = te.create, gt = W.create, be = C.create, xt = I.create, kt = D.create, bt = C.createWithPreprocess, wt = se.create, Tt = () => Ce().optional(), Zt = () => Oe().optional(), St = () => Ee().optional(), Nt = {
2621
+ string: (r) => Z.create({ ...r, coerce: !0 }),
2622
+ number: (r) => A.create({ ...r, coerce: !0 }),
2623
+ boolean: (r) => Y.create({
2624
+ ...r,
2625
+ coerce: !0
2626
+ }),
2627
+ bigint: (r) => M.create({ ...r, coerce: !0 }),
2628
+ date: (r) => $.create({ ...r, coerce: !0 })
2629
+ }, Ct = m;
2630
+ var k = /* @__PURE__ */ Object.freeze({
2631
+ __proto__: null,
2632
+ defaultErrorMap: q,
2633
+ setErrorMap: Re,
2634
+ getErrorMap: ae,
2635
+ makeIssue: ie,
2636
+ EMPTY_PATH: je,
2637
+ addIssueToContext: l,
2638
+ ParseStatus: b,
2639
+ INVALID: m,
2640
+ DIRTY: Te,
2641
+ OK: w,
2642
+ isAborted: _e,
2643
+ isDirty: ge,
2644
+ isValid: J,
2645
+ isAsync: oe,
2646
+ get util() {
2647
+ return g;
2648
+ },
2649
+ get objectUtil() {
2650
+ return ve;
2651
+ },
2652
+ ZodParsedType: u,
2653
+ getParsedType: j,
2654
+ ZodType: v,
2655
+ ZodString: Z,
2656
+ ZodNumber: A,
2657
+ ZodBigInt: M,
2658
+ ZodBoolean: Y,
2659
+ ZodDate: $,
2660
+ ZodSymbol: ce,
2661
+ ZodUndefined: H,
2662
+ ZodNull: G,
2663
+ ZodAny: B,
2664
+ ZodUnknown: V,
2665
+ ZodNever: R,
2666
+ ZodVoid: de,
2667
+ ZodArray: N,
2668
+ ZodObject: x,
2669
+ ZodUnion: X,
2670
+ ZodDiscriminatedUnion: pe,
2671
+ ZodIntersection: Q,
2672
+ ZodTuple: E,
2673
+ ZodRecord: K,
2674
+ ZodMap: ue,
2675
+ ZodSet: L,
2676
+ ZodFunction: U,
2677
+ ZodLazy: F,
2678
+ ZodLiteral: ee,
2679
+ ZodEnum: P,
2680
+ ZodNativeEnum: te,
2681
+ ZodPromise: W,
2682
+ ZodEffects: C,
2683
+ ZodTransformer: C,
2684
+ ZodOptional: I,
2685
+ ZodNullable: D,
2686
+ ZodDefault: re,
2687
+ ZodCatch: le,
2688
+ ZodNaN: fe,
2689
+ BRAND: qe,
2690
+ ZodBranded: Se,
2691
+ ZodPipeline: se,
2692
+ ZodReadonly: he,
2693
+ custom: Ne,
2694
+ Schema: v,
2695
+ ZodSchema: v,
2696
+ late: Je,
2697
+ get ZodFirstPartyTypeKind() {
2698
+ return p;
2699
+ },
2700
+ coerce: Nt,
2701
+ any: et,
2702
+ array: nt,
2703
+ bigint: Ge,
2704
+ boolean: Ee,
2705
+ date: Xe,
2706
+ discriminatedUnion: ct,
2707
+ effect: be,
2708
+ enum: vt,
2709
+ function: pt,
2710
+ instanceof: Ye,
2711
+ intersection: dt,
2712
+ lazy: mt,
2713
+ literal: yt,
2714
+ map: ft,
2715
+ nan: He,
2716
+ nativeEnum: _t,
2717
+ never: rt,
2718
+ null: Fe,
2719
+ nullable: kt,
2720
+ number: Oe,
2721
+ object: at,
2722
+ oboolean: St,
2723
+ onumber: Zt,
2724
+ optional: xt,
2725
+ ostring: Tt,
2726
+ pipeline: wt,
2727
+ preprocess: bt,
2728
+ promise: gt,
2729
+ record: lt,
2730
+ set: ht,
2731
+ strictObject: it,
2732
+ string: Ce,
2733
+ symbol: Qe,
2734
+ transformer: be,
2735
+ tuple: ut,
2736
+ undefined: Ke,
2737
+ union: ot,
2738
+ unknown: tt,
2739
+ void: st,
2740
+ NEVER: Ct,
2741
+ ZodIssueCode: c,
2742
+ quotelessJson: Ie,
2743
+ ZodError: S
2744
+ });
2745
+ const Et = k.union([
2746
+ k.literal("pu"),
2747
+ k.literal("ku suli"),
2748
+ k.literal("ku lili"),
2749
+ k.literal("none")
2750
+ ]), It = k.union([k.literal("pre-pu"), k.literal("post-pu"), k.literal("post-ku")]), Rt = k.union([
2751
+ k.literal("core"),
2752
+ k.literal("common"),
2753
+ k.literal("uncommon"),
2754
+ k.literal("obscure"),
2755
+ k.literal("sandbox")
2756
+ ]), jt = k.enum([
2757
+ "sitelen pona",
2758
+ "sitelen sitelen",
2759
+ "alphabet",
2760
+ "syllabary",
2761
+ "logography",
2762
+ "tokiponido alphabet",
2763
+ "tokiponido syllabary",
2764
+ "tokiponido logography"
2765
+ ]);
2766
+ function At(r, e, t) {
2767
+ return (r.translations[t] ?? r.translations.en)[e];
2768
+ }
2769
+ export {
2770
+ Et as B,
2771
+ It as C,
2772
+ Rt as U,
2773
+ jt as W,
2774
+ At as g,
2775
+ k as z
2776
+ };
2777
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtQ25BNE9VTHQuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RAMy4yMi40L25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4Lm1qcyIsIi4uL3NyYy9saWIvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHV0aWw7XG4oZnVuY3Rpb24gKHV0aWwpIHtcbiAgICB1dGlsLmFzc2VydEVxdWFsID0gKHZhbCkgPT4gdmFsO1xuICAgIGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHsgfVxuICAgIHV0aWwuYXNzZXJ0SXMgPSBhc3NlcnRJcztcbiAgICBmdW5jdGlvbiBhc3NlcnROZXZlcihfeCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnROZXZlciA9IGFzc2VydE5ldmVyO1xuICAgIHV0aWwuYXJyYXlUb0VudW0gPSAoaXRlbXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgb2JqW2l0ZW1dID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgdXRpbC5nZXRWYWxpZEVudW1WYWx1ZXMgPSAob2JqKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhvYmopLmZpbHRlcigoaykgPT4gdHlwZW9mIG9ialtvYmpba11dICE9PSBcIm51bWJlclwiKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHZhbGlkS2V5cykge1xuICAgICAgICAgICAgZmlsdGVyZWRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0VmFsdWVzKGZpbHRlcmVkKTtcbiAgICB9O1xuICAgIHV0aWwub2JqZWN0VmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gdXRpbC5vYmplY3RLZXlzKG9iaikubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqW2VdO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHV0aWwub2JqZWN0S2V5cyA9IHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gXCJmdW5jdGlvblwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA/IChvYmopID0+IE9iamVjdC5rZXlzKG9iaikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgIDogKG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH07XG4gICAgdXRpbC5maW5kID0gKGFyciwgY2hlY2tlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tlcihpdGVtKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdXRpbC5pc0ludGVnZXIgPSB0eXBlb2YgTnVtYmVyLmlzSW50ZWdlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKHZhbCkgPT4gTnVtYmVyLmlzSW50ZWdlcih2YWwpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUodmFsKSAmJiBNYXRoLmZsb29yKHZhbCkgPT09IHZhbDtcbiAgICBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcIiB8IFwiKSB7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgICAgICAgICAgLm1hcCgodmFsKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAnJHt2YWx9J2AgOiB2YWwpKVxuICAgICAgICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9XG4gICAgdXRpbC5qb2luVmFsdWVzID0gam9pblZhbHVlcztcbiAgICB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciA9IChfLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbn0pKHV0aWwgfHwgKHV0aWwgPSB7fSkpO1xudmFyIG9iamVjdFV0aWw7XG4oZnVuY3Rpb24gKG9iamVjdFV0aWwpIHtcbiAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmZpcnN0LFxuICAgICAgICAgICAgLi4uc2Vjb25kLCAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdFxuICAgICAgICB9O1xuICAgIH07XG59KShvYmplY3RVdGlsIHx8IChvYmplY3RVdGlsID0ge30pKTtcbmNvbnN0IFpvZFBhcnNlZFR5cGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibmFuXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImludGVnZXJcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJkYXRlXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInVuZGVmaW5lZFwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwiYXJyYXlcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwidW5rbm93blwiLFxuICAgIFwicHJvbWlzZVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm1hcFwiLFxuICAgIFwic2V0XCIsXG5dKTtcbmNvbnN0IGdldFBhcnNlZFR5cGUgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgZGF0YTtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zdHJpbmc7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBpc05hTihkYXRhKSA/IFpvZFBhcnNlZFR5cGUubmFuIDogWm9kUGFyc2VkVHlwZS5udW1iZXI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5ib29sZWFuO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uO1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5iaWdpbnQ7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnN5bWJvbDtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICBkYXRhLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5vYmplY3Q7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmtub3duO1xuICAgIH1cbn07XG5cbmNvbnN0IFpvZElzc3VlQ29kZSA9IHV0aWwuYXJyYXlUb0VudW0oW1xuICAgIFwiaW52YWxpZF90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2xpdGVyYWxcIixcbiAgICBcImN1c3RvbVwiLFxuICAgIFwiaW52YWxpZF91bmlvblwiLFxuICAgIFwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yXCIsXG4gICAgXCJpbnZhbGlkX2VudW1fdmFsdWVcIixcbiAgICBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgXCJpbnZhbGlkX2FyZ3VtZW50c1wiLFxuICAgIFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiLFxuICAgIFwiaW52YWxpZF9kYXRlXCIsXG4gICAgXCJpbnZhbGlkX3N0cmluZ1wiLFxuICAgIFwidG9vX3NtYWxsXCIsXG4gICAgXCJ0b29fYmlnXCIsXG4gICAgXCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1wiLFxuICAgIFwibm90X211bHRpcGxlX29mXCIsXG4gICAgXCJub3RfZmluaXRlXCIsXG5dKTtcbmNvbnN0IHF1b3RlbGVzc0pzb24gPSAob2JqKSA9PiB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvXCIoW15cIl0rKVwiOi9nLCBcIiQxOlwiKTtcbn07XG5jbGFzcyBab2RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihpc3N1ZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZSA9IChzdWIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCBzdWJdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZElzc3VlcyA9IChzdWJzID0gW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9fcHJvdG9fXyA9IGFjdHVhbFByb3RvO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7XG4gICAgfVxuICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3VlcztcbiAgICB9XG4gICAgZm9ybWF0KF9tYXBwZXIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIikge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZS51bmlvbkVycm9ycy5tYXAocHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3JldHVybl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9hcmd1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUuYXJndW1lbnRzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaXNzdWUucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodHlwZW9mIGVsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zdCBlcnJvckFycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycm9yQXJyYXkuX2Vycm9ycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCBlcnJvckFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2Vzc0Vycm9yKHRoaXMpO1xuICAgICAgICByZXR1cm4gZmllbGRFcnJvcnM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBmbGF0dGVuKG1hcHBlciA9IChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSkge1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtRXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuaXNzdWVzKSB7XG4gICAgICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSA9IGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtRXJyb3JzLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZvcm1FcnJvcnMsIGZpZWxkRXJyb3JzIH07XG4gICAgfVxuICAgIGdldCBmb3JtRXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0dGVuKCk7XG4gICAgfVxufVxuWm9kRXJyb3IuY3JlYXRlID0gKGlzc3VlcykgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKGlzc3Vlcyk7XG4gICAgcmV0dXJuIGVycm9yO1xufTtcblxuY29uc3QgZXJyb3JNYXAgPSAoaXNzdWUsIF9jdHgpID0+IHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBzd2l0Y2ggKGlzc3VlLmNvZGUpIHtcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnJlY2VpdmVkID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIlJlcXVpcmVkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEV4cGVjdGVkICR7aXNzdWUuZXhwZWN0ZWR9LCByZWNlaXZlZCAke2lzc3VlLnJlY2VpdmVkfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGxpdGVyYWwgdmFsdWUsIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkoaXNzdWUuZXhwZWN0ZWQsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnVucmVjb2duaXplZF9rZXlzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUua2V5cywgXCIsIFwiKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb246XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5vcHRpb25zKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBlbnVtIHZhbHVlLiBFeHBlY3RlZCAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5vcHRpb25zKX0sIHJlY2VpdmVkICcke2lzc3VlLnJlY2VpdmVkfSdgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIGFyZ3VtZW50c2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRhdGVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiaW5jbHVkZXNcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBpbmNsdWRlIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmluY2x1ZGVzfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYCR7bWVzc2FnZX0gYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke2lzc3VlLnZhbGlkYXRpb24ucG9zaXRpb259YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcInN0YXJ0c1dpdGhcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBzdGFydCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcImVuZHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggXCIke2lzc3VlLnZhbGlkYXRpb24uZW5kc1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihpc3N1ZS52YWxpZGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS52YWxpZGF0aW9uICE9PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgJHtpc3N1ZS52YWxpZGF0aW9ufWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX3NtYWxsOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG1vcmUgdGhhbmB9ICR7aXNzdWUubWluaW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG92ZXJgfSAke2lzc3VlLm1pbmltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5IGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWluaW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnRvb19iaWc6XG4gICAgICAgICAgICBpZiAoaXNzdWUudHlwZSA9PT0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfSBlbGVtZW50KHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgdW5kZXJgfSAke2lzc3VlLm1heGltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQmlnSW50IG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBzbWFsbGVyIHRoYW5gfSAke25ldyBEYXRlKE51bWJlcihpc3N1ZS5tYXhpbXVtKSl9YDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuY3VzdG9tOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW50ZXJzZWN0aW9uIHJlc3VsdHMgY291bGQgbm90IGJlIG1lcmdlZGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7aXNzdWUubXVsdGlwbGVPZn1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLm5vdF9maW5pdGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJOdW1iZXIgbXVzdCBiZSBmaW5pdGVcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbWVzc2FnZSA9IF9jdHguZGVmYXVsdEVycm9yO1xuICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihpc3N1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7IG1lc3NhZ2UgfTtcbn07XG5cbmxldCBvdmVycmlkZUVycm9yTWFwID0gZXJyb3JNYXA7XG5mdW5jdGlvbiBzZXRFcnJvck1hcChtYXApIHtcbiAgICBvdmVycmlkZUVycm9yTWFwID0gbWFwO1xufVxuZnVuY3Rpb24gZ2V0RXJyb3JNYXAoKSB7XG4gICAgcmV0dXJuIG92ZXJyaWRlRXJyb3JNYXA7XG59XG5cbmNvbnN0IG1ha2VJc3N1ZSA9IChwYXJhbXMpID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHBhdGgsIGVycm9yTWFwcywgaXNzdWVEYXRhIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnVsbFBhdGggPSBbLi4ucGF0aCwgLi4uKGlzc3VlRGF0YS5wYXRoIHx8IFtdKV07XG4gICAgY29uc3QgZnVsbElzc3VlID0ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgIH07XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG4gICAgY29uc3QgbWFwcyA9IGVycm9yTWFwc1xuICAgICAgICAuZmlsdGVyKChtKSA9PiAhIW0pXG4gICAgICAgIC5zbGljZSgpXG4gICAgICAgIC5yZXZlcnNlKCk7XG4gICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBtYXAoZnVsbElzc3VlLCB7IGRhdGEsIGRlZmF1bHRFcnJvcjogZXJyb3JNZXNzYWdlIH0pLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlzc3VlRGF0YSxcbiAgICAgICAgcGF0aDogZnVsbFBhdGgsXG4gICAgICAgIG1lc3NhZ2U6IGlzc3VlRGF0YS5tZXNzYWdlIHx8IGVycm9yTWVzc2FnZSxcbiAgICB9O1xufTtcbmNvbnN0IEVNUFRZX1BBVEggPSBbXTtcbmZ1bmN0aW9uIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgaXNzdWVEYXRhKSB7XG4gICAgY29uc3QgaXNzdWUgPSBtYWtlSXNzdWUoe1xuICAgICAgICBpc3N1ZURhdGE6IGlzc3VlRGF0YSxcbiAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgZ2V0RXJyb3JNYXAoKSxcbiAgICAgICAgICAgIGVycm9yTWFwLCAvLyB0aGVuIGdsb2JhbCBkZWZhdWx0IG1hcFxuICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICB9KTtcbiAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKGlzc3VlKTtcbn1cbmNsYXNzIFBhcnNlU3RhdHVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwidmFsaWRcIjtcbiAgICB9XG4gICAgZGlydHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJkaXJ0eVwiO1xuICAgIH1cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiYWJvcnRlZFwiO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgYXJyYXlWYWx1ZS5wdXNoKHMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogYXJyYXlWYWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGF3YWl0IHBhaXIua2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBhd2FpdCBwYWlyLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcGFpcjtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmIChrZXkudmFsdWUgIT09IFwiX19wcm90b19fXCIgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlICE9PSBcInVuZGVmaW5lZFwiIHx8IHBhaXIuYWx3YXlzU2V0KSkge1xuICAgICAgICAgICAgICAgIGZpbmFsT2JqZWN0W2tleS52YWx1ZV0gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsT2JqZWN0IH07XG4gICAgfVxufVxuY29uc3QgSU5WQUxJRCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCIsXG59KTtcbmNvbnN0IERJUlRZID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwiZGlydHlcIiwgdmFsdWUgfSk7XG5jb25zdCBPSyA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlIH0pO1xuY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSBcImFib3J0ZWRcIjtcbmNvbnN0IGlzRGlydHkgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiZGlydHlcIjtcbmNvbnN0IGlzVmFsaWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwidmFsaWRcIjtcbmNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgeCBpbnN0YW5jZW9mIFByb21pc2U7XG5cbnZhciBlcnJvclV0aWw7XG4oZnVuY3Rpb24gKGVycm9yVXRpbCkge1xuICAgIGVycm9yVXRpbC5lcnJUb09iaiA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZSB9IDogbWVzc2FnZSB8fCB7fTtcbiAgICBlcnJvclV0aWwudG9TdHJpbmcgPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLm1lc3NhZ2U7XG59KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7XG5cbmNsYXNzIFBhcnNlSW5wdXRMYXp5UGF0aCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCB2YWx1ZSwgcGF0aCwga2V5KSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFBhdGggPSBbXTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xuICAgIH1cbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2tleSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIC4uLnRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgdGhpcy5fa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkUGF0aDtcbiAgICB9XG59XG5jb25zdCBoYW5kbGVSZXN1bHQgPSAoY3R4LCByZXN1bHQpID0+IHtcbiAgICBpZiAoaXNWYWxpZChyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdC52YWx1ZSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkIGJ1dCBubyBpc3N1ZXMgZGV0ZWN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihjdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zKVxuICAgICAgICByZXR1cm4ge307XG4gICAgY29uc3QgeyBlcnJvck1hcCwgaW52YWxpZF90eXBlX2Vycm9yLCByZXF1aXJlZF9lcnJvciwgZGVzY3JpcHRpb24gfSA9IHBhcmFtcztcbiAgICBpZiAoZXJyb3JNYXAgJiYgKGludmFsaWRfdHlwZV9lcnJvciB8fCByZXF1aXJlZF9lcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgXCJpbnZhbGlkX3R5cGVfZXJyb3JcIiBvciBcInJlcXVpcmVkX2Vycm9yXCIgaW4gY29uanVuY3Rpb24gd2l0aCBjdXN0b20gZXJyb3IgbWFwLmApO1xuICAgIH1cbiAgICBpZiAoZXJyb3JNYXApXG4gICAgICAgIHJldHVybiB7IGVycm9yTWFwOiBlcnJvck1hcCwgZGVzY3JpcHRpb24gfTtcbiAgICBjb25zdCBjdXN0b21NYXAgPSAoaXNzLCBjdHgpID0+IHtcbiAgICAgICAgaWYgKGlzcy5jb2RlICE9PSBcImludmFsaWRfdHlwZVwiKVxuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiByZXF1aXJlZF9lcnJvciAhPT0gbnVsbCAmJiByZXF1aXJlZF9lcnJvciAhPT0gdm9pZCAwID8gcmVxdWlyZWRfZXJyb3IgOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogaW52YWxpZF90eXBlX2Vycm9yICE9PSBudWxsICYmIGludmFsaWRfdHlwZV9lcnJvciAhPT0gdm9pZCAwID8gaW52YWxpZF90eXBlX2Vycm9yIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgIH07XG4gICAgcmV0dXJuIHsgZXJyb3JNYXA6IGN1c3RvbU1hcCwgZGVzY3JpcHRpb24gfTtcbn1cbmNsYXNzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGRlZikge1xuICAgICAgICAvKiogQWxpYXMgb2Ygc2FmZVBhcnNlQXN5bmMgKi9cbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNhZmVQYXJzZUFzeW5jO1xuICAgICAgICB0aGlzLl9kZWYgPSBkZWY7XG4gICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgX2dldFR5cGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIF9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KSB7XG4gICAgICAgIHJldHVybiAoY3R4IHx8IHtcbiAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogbmV3IFBhcnNlU3RhdHVzKCksXG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9wYXJzZVN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jaHJvbm91cyBwYXJzZSBlbmNvdW50ZXJlZCBwcm9taXNlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfcGFyc2VBc3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2FmZVBhcnNlKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBzYWZlUGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBhc3luYzogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmFzeW5jKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZVN5bmMoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICBhc3luYyBwYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBhc3luYyBzYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpXG4gICAgICAgICAgICA/IG1heWJlQXN5bmNSZXN1bHRcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKG1heWJlQXN5bmNSZXN1bHQpKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJlZmluZShjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBnZXRJc3N1ZVByb3BlcnRpZXMgPSAodmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHZhbCk7XG4gICAgICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgICAgICAuLi5nZXRJc3N1ZVByb3BlcnRpZXModmFsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmluZW1lbnQoY2hlY2ssIHJlZmluZW1lbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHR5cGVvZiByZWZpbmVtZW50RGF0YSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpXG4gICAgICAgICAgICAgICAgICAgIDogcmVmaW5lbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicmVmaW5lbWVudFwiLCByZWZpbmVtZW50IH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdXBlclJlZmluZShyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KHJlZmluZW1lbnQpO1xuICAgIH1cbiAgICBvcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsaXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udWxsYWJsZSgpLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIGFycmF5KCkge1xuICAgICAgICByZXR1cm4gWm9kQXJyYXkuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBvcihvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFpvZFVuaW9uLmNyZWF0ZShbdGhpcywgb3B0aW9uXSwgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgYW5kKGluY29taW5nKSB7XG4gICAgICAgIHJldHVybiBab2RJbnRlcnNlY3Rpb24uY3JlYXRlKHRoaXMsIGluY29taW5nLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0KGRlZikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQnJhbmRlZCh7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJyYW5kZWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2goZGVmKSB7XG4gICAgICAgIGNvbnN0IGNhdGNoVmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGNhdGNoVmFsdWU6IGNhdGNoVmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXMoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaXBlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gWm9kUGlwZWxpbmUuY3JlYXRlKHRoaXMsIHRhcmdldCk7XG4gICAgfVxuICAgIHJlYWRvbmx5KCkge1xuICAgICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpO1xuICAgIH1cbiAgICBpc09wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIH1cbiAgICBpc051bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICB9XG59XG5jb25zdCBjdWlkUmVnZXggPSAvXmNbXlxccy1dezgsfSQvaTtcbmNvbnN0IGN1aWQyUmVnZXggPSAvXlthLXpdW2EtejAtOV0qJC87XG5jb25zdCB1bGlkUmVnZXggPSAvXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLztcbi8vIGNvbnN0IHV1aWRSZWdleCA9XG4vLyAgIC9eKFthLWYwLTldezh9LVthLWYwLTldezR9LVsxLTVdW2EtZjAtOV17M30tW2EtZjAtOV17NH0tW2EtZjAtOV17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7XG5jb25zdCB1dWlkUmVnZXggPSAvXlswLTlhLWZBLUZdezh9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezEyfSQvaTtcbi8vIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MTgxLzE1NTAxNTVcbi8vIG9sZCB2ZXJzaW9uOiB0b28gc2xvdywgZGlkbid0IHN1cHBvcnQgdW5pY29kZVxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaTtcbi8vb2xkIGVtYWlsIHJlZ2V4XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKFtePD4oKVtcXF0uLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXS4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKCg/IS0pKFtePD4oKVtcXF0uLDs6XFxzQFwiXStcXC4pK1tePD4oKVtcXF0uLDs6XFxzQFwiXXsxLH0pW14tPD4oKVtcXF0uLDs6XFxzQFwiXSQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcWygoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcXSl8KFxcW0lQdjY6KChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKVxcXSl8KFtBLVphLXowLTldKFtBLVphLXowLTktXSpbQS1aYS16MC05XSkqKFxcLltBLVphLXpdezIsfSkrKSkkLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXpBLVowLTlcXC5cXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC9cXD1cXD9cXF5cXF9cXGBcXHtcXHxcXH1cXH5cXC1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkkL2k7XG5jb25zdCBlbWFpbFJlZ2V4ID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVowLTlfKy1cXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XFwtXSpcXC4pK1tBLVpdezIsfSQvaTtcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXowLTkuISMkJSbigJkqKy89P15fYHt8fX4tXStAW2EtejAtOS1dKyg/OlxcLlthLXowLTlcXC1dKykqJC9pO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamlSZWdleCA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5sZXQgZW1vamlSZWdleDtcbmNvbnN0IGlwdjRSZWdleCA9IC9eKCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC87XG5jb25zdCBpcHY2UmVnZXggPSAvXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLztcbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuY29uc3QgZGF0ZXRpbWVSZWdleCA9IChhcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3MucHJlY2lzaW9uKSB7XG4gICAgICAgIGlmIChhcmdzLm9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfVxcXFwuXFxcXGR7JHthcmdzLnByZWNpc2lvbn19KChbKy1dXFxcXGR7Mn0oOj9cXFxcZHsyfSk/KXxaKSRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fVokYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXJncy5wcmVjaXNpb24gPT09IDApIHtcbiAgICAgICAgaWYgKGFyZ3Mub2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KChbKy1dXFxcXGR7Mn0oOj9cXFxcZHsyfSk/KXxaKSRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1aJGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYXJncy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn0oXFxcXC5cXFxcZCspPygoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KFxcXFwuXFxcXGQrKT9aJGApO1xuICAgICAgICB9XG4gICAgfVxufTtcbmZ1bmN0aW9uIGlzVmFsaWRJUChpcCwgdmVyc2lvbikge1xuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NFwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY0UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NlwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY2UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmNsYXNzIFpvZFN0cmluZyBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IFN0cmluZyhpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1haWxcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1haWxSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtb2ppXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsIFwidVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJlbW9qaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImN1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkMlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdWlkMlJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bGlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVybFwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVSTChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgY2hlY2sucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gY2hlY2sucmVnZXgudGVzdChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJyZWdleFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidHJpbVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpbmNsdWRlc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmluY2x1ZGVzKGNoZWNrLnZhbHVlLCBjaGVjay5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBpbmNsdWRlczogY2hlY2sudmFsdWUsIHBvc2l0aW9uOiBjaGVjay5wb3NpdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9Mb3dlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvVXBwZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJzdGFydHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuc3RhcnRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBzdGFydHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW5kc1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5lbmRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGV0aW1lUmVnZXgoY2hlY2spO1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpcFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkSVAoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJpcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbWFpbChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1cmwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGVtb2ppKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHV1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZDIobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWQyXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdWxpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidWxpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGlwKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGRhdGV0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24pID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sXG4gICAgICAgICAgICBvZmZzZXQ6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vZmZzZXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZ2V4KHJlZ2V4LCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICByZWdleDogcmVnZXgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbmNsdWRlcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wb3NpdGlvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGFydHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInN0YXJ0c1dpdGhcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVuZHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImVuZHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IG1pbkxlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhMZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogbWF4TGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGVuZ3RoKGxlbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJsZW5ndGhcIixcbiAgICAgICAgICAgIHZhbHVlOiBsZW4sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugei5zdHJpbmcoKS5taW4oMSkgaW5zdGVhZC5cbiAgICAgKiBAc2VlIHtAbGluayBab2RTdHJpbmcubWlufVxuICAgICAqL1xuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIGVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSk7XG4gICAgfVxuICAgIHRyaW0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0cmltXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b0xvd2VyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvTG93ZXJDYXNlXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b1VwcGVyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvVXBwZXJDYXNlXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgaXNEYXRldGltZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJkYXRldGltZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1haWwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1haWxcIik7XG4gICAgfVxuICAgIGdldCBpc1VSTCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1cmxcIik7XG4gICAgfVxuICAgIGdldCBpc0Vtb2ppKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtb2ppXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInV1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRDIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZDJcIik7XG4gICAgfVxuICAgIGdldCBpc1VMSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidWxpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzSVAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaXBcIik7XG4gICAgfVxuICAgIGdldCBtaW5MZW5ndGgoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heExlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZFN0cmluZy5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTdHJpbmcsXG4gICAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zOTY2NDg0L3doeS1kb2VzLW1vZHVsdXMtb3BlcmF0b3ItcmV0dXJuLWZyYWN0aW9uYWwtbnVtYmVyLWluLWphdmFzY3JpcHQvMzE3MTEwMzQjMzE3MTEwMzRcbmZ1bmN0aW9uIGZsb2F0U2FmZVJlbWFpbmRlcih2YWwsIHN0ZXApIHtcbiAgICBjb25zdCB2YWxEZWNDb3VudCA9ICh2YWwudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IHN0ZXBEZWNDb3VudCA9IChzdGVwLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7XG4gICAgY29uc3QgdmFsSW50ID0gcGFyc2VJbnQodmFsLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICBjb25zdCBzdGVwSW50ID0gcGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgcmV0dXJuICh2YWxJbnQgJSBzdGVwSW50KSAvIE1hdGgucG93KDEwLCBkZWNDb3VudCk7XG59XG5jbGFzcyBab2ROdW1iZXIgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTtcbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTtcbiAgICAgICAgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBOdW1iZXIoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVtYmVyLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW50XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJmbG9hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA+IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA+PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxvYXRTYWZlUmVtYWluZGVyKGlucHV0LmRhdGEsIGNoZWNrLnZhbHVlKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJmaW5pdGVcIikge1xuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfZmluaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBndGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGd0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNldExpbWl0KGtpbmQsIHZhbHVlLCBpbmNsdXNpdmUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLmNoZWNrcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbnRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtdWx0aXBsZU9mXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaW5pdGUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJmaW5pdGVcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNhZmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSkuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIGdldCBpc0ludCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJpbnRcIiB8fFxuICAgICAgICAgICAgKGNoLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiICYmIHV0aWwuaXNJbnRlZ2VyKGNoLnZhbHVlKSkpO1xuICAgIH1cbiAgICBnZXQgaXNGaW5pdGUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsLCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcImZpbml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgY2gua2luZCA9PT0gXCJpbnRcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtaW4pICYmIE51bWJlci5pc0Zpbml0ZShtYXgpO1xuICAgIH1cbn1cblpvZE51bWJlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bWJlcixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RCaWdJbnQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTtcbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQmlnSW50KGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYmlnaW50KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmJpZ2ludCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEgJSBjaGVjay52YWx1ZSAhPT0gQmlnSW50KDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJpZ0ludCxcbiAgICAgICAgY29lcmNlOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEJvb2xlYW4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCb29sZWFuKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYm9vbGVhbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZEJvb2xlYW4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQm9vbGVhbih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REYXRlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gbmV3IERhdGUoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oaW5wdXQuZGF0YS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLnZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKGlucHV0LmRhdGEuZ2V0VGltZSgpKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluRGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5EYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhEYXRlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heERhdGUuZ2V0VGltZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pbkRhdGUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbiAhPSBudWxsID8gbmV3IERhdGUobWluKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBtYXhEYXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsO1xuICAgIH1cbn1cblpvZERhdGUuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTeW1ib2wgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zeW1ib2wpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc3ltYm9sLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFN5bWJvbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTeW1ib2woe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN5bWJvbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuZGVmaW5lZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS51bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVW5kZWZpbmVkLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuZGVmaW5lZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5kZWZpbmVkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTnVsbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2ROdWxsLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGwoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RBbnkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gdG8gcHJldmVudCBpbnN0YW5jZXMgb2Ygb3RoZXIgY2xhc3NlcyBmcm9tIGV4dGVuZGluZyBab2RBbnkuIHRoaXMgY2F1c2VzIGlzc3VlcyB3aXRoIGNhdGNoYWxsIGluIFpvZE9iamVjdC5cbiAgICAgICAgdGhpcy5fYW55ID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RBbnkuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQW55KHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBbnksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmtub3duIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHJlcXVpcmVkXG4gICAgICAgIHRoaXMuX3Vua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVua25vd24uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5rbm93bih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5rbm93bixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubmV2ZXIsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG59XG5ab2ROZXZlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROZXZlcih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXIsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RWb2lkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnZvaWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVm9pZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RWb2lkKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RWb2lkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHgsIHN0YXR1cyB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLmV4YWN0TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjdHguZGF0YS5sZW5ndGggPiBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kSXNzdWVDb2RlLnRvb19iaWcgOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiAodG9vU21hbGwgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiAodG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1pbkxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5taW5MZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbkxlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pbkxlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoID4gZGVmLm1heExlbmd0aC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiBtaW5MZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heExlbmd0aDogeyB2YWx1ZTogbWF4TGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZEFycmF5LmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIG1pbkxlbmd0aDogbnVsbCxcbiAgICAgICAgbWF4TGVuZ3RoOiBudWxsLFxuICAgICAgICBleGFjdExlbmd0aDogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPYmplY3QpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLnNoYXBlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldO1xuICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShmaWVsZFNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHR5cGU6IGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS5lbGVtZW50KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7XG4gICAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxufVxuY2xhc3MgWm9kT2JqZWN0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgLSB1bmtub3duIHByb3BlcnRpZXMgYXJlIG5vdyBzaWxlbnRseSBzdHJpcHBlZC5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gcGFzcyB0aHJvdWdoIHVua25vd24gcHJvcGVydGllcywgdXNlIGAucGFzc3Rocm91Z2goKWAgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDtcbiAgICAgICAgLy8gZXh0ZW5kPFxuICAgICAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlLFxuICAgICAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAgICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PixcbiAgICAgICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAgICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+XG4gICAgICAgIC8vID4oXG4gICAgICAgIC8vICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gKTogWm9kT2JqZWN0PFxuICAgICAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIEF1Z21lbnRhdGlvbj4sXG4gICAgICAgIC8vICAgVW5rbm93bktleXMsXG4gICAgICAgIC8vICAgQ2F0Y2hhbGwsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0LFxuICAgICAgICAvLyAgIE5ld0lucHV0XG4gICAgICAgIC8vID4ge1xuICAgICAgICAvLyAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgLy8gICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgLy8gICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAvLyAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLy8gICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAvLyAgICAgfSksXG4gICAgICAgIC8vICAgfSkgYXMgYW55O1xuICAgICAgICAvLyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYC5leHRlbmRgIGluc3RlYWRcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuYXVnbWVudCA9IHRoaXMuZXh0ZW5kO1xuICAgIH1cbiAgICBfZ2V0Q2FjaGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IHV0aWwub2JqZWN0S2V5cyhzaGFwZSk7XG4gICAgICAgIHJldHVybiAodGhpcy5fY2FjaGVkID0geyBzaGFwZSwga2V5cyB9KTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7XG4gICAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdO1xuICAgICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJlxuICAgICAgICAgICAgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWxpZGF0b3IgPSBzaGFwZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleVZhbGlkYXRvci5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25LZXlzID0gdGhpcy5fZGVmLnVua25vd25LZXlzO1xuICAgICAgICAgICAgaWYgKHVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogY3R4LmRhdGFba2V5XSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IGV4dHJhS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmlwXCIpIDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcnVuIGNhdGNoYWxsIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNhdGNoYWxsID0gdGhpcy5fZGVmLmNhdGNoYWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNhdGNoYWxsLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYXdhaXQgcGFpci52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDogcGFpci5hbHdheXNTZXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3luY1BhaXJzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoc3luY1BhaXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNoYXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgfVxuICAgIHN0cmljdChtZXNzYWdlKSB7XG4gICAgICAgIGVycm9yVXRpbC5lcnJUb09iajtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgICAgICAuLi4obWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwOiAoaXNzdWUsIGN0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEVycm9yID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5fZGVmKS5lcnJvck1hcCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGlzc3VlLCBjdHgpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJ1bnJlY29nbml6ZWRfa2V5c1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IChfZCA9IGVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWZhdWx0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdHJpcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhc3N0aHJvdWdoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJwYXNzdGhyb3VnaFwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gY29uc3QgQXVnbWVudEZhY3RvcnkgPVxuICAgIC8vICAgPERlZiBleHRlbmRzIFpvZE9iamVjdERlZj4oZGVmOiBEZWYpID0+XG4gICAgLy8gICA8QXVnbWVudGF0aW9uIGV4dGVuZHMgWm9kUmF3U2hhcGU+KFxuICAgIC8vICAgICBhdWdtZW50YXRpb246IEF1Z21lbnRhdGlvblxuICAgIC8vICAgKTogWm9kT2JqZWN0PFxuICAgIC8vICAgICBleHRlbmRTaGFwZTxSZXR1cm5UeXBlPERlZltcInNoYXBlXCJdPiwgQXVnbWVudGF0aW9uPixcbiAgICAvLyAgICAgRGVmW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICAgIERlZltcImNhdGNoYWxsXCJdXG4gICAgLy8gICA+ID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICAgIC4uLmRlZixcbiAgICAvLyAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAvLyAgICAgICAgIC4uLmRlZi5zaGFwZSgpLFxuICAgIC8vICAgICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgIC8vICAgICAgIH0pLFxuICAgIC8vICAgICB9KSBhcyBhbnk7XG4gICAgLy8gICB9O1xuICAgIGV4dGVuZChhdWdtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmlvciB0byB6b2RAMS4wLjEyIHRoZXJlIHdhcyBhIGJ1ZyBpbiB0aGVcbiAgICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2VcbiAgICAgKiB1cGdyYWRlIGlmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGlzc3Vlcy5cbiAgICAgKi9cbiAgICBtZXJnZShtZXJnaW5nKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAgICAgICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgICAgICAuLi5tZXJnaW5nLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICAvLyBtZXJnZTxcbiAgICAvLyAgIEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0LFxuICAgIC8vICAgQXVnbWVudGF0aW9uIGV4dGVuZHMgSW5jb21pbmdbXCJzaGFwZVwiXSxcbiAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHtcbiAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIE91dHB1dFxuICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH0sXG4gICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHtcbiAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBJbnB1dFxuICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgIC8vICAgfVxuICAgIC8vID4oXG4gICAgLy8gICBtZXJnaW5nOiBJbmNvbWluZ1xuICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbXCJfZGVmXCJdW1wic2hhcGVcIl0+PixcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQsXG4gICAgLy8gICBOZXdJbnB1dFxuICAgIC8vID4ge1xuICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAvLyAgICAgc2hhcGU6ICgpID0+XG4gICAgLy8gICAgICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyh0aGlzLl9kZWYuc2hhcGUoKSwgbWVyZ2luZy5fZGVmLnNoYXBlKCkpLFxuICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAvLyAgIHJldHVybiBtZXJnZWQ7XG4gICAgLy8gfVxuICAgIHNldEtleShrZXksIHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWdtZW50KHsgW2tleV06IHNjaGVtYSB9KTtcbiAgICB9XG4gICAgLy8gbWVyZ2U8SW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3Q+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiAvL1pvZE9iamVjdDxUICYgSW5jb21pbmdbXCJfc2hhcGVcIl0sIFVua25vd25LZXlzLCBDYXRjaGFsbD4gPSAobWVyZ2luZykgPT4ge1xuICAgIC8vIFpvZE9iamVjdDxcbiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbXCJfZGVmXCJdW1wic2hhcGVcIl0+PixcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl1cbiAgICAvLyA+IHtcbiAgICAvLyAgIC8vIGNvbnN0IG1lcmdlZFNoYXBlID0gb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyhcbiAgICAvLyAgIC8vICAgdGhpcy5fZGVmLnNoYXBlKCksXG4gICAgLy8gICAvLyAgIG1lcmdpbmcuX2RlZi5zaGFwZSgpXG4gICAgLy8gICAvLyApO1xuICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAvLyAgICAgc2hhcGU6ICgpID0+XG4gICAgLy8gICAgICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyh0aGlzLl9kZWYuc2hhcGUoKSwgbWVyZ2luZy5fZGVmLnNoYXBlKCkpLFxuICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAvLyAgIHJldHVybiBtZXJnZWQ7XG4gICAgLy8gfVxuICAgIGNhdGNoYWxsKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBpY2sobWFzaykge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXMobWFzaykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAobWFza1trZXldICYmIHRoaXMuc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbWl0KG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZWVwUGFydGlhbCgpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBQYXJ0aWFsaWZ5KHRoaXMpO1xuICAgIH1cbiAgICBwYXJ0aWFsKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hLm9wdGlvbmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1aXJlZChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0ZpZWxkIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RmllbGQgPSBuZXdGaWVsZC5fZGVmLmlubmVyVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAga2V5b2YoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVab2RFbnVtKHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSk7XG4gICAgfVxufVxuWm9kT2JqZWN0LmNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3Quc3RyaWN0Q3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3QubGF6eWNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGZpcnN0IGlzc3VlLWZyZWUgdmFsaWRhdGlvbiBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGlzc3VlcyBmcm9tIGRpcnR5IG9wdGlvblxuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBpbnZhbGlkXG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IG5ldyBab2RFcnJvcihyZXN1bHQuY3R4LmNvbW1vbi5pc3N1ZXMpKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGN0eDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKS50aGVuKGhhbmRsZVJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaXNzdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4uZGlydHkuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IGlzc3Vlcy5tYXAoKGlzc3VlcykgPT4gbmV3IFpvZEVycm9yKGlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgfVxufVxuWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuaW9uKHtcbiAgICAgICAgb3B0aW9uczogdHlwZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5pb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuY29uc3QgZ2V0RGlzY3JpbWluYXRvciA9ICh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7XG4gICAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0eXBlLmVudW0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7XG4gICAgICAgIHJldHVybiBbbnVsbF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xuY2xhc3MgWm9kRGlzY3JpbWluYXRlZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSB0aGlzLmRpc2NyaW1pbmF0b3I7XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGN0eC5kYXRhW2Rpc2NyaW1pbmF0b3JdO1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KGRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSksXG4gICAgICAgICAgICAgICAgcGF0aDogW2Rpc2NyaW1pbmF0b3JdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzY3JpbWluYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kaXNjcmltaW5hdG9yO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zO1xuICAgIH1cbiAgICBnZXQgb3B0aW9uc01hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zTWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24gc2NoZW1hLiBJdHMgYmVoYXZpb3VyIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBub3JtYWwgei51bmlvbigpIGNvbnN0cnVjdG9yLlxuICAgICAqIEhvd2V2ZXIsIGl0IG9ubHkgYWxsb3dzIGEgdW5pb24gb2Ygb2JqZWN0cywgYWxsIG9mIHdoaWNoIG5lZWQgdG8gc2hhcmUgYSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IG11c3RcbiAgICAgKiBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZvciBlYWNoIG9iamVjdCBpbiB0aGUgdW5pb24uXG4gICAgICogQHBhcmFtIGRpc2NyaW1pbmF0b3IgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gdHlwZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHNjaGVtYXNcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgdmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZXNcbiAgICAgICAgY29uc3Qgb3B0aW9uc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZXMgPSBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2hhcGVbZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICAgICAgaWYgKCFkaXNjcmltaW5hdG9yVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGRpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGtleSBcXGAke2Rpc2NyaW1pbmF0b3J9XFxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXNjcmltaW5hdG9yIHByb3BlcnR5ICR7U3RyaW5nKGRpc2NyaW1pbmF0b3IpfSBoYXMgZHVwbGljYXRlIHZhbHVlICR7U3RyaW5nKHZhbHVlKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9uc01hcC5zZXQodmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGlzY3JpbWluYXRlZFVuaW9uLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zTWFwLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBtZXJnZVZhbHVlcyhhLCBiKSB7XG4gICAgY29uc3QgYVR5cGUgPSBnZXRQYXJzZWRUeXBlKGEpO1xuICAgIGNvbnN0IGJUeXBlID0gZ2V0UGFyc2VkVHlwZShiKTtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5vYmplY3QgJiYgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGJLZXlzID0gdXRpbC5vYmplY3RLZXlzKGIpO1xuICAgICAgICBjb25zdCBzaGFyZWRLZXlzID0gdXRpbFxuICAgICAgICAgICAgLm9iamVjdEtleXMoYSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gYktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHsgLi4uYSwgLi4uYiB9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzaGFyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGFba2V5XSwgYltrZXldKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld09ialtrZXldID0gc2hhcmVkVmFsdWUuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3T2JqIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUEgPSBhW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1CID0gYltpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGl0ZW1BLCBpdGVtQik7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdBcnJheSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmRhdGUgJiZcbiAgICAgICAgK2EgPT09ICtiKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBhIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICB9XG59XG5jbGFzcyBab2RJbnRlcnNlY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgaGFuZGxlUGFyc2VkID0gKHBhcnNlZExlZnQsIHBhcnNlZFJpZ2h0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBYm9ydGVkKHBhcnNlZExlZnQpIHx8IGlzQWJvcnRlZChwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVmFsdWVzKHBhcnNlZExlZnQudmFsdWUsIHBhcnNlZFJpZ2h0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RpcnR5KHBhcnNlZExlZnQpIHx8IGlzRGlydHkocGFyc2VkUmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IG1lcmdlZC5kYXRhIH07XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSkgPT4gaGFuZGxlUGFyc2VkKGxlZnQsIHJpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUGFyc2VkKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZEludGVyc2VjdGlvbi5jcmVhdGUgPSAobGVmdCwgcmlnaHQsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEludGVyc2VjdGlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFR1cGxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3QgPSB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgaWYgKCFyZXN0ICYmIGN0eC5kYXRhLmxlbmd0aCA+IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgIG1heGltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLmN0eC5kYXRhXVxuICAgICAgICAgICAgLm1hcCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLl9kZWYuaXRlbXNbaXRlbUluZGV4XSB8fCB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgICAgIGlmICghc2NoZW1hKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpdGVtSW5kZXgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEheCk7IC8vIGZpbHRlciBudWxsc1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCBpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLml0ZW1zO1xuICAgIH1cbiAgICByZXN0KHJlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXN0LFxuICAgICAgICB9KTtcbiAgICB9XG59XG5ab2RUdXBsZS5jcmVhdGUgPSAoc2NoZW1hcywgcGFyYW1zKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgaXRlbXM6IHNjaGVtYXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGUsXG4gICAgICAgIHJlc3Q6IG51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBjdHguZGF0YVtrZXldLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kLCB0aGlyZCkge1xuICAgICAgICBpZiAoc2Vjb25kIGluc3RhbmNlb2YgWm9kVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAgICAgIGtleVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogc2Vjb25kLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcmQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBab2RNYXAgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubWFwKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm1hcCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgY29uc3QgcGFpcnMgPSBbLi4uY3R4LmRhdGEuZW50cmllcygpXS5tYXAoKFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXlUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwga2V5LCBjdHgucGF0aCwgW2luZGV4LCBcImtleVwiXSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIFtpbmRleCwgXCJ2YWx1ZVwiXSkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE1hcCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFpci52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxNYXAuc2V0KGtleS52YWx1ZSwgdmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE1hcCB9O1xuICAgICAgICB9XG4gICAgfVxufVxuWm9kTWFwLmNyZWF0ZSA9IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTWFwKHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE1hcCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFNldCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc2V0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnNldCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGRlZi5taW5TaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA8IGRlZi5taW5TaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5TaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pblNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5zaXplID4gZGVmLm1heFNpemUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhTaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heFNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBmdW5jdGlvbiBmaW5hbGl6ZVNldChlbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHBhcnNlZFNldC5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHBhcnNlZFNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmN0eC5kYXRhLnZhbHVlcygpXS5tYXAoKGl0ZW0sIGkpID0+IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSkpO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGVsZW1lbnRzKS50aGVuKChlbGVtZW50cykgPT4gZmluYWxpemVTZXQoZWxlbWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbGl6ZVNldChlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWluKG1pblNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluU2l6ZTogeyB2YWx1ZTogbWluU2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4U2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhTaXplOiB7IHZhbHVlOiBtYXhTaXplLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpemUoc2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oc2l6ZSwgbWVzc2FnZSkubWF4KHNpemUsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5ab2RTZXQuY3JlYXRlID0gKHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIG1pblNpemU6IG51bGwsXG4gICAgICAgIG1heFNpemU6IG51bGwsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU2V0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRnVuY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHRoaXMuaW1wbGVtZW50O1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5mdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VBcmdzSXNzdWUoYXJncywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0Vycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZVJldHVybnNJc3N1ZShyZXR1cm5zLCBlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VJc3N1ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogcmV0dXJucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNYXAoKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgICAgICAgICAgICAgaXNzdWVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3JldHVybl90eXBlLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCB9O1xuICAgICAgICBjb25zdCBmbiA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBab2RQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gT0soYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihbXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IGF3YWl0IG1lLl9kZWYuYXJnc1xuICAgICAgICAgICAgICAgICAgICAucGFyc2VBc3luYyhhcmdzLCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5hZGRJc3N1ZShtYWtlQXJnc0lzc3VlKGFyZ3MsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmV0dXJucyA9IGF3YWl0IG1lLl9kZWYucmV0dXJucy5fZGVmLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMocmVzdWx0LCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5hZGRJc3N1ZShtYWtlUmV0dXJuc0lzc3VlKHJlc3VsdCwgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IG1lLl9kZWYuYXJncy5zYWZlUGFyc2UoYXJncywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZEFyZ3Muc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VBcmdzSXNzdWUoYXJncywgcGFyc2VkQXJncy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncy5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gbWUuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShyZXN1bHQsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRSZXR1cm5zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yKFttYWtlUmV0dXJuc0lzc3VlKHJlc3VsdCwgcGFyc2VkUmV0dXJucy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnMuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuYXJncztcbiAgICB9XG4gICAgcmV0dXJuVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5yZXR1cm5zO1xuICAgIH1cbiAgICBhcmdzKC4uLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgYXJnczogWm9kVHVwbGUuY3JlYXRlKGl0ZW1zKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJucyhyZXR1cm5UeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgcmV0dXJuczogcmV0dXJuVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RyaWN0SW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGFyZ3MsIHJldHVybnMsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIGFyZ3M6IChhcmdzXG4gICAgICAgICAgICAgICAgPyBhcmdzXG4gICAgICAgICAgICAgICAgOiBab2RUdXBsZS5jcmVhdGUoW10pLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSkpLFxuICAgICAgICAgICAgcmV0dXJuczogcmV0dXJucyB8fCBab2RVbmtub3duLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RGdW5jdGlvbixcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgWm9kTGF6eSBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgbGF6eVNjaGVtYSA9IHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICAgICAgcmV0dXJuIGxhenlTY2hlbWEuX3BhcnNlKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICB9XG59XG5ab2RMYXp5LmNyZWF0ZSA9IChnZXR0ZXIsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGF6eSh7XG4gICAgICAgIGdldHRlcjogZ2V0dGVyLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExhenksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5kYXRhICE9PSB0aGlzLl9kZWYudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWU7XG4gICAgfVxufVxuWm9kTGl0ZXJhbC5jcmVhdGUgPSAodmFsdWUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGl0ZXJhbCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMaXRlcmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gY3JlYXRlWm9kRW51bSh2YWx1ZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59XG5jbGFzcyBab2RFbnVtIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQuZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWwuam9pblZhbHVlcyhleHBlY3RlZFZhbHVlcyksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kZWYudmFsdWVzLmluZGV4T2YoaW5wdXQuZGF0YSkgPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IFZhbHVlcygpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBFbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZXh0cmFjdCh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHZhbHVlcyk7XG4gICAgfVxuICAgIGV4Y2x1ZGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSkpO1xuICAgIH1cbn1cblpvZEVudW0uY3JlYXRlID0gY3JlYXRlWm9kRW51bTtcbmNsYXNzIFpvZE5hdGl2ZUVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRW51bVZhbHVlcyA9IHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpO1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcgJiZcbiAgICAgICAgICAgIGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF0aXZlRW51bVZhbHVlcy5pbmRleE9mKGlucHV0LmRhdGEpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG59XG5ab2ROYXRpdmVFbnVtLmNyZWF0ZSA9ICh2YWx1ZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmF0aXZlRW51bSh7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hdGl2ZUVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RQcm9taXNlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnByb21pc2UgJiZcbiAgICAgICAgICAgIGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2VcbiAgICAgICAgICAgID8gY3R4LmRhdGFcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGN0eC5kYXRhKTtcbiAgICAgICAgcmV0dXJuIE9LKHByb21pc2lmaWVkLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5wYXJzZUFzeW5jKGRhdGEsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblpvZFByb21pc2UuY3JlYXRlID0gKHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogc2NoZW1hLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFByb21pc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RFZmZlY3RzIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgaW5uZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHNcbiAgICAgICAgICAgID8gdGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKClcbiAgICAgICAgICAgIDogdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IHRoaXMuX2RlZi5lZmZlY3QgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgY2hlY2tDdHggPSB7XG4gICAgICAgICAgICBhZGRJc3N1ZTogKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgYXJnKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLmZhdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBwYXRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGF0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQ3R4LmFkZElzc3VlID0gY2hlY2tDdHguYWRkSXNzdWUuYmluZChjaGVja0N0eCk7XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJwcmVwcm9jZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvY2Vzc2VkKS50aGVuKChwcm9jZXNzZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInJlZmluZW1lbnRcIikge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVJlZmluZW1lbnQgPSAoYWNjXG4gICAgICAgICAgICAvLyBlZmZlY3Q6IFJlZmluZW1lbnRFZmZlY3Q8YW55PlxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnJlZmluZW1lbnQoYWNjLCBjaGVja0N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lciA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWRcbiAgICAgICAgICAgICAgICBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoaW5uZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKGJhc2UpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcmVzdWx0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYVxuICAgICAgICAgICAgICAgICAgICAuX3BhcnNlQXN5bmMoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChiYXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpKS50aGVuKChyZXN1bHQpID0+ICh7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcmVzdWx0IH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGVmZmVjdCk7XG4gICAgfVxufVxuWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICBlZmZlY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzID0gKHByZXByb2Nlc3MsIHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJwcmVwcm9jZXNzXCIsIHRyYW5zZm9ybTogcHJlcHJvY2VzcyB9LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RPcHRpb25hbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIE9LKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2RPcHRpb25hbC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGxhYmxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUubnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIE9LKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kTnVsbGFibGUuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVsbGFibGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REZWZhdWx0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZERlZmF1bHQuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBwYXJhbXMuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHBhcmFtcy5kZWZhdWx0XG4gICAgICAgICAgICA6ICgpID0+IHBhcmFtcy5kZWZhdWx0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQ2F0Y2ggZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIC8vIG5ld0N0eCBpcyB1c2VkIHRvIG5vdCBjb2xsZWN0IGlzc3VlcyBmcm9tIGlubmVyIHR5cGVzIGluIGN0eFxuICAgICAgICBjb25zdCBuZXdDdHggPSB7XG4gICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhOiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IG5ld0N0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICAgICAgLi4ubmV3Q3R4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUNhdGNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2RDYXRjaC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIHBhcmFtcy5jYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gcGFyYW1zLmNhdGNoIDogKCkgPT4gcGFyYW1zLmNhdGNoLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTmFOIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubmFuKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5hbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbn1cblpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROYU4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hTixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNvbnN0IEJSQU5EID0gU3ltYm9sKFwiem9kX2JyYW5kXCIpO1xuY2xhc3MgWm9kQnJhbmRlZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxufVxuY2xhc3MgWm9kUGlwZWxpbmUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUFzeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkoaW5SZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFzeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IHRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RQaXBlbGluZSh7XG4gICAgICAgICAgICBpbjogYSxcbiAgICAgICAgICAgIG91dDogYixcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFpvZFJlYWRvbmx5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKGlzVmFsaWQocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gT2JqZWN0LmZyZWV6ZShyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuWm9kUmVhZG9ubHkuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUmVhZG9ubHkoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVhZG9ubHksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jb25zdCBjdXN0b20gPSAoY2hlY2ssIHBhcmFtcyA9IHt9LCBcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiBQYXNzIGBmYXRhbGAgaW50byB0aGUgcGFyYW1zIG9iamVjdCBpbnN0ZWFkOlxuICpcbiAqIGBgYHRzXG4gKiB6LnN0cmluZygpLmN1c3RvbSgodmFsKSA9PiB2YWwubGVuZ3RoID4gNSwgeyBmYXRhbDogZmFsc2UgfSlcbiAqIGBgYFxuICpcbiAqL1xuZmF0YWwpID0+IHtcbiAgICBpZiAoY2hlY2spXG4gICAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIGlmICghY2hlY2soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcGFyYW1zKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIHBhcmFtcyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7IG1lc3NhZ2U6IHBhcmFtcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmFtcztcbiAgICAgICAgICAgICAgICBjb25zdCBfZmF0YWwgPSAoX2IgPSAoX2EgPSBwLmZhdGFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYXRhbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHR5cGVvZiBwID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlOiBwIH0gOiBwO1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6IFwiY3VzdG9tXCIsIC4uLnAyLCBmYXRhbDogX2ZhdGFsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpO1xufTtcbmNvbnN0IGxhdGUgPSB7XG4gICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZSxcbn07XG52YXIgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kO1xuKGZ1bmN0aW9uIChab2RGaXJzdFBhcnR5VHlwZUtpbmQpIHtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTdHJpbmdcIl0gPSBcIlpvZFN0cmluZ1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bWJlclwiXSA9IFwiWm9kTnVtYmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmFOXCJdID0gXCJab2ROYU5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCaWdJbnRcIl0gPSBcIlpvZEJpZ0ludFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJvb2xlYW5cIl0gPSBcIlpvZEJvb2xlYW5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REYXRlXCJdID0gXCJab2REYXRlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3ltYm9sXCJdID0gXCJab2RTeW1ib2xcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmRlZmluZWRcIl0gPSBcIlpvZFVuZGVmaW5lZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxcIl0gPSBcIlpvZE51bGxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBbnlcIl0gPSBcIlpvZEFueVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVua25vd25cIl0gPSBcIlpvZFVua25vd25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROZXZlclwiXSA9IFwiWm9kTmV2ZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RWb2lkXCJdID0gXCJab2RWb2lkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQXJyYXlcIl0gPSBcIlpvZEFycmF5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT2JqZWN0XCJdID0gXCJab2RPYmplY3RcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmlvblwiXSA9IFwiWm9kVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REaXNjcmltaW5hdGVkVW5pb25cIl0gPSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEludGVyc2VjdGlvblwiXSA9IFwiWm9kSW50ZXJzZWN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVHVwbGVcIl0gPSBcIlpvZFR1cGxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVjb3JkXCJdID0gXCJab2RSZWNvcmRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RNYXBcIl0gPSBcIlpvZE1hcFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFNldFwiXSA9IFwiWm9kU2V0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRnVuY3Rpb25cIl0gPSBcIlpvZEZ1bmN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGF6eVwiXSA9IFwiWm9kTGF6eVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExpdGVyYWxcIl0gPSBcIlpvZExpdGVyYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFbnVtXCJdID0gXCJab2RFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRWZmZWN0c1wiXSA9IFwiWm9kRWZmZWN0c1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hdGl2ZUVudW1cIl0gPSBcIlpvZE5hdGl2ZUVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPcHRpb25hbFwiXSA9IFwiWm9kT3B0aW9uYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsYWJsZVwiXSA9IFwiWm9kTnVsbGFibGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REZWZhdWx0XCJdID0gXCJab2REZWZhdWx0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQ2F0Y2hcIl0gPSBcIlpvZENhdGNoXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUHJvbWlzZVwiXSA9IFwiWm9kUHJvbWlzZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJyYW5kZWRcIl0gPSBcIlpvZEJyYW5kZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQaXBlbGluZVwiXSA9IFwiWm9kUGlwZWxpbmVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWFkb25seVwiXSA9IFwiWm9kUmVhZG9ubHlcIjtcbn0pKFpvZEZpcnN0UGFydHlUeXBlS2luZCB8fCAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0ge30pKTtcbmNvbnN0IGluc3RhbmNlT2ZUeXBlID0gKFxuLy8gY29uc3QgaW5zdGFuY2VPZlR5cGUgPSA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueT4oXG5jbHMsIHBhcmFtcyA9IHtcbiAgICBtZXNzYWdlOiBgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7Y2xzLm5hbWV9YCxcbn0pID0+IGN1c3RvbSgoZGF0YSkgPT4gZGF0YSBpbnN0YW5jZW9mIGNscywgcGFyYW1zKTtcbmNvbnN0IHN0cmluZ1R5cGUgPSBab2RTdHJpbmcuY3JlYXRlO1xuY29uc3QgbnVtYmVyVHlwZSA9IFpvZE51bWJlci5jcmVhdGU7XG5jb25zdCBuYW5UeXBlID0gWm9kTmFOLmNyZWF0ZTtcbmNvbnN0IGJpZ0ludFR5cGUgPSBab2RCaWdJbnQuY3JlYXRlO1xuY29uc3QgYm9vbGVhblR5cGUgPSBab2RCb29sZWFuLmNyZWF0ZTtcbmNvbnN0IGRhdGVUeXBlID0gWm9kRGF0ZS5jcmVhdGU7XG5jb25zdCBzeW1ib2xUeXBlID0gWm9kU3ltYm9sLmNyZWF0ZTtcbmNvbnN0IHVuZGVmaW5lZFR5cGUgPSBab2RVbmRlZmluZWQuY3JlYXRlO1xuY29uc3QgbnVsbFR5cGUgPSBab2ROdWxsLmNyZWF0ZTtcbmNvbnN0IGFueVR5cGUgPSBab2RBbnkuY3JlYXRlO1xuY29uc3QgdW5rbm93blR5cGUgPSBab2RVbmtub3duLmNyZWF0ZTtcbmNvbnN0IG5ldmVyVHlwZSA9IFpvZE5ldmVyLmNyZWF0ZTtcbmNvbnN0IHZvaWRUeXBlID0gWm9kVm9pZC5jcmVhdGU7XG5jb25zdCBhcnJheVR5cGUgPSBab2RBcnJheS5jcmVhdGU7XG5jb25zdCBvYmplY3RUeXBlID0gWm9kT2JqZWN0LmNyZWF0ZTtcbmNvbnN0IHN0cmljdE9iamVjdFR5cGUgPSBab2RPYmplY3Quc3RyaWN0Q3JlYXRlO1xuY29uc3QgdW5pb25UeXBlID0gWm9kVW5pb24uY3JlYXRlO1xuY29uc3QgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSA9IFpvZERpc2NyaW1pbmF0ZWRVbmlvbi5jcmVhdGU7XG5jb25zdCBpbnRlcnNlY3Rpb25UeXBlID0gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZTtcbmNvbnN0IHR1cGxlVHlwZSA9IFpvZFR1cGxlLmNyZWF0ZTtcbmNvbnN0IHJlY29yZFR5cGUgPSBab2RSZWNvcmQuY3JlYXRlO1xuY29uc3QgbWFwVHlwZSA9IFpvZE1hcC5jcmVhdGU7XG5jb25zdCBzZXRUeXBlID0gWm9kU2V0LmNyZWF0ZTtcbmNvbnN0IGZ1bmN0aW9uVHlwZSA9IFpvZEZ1bmN0aW9uLmNyZWF0ZTtcbmNvbnN0IGxhenlUeXBlID0gWm9kTGF6eS5jcmVhdGU7XG5jb25zdCBsaXRlcmFsVHlwZSA9IFpvZExpdGVyYWwuY3JlYXRlO1xuY29uc3QgZW51bVR5cGUgPSBab2RFbnVtLmNyZWF0ZTtcbmNvbnN0IG5hdGl2ZUVudW1UeXBlID0gWm9kTmF0aXZlRW51bS5jcmVhdGU7XG5jb25zdCBwcm9taXNlVHlwZSA9IFpvZFByb21pc2UuY3JlYXRlO1xuY29uc3QgZWZmZWN0c1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZTtcbmNvbnN0IG9wdGlvbmFsVHlwZSA9IFpvZE9wdGlvbmFsLmNyZWF0ZTtcbmNvbnN0IG51bGxhYmxlVHlwZSA9IFpvZE51bGxhYmxlLmNyZWF0ZTtcbmNvbnN0IHByZXByb2Nlc3NUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcztcbmNvbnN0IHBpcGVsaW5lVHlwZSA9IFpvZFBpcGVsaW5lLmNyZWF0ZTtcbmNvbnN0IG9zdHJpbmcgPSAoKSA9PiBzdHJpbmdUeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IG9udW1iZXIgPSAoKSA9PiBudW1iZXJUeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IG9ib29sZWFuID0gKCkgPT4gYm9vbGVhblR5cGUoKS5vcHRpb25hbCgpO1xuY29uc3QgY29lcmNlID0ge1xuICAgIHN0cmluZzogKChhcmcpID0+IFpvZFN0cmluZy5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgbnVtYmVyOiAoKGFyZykgPT4gWm9kTnVtYmVyLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBib29sZWFuOiAoKGFyZykgPT4gWm9kQm9vbGVhbi5jcmVhdGUoe1xuICAgICAgICAuLi5hcmcsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICB9KSksXG4gICAgYmlnaW50OiAoKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBkYXRlOiAoKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG59O1xuY29uc3QgTkVWRVIgPSBJTlZBTElEO1xuXG52YXIgeiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZGVmYXVsdEVycm9yTWFwOiBlcnJvck1hcCxcbiAgICBzZXRFcnJvck1hcDogc2V0RXJyb3JNYXAsXG4gICAgZ2V0RXJyb3JNYXA6IGdldEVycm9yTWFwLFxuICAgIG1ha2VJc3N1ZTogbWFrZUlzc3VlLFxuICAgIEVNUFRZX1BBVEg6IEVNUFRZX1BBVEgsXG4gICAgYWRkSXNzdWVUb0NvbnRleHQ6IGFkZElzc3VlVG9Db250ZXh0LFxuICAgIFBhcnNlU3RhdHVzOiBQYXJzZVN0YXR1cyxcbiAgICBJTlZBTElEOiBJTlZBTElELFxuICAgIERJUlRZOiBESVJUWSxcbiAgICBPSzogT0ssXG4gICAgaXNBYm9ydGVkOiBpc0Fib3J0ZWQsXG4gICAgaXNEaXJ0eTogaXNEaXJ0eSxcbiAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgIGlzQXN5bmM6IGlzQXN5bmMsXG4gICAgZ2V0IHV0aWwgKCkgeyByZXR1cm4gdXRpbDsgfSxcbiAgICBnZXQgb2JqZWN0VXRpbCAoKSB7IHJldHVybiBvYmplY3RVdGlsOyB9LFxuICAgIFpvZFBhcnNlZFR5cGU6IFpvZFBhcnNlZFR5cGUsXG4gICAgZ2V0UGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZSxcbiAgICBab2RUeXBlOiBab2RUeXBlLFxuICAgIFpvZFN0cmluZzogWm9kU3RyaW5nLFxuICAgIFpvZE51bWJlcjogWm9kTnVtYmVyLFxuICAgIFpvZEJpZ0ludDogWm9kQmlnSW50LFxuICAgIFpvZEJvb2xlYW46IFpvZEJvb2xlYW4sXG4gICAgWm9kRGF0ZTogWm9kRGF0ZSxcbiAgICBab2RTeW1ib2w6IFpvZFN5bWJvbCxcbiAgICBab2RVbmRlZmluZWQ6IFpvZFVuZGVmaW5lZCxcbiAgICBab2ROdWxsOiBab2ROdWxsLFxuICAgIFpvZEFueTogWm9kQW55LFxuICAgIFpvZFVua25vd246IFpvZFVua25vd24sXG4gICAgWm9kTmV2ZXI6IFpvZE5ldmVyLFxuICAgIFpvZFZvaWQ6IFpvZFZvaWQsXG4gICAgWm9kQXJyYXk6IFpvZEFycmF5LFxuICAgIFpvZE9iamVjdDogWm9kT2JqZWN0LFxuICAgIFpvZFVuaW9uOiBab2RVbmlvbixcbiAgICBab2REaXNjcmltaW5hdGVkVW5pb246IFpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICBab2RJbnRlcnNlY3Rpb246IFpvZEludGVyc2VjdGlvbixcbiAgICBab2RUdXBsZTogWm9kVHVwbGUsXG4gICAgWm9kUmVjb3JkOiBab2RSZWNvcmQsXG4gICAgWm9kTWFwOiBab2RNYXAsXG4gICAgWm9kU2V0OiBab2RTZXQsXG4gICAgWm9kRnVuY3Rpb246IFpvZEZ1bmN0aW9uLFxuICAgIFpvZExhenk6IFpvZExhenksXG4gICAgWm9kTGl0ZXJhbDogWm9kTGl0ZXJhbCxcbiAgICBab2RFbnVtOiBab2RFbnVtLFxuICAgIFpvZE5hdGl2ZUVudW06IFpvZE5hdGl2ZUVudW0sXG4gICAgWm9kUHJvbWlzZTogWm9kUHJvbWlzZSxcbiAgICBab2RFZmZlY3RzOiBab2RFZmZlY3RzLFxuICAgIFpvZFRyYW5zZm9ybWVyOiBab2RFZmZlY3RzLFxuICAgIFpvZE9wdGlvbmFsOiBab2RPcHRpb25hbCxcbiAgICBab2ROdWxsYWJsZTogWm9kTnVsbGFibGUsXG4gICAgWm9kRGVmYXVsdDogWm9kRGVmYXVsdCxcbiAgICBab2RDYXRjaDogWm9kQ2F0Y2gsXG4gICAgWm9kTmFOOiBab2ROYU4sXG4gICAgQlJBTkQ6IEJSQU5ELFxuICAgIFpvZEJyYW5kZWQ6IFpvZEJyYW5kZWQsXG4gICAgWm9kUGlwZWxpbmU6IFpvZFBpcGVsaW5lLFxuICAgIFpvZFJlYWRvbmx5OiBab2RSZWFkb25seSxcbiAgICBjdXN0b206IGN1c3RvbSxcbiAgICBTY2hlbWE6IFpvZFR5cGUsXG4gICAgWm9kU2NoZW1hOiBab2RUeXBlLFxuICAgIGxhdGU6IGxhdGUsXG4gICAgZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCAoKSB7IHJldHVybiBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7IH0sXG4gICAgY29lcmNlOiBjb2VyY2UsXG4gICAgYW55OiBhbnlUeXBlLFxuICAgIGFycmF5OiBhcnJheVR5cGUsXG4gICAgYmlnaW50OiBiaWdJbnRUeXBlLFxuICAgIGJvb2xlYW46IGJvb2xlYW5UeXBlLFxuICAgIGRhdGU6IGRhdGVUeXBlLFxuICAgIGRpc2NyaW1pbmF0ZWRVbmlvbjogZGlzY3JpbWluYXRlZFVuaW9uVHlwZSxcbiAgICBlZmZlY3Q6IGVmZmVjdHNUeXBlLFxuICAgICdlbnVtJzogZW51bVR5cGUsXG4gICAgJ2Z1bmN0aW9uJzogZnVuY3Rpb25UeXBlLFxuICAgICdpbnN0YW5jZW9mJzogaW5zdGFuY2VPZlR5cGUsXG4gICAgaW50ZXJzZWN0aW9uOiBpbnRlcnNlY3Rpb25UeXBlLFxuICAgIGxhenk6IGxhenlUeXBlLFxuICAgIGxpdGVyYWw6IGxpdGVyYWxUeXBlLFxuICAgIG1hcDogbWFwVHlwZSxcbiAgICBuYW46IG5hblR5cGUsXG4gICAgbmF0aXZlRW51bTogbmF0aXZlRW51bVR5cGUsXG4gICAgbmV2ZXI6IG5ldmVyVHlwZSxcbiAgICAnbnVsbCc6IG51bGxUeXBlLFxuICAgIG51bGxhYmxlOiBudWxsYWJsZVR5cGUsXG4gICAgbnVtYmVyOiBudW1iZXJUeXBlLFxuICAgIG9iamVjdDogb2JqZWN0VHlwZSxcbiAgICBvYm9vbGVhbjogb2Jvb2xlYW4sXG4gICAgb251bWJlcjogb251bWJlcixcbiAgICBvcHRpb25hbDogb3B0aW9uYWxUeXBlLFxuICAgIG9zdHJpbmc6IG9zdHJpbmcsXG4gICAgcGlwZWxpbmU6IHBpcGVsaW5lVHlwZSxcbiAgICBwcmVwcm9jZXNzOiBwcmVwcm9jZXNzVHlwZSxcbiAgICBwcm9taXNlOiBwcm9taXNlVHlwZSxcbiAgICByZWNvcmQ6IHJlY29yZFR5cGUsXG4gICAgc2V0OiBzZXRUeXBlLFxuICAgIHN0cmljdE9iamVjdDogc3RyaWN0T2JqZWN0VHlwZSxcbiAgICBzdHJpbmc6IHN0cmluZ1R5cGUsXG4gICAgc3ltYm9sOiBzeW1ib2xUeXBlLFxuICAgIHRyYW5zZm9ybWVyOiBlZmZlY3RzVHlwZSxcbiAgICB0dXBsZTogdHVwbGVUeXBlLFxuICAgICd1bmRlZmluZWQnOiB1bmRlZmluZWRUeXBlLFxuICAgIHVuaW9uOiB1bmlvblR5cGUsXG4gICAgdW5rbm93bjogdW5rbm93blR5cGUsXG4gICAgJ3ZvaWQnOiB2b2lkVHlwZSxcbiAgICBORVZFUjogTkVWRVIsXG4gICAgWm9kSXNzdWVDb2RlOiBab2RJc3N1ZUNvZGUsXG4gICAgcXVvdGVsZXNzSnNvbjogcXVvdGVsZXNzSnNvbixcbiAgICBab2RFcnJvcjogWm9kRXJyb3Jcbn0pO1xuXG5leHBvcnQgeyBCUkFORCwgRElSVFksIEVNUFRZX1BBVEgsIElOVkFMSUQsIE5FVkVSLCBPSywgUGFyc2VTdGF0dXMsIFpvZFR5cGUgYXMgU2NoZW1hLCBab2RBbnksIFpvZEFycmF5LCBab2RCaWdJbnQsIFpvZEJvb2xlYW4sIFpvZEJyYW5kZWQsIFpvZENhdGNoLCBab2REYXRlLCBab2REZWZhdWx0LCBab2REaXNjcmltaW5hdGVkVW5pb24sIFpvZEVmZmVjdHMsIFpvZEVudW0sIFpvZEVycm9yLCBab2RGaXJzdFBhcnR5VHlwZUtpbmQsIFpvZEZ1bmN0aW9uLCBab2RJbnRlcnNlY3Rpb24sIFpvZElzc3VlQ29kZSwgWm9kTGF6eSwgWm9kTGl0ZXJhbCwgWm9kTWFwLCBab2ROYU4sIFpvZE5hdGl2ZUVudW0sIFpvZE5ldmVyLCBab2ROdWxsLCBab2ROdWxsYWJsZSwgWm9kTnVtYmVyLCBab2RPYmplY3QsIFpvZE9wdGlvbmFsLCBab2RQYXJzZWRUeXBlLCBab2RQaXBlbGluZSwgWm9kUHJvbWlzZSwgWm9kUmVhZG9ubHksIFpvZFJlY29yZCwgWm9kVHlwZSBhcyBab2RTY2hlbWEsIFpvZFNldCwgWm9kU3RyaW5nLCBab2RTeW1ib2wsIFpvZEVmZmVjdHMgYXMgWm9kVHJhbnNmb3JtZXIsIFpvZFR1cGxlLCBab2RUeXBlLCBab2RVbmRlZmluZWQsIFpvZFVuaW9uLCBab2RVbmtub3duLCBab2RWb2lkLCBhZGRJc3N1ZVRvQ29udGV4dCwgYW55VHlwZSBhcyBhbnksIGFycmF5VHlwZSBhcyBhcnJheSwgYmlnSW50VHlwZSBhcyBiaWdpbnQsIGJvb2xlYW5UeXBlIGFzIGJvb2xlYW4sIGNvZXJjZSwgY3VzdG9tLCBkYXRlVHlwZSBhcyBkYXRlLCB6IGFzIGRlZmF1bHQsIGVycm9yTWFwIGFzIGRlZmF1bHRFcnJvck1hcCwgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSBhcyBkaXNjcmltaW5hdGVkVW5pb24sIGVmZmVjdHNUeXBlIGFzIGVmZmVjdCwgZW51bVR5cGUgYXMgZW51bSwgZnVuY3Rpb25UeXBlIGFzIGZ1bmN0aW9uLCBnZXRFcnJvck1hcCwgZ2V0UGFyc2VkVHlwZSwgaW5zdGFuY2VPZlR5cGUgYXMgaW5zdGFuY2VvZiwgaW50ZXJzZWN0aW9uVHlwZSBhcyBpbnRlcnNlY3Rpb24sIGlzQWJvcnRlZCwgaXNBc3luYywgaXNEaXJ0eSwgaXNWYWxpZCwgbGF0ZSwgbGF6eVR5cGUgYXMgbGF6eSwgbGl0ZXJhbFR5cGUgYXMgbGl0ZXJhbCwgbWFrZUlzc3VlLCBtYXBUeXBlIGFzIG1hcCwgbmFuVHlwZSBhcyBuYW4sIG5hdGl2ZUVudW1UeXBlIGFzIG5hdGl2ZUVudW0sIG5ldmVyVHlwZSBhcyBuZXZlciwgbnVsbFR5cGUgYXMgbnVsbCwgbnVsbGFibGVUeXBlIGFzIG51bGxhYmxlLCBudW1iZXJUeXBlIGFzIG51bWJlciwgb2JqZWN0VHlwZSBhcyBvYmplY3QsIG9iamVjdFV0aWwsIG9ib29sZWFuLCBvbnVtYmVyLCBvcHRpb25hbFR5cGUgYXMgb3B0aW9uYWwsIG9zdHJpbmcsIHBpcGVsaW5lVHlwZSBhcyBwaXBlbGluZSwgcHJlcHJvY2Vzc1R5cGUgYXMgcHJlcHJvY2VzcywgcHJvbWlzZVR5cGUgYXMgcHJvbWlzZSwgcXVvdGVsZXNzSnNvbiwgcmVjb3JkVHlwZSBhcyByZWNvcmQsIHNldFR5cGUgYXMgc2V0LCBzZXRFcnJvck1hcCwgc3RyaWN0T2JqZWN0VHlwZSBhcyBzdHJpY3RPYmplY3QsIHN0cmluZ1R5cGUgYXMgc3RyaW5nLCBzeW1ib2xUeXBlIGFzIHN5bWJvbCwgZWZmZWN0c1R5cGUgYXMgdHJhbnNmb3JtZXIsIHR1cGxlVHlwZSBhcyB0dXBsZSwgdW5kZWZpbmVkVHlwZSBhcyB1bmRlZmluZWQsIHVuaW9uVHlwZSBhcyB1bmlvbiwgdW5rbm93blR5cGUgYXMgdW5rbm93biwgdXRpbCwgdm9pZFR5cGUgYXMgdm9pZCwgeiB9O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IEJvb2sgPSB6LnVuaW9uKFtcblx0ei5saXRlcmFsKFwicHVcIiksXG5cdHoubGl0ZXJhbChcImt1IHN1bGlcIiksXG5cdHoubGl0ZXJhbChcImt1IGxpbGlcIiksXG5cdHoubGl0ZXJhbChcIm5vbmVcIiksXG5dKTtcbmV4cG9ydCB0eXBlIEJvb2sgPSB6LmluZmVyPHR5cGVvZiBCb29rPjtcblxuZXhwb3J0IGNvbnN0IENvaW5lZEVyYSA9IHoudW5pb24oW3oubGl0ZXJhbChcInByZS1wdVwiKSwgei5saXRlcmFsKFwicG9zdC1wdVwiKSwgei5saXRlcmFsKFwicG9zdC1rdVwiKV0pO1xuZXhwb3J0IHR5cGUgQ29pbmVkRXJhID0gei5pbmZlcjx0eXBlb2YgQ29pbmVkRXJhPjtcblxuZXhwb3J0IGNvbnN0IFVzYWdlQ2F0ZWdvcnkgPSB6LnVuaW9uKFtcblx0ei5saXRlcmFsKFwiY29yZVwiKSxcblx0ei5saXRlcmFsKFwiY29tbW9uXCIpLFxuXHR6LmxpdGVyYWwoXCJ1bmNvbW1vblwiKSxcblx0ei5saXRlcmFsKFwib2JzY3VyZVwiKSxcblx0ei5saXRlcmFsKFwic2FuZGJveFwiKSxcbl0pO1xuZXhwb3J0IHR5cGUgVXNhZ2VDYXRlZ29yeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlQ2F0ZWdvcnk+O1xuXG5leHBvcnQgY29uc3QgV3JpdGluZ1N5c3RlbSA9IHouZW51bShbXG5cdFwic2l0ZWxlbiBwb25hXCIsXG5cdFwic2l0ZWxlbiBzaXRlbGVuXCIsXG5cdFwiYWxwaGFiZXRcIixcblx0XCJzeWxsYWJhcnlcIixcblx0XCJsb2dvZ3JhcGh5XCIsXG5cdFwidG9raXBvbmlkbyBhbHBoYWJldFwiLFxuXHRcInRva2lwb25pZG8gc3lsbGFiYXJ5XCIsXG5cdFwidG9raXBvbmlkbyBsb2dvZ3JhcGh5XCIsXG5dKTtcbmV4cG9ydCB0eXBlIFdyaXRpbmdTeXN0ZW0gPSB6LmluZmVyPHR5cGVvZiBXcml0aW5nU3lzdGVtPjtcblxuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRlZERhdGE8XG5cdE9iaiBleHRlbmRzIHsgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+IH0sXG5cdEtleSBleHRlbmRzIGtleW9mIE9ialtcInRyYW5zbGF0aW9uc1wiXVtzdHJpbmddLFxuPihkYXRhOiBPYmosIGtleTogS2V5LCBsYW5ndWFnZTogc3RyaW5nKTogT2JqW1widHJhbnNsYXRpb25zXCJdW3N0cmluZ11bS2V5XSB7XG5cdHJldHVybiAoKGRhdGEudHJhbnNsYXRpb25zW2xhbmd1YWdlXSA/PyBkYXRhLnRyYW5zbGF0aW9uc1tcImVuXCJdISkgYXMgT2JqW1widHJhbnNsYXRpb25zXCJdW3N0cmluZ10pW1xuXHRcdGtleVxuXHRdO1xufVxuIl0sIm5hbWVzIjpbInV0aWwiLCJ2YWwiLCJhc3NlcnRJcyIsIl9hcmciLCJhc3NlcnROZXZlciIsIl94IiwiaXRlbXMiLCJvYmoiLCJpdGVtIiwidmFsaWRLZXlzIiwiayIsImZpbHRlcmVkIiwiZSIsIm9iamVjdCIsImtleXMiLCJrZXkiLCJhcnIiLCJjaGVja2VyIiwiam9pblZhbHVlcyIsImFycmF5Iiwic2VwYXJhdG9yIiwiXyIsInZhbHVlIiwib2JqZWN0VXRpbCIsImZpcnN0Iiwic2Vjb25kIiwiWm9kUGFyc2VkVHlwZSIsImdldFBhcnNlZFR5cGUiLCJkYXRhIiwiWm9kSXNzdWVDb2RlIiwicXVvdGVsZXNzSnNvbiIsIlpvZEVycm9yIiwiaXNzdWVzIiwic3ViIiwic3VicyIsImFjdHVhbFByb3RvIiwiX21hcHBlciIsIm1hcHBlciIsImlzc3VlIiwiZmllbGRFcnJvcnMiLCJwcm9jZXNzRXJyb3IiLCJlcnJvciIsImN1cnIiLCJpIiwiZWwiLCJmb3JtRXJyb3JzIiwiZXJyb3JNYXAiLCJfY3R4IiwibWVzc2FnZSIsIm92ZXJyaWRlRXJyb3JNYXAiLCJzZXRFcnJvck1hcCIsIm1hcCIsImdldEVycm9yTWFwIiwibWFrZUlzc3VlIiwicGFyYW1zIiwicGF0aCIsImVycm9yTWFwcyIsImlzc3VlRGF0YSIsImZ1bGxQYXRoIiwiZnVsbElzc3VlIiwiZXJyb3JNZXNzYWdlIiwibWFwcyIsIm0iLCJFTVBUWV9QQVRIIiwiYWRkSXNzdWVUb0NvbnRleHQiLCJjdHgiLCJ4IiwiUGFyc2VTdGF0dXMiLCJzdGF0dXMiLCJyZXN1bHRzIiwiYXJyYXlWYWx1ZSIsInMiLCJJTlZBTElEIiwicGFpcnMiLCJzeW5jUGFpcnMiLCJwYWlyIiwiZmluYWxPYmplY3QiLCJESVJUWSIsIk9LIiwiaXNBYm9ydGVkIiwiaXNEaXJ0eSIsImlzVmFsaWQiLCJpc0FzeW5jIiwiZXJyb3JVdGlsIiwiUGFyc2VJbnB1dExhenlQYXRoIiwicGFyZW50IiwiaGFuZGxlUmVzdWx0IiwicmVzdWx0IiwicHJvY2Vzc0NyZWF0ZVBhcmFtcyIsImludmFsaWRfdHlwZV9lcnJvciIsInJlcXVpcmVkX2Vycm9yIiwiZGVzY3JpcHRpb24iLCJpc3MiLCJab2RUeXBlIiwiZGVmIiwiaW5wdXQiLCJfYSIsIm1heWJlQXN5bmNSZXN1bHQiLCJjaGVjayIsImdldElzc3VlUHJvcGVydGllcyIsInNldEVycm9yIiwicmVmaW5lbWVudERhdGEiLCJyZWZpbmVtZW50IiwiWm9kRWZmZWN0cyIsIlpvZEZpcnN0UGFydHlUeXBlS2luZCIsIlpvZE9wdGlvbmFsIiwiWm9kTnVsbGFibGUiLCJab2RBcnJheSIsIlpvZFByb21pc2UiLCJvcHRpb24iLCJab2RVbmlvbiIsImluY29taW5nIiwiWm9kSW50ZXJzZWN0aW9uIiwidHJhbnNmb3JtIiwiZGVmYXVsdFZhbHVlRnVuYyIsIlpvZERlZmF1bHQiLCJab2RCcmFuZGVkIiwiY2F0Y2hWYWx1ZUZ1bmMiLCJab2RDYXRjaCIsIlRoaXMiLCJ0YXJnZXQiLCJab2RQaXBlbGluZSIsIlpvZFJlYWRvbmx5IiwiY3VpZFJlZ2V4IiwiY3VpZDJSZWdleCIsInVsaWRSZWdleCIsInV1aWRSZWdleCIsImVtYWlsUmVnZXgiLCJfZW1vamlSZWdleCIsImVtb2ppUmVnZXgiLCJpcHY0UmVnZXgiLCJpcHY2UmVnZXgiLCJkYXRldGltZVJlZ2V4IiwiYXJncyIsImlzVmFsaWRJUCIsImlwIiwidmVyc2lvbiIsIlpvZFN0cmluZyIsInRvb0JpZyIsInRvb1NtYWxsIiwicmVnZXgiLCJ2YWxpZGF0aW9uIiwib3B0aW9ucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsImxlbiIsImNoIiwibWluIiwibWF4IiwiZmxvYXRTYWZlUmVtYWluZGVyIiwic3RlcCIsInZhbERlY0NvdW50Iiwic3RlcERlY0NvdW50IiwiZGVjQ291bnQiLCJ2YWxJbnQiLCJzdGVwSW50IiwiWm9kTnVtYmVyIiwia2luZCIsImluY2x1c2l2ZSIsIlpvZEJpZ0ludCIsIlpvZEJvb2xlYW4iLCJab2REYXRlIiwibWluRGF0ZSIsIm1heERhdGUiLCJab2RTeW1ib2wiLCJab2RVbmRlZmluZWQiLCJab2ROdWxsIiwiWm9kQW55IiwiWm9kVW5rbm93biIsIlpvZE5ldmVyIiwiWm9kVm9pZCIsInNjaGVtYSIsImRlZXBQYXJ0aWFsaWZ5IiwiWm9kT2JqZWN0IiwibmV3U2hhcGUiLCJmaWVsZFNjaGVtYSIsIlpvZFR1cGxlIiwic2hhcGUiLCJzaGFwZUtleXMiLCJleHRyYUtleXMiLCJrZXlWYWxpZGF0b3IiLCJ1bmtub3duS2V5cyIsImNhdGNoYWxsIiwiX2IiLCJfYyIsIl9kIiwiZGVmYXVsdEVycm9yIiwiYXVnbWVudGF0aW9uIiwibWVyZ2luZyIsImluZGV4IiwibWFzayIsIm5ld0ZpZWxkIiwiY3JlYXRlWm9kRW51bSIsImhhbmRsZVJlc3VsdHMiLCJ1bmlvbkVycm9ycyIsImNoaWxkQ3R4IiwiZGlydHkiLCJ0eXBlcyIsImdldERpc2NyaW1pbmF0b3IiLCJ0eXBlIiwiWm9kTGF6eSIsIlpvZExpdGVyYWwiLCJab2RFbnVtIiwiWm9kTmF0aXZlRW51bSIsIlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsImRpc2NyaW1pbmF0b3IiLCJkaXNjcmltaW5hdG9yVmFsdWUiLCJvcHRpb25zTWFwIiwiZGlzY3JpbWluYXRvclZhbHVlcyIsIm1lcmdlVmFsdWVzIiwiYSIsImIiLCJhVHlwZSIsImJUeXBlIiwiYktleXMiLCJzaGFyZWRLZXlzIiwibmV3T2JqIiwic2hhcmVkVmFsdWUiLCJuZXdBcnJheSIsIml0ZW1BIiwiaXRlbUIiLCJoYW5kbGVQYXJzZWQiLCJwYXJzZWRMZWZ0IiwicGFyc2VkUmlnaHQiLCJtZXJnZWQiLCJsZWZ0IiwicmlnaHQiLCJpdGVtSW5kZXgiLCJyZXN0Iiwic2NoZW1hcyIsIlpvZFJlY29yZCIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJ0aGlyZCIsIlpvZE1hcCIsImZpbmFsTWFwIiwiWm9kU2V0IiwiZmluYWxpemVTZXQiLCJlbGVtZW50cyIsInBhcnNlZFNldCIsImVsZW1lbnQiLCJtaW5TaXplIiwibWF4U2l6ZSIsInNpemUiLCJab2RGdW5jdGlvbiIsIm1ha2VBcmdzSXNzdWUiLCJtYWtlUmV0dXJuc0lzc3VlIiwicmV0dXJucyIsImZuIiwibWUiLCJwYXJzZWRBcmdzIiwicGFyc2VkUmV0dXJucyIsInJldHVyblR5cGUiLCJmdW5jIiwiZ2V0dGVyIiwidmFsdWVzIiwiZXhwZWN0ZWRWYWx1ZXMiLCJlbnVtVmFsdWVzIiwib3B0IiwibmF0aXZlRW51bVZhbHVlcyIsInByb21pc2lmaWVkIiwiZWZmZWN0IiwiY2hlY2tDdHgiLCJhcmciLCJwcm9jZXNzZWQiLCJleGVjdXRlUmVmaW5lbWVudCIsImFjYyIsImlubmVyIiwiYmFzZSIsInByZXByb2Nlc3MiLCJuZXdDdHgiLCJab2ROYU4iLCJCUkFORCIsImluUmVzdWx0IiwiY3VzdG9tIiwiZmF0YWwiLCJwIiwiX2ZhdGFsIiwicDIiLCJsYXRlIiwiaW5zdGFuY2VPZlR5cGUiLCJjbHMiLCJzdHJpbmdUeXBlIiwibnVtYmVyVHlwZSIsIm5hblR5cGUiLCJiaWdJbnRUeXBlIiwiYm9vbGVhblR5cGUiLCJkYXRlVHlwZSIsInN5bWJvbFR5cGUiLCJ1bmRlZmluZWRUeXBlIiwibnVsbFR5cGUiLCJhbnlUeXBlIiwidW5rbm93blR5cGUiLCJuZXZlclR5cGUiLCJ2b2lkVHlwZSIsImFycmF5VHlwZSIsIm9iamVjdFR5cGUiLCJzdHJpY3RPYmplY3RUeXBlIiwidW5pb25UeXBlIiwiZGlzY3JpbWluYXRlZFVuaW9uVHlwZSIsImludGVyc2VjdGlvblR5cGUiLCJ0dXBsZVR5cGUiLCJyZWNvcmRUeXBlIiwibWFwVHlwZSIsInNldFR5cGUiLCJmdW5jdGlvblR5cGUiLCJsYXp5VHlwZSIsImxpdGVyYWxUeXBlIiwiZW51bVR5cGUiLCJuYXRpdmVFbnVtVHlwZSIsInByb21pc2VUeXBlIiwiZWZmZWN0c1R5cGUiLCJvcHRpb25hbFR5cGUiLCJudWxsYWJsZVR5cGUiLCJwcmVwcm9jZXNzVHlwZSIsInBpcGVsaW5lVHlwZSIsIm9zdHJpbmciLCJvbnVtYmVyIiwib2Jvb2xlYW4iLCJjb2VyY2UiLCJORVZFUiIsInoiLCJCb29rIiwiQ29pbmVkRXJhIiwiVXNhZ2VDYXRlZ29yeSIsIldyaXRpbmdTeXN0ZW0iLCJnZXRUcmFuc2xhdGVkRGF0YSIsImxhbmd1YWdlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQTtBQUFBLENBQ0gsU0FBVUEsR0FBTTtBQUNiLEVBQUFBLEVBQUssY0FBYyxDQUFDQyxNQUFRQTtBQUM1QixXQUFTQyxFQUFTQyxHQUFNO0FBQUEsRUFBRztBQUMzQixFQUFBSCxFQUFLLFdBQVdFO0FBQ2hCLFdBQVNFLEVBQVlDLEdBQUk7QUFDckIsVUFBTSxJQUFJLE1BQUs7QUFBQSxFQUNsQjtBQUNELEVBQUFMLEVBQUssY0FBY0ksR0FDbkJKLEVBQUssY0FBYyxDQUFDTSxNQUFVO0FBQzFCLFVBQU1DLElBQU0sQ0FBQTtBQUNaLGVBQVdDLEtBQVFGO0FBQ2YsTUFBQUMsRUFBSUMsQ0FBSSxJQUFJQTtBQUVoQixXQUFPRDtBQUFBLEVBQ2YsR0FDSVAsRUFBSyxxQkFBcUIsQ0FBQ08sTUFBUTtBQUMvQixVQUFNRSxJQUFZVCxFQUFLLFdBQVdPLENBQUcsRUFBRSxP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