@sidekick-coder/zenith-kit 0.0.11 → 0.0.13

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.
@@ -1,856 +1,2 @@
1
- import { t as __exportAll } from "./chunk-CfYAbeIz.mjs";
2
- import { debounce, get, has, set, unset } from "lodash-es";
3
- import * as v from "valibot";
4
- import { format } from "date-fns";
5
- import qs from "qs";
6
- import fg from "fast-glob";
7
- import fs from "fs";
8
- import path from "path";
9
- //#region src/shared/services/ConfigService.ts
10
- var ConfigService = class {
11
- entries;
12
- constructor() {
13
- this.entries = /* @__PURE__ */ new Map();
14
- }
15
- list() {
16
- return Array.from(this.entries.values());
17
- }
18
- parseValue(value) {
19
- if (typeof value === "string" && value.endsWith(":boolean")) return value.replace(":boolean", "").trim() === "true";
20
- return value;
21
- }
22
- loadFromRecord(record, source = "unknow") {
23
- for (const [key, value] of Object.entries(record)) this.entries.set(key, {
24
- key,
25
- value: this.parseValue(value),
26
- source
27
- });
28
- }
29
- loadFromEntries(entries, source = "unknow") {
30
- for (const [key, value] of entries) this.entries.set(key, {
31
- key,
32
- value: this.parseValue(value),
33
- source
34
- });
35
- }
36
- toRecord() {
37
- const record = {};
38
- for (const [key, entry] of this.entries.entries()) record[key] = entry.value;
39
- return record;
40
- }
41
- has(key) {
42
- if (this.entries.get(key)) return true;
43
- if (!key.includes(".")) return false;
44
- const primary = key.split(".")[0];
45
- const primaryEntry = this.entries.get(primary);
46
- if (!primaryEntry) return this.entries.get(key) ? true : false;
47
- const value = primaryEntry.value;
48
- if (typeof value !== "object" || Array.isArray(value)) return false;
49
- return has(value, key.substring(primary.length + 1));
50
- }
51
- get(key, defaultValue) {
52
- const entry = this.entries.get(key);
53
- if (entry) return entry.value;
54
- if (!key.includes(".")) return defaultValue;
55
- const primary = key.split(".")[0];
56
- const primaryEntry = this.entries.get(primary);
57
- if (!primaryEntry) {
58
- const entry = this.entries.get(key);
59
- return entry ? entry.value : defaultValue;
60
- }
61
- const value = primaryEntry.value;
62
- if (typeof value !== "object" || Array.isArray(value)) return defaultValue;
63
- return get(value, key.substring(primary.length + 1), defaultValue);
64
- }
65
- getOne(keys, defaultValue) {
66
- for (const key of keys) if (this.has(key)) return this.get(key);
67
- return defaultValue;
68
- }
69
- set(key, value, source = "runtime") {
70
- if (!key.includes(".")) {
71
- this.entries.set(key, {
72
- key,
73
- source,
74
- value
75
- });
76
- return;
77
- }
78
- const primary = key.split(".")[0];
79
- let primaryValue = this.get(primary, {});
80
- if (typeof primaryValue !== "object" || Array.isArray(primaryValue)) primaryValue = {};
81
- set(primaryValue, key.substring(primary.length + 1), value);
82
- this.entries.set(primary, {
83
- key: primary,
84
- source,
85
- value: primaryValue
86
- });
87
- }
88
- unset(key) {
89
- if (!key.includes(".")) {
90
- this.entries.delete(key);
91
- return;
92
- }
93
- const primary = key.split(".")[0];
94
- const primaryValue = this.get(primary, {});
95
- if (!primaryValue) return;
96
- if (typeof primaryValue !== "object" || Array.isArray(primaryValue)) return;
97
- unset(primaryValue, key.substring(primary.length + 1));
98
- this.entries.set(primary, {
99
- key: primary,
100
- source: "runtime",
101
- value: primaryValue
102
- });
103
- }
104
- clear() {
105
- this.entries.clear();
106
- }
107
- };
108
- //#endregion
109
- //#region src/shared/services/ContainerService.ts
110
- var ContainerService = class {
111
- entries = /* @__PURE__ */ new Map();
112
- loadFromRecord(record) {
113
- Object.entries(record).forEach(([key, value]) => {
114
- this.set(key, value);
115
- });
116
- }
117
- toRecord() {
118
- const record = {};
119
- for (const [key, value] of this.entries.entries()) record[String(key)] = value;
120
- return record;
121
- }
122
- set(payload, value) {
123
- let key = payload;
124
- if (typeof payload === "function" || typeof payload === "object") key = payload.name;
125
- this.entries.set(key, value);
126
- }
127
- has(payload) {
128
- let key = payload;
129
- if (typeof payload === "function" || typeof payload === "object") key = payload.name;
130
- return this.entries.has(key);
131
- }
132
- get(payload) {
133
- let key = payload;
134
- if (typeof payload === "function" || typeof payload === "object") key = payload.name;
135
- if (!this.has(key)) throw new Error(`entry not found: ${String(key)}`);
136
- return this.entries.get(key);
137
- }
138
- singleton(classConstructor) {
139
- const key = classConstructor.name;
140
- const existingInstance = this.entries.get(key);
141
- if (existingInstance) return existingInstance;
142
- const newInstance = new classConstructor();
143
- this.entries.set(key, newInstance);
144
- return newInstance;
145
- }
146
- load(entries) {
147
- Object.entries(entries).forEach(([key, value]) => {
148
- this.set(key, value);
149
- });
150
- }
151
- proxy(key) {
152
- return new Proxy({}, {
153
- get: (_target, prop) => {
154
- const entry = this.get(key);
155
- const value = entry[prop];
156
- if (typeof value === "function") return value.bind(entry);
157
- return entry[prop];
158
- },
159
- set: (_target, prop, value) => {
160
- const entry = this.get(key);
161
- entry[prop] = value;
162
- return true;
163
- }
164
- });
165
- }
166
- keys() {
167
- return Array.from(this.entries.keys());
168
- }
169
- };
170
- //#endregion
171
- //#region src/shared/services/CookieService.ts
172
- var CookieService = class {
173
- cookies;
174
- prefix;
175
- constructor(data = {}) {
176
- this.cookies = data.cookies || /* @__PURE__ */ new Map();
177
- this.prefix = data.prefix || "";
178
- }
179
- load(cookies) {
180
- if (cookies instanceof Map) {
181
- for (const [key, value] of cookies.entries()) this.set(key, value);
182
- return;
183
- }
184
- for (const key of Object.keys(cookies)) this.set(key, cookies[key]);
185
- }
186
- get(name, defaultValue = null) {
187
- const fullName = this.prefix + name;
188
- return this.cookies.get(fullName) || defaultValue;
189
- }
190
- set(name, value, options) {
191
- const fullName = this.prefix + name;
192
- this.cookies.set(fullName, value);
193
- }
194
- toRecord() {
195
- const result = {};
196
- for (const [key, value] of this.cookies.entries()) if (key.startsWith(this.prefix)) {
197
- const unprefixedKey = key.slice(this.prefix.length);
198
- result[unprefixedKey] = value;
199
- }
200
- return result;
201
- }
202
- };
203
- //#endregion
204
- //#region src/shared/utils/compose.ts
205
- /**
206
- * Composes multiple mixins into a single class that can be extended.
207
- * Allows for multiple inheritance-like behavior by applying mixins sequentially.
208
- *
209
- * @param mixins - Array of mixin functions to compose
210
- * @returns A class constructor that includes all mixin functionality
211
- *
212
- * @example
213
- * ```typescript
214
- * class User extends compose(Timestamp, SoftDelete) {
215
- * constructor(public name: string) {
216
- * super()
217
- * }
218
- * }
219
- * ```
220
- */
221
- function compose(...mixins) {
222
- return mixins.reduce((base, mixin) => mixin(base), class {});
223
- }
224
- /**
225
- * Alternative compose function that starts with a base class
226
- *
227
- * @param baseClass - The base class to start with
228
- * @param mixins - Array of mixin functions to apply
229
- * @returns A class constructor that extends the base class with all mixin functionality
230
- *
231
- * @example
232
- * ```typescript
233
- * class User extends composeWith(BaseEntity, Timestamp, SoftDelete) {
234
- * constructor(public name: string) {
235
- * super()
236
- * }
237
- * }
238
- * ```
239
- */
240
- function composeWith(baseClass, ...mixins) {
241
- return mixins.reduce((base, mixin) => mixin(base), baseClass);
242
- }
243
- function mixin(Source) {
244
- return function(Target) {
245
- class Mixed extends Target {
246
- constructor(...args) {
247
- super(...args);
248
- const source = new Source(...args);
249
- Object.assign(this, source);
250
- }
251
- }
252
- for (const key of Reflect.ownKeys(Source.prototype)) if (key !== "constructor") Object.defineProperty(Mixed.prototype, key, Object.getOwnPropertyDescriptor(Source.prototype, key));
253
- return Mixed;
254
- };
255
- }
256
- //#endregion
257
- //#region src/shared/utils/formatBytes.ts
258
- function formatBytes(bytes, decimals = 2) {
259
- if (bytes === 0) return "0 Bytes";
260
- const k = 1024;
261
- const dm = decimals < 0 ? 0 : decimals;
262
- const sizes = [
263
- "Bytes",
264
- "KB",
265
- "MB",
266
- "GB",
267
- "TB",
268
- "PB"
269
- ];
270
- const i = Math.floor(Math.log(bytes) / Math.log(k));
271
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
272
- }
273
- //#endregion
274
- //#region src/shared/utils/flatten.ts
275
- function flatten(obj, prefix = "", res = {}) {
276
- for (const [key, value] of Object.entries(obj)) {
277
- const newKey = prefix ? `${prefix}.${key}` : key;
278
- if (value && typeof value === "object" && !Array.isArray(value)) flatten(value, newKey, res);
279
- else res[newKey] = value;
280
- }
281
- return res;
282
- }
283
- function unflatten(obj) {
284
- const result = {};
285
- for (const [key, value] of Object.entries(obj)) {
286
- const parts = key.split(".");
287
- let current = result;
288
- parts.forEach((part, i) => {
289
- if (i === parts.length - 1) current[part] = value;
290
- else {
291
- if (!current[part] || typeof current[part] !== "object") current[part] = {};
292
- current = current[part];
293
- }
294
- });
295
- }
296
- return result;
297
- }
298
- //#endregion
299
- //#region src/shared/utils/tryCatch.ts
300
- async function tryCatch(tryer) {
301
- try {
302
- return [null, await tryer()];
303
- } catch (error) {
304
- return [error, null];
305
- }
306
- }
307
- tryCatch.sync = function(tryer) {
308
- try {
309
- return [null, tryer()];
310
- } catch (error) {
311
- return [error, null];
312
- }
313
- };
314
- //#endregion
315
- //#region src/shared/utils/createId.ts
316
- function uuid() {
317
- if (typeof crypto !== "undefined" && crypto.randomUUID) return crypto.randomUUID();
318
- if (typeof self !== "undefined" && self.crypto && self.crypto.randomUUID) return self.crypto.randomUUID();
319
- if (typeof window !== "undefined" && window.crypto && window.crypto.randomUUID) return window.crypto.randomUUID();
320
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
321
- const r = Math.random() * 16 | 0;
322
- return (c === "x" ? r : r & 3 | 8).toString(16);
323
- });
324
- }
325
- function createId(prefix = "") {
326
- return prefix + uuid();
327
- }
328
- //#endregion
329
- //#region src/shared/services/LoggerService.ts
330
- var LoggerService = class LoggerService {
331
- info(message, meta) {}
332
- debug(message, meta) {}
333
- warn(message, meta) {}
334
- error(message, meta) {}
335
- child(options) {
336
- return new LoggerService();
337
- }
338
- };
339
- //#endregion
340
- //#region src/shared/services/EmmitterService.ts
341
- var EmmitterService = class {
342
- handlers = [];
343
- debug;
344
- logger;
345
- load(options) {
346
- this.debug = options?.debug || false;
347
- this.logger = options?.logger || new LoggerService();
348
- if (this.debug) this.logger.debug("emmitter loaded with debug mode enabled");
349
- }
350
- on(event, listener, options) {
351
- const id = options?.id || createId();
352
- if (options?.unique) {
353
- if (this.handlers.some((h) => h.event === event && h.listener === listener || h.id === id)) return;
354
- }
355
- const handler = {
356
- id,
357
- event,
358
- listener
359
- };
360
- this.handlers.push(handler);
361
- if (this.debug) this.logger.debug("handler added", handler);
362
- return handler;
363
- }
364
- once(event, listener, options) {
365
- const wrapper = (args) => {
366
- listener(args);
367
- this.off(event, wrapper);
368
- };
369
- return this.on(event, wrapper, options);
370
- }
371
- onDebounce(event, listener, options) {
372
- const debounced = debounce(listener, options?.debounce || 300);
373
- const handler = this.on(event, debounced, options);
374
- if (handler) handler.originalListener = listener;
375
- return handler;
376
- }
377
- onAnyOf(events, listener, options) {
378
- const handlers = [];
379
- for (const event of events) {
380
- const handler = this.on(event, listener, options);
381
- if (handler) handlers.push(handler);
382
- }
383
- return handlers;
384
- }
385
- off(event, listener) {
386
- this.handlers = this.handlers.filter((h) => {
387
- if (h.event === event && (h.listener === listener || h.originalListener === listener)) return false;
388
- return true;
389
- });
390
- if (this.debug) this.logger.debug("handler removed", { event });
391
- }
392
- emit(event, args) {
393
- if (this.debug) this.logger.debug("emitting event", {
394
- event,
395
- args
396
- });
397
- const handlers = this.handlers.filter((h) => h.event === event);
398
- for (const handler of handlers) tryCatch.sync(() => handler.listener(args));
399
- }
400
- async emitAndWait(event, args) {
401
- const handlers = this.handlers.filter((h) => h.event === event);
402
- if (this.debug) this.logger.debug("emitting event", {
403
- handlers: handlers.length,
404
- event,
405
- args
406
- });
407
- for await (const handler of handlers) await handler.listener(args);
408
- }
409
- list() {
410
- return this.handlers;
411
- }
412
- listByEvent(event) {
413
- return this.handlers.filter((h) => h.event === event);
414
- }
415
- remove(payload) {
416
- const ids = Array.isArray(payload) ? payload : [payload];
417
- this.handlers = this.handlers.filter((h) => !ids.includes(h.id));
418
- if (this.debug) this.logger.debug("handlers removed", { ids });
419
- }
420
- clear() {
421
- this.handlers = [];
422
- if (this.debug) this.logger.debug("all handlers cleared");
423
- }
424
- hasHandlers() {
425
- return this.handlers.length > 0;
426
- }
427
- };
428
- //#endregion
429
- //#region src/shared/services/LifecycleService.ts
430
- var LifecycleService = class {
431
- hooks;
432
- logger;
433
- debug = false;
434
- constructor(data = {}) {
435
- this.debug = data.debug ?? this.debug;
436
- this.hooks = data.hooks ?? /* @__PURE__ */ new Map();
437
- this.logger = data.logger ?? new LoggerService();
438
- }
439
- async executeHookMethod(hook, method) {
440
- await hook[method]();
441
- if (this.debug) this.logger.debug(`${method} ${hook.hook_id}`);
442
- const subhooks = hook.subhooks || [];
443
- for (const subhook of subhooks) {
444
- await this.executeHookMethod(subhook, method);
445
- if (this.debug) this.logger.debug(`${method} subhook ${subhook.hook_id} of ${hook.hook_id}`);
446
- }
447
- }
448
- list(options) {
449
- let hooks = Array.from(this.hooks.values());
450
- if (options?.exclude) {
451
- const ids = options.exclude.filter((item) => typeof item === "string");
452
- const constructors = options.exclude.filter((item) => typeof item === "function");
453
- const instances = options.exclude.filter((item) => typeof item === "object");
454
- hooks = hooks.filter((hook) => {
455
- if (ids.includes(hook.hook_id)) return false;
456
- if (constructors.find((ctor) => hook instanceof ctor)) return false;
457
- if (instances.find((inst) => hook === inst)) return false;
458
- return true;
459
- });
460
- }
461
- hooks.sort((a, b) => {
462
- return (a.order ?? 0) - (b.order ?? 0);
463
- });
464
- return hooks;
465
- }
466
- add(...payload) {
467
- const instances = [];
468
- for (const item of payload) {
469
- if (typeof item === "function") {
470
- instances.push(new item());
471
- continue;
472
- }
473
- instances.push(item);
474
- }
475
- for (const hook of instances) {
476
- this.hooks.set(hook.hook_id, hook);
477
- if (this.debug) this.logger.debug("add " + hook.hook_id);
478
- if (hook.subhooks) hook.subhooks.forEach((subhook) => this.add(subhook));
479
- }
480
- }
481
- async register(options) {
482
- for (const hook of this.list(options)) {
483
- const [error] = await tryCatch(() => this.executeHookMethod(hook, "onRegister"));
484
- if (error) {
485
- Object.assign(error, { hookId: hook.hook_id });
486
- this.logger.error("error in hook register: ", error);
487
- continue;
488
- }
489
- if (this.debug) this.logger.debug("register " + hook.hook_id);
490
- }
491
- }
492
- async load(options) {
493
- for (const hook of this.list(options)) {
494
- const [error] = await tryCatch(() => this.executeHookMethod(hook, "onLoad"));
495
- if (error) {
496
- Object.assign(error, { hookId: hook.hook_id });
497
- this.logger.error("error in hook load:", error);
498
- continue;
499
- }
500
- if (this.debug) this.logger.debug("load " + hook.hook_id);
501
- }
502
- }
503
- async boot(options) {
504
- const hooks = this.list(options);
505
- for (const hook of hooks) {
506
- const [error] = await tryCatch(() => this.executeHookMethod(hook, "onBoot"));
507
- if (error) {
508
- Object.assign(error, { hookId: hook.hook_id });
509
- this.logger.error("error in hook boot:", error);
510
- continue;
511
- }
512
- if (this.debug) this.logger.debug("boot " + hook.hook_id);
513
- }
514
- }
515
- async shutdown(options) {
516
- for (const hook of this.list(options)) {
517
- const [error] = await tryCatch(() => this.executeHookMethod(hook, "onShutdown"));
518
- if (error) {
519
- Object.assign(error, { hookId: hook.hook_id });
520
- this.logger.error("error in hook shutdown:", error);
521
- continue;
522
- }
523
- if (this.debug) this.logger.debug("shutdown " + hook.hook_id);
524
- }
525
- }
526
- clear() {
527
- this.hooks.clear();
528
- }
529
- };
530
- //#endregion
531
- //#region src/shared/services/TranslatorService.ts
532
- var TranslatorService = class {
533
- entries;
534
- locale;
535
- localeLoaders;
536
- debug = false;
537
- logger;
538
- cache;
539
- constructor(data = {}) {
540
- this.entries = data.entries || /* @__PURE__ */ new Map();
541
- this.locale = data.locale || "en";
542
- this.debug = data.debug || false;
543
- this.cache = data.cache || /* @__PURE__ */ new Map();
544
- this.logger = data.logger || new LoggerService();
545
- this.localeLoaders = /* @__PURE__ */ new Map();
546
- if (this.debug) this.logger.debug("initialized in debug mode", { locale: this.locale });
547
- }
548
- get locales() {
549
- return Array.from(this.localeLoaders.keys());
550
- }
551
- list() {
552
- const items = [];
553
- this.entries.forEach((value, key) => {
554
- items.push({
555
- key,
556
- value
557
- });
558
- });
559
- return items;
560
- }
561
- async getEntries(locale) {
562
- const cache = this.cache.get(locale);
563
- if (cache && this.debug) this.logger.debug(`load locale "${locale}" from cache`, {
564
- locale,
565
- length: Object.keys(cache).length
566
- });
567
- if (cache) return cache;
568
- const loader = this.localeLoaders.get(locale);
569
- if (!loader) {
570
- this.logger.warn(`no loader found for locale "${locale}"`);
571
- return {};
572
- }
573
- const entries = await loader();
574
- this.cache.set(locale, entries);
575
- if (this.debug) this.logger.debug(`load locale ${locale}`, {
576
- locale,
577
- keys: Object.keys(entries).length
578
- });
579
- return entries;
580
- }
581
- async load(locale) {
582
- const entries = await this.getEntries(locale);
583
- this.entries = new Map(Object.entries(entries));
584
- this.locale = locale;
585
- }
586
- t(key, args = {}) {
587
- if (!this.entries.has(key) && this.debug) this.logger.debug(`missing translation for key "${key}"`, {
588
- key,
589
- locale: this.locale
590
- });
591
- let translation = this.entries.get(key) || key;
592
- if (!Object.keys(args).length) return translation;
593
- Object.entries(args).forEach(([aKey, aValue]) => {
594
- translation = translation.replace(`:${aKey}`, aValue);
595
- });
596
- return translation;
597
- }
598
- date(data) {
599
- return new Date(data).toLocaleDateString(this.locale, {
600
- year: "numeric",
601
- month: "2-digit",
602
- day: "2-digit"
603
- });
604
- }
605
- datetime(data) {
606
- return new Date(data).toLocaleString(this.locale, {
607
- year: "numeric",
608
- month: "2-digit",
609
- day: "2-digit",
610
- hour: "2-digit",
611
- minute: "2-digit"
612
- });
613
- }
614
- };
615
- //#endregion
616
- //#region src/shared/services/UploadService.ts
617
- var UploadService = class {
618
- single(name) {
619
- const error = /* @__PURE__ */ new Error("Method not implemented.");
620
- Object.assign(error, { name });
621
- throw error;
622
- }
623
- multiple(name) {
624
- const error = /* @__PURE__ */ new Error("Method not implemented.");
625
- Object.assign(error, { name });
626
- throw error;
627
- }
628
- };
629
- //#endregion
630
- //#region src/shared/validators/url.ts
631
- var url_exports = /* @__PURE__ */ __exportAll({
632
- array: () => array,
633
- arrayNumber: () => arrayNumber,
634
- boolean: () => boolean,
635
- date: () => date,
636
- datetime: () => datetime,
637
- number: () => number,
638
- object: () => object
639
- });
640
- const number = () => v.pipe(v.union([v.string(), v.number()]), v.transform(Number), v.integer());
641
- const boolean = () => v.pipe(v.union([v.string(), v.boolean()]), v.transform((v) => v === true || v === "true"));
642
- const date = () => v.pipe(v.union([v.string(), v.date()]), v.transform((v) => v instanceof Date ? v : new Date(v)), v.transform((v) => v ? format(v, "yyyy-MM-dd") : v));
643
- const datetime = () => v.pipe(v.union([v.string(), v.date()]), v.transform((v) => {
644
- if (!v) return v;
645
- if (v === "null") return null;
646
- if (typeof v === "string") v = new Date(v);
647
- return format(v, "yyyy-MM-dd HH:mm");
648
- }));
649
- const array = (schema = v.any()) => v.pipe(v.union([v.string(), v.array(v.string())]), v.transform((value) => Array.isArray(value) ? value : value.split(",")), v.array(schema));
650
- const arrayNumber = () => v.pipe(array(), v.transform((value) => value.map(Number)));
651
- const object = () => v.pipe(v.union([v.string(), v.record(v.string(), v.any())]), v.transform((value) => typeof value === "string" ? qs.parse(value) : value), v.transform((value) => {
652
- const result = {};
653
- for (const key in value) set(result, key, get(value, key));
654
- return result;
655
- }));
656
- //#endregion
657
- //#region src/shared/exceptions/BaseException.ts
658
- var BaseException = class BaseException extends Error {
659
- statusCode = 500;
660
- constructor(message, statusCode = 500) {
661
- super(message);
662
- this.name = this.constructor.name;
663
- this.statusCode = statusCode;
664
- }
665
- static fromError(error) {
666
- return new BaseException(error.message, 500);
667
- }
668
- };
669
- //#endregion
670
- //#region src/shared/services/ValidatorService.ts
671
- const extras = { url: url_exports };
672
- var ValidatorService = class {
673
- v = {
674
- ...v,
675
- extras
676
- };
677
- create(cb) {
678
- return cb(this.v);
679
- }
680
- validate(payload, cb) {
681
- const schema = typeof cb === "function" ? cb(this.v) : cb;
682
- const { output, issues, success } = v.safeParse(schema, payload);
683
- if (!success) {
684
- const flatten = v.flatten(issues);
685
- const messages = [];
686
- if (flatten.root) messages.push(...flatten.root);
687
- if (flatten.nested) Object.entries(flatten.nested).forEach((entry) => {
688
- const [key, value] = entry;
689
- messages.push(...value.map((v) => `${key}: ${v}`));
690
- });
691
- const error = new BaseException(messages.length ? messages.join(", ") : "Validation failed", 422);
692
- error.name = "ValidationError";
693
- Object.assign(error, { messages });
694
- throw error;
695
- }
696
- return output;
697
- }
698
- async validateAsync(payload, cb) {
699
- const schema = typeof cb === "function" ? cb(this.v) : cb;
700
- const { output, issues, success } = await v.safeParseAsync(schema, payload);
701
- if (!success) {
702
- const error = /* @__PURE__ */ new Error("Validation failed");
703
- const flatten = v.flatten(issues);
704
- const details = {
705
- ...flatten.root,
706
- ...flatten.nested
707
- };
708
- Object.assign(error, { details });
709
- throw error;
710
- }
711
- return output;
712
- }
713
- isValid(payload, cb) {
714
- const schema = typeof cb === "function" ? cb(this.v) : cb;
715
- const { success } = v.safeParse(schema, payload);
716
- return success;
717
- }
718
- };
719
- //#endregion
720
- //#region src/shared/utils/generateIndexFile.ts
721
- function generateIndexFile(options) {
722
- const folders = options.folders;
723
- const filename = options.filename;
724
- const defaultIgnore = [
725
- "**/index.ts",
726
- "**/*.spec.ts",
727
- "**/*.test.ts"
728
- ];
729
- const ignore = options.ignore || [];
730
- let content = "";
731
- for (const folder of folders) {
732
- const files = fg.sync(`${folder}/**/*.ts`, { ignore: [...defaultIgnore, ...ignore] });
733
- for (const file of files) {
734
- const filePath = path.relative(path.dirname(filename), file);
735
- const hasDefaultExport = fs.readFileSync(file, "utf-8").includes("export default") && !filePath.includes("generateIndexFile.ts");
736
- content += `export * from './${filePath}'\n`;
737
- if (hasDefaultExport) content += `export { default as ${path.basename(file, ".ts")} } from './${filePath}'\n`;
738
- }
739
- }
740
- content = content.trim();
741
- fs.writeFileSync(filename, content);
742
- }
743
- //#endregion
744
- //#region src/shared/schemas/permissionAssignmentSchema.ts
745
- const permissionAssignmentSchema = v.object({
746
- id: v.number(),
747
- permission_id: v.number(),
748
- assignable_type: v.string(),
749
- assignable_id: v.string(),
750
- created_at: v.string(),
751
- updated_at: v.string()
752
- });
753
- //#endregion
754
- //#region src/shared/schemas/permissionSchema.ts
755
- const permissionSchema = v.object({
756
- id: v.number(),
757
- name: v.nullable(v.string()),
758
- description: v.nullable(v.string()),
759
- action: v.string(),
760
- subject: v.string(),
761
- conditions: v.nullable(v.string()),
762
- created_at: v.string(),
763
- updated_at: v.string(),
764
- expires_at: v.string()
765
- });
766
- //#endregion
767
- //#region src/shared/schemas/tokenSchema.ts
768
- const tokenSchema = v.object({
769
- id: v.number(),
770
- name: v.nullable(v.string()),
771
- type: v.string(),
772
- user_id: v.number(),
773
- token: v.string(),
774
- created_at: v.string(),
775
- updated_at: v.string(),
776
- expires_at: v.string()
777
- });
778
- //#endregion
779
- //#region src/shared/exceptions/ShellException.ts
780
- var ShellException = class extends BaseException {
781
- output;
782
- bin;
783
- args;
784
- constructor(message, output, bin, args) {
785
- super(message, 501);
786
- this.output = output;
787
- this.bin = bin;
788
- this.args = args;
789
- }
790
- };
791
- //#endregion
792
- //#region src/shared/facades/validator.ts
793
- const validator = new ValidatorService();
794
- //#endregion
795
- //#region src/shared/entities/LifecycleHook.ts
796
- var LifecycleHook = class {
797
- hook_id;
798
- order;
799
- subhooks;
800
- constructor() {
801
- if (!this.hook_id) this.hook_id = this.constructor.name;
802
- }
803
- async onRegister() {}
804
- async onLoad() {}
805
- async onBoot() {}
806
- async onShutdown() {}
807
- };
808
- //#endregion
809
- //#region src/shared/mixins/BaseEntityMixin.ts
810
- function BaseEntity(Base) {
811
- return class extends Base {
812
- static from(data) {
813
- const contructor = typeof this === "function" ? this : Base;
814
- const instance = new contructor();
815
- let payload = { ...data };
816
- if (typeof contructor?.parse === "function") payload = contructor.parse(data);
817
- if (typeof this?.parse === "function") payload = this.parse(data);
818
- Object.assign(instance, payload);
819
- return instance;
820
- }
821
- merge(data) {
822
- Object.assign(this, data);
823
- return this;
824
- }
825
- };
826
- }
827
- //#endregion
828
- //#region src/shared/entities/ModuleEntity.ts
829
- var Module = class extends compose(BaseEntity, mixin(LifecycleHook)) {
830
- id;
831
- name;
832
- enabled = false;
833
- dependencies = {};
834
- build = {};
835
- directory;
836
- upgrade_info;
837
- setData(data) {
838
- const filtered = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== void 0));
839
- Object.assign(this, filtered);
840
- this.hook_id = `module:${this.id}`;
841
- }
842
- };
843
- //#endregion
844
- //#region src/shared/entities/ModuleManifestEntity.ts
845
- var ModuleManifest = class extends compose(BaseEntity) {
846
- id;
847
- name;
848
- version;
849
- description;
850
- enabled;
851
- author;
852
- dependencies;
853
- build;
854
- };
855
- //#endregion
856
- export { BaseException, ConfigService, ContainerService, CookieService, EmmitterService, LifecycleHook, LifecycleService, LoggerService, Module as ModuleEntity, ModuleManifest as ModuleManifestEntity, ShellException, TranslatorService, UploadService, ValidatorService, compose, composeWith, createId, flatten, formatBytes, generateIndexFile, mixin, permissionAssignmentSchema, permissionSchema, tokenSchema, tryCatch, unflatten, validator };
1
+ import{t as e}from"./chunk-0Lt9GpW0.mjs";import{debounce as t,get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import*as s from"valibot";import{format as c}from"date-fns";import l from"qs";import{defineAbility as u,subject as d}from"@casl/ability";var f=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}},p=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},m=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new p(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};function h(...e){return e.reduce((e,t)=>t(e),class{})}function g(e,...t){return t.reduce((e,t)=>t(e),e)}function _(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function v(e,t=2){if(e===0)return`0 Bytes`;let n=1024,r=t<0?0:t,i=[`Bytes`,`KB`,`MB`,`GB`,`TB`,`PB`],a=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/n**+a).toFixed(r))+` `+i[a]}function y(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;i&&typeof i==`object`&&!Array.isArray(i)?y(i,e,n):n[e]=i}return n}function b(e){let t={};for(let[n,r]of Object.entries(e)){let e=n.split(`.`),i=t;e.forEach((t,n)=>{n===e.length-1?i[t]=r:((!i[t]||typeof i[t]!=`object`)&&(i[t]={}),i=i[t])})}return t}async function x(e){try{return[null,await e()]}catch(e){return[e,null]}}x.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function S(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function C(e=``){return e+S()}var w=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},ee=class{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;load(e){this.debug=e?.debug||!1,this.logger=e?.logger||new w,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}on(e,t,n){let r=n?.id||C();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=n=>{t(n),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,n,r){let i=t(n,r?.debounce||300),a=this.on(e,i,r);return a&&(a.originalListener=n),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let e of n)x.sync(()=>e.listener(t))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event`,{handlers:n.length,event:e,args:t});for await(let e of n)await e.listener(t)}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},te=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new w,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await x(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},T=class{static __container_entry_key=`TranslatorService`;entries;locale;localeLoaders;debug=!1;logger;cache;constructor(e={}){this.entries=e.entries||new Map,this.locale=e.locale||`en`,this.debug=e.debug||!1,this.cache=e.cache||new Map,this.logger=e.logger||new w,this.localeLoaders=new Map,this.debug&&this.logger.debug(`initialized in debug mode`,{locale:this.locale})}get locales(){return Array.from(this.localeLoaders.keys())}list(){let e=[];return this.entries.forEach((t,n)=>{e.push({key:n,value:t})}),e}async getEntries(e){let t=this.cache.get(e);if(t&&this.debug&&this.logger.debug(`load locale "${e}" from cache`,{locale:e,length:Object.keys(t).length}),t)return t;let n=this.localeLoaders.get(e);if(!n)return this.logger.warn(`no loader found for locale "${e}"`),{};let r=await n();return this.cache.set(e,r),this.debug&&this.logger.debug(`load locale ${e}`,{locale:e,keys:Object.keys(r).length}),r}async load(e){let t=await this.getEntries(e);this.entries=new Map(Object.entries(t)),this.locale=e}t(e,t={}){!this.entries.has(e)&&this.debug&&this.logger.debug(`missing translation for key "${e}"`,{key:e,locale:this.locale});let n=this.entries.get(e)||e;return Object.keys(t).length&&Object.entries(t).forEach(([e,t])=>{n=n.replace(`:${e}`,t)}),n}date(e){return new Date(e).toLocaleDateString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`})}datetime(e){return new Date(e).toLocaleString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}},E=class{static __container_entry_key=`UploadService`;single(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}multiple(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}},D=e({array:()=>M,arrayNumber:()=>N,boolean:()=>k,date:()=>A,datetime:()=>j,number:()=>O,object:()=>P});const O=()=>s.pipe(s.union([s.string(),s.number()]),s.transform(Number),s.integer()),k=()=>s.pipe(s.union([s.string(),s.boolean()]),s.transform(e=>e===!0||e===`true`)),A=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e instanceof Date?e:new Date(e)),s.transform(e=>e&&c(e,`yyyy-MM-dd`))),j=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),c(e,`yyyy-MM-dd HH:mm`))))),M=(e=s.any())=>s.pipe(s.union([s.string(),s.array(s.string())]),s.transform(e=>Array.isArray(e)?e:e.split(`,`)),s.array(e)),N=()=>s.pipe(M(),s.transform(e=>e.map(Number))),P=()=>s.pipe(s.union([s.string(),s.record(s.string(),s.any())]),s.transform(e=>typeof e==`string`?l.parse(e):e),s.transform(e=>{let t={};for(let r in e)a(t,r,n(e,r));return t}));var F=e({base:()=>I});const I=(e={})=>s.object({page:s.optional(O(),1),limit:s.optional(O(),e.maxLimit||100),orderBy:s.optional(e.orderFields?M(s.picklist(e.orderFields)):M(s.string()),[]),orderDirection:s.optional(M(s.union([s.literal(`asc`),s.literal(`desc`)])),[])}),L={url:D,pagination:F};var R=class{static __container_entry_key=`ValidatorService`;v={...s,extras:L};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=s.safeParse(n,e);if(!a){let e=s.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new p(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await s.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=s.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=s.safeParse(n,e);return r}};function z(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function B(e){let t={},n=e.split(`?`)[1];return n?l.parse(n):t}const ne=s.object({id:s.number(),permission_id:s.number(),assignable_type:s.string(),assignable_id:s.string(),created_at:s.string(),updated_at:s.string()}),V=s.object({id:s.number(),name:s.nullable(s.string()),description:s.nullable(s.string()),action:s.string(),subject:s.string(),conditions:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),expires_at:s.string()}),H=s.object({id:s.number(),name:s.nullable(s.string()),type:s.string(),user_id:s.number(),token:s.string(),created_at:s.string(),updated_at:s.string(),expires_at:s.string()});var U=class extends p{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};const W=new R;function G(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}var K=class extends h(G){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=x.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},q=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>K.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new w().child({label:`acl`}),this.ability=u(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=d(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=d(t,n);return this.ability.cannot(e,r)}subject(e,t){return d(e,t)}},J=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}},Y=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}};function X(e){return class extends e{deleted_at=null}}function Z(e){return class extends e{created_at;updated_at}}var re=class extends h(G,Z,X){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},ie=class extends h(G,Z,X){id;purpose;mime_types;max_size;upload_url;create_file_url;getParsedMimeTypes(){return this.mime_types.split(`,`).map(e=>e.trim())}isAllowedMimeType(e){let t=this.getParsedMimeTypes();return t.includes(e)||t.includes(`*/*`)}isAllowedSize(e){return e<=this.max_size}},ae=class{static __container_entry_key=`HeaderMapEntity`;entries;setHeader;constructor(e){this.entries=new Map,this.setHeader=e?.setHeader,e?.headers&&this.loadFromRecord(e.headers)}loadFromRecord(e){for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){return this.entries.get(e)||t}set(e,t){if(!this.setHeader)throw new p(`setHeader function is not defined`);this.entries.set(e,t)}toRecord(){let e={},t=Array.from(this.entries.entries());for(let[n,r]of t)e[n]=r;return e}},Q=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},oe=class extends h(G,_(Q)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},$=class extends h(G){id;name;version;description;enabled;author;dependencies;build},se=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},ce=class extends h(G){id;name;version;enabled},le=class extends h(G,Z,X){id;name;description},ue=class extends h(G,Z,X){id;email;name;username;password;verified_at;permissions;roles;get initials(){let[e,t]=this.name.split(` `);return t?e[0].toUpperCase()+t[0].toUpperCase():e[0].toUpperCase()}};export{q as AclEntity,p as BaseException,f as ConfigService,m as ContainerService,J as CookieMapEntity,Y as DriveEntryEntity,ee as EmmitterService,re as FileEntity,ie as FileUploadSessionEntity,ae as HeaderMapEntity,Q as LifecycleHook,te as LifecycleService,w as LoggerService,oe as ModuleEntity,$ as ModuleManifestEntity,se as PaginationEntity,K as PermissionEntity,ce as PluginEntity,le as RoleEntity,U as ShellException,T as TranslatorService,E as UploadService,ue as UserEntity,R as ValidatorService,h as compose,g as composeWith,C as createId,y as flatten,v as formatBytes,_ as mixin,z as parseUrlParams,B as parseUrlQuery,ne as permissionAssignmentSchema,V as permissionSchema,H as tokenSchema,x as tryCatch,b as unflatten,W as validator};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2Zvcm1hdEJ5dGVzLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mbGF0dGVuLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy90cnlDYXRjaC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9IZWFkZXJNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIHB1YmxpYyBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDBcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlciA9IDUwMCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycm9yOiBFcnJvcik6IEJhc2VFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VFeGNlcHRpb24oZXJyb3IubWVzc2FnZSwgNTAwKVxuICAgIH1cbn0iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tIFwiI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHNcIlxuXG50eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuXG50eXBlIEVudHJ5S2V5ID0gc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3JcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFpbmVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxFbnRyeUtleSwgYW55PigpXG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRbU3RyaW5nKGtleSldID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEtleShwYXlsb2FkOiBFbnRyeUtleSk6IEVudHJ5S2V5IHtcbiAgICAgICAgbGV0IGtleSA9IHBheWxvYWRcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBrZXkgPSBwYXlsb2FkLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uc3RydWN0b3IgPSB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHBheWxvYWQgIT09ICdzeW1ib2wnXG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgIShwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IFRoZSBjb25zdHJ1Y3RvciAke3BheWxvYWQubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyLiBDb25zaWRlciBhZGRpbmcgYSBzdGF0aWMgcHJvcGVydHkgX19jb250YWluZXJfZW50cnlfa2V5IHRvIGF2b2lkIHBvdGVudGlhbCBjb25mbGljdHMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmIChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBrZXkgPSAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleVxuXG4gICAgfVxuXG4gICAgcHVibGljIHNldChwYXlsb2FkOiBFbnRyeUtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGF5bG9hZDogRW50cnlLZXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihwYXlsb2FkOiBFbnRyeUtleSk6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRW50cnkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZCBpbiBjb250YWluZXIuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIHNpbmdsZXRvbjxUPihjbGFzc0NvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPik6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSBjbGFzc0NvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgY2xhc3NDb25zdHJ1Y3RvcigpXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBuZXdJbnN0YW5jZSlcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZW50cmllczogUmVjb3JkPGFueSwgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhlbnRyaWVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5PFQgPSB1bmtub3duPihrZXk6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeVtwcm9wXVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChlbnRyeSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlbcHJvcF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGVudHJ5W3Byb3BdID0gdmFsdWVcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIGFzIFRcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5cygpOiBFbnRyeUtleVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmtleXMoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cydcblxuZXhwb3J0IHR5cGUgQW55Q2xhc3MgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5leHBvcnQgdHlwZSBNaXhpbjxUPiA9IChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8VD5cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICogXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBpbmNsdWRlcyBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2UoVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZTxcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KC4uLm1peGluczogTSk6IFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgY2xhc3Mge30gYXMgYW55KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIHdpdGggYSBiYXNlIGNsYXNzXG4gKiBcbiAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBUaGUgYmFzZSBjbGFzcyB0byBzdGFydCB3aXRoXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBjbGFzcyB3aXRoIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVdpdGg8XG4gICAgVEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcixcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlLFxuICAgIC4uLm1peGluczogTVxuKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGJhc2VDbGFzcyBhcyBhbnkpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oU291cmNlOiBUQmFzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VFRhcmdldCBleHRlbmRzIENvbnN0cnVjdG9yPihUYXJnZXQ6IFRUYXJnZXQpIHtcbiAgICAgICAgY2xhc3MgTWl4ZWQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2UoLi4uYXJncylcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgbWV0aG9kc1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoU291cmNlLnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIE1peGVkLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNvdXJjZS5wcm90b3R5cGUsIGtleSkhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1peGVkIGFzIFRUYXJnZXQgJiBUQmFzZVxuICAgIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyLCBkZWNpbWFscyA9IDIpIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcydcblxuICAgIGNvbnN0IGsgPSAxMDI0XG4gICAgY29uc3QgZG0gPSBkZWNpbWFscyA8IDAgPyAwIDogZGVjaW1hbHNcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInXVxuXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpXG5cbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgbmV3S2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZmxhdHRlbih2YWx1ZSwgbmV3S2V5LCByZXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCcuJylcbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IHJlc3VsdFxuICAgICAgICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gcGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB2YWx1ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydF0gfHwgdHlwZW9mIGN1cnJlbnRbcGFydF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG59IiwiaW50ZXJmYWNlIFRyeWVyIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBhbnlcbn1cblxuaW50ZXJmYWNlIFRyeWVyQXN5bmMge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB8IGFueVxufVxuXG50eXBlIFRyeUNhdGNoUmVzdWx0PFQgZXh0ZW5kcyBUcnllcj4gPSBbbnVsbCwgUmV0dXJuVHlwZTxUPl0gfCBbRXJyb3IsIG51bGxdXG5cbnR5cGUgVHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4gPSBbbnVsbCwgQXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pl0gfCBbRXJyb3IsIG51bGxdXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlDYXRjaDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4odHJ5ZXI6IFQpOiBQcm9taXNlPFRyeUNhdGNoQXN5bmNSZXN1bHQ8VD4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cblxudHJ5Q2F0Y2guc3luYyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgVHJ5ZXI+KHRyeWVyOiBUKTogVHJ5Q2F0Y2hSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuIiwiZnVuY3Rpb24gdXVpZCgpe1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OFxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWQocHJlZml4ID0gJycpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgdXVpZCgpXG59IiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGlsZChvcHRpb25zOiBhbnkpOiBMb2dnZXJTZXJ2aWNlIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICAgICByZXR1cm4gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgY3JlYXRlSWQsIHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5cbmludGVyZmFjZSBFbW1pdHRlckhhbmRsZXIge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICAgb3JpZ2luYWxMaXN0ZW5lcj86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG59XG5cbmludGVyZmFjZSBPbk9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgdW5pcXVlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgT25EZWJvdW5jZU9wdGlvbnMgZXh0ZW5kcyBPbk9wdGlvbnMge1xuICAgIGRlYm91bmNlPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbW1pdHRlclNlcnZpY2U8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFbW1pdHRlclNlcnZpY2UnXG5cbiAgICBwcml2YXRlIGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG4gICAgcHJpdmF0ZSBkZWJ1ZzogYm9vbGVhblxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBwdWJsaWMgbG9hZChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpZCA9IG9wdGlvbnM/LmlkIHx8IGNyZWF0ZUlkKClcblxuICAgICAgICBpZiAob3B0aW9ucz8udW5pcXVlKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmhhbmRsZXJzLnNvbWUoaCA9PiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHx8IGguaWQgPT09IGlkKVxuXG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyOiBFbW1pdHRlckhhbmRsZXIgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciBhZGRlZCcsIGhhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncylcblxuICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIHdyYXBwZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vbihldmVudCwgd3JhcHBlciwgb3B0aW9ucylcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkRlYm91bmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZShsaXN0ZW5lciwgb3B0aW9ucz8uZGVib3VuY2UgfHwgMzAwKVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBkZWJvdW5jZWQsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIub3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbkFueU9mPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50czogS1tdLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiBGdW5jdGlvbiwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IHtcbiAgICAgICAgICAgIGlmIChoLmV2ZW50ID09PSBldmVudCAmJiAoaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIgfHwgaC5vcmlnaW5hbExpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgcmVtb3ZlZCcsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCcsIHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgdHJ5Q2F0Y2guc3luYygoKSA9PiBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5saXN0ZW5lcihhcmdzKVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdEJ5RXZlbnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKHBheWxvYWQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gIWlkcy5pbmNsdWRlcyhoLmlkKSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXJzIHJlbW92ZWQnLCB7IGlkcyB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gW11cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FsbCBoYW5kbGVycyBjbGVhcmVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoID4gMFxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCB0eXBlIExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG50eXBlIExpZmVjeWNsZU1ldGhvZCA9ICdyZWdpc3RlcicgfCAnbG9hZCcgfCAnYm9vdCcgfCAnc2h1dGRvd24nXG5cbmludGVyZmFjZSBMaXN0T3B0aW9ucyB7XG4gICAgaW5jbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgZXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGhvb2tzPzogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGlmZWN5Y2xlU2VydmljZSdcblxuICAgIHB1YmxpYyBob29rczogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IExpZmVjeWNsZVNlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmhvb2tzID0gZGF0YS5ob29rcyA/PyBuZXcgTWFwKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IgPSBkYXRhLm9uRXJyb3JcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkVycm9yKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGNvbnRleHQgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaG9vayAke2NvbnRleHQubWV0aG9kfSAoJHtjb250ZXh0Lmhvb2tJZH0pOmAsIGVycm9yKVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXBBbGlhc2VzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGFsbCkge1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW5jbHVkZXMoaG9vay5ob29rX2lkKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5ob29rX2FsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkQWxpYXMgPSBob29rLmhvb2tfYWxpYXNlcy5maW5kKGFsaWFzID0+IGFyZ3MuaW5jbHVkZXMoYWxpYXMpKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRBbGlhcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KG9wdGlvbnM/OiBMaXN0T3B0aW9ucykge1xuICAgICAgICBsZXQgaG9va3MgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuZXhjbHVkZSkgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbb3B0aW9ucy5leGNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+ICFpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pbmNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGUpID8gb3B0aW9ucy5pbmNsdWRlIDogW29wdGlvbnMuaW5jbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiBpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzID0gb3JkZXJCeShob29rcywgWydvcmRlciddLCBbJ2FzYyddKVxuXG4gICAgICAgIHJldHVybiBob29rc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoLi4ucGF5bG9hZDogKExpZmVjeWNsZUhvb2sgfCBDb25zdHJ1Y3RvcjxMaWZlY3ljbGVIb29rPilbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnN0YW5jZXM6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKG5ldyBpdGVtKCkpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaXRlbSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGlmICghaG9vay5ob29rX2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignU2tpcHBpbmcgaG9vayB3aXRob3V0IGhvb2tfaWQ6JywgaG9vaylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmhvb2tzLnNldChob29rLmhvb2tfaWQsIGhvb2spXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZCAnICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5zdWJob29rcykge1xuICAgICAgICAgICAgICAgIGhvb2suc3ViaG9va3MuZm9yRWFjaChzdWJob29rID0+IHRoaXMuYWRkKHN1Ymhvb2spKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRNZXRob2QobWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBob29rcyA9IHRoaXMubGlzdChvcHRpb25zKSBcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGVtaXR0aW5nICR7bWV0aG9kfSBmb3IgaG9va3M6YCwge1xuICAgICAgICAgICAgICAgIGhvb2tzOiBob29rcy5tYXAoaG9vayA9PiBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIHRoaXMubGlzdChvcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5yZWdpc3RlcigpLCBob29rLm9uUmVnaXN0ZXIoKV0pLFxuICAgICAgICAgICAgICAgIGxvYWQ6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmxvYWQoKSwgaG9vay5vbkxvYWQoKV0pLFxuICAgICAgICAgICAgICAgIGJvb3Q6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmJvb3QoKSwgaG9vay5vbkJvb3QoKV0pLFxuICAgICAgICAgICAgICAgIHNodXRkb3duOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5zaHV0ZG93bigpLCBob29rLm9uU2h1dGRvd24oKV0pLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gbWFwW21ldGhvZF0oKSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yLCB7IGhvb2tJZDogaG9vay5ob29rX2lkLCBtZXRob2QgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke21ldGhvZH0gYCArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KHBheWxvYWQ6IExpZmVjeWNsZU1ldGhvZCB8IExpZmVjeWNsZU1ldGhvZFtdLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0TWV0aG9kKG1ldGhvZCwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgncmVnaXN0ZXInLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdsb2FkJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnYm9vdCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NodXRkb3duJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG9va3MuY2xlYXIoKVxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhbnNsYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1RyYW5zbGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgbG9jYWxlOiBzdHJpbmdcbiAgICBwdWJsaWMgbG9jYWxlTG9hZGVyczogTWFwPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj5cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFRyYW5zbGF0b3JTZXJ2aWNlPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IGRhdGEuZW50cmllcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMubG9jYWxlID0gZGF0YS5sb2NhbGUgfHwgJ2VuJ1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmNhY2hlID0gZGF0YS5jYWNoZSB8fCBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5sb2NhbGVMb2FkZXJzID0gbmV3IE1hcDxzdHJpbmcsICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubG9jYWxlTG9hZGVycy5rZXlzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgICAgICBjb25zdCBpdGVtczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cmllcyhsb2NhbGU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KGxvY2FsZSkhXG5cbiAgICAgICAgaWYgKGNhY2hlICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkIGxvY2FsZSBcIiR7bG9jYWxlfVwiIGZyb20gY2FjaGVgLCB7XG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogT2JqZWN0LmtleXMoY2FjaGUpLmxlbmd0aFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLmxvY2FsZUxvYWRlcnMuZ2V0KGxvY2FsZSlcblxuICAgICAgICBpZiAoIWxvYWRlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybihgbm8gbG9hZGVyIGZvdW5kIGZvciBsb2NhbGUgXCIke2xvY2FsZX1cImApXG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBsb2FkZXIoKVxuXG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGxvY2FsZSwgZW50cmllcylcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWQgbG9jYWxlICR7bG9jYWxlfWAsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAga2V5czogT2JqZWN0LmtleXMoZW50cmllcykubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChsb2NhbGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRFbnRyaWVzKGxvY2FsZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhlbnRyaWVzKSlcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIH1cblxuICAgIHB1YmxpYyB0KGtleTogc3RyaW5nLCBhcmdzOiBhbnkgPSB7fSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBtaXNzaW5nIHRyYW5zbGF0aW9uIGZvciBrZXkgXCIke2tleX1cImAsIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpIHx8IGtleVxuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbiA9IGVudHJ5XG5cbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYXJncykuZm9yRWFjaCgoW2FLZXksIGFWYWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb24ucmVwbGFjZShgOiR7YUtleX1gLCBhVmFsdWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uXG4gICAgfVxuXG4gICAgcHVibGljIGRhdGUoZGF0YTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0YSlcblxuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBkYXk6ICcyLWRpZ2l0J1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBkYXRldGltZShkYXRhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRhKVxuXG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdVcGxvYWRTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHNpbmdsZShuYW1lOiBzdHJpbmcpe1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIG11bHRpcGxlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG4iLCJpbXBvcnQgeyBudW1iZXIsIGFycmF5IH0gZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblBhcmFtcyB7XG4gICAgbWF4TGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckZpZWxkcz86IHN0cmluZ1tdXG59XG5cblxuZXhwb3J0IGNvbnN0IGJhc2UgPSAob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSA9PiB2Lm9iamVjdCh7XG4gICAgcGFnZTogdi5vcHRpb25hbChudW1iZXIoKSwgMSksXG4gICAgbGltaXQ6IHYub3B0aW9uYWwobnVtYmVyKCksIG9wdGlvbnMubWF4TGltaXQgfHwgMTAwKSxcbiAgICBvcmRlckJ5OiB2Lm9wdGlvbmFsKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYub3B0aW9uYWwoYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmNvbnN0IGV4dHJhcyA9IHtcbiAgICB1cmwsXG4gICAgcGFnaW5hdGlvbixcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfSBcblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2Lk9iamVjdEVudHJpZXM+ID0gdi5JbmZlck91dHB1dDx2Lk9iamVjdFNjaGVtYTxULCB1bmRlZmluZWQ+PlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJyBcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIC8vIFJlbW92ZSB0aGUgJzonIHByZWZpeFxuICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgIHBhcmFtc1snKiddID0gcmVtYWluaW5nU2VnbWVudHMuam9pbignLycpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxRdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG59XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25Bc3NpZ25tZW50ID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBwZXJtaXNzaW9uX2lkOiB2Lm51bWJlcigpLFxuICAgIGFzc2lnbmFibGVfdHlwZTogdi5zdHJpbmcoKSxcbiAgICBhc3NpZ25hYmxlX2lkOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGFjdGlvbjogdi5zdHJpbmcoKSxcbiAgICBzdWJqZWN0OiB2LnN0cmluZygpLFxuICAgIGNvbmRpdGlvbnM6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBUb2tlbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHRva2VuU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgdG9rZW5TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB0eXBlOiB2LnN0cmluZygpLFxuICAgIHVzZXJfaWQ6IHYubnVtYmVyKCksXG4gICAgdG9rZW46IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnLi9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGVsbEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICAgIHB1YmxpYyBvdXRwdXQ6IHN0cmluZ1xuICAgIHB1YmxpYyBiaW46IHN0cmluZyBcbiAgICBwdWJsaWMgYXJnczogc3RyaW5nW11cblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcsIGJpbjogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCA1MDEpXG5cbiAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXRcbiAgICAgICAgdGhpcy5iaW4gPSBiaW4gXG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3MgXG4gICAgfVxufVxuIiwiaW1wb3J0IFZhbGlkYXRvclNlcnZpY2UgZnJvbSBcIi4uL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2VcIlxuXG5leHBvcnQgY29uc3QgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvclNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0b3JcbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyB7XG4gICAgcGFyc2U/OiAoZGF0YTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkob3B0aW9uczogQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvcHRpb25zLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlRW50cnkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nXG4gICAgcHVibGljIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknXG4gICAgcHVibGljIG1ldGFzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlRW50cnkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGRyaXZlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZXR5cGU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgY2xpZW50X25hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHB1YmxpYzogYm9vbGVhblxuXG4gICAgLy8gZHluYW1pY1xuICAgIHB1YmxpYyB1cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgbWV0YXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBwdWJsaWMgaXNJbWFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZXR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJylcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBzZXRIZWFkZXI/OiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhlYWRlck1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnSGVhZGVyTWFwRW50aXR5J1xuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHNldEhlYWRlcj86IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5zZXRIZWFkZXIgPSBkYXRhPy5zZXRIZWFkZXJcblxuICAgICAgICBpZiAoZGF0YT8uaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5sb2FkRnJvbVJlY29yZChkYXRhLmhlYWRlcnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChuYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuc2V0SGVhZGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignc2V0SGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQobmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uRW50aXR5PFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIGl0ZW1zOiBUW11cbiAgICBwdWJsaWMgdG90YWw6IG51bWJlclxuICAgIHB1YmxpYyBwYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgcGVyX3BhZ2U6IG51bWJlclxuICAgIHB1YmxpYyB0b3RhbF9wYWdlczogbnVtYmVyXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb208VCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPihwYXlsb2FkOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk8VD4+KTogUGFnaW5hdGlvbkVudGl0eTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkVudGl0eShwYXlsb2FkIGFzIGFueSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2UoKVxuXG4gICAgICAgIHJldHVybiBhICsgYlxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjBRQVFBLElBQXFCLEVBQXJCLEtBQW1DLENBQy9CLE9BQWMsc0JBQXdCLGdCQUV0QyxRQUVBLGFBQWMsQ0FDVixLQUFLLFFBQVUsSUFBSSxJQUd2QixNQUFjLENBQ1YsT0FBTyxNQUFNLEtBQUssS0FBSyxRQUFRLFFBQVEsQ0FBQyxDQUc1QyxXQUFrQixFQUFpQixDQUsvQixPQUpJLE9BQU8sR0FBVSxVQUFZLEVBQU0sU0FBUyxXQUFXLENBQ2hELEVBQU0sUUFBUSxXQUFZLEdBQUcsQ0FBQyxNQUFNLEdBQUssT0FHN0MsRUFHWCxlQUFzQixFQUE2QixFQUFTLFNBQWdCLENBQ3hFLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsRUFBTyxDQUM3QyxLQUFLLFFBQVEsSUFBSSxFQUFLLENBQ2xCLE1BQ0EsTUFBTyxLQUFLLFdBQVcsRUFBTSxDQUM3QixTQUNILENBQUMsQ0FJVixnQkFBdUIsRUFBMEIsRUFBUyxTQUFnQixDQUN0RSxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUs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