@fest-lib/lure 0.1.55 → 0.1.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3043 @@
1
+ "use strict";
2
+ (function() {
3
+ var ie = Object.defineProperty, $e = (e, t, n) => () => {
4
+ if (n) throw n[0];
5
+ try {
6
+ return e && (t = e(e = 0)), t;
7
+ } catch (r) {
8
+ throw n = [r], r;
9
+ }
10
+ }, ze = (e, t) => {
11
+ let n = {};
12
+ for (var r in e) ie(n, r, {
13
+ get: e[r],
14
+ enumerable: !0
15
+ });
16
+ return t || ie(n, Symbol.toStringTag, { value: "Module" }), n;
17
+ };
18
+ let h = (function(e) {
19
+ return e.GET = "get", e.SET = "set", e.CALL = "call", e.APPLY = "apply", e.CONSTRUCT = "construct", e.DELETE = "delete", e.DELETE_PROPERTY = "deleteProperty", e.HAS = "has", e.OWN_KEYS = "ownKeys", e.GET_OWN_PROPERTY_DESCRIPTOR = "getOwnPropertyDescriptor", e.GET_PROPERTY_DESCRIPTOR = "getPropertyDescriptor", e.GET_PROTOTYPE_OF = "getPrototypeOf", e.SET_PROTOTYPE_OF = "setPrototypeOf", e.IS_EXTENSIBLE = "isExtensible", e.PREVENT_EXTENSIONS = "preventExtensions", e.TRANSFER = "transfer", e.IMPORT = "import", e.DISPOSE = "dispose", e;
20
+ })({});
21
+ const Ke = {
22
+ ws: "websocket",
23
+ socket: "websocket",
24
+ socketio: "socket-io",
25
+ service: "service-worker",
26
+ sw: "service-worker",
27
+ "service-worker-client": "service-worker",
28
+ "service-worker-host": "service-worker",
29
+ "ring-buffer": "atomics"
30
+ };
31
+ function Ye(e) {
32
+ const t = String(e ?? "").trim().toLowerCase();
33
+ return t ? Ke[t] ?? t : "internal";
34
+ }
35
+ function Ve(e) {
36
+ return typeof e == "string" ? Ye(e) : typeof Worker < "u" && e instanceof Worker ? "worker" : typeof SharedWorker < "u" && e instanceof SharedWorker ? "shared-worker" : typeof MessagePort < "u" && e instanceof MessagePort ? "message-port" : typeof BroadcastChannel < "u" && e instanceof BroadcastChannel ? "broadcast" : typeof WebSocket < "u" && e instanceof WebSocket ? "websocket" : typeof RTCDataChannel < "u" && e instanceof RTCDataChannel ? "rtc-data" : typeof chrome < "u" && e && typeof e == "object" && typeof e.postMessage == "function" && e.onMessage?.addListener ? "chrome-port" : "internal";
37
+ }
38
+ const ae = Symbol.for("@fix"), b = (e) => typeof e == "string" || typeof e == "number" || typeof e == "boolean" || typeof e == "bigint" || typeof e > "u" || e == null, Xe = (e, t) => b(e) ? t == "number" ? Number(e) || 0 : t == "string" ? String(e) || "" : t == "boolean" ? !!e : e : null, p = (e, t) => e?.[ae] ?? e ?? t ?? t, je = (e) => {
39
+ if (typeof e == "function" || e == null) return e;
40
+ const t = function() {};
41
+ return t[ae] = e, t;
42
+ }, Je = (e) => crypto?.getRandomValues ? crypto?.getRandomValues?.(e) : (() => {
43
+ const t = new Uint8Array(e.length);
44
+ for (let n = 0; n < e.length; n++) t[n] = Math.floor(Math.random() * 256);
45
+ return t;
46
+ })(), d = () => crypto?.randomUUID ? crypto?.randomUUID?.() : "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (e) => (+e ^ Je?.(/* @__PURE__ */ new Uint8Array(1))?.[0] & 15 >> +e / 4).toString(16)), ce = (e) => Array.isArray(e) ? e?.flatMap?.((t) => Array.isArray(t) ? ce(t) : t) : e, X = (e) => ce(e)?.every?.(x), x = (e) => b(e) || typeof SharedArrayBuffer == "function" && e instanceof SharedArrayBuffer || Qe(e) || Array.isArray(e) && X(e), Qe = (e) => ArrayBuffer.isView(e) && !(e instanceof DataView), j = (e) => b(e) || typeof ArrayBuffer == "function" && e instanceof ArrayBuffer || typeof MessagePort == "function" && e instanceof MessagePort || typeof ReadableStream == "function" && e instanceof ReadableStream || typeof WritableStream == "function" && e instanceof WritableStream || typeof TransformStream == "function" && e instanceof TransformStream || typeof ImageBitmap == "function" && e instanceof ImageBitmap || typeof VideoFrame == "function" && e instanceof VideoFrame || typeof OffscreenCanvas == "function" && e instanceof OffscreenCanvas || typeof RTCDataChannel == "function" && e instanceof RTCDataChannel || typeof AudioData == "function" && e instanceof AudioData || typeof WebTransportReceiveStream == "function" && e instanceof WebTransportReceiveStream || typeof WebTransportSendStream == "function" && e instanceof WebTransportSendStream || typeof WebTransportReceiveStream == "function" && e instanceof WebTransportReceiveStream, J = Symbol.for("@promise"), Ze = /* @__PURE__ */ new Set([
47
+ Symbol.for("@extract"),
48
+ Symbol.for("@origin"),
49
+ Symbol.for("@registry"),
50
+ Symbol.for("@value"),
51
+ Symbol.for("@promise"),
52
+ Symbol.for("@behavior"),
53
+ Symbol.for("@trigger"),
54
+ Symbol.for("@subscribe"),
55
+ Symbol.for("@realProp"),
56
+ Symbol.for("@trigger-lock"),
57
+ Symbol.for("@trigger-less"),
58
+ Symbol.for("@trigger-control"),
59
+ Symbol.for("@isNotEqual"),
60
+ Symbol.for("@fix"),
61
+ Symbol.for("@target"),
62
+ Symbol.for("@resolved")
63
+ ]), L = (e) => e instanceof Promise || typeof e?.then == "function", le = (e) => Promise.resolve(e).then((t) => ({
64
+ status: "fulfilled",
65
+ value: t
66
+ }), (t) => ({
67
+ status: "rejected",
68
+ reason: t
69
+ })), ue = (e) => Reflect.ownKeys(e).filter((t) => {
70
+ if (Ze.has(t)) return !1;
71
+ const n = Object.getOwnPropertyDescriptor(e, t);
72
+ return n !== void 0 && n.enumerable;
73
+ }), B = (e, t) => {
74
+ if (e == null || b(e)) return !1;
75
+ if (L(e) || L(e?.[J])) return !0;
76
+ if (typeof e != "object" && typeof e != "function") return !1;
77
+ const n = t ?? /* @__PURE__ */ new WeakSet();
78
+ return n.has(e) ? !1 : (n.add(e), Array.isArray(e) ? e.some((r) => B(r, n)) : e instanceof Map ? [...e.values()].some((r) => B(r, n)) : e instanceof Set ? [...e.values()].some((r) => B(r, n)) : ue(e).some((r) => B(e[r], n)));
79
+ };
80
+ function H(e, t, n) {
81
+ if (e == null || b(e) || typeof e == "symbol" || L(e)) return e;
82
+ const r = e?.[J];
83
+ if (L(r)) return r;
84
+ if (typeof e != "object" && typeof e != "function" || n.has(e)) return e;
85
+ if (n.add(e), Array.isArray(e)) {
86
+ const o = e.map((i) => H(i, t, n));
87
+ return t == "settled" ? Promise.allSettled(o) : Promise.all(o);
88
+ }
89
+ if (e instanceof Set) {
90
+ const o = [...e.values()].map((i) => H(i, t, n));
91
+ return t == "settled" ? Promise.allSettled(o) : Promise.all(o);
92
+ }
93
+ const s = {};
94
+ if (e instanceof Map) for (const [o, i] of e.entries()) s[o] = H(i, t, n);
95
+ else for (const o of ue(e)) s[o] = H(e[o], t, n);
96
+ return t == "settled" ? Promise.allSettledKeyed(s) : Promise.allKeyed(s);
97
+ }
98
+ function S(e, t = "all") {
99
+ if (L(e)) return t == "settled" ? le(e) : Promise.resolve(e);
100
+ const n = e?.[J];
101
+ return L(n) ? t == "settled" ? le(n) : Promise.resolve(n) : Promise.resolve(H(e, t, /* @__PURE__ */ new WeakSet()));
102
+ }
103
+ S.all = (e) => S(e, "all"), S.allSettled = (e) => S(e, "settled"), S.allKeyed = (e) => Promise.allKeyed(e), S.allSettledKeyed = (e) => Promise.allSettledKeyed(e), S.try = (e, ...t) => Promise.try(e, ...t).then((n) => S(n, "all"));
104
+ const he = Symbol.for("object.boundCtx");
105
+ globalThis[he] ??= /* @__PURE__ */ new WeakMap();
106
+ globalThis[he];
107
+ const k = (e, t, n) => {
108
+ if (Array.isArray(e)) return e.every(x) ? e.map(t) : e.map((r, s) => k(r, t, [e, s]));
109
+ if (e instanceof Map) {
110
+ const r = Array.from(e.entries());
111
+ return r.map(([s, o]) => o).every(x) ? new Map(r.map(([s, o]) => [s, t(o, s, e)])) : new Map(r.map(([s, o]) => [s, k(o, t, [e, s])]));
112
+ }
113
+ if (e instanceof Set) {
114
+ const r = Array.from(e.entries()), s = r.map(([o, i]) => i);
115
+ return r.every(x) ? new Set(s.map(t)) : new Set(s.map((o) => k(o, t, [e, o])));
116
+ }
117
+ if (typeof e == "object" && e?.constructor == Object && Object.prototype.toString.call(e) == "[object Object]") {
118
+ const r = Array.from(Object.entries(e));
119
+ return r.map(([s, o]) => o).every(x) ? Object.fromEntries(r.map(([s, o]) => [s, t(o, s, e)])) : Object.fromEntries(r.map(([s, o]) => [s, k(o, t, [e, s])]));
120
+ }
121
+ return t(e, n?.[1] ?? "", n?.[0] ?? null);
122
+ }, de = Symbol.for("@resolved-promise"), fe = Symbol.for("@handled-promise");
123
+ globalThis[de] ??= /* @__PURE__ */ new WeakMap(), globalThis[fe] ??= /* @__PURE__ */ new WeakMap();
124
+ const P = globalThis[de], pe = globalThis[fe], et = Symbol.for("@extract"), Q = (e) => e instanceof Promise || typeof e?.then == "function", m = (e, t) => Q(e) ? P?.has?.(e) ? t(P?.get?.(e)) : Promise.try?.(async () => {
125
+ const n = await e;
126
+ return P?.set?.(e, n), n;
127
+ })?.then?.(t) : t(e);
128
+ var tt = class {
129
+ #e;
130
+ #t;
131
+ constructor(e, t) {
132
+ this.#e = e, this.#t = t;
133
+ }
134
+ defineProperty(e, t, n) {
135
+ return p(e) instanceof Promise ? Reflect.defineProperty(e, t, n) : m(p(e), (r) => Reflect.defineProperty(r, t, n));
136
+ }
137
+ deleteProperty(e, t) {
138
+ return p(e) instanceof Promise ? Reflect.deleteProperty(e, t) : m(p(e), (n) => Reflect.deleteProperty(n, t));
139
+ }
140
+ getPrototypeOf(e) {
141
+ return p(e) instanceof Promise ? Reflect.getPrototypeOf(e) : m(p(e), (t) => Reflect.getPrototypeOf(t));
142
+ }
143
+ setPrototypeOf(e, t) {
144
+ return p(e) instanceof Promise ? Reflect.setPrototypeOf(e, t) : m(p(e), (n) => Reflect.setPrototypeOf(n, t));
145
+ }
146
+ isExtensible(e) {
147
+ return p(e) instanceof Promise ? Reflect.isExtensible(e) : m(p(e), (t) => Reflect.isExtensible(t));
148
+ }
149
+ preventExtensions(e) {
150
+ return p(e) instanceof Promise ? Reflect.ownKeys(e) : m(p(e), (t) => Reflect.preventExtensions(t));
151
+ }
152
+ ownKeys(e) {
153
+ const t = p(e);
154
+ return t instanceof Promise ? Object.keys(t) : m(t, (n) => (typeof n == "object" || typeof n == "function") && n != null ? Object.keys(n) : []) ?? [];
155
+ }
156
+ getOwnPropertyDescriptor(e, t) {
157
+ return p(e) instanceof Promise ? Reflect.getOwnPropertyDescriptor(e, t) : m(p(e), (n) => Reflect.getOwnPropertyDescriptor(n, t));
158
+ }
159
+ construct(e, t, n) {
160
+ return m(p(e), (r) => Reflect.construct(r, t, n));
161
+ }
162
+ has(e, t) {
163
+ return p(e) instanceof Promise ? Reflect.has(e, t) : m(p(e), (n) => Reflect.has(n, t));
164
+ }
165
+ get(e, t, n) {
166
+ if (e = p(e), t == "promise") return e;
167
+ if (t == "resolve" && this.#e) return (...s) => {
168
+ const o = this.#e?.(...s);
169
+ return this.#e = null, o;
170
+ };
171
+ if (t == "reject" && this.#t) return (...s) => {
172
+ const o = this.#t?.(...s);
173
+ return this.#t = null, o;
174
+ };
175
+ if (t == "then" || t == "catch" || t == "finally") {
176
+ if (e instanceof Promise) return e?.[t]?.bind?.(e);
177
+ {
178
+ const s = Promise.try(() => e);
179
+ return s?.[t]?.bind?.(s);
180
+ }
181
+ }
182
+ let r;
183
+ return P?.has?.(e) && (r = P?.get?.(e))?.[t] != null ? r = P?.get?.(e)?.[t] : r = E(m(e, async (s) => {
184
+ if (p(s) instanceof Promise) return Reflect.get(s, t, n);
185
+ if (b(s)) return t == Symbol.toPrimitive || t == Symbol.toStringTag ? s : void 0;
186
+ let o;
187
+ try {
188
+ o = Reflect.get(s, t, n);
189
+ } catch {
190
+ o = e?.[t];
191
+ }
192
+ return typeof o == "function" ? o?.bind?.(s) : o;
193
+ })), t == Symbol.toStringTag ? b(r) ? String(r ?? "") || "" : r?.[Symbol.toStringTag]?.() || String(r ?? "") || "" : t == Symbol.toPrimitive ? (s) => {
194
+ if (b(r)) return Xe(r, s);
195
+ } : r;
196
+ }
197
+ set(e, t, n) {
198
+ return m(p(e), (r) => Reflect.set(r, t, n));
199
+ }
200
+ apply(e, t, n) {
201
+ if (this.#e) {
202
+ const r = this.#e?.(...n);
203
+ return this.#e = null, r;
204
+ }
205
+ return m(p(e, this.#e), (r) => {
206
+ if (typeof r == "function") return p(r) instanceof Promise, Reflect.apply(r, t, n);
207
+ });
208
+ }
209
+ };
210
+ function E(e, t, n) {
211
+ return e != null && typeof e?.resolved == "function" && e[et] != null && B(e) ? E(e.resolved(), t, n) : !Q(e) && B(e) ? E(S(e), t, n) : Q(e) ? P?.has?.(e) ? P?.get?.(e) : (pe?.has?.(e) || e?.then?.((r) => P?.set?.(e, r)), pe.getOrInsertComputed(e, () => new Proxy(je(e), new tt(t, n)))) : e;
212
+ }
213
+ E.allKeyed = function(e, t, n) {
214
+ return E(Promise.allKeyed(e), t, n);
215
+ }, E.allSettledKeyed = function(e, t, n) {
216
+ return E(Promise.allSettledKeyed(e), t, n);
217
+ };
218
+ var _e = class {
219
+ _unsubscribe;
220
+ _closed = !1;
221
+ constructor(e) {
222
+ this._unsubscribe = e;
223
+ }
224
+ get closed() {
225
+ return this._closed;
226
+ }
227
+ unsubscribe() {
228
+ this._closed || (this._closed = !0, this._unsubscribe());
229
+ }
230
+ }, nt = class {
231
+ _producer;
232
+ constructor(e) {
233
+ this._producer = e;
234
+ }
235
+ subscribe(e, t) {
236
+ const n = typeof e == "function" ? { next: e } : e ?? {}, r = new AbortController();
237
+ t?.signal?.addEventListener("abort", () => r.abort());
238
+ let s = !0, o;
239
+ const i = () => {
240
+ s = !1, r.abort(), o?.();
241
+ }, a = {
242
+ next: (c) => s && n.next?.(c),
243
+ error: (c) => {
244
+ s && (n.error?.(c), i());
245
+ },
246
+ complete: () => {
247
+ s && (n.complete?.(), i());
248
+ },
249
+ signal: r.signal,
250
+ get active() {
251
+ return s && !r.signal.aborted;
252
+ }
253
+ };
254
+ try {
255
+ o = this._producer(a);
256
+ } catch (c) {
257
+ a.error(c);
258
+ }
259
+ return new _e(i);
260
+ }
261
+ pipe(...e) {
262
+ return e.reduce((t, n) => n(t), this);
263
+ }
264
+ }, y = class {
265
+ _subs = /* @__PURE__ */ new Set();
266
+ _buffer = [];
267
+ _maxBuffer;
268
+ _replay;
269
+ constructor(e = {}) {
270
+ this._maxBuffer = e.bufferSize ?? 0, this._replay = e.replayOnSubscribe ?? !1;
271
+ }
272
+ next(e) {
273
+ this._maxBuffer > 0 && (this._buffer.push(e), this._buffer.length > this._maxBuffer && this._buffer.shift());
274
+ for (const t of this._subs) try {
275
+ t.next?.(e);
276
+ } catch (n) {
277
+ t.error?.(n);
278
+ }
279
+ }
280
+ error(e) {
281
+ for (const t of this._subs) t.error?.(e);
282
+ }
283
+ complete() {
284
+ for (const e of this._subs) e.complete?.();
285
+ this._subs.clear();
286
+ }
287
+ subscribe(e) {
288
+ const t = typeof e == "function" ? { next: e } : e;
289
+ if (this._subs.add(t), this._replay) for (const n of this._buffer) try {
290
+ t.next?.(n);
291
+ } catch (r) {
292
+ t.error?.(r);
293
+ }
294
+ return new _e(() => {
295
+ this._subs.delete(t);
296
+ });
297
+ }
298
+ getValue() {
299
+ return this._buffer.at(-1);
300
+ }
301
+ getBuffer() {
302
+ return [...this._buffer];
303
+ }
304
+ get subscriberCount() {
305
+ return this._subs.size;
306
+ }
307
+ };
308
+ const rt = (e) => (t) => new nt((n) => {
309
+ const r = t.subscribe({
310
+ next: (s) => e(s) && n.next(s),
311
+ error: (s) => n.error(s),
312
+ complete: () => n.complete()
313
+ });
314
+ return () => r.unsubscribe();
315
+ });
316
+ function ye() {
317
+ if (typeof globalThis.Deno < "u") return "deno";
318
+ if (typeof globalThis.process < "u" && globalThis.process?.versions?.node) return "node";
319
+ const e = globalThis.ServiceWorkerGlobalScope, t = globalThis.SharedWorkerGlobalScope, n = globalThis.DedicatedWorkerGlobalScope;
320
+ if (e && self instanceof e) return "service-worker";
321
+ if (t && self instanceof t) return "shared-worker";
322
+ if (n && self instanceof n) return "worker";
323
+ if (typeof chrome < "u" && chrome.runtime?.id) {
324
+ if (typeof chrome.runtime.getBackgroundPage == "function" || chrome.runtime.getManifest?.()?.background?.service_worker) return "chrome-background";
325
+ if (typeof chrome.devtools < "u") return "chrome-devtools";
326
+ if (typeof document < "u" && globalThis?.location?.protocol === "chrome-extension:" && (chrome.extension?.getViews?.({ type: "popup" }) ?? []).includes(globalThis)) return "chrome-popup";
327
+ if (typeof document < "u" && globalThis?.location?.protocol !== "chrome-extension:") return "chrome-content";
328
+ }
329
+ return typeof globalThis < "u" && typeof document < "u" ? "window" : "unknown";
330
+ }
331
+ function me(e) {
332
+ if (typeof RTCDataChannel < "u" && e instanceof RTCDataChannel) return "rtc-data";
333
+ const t = Ve(e);
334
+ return t && t !== "internal" ? t : e === self || e === globalThis || e === "self" ? "self" : "internal";
335
+ }
336
+ function st(e) {
337
+ if (!e) return "unknown";
338
+ if (e.contextType) return e.contextType;
339
+ const t = e.sender ?? "";
340
+ return t.includes("worker") ? "worker" : t.includes("sw") || t.includes("service") ? "service-worker" : t.includes("chrome") || t.includes("crx") ? "chrome-content" : t.includes("background") ? "chrome-background" : "unknown";
341
+ }
342
+ const ot = {
343
+ get: (e, t) => Reflect.get(e, t),
344
+ set: (e, t, n) => Reflect.set(e, t, n),
345
+ has: (e, t) => Reflect.has(e, t),
346
+ apply: (e, t, n) => Reflect.apply(e, t, n),
347
+ construct: (e, t) => Reflect.construct(e, t),
348
+ deleteProperty: (e, t) => Reflect.deleteProperty(e, t),
349
+ ownKeys: (e) => Reflect.ownKeys(e),
350
+ getOwnPropertyDescriptor: (e, t) => Reflect.getOwnPropertyDescriptor(e, t),
351
+ getPrototypeOf: (e) => Reflect.getPrototypeOf(e),
352
+ setPrototypeOf: (e, t) => Reflect.setPrototypeOf(e, t),
353
+ isExtensible: (e) => Reflect.isExtensible(e),
354
+ preventExtensions: (e) => Reflect.preventExtensions(e)
355
+ }, it = Symbol.for("uniform.proxy"), at = Symbol.for("uniform.proxy.internals");
356
+ var ct = class {
357
+ _invoker;
358
+ _config;
359
+ _childCache = /* @__PURE__ */ new Map();
360
+ constructor(e, t) {
361
+ this._invoker = e, this._config = {
362
+ channel: t.channel,
363
+ basePath: t.basePath ?? [],
364
+ invoker: e,
365
+ cache: t.cache ?? !0,
366
+ timeout: t.timeout ?? 3e4
367
+ };
368
+ }
369
+ get(e, t, n) {
370
+ const r = String(t);
371
+ if (t === it) return !0;
372
+ if (t === at) return this._config;
373
+ if (t === wt) return !0;
374
+ if (t === q) return this._getDescriptor();
375
+ if (t === "then" || t === "catch" || t === "finally" || typeof t == "symbol") return;
376
+ if (t === "$path") return this._config.basePath;
377
+ if (t === "$channel") return this._config.channel;
378
+ if (t === "$descriptor") return this._getDescriptor();
379
+ if (t === "$invoke") return this._invoker;
380
+ const s = [...this._config.basePath, r];
381
+ if (this._config.cache && this._childCache.has(r)) return this._childCache.get(r);
382
+ const o = z(this._invoker, {
383
+ ...this._config,
384
+ basePath: s
385
+ });
386
+ return this._config.cache && this._childCache.set(r, o), o;
387
+ }
388
+ set(e, t, n, r) {
389
+ return typeof t == "symbol" || this._invoker(h.SET, [...this._config.basePath, String(t)], [n]), !0;
390
+ }
391
+ apply(e, t, n) {
392
+ return this._invoker(h.APPLY, this._config.basePath, [n]);
393
+ }
394
+ construct(e, t, n) {
395
+ return this._invoker(h.CONSTRUCT, this._config.basePath, [t]);
396
+ }
397
+ has(e, t) {
398
+ return typeof t == "symbol" ? !1 : this._invoker(h.HAS, this._config.basePath, [t]);
399
+ }
400
+ deleteProperty(e, t) {
401
+ return typeof t == "symbol" ? !0 : this._invoker(h.DELETE_PROPERTY, [...this._config.basePath, String(t)], []);
402
+ }
403
+ ownKeys(e) {
404
+ return [];
405
+ }
406
+ getOwnPropertyDescriptor(e, t) {
407
+ return {
408
+ configurable: !0,
409
+ enumerable: !0,
410
+ writable: !0
411
+ };
412
+ }
413
+ getPrototypeOf(e) {
414
+ return Function.prototype;
415
+ }
416
+ setPrototypeOf(e, t) {
417
+ return this._invoker(h.SET_PROTOTYPE_OF, this._config.basePath, [t]);
418
+ }
419
+ isExtensible(e) {
420
+ return !0;
421
+ }
422
+ preventExtensions(e) {
423
+ return this._invoker(h.PREVENT_EXTENSIONS, this._config.basePath, []);
424
+ }
425
+ _getDescriptor() {
426
+ return {
427
+ path: this._config.basePath,
428
+ channel: this._config.channel,
429
+ primitive: !1
430
+ };
431
+ }
432
+ };
433
+ function z(e, t) {
434
+ const n = function() {}, r = new ct(e, t);
435
+ return new Proxy(n, r);
436
+ }
437
+ function ge(e, t, n) {
438
+ if (!e || typeof e != "object" || e.primitive) return e;
439
+ const r = ke.get(e);
440
+ if (r) return r;
441
+ const s = z(t, {
442
+ channel: n ?? e.channel ?? "unknown",
443
+ basePath: e.path ?? []
444
+ });
445
+ return ke.set(e, s), te.set(s, e), s;
446
+ }
447
+ const ht = ge;
448
+ function dt(e) {
449
+ return [
450
+ e.localChannel,
451
+ e.remoteChannel,
452
+ e.sender,
453
+ e.transportType,
454
+ e.direction
455
+ ].join("::");
456
+ }
457
+ function ft(e, t = {}) {
458
+ const n = t.includeClosed ?? !1, r = t.status ?? (n ? void 0 : "active");
459
+ return [...e].filter((s) => !(r && s.status !== r || t.channel && s.localChannel !== t.channel && s.remoteChannel !== t.channel || t.localChannel && s.localChannel !== t.localChannel || t.remoteChannel && s.remoteChannel !== t.remoteChannel || t.sender && s.sender !== t.sender || t.transportType && s.transportType !== t.transportType || t.direction && s.direction !== t.direction)).sort((s, o) => o.updatedAt - s.updatedAt);
460
+ }
461
+ var we = class {
462
+ _createId;
463
+ _emitEvent;
464
+ _connections = /* @__PURE__ */ new Map();
465
+ constructor(e, t) {
466
+ this._createId = e, this._emitEvent = t;
467
+ }
468
+ register(e) {
469
+ const t = dt(e), n = Date.now(), r = this._connections.get(t);
470
+ if (r) return r.updatedAt = n, r.status = "active", r.metadata = {
471
+ ...r.metadata,
472
+ ...e.metadata
473
+ }, r;
474
+ const s = {
475
+ id: this._createId(),
476
+ localChannel: e.localChannel,
477
+ remoteChannel: e.remoteChannel,
478
+ sender: e.sender,
479
+ transportType: e.transportType,
480
+ direction: e.direction,
481
+ status: "active",
482
+ createdAt: n,
483
+ updatedAt: n,
484
+ metadata: e.metadata
485
+ };
486
+ return this._connections.set(t, s), this._emitEvent?.({
487
+ type: "connected",
488
+ connection: s,
489
+ timestamp: n
490
+ }), s;
491
+ }
492
+ markNotified(e, t) {
493
+ const n = Date.now();
494
+ e.lastNotifyAt = n, e.updatedAt = n, this._emitEvent?.({
495
+ type: "notified",
496
+ connection: e,
497
+ timestamp: n,
498
+ payload: t
499
+ });
500
+ }
501
+ closeByChannel(e) {
502
+ const t = Date.now();
503
+ for (const n of this._connections.values()) n.localChannel !== e && n.remoteChannel !== e || n.status !== "closed" && (n.status = "closed", n.updatedAt = t, this._emitEvent?.({
504
+ type: "disconnected",
505
+ connection: n,
506
+ timestamp: t
507
+ }));
508
+ }
509
+ closeAll() {
510
+ const e = Date.now();
511
+ for (const t of this._connections.values()) t.status !== "closed" && (t.status = "closed", t.updatedAt = e, this._emitEvent?.({
512
+ type: "disconnected",
513
+ connection: t,
514
+ timestamp: e
515
+ }));
516
+ }
517
+ query(e = {}) {
518
+ return ft(this._connections.values(), e);
519
+ }
520
+ values() {
521
+ return [...this._connections.values()];
522
+ }
523
+ clear() {
524
+ this._connections.clear();
525
+ }
526
+ }, be = class {
527
+ _name;
528
+ _contextType;
529
+ _config;
530
+ _transports = /* @__PURE__ */ new Map();
531
+ _defaultTransport = null;
532
+ _connectionEvents = new y({ bufferSize: 200 });
533
+ _connectionRegistry = new we(() => d(), (e) => this._connectionEvents.next(e));
534
+ _pending = /* @__PURE__ */ new Map();
535
+ _subscriptions = [];
536
+ _inbound = new y({ bufferSize: 100 });
537
+ _outbound = new y({ bufferSize: 100 });
538
+ _invocations = new y({ bufferSize: 100 });
539
+ _responses = new y({ bufferSize: 100 });
540
+ _exposed = /* @__PURE__ */ new Map();
541
+ _proxyCache = /* @__PURE__ */ new WeakMap();
542
+ __getPrivate(e) {
543
+ return this[e];
544
+ }
545
+ __setPrivate(e, t) {
546
+ this[e] = t;
547
+ }
548
+ constructor(e) {
549
+ const t = typeof e == "string" ? { name: e } : e;
550
+ this._name = t.name, this._contextType = t.autoDetect !== !1 ? ye() : "unknown", this._config = {
551
+ name: t.name,
552
+ autoDetect: t.autoDetect ?? !0,
553
+ timeout: t.timeout ?? 3e4,
554
+ reflect: t.reflect ?? ot,
555
+ bufferSize: t.bufferSize ?? 100,
556
+ autoListen: t.autoListen ?? !0
557
+ }, this._config.autoListen && this._isWorkerContext() && this.listen(self);
558
+ }
559
+ connect(e, t = {}) {
560
+ const n = me(e), r = t.targetChannel ?? this._inferTargetChannel(e, n), s = this._createTransportBinding(e, n, r, t);
561
+ this._transports.set(r, s), this._defaultTransport || (this._defaultTransport = s);
562
+ const o = this._registerConnection({
563
+ localChannel: this._name,
564
+ remoteChannel: r,
565
+ sender: this._name,
566
+ transportType: n,
567
+ direction: "outgoing",
568
+ metadata: { phase: "connect" }
569
+ });
570
+ return this._emitConnectionSignal(s, "connect", {
571
+ connectionId: o.id,
572
+ from: this._name,
573
+ to: r
574
+ }), this;
575
+ }
576
+ listen(e, t = {}) {
577
+ const n = me(e), r = t.targetChannel ?? this._inferTargetChannel(e, n), s = (i) => this._handleIncoming(i), o = this._registerConnection({
578
+ localChannel: this._name,
579
+ remoteChannel: r,
580
+ sender: r,
581
+ transportType: n,
582
+ direction: "incoming",
583
+ metadata: { phase: "listen" }
584
+ });
585
+ switch (n) {
586
+ case "worker":
587
+ case "message-port":
588
+ case "broadcast":
589
+ t.autoStart !== !1 && e.start && e.start(), e.addEventListener?.("message", ((i) => s(i.data)));
590
+ break;
591
+ case "websocket":
592
+ e.addEventListener?.("message", ((i) => {
593
+ try {
594
+ s(JSON.parse(i.data));
595
+ } catch {}
596
+ }));
597
+ break;
598
+ case "chrome-runtime":
599
+ chrome.runtime.onMessage?.addListener?.((i, a, c) => (s(i), !0));
600
+ break;
601
+ case "chrome-tabs":
602
+ chrome.runtime.onMessage?.addListener?.((i, a) => t.tabId != null && a?.tab?.id !== t.tabId ? !1 : (s(i), !0));
603
+ break;
604
+ case "chrome-port":
605
+ e?.onMessage?.addListener?.((i) => {
606
+ s(i);
607
+ });
608
+ break;
609
+ case "chrome-external":
610
+ chrome.runtime.onMessageExternal?.addListener?.((i) => (s(i), !0));
611
+ break;
612
+ case "self":
613
+ addEventListener?.("message", ((i) => s(i.data)));
614
+ break;
615
+ default: t.onMessage && t.onMessage(s);
616
+ }
617
+ return this._sendSignalToTarget(e, n, {
618
+ connectionId: o.id,
619
+ from: this._name,
620
+ to: r,
621
+ tabId: t.tabId,
622
+ externalId: t.externalId
623
+ }, "notify"), this;
624
+ }
625
+ attach(e, t = {}) {
626
+ return this.connect(e, t);
627
+ }
628
+ expose(e, t) {
629
+ const n = [e];
630
+ return Y(n, t), this._exposed.set(e, {
631
+ name: e,
632
+ obj: t,
633
+ path: n
634
+ }), this;
635
+ }
636
+ exposeAll(e) {
637
+ for (const [t, n] of Object.entries(e)) this.expose(t, n);
638
+ return this;
639
+ }
640
+ async import(e, t) {
641
+ return this.invoke(t ?? this._getDefaultTarget(), h.IMPORT, [], [e]);
642
+ }
643
+ invoke(e, t, n, r = []) {
644
+ const s = d(), o = Promise.withResolvers();
645
+ this._pending.set(s, o);
646
+ const i = setTimeout(() => {
647
+ this._pending.has(s) && (this._pending.delete(s), o.reject(/* @__PURE__ */ new Error(`Request timeout: ${t} on ${n.join(".")}`)));
648
+ }, this._config.timeout), a = {
649
+ id: s,
650
+ channel: e,
651
+ sender: this._name,
652
+ type: "request",
653
+ payload: {
654
+ channel: e,
655
+ sender: this._name,
656
+ action: t,
657
+ path: n,
658
+ args: r
659
+ },
660
+ timestamp: Date.now()
661
+ };
662
+ return this._send(e, a), this._outbound.next(a), o.promise.finally(() => clearTimeout(i));
663
+ }
664
+ get(e, t, n) {
665
+ return this.invoke(e, h.GET, t, [n]);
666
+ }
667
+ set(e, t, n, r) {
668
+ return this.invoke(e, h.SET, t, [n, r]);
669
+ }
670
+ call(e, t, n = []) {
671
+ return this.invoke(e, h.APPLY, t, [n]);
672
+ }
673
+ construct(e, t, n = []) {
674
+ return this.invoke(e, h.CONSTRUCT, t, [n]);
675
+ }
676
+ proxy(e, t = []) {
677
+ const n = e ?? this._getDefaultTarget();
678
+ return this._createProxy(n, t);
679
+ }
680
+ remote(e, t) {
681
+ return this.proxy(t, [e]);
682
+ }
683
+ wrapDescriptor(e, t) {
684
+ return ge(e, (r, s, o) => {
685
+ const i = t ?? e?.channel ?? this._getDefaultTarget();
686
+ return this.invoke(i, r, s, o);
687
+ }, t ?? e?.channel ?? this._getDefaultTarget());
688
+ }
689
+ subscribe(e) {
690
+ return this._inbound.subscribe(e);
691
+ }
692
+ next(e) {
693
+ this._send(e.channel, e), this._outbound.next(e);
694
+ }
695
+ emit(e, t, n) {
696
+ const r = {
697
+ id: d(),
698
+ channel: e,
699
+ sender: this._name,
700
+ type: "event",
701
+ payload: {
702
+ type: t,
703
+ data: n
704
+ },
705
+ timestamp: Date.now()
706
+ };
707
+ this.next(r);
708
+ }
709
+ notify(e, t = {}, n = "notify") {
710
+ const r = this._transports.get(e);
711
+ return r ? (this._emitConnectionSignal(r, n, {
712
+ from: this._name,
713
+ to: e,
714
+ ...t
715
+ }), !0) : !1;
716
+ }
717
+ get onMessage() {
718
+ return this._inbound;
719
+ }
720
+ get onOutbound() {
721
+ return this._outbound;
722
+ }
723
+ get onInvocation() {
724
+ return this._invocations;
725
+ }
726
+ get onResponse() {
727
+ return this._responses;
728
+ }
729
+ get onConnection() {
730
+ return this._connectionEvents;
731
+ }
732
+ subscribeConnections(e) {
733
+ return this._connectionEvents.subscribe(e);
734
+ }
735
+ queryConnections(e = {}) {
736
+ return this._connectionRegistry.query(e);
737
+ }
738
+ notifyConnections(e = {}, t = {}) {
739
+ let n = 0;
740
+ const r = this.queryConnections({
741
+ ...t,
742
+ status: "active",
743
+ includeClosed: !1
744
+ });
745
+ for (const s of r) {
746
+ const o = this._transports.get(s.remoteChannel);
747
+ o && (this._emitConnectionSignal(o, "notify", {
748
+ connectionId: s.id,
749
+ from: this._name,
750
+ to: s.remoteChannel,
751
+ ...e
752
+ }), n++);
753
+ }
754
+ return n;
755
+ }
756
+ get name() {
757
+ return this._name;
758
+ }
759
+ get contextType() {
760
+ return this._contextType;
761
+ }
762
+ get config() {
763
+ return this._config;
764
+ }
765
+ get connectedChannels() {
766
+ return [...this._transports.keys()];
767
+ }
768
+ get exposedModules() {
769
+ return [...this._exposed.keys()];
770
+ }
771
+ close() {
772
+ this._subscriptions.forEach((e) => e.unsubscribe()), this._subscriptions = [], this._pending.clear(), this._markAllConnectionsClosed();
773
+ for (const e of this._transports.values()) {
774
+ try {
775
+ e.cleanup?.();
776
+ } catch {}
777
+ if (e.transportType === "message-port" || e.transportType === "broadcast") try {
778
+ e.target?.close?.();
779
+ } catch {}
780
+ }
781
+ this._transports.clear(), this._defaultTransport = null, this._connectionRegistry.clear(), this._inbound.complete(), this._outbound.complete(), this._invocations.complete(), this._responses.complete(), this._connectionEvents.complete();
782
+ }
783
+ _handleIncoming(e) {
784
+ if (!(!e || typeof e != "object")) switch (this._inbound.next(e), e.type) {
785
+ case "request":
786
+ e.channel === this._name && this._handleRequest(e);
787
+ break;
788
+ case "response":
789
+ this._handleResponse(e);
790
+ break;
791
+ case "event": break;
792
+ case "signal": this._handleSignal(e);
793
+ }
794
+ }
795
+ _handleResponse(e) {
796
+ const t = e.reqId ?? e.id, n = this._pending.get(t);
797
+ if (n) {
798
+ if (this._pending.delete(t), e.payload?.error) n.reject(new Error(e.payload.error));
799
+ else {
800
+ const r = e.payload?.result, s = e.payload?.descriptor;
801
+ r != null ? n.resolve(r) : s ? n.resolve(this.wrapDescriptor(s, e.sender)) : n.resolve(void 0);
802
+ }
803
+ this._responses.next({
804
+ id: t,
805
+ channel: e.channel,
806
+ sender: e.sender,
807
+ result: e.payload?.result,
808
+ descriptor: e.payload?.descriptor,
809
+ timestamp: Date.now()
810
+ });
811
+ }
812
+ }
813
+ async _handleRequest(e) {
814
+ const t = e.payload;
815
+ if (!t) return;
816
+ const { action: n, path: r, args: s, sender: o } = t, i = e.reqId ?? e.id;
817
+ this._invocations.next({
818
+ id: i,
819
+ channel: this._name,
820
+ sender: o,
821
+ action: n,
822
+ path: r,
823
+ args: s ?? [],
824
+ timestamp: Date.now(),
825
+ contextType: st(e)
826
+ });
827
+ const { result: a, toTransfer: c, newPath: l } = await this._executeAction(n, r, s ?? [], o);
828
+ await this._sendResponse(i, n, o, l, a, c);
829
+ }
830
+ async _executeAction(e, t, n, r) {
831
+ const { result: s, toTransfer: o, path: i } = Re(e, t, n, {
832
+ channel: this._name,
833
+ sender: r,
834
+ reflect: this._config.reflect
835
+ });
836
+ return {
837
+ result: await s,
838
+ toTransfer: o,
839
+ newPath: i
840
+ };
841
+ }
842
+ async _sendResponse(e, t, n, r, s, o) {
843
+ const { response: i, transfer: a } = await Ae(e, t, this._name, n, r, s, o), c = {
844
+ id: e,
845
+ ...i,
846
+ timestamp: Date.now(),
847
+ transferable: a
848
+ };
849
+ this._send(n, c, a);
850
+ }
851
+ _handleSignal(e) {
852
+ const t = e?.payload ?? {}, n = t.from ?? e.sender ?? "unknown", r = e.transportType ?? this._transports.get(e.channel)?.transportType ?? "internal", s = this._registerConnection({
853
+ localChannel: this._name,
854
+ remoteChannel: n,
855
+ sender: e.sender ?? n,
856
+ transportType: r,
857
+ direction: "incoming"
858
+ });
859
+ this._markConnectionNotified(s, t);
860
+ }
861
+ _registerConnection(e) {
862
+ return this._connectionRegistry.register(e);
863
+ }
864
+ _markConnectionNotified(e, t) {
865
+ this._connectionRegistry.markNotified(e, t);
866
+ }
867
+ _emitConnectionSignal(e, t, n = {}) {
868
+ const r = {
869
+ id: d(),
870
+ type: "signal",
871
+ channel: e.targetChannel,
872
+ sender: this._name,
873
+ transportType: e.transportType,
874
+ payload: {
875
+ type: t,
876
+ from: this._name,
877
+ to: e.targetChannel,
878
+ ...n
879
+ },
880
+ timestamp: Date.now()
881
+ };
882
+ (e?.sender ?? e?.postMessage)?.call(e, r);
883
+ const s = this._registerConnection({
884
+ localChannel: this._name,
885
+ remoteChannel: e.targetChannel,
886
+ sender: this._name,
887
+ transportType: e.transportType,
888
+ direction: "outgoing"
889
+ });
890
+ this._markConnectionNotified(s, r.payload);
891
+ }
892
+ _sendSignalToTarget(e, t, n, r) {
893
+ const s = {
894
+ id: d(),
895
+ type: "signal",
896
+ channel: n.to ?? this._name,
897
+ sender: this._name,
898
+ transportType: t,
899
+ payload: {
900
+ type: r,
901
+ ...n
902
+ },
903
+ timestamp: Date.now()
904
+ };
905
+ try {
906
+ if (t === "websocket") {
907
+ e?.send?.(JSON.stringify(s));
908
+ return;
909
+ }
910
+ if (t === "chrome-runtime") {
911
+ chrome.runtime?.sendMessage?.(s);
912
+ return;
913
+ }
914
+ if (t === "chrome-tabs") {
915
+ const o = n.tabId;
916
+ o != null && chrome.tabs?.sendMessage?.(o, s);
917
+ return;
918
+ }
919
+ if (t === "chrome-port") {
920
+ e?.postMessage?.(s);
921
+ return;
922
+ }
923
+ if (t === "chrome-external") {
924
+ n.externalId && chrome.runtime?.sendMessage?.(n.externalId, s);
925
+ return;
926
+ }
927
+ e?.postMessage?.(s, { transfer: [] });
928
+ } catch {}
929
+ }
930
+ _markAllConnectionsClosed() {
931
+ this._connectionRegistry.closeAll();
932
+ }
933
+ _createTransportBinding(e, t, n, r) {
934
+ let s, o;
935
+ switch (t) {
936
+ case "worker":
937
+ case "message-port":
938
+ case "broadcast":
939
+ r.autoStart !== !1 && e.start && e.start(), s = (i, a) => e.postMessage(i, { transfer: a });
940
+ {
941
+ const i = ((a) => this._handleIncoming(a.data));
942
+ e.addEventListener?.("message", i), o = () => e.removeEventListener?.("message", i);
943
+ }
944
+ break;
945
+ case "websocket":
946
+ s = (i) => e.send(JSON.stringify(i));
947
+ {
948
+ const i = ((a) => {
949
+ try {
950
+ this._handleIncoming(JSON.parse(a.data));
951
+ } catch {}
952
+ });
953
+ e.addEventListener?.("message", i), o = () => e.removeEventListener?.("message", i);
954
+ }
955
+ break;
956
+ case "chrome-runtime":
957
+ s = (i) => chrome.runtime.sendMessage(i);
958
+ {
959
+ const i = (a) => this._handleIncoming(a);
960
+ chrome.runtime.onMessage?.addListener?.(i), o = () => chrome.runtime.onMessage?.removeListener?.(i);
961
+ }
962
+ break;
963
+ case "chrome-tabs":
964
+ s = (i) => {
965
+ r.tabId != null && chrome.tabs?.sendMessage?.(r.tabId, i);
966
+ };
967
+ {
968
+ const i = (a, c) => r.tabId != null && c?.tab?.id !== r.tabId ? !1 : (this._handleIncoming(a), !0);
969
+ chrome.runtime.onMessage?.addListener?.(i), o = () => chrome.runtime.onMessage?.removeListener?.(i);
970
+ }
971
+ break;
972
+ case "chrome-port":
973
+ if (e?.postMessage && e?.onMessage?.addListener) {
974
+ s = (a) => e.postMessage(a);
975
+ const i = (a) => this._handleIncoming(a);
976
+ e.onMessage.addListener(i), o = () => {
977
+ try {
978
+ e.onMessage.removeListener(i);
979
+ } catch {}
980
+ try {
981
+ e.disconnect?.();
982
+ } catch {}
983
+ };
984
+ } else {
985
+ const i = r.portName ?? n, a = r.tabId != null && chrome.tabs?.connect ? chrome.tabs.connect(r.tabId, { name: i }) : chrome.runtime.connect({ name: i });
986
+ s = (l) => a.postMessage(l);
987
+ const c = (l) => this._handleIncoming(l);
988
+ a.onMessage.addListener(c), o = () => {
989
+ try {
990
+ a.onMessage.removeListener(c);
991
+ } catch {}
992
+ try {
993
+ a.disconnect();
994
+ } catch {}
995
+ };
996
+ }
997
+ break;
998
+ case "chrome-external":
999
+ s = (i) => {
1000
+ r.externalId && chrome.runtime.sendMessage(r.externalId, i);
1001
+ };
1002
+ {
1003
+ const i = (a) => (this._handleIncoming(a), !0);
1004
+ chrome.runtime.onMessageExternal?.addListener?.(i), o = () => chrome.runtime.onMessageExternal?.removeListener?.(i);
1005
+ }
1006
+ break;
1007
+ case "self":
1008
+ s = (i, a) => globalThis.postMessage?.(i, { transfer: a ?? [] });
1009
+ {
1010
+ const i = ((a) => this._handleIncoming(a.data));
1011
+ globalThis.addEventListener?.("message", i), o = () => globalThis.removeEventListener?.("message", i);
1012
+ }
1013
+ break;
1014
+ default: r.onMessage && (o = r.onMessage((i) => this._handleIncoming(i))), s = (i) => e?.postMessage?.(i);
1015
+ }
1016
+ return {
1017
+ target: e,
1018
+ targetChannel: n,
1019
+ transportType: t,
1020
+ sender: s,
1021
+ cleanup: o,
1022
+ postMessage: (i, a) => s?.(i, a),
1023
+ start: () => e?.start?.(),
1024
+ close: () => e?.close?.()
1025
+ };
1026
+ }
1027
+ _send(e, t, n) {
1028
+ const r = this._transports.get(e) ?? this._defaultTransport;
1029
+ (r?.sender ?? r?.postMessage)?.call(r, t, n);
1030
+ }
1031
+ _getDefaultTarget() {
1032
+ return this._defaultTransport ? this._defaultTransport.targetChannel : "worker";
1033
+ }
1034
+ _inferTargetChannel(e, t) {
1035
+ return t === "worker" ? "worker" : t === "broadcast" && e.name ? e.name : t === "self" ? "self" : `${t}-${d().slice(0, 8)}`;
1036
+ }
1037
+ _createProxy(e, t) {
1038
+ return z((r, s, o) => this.invoke(e, r, s, o), {
1039
+ channel: e,
1040
+ basePath: t,
1041
+ cache: !0,
1042
+ timeout: this._config.timeout
1043
+ });
1044
+ }
1045
+ _isWorkerContext() {
1046
+ return [
1047
+ "worker",
1048
+ "shared-worker",
1049
+ "service-worker"
1050
+ ].includes(this._contextType);
1051
+ }
1052
+ };
1053
+ function Z(e) {
1054
+ return new be(e);
1055
+ }
1056
+ let K = null;
1057
+ function pt() {
1058
+ if (!K) {
1059
+ const e = ye();
1060
+ [
1061
+ "worker",
1062
+ "shared-worker",
1063
+ "service-worker"
1064
+ ].includes(e) ? K = Z({
1065
+ name: "worker",
1066
+ autoListen: !0
1067
+ }) : K = Z({
1068
+ name: "host",
1069
+ autoListen: !1
1070
+ });
1071
+ }
1072
+ return K;
1073
+ }
1074
+ const g = {
1075
+ rjb: "rejectBy",
1076
+ rvb: "resolveBy",
1077
+ rj: "reject",
1078
+ rv: "resolve",
1079
+ cr: "create",
1080
+ cs: "createSync",
1081
+ a: "array",
1082
+ ta: "typedarray",
1083
+ udf: "undefined"
1084
+ };
1085
+ [
1086
+ typeof ArrayBuffer != g.udf ? ArrayBuffer : null,
1087
+ typeof MessagePort != g.udf ? MessagePort : null,
1088
+ typeof ReadableStream != g.udf ? ReadableStream : null,
1089
+ typeof WritableStream != g.udf ? WritableStream : null,
1090
+ typeof TransformStream != g.udf ? TransformStream : null,
1091
+ typeof WebTransportReceiveStream != g.udf ? WebTransportReceiveStream : null,
1092
+ typeof WebTransportSendStream != g.udf ? WebTransportSendStream : null,
1093
+ typeof AudioData != g.udf ? AudioData : null,
1094
+ typeof ImageBitmap != g.udf ? ImageBitmap : null,
1095
+ typeof VideoFrame != g.udf ? VideoFrame : null,
1096
+ typeof OffscreenCanvas != g.udf ? OffscreenCanvas : null,
1097
+ typeof RTCDataChannel != g.udf ? RTCDataChannel : null
1098
+ ].filter((e) => e != null);
1099
+ function Ce() {
1100
+ try {
1101
+ const e = globalThis.location?.href;
1102
+ if (typeof e == "string" && e.length > 0) return e;
1103
+ } catch {}
1104
+ try {
1105
+ if (typeof document < "u" && typeof document.baseURI == "string" && document.baseURI.length > 0) return document.baseURI;
1106
+ } catch {}
1107
+ return "";
1108
+ }
1109
+ function Se(e) {
1110
+ const t = Ce();
1111
+ if (!t.length) throw new TypeError("[uniform] No base URL for worker resolution (missing location / document.baseURI)");
1112
+ const n = e.startsWith("/") ? e.replace(/^\//, "./") : e;
1113
+ return new URL(n, t).href;
1114
+ }
1115
+ const w = {
1116
+ name: "unknown",
1117
+ instance: null
1118
+ }, ee = /* @__PURE__ */ new Map(), Pe = (e) => [...Object.values(h)].includes(e);
1119
+ var _t = class {
1120
+ channelName;
1121
+ options;
1122
+ _channel;
1123
+ constructor(e, t = {}) {
1124
+ this.channelName = e, this.options = t, this._channel = pt();
1125
+ }
1126
+ request(e, t, n, r = {}) {
1127
+ return typeof e == "string" && (e = [e]), Array.isArray(t) && Pe(e) && (r = n, n = t, t = e, e = []), this._channel.invoke(this.channelName, t, e, n);
1128
+ }
1129
+ doImportModule(e, t) {
1130
+ return this._channel.import(e, this.channelName);
1131
+ }
1132
+ }, yt = class {
1133
+ channel;
1134
+ options;
1135
+ _unified;
1136
+ broadcasts = {};
1137
+ constructor(e, t = {}) {
1138
+ this.channel = e, this.options = t, this._unified = Z({
1139
+ name: e,
1140
+ autoListen: !1
1141
+ }), w.name = e, w.instance = this;
1142
+ }
1143
+ createRemoteChannel(e, t = {}, n) {
1144
+ return n && (this._unified.attach(n, { targetChannel: e }), this.broadcasts[e] = n), Promise.resolve(new _t(e, t));
1145
+ }
1146
+ getChannel() {
1147
+ return this.channel;
1148
+ }
1149
+ request(e, t, n, r = {}, s = "worker") {
1150
+ return typeof e == "string" && (e = [e]), Array.isArray(t) && Pe(e) && (s = r, r = n, n = t, t = e, e = []), this._unified.invoke(s, t, e, n);
1151
+ }
1152
+ resolveResponse(e, t) {
1153
+ return Promise.resolve(t);
1154
+ }
1155
+ async handleAndResponse(e, t, n) {
1156
+ const r = await St(e, t, this.channel);
1157
+ r && n?.(r.response, r.transfer);
1158
+ }
1159
+ close() {
1160
+ this._unified.close();
1161
+ }
1162
+ };
1163
+ const mt = (e = "$host$") => {
1164
+ if (w?.instance && e === "$host$") return w.instance;
1165
+ if (ee.has(e)) return ee.get(e) ?? null;
1166
+ const t = new yt(e);
1167
+ return e === "$host$" && (w.name = e, w.instance = t), ee.set(e, t), t;
1168
+ }, xe = /* @__PURE__ */ new WeakMap(), te = /* @__PURE__ */ new WeakMap(), ke = /* @__PURE__ */ new WeakMap(), gt = (e, t = w?.name, n) => typeof e == "object" && e != null || typeof e == "function" && e != null ? te.has(e) ? te.get(e) : xe.has(e) ? xe.get(e) : X(e) || n?.includes?.(e) || t == w?.name ? e : {
1169
+ $isDescriptor: !0,
1170
+ path: A.get(e) ?? (() => {
1171
+ const r = [d()];
1172
+ return Y(r, e), r;
1173
+ })(),
1174
+ owner: w?.name,
1175
+ channel: t,
1176
+ primitive: b(e),
1177
+ writable: !0,
1178
+ enumerable: !0,
1179
+ configurable: !0,
1180
+ argumentCount: e instanceof Function ? e.length : -1
1181
+ } : x(e) ? e : null, wt = Symbol.for("@requestHandler"), q = Symbol.for("@descriptor"), ne = (e) => x(e) || e?.[q] ? e : e?.$isDescriptor ? ht(e, async () => {}) : X(e) ? e : null, G = /* @__PURE__ */ new Map(), A = /* @__PURE__ */ new WeakMap(), Ee = (e, t) => {
1182
+ if (t != null && !Array.isArray(t) && (t = [t]), t == null || t?.length < 1) return e;
1183
+ const n = e?.[q] ?? (e?.$isDescriptor ? e : null);
1184
+ if (n && n?.owner == w?.name && (e = I(n?.path) ?? e), b(e)) return e;
1185
+ for (const r of t) if (e = e?.[r], e == null) return e;
1186
+ return e;
1187
+ }, I = (e) => {
1188
+ if (e != null && !Array.isArray(e) && (e = [e]), e == null || e?.length < 1) return null;
1189
+ const t = G?.get?.(e?.[0]) ?? null;
1190
+ return t != null ? Ee(t, e?.slice?.(1)) : null;
1191
+ }, Y = (e, t) => {
1192
+ const n = t?.[q] ?? (t?.$isDescriptor ? t : null);
1193
+ if (n && n?.owner == w?.name && (t = I(n?.path) ?? t), e != null && !Array.isArray(e) && (e = [e]), e == null || e?.length < 1) return null;
1194
+ const r = G?.get?.(e?.[0]) ?? null;
1195
+ return e?.length > 1 ? Ee(r, e?.slice?.(1, -1))[e?.[e?.length - 1]] = t : G?.set?.(e?.[0], t), (typeof t == "object" || typeof t == "function") && A?.set?.(t, e), t;
1196
+ }, Te = (e) => (e != null && !Array.isArray(e) && (e = [e]), e == null || e?.length < 1 ? !1 : !(G?.get?.(e?.[0]) ?? null) && e?.length <= 1 ? (G?.delete?.(e?.[0]), !0) : !1), bt = (e) => {
1197
+ const t = e?.[q] ?? (e?.$isDescriptor ? e : null);
1198
+ t && t?.owner == w?.name && (e = I(t?.path) ?? e);
1199
+ const n = A?.get?.(e) ?? t?.path;
1200
+ return n == null || n?.length < 1 ? !1 : (Te(n), (typeof e == "object" || typeof e == "function") && A?.delete?.(e), !0);
1201
+ }, Ct = (e) => {
1202
+ const t = e?.[q] ?? (e?.$isDescriptor ? e : null);
1203
+ return (A?.get?.(e) ?? t?.path) == null;
1204
+ }, T = (e) => (typeof e == "object" || typeof e == "function") && e != null, ve = {
1205
+ get: (e, t) => e?.[t],
1206
+ set: (e, t, n) => (e[t] = n, !0),
1207
+ has: (e, t) => t in e,
1208
+ apply: (e, t, n) => e.apply(t, n),
1209
+ construct: (e, t) => new e(...t),
1210
+ deleteProperty: (e, t) => delete e[t],
1211
+ ownKeys: (e) => Object.keys(e),
1212
+ getOwnPropertyDescriptor: (e, t) => Object.getOwnPropertyDescriptor(e, t),
1213
+ getPrototypeOf: (e) => Object.getPrototypeOf(e),
1214
+ setPrototypeOf: (e, t) => Object.setPrototypeOf(e, t),
1215
+ isExtensible: (e) => Object.isExtensible(e),
1216
+ preventExtensions: (e) => Object.preventExtensions(e)
1217
+ };
1218
+ function Re(e, t, n, r = {}) {
1219
+ const { channel: s = "", sender: o = "", reflect: i = ve } = r, a = r.target ?? I(t), c = [];
1220
+ let l = null, _ = t;
1221
+ switch (String(e).toLowerCase()) {
1222
+ case "import":
1223
+ case h.IMPORT:
1224
+ l = import(n?.[0]);
1225
+ break;
1226
+ case "transfer":
1227
+ case h.TRANSFER:
1228
+ j(a) && s !== o && c.push(a), l = a;
1229
+ break;
1230
+ case "get":
1231
+ case h.GET: {
1232
+ const f = n?.[0], C = i.get?.(a, f) ?? a?.[f];
1233
+ l = typeof C == "function" && a != null ? C.bind(a) : C, _ = [...t, String(f)];
1234
+ break;
1235
+ }
1236
+ case "set":
1237
+ case h.SET: {
1238
+ const [f, C] = n, F = k(C, ne);
1239
+ r.target ? l = i.set?.(a, f, F) ?? (a[f] = F, !0) : l = i.set?.(a, f, F) ?? Y([...t, String(f)], F);
1240
+ break;
1241
+ }
1242
+ case "apply":
1243
+ case "call":
1244
+ case h.APPLY:
1245
+ case h.CALL:
1246
+ if (typeof a == "function") {
1247
+ const f = r.context ?? (r.target ? void 0 : I(t.slice(0, -1))), C = k(n?.[0] ?? n ?? [], ne);
1248
+ l = i.apply?.(a, f, C) ?? a.apply(f, C), j(l) && t?.at(-1) === "transfer" && s !== o && c.push(l);
1249
+ }
1250
+ break;
1251
+ case "construct":
1252
+ case h.CONSTRUCT:
1253
+ if (typeof a == "function") {
1254
+ const f = k(n?.[0] ?? n ?? [], ne);
1255
+ l = i.construct?.(a, f) ?? new a(...f);
1256
+ }
1257
+ break;
1258
+ case "delete":
1259
+ case "deleteproperty":
1260
+ case "dispose":
1261
+ case h.DELETE:
1262
+ case h.DELETE_PROPERTY:
1263
+ case h.DISPOSE:
1264
+ if (r.target) {
1265
+ const f = t[t.length - 1];
1266
+ l = i.deleteProperty?.(a, f) ?? delete a[f];
1267
+ } else l = t?.length > 0 ? Te(t) : bt(a), l && (_ = A.get(a) ?? []);
1268
+ break;
1269
+ case "has":
1270
+ case h.HAS:
1271
+ l = i.has?.(a, n?.[0]) ?? (T(a) ? n?.[0] in a : !1);
1272
+ break;
1273
+ case "ownkeys":
1274
+ case h.OWN_KEYS:
1275
+ l = i.ownKeys?.(a) ?? (T(a) ? Object.keys(a) : []);
1276
+ break;
1277
+ case "getownpropertydescriptor":
1278
+ case "getpropertydescriptor":
1279
+ case h.GET_OWN_PROPERTY_DESCRIPTOR:
1280
+ case h.GET_PROPERTY_DESCRIPTOR:
1281
+ l = i.getOwnPropertyDescriptor?.(a, n?.[0] ?? t?.at(-1) ?? "") ?? (T(a) ? Object.getOwnPropertyDescriptor(a, n?.[0] ?? t?.at(-1) ?? "") : void 0);
1282
+ break;
1283
+ case "getprototypeof":
1284
+ case h.GET_PROTOTYPE_OF:
1285
+ l = i.getPrototypeOf?.(a) ?? (T(a) ? Object.getPrototypeOf(a) : null);
1286
+ break;
1287
+ case "setprototypeof":
1288
+ case h.SET_PROTOTYPE_OF:
1289
+ l = i.setPrototypeOf?.(a, n?.[0]) ?? (T(a) ? Object.setPrototypeOf(a, n?.[0]) : !1);
1290
+ break;
1291
+ case "isextensible":
1292
+ case h.IS_EXTENSIBLE:
1293
+ l = i.isExtensible?.(a) ?? (T(a) ? Object.isExtensible(a) : !0);
1294
+ break;
1295
+ case "preventextensions":
1296
+ case h.PREVENT_EXTENSIONS: l = i.preventExtensions?.(a) ?? (T(a) ? Object.preventExtensions(a) : !1);
1297
+ }
1298
+ return {
1299
+ result: l,
1300
+ toTransfer: c,
1301
+ path: _
1302
+ };
1303
+ }
1304
+ async function Ae(e, t, n, r, s, o, i) {
1305
+ const a = await o, c = j(a) && i.includes(a) || x(a);
1306
+ let l = s;
1307
+ !c && t !== "get" && t !== h.GET && (typeof a == "object" || typeof a == "function") && (Ct(a) ? (l = [d()], Y(l, a)) : l = A.get(a) ?? []);
1308
+ const _ = I(l), f = t === "get" || t === h.GET ? l?.at(-1) : void 0, C = I(s), F = k(a, ($t) => gt($t, n, i)) ?? a;
1309
+ return {
1310
+ response: {
1311
+ channel: r,
1312
+ sender: n,
1313
+ reqId: e,
1314
+ action: t,
1315
+ type: "response",
1316
+ payload: {
1317
+ result: c ? F : null,
1318
+ type: typeof a,
1319
+ channel: r,
1320
+ sender: n,
1321
+ descriptor: {
1322
+ $isDescriptor: !0,
1323
+ path: l,
1324
+ owner: n,
1325
+ channel: n,
1326
+ primitive: b(a),
1327
+ writable: !0,
1328
+ enumerable: !0,
1329
+ configurable: !0,
1330
+ argumentCount: C instanceof Function ? C.length : -1,
1331
+ ...T(_) && f != null ? Object.getOwnPropertyDescriptor(_, f) : {}
1332
+ }
1333
+ }
1334
+ },
1335
+ transfer: i
1336
+ };
1337
+ }
1338
+ async function St(e, t, n, r) {
1339
+ const { channel: s, sender: o, path: i, action: a, args: c } = e;
1340
+ if (s !== n) return null;
1341
+ const { result: l, toTransfer: _, path: f } = Re(a, i, c, {
1342
+ channel: s,
1343
+ sender: o,
1344
+ ...r
1345
+ });
1346
+ return Ae(t, a, n, o, f, l, _);
1347
+ }
1348
+ var xt = class {
1349
+ _name;
1350
+ _transportType;
1351
+ _id = d();
1352
+ _state = "disconnected";
1353
+ _inbound = new y({ bufferSize: 1e3 });
1354
+ _outbound = new y({ bufferSize: 1e3 });
1355
+ _stateChanges = new y();
1356
+ _connectedPeers = /* @__PURE__ */ new Map();
1357
+ _subs = [];
1358
+ _stats = {
1359
+ messagesSent: 0,
1360
+ messagesReceived: 0,
1361
+ bytesTransferred: 0,
1362
+ latencyMs: 0,
1363
+ uptime: 0,
1364
+ reconnectCount: 0
1365
+ };
1366
+ _startTime = 0;
1367
+ _pending = /* @__PURE__ */ new Map();
1368
+ _buffer = [];
1369
+ _opts;
1370
+ constructor(e, t = "internal", n = {}) {
1371
+ this._name = e, this._transportType = t, this._opts = {
1372
+ timeout: 3e4,
1373
+ autoReconnect: !0,
1374
+ reconnectInterval: 1e3,
1375
+ maxReconnectAttempts: 5,
1376
+ bufferMessages: !0,
1377
+ bufferSize: 1e3,
1378
+ metadata: {},
1379
+ ...n
1380
+ }, this._setupSubscriptions();
1381
+ }
1382
+ subscribe(e, t) {
1383
+ return (t ? rt((n) => n.sender === t)(this._inbound) : this._inbound).subscribe(typeof e == "function" ? { next: e } : e);
1384
+ }
1385
+ next(e) {
1386
+ if (this._state !== "connected") {
1387
+ this._opts.bufferMessages && this._buffer.length < this._opts.bufferSize && this._buffer.push(e);
1388
+ return;
1389
+ }
1390
+ this._outbound.next(e), this._stats.messagesSent++;
1391
+ }
1392
+ async request(e, t, n = {}) {
1393
+ const r = d(), s = Promise.withResolvers();
1394
+ this._pending.set(r, s);
1395
+ const o = setTimeout(() => {
1396
+ this._pending.has(r) && (this._pending.delete(r), s.reject(/* @__PURE__ */ new Error("Request timeout")));
1397
+ }, n.timeout ?? this._opts.timeout);
1398
+ return this.next({
1399
+ id: d(),
1400
+ channel: e,
1401
+ sender: this._name,
1402
+ type: "request",
1403
+ reqId: r,
1404
+ payload: {
1405
+ ...t,
1406
+ action: n.action,
1407
+ path: n.path
1408
+ },
1409
+ timestamp: Date.now()
1410
+ }), s.promise.finally(() => clearTimeout(o));
1411
+ }
1412
+ respond(e, t) {
1413
+ this.next({
1414
+ id: d(),
1415
+ channel: e.sender,
1416
+ sender: this._name,
1417
+ type: "response",
1418
+ reqId: e.reqId,
1419
+ payload: t,
1420
+ timestamp: Date.now()
1421
+ });
1422
+ }
1423
+ emit(e, t, n) {
1424
+ this.next({
1425
+ id: d(),
1426
+ channel: e,
1427
+ sender: this._name,
1428
+ type: "event",
1429
+ payload: {
1430
+ type: t,
1431
+ data: n
1432
+ },
1433
+ timestamp: Date.now()
1434
+ });
1435
+ }
1436
+ subscribeOutbound(e) {
1437
+ return this._outbound.subscribe(typeof e == "function" ? { next: e } : e);
1438
+ }
1439
+ pushInbound(e) {
1440
+ if (this._stats.messagesReceived++, e.type === "response" && e.reqId) {
1441
+ const t = this._pending.get(e.reqId);
1442
+ if (t) {
1443
+ this._pending.delete(e.reqId), t.resolve(e.payload);
1444
+ return;
1445
+ }
1446
+ }
1447
+ this._inbound.next(e);
1448
+ }
1449
+ async connect() {
1450
+ this._state !== "connected" && (this._setState("connecting"), this._startTime = Date.now(), this._setState("connected"), this._flushBuffer());
1451
+ }
1452
+ disconnect() {
1453
+ this._state === "disconnected" || this._state === "closed" || (this._setState("disconnected"), this._subs.forEach((e) => e.unsubscribe()), this._subs = []);
1454
+ }
1455
+ close() {
1456
+ this.disconnect(), this._setState("closed"), this._inbound.complete(), this._outbound.complete(), this._stateChanges.complete();
1457
+ }
1458
+ markConnected() {
1459
+ this._setState("connected"), this._flushBuffer();
1460
+ }
1461
+ markDisconnected() {
1462
+ this._setState("disconnected");
1463
+ }
1464
+ _setState(e) {
1465
+ this._state !== e && (this._state = e, this._stateChanges.next(e));
1466
+ }
1467
+ _flushBuffer() {
1468
+ for (const e of this._buffer) this._outbound.next(e);
1469
+ this._buffer = [];
1470
+ }
1471
+ _setupSubscriptions() {
1472
+ this._subs.push(this._inbound.subscribe({ next: (e) => {
1473
+ e.type === "signal" && e.payload?.type === "connect" && this._connectedPeers.set(e.sender, {
1474
+ name: e.sender,
1475
+ state: "connected",
1476
+ isHost: !1
1477
+ });
1478
+ } }));
1479
+ }
1480
+ get id() {
1481
+ return this._id;
1482
+ }
1483
+ get name() {
1484
+ return this._name;
1485
+ }
1486
+ get state() {
1487
+ return this._state;
1488
+ }
1489
+ get transportType() {
1490
+ return this._transportType;
1491
+ }
1492
+ get stats() {
1493
+ return {
1494
+ ...this._stats,
1495
+ uptime: this._startTime ? Date.now() - this._startTime : 0
1496
+ };
1497
+ }
1498
+ get stateChanges() {
1499
+ return this._stateChanges;
1500
+ }
1501
+ get connectedPeers() {
1502
+ return [...this._connectedPeers.keys()];
1503
+ }
1504
+ get meta() {
1505
+ return {
1506
+ id: this._id,
1507
+ name: this._name,
1508
+ state: this._state,
1509
+ isHost: !1,
1510
+ connectedChannels: new Set(this._connectedPeers.keys())
1511
+ };
1512
+ }
1513
+ }, kt = class $ {
1514
+ _connections = /* @__PURE__ */ new Map();
1515
+ static _instance = null;
1516
+ static getInstance() {
1517
+ return $._instance || ($._instance = new $()), $._instance;
1518
+ }
1519
+ getOrCreate(t, n = "internal", r = {}) {
1520
+ return this._connections.has(t) || this._connections.set(t, new xt(t, n, r)), this._connections.get(t);
1521
+ }
1522
+ get(t) {
1523
+ return this._connections.get(t);
1524
+ }
1525
+ has(t) {
1526
+ return this._connections.has(t);
1527
+ }
1528
+ delete(t) {
1529
+ return this._connections.get(t)?.close(), this._connections.delete(t);
1530
+ }
1531
+ clear() {
1532
+ this._connections.forEach((t) => t.close()), this._connections.clear();
1533
+ }
1534
+ get size() {
1535
+ return this._connections.size;
1536
+ }
1537
+ get names() {
1538
+ return [...this._connections.keys()];
1539
+ }
1540
+ };
1541
+ const Ie = () => kt.getInstance(), Et = (e, t, n) => Ie().getOrCreate(e, t, n), Tt = "uniform_channels", vt = 1, u = {
1542
+ MESSAGES: "messages",
1543
+ MAILBOX: "mailbox",
1544
+ PENDING: "pending",
1545
+ EXCHANGE: "exchange",
1546
+ TRANSACTIONS: "transactions"
1547
+ };
1548
+ var Rt = class {
1549
+ _db = null;
1550
+ _isOpen = !1;
1551
+ _openPromise = null;
1552
+ _channelName;
1553
+ _messageUpdates = new y();
1554
+ _exchangeUpdates = new y();
1555
+ constructor(e) {
1556
+ this._channelName = e;
1557
+ }
1558
+ async open() {
1559
+ return this._db && this._isOpen ? this._db : this._openPromise ? this._openPromise : (this._openPromise = new Promise((e, t) => {
1560
+ const n = indexedDB.open(Tt, vt);
1561
+ n.onerror = () => {
1562
+ this._openPromise = null, t(/* @__PURE__ */ new Error("Failed to open IndexedDB"));
1563
+ }, n.onsuccess = () => {
1564
+ this._db = n.result, this._isOpen = !0, this._openPromise = null, e(this._db);
1565
+ }, n.onupgradeneeded = (r) => {
1566
+ const s = r.target.result;
1567
+ this._createStores(s);
1568
+ };
1569
+ }), this._openPromise);
1570
+ }
1571
+ close() {
1572
+ this._db && (this._db.close(), this._db = null, this._isOpen = !1);
1573
+ }
1574
+ _createStores(e) {
1575
+ if (!e.objectStoreNames.contains(u.MESSAGES)) {
1576
+ const t = e.createObjectStore(u.MESSAGES, { keyPath: "id" });
1577
+ t.createIndex("channel", "channel", { unique: !1 }), t.createIndex("status", "status", { unique: !1 }), t.createIndex("recipient", "recipient", { unique: !1 }), t.createIndex("createdAt", "createdAt", { unique: !1 }), t.createIndex("channel_status", ["channel", "status"], { unique: !1 });
1578
+ }
1579
+ if (!e.objectStoreNames.contains(u.MAILBOX)) {
1580
+ const t = e.createObjectStore(u.MAILBOX, { keyPath: "id" });
1581
+ t.createIndex("channel", "channel", { unique: !1 }), t.createIndex("priority", "priority", { unique: !1 }), t.createIndex("expiresAt", "expiresAt", { unique: !1 });
1582
+ }
1583
+ if (!e.objectStoreNames.contains(u.PENDING)) {
1584
+ const t = e.createObjectStore(u.PENDING, { keyPath: "id" });
1585
+ t.createIndex("channel", "channel", { unique: !1 }), t.createIndex("createdAt", "createdAt", { unique: !1 });
1586
+ }
1587
+ if (!e.objectStoreNames.contains(u.EXCHANGE)) {
1588
+ const t = e.createObjectStore(u.EXCHANGE, { keyPath: "id" });
1589
+ t.createIndex("key", "key", { unique: !0 }), t.createIndex("owner", "owner", { unique: !1 });
1590
+ }
1591
+ e.objectStoreNames.contains(u.TRANSACTIONS) || e.createObjectStore(u.TRANSACTIONS, { keyPath: "id" }).createIndex("createdAt", "createdAt", { unique: !1 });
1592
+ }
1593
+ async defer(e, t = {}) {
1594
+ const n = await this.open(), r = {
1595
+ id: d(),
1596
+ channel: e.channel,
1597
+ sender: e.sender ?? this._channelName,
1598
+ recipient: e.channel,
1599
+ type: e.type,
1600
+ payload: e.payload,
1601
+ status: "pending",
1602
+ priority: t.priority ?? 0,
1603
+ createdAt: Date.now(),
1604
+ updatedAt: Date.now(),
1605
+ expiresAt: t.expiresIn ? Date.now() + t.expiresIn : null,
1606
+ retryCount: 0,
1607
+ maxRetries: t.maxRetries ?? 3,
1608
+ metadata: t.metadata
1609
+ };
1610
+ return new Promise((s, o) => {
1611
+ const i = n.transaction([u.MESSAGES, u.MAILBOX], "readwrite"), a = i.objectStore(u.MESSAGES), c = i.objectStore(u.MAILBOX);
1612
+ a.add(r), c.add(r), i.oncomplete = () => {
1613
+ this._messageUpdates.next(r), s(r.id);
1614
+ }, i.onerror = () => o(/* @__PURE__ */ new Error("Failed to defer message"));
1615
+ });
1616
+ }
1617
+ async getDeferredMessages(e, t = {}) {
1618
+ const n = await this.open();
1619
+ return new Promise((r, s) => {
1620
+ const o = n.transaction(u.MESSAGES, "readonly").objectStore(u.MESSAGES), i = t.status ? o.index("channel_status") : o.index("channel"), a = t.status ? IDBKeyRange.only([e, t.status]) : IDBKeyRange.only(e), c = i.getAll(a, t.limit);
1621
+ c.onsuccess = () => {
1622
+ let l = c.result;
1623
+ t.offset && (l = l.slice(t.offset)), r(l);
1624
+ }, c.onerror = () => s(/* @__PURE__ */ new Error("Failed to get deferred messages"));
1625
+ });
1626
+ }
1627
+ async processNextPending(e) {
1628
+ const t = await this.open();
1629
+ return new Promise((n, r) => {
1630
+ const s = t.transaction(u.MESSAGES, "readwrite").objectStore(u.MESSAGES).index("channel_status").openCursor(IDBKeyRange.only([e, "pending"]));
1631
+ s.onsuccess = () => {
1632
+ const o = s.result;
1633
+ if (o) {
1634
+ const i = o.value;
1635
+ i.status = "processing", i.updatedAt = Date.now(), o.update(i), this._messageUpdates.next(i), n(i);
1636
+ } else n(null);
1637
+ }, s.onerror = () => r(/* @__PURE__ */ new Error("Failed to process pending message"));
1638
+ });
1639
+ }
1640
+ async markDelivered(e) {
1641
+ await this._updateMessageStatus(e, "delivered");
1642
+ }
1643
+ async markFailed(e) {
1644
+ const t = await this.open();
1645
+ return new Promise((n, r) => {
1646
+ const s = t.transaction(u.MESSAGES, "readwrite").objectStore(u.MESSAGES), o = s.get(e);
1647
+ o.onsuccess = () => {
1648
+ const i = o.result;
1649
+ if (!i) {
1650
+ n(!1);
1651
+ return;
1652
+ }
1653
+ i.retryCount++, i.updatedAt = Date.now(), i.retryCount < i.maxRetries ? i.status = "pending" : i.status = "failed", s.put(i), this._messageUpdates.next(i), n(i.status === "pending");
1654
+ }, o.onerror = () => r(/* @__PURE__ */ new Error("Failed to mark message as failed"));
1655
+ });
1656
+ }
1657
+ async _updateMessageStatus(e, t) {
1658
+ const n = await this.open();
1659
+ return new Promise((r, s) => {
1660
+ const o = n.transaction(u.MESSAGES, "readwrite").objectStore(u.MESSAGES), i = o.get(e);
1661
+ i.onsuccess = () => {
1662
+ const a = i.result;
1663
+ a && (a.status = t, a.updatedAt = Date.now(), o.put(a), this._messageUpdates.next(a)), r();
1664
+ }, i.onerror = () => s(/* @__PURE__ */ new Error("Failed to update message status"));
1665
+ });
1666
+ }
1667
+ async getMailbox(e, t = {}) {
1668
+ const n = await this.open();
1669
+ return new Promise((r, s) => {
1670
+ const o = n.transaction(u.MAILBOX, "readonly").objectStore(u.MAILBOX).index("channel").getAll(IDBKeyRange.only(e), t.limit);
1671
+ o.onsuccess = () => {
1672
+ let i = o.result;
1673
+ t.sortBy === "priority" ? i.sort((a, c) => c.priority - a.priority) : i.sort((a, c) => c.createdAt - a.createdAt), r(i);
1674
+ }, o.onerror = () => s(/* @__PURE__ */ new Error("Failed to get mailbox"));
1675
+ });
1676
+ }
1677
+ async getMailboxStats(e) {
1678
+ const t = await this.getDeferredMessages(e), n = {
1679
+ total: t.length,
1680
+ pending: 0,
1681
+ processing: 0,
1682
+ delivered: 0,
1683
+ failed: 0,
1684
+ expired: 0
1685
+ }, r = Date.now();
1686
+ for (const s of t) s.expiresAt && s.expiresAt < r ? n.expired++ : n[s.status]++;
1687
+ return n;
1688
+ }
1689
+ async clearMailbox(e) {
1690
+ const t = await this.open();
1691
+ return new Promise((n, r) => {
1692
+ const s = t.transaction(u.MAILBOX, "readwrite"), o = s.objectStore(u.MAILBOX).index("channel");
1693
+ let i = 0;
1694
+ const a = o.openCursor(IDBKeyRange.only(e));
1695
+ a.onsuccess = () => {
1696
+ const c = a.result;
1697
+ c && (c.delete(), i++, c.continue());
1698
+ }, s.oncomplete = () => n(i), s.onerror = () => r(/* @__PURE__ */ new Error("Failed to clear mailbox"));
1699
+ });
1700
+ }
1701
+ async registerPending(e) {
1702
+ const t = await this.open(), n = {
1703
+ id: d(),
1704
+ channel: this._channelName,
1705
+ type: e.type,
1706
+ data: e.data,
1707
+ metadata: e.metadata,
1708
+ createdAt: Date.now(),
1709
+ status: "pending"
1710
+ };
1711
+ return new Promise((r, s) => {
1712
+ const o = t.transaction(u.PENDING, "readwrite");
1713
+ o.objectStore(u.PENDING).add(n), o.oncomplete = () => r(n.id), o.onerror = () => s(/* @__PURE__ */ new Error("Failed to register pending operation"));
1714
+ });
1715
+ }
1716
+ async getPendingOperations() {
1717
+ const e = await this.open();
1718
+ return new Promise((t, n) => {
1719
+ const r = e.transaction(u.PENDING, "readonly").objectStore(u.PENDING).index("channel").getAll(IDBKeyRange.only(this._channelName));
1720
+ r.onsuccess = () => t(r.result), r.onerror = () => n(/* @__PURE__ */ new Error("Failed to get pending operations"));
1721
+ });
1722
+ }
1723
+ async completePending(e) {
1724
+ const t = await this.open();
1725
+ return new Promise((n, r) => {
1726
+ const s = t.transaction(u.PENDING, "readwrite");
1727
+ s.objectStore(u.PENDING).delete(e), s.oncomplete = () => n(), s.onerror = () => r(/* @__PURE__ */ new Error("Failed to complete pending operation"));
1728
+ });
1729
+ }
1730
+ async awaitPending(e, t = {}) {
1731
+ const n = t.timeout ?? 3e4, r = t.pollInterval ?? 100, s = Date.now();
1732
+ for (; Date.now() - s < n;) {
1733
+ const o = await this._getPendingById(e);
1734
+ if (!o) return null;
1735
+ if (o.status === "completed") return await this.completePending(e), o.result;
1736
+ await new Promise((i) => setTimeout(i, r));
1737
+ }
1738
+ throw new Error(`Pending operation ${e} timed out`);
1739
+ }
1740
+ async _getPendingById(e) {
1741
+ const t = await this.open();
1742
+ return new Promise((n, r) => {
1743
+ const s = t.transaction(u.PENDING, "readonly").objectStore(u.PENDING).get(e);
1744
+ s.onsuccess = () => n(s.result ?? null), s.onerror = () => r(/* @__PURE__ */ new Error("Failed to get pending operation"));
1745
+ });
1746
+ }
1747
+ async exchangePut(e, t, n = {}) {
1748
+ const r = await this.open(), s = {
1749
+ id: d(),
1750
+ key: e,
1751
+ value: t,
1752
+ owner: this._channelName,
1753
+ sharedWith: n.sharedWith ?? ["*"],
1754
+ version: 1,
1755
+ createdAt: Date.now(),
1756
+ updatedAt: Date.now()
1757
+ };
1758
+ return new Promise((o, i) => {
1759
+ const a = r.transaction(u.EXCHANGE, "readwrite"), c = a.objectStore(u.EXCHANGE), l = c.index("key").get(e);
1760
+ l.onsuccess = () => {
1761
+ const _ = l.result;
1762
+ _ && (s.id = _.id, s.version = _.version + 1, s.createdAt = _.createdAt), c.put(s);
1763
+ }, a.oncomplete = () => {
1764
+ this._exchangeUpdates.next(s), o(s.id);
1765
+ }, a.onerror = () => i(/* @__PURE__ */ new Error("Failed to put exchange data"));
1766
+ });
1767
+ }
1768
+ async exchangeGet(e) {
1769
+ const t = await this.open();
1770
+ return new Promise((n, r) => {
1771
+ const s = t.transaction(u.EXCHANGE, "readonly").objectStore(u.EXCHANGE).index("key").get(e);
1772
+ s.onsuccess = () => {
1773
+ const o = s.result;
1774
+ if (!o) {
1775
+ n(null);
1776
+ return;
1777
+ }
1778
+ if (!this._canAccessExchange(o)) {
1779
+ n(null);
1780
+ return;
1781
+ }
1782
+ n(o.value);
1783
+ }, s.onerror = () => r(/* @__PURE__ */ new Error("Failed to get exchange data"));
1784
+ });
1785
+ }
1786
+ async exchangeDelete(e) {
1787
+ const t = await this.open();
1788
+ return new Promise((n, r) => {
1789
+ const s = t.transaction(u.EXCHANGE, "readwrite"), o = s.objectStore(u.EXCHANGE), i = o.index("key").get(e);
1790
+ i.onsuccess = () => {
1791
+ const a = i.result;
1792
+ if (!a) {
1793
+ n(!1);
1794
+ return;
1795
+ }
1796
+ if (a.owner !== this._channelName) {
1797
+ n(!1);
1798
+ return;
1799
+ }
1800
+ o.delete(a.id);
1801
+ }, s.oncomplete = () => n(!0), s.onerror = () => r(/* @__PURE__ */ new Error("Failed to delete exchange data"));
1802
+ });
1803
+ }
1804
+ async exchangeLock(e, t = {}) {
1805
+ const n = await this.open(), r = t.timeout ?? 3e4;
1806
+ return new Promise((s, o) => {
1807
+ const i = n.transaction(u.EXCHANGE, "readwrite"), a = i.objectStore(u.EXCHANGE), c = a.index("key").get(e);
1808
+ c.onsuccess = () => {
1809
+ const l = c.result;
1810
+ if (!l) {
1811
+ s(!1);
1812
+ return;
1813
+ }
1814
+ if (l.lock && l.lock.holder !== this._channelName && l.lock.expiresAt > Date.now()) {
1815
+ s(!1);
1816
+ return;
1817
+ }
1818
+ l.lock = {
1819
+ holder: this._channelName,
1820
+ acquiredAt: Date.now(),
1821
+ expiresAt: Date.now() + r
1822
+ }, l.updatedAt = Date.now(), a.put(l);
1823
+ }, i.oncomplete = () => s(!0), i.onerror = () => o(/* @__PURE__ */ new Error("Failed to acquire lock"));
1824
+ });
1825
+ }
1826
+ async exchangeUnlock(e) {
1827
+ const t = await this.open();
1828
+ return new Promise((n, r) => {
1829
+ const s = t.transaction(u.EXCHANGE, "readwrite"), o = s.objectStore(u.EXCHANGE), i = o.index("key").get(e);
1830
+ i.onsuccess = () => {
1831
+ const a = i.result;
1832
+ a && a.lock?.holder === this._channelName && (delete a.lock, a.updatedAt = Date.now(), o.put(a));
1833
+ }, s.oncomplete = () => n(), s.onerror = () => r(/* @__PURE__ */ new Error("Failed to release lock"));
1834
+ });
1835
+ }
1836
+ _canAccessExchange(e) {
1837
+ return e.owner === this._channelName || e.sharedWith.includes("*") ? !0 : e.sharedWith.includes(this._channelName);
1838
+ }
1839
+ async beginTransaction() {
1840
+ return new At(this);
1841
+ }
1842
+ async executeTransaction(e) {
1843
+ const t = await this.open(), n = new Set(e.map((r) => r.store));
1844
+ return new Promise((r, s) => {
1845
+ const o = t.transaction(Array.from(n), "readwrite");
1846
+ for (const i of e) {
1847
+ const a = o.objectStore(i.store);
1848
+ switch (i.type) {
1849
+ case "put":
1850
+ i.value !== void 0 && a.put(i.value);
1851
+ break;
1852
+ case "delete":
1853
+ i.key !== void 0 && a.delete(i.key);
1854
+ break;
1855
+ case "update": if (i.key !== void 0) {
1856
+ const c = a.get(i.key);
1857
+ c.onsuccess = () => {
1858
+ c.result && i.value && a.put({
1859
+ ...c.result,
1860
+ ...i.value
1861
+ });
1862
+ };
1863
+ }
1864
+ }
1865
+ }
1866
+ o.oncomplete = () => r(), o.onerror = () => s(/* @__PURE__ */ new Error("Transaction failed"));
1867
+ });
1868
+ }
1869
+ onMessageUpdate(e) {
1870
+ return this._messageUpdates.subscribe({ next: e });
1871
+ }
1872
+ onExchangeUpdate(e) {
1873
+ return this._exchangeUpdates.subscribe({ next: e });
1874
+ }
1875
+ async cleanupExpired() {
1876
+ const e = await this.open(), t = Date.now();
1877
+ return new Promise((n, r) => {
1878
+ const s = e.transaction([u.MESSAGES, u.MAILBOX], "readwrite"), o = s.objectStore(u.MESSAGES), i = s.objectStore(u.MAILBOX);
1879
+ let a = 0;
1880
+ const c = o.openCursor();
1881
+ c.onsuccess = () => {
1882
+ const _ = c.result;
1883
+ if (_) {
1884
+ const f = _.value;
1885
+ f.expiresAt && f.expiresAt < t && (_.delete(), a++), _.continue();
1886
+ }
1887
+ };
1888
+ const l = i.openCursor();
1889
+ l.onsuccess = () => {
1890
+ const _ = l.result;
1891
+ if (_) {
1892
+ const f = _.value;
1893
+ f.expiresAt && f.expiresAt < t && (_.delete(), a++), _.continue();
1894
+ }
1895
+ }, s.oncomplete = () => n(a), s.onerror = () => r(/* @__PURE__ */ new Error("Failed to cleanup expired"));
1896
+ });
1897
+ }
1898
+ }, At = class {
1899
+ _storage;
1900
+ _operations = [];
1901
+ _isCommitted = !1;
1902
+ _isRolledBack = !1;
1903
+ constructor(e) {
1904
+ this._storage = e;
1905
+ }
1906
+ put(e, t) {
1907
+ return this._checkState(), this._operations.push({
1908
+ id: d(),
1909
+ type: "put",
1910
+ store: e,
1911
+ value: t,
1912
+ timestamp: Date.now()
1913
+ }), this;
1914
+ }
1915
+ delete(e, t) {
1916
+ return this._checkState(), this._operations.push({
1917
+ id: d(),
1918
+ type: "delete",
1919
+ store: e,
1920
+ key: t,
1921
+ timestamp: Date.now()
1922
+ }), this;
1923
+ }
1924
+ update(e, t, n) {
1925
+ return this._checkState(), this._operations.push({
1926
+ id: d(),
1927
+ type: "update",
1928
+ store: e,
1929
+ key: t,
1930
+ value: n,
1931
+ timestamp: Date.now()
1932
+ }), this;
1933
+ }
1934
+ async commit() {
1935
+ if (this._checkState(), this._operations.length === 0) {
1936
+ this._isCommitted = !0;
1937
+ return;
1938
+ }
1939
+ await this._storage.executeTransaction(this._operations), this._isCommitted = !0;
1940
+ }
1941
+ rollback() {
1942
+ this._operations = [], this._isRolledBack = !0;
1943
+ }
1944
+ get operationCount() {
1945
+ return this._operations.length;
1946
+ }
1947
+ _checkState() {
1948
+ if (this._isCommitted) throw new Error("Transaction already committed");
1949
+ if (this._isRolledBack) throw new Error("Transaction already rolled back");
1950
+ }
1951
+ };
1952
+ const re = /* @__PURE__ */ new Map();
1953
+ function It(e) {
1954
+ return re.has(e) || re.set(e, new Rt(e)), re.get(e);
1955
+ }
1956
+ const Oe = Ce(), Ot = Oe.length > 0 ? new URL("../transport/Worker.ts", Oe) : "";
1957
+ var Me = class {
1958
+ _channel;
1959
+ _context;
1960
+ _options;
1961
+ _connection;
1962
+ _storage;
1963
+ constructor(e, t, n = {}) {
1964
+ this._channel = e, this._context = t, this._options = n, this._connection = Et(e), this._storage = It(e);
1965
+ }
1966
+ async request(e, t, n, r = {}) {
1967
+ let s = typeof e == "string" ? [e] : e, o = t, i = n;
1968
+ return Array.isArray(t) && De(e) && (r = n, i = t, o = e, s = []), this._context.getHost()?.request(s, o, i, r, this._channel);
1969
+ }
1970
+ async doImportModule(e, t = {}) {
1971
+ return this.request([], h.IMPORT, [e], t);
1972
+ }
1973
+ async deferMessage(e, t = {}) {
1974
+ return this._storage.defer({
1975
+ channel: this._channel,
1976
+ sender: this._context.hostName,
1977
+ type: "request",
1978
+ payload: e
1979
+ }, t);
1980
+ }
1981
+ async getPendingMessages() {
1982
+ return this._storage.getDeferredMessages(this._channel, { status: "pending" });
1983
+ }
1984
+ get connection() {
1985
+ return this._connection;
1986
+ }
1987
+ get channelName() {
1988
+ return this._channel;
1989
+ }
1990
+ get context() {
1991
+ return this._context;
1992
+ }
1993
+ }, v = class {
1994
+ _channel;
1995
+ _context;
1996
+ _options;
1997
+ _connection;
1998
+ _unified;
1999
+ get _forResolves() {
2000
+ return this._unified.__getPrivate("_pending");
2001
+ }
2002
+ get _subscriptions() {
2003
+ return this._unified.__getPrivate("_subscriptions");
2004
+ }
2005
+ get _broadcasts() {
2006
+ return this._unified.__getPrivate("_transports");
2007
+ }
2008
+ constructor(e, t, n = {}) {
2009
+ this._channel = e, this._context = t, this._options = n, this._connection = Ie().getOrCreate(e, "internal", n), this._unified = new be({
2010
+ name: e,
2011
+ autoListen: !1,
2012
+ timeout: n?.timeout
2013
+ });
2014
+ }
2015
+ createRemoteChannel(e, t = {}, n) {
2016
+ const r = Dt(n ?? this._context.$createOrUseExistingRemote(e, t, n ?? null)?.messageChannel?.port1), s = Le(r?.target ?? r);
2017
+ return this._unified.listen(r?.target, { targetChannel: e }), r && (this._broadcasts?.set?.(e, r), s === "self" && typeof postMessage > "u" || this._unified.connect(r, { targetChannel: e }), this._context.$registerConnection({
2018
+ localChannel: this._channel,
2019
+ remoteChannel: e,
2020
+ sender: this._channel,
2021
+ direction: "outgoing",
2022
+ transportType: s
2023
+ }), this.notifyChannel(e, {
2024
+ contextId: this._context.id,
2025
+ contextName: this._context.hostName
2026
+ }, "connect")), new Me(e, this._context, t);
2027
+ }
2028
+ getChannel() {
2029
+ return this._channel;
2030
+ }
2031
+ get connection() {
2032
+ return this._connection;
2033
+ }
2034
+ request(e, t, n, r = {}, s = "worker") {
2035
+ let o = typeof e == "string" ? [e] : e, i = n;
2036
+ return Array.isArray(t) && De(e) && (s = r, r = n, i = t, t = e, o = []), this._unified.invoke(s, t, o ?? [], Array.isArray(i) ? i : [i]);
2037
+ }
2038
+ resolveResponse(e, t) {
2039
+ this._forResolves.get(e)?.resolve?.(t);
2040
+ const n = this._forResolves.get(e)?.promise;
2041
+ return this._forResolves.delete(e), n;
2042
+ }
2043
+ async handleAndResponse(e, t, n) {}
2044
+ notifyChannel(e, t = {}, n = "notify") {
2045
+ return this._unified.notify(e, {
2046
+ ...t,
2047
+ from: this._channel,
2048
+ to: e
2049
+ }, n);
2050
+ }
2051
+ getConnectedChannels() {
2052
+ return this._unified.connectedChannels;
2053
+ }
2054
+ close() {
2055
+ this._subscriptions.forEach((e) => e.unsubscribe()), this._forResolves.clear(), this._broadcasts?.values?.()?.forEach((e) => e.close?.()), this._broadcasts?.clear?.(), this._unified.close();
2056
+ }
2057
+ get unified() {
2058
+ return this._unified;
2059
+ }
2060
+ }, Mt = class {
2061
+ _options;
2062
+ _id = d();
2063
+ _hostName;
2064
+ _host = null;
2065
+ _endpoints = /* @__PURE__ */ new Map();
2066
+ _unifiedByChannel = /* @__PURE__ */ new Map();
2067
+ _unifiedConnectionSubs = /* @__PURE__ */ new Map();
2068
+ _remoteChannels = /* @__PURE__ */ new Map();
2069
+ _deferredChannels = /* @__PURE__ */ new Map();
2070
+ _connectionEvents = new y({ bufferSize: 200 });
2071
+ _connectionRegistry = new we(() => d(), (e) => this._emitConnectionEvent(e));
2072
+ _closed = !1;
2073
+ _globalSelf = null;
2074
+ constructor(e = {}) {
2075
+ this._options = e, this._hostName = e.name ?? `ctx-${this._id.slice(0, 8)}`, e.useGlobalSelf !== !1 && (this._globalSelf = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : null);
2076
+ }
2077
+ initHost(e) {
2078
+ if (this._host && !e) return this._host;
2079
+ const t = e ?? this._hostName;
2080
+ if (this._hostName = t, this._endpoints.has(t)) return this._host = this._endpoints.get(t).handler, this._host;
2081
+ this._host = new v(t, this, this._options.defaultOptions);
2082
+ const n = {
2083
+ name: t,
2084
+ handler: this._host,
2085
+ connection: this._host.connection,
2086
+ subscriptions: [],
2087
+ ready: Promise.resolve(null),
2088
+ unified: this._host.unified
2089
+ };
2090
+ return this._endpoints.set(t, n), this._registerUnifiedChannel(t, this._host.unified), this._host;
2091
+ }
2092
+ getHost() {
2093
+ return this._host ?? this.initHost();
2094
+ }
2095
+ get hostName() {
2096
+ return this._hostName;
2097
+ }
2098
+ get id() {
2099
+ return this._id;
2100
+ }
2101
+ get onConnection() {
2102
+ return this._connectionEvents;
2103
+ }
2104
+ subscribeConnections(e) {
2105
+ return this._connectionEvents.subscribe(e);
2106
+ }
2107
+ notifyConnections(e = {}, t = {}) {
2108
+ let n = 0;
2109
+ for (const r of this._endpoints.values()) {
2110
+ const s = r.handler.getConnectedChannels();
2111
+ for (const o of s) {
2112
+ if (t.localChannel && t.localChannel !== r.name || t.remoteChannel && t.remoteChannel !== o) continue;
2113
+ const i = this.queryConnections({
2114
+ localChannel: r.name,
2115
+ remoteChannel: o,
2116
+ status: "active"
2117
+ })[0];
2118
+ t.sender && i?.sender !== t.sender || t.transportType && i?.transportType !== t.transportType || t.channel && t.channel !== r.name && t.channel !== o || r.handler.notifyChannel(o, e, "notify") && n++;
2119
+ }
2120
+ }
2121
+ return n;
2122
+ }
2123
+ queryConnections(e = {}) {
2124
+ return this._connectionRegistry.query(e).map((t) => ({
2125
+ ...t,
2126
+ contextId: this._id
2127
+ }));
2128
+ }
2129
+ createChannel(e, t = {}) {
2130
+ if (this._endpoints.has(e)) return this._endpoints.get(e);
2131
+ const n = new v(e, this, {
2132
+ ...this._options.defaultOptions,
2133
+ ...t
2134
+ }), r = {
2135
+ name: e,
2136
+ handler: n,
2137
+ connection: n.connection,
2138
+ subscriptions: [],
2139
+ ready: Promise.resolve(null),
2140
+ unified: n.unified
2141
+ };
2142
+ return this._endpoints.set(e, r), this._registerUnifiedChannel(e, n.unified), r;
2143
+ }
2144
+ createChannels(e, t = {}) {
2145
+ const n = /* @__PURE__ */ new Map();
2146
+ for (const r of e) n.set(r, this.createChannel(r, t));
2147
+ return n;
2148
+ }
2149
+ getChannel(e) {
2150
+ return this._endpoints.get(e);
2151
+ }
2152
+ getOrCreateChannel(e, t = {}) {
2153
+ return this._endpoints.get(e) ?? this.createChannel(e, t);
2154
+ }
2155
+ hasChannel(e) {
2156
+ return this._endpoints.has(e);
2157
+ }
2158
+ getChannelNames() {
2159
+ return [...this._endpoints.keys()];
2160
+ }
2161
+ get size() {
2162
+ return this._endpoints.size;
2163
+ }
2164
+ defer(e, t) {
2165
+ this._deferredChannels.set(e, t);
2166
+ }
2167
+ async initDeferred(e) {
2168
+ const t = this._deferredChannels.get(e);
2169
+ if (!t) return null;
2170
+ const n = await t();
2171
+ return this._endpoints.set(e, n), this._deferredChannels.delete(e), n;
2172
+ }
2173
+ isDeferred(e) {
2174
+ return this._deferredChannels.has(e);
2175
+ }
2176
+ async getChannelAsync(e) {
2177
+ return this._endpoints.has(e) ? this._endpoints.get(e) : this._deferredChannels.has(e) ? this.initDeferred(e) : null;
2178
+ }
2179
+ async addWorker(e, t, n = {}) {
2180
+ const r = Be(t);
2181
+ if (!r) throw new Error(`Failed to create worker for channel: ${e}`);
2182
+ const s = new v(e, this, {
2183
+ ...this._options.defaultOptions,
2184
+ ...n
2185
+ }), o = s.createRemoteChannel(e, n, r), i = {
2186
+ name: e,
2187
+ handler: s,
2188
+ connection: s.connection,
2189
+ subscriptions: [],
2190
+ transportType: "worker",
2191
+ ready: Promise.resolve(o),
2192
+ unified: s.unified
2193
+ };
2194
+ return this._endpoints.set(e, i), this._registerUnifiedChannel(e, s.unified), this._remoteChannels.set(e, {
2195
+ channel: e,
2196
+ context: this,
2197
+ remote: Promise.resolve(o),
2198
+ transport: r,
2199
+ transportType: "worker"
2200
+ }), i;
2201
+ }
2202
+ async addPort(e, t, n = {}) {
2203
+ const r = new v(e, this, {
2204
+ ...this._options.defaultOptions,
2205
+ ...n
2206
+ });
2207
+ t.start?.();
2208
+ const s = r.createRemoteChannel(e, n, t), o = {
2209
+ name: e,
2210
+ handler: r,
2211
+ connection: r.connection,
2212
+ subscriptions: [],
2213
+ transportType: "message-port",
2214
+ ready: Promise.resolve(s),
2215
+ unified: r.unified
2216
+ };
2217
+ return this._endpoints.set(e, o), this._registerUnifiedChannel(e, r.unified), this._remoteChannels.set(e, {
2218
+ channel: e,
2219
+ context: this,
2220
+ remote: Promise.resolve(s),
2221
+ transport: t,
2222
+ transportType: "message-port"
2223
+ }), o;
2224
+ }
2225
+ async addBroadcast(e, t, n = {}) {
2226
+ const r = new BroadcastChannel(t ?? e), s = new v(e, this, {
2227
+ ...this._options.defaultOptions,
2228
+ ...n
2229
+ }), o = s.createRemoteChannel(e, n, r), i = {
2230
+ name: e,
2231
+ handler: s,
2232
+ connection: s.connection,
2233
+ subscriptions: [],
2234
+ transportType: "broadcast",
2235
+ ready: Promise.resolve(o),
2236
+ unified: s.unified
2237
+ };
2238
+ return this._endpoints.set(e, i), this._registerUnifiedChannel(e, s.unified), this._remoteChannels.set(e, {
2239
+ channel: e,
2240
+ context: this,
2241
+ remote: Promise.resolve(o),
2242
+ transport: r,
2243
+ transportType: "broadcast"
2244
+ }), i;
2245
+ }
2246
+ addSelfChannel(e, t = {}) {
2247
+ const n = new v(e, this, {
2248
+ ...this._options.defaultOptions,
2249
+ ...t
2250
+ }), r = this._globalSelf ?? (typeof self < "u" ? self : null), s = {
2251
+ name: e,
2252
+ handler: n,
2253
+ connection: n.connection,
2254
+ subscriptions: [],
2255
+ transportType: "self",
2256
+ ready: Promise.resolve(r ? n.createRemoteChannel(e, t, r) : null),
2257
+ unified: n.unified
2258
+ };
2259
+ return this._endpoints.set(e, s), this._registerUnifiedChannel(e, n.unified), s;
2260
+ }
2261
+ async addTransport(e, t) {
2262
+ const n = t.options ?? {};
2263
+ switch (t.type) {
2264
+ case "worker":
2265
+ if (!t.worker) throw new Error("Worker required for worker transport");
2266
+ return this.addWorker(e, t.worker, n);
2267
+ case "message-port":
2268
+ if (!t.port) throw new Error("Port required for message-port transport");
2269
+ return this.addPort(e, t.port, n);
2270
+ case "broadcast":
2271
+ const r = typeof t.broadcast == "string" ? t.broadcast : void 0;
2272
+ return this.addBroadcast(e, r, n);
2273
+ case "self": return this.addSelfChannel(e, n);
2274
+ default: return this.createChannel(e, n);
2275
+ }
2276
+ }
2277
+ createChannelPair(e, t, n = {}) {
2278
+ const r = new MessageChannel(), s = new v(e, this, {
2279
+ ...this._options.defaultOptions,
2280
+ ...n
2281
+ }), o = new v(t, this, {
2282
+ ...this._options.defaultOptions,
2283
+ ...n
2284
+ });
2285
+ r.port1.start(), r.port2.start();
2286
+ const i = Promise.resolve(s.createRemoteChannel(t, n, r.port1)), a = Promise.resolve(o.createRemoteChannel(e, n, r.port2)), c = {
2287
+ name: e,
2288
+ handler: s,
2289
+ connection: s.connection,
2290
+ subscriptions: [],
2291
+ transportType: "message-port",
2292
+ ready: i,
2293
+ unified: s.unified
2294
+ }, l = {
2295
+ name: t,
2296
+ handler: o,
2297
+ connection: o.connection,
2298
+ subscriptions: [],
2299
+ transportType: "message-port",
2300
+ ready: a,
2301
+ unified: o.unified
2302
+ };
2303
+ return this._endpoints.set(e, c), this._endpoints.set(t, l), this._registerUnifiedChannel(e, s.unified), this._registerUnifiedChannel(t, o.unified), {
2304
+ channel1: c,
2305
+ channel2: l,
2306
+ messageChannel: r
2307
+ };
2308
+ }
2309
+ get globalSelf() {
2310
+ return this._globalSelf;
2311
+ }
2312
+ async connectRemote(e, t = {}, n) {
2313
+ return this.initHost(), this._host.createRemoteChannel(e, t, n);
2314
+ }
2315
+ async importModuleInChannel(e, t, n = {}, r) {
2316
+ return (await this.connectRemote(e, n.channelOptions, r))?.doImportModule?.(t, n.importOptions);
2317
+ }
2318
+ $createOrUseExistingRemote(e, t = {}, n) {
2319
+ if (e == null || n) return null;
2320
+ if (this._remoteChannels.has(e)) return this._remoteChannels.get(e);
2321
+ const r = new MessageChannel(), s = E(new Promise((i) => {
2322
+ const a = Be(Ot);
2323
+ a?.addEventListener?.("message", (c) => {
2324
+ c.data.type === "channelCreated" && (r.port1?.start?.(), i(new Me(c.data.channel, this, t)));
2325
+ }), a?.postMessage?.({
2326
+ type: "createChannel",
2327
+ channel: e,
2328
+ sender: this._hostName,
2329
+ options: t,
2330
+ messagePort: r.port2
2331
+ }, { transfer: [r.port2] });
2332
+ })), o = {
2333
+ channel: e,
2334
+ context: this,
2335
+ messageChannel: r,
2336
+ remote: s
2337
+ };
2338
+ return this._remoteChannels.set(e, o), o;
2339
+ }
2340
+ $registerConnection(e) {
2341
+ return {
2342
+ ...this._connectionRegistry.register(e),
2343
+ contextId: this._id
2344
+ };
2345
+ }
2346
+ $markNotified(e) {
2347
+ const t = this._connectionRegistry.register({
2348
+ localChannel: e.localChannel,
2349
+ remoteChannel: e.remoteChannel,
2350
+ sender: e.sender,
2351
+ direction: e.direction,
2352
+ transportType: e.transportType
2353
+ });
2354
+ this._connectionRegistry.markNotified(t, e.payload);
2355
+ }
2356
+ $observeSignal(e) {
2357
+ const t = (e.payload?.type, "incoming");
2358
+ this.$markNotified({
2359
+ localChannel: e.localChannel,
2360
+ remoteChannel: e.remoteChannel,
2361
+ sender: e.sender,
2362
+ direction: t,
2363
+ transportType: e.transportType,
2364
+ payload: e.payload
2365
+ });
2366
+ }
2367
+ $forwardUnifiedConnectionEvent(e, t) {
2368
+ const n = t.connection.transportType ?? "internal", r = this._connectionRegistry.register({
2369
+ localChannel: t.connection.localChannel || e,
2370
+ remoteChannel: t.connection.remoteChannel,
2371
+ sender: t.connection.sender,
2372
+ direction: t.connection.direction,
2373
+ transportType: n,
2374
+ metadata: t.connection.metadata
2375
+ });
2376
+ t.type === "notified" ? this._connectionRegistry.markNotified(r, t.payload) : t.type === "disconnected" && this._connectionRegistry.closeByChannel(t.connection.localChannel);
2377
+ }
2378
+ closeChannel(e) {
2379
+ const t = this._endpoints.get(e);
2380
+ return t ? (t.subscriptions.forEach((n) => n.unsubscribe()), t.handler.close(), t.transport?.detach(), this._unifiedConnectionSubs.get(e)?.unsubscribe(), this._unifiedConnectionSubs.delete(e), this._unifiedByChannel.delete(e), this._endpoints.delete(e), e === this._hostName && (this._host = null), this._connectionRegistry.closeByChannel(e), !0) : !1;
2381
+ }
2382
+ close() {
2383
+ if (!this._closed) {
2384
+ this._closed = !0;
2385
+ for (const [e] of this._endpoints) this.closeChannel(e);
2386
+ this._remoteChannels.clear(), this._host = null, this._unifiedConnectionSubs.forEach((e) => e.unsubscribe()), this._unifiedConnectionSubs.clear(), this._unifiedByChannel.clear(), this._connectionRegistry.clear(), this._connectionEvents.complete();
2387
+ }
2388
+ }
2389
+ get closed() {
2390
+ return this._closed;
2391
+ }
2392
+ _registerUnifiedChannel(e, t) {
2393
+ this._unifiedByChannel.set(e, t), this._unifiedConnectionSubs.get(e)?.unsubscribe();
2394
+ const n = t.subscribeConnections((r) => {
2395
+ this.$forwardUnifiedConnectionEvent(e, r);
2396
+ });
2397
+ this._unifiedConnectionSubs.set(e, n);
2398
+ }
2399
+ _emitConnectionEvent(e) {
2400
+ this._connectionEvents.next({
2401
+ ...e,
2402
+ connection: {
2403
+ ...e.connection,
2404
+ contextId: this._id
2405
+ }
2406
+ });
2407
+ }
2408
+ };
2409
+ function De(e) {
2410
+ return [...Object.values(h)].includes(e);
2411
+ }
2412
+ function Dt(e) {
2413
+ if (!e) return null;
2414
+ if (Ne(e)) return e;
2415
+ const t = e, n = Le(t);
2416
+ return {
2417
+ target: t,
2418
+ targetChannel: "unknown",
2419
+ transportType: n === "internal" ? "self" : n,
2420
+ sender: (r, s) => {
2421
+ if (typeof WebSocket < "u" && t instanceof WebSocket) {
2422
+ t.send(JSON.stringify(r));
2423
+ return;
2424
+ }
2425
+ t.postMessage?.(r, s?.length ? { transfer: s } : void 0);
2426
+ },
2427
+ postMessage: (r, s) => {
2428
+ t.postMessage?.(r, s);
2429
+ },
2430
+ addEventListener: t.addEventListener?.bind(t),
2431
+ removeEventListener: t.removeEventListener?.bind(t),
2432
+ start: t.start?.bind(t),
2433
+ close: t.close?.bind(t)
2434
+ };
2435
+ }
2436
+ function Ne(e) {
2437
+ return !!e && typeof e == "object" && "target" in e && typeof e.postMessage == "function";
2438
+ }
2439
+ function Le(e) {
2440
+ const t = Ne(e) ? e.target : e;
2441
+ return t ? t === "chrome-runtime" ? "chrome-runtime" : t === "chrome-tabs" ? "chrome-tabs" : t === "chrome-port" ? "chrome-port" : t === "chrome-external" ? "chrome-external" : typeof MessagePort < "u" && t instanceof MessagePort ? "message-port" : typeof BroadcastChannel < "u" && t instanceof BroadcastChannel ? "broadcast" : typeof Worker < "u" && t instanceof Worker ? "worker" : typeof WebSocket < "u" && t instanceof WebSocket ? "websocket" : typeof chrome < "u" && typeof t == "object" && t && typeof t.postMessage == "function" && t.onMessage?.addListener ? "chrome-port" : typeof self < "u" && t === self ? "self" : "internal" : "internal";
2442
+ }
2443
+ function Be(e) {
2444
+ if (e instanceof Worker) return e;
2445
+ if (e instanceof URL) return new Worker(e.href, { type: "module" });
2446
+ if (typeof e == "function") try {
2447
+ return new e({ type: "module" });
2448
+ } catch {
2449
+ return e({ type: "module" });
2450
+ }
2451
+ return typeof e == "string" ? e.startsWith("/") ? new Worker(Se(e.replace(/^\//, "./")), { type: "module" }) : URL.canParse(e) || e.startsWith("./") ? new Worker(Se(e), { type: "module" }) : new Worker(URL.createObjectURL(new Blob([e], { type: "application/javascript" })), { type: "module" }) : e instanceof Blob || e instanceof File ? new Worker(URL.createObjectURL(e), { type: "module" }) : e ?? (typeof self < "u" ? self : null);
2452
+ }
2453
+ const Nt = /* @__PURE__ */ new Map();
2454
+ function Lt(e = {}) {
2455
+ const t = new Mt(e);
2456
+ return e.name && Nt.set(e.name, t), t;
2457
+ }
2458
+ var Bt = class {
2459
+ _context;
2460
+ _config;
2461
+ _subscriptions = [];
2462
+ _incomingConnections = new y({ bufferSize: 100 });
2463
+ _channelCreated = new y({ bufferSize: 100 });
2464
+ _channelClosed = new y();
2465
+ constructor(e = {}) {
2466
+ this._config = {
2467
+ name: e.name ?? "worker",
2468
+ workerName: e.workerName ?? `worker-${d().slice(0, 8)}`,
2469
+ autoAcceptChannels: e.autoAcceptChannels ?? !0,
2470
+ allowedChannels: e.allowedChannels ?? [],
2471
+ maxChannels: e.maxChannels ?? 100,
2472
+ autoConnect: e.autoConnect ?? !0,
2473
+ useGlobalSelf: !0,
2474
+ defaultOptions: e.defaultOptions ?? {},
2475
+ isolatedStorage: e.isolatedStorage ?? !1,
2476
+ ...e
2477
+ }, this._context = Lt({
2478
+ name: this._config.name,
2479
+ useGlobalSelf: !0,
2480
+ defaultOptions: e.defaultOptions
2481
+ }), this._setupMessageListener();
2482
+ }
2483
+ get onConnection() {
2484
+ return this._incomingConnections;
2485
+ }
2486
+ get onChannelCreated() {
2487
+ return this._channelCreated;
2488
+ }
2489
+ get onChannelClosed() {
2490
+ return this._channelClosed;
2491
+ }
2492
+ subscribeConnections(e) {
2493
+ return this._incomingConnections.subscribe(e);
2494
+ }
2495
+ subscribeChannelCreated(e) {
2496
+ return this._channelCreated.subscribe(e);
2497
+ }
2498
+ acceptConnection(e) {
2499
+ if (!this._canAcceptChannel(e.channel)) return null;
2500
+ const t = this._context.createChannel(e.channel, e.options);
2501
+ return e.port && (e.port.start?.(), t.handler.createRemoteChannel(e.sender, e.options, e.port)), this._channelCreated.next({
2502
+ channel: e.channel,
2503
+ endpoint: t,
2504
+ sender: e.sender,
2505
+ timestamp: Date.now()
2506
+ }), this._postChannelCreated(e.channel, e.sender, e.id), t;
2507
+ }
2508
+ createChannel(e, t) {
2509
+ return this._context.createChannel(e, t);
2510
+ }
2511
+ getChannel(e) {
2512
+ return this._context.getChannel(e);
2513
+ }
2514
+ hasChannel(e) {
2515
+ return this._context.hasChannel(e);
2516
+ }
2517
+ getChannelNames() {
2518
+ return this._context.getChannelNames();
2519
+ }
2520
+ queryConnections(e = {}) {
2521
+ return this._context.queryConnections(e);
2522
+ }
2523
+ notifyConnections(e = {}, t = {}) {
2524
+ return this._context.notifyConnections(e, t);
2525
+ }
2526
+ closeChannel(e) {
2527
+ const t = this._context.closeChannel(e);
2528
+ return t && this._channelClosed.next({
2529
+ channel: e,
2530
+ timestamp: Date.now()
2531
+ }), t;
2532
+ }
2533
+ get context() {
2534
+ return this._context;
2535
+ }
2536
+ get config() {
2537
+ return this._config;
2538
+ }
2539
+ _setupMessageListener() {
2540
+ addEventListener("message", ((e) => {
2541
+ this._handleIncomingMessage(e);
2542
+ }));
2543
+ }
2544
+ _handleIncomingMessage(e) {
2545
+ const t = e.data;
2546
+ if (!(!t || typeof t != "object")) switch (t.type) {
2547
+ case "createChannel":
2548
+ this._handleCreateChannel(t);
2549
+ break;
2550
+ case "connectChannel":
2551
+ this._handleConnectChannel(t);
2552
+ break;
2553
+ case "addPort":
2554
+ this._handleAddPort(t);
2555
+ break;
2556
+ case "listChannels":
2557
+ this._handleListChannels(t);
2558
+ break;
2559
+ case "closeChannel":
2560
+ this._handleCloseChannel(t);
2561
+ break;
2562
+ case "ping":
2563
+ postMessage({
2564
+ type: "pong",
2565
+ id: t.id,
2566
+ timestamp: Date.now()
2567
+ });
2568
+ break;
2569
+ default: t.channel && this._context.hasChannel(t.channel) && this._context.getChannel(t.channel)?.handler?.handleAndResponse?.(t.payload, t.reqId);
2570
+ }
2571
+ }
2572
+ _handleCreateChannel(e) {
2573
+ const t = {
2574
+ id: e.reqId ?? d(),
2575
+ channel: e.channel,
2576
+ sender: e.sender ?? "unknown",
2577
+ type: "channel",
2578
+ port: e.messagePort,
2579
+ timestamp: Date.now(),
2580
+ options: e.options
2581
+ };
2582
+ this._incomingConnections.next(t), this._config.autoAcceptChannels && this.acceptConnection(t);
2583
+ }
2584
+ _handleConnectChannel(e) {
2585
+ const t = {
2586
+ id: e.reqId ?? d(),
2587
+ channel: e.channel,
2588
+ sender: e.sender ?? "unknown",
2589
+ type: e.portType ?? "channel",
2590
+ port: e.port,
2591
+ timestamp: Date.now(),
2592
+ options: e.options
2593
+ };
2594
+ if (this._incomingConnections.next(t), this._config.autoAcceptChannels && this._canAcceptChannel(e.channel)) {
2595
+ const n = this._context.getOrCreateChannel(e.channel, e.options);
2596
+ e.port && (e.port.start?.(), n.handler.createRemoteChannel(e.sender, e.options, e.port)), postMessage({
2597
+ type: "channelConnected",
2598
+ channel: e.channel,
2599
+ reqId: e.reqId
2600
+ });
2601
+ }
2602
+ }
2603
+ _handleAddPort(e) {
2604
+ if (!e.port || !e.channel) return;
2605
+ const t = {
2606
+ id: e.reqId ?? d(),
2607
+ channel: e.channel,
2608
+ sender: e.sender ?? "unknown",
2609
+ type: "port",
2610
+ port: e.port,
2611
+ timestamp: Date.now(),
2612
+ options: e.options
2613
+ };
2614
+ this._incomingConnections.next(t), this._config.autoAcceptChannels && this.acceptConnection(t);
2615
+ }
2616
+ _handleListChannels(e) {
2617
+ postMessage({
2618
+ type: "channelList",
2619
+ channels: this.getChannelNames(),
2620
+ reqId: e.reqId
2621
+ });
2622
+ }
2623
+ _handleCloseChannel(e) {
2624
+ e.channel && (this.closeChannel(e.channel), postMessage({
2625
+ type: "channelClosed",
2626
+ channel: e.channel,
2627
+ reqId: e.reqId
2628
+ }));
2629
+ }
2630
+ _canAcceptChannel(e) {
2631
+ return this._context.size >= this._config.maxChannels ? !1 : this._config.allowedChannels.length > 0 ? this._config.allowedChannels.includes(e) : !0;
2632
+ }
2633
+ _postChannelCreated(e, t, n) {
2634
+ postMessage({
2635
+ type: "channelCreated",
2636
+ channel: e,
2637
+ sender: t,
2638
+ reqId: n,
2639
+ timestamp: Date.now()
2640
+ });
2641
+ }
2642
+ close() {
2643
+ this._subscriptions.forEach((e) => e.unsubscribe()), this._subscriptions = [], this._incomingConnections.complete(), this._channelCreated.complete(), this._channelClosed.complete(), this._context.close();
2644
+ }
2645
+ };
2646
+ let se = null;
2647
+ function qt(e) {
2648
+ return se || (se = new Bt(e)), se;
2649
+ }
2650
+ qt({ name: "worker" });
2651
+ var V = class {
2652
+ _channelName;
2653
+ _config;
2654
+ _port;
2655
+ _subs = /* @__PURE__ */ new Set();
2656
+ _pending = /* @__PURE__ */ new Map();
2657
+ _listening = !1;
2658
+ _cleanup = null;
2659
+ _portId = d();
2660
+ _state = new y();
2661
+ _keepAliveTimer = null;
2662
+ constructor(e, t, n = {}) {
2663
+ this._channelName = t, this._config = n, this._port = e, this._setupPort(), n.autoStart !== !1 && this.start();
2664
+ }
2665
+ _setupPort() {
2666
+ const e = (n) => {
2667
+ const r = n.data;
2668
+ if (r.type === "response" && r.reqId) {
2669
+ const s = this._pending.get(r.reqId);
2670
+ if (s) {
2671
+ this._pending.delete(r.reqId), r.payload?.error ? s.reject(new Error(r.payload.error)) : s.resolve(r.payload?.result ?? r.payload);
2672
+ return;
2673
+ }
2674
+ }
2675
+ if (r.type === "signal" && r.payload?.action === "ping") {
2676
+ this.send({
2677
+ id: d(),
2678
+ channel: this._channelName,
2679
+ sender: this._portId,
2680
+ type: "signal",
2681
+ payload: { action: "pong" }
2682
+ });
2683
+ return;
2684
+ }
2685
+ r.portId = r.portId ?? this._portId;
2686
+ for (const s of this._subs) try {
2687
+ s.next?.(r);
2688
+ } catch (o) {
2689
+ s.error?.(o);
2690
+ }
2691
+ }, t = () => {
2692
+ this._state.next("error");
2693
+ const n = /* @__PURE__ */ new Error("Port error");
2694
+ for (const r of this._subs) r.error?.(n);
2695
+ };
2696
+ this._port.addEventListener("message", e), this._port.addEventListener("messageerror", t), this._cleanup = () => {
2697
+ this._port.removeEventListener("message", e), this._port.removeEventListener("messageerror", t);
2698
+ };
2699
+ }
2700
+ start() {
2701
+ this._listening || (this._port.start(), this._listening = !0, this._state.next("ready"), this._config.keepAlive && this._startKeepAlive());
2702
+ }
2703
+ send(e, t) {
2704
+ const { transferable: n, ...r } = e;
2705
+ this._port.postMessage({
2706
+ ...r,
2707
+ portId: this._portId
2708
+ }, t ?? []);
2709
+ }
2710
+ request(e) {
2711
+ const t = e.reqId ?? d();
2712
+ return new Promise((n, r) => {
2713
+ const s = setTimeout(() => {
2714
+ this._pending.delete(t), r(/* @__PURE__ */ new Error("Request timeout"));
2715
+ }, this._config.timeout ?? 3e4);
2716
+ this._pending.set(t, {
2717
+ resolve: (o) => {
2718
+ clearTimeout(s), n(o);
2719
+ },
2720
+ reject: (o) => {
2721
+ clearTimeout(s), r(o);
2722
+ },
2723
+ timestamp: Date.now()
2724
+ }), this.send({
2725
+ ...e,
2726
+ reqId: t,
2727
+ type: "request"
2728
+ });
2729
+ });
2730
+ }
2731
+ subscribe(e) {
2732
+ const t = typeof e == "function" ? { next: e } : e;
2733
+ return this._subs.add(t), {
2734
+ closed: !1,
2735
+ unsubscribe: () => {
2736
+ this._subs.delete(t);
2737
+ }
2738
+ };
2739
+ }
2740
+ _startKeepAlive() {
2741
+ this._keepAliveTimer = setInterval(() => {
2742
+ this.send({
2743
+ id: d(),
2744
+ channel: this._channelName,
2745
+ sender: this._portId,
2746
+ type: "signal",
2747
+ payload: { action: "ping" }
2748
+ });
2749
+ }, this._config.keepAliveInterval ?? 3e4);
2750
+ }
2751
+ close() {
2752
+ this._keepAliveTimer && (clearInterval(this._keepAliveTimer), this._keepAliveTimer = null), this._cleanup?.(), this._subs.forEach((e) => e.complete?.()), this._subs.clear(), this._port.close(), this._state.next("closed");
2753
+ }
2754
+ get port() {
2755
+ return this._port;
2756
+ }
2757
+ get portId() {
2758
+ return this._portId;
2759
+ }
2760
+ get isListening() {
2761
+ return this._listening;
2762
+ }
2763
+ get state() {
2764
+ return this._state;
2765
+ }
2766
+ get channelName() {
2767
+ return this._channelName;
2768
+ }
2769
+ };
2770
+ function oe(e, t) {
2771
+ const n = new MessageChannel();
2772
+ return {
2773
+ local: new V(n.port1, e, t),
2774
+ remote: n.port2,
2775
+ transfer: () => n.port2
2776
+ };
2777
+ }
2778
+ var qe = class {
2779
+ _target;
2780
+ _channelName;
2781
+ _config;
2782
+ _transport = null;
2783
+ _state = new y();
2784
+ _handshakeComplete = !1;
2785
+ constructor(e, t, n = {}) {
2786
+ this._target = e, this._channelName = t, this._config = n;
2787
+ }
2788
+ async connect() {
2789
+ if (this._transport && this._handshakeComplete) return this._transport;
2790
+ this._state.next("connecting");
2791
+ const { local: e, remote: t } = oe(this._channelName, this._config);
2792
+ return this._target.postMessage({
2793
+ type: "port-connect",
2794
+ channelName: this._channelName,
2795
+ portId: e.portId
2796
+ }, this._config.targetOrigin ?? "*", [t]), new Promise((n, r) => {
2797
+ const s = setTimeout(() => {
2798
+ r(/* @__PURE__ */ new Error("Handshake timeout")), this._state.next("error");
2799
+ }, this._config.handshakeTimeout ?? 1e4), o = e.subscribe({ next: (i) => {
2800
+ i.type === "signal" && i.payload?.action === "handshake-ack" && (clearTimeout(s), this._handshakeComplete = !0, this._transport = e, this._state.next("connected"), o.unsubscribe(), n(e));
2801
+ } });
2802
+ });
2803
+ }
2804
+ static listen(e, t, n) {
2805
+ const r = (s) => {
2806
+ if (s.data?.type !== "port-connect" || s.data?.channelName !== e || !s.ports[0]) return;
2807
+ const o = new V(s.ports[0], e, n);
2808
+ o.send({
2809
+ id: d(),
2810
+ channel: e,
2811
+ sender: o.portId,
2812
+ type: "signal",
2813
+ payload: { action: "handshake-ack" }
2814
+ }), t(o);
2815
+ };
2816
+ return globalThis.addEventListener("message", r), () => globalThis.removeEventListener("message", r);
2817
+ }
2818
+ disconnect() {
2819
+ this._transport?.close(), this._transport = null, this._handshakeComplete = !1, this._state.next("disconnected");
2820
+ }
2821
+ get isConnected() {
2822
+ return this._handshakeComplete;
2823
+ }
2824
+ get state() {
2825
+ return this._state;
2826
+ }
2827
+ get transport() {
2828
+ return this._transport;
2829
+ }
2830
+ };
2831
+ qe.listen;
2832
+ const Fe = (e, t = "worker") => {
2833
+ const n = mt(t ?? "worker");
2834
+ return Object.keys(e).forEach((r) => {
2835
+ e[r];
2836
+ }), n;
2837
+ };
2838
+ var Ut = ze({
2839
+ getDirHandle: () => D,
2840
+ getFileSystemRoot: () => O,
2841
+ handlers: () => R,
2842
+ normalizePath: () => M,
2843
+ resolveFileSystemHandle: () => He
2844
+ }), U, W, O, M, He, D, R, Ge, N, Ue = $e((() => {
2845
+ U = /* @__PURE__ */ new Map(), W = /* @__PURE__ */ new Map(), O = async (e = "") => e && U.has(e) ? U.get(e) : await navigator.storage.getDirectory(), M = (e) => e?.trim?.()?.replace(/\/+/g, "/") || "/", He = async (e, t, n = !1) => {
2846
+ const r = M(t).split("/").filter((o) => o && o !== ".");
2847
+ let s = e;
2848
+ for (let o = 0; o < r.length; o++) {
2849
+ const i = r[o];
2850
+ if (o === r.length - 1) try {
2851
+ return await s.getDirectoryHandle(i, { create: n });
2852
+ } catch {
2853
+ try {
2854
+ return await s.getFileHandle(i, { create: n });
2855
+ } catch (a) {
2856
+ if (n) throw a;
2857
+ return null;
2858
+ }
2859
+ }
2860
+ else s = await s.getDirectoryHandle(i, { create: n });
2861
+ }
2862
+ return s;
2863
+ }, D = async (e, t, n) => {
2864
+ const r = M(t).split("/").filter((o) => o);
2865
+ let s = e;
2866
+ for (const o of r) s = await s.getDirectoryHandle(o, { create: n });
2867
+ return s;
2868
+ }, R = {
2869
+ mount: async ({ id: e, handle: t }) => (U.set(e, t), !0),
2870
+ unmount: async ({ id: e }) => (U.delete(e), !0),
2871
+ readDirectory: async ({ rootId: e, path: t, create: n }) => {
2872
+ try {
2873
+ const r = await O(e), s = await D(r, t, n), o = [];
2874
+ for await (const [i, a] of s.entries()) o.push([i, a]);
2875
+ return o;
2876
+ } catch (r) {
2877
+ return console.warn("Worker readDirectory error:", r), [];
2878
+ }
2879
+ },
2880
+ readFile: async ({ rootId: e, path: t, type: n }) => {
2881
+ try {
2882
+ const r = await O(e), s = M(t).split("/").filter((c) => c), o = s.pop(), i = s.join("/"), a = await (await (await D(r, i, !1)).getFileHandle(o, { create: !1 })).getFile();
2883
+ return n === "text" ? await a.text() : n === "arrayBuffer" ? await a.arrayBuffer() : a;
2884
+ } catch (r) {
2885
+ return console.warn("Worker readFile error:", r), null;
2886
+ }
2887
+ },
2888
+ writeFile: async ({ rootId: e, path: t, data: n }) => {
2889
+ try {
2890
+ const r = await O(e), s = M(t).split("/").filter((c) => c), o = s.pop(), i = s.join("/"), a = await (await (await D(r, i, !0)).getFileHandle(o, { create: !0 })).createWritable();
2891
+ return await a.write(n), await a.close(), !0;
2892
+ } catch (r) {
2893
+ return console.warn("Worker writeFile error:", r), !1;
2894
+ }
2895
+ },
2896
+ remove: async ({ rootId: e, path: t, recursive: n }) => {
2897
+ try {
2898
+ const r = await O(e), s = M(t).split("/").filter((a) => a), o = s.pop(), i = s.join("/");
2899
+ return await (await D(r, i, !1)).removeEntry(o, { recursive: n }), !0;
2900
+ } catch {
2901
+ return !1;
2902
+ }
2903
+ },
2904
+ observe: async ({ rootId: e, path: t, id: n }) => {
2905
+ try {
2906
+ if (W.has(n)) return !0;
2907
+ const r = await O(e), s = await D(r, t, !1);
2908
+ if (typeof FileSystemObserver < "u") {
2909
+ const o = new FileSystemObserver((i) => {
2910
+ const a = i.map((c) => {
2911
+ const l = c.changedHandle?.name || c.relativePathComponents?.at(-1);
2912
+ return {
2913
+ type: c.type,
2914
+ name: l,
2915
+ kind: c.changedHandle?.kind || (l?.includes(".") ? "file" : "directory"),
2916
+ handle: c.changedHandle,
2917
+ path: c.relativePathComponents.join("/")
2918
+ };
2919
+ });
2920
+ self.postMessage({
2921
+ type: "observation",
2922
+ id: n,
2923
+ changes: a
2924
+ });
2925
+ });
2926
+ return o.observe(s), W.set(n, o), !0;
2927
+ }
2928
+ return !1;
2929
+ } catch {
2930
+ return !1;
2931
+ }
2932
+ },
2933
+ unobserve: async ({ id: e }) => {
2934
+ const t = W.get(e);
2935
+ return t && (t.disconnect(), W.delete(e)), !0;
2936
+ },
2937
+ copy: async ({ from: e, to: t }) => {
2938
+ try {
2939
+ const n = async (r, s) => {
2940
+ if (r.kind === "directory") for await (const [o, i] of r.entries()) if (i.kind === "directory") {
2941
+ const a = await s.getDirectoryHandle(o, { create: !0 });
2942
+ await n(i, a);
2943
+ } else {
2944
+ const a = await i.getFile(), c = await (await s.getFileHandle(o, { create: !0 })).createWritable();
2945
+ await c.write(a), await c.close();
2946
+ }
2947
+ else {
2948
+ const o = await r.getFile(), i = await s.createWritable();
2949
+ await i.write(o), await i.close();
2950
+ }
2951
+ };
2952
+ return await n(e, t), !0;
2953
+ } catch (n) {
2954
+ return console.warn("Worker copy error:", n), !1;
2955
+ }
2956
+ }
2957
+ }, Ge = "opfs-sw-bridge-v1", N = null;
2958
+ try {
2959
+ typeof BroadcastChannel < "u" && (N = new BroadcastChannel(Ge), N.onmessage = async (e) => {
2960
+ const t = e?.data || {};
2961
+ if (!t || typeof t != "object" || t?.type !== "opfs-sw-request") return;
2962
+ const n = String(t?.requestId || ""), r = String(t?.action || ""), s = t?.payload;
2963
+ if (!n || !r) return;
2964
+ const o = R[r];
2965
+ if (!o) {
2966
+ N?.postMessage?.({
2967
+ type: "opfs-sw-response",
2968
+ requestId: n,
2969
+ ok: !1,
2970
+ error: `Unknown operation type: ${r}`
2971
+ });
2972
+ return;
2973
+ }
2974
+ try {
2975
+ const i = await o(s);
2976
+ N?.postMessage?.({
2977
+ type: "opfs-sw-response",
2978
+ requestId: n,
2979
+ ok: !0,
2980
+ result: i
2981
+ });
2982
+ } catch (i) {
2983
+ N?.postMessage?.({
2984
+ type: "opfs-sw-response",
2985
+ requestId: n,
2986
+ ok: !1,
2987
+ error: i?.message || String(i)
2988
+ });
2989
+ }
2990
+ });
2991
+ } catch {
2992
+ N = null;
2993
+ }
2994
+ self.addEventListener("message", async (e) => {
2995
+ if (!e.data || typeof e.data != "object") return;
2996
+ const { id: t, type: n, payload: r } = e.data;
2997
+ if (R[n]) try {
2998
+ const s = await R[n](r);
2999
+ self.postMessage({
3000
+ id: t,
3001
+ result: s
3002
+ });
3003
+ } catch (s) {
3004
+ self.postMessage({
3005
+ id: t,
3006
+ error: s?.message || String(s)
3007
+ });
3008
+ }
3009
+ else t && self.postMessage({
3010
+ id: t,
3011
+ error: `Unknown operation type: ${n}`
3012
+ });
3013
+ });
3014
+ }));
3015
+ Ue(), R && Fe(R);
3016
+ const Wt = async (e) => {
3017
+ try {
3018
+ if (e.type === "batch") {
3019
+ const t = [];
3020
+ for (const n of e.payload) {
3021
+ const r = await We(n);
3022
+ t.push(r);
3023
+ }
3024
+ return t;
3025
+ } else return await We(e);
3026
+ } catch (t) {
3027
+ throw console.error("[OPFS Worker] Message processing error:", t), t;
3028
+ }
3029
+ }, We = async (e) => {
3030
+ const t = R[e.type];
3031
+ if (!t) throw new Error(`Unknown message type: ${e.type}`);
3032
+ return await t(e.payload);
3033
+ };
3034
+ globalThis.processMessage = Wt, (async () => {
3035
+ try {
3036
+ const e = (await Promise.resolve().then(() => (Ue(), Ut))).handlers;
3037
+ e && Fe(e), console.log("[OPFS Worker] Initialized with handlers:", Object.keys(e || {}));
3038
+ } catch (e) {
3039
+ console.error("[OPFS Worker] Failed to initialize:", e);
3040
+ }
3041
+ })();
3042
+ })();
3043
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXNzZXRzL09QRlMudW5pZm9ybS53b3JrZXItIX57MDAwfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIihmdW5jdGlvbigpIHtcblxuLy8jcmVnaW9uIFxcMHJvbGxkb3duL3J1bnRpbWUuanNcblx0dmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblx0dmFyIF9fZXNtTWluID0gKGZuLCByZXMsIGVycikgPT4gKCkgPT4ge1xuXHRcdGlmIChlcnIpIHRocm93IGVyclswXTtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZuICYmIChyZXMgPSBmbihmbiA9IDApKSwgcmVzO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRocm93IGVyciA9IFtlXSwgZTtcblx0XHR9XG5cdH07XG5cdHZhciBfX2V4cG9ydEFsbCA9IChhbGwsIG5vX3N5bWJvbHMpID0+IHtcblx0XHRsZXQgdGFyZ2V0ID0ge307XG5cdFx0Zm9yICh2YXIgbmFtZSBpbiBhbGwpIHtcblx0XHRcdF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHtcblx0XHRcdFx0Z2V0OiBhbGxbbmFtZV0sXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWVcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoIW5vX3N5bWJvbHMpIHtcblx0XHRcdF9fZGVmUHJvcCh0YXJnZXQsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogXCJNb2R1bGVcIiB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vdW5pZm9ybS50cy9zcmMvbmV3ZXIvbmV4dC90eXBlcy9JbnRlcmZhY2UudHNcblx0bGV0IFdSZWZsZWN0QWN0aW9uID0gLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKFdSZWZsZWN0QWN0aW9uKSB7XG5cdFx0V1JlZmxlY3RBY3Rpb25bXCJHRVRcIl0gPSBcImdldFwiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiU0VUXCJdID0gXCJzZXRcIjtcblx0XHRXUmVmbGVjdEFjdGlvbltcIkNBTExcIl0gPSBcImNhbGxcIjtcblx0XHRXUmVmbGVjdEFjdGlvbltcIkFQUExZXCJdID0gXCJhcHBseVwiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiQ09OU1RSVUNUXCJdID0gXCJjb25zdHJ1Y3RcIjtcblx0XHRXUmVmbGVjdEFjdGlvbltcIkRFTEVURVwiXSA9IFwiZGVsZXRlXCI7XG5cdFx0V1JlZmxlY3RBY3Rpb25bXCJERUxFVEVfUFJPUEVSVFlcIl0gPSBcImRlbGV0ZVByb3BlcnR5XCI7XG5cdFx0V1JlZmxlY3RBY3Rpb25bXCJIQVNcIl0gPSBcImhhc1wiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiT1dOX0tFWVNcIl0gPSBcIm93bktleXNcIjtcblx0XHRXUmVmbGVjdEFjdGlvbltcIkdFVF9PV05fUFJPUEVSVFlfREVTQ1JJUFRPUlwiXSA9IFwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCI7XG5cdFx0V1JlZmxlY3RBY3Rpb25bXCJHRVRfUFJPUEVSVFlfREVTQ1JJUFRPUlwiXSA9IFwiZ2V0UHJvcGVydHlEZXNjcmlwdG9yXCI7XG5cdFx0V1JlZmxlY3RBY3Rpb25bXCJHRVRfUFJPVE9UWVBFX09GXCJdID0gXCJnZXRQcm90b3R5cGVPZlwiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiU0VUX1BST1RPVFlQRV9PRlwiXSA9IFwic2V0UHJvdG90eXBlT2ZcIjtcblx0XHRXUmVmbGVjdEFjdGlvbltcIklTX0VYVEVOU0lCTEVcIl0gPSBcImlzRXh0ZW5zaWJsZVwiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiUFJFVkVOVF9FWFRFTlNJT05TXCJdID0gXCJwcmV2ZW50RXh0ZW5zaW9uc1wiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiVFJBTlNGRVJcIl0gPSBcInRyYW5zZmVyXCI7XG5cdFx0V1JlZmxlY3RBY3Rpb25bXCJJTVBPUlRcIl0gPSBcImltcG9ydFwiO1xuXHRcdFdSZWZsZWN0QWN0aW9uW1wiRElTUE9TRVwiXSA9IFwiZGlzcG9zZVwiO1xuXHRcdHJldHVybiBXUmVmbGVjdEFjdGlvbjtcblx0fSh7fSk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uL3VuaWZvcm0udHMvc3JjL25ld2VyL2NvcmUvVHJhbnNwb3J0Q29yZS50c1xuXHRjb25zdCBUUkFOU1BPUlRfVFlQRV9BTElBU0VTID0ge1xuXHRcdFwid3NcIjogXCJ3ZWJzb2NrZXRcIixcblx0XHRcInNvY2tldFwiOiBcIndlYnNvY2tldFwiLFxuXHRcdFwic29ja2V0aW9cIjogXCJzb2NrZXQtaW9cIixcblx0XHRcInNlcnZpY2VcIjogXCJzZXJ2aWNlLXdvcmtlclwiLFxuXHRcdFwic3dcIjogXCJzZXJ2aWNlLXdvcmtlclwiLFxuXHRcdFwic2VydmljZS13b3JrZXItY2xpZW50XCI6IFwic2VydmljZS13b3JrZXJcIixcblx0XHRcInNlcnZpY2Utd29ya2VyLWhvc3RcIjogXCJzZXJ2aWNlLXdvcmtlclwiLFxuXHRcdFwicmluZy1idWZmZXJcIjogXCJhdG9taWNzXCJcblx0fTtcblx0ZnVuY3Rpb24gbm9ybWFsaXplVHJhbnNwb3J0VHlwZUFsaWFzKHRyYW5zcG9ydCkge1xuXHRcdGNvbnN0IHJhdyA9IFN0cmluZyh0cmFuc3BvcnQgPz8gXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKCFyYXcpIHJldHVybiBcImludGVybmFsXCI7XG5cdFx0cmV0dXJuIFRSQU5TUE9SVF9UWVBFX0FMSUFTRVNbcmF3XSA/PyByYXc7XG5cdH1cblx0ZnVuY3Rpb24gZGV0ZWN0VHJhbnNwb3J0VHlwZSQxKHRyYW5zcG9ydCkge1xuXHRcdGlmICh0eXBlb2YgdHJhbnNwb3J0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbm9ybWFsaXplVHJhbnNwb3J0VHlwZUFsaWFzKHRyYW5zcG9ydCk7XG5cdFx0aWYgKHR5cGVvZiBXb3JrZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHJhbnNwb3J0IGluc3RhbmNlb2YgV29ya2VyKSByZXR1cm4gXCJ3b3JrZXJcIjtcblx0XHRpZiAodHlwZW9mIFNoYXJlZFdvcmtlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBTaGFyZWRXb3JrZXIpIHJldHVybiBcInNoYXJlZC13b3JrZXJcIjtcblx0XHRpZiAodHlwZW9mIE1lc3NhZ2VQb3J0ICE9PSBcInVuZGVmaW5lZFwiICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIE1lc3NhZ2VQb3J0KSByZXR1cm4gXCJtZXNzYWdlLXBvcnRcIjtcblx0XHRpZiAodHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgIT09IFwidW5kZWZpbmVkXCIgJiYgdHJhbnNwb3J0IGluc3RhbmNlb2YgQnJvYWRjYXN0Q2hhbm5lbCkgcmV0dXJuIFwiYnJvYWRjYXN0XCI7XG5cdFx0aWYgKHR5cGVvZiBXZWJTb2NrZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgdHJhbnNwb3J0IGluc3RhbmNlb2YgV2ViU29ja2V0KSByZXR1cm4gXCJ3ZWJzb2NrZXRcIjtcblx0XHRpZiAodHlwZW9mIFJUQ0RhdGFDaGFubmVsICE9PSBcInVuZGVmaW5lZFwiICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIFJUQ0RhdGFDaGFubmVsKSByZXR1cm4gXCJydGMtZGF0YVwiO1xuXHRcdGlmICh0eXBlb2YgY2hyb21lICE9PSBcInVuZGVmaW5lZFwiICYmIHRyYW5zcG9ydCAmJiB0eXBlb2YgdHJhbnNwb3J0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB0cmFuc3BvcnQucG9zdE1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0cmFuc3BvcnQub25NZXNzYWdlPy5hZGRMaXN0ZW5lcikgcmV0dXJuIFwiY2hyb21lLXBvcnRcIjtcblx0XHRyZXR1cm4gXCJpbnRlcm5hbFwiO1xuXHR9XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uL2NvcmUudHMvc3JjL3V0aWxzL1ByaW1pdGl2ZS50c1xuXHRjb25zdCAkZnh5ID0gU3ltYm9sLmZvcihcIkBmaXhcIik7XG5cdC8qKlxuXHQqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBwcmltaXRpdmUgdHlwZSAobnVsbCwgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIGJpZ2ludCwgb3IgdW5kZWZpbmVkKS5cblx0KiBAcGFyYW0gb2JqIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG5cdCogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwcmltaXRpdmUgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCovXG5cdGNvbnN0IGlzUHJpbWl0aXZlID0gKG9iaikgPT4ge1xuXHRcdHJldHVybiB0eXBlb2Ygb2JqID09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG9iaiA9PSBcIm51bWJlclwiIHx8IHR5cGVvZiBvYmogPT0gXCJib29sZWFuXCIgfHwgdHlwZW9mIG9iaiA9PSBcImJpZ2ludFwiIHx8IHR5cGVvZiBvYmogPT0gXCJ1bmRlZmluZWRcIiB8fCBvYmogPT0gbnVsbDtcblx0fTtcblx0Y29uc3QgdHJ5UGFyc2VCeUhpbnQgPSAodmFsdWUsIGhpbnQpID0+IHtcblx0XHRpZiAoIWlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIG51bGw7XG5cdFx0aWYgKGhpbnQgPT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlcih2YWx1ZSkgfHwgMDtcblx0XHRpZiAoaGludCA9PSBcInN0cmluZ1wiKSByZXR1cm4gU3RyaW5nKHZhbHVlKSB8fCBcIlwiO1xuXHRcdGlmIChoaW50ID09IFwiYm9vbGVhblwiKSByZXR1cm4gISF2YWx1ZTtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH07XG5cdGNvbnN0IHVud3JhcCA9IChvYmosIGZhbGxiYWNrKSA9PiB7XG5cdFx0cmV0dXJuIG9iaj8uWyRmeHldID8/IChvYmogIT0gbnVsbCA/IG9iaiA6IGZhbGxiYWNrKSA/PyBmYWxsYmFjaztcblx0fTtcblx0Y29uc3QgZml4RnggPSAob2JqKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBvYmogPT0gXCJmdW5jdGlvblwiIHx8IG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuXHRcdGNvbnN0IGZ4ID0gZnVuY3Rpb24oKSB7fTtcblx0XHRmeFskZnh5XSA9IG9iajtcblx0XHRyZXR1cm4gZng7XG5cdH07XG5cdGNvbnN0IGdldFJhbmRvbVZhbHVlcyA9IChhcnJheSkgPT4ge1xuXHRcdHJldHVybiBjcnlwdG8/LmdldFJhbmRvbVZhbHVlcyA/IGNyeXB0bz8uZ2V0UmFuZG9tVmFsdWVzPy4oYXJyYXkpIDogKCgpID0+IHtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5Lmxlbmd0aCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB2YWx1ZXNbaV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpO1xuXHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHR9KSgpO1xuXHR9O1xuXHRjb25zdCBVVUlEdjQgPSAoKSA9PiBjcnlwdG8/LnJhbmRvbVVVSUQgPyBjcnlwdG8/LnJhbmRvbVVVSUQ/LigpIDogXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCAoYykgPT4gKCtjIF4gZ2V0UmFuZG9tVmFsdWVzPy4oLyogQF9fUFVSRV9fICovIG5ldyBVaW50OEFycmF5KDEpKT8uWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNikpO1xuXHRjb25zdCB1bndyYXBBcnJheSA9IChhcnIpID0+IHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyPy5mbGF0TWFwPy4oKGVsKSA9PiB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShlbCkpIHJldHVybiB1bndyYXBBcnJheShlbCk7XG5cdFx0XHRyZXR1cm4gZWw7XG5cdFx0fSk7XG5cdFx0ZWxzZSByZXR1cm4gYXJyO1xuXHR9O1xuXHRjb25zdCBpc05vdENvbXBsZXhBcnJheSA9IChhcnIpID0+IHtcblx0XHRyZXR1cm4gdW53cmFwQXJyYXkoYXJyKT8uZXZlcnk/Lihpc0Nhbkp1c3RSZXR1cm4pO1xuXHR9O1xuXHRjb25zdCBpc0Nhbkp1c3RSZXR1cm4gPSAob2JqKSA9PiB7XG5cdFx0cmV0dXJuIGlzUHJpbWl0aXZlKG9iaikgfHwgdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09IFwiZnVuY3Rpb25cIiAmJiBvYmogaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlciB8fCBpc1R5cGVkQXJyYXkob2JqKSB8fCBBcnJheS5pc0FycmF5KG9iaikgJiYgaXNOb3RDb21wbGV4QXJyYXkob2JqKTtcblx0fTtcblx0Y29uc3QgaXNUeXBlZEFycmF5ID0gKHZhbHVlKSA9PiB7XG5cdFx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KTtcblx0fTtcblx0Y29uc3QgaXNDYW5UcmFuc2ZlciA9IChvYmopID0+IHtcblx0XHRyZXR1cm4gaXNQcmltaXRpdmUob2JqKSB8fCB0eXBlb2YgQXJyYXlCdWZmZXIgPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IHR5cGVvZiBNZXNzYWdlUG9ydCA9PSBcImZ1bmN0aW9uXCIgJiYgb2JqIGluc3RhbmNlb2YgTWVzc2FnZVBvcnQgfHwgdHlwZW9mIFJlYWRhYmxlU3RyZWFtID09IFwiZnVuY3Rpb25cIiAmJiBvYmogaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSB8fCB0eXBlb2YgV3JpdGFibGVTdHJlYW0gPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtIHx8IHR5cGVvZiBUcmFuc2Zvcm1TdHJlYW0gPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIFRyYW5zZm9ybVN0cmVhbSB8fCB0eXBlb2YgSW1hZ2VCaXRtYXAgPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIEltYWdlQml0bWFwIHx8IHR5cGVvZiBWaWRlb0ZyYW1lID09IFwiZnVuY3Rpb25cIiAmJiBvYmogaW5zdGFuY2VvZiBWaWRlb0ZyYW1lIHx8IHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcyB8fCB0eXBlb2YgUlRDRGF0YUNoYW5uZWwgPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIFJUQ0RhdGFDaGFubmVsIHx8IHR5cGVvZiBBdWRpb0RhdGEgPT0gXCJmdW5jdGlvblwiICYmIG9iaiBpbnN0YW5jZW9mIEF1ZGlvRGF0YSB8fCB0eXBlb2YgV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbSA9PSBcImZ1bmN0aW9uXCIgJiYgb2JqIGluc3RhbmNlb2YgV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbSB8fCB0eXBlb2YgV2ViVHJhbnNwb3J0U2VuZFN0cmVhbSA9PSBcImZ1bmN0aW9uXCIgJiYgb2JqIGluc3RhbmNlb2YgV2ViVHJhbnNwb3J0U2VuZFN0cmVhbSB8fCB0eXBlb2YgV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbSA9PSBcImZ1bmN0aW9uXCIgJiYgb2JqIGluc3RhbmNlb2YgV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbTtcblx0fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vY29yZS50cy9zcmMvdXRpbHMvUmVzb2x2ZWQudHNcblx0Y29uc3QgJHByb21pc2UgPSBTeW1ib2wuZm9yKFwiQHByb21pc2VcIik7XG5cdGNvbnN0IFNLSVBfS0VZUyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcblx0XHRTeW1ib2wuZm9yKFwiQGV4dHJhY3RcIiksXG5cdFx0U3ltYm9sLmZvcihcIkBvcmlnaW5cIiksXG5cdFx0U3ltYm9sLmZvcihcIkByZWdpc3RyeVwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQHZhbHVlXCIpLFxuXHRcdFN5bWJvbC5mb3IoXCJAcHJvbWlzZVwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQGJlaGF2aW9yXCIpLFxuXHRcdFN5bWJvbC5mb3IoXCJAdHJpZ2dlclwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQHN1YnNjcmliZVwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQHJlYWxQcm9wXCIpLFxuXHRcdFN5bWJvbC5mb3IoXCJAdHJpZ2dlci1sb2NrXCIpLFxuXHRcdFN5bWJvbC5mb3IoXCJAdHJpZ2dlci1sZXNzXCIpLFxuXHRcdFN5bWJvbC5mb3IoXCJAdHJpZ2dlci1jb250cm9sXCIpLFxuXHRcdFN5bWJvbC5mb3IoXCJAaXNOb3RFcXVhbFwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQGZpeFwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQHRhcmdldFwiKSxcblx0XHRTeW1ib2wuZm9yKFwiQHJlc29sdmVkXCIpXG5cdF0pO1xuXHRjb25zdCBpc1RoZW5hYmxlJDEgPSAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgdmFsdWU/LnRoZW4gPT0gXCJmdW5jdGlvblwiO1xuXHRjb25zdCBzZXR0bGVPbmUgPSAodmFsdWUpID0+IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbigodikgPT4gKHtcblx0XHRzdGF0dXM6IFwiZnVsZmlsbGVkXCIsXG5cdFx0dmFsdWU6IHZcblx0fSksIChyZWFzb24pID0+ICh7XG5cdFx0c3RhdHVzOiBcInJlamVjdGVkXCIsXG5cdFx0cmVhc29uXG5cdH0pKTtcblx0Y29uc3Qgb3duRW51bWVyYWJsZUtleXMgPSAob2JqKSA9PiBSZWZsZWN0Lm93bktleXMob2JqKS5maWx0ZXIoKGtleSkgPT4ge1xuXHRcdGlmIChTS0lQX0tFWVMuaGFzKGtleSkpIHJldHVybiBmYWxzZTtcblx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7XG5cdFx0cmV0dXJuIGRlc2MgIT09IHZvaWQgMCAmJiBkZXNjLmVudW1lcmFibGU7XG5cdH0pO1xuXHQvKiogVHJ1ZSB3aGVuIGEgdmFsdWUgKG9yIGEgbmVzdGVkIGVudW1lcmFibGUgZmllbGQpIHN0aWxsIG5lZWRzIGEgUHJvbWlzZSBjb21iaW5hdG9yLiAqL1xuXHRjb25zdCBoYXNQZW5kaW5nUHJvbWlzZXMgPSAodmFsdWUsIHNlZW4pID0+IHtcblx0XHRpZiAodmFsdWUgPT0gbnVsbCB8fCBpc1ByaW1pdGl2ZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0XHRpZiAoaXNUaGVuYWJsZSQxKHZhbHVlKSB8fCBpc1RoZW5hYmxlJDEodmFsdWU/LlskcHJvbWlzZV0pKSByZXR1cm4gdHJ1ZTtcblx0XHRpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRcdGNvbnN0IHNlZW5TZXQgPSBzZWVuID8/IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuXHRcdGlmIChzZWVuU2V0Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0XHRzZWVuU2V0LmFkZCh2YWx1ZSk7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gaGFzUGVuZGluZ1Byb21pc2VzKGl0ZW0sIHNlZW5TZXQpKTtcblx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHJldHVybiBbLi4udmFsdWUudmFsdWVzKCldLnNvbWUoKGl0ZW0pID0+IGhhc1BlbmRpbmdQcm9taXNlcyhpdGVtLCBzZWVuU2V0KSk7XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gWy4uLnZhbHVlLnZhbHVlcygpXS5zb21lKChpdGVtKSA9PiBoYXNQZW5kaW5nUHJvbWlzZXMoaXRlbSwgc2VlblNldCkpO1xuXHRcdHJldHVybiBvd25FbnVtZXJhYmxlS2V5cyh2YWx1ZSkuc29tZSgoa2V5KSA9PiBoYXNQZW5kaW5nUHJvbWlzZXModmFsdWVba2V5XSwgc2VlblNldCkpO1xuXHR9O1xuXHRmdW5jdGlvbiByZXNvbHZlZERlZXAodmFsdWUsIG1vZGUsIHNlZW4pIHtcblx0XHRpZiAodmFsdWUgPT0gbnVsbCB8fCBpc1ByaW1pdGl2ZSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09IFwic3ltYm9sXCIpIHJldHVybiB2YWx1ZTtcblx0XHRpZiAoaXNUaGVuYWJsZSQxKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXHRcdGNvbnN0IHNsb3QgPSB2YWx1ZT8uWyRwcm9taXNlXTtcblx0XHRpZiAoaXNUaGVuYWJsZSQxKHNsb3QpKSByZXR1cm4gc2xvdDtcblx0XHRpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbHVlO1xuXHRcdGlmIChzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblx0XHRzZWVuLmFkZCh2YWx1ZSk7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRjb25zdCBpdGVtcyA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gcmVzb2x2ZWREZWVwKGl0ZW0sIG1vZGUsIHNlZW4pKTtcblx0XHRcdHJldHVybiBtb2RlID09IFwic2V0dGxlZFwiID8gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKSA6IFByb21pc2UuYWxsKGl0ZW1zKTtcblx0XHR9XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG5cdFx0XHRjb25zdCBpdGVtcyA9IFsuLi52YWx1ZS52YWx1ZXMoKV0ubWFwKChpdGVtKSA9PiByZXNvbHZlZERlZXAoaXRlbSwgbW9kZSwgc2VlbikpO1xuXHRcdFx0cmV0dXJuIG1vZGUgPT0gXCJzZXR0bGVkXCIgPyBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpIDogUHJvbWlzZS5hbGwoaXRlbXMpO1xuXHRcdH1cblx0XHRjb25zdCByZWNvcmQgPSB7fTtcblx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdmFsdWUuZW50cmllcygpKSByZWNvcmRba2V5XSA9IHJlc29sdmVkRGVlcChpdGVtLCBtb2RlLCBzZWVuKTtcblx0XHRlbHNlIGZvciAoY29uc3Qga2V5IG9mIG93bkVudW1lcmFibGVLZXlzKHZhbHVlKSkgcmVjb3JkW2tleV0gPSByZXNvbHZlZERlZXAodmFsdWVba2V5XSwgbW9kZSwgc2Vlbik7XG5cdFx0cmV0dXJuIG1vZGUgPT0gXCJzZXR0bGVkXCIgPyBQcm9taXNlLmFsbFNldHRsZWRLZXllZChyZWNvcmQpIDogUHJvbWlzZS5hbGxLZXllZChyZWNvcmQpO1xuXHR9XG5cdC8qKlxuXHQqIEF3YWl0IGEgdmFsdWUgd2l0aCB0aGUgbWF0Y2hpbmcgUHJvbWlzZSBjb21iaW5hdG9yIChgYWxsYCAvIGBhbGxLZXllZGAgLyBzZXR0bGVkIHZhcmlhbnRzKS5cblx0KiBOZXN0ZWQgcmVjb3JkcywgYXJyYXlzLCBtYXBzLCBzZXRzLCBhbmQgYEBwcm9taXNlYCBzbG90cyBhcmUgd2Fsa2VkIG9uY2UuXG5cdCovXG5cdGZ1bmN0aW9uIHJlc29sdmVkKHZhbHVlLCBtb2RlID0gXCJhbGxcIikge1xuXHRcdGlmIChpc1RoZW5hYmxlJDEodmFsdWUpKSByZXR1cm4gbW9kZSA9PSBcInNldHRsZWRcIiA/IHNldHRsZU9uZSh2YWx1ZSkgOiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuXHRcdGNvbnN0IHNsb3QgPSB2YWx1ZT8uWyRwcm9taXNlXTtcblx0XHRpZiAoaXNUaGVuYWJsZSQxKHNsb3QpKSByZXR1cm4gbW9kZSA9PSBcInNldHRsZWRcIiA/IHNldHRsZU9uZShzbG90KSA6IFByb21pc2UucmVzb2x2ZShzbG90KTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc29sdmVkRGVlcCh2YWx1ZSwgbW9kZSwgLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkpKTtcblx0fVxuXHRyZXNvbHZlZC5hbGwgPSAodmFsdWUpID0+IHJlc29sdmVkKHZhbHVlLCBcImFsbFwiKTtcblx0cmVzb2x2ZWQuYWxsU2V0dGxlZCA9ICh2YWx1ZSkgPT4gcmVzb2x2ZWQodmFsdWUsIFwic2V0dGxlZFwiKTtcblx0cmVzb2x2ZWQuYWxsS2V5ZWQgPSAodmFsdWUpID0+IFByb21pc2UuYWxsS2V5ZWQodmFsdWUpO1xuXHRyZXNvbHZlZC5hbGxTZXR0bGVkS2V5ZWQgPSAodmFsdWUpID0+IFByb21pc2UuYWxsU2V0dGxlZEtleWVkKHZhbHVlKTtcblx0cmVzb2x2ZWQudHJ5ID0gKGNhbGxiYWNrT3JWYWx1ZSwgLi4uYXJncykgPT4gUHJvbWlzZS50cnkoY2FsbGJhY2tPclZhbHVlLCAuLi5hcmdzKS50aGVuKCh2YWx1ZSkgPT4gcmVzb2x2ZWQodmFsdWUsIFwiYWxsXCIpKTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vY29yZS50cy9zcmMvdXRpbHMvT2JqZWN0LnRzXG5cdGNvbnN0IGJvdW5kQ3R4U3ltYm9sID0gU3ltYm9sLmZvcihcIm9iamVjdC5ib3VuZEN0eFwiKTtcblx0Z2xvYmFsVGhpc1tib3VuZEN0eFN5bWJvbF0gPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXHRjb25zdCBib3VuZEN0eCA9IGdsb2JhbFRoaXNbYm91bmRDdHhTeW1ib2xdO1xuXHRjb25zdCBkZWVwT3BlcmF0ZUFuZENsb25lID0gKG9iaiwgb3BlcmF0aW9uLCAkcHJldikgPT4ge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcblx0XHRcdGlmIChvYmouZXZlcnkoaXNDYW5KdXN0UmV0dXJuKSkgcmV0dXJuIG9iai5tYXAob3BlcmF0aW9uKTtcblx0XHRcdHJldHVybiBvYmoubWFwKCh2YWx1ZSwgaW5kZXgpID0+IGRlZXBPcGVyYXRlQW5kQ2xvbmUodmFsdWUsIG9wZXJhdGlvbiwgW29iaiwgaW5kZXhdKSk7XG5cdFx0fVxuXHRcdGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcblx0XHRcdGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKG9iai5lbnRyaWVzKCkpO1xuXHRcdFx0aWYgKGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlKS5ldmVyeShpc0Nhbkp1c3RSZXR1cm4pKSByZXR1cm4gbmV3IE1hcChlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvcGVyYXRpb24odmFsdWUsIGtleSwgb2JqKV0pKTtcblx0XHRcdHJldHVybiBuZXcgTWFwKGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIGRlZXBPcGVyYXRlQW5kQ2xvbmUodmFsdWUsIG9wZXJhdGlvbiwgW29iaiwga2V5XSldKSk7XG5cdFx0fVxuXHRcdGlmIChvYmogaW5zdGFuY2VvZiBTZXQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKG9iai5lbnRyaWVzKCkpO1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUpO1xuXHRcdFx0aWYgKGVudHJpZXMuZXZlcnkoaXNDYW5KdXN0UmV0dXJuKSkgcmV0dXJuIG5ldyBTZXQodmFsdWVzLm1hcChvcGVyYXRpb24pKTtcblx0XHRcdHJldHVybiBuZXcgU2V0KHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBkZWVwT3BlcmF0ZUFuZENsb25lKHZhbHVlLCBvcGVyYXRpb24sIFtvYmosIHZhbHVlXSkpKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBvYmogPT0gXCJvYmplY3RcIiAmJiBvYmo/LmNvbnN0cnVjdG9yID09IE9iamVjdCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbShPYmplY3QuZW50cmllcyhvYmopKTtcblx0XHRcdGlmIChlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSkuZXZlcnkoaXNDYW5KdXN0UmV0dXJuKSkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvcGVyYXRpb24odmFsdWUsIGtleSwgb2JqKV0pKTtcblx0XHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgZGVlcE9wZXJhdGVBbmRDbG9uZSh2YWx1ZSwgb3BlcmF0aW9uLCBbb2JqLCBrZXldKV0pKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9wZXJhdGlvbihvYmosICRwcmV2Py5bMV0gPz8gXCJcIiwgJHByZXY/LlswXSA/PyBudWxsKTtcblx0fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vY29yZS50cy9zcmMvdXRpbHMvUHJvbWlzZWQudHNcblx0Y29uc3QgcmVzb2x2ZWRTeW1ib2wgPSBTeW1ib2wuZm9yKFwiQHJlc29sdmVkLXByb21pc2VcIik7XG5cdGNvbnN0IGhhbmRsZWRTeW1ib2wgPSBTeW1ib2wuZm9yKFwiQGhhbmRsZWQtcHJvbWlzZVwiKTtcblx0Z2xvYmFsVGhpc1tyZXNvbHZlZFN5bWJvbF0gPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXHRnbG9iYWxUaGlzW2hhbmRsZWRTeW1ib2xdID8/PSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblx0Y29uc3QgcmVzb2x2ZWRNYXAgPSBnbG9iYWxUaGlzW3Jlc29sdmVkU3ltYm9sXTtcblx0Y29uc3QgaGFuZGxlZE1hcCA9IGdsb2JhbFRoaXNbaGFuZGxlZFN5bWJvbF07XG5cdGNvbnN0ICRleHRyYWN0S2V5JCA9IFN5bWJvbC5mb3IoXCJAZXh0cmFjdFwiKTtcblx0Y29uc3QgaXNUaGVuYWJsZSA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHR5cGVvZiB2YWx1ZT8udGhlbiA9PSBcImZ1bmN0aW9uXCI7XG5cdGNvbnN0IGFjdFdpdGggPSAocHJvbWlzZU9yUGxhaW4sIGNiKSA9PiB7XG5cdFx0aWYgKGlzVGhlbmFibGUocHJvbWlzZU9yUGxhaW4pKSB7XG5cdFx0XHRpZiAocmVzb2x2ZWRNYXA/Lmhhcz8uKHByb21pc2VPclBsYWluKSkgcmV0dXJuIGNiKHJlc29sdmVkTWFwPy5nZXQ/Lihwcm9taXNlT3JQbGFpbikpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UudHJ5Py4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtID0gYXdhaXQgcHJvbWlzZU9yUGxhaW47XG5cdFx0XHRcdHJlc29sdmVkTWFwPy5zZXQ/Lihwcm9taXNlT3JQbGFpbiwgaXRlbSk7XG5cdFx0XHRcdHJldHVybiBpdGVtO1xuXHRcdFx0fSk/LnRoZW4/LihjYik7XG5cdFx0fVxuXHRcdHJldHVybiBjYihwcm9taXNlT3JQbGFpbik7XG5cdH07XG5cdHZhciBQcm9taXNlSGFuZGxlciA9IGNsYXNzIHtcblx0XHQjcmVzb2x2ZTtcblx0XHQjcmVqZWN0O1xuXHRcdGNvbnN0cnVjdG9yKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0dGhpcy4jcmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHR0aGlzLiNyZWplY3QgPSByZWplY3Q7XG5cdFx0fVxuXHRcdGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcikge1xuXHRcdFx0aWYgKHVud3JhcCh0YXJnZXQpIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wLCBkZXNjcmlwdG9yKTtcblx0XHRcdHJldHVybiBhY3RXaXRoKHVud3JhcCh0YXJnZXQpLCAob2JqKSA9PiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgZGVzY3JpcHRvcikpO1xuXHRcdH1cblx0XHRkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApIHtcblx0XHRcdGlmICh1bndyYXAodGFyZ2V0KSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcCk7XG5cdFx0XHRyZXR1cm4gYWN0V2l0aCh1bndyYXAodGFyZ2V0KSwgKG9iaikgPT4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShvYmosIHByb3ApKTtcblx0XHR9XG5cdFx0Z2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG5cdFx0XHRpZiAodW53cmFwKHRhcmdldCkgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuXHRcdFx0cmV0dXJuIGFjdFdpdGgodW53cmFwKHRhcmdldCksIChvYmopID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSk7XG5cdFx0fVxuXHRcdHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pIHtcblx0XHRcdGlmICh1bndyYXAodGFyZ2V0KSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pO1xuXHRcdFx0cmV0dXJuIGFjdFdpdGgodW53cmFwKHRhcmdldCksIChvYmopID0+IFJlZmxlY3Quc2V0UHJvdG90eXBlT2Yob2JqLCBwcm90bykpO1xuXHRcdH1cblx0XHRpc0V4dGVuc2libGUodGFyZ2V0KSB7XG5cdFx0XHRpZiAodW53cmFwKHRhcmdldCkgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5pc0V4dGVuc2libGUodGFyZ2V0KTtcblx0XHRcdHJldHVybiBhY3RXaXRoKHVud3JhcCh0YXJnZXQpLCAob2JqKSA9PiBSZWZsZWN0LmlzRXh0ZW5zaWJsZShvYmopKTtcblx0XHR9XG5cdFx0cHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7XG5cdFx0XHRpZiAodW53cmFwKHRhcmdldCkgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG5cdFx0XHRyZXR1cm4gYWN0V2l0aCh1bndyYXAodGFyZ2V0KSwgKG9iaikgPT4gUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhvYmopKTtcblx0XHR9XG5cdFx0b3duS2V5cyh0YXJnZXQpIHtcblx0XHRcdGNvbnN0IHV3cCA9IHVud3JhcCh0YXJnZXQpO1xuXHRcdFx0aWYgKHV3cCBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBPYmplY3Qua2V5cyh1d3ApO1xuXHRcdFx0cmV0dXJuIGFjdFdpdGgodXdwLCAob2JqKSA9PiB7XG5cdFx0XHRcdHJldHVybiAodHlwZW9mIG9iaiA9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT0gXCJmdW5jdGlvblwiKSAmJiBvYmogIT0gbnVsbCA/IE9iamVjdC5rZXlzKG9iaikgOiBbXTtcblx0XHRcdH0pID8/IFtdO1xuXHRcdH1cblx0XHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKSB7XG5cdFx0XHRpZiAodW53cmFwKHRhcmdldCkgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKTtcblx0XHRcdHJldHVybiBhY3RXaXRoKHVud3JhcCh0YXJnZXQpLCAob2JqKSA9PiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApKTtcblx0XHR9XG5cdFx0Y29uc3RydWN0KHRhcmdldCwgYXJncywgbmV3VGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gYWN0V2l0aCh1bndyYXAodGFyZ2V0KSwgKGN0KSA9PiBSZWZsZWN0LmNvbnN0cnVjdChjdCwgYXJncywgbmV3VGFyZ2V0KSk7XG5cdFx0fVxuXHRcdGhhcyh0YXJnZXQsIHByb3ApIHtcblx0XHRcdGlmICh1bndyYXAodGFyZ2V0KSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuXHRcdFx0cmV0dXJuIGFjdFdpdGgodW53cmFwKHRhcmdldCksIChvYmopID0+IFJlZmxlY3QuaGFzKG9iaiwgcHJvcCkpO1xuXHRcdH1cblx0XHRnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuXHRcdFx0dGFyZ2V0ID0gdW53cmFwKHRhcmdldCk7XG5cdFx0XHRpZiAocHJvcCA9PSBcInByb21pc2VcIikgcmV0dXJuIHRhcmdldDtcblx0XHRcdGlmIChwcm9wID09IFwicmVzb2x2ZVwiICYmIHRoaXMuI3Jlc29sdmUpIHJldHVybiAoLi4uYXJncykgPT4ge1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLiNyZXNvbHZlPy4oLi4uYXJncyk7XG5cdFx0XHRcdHRoaXMuI3Jlc29sdmUgPSBudWxsO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fTtcblx0XHRcdGlmIChwcm9wID09IFwicmVqZWN0XCIgJiYgdGhpcy4jcmVqZWN0KSByZXR1cm4gKC4uLmFyZ3MpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy4jcmVqZWN0Py4oLi4uYXJncyk7XG5cdFx0XHRcdHRoaXMuI3JlamVjdCA9IG51bGw7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3AgPT0gXCJ0aGVuXCIgfHwgcHJvcCA9PSBcImNhdGNoXCIgfHwgcHJvcCA9PSBcImZpbmFsbHlcIikge1xuXHRcdFx0XHRpZiAodGFyZ2V0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHRhcmdldD8uW3Byb3BdPy5iaW5kPy4odGFyZ2V0KTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgJHRtcCA9IFByb21pc2UudHJ5KCgpID0+IHRhcmdldCk7XG5cdFx0XHRcdFx0cmV0dXJuICR0bXA/Lltwcm9wXT8uYmluZD8uKCR0bXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsZXQgcmVzdWx0ID0gdm9pZCAwO1xuXHRcdFx0aWYgKHJlc29sdmVkTWFwPy5oYXM/Lih0YXJnZXQpICYmIChyZXN1bHQgPSByZXNvbHZlZE1hcD8uZ2V0Py4odGFyZ2V0KSk/Lltwcm9wXSAhPSBudWxsKSByZXN1bHQgPSByZXNvbHZlZE1hcD8uZ2V0Py4odGFyZ2V0KT8uW3Byb3BdO1xuXHRcdFx0ZWxzZSByZXN1bHQgPSBQcm9taXNlZChhY3RXaXRoKHRhcmdldCwgYXN5bmMgKG9iaikgPT4ge1xuXHRcdFx0XHRpZiAodW53cmFwKG9iaikgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5nZXQob2JqLCBwcm9wLCByZWNlaXZlcik7XG5cdFx0XHRcdGlmIChpc1ByaW1pdGl2ZShvYmopKSByZXR1cm4gcHJvcCA9PSBTeW1ib2wudG9QcmltaXRpdmUgfHwgcHJvcCA9PSBTeW1ib2wudG9TdHJpbmdUYWcgPyBvYmogOiB2b2lkIDA7XG5cdFx0XHRcdGxldCB2YWx1ZSA9IHZvaWQgMDtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR2YWx1ZSA9IFJlZmxlY3QuZ2V0KG9iaiwgcHJvcCwgcmVjZWl2ZXIpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB0YXJnZXQ/Lltwcm9wXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbHVlPy5iaW5kPy4ob2JqKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSkpO1xuXHRcdFx0aWYgKHByb3AgPT0gU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0XHRcdGlmIChpc1ByaW1pdGl2ZShyZXN1bHQpKSByZXR1cm4gU3RyaW5nKHJlc3VsdCA/PyBcIlwiKSB8fCBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0Py5bU3ltYm9sLnRvU3RyaW5nVGFnXT8uKCkgfHwgU3RyaW5nKHJlc3VsdCA/PyBcIlwiKSB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3AgPT0gU3ltYm9sLnRvUHJpbWl0aXZlKSByZXR1cm4gKGhpbnQpID0+IHtcblx0XHRcdFx0aWYgKGlzUHJpbWl0aXZlKHJlc3VsdCkpIHJldHVybiB0cnlQYXJzZUJ5SGludChyZXN1bHQsIGhpbnQpO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gYWN0V2l0aCh1bndyYXAodGFyZ2V0KSwgKG9iaikgPT4gUmVmbGVjdC5zZXQob2JqLCBwcm9wLCB2YWx1ZSkpO1xuXHRcdH1cblx0XHRhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHtcblx0XHRcdGlmICh0aGlzLiNyZXNvbHZlKSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jlc29sdmU/LiguLi5hcmdzKTtcblx0XHRcdFx0dGhpcy4jcmVzb2x2ZSA9IG51bGw7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYWN0V2l0aCh1bndyYXAodGFyZ2V0LCB0aGlzLiNyZXNvbHZlKSwgKG9iaikgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIG9iaiA9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRpZiAodW53cmFwKG9iaikgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5hcHBseShvYmosIHRoaXNBcmcsIGFyZ3MpO1xuXHRcdFx0XHRcdHJldHVybiBSZWZsZWN0LmFwcGx5KG9iaiwgdGhpc0FyZywgYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0ZnVuY3Rpb24gUHJvbWlzZWQocHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0aWYgKHByb21pc2UgIT0gbnVsbCAmJiB0eXBlb2YgcHJvbWlzZT8ucmVzb2x2ZWQgPT0gXCJmdW5jdGlvblwiICYmIHByb21pc2VbJGV4dHJhY3RLZXkkXSAhPSBudWxsICYmIGhhc1BlbmRpbmdQcm9taXNlcyhwcm9taXNlKSkgcmV0dXJuIFByb21pc2VkKHByb21pc2UucmVzb2x2ZWQoKSwgcmVzb2x2ZSwgcmVqZWN0KTtcblx0XHRpZiAoIWlzVGhlbmFibGUocHJvbWlzZSkgJiYgaGFzUGVuZGluZ1Byb21pc2VzKHByb21pc2UpKSByZXR1cm4gUHJvbWlzZWQocmVzb2x2ZWQocHJvbWlzZSksIHJlc29sdmUsIHJlamVjdCk7XG5cdFx0aWYgKCFpc1RoZW5hYmxlKHByb21pc2UpKSByZXR1cm4gcHJvbWlzZTtcblx0XHRpZiAocmVzb2x2ZWRNYXA/Lmhhcz8uKHByb21pc2UpKSByZXR1cm4gcmVzb2x2ZWRNYXA/LmdldD8uKHByb21pc2UpO1xuXHRcdGlmICghaGFuZGxlZE1hcD8uaGFzPy4ocHJvbWlzZSkpIHByb21pc2U/LnRoZW4/LigoaXRlbSkgPT4gcmVzb2x2ZWRNYXA/LnNldD8uKHByb21pc2UsIGl0ZW0pKTtcblx0XHRyZXR1cm4gaGFuZGxlZE1hcC5nZXRPckluc2VydENvbXB1dGVkKHByb21pc2UsICgpID0+IG5ldyBQcm94eShmaXhGeChwcm9taXNlKSwgbmV3IFByb21pc2VIYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpKTtcblx0fVxuXHRQcm9taXNlZC5hbGxLZXllZCA9IGZ1bmN0aW9uKHByb21pc2VzLCByZXNvbHZlLCByZWplY3QpIHtcblx0XHRyZXR1cm4gUHJvbWlzZWQoUHJvbWlzZS5hbGxLZXllZChwcm9taXNlcyksIHJlc29sdmUsIHJlamVjdCk7XG5cdH07XG5cdFByb21pc2VkLmFsbFNldHRsZWRLZXllZCA9IGZ1bmN0aW9uKHByb21pc2VzLCByZXNvbHZlLCByZWplY3QpIHtcblx0XHRyZXR1cm4gUHJvbWlzZWQoUHJvbWlzZS5hbGxTZXR0bGVkS2V5ZWQocHJvbWlzZXMpLCByZXNvbHZlLCByZWplY3QpO1xuXHR9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L29ic2VydmFibGUvT2JzZXJ2YWJsZS50c1xuXHR2YXIgQmFzZVN1YnNjcmlwdGlvbiA9IGNsYXNzIHtcblx0XHRfdW5zdWJzY3JpYmU7XG5cdFx0X2Nsb3NlZCA9IGZhbHNlO1xuXHRcdGNvbnN0cnVjdG9yKF91bnN1YnNjcmliZSkge1xuXHRcdFx0dGhpcy5fdW5zdWJzY3JpYmUgPSBfdW5zdWJzY3JpYmU7XG5cdFx0fVxuXHRcdGdldCBjbG9zZWQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2xvc2VkO1xuXHRcdH1cblx0XHR1bnN1YnNjcmliZSgpIHtcblx0XHRcdGlmICghdGhpcy5fY2xvc2VkKSB7XG5cdFx0XHRcdHRoaXMuX2Nsb3NlZCA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX3Vuc3Vic2NyaWJlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvKipcblx0KiBDb3JlIE9ic2VydmFibGUgd2l0aCBwcm9kdWNlciBmdW5jdGlvblxuXHQqL1xuXHR2YXIgT2JzZXJ2YWJsZSA9IGNsYXNzIHtcblx0XHRfcHJvZHVjZXI7XG5cdFx0Y29uc3RydWN0b3IoX3Byb2R1Y2VyKSB7XG5cdFx0XHR0aGlzLl9wcm9kdWNlciA9IF9wcm9kdWNlcjtcblx0XHR9XG5cdFx0c3Vic2NyaWJlKG9ic2VydmVyT3JOZXh0LCBvcHRzKSB7XG5cdFx0XHRjb25zdCBvYnNlcnZlciA9IHR5cGVvZiBvYnNlcnZlck9yTmV4dCA9PT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBvYnNlcnZlck9yTmV4dCB9IDogb2JzZXJ2ZXJPck5leHQgPz8ge307XG5cdFx0XHRjb25zdCBjdHJsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHRcdFx0b3B0cz8uc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gY3RybC5hYm9ydCgpKTtcblx0XHRcdGxldCBhY3RpdmUgPSB0cnVlO1xuXHRcdFx0bGV0IGNsZWFudXA7XG5cdFx0XHRjb25zdCBkb0NsZWFudXAgPSAoKSA9PiB7XG5cdFx0XHRcdGFjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHRjdHJsLmFib3J0KCk7XG5cdFx0XHRcdGNsZWFudXA/LigpO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHN1YnNjcmliZXIgPSB7XG5cdFx0XHRcdG5leHQ6ICh2KSA9PiBhY3RpdmUgJiYgb2JzZXJ2ZXIubmV4dD8uKHYpLFxuXHRcdFx0XHRlcnJvcjogKGUpID0+IHtcblx0XHRcdFx0XHRpZiAoYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlci5lcnJvcj8uKGUpO1xuXHRcdFx0XHRcdFx0ZG9DbGVhbnVwKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb21wbGV0ZTogKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChhY3RpdmUpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVyLmNvbXBsZXRlPy4oKTtcblx0XHRcdFx0XHRcdGRvQ2xlYW51cCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0c2lnbmFsOiBjdHJsLnNpZ25hbCxcblx0XHRcdFx0Z2V0IGFjdGl2ZSgpIHtcblx0XHRcdFx0XHRyZXR1cm4gYWN0aXZlICYmICFjdHJsLnNpZ25hbC5hYm9ydGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y2xlYW51cCA9IHRoaXMuX3Byb2R1Y2VyKHN1YnNjcmliZXIpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRzdWJzY3JpYmVyLmVycm9yKGUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ldyBCYXNlU3Vic2NyaXB0aW9uKGRvQ2xlYW51cCk7XG5cdFx0fVxuXHRcdHBpcGUoLi4ub3BzKSB7XG5cdFx0XHRyZXR1cm4gb3BzLnJlZHVjZSgocywgb3ApID0+IG9wKHMpLCB0aGlzKTtcblx0XHR9XG5cdH07XG5cdC8qKlxuXHQqIFN1YmplY3QgLSBPYnNlcnZhYmxlIHRoYXQgY2FuIGJlIHB1c2hlZCB0b1xuXHQqL1xuXHR2YXIgQ2hhbm5lbFN1YmplY3QgPSBjbGFzcyB7XG5cdFx0X3N1YnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdF9idWZmZXIgPSBbXTtcblx0XHRfbWF4QnVmZmVyO1xuXHRcdF9yZXBsYXk7XG5cdFx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG5cdFx0XHR0aGlzLl9tYXhCdWZmZXIgPSBvcHRpb25zLmJ1ZmZlclNpemUgPz8gMDtcblx0XHRcdHRoaXMuX3JlcGxheSA9IG9wdGlvbnMucmVwbGF5T25TdWJzY3JpYmUgPz8gZmFsc2U7XG5cdFx0fVxuXHRcdG5leHQodmFsdWUpIHtcblx0XHRcdGlmICh0aGlzLl9tYXhCdWZmZXIgPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2J1ZmZlci5wdXNoKHZhbHVlKTtcblx0XHRcdFx0aWYgKHRoaXMuX2J1ZmZlci5sZW5ndGggPiB0aGlzLl9tYXhCdWZmZXIpIHRoaXMuX2J1ZmZlci5zaGlmdCgpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBzIG9mIHRoaXMuX3N1YnMpIHRyeSB7XG5cdFx0XHRcdHMubmV4dD8uKHZhbHVlKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cy5lcnJvcj8uKGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlcnJvcihlcnIpIHtcblx0XHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zdWJzKSBzLmVycm9yPy4oZXJyKTtcblx0XHR9XG5cdFx0Y29tcGxldGUoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3Vicykgcy5jb21wbGV0ZT8uKCk7XG5cdFx0XHR0aGlzLl9zdWJzLmNsZWFyKCk7XG5cdFx0fVxuXHRcdHN1YnNjcmliZShvYnNlcnZlck9yTmV4dCkge1xuXHRcdFx0Y29uc3Qgb2JzID0gdHlwZW9mIG9ic2VydmVyT3JOZXh0ID09PSBcImZ1bmN0aW9uXCIgPyB7IG5leHQ6IG9ic2VydmVyT3JOZXh0IH0gOiBvYnNlcnZlck9yTmV4dDtcblx0XHRcdHRoaXMuX3N1YnMuYWRkKG9icyk7XG5cdFx0XHRpZiAodGhpcy5fcmVwbGF5KSBmb3IgKGNvbnN0IHYgb2YgdGhpcy5fYnVmZmVyKSB0cnkge1xuXHRcdFx0XHRvYnMubmV4dD8uKHYpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvYnMuZXJyb3I/LihlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXcgQmFzZVN1YnNjcmlwdGlvbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX3N1YnMuZGVsZXRlKG9icyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Z2V0VmFsdWUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fYnVmZmVyLmF0KC0xKTtcblx0XHR9XG5cdFx0Z2V0QnVmZmVyKCkge1xuXHRcdFx0cmV0dXJuIFsuLi50aGlzLl9idWZmZXJdO1xuXHRcdH1cblx0XHRnZXQgc3Vic2NyaWJlckNvdW50KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N1YnMuc2l6ZTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGZpbHRlciA9IChwcmVkKSA9PiAoc3JjKSA9PiBuZXcgT2JzZXJ2YWJsZSgoc3ViKSA9PiB7XG5cdFx0Y29uc3QgcyA9IHNyYy5zdWJzY3JpYmUoe1xuXHRcdFx0bmV4dDogKHYpID0+IHByZWQodikgJiYgc3ViLm5leHQodiksXG5cdFx0XHRlcnJvcjogKGUpID0+IHN1Yi5lcnJvcihlKSxcblx0XHRcdGNvbXBsZXRlOiAoKSA9PiBzdWIuY29tcGxldGUoKVxuXHRcdH0pO1xuXHRcdHJldHVybiAoKSA9PiBzLnVuc3Vic2NyaWJlKCk7XG5cdH0pO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L3Byb3h5L0ludm9rZXIudHNcblx0ZnVuY3Rpb24gZGV0ZWN0Q29udGV4dFR5cGUoKSB7XG5cdFx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8gIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcImRlbm9cIjtcblx0XHRpZiAodHlwZW9mIGdsb2JhbFRoaXMucHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWxUaGlzLnByb2Nlc3M/LnZlcnNpb25zPy5ub2RlKSByZXR1cm4gXCJub2RlXCI7XG5cdFx0Y29uc3Qgc2VydmljZVdvcmtlclNjb3BlID0gZ2xvYmFsVGhpcy5TZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU7XG5cdFx0Y29uc3Qgc2hhcmVkV29ya2VyU2NvcGUgPSBnbG9iYWxUaGlzLlNoYXJlZFdvcmtlckdsb2JhbFNjb3BlO1xuXHRcdGNvbnN0IGRlZGljYXRlZFdvcmtlclNjb3BlID0gZ2xvYmFsVGhpcy5EZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTtcblx0XHRpZiAoc2VydmljZVdvcmtlclNjb3BlICYmIHNlbGYgaW5zdGFuY2VvZiBzZXJ2aWNlV29ya2VyU2NvcGUpIHJldHVybiBcInNlcnZpY2Utd29ya2VyXCI7XG5cdFx0aWYgKHNoYXJlZFdvcmtlclNjb3BlICYmIHNlbGYgaW5zdGFuY2VvZiBzaGFyZWRXb3JrZXJTY29wZSkgcmV0dXJuIFwic2hhcmVkLXdvcmtlclwiO1xuXHRcdGlmIChkZWRpY2F0ZWRXb3JrZXJTY29wZSAmJiBzZWxmIGluc3RhbmNlb2YgZGVkaWNhdGVkV29ya2VyU2NvcGUpIHJldHVybiBcIndvcmtlclwiO1xuXHRcdGlmICh0eXBlb2YgY2hyb21lICE9PSBcInVuZGVmaW5lZFwiICYmIGNocm9tZS5ydW50aW1lPy5pZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaHJvbWUucnVudGltZS5nZXRCYWNrZ3JvdW5kUGFnZSA9PT0gXCJmdW5jdGlvblwiIHx8IChjaHJvbWUucnVudGltZS5nZXRNYW5pZmVzdD8uKCk/LmJhY2tncm91bmQpPy5zZXJ2aWNlX3dvcmtlcikgcmV0dXJuIFwiY2hyb21lLWJhY2tncm91bmRcIjtcblx0XHRcdGlmICh0eXBlb2YgY2hyb21lLmRldnRvb2xzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gXCJjaHJvbWUtZGV2dG9vbHNcIjtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsVGhpcz8ubG9jYXRpb24/LnByb3RvY29sID09PSBcImNocm9tZS1leHRlbnNpb246XCIpIHtcblx0XHRcdFx0aWYgKChjaHJvbWUuZXh0ZW5zaW9uPy5nZXRWaWV3cz8uKHsgdHlwZTogXCJwb3B1cFwiIH0pID8/IFtdKS5pbmNsdWRlcyhnbG9iYWxUaGlzKSkgcmV0dXJuIFwiY2hyb21lLXBvcHVwXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbFRoaXM/LmxvY2F0aW9uPy5wcm90b2NvbCAhPT0gXCJjaHJvbWUtZXh0ZW5zaW9uOlwiKSByZXR1cm4gXCJjaHJvbWUtY29udGVudFwiO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gXCJ3aW5kb3dcIjtcblx0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG5cdH1cblx0ZnVuY3Rpb24gZGV0ZWN0VHJhbnNwb3J0VHlwZShzb3VyY2UpIHtcblx0XHRpZiAodHlwZW9mIFJUQ0RhdGFDaGFubmVsICE9PSBcInVuZGVmaW5lZFwiICYmIHNvdXJjZSBpbnN0YW5jZW9mIFJUQ0RhdGFDaGFubmVsKSByZXR1cm4gXCJydGMtZGF0YVwiO1xuXHRcdGNvbnN0IGRldGVjdGVkID0gZGV0ZWN0VHJhbnNwb3J0VHlwZSQxKHNvdXJjZSk7XG5cdFx0aWYgKGRldGVjdGVkICYmIGRldGVjdGVkICE9PSBcImludGVybmFsXCIpIHJldHVybiBkZXRlY3RlZDtcblx0XHRpZiAoc291cmNlID09PSBzZWxmIHx8IHNvdXJjZSA9PT0gZ2xvYmFsVGhpcyB8fCBzb3VyY2UgPT09IFwic2VsZlwiKSByZXR1cm4gXCJzZWxmXCI7XG5cdFx0cmV0dXJuIFwiaW50ZXJuYWxcIjtcblx0fVxuXHRmdW5jdGlvbiBkZXRlY3RJbmNvbWluZ0NvbnRleHRUeXBlKGRhdGEpIHtcblx0XHRpZiAoIWRhdGEpIHJldHVybiBcInVua25vd25cIjtcblx0XHRpZiAoZGF0YS5jb250ZXh0VHlwZSkgcmV0dXJuIGRhdGEuY29udGV4dFR5cGU7XG5cdFx0Y29uc3Qgc2VuZGVyID0gZGF0YS5zZW5kZXIgPz8gXCJcIjtcblx0XHRpZiAoc2VuZGVyLmluY2x1ZGVzKFwid29ya2VyXCIpKSByZXR1cm4gXCJ3b3JrZXJcIjtcblx0XHRpZiAoc2VuZGVyLmluY2x1ZGVzKFwic3dcIikgfHwgc2VuZGVyLmluY2x1ZGVzKFwic2VydmljZVwiKSkgcmV0dXJuIFwic2VydmljZS13b3JrZXJcIjtcblx0XHRpZiAoc2VuZGVyLmluY2x1ZGVzKFwiY2hyb21lXCIpIHx8IHNlbmRlci5pbmNsdWRlcyhcImNyeFwiKSkgcmV0dXJuIFwiY2hyb21lLWNvbnRlbnRcIjtcblx0XHRpZiAoc2VuZGVyLmluY2x1ZGVzKFwiYmFja2dyb3VuZFwiKSkgcmV0dXJuIFwiY2hyb21lLWJhY2tncm91bmRcIjtcblx0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG5cdH1cblx0Y29uc3QgRGVmYXVsdFJlZmxlY3QgPSB7XG5cdFx0Z2V0OiAodGFyZ2V0LCBwcm9wKSA9PiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApLFxuXHRcdHNldDogKHRhcmdldCwgcHJvcCwgdmFsdWUpID0+IFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpLFxuXHRcdGhhczogKHRhcmdldCwgcHJvcCkgPT4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKSxcblx0XHRhcHBseTogKHRhcmdldCwgdGhpc0FyZywgYXJncykgPT4gUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpLFxuXHRcdGNvbnN0cnVjdDogKHRhcmdldCwgYXJncykgPT4gUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmdzKSxcblx0XHRkZWxldGVQcm9wZXJ0eTogKHRhcmdldCwgcHJvcCkgPT4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApLFxuXHRcdG93bktleXM6ICh0YXJnZXQpID0+IFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpLFxuXHRcdGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKHRhcmdldCwgcHJvcCkgPT4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKSxcblx0XHRnZXRQcm90b3R5cGVPZjogKHRhcmdldCkgPT4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpLFxuXHRcdHNldFByb3RvdHlwZU9mOiAodGFyZ2V0LCBwcm90bykgPT4gUmVmbGVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKSxcblx0XHRpc0V4dGVuc2libGU6ICh0YXJnZXQpID0+IFJlZmxlY3QuaXNFeHRlbnNpYmxlKHRhcmdldCksXG5cdFx0cHJldmVudEV4dGVuc2lvbnM6ICh0YXJnZXQpID0+IFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KVxuXHR9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L3Byb3h5L1Byb3h5LnRzXG4vKipcblx0KiBQcm94eSAtIFVuaWZpZWQgUmVtb3RlIFByb3h5IENyZWF0aW9uXG5cdCpcblx0KiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBhbGwgcHJveHktcmVsYXRlZCBmdW5jdGlvbmFsaXR5OlxuXHQqIC0gUmVtb3RlIG9iamVjdCBwcm94aWVzICh0cmFuc3BhcmVudCBSUEMpXG5cdCogLSBEZXNjcmlwdG9yLWJhc2VkIHByb3hpZXNcblx0KiAtIFR5cGUtc2FmZSBwcm94eSBjcmVhdGlvblxuXHQqIC0gRXhwb3NlL2xpc3RlbiBwYXR0ZXJuc1xuXHQqL1xuXHQvKiogU3ltYm9sIHRvIGlkZW50aWZ5IHByb3h5IG9iamVjdHMgKi9cblx0Y29uc3QgUFJPWFlfTUFSS0VSID0gU3ltYm9sLmZvcihcInVuaWZvcm0ucHJveHlcIik7XG5cdC8qKiBTeW1ib2wgdG8gYWNjZXNzIHByb3h5IGludGVybmFscyAqL1xuXHRjb25zdCBQUk9YWV9JTlRFUk5BTFMgPSBTeW1ib2wuZm9yKFwidW5pZm9ybS5wcm94eS5pbnRlcm5hbHNcIik7XG5cdC8qKlxuXHQqIFJlbW90ZVByb3h5SGFuZGxlciAtIFVuaWZpZWQgcHJveHkgaGFuZGxlciBmb3IgcmVtb3RlIGludm9jYXRpb25cblx0KlxuXHQqIEhhbmRsZXMgYWxsIFJlZmxlY3Qgb3BlcmF0aW9ucyBhbmQgZm9yd2FyZHMgdGhlbSB0byB0aGUgaW52b2tlci5cblx0Ki9cblx0dmFyIFJlbW90ZVByb3h5SGFuZGxlciA9IGNsYXNzIHtcblx0XHRfaW52b2tlcjtcblx0XHRfY29uZmlnO1xuXHRcdF9jaGlsZENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRjb25zdHJ1Y3RvcihfaW52b2tlciwgY29uZmlnKSB7XG5cdFx0XHR0aGlzLl9pbnZva2VyID0gX2ludm9rZXI7XG5cdFx0XHR0aGlzLl9jb25maWcgPSB7XG5cdFx0XHRcdGNoYW5uZWw6IGNvbmZpZy5jaGFubmVsLFxuXHRcdFx0XHRiYXNlUGF0aDogY29uZmlnLmJhc2VQYXRoID8/IFtdLFxuXHRcdFx0XHRpbnZva2VyOiBfaW52b2tlcixcblx0XHRcdFx0Y2FjaGU6IGNvbmZpZy5jYWNoZSA/PyB0cnVlLFxuXHRcdFx0XHR0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyAzZTRcblx0XHRcdH07XG5cdFx0fVxuXHRcdC8qKiBHZXQgcHJvcGVydHkgLSByZXR1cm5zIG5lc3RlZCBwcm94eSBvciBpbnZva2VzIEdFVCAqL1xuXHRcdGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG5cdFx0XHRjb25zdCBwcm9wU3RyID0gU3RyaW5nKHByb3ApO1xuXHRcdFx0aWYgKHByb3AgPT09IFBST1hZX01BUktFUikgcmV0dXJuIHRydWU7XG5cdFx0XHRpZiAocHJvcCA9PT0gUFJPWFlfSU5URVJOQUxTKSByZXR1cm4gdGhpcy5fY29uZmlnO1xuXHRcdFx0aWYgKHByb3AgPT09ICRyZXF1ZXN0SGFuZGxlcikgcmV0dXJuIHRydWU7XG5cdFx0XHRpZiAocHJvcCA9PT0gJGRlc2NyaXB0b3IpIHJldHVybiB0aGlzLl9nZXREZXNjcmlwdG9yKCk7XG5cdFx0XHRpZiAocHJvcCA9PT0gXCJ0aGVuXCIgfHwgcHJvcCA9PT0gXCJjYXRjaFwiIHx8IHByb3AgPT09IFwiZmluYWxseVwiKSByZXR1cm4gdm9pZCAwO1xuXHRcdFx0aWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSByZXR1cm4gdm9pZCAwO1xuXHRcdFx0aWYgKHByb3AgPT09IFwiJHBhdGhcIikgcmV0dXJuIHRoaXMuX2NvbmZpZy5iYXNlUGF0aDtcblx0XHRcdGlmIChwcm9wID09PSBcIiRjaGFubmVsXCIpIHJldHVybiB0aGlzLl9jb25maWcuY2hhbm5lbDtcblx0XHRcdGlmIChwcm9wID09PSBcIiRkZXNjcmlwdG9yXCIpIHJldHVybiB0aGlzLl9nZXREZXNjcmlwdG9yKCk7XG5cdFx0XHRpZiAocHJvcCA9PT0gXCIkaW52b2tlXCIpIHJldHVybiB0aGlzLl9pbnZva2VyO1xuXHRcdFx0Y29uc3QgY2hpbGRQYXRoID0gWy4uLnRoaXMuX2NvbmZpZy5iYXNlUGF0aCwgcHJvcFN0cl07XG5cdFx0XHRpZiAodGhpcy5fY29uZmlnLmNhY2hlICYmIHRoaXMuX2NoaWxkQ2FjaGUuaGFzKHByb3BTdHIpKSByZXR1cm4gdGhpcy5fY2hpbGRDYWNoZS5nZXQocHJvcFN0cik7XG5cdFx0XHRjb25zdCBjaGlsZFByb3h5ID0gY3JlYXRlUmVtb3RlUHJveHkodGhpcy5faW52b2tlciwge1xuXHRcdFx0XHQuLi50aGlzLl9jb25maWcsXG5cdFx0XHRcdGJhc2VQYXRoOiBjaGlsZFBhdGhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKHRoaXMuX2NvbmZpZy5jYWNoZSkgdGhpcy5fY2hpbGRDYWNoZS5zZXQocHJvcFN0ciwgY2hpbGRQcm94eSk7XG5cdFx0XHRyZXR1cm4gY2hpbGRQcm94eTtcblx0XHR9XG5cdFx0LyoqIFNldCBwcm9wZXJ0eSAqL1xuXHRcdHNldCh0YXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcikge1xuXHRcdFx0aWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSByZXR1cm4gdHJ1ZTtcblx0XHRcdHRoaXMuX2ludm9rZXIoV1JlZmxlY3RBY3Rpb24uU0VULCBbLi4udGhpcy5fY29uZmlnLmJhc2VQYXRoLCBTdHJpbmcocHJvcCldLCBbdmFsdWVdKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHQvKiogQXBwbHkgZnVuY3Rpb24gKi9cblx0XHRhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbnZva2VyKFdSZWZsZWN0QWN0aW9uLkFQUExZLCB0aGlzLl9jb25maWcuYmFzZVBhdGgsIFthcmdzXSk7XG5cdFx0fVxuXHRcdC8qKiBDb25zdHJ1Y3QgbmV3IGluc3RhbmNlICovXG5cdFx0Y29uc3RydWN0KHRhcmdldCwgYXJncywgbmV3VGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faW52b2tlcihXUmVmbGVjdEFjdGlvbi5DT05TVFJVQ1QsIHRoaXMuX2NvbmZpZy5iYXNlUGF0aCwgW2FyZ3NdKTtcblx0XHR9XG5cdFx0LyoqIENoZWNrIGlmIHByb3BlcnR5IGV4aXN0cyAqL1xuXHRcdGhhcyh0YXJnZXQsIHByb3ApIHtcblx0XHRcdGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIGZhbHNlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2ludm9rZXIoV1JlZmxlY3RBY3Rpb24uSEFTLCB0aGlzLl9jb25maWcuYmFzZVBhdGgsIFtwcm9wXSk7XG5cdFx0fVxuXHRcdC8qKiBEZWxldGUgcHJvcGVydHkgKi9cblx0XHRkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApIHtcblx0XHRcdGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5faW52b2tlcihXUmVmbGVjdEFjdGlvbi5ERUxFVEVfUFJPUEVSVFksIFsuLi50aGlzLl9jb25maWcuYmFzZVBhdGgsIFN0cmluZyhwcm9wKV0sIFtdKTtcblx0XHR9XG5cdFx0LyoqIEdldCBvd24ga2V5cyAqL1xuXHRcdG93bktleXModGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHRcdC8qKiBHZXQgcHJvcGVydHkgZGVzY3JpcHRvciAqL1xuXHRcdGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXHRcdC8qKiBHZXQgcHJvdG90eXBlICovXG5cdFx0Z2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlO1xuXHRcdH1cblx0XHQvKiogU2V0IHByb3RvdHlwZSAqL1xuXHRcdHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbnZva2VyKFdSZWZsZWN0QWN0aW9uLlNFVF9QUk9UT1RZUEVfT0YsIHRoaXMuX2NvbmZpZy5iYXNlUGF0aCwgW3Byb3RvXSk7XG5cdFx0fVxuXHRcdC8qKiBDaGVjayBpZiBleHRlbnNpYmxlICovXG5cdFx0aXNFeHRlbnNpYmxlKHRhcmdldCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdC8qKiBQcmV2ZW50IGV4dGVuc2lvbnMgKi9cblx0XHRwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbnZva2VyKFdSZWZsZWN0QWN0aW9uLlBSRVZFTlRfRVhURU5TSU9OUywgdGhpcy5fY29uZmlnLmJhc2VQYXRoLCBbXSk7XG5cdFx0fVxuXHRcdC8qKiBHZXQgZGVzY3JpcHRvciBmb3IgdGhpcyBwcm94eSAqL1xuXHRcdF9nZXREZXNjcmlwdG9yKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cGF0aDogdGhpcy5fY29uZmlnLmJhc2VQYXRoLFxuXHRcdFx0XHRjaGFubmVsOiB0aGlzLl9jb25maWcuY2hhbm5lbCxcblx0XHRcdFx0cHJpbWl0aXZlOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9XG5cdH07XG5cdC8qKlxuXHQqIENyZWF0ZSBhIHJlbW90ZSBwcm94eSBmb3IgdHJhbnNwYXJlbnQgUlBDXG5cdCpcblx0KiBAcGFyYW0gaW52b2tlciAtIEZ1bmN0aW9uIHRvIGludm9rZSByZW1vdGUgb3BlcmF0aW9uc1xuXHQqIEBwYXJhbSBjb25maWcgLSBQcm94eSBjb25maWd1cmF0aW9uXG5cdCogQHJldHVybnMgUHJveHkgb2JqZWN0IHRoYXQgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMgdG8gcmVtb3RlXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGNvbnN0IHByb3h5ID0gY3JlYXRlUmVtb3RlUHJveHkoXG5cdCogICAgIChhY3Rpb24sIHBhdGgsIGFyZ3MpID0+IGNoYW5uZWwuaW52b2tlKHRhcmdldENoYW5uZWwsIGFjdGlvbiwgcGF0aCwgYXJncyksXG5cdCogICAgIHsgY2hhbm5lbDogXCJ3b3JrZXJcIiB9XG5cdCogKTtcblx0KlxuXHQqIC8vIEFsbCBvcGVyYXRpb25zIGFyZSBmb3J3YXJkZWRcblx0KiBhd2FpdCBwcm94eS5tYXRoLmFkZCgxLCAyKTtcblx0KiBhd2FpdCBwcm94eS51c2VyLm5hbWU7XG5cdCogcHJveHkuY29uZmlnLmRlYnVnID0gdHJ1ZTtcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlUmVtb3RlUHJveHkoaW52b2tlciwgY29uZmlnKSB7XG5cdFx0Y29uc3QgZm4gPSBmdW5jdGlvbigpIHt9O1xuXHRcdGNvbnN0IGhhbmRsZXIgPSBuZXcgUmVtb3RlUHJveHlIYW5kbGVyKGludm9rZXIsIGNvbmZpZyk7XG5cdFx0cmV0dXJuIG5ldyBQcm94eShmbiwgaGFuZGxlcik7XG5cdH1cblx0LyoqXG5cdCogQ3JlYXRlIHByb3h5IGZyb20gZGVzY3JpcHRvclxuXHQqXG5cdCogV3JhcHMgYSBXUmVmbGVjdERlc2NyaXB0b3IgaW50byBhIHVzYWJsZSBwcm94eSBvYmplY3QuXG5cdCpcblx0KiBAcGFyYW0gZGVzY3JpcHRvciAtIFJlbW90ZSBvYmplY3QgZGVzY3JpcHRvclxuXHQqIEBwYXJhbSBpbnZva2VyIC0gRnVuY3Rpb24gdG8gaW52b2tlIHJlbW90ZSBvcGVyYXRpb25zXG5cdCogQHBhcmFtIHRhcmdldENoYW5uZWwgLSBPdmVycmlkZSBjaGFubmVsIGZyb20gZGVzY3JpcHRvclxuXHQqL1xuXHRmdW5jdGlvbiB3cmFwRGVzY3JpcHRvcihkZXNjcmlwdG9yLCBpbnZva2VyLCB0YXJnZXRDaGFubmVsKSB7XG5cdFx0aWYgKCFkZXNjcmlwdG9yIHx8IHR5cGVvZiBkZXNjcmlwdG9yICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZGVzY3JpcHRvcjtcblx0XHRpZiAoZGVzY3JpcHRvci5wcmltaXRpdmUpIHJldHVybiBkZXNjcmlwdG9yO1xuXHRcdGNvbnN0IGNhY2hlZCA9IGRlc2NNYXAuZ2V0KGRlc2NyaXB0b3IpO1xuXHRcdGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cdFx0Y29uc3QgcHJveHkgPSBjcmVhdGVSZW1vdGVQcm94eShpbnZva2VyLCB7XG5cdFx0XHRjaGFubmVsOiB0YXJnZXRDaGFubmVsID8/IGRlc2NyaXB0b3IuY2hhbm5lbCA/PyBcInVua25vd25cIixcblx0XHRcdGJhc2VQYXRoOiBkZXNjcmlwdG9yLnBhdGggPz8gW11cblx0XHR9KTtcblx0XHRkZXNjTWFwLnNldChkZXNjcmlwdG9yLCBwcm94eSk7XG5cdFx0d3JhcE1hcC5zZXQocHJveHksIGRlc2NyaXB0b3IpO1xuXHRcdHJldHVybiBwcm94eTtcblx0fVxuXHQvKipcblx0KiBDcmVhdGUgYW4gZXhwb3NlIGhhbmRsZXIgZm9yIGFuIG9iamVjdFxuXHQqXG5cdCogVXNlcyB0aGUgdW5pZmllZCBSZXF1ZXN0SGFuZGxlciBmb3IgY29uc2lzdGVudCBiZWhhdmlvci5cblx0KlxuXHQqIEBwYXJhbSB0YXJnZXQgLSBPYmplY3QgdG8gZXhwb3NlXG5cdCogQHBhcmFtIHJlZmxlY3QgLSBPcHRpb25hbCBjdXN0b20gUmVmbGVjdCBpbXBsZW1lbnRhdGlvblxuXHQqIEByZXR1cm5zIEhhbmRsZXIgZnVuY3Rpb24gZm9yIGluY29taW5nIHJlcXVlc3RzXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZUV4cG9zZUhhbmRsZXIodGFyZ2V0LCByZWZsZWN0KSB7XG5cdFx0cmV0dXJuIGNyZWF0ZU9iamVjdEhhbmRsZXIodGFyZ2V0LCByZWZsZWN0KTtcblx0fVxuXHQvKipcblx0KiBDcmVhdGUgYSBwcm94eSBmb3IgcmVtb3RlIG9iamVjdCBvdmVyIGEgc2VuZGVyIChNZXNzYWdlUG9ydCwgZXRjLilcblx0KlxuXHQqIEBwYXJhbSBzZW5kZXIgLSBPYmplY3Qgd2l0aCByZXF1ZXN0KCkgbWV0aG9kXG5cdCogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBwcm9wZXJ0eSBhY2Nlc3Ncblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlU2VuZGVyUHJveHkoc2VuZGVyLCBiYXNlUGF0aCA9IFtdKSB7XG5cdFx0Y29uc3QgaW52b2tlciA9IChhY3Rpb24sIHBhdGgsIGFyZ3MpID0+IHtcblx0XHRcdHJldHVybiBzZW5kZXIucmVxdWVzdCh7XG5cdFx0XHRcdGlkOiBVVUlEdjQoKSxcblx0XHRcdFx0Y2hhbm5lbDogc2VuZGVyLmNoYW5uZWxOYW1lLFxuXHRcdFx0XHRzZW5kZXI6IHNlbmRlci5zZW5kZXJJZCA/PyBcInByb3h5XCIsXG5cdFx0XHRcdHR5cGU6IFwicmVxdWVzdFwiLFxuXHRcdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdFx0YWN0aW9uLFxuXHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0YXJnc1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdHJldHVybiBjcmVhdGVSZW1vdGVQcm94eShpbnZva2VyLCB7XG5cdFx0XHRjaGFubmVsOiBzZW5kZXIuY2hhbm5lbE5hbWUsXG5cdFx0XHRiYXNlUGF0aFxuXHRcdH0pO1xuXHR9XG5cdC8qKiBAZGVwcmVjYXRlZCBVc2Ugd3JhcERlc2NyaXB0b3IgKi9cblx0Y29uc3QgbWFrZVJlcXVlc3RQcm94eSA9IHdyYXBEZXNjcmlwdG9yO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L2NoYW5uZWwvaW50ZXJuYWwvQ29ubmVjdGlvbk1vZGVsLnRzXG5cdGZ1bmN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25LZXkocGFyYW1zKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHBhcmFtcy5sb2NhbENoYW5uZWwsXG5cdFx0XHRwYXJhbXMucmVtb3RlQ2hhbm5lbCxcblx0XHRcdHBhcmFtcy5zZW5kZXIsXG5cdFx0XHRwYXJhbXMudHJhbnNwb3J0VHlwZSxcblx0XHRcdHBhcmFtcy5kaXJlY3Rpb25cblx0XHRdLmpvaW4oXCI6OlwiKTtcblx0fVxuXHRmdW5jdGlvbiBxdWVyeUNvbm5lY3Rpb25zKGNvbm5lY3Rpb25zLCBxdWVyeSA9IHt9KSB7XG5cdFx0Y29uc3QgaW5jbHVkZUNsb3NlZCA9IHF1ZXJ5LmluY2x1ZGVDbG9zZWQgPz8gZmFsc2U7XG5cdFx0Y29uc3QgZGVzaXJlZFN0YXR1cyA9IHF1ZXJ5LnN0YXR1cyA/PyAoaW5jbHVkZUNsb3NlZCA/IHZvaWQgMCA6IFwiYWN0aXZlXCIpO1xuXHRcdHJldHVybiBbLi4uY29ubmVjdGlvbnNdLmZpbHRlcigoY29ubmVjdGlvbikgPT4ge1xuXHRcdFx0aWYgKGRlc2lyZWRTdGF0dXMgJiYgY29ubmVjdGlvbi5zdGF0dXMgIT09IGRlc2lyZWRTdGF0dXMpIHJldHVybiBmYWxzZTtcblx0XHRcdGlmIChxdWVyeS5jaGFubmVsICYmIGNvbm5lY3Rpb24ubG9jYWxDaGFubmVsICE9PSBxdWVyeS5jaGFubmVsICYmIGNvbm5lY3Rpb24ucmVtb3RlQ2hhbm5lbCAhPT0gcXVlcnkuY2hhbm5lbCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0aWYgKHF1ZXJ5LmxvY2FsQ2hhbm5lbCAmJiBjb25uZWN0aW9uLmxvY2FsQ2hhbm5lbCAhPT0gcXVlcnkubG9jYWxDaGFubmVsKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRpZiAocXVlcnkucmVtb3RlQ2hhbm5lbCAmJiBjb25uZWN0aW9uLnJlbW90ZUNoYW5uZWwgIT09IHF1ZXJ5LnJlbW90ZUNoYW5uZWwpIHJldHVybiBmYWxzZTtcblx0XHRcdGlmIChxdWVyeS5zZW5kZXIgJiYgY29ubmVjdGlvbi5zZW5kZXIgIT09IHF1ZXJ5LnNlbmRlcikgcmV0dXJuIGZhbHNlO1xuXHRcdFx0aWYgKHF1ZXJ5LnRyYW5zcG9ydFR5cGUgJiYgY29ubmVjdGlvbi50cmFuc3BvcnRUeXBlICE9PSBxdWVyeS50cmFuc3BvcnRUeXBlKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRpZiAocXVlcnkuZGlyZWN0aW9uICYmIGNvbm5lY3Rpb24uZGlyZWN0aW9uICE9PSBxdWVyeS5kaXJlY3Rpb24pIHJldHVybiBmYWxzZTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pLnNvcnQoKGEsIGIpID0+IGIudXBkYXRlZEF0IC0gYS51cGRhdGVkQXQpO1xuXHR9XG5cdHZhciBDb25uZWN0aW9uUmVnaXN0cnkgPSBjbGFzcyB7XG5cdFx0X2NyZWF0ZUlkO1xuXHRcdF9lbWl0RXZlbnQ7XG5cdFx0X2Nvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRjb25zdHJ1Y3RvcihfY3JlYXRlSWQsIF9lbWl0RXZlbnQpIHtcblx0XHRcdHRoaXMuX2NyZWF0ZUlkID0gX2NyZWF0ZUlkO1xuXHRcdFx0dGhpcy5fZW1pdEV2ZW50ID0gX2VtaXRFdmVudDtcblx0XHR9XG5cdFx0cmVnaXN0ZXIocGFyYW1zKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBjcmVhdGVDb25uZWN0aW9uS2V5KHBhcmFtcyk7XG5cdFx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQoa2V5KTtcblx0XHRcdGlmIChleGlzdGluZykge1xuXHRcdFx0XHRleGlzdGluZy51cGRhdGVkQXQgPSBub3c7XG5cdFx0XHRcdGV4aXN0aW5nLnN0YXR1cyA9IFwiYWN0aXZlXCI7XG5cdFx0XHRcdGV4aXN0aW5nLm1ldGFkYXRhID0ge1xuXHRcdFx0XHRcdC4uLmV4aXN0aW5nLm1ldGFkYXRhLFxuXHRcdFx0XHRcdC4uLnBhcmFtcy5tZXRhZGF0YVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXR1cm4gZXhpc3Rpbmc7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjb25uZWN0aW9uID0ge1xuXHRcdFx0XHRpZDogdGhpcy5fY3JlYXRlSWQoKSxcblx0XHRcdFx0bG9jYWxDaGFubmVsOiBwYXJhbXMubG9jYWxDaGFubmVsLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiBwYXJhbXMucmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBwYXJhbXMuc2VuZGVyLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBwYXJhbXMudHJhbnNwb3J0VHlwZSxcblx0XHRcdFx0ZGlyZWN0aW9uOiBwYXJhbXMuZGlyZWN0aW9uLFxuXHRcdFx0XHRzdGF0dXM6IFwiYWN0aXZlXCIsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbm93LFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5vdyxcblx0XHRcdFx0bWV0YWRhdGE6IHBhcmFtcy5tZXRhZGF0YVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25zLnNldChrZXksIGNvbm5lY3Rpb24pO1xuXHRcdFx0dGhpcy5fZW1pdEV2ZW50Py4oe1xuXHRcdFx0XHR0eXBlOiBcImNvbm5lY3RlZFwiLFxuXHRcdFx0XHRjb25uZWN0aW9uLFxuXHRcdFx0XHR0aW1lc3RhbXA6IG5vd1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29ubmVjdGlvbjtcblx0XHR9XG5cdFx0bWFya05vdGlmaWVkKGNvbm5lY3Rpb24sIHBheWxvYWQpIHtcblx0XHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0XHRjb25uZWN0aW9uLmxhc3ROb3RpZnlBdCA9IG5vdztcblx0XHRcdGNvbm5lY3Rpb24udXBkYXRlZEF0ID0gbm93O1xuXHRcdFx0dGhpcy5fZW1pdEV2ZW50Py4oe1xuXHRcdFx0XHR0eXBlOiBcIm5vdGlmaWVkXCIsXG5cdFx0XHRcdGNvbm5lY3Rpb24sXG5cdFx0XHRcdHRpbWVzdGFtcDogbm93LFxuXHRcdFx0XHRwYXlsb2FkXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y2xvc2VCeUNoYW5uZWwoY2hhbm5lbCkge1xuXHRcdFx0Y29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblx0XHRcdGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuXHRcdFx0XHRpZiAoY29ubmVjdGlvbi5sb2NhbENoYW5uZWwgIT09IGNoYW5uZWwgJiYgY29ubmVjdGlvbi5yZW1vdGVDaGFubmVsICE9PSBjaGFubmVsKSBjb250aW51ZTtcblx0XHRcdFx0aWYgKGNvbm5lY3Rpb24uc3RhdHVzID09PSBcImNsb3NlZFwiKSBjb250aW51ZTtcblx0XHRcdFx0Y29ubmVjdGlvbi5zdGF0dXMgPSBcImNsb3NlZFwiO1xuXHRcdFx0XHRjb25uZWN0aW9uLnVwZGF0ZWRBdCA9IG5vdztcblx0XHRcdFx0dGhpcy5fZW1pdEV2ZW50Py4oe1xuXHRcdFx0XHRcdHR5cGU6IFwiZGlzY29ubmVjdGVkXCIsXG5cdFx0XHRcdFx0Y29ubmVjdGlvbixcblx0XHRcdFx0XHR0aW1lc3RhbXA6IG5vd1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y2xvc2VBbGwoKSB7XG5cdFx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRcdFx0Zm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG5cdFx0XHRcdGlmIChjb25uZWN0aW9uLnN0YXR1cyA9PT0gXCJjbG9zZWRcIikgY29udGludWU7XG5cdFx0XHRcdGNvbm5lY3Rpb24uc3RhdHVzID0gXCJjbG9zZWRcIjtcblx0XHRcdFx0Y29ubmVjdGlvbi51cGRhdGVkQXQgPSBub3c7XG5cdFx0XHRcdHRoaXMuX2VtaXRFdmVudD8uKHtcblx0XHRcdFx0XHR0eXBlOiBcImRpc2Nvbm5lY3RlZFwiLFxuXHRcdFx0XHRcdGNvbm5lY3Rpb24sXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBub3dcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHF1ZXJ5KHF1ZXJ5ID0ge30pIHtcblx0XHRcdHJldHVybiBxdWVyeUNvbm5lY3Rpb25zKHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpLCBxdWVyeSk7XG5cdFx0fVxuXHRcdHZhbHVlcygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldO1xuXHRcdH1cblx0XHRjbGVhcigpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKCk7XG5cdFx0fVxuXHR9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L2NoYW5uZWwvVW5pZmllZENoYW5uZWwudHNcbi8qKlxuXHQqIFVuaWZpZWQgQ2hhbm5lbCBTeXN0ZW1cblx0KlxuXHQqIE1lcmdlcyBhbmQgdW5pZmllczpcblx0KiAtIFJlcXVlc3RQcm94eSAocHJveHkgY3JlYXRpb24gYW5kIGRpc3BhdGNoKVxuXHQqIC0gSW52b2tlciAoUmVxdWVzdG9yL1Jlc3BvbmRlciBhYnN0cmFjdGlvbilcblx0KiAtIENoYW5uZWxDb250ZXh0IChtdWx0aS1jaGFubmVsIG1hbmFnZW1lbnQpXG5cdCogLSBPYnNlcnZhYmxlQ2hhbm5lbHMgKE9ic2VydmFibGUtYmFzZWQgbWVzc2FnaW5nKVxuXHQqXG5cdCogU2luZ2xlIGVudHJ5IHBvaW50IGZvciBhbGwgY2hhbm5lbCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zOlxuXHQqIC0gYGNyZWF0ZUNoYW5uZWwoKWAgLSBDcmVhdGUgYSB1bmlmaWVkIGNoYW5uZWxcblx0KiAtIGBjaGFubmVsLmV4cG9zZSgpYCAtIEV4cG9zZSBvYmplY3RzIGZvciByZW1vdGUgaW52b2NhdGlvblxuXHQqIC0gYGNoYW5uZWwuaW1wb3J0KClgIC0gSW1wb3J0IHJlbW90ZSBtb2R1bGVzXG5cdCogLSBgY2hhbm5lbC5wcm94eSgpYCAtIENyZWF0ZSB0cmFuc3BhcmVudCBwcm94eSB0byByZW1vdGVcblx0KiAtIGBjaGFubmVsLmNvbm5lY3QoKWAgLSBDb25uZWN0IHRvIHRyYW5zcG9ydFxuXHQqL1xuXHQvKipcblx0KiBVbmlmaWVkQ2hhbm5lbCAtIFNpbmdsZSBlbnRyeSBwb2ludCBmb3IgYWxsIGNoYW5uZWwgY29tbXVuaWNhdGlvblxuXHQqXG5cdCogQ29tYmluZXM6XG5cdCogLSBSZXF1ZXN0b3IgZnVuY3Rpb25hbGl0eSAoaW52b2tlIHJlbW90ZSBtZXRob2RzKVxuXHQqIC0gUmVzcG9uZGVyIGZ1bmN0aW9uYWxpdHkgKGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cylcblx0KiAtIFByb3h5IGNyZWF0aW9uICh0cmFuc3BhcmVudCByZW1vdGUgYWNjZXNzKVxuXHQqIC0gT2JzZXJ2YWJsZSBtZXNzYWdpbmcgKHN1YnNjcmliZS9uZXh0IHBhdHRlcm4pXG5cdCogLSBNdWx0aS10cmFuc3BvcnQgc3VwcG9ydCAoV29ya2VyLCBQb3J0LCBCcm9hZGNhc3QsIFdlYlNvY2tldCwgQ2hyb21lKVxuXHQqL1xuXHR2YXIgVW5pZmllZENoYW5uZWwgPSBjbGFzcyB7XG5cdFx0X25hbWU7XG5cdFx0X2NvbnRleHRUeXBlO1xuXHRcdF9jb25maWc7XG5cdFx0X3RyYW5zcG9ydHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9kZWZhdWx0VHJhbnNwb3J0ID0gbnVsbDtcblx0XHRfY29ubmVjdGlvbkV2ZW50cyA9IG5ldyBDaGFubmVsU3ViamVjdCh7IGJ1ZmZlclNpemU6IDIwMCB9KTtcblx0XHRfY29ubmVjdGlvblJlZ2lzdHJ5ID0gbmV3IENvbm5lY3Rpb25SZWdpc3RyeSgoKSA9PiBVVUlEdjQoKSwgKGV2ZW50KSA9PiB0aGlzLl9jb25uZWN0aW9uRXZlbnRzLm5leHQoZXZlbnQpKTtcblx0XHRfcGVuZGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0X3N1YnNjcmlwdGlvbnMgPSBbXTtcblx0XHRfaW5ib3VuZCA9IG5ldyBDaGFubmVsU3ViamVjdCh7IGJ1ZmZlclNpemU6IDEwMCB9KTtcblx0XHRfb3V0Ym91bmQgPSBuZXcgQ2hhbm5lbFN1YmplY3QoeyBidWZmZXJTaXplOiAxMDAgfSk7XG5cdFx0X2ludm9jYXRpb25zID0gbmV3IENoYW5uZWxTdWJqZWN0KHsgYnVmZmVyU2l6ZTogMTAwIH0pO1xuXHRcdF9yZXNwb25zZXMgPSBuZXcgQ2hhbm5lbFN1YmplY3QoeyBidWZmZXJTaXplOiAxMDAgfSk7XG5cdFx0X2V4cG9zZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9wcm94eUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5cdFx0X19nZXRQcml2YXRlKGtleSkge1xuXHRcdFx0cmV0dXJuIHRoaXNba2V5XTtcblx0XHR9XG5cdFx0X19zZXRQcml2YXRlKGtleSwgdmFsdWUpIHtcblx0XHRcdHRoaXNba2V5XSA9IHZhbHVlO1xuXHRcdH1cblx0XHRjb25zdHJ1Y3Rvcihjb25maWcpIHtcblx0XHRcdGNvbnN0IGNmZyA9IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IGNvbmZpZyB9IDogY29uZmlnO1xuXHRcdFx0dGhpcy5fbmFtZSA9IGNmZy5uYW1lO1xuXHRcdFx0dGhpcy5fY29udGV4dFR5cGUgPSBjZmcuYXV0b0RldGVjdCAhPT0gZmFsc2UgPyBkZXRlY3RDb250ZXh0VHlwZSgpIDogXCJ1bmtub3duXCI7XG5cdFx0XHR0aGlzLl9jb25maWcgPSB7XG5cdFx0XHRcdG5hbWU6IGNmZy5uYW1lLFxuXHRcdFx0XHRhdXRvRGV0ZWN0OiBjZmcuYXV0b0RldGVjdCA/PyB0cnVlLFxuXHRcdFx0XHR0aW1lb3V0OiBjZmcudGltZW91dCA/PyAzZTQsXG5cdFx0XHRcdHJlZmxlY3Q6IGNmZy5yZWZsZWN0ID8/IERlZmF1bHRSZWZsZWN0LFxuXHRcdFx0XHRidWZmZXJTaXplOiBjZmcuYnVmZmVyU2l6ZSA/PyAxMDAsXG5cdFx0XHRcdGF1dG9MaXN0ZW46IGNmZy5hdXRvTGlzdGVuID8/IHRydWVcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5fY29uZmlnLmF1dG9MaXN0ZW4gJiYgdGhpcy5faXNXb3JrZXJDb250ZXh0KCkpIHRoaXMubGlzdGVuKHNlbGYpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENvbm5lY3QgdG8gYSB0cmFuc3BvcnQgZm9yIHNlbmRpbmcgcmVxdWVzdHNcblx0XHQqXG5cdFx0KiBAcGFyYW0gdGFyZ2V0IC0gV29ya2VyLCBNZXNzYWdlUG9ydCwgQnJvYWRjYXN0Q2hhbm5lbCwgV2ViU29ja2V0LCBvciBzdHJpbmcgaWRlbnRpZmllclxuXHRcdCogQHBhcmFtIG9wdGlvbnMgLSBDb25uZWN0aW9uIG9wdGlvbnNcblx0XHQqL1xuXHRcdGNvbm5lY3QodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IHRyYW5zcG9ydFR5cGUgPSBkZXRlY3RUcmFuc3BvcnRUeXBlKHRhcmdldCk7XG5cdFx0XHRjb25zdCB0YXJnZXRDaGFubmVsID0gb3B0aW9ucy50YXJnZXRDaGFubmVsID8/IHRoaXMuX2luZmVyVGFyZ2V0Q2hhbm5lbCh0YXJnZXQsIHRyYW5zcG9ydFR5cGUpO1xuXHRcdFx0Y29uc3QgYmluZGluZyA9IHRoaXMuX2NyZWF0ZVRyYW5zcG9ydEJpbmRpbmcodGFyZ2V0LCB0cmFuc3BvcnRUeXBlLCB0YXJnZXRDaGFubmVsLCBvcHRpb25zKTtcblx0XHRcdHRoaXMuX3RyYW5zcG9ydHMuc2V0KHRhcmdldENoYW5uZWwsIGJpbmRpbmcpO1xuXHRcdFx0aWYgKCF0aGlzLl9kZWZhdWx0VHJhbnNwb3J0KSB0aGlzLl9kZWZhdWx0VHJhbnNwb3J0ID0gYmluZGluZztcblx0XHRcdGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9yZWdpc3RlckNvbm5lY3Rpb24oe1xuXHRcdFx0XHRsb2NhbENoYW5uZWw6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHJlbW90ZUNoYW5uZWw6IHRhcmdldENoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZSxcblx0XHRcdFx0ZGlyZWN0aW9uOiBcIm91dGdvaW5nXCIsXG5cdFx0XHRcdG1ldGFkYXRhOiB7IHBoYXNlOiBcImNvbm5lY3RcIiB9XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX2VtaXRDb25uZWN0aW9uU2lnbmFsKGJpbmRpbmcsIFwiY29ubmVjdFwiLCB7XG5cdFx0XHRcdGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcblx0XHRcdFx0ZnJvbTogdGhpcy5fbmFtZSxcblx0XHRcdFx0dG86IHRhcmdldENoYW5uZWxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogTGlzdGVuIG9uIGEgdHJhbnNwb3J0IGZvciBpbmNvbWluZyByZXF1ZXN0c1xuXHRcdCpcblx0XHQqIEBwYXJhbSBzb3VyY2UgLSBUcmFuc3BvcnQgc291cmNlIHRvIGxpc3RlbiBvblxuXHRcdCogQHBhcmFtIG9wdGlvbnMgLSBDb25uZWN0aW9uIG9wdGlvbnNcblx0XHQqL1xuXHRcdGxpc3Rlbihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgdHJhbnNwb3J0VHlwZSA9IGRldGVjdFRyYW5zcG9ydFR5cGUoc291cmNlKTtcblx0XHRcdGNvbnN0IHNvdXJjZUNoYW5uZWwgPSBvcHRpb25zLnRhcmdldENoYW5uZWwgPz8gdGhpcy5faW5mZXJUYXJnZXRDaGFubmVsKHNvdXJjZSwgdHJhbnNwb3J0VHlwZSk7XG5cdFx0XHRjb25zdCBoYW5kbGVyID0gKGRhdGEpID0+IHRoaXMuX2hhbmRsZUluY29taW5nKGRhdGEpO1xuXHRcdFx0Y29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX3JlZ2lzdGVyQ29ubmVjdGlvbih7XG5cdFx0XHRcdGxvY2FsQ2hhbm5lbDogdGhpcy5fbmFtZSxcblx0XHRcdFx0cmVtb3RlQ2hhbm5lbDogc291cmNlQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBzb3VyY2VDaGFubmVsLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRkaXJlY3Rpb246IFwiaW5jb21pbmdcIixcblx0XHRcdFx0bWV0YWRhdGE6IHsgcGhhc2U6IFwibGlzdGVuXCIgfVxuXHRcdFx0fSk7XG5cdFx0XHRzd2l0Y2ggKHRyYW5zcG9ydFR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIndvcmtlclwiOlxuXHRcdFx0XHRjYXNlIFwibWVzc2FnZS1wb3J0XCI6XG5cdFx0XHRcdGNhc2UgXCJicm9hZGNhc3RcIjpcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5hdXRvU3RhcnQgIT09IGZhbHNlICYmIHNvdXJjZS5zdGFydCkgc291cmNlLnN0YXJ0KCk7XG5cdFx0XHRcdFx0c291cmNlLmFkZEV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgKChlKSA9PiBoYW5kbGVyKGUuZGF0YSkpKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIndlYnNvY2tldFwiOlxuXHRcdFx0XHRcdHNvdXJjZS5hZGRFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsICgoZSkgPT4ge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0aGFuZGxlcihKU09OLnBhcnNlKGUuZGF0YSkpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS1ydW50aW1lXCI6XG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlPy5hZGRMaXN0ZW5lcj8uKChtc2csIHNlbmRlciwgc2VuZFJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyKG1zZyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS10YWJzXCI6XG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlPy5hZGRMaXN0ZW5lcj8uKChtc2csIHNlbmRlcikgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMudGFiSWQgIT0gbnVsbCAmJiBzZW5kZXI/LnRhYj8uaWQgIT09IG9wdGlvbnMudGFiSWQpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdGhhbmRsZXIobXNnKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiY2hyb21lLXBvcnRcIjpcblx0XHRcdFx0XHRzb3VyY2U/Lm9uTWVzc2FnZT8uYWRkTGlzdGVuZXI/LigobXNnKSA9PiB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyKG1zZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtZXh0ZXJuYWxcIjpcblx0XHRcdFx0XHRjaHJvbWUucnVudGltZS5vbk1lc3NhZ2VFeHRlcm5hbD8uYWRkTGlzdGVuZXI/LigobXNnKSA9PiB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyKG1zZyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInNlbGZcIjpcblx0XHRcdFx0XHRhZGRFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsICgoZSkgPT4gaGFuZGxlcihlLmRhdGEpKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IGlmIChvcHRpb25zLm9uTWVzc2FnZSkgb3B0aW9ucy5vbk1lc3NhZ2UoaGFuZGxlcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kU2lnbmFsVG9UYXJnZXQoc291cmNlLCB0cmFuc3BvcnRUeXBlLCB7XG5cdFx0XHRcdGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcblx0XHRcdFx0ZnJvbTogdGhpcy5fbmFtZSxcblx0XHRcdFx0dG86IHNvdXJjZUNoYW5uZWwsXG5cdFx0XHRcdHRhYklkOiBvcHRpb25zLnRhYklkLFxuXHRcdFx0XHRleHRlcm5hbElkOiBvcHRpb25zLmV4dGVybmFsSWRcblx0XHRcdH0sIFwibm90aWZ5XCIpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQ29ubmVjdCBhbmQgbGlzdGVuIG9uIHRoZSBzYW1lIHRyYW5zcG9ydCAoYmlkaXJlY3Rpb25hbClcblx0XHQqL1xuXHRcdGF0dGFjaCh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29ubmVjdCh0YXJnZXQsIG9wdGlvbnMpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEV4cG9zZSBhbiBvYmplY3QgZm9yIHJlbW90ZSBpbnZvY2F0aW9uXG5cdFx0KlxuXHRcdCogQHBhcmFtIG5hbWUgLSBQYXRoIG5hbWUgZm9yIHRoZSBleHBvc2VkIG9iamVjdFxuXHRcdCogQHBhcmFtIG9iaiAtIE9iamVjdCB0byBleHBvc2Vcblx0XHQqL1xuXHRcdGV4cG9zZShuYW1lLCBvYmopIHtcblx0XHRcdGNvbnN0IHBhdGggPSBbbmFtZV07XG5cdFx0XHR3cml0ZUJ5UGF0aChwYXRoLCBvYmopO1xuXHRcdFx0dGhpcy5fZXhwb3NlZC5zZXQobmFtZSwge1xuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRvYmosXG5cdFx0XHRcdHBhdGhcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogRXhwb3NlIG11bHRpcGxlIG9iamVjdHMgYXQgb25jZVxuXHRcdCovXG5cdFx0ZXhwb3NlQWxsKGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW25hbWUsIG9ial0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHRoaXMuZXhwb3NlKG5hbWUsIG9iaik7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBJbXBvcnQgYSBtb2R1bGUgZnJvbSBhIHJlbW90ZSBjaGFubmVsXG5cdFx0KlxuXHRcdCogQHBhcmFtIHVybCAtIE1vZHVsZSBVUkwgdG8gaW1wb3J0XG5cdFx0KiBAcGFyYW0gdGFyZ2V0Q2hhbm5lbCAtIFRhcmdldCBjaGFubmVsIChkZWZhdWx0cyB0byBmaXJzdCBjb25uZWN0ZWQpXG5cdFx0Ki9cblx0XHRhc3luYyBpbXBvcnQodXJsLCB0YXJnZXRDaGFubmVsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnZva2UodGFyZ2V0Q2hhbm5lbCA/PyB0aGlzLl9nZXREZWZhdWx0VGFyZ2V0KCksIFdSZWZsZWN0QWN0aW9uLklNUE9SVCwgW10sIFt1cmxdKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBJbnZva2UgYSBtZXRob2Qgb24gYSByZW1vdGUgb2JqZWN0XG5cdFx0KlxuXHRcdCogQHBhcmFtIHRhcmdldENoYW5uZWwgLSBUYXJnZXQgY2hhbm5lbCBuYW1lXG5cdFx0KiBAcGFyYW0gYWN0aW9uIC0gUmVmbGVjdCBhY3Rpb25cblx0XHQqIEBwYXJhbSBwYXRoIC0gT2JqZWN0IHBhdGhcblx0XHQqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzXG5cdFx0Ki9cblx0XHRpbnZva2UodGFyZ2V0Q2hhbm5lbCwgYWN0aW9uLCBwYXRoLCBhcmdzID0gW10pIHtcblx0XHRcdGNvbnN0IGlkID0gVVVJRHY0KCk7XG5cdFx0XHRjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcblx0XHRcdHRoaXMuX3BlbmRpbmcuc2V0KGlkLCByZXNvbHZlcnMpO1xuXHRcdFx0Y29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5fcGVuZGluZy5oYXMoaWQpKSB7XG5cdFx0XHRcdFx0dGhpcy5fcGVuZGluZy5kZWxldGUoaWQpO1xuXHRcdFx0XHRcdHJlc29sdmVycy5yZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0OiAke2FjdGlvbn0gb24gJHtwYXRoLmpvaW4oXCIuXCIpfWApKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcy5fY29uZmlnLnRpbWVvdXQpO1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IHtcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGNoYW5uZWw6IHRhcmdldENoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHlwZTogXCJyZXF1ZXN0XCIsXG5cdFx0XHRcdHBheWxvYWQ6IHtcblx0XHRcdFx0XHRjaGFubmVsOiB0YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0XHRhY3Rpb24sXG5cdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRhcmdzXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NlbmQodGFyZ2V0Q2hhbm5lbCwgbWVzc2FnZSk7XG5cdFx0XHR0aGlzLl9vdXRib3VuZC5uZXh0KG1lc3NhZ2UpO1xuXHRcdFx0cmV0dXJuIHJlc29sdmVycy5wcm9taXNlLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgcHJvcGVydHkgZnJvbSByZW1vdGUgb2JqZWN0XG5cdFx0Ki9cblx0XHRnZXQodGFyZ2V0Q2hhbm5lbCwgcGF0aCwgcHJvcCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW52b2tlKHRhcmdldENoYW5uZWwsIFdSZWZsZWN0QWN0aW9uLkdFVCwgcGF0aCwgW3Byb3BdKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTZXQgcHJvcGVydHkgb24gcmVtb3RlIG9iamVjdFxuXHRcdCovXG5cdFx0c2V0KHRhcmdldENoYW5uZWwsIHBhdGgsIHByb3AsIHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnZva2UodGFyZ2V0Q2hhbm5lbCwgV1JlZmxlY3RBY3Rpb24uU0VULCBwYXRoLCBbcHJvcCwgdmFsdWVdKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDYWxsIG1ldGhvZCBvbiByZW1vdGUgb2JqZWN0XG5cdFx0Ki9cblx0XHRjYWxsKHRhcmdldENoYW5uZWwsIHBhdGgsIGFyZ3MgPSBbXSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW52b2tlKHRhcmdldENoYW5uZWwsIFdSZWZsZWN0QWN0aW9uLkFQUExZLCBwYXRoLCBbYXJnc10pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENvbnN0cnVjdCBuZXcgaW5zdGFuY2Ugb24gcmVtb3RlXG5cdFx0Ki9cblx0XHRjb25zdHJ1Y3QodGFyZ2V0Q2hhbm5lbCwgcGF0aCwgYXJncyA9IFtdKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnZva2UodGFyZ2V0Q2hhbm5lbCwgV1JlZmxlY3RBY3Rpb24uQ09OU1RSVUNULCBwYXRoLCBbYXJnc10pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENyZWF0ZSBhIHRyYW5zcGFyZW50IHByb3h5IHRvIGEgcmVtb3RlIGNoYW5uZWxcblx0XHQqXG5cdFx0KiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgcHJveHkgYXJlIGZvcndhcmRlZCB0byB0aGUgcmVtb3RlLlxuXHRcdCpcblx0XHQqIEBwYXJhbSB0YXJnZXRDaGFubmVsIC0gVGFyZ2V0IGNoYW5uZWwgbmFtZVxuXHRcdCogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciB0aGUgcHJveHlcblx0XHQqL1xuXHRcdHByb3h5KHRhcmdldENoYW5uZWwsIGJhc2VQYXRoID0gW10pIHtcblx0XHRcdGNvbnN0IHRhcmdldCA9IHRhcmdldENoYW5uZWwgPz8gdGhpcy5fZ2V0RGVmYXVsdFRhcmdldCgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NyZWF0ZVByb3h5KHRhcmdldCwgYmFzZVBhdGgpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENyZWF0ZSBwcm94eSBmb3IgYSBzcGVjaWZpYyBleHBvc2VkIG1vZHVsZSBvbiByZW1vdGVcblx0XHQqXG5cdFx0KiBAcGFyYW0gbW9kdWxlTmFtZSAtIE5hbWUgb2YgdGhlIGV4cG9zZWQgbW9kdWxlXG5cdFx0KiBAcGFyYW0gdGFyZ2V0Q2hhbm5lbCAtIFRhcmdldCBjaGFubmVsXG5cdFx0Ki9cblx0XHRyZW1vdGUobW9kdWxlTmFtZSwgdGFyZ2V0Q2hhbm5lbCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJveHkodGFyZ2V0Q2hhbm5lbCwgW21vZHVsZU5hbWVdKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBXcmFwIGEgZGVzY3JpcHRvciBhcyBhIHByb3h5XG5cdFx0Ki9cblx0XHR3cmFwRGVzY3JpcHRvcihkZXNjcmlwdG9yLCB0YXJnZXRDaGFubmVsKSB7XG5cdFx0XHRjb25zdCBpbnZva2VyID0gKGFjdGlvbiwgcGF0aCwgYXJncykgPT4ge1xuXHRcdFx0XHRjb25zdCBjaGFubmVsID0gdGFyZ2V0Q2hhbm5lbCA/PyBkZXNjcmlwdG9yPy5jaGFubmVsID8/IHRoaXMuX2dldERlZmF1bHRUYXJnZXQoKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuaW52b2tlKGNoYW5uZWwsIGFjdGlvbiwgcGF0aCwgYXJncyk7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHdyYXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGludm9rZXIsIHRhcmdldENoYW5uZWwgPz8gZGVzY3JpcHRvcj8uY2hhbm5lbCA/PyB0aGlzLl9nZXREZWZhdWx0VGFyZ2V0KCkpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIFN1YnNjcmliZSB0byBpbmNvbWluZyBtZXNzYWdlc1xuXHRcdCovXG5cdFx0c3Vic2NyaWJlKGhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbmJvdW5kLnN1YnNjcmliZShoYW5kbGVyKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTZW5kIGEgbWVzc2FnZSAoZmlyZS1hbmQtZm9yZ2V0KVxuXHRcdCovXG5cdFx0bmV4dChtZXNzYWdlKSB7XG5cdFx0XHR0aGlzLl9zZW5kKG1lc3NhZ2UuY2hhbm5lbCwgbWVzc2FnZSk7XG5cdFx0XHR0aGlzLl9vdXRib3VuZC5uZXh0KG1lc3NhZ2UpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEVtaXQgYW4gZXZlbnQgdG8gYSBjaGFubmVsXG5cdFx0Ki9cblx0XHRlbWl0KHRhcmdldENoYW5uZWwsIGV2ZW50VHlwZSwgZGF0YSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IHtcblx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHRjaGFubmVsOiB0YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHR5cGU6IFwiZXZlbnRcIixcblx0XHRcdFx0cGF5bG9hZDoge1xuXHRcdFx0XHRcdHR5cGU6IGV2ZW50VHlwZSxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fTtcblx0XHRcdHRoaXMubmV4dChtZXNzYWdlKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBFbWl0IGNvbm5lY3Rpb24tbGV2ZWwgc2lnbmFsIHRvIGEgc3BlY2lmaWMgY29ubmVjdGVkIGNoYW5uZWwuXG5cdFx0KiBUaGlzIGlzIHRoZSBjYW5vbmljYWwgbm90aWZ5L2Nvbm5lY3QgQVBJIGZvciBmYWNhZGUgbGF5ZXJzLlxuXHRcdCovXG5cdFx0bm90aWZ5KHRhcmdldENoYW5uZWwsIHBheWxvYWQgPSB7fSwgdHlwZSA9IFwibm90aWZ5XCIpIHtcblx0XHRcdGNvbnN0IGJpbmRpbmcgPSB0aGlzLl90cmFuc3BvcnRzLmdldCh0YXJnZXRDaGFubmVsKTtcblx0XHRcdGlmICghYmluZGluZykgcmV0dXJuIGZhbHNlO1xuXHRcdFx0dGhpcy5fZW1pdENvbm5lY3Rpb25TaWduYWwoYmluZGluZywgdHlwZSwge1xuXHRcdFx0XHRmcm9tOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0bzogdGFyZ2V0Q2hhbm5lbCxcblx0XHRcdFx0Li4ucGF5bG9hZFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0LyoqIE9ic2VydmFibGU6IEluY29taW5nIG1lc3NhZ2VzICovXG5cdFx0Z2V0IG9uTWVzc2FnZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbmJvdW5kO1xuXHRcdH1cblx0XHQvKiogT2JzZXJ2YWJsZTogT3V0Z29pbmcgbWVzc2FnZXMgKi9cblx0XHRnZXQgb25PdXRib3VuZCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vdXRib3VuZDtcblx0XHR9XG5cdFx0LyoqIE9ic2VydmFibGU6IEluY29taW5nIGludm9jYXRpb25zICovXG5cdFx0Z2V0IG9uSW52b2NhdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbnZvY2F0aW9ucztcblx0XHR9XG5cdFx0LyoqIE9ic2VydmFibGU6IE91dGdvaW5nIHJlc3BvbnNlcyAqL1xuXHRcdGdldCBvblJlc3BvbnNlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3Jlc3BvbnNlcztcblx0XHR9XG5cdFx0LyoqIE9ic2VydmFibGU6IENvbm5lY3Rpb24gZXZlbnRzIChjb25uZWN0ZWQvbm90aWZpZWQvZGlzY29ubmVjdGVkKSAqL1xuXHRcdGdldCBvbkNvbm5lY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbkV2ZW50cztcblx0XHR9XG5cdFx0c3Vic2NyaWJlQ29ubmVjdGlvbnMoaGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25FdmVudHMuc3Vic2NyaWJlKGhhbmRsZXIpO1xuXHRcdH1cblx0XHRxdWVyeUNvbm5lY3Rpb25zKHF1ZXJ5ID0ge30pIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkucXVlcnkocXVlcnkpO1xuXHRcdH1cblx0XHRub3RpZnlDb25uZWN0aW9ucyhwYXlsb2FkID0ge30sIHF1ZXJ5ID0ge30pIHtcblx0XHRcdGxldCBzZW50ID0gMDtcblx0XHRcdGNvbnN0IHRhcmdldHMgPSB0aGlzLnF1ZXJ5Q29ubmVjdGlvbnMoe1xuXHRcdFx0XHQuLi5xdWVyeSxcblx0XHRcdFx0c3RhdHVzOiBcImFjdGl2ZVwiLFxuXHRcdFx0XHRpbmNsdWRlQ2xvc2VkOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGFyZ2V0cykge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gdGhpcy5fdHJhbnNwb3J0cy5nZXQoY29ubmVjdGlvbi5yZW1vdGVDaGFubmVsKTtcblx0XHRcdFx0aWYgKCFiaW5kaW5nKSBjb250aW51ZTtcblx0XHRcdFx0dGhpcy5fZW1pdENvbm5lY3Rpb25TaWduYWwoYmluZGluZywgXCJub3RpZnlcIiwge1xuXHRcdFx0XHRcdGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcblx0XHRcdFx0XHRmcm9tOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHRcdHRvOiBjb25uZWN0aW9uLnJlbW90ZUNoYW5uZWwsXG5cdFx0XHRcdFx0Li4ucGF5bG9hZFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c2VudCsrO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbnQ7XG5cdFx0fVxuXHRcdC8qKiBDaGFubmVsIG5hbWUgKi9cblx0XHRnZXQgbmFtZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9uYW1lO1xuXHRcdH1cblx0XHQvKiogRGV0ZWN0ZWQgY29udGV4dCB0eXBlICovXG5cdFx0Z2V0IGNvbnRleHRUeXBlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHRUeXBlO1xuXHRcdH1cblx0XHQvKiogQ29uZmlndXJhdGlvbiAqL1xuXHRcdGdldCBjb25maWcoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29uZmlnO1xuXHRcdH1cblx0XHQvKiogQ29ubmVjdGVkIHRyYW5zcG9ydCBuYW1lcyAqL1xuXHRcdGdldCBjb25uZWN0ZWRDaGFubmVscygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fdHJhbnNwb3J0cy5rZXlzKCldO1xuXHRcdH1cblx0XHQvKiogRXhwb3NlZCBtb2R1bGUgbmFtZXMgKi9cblx0XHRnZXQgZXhwb3NlZE1vZHVsZXMoKSB7XG5cdFx0XHRyZXR1cm4gWy4uLnRoaXMuX2V4cG9zZWQua2V5cygpXTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDbG9zZSBhbGwgY29ubmVjdGlvbnMgYW5kIGNsZWFudXBcblx0XHQqL1xuXHRcdGNsb3NlKCkge1xuXHRcdFx0dGhpcy5fc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuXHRcdFx0dGhpcy5fc3Vic2NyaXB0aW9ucyA9IFtdO1xuXHRcdFx0dGhpcy5fcGVuZGluZy5jbGVhcigpO1xuXHRcdFx0dGhpcy5fbWFya0FsbENvbm5lY3Rpb25zQ2xvc2VkKCk7XG5cdFx0XHRmb3IgKGNvbnN0IGJpbmRpbmcgb2YgdGhpcy5fdHJhbnNwb3J0cy52YWx1ZXMoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGJpbmRpbmcuY2xlYW51cD8uKCk7XG5cdFx0XHRcdH0gY2F0Y2gge31cblx0XHRcdFx0aWYgKGJpbmRpbmcudHJhbnNwb3J0VHlwZSA9PT0gXCJtZXNzYWdlLXBvcnRcIiB8fCBiaW5kaW5nLnRyYW5zcG9ydFR5cGUgPT09IFwiYnJvYWRjYXN0XCIpIHRyeSB7XG5cdFx0XHRcdFx0YmluZGluZy50YXJnZXQ/LmNsb3NlPy4oKTtcblx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJhbnNwb3J0cy5jbGVhcigpO1xuXHRcdFx0dGhpcy5fZGVmYXVsdFRyYW5zcG9ydCA9IG51bGw7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkuY2xlYXIoKTtcblx0XHRcdHRoaXMuX2luYm91bmQuY29tcGxldGUoKTtcblx0XHRcdHRoaXMuX291dGJvdW5kLmNvbXBsZXRlKCk7XG5cdFx0XHR0aGlzLl9pbnZvY2F0aW9ucy5jb21wbGV0ZSgpO1xuXHRcdFx0dGhpcy5fcmVzcG9uc2VzLmNvbXBsZXRlKCk7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uRXZlbnRzLmNvbXBsZXRlKCk7XG5cdFx0fVxuXHRcdF9oYW5kbGVJbmNvbWluZyhkYXRhKSB7XG5cdFx0XHRpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIpIHJldHVybjtcblx0XHRcdHRoaXMuX2luYm91bmQubmV4dChkYXRhKTtcblx0XHRcdHN3aXRjaCAoZGF0YS50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXF1ZXN0XCI6XG5cdFx0XHRcdFx0aWYgKGRhdGEuY2hhbm5lbCA9PT0gdGhpcy5fbmFtZSkgdGhpcy5faGFuZGxlUmVxdWVzdChkYXRhKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlc3BvbnNlXCI6XG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlUmVzcG9uc2UoZGF0YSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJldmVudFwiOiBicmVhaztcblx0XHRcdFx0Y2FzZSBcInNpZ25hbFwiOiB0aGlzLl9oYW5kbGVTaWduYWwoZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdF9oYW5kbGVSZXNwb25zZShkYXRhKSB7XG5cdFx0XHRjb25zdCBpZCA9IGRhdGEucmVxSWQgPz8gZGF0YS5pZDtcblx0XHRcdGNvbnN0IHJlc29sdmVycyA9IHRoaXMuX3BlbmRpbmcuZ2V0KGlkKTtcblx0XHRcdGlmIChyZXNvbHZlcnMpIHtcblx0XHRcdFx0dGhpcy5fcGVuZGluZy5kZWxldGUoaWQpO1xuXHRcdFx0XHRpZiAoZGF0YS5wYXlsb2FkPy5lcnJvcikgcmVzb2x2ZXJzLnJlamVjdChuZXcgRXJyb3IoZGF0YS5wYXlsb2FkLmVycm9yKSk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGRhdGEucGF5bG9hZD8ucmVzdWx0O1xuXHRcdFx0XHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBkYXRhLnBheWxvYWQ/LmRlc2NyaXB0b3I7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHZvaWQgMCkgcmVzb2x2ZXJzLnJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0XHRlbHNlIGlmIChkZXNjcmlwdG9yKSByZXNvbHZlcnMucmVzb2x2ZSh0aGlzLndyYXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGRhdGEuc2VuZGVyKSk7XG5cdFx0XHRcdFx0ZWxzZSByZXNvbHZlcnMucmVzb2x2ZSh2b2lkIDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3Jlc3BvbnNlcy5uZXh0KHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRjaGFubmVsOiBkYXRhLmNoYW5uZWwsXG5cdFx0XHRcdFx0c2VuZGVyOiBkYXRhLnNlbmRlcixcblx0XHRcdFx0XHRyZXN1bHQ6IGRhdGEucGF5bG9hZD8ucmVzdWx0LFxuXHRcdFx0XHRcdGRlc2NyaXB0b3I6IGRhdGEucGF5bG9hZD8uZGVzY3JpcHRvcixcblx0XHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFzeW5jIF9oYW5kbGVSZXF1ZXN0KGRhdGEpIHtcblx0XHRcdGNvbnN0IHBheWxvYWQgPSBkYXRhLnBheWxvYWQ7XG5cdFx0XHRpZiAoIXBheWxvYWQpIHJldHVybjtcblx0XHRcdGNvbnN0IHsgYWN0aW9uLCBwYXRoLCBhcmdzLCBzZW5kZXIgfSA9IHBheWxvYWQ7XG5cdFx0XHRjb25zdCByZXFJZCA9IGRhdGEucmVxSWQgPz8gZGF0YS5pZDtcblx0XHRcdHRoaXMuX2ludm9jYXRpb25zLm5leHQoe1xuXHRcdFx0XHRpZDogcmVxSWQsXG5cdFx0XHRcdGNoYW5uZWw6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHNlbmRlcixcblx0XHRcdFx0YWN0aW9uLFxuXHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRhcmdzOiBhcmdzID8/IFtdLFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KCksXG5cdFx0XHRcdGNvbnRleHRUeXBlOiBkZXRlY3RJbmNvbWluZ0NvbnRleHRUeXBlKGRhdGEpXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHsgcmVzdWx0LCB0b1RyYW5zZmVyLCBuZXdQYXRoIH0gPSBhd2FpdCB0aGlzLl9leGVjdXRlQWN0aW9uKGFjdGlvbiwgcGF0aCwgYXJncyA/PyBbXSwgc2VuZGVyKTtcblx0XHRcdGF3YWl0IHRoaXMuX3NlbmRSZXNwb25zZShyZXFJZCwgYWN0aW9uLCBzZW5kZXIsIG5ld1BhdGgsIHJlc3VsdCwgdG9UcmFuc2Zlcik7XG5cdFx0fVxuXHRcdGFzeW5jIF9leGVjdXRlQWN0aW9uKGFjdGlvbiwgcGF0aCwgYXJncywgc2VuZGVyKSB7XG5cdFx0XHRjb25zdCB7IHJlc3VsdCwgdG9UcmFuc2ZlciwgcGF0aDogbmV3UGF0aCB9ID0gZXhlY3V0ZUFjdGlvbihhY3Rpb24sIHBhdGgsIGFyZ3MsIHtcblx0XHRcdFx0Y2hhbm5lbDogdGhpcy5fbmFtZSxcblx0XHRcdFx0c2VuZGVyLFxuXHRcdFx0XHRyZWZsZWN0OiB0aGlzLl9jb25maWcucmVmbGVjdFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZXN1bHQ6IGF3YWl0IHJlc3VsdCxcblx0XHRcdFx0dG9UcmFuc2Zlcixcblx0XHRcdFx0bmV3UGF0aFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0YXN5bmMgX3NlbmRSZXNwb25zZShyZXFJZCwgYWN0aW9uLCBzZW5kZXIsIHBhdGgsIHJhd1Jlc3VsdCwgdG9UcmFuc2Zlcikge1xuXHRcdFx0Y29uc3QgeyByZXNwb25zZTogY29yZVJlc3BvbnNlLCB0cmFuc2ZlciB9ID0gYXdhaXQgYnVpbGRSZXNwb25zZShyZXFJZCwgYWN0aW9uLCB0aGlzLl9uYW1lLCBzZW5kZXIsIHBhdGgsIHJhd1Jlc3VsdCwgdG9UcmFuc2Zlcik7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IHtcblx0XHRcdFx0aWQ6IHJlcUlkLFxuXHRcdFx0XHQuLi5jb3JlUmVzcG9uc2UsXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcblx0XHRcdFx0dHJhbnNmZXJhYmxlOiB0cmFuc2ZlclxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NlbmQoc2VuZGVyLCByZXNwb25zZSwgdHJhbnNmZXIpO1xuXHRcdH1cblx0XHRfaGFuZGxlU2lnbmFsKGRhdGEpIHtcblx0XHRcdGNvbnN0IHBheWxvYWQgPSBkYXRhPy5wYXlsb2FkID8/IHt9O1xuXHRcdFx0Y29uc3QgcmVtb3RlQ2hhbm5lbCA9IHBheWxvYWQuZnJvbSA/PyBkYXRhLnNlbmRlciA/PyBcInVua25vd25cIjtcblx0XHRcdGNvbnN0IHRyYW5zcG9ydFR5cGUgPSBkYXRhLnRyYW5zcG9ydFR5cGUgPz8gdGhpcy5fdHJhbnNwb3J0cy5nZXQoZGF0YS5jaGFubmVsKT8udHJhbnNwb3J0VHlwZSA/PyBcImludGVybmFsXCI7XG5cdFx0XHRjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fcmVnaXN0ZXJDb25uZWN0aW9uKHtcblx0XHRcdFx0bG9jYWxDaGFubmVsOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IGRhdGEuc2VuZGVyID8/IHJlbW90ZUNoYW5uZWwsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGUsXG5cdFx0XHRcdGRpcmVjdGlvbjogXCJpbmNvbWluZ1wiXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX21hcmtDb25uZWN0aW9uTm90aWZpZWQoY29ubmVjdGlvbiwgcGF5bG9hZCk7XG5cdFx0fVxuXHRcdF9yZWdpc3RlckNvbm5lY3Rpb24ocGFyYW1zKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LnJlZ2lzdGVyKHBhcmFtcyk7XG5cdFx0fVxuXHRcdF9tYXJrQ29ubmVjdGlvbk5vdGlmaWVkKGNvbm5lY3Rpb24sIHBheWxvYWQpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5tYXJrTm90aWZpZWQoY29ubmVjdGlvbiwgcGF5bG9hZCk7XG5cdFx0fVxuXHRcdF9lbWl0Q29ubmVjdGlvblNpZ25hbChiaW5kaW5nLCBzaWduYWxUeXBlLCBwYXlsb2FkID0ge30pIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSB7XG5cdFx0XHRcdGlkOiBVVUlEdjQoKSxcblx0XHRcdFx0dHlwZTogXCJzaWduYWxcIixcblx0XHRcdFx0Y2hhbm5lbDogYmluZGluZy50YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IGJpbmRpbmcudHJhbnNwb3J0VHlwZSxcblx0XHRcdFx0cGF5bG9hZDoge1xuXHRcdFx0XHRcdHR5cGU6IHNpZ25hbFR5cGUsXG5cdFx0XHRcdFx0ZnJvbTogdGhpcy5fbmFtZSxcblx0XHRcdFx0XHR0bzogYmluZGluZy50YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRcdC4uLnBheWxvYWRcblx0XHRcdFx0fSxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9O1xuXHRcdFx0KGJpbmRpbmc/LnNlbmRlciA/PyBiaW5kaW5nPy5wb3N0TWVzc2FnZSk/LmNhbGwoYmluZGluZywgbWVzc2FnZSk7XG5cdFx0XHRjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fcmVnaXN0ZXJDb25uZWN0aW9uKHtcblx0XHRcdFx0bG9jYWxDaGFubmVsOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiBiaW5kaW5nLnRhcmdldENoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogYmluZGluZy50cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRkaXJlY3Rpb246IFwib3V0Z29pbmdcIlxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9tYXJrQ29ubmVjdGlvbk5vdGlmaWVkKGNvbm5lY3Rpb24sIG1lc3NhZ2UucGF5bG9hZCk7XG5cdFx0fVxuXHRcdF9zZW5kU2lnbmFsVG9UYXJnZXQodGFyZ2V0LCB0cmFuc3BvcnRUeXBlLCBwYXlsb2FkLCBzaWduYWxUeXBlKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0ge1xuXHRcdFx0XHRpZDogVVVJRHY0KCksXG5cdFx0XHRcdHR5cGU6IFwic2lnbmFsXCIsXG5cdFx0XHRcdGNoYW5uZWw6IHBheWxvYWQudG8gPz8gdGhpcy5fbmFtZSxcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdFx0dHlwZTogc2lnbmFsVHlwZSxcblx0XHRcdFx0XHQuLi5wYXlsb2FkXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0cmFuc3BvcnRUeXBlID09PSBcIndlYnNvY2tldFwiKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Py5zZW5kPy4oSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHJhbnNwb3J0VHlwZSA9PT0gXCJjaHJvbWUtcnVudGltZVwiKSB7XG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWU/LnNlbmRNZXNzYWdlPy4obWVzc2FnZSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0cmFuc3BvcnRUeXBlID09PSBcImNocm9tZS10YWJzXCIpIHtcblx0XHRcdFx0XHRjb25zdCB0YWJJZCA9IHBheWxvYWQudGFiSWQ7XG5cdFx0XHRcdFx0aWYgKHRhYklkICE9IG51bGwpIGNocm9tZS50YWJzPy5zZW5kTWVzc2FnZT8uKHRhYklkLCBtZXNzYWdlKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRyYW5zcG9ydFR5cGUgPT09IFwiY2hyb21lLXBvcnRcIikge1xuXHRcdFx0XHRcdHRhcmdldD8ucG9zdE1lc3NhZ2U/LihtZXNzYWdlKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRyYW5zcG9ydFR5cGUgPT09IFwiY2hyb21lLWV4dGVybmFsXCIpIHtcblx0XHRcdFx0XHRpZiAocGF5bG9hZC5leHRlcm5hbElkKSBjaHJvbWUucnVudGltZT8uc2VuZE1lc3NhZ2U/LihwYXlsb2FkLmV4dGVybmFsSWQsIG1lc3NhZ2UpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXQ/LnBvc3RNZXNzYWdlPy4obWVzc2FnZSwgeyB0cmFuc2ZlcjogW10gfSk7XG5cdFx0XHR9IGNhdGNoIHt9XG5cdFx0fVxuXHRcdF9tYXJrQWxsQ29ubmVjdGlvbnNDbG9zZWQoKSB7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkuY2xvc2VBbGwoKTtcblx0XHR9XG5cdFx0X2NyZWF0ZVRyYW5zcG9ydEJpbmRpbmcodGFyZ2V0LCB0cmFuc3BvcnRUeXBlLCB0YXJnZXRDaGFubmVsLCBvcHRpb25zKSB7XG5cdFx0XHRsZXQgc2VuZGVyO1xuXHRcdFx0bGV0IGNsZWFudXA7XG5cdFx0XHRzd2l0Y2ggKHRyYW5zcG9ydFR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIndvcmtlclwiOlxuXHRcdFx0XHRjYXNlIFwibWVzc2FnZS1wb3J0XCI6XG5cdFx0XHRcdGNhc2UgXCJicm9hZGNhc3RcIjpcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5hdXRvU3RhcnQgIT09IGZhbHNlICYmIHRhcmdldC5zdGFydCkgdGFyZ2V0LnN0YXJ0KCk7XG5cdFx0XHRcdFx0c2VuZGVyID0gKG1zZywgdHJhbnNmZXIpID0+IHRhcmdldC5wb3N0TWVzc2FnZShtc2csIHsgdHJhbnNmZXIgfSk7XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSAoKGUpID0+IHRoaXMuX2hhbmRsZUluY29taW5nKGUuZGF0YSkpO1xuXHRcdFx0XHRcdFx0dGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgbGlzdGVuZXIpO1xuXHRcdFx0XHRcdFx0Y2xlYW51cCA9ICgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsIGxpc3RlbmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJ3ZWJzb2NrZXRcIjpcblx0XHRcdFx0XHRzZW5kZXIgPSAobXNnKSA9PiB0YXJnZXQuc2VuZChKU09OLnN0cmluZ2lmeShtc2cpKTtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ZW5lciA9ICgoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZUluY29taW5nKEpTT04ucGFyc2UoZS5kYXRhKSk7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2gge31cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgbGlzdGVuZXIpO1xuXHRcdFx0XHRcdFx0Y2xlYW51cCA9ICgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsIGxpc3RlbmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtcnVudGltZVwiOlxuXHRcdFx0XHRcdHNlbmRlciA9IChtc2cpID0+IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKG1zZyk7XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSAobXNnKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhtc2cpO1xuXHRcdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlPy5hZGRMaXN0ZW5lcj8uKGxpc3RlbmVyKTtcblx0XHRcdFx0XHRcdGNsZWFudXAgPSAoKSA9PiBjaHJvbWUucnVudGltZS5vbk1lc3NhZ2U/LnJlbW92ZUxpc3RlbmVyPy4obGlzdGVuZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS10YWJzXCI6XG5cdFx0XHRcdFx0c2VuZGVyID0gKG1zZykgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMudGFiSWQgIT0gbnVsbCkgY2hyb21lLnRhYnM/LnNlbmRNZXNzYWdlPy4ob3B0aW9ucy50YWJJZCwgbXNnKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gKG1zZywgc2VuZGVyTWV0YSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy50YWJJZCAhPSBudWxsICYmIHNlbmRlck1ldGE/LnRhYj8uaWQgIT09IG9wdGlvbnMudGFiSWQpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlSW5jb21pbmcobXNnKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlPy5hZGRMaXN0ZW5lcj8uKGxpc3RlbmVyKTtcblx0XHRcdFx0XHRcdGNsZWFudXAgPSAoKSA9PiBjaHJvbWUucnVudGltZS5vbk1lc3NhZ2U/LnJlbW92ZUxpc3RlbmVyPy4obGlzdGVuZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS1wb3J0XCI6XG5cdFx0XHRcdFx0aWYgKHRhcmdldD8ucG9zdE1lc3NhZ2UgJiYgdGFyZ2V0Py5vbk1lc3NhZ2U/LmFkZExpc3RlbmVyKSB7XG5cdFx0XHRcdFx0XHRzZW5kZXIgPSAobXNnKSA9PiB0YXJnZXQucG9zdE1lc3NhZ2UobXNnKTtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gKG1zZykgPT4gdGhpcy5faGFuZGxlSW5jb21pbmcobXNnKTtcblx0XHRcdFx0XHRcdHRhcmdldC5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIobGlzdGVuZXIpO1xuXHRcdFx0XHRcdFx0Y2xlYW51cCA9ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXQub25NZXNzYWdlLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdHRhcmdldC5kaXNjb25uZWN0Py4oKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcG9ydE5hbWUgPSBvcHRpb25zLnBvcnROYW1lID8/IHRhcmdldENoYW5uZWw7XG5cdFx0XHRcdFx0XHRjb25zdCBwb3J0ID0gb3B0aW9ucy50YWJJZCAhPSBudWxsICYmIGNocm9tZS50YWJzPy5jb25uZWN0ID8gY2hyb21lLnRhYnMuY29ubmVjdChvcHRpb25zLnRhYklkLCB7IG5hbWU6IHBvcnROYW1lIH0pIDogY2hyb21lLnJ1bnRpbWUuY29ubmVjdCh7IG5hbWU6IHBvcnROYW1lIH0pO1xuXHRcdFx0XHRcdFx0c2VuZGVyID0gKG1zZykgPT4gcG9ydC5wb3N0TWVzc2FnZShtc2cpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSAobXNnKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhtc2cpO1xuXHRcdFx0XHRcdFx0cG9ydC5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIobGlzdGVuZXIpO1xuXHRcdFx0XHRcdFx0Y2xlYW51cCA9ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRwb3J0Lm9uTWVzc2FnZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2gge31cblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRwb3J0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtZXh0ZXJuYWxcIjpcblx0XHRcdFx0XHRzZW5kZXIgPSAobXNnKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5leHRlcm5hbElkKSBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZShvcHRpb25zLmV4dGVybmFsSWQsIG1zZyk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ZW5lciA9IChtc2cpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlSW5jb21pbmcobXNnKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlRXh0ZXJuYWw/LmFkZExpc3RlbmVyPy4obGlzdGVuZXIpO1xuXHRcdFx0XHRcdFx0Y2xlYW51cCA9ICgpID0+IGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZUV4dGVybmFsPy5yZW1vdmVMaXN0ZW5lcj8uKGxpc3RlbmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJzZWxmXCI6XG5cdFx0XHRcdFx0c2VuZGVyID0gKG1zZywgdHJhbnNmZXIpID0+IGdsb2JhbFRoaXMucG9zdE1lc3NhZ2U/Lihtc2csIHsgdHJhbnNmZXI6IHRyYW5zZmVyID8/IFtdIH0pO1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gKChlKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhlLmRhdGEpKTtcblx0XHRcdFx0XHRcdGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKFwibWVzc2FnZVwiLCBsaXN0ZW5lcik7XG5cdFx0XHRcdFx0XHRjbGVhbnVwID0gKCkgPT4gZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsIGxpc3RlbmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYgKG9wdGlvbnMub25NZXNzYWdlKSBjbGVhbnVwID0gb3B0aW9ucy5vbk1lc3NhZ2UoKG1zZykgPT4gdGhpcy5faGFuZGxlSW5jb21pbmcobXNnKSk7XG5cdFx0XHRcdFx0c2VuZGVyID0gKG1zZykgPT4gdGFyZ2V0Py5wb3N0TWVzc2FnZT8uKG1zZyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdHRhcmdldENoYW5uZWwsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGUsXG5cdFx0XHRcdHNlbmRlcixcblx0XHRcdFx0Y2xlYW51cCxcblx0XHRcdFx0cG9zdE1lc3NhZ2U6IChtZXNzYWdlLCBvcHRpb25zKSA9PiBzZW5kZXI/LihtZXNzYWdlLCBvcHRpb25zKSxcblx0XHRcdFx0c3RhcnQ6ICgpID0+IHRhcmdldD8uc3RhcnQ/LigpLFxuXHRcdFx0XHRjbG9zZTogKCkgPT4gdGFyZ2V0Py5jbG9zZT8uKClcblx0XHRcdH07XG5cdFx0fVxuXHRcdF9zZW5kKHRhcmdldENoYW5uZWwsIG1lc3NhZ2UsIHRyYW5zZmVyKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nID0gdGhpcy5fdHJhbnNwb3J0cy5nZXQodGFyZ2V0Q2hhbm5lbCkgPz8gdGhpcy5fZGVmYXVsdFRyYW5zcG9ydDtcblx0XHRcdChiaW5kaW5nPy5zZW5kZXIgPz8gYmluZGluZz8ucG9zdE1lc3NhZ2UpPy5jYWxsKGJpbmRpbmcsIG1lc3NhZ2UsIHRyYW5zZmVyKTtcblx0XHR9XG5cdFx0X2dldERlZmF1bHRUYXJnZXQoKSB7XG5cdFx0XHRpZiAodGhpcy5fZGVmYXVsdFRyYW5zcG9ydCkgcmV0dXJuIHRoaXMuX2RlZmF1bHRUcmFuc3BvcnQudGFyZ2V0Q2hhbm5lbDtcblx0XHRcdHJldHVybiBcIndvcmtlclwiO1xuXHRcdH1cblx0XHRfaW5mZXJUYXJnZXRDaGFubmVsKHRhcmdldCwgdHJhbnNwb3J0VHlwZSkge1xuXHRcdFx0aWYgKHRyYW5zcG9ydFR5cGUgPT09IFwid29ya2VyXCIpIHJldHVybiBcIndvcmtlclwiO1xuXHRcdFx0aWYgKHRyYW5zcG9ydFR5cGUgPT09IFwiYnJvYWRjYXN0XCIgJiYgdGFyZ2V0Lm5hbWUpIHJldHVybiB0YXJnZXQubmFtZTtcblx0XHRcdGlmICh0cmFuc3BvcnRUeXBlID09PSBcInNlbGZcIikgcmV0dXJuIFwic2VsZlwiO1xuXHRcdFx0cmV0dXJuIGAke3RyYW5zcG9ydFR5cGV9LSR7VVVJRHY0KCkuc2xpY2UoMCwgOCl9YDtcblx0XHR9XG5cdFx0X2NyZWF0ZVByb3h5KHRhcmdldENoYW5uZWwsIGJhc2VQYXRoKSB7XG5cdFx0XHRjb25zdCBpbnZva2VyID0gKGFjdGlvbiwgcGF0aCwgYXJncykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5pbnZva2UodGFyZ2V0Q2hhbm5lbCwgYWN0aW9uLCBwYXRoLCBhcmdzKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gY3JlYXRlUmVtb3RlUHJveHkoaW52b2tlciwge1xuXHRcdFx0XHRjaGFubmVsOiB0YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRiYXNlUGF0aCxcblx0XHRcdFx0Y2FjaGU6IHRydWUsXG5cdFx0XHRcdHRpbWVvdXQ6IHRoaXMuX2NvbmZpZy50aW1lb3V0XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0X2lzV29ya2VyQ29udGV4dCgpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFwid29ya2VyXCIsXG5cdFx0XHRcdFwic2hhcmVkLXdvcmtlclwiLFxuXHRcdFx0XHRcInNlcnZpY2Utd29ya2VyXCJcblx0XHRcdF0uaW5jbHVkZXModGhpcy5fY29udGV4dFR5cGUpO1xuXHRcdH1cblx0fTtcblx0LyoqXG5cdCogQ3JlYXRlIGEgdW5pZmllZCBjaGFubmVsXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIC8vIEluIHdvcmtlclxuXHQqIGNvbnN0IGNoYW5uZWwgPSBjcmVhdGVVbmlmaWVkQ2hhbm5lbChcIndvcmtlclwiKTtcblx0KiBjaGFubmVsLmV4cG9zZShcImNhbGNcIiwgeyBhZGQ6IChhLCBiKSA9PiBhICsgYiB9KTtcblx0KlxuXHQqIC8vIEluIGhvc3Rcblx0KiBjb25zdCBjaGFubmVsID0gY3JlYXRlVW5pZmllZENoYW5uZWwoXCJob3N0XCIpO1xuXHQqIGNoYW5uZWwuY29ubmVjdCh3b3JrZXIpO1xuXHQqIGNvbnN0IGNhbGMgPSBjaGFubmVsLnByb3h5KFwid29ya2VyXCIsIFtcImNhbGNcIl0pO1xuXHQqIGF3YWl0IGNhbGMuYWRkKDIsIDMpOyAvLyA1XG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZVVuaWZpZWRDaGFubmVsKGNvbmZpZykge1xuXHRcdHJldHVybiBuZXcgVW5pZmllZENoYW5uZWwoY29uZmlnKTtcblx0fVxuXHRsZXQgV09SS0VSX0NIQU5ORUwgPSBudWxsO1xuXHQvKipcblx0KiBHZXQgdGhlIHdvcmtlcidzIHVuaWZpZWQgY2hhbm5lbCAoYXV0by1jcmVhdGVkIGluIHdvcmtlciBjb250ZXh0KVxuXHQqL1xuXHRmdW5jdGlvbiBnZXRXb3JrZXJDaGFubmVsKCkge1xuXHRcdGlmICghV09SS0VSX0NIQU5ORUwpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRUeXBlID0gZGV0ZWN0Q29udGV4dFR5cGUoKTtcblx0XHRcdGlmIChbXG5cdFx0XHRcdFwid29ya2VyXCIsXG5cdFx0XHRcdFwic2hhcmVkLXdvcmtlclwiLFxuXHRcdFx0XHRcInNlcnZpY2Utd29ya2VyXCJcblx0XHRcdF0uaW5jbHVkZXMoY29udGV4dFR5cGUpKSBXT1JLRVJfQ0hBTk5FTCA9IGNyZWF0ZVVuaWZpZWRDaGFubmVsKHtcblx0XHRcdFx0bmFtZTogXCJ3b3JrZXJcIixcblx0XHRcdFx0YXV0b0xpc3RlbjogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0XHRlbHNlIFdPUktFUl9DSEFOTkVMID0gY3JlYXRlVW5pZmllZENoYW5uZWwoe1xuXHRcdFx0XHRuYW1lOiBcImhvc3RcIixcblx0XHRcdFx0YXV0b0xpc3RlbjogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gV09SS0VSX0NIQU5ORUw7XG5cdH1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vdW5pZm9ybS50cy9zcmMvbmV3ZXIvY29yZS9BbGlhcy50c1xuXHRjb25zdCBUUyA9IHtcblx0XHRyamI6IFwicmVqZWN0QnlcIixcblx0XHRydmI6IFwicmVzb2x2ZUJ5XCIsXG5cdFx0cmo6IFwicmVqZWN0XCIsXG5cdFx0cnY6IFwicmVzb2x2ZVwiLFxuXHRcdGNyOiBcImNyZWF0ZVwiLFxuXHRcdGNzOiBcImNyZWF0ZVN5bmNcIixcblx0XHRhOiBcImFycmF5XCIsXG5cdFx0dGE6IFwidHlwZWRhcnJheVwiLFxuXHRcdHVkZjogXCJ1bmRlZmluZWRcIlxuXHR9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9jb3JlL1VzZWZ1bC50c1xuXHRjb25zdCBUcmFuc2ZlcmFibGUgPSBbXG5cdFx0dHlwZW9mIEFycmF5QnVmZmVyICE9IFRTLnVkZiA/IEFycmF5QnVmZmVyIDogbnVsbCxcblx0XHR0eXBlb2YgTWVzc2FnZVBvcnQgIT0gVFMudWRmID8gTWVzc2FnZVBvcnQgOiBudWxsLFxuXHRcdHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPSBUUy51ZGYgPyBSZWFkYWJsZVN0cmVhbSA6IG51bGwsXG5cdFx0dHlwZW9mIFdyaXRhYmxlU3RyZWFtICE9IFRTLnVkZiA/IFdyaXRhYmxlU3RyZWFtIDogbnVsbCxcblx0XHR0eXBlb2YgVHJhbnNmb3JtU3RyZWFtICE9IFRTLnVkZiA/IFRyYW5zZm9ybVN0cmVhbSA6IG51bGwsXG5cdFx0dHlwZW9mIFdlYlRyYW5zcG9ydFJlY2VpdmVTdHJlYW0gIT0gVFMudWRmID8gV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbSA6IG51bGwsXG5cdFx0dHlwZW9mIFdlYlRyYW5zcG9ydFNlbmRTdHJlYW0gIT0gVFMudWRmID8gV2ViVHJhbnNwb3J0U2VuZFN0cmVhbSA6IG51bGwsXG5cdFx0dHlwZW9mIEF1ZGlvRGF0YSAhPSBUUy51ZGYgPyBBdWRpb0RhdGEgOiBudWxsLFxuXHRcdHR5cGVvZiBJbWFnZUJpdG1hcCAhPSBUUy51ZGYgPyBJbWFnZUJpdG1hcCA6IG51bGwsXG5cdFx0dHlwZW9mIFZpZGVvRnJhbWUgIT0gVFMudWRmID8gVmlkZW9GcmFtZSA6IG51bGwsXG5cdFx0dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPSBUUy51ZGYgPyBPZmZzY3JlZW5DYW52YXMgOiBudWxsLFxuXHRcdHR5cGVvZiBSVENEYXRhQ2hhbm5lbCAhPSBUUy51ZGYgPyBSVENEYXRhQ2hhbm5lbCA6IG51bGxcblx0XS5maWx0ZXIoKEUpID0+IEUgIT0gbnVsbCk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uL3VuaWZvcm0udHMvc3JjL25ld2VyL25leHQvdXRpbHMvRW52LnRzXG4vKipcblx0KiBCYXNlIFVSTCBmb3IgYG5ldyBVUkwod29ya2VyUGF0aCwgYmFzZSlgIHdoZW4gc3Bhd25pbmcgd29ya2VycyBmcm9tIGEgc3RyaW5nIHNwZWNpZmllci5cblx0KlxuXHQqIFByZWZlciBgV29ya2VyR2xvYmFsU2NvcGVgIC8gYHdpbmRvd2AgVVJMcyBzbyB0aGlzIG1vZHVsZSBzdGF5cyAqKmBpbXBvcnQubWV0YWAtZnJlZSoqLlxuXHQqIEluY2x1ZGluZyBgaW1wb3J0Lm1ldGEudXJsYCBhbnl3aGVyZSBpbiB0aGUgdW5pZm9ybSBncmFwaCB0cmlwcyBSb2xsZG93bidzIGBFTVBUWV9JTVBPUlRfTUVUQWBcblx0KiB3aGVuIHRoZSBQV0Egc2VydmljZSB3b3JrZXIgaXMgYnVpbHQgYXMgSUlGRSAoYHZpdGUtcGx1Z2luLXB3YWAgaW5qZWN0TWFuaWZlc3QpLlxuXHQqXG5cdCogRGVkaWNhdGVkIHdvcmtlciB0aHJlYWRzIGV4cG9zZSBgZ2xvYmFsVGhpcy5sb2NhdGlvbmAgYXQgdGhlIHdvcmtlciBzY3JpcHQgVVJMOyBNVjMgU1cgZXhwb3NlcyB0aGVcblx0Ki9cblx0ZnVuY3Rpb24gZ2V0V29ya2VyUmVzb2x2ZUJhc2VVcmwoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGhyZWYgPSBnbG9iYWxUaGlzLmxvY2F0aW9uPy5ocmVmO1xuXHRcdFx0aWYgKHR5cGVvZiBocmVmID09PSBcInN0cmluZ1wiICYmIGhyZWYubGVuZ3RoID4gMCkgcmV0dXJuIGhyZWY7XG5cdFx0fSBjYXRjaCB7fVxuXHRcdHRyeSB7XG5cdFx0XHRpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBkb2N1bWVudC5iYXNlVVJJID09PSBcInN0cmluZ1wiICYmIGRvY3VtZW50LmJhc2VVUkkubGVuZ3RoID4gMCkgcmV0dXJuIGRvY3VtZW50LmJhc2VVUkk7XG5cdFx0fSBjYXRjaCB7fVxuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdC8qKiBSZXNvbHZlZCBhYnNvbHV0ZSBocmVmIGZvciBgLi94YC9gL3hgL2Fic29sdXRlIHdvcmtlciBzcGVjaWZpZXJzIChkZWxlZ2F0ZXMgdHJhaWxpbmcgYC9gIG5vcm1hbGl6YXRpb24gdG8gY2FsbGVycykuICovXG5cdGZ1bmN0aW9uIHJlc29sdmVXb3JrZXJTcGVjaWZpZXJIcmVmKHNwZWMpIHtcblx0XHRjb25zdCBiYXNlID0gZ2V0V29ya2VyUmVzb2x2ZUJhc2VVcmwoKTtcblx0XHRpZiAoIWJhc2UubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiW3VuaWZvcm1dIE5vIGJhc2UgVVJMIGZvciB3b3JrZXIgcmVzb2x1dGlvbiAobWlzc2luZyBsb2NhdGlvbiAvIGRvY3VtZW50LmJhc2VVUkkpXCIpO1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBzcGVjLnN0YXJ0c1dpdGgoXCIvXCIpID8gc3BlYy5yZXBsYWNlKC9eXFwvLywgXCIuL1wiKSA6IHNwZWM7XG5cdFx0cmV0dXJuIG5ldyBVUkwobm9ybWFsaXplZCwgYmFzZSkuaHJlZjtcblx0fVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L2NoYW5uZWwvQ2hhbm5lbHMudHNcblx0Y29uc3QgU0VMRl9DSEFOTkVMID0ge1xuXHRcdG5hbWU6IFwidW5rbm93blwiLFxuXHRcdGluc3RhbmNlOiBudWxsXG5cdH07XG5cdGNvbnN0IENIQU5ORUxfTUFQID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y29uc3QgaXNSZWZsZWN0QWN0aW9uJDEgPSAoYWN0aW9uKSA9PiBbLi4uT2JqZWN0LnZhbHVlcyhXUmVmbGVjdEFjdGlvbildLmluY2x1ZGVzKGFjdGlvbik7XG5cdC8qKiBAZGVwcmVjYXRlZCBVc2UgVW5pZmllZENoYW5uZWwucmVtb3RlKCkgaW5zdGVhZCAqL1xuXHR2YXIgUmVtb3RlQ2hhbm5lbEhlbHBlciQxID0gY2xhc3Mge1xuXHRcdGNoYW5uZWxOYW1lO1xuXHRcdG9wdGlvbnM7XG5cdFx0X2NoYW5uZWw7XG5cdFx0Y29uc3RydWN0b3IoY2hhbm5lbE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0dGhpcy5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lO1xuXHRcdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHRcdHRoaXMuX2NoYW5uZWwgPSBnZXRXb3JrZXJDaGFubmVsKCk7XG5cdFx0fVxuXHRcdHJlcXVlc3QocGF0aCwgYWN0aW9uLCBhcmdzLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikgcGF0aCA9IFtwYXRoXTtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KGFjdGlvbikgJiYgaXNSZWZsZWN0QWN0aW9uJDEocGF0aCkpIHtcblx0XHRcdFx0b3B0aW9ucyA9IGFyZ3M7XG5cdFx0XHRcdGFyZ3MgPSBhY3Rpb247XG5cdFx0XHRcdGFjdGlvbiA9IHBhdGg7XG5cdFx0XHRcdHBhdGggPSBbXTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl9jaGFubmVsLmludm9rZSh0aGlzLmNoYW5uZWxOYW1lLCBhY3Rpb24sIHBhdGgsIGFyZ3MpO1xuXHRcdH1cblx0XHRkb0ltcG9ydE1vZHVsZSh1cmwsIG9wdGlvbnMpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jaGFubmVsLmltcG9ydCh1cmwsIHRoaXMuY2hhbm5lbE5hbWUpO1xuXHRcdH1cblx0fTtcblx0LyoqIEBkZXByZWNhdGVkIFVzZSBVbmlmaWVkQ2hhbm5lbCBpbnN0ZWFkICovXG5cdHZhciBDaGFubmVsSGFuZGxlciQxID0gY2xhc3Mge1xuXHRcdGNoYW5uZWw7XG5cdFx0b3B0aW9ucztcblx0XHRfdW5pZmllZDtcblx0XHRicm9hZGNhc3RzID0ge307XG5cdFx0Y29uc3RydWN0b3IoY2hhbm5lbCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHR0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXHRcdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHRcdHRoaXMuX3VuaWZpZWQgPSBjcmVhdGVVbmlmaWVkQ2hhbm5lbCh7XG5cdFx0XHRcdG5hbWU6IGNoYW5uZWwsXG5cdFx0XHRcdGF1dG9MaXN0ZW46IGZhbHNlXG5cdFx0XHR9KTtcblx0XHRcdFNFTEZfQ0hBTk5FTC5uYW1lID0gY2hhbm5lbDtcblx0XHRcdFNFTEZfQ0hBTk5FTC5pbnN0YW5jZSA9IHRoaXM7XG5cdFx0fVxuXHRcdGNyZWF0ZVJlbW90ZUNoYW5uZWwoY2hhbm5lbCwgb3B0aW9ucyA9IHt9LCBicm9hZGNhc3QpIHtcblx0XHRcdGlmIChicm9hZGNhc3QpIHtcblx0XHRcdFx0dGhpcy5fdW5pZmllZC5hdHRhY2goYnJvYWRjYXN0LCB7IHRhcmdldENoYW5uZWw6IGNoYW5uZWwgfSk7XG5cdFx0XHRcdHRoaXMuYnJvYWRjYXN0c1tjaGFubmVsXSA9IGJyb2FkY2FzdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IFJlbW90ZUNoYW5uZWxIZWxwZXIkMShjaGFubmVsLCBvcHRpb25zKSk7XG5cdFx0fVxuXHRcdGdldENoYW5uZWwoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jaGFubmVsO1xuXHRcdH1cblx0XHRyZXF1ZXN0KHBhdGgsIGFjdGlvbiwgYXJncywgb3B0aW9ucyA9IHt9LCB0b0NoYW5uZWwgPSBcIndvcmtlclwiKSB7XG5cdFx0XHRpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIpIHBhdGggPSBbcGF0aF07XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhY3Rpb24pICYmIGlzUmVmbGVjdEFjdGlvbiQxKHBhdGgpKSB7XG5cdFx0XHRcdHRvQ2hhbm5lbCA9IG9wdGlvbnM7XG5cdFx0XHRcdG9wdGlvbnMgPSBhcmdzO1xuXHRcdFx0XHRhcmdzID0gYWN0aW9uO1xuXHRcdFx0XHRhY3Rpb24gPSBwYXRoO1xuXHRcdFx0XHRwYXRoID0gW107XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5pbnZva2UodG9DaGFubmVsLCBhY3Rpb24sIHBhdGgsIGFyZ3MpO1xuXHRcdH1cblx0XHRyZXNvbHZlUmVzcG9uc2UocmVxSWQsIHJlc3VsdCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuXHRcdH1cblx0XHRhc3luYyBoYW5kbGVBbmRSZXNwb25zZShyZXF1ZXN0LCByZXFJZCwgcmVzcG9uc2VGbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlUmVxdWVzdChyZXF1ZXN0LCByZXFJZCwgdGhpcy5jaGFubmVsKTtcblx0XHRcdGlmICghcmVzdWx0KSByZXR1cm47XG5cdFx0XHRyZXNwb25zZUZuPy4ocmVzdWx0LnJlc3BvbnNlLCByZXN1bHQudHJhbnNmZXIpO1xuXHRcdH1cblx0XHRjbG9zZSgpIHtcblx0XHRcdHRoaXMuX3VuaWZpZWQuY2xvc2UoKTtcblx0XHR9XG5cdH07XG5cdC8qKiBAZGVwcmVjYXRlZCBVc2UgY3JlYXRlVW5pZmllZENoYW5uZWwgaW5zdGVhZCAqL1xuXHRjb25zdCBpbml0Q2hhbm5lbEhhbmRsZXIgPSAoY2hhbm5lbCA9IFwiJGhvc3QkXCIpID0+IHtcblx0XHRpZiAoU0VMRl9DSEFOTkVMPy5pbnN0YW5jZSAmJiBjaGFubmVsID09PSBcIiRob3N0JFwiKSByZXR1cm4gU0VMRl9DSEFOTkVMLmluc3RhbmNlO1xuXHRcdGlmIChDSEFOTkVMX01BUC5oYXMoY2hhbm5lbCkpIHJldHVybiBDSEFOTkVMX01BUC5nZXQoY2hhbm5lbCkgPz8gbnVsbDtcblx0XHRjb25zdCAkY2hhbm5lbCA9IG5ldyBDaGFubmVsSGFuZGxlciQxKGNoYW5uZWwpO1xuXHRcdGlmIChjaGFubmVsID09PSBcIiRob3N0JFwiKSB7XG5cdFx0XHRTRUxGX0NIQU5ORUwubmFtZSA9IGNoYW5uZWw7XG5cdFx0XHRTRUxGX0NIQU5ORUwuaW5zdGFuY2UgPSAkY2hhbm5lbDtcblx0XHR9XG5cdFx0Q0hBTk5FTF9NQVAuc2V0KGNoYW5uZWwsICRjaGFubmVsKTtcblx0XHRyZXR1cm4gJGNoYW5uZWw7XG5cdH07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uL3VuaWZvcm0udHMvc3JjL25ld2VyL25leHQvc3RvcmFnZS9EYXRhQmFzZS50c1xuXHRjb25zdCBoYW5kTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5cdGNvbnN0IHdyYXBNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblx0Y29uc3QgZGVzY01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXHRjb25zdCBvYmplY3RUb1JlZiA9IChvYmosIGNoYW5uZWwgPSBTRUxGX0NIQU5ORUw/Lm5hbWUsIHRvVHJhbnNmZXIpID0+IHtcblx0XHRpZiAodHlwZW9mIG9iaiA9PSBcIm9iamVjdFwiICYmIG9iaiAhPSBudWxsIHx8IHR5cGVvZiBvYmogPT0gXCJmdW5jdGlvblwiICYmIG9iaiAhPSBudWxsKSB7XG5cdFx0XHRpZiAod3JhcE1hcC5oYXMob2JqKSkgcmV0dXJuIHdyYXBNYXAuZ2V0KG9iaik7XG5cdFx0XHRpZiAoaGFuZE1hcC5oYXMob2JqKSkgcmV0dXJuIGhhbmRNYXAuZ2V0KG9iaik7XG5cdFx0XHRpZiAoaXNOb3RDb21wbGV4QXJyYXkob2JqKSkgcmV0dXJuIG9iajtcblx0XHRcdGlmICh0b1RyYW5zZmVyPy5pbmNsdWRlcz8uKG9iaikpIHJldHVybiBvYmo7XG5cdFx0XHRpZiAoY2hhbm5lbCA9PSBTRUxGX0NIQU5ORUw/Lm5hbWUpIHJldHVybiBvYmo7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQkaXNEZXNjcmlwdG9yOiB0cnVlLFxuXHRcdFx0XHRwYXRoOiByZWdpc3RlcmVkSW5QYXRoLmdldChvYmopID8/ICgoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aCA9IFtVVUlEdjQoKV07XG5cdFx0XHRcdFx0d3JpdGVCeVBhdGgocGF0aCwgb2JqKTtcblx0XHRcdFx0XHRyZXR1cm4gcGF0aDtcblx0XHRcdFx0fSkoKSxcblx0XHRcdFx0b3duZXI6IFNFTEZfQ0hBTk5FTD8ubmFtZSxcblx0XHRcdFx0Y2hhbm5lbCxcblx0XHRcdFx0cHJpbWl0aXZlOiBpc1ByaW1pdGl2ZShvYmopLFxuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRhcmd1bWVudENvdW50OiBvYmogaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG9iai5sZW5ndGggOiAtMVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzQ2FuSnVzdFJldHVybihvYmopID8gb2JqIDogbnVsbDtcblx0fTtcblx0Y29uc3QgJHJlcXVlc3RIYW5kbGVyID0gU3ltYm9sLmZvcihcIkByZXF1ZXN0SGFuZGxlclwiKTtcblx0Y29uc3QgJGRlc2NyaXB0b3IgPSBTeW1ib2wuZm9yKFwiQGRlc2NyaXB0b3JcIik7XG5cdGNvbnN0IG5vcm1hbGl6ZVJlZiA9ICh2KSA9PiB7XG5cdFx0aWYgKGlzQ2FuSnVzdFJldHVybih2KSkgcmV0dXJuIHY7XG5cdFx0aWYgKHY/LlskZGVzY3JpcHRvcl0pIHJldHVybiB2O1xuXHRcdGlmICh2Py4kaXNEZXNjcmlwdG9yKSByZXR1cm4gbWFrZVJlcXVlc3RQcm94eSh2LCBhc3luYyAoKSA9PiB2b2lkIDApO1xuXHRcdGlmIChpc05vdENvbXBsZXhBcnJheSh2KSkgcmV0dXJuIHY7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cdGNvbnN0IHN0b3JlZERhdGEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRjb25zdCByZWdpc3RlcmVkSW5QYXRoID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5cdGNvbnN0IHRyYXZlcnNlQnlQYXRoID0gKG9iaiwgcGF0aCkgPT4ge1xuXHRcdGlmIChwYXRoICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGF0aCkpIHBhdGggPSBbcGF0aF07XG5cdFx0aWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoPy5sZW5ndGggPCAxKSByZXR1cm4gb2JqO1xuXHRcdGNvbnN0ICRkZXNjID0gb2JqPy5bJGRlc2NyaXB0b3JdID8/IChvYmo/LiRpc0Rlc2NyaXB0b3IgPyBvYmogOiBudWxsKTtcblx0XHRpZiAoJGRlc2MgJiYgJGRlc2M/Lm93bmVyID09IFNFTEZfQ0hBTk5FTD8ubmFtZSkgb2JqID0gcmVhZEJ5UGF0aCgkZGVzYz8ucGF0aCkgPz8gb2JqO1xuXHRcdGlmIChpc1ByaW1pdGl2ZShvYmopKSByZXR1cm4gb2JqO1xuXHRcdGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcblx0XHRcdG9iaiA9IG9iaj8uW2tleV07XG5cdFx0XHRpZiAob2JqID09IG51bGwpIHJldHVybiBvYmo7XG5cdFx0fVxuXHRcdHJldHVybiBvYmo7XG5cdH07XG5cdGNvbnN0IHJlYWRCeVBhdGggPSAocGF0aCkgPT4ge1xuXHRcdGlmIChwYXRoICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGF0aCkpIHBhdGggPSBbcGF0aF07XG5cdFx0aWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoPy5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCByb290ID0gc3RvcmVkRGF0YT8uZ2V0Py4ocGF0aD8uWzBdKSA/PyBudWxsO1xuXHRcdHJldHVybiByb290ICE9IG51bGwgPyB0cmF2ZXJzZUJ5UGF0aChyb290LCBwYXRoPy5zbGljZT8uKDEpKSA6IG51bGw7XG5cdH07XG5cdGNvbnN0IHdyaXRlQnlQYXRoID0gKHBhdGgsIGRhdGEpID0+IHtcblx0XHRjb25zdCAkZGVzYyA9IGRhdGE/LlskZGVzY3JpcHRvcl0gPz8gKGRhdGE/LiRpc0Rlc2NyaXB0b3IgPyBkYXRhIDogbnVsbCk7XG5cdFx0aWYgKCRkZXNjICYmICRkZXNjPy5vd25lciA9PSBTRUxGX0NIQU5ORUw/Lm5hbWUpIGRhdGEgPSByZWFkQnlQYXRoKCRkZXNjPy5wYXRoKSA/PyBkYXRhO1xuXHRcdGlmIChwYXRoICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGF0aCkpIHBhdGggPSBbcGF0aF07XG5cdFx0aWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoPy5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCByb290ID0gc3RvcmVkRGF0YT8uZ2V0Py4ocGF0aD8uWzBdKSA/PyBudWxsO1xuXHRcdGlmIChwYXRoPy5sZW5ndGggPiAxKSB0cmF2ZXJzZUJ5UGF0aChyb290LCBwYXRoPy5zbGljZT8uKDEsIC0xKSlbcGF0aD8uW3BhdGg/Lmxlbmd0aCAtIDFdXSA9IGRhdGE7XG5cdFx0ZWxzZSBzdG9yZWREYXRhPy5zZXQ/LihwYXRoPy5bMF0sIGRhdGEpO1xuXHRcdGlmICh0eXBlb2YgZGF0YSA9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBkYXRhID09IFwiZnVuY3Rpb25cIikgcmVnaXN0ZXJlZEluUGF0aD8uc2V0Py4oZGF0YSwgcGF0aCk7XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH07XG5cdGNvbnN0IHJlbW92ZUJ5UGF0aCA9IChwYXRoKSA9PiB7XG5cdFx0aWYgKHBhdGggIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShwYXRoKSkgcGF0aCA9IFtwYXRoXTtcblx0XHRpZiAocGF0aCA9PSBudWxsIHx8IHBhdGg/Lmxlbmd0aCA8IDEpIHJldHVybiBmYWxzZTtcblx0XHRpZiAoIShzdG9yZWREYXRhPy5nZXQ/LihwYXRoPy5bMF0pID8/IG51bGwpICYmIHBhdGg/Lmxlbmd0aCA8PSAxKSB7XG5cdFx0XHRzdG9yZWREYXRhPy5kZWxldGU/LihwYXRoPy5bMF0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHJldHVybiBmYWxzZTtcblx0fTtcblx0Y29uc3QgcmVtb3ZlQnlEYXRhID0gKGRhdGEpID0+IHtcblx0XHRjb25zdCAkZGVzYyA9IGRhdGE/LlskZGVzY3JpcHRvcl0gPz8gKGRhdGE/LiRpc0Rlc2NyaXB0b3IgPyBkYXRhIDogbnVsbCk7XG5cdFx0aWYgKCRkZXNjICYmICRkZXNjPy5vd25lciA9PSBTRUxGX0NIQU5ORUw/Lm5hbWUpIGRhdGEgPSByZWFkQnlQYXRoKCRkZXNjPy5wYXRoKSA/PyBkYXRhO1xuXHRcdGNvbnN0IHBhdGggPSByZWdpc3RlcmVkSW5QYXRoPy5nZXQ/LihkYXRhKSA/PyAkZGVzYz8ucGF0aDtcblx0XHRpZiAocGF0aCA9PSBudWxsIHx8IHBhdGg/Lmxlbmd0aCA8IDEpIHJldHVybiBmYWxzZTtcblx0XHRyZW1vdmVCeVBhdGgocGF0aCk7XG5cdFx0aWYgKHR5cGVvZiBkYXRhID09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGRhdGEgPT0gXCJmdW5jdGlvblwiKSByZWdpc3RlcmVkSW5QYXRoPy5kZWxldGU/LihkYXRhKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgaGFzTm9QYXRoID0gKGRhdGEpID0+IHtcblx0XHRjb25zdCAkZGVzYyA9IGRhdGE/LlskZGVzY3JpcHRvcl0gPz8gKGRhdGE/LiRpc0Rlc2NyaXB0b3IgPyBkYXRhIDogbnVsbCk7XG5cdFx0cmV0dXJuIChyZWdpc3RlcmVkSW5QYXRoPy5nZXQ/LihkYXRhKSA/PyAkZGVzYz8ucGF0aCkgPT0gbnVsbDtcblx0fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vdW5pZm9ybS50cy9zcmMvbmV3ZXIvY29yZS9SZXF1ZXN0SGFuZGxlci50c1xuLyoqXG5cdCogUmVxdWVzdCBIYW5kbGVyIENvcmUgLSBVbmlmaWVkIFJlZmxlY3QgQWN0aW9uIEhhbmRsaW5nXG5cdCpcblx0KiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBhbGwgYWN0aW9uIGV4ZWN1dGlvbjpcblx0KiAtIFVuaWZpZWRDaGFubmVsLCBDaGFubmVsQ29udGV4dCwgUHJveHkgbW9kdWxlXG5cdCogLSBTdXBwb3J0cyBib3RoIERhdGFCYXNlLWJhY2tlZCBhbmQgZGlyZWN0IG9iamVjdCB0YXJnZXRzXG5cdCogLSBTdXBwb3J0cyBjdXN0b20gUmVmbGVjdCBpbXBsZW1lbnRhdGlvbnNcblx0Ki9cblx0Y29uc3QgaXNPYmplY3QgPSAob2JqKSA9PiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpICYmIG9iaiAhPSBudWxsO1xuXHRjb25zdCBkZWZhdWx0UmVmbGVjdCA9IHtcblx0XHRnZXQ6ICh0LCBwKSA9PiB0Py5bcF0sXG5cdFx0c2V0OiAodCwgcCwgdikgPT4ge1xuXHRcdFx0dFtwXSA9IHY7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdGhhczogKHQsIHApID0+IHAgaW4gdCxcblx0XHRhcHBseTogKHQsIGN0eCwgYXJncykgPT4gdC5hcHBseShjdHgsIGFyZ3MpLFxuXHRcdGNvbnN0cnVjdDogKHQsIGFyZ3MpID0+IG5ldyB0KC4uLmFyZ3MpLFxuXHRcdGRlbGV0ZVByb3BlcnR5OiAodCwgcCkgPT4gZGVsZXRlIHRbcF0sXG5cdFx0b3duS2V5czogKHQpID0+IE9iamVjdC5rZXlzKHQpLFxuXHRcdGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKHQsIHApID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcCksXG5cdFx0Z2V0UHJvdG90eXBlT2Y6ICh0KSA9PiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCksXG5cdFx0c2V0UHJvdG90eXBlT2Y6ICh0LCBwKSA9PiBPYmplY3Quc2V0UHJvdG90eXBlT2YodCwgcCksXG5cdFx0aXNFeHRlbnNpYmxlOiAodCkgPT4gT2JqZWN0LmlzRXh0ZW5zaWJsZSh0KSxcblx0XHRwcmV2ZW50RXh0ZW5zaW9uczogKHQpID0+IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0KVxuXHR9O1xuXHQvKipcblx0KiBFeGVjdXRlIGEgcmVmbGVjdCBhY3Rpb25cblx0KlxuXHQqIFVuaWZpZWQgaW1wbGVtZW50YXRpb24gdXNlZCBieSBhbGwgY2hhbm5lbC9wcm94eSBoYW5kbGVycy5cblx0KiBTdXBwb3J0cyBib3RoIERhdGFCYXNlLWJhY2tlZCBwYXRocyBhbmQgZGlyZWN0IG9iamVjdCB0YXJnZXRzLlxuXHQqXG5cdCogQHBhcmFtIGFjdGlvbiAtIEFjdGlvbiB0byBleGVjdXRlIChXUmVmbGVjdEFjdGlvbiBvciBzdHJpbmcpXG5cdCogQHBhcmFtIHBhdGggLSBPYmplY3QgcGF0aFxuXHQqIEBwYXJhbSBhcmdzIC0gQWN0aW9uIGFyZ3VtZW50c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gRXhlY3V0aW9uIG9wdGlvbnNcblx0Ki9cblx0ZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihhY3Rpb24sIHBhdGgsIGFyZ3MsIG9wdGlvbnMgPSB7fSkge1xuXHRcdGNvbnN0IHsgY2hhbm5lbCA9IFwiXCIsIHNlbmRlciA9IFwiXCIsIHJlZmxlY3QgPSBkZWZhdWx0UmVmbGVjdCB9ID0gb3B0aW9ucztcblx0XHRjb25zdCBvYmogPSBvcHRpb25zLnRhcmdldCA/PyByZWFkQnlQYXRoKHBhdGgpO1xuXHRcdGNvbnN0IHRvVHJhbnNmZXIgPSBbXTtcblx0XHRsZXQgcmVzdWx0ID0gbnVsbDtcblx0XHRsZXQgbmV3UGF0aCA9IHBhdGg7XG5cdFx0c3dpdGNoIChTdHJpbmcoYWN0aW9uKS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRjYXNlIFwiaW1wb3J0XCI6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLklNUE9SVDpcblx0XHRcdFx0cmVzdWx0ID0gaW1wb3J0KFxuXHRcdFx0XHRcdC8qIEB2aXRlLWlnbm9yZSAqL1xuXHRcdFx0XHRcdGFyZ3M/LlswXVxuKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwidHJhbnNmZXJcIjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uVFJBTlNGRVI6XG5cdFx0XHRcdGlmIChpc0NhblRyYW5zZmVyKG9iaikgJiYgY2hhbm5lbCAhPT0gc2VuZGVyKSB0b1RyYW5zZmVyLnB1c2gob2JqKTtcblx0XHRcdFx0cmVzdWx0ID0gb2JqO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJnZXRcIjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uR0VUOiB7XG5cdFx0XHRcdGNvbnN0IHByb3AgPSBhcmdzPy5bMF07XG5cdFx0XHRcdGNvbnN0IGdvdCA9IHJlZmxlY3QuZ2V0Py4ob2JqLCBwcm9wKSA/PyBvYmo/Lltwcm9wXTtcblx0XHRcdFx0cmVzdWx0ID0gdHlwZW9mIGdvdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iaiAhPSBudWxsID8gZ290LmJpbmQob2JqKSA6IGdvdDtcblx0XHRcdFx0bmV3UGF0aCA9IFsuLi5wYXRoLCBTdHJpbmcocHJvcCldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJzZXRcIjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uU0VUOiB7XG5cdFx0XHRcdGNvbnN0IFtwcm9wLCB2YWx1ZV0gPSBhcmdzO1xuXHRcdFx0XHRjb25zdCBub3JtYWxpemVkVmFsdWUgPSBkZWVwT3BlcmF0ZUFuZENsb25lKHZhbHVlLCBub3JtYWxpemVSZWYpO1xuXHRcdFx0XHRpZiAob3B0aW9ucy50YXJnZXQpIHJlc3VsdCA9IHJlZmxlY3Quc2V0Py4ob2JqLCBwcm9wLCBub3JtYWxpemVkVmFsdWUpID8/IChvYmpbcHJvcF0gPSBub3JtYWxpemVkVmFsdWUsIHRydWUpO1xuXHRcdFx0XHRlbHNlIHJlc3VsdCA9IHJlZmxlY3Quc2V0Py4ob2JqLCBwcm9wLCBub3JtYWxpemVkVmFsdWUpID8/IHdyaXRlQnlQYXRoKFsuLi5wYXRoLCBTdHJpbmcocHJvcCldLCBub3JtYWxpemVkVmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJhcHBseVwiOlxuXHRcdFx0Y2FzZSBcImNhbGxcIjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uQVBQTFk6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLkNBTEw6XG5cdFx0XHRcdGlmICh0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjb25zdCBjdHggPSBvcHRpb25zLmNvbnRleHQgPz8gKG9wdGlvbnMudGFyZ2V0ID8gdm9pZCAwIDogcmVhZEJ5UGF0aChwYXRoLnNsaWNlKDAsIC0xKSkpO1xuXHRcdFx0XHRcdGNvbnN0IG5vcm1hbGl6ZWRBcmdzID0gZGVlcE9wZXJhdGVBbmRDbG9uZShhcmdzPy5bMF0gPz8gYXJncyA/PyBbXSwgbm9ybWFsaXplUmVmKTtcblx0XHRcdFx0XHRyZXN1bHQgPSByZWZsZWN0LmFwcGx5Py4ob2JqLCBjdHgsIG5vcm1hbGl6ZWRBcmdzKSA/PyBvYmouYXBwbHkoY3R4LCBub3JtYWxpemVkQXJncyk7XG5cdFx0XHRcdFx0aWYgKGlzQ2FuVHJhbnNmZXIocmVzdWx0KSAmJiBwYXRoPy5hdCgtMSkgPT09IFwidHJhbnNmZXJcIiAmJiBjaGFubmVsICE9PSBzZW5kZXIpIHRvVHJhbnNmZXIucHVzaChyZXN1bHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImNvbnN0cnVjdFwiOlxuXHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5DT05TVFJVQ1Q6XG5cdFx0XHRcdGlmICh0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjb25zdCBub3JtYWxpemVkQXJncyA9IGRlZXBPcGVyYXRlQW5kQ2xvbmUoYXJncz8uWzBdID8/IGFyZ3MgPz8gW10sIG5vcm1hbGl6ZVJlZik7XG5cdFx0XHRcdFx0cmVzdWx0ID0gcmVmbGVjdC5jb25zdHJ1Y3Q/LihvYmosIG5vcm1hbGl6ZWRBcmdzKSA/PyBuZXcgb2JqKC4uLm5vcm1hbGl6ZWRBcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJkZWxldGVcIjpcblx0XHRcdGNhc2UgXCJkZWxldGVwcm9wZXJ0eVwiOlxuXHRcdFx0Y2FzZSBcImRpc3Bvc2VcIjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uREVMRVRFOlxuXHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5ERUxFVEVfUFJPUEVSVFk6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLkRJU1BPU0U6XG5cdFx0XHRcdGlmIChvcHRpb25zLnRhcmdldCkge1xuXHRcdFx0XHRcdGNvbnN0IHByb3AgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0cmVzdWx0ID0gcmVmbGVjdC5kZWxldGVQcm9wZXJ0eT8uKG9iaiwgcHJvcCkgPz8gZGVsZXRlIG9ialtwcm9wXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBwYXRoPy5sZW5ndGggPiAwID8gcmVtb3ZlQnlQYXRoKHBhdGgpIDogcmVtb3ZlQnlEYXRhKG9iaik7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdCkgbmV3UGF0aCA9IHJlZ2lzdGVyZWRJblBhdGguZ2V0KG9iaikgPz8gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiaGFzXCI6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLkhBUzpcblx0XHRcdFx0cmVzdWx0ID0gcmVmbGVjdC5oYXM/LihvYmosIGFyZ3M/LlswXSkgPz8gKGlzT2JqZWN0KG9iaikgPyBhcmdzPy5bMF0gaW4gb2JqIDogZmFsc2UpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJvd25rZXlzXCI6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLk9XTl9LRVlTOlxuXHRcdFx0XHRyZXN1bHQgPSByZWZsZWN0Lm93bktleXM/LihvYmopID8/IChpc09iamVjdChvYmopID8gT2JqZWN0LmtleXMob2JqKSA6IFtdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXCI6XG5cdFx0XHRjYXNlIFwiZ2V0cHJvcGVydHlkZXNjcmlwdG9yXCI6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLkdFVF9PV05fUFJPUEVSVFlfREVTQ1JJUFRPUjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uR0VUX1BST1BFUlRZX0RFU0NSSVBUT1I6XG5cdFx0XHRcdHJlc3VsdCA9IHJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPy4ob2JqLCBhcmdzPy5bMF0gPz8gcGF0aD8uYXQoLTEpID8/IFwiXCIpID8/IChpc09iamVjdChvYmopID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGFyZ3M/LlswXSA/PyBwYXRoPy5hdCgtMSkgPz8gXCJcIikgOiB2b2lkIDApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJnZXRwcm90b3R5cGVvZlwiOlxuXHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5HRVRfUFJPVE9UWVBFX09GOlxuXHRcdFx0XHRyZXN1bHQgPSByZWZsZWN0LmdldFByb3RvdHlwZU9mPy4ob2JqKSA/PyAoaXNPYmplY3Qob2JqKSA/IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopIDogbnVsbCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInNldHByb3RvdHlwZW9mXCI6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLlNFVF9QUk9UT1RZUEVfT0Y6XG5cdFx0XHRcdHJlc3VsdCA9IHJlZmxlY3Quc2V0UHJvdG90eXBlT2Y/LihvYmosIGFyZ3M/LlswXSkgPz8gKGlzT2JqZWN0KG9iaikgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqLCBhcmdzPy5bMF0pIDogZmFsc2UpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJpc2V4dGVuc2libGVcIjpcblx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uSVNfRVhURU5TSUJMRTpcblx0XHRcdFx0cmVzdWx0ID0gcmVmbGVjdC5pc0V4dGVuc2libGU/LihvYmopID8/IChpc09iamVjdChvYmopID8gT2JqZWN0LmlzRXh0ZW5zaWJsZShvYmopIDogdHJ1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInByZXZlbnRleHRlbnNpb25zXCI6XG5cdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLlBSRVZFTlRfRVhURU5TSU9OUzogcmVzdWx0ID0gcmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucz8uKG9iaikgPz8gKGlzT2JqZWN0KG9iaikgPyBPYmplY3QucHJldmVudEV4dGVuc2lvbnMob2JqKSA6IGZhbHNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlc3VsdCxcblx0XHRcdHRvVHJhbnNmZXIsXG5cdFx0XHRwYXRoOiBuZXdQYXRoXG5cdFx0fTtcblx0fVxuXHQvKipcblx0KiBCdWlsZCByZXNwb25zZSBvYmplY3Qgd2l0aCBkZXNjcmlwdG9yXG5cdCovXG5cdGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUmVzcG9uc2UocmVxSWQsIGFjdGlvbiwgY2hhbm5lbCwgc2VuZGVyLCBwYXRoLCByYXdSZXN1bHQsIHRvVHJhbnNmZXIpIHtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCByYXdSZXN1bHQ7XG5cdFx0Y29uc3QgY2FuQmVSZXR1cm4gPSBpc0NhblRyYW5zZmVyKHJlc3VsdCkgJiYgdG9UcmFuc2Zlci5pbmNsdWRlcyhyZXN1bHQpIHx8IGlzQ2FuSnVzdFJldHVybihyZXN1bHQpO1xuXHRcdGxldCBmaW5hbFBhdGggPSBwYXRoO1xuXHRcdGlmICghY2FuQmVSZXR1cm4gJiYgYWN0aW9uICE9PSBcImdldFwiICYmIGFjdGlvbiAhPT0gV1JlZmxlY3RBY3Rpb24uR0VUICYmICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiByZXN1bHQgPT09IFwiZnVuY3Rpb25cIikpIHtcblx0XHRcdGlmIChoYXNOb1BhdGgocmVzdWx0KSkge1xuXHRcdFx0XHRmaW5hbFBhdGggPSBbVVVJRHY0KCldO1xuXHRcdFx0XHR3cml0ZUJ5UGF0aChmaW5hbFBhdGgsIHJlc3VsdCk7XG5cdFx0XHR9IGVsc2UgZmluYWxQYXRoID0gcmVnaXN0ZXJlZEluUGF0aC5nZXQocmVzdWx0KSA/PyBbXTtcblx0XHR9XG5cdFx0Y29uc3QgY3R4ID0gcmVhZEJ5UGF0aChmaW5hbFBhdGgpO1xuXHRcdGNvbnN0IGN0eEtleSA9IGFjdGlvbiA9PT0gXCJnZXRcIiB8fCBhY3Rpb24gPT09IFdSZWZsZWN0QWN0aW9uLkdFVCA/IGZpbmFsUGF0aD8uYXQoLTEpIDogdm9pZCAwO1xuXHRcdGNvbnN0IG9iaiA9IHJlYWRCeVBhdGgocGF0aCk7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IGRlZXBPcGVyYXRlQW5kQ2xvbmUocmVzdWx0LCAoZWwpID0+IG9iamVjdFRvUmVmKGVsLCBjaGFubmVsLCB0b1RyYW5zZmVyKSkgPz8gcmVzdWx0O1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZXNwb25zZToge1xuXHRcdFx0XHRjaGFubmVsOiBzZW5kZXIsXG5cdFx0XHRcdHNlbmRlcjogY2hhbm5lbCxcblx0XHRcdFx0cmVxSWQsXG5cdFx0XHRcdGFjdGlvbixcblx0XHRcdFx0dHlwZTogXCJyZXNwb25zZVwiLFxuXHRcdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdFx0cmVzdWx0OiBjYW5CZVJldHVybiA/IHBheWxvYWQgOiBudWxsLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGVvZiByZXN1bHQsXG5cdFx0XHRcdFx0Y2hhbm5lbDogc2VuZGVyLFxuXHRcdFx0XHRcdHNlbmRlcjogY2hhbm5lbCxcblx0XHRcdFx0XHRkZXNjcmlwdG9yOiB7XG5cdFx0XHRcdFx0XHQkaXNEZXNjcmlwdG9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0cGF0aDogZmluYWxQYXRoLFxuXHRcdFx0XHRcdFx0b3duZXI6IGNoYW5uZWwsXG5cdFx0XHRcdFx0XHRjaGFubmVsLFxuXHRcdFx0XHRcdFx0cHJpbWl0aXZlOiBpc1ByaW1pdGl2ZShyZXN1bHQpLFxuXHRcdFx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YXJndW1lbnRDb3VudDogb2JqIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBvYmoubGVuZ3RoIDogLTEsXG5cdFx0XHRcdFx0XHQuLi5pc09iamVjdChjdHgpICYmIGN0eEtleSAhPSBudWxsID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdHgsIGN0eEtleSkgOiB7fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHRyYW5zZmVyOiB0b1RyYW5zZmVyXG5cdFx0fTtcblx0fVxuXHQvKipcblx0KiBIYW5kbGUgcmVxdWVzdCBhbmQgcmV0dXJuIHJlc3BvbnNlICh1bmlmaWVkIGhhbmRsZXIpXG5cdCovXG5cdGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdCwgcmVxSWQsIGNoYW5uZWxOYW1lLCBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBjaGFubmVsLCBzZW5kZXIsIHBhdGgsIGFjdGlvbiwgYXJncyB9ID0gcmVxdWVzdDtcblx0XHRpZiAoY2hhbm5lbCAhPT0gY2hhbm5lbE5hbWUpIHJldHVybiBudWxsO1xuXHRcdGNvbnN0IHsgcmVzdWx0LCB0b1RyYW5zZmVyLCBwYXRoOiBuZXdQYXRoIH0gPSBleGVjdXRlQWN0aW9uKGFjdGlvbiwgcGF0aCwgYXJncywge1xuXHRcdFx0Y2hhbm5lbCxcblx0XHRcdHNlbmRlcixcblx0XHRcdC4uLm9wdGlvbnNcblx0XHR9KTtcblx0XHRyZXR1cm4gYnVpbGRSZXNwb25zZShyZXFJZCwgYWN0aW9uLCBjaGFubmVsTmFtZSwgc2VuZGVyLCBuZXdQYXRoLCByZXN1bHQsIHRvVHJhbnNmZXIpO1xuXHR9XG5cdC8qKlxuXHQqIENyZWF0ZSBhIHNpbXBsZSBleHBvc2UgaGFuZGxlciBmb3IgYW4gb2JqZWN0XG5cdCpcblx0KiBVbmxpa2UgdGhlIGZ1bGwgZXhlY3V0ZUFjdGlvbiwgdGhpcyB3b3JrcyBkaXJlY3RseSBvbiB0aGUgdGFyZ2V0XG5cdCogd2l0aG91dCBEYXRhQmFzZSBpbnRlZ3JhdGlvbi4gVXNlZCBieSBQcm94eS50cyBjcmVhdGVFeHBvc2VIYW5kbGVyLlxuXHQqXG5cdCogQHBhcmFtIHRhcmdldCAtIE9iamVjdCB0byBleHBvc2Vcblx0KiBAcGFyYW0gcmVmbGVjdCAtIE9wdGlvbmFsIGN1c3RvbSBSZWZsZWN0IGltcGxlbWVudGF0aW9uXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZU9iamVjdEhhbmRsZXIodGFyZ2V0LCByZWZsZWN0ID0gZGVmYXVsdFJlZmxlY3QpIHtcblx0XHRyZXR1cm4gYXN5bmMgKGFjdGlvbiwgcGF0aCwgYXJncykgPT4ge1xuXHRcdFx0bGV0IHBhcmVudCA9IHRhcmdldDtcblx0XHRcdGxldCBjdXJyZW50ID0gdGFyZ2V0O1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHBhcmVudCA9IGN1cnJlbnQ7XG5cdFx0XHRcdGN1cnJlbnQgPSBjdXJyZW50Py5bcGF0aFtpXV07XG5cdFx0XHRcdGlmIChjdXJyZW50ID09PSB2b2lkIDAgJiYgaSA8IHBhdGgubGVuZ3RoIC0gMSkgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHNlZ21lbnQgJyR7cGF0aFtpXX0nIG5vdCBmb3VuZGApO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcblx0XHRcdHN3aXRjaCAoU3RyaW5nKGFjdGlvbikudG9Mb3dlckNhc2UoKSkge1xuXHRcdFx0XHRjYXNlIFwiZ2V0XCI6XG5cdFx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uR0VUOiByZXR1cm4gY3VycmVudDtcblx0XHRcdFx0Y2FzZSBcInNldFwiOlxuXHRcdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLlNFVDpcblx0XHRcdFx0XHRwYXJlbnRbcHJvcF0gPSBhcmdzWzBdO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRjYXNlIFwiY2FsbFwiOlxuXHRcdFx0XHRjYXNlIFwiYXBwbHlcIjpcblx0XHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5BUFBMWTpcblx0XHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5DQUxMOlxuXHRcdFx0XHRcdGlmICh0eXBlb2YgY3VycmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjYWxsQXJncyA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcblx0XHRcdFx0XHRcdHJldHVybiBhd2FpdCBjdXJyZW50LmFwcGx5KHBhcmVudCwgY2FsbEFyZ3MpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCcke3Byb3B9JyBpcyBub3QgYSBmdW5jdGlvbmApO1xuXHRcdFx0XHRjYXNlIFwiY29uc3RydWN0XCI6XG5cdFx0XHRcdGNhc2UgV1JlZmxlY3RBY3Rpb24uQ09OU1RSVUNUOlxuXHRcdFx0XHRcdGlmICh0eXBlb2YgY3VycmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjdG9yQXJncyA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcblx0XHRcdFx0XHRcdHJldHVybiBuZXcgY3VycmVudCguLi5jdG9yQXJncyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJyR7cHJvcH0nIGlzIG5vdCBhIGNvbnN0cnVjdG9yYCk7XG5cdFx0XHRcdGNhc2UgXCJoYXNcIjpcblx0XHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5IQVM6IHJldHVybiBwcm9wIGluIHBhcmVudDtcblx0XHRcdFx0Y2FzZSBcImRlbGV0ZVwiOlxuXHRcdFx0XHRjYXNlIFwiZGVsZXRlcHJvcGVydHlcIjpcblx0XHRcdFx0Y2FzZSBXUmVmbGVjdEFjdGlvbi5ERUxFVEVfUFJPUEVSVFk6IHJldHVybiBkZWxldGUgcGFyZW50W3Byb3BdO1xuXHRcdFx0XHRjYXNlIFwib3dua2V5c1wiOlxuXHRcdFx0XHRjYXNlIFdSZWZsZWN0QWN0aW9uLk9XTl9LRVlTOiByZXR1cm4gT2JqZWN0LmtleXMoY3VycmVudCA/PyBwYXJlbnQpO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm4gY3VycmVudDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uL3VuaWZvcm0udHMvc3JjL25ld2VyL25leHQvY2hhbm5lbC9Db25uZWN0aW9uLnRzXG4vKipcblx0KiBDaGFubmVsIENvbm5lY3Rpb24gLSBDb25uZWN0aW9uIGFic3RyYWN0aW9uIGxheWVyXG5cdCpcblx0KiBQcm92aWRlcyBjb25uZWN0aW9uIHBvb2xpbmcsIHN0YXRlIG1hbmFnZW1lbnQsIGFuZCBtZXNzYWdlIHJvdXRpbmcuXG5cdCovXG5cdHZhciBDaGFubmVsQ29ubmVjdGlvbiA9IGNsYXNzIHtcblx0XHRfbmFtZTtcblx0XHRfdHJhbnNwb3J0VHlwZTtcblx0XHRfaWQgPSBVVUlEdjQoKTtcblx0XHRfc3RhdGUgPSBcImRpc2Nvbm5lY3RlZFwiO1xuXHRcdF9pbmJvdW5kID0gbmV3IENoYW5uZWxTdWJqZWN0KHsgYnVmZmVyU2l6ZTogMWUzIH0pO1xuXHRcdF9vdXRib3VuZCA9IG5ldyBDaGFubmVsU3ViamVjdCh7IGJ1ZmZlclNpemU6IDFlMyB9KTtcblx0XHRfc3RhdGVDaGFuZ2VzID0gbmV3IENoYW5uZWxTdWJqZWN0KCk7XG5cdFx0X2Nvbm5lY3RlZFBlZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfc3VicyA9IFtdO1xuXHRcdF9zdGF0cyA9IHtcblx0XHRcdG1lc3NhZ2VzU2VudDogMCxcblx0XHRcdG1lc3NhZ2VzUmVjZWl2ZWQ6IDAsXG5cdFx0XHRieXRlc1RyYW5zZmVycmVkOiAwLFxuXHRcdFx0bGF0ZW5jeU1zOiAwLFxuXHRcdFx0dXB0aW1lOiAwLFxuXHRcdFx0cmVjb25uZWN0Q291bnQ6IDBcblx0XHR9O1xuXHRcdF9zdGFydFRpbWUgPSAwO1xuXHRcdF9wZW5kaW5nID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfYnVmZmVyID0gW107XG5cdFx0X29wdHM7XG5cdFx0Y29uc3RydWN0b3IoX25hbWUsIF90cmFuc3BvcnRUeXBlID0gXCJpbnRlcm5hbFwiLCBvcHRpb25zID0ge30pIHtcblx0XHRcdHRoaXMuX25hbWUgPSBfbmFtZTtcblx0XHRcdHRoaXMuX3RyYW5zcG9ydFR5cGUgPSBfdHJhbnNwb3J0VHlwZTtcblx0XHRcdHRoaXMuX29wdHMgPSB7XG5cdFx0XHRcdHRpbWVvdXQ6IDNlNCxcblx0XHRcdFx0YXV0b1JlY29ubmVjdDogdHJ1ZSxcblx0XHRcdFx0cmVjb25uZWN0SW50ZXJ2YWw6IDFlMyxcblx0XHRcdFx0bWF4UmVjb25uZWN0QXR0ZW1wdHM6IDUsXG5cdFx0XHRcdGJ1ZmZlck1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0XHRidWZmZXJTaXplOiAxZTMsXG5cdFx0XHRcdG1ldGFkYXRhOiB7fSxcblx0XHRcdFx0Li4ub3B0aW9uc1xuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldHVwU3Vic2NyaXB0aW9ucygpO1xuXHRcdH1cblx0XHRzdWJzY3JpYmUob2JzZXJ2ZXIsIGZyb21DaGFubmVsKSB7XG5cdFx0XHRyZXR1cm4gKGZyb21DaGFubmVsID8gZmlsdGVyKChtKSA9PiBtLnNlbmRlciA9PT0gZnJvbUNoYW5uZWwpKHRoaXMuX2luYm91bmQpIDogdGhpcy5faW5ib3VuZCkuc3Vic2NyaWJlKHR5cGVvZiBvYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBvYnNlcnZlciB9IDogb2JzZXJ2ZXIpO1xuXHRcdH1cblx0XHRuZXh0KG1lc3NhZ2UpIHtcblx0XHRcdGlmICh0aGlzLl9zdGF0ZSAhPT0gXCJjb25uZWN0ZWRcIikge1xuXHRcdFx0XHRpZiAodGhpcy5fb3B0cy5idWZmZXJNZXNzYWdlcyAmJiB0aGlzLl9idWZmZXIubGVuZ3RoIDwgdGhpcy5fb3B0cy5idWZmZXJTaXplKSB0aGlzLl9idWZmZXIucHVzaChtZXNzYWdlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fb3V0Ym91bmQubmV4dChtZXNzYWdlKTtcblx0XHRcdHRoaXMuX3N0YXRzLm1lc3NhZ2VzU2VudCsrO1xuXHRcdH1cblx0XHRhc3luYyByZXF1ZXN0KHRvQ2hhbm5lbCwgcGF5bG9hZCwgb3B0cyA9IHt9KSB7XG5cdFx0XHRjb25zdCByZXFJZCA9IFVVSUR2NCgpO1xuXHRcdFx0Y29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG5cdFx0XHR0aGlzLl9wZW5kaW5nLnNldChyZXFJZCwgcmVzb2x2ZXJzKTtcblx0XHRcdGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuX3BlbmRpbmcuaGFzKHJlcUlkKSkge1xuXHRcdFx0XHRcdHRoaXMuX3BlbmRpbmcuZGVsZXRlKHJlcUlkKTtcblx0XHRcdFx0XHRyZXNvbHZlcnMucmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dGApKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgb3B0cy50aW1lb3V0ID8/IHRoaXMuX29wdHMudGltZW91dCk7XG5cdFx0XHR0aGlzLm5leHQoe1xuXHRcdFx0XHRpZDogVVVJRHY0KCksXG5cdFx0XHRcdGNoYW5uZWw6IHRvQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0eXBlOiBcInJlcXVlc3RcIixcblx0XHRcdFx0cmVxSWQsXG5cdFx0XHRcdHBheWxvYWQ6IHtcblx0XHRcdFx0XHQuLi5wYXlsb2FkLFxuXHRcdFx0XHRcdGFjdGlvbjogb3B0cy5hY3Rpb24sXG5cdFx0XHRcdFx0cGF0aDogb3B0cy5wYXRoXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZXJzLnByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuXHRcdH1cblx0XHRyZXNwb25kKG9yaWdpbmFsLCBwYXlsb2FkKSB7XG5cdFx0XHR0aGlzLm5leHQoe1xuXHRcdFx0XHRpZDogVVVJRHY0KCksXG5cdFx0XHRcdGNoYW5uZWw6IG9yaWdpbmFsLnNlbmRlcixcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0eXBlOiBcInJlc3BvbnNlXCIsXG5cdFx0XHRcdHJlcUlkOiBvcmlnaW5hbC5yZXFJZCxcblx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZW1pdCh0b0NoYW5uZWwsIGV2ZW50VHlwZSwgZGF0YSkge1xuXHRcdFx0dGhpcy5uZXh0KHtcblx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHRjaGFubmVsOiB0b0NoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHlwZTogXCJldmVudFwiLFxuXHRcdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdFx0dHlwZTogZXZlbnRUeXBlLFxuXHRcdFx0XHRcdGRhdGFcblx0XHRcdFx0fSxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0c3Vic2NyaWJlT3V0Ym91bmQob2JzZXJ2ZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vdXRib3VuZC5zdWJzY3JpYmUodHlwZW9mIG9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIgPyB7IG5leHQ6IG9ic2VydmVyIH0gOiBvYnNlcnZlcik7XG5cdFx0fVxuXHRcdHB1c2hJbmJvdW5kKG1lc3NhZ2UpIHtcblx0XHRcdHRoaXMuX3N0YXRzLm1lc3NhZ2VzUmVjZWl2ZWQrKztcblx0XHRcdGlmIChtZXNzYWdlLnR5cGUgPT09IFwicmVzcG9uc2VcIiAmJiBtZXNzYWdlLnJlcUlkKSB7XG5cdFx0XHRcdGNvbnN0IHIgPSB0aGlzLl9wZW5kaW5nLmdldChtZXNzYWdlLnJlcUlkKTtcblx0XHRcdFx0aWYgKHIpIHtcblx0XHRcdFx0XHR0aGlzLl9wZW5kaW5nLmRlbGV0ZShtZXNzYWdlLnJlcUlkKTtcblx0XHRcdFx0XHRyLnJlc29sdmUobWVzc2FnZS5wYXlsb2FkKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX2luYm91bmQubmV4dChtZXNzYWdlKTtcblx0XHR9XG5cdFx0YXN5bmMgY29ubmVjdCgpIHtcblx0XHRcdGlmICh0aGlzLl9zdGF0ZSA9PT0gXCJjb25uZWN0ZWRcIikgcmV0dXJuO1xuXHRcdFx0dGhpcy5fc2V0U3RhdGUoXCJjb25uZWN0aW5nXCIpO1xuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblx0XHRcdHRoaXMuX3NldFN0YXRlKFwiY29ubmVjdGVkXCIpO1xuXHRcdFx0dGhpcy5fZmx1c2hCdWZmZXIoKTtcblx0XHR9XG5cdFx0ZGlzY29ubmVjdCgpIHtcblx0XHRcdGlmICh0aGlzLl9zdGF0ZSA9PT0gXCJkaXNjb25uZWN0ZWRcIiB8fCB0aGlzLl9zdGF0ZSA9PT0gXCJjbG9zZWRcIikgcmV0dXJuO1xuXHRcdFx0dGhpcy5fc2V0U3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG5cdFx0XHR0aGlzLl9zdWJzLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG5cdFx0XHR0aGlzLl9zdWJzID0gW107XG5cdFx0fVxuXHRcdGNsb3NlKCkge1xuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLl9zZXRTdGF0ZShcImNsb3NlZFwiKTtcblx0XHRcdHRoaXMuX2luYm91bmQuY29tcGxldGUoKTtcblx0XHRcdHRoaXMuX291dGJvdW5kLmNvbXBsZXRlKCk7XG5cdFx0XHR0aGlzLl9zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcblx0XHR9XG5cdFx0bWFya0Nvbm5lY3RlZCgpIHtcblx0XHRcdHRoaXMuX3NldFN0YXRlKFwiY29ubmVjdGVkXCIpO1xuXHRcdFx0dGhpcy5fZmx1c2hCdWZmZXIoKTtcblx0XHR9XG5cdFx0bWFya0Rpc2Nvbm5lY3RlZCgpIHtcblx0XHRcdHRoaXMuX3NldFN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuXHRcdH1cblx0XHRfc2V0U3RhdGUoc3RhdGUpIHtcblx0XHRcdGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcblx0XHRcdFx0dGhpcy5fc3RhdGUgPSBzdGF0ZTtcblx0XHRcdFx0dGhpcy5fc3RhdGVDaGFuZ2VzLm5leHQoc3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRfZmx1c2hCdWZmZXIoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLl9idWZmZXIpIHRoaXMuX291dGJvdW5kLm5leHQobXNnKTtcblx0XHRcdHRoaXMuX2J1ZmZlciA9IFtdO1xuXHRcdH1cblx0XHRfc2V0dXBTdWJzY3JpcHRpb25zKCkge1xuXHRcdFx0dGhpcy5fc3Vicy5wdXNoKHRoaXMuX2luYm91bmQuc3Vic2NyaWJlKHsgbmV4dDogKG1zZykgPT4ge1xuXHRcdFx0XHRpZiAobXNnLnR5cGUgPT09IFwic2lnbmFsXCIgJiYgbXNnLnBheWxvYWQ/LnR5cGUgPT09IFwiY29ubmVjdFwiKSB0aGlzLl9jb25uZWN0ZWRQZWVycy5zZXQobXNnLnNlbmRlciwge1xuXHRcdFx0XHRcdG5hbWU6IG1zZy5zZW5kZXIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiY29ubmVjdGVkXCIsXG5cdFx0XHRcdFx0aXNIb3N0OiBmYWxzZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gfSkpO1xuXHRcdH1cblx0XHRnZXQgaWQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faWQ7XG5cdFx0fVxuXHRcdGdldCBuYW1lKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX25hbWU7XG5cdFx0fVxuXHRcdGdldCBzdGF0ZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9zdGF0ZTtcblx0XHR9XG5cdFx0Z2V0IHRyYW5zcG9ydFR5cGUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdHJhbnNwb3J0VHlwZTtcblx0XHR9XG5cdFx0Z2V0IHN0YXRzKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4udGhpcy5fc3RhdHMsXG5cdFx0XHRcdHVwdGltZTogdGhpcy5fc3RhcnRUaW1lID8gRGF0ZS5ub3coKSAtIHRoaXMuX3N0YXJ0VGltZSA6IDBcblx0XHRcdH07XG5cdFx0fVxuXHRcdGdldCBzdGF0ZUNoYW5nZXMoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fc3RhdGVDaGFuZ2VzO1xuXHRcdH1cblx0XHRnZXQgY29ubmVjdGVkUGVlcnMoKSB7XG5cdFx0XHRyZXR1cm4gWy4uLnRoaXMuX2Nvbm5lY3RlZFBlZXJzLmtleXMoKV07XG5cdFx0fVxuXHRcdGdldCBtZXRhKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHRoaXMuX2lkLFxuXHRcdFx0XHRuYW1lOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHRzdGF0ZTogdGhpcy5fc3RhdGUsXG5cdFx0XHRcdGlzSG9zdDogZmFsc2UsXG5cdFx0XHRcdGNvbm5lY3RlZENoYW5uZWxzOiBuZXcgU2V0KHRoaXMuX2Nvbm5lY3RlZFBlZXJzLmtleXMoKSlcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xuXHR2YXIgQ29ubmVjdGlvblBvb2wgPSBjbGFzcyBDb25uZWN0aW9uUG9vbCB7XG5cdFx0X2Nvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRzdGF0aWMgX2luc3RhbmNlID0gbnVsbDtcblx0XHRzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG5cdFx0XHRpZiAoIUNvbm5lY3Rpb25Qb29sLl9pbnN0YW5jZSkgQ29ubmVjdGlvblBvb2wuX2luc3RhbmNlID0gbmV3IENvbm5lY3Rpb25Qb29sKCk7XG5cdFx0XHRyZXR1cm4gQ29ubmVjdGlvblBvb2wuX2luc3RhbmNlO1xuXHRcdH1cblx0XHRnZXRPckNyZWF0ZShuYW1lLCB0cmFuc3BvcnRUeXBlID0gXCJpbnRlcm5hbFwiLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGlmICghdGhpcy5fY29ubmVjdGlvbnMuaGFzKG5hbWUpKSB0aGlzLl9jb25uZWN0aW9ucy5zZXQobmFtZSwgbmV3IENoYW5uZWxDb25uZWN0aW9uKG5hbWUsIHRyYW5zcG9ydFR5cGUsIG9wdGlvbnMpKTtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9ucy5nZXQobmFtZSk7XG5cdFx0fVxuXHRcdGdldChuYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG5hbWUpO1xuXHRcdH1cblx0XHRoYXMobmFtZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zLmhhcyhuYW1lKTtcblx0XHR9XG5cdFx0ZGVsZXRlKG5hbWUpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25zLmdldChuYW1lKT8uY2xvc2UoKTtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUobmFtZSk7XG5cdFx0fVxuXHRcdGNsZWFyKCkge1xuXHRcdFx0dGhpcy5fY29ubmVjdGlvbnMuZm9yRWFjaCgoYykgPT4gYy5jbG9zZSgpKTtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKCk7XG5cdFx0fVxuXHRcdGdldCBzaXplKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zLnNpemU7XG5cdFx0fVxuXHRcdGdldCBuYW1lcygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fY29ubmVjdGlvbnMua2V5cygpXTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGdldENvbm5lY3Rpb25Qb29sID0gKCkgPT4gQ29ubmVjdGlvblBvb2wuZ2V0SW5zdGFuY2UoKTtcblx0Y29uc3QgZ2V0Q29ubmVjdGlvbiA9IChuYW1lLCB0cmFuc3BvcnRUeXBlLCBvcHRpb25zKSA9PiBnZXRDb25uZWN0aW9uUG9vbCgpLmdldE9yQ3JlYXRlKG5hbWUsIHRyYW5zcG9ydFR5cGUsIG9wdGlvbnMpO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL3NyYy9uZXdlci9uZXh0L3N0b3JhZ2UvU3RvcmFnZS50c1xuLyoqXG5cdCogSW5kZXhlZERCIEludGVncmF0aW9uIGZvciBDaGFubmVsIFN5c3RlbVxuXHQqXG5cdCogUHJvdmlkZXMgcGVyc2lzdGVudCBzdG9yYWdlIGNhcGFiaWxpdGllcyBmb3IgY2hhbm5lbCBjb21tdW5pY2F0aW9uOlxuXHQqIC0gRGVmZXI6IFF1ZXVlIG1lc3NhZ2VzIGZvciBsYXRlciBkZWxpdmVyeVxuXHQqIC0gUGVuZGluZzogVHJhY2sgcGVuZGluZyBvcGVyYXRpb25zXG5cdCogLSBNYWlsYm94L0luYm94OiBTdG9yZSBtZXNzYWdlcyBwZXIgY2hhbm5lbFxuXHQqIC0gVHJhbnNhY3Rpb25zOiBCYXRjaCBvcGVyYXRpb25zIHdpdGggcm9sbGJhY2tcblx0KiAtIEV4Y2hhbmdlOiBDb29yZGluYXRlIGRhdGEgYmV0d2VlbiBjb250ZXh0c1xuXHQqL1xuXHRjb25zdCBEQl9OQU1FID0gXCJ1bmlmb3JtX2NoYW5uZWxzXCI7XG5cdGNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXHRjb25zdCBTVE9SRVMgPSB7XG5cdFx0TUVTU0FHRVM6IFwibWVzc2FnZXNcIixcblx0XHRNQUlMQk9YOiBcIm1haWxib3hcIixcblx0XHRQRU5ESU5HOiBcInBlbmRpbmdcIixcblx0XHRFWENIQU5HRTogXCJleGNoYW5nZVwiLFxuXHRcdFRSQU5TQUNUSU9OUzogXCJ0cmFuc2FjdGlvbnNcIlxuXHR9O1xuXHQvKipcblx0KiBJbmRleGVkREIgbWFuYWdlciBmb3IgY2hhbm5lbCBzdG9yYWdlXG5cdCovXG5cdHZhciBDaGFubmVsU3RvcmFnZSA9IGNsYXNzIHtcblx0XHRfZGIgPSBudWxsO1xuXHRcdF9pc09wZW4gPSBmYWxzZTtcblx0XHRfb3BlblByb21pc2UgPSBudWxsO1xuXHRcdF9jaGFubmVsTmFtZTtcblx0XHRfbWVzc2FnZVVwZGF0ZXMgPSBuZXcgQ2hhbm5lbFN1YmplY3QoKTtcblx0XHRfZXhjaGFuZ2VVcGRhdGVzID0gbmV3IENoYW5uZWxTdWJqZWN0KCk7XG5cdFx0Y29uc3RydWN0b3IoY2hhbm5lbE5hbWUpIHtcblx0XHRcdHRoaXMuX2NoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogT3BlbiBkYXRhYmFzZSBjb25uZWN0aW9uXG5cdFx0Ki9cblx0XHRhc3luYyBvcGVuKCkge1xuXHRcdFx0aWYgKHRoaXMuX2RiICYmIHRoaXMuX2lzT3BlbikgcmV0dXJuIHRoaXMuX2RiO1xuXHRcdFx0aWYgKHRoaXMuX29wZW5Qcm9taXNlKSByZXR1cm4gdGhpcy5fb3BlblByb21pc2U7XG5cdFx0XHR0aGlzLl9vcGVuUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIERCX1ZFUlNJT04pO1xuXHRcdFx0XHRyZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fb3BlblByb21pc2UgPSBudWxsO1xuXHRcdFx0XHRcdHJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIG9wZW4gSW5kZXhlZERCXCIpKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fZGIgPSByZXF1ZXN0LnJlc3VsdDtcblx0XHRcdFx0XHR0aGlzLl9pc09wZW4gPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuX29wZW5Qcm9taXNlID0gbnVsbDtcblx0XHRcdFx0XHRyZXNvbHZlKHRoaXMuX2RiKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fY3JlYXRlU3RvcmVzKGRiKTtcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29wZW5Qcm9taXNlO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb25cblx0XHQqL1xuXHRcdGNsb3NlKCkge1xuXHRcdFx0aWYgKHRoaXMuX2RiKSB7XG5cdFx0XHRcdHRoaXMuX2RiLmNsb3NlKCk7XG5cdFx0XHRcdHRoaXMuX2RiID0gbnVsbDtcblx0XHRcdFx0dGhpcy5faXNPcGVuID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdF9jcmVhdGVTdG9yZXMoZGIpIHtcblx0XHRcdGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRVMuTUVTU0FHRVMpKSB7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VzU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRVMuTUVTU0FHRVMsIHsga2V5UGF0aDogXCJpZFwiIH0pO1xuXHRcdFx0XHRtZXNzYWdlc1N0b3JlLmNyZWF0ZUluZGV4KFwiY2hhbm5lbFwiLCBcImNoYW5uZWxcIiwgeyB1bmlxdWU6IGZhbHNlIH0pO1xuXHRcdFx0XHRtZXNzYWdlc1N0b3JlLmNyZWF0ZUluZGV4KFwic3RhdHVzXCIsIFwic3RhdHVzXCIsIHsgdW5pcXVlOiBmYWxzZSB9KTtcblx0XHRcdFx0bWVzc2FnZXNTdG9yZS5jcmVhdGVJbmRleChcInJlY2lwaWVudFwiLCBcInJlY2lwaWVudFwiLCB7IHVuaXF1ZTogZmFsc2UgfSk7XG5cdFx0XHRcdG1lc3NhZ2VzU3RvcmUuY3JlYXRlSW5kZXgoXCJjcmVhdGVkQXRcIiwgXCJjcmVhdGVkQXRcIiwgeyB1bmlxdWU6IGZhbHNlIH0pO1xuXHRcdFx0XHRtZXNzYWdlc1N0b3JlLmNyZWF0ZUluZGV4KFwiY2hhbm5lbF9zdGF0dXNcIiwgW1wiY2hhbm5lbFwiLCBcInN0YXR1c1wiXSwgeyB1bmlxdWU6IGZhbHNlIH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFUy5NQUlMQk9YKSkge1xuXHRcdFx0XHRjb25zdCBtYWlsYm94U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRVMuTUFJTEJPWCwgeyBrZXlQYXRoOiBcImlkXCIgfSk7XG5cdFx0XHRcdG1haWxib3hTdG9yZS5jcmVhdGVJbmRleChcImNoYW5uZWxcIiwgXCJjaGFubmVsXCIsIHsgdW5pcXVlOiBmYWxzZSB9KTtcblx0XHRcdFx0bWFpbGJveFN0b3JlLmNyZWF0ZUluZGV4KFwicHJpb3JpdHlcIiwgXCJwcmlvcml0eVwiLCB7IHVuaXF1ZTogZmFsc2UgfSk7XG5cdFx0XHRcdG1haWxib3hTdG9yZS5jcmVhdGVJbmRleChcImV4cGlyZXNBdFwiLCBcImV4cGlyZXNBdFwiLCB7IHVuaXF1ZTogZmFsc2UgfSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkVTLlBFTkRJTkcpKSB7XG5cdFx0XHRcdGNvbnN0IHBlbmRpbmdTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFUy5QRU5ESU5HLCB7IGtleVBhdGg6IFwiaWRcIiB9KTtcblx0XHRcdFx0cGVuZGluZ1N0b3JlLmNyZWF0ZUluZGV4KFwiY2hhbm5lbFwiLCBcImNoYW5uZWxcIiwgeyB1bmlxdWU6IGZhbHNlIH0pO1xuXHRcdFx0XHRwZW5kaW5nU3RvcmUuY3JlYXRlSW5kZXgoXCJjcmVhdGVkQXRcIiwgXCJjcmVhdGVkQXRcIiwgeyB1bmlxdWU6IGZhbHNlIH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFUy5FWENIQU5HRSkpIHtcblx0XHRcdFx0Y29uc3QgZXhjaGFuZ2VTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFUy5FWENIQU5HRSwgeyBrZXlQYXRoOiBcImlkXCIgfSk7XG5cdFx0XHRcdGV4Y2hhbmdlU3RvcmUuY3JlYXRlSW5kZXgoXCJrZXlcIiwgXCJrZXlcIiwgeyB1bmlxdWU6IHRydWUgfSk7XG5cdFx0XHRcdGV4Y2hhbmdlU3RvcmUuY3JlYXRlSW5kZXgoXCJvd25lclwiLCBcIm93bmVyXCIsIHsgdW5pcXVlOiBmYWxzZSB9KTtcblx0XHRcdH1cblx0XHRcdGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRVMuVFJBTlNBQ1RJT05TKSkgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVTLlRSQU5TQUNUSU9OUywgeyBrZXlQYXRoOiBcImlkXCIgfSkuY3JlYXRlSW5kZXgoXCJjcmVhdGVkQXRcIiwgXCJjcmVhdGVkQXRcIiwgeyB1bmlxdWU6IGZhbHNlIH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIERlZmVyIGEgbWVzc2FnZSBmb3IgbGF0ZXIgZGVsaXZlcnlcblx0XHQqL1xuXHRcdGFzeW5jIGRlZmVyKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdGNvbnN0IHN0b3JlZE1lc3NhZ2UgPSB7XG5cdFx0XHRcdGlkOiBVVUlEdjQoKSxcblx0XHRcdFx0Y2hhbm5lbDogbWVzc2FnZS5jaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IG1lc3NhZ2Uuc2VuZGVyID8/IHRoaXMuX2NoYW5uZWxOYW1lLFxuXHRcdFx0XHRyZWNpcGllbnQ6IG1lc3NhZ2UuY2hhbm5lbCxcblx0XHRcdFx0dHlwZTogbWVzc2FnZS50eXBlLFxuXHRcdFx0XHRwYXlsb2FkOiBtZXNzYWdlLnBheWxvYWQsXG5cdFx0XHRcdHN0YXR1czogXCJwZW5kaW5nXCIsXG5cdFx0XHRcdHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8/IDAsXG5cdFx0XHRcdGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcblx0XHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0XHRleHBpcmVzQXQ6IG9wdGlvbnMuZXhwaXJlc0luID8gRGF0ZS5ub3coKSArIG9wdGlvbnMuZXhwaXJlc0luIDogbnVsbCxcblx0XHRcdFx0cmV0cnlDb3VudDogMCxcblx0XHRcdFx0bWF4UmV0cmllczogb3B0aW9ucy5tYXhSZXRyaWVzID8/IDMsXG5cdFx0XHRcdG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihbU1RPUkVTLk1FU1NBR0VTLCBTVE9SRVMuTUFJTEJPWF0sIFwicmVhZHdyaXRlXCIpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlc1N0b3JlID0gdHgub2JqZWN0U3RvcmUoU1RPUkVTLk1FU1NBR0VTKTtcblx0XHRcdFx0Y29uc3QgbWFpbGJveFN0b3JlID0gdHgub2JqZWN0U3RvcmUoU1RPUkVTLk1BSUxCT1gpO1xuXHRcdFx0XHRtZXNzYWdlc1N0b3JlLmFkZChzdG9yZWRNZXNzYWdlKTtcblx0XHRcdFx0bWFpbGJveFN0b3JlLmFkZChzdG9yZWRNZXNzYWdlKTtcblx0XHRcdFx0dHgub25jb21wbGV0ZSA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9tZXNzYWdlVXBkYXRlcy5uZXh0KHN0b3JlZE1lc3NhZ2UpO1xuXHRcdFx0XHRcdHJlc29sdmUoc3RvcmVkTWVzc2FnZS5pZCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHR4Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBkZWZlciBtZXNzYWdlXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBkZWZlcnJlZCBtZXNzYWdlcyBmb3IgYSBjaGFubmVsXG5cdFx0Ki9cblx0XHRhc3luYyBnZXREZWZlcnJlZE1lc3NhZ2VzKGNoYW5uZWwsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0b3JlID0gZGIudHJhbnNhY3Rpb24oU1RPUkVTLk1FU1NBR0VTLCBcInJlYWRvbmx5XCIpLm9iamVjdFN0b3JlKFNUT1JFUy5NRVNTQUdFUyk7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gb3B0aW9ucy5zdGF0dXMgPyBzdG9yZS5pbmRleChcImNoYW5uZWxfc3RhdHVzXCIpIDogc3RvcmUuaW5kZXgoXCJjaGFubmVsXCIpO1xuXHRcdFx0XHRjb25zdCBxdWVyeSA9IG9wdGlvbnMuc3RhdHVzID8gSURCS2V5UmFuZ2Uub25seShbY2hhbm5lbCwgb3B0aW9ucy5zdGF0dXNdKSA6IElEQktleVJhbmdlLm9ubHkoY2hhbm5lbCk7XG5cdFx0XHRcdGNvbnN0IHJlcXVlc3QgPSBpbmRleC5nZXRBbGwocXVlcnksIG9wdGlvbnMubGltaXQpO1xuXHRcdFx0XHRyZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRsZXQgcmVzdWx0cyA9IHJlcXVlc3QucmVzdWx0O1xuXHRcdFx0XHRcdGlmIChvcHRpb25zLm9mZnNldCkgcmVzdWx0cyA9IHJlc3VsdHMuc2xpY2Uob3B0aW9ucy5vZmZzZXQpO1xuXHRcdFx0XHRcdHJlc29sdmUocmVzdWx0cyk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBkZWZlcnJlZCBtZXNzYWdlc1wiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBQcm9jZXNzIG5leHQgcGVuZGluZyBtZXNzYWdlXG5cdFx0Ki9cblx0XHRhc3luYyBwcm9jZXNzTmV4dFBlbmRpbmcoY2hhbm5lbCkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlcXVlc3QgPSBkYi50cmFuc2FjdGlvbihTVE9SRVMuTUVTU0FHRVMsIFwicmVhZHdyaXRlXCIpLm9iamVjdFN0b3JlKFNUT1JFUy5NRVNTQUdFUykuaW5kZXgoXCJjaGFubmVsX3N0YXR1c1wiKS5vcGVuQ3Vyc29yKElEQktleVJhbmdlLm9ubHkoW2NoYW5uZWwsIFwicGVuZGluZ1wiXSkpO1xuXHRcdFx0XHRyZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjdXJzb3IgPSByZXF1ZXN0LnJlc3VsdDtcblx0XHRcdFx0XHRpZiAoY3Vyc29yKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gY3Vyc29yLnZhbHVlO1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zdGF0dXMgPSBcInByb2Nlc3NpbmdcIjtcblx0XHRcdFx0XHRcdG1lc3NhZ2UudXBkYXRlZEF0ID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0XHRcdGN1cnNvci51cGRhdGUobWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9tZXNzYWdlVXBkYXRlcy5uZXh0KG1lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShtZXNzYWdlKTtcblx0XHRcdFx0XHR9IGVsc2UgcmVzb2x2ZShudWxsKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcHJvY2VzcyBwZW5kaW5nIG1lc3NhZ2VcIikpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogTWFyayBtZXNzYWdlIGFzIGRlbGl2ZXJlZFxuXHRcdCovXG5cdFx0YXN5bmMgbWFya0RlbGl2ZXJlZChtZXNzYWdlSWQpIHtcblx0XHRcdGF3YWl0IHRoaXMuX3VwZGF0ZU1lc3NhZ2VTdGF0dXMobWVzc2FnZUlkLCBcImRlbGl2ZXJlZFwiKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBNYXJrIG1lc3NhZ2UgYXMgZmFpbGVkIGFuZCByZXRyeSBpZiBwb3NzaWJsZVxuXHRcdCovXG5cdFx0YXN5bmMgbWFya0ZhaWxlZChtZXNzYWdlSWQpIHtcblx0XHRcdGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBzdG9yZSA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5NRVNTQUdFUywgXCJyZWFkd3JpdGVcIikub2JqZWN0U3RvcmUoU1RPUkVTLk1FU1NBR0VTKTtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChtZXNzYWdlSWQpO1xuXHRcdFx0XHRyZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gcmVxdWVzdC5yZXN1bHQ7XG5cdFx0XHRcdFx0aWYgKCFtZXNzYWdlKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bWVzc2FnZS5yZXRyeUNvdW50Kys7XG5cdFx0XHRcdFx0bWVzc2FnZS51cGRhdGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRcdGlmIChtZXNzYWdlLnJldHJ5Q291bnQgPCBtZXNzYWdlLm1heFJldHJpZXMpIG1lc3NhZ2Uuc3RhdHVzID0gXCJwZW5kaW5nXCI7XG5cdFx0XHRcdFx0ZWxzZSBtZXNzYWdlLnN0YXR1cyA9IFwiZmFpbGVkXCI7XG5cdFx0XHRcdFx0c3RvcmUucHV0KG1lc3NhZ2UpO1xuXHRcdFx0XHRcdHRoaXMuX21lc3NhZ2VVcGRhdGVzLm5leHQobWVzc2FnZSk7XG5cdFx0XHRcdFx0cmVzb2x2ZShtZXNzYWdlLnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBtYXJrIG1lc3NhZ2UgYXMgZmFpbGVkXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyBfdXBkYXRlTWVzc2FnZVN0YXR1cyhtZXNzYWdlSWQsIHN0YXR1cykge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0b3JlID0gZGIudHJhbnNhY3Rpb24oU1RPUkVTLk1FU1NBR0VTLCBcInJlYWR3cml0ZVwiKS5vYmplY3RTdG9yZShTVE9SRVMuTUVTU0FHRVMpO1xuXHRcdFx0XHRjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KG1lc3NhZ2VJZCk7XG5cdFx0XHRcdHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSByZXF1ZXN0LnJlc3VsdDtcblx0XHRcdFx0XHRpZiAobWVzc2FnZSkge1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRcdFx0XHRtZXNzYWdlLnVwZGF0ZWRBdCA9IERhdGUubm93KCk7XG5cdFx0XHRcdFx0XHRzdG9yZS5wdXQobWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9tZXNzYWdlVXBkYXRlcy5uZXh0KG1lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIHVwZGF0ZSBtZXNzYWdlIHN0YXR1c1wiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgbWFpbGJveCBmb3IgYSBjaGFubmVsXG5cdFx0Ki9cblx0XHRhc3luYyBnZXRNYWlsYm94KGNoYW5uZWwsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlcXVlc3QgPSBkYi50cmFuc2FjdGlvbihTVE9SRVMuTUFJTEJPWCwgXCJyZWFkb25seVwiKS5vYmplY3RTdG9yZShTVE9SRVMuTUFJTEJPWCkuaW5kZXgoXCJjaGFubmVsXCIpLmdldEFsbChJREJLZXlSYW5nZS5vbmx5KGNoYW5uZWwpLCBvcHRpb25zLmxpbWl0KTtcblx0XHRcdFx0cmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0bGV0IHJlc3VsdHMgPSByZXF1ZXN0LnJlc3VsdDtcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5zb3J0QnkgPT09IFwicHJpb3JpdHlcIikgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cdFx0XHRcdFx0ZWxzZSByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGIuY3JlYXRlZEF0IC0gYS5jcmVhdGVkQXQpO1xuXHRcdFx0XHRcdHJlc29sdmUocmVzdWx0cyk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBtYWlsYm94XCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBtYWlsYm94IHN0YXRpc3RpY3Ncblx0XHQqL1xuXHRcdGFzeW5jIGdldE1haWxib3hTdGF0cyhjaGFubmVsKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuZ2V0RGVmZXJyZWRNZXNzYWdlcyhjaGFubmVsKTtcblx0XHRcdGNvbnN0IHN0YXRzID0ge1xuXHRcdFx0XHR0b3RhbDogbWVzc2FnZXMubGVuZ3RoLFxuXHRcdFx0XHRwZW5kaW5nOiAwLFxuXHRcdFx0XHRwcm9jZXNzaW5nOiAwLFxuXHRcdFx0XHRkZWxpdmVyZWQ6IDAsXG5cdFx0XHRcdGZhaWxlZDogMCxcblx0XHRcdFx0ZXhwaXJlZDogMFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0XHRmb3IgKGNvbnN0IG1zZyBvZiBtZXNzYWdlcykgaWYgKG1zZy5leHBpcmVzQXQgJiYgbXNnLmV4cGlyZXNBdCA8IG5vdykgc3RhdHMuZXhwaXJlZCsrO1xuXHRcdFx0ZWxzZSBzdGF0c1ttc2cuc3RhdHVzXSsrO1xuXHRcdFx0cmV0dXJuIHN0YXRzO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENsZWFyIG1haWxib3ggZm9yIGEgY2hhbm5lbFxuXHRcdCovXG5cdFx0YXN5bmMgY2xlYXJNYWlsYm94KGNoYW5uZWwpIHtcblx0XHRcdGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5NQUlMQk9YLCBcInJlYWR3cml0ZVwiKTtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0eC5vYmplY3RTdG9yZShTVE9SRVMuTUFJTEJPWCkuaW5kZXgoXCJjaGFubmVsXCIpO1xuXHRcdFx0XHRsZXQgZGVsZXRlZENvdW50ID0gMDtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdCA9IGluZGV4Lm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seShjaGFubmVsKSk7XG5cdFx0XHRcdHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnNvciA9IHJlcXVlc3QucmVzdWx0O1xuXHRcdFx0XHRcdGlmIChjdXJzb3IpIHtcblx0XHRcdFx0XHRcdGN1cnNvci5kZWxldGUoKTtcblx0XHRcdFx0XHRcdGRlbGV0ZWRDb3VudCsrO1xuXHRcdFx0XHRcdFx0Y3Vyc29yLmNvbnRpbnVlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHR0eC5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZShkZWxldGVkQ291bnQpO1xuXHRcdFx0XHR0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY2xlYXIgbWFpbGJveFwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBSZWdpc3RlciBhIHBlbmRpbmcgb3BlcmF0aW9uXG5cdFx0Ki9cblx0XHRhc3luYyByZWdpc3RlclBlbmRpbmcob3BlcmF0aW9uKSB7XG5cdFx0XHRjb25zdCBkYiA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0Y29uc3QgcGVuZGluZyA9IHtcblx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHRjaGFubmVsOiB0aGlzLl9jaGFubmVsTmFtZSxcblx0XHRcdFx0dHlwZTogb3BlcmF0aW9uLnR5cGUsXG5cdFx0XHRcdGRhdGE6IG9wZXJhdGlvbi5kYXRhLFxuXHRcdFx0XHRtZXRhZGF0YTogb3BlcmF0aW9uLm1ldGFkYXRhLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IERhdGUubm93KCksXG5cdFx0XHRcdHN0YXR1czogXCJwZW5kaW5nXCJcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5QRU5ESU5HLCBcInJlYWR3cml0ZVwiKTtcblx0XHRcdFx0dHgub2JqZWN0U3RvcmUoU1RPUkVTLlBFTkRJTkcpLmFkZChwZW5kaW5nKTtcblx0XHRcdFx0dHgub25jb21wbGV0ZSA9ICgpID0+IHJlc29sdmUocGVuZGluZy5pZCk7XG5cdFx0XHRcdHR4Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWdpc3RlciBwZW5kaW5nIG9wZXJhdGlvblwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyBmb3IgY2hhbm5lbFxuXHRcdCovXG5cdFx0YXN5bmMgZ2V0UGVuZGluZ09wZXJhdGlvbnMoKSB7XG5cdFx0XHRjb25zdCBkYiA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5QRU5ESU5HLCBcInJlYWRvbmx5XCIpLm9iamVjdFN0b3JlKFNUT1JFUy5QRU5ESU5HKS5pbmRleChcImNoYW5uZWxcIikuZ2V0QWxsKElEQktleVJhbmdlLm9ubHkodGhpcy5fY2hhbm5lbE5hbWUpKTtcblx0XHRcdFx0cmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcblx0XHRcdFx0cmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IHBlbmRpbmcgb3BlcmF0aW9uc1wiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDb21wbGV0ZSBhIHBlbmRpbmcgb3BlcmF0aW9uXG5cdFx0Ki9cblx0XHRhc3luYyBjb21wbGV0ZVBlbmRpbmcob3BlcmF0aW9uSWQpIHtcblx0XHRcdGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5QRU5ESU5HLCBcInJlYWR3cml0ZVwiKTtcblx0XHRcdFx0dHgub2JqZWN0U3RvcmUoU1RPUkVTLlBFTkRJTkcpLmRlbGV0ZShvcGVyYXRpb25JZCk7XG5cdFx0XHRcdHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG5cdFx0XHRcdHR4Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBjb21wbGV0ZSBwZW5kaW5nIG9wZXJhdGlvblwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBBd2FpdCBhIHBlbmRpbmcgb3BlcmF0aW9uIChwb2xsIHVudGlsIGNvbXBsZXRlIG9yIHRpbWVvdXQpXG5cdFx0Ki9cblx0XHRhc3luYyBhd2FpdFBlbmRpbmcob3BlcmF0aW9uSWQsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyAzZTQ7XG5cdFx0XHRjb25zdCBwb2xsSW50ZXJ2YWwgPSBvcHRpb25zLnBvbGxJbnRlcnZhbCA/PyAxMDA7XG5cdFx0XHRjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXHRcdFx0d2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aW1lb3V0KSB7XG5cdFx0XHRcdGNvbnN0IHBlbmRpbmcgPSBhd2FpdCB0aGlzLl9nZXRQZW5kaW5nQnlJZChvcGVyYXRpb25JZCk7XG5cdFx0XHRcdGlmICghcGVuZGluZykgcmV0dXJuIG51bGw7XG5cdFx0XHRcdGlmIChwZW5kaW5nLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuY29tcGxldGVQZW5kaW5nKG9wZXJhdGlvbklkKTtcblx0XHRcdFx0XHRyZXR1cm4gcGVuZGluZy5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgcG9sbEludGVydmFsKSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFBlbmRpbmcgb3BlcmF0aW9uICR7b3BlcmF0aW9uSWR9IHRpbWVkIG91dGApO1xuXHRcdH1cblx0XHRhc3luYyBfZ2V0UGVuZGluZ0J5SWQoaWQpIHtcblx0XHRcdGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCByZXF1ZXN0ID0gZGIudHJhbnNhY3Rpb24oU1RPUkVTLlBFTkRJTkcsIFwicmVhZG9ubHlcIikub2JqZWN0U3RvcmUoU1RPUkVTLlBFTkRJTkcpLmdldChpZCk7XG5cdFx0XHRcdHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCA/PyBudWxsKTtcblx0XHRcdFx0cmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IHBlbmRpbmcgb3BlcmF0aW9uXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIFB1dCBkYXRhIGluIGV4Y2hhbmdlIChzaGFyZWQgc3RvcmFnZSlcblx0XHQqL1xuXHRcdGFzeW5jIGV4Y2hhbmdlUHV0KGtleSwgdmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdGNvbnN0IHJlY29yZCA9IHtcblx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRvd25lcjogdGhpcy5fY2hhbm5lbE5hbWUsXG5cdFx0XHRcdHNoYXJlZFdpdGg6IG9wdGlvbnMuc2hhcmVkV2l0aCA/PyBbXCIqXCJdLFxuXHRcdFx0XHR2ZXJzaW9uOiAxLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IERhdGUubm93KCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdFx0fTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHR4ID0gZGIudHJhbnNhY3Rpb24oU1RPUkVTLkVYQ0hBTkdFLCBcInJlYWR3cml0ZVwiKTtcblx0XHRcdFx0Y29uc3Qgc3RvcmUgPSB0eC5vYmplY3RTdG9yZShTVE9SRVMuRVhDSEFOR0UpO1xuXHRcdFx0XHRjb25zdCBnZXRSZXF1ZXN0ID0gc3RvcmUuaW5kZXgoXCJrZXlcIikuZ2V0KGtleSk7XG5cdFx0XHRcdGdldFJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGV4aXN0aW5nID0gZ2V0UmVxdWVzdC5yZXN1bHQ7XG5cdFx0XHRcdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRcdFx0XHRyZWNvcmQuaWQgPSBleGlzdGluZy5pZDtcblx0XHRcdFx0XHRcdHJlY29yZC52ZXJzaW9uID0gZXhpc3RpbmcudmVyc2lvbiArIDE7XG5cdFx0XHRcdFx0XHRyZWNvcmQuY3JlYXRlZEF0ID0gZXhpc3RpbmcuY3JlYXRlZEF0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdG9yZS5wdXQocmVjb3JkKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0dHgub25jb21wbGV0ZSA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9leGNoYW5nZVVwZGF0ZXMubmV4dChyZWNvcmQpO1xuXHRcdFx0XHRcdHJlc29sdmUocmVjb3JkLmlkKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0dHgub25lcnJvciA9ICgpID0+IHJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIHB1dCBleGNoYW5nZSBkYXRhXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBkYXRhIGZyb20gZXhjaGFuZ2Vcblx0XHQqL1xuXHRcdGFzeW5jIGV4Y2hhbmdlR2V0KGtleSkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlcXVlc3QgPSBkYi50cmFuc2FjdGlvbihTVE9SRVMuRVhDSEFOR0UsIFwicmVhZG9ubHlcIikub2JqZWN0U3RvcmUoU1RPUkVTLkVYQ0hBTkdFKS5pbmRleChcImtleVwiKS5nZXQoa2V5KTtcblx0XHRcdFx0cmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVjb3JkID0gcmVxdWVzdC5yZXN1bHQ7XG5cdFx0XHRcdFx0aWYgKCFyZWNvcmQpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUobnVsbCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghdGhpcy5fY2FuQWNjZXNzRXhjaGFuZ2UocmVjb3JkKSkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShudWxsKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVzb2x2ZShyZWNvcmQudmFsdWUpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBnZXQgZXhjaGFuZ2UgZGF0YVwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBEZWxldGUgZGF0YSBmcm9tIGV4Y2hhbmdlXG5cdFx0Ki9cblx0XHRhc3luYyBleGNoYW5nZURlbGV0ZShrZXkpIHtcblx0XHRcdGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5FWENIQU5HRSwgXCJyZWFkd3JpdGVcIik7XG5cdFx0XHRcdGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoU1RPUkVTLkVYQ0hBTkdFKTtcblx0XHRcdFx0Y29uc3QgZ2V0UmVxdWVzdCA9IHN0b3JlLmluZGV4KFwia2V5XCIpLmdldChrZXkpO1xuXHRcdFx0XHRnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCByZWNvcmQgPSBnZXRSZXF1ZXN0LnJlc3VsdDtcblx0XHRcdFx0XHRpZiAoIXJlY29yZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChyZWNvcmQub3duZXIgIT09IHRoaXMuX2NoYW5uZWxOYW1lKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3RvcmUuZGVsZXRlKHJlY29yZC5pZCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZGVsZXRlIGV4Y2hhbmdlIGRhdGFcIikpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQWNxdWlyZSBsb2NrIG9uIGV4Y2hhbmdlIGtleVxuXHRcdCovXG5cdFx0YXN5bmMgZXhjaGFuZ2VMb2NrKGtleSwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHRjb25zdCBkYiA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0Y29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyAzZTQ7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFUy5FWENIQU5HRSwgXCJyZWFkd3JpdGVcIik7XG5cdFx0XHRcdGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoU1RPUkVTLkVYQ0hBTkdFKTtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdCA9IHN0b3JlLmluZGV4KFwia2V5XCIpLmdldChrZXkpO1xuXHRcdFx0XHRyZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCByZWNvcmQgPSByZXF1ZXN0LnJlc3VsdDtcblx0XHRcdFx0XHRpZiAoIXJlY29yZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChyZWNvcmQubG9jayAmJiByZWNvcmQubG9jay5ob2xkZXIgIT09IHRoaXMuX2NoYW5uZWxOYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAocmVjb3JkLmxvY2suZXhwaXJlc0F0ID4gRGF0ZS5ub3coKSkge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZWNvcmQubG9jayA9IHtcblx0XHRcdFx0XHRcdGhvbGRlcjogdGhpcy5fY2hhbm5lbE5hbWUsXG5cdFx0XHRcdFx0XHRhY3F1aXJlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0XHRcdFx0ZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdGltZW91dFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0cmVjb3JkLnVwZGF0ZWRBdCA9IERhdGUubm93KCk7XG5cdFx0XHRcdFx0c3RvcmUucHV0KHJlY29yZCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gYWNxdWlyZSBsb2NrXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIFJlbGVhc2UgbG9jayBvbiBleGNoYW5nZSBrZXlcblx0XHQqL1xuXHRcdGFzeW5jIGV4Y2hhbmdlVW5sb2NrKGtleSkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHR4ID0gZGIudHJhbnNhY3Rpb24oU1RPUkVTLkVYQ0hBTkdFLCBcInJlYWR3cml0ZVwiKTtcblx0XHRcdFx0Y29uc3Qgc3RvcmUgPSB0eC5vYmplY3RTdG9yZShTVE9SRVMuRVhDSEFOR0UpO1xuXHRcdFx0XHRjb25zdCByZXF1ZXN0ID0gc3RvcmUuaW5kZXgoXCJrZXlcIikuZ2V0KGtleSk7XG5cdFx0XHRcdHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJlY29yZCA9IHJlcXVlc3QucmVzdWx0O1xuXHRcdFx0XHRcdGlmIChyZWNvcmQgJiYgcmVjb3JkLmxvY2s/LmhvbGRlciA9PT0gdGhpcy5fY2hhbm5lbE5hbWUpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSByZWNvcmQubG9jaztcblx0XHRcdFx0XHRcdHJlY29yZC51cGRhdGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRcdFx0c3RvcmUucHV0KHJlY29yZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHR0eC5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpO1xuXHRcdFx0XHR0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVsZWFzZSBsb2NrXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRfY2FuQWNjZXNzRXhjaGFuZ2UocmVjb3JkKSB7XG5cdFx0XHRpZiAocmVjb3JkLm93bmVyID09PSB0aGlzLl9jaGFubmVsTmFtZSkgcmV0dXJuIHRydWU7XG5cdFx0XHRpZiAocmVjb3JkLnNoYXJlZFdpdGguaW5jbHVkZXMoXCIqXCIpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdHJldHVybiByZWNvcmQuc2hhcmVkV2l0aC5pbmNsdWRlcyh0aGlzLl9jaGFubmVsTmFtZSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQmVnaW4gYSB0cmFuc2FjdGlvbiBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuXHRcdCovXG5cdFx0YXN5bmMgYmVnaW5UcmFuc2FjdGlvbigpIHtcblx0XHRcdHJldHVybiBuZXcgQ2hhbm5lbFRyYW5zYWN0aW9uKHRoaXMpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEV4ZWN1dGUgb3BlcmF0aW9ucyBpbiB0cmFuc2FjdGlvblxuXHRcdCovXG5cdFx0YXN5bmMgZXhlY3V0ZVRyYW5zYWN0aW9uKG9wZXJhdGlvbnMpIHtcblx0XHRcdGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRjb25zdCBzdG9yZU5hbWVzID0gbmV3IFNldChvcGVyYXRpb25zLm1hcCgob3ApID0+IG9wLnN0b3JlKSk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKEFycmF5LmZyb20oc3RvcmVOYW1lcyksIFwicmVhZHdyaXRlXCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IG9wIG9mIG9wZXJhdGlvbnMpIHtcblx0XHRcdFx0XHRjb25zdCBzdG9yZSA9IHR4Lm9iamVjdFN0b3JlKG9wLnN0b3JlKTtcblx0XHRcdFx0XHRzd2l0Y2ggKG9wLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJwdXRcIjpcblx0XHRcdFx0XHRcdFx0aWYgKG9wLnZhbHVlICE9PSB2b2lkIDApIHN0b3JlLnB1dChvcC52YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcImRlbGV0ZVwiOlxuXHRcdFx0XHRcdFx0XHRpZiAob3Aua2V5ICE9PSB2b2lkIDApIHN0b3JlLmRlbGV0ZShvcC5rZXkpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJ1cGRhdGVcIjogaWYgKG9wLmtleSAhPT0gdm9pZCAwKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGdldFJlcSA9IHN0b3JlLmdldChvcC5rZXkpO1xuXHRcdFx0XHRcdFx0XHRnZXRSZXEub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChnZXRSZXEucmVzdWx0ICYmIG9wLnZhbHVlKSBzdG9yZS5wdXQoe1xuXHRcdFx0XHRcdFx0XHRcdFx0Li4uZ2V0UmVxLnJlc3VsdCxcblx0XHRcdFx0XHRcdFx0XHRcdC4uLm9wLnZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG5cdFx0XHRcdHR4Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIlRyYW5zYWN0aW9uIGZhaWxlZFwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTdWJzY3JpYmUgdG8gbWVzc2FnZSB1cGRhdGVzXG5cdFx0Ki9cblx0XHRvbk1lc3NhZ2VVcGRhdGUoaGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX21lc3NhZ2VVcGRhdGVzLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZXIgfSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogU3Vic2NyaWJlIHRvIGV4Y2hhbmdlIHVwZGF0ZXNcblx0XHQqL1xuXHRcdG9uRXhjaGFuZ2VVcGRhdGUoaGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2V4Y2hhbmdlVXBkYXRlcy5zdWJzY3JpYmUoeyBuZXh0OiBoYW5kbGVyIH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENsZWFuIHVwIGV4cGlyZWQgbWVzc2FnZXNcblx0XHQqL1xuXHRcdGFzeW5jIGNsZWFudXBFeHBpcmVkKCkge1xuXHRcdFx0Y29uc3QgZGIgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFtTVE9SRVMuTUVTU0FHRVMsIFNUT1JFUy5NQUlMQk9YXSwgXCJyZWFkd3JpdGVcIik7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VzU3RvcmUgPSB0eC5vYmplY3RTdG9yZShTVE9SRVMuTUVTU0FHRVMpO1xuXHRcdFx0XHRjb25zdCBtYWlsYm94U3RvcmUgPSB0eC5vYmplY3RTdG9yZShTVE9SRVMuTUFJTEJPWCk7XG5cdFx0XHRcdGxldCBkZWxldGVkQ291bnQgPSAwO1xuXHRcdFx0XHRjb25zdCBtc2dSZXF1ZXN0ID0gbWVzc2FnZXNTdG9yZS5vcGVuQ3Vyc29yKCk7XG5cdFx0XHRcdG1zZ1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnNvciA9IG1zZ1JlcXVlc3QucmVzdWx0O1xuXHRcdFx0XHRcdGlmIChjdXJzb3IpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG1zZyA9IGN1cnNvci52YWx1ZTtcblx0XHRcdFx0XHRcdGlmIChtc2cuZXhwaXJlc0F0ICYmIG1zZy5leHBpcmVzQXQgPCBub3cpIHtcblx0XHRcdFx0XHRcdFx0Y3Vyc29yLmRlbGV0ZSgpO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVkQ291bnQrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cnNvci5jb250aW51ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgbWFpbFJlcXVlc3QgPSBtYWlsYm94U3RvcmUub3BlbkN1cnNvcigpO1xuXHRcdFx0XHRtYWlsUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY3Vyc29yID0gbWFpbFJlcXVlc3QucmVzdWx0O1xuXHRcdFx0XHRcdGlmIChjdXJzb3IpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG1zZyA9IGN1cnNvci52YWx1ZTtcblx0XHRcdFx0XHRcdGlmIChtc2cuZXhwaXJlc0F0ICYmIG1zZy5leHBpcmVzQXQgPCBub3cpIHtcblx0XHRcdFx0XHRcdFx0Y3Vyc29yLmRlbGV0ZSgpO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVkQ291bnQrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cnNvci5jb250aW51ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0dHgub25jb21wbGV0ZSA9ICgpID0+IHJlc29sdmUoZGVsZXRlZENvdW50KTtcblx0XHRcdFx0dHgub25lcnJvciA9ICgpID0+IHJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNsZWFudXAgZXhwaXJlZFwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cdC8qKlxuXHQqIEhlbHBlciBjbGFzcyBmb3IgYmF0Y2ggb3BlcmF0aW9ucyB3aXRoIHJvbGxiYWNrIHN1cHBvcnRcblx0Ki9cblx0dmFyIENoYW5uZWxUcmFuc2FjdGlvbiA9IGNsYXNzIHtcblx0XHRfc3RvcmFnZTtcblx0XHRfb3BlcmF0aW9ucyA9IFtdO1xuXHRcdF9pc0NvbW1pdHRlZCA9IGZhbHNlO1xuXHRcdF9pc1JvbGxlZEJhY2sgPSBmYWxzZTtcblx0XHRjb25zdHJ1Y3Rvcihfc3RvcmFnZSkge1xuXHRcdFx0dGhpcy5fc3RvcmFnZSA9IF9zdG9yYWdlO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBwdXQgb3BlcmF0aW9uXG5cdFx0Ki9cblx0XHRwdXQoc3RvcmUsIHZhbHVlKSB7XG5cdFx0XHR0aGlzLl9jaGVja1N0YXRlKCk7XG5cdFx0XHR0aGlzLl9vcGVyYXRpb25zLnB1c2goe1xuXHRcdFx0XHRpZDogVVVJRHY0KCksXG5cdFx0XHRcdHR5cGU6IFwicHV0XCIsXG5cdFx0XHRcdHN0b3JlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBkZWxldGUgb3BlcmF0aW9uXG5cdFx0Ki9cblx0XHRkZWxldGUoc3RvcmUsIGtleSkge1xuXHRcdFx0dGhpcy5fY2hlY2tTdGF0ZSgpO1xuXHRcdFx0dGhpcy5fb3BlcmF0aW9ucy5wdXNoKHtcblx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHR0eXBlOiBcImRlbGV0ZVwiLFxuXHRcdFx0XHRzdG9yZSxcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQWRkIHVwZGF0ZSBvcGVyYXRpb25cblx0XHQqL1xuXHRcdHVwZGF0ZShzdG9yZSwga2V5LCB1cGRhdGVzKSB7XG5cdFx0XHR0aGlzLl9jaGVja1N0YXRlKCk7XG5cdFx0XHR0aGlzLl9vcGVyYXRpb25zLnB1c2goe1xuXHRcdFx0XHRpZDogVVVJRHY0KCksXG5cdFx0XHRcdHR5cGU6IFwidXBkYXRlXCIsXG5cdFx0XHRcdHN0b3JlLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdHZhbHVlOiB1cGRhdGVzLFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQ29tbWl0IHRyYW5zYWN0aW9uXG5cdFx0Ki9cblx0XHRhc3luYyBjb21taXQoKSB7XG5cdFx0XHR0aGlzLl9jaGVja1N0YXRlKCk7XG5cdFx0XHRpZiAodGhpcy5fb3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5faXNDb21taXR0ZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9zdG9yYWdlLmV4ZWN1dGVUcmFuc2FjdGlvbih0aGlzLl9vcGVyYXRpb25zKTtcblx0XHRcdHRoaXMuX2lzQ29tbWl0dGVkID0gdHJ1ZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBSb2xsYmFjayB0cmFuc2FjdGlvbiAoanVzdCBjbGVhciBvcGVyYXRpb25zLCBkb24ndCBleGVjdXRlKVxuXHRcdCovXG5cdFx0cm9sbGJhY2soKSB7XG5cdFx0XHR0aGlzLl9vcGVyYXRpb25zID0gW107XG5cdFx0XHR0aGlzLl9pc1JvbGxlZEJhY2sgPSB0cnVlO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBvcGVyYXRpb24gY291bnRcblx0XHQqL1xuXHRcdGdldCBvcGVyYXRpb25Db3VudCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aDtcblx0XHR9XG5cdFx0X2NoZWNrU3RhdGUoKSB7XG5cdFx0XHRpZiAodGhpcy5faXNDb21taXR0ZWQpIHRocm93IG5ldyBFcnJvcihcIlRyYW5zYWN0aW9uIGFscmVhZHkgY29tbWl0dGVkXCIpO1xuXHRcdFx0aWYgKHRoaXMuX2lzUm9sbGVkQmFjaykgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNhY3Rpb24gYWxyZWFkeSByb2xsZWQgYmFja1wiKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IF9zdG9yYWdlSW5zdGFuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0LyoqXG5cdCogR2V0IHN0b3JhZ2UgaW5zdGFuY2UgZm9yIGNoYW5uZWxcblx0Ki9cblx0ZnVuY3Rpb24gZ2V0Q2hhbm5lbFN0b3JhZ2UoY2hhbm5lbE5hbWUpIHtcblx0XHRpZiAoIV9zdG9yYWdlSW5zdGFuY2VzLmhhcyhjaGFubmVsTmFtZSkpIF9zdG9yYWdlSW5zdGFuY2VzLnNldChjaGFubmVsTmFtZSwgbmV3IENoYW5uZWxTdG9yYWdlKGNoYW5uZWxOYW1lKSk7XG5cdFx0cmV0dXJuIF9zdG9yYWdlSW5zdGFuY2VzLmdldChjaGFubmVsTmFtZSk7XG5cdH1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vdW5pZm9ybS50cy9zcmMvbmV3ZXIvbmV4dC9jaGFubmVsL0NoYW5uZWxDb250ZXh0LnRzXG4vKipcblx0KiBDaGFubmVsIENvbnRleHQgLSBNdWx0aS1DaGFubmVsIFN1cHBvcnRcblx0KlxuXHQqIFByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSBtdWx0aXBsZSBpbmRlcGVuZGVudCBjaGFubmVsIGVuZHBvaW50cy9wb3J0c1xuXHQqIGluIHRoZSBzYW1lIGNvbnRleHQuIFN1aXRhYmxlIGZvcjpcblx0KiAtIExhenktbG9hZGVkIGNvbXBvbmVudHNcblx0KiAtIE11bHRpcGxlIERPTSBjb21wb25lbnRzIHdpdGggaXNvbGF0ZWQgY29tbXVuaWNhdGlvblxuXHQqIC0gTWljcm8tZnJvbnRlbmQgYXJjaGl0ZWN0dXJlc1xuXHQqIC0gQ29tcG9uZW50LWxldmVsIGNoYW5uZWwgaXNvbGF0aW9uXG5cdCpcblx0KiB2TmV4dCBhcmNoaXRlY3R1cmUgbm90ZTpcblx0KiAtIENoYW5uZWxDb250ZXh0IGNvbXBvc2VzIFVuaWZpZWRDaGFubmVsIGluc3RhbmNlcyBwZXIgZW5kcG9pbnQuXG5cdCogLSBVbmlmaWVkQ2hhbm5lbCBpcyB0aGUgY2Fub25pY2FsIHRyYW5zcG9ydC9pbnZvY2F0aW9uIHJ1bnRpbWUgZW5naW5lLlxuXHQqL1xuXHRjb25zdCB3b3JrZXJCYXNlID0gZ2V0V29ya2VyUmVzb2x2ZUJhc2VVcmwoKTtcblx0Y29uc3Qgd29ya2VyQ29kZSA9IHdvcmtlckJhc2UubGVuZ3RoID4gMCA/IG5ldyBVUkwoXCIuLi90cmFuc3BvcnQvV29ya2VyLnRzXCIsIHdvcmtlckJhc2UpIDogXCJcIjtcblx0dmFyIFJlbW90ZUNoYW5uZWxIZWxwZXIgPSBjbGFzcyB7XG5cdFx0X2NoYW5uZWw7XG5cdFx0X2NvbnRleHQ7XG5cdFx0X29wdGlvbnM7XG5cdFx0X2Nvbm5lY3Rpb247XG5cdFx0X3N0b3JhZ2U7XG5cdFx0Y29uc3RydWN0b3IoX2NoYW5uZWwsIF9jb250ZXh0LCBfb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHR0aGlzLl9jaGFubmVsID0gX2NoYW5uZWw7XG5cdFx0XHR0aGlzLl9jb250ZXh0ID0gX2NvbnRleHQ7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbihfY2hhbm5lbCk7XG5cdFx0XHR0aGlzLl9zdG9yYWdlID0gZ2V0Q2hhbm5lbFN0b3JhZ2UoX2NoYW5uZWwpO1xuXHRcdH1cblx0XHRhc3luYyByZXF1ZXN0KHBhdGgsIGFjdGlvbiwgYXJncywgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHRsZXQgbm9ybWFsaXplZFBhdGggPSB0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiA/IFtwYXRoXSA6IHBhdGg7XG5cdFx0XHRsZXQgbm9ybWFsaXplZEFjdGlvbiA9IGFjdGlvbjtcblx0XHRcdGxldCBub3JtYWxpemVkQXJncyA9IGFyZ3M7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhY3Rpb24pICYmIGlzUmVmbGVjdEFjdGlvbihwYXRoKSkge1xuXHRcdFx0XHRvcHRpb25zID0gYXJncztcblx0XHRcdFx0bm9ybWFsaXplZEFyZ3MgPSBhY3Rpb247XG5cdFx0XHRcdG5vcm1hbGl6ZWRBY3Rpb24gPSBwYXRoO1xuXHRcdFx0XHRub3JtYWxpemVkUGF0aCA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQuZ2V0SG9zdCgpPy5yZXF1ZXN0KG5vcm1hbGl6ZWRQYXRoLCBub3JtYWxpemVkQWN0aW9uLCBub3JtYWxpemVkQXJncywgb3B0aW9ucywgdGhpcy5fY2hhbm5lbCk7XG5cdFx0fVxuXHRcdGFzeW5jIGRvSW1wb3J0TW9kdWxlKHVybCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0KFtdLCBXUmVmbGVjdEFjdGlvbi5JTVBPUlQsIFt1cmxdLCBvcHRpb25zKTtcblx0XHR9XG5cdFx0YXN5bmMgZGVmZXJNZXNzYWdlKHBheWxvYWQsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N0b3JhZ2UuZGVmZXIoe1xuXHRcdFx0XHRjaGFubmVsOiB0aGlzLl9jaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IHRoaXMuX2NvbnRleHQuaG9zdE5hbWUsXG5cdFx0XHRcdHR5cGU6IFwicmVxdWVzdFwiLFxuXHRcdFx0XHRwYXlsb2FkXG5cdFx0XHR9LCBvcHRpb25zKTtcblx0XHR9XG5cdFx0YXN5bmMgZ2V0UGVuZGluZ01lc3NhZ2VzKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0RGVmZXJyZWRNZXNzYWdlcyh0aGlzLl9jaGFubmVsLCB7IHN0YXR1czogXCJwZW5kaW5nXCIgfSk7XG5cdFx0fVxuXHRcdGdldCBjb25uZWN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb247XG5cdFx0fVxuXHRcdGdldCBjaGFubmVsTmFtZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jaGFubmVsO1xuXHRcdH1cblx0XHRnZXQgY29udGV4dCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb250ZXh0O1xuXHRcdH1cblx0fTtcblx0dmFyIENoYW5uZWxIYW5kbGVyID0gY2xhc3Mge1xuXHRcdF9jaGFubmVsO1xuXHRcdF9jb250ZXh0O1xuXHRcdF9vcHRpb25zO1xuXHRcdF9jb25uZWN0aW9uO1xuXHRcdF91bmlmaWVkO1xuXHRcdGdldCBfZm9yUmVzb2x2ZXMoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5fX2dldFByaXZhdGUoXCJfcGVuZGluZ1wiKTtcblx0XHR9XG5cdFx0Z2V0IF9zdWJzY3JpcHRpb25zKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3VuaWZpZWQuX19nZXRQcml2YXRlKFwiX3N1YnNjcmlwdGlvbnNcIik7XG5cdFx0fVxuXHRcdGdldCBfYnJvYWRjYXN0cygpIHtcblx0XHRcdHJldHVybiB0aGlzLl91bmlmaWVkLl9fZ2V0UHJpdmF0ZShcIl90cmFuc3BvcnRzXCIpO1xuXHRcdH1cblx0XHRjb25zdHJ1Y3RvcihfY2hhbm5lbCwgX2NvbnRleHQsIF9vcHRpb25zID0ge30pIHtcblx0XHRcdHRoaXMuX2NoYW5uZWwgPSBfY2hhbm5lbDtcblx0XHRcdHRoaXMuX2NvbnRleHQgPSBfY29udGV4dDtcblx0XHRcdHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uUG9vbCgpLmdldE9yQ3JlYXRlKF9jaGFubmVsLCBcImludGVybmFsXCIsIF9vcHRpb25zKTtcblx0XHRcdHRoaXMuX3VuaWZpZWQgPSBuZXcgVW5pZmllZENoYW5uZWwoe1xuXHRcdFx0XHRuYW1lOiBfY2hhbm5lbCxcblx0XHRcdFx0YXV0b0xpc3RlbjogZmFsc2UsXG5cdFx0XHRcdHRpbWVvdXQ6IF9vcHRpb25zPy50aW1lb3V0XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y3JlYXRlUmVtb3RlQ2hhbm5lbChjaGFubmVsLCBvcHRpb25zID0ge30sIGJyb2FkY2FzdCkge1xuXHRcdFx0Y29uc3QgdHJhbnNwb3J0ID0gbm9ybWFsaXplVHJhbnNwb3J0QmluZGluZyhicm9hZGNhc3QgPz8gdGhpcy5fY29udGV4dC4kY3JlYXRlT3JVc2VFeGlzdGluZ1JlbW90ZShjaGFubmVsLCBvcHRpb25zLCBicm9hZGNhc3QgPz8gbnVsbCk/Lm1lc3NhZ2VDaGFubmVsPy5wb3J0MSk7XG5cdFx0XHRjb25zdCB0cmFuc3BvcnRUeXBlID0gZ2V0RHluYW1pY1RyYW5zcG9ydFR5cGUodHJhbnNwb3J0Py50YXJnZXQgPz8gdHJhbnNwb3J0KTtcblx0XHRcdHRoaXMuX3VuaWZpZWQubGlzdGVuKHRyYW5zcG9ydD8udGFyZ2V0LCB7IHRhcmdldENoYW5uZWw6IGNoYW5uZWwgfSk7XG5cdFx0XHRpZiAodHJhbnNwb3J0KSB7XG5cdFx0XHRcdHRoaXMuX2Jyb2FkY2FzdHM/LnNldD8uKGNoYW5uZWwsIHRyYW5zcG9ydCk7XG5cdFx0XHRcdGlmICghKHRyYW5zcG9ydFR5cGUgPT09IFwic2VsZlwiICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PT0gXCJ1bmRlZmluZWRcIikpIHRoaXMuX3VuaWZpZWQuY29ubmVjdCh0cmFuc3BvcnQsIHsgdGFyZ2V0Q2hhbm5lbDogY2hhbm5lbCB9KTtcblx0XHRcdFx0dGhpcy5fY29udGV4dC4kcmVnaXN0ZXJDb25uZWN0aW9uKHtcblx0XHRcdFx0XHRsb2NhbENoYW5uZWw6IHRoaXMuX2NoYW5uZWwsXG5cdFx0XHRcdFx0cmVtb3RlQ2hhbm5lbDogY2hhbm5lbCxcblx0XHRcdFx0XHRzZW5kZXI6IHRoaXMuX2NoYW5uZWwsXG5cdFx0XHRcdFx0ZGlyZWN0aW9uOiBcIm91dGdvaW5nXCIsXG5cdFx0XHRcdFx0dHJhbnNwb3J0VHlwZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5ub3RpZnlDaGFubmVsKGNoYW5uZWwsIHtcblx0XHRcdFx0XHRjb250ZXh0SWQ6IHRoaXMuX2NvbnRleHQuaWQsXG5cdFx0XHRcdFx0Y29udGV4dE5hbWU6IHRoaXMuX2NvbnRleHQuaG9zdE5hbWVcblx0XHRcdFx0fSwgXCJjb25uZWN0XCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ldyBSZW1vdGVDaGFubmVsSGVscGVyKGNoYW5uZWwsIHRoaXMuX2NvbnRleHQsIG9wdGlvbnMpO1xuXHRcdH1cblx0XHRnZXRDaGFubmVsKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWw7XG5cdFx0fVxuXHRcdGdldCBjb25uZWN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb247XG5cdFx0fVxuXHRcdHJlcXVlc3QocGF0aCwgYWN0aW9uLCBhcmdzLCBvcHRpb25zID0ge30sIHRvQ2hhbm5lbCA9IFwid29ya2VyXCIpIHtcblx0XHRcdGxldCBub3JtYWxpemVkUGF0aCA9IHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiID8gW3BhdGhdIDogcGF0aDtcblx0XHRcdGxldCBub3JtYWxpemVkQXJncyA9IGFyZ3M7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhY3Rpb24pICYmIGlzUmVmbGVjdEFjdGlvbihwYXRoKSkge1xuXHRcdFx0XHR0b0NoYW5uZWwgPSBvcHRpb25zO1xuXHRcdFx0XHRvcHRpb25zID0gYXJncztcblx0XHRcdFx0bm9ybWFsaXplZEFyZ3MgPSBhY3Rpb247XG5cdFx0XHRcdGFjdGlvbiA9IHBhdGg7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQYXRoID0gW107XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5pbnZva2UodG9DaGFubmVsLCBhY3Rpb24sIG5vcm1hbGl6ZWRQYXRoID8/IFtdLCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRBcmdzKSA/IG5vcm1hbGl6ZWRBcmdzIDogW25vcm1hbGl6ZWRBcmdzXSk7XG5cdFx0fVxuXHRcdHJlc29sdmVSZXNwb25zZShyZXFJZCwgcmVzdWx0KSB7XG5cdFx0XHR0aGlzLl9mb3JSZXNvbHZlcy5nZXQocmVxSWQpPy5yZXNvbHZlPy4ocmVzdWx0KTtcblx0XHRcdGNvbnN0IHByb21pc2UgPSB0aGlzLl9mb3JSZXNvbHZlcy5nZXQocmVxSWQpPy5wcm9taXNlO1xuXHRcdFx0dGhpcy5fZm9yUmVzb2x2ZXMuZGVsZXRlKHJlcUlkKTtcblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH1cblx0XHRhc3luYyBoYW5kbGVBbmRSZXNwb25zZShyZXF1ZXN0LCByZXFJZCwgcmVzcG9uc2VGbikge31cblx0XHRub3RpZnlDaGFubmVsKHRhcmdldENoYW5uZWwsIHBheWxvYWQgPSB7fSwgdHlwZSA9IFwibm90aWZ5XCIpIHtcblx0XHRcdHJldHVybiB0aGlzLl91bmlmaWVkLm5vdGlmeSh0YXJnZXRDaGFubmVsLCB7XG5cdFx0XHRcdC4uLnBheWxvYWQsXG5cdFx0XHRcdGZyb206IHRoaXMuX2NoYW5uZWwsXG5cdFx0XHRcdHRvOiB0YXJnZXRDaGFubmVsXG5cdFx0XHR9LCB0eXBlKTtcblx0XHR9XG5cdFx0Z2V0Q29ubmVjdGVkQ2hhbm5lbHMoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5jb25uZWN0ZWRDaGFubmVscztcblx0XHR9XG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG5cdFx0XHR0aGlzLl9mb3JSZXNvbHZlcy5jbGVhcigpO1xuXHRcdFx0dGhpcy5fYnJvYWRjYXN0cz8udmFsdWVzPy4oKT8uZm9yRWFjaCgodHJhbnNwb3J0KSA9PiB0cmFuc3BvcnQuY2xvc2U/LigpKTtcblx0XHRcdHRoaXMuX2Jyb2FkY2FzdHM/LmNsZWFyPy4oKTtcblx0XHRcdHRoaXMuX3VuaWZpZWQuY2xvc2UoKTtcblx0XHR9XG5cdFx0Z2V0IHVuaWZpZWQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZDtcblx0XHR9XG5cdH07XG5cdC8qKlxuXHQqIENoYW5uZWwgQ29udGV4dCAtIE1hbmFnZXMgbXVsdGlwbGUgY2hhbm5lbHMgaW4gYSBzaW5nbGUgY29udGV4dFxuXHQqXG5cdCogVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBtdWx0aXBsZSBpbmRlcGVuZGVudCBjaGFubmVscyBpbiB0aGUgc2FtZVxuXHQqIEphdmFTY3JpcHQgY29udGV4dCAoc2FtZSB3aW5kb3csIGlmcmFtZSwgd29ya2VyLCBldGMuKVxuXHQqXG5cdCogU3VwcG9ydHM6XG5cdCogLSBDcmVhdGluZyBtdWx0aXBsZSBjaGFubmVscyBhdCBvbmNlIG9yIGRlZmVycmVkXG5cdCogLSBEeW5hbWljIHRyYW5zcG9ydCBhZGRpdGlvbiAod29ya2VycywgcG9ydHMsIHNvY2tldHMsIGV0Yy4pXG5cdCogLSBHbG9iYWwgc2VsZi9nbG9iYWxUaGlzIGFzIGRlZmF1bHQgdGFyZ2V0XG5cdCovXG5cdHZhciBDaGFubmVsQ29udGV4dCA9IGNsYXNzIHtcblx0XHRfb3B0aW9ucztcblx0XHRfaWQgPSBVVUlEdjQoKTtcblx0XHRfaG9zdE5hbWU7XG5cdFx0X2hvc3QgPSBudWxsO1xuXHRcdF9lbmRwb2ludHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF91bmlmaWVkQnlDaGFubmVsID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfdW5pZmllZENvbm5lY3Rpb25TdWJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfcmVtb3RlQ2hhbm5lbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9kZWZlcnJlZENoYW5uZWxzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfY29ubmVjdGlvbkV2ZW50cyA9IG5ldyBDaGFubmVsU3ViamVjdCh7IGJ1ZmZlclNpemU6IDIwMCB9KTtcblx0XHRfY29ubmVjdGlvblJlZ2lzdHJ5ID0gbmV3IENvbm5lY3Rpb25SZWdpc3RyeSgoKSA9PiBVVUlEdjQoKSwgKGV2ZW50KSA9PiB0aGlzLl9lbWl0Q29ubmVjdGlvbkV2ZW50KGV2ZW50KSk7XG5cdFx0X2Nsb3NlZCA9IGZhbHNlO1xuXHRcdF9nbG9iYWxTZWxmID0gbnVsbDtcblx0XHRjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG5cdFx0XHR0aGlzLl9ob3N0TmFtZSA9IF9vcHRpb25zLm5hbWUgPz8gYGN0eC0ke3RoaXMuX2lkLnNsaWNlKDAsIDgpfWA7XG5cdFx0XHRpZiAoX29wdGlvbnMudXNlR2xvYmFsU2VsZiAhPT0gZmFsc2UpIHRoaXMuX2dsb2JhbFNlbGYgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEluaXRpYWxpemUvZ2V0IHRoZSBob3N0IGNoYW5uZWwgZm9yIHRoaXMgY29udGV4dFxuXHRcdCovXG5cdFx0aW5pdEhvc3QobmFtZSkge1xuXHRcdFx0aWYgKHRoaXMuX2hvc3QgJiYgIW5hbWUpIHJldHVybiB0aGlzLl9ob3N0O1xuXHRcdFx0Y29uc3QgaG9zdE5hbWUgPSBuYW1lID8/IHRoaXMuX2hvc3ROYW1lO1xuXHRcdFx0dGhpcy5faG9zdE5hbWUgPSBob3N0TmFtZTtcblx0XHRcdGlmICh0aGlzLl9lbmRwb2ludHMuaGFzKGhvc3ROYW1lKSkge1xuXHRcdFx0XHR0aGlzLl9ob3N0ID0gdGhpcy5fZW5kcG9pbnRzLmdldChob3N0TmFtZSkuaGFuZGxlcjtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2hvc3Q7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9ob3N0ID0gbmV3IENoYW5uZWxIYW5kbGVyKGhvc3ROYW1lLCB0aGlzLCB0aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zKTtcblx0XHRcdGNvbnN0IGVuZHBvaW50ID0ge1xuXHRcdFx0XHRuYW1lOiBob3N0TmFtZSxcblx0XHRcdFx0aGFuZGxlcjogdGhpcy5faG9zdCxcblx0XHRcdFx0Y29ubmVjdGlvbjogdGhpcy5faG9zdC5jb25uZWN0aW9uLFxuXHRcdFx0XHRzdWJzY3JpcHRpb25zOiBbXSxcblx0XHRcdFx0cmVhZHk6IFByb21pc2UucmVzb2x2ZShudWxsKSxcblx0XHRcdFx0dW5pZmllZDogdGhpcy5faG9zdC51bmlmaWVkXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5fZW5kcG9pbnRzLnNldChob3N0TmFtZSwgZW5kcG9pbnQpO1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChob3N0TmFtZSwgdGhpcy5faG9zdC51bmlmaWVkKTtcblx0XHRcdHJldHVybiB0aGlzLl9ob3N0O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCB0aGUgaG9zdCBjaGFubmVsXG5cdFx0Ki9cblx0XHRnZXRIb3N0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hvc3QgPz8gdGhpcy5pbml0SG9zdCgpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBob3N0IG5hbWVcblx0XHQqL1xuXHRcdGdldCBob3N0TmFtZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9ob3N0TmFtZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgY29udGV4dCBJRFxuXHRcdCovXG5cdFx0Z2V0IGlkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2lkO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIE9ic2VydmFibGU6IGNvbm5lY3Rpb24gZXZlbnRzIGluIHRoaXMgY29udGV4dFxuXHRcdCovXG5cdFx0Z2V0IG9uQ29ubmVjdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uRXZlbnRzO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIFN1YnNjcmliZSB0byBjb25uZWN0aW9uIGV2ZW50c1xuXHRcdCovXG5cdFx0c3Vic2NyaWJlQ29ubmVjdGlvbnMoaGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25FdmVudHMuc3Vic2NyaWJlKGhhbmRsZXIpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIE5vdGlmeSBhbGwgY3VycmVudGx5IGtub3duIGFjdGl2ZSBjb25uZWN0aW9ucy5cblx0XHQqIFVzZWZ1bCBmb3Igc2VydmljZSB3b3JrZXIgLyBjcm9zcy10YWIgaGFuZHNoYWtlcy5cblx0XHQqL1xuXHRcdG5vdGlmeUNvbm5lY3Rpb25zKHBheWxvYWQgPSB7fSwgcXVlcnkgPSB7fSkge1xuXHRcdFx0bGV0IHNlbnQgPSAwO1xuXHRcdFx0Zm9yIChjb25zdCBlbmRwb2ludCBvZiB0aGlzLl9lbmRwb2ludHMudmFsdWVzKCkpIHtcblx0XHRcdFx0Y29uc3QgY29ubmVjdGVkVGFyZ2V0cyA9IGVuZHBvaW50LmhhbmRsZXIuZ2V0Q29ubmVjdGVkQ2hhbm5lbHMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCByZW1vdGVDaGFubmVsIG9mIGNvbm5lY3RlZFRhcmdldHMpIHtcblx0XHRcdFx0XHRpZiAocXVlcnkubG9jYWxDaGFubmVsICYmIHF1ZXJ5LmxvY2FsQ2hhbm5lbCAhPT0gZW5kcG9pbnQubmFtZSkgY29udGludWU7XG5cdFx0XHRcdFx0aWYgKHF1ZXJ5LnJlbW90ZUNoYW5uZWwgJiYgcXVlcnkucmVtb3RlQ2hhbm5lbCAhPT0gcmVtb3RlQ2hhbm5lbCkgY29udGludWU7XG5cdFx0XHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLnF1ZXJ5Q29ubmVjdGlvbnMoe1xuXHRcdFx0XHRcdFx0bG9jYWxDaGFubmVsOiBlbmRwb2ludC5uYW1lLFxuXHRcdFx0XHRcdFx0cmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0XHRcdHN0YXR1czogXCJhY3RpdmVcIlxuXHRcdFx0XHRcdH0pWzBdO1xuXHRcdFx0XHRcdGlmIChxdWVyeS5zZW5kZXIgJiYgZXhpc3Rpbmc/LnNlbmRlciAhPT0gcXVlcnkuc2VuZGVyKSBjb250aW51ZTtcblx0XHRcdFx0XHRpZiAocXVlcnkudHJhbnNwb3J0VHlwZSAmJiBleGlzdGluZz8udHJhbnNwb3J0VHlwZSAhPT0gcXVlcnkudHJhbnNwb3J0VHlwZSkgY29udGludWU7XG5cdFx0XHRcdFx0aWYgKHF1ZXJ5LmNoYW5uZWwgJiYgcXVlcnkuY2hhbm5lbCAhPT0gZW5kcG9pbnQubmFtZSAmJiBxdWVyeS5jaGFubmVsICE9PSByZW1vdGVDaGFubmVsKSBjb250aW51ZTtcblx0XHRcdFx0XHRpZiAoZW5kcG9pbnQuaGFuZGxlci5ub3RpZnlDaGFubmVsKHJlbW90ZUNoYW5uZWwsIHBheWxvYWQsIFwibm90aWZ5XCIpKSBzZW50Kys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzZW50O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIFF1ZXJ5IHRyYWNrZWQgY29ubmVjdGlvbnMgd2l0aCBmaWx0ZXJzXG5cdFx0Ki9cblx0XHRxdWVyeUNvbm5lY3Rpb25zKHF1ZXJ5ID0ge30pIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkucXVlcnkocXVlcnkpLm1hcCgoY29ubmVjdGlvbikgPT4gKHtcblx0XHRcdFx0Li4uY29ubmVjdGlvbixcblx0XHRcdFx0Y29udGV4dElkOiB0aGlzLl9pZFxuXHRcdFx0fSkpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENyZWF0ZSBhIG5ldyBjaGFubmVsIGVuZHBvaW50IGluIHRoaXMgY29udGV4dFxuXHRcdCpcblx0XHQqIEBwYXJhbSBuYW1lIC0gQ2hhbm5lbCBuYW1lXG5cdFx0KiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9uc1xuXHRcdCogQHJldHVybnMgQ2hhbm5lbEVuZHBvaW50IHdpdGggaGFuZGxlciBhbmQgY29ubmVjdGlvblxuXHRcdCovXG5cdFx0Y3JlYXRlQ2hhbm5lbChuYW1lLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGlmICh0aGlzLl9lbmRwb2ludHMuaGFzKG5hbWUpKSByZXR1cm4gdGhpcy5fZW5kcG9pbnRzLmdldChuYW1lKTtcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBuZXcgQ2hhbm5lbEhhbmRsZXIobmFtZSwgdGhpcywge1xuXHRcdFx0XHQuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0XHQuLi5vcHRpb25zXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGVuZHBvaW50ID0ge1xuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRoYW5kbGVyLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBoYW5kbGVyLmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKG51bGwpLFxuXHRcdFx0XHR1bmlmaWVkOiBoYW5kbGVyLnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9lbmRwb2ludHMuc2V0KG5hbWUsIGVuZHBvaW50KTtcblx0XHRcdHRoaXMuX3JlZ2lzdGVyVW5pZmllZENoYW5uZWwobmFtZSwgaGFuZGxlci51bmlmaWVkKTtcblx0XHRcdHJldHVybiBlbmRwb2ludDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDcmVhdGUgbXVsdGlwbGUgY2hhbm5lbCBlbmRwb2ludHMgYXQgb25jZVxuXHRcdCpcblx0XHQqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIGNoYW5uZWwgbmFtZXNcblx0XHQqIEBwYXJhbSBvcHRpb25zIC0gU2hhcmVkIGNvbm5lY3Rpb24gb3B0aW9uc1xuXHRcdCogQHJldHVybnMgTWFwIG9mIGNoYW5uZWwgbmFtZXMgdG8gZW5kcG9pbnRzXG5cdFx0Ki9cblx0XHRjcmVhdGVDaGFubmVscyhuYW1lcywgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSByZXN1bHQuc2V0KG5hbWUsIHRoaXMuY3JlYXRlQ2hhbm5lbChuYW1lLCBvcHRpb25zKSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBhbiBleGlzdGluZyBjaGFubmVsIGVuZHBvaW50XG5cdFx0Ki9cblx0XHRnZXRDaGFubmVsKG5hbWUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9lbmRwb2ludHMuZ2V0KG5hbWUpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBvciBjcmVhdGUgYSBjaGFubmVsIGVuZHBvaW50XG5cdFx0Ki9cblx0XHRnZXRPckNyZWF0ZUNoYW5uZWwobmFtZSwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLmdldChuYW1lKSA/PyB0aGlzLmNyZWF0ZUNoYW5uZWwobmFtZSwgb3B0aW9ucyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQ2hlY2sgaWYgY2hhbm5lbCBleGlzdHMgaW4gdGhpcyBjb250ZXh0XG5cdFx0Ki9cblx0XHRoYXNDaGFubmVsKG5hbWUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9lbmRwb2ludHMuaGFzKG5hbWUpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBhbGwgY2hhbm5lbCBuYW1lcyBpbiB0aGlzIGNvbnRleHRcblx0XHQqL1xuXHRcdGdldENoYW5uZWxOYW1lcygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fZW5kcG9pbnRzLmtleXMoKV07XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogR2V0IHRvdGFsIG51bWJlciBvZiBjaGFubmVsc1xuXHRcdCovXG5cdFx0Z2V0IHNpemUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLnNpemU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogUmVnaXN0ZXIgYSBkZWZlcnJlZCBjaGFubmVsIHRoYXQgd2lsbCBiZSBpbml0aWFsaXplZCBvbiBmaXJzdCB1c2Vcblx0XHQqXG5cdFx0KiBAcGFyYW0gbmFtZSAtIENoYW5uZWwgbmFtZVxuXHRcdCogQHBhcmFtIGluaXRGbiAtIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWxcblx0XHQqL1xuXHRcdGRlZmVyKG5hbWUsIGluaXRGbikge1xuXHRcdFx0dGhpcy5fZGVmZXJyZWRDaGFubmVscy5zZXQobmFtZSwgaW5pdEZuKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBJbml0aWFsaXplIGEgcHJldmlvdXNseSBkZWZlcnJlZCBjaGFubmVsXG5cdFx0Ki9cblx0XHRhc3luYyBpbml0RGVmZXJyZWQobmFtZSkge1xuXHRcdFx0Y29uc3QgaW5pdEZuID0gdGhpcy5fZGVmZXJyZWRDaGFubmVscy5nZXQobmFtZSk7XG5cdFx0XHRpZiAoIWluaXRGbikgcmV0dXJuIG51bGw7XG5cdFx0XHRjb25zdCBlbmRwb2ludCA9IGF3YWl0IGluaXRGbigpO1xuXHRcdFx0dGhpcy5fZW5kcG9pbnRzLnNldChuYW1lLCBlbmRwb2ludCk7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZENoYW5uZWxzLmRlbGV0ZShuYW1lKTtcblx0XHRcdHJldHVybiBlbmRwb2ludDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDaGVjayBpZiBjaGFubmVsIGlzIGRlZmVycmVkIChub3QgeWV0IGluaXRpYWxpemVkKVxuXHRcdCovXG5cdFx0aXNEZWZlcnJlZChuYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZGVmZXJyZWRDaGFubmVscy5oYXMobmFtZSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogR2V0IGNoYW5uZWwsIGluaXRpYWxpemluZyBkZWZlcnJlZCBpZiBuZWVkZWRcblx0XHQqL1xuXHRcdGFzeW5jIGdldENoYW5uZWxBc3luYyhuYW1lKSB7XG5cdFx0XHRpZiAodGhpcy5fZW5kcG9pbnRzLmhhcyhuYW1lKSkgcmV0dXJuIHRoaXMuX2VuZHBvaW50cy5nZXQobmFtZSk7XG5cdFx0XHRpZiAodGhpcy5fZGVmZXJyZWRDaGFubmVscy5oYXMobmFtZSkpIHJldHVybiB0aGlzLmluaXREZWZlcnJlZChuYW1lKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBhIFdvcmtlciBjaGFubmVsIGR5bmFtaWNhbGx5XG5cdFx0KlxuXHRcdCogQHBhcmFtIG5hbWUgLSBDaGFubmVsIG5hbWVcblx0XHQqIEBwYXJhbSB3b3JrZXIgLSBXb3JrZXIgaW5zdGFuY2UsIFVSTCwgb3IgY29kZSBzdHJpbmdcblx0XHQqIEBwYXJhbSBvcHRpb25zIC0gQ29ubmVjdGlvbiBvcHRpb25zXG5cdFx0Ki9cblx0XHRhc3luYyBhZGRXb3JrZXIobmFtZSwgd29ya2VyLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IHdvcmtlckluc3RhbmNlID0gbG9hZFdvcmtlcih3b3JrZXIpO1xuXHRcdFx0aWYgKCF3b3JrZXJJbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHdvcmtlciBmb3IgY2hhbm5lbDogJHtuYW1lfWApO1xuXHRcdFx0Y29uc3QgaGFuZGxlciA9IG5ldyBDaGFubmVsSGFuZGxlcihuYW1lLCB0aGlzLCB7XG5cdFx0XHRcdC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRcdC4uLm9wdGlvbnNcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgcmVhZHkgPSBoYW5kbGVyLmNyZWF0ZVJlbW90ZUNoYW5uZWwobmFtZSwgb3B0aW9ucywgd29ya2VySW5zdGFuY2UpO1xuXHRcdFx0Y29uc3QgZW5kcG9pbnQgPSB7XG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdGhhbmRsZXIsXG5cdFx0XHRcdGNvbm5lY3Rpb246IGhhbmRsZXIuY29ubmVjdGlvbixcblx0XHRcdFx0c3Vic2NyaXB0aW9uczogW10sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IFwid29ya2VyXCIsXG5cdFx0XHRcdHJlYWR5OiBQcm9taXNlLnJlc29sdmUocmVhZHkpLFxuXHRcdFx0XHR1bmlmaWVkOiBoYW5kbGVyLnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9lbmRwb2ludHMuc2V0KG5hbWUsIGVuZHBvaW50KTtcblx0XHRcdHRoaXMuX3JlZ2lzdGVyVW5pZmllZENoYW5uZWwobmFtZSwgaGFuZGxlci51bmlmaWVkKTtcblx0XHRcdHRoaXMuX3JlbW90ZUNoYW5uZWxzLnNldChuYW1lLCB7XG5cdFx0XHRcdGNoYW5uZWw6IG5hbWUsXG5cdFx0XHRcdGNvbnRleHQ6IHRoaXMsXG5cdFx0XHRcdHJlbW90ZTogUHJvbWlzZS5yZXNvbHZlKHJlYWR5KSxcblx0XHRcdFx0dHJhbnNwb3J0OiB3b3JrZXJJbnN0YW5jZSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogXCJ3b3JrZXJcIlxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gZW5kcG9pbnQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQWRkIGEgTWVzc2FnZVBvcnQgY2hhbm5lbCBkeW5hbWljYWxseVxuXHRcdCpcblx0XHQqIEBwYXJhbSBuYW1lIC0gQ2hhbm5lbCBuYW1lXG5cdFx0KiBAcGFyYW0gcG9ydCAtIE1lc3NhZ2VQb3J0IGluc3RhbmNlXG5cdFx0KiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9uc1xuXHRcdCovXG5cdFx0YXN5bmMgYWRkUG9ydChuYW1lLCBwb3J0LCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBuZXcgQ2hhbm5lbEhhbmRsZXIobmFtZSwgdGhpcywge1xuXHRcdFx0XHQuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0XHQuLi5vcHRpb25zXG5cdFx0XHR9KTtcblx0XHRcdHBvcnQuc3RhcnQ/LigpO1xuXHRcdFx0Y29uc3QgcmVhZHkgPSBoYW5kbGVyLmNyZWF0ZVJlbW90ZUNoYW5uZWwobmFtZSwgb3B0aW9ucywgcG9ydCk7XG5cdFx0XHRjb25zdCBlbmRwb2ludCA9IHtcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0aGFuZGxlcixcblx0XHRcdFx0Y29ubmVjdGlvbjogaGFuZGxlci5jb25uZWN0aW9uLFxuXHRcdFx0XHRzdWJzY3JpcHRpb25zOiBbXSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogXCJtZXNzYWdlLXBvcnRcIixcblx0XHRcdFx0cmVhZHk6IFByb21pc2UucmVzb2x2ZShyZWFkeSksXG5cdFx0XHRcdHVuaWZpZWQ6IGhhbmRsZXIudW5pZmllZFxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2VuZHBvaW50cy5zZXQobmFtZSwgZW5kcG9pbnQpO1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChuYW1lLCBoYW5kbGVyLnVuaWZpZWQpO1xuXHRcdFx0dGhpcy5fcmVtb3RlQ2hhbm5lbHMuc2V0KG5hbWUsIHtcblx0XHRcdFx0Y2hhbm5lbDogbmFtZSxcblx0XHRcdFx0Y29udGV4dDogdGhpcyxcblx0XHRcdFx0cmVtb3RlOiBQcm9taXNlLnJlc29sdmUocmVhZHkpLFxuXHRcdFx0XHR0cmFuc3BvcnQ6IHBvcnQsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IFwibWVzc2FnZS1wb3J0XCJcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGVuZHBvaW50O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBhIEJyb2FkY2FzdENoYW5uZWwgZHluYW1pY2FsbHlcblx0XHQqXG5cdFx0KiBAcGFyYW0gbmFtZSAtIENoYW5uZWwgbmFtZSAoYWxzbyB1c2VkIGFzIEJyb2FkY2FzdENoYW5uZWwgbmFtZSBpZiBub3QgcHJvdmlkZWQpXG5cdFx0KiBAcGFyYW0gYnJvYWRjYXN0TmFtZSAtIE9wdGlvbmFsIEJyb2FkY2FzdENoYW5uZWwgbmFtZSAoZGVmYXVsdHMgdG8gY2hhbm5lbCBuYW1lKVxuXHRcdCogQHBhcmFtIG9wdGlvbnMgLSBDb25uZWN0aW9uIG9wdGlvbnNcblx0XHQqL1xuXHRcdGFzeW5jIGFkZEJyb2FkY2FzdChuYW1lLCBicm9hZGNhc3ROYW1lLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IGJjID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoYnJvYWRjYXN0TmFtZSA/PyBuYW1lKTtcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBuZXcgQ2hhbm5lbEhhbmRsZXIobmFtZSwgdGhpcywge1xuXHRcdFx0XHQuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0XHQuLi5vcHRpb25zXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHJlYWR5ID0gaGFuZGxlci5jcmVhdGVSZW1vdGVDaGFubmVsKG5hbWUsIG9wdGlvbnMsIGJjKTtcblx0XHRcdGNvbnN0IGVuZHBvaW50ID0ge1xuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRoYW5kbGVyLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBoYW5kbGVyLmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcImJyb2FkY2FzdFwiLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKHJlYWR5KSxcblx0XHRcdFx0dW5pZmllZDogaGFuZGxlci51bmlmaWVkXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5fZW5kcG9pbnRzLnNldChuYW1lLCBlbmRwb2ludCk7XG5cdFx0XHR0aGlzLl9yZWdpc3RlclVuaWZpZWRDaGFubmVsKG5hbWUsIGhhbmRsZXIudW5pZmllZCk7XG5cdFx0XHR0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQobmFtZSwge1xuXHRcdFx0XHRjaGFubmVsOiBuYW1lLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLFxuXHRcdFx0XHRyZW1vdGU6IFByb21pc2UucmVzb2x2ZShyZWFkeSksXG5cdFx0XHRcdHRyYW5zcG9ydDogYmMsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IFwiYnJvYWRjYXN0XCJcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGVuZHBvaW50O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBhIGNoYW5uZWwgdXNpbmcgc2VsZi9nbG9iYWxUaGlzIChmb3Igc2FtZS1jb250ZXh0IGNvbW11bmljYXRpb24pXG5cdFx0KlxuXHRcdCogQHBhcmFtIG5hbWUgLSBDaGFubmVsIG5hbWVcblx0XHQqIEBwYXJhbSBvcHRpb25zIC0gQ29ubmVjdGlvbiBvcHRpb25zXG5cdFx0Ki9cblx0XHRhZGRTZWxmQ2hhbm5lbChuYW1lLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBuZXcgQ2hhbm5lbEhhbmRsZXIobmFtZSwgdGhpcywge1xuXHRcdFx0XHQuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0XHQuLi5vcHRpb25zXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHNlbGZUYXJnZXQgPSB0aGlzLl9nbG9iYWxTZWxmID8/ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsKTtcblx0XHRcdGNvbnN0IGVuZHBvaW50ID0ge1xuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRoYW5kbGVyLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBoYW5kbGVyLmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcInNlbGZcIixcblx0XHRcdFx0cmVhZHk6IFByb21pc2UucmVzb2x2ZShzZWxmVGFyZ2V0ID8gaGFuZGxlci5jcmVhdGVSZW1vdGVDaGFubmVsKG5hbWUsIG9wdGlvbnMsIHNlbGZUYXJnZXQpIDogbnVsbCksXG5cdFx0XHRcdHVuaWZpZWQ6IGhhbmRsZXIudW5pZmllZFxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2VuZHBvaW50cy5zZXQobmFtZSwgZW5kcG9pbnQpO1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChuYW1lLCBoYW5kbGVyLnVuaWZpZWQpO1xuXHRcdFx0cmV0dXJuIGVuZHBvaW50O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBjaGFubmVsIHdpdGggZHluYW1pYyB0cmFuc3BvcnQgY29uZmlndXJhdGlvblxuXHRcdCpcblx0XHQqIEBwYXJhbSBuYW1lIC0gQ2hhbm5lbCBuYW1lXG5cdFx0KiBAcGFyYW0gY29uZmlnIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb25cblx0XHQqL1xuXHRcdGFzeW5jIGFkZFRyYW5zcG9ydChuYW1lLCBjb25maWcpIHtcblx0XHRcdGNvbnN0IG9wdGlvbnMgPSBjb25maWcub3B0aW9ucyA/PyB7fTtcblx0XHRcdHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIndvcmtlclwiOlxuXHRcdFx0XHRcdGlmICghY29uZmlnLndvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHJlcXVpcmVkIGZvciB3b3JrZXIgdHJhbnNwb3J0XCIpO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFkZFdvcmtlcihuYW1lLCBjb25maWcud29ya2VyLCBvcHRpb25zKTtcblx0XHRcdFx0Y2FzZSBcIm1lc3NhZ2UtcG9ydFwiOlxuXHRcdFx0XHRcdGlmICghY29uZmlnLnBvcnQpIHRocm93IG5ldyBFcnJvcihcIlBvcnQgcmVxdWlyZWQgZm9yIG1lc3NhZ2UtcG9ydCB0cmFuc3BvcnRcIik7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWRkUG9ydChuYW1lLCBjb25maWcucG9ydCwgb3B0aW9ucyk7XG5cdFx0XHRcdGNhc2UgXCJicm9hZGNhc3RcIjpcblx0XHRcdFx0XHRjb25zdCBiY05hbWUgPSB0eXBlb2YgY29uZmlnLmJyb2FkY2FzdCA9PT0gXCJzdHJpbmdcIiA/IGNvbmZpZy5icm9hZGNhc3QgOiB2b2lkIDA7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWRkQnJvYWRjYXN0KG5hbWUsIGJjTmFtZSwgb3B0aW9ucyk7XG5cdFx0XHRcdGNhc2UgXCJzZWxmXCI6IHJldHVybiB0aGlzLmFkZFNlbGZDaGFubmVsKG5hbWUsIG9wdGlvbnMpO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm4gdGhpcy5jcmVhdGVDaGFubmVsKG5hbWUsIG9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQqIENyZWF0ZSBhIE1lc3NhZ2VDaGFubmVsIHBhaXIgZm9yIGJpZGlyZWN0aW9uYWwgY29tbXVuaWNhdGlvblxuXHRcdCpcblx0XHQqIEBwYXJhbSBuYW1lMSAtIEZpcnN0IGNoYW5uZWwgbmFtZVxuXHRcdCogQHBhcmFtIG5hbWUyIC0gU2Vjb25kIGNoYW5uZWwgbmFtZVxuXHRcdCogQHJldHVybnMgQm90aCBlbmRwb2ludHMgY29ubmVjdGVkIHZpYSBNZXNzYWdlQ2hhbm5lbFxuXHRcdCovXG5cdFx0Y3JlYXRlQ2hhbm5lbFBhaXIobmFtZTEsIG5hbWUyLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IG1jID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG5cdFx0XHRjb25zdCBoYW5kbGVyMSA9IG5ldyBDaGFubmVsSGFuZGxlcihuYW1lMSwgdGhpcywge1xuXHRcdFx0XHQuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0XHQuLi5vcHRpb25zXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGhhbmRsZXIyID0gbmV3IENoYW5uZWxIYW5kbGVyKG5hbWUyLCB0aGlzLCB7XG5cdFx0XHRcdC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRcdC4uLm9wdGlvbnNcblx0XHRcdH0pO1xuXHRcdFx0bWMucG9ydDEuc3RhcnQoKTtcblx0XHRcdG1jLnBvcnQyLnN0YXJ0KCk7XG5cdFx0XHRjb25zdCByZWFkeTEgPSBQcm9taXNlLnJlc29sdmUoaGFuZGxlcjEuY3JlYXRlUmVtb3RlQ2hhbm5lbChuYW1lMiwgb3B0aW9ucywgbWMucG9ydDEpKTtcblx0XHRcdGNvbnN0IHJlYWR5MiA9IFByb21pc2UucmVzb2x2ZShoYW5kbGVyMi5jcmVhdGVSZW1vdGVDaGFubmVsKG5hbWUxLCBvcHRpb25zLCBtYy5wb3J0MikpO1xuXHRcdFx0Y29uc3QgY2hhbm5lbDEgPSB7XG5cdFx0XHRcdG5hbWU6IG5hbWUxLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyMSxcblx0XHRcdFx0Y29ubmVjdGlvbjogaGFuZGxlcjEuY29ubmVjdGlvbixcblx0XHRcdFx0c3Vic2NyaXB0aW9uczogW10sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IFwibWVzc2FnZS1wb3J0XCIsXG5cdFx0XHRcdHJlYWR5OiByZWFkeTEsXG5cdFx0XHRcdHVuaWZpZWQ6IGhhbmRsZXIxLnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBjaGFubmVsMiA9IHtcblx0XHRcdFx0bmFtZTogbmFtZTIsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIyLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBoYW5kbGVyMi5jb25uZWN0aW9uLFxuXHRcdFx0XHRzdWJzY3JpcHRpb25zOiBbXSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogXCJtZXNzYWdlLXBvcnRcIixcblx0XHRcdFx0cmVhZHk6IHJlYWR5Mixcblx0XHRcdFx0dW5pZmllZDogaGFuZGxlcjIudW5pZmllZFxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2VuZHBvaW50cy5zZXQobmFtZTEsIGNoYW5uZWwxKTtcblx0XHRcdHRoaXMuX2VuZHBvaW50cy5zZXQobmFtZTIsIGNoYW5uZWwyKTtcblx0XHRcdHRoaXMuX3JlZ2lzdGVyVW5pZmllZENoYW5uZWwobmFtZTEsIGhhbmRsZXIxLnVuaWZpZWQpO1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChuYW1lMiwgaGFuZGxlcjIudW5pZmllZCk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjaGFubmVsMSxcblx0XHRcdFx0Y2hhbm5lbDIsXG5cdFx0XHRcdG1lc3NhZ2VDaGFubmVsOiBtY1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgdGhlIGdsb2JhbCBzZWxmIHJlZmVyZW5jZVxuXHRcdCovXG5cdFx0Z2V0IGdsb2JhbFNlbGYoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2xvYmFsU2VsZjtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDb25uZWN0IHRvIGEgcmVtb3RlIGNoYW5uZWwgKGUuZy4sIGluIGEgV29ya2VyKVxuXHRcdCovXG5cdFx0YXN5bmMgY29ubmVjdFJlbW90ZShjaGFubmVsTmFtZSwgb3B0aW9ucyA9IHt9LCBicm9hZGNhc3QpIHtcblx0XHRcdHRoaXMuaW5pdEhvc3QoKTtcblx0XHRcdHJldHVybiB0aGlzLl9ob3N0LmNyZWF0ZVJlbW90ZUNoYW5uZWwoY2hhbm5lbE5hbWUsIG9wdGlvbnMsIGJyb2FkY2FzdCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogSW1wb3J0IGEgbW9kdWxlIGluIGEgcmVtb3RlIGNoYW5uZWxcblx0XHQqL1xuXHRcdGFzeW5jIGltcG9ydE1vZHVsZUluQ2hhbm5lbChjaGFubmVsTmFtZSwgdXJsLCBvcHRpb25zID0ge30sIGJyb2FkY2FzdCkge1xuXHRcdFx0cmV0dXJuIChhd2FpdCB0aGlzLmNvbm5lY3RSZW1vdGUoY2hhbm5lbE5hbWUsIG9wdGlvbnMuY2hhbm5lbE9wdGlvbnMsIGJyb2FkY2FzdCkpPy5kb0ltcG9ydE1vZHVsZT8uKHVybCwgb3B0aW9ucy5pbXBvcnRPcHRpb25zKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBJbnRlcm5hbDogQ3JlYXRlIG9yIHVzZSBleGlzdGluZyByZW1vdGUgY2hhbm5lbFxuXHRcdCovXG5cdFx0JGNyZWF0ZU9yVXNlRXhpc3RpbmdSZW1vdGUoY2hhbm5lbCwgb3B0aW9ucyA9IHt9LCBicm9hZGNhc3QpIHtcblx0XHRcdGlmIChjaGFubmVsID09IG51bGwgfHwgYnJvYWRjYXN0KSByZXR1cm4gbnVsbDtcblx0XHRcdGlmICh0aGlzLl9yZW1vdGVDaGFubmVscy5oYXMoY2hhbm5lbCkpIHJldHVybiB0aGlzLl9yZW1vdGVDaGFubmVscy5nZXQoY2hhbm5lbCk7XG5cdFx0XHRjb25zdCBtc2dDaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG5cdFx0XHRjb25zdCBwcm9taXNlID0gUHJvbWlzZWQobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdFx0Y29uc3Qgd29ya2VyID0gbG9hZFdvcmtlcih3b3JrZXJDb2RlKTtcblx0XHRcdFx0d29ya2VyPy5hZGRFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdGlmIChldmVudC5kYXRhLnR5cGUgPT09IFwiY2hhbm5lbENyZWF0ZWRcIikge1xuXHRcdFx0XHRcdFx0bXNnQ2hhbm5lbC5wb3J0MT8uc3RhcnQ/LigpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShuZXcgUmVtb3RlQ2hhbm5lbEhlbHBlcihldmVudC5kYXRhLmNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrZXI/LnBvc3RNZXNzYWdlPy4oe1xuXHRcdFx0XHRcdHR5cGU6IFwiY3JlYXRlQ2hhbm5lbFwiLFxuXHRcdFx0XHRcdGNoYW5uZWwsXG5cdFx0XHRcdFx0c2VuZGVyOiB0aGlzLl9ob3N0TmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdG1lc3NhZ2VQb3J0OiBtc2dDaGFubmVsLnBvcnQyXG5cdFx0XHRcdH0sIHsgdHJhbnNmZXI6IFttc2dDaGFubmVsLnBvcnQyXSB9KTtcblx0XHRcdH0pKTtcblx0XHRcdGNvbnN0IGluZm8gPSB7XG5cdFx0XHRcdGNoYW5uZWwsXG5cdFx0XHRcdGNvbnRleHQ6IHRoaXMsXG5cdFx0XHRcdG1lc3NhZ2VDaGFubmVsOiBtc2dDaGFubmVsLFxuXHRcdFx0XHRyZW1vdGU6IHByb21pc2Vcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQoY2hhbm5lbCwgaW5mbyk7XG5cdFx0XHRyZXR1cm4gaW5mbztcblx0XHR9XG5cdFx0JHJlZ2lzdGVyQ29ubmVjdGlvbihwYXJhbXMpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdC4uLnRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5yZWdpc3RlcihwYXJhbXMpLFxuXHRcdFx0XHRjb250ZXh0SWQ6IHRoaXMuX2lkXG5cdFx0XHR9O1xuXHRcdH1cblx0XHQkbWFya05vdGlmaWVkKHBhcmFtcykge1xuXHRcdFx0Y29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5yZWdpc3Rlcih7XG5cdFx0XHRcdGxvY2FsQ2hhbm5lbDogcGFyYW1zLmxvY2FsQ2hhbm5lbCxcblx0XHRcdFx0cmVtb3RlQ2hhbm5lbDogcGFyYW1zLnJlbW90ZUNoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogcGFyYW1zLnNlbmRlcixcblx0XHRcdFx0ZGlyZWN0aW9uOiBwYXJhbXMuZGlyZWN0aW9uLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBwYXJhbXMudHJhbnNwb3J0VHlwZVxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkubWFya05vdGlmaWVkKGNvbm5lY3Rpb24sIHBhcmFtcy5wYXlsb2FkKTtcblx0XHR9XG5cdFx0JG9ic2VydmVTaWduYWwocGFyYW1zKSB7XG5cdFx0XHRjb25zdCBkaXJlY3Rpb24gPSAocGFyYW1zLnBheWxvYWQ/LnR5cGUgPz8gXCJub3RpZnlcIikgPT09IFwiY29ubmVjdFwiID8gXCJpbmNvbWluZ1wiIDogXCJpbmNvbWluZ1wiO1xuXHRcdFx0dGhpcy4kbWFya05vdGlmaWVkKHtcblx0XHRcdFx0bG9jYWxDaGFubmVsOiBwYXJhbXMubG9jYWxDaGFubmVsLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiBwYXJhbXMucmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBwYXJhbXMuc2VuZGVyLFxuXHRcdFx0XHRkaXJlY3Rpb24sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IHBhcmFtcy50cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRwYXlsb2FkOiBwYXJhbXMucGF5bG9hZFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdCRmb3J3YXJkVW5pZmllZENvbm5lY3Rpb25FdmVudChjaGFubmVsLCBldmVudCkge1xuXHRcdFx0Y29uc3QgbWFwcGVkVHJhbnNwb3J0VHlwZSA9IGV2ZW50LmNvbm5lY3Rpb24udHJhbnNwb3J0VHlwZSA/PyBcImludGVybmFsXCI7XG5cdFx0XHRjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LnJlZ2lzdGVyKHtcblx0XHRcdFx0bG9jYWxDaGFubmVsOiBldmVudC5jb25uZWN0aW9uLmxvY2FsQ2hhbm5lbCB8fCBjaGFubmVsLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiBldmVudC5jb25uZWN0aW9uLnJlbW90ZUNoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogZXZlbnQuY29ubmVjdGlvbi5zZW5kZXIsXG5cdFx0XHRcdGRpcmVjdGlvbjogZXZlbnQuY29ubmVjdGlvbi5kaXJlY3Rpb24sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IG1hcHBlZFRyYW5zcG9ydFR5cGUsXG5cdFx0XHRcdG1ldGFkYXRhOiBldmVudC5jb25uZWN0aW9uLm1ldGFkYXRhXG5cdFx0XHR9KTtcblx0XHRcdGlmIChldmVudC50eXBlID09PSBcIm5vdGlmaWVkXCIpIHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5tYXJrTm90aWZpZWQoY29ubmVjdGlvbiwgZXZlbnQucGF5bG9hZCk7XG5cdFx0XHRlbHNlIGlmIChldmVudC50eXBlID09PSBcImRpc2Nvbm5lY3RlZFwiKSB0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkuY2xvc2VCeUNoYW5uZWwoZXZlbnQuY29ubmVjdGlvbi5sb2NhbENoYW5uZWwpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENsb3NlIGEgc3BlY2lmaWMgY2hhbm5lbFxuXHRcdCovXG5cdFx0Y2xvc2VDaGFubmVsKG5hbWUpIHtcblx0XHRcdGNvbnN0IGVuZHBvaW50ID0gdGhpcy5fZW5kcG9pbnRzLmdldChuYW1lKTtcblx0XHRcdGlmICghZW5kcG9pbnQpIHJldHVybiBmYWxzZTtcblx0XHRcdGVuZHBvaW50LnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcblx0XHRcdGVuZHBvaW50LmhhbmRsZXIuY2xvc2UoKTtcblx0XHRcdGVuZHBvaW50LnRyYW5zcG9ydD8uZGV0YWNoKCk7XG5cdFx0XHR0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuZ2V0KG5hbWUpPy51bnN1YnNjcmliZSgpO1xuXHRcdFx0dGhpcy5fdW5pZmllZENvbm5lY3Rpb25TdWJzLmRlbGV0ZShuYW1lKTtcblx0XHRcdHRoaXMuX3VuaWZpZWRCeUNoYW5uZWwuZGVsZXRlKG5hbWUpO1xuXHRcdFx0dGhpcy5fZW5kcG9pbnRzLmRlbGV0ZShuYW1lKTtcblx0XHRcdGlmIChuYW1lID09PSB0aGlzLl9ob3N0TmFtZSkgdGhpcy5faG9zdCA9IG51bGw7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkuY2xvc2VCeUNoYW5uZWwobmFtZSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDbG9zZSBhbGwgY2hhbm5lbHMgYW5kIGNsZWFudXBcblx0XHQqL1xuXHRcdGNsb3NlKCkge1xuXHRcdFx0aWYgKHRoaXMuX2Nsb3NlZCkgcmV0dXJuO1xuXHRcdFx0dGhpcy5fY2xvc2VkID0gdHJ1ZTtcblx0XHRcdGZvciAoY29uc3QgW25hbWVdIG9mIHRoaXMuX2VuZHBvaW50cykgdGhpcy5jbG9zZUNoYW5uZWwobmFtZSk7XG5cdFx0XHR0aGlzLl9yZW1vdGVDaGFubmVscy5jbGVhcigpO1xuXHRcdFx0dGhpcy5faG9zdCA9IG51bGw7XG5cdFx0XHR0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG5cdFx0XHR0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuY2xlYXIoKTtcblx0XHRcdHRoaXMuX3VuaWZpZWRCeUNoYW5uZWwuY2xlYXIoKTtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5jbGVhcigpO1xuXHRcdFx0dGhpcy5fY29ubmVjdGlvbkV2ZW50cy5jb21wbGV0ZSgpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENoZWNrIGlmIGNvbnRleHQgaXMgY2xvc2VkXG5cdFx0Ki9cblx0XHRnZXQgY2xvc2VkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nsb3NlZDtcblx0XHR9XG5cdFx0X3JlZ2lzdGVyVW5pZmllZENoYW5uZWwobmFtZSwgdW5pZmllZCkge1xuXHRcdFx0dGhpcy5fdW5pZmllZEJ5Q2hhbm5lbC5zZXQobmFtZSwgdW5pZmllZCk7XG5cdFx0XHR0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuZ2V0KG5hbWUpPy51bnN1YnNjcmliZSgpO1xuXHRcdFx0Y29uc3Qgc3Vic2NyaXB0aW9uID0gdW5pZmllZC5zdWJzY3JpYmVDb25uZWN0aW9ucygoZXZlbnQpID0+IHtcblx0XHRcdFx0dGhpcy4kZm9yd2FyZFVuaWZpZWRDb25uZWN0aW9uRXZlbnQobmFtZSwgZXZlbnQpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuc2V0KG5hbWUsIHN1YnNjcmlwdGlvbik7XG5cdFx0fVxuXHRcdF9lbWl0Q29ubmVjdGlvbkV2ZW50KGV2ZW50KSB7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uRXZlbnRzLm5leHQoe1xuXHRcdFx0XHQuLi5ldmVudCxcblx0XHRcdFx0Y29ubmVjdGlvbjoge1xuXHRcdFx0XHRcdC4uLmV2ZW50LmNvbm5lY3Rpb24sXG5cdFx0XHRcdFx0Y29udGV4dElkOiB0aGlzLl9pZFxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cdGZ1bmN0aW9uIGlzUmVmbGVjdEFjdGlvbihhY3Rpb24pIHtcblx0XHRyZXR1cm4gWy4uLk9iamVjdC52YWx1ZXMoV1JlZmxlY3RBY3Rpb24pXS5pbmNsdWRlcyhhY3Rpb24pO1xuXHR9XG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZVRyYW5zcG9ydEJpbmRpbmcodGFyZ2V0KSB7XG5cdFx0aWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuXHRcdGlmIChpc1RyYW5zcG9ydEJpbmRpbmcodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcblx0XHRjb25zdCBuYXRpdmVUYXJnZXQgPSB0YXJnZXQ7XG5cdFx0Y29uc3QgdHJhbnNwb3J0VHlwZSA9IGdldER5bmFtaWNUcmFuc3BvcnRUeXBlKG5hdGl2ZVRhcmdldCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldDogbmF0aXZlVGFyZ2V0LFxuXHRcdFx0dGFyZ2V0Q2hhbm5lbDogXCJ1bmtub3duXCIsXG5cdFx0XHR0cmFuc3BvcnRUeXBlOiB0cmFuc3BvcnRUeXBlID09PSBcImludGVybmFsXCIgPyBcInNlbGZcIiA6IHRyYW5zcG9ydFR5cGUsXG5cdFx0XHRzZW5kZXI6IChtZXNzYWdlLCB0cmFuc2ZlcikgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIFdlYlNvY2tldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXRpdmVUYXJnZXQgaW5zdGFuY2VvZiBXZWJTb2NrZXQpIHtcblx0XHRcdFx0XHRuYXRpdmVUYXJnZXQuc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5hdGl2ZVRhcmdldC5wb3N0TWVzc2FnZT8uKG1lc3NhZ2UsIHRyYW5zZmVyPy5sZW5ndGggPyB7IHRyYW5zZmVyIH0gOiB2b2lkIDApO1xuXHRcdFx0fSxcblx0XHRcdHBvc3RNZXNzYWdlOiAobWVzc2FnZSwgb3B0aW9ucykgPT4ge1xuXHRcdFx0XHRuYXRpdmVUYXJnZXQucG9zdE1lc3NhZ2U/LihtZXNzYWdlLCBvcHRpb25zKTtcblx0XHRcdH0sXG5cdFx0XHRhZGRFdmVudExpc3RlbmVyOiBuYXRpdmVUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcj8uYmluZChuYXRpdmVUYXJnZXQpLFxuXHRcdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogbmF0aXZlVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXI/LmJpbmQobmF0aXZlVGFyZ2V0KSxcblx0XHRcdHN0YXJ0OiBuYXRpdmVUYXJnZXQuc3RhcnQ/LmJpbmQobmF0aXZlVGFyZ2V0KSxcblx0XHRcdGNsb3NlOiBuYXRpdmVUYXJnZXQuY2xvc2U/LmJpbmQobmF0aXZlVGFyZ2V0KVxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gaXNUcmFuc3BvcnRCaW5kaW5nKHZhbHVlKSB7XG5cdFx0cmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwidGFyZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnBvc3RNZXNzYWdlID09PSBcImZ1bmN0aW9uXCI7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RHluYW1pY1RyYW5zcG9ydFR5cGUodGFyZ2V0KSB7XG5cdFx0Y29uc3QgZWZmZWN0aXZlVGFyZ2V0ID0gaXNUcmFuc3BvcnRCaW5kaW5nKHRhcmdldCkgPyB0YXJnZXQudGFyZ2V0IDogdGFyZ2V0O1xuXHRcdGlmICghZWZmZWN0aXZlVGFyZ2V0KSByZXR1cm4gXCJpbnRlcm5hbFwiO1xuXHRcdGlmIChlZmZlY3RpdmVUYXJnZXQgPT09IFwiY2hyb21lLXJ1bnRpbWVcIikgcmV0dXJuIFwiY2hyb21lLXJ1bnRpbWVcIjtcblx0XHRpZiAoZWZmZWN0aXZlVGFyZ2V0ID09PSBcImNocm9tZS10YWJzXCIpIHJldHVybiBcImNocm9tZS10YWJzXCI7XG5cdFx0aWYgKGVmZmVjdGl2ZVRhcmdldCA9PT0gXCJjaHJvbWUtcG9ydFwiKSByZXR1cm4gXCJjaHJvbWUtcG9ydFwiO1xuXHRcdGlmIChlZmZlY3RpdmVUYXJnZXQgPT09IFwiY2hyb21lLWV4dGVybmFsXCIpIHJldHVybiBcImNocm9tZS1leHRlcm5hbFwiO1xuXHRcdGlmICh0eXBlb2YgTWVzc2FnZVBvcnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZWZmZWN0aXZlVGFyZ2V0IGluc3RhbmNlb2YgTWVzc2FnZVBvcnQpIHJldHVybiBcIm1lc3NhZ2UtcG9ydFwiO1xuXHRcdGlmICh0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlZmZlY3RpdmVUYXJnZXQgaW5zdGFuY2VvZiBCcm9hZGNhc3RDaGFubmVsKSByZXR1cm4gXCJicm9hZGNhc3RcIjtcblx0XHRpZiAodHlwZW9mIFdvcmtlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlZmZlY3RpdmVUYXJnZXQgaW5zdGFuY2VvZiBXb3JrZXIpIHJldHVybiBcIndvcmtlclwiO1xuXHRcdGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGVmZmVjdGl2ZVRhcmdldCBpbnN0YW5jZW9mIFdlYlNvY2tldCkgcmV0dXJuIFwid2Vic29ja2V0XCI7XG5cdFx0aWYgKHR5cGVvZiBjaHJvbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGVmZmVjdGl2ZVRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiBlZmZlY3RpdmVUYXJnZXQgJiYgdHlwZW9mIGVmZmVjdGl2ZVRhcmdldC5wb3N0TWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiICYmIGVmZmVjdGl2ZVRhcmdldC5vbk1lc3NhZ2U/LmFkZExpc3RlbmVyKSByZXR1cm4gXCJjaHJvbWUtcG9ydFwiO1xuXHRcdGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlZmZlY3RpdmVUYXJnZXQgPT09IHNlbGYpIHJldHVybiBcInNlbGZcIjtcblx0XHRyZXR1cm4gXCJpbnRlcm5hbFwiO1xuXHR9XG5cdGZ1bmN0aW9uIGxvYWRXb3JrZXIoV1gpIHtcblx0XHRpZiAoV1ggaW5zdGFuY2VvZiBXb3JrZXIpIHJldHVybiBXWDtcblx0XHRpZiAoV1ggaW5zdGFuY2VvZiBVUkwpIHJldHVybiBuZXcgV29ya2VyKFdYLmhyZWYsIHsgdHlwZTogXCJtb2R1bGVcIiB9KTtcblx0XHRpZiAodHlwZW9mIFdYID09PSBcImZ1bmN0aW9uXCIpIHRyeSB7XG5cdFx0XHRyZXR1cm4gbmV3IFdYKHsgdHlwZTogXCJtb2R1bGVcIiB9KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBXWCh7IHR5cGU6IFwibW9kdWxlXCIgfSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgV1ggPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGlmIChXWC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIG5ldyBXb3JrZXIocmVzb2x2ZVdvcmtlclNwZWNpZmllckhyZWYoV1gucmVwbGFjZSgvXlxcLy8sIFwiLi9cIikpLCB7IHR5cGU6IFwibW9kdWxlXCIgfSk7XG5cdFx0XHRpZiAoVVJMLmNhblBhcnNlKFdYKSB8fCBXWC5zdGFydHNXaXRoKFwiLi9cIikpIHJldHVybiBuZXcgV29ya2VyKHJlc29sdmVXb3JrZXJTcGVjaWZpZXJIcmVmKFdYKSwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuXHRcdFx0cmV0dXJuIG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbV1hdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIH0pKSwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuXHRcdH1cblx0XHRpZiAoV1ggaW5zdGFuY2VvZiBCbG9iIHx8IFdYIGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChXWCksIHsgdHlwZTogXCJtb2R1bGVcIiB9KTtcblx0XHRyZXR1cm4gV1ggPz8gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IG51bGwpO1xuXHR9XG5cdC8qKiBHbG9iYWwgY29udGV4dCByZWdpc3RyeSBmb3Igc2hhcmVkIGNvbnRleHRzICovXG5cdGNvbnN0IENPTlRFWFRfUkVHSVNUUlkgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHQvKipcblx0KiBDcmVhdGUgYSBuZXcgY2hhbm5lbCBjb250ZXh0XG5cdCpcblx0KiBVc2UgdGhpcyBmb3IgaXNvbGF0ZWQgY2hhbm5lbCBtYW5hZ2VtZW50IGluIGNvbXBvbmVudHNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlQ2hhbm5lbENvbnRleHQob3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3QgY3R4ID0gbmV3IENoYW5uZWxDb250ZXh0KG9wdGlvbnMpO1xuXHRcdGlmIChvcHRpb25zLm5hbWUpIENPTlRFWFRfUkVHSVNUUlkuc2V0KG9wdGlvbnMubmFtZSwgY3R4KTtcblx0XHRyZXR1cm4gY3R4O1xuXHR9XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uL3VuaWZvcm0udHMvc3JjL25ld2VyL25leHQvdHJhbnNwb3J0L1dvcmtlci50c1xuLyoqXG5cdCogV29ya2VyIEVudHJ5IFBvaW50IC0gTXVsdGktQ2hhbm5lbCBTdXBwb3J0XG5cdCpcblx0KiBUaGlzIHdvcmtlciBjb250ZXh0IHN1cHBvcnRzOlxuXHQqIC0gTXVsdGlwbGUgY2hhbm5lbCBjcmVhdGlvbi9pbml0aWFsaXphdGlvblxuXHQqIC0gT2JzZXJ2aW5nIG5ldyBpbmNvbWluZyBjaGFubmVsIGNvbm5lY3Rpb25zXG5cdCogLSBEeW5hbWljIGNoYW5uZWwgYWRkaXRpb24gYWZ0ZXIgaW5pdGlhbGl6YXRpb25cblx0KiAtIENvbm5lY3Rpb24gZnJvbSByZW1vdGUvaG9zdCBjb250ZXh0c1xuXHQqL1xuXHQvKipcblx0KiBXb3JrZXJDb250ZXh0IC0gTWFuYWdlcyBjaGFubmVscyB3aXRoaW4gYSBXb3JrZXJcblx0KlxuXHQqIFN1cHBvcnRzIG9ic2VydmluZyBuZXcgaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSBob3N0L3JlbW90ZSBjb250ZXh0cy5cblx0Ki9cblx0dmFyIFdvcmtlckNvbnRleHQgPSBjbGFzcyB7XG5cdFx0X2NvbnRleHQ7XG5cdFx0X2NvbmZpZztcblx0XHRfc3Vic2NyaXB0aW9ucyA9IFtdO1xuXHRcdF9pbmNvbWluZ0Nvbm5lY3Rpb25zID0gbmV3IENoYW5uZWxTdWJqZWN0KHsgYnVmZmVyU2l6ZTogMTAwIH0pO1xuXHRcdF9jaGFubmVsQ3JlYXRlZCA9IG5ldyBDaGFubmVsU3ViamVjdCh7IGJ1ZmZlclNpemU6IDEwMCB9KTtcblx0XHRfY2hhbm5lbENsb3NlZCA9IG5ldyBDaGFubmVsU3ViamVjdCgpO1xuXHRcdGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG5cdFx0XHR0aGlzLl9jb25maWcgPSB7XG5cdFx0XHRcdG5hbWU6IGNvbmZpZy5uYW1lID8/IFwid29ya2VyXCIsXG5cdFx0XHRcdHdvcmtlck5hbWU6IGNvbmZpZy53b3JrZXJOYW1lID8/IGB3b3JrZXItJHtVVUlEdjQoKS5zbGljZSgwLCA4KX1gLFxuXHRcdFx0XHRhdXRvQWNjZXB0Q2hhbm5lbHM6IGNvbmZpZy5hdXRvQWNjZXB0Q2hhbm5lbHMgPz8gdHJ1ZSxcblx0XHRcdFx0YWxsb3dlZENoYW5uZWxzOiBjb25maWcuYWxsb3dlZENoYW5uZWxzID8/IFtdLFxuXHRcdFx0XHRtYXhDaGFubmVsczogY29uZmlnLm1heENoYW5uZWxzID8/IDEwMCxcblx0XHRcdFx0YXV0b0Nvbm5lY3Q6IGNvbmZpZy5hdXRvQ29ubmVjdCA/PyB0cnVlLFxuXHRcdFx0XHR1c2VHbG9iYWxTZWxmOiB0cnVlLFxuXHRcdFx0XHRkZWZhdWx0T3B0aW9uczogY29uZmlnLmRlZmF1bHRPcHRpb25zID8/IHt9LFxuXHRcdFx0XHRpc29sYXRlZFN0b3JhZ2U6IGNvbmZpZy5pc29sYXRlZFN0b3JhZ2UgPz8gZmFsc2UsXG5cdFx0XHRcdC4uLmNvbmZpZ1xuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2NvbnRleHQgPSBjcmVhdGVDaGFubmVsQ29udGV4dCh7XG5cdFx0XHRcdG5hbWU6IHRoaXMuX2NvbmZpZy5uYW1lLFxuXHRcdFx0XHR1c2VHbG9iYWxTZWxmOiB0cnVlLFxuXHRcdFx0XHRkZWZhdWx0T3B0aW9uczogY29uZmlnLmRlZmF1bHRPcHRpb25zXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX3NldHVwTWVzc2FnZUxpc3RlbmVyKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogT2JzZXJ2YWJsZTogTmV3IGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdHNcblx0XHQqL1xuXHRcdGdldCBvbkNvbm5lY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faW5jb21pbmdDb25uZWN0aW9ucztcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBPYnNlcnZhYmxlOiBDaGFubmVsIGNyZWF0ZWQgZXZlbnRzXG5cdFx0Ki9cblx0XHRnZXQgb25DaGFubmVsQ3JlYXRlZCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jaGFubmVsQ3JlYXRlZDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBPYnNlcnZhYmxlOiBDaGFubmVsIGNsb3NlZCBldmVudHNcblx0XHQqL1xuXHRcdGdldCBvbkNoYW5uZWxDbG9zZWQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hhbm5lbENsb3NlZDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTdWJzY3JpYmUgdG8gaW5jb21pbmcgY29ubmVjdGlvbnNcblx0XHQqL1xuXHRcdHN1YnNjcmliZUNvbm5lY3Rpb25zKGhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbmNvbWluZ0Nvbm5lY3Rpb25zLnN1YnNjcmliZShoYW5kbGVyKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTdWJzY3JpYmUgdG8gY2hhbm5lbCBjcmVhdGlvblxuXHRcdCovXG5cdFx0c3Vic2NyaWJlQ2hhbm5lbENyZWF0ZWQoaGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxDcmVhdGVkLnN1YnNjcmliZShoYW5kbGVyKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBBY2NlcHQgYW4gaW5jb21pbmcgY29ubmVjdGlvbiBhbmQgY3JlYXRlIHRoZSBjaGFubmVsXG5cdFx0Ki9cblx0XHRhY2NlcHRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcblx0XHRcdGlmICghdGhpcy5fY2FuQWNjZXB0Q2hhbm5lbChjb25uZWN0aW9uLmNoYW5uZWwpKSByZXR1cm4gbnVsbDtcblx0XHRcdGNvbnN0IGVuZHBvaW50ID0gdGhpcy5fY29udGV4dC5jcmVhdGVDaGFubmVsKGNvbm5lY3Rpb24uY2hhbm5lbCwgY29ubmVjdGlvbi5vcHRpb25zKTtcblx0XHRcdGlmIChjb25uZWN0aW9uLnBvcnQpIHtcblx0XHRcdFx0Y29ubmVjdGlvbi5wb3J0LnN0YXJ0Py4oKTtcblx0XHRcdFx0ZW5kcG9pbnQuaGFuZGxlci5jcmVhdGVSZW1vdGVDaGFubmVsKGNvbm5lY3Rpb24uc2VuZGVyLCBjb25uZWN0aW9uLm9wdGlvbnMsIGNvbm5lY3Rpb24ucG9ydCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9jaGFubmVsQ3JlYXRlZC5uZXh0KHtcblx0XHRcdFx0Y2hhbm5lbDogY29ubmVjdGlvbi5jaGFubmVsLFxuXHRcdFx0XHRlbmRwb2ludCxcblx0XHRcdFx0c2VuZGVyOiBjb25uZWN0aW9uLnNlbmRlcixcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX3Bvc3RDaGFubmVsQ3JlYXRlZChjb25uZWN0aW9uLmNoYW5uZWwsIGNvbm5lY3Rpb24uc2VuZGVyLCBjb25uZWN0aW9uLmlkKTtcblx0XHRcdHJldHVybiBlbmRwb2ludDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDcmVhdGUgYSBuZXcgY2hhbm5lbCBpbiB0aGlzIHdvcmtlciBjb250ZXh0XG5cdFx0Ki9cblx0XHRjcmVhdGVDaGFubmVsKG5hbWUsIG9wdGlvbnMpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb250ZXh0LmNyZWF0ZUNoYW5uZWwobmFtZSwgb3B0aW9ucyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogR2V0IGFuIGV4aXN0aW5nIGNoYW5uZWxcblx0XHQqL1xuXHRcdGdldENoYW5uZWwobmFtZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQuZ2V0Q2hhbm5lbChuYW1lKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBDaGVjayBpZiBjaGFubmVsIGV4aXN0c1xuXHRcdCovXG5cdFx0aGFzQ2hhbm5lbChuYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5oYXNDaGFubmVsKG5hbWUpO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEdldCBhbGwgY2hhbm5lbCBuYW1lc1xuXHRcdCovXG5cdFx0Z2V0Q2hhbm5lbE5hbWVzKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQuZ2V0Q2hhbm5lbE5hbWVzKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogUXVlcnkgY3VycmVudGx5IHRyYWNrZWQgY2hhbm5lbCBjb25uZWN0aW9ucyBpbiB0aGlzIHdvcmtlci5cblx0XHQqL1xuXHRcdHF1ZXJ5Q29ubmVjdGlvbnMocXVlcnkgPSB7fSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQucXVlcnlDb25uZWN0aW9ucyhxdWVyeSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogTm90aWZ5IGFjdGl2ZSBjb25uZWN0aW9ucyAodXNlZnVsIGZvciB3b3JrZXI8LT5ob3N0IHN5bmMpLlxuXHRcdCovXG5cdFx0bm90aWZ5Q29ubmVjdGlvbnMocGF5bG9hZCA9IHt9LCBxdWVyeSA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5ub3RpZnlDb25uZWN0aW9ucyhwYXlsb2FkLCBxdWVyeSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQ2xvc2UgYSBzcGVjaWZpYyBjaGFubmVsXG5cdFx0Ki9cblx0XHRjbG9zZUNoYW5uZWwobmFtZSkge1xuXHRcdFx0Y29uc3QgY2xvc2VkID0gdGhpcy5fY29udGV4dC5jbG9zZUNoYW5uZWwobmFtZSk7XG5cdFx0XHRpZiAoY2xvc2VkKSB0aGlzLl9jaGFubmVsQ2xvc2VkLm5leHQoe1xuXHRcdFx0XHRjaGFubmVsOiBuYW1lLFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGNsb3NlZDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgdGhlIHVuZGVybHlpbmcgY29udGV4dFxuXHRcdCovXG5cdFx0Z2V0IGNvbnRleHQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBHZXQgd29ya2VyIGNvbmZpZ3VyYXRpb25cblx0XHQqL1xuXHRcdGdldCBjb25maWcoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29uZmlnO1xuXHRcdH1cblx0XHRfc2V0dXBNZXNzYWdlTGlzdGVuZXIoKSB7XG5cdFx0XHRhZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoKGV2ZW50KSA9PiB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZUluY29taW5nTWVzc2FnZShldmVudCk7XG5cdFx0XHR9KSk7XG5cdFx0fVxuXHRcdF9oYW5kbGVJbmNvbWluZ01lc3NhZ2UoZXZlbnQpIHtcblx0XHRcdGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuXHRcdFx0aWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG5cdFx0XHRzd2l0Y2ggKGRhdGEudHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiY3JlYXRlQ2hhbm5lbFwiOlxuXHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNyZWF0ZUNoYW5uZWwoZGF0YSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjb25uZWN0Q2hhbm5lbFwiOlxuXHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNvbm5lY3RDaGFubmVsKGRhdGEpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiYWRkUG9ydFwiOlxuXHRcdFx0XHRcdHRoaXMuX2hhbmRsZUFkZFBvcnQoZGF0YSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJsaXN0Q2hhbm5lbHNcIjpcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVMaXN0Q2hhbm5lbHMoZGF0YSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjbG9zZUNoYW5uZWxcIjpcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVDbG9zZUNoYW5uZWwoZGF0YSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJwaW5nXCI6XG5cdFx0XHRcdFx0cG9zdE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0dHlwZTogXCJwb25nXCIsXG5cdFx0XHRcdFx0XHRpZDogZGF0YS5pZCxcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBpZiAoZGF0YS5jaGFubmVsICYmIHRoaXMuX2NvbnRleHQuaGFzQ2hhbm5lbChkYXRhLmNoYW5uZWwpKSAodGhpcy5fY29udGV4dC5nZXRDaGFubmVsKGRhdGEuY2hhbm5lbCk/LmhhbmRsZXIpPy5oYW5kbGVBbmRSZXNwb25zZT8uKGRhdGEucGF5bG9hZCwgZGF0YS5yZXFJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdF9oYW5kbGVDcmVhdGVDaGFubmVsKGRhdGEpIHtcblx0XHRcdGNvbnN0IGNvbm5lY3Rpb24gPSB7XG5cdFx0XHRcdGlkOiBkYXRhLnJlcUlkID8/IFVVSUR2NCgpLFxuXHRcdFx0XHRjaGFubmVsOiBkYXRhLmNoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogZGF0YS5zZW5kZXIgPz8gXCJ1bmtub3duXCIsXG5cdFx0XHRcdHR5cGU6IFwiY2hhbm5lbFwiLFxuXHRcdFx0XHRwb3J0OiBkYXRhLm1lc3NhZ2VQb3J0LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KCksXG5cdFx0XHRcdG9wdGlvbnM6IGRhdGEub3B0aW9uc1xuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2luY29taW5nQ29ubmVjdGlvbnMubmV4dChjb25uZWN0aW9uKTtcblx0XHRcdGlmICh0aGlzLl9jb25maWcuYXV0b0FjY2VwdENoYW5uZWxzKSB0aGlzLmFjY2VwdENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG5cdFx0fVxuXHRcdF9oYW5kbGVDb25uZWN0Q2hhbm5lbChkYXRhKSB7XG5cdFx0XHRjb25zdCBjb25uZWN0aW9uID0ge1xuXHRcdFx0XHRpZDogZGF0YS5yZXFJZCA/PyBVVUlEdjQoKSxcblx0XHRcdFx0Y2hhbm5lbDogZGF0YS5jaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IGRhdGEuc2VuZGVyID8/IFwidW5rbm93blwiLFxuXHRcdFx0XHR0eXBlOiBkYXRhLnBvcnRUeXBlID8/IFwiY2hhbm5lbFwiLFxuXHRcdFx0XHRwb3J0OiBkYXRhLnBvcnQsXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcblx0XHRcdFx0b3B0aW9uczogZGF0YS5vcHRpb25zXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5faW5jb21pbmdDb25uZWN0aW9ucy5uZXh0KGNvbm5lY3Rpb24pO1xuXHRcdFx0aWYgKHRoaXMuX2NvbmZpZy5hdXRvQWNjZXB0Q2hhbm5lbHMgJiYgdGhpcy5fY2FuQWNjZXB0Q2hhbm5lbChkYXRhLmNoYW5uZWwpKSB7XG5cdFx0XHRcdGNvbnN0IGVuZHBvaW50ID0gdGhpcy5fY29udGV4dC5nZXRPckNyZWF0ZUNoYW5uZWwoZGF0YS5jaGFubmVsLCBkYXRhLm9wdGlvbnMpO1xuXHRcdFx0XHRpZiAoZGF0YS5wb3J0KSB7XG5cdFx0XHRcdFx0ZGF0YS5wb3J0LnN0YXJ0Py4oKTtcblx0XHRcdFx0XHRlbmRwb2ludC5oYW5kbGVyLmNyZWF0ZVJlbW90ZUNoYW5uZWwoZGF0YS5zZW5kZXIsIGRhdGEub3B0aW9ucywgZGF0YS5wb3J0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwb3N0TWVzc2FnZSh7XG5cdFx0XHRcdFx0dHlwZTogXCJjaGFubmVsQ29ubmVjdGVkXCIsXG5cdFx0XHRcdFx0Y2hhbm5lbDogZGF0YS5jaGFubmVsLFxuXHRcdFx0XHRcdHJlcUlkOiBkYXRhLnJlcUlkXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRfaGFuZGxlQWRkUG9ydChkYXRhKSB7XG5cdFx0XHRpZiAoIWRhdGEucG9ydCB8fCAhZGF0YS5jaGFubmVsKSByZXR1cm47XG5cdFx0XHRjb25zdCBjb25uZWN0aW9uID0ge1xuXHRcdFx0XHRpZDogZGF0YS5yZXFJZCA/PyBVVUlEdjQoKSxcblx0XHRcdFx0Y2hhbm5lbDogZGF0YS5jaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IGRhdGEuc2VuZGVyID8/IFwidW5rbm93blwiLFxuXHRcdFx0XHR0eXBlOiBcInBvcnRcIixcblx0XHRcdFx0cG9ydDogZGF0YS5wb3J0LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KCksXG5cdFx0XHRcdG9wdGlvbnM6IGRhdGEub3B0aW9uc1xuXHRcdFx0fTtcblx0XHRcdHRoaXMuX2luY29taW5nQ29ubmVjdGlvbnMubmV4dChjb25uZWN0aW9uKTtcblx0XHRcdGlmICh0aGlzLl9jb25maWcuYXV0b0FjY2VwdENoYW5uZWxzKSB0aGlzLmFjY2VwdENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG5cdFx0fVxuXHRcdF9oYW5kbGVMaXN0Q2hhbm5lbHMoZGF0YSkge1xuXHRcdFx0cG9zdE1lc3NhZ2Uoe1xuXHRcdFx0XHR0eXBlOiBcImNoYW5uZWxMaXN0XCIsXG5cdFx0XHRcdGNoYW5uZWxzOiB0aGlzLmdldENoYW5uZWxOYW1lcygpLFxuXHRcdFx0XHRyZXFJZDogZGF0YS5yZXFJZFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdF9oYW5kbGVDbG9zZUNoYW5uZWwoZGF0YSkge1xuXHRcdFx0aWYgKGRhdGEuY2hhbm5lbCkge1xuXHRcdFx0XHR0aGlzLmNsb3NlQ2hhbm5lbChkYXRhLmNoYW5uZWwpO1xuXHRcdFx0XHRwb3N0TWVzc2FnZSh7XG5cdFx0XHRcdFx0dHlwZTogXCJjaGFubmVsQ2xvc2VkXCIsXG5cdFx0XHRcdFx0Y2hhbm5lbDogZGF0YS5jaGFubmVsLFxuXHRcdFx0XHRcdHJlcUlkOiBkYXRhLnJlcUlkXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRfY2FuQWNjZXB0Q2hhbm5lbChjaGFubmVsKSB7XG5cdFx0XHRpZiAodGhpcy5fY29udGV4dC5zaXplID49IHRoaXMuX2NvbmZpZy5tYXhDaGFubmVscykgcmV0dXJuIGZhbHNlO1xuXHRcdFx0aWYgKHRoaXMuX2NvbmZpZy5hbGxvd2VkQ2hhbm5lbHMubGVuZ3RoID4gMCkgcmV0dXJuIHRoaXMuX2NvbmZpZy5hbGxvd2VkQ2hhbm5lbHMuaW5jbHVkZXMoY2hhbm5lbCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0X3Bvc3RDaGFubmVsQ3JlYXRlZChjaGFubmVsLCBzZW5kZXIsIHJlcUlkKSB7XG5cdFx0XHRwb3N0TWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwiY2hhbm5lbENyZWF0ZWRcIixcblx0XHRcdFx0Y2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyLFxuXHRcdFx0XHRyZXFJZCxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG5cdFx0XHR0aGlzLl9zdWJzY3JpcHRpb25zID0gW107XG5cdFx0XHR0aGlzLl9pbmNvbWluZ0Nvbm5lY3Rpb25zLmNvbXBsZXRlKCk7XG5cdFx0XHR0aGlzLl9jaGFubmVsQ3JlYXRlZC5jb21wbGV0ZSgpO1xuXHRcdFx0dGhpcy5fY2hhbm5lbENsb3NlZC5jb21wbGV0ZSgpO1xuXHRcdFx0dGhpcy5fY29udGV4dC5jbG9zZSgpO1xuXHRcdH1cblx0fTtcblx0bGV0IFdPUktFUl9DT05URVhUID0gbnVsbDtcblx0LyoqXG5cdCogR2V0IG9yIGNyZWF0ZSB0aGUgd29ya2VyIGNvbnRleHQgc2luZ2xldG9uXG5cdCovXG5cdGZ1bmN0aW9uIGdldFdvcmtlckNvbnRleHQoY29uZmlnKSB7XG5cdFx0aWYgKCFXT1JLRVJfQ09OVEVYVCkgV09SS0VSX0NPTlRFWFQgPSBuZXcgV29ya2VyQ29udGV4dChjb25maWcpO1xuXHRcdHJldHVybiBXT1JLRVJfQ09OVEVYVDtcblx0fVxuXHRjb25zdCBjdHggPSBnZXRXb3JrZXJDb250ZXh0KHsgbmFtZTogXCJ3b3JrZXJcIiB9KTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vdW5pZm9ybS50cy9zcmMvbmV3ZXIvbmV4dC90cmFuc3BvcnQvUG9ydFRyYW5zcG9ydC50c1xuLyoqXG5cdCogTWVzc2FnZVBvcnQvTWVzc2FnZUNoYW5uZWwgRW5oYW5jZWQgVHJhbnNwb3J0XG5cdCpcblx0KiBBZHZhbmNlZCBwb3J0LWJhc2VkIGNvbW11bmljYXRpb24gd2l0aDpcblx0KiAtIE1lc3NhZ2VDaGFubmVsIHBhaXIgY3JlYXRpb25cblx0KiAtIFBvcnQgcG9vbGluZyBhbmQgbWFuYWdlbWVudFxuXHQqIC0gQ3Jvc3MtY29udGV4dCB0cmFuc2ZlciAoaWZyYW1lLCB3b3JrZXIsIHdpbmRvdylcblx0KiAtIEF1dG9tYXRpYyByZWNvbm5lY3Rpb25cblx0KiAtIFJlcXVlc3QvcmVzcG9uc2Ugd2l0aCB0aW1lb3V0XG5cdCovXG5cdHZhciBQb3J0VHJhbnNwb3J0ID0gY2xhc3Mge1xuXHRcdF9jaGFubmVsTmFtZTtcblx0XHRfY29uZmlnO1xuXHRcdF9wb3J0O1xuXHRcdF9zdWJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRfcGVuZGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0X2xpc3RlbmluZyA9IGZhbHNlO1xuXHRcdF9jbGVhbnVwID0gbnVsbDtcblx0XHRfcG9ydElkID0gVVVJRHY0KCk7XG5cdFx0X3N0YXRlID0gbmV3IENoYW5uZWxTdWJqZWN0KCk7XG5cdFx0X2tlZXBBbGl2ZVRpbWVyID0gbnVsbDtcblx0XHRjb25zdHJ1Y3Rvcihwb3J0LCBfY2hhbm5lbE5hbWUsIF9jb25maWcgPSB7fSkge1xuXHRcdFx0dGhpcy5fY2hhbm5lbE5hbWUgPSBfY2hhbm5lbE5hbWU7XG5cdFx0XHR0aGlzLl9jb25maWcgPSBfY29uZmlnO1xuXHRcdFx0dGhpcy5fcG9ydCA9IHBvcnQ7XG5cdFx0XHR0aGlzLl9zZXR1cFBvcnQoKTtcblx0XHRcdGlmIChfY29uZmlnLmF1dG9TdGFydCAhPT0gZmFsc2UpIHRoaXMuc3RhcnQoKTtcblx0XHR9XG5cdFx0X3NldHVwUG9ydCgpIHtcblx0XHRcdGNvbnN0IG1zZ0hhbmRsZXIgPSAoZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBkYXRhID0gZS5kYXRhO1xuXHRcdFx0XHRpZiAoZGF0YS50eXBlID09PSBcInJlc3BvbnNlXCIgJiYgZGF0YS5yZXFJZCkge1xuXHRcdFx0XHRcdGNvbnN0IHAgPSB0aGlzLl9wZW5kaW5nLmdldChkYXRhLnJlcUlkKTtcblx0XHRcdFx0XHRpZiAocCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fcGVuZGluZy5kZWxldGUoZGF0YS5yZXFJZCk7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5wYXlsb2FkPy5lcnJvcikgcC5yZWplY3QobmV3IEVycm9yKGRhdGEucGF5bG9hZC5lcnJvcikpO1xuXHRcdFx0XHRcdFx0ZWxzZSBwLnJlc29sdmUoZGF0YS5wYXlsb2FkPy5yZXN1bHQgPz8gZGF0YS5wYXlsb2FkKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGRhdGEudHlwZSA9PT0gXCJzaWduYWxcIiAmJiBkYXRhLnBheWxvYWQ/LmFjdGlvbiA9PT0gXCJwaW5nXCIpIHtcblx0XHRcdFx0XHR0aGlzLnNlbmQoe1xuXHRcdFx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHRcdFx0Y2hhbm5lbDogdGhpcy5fY2hhbm5lbE5hbWUsXG5cdFx0XHRcdFx0XHRzZW5kZXI6IHRoaXMuX3BvcnRJZCxcblx0XHRcdFx0XHRcdHR5cGU6IFwic2lnbmFsXCIsXG5cdFx0XHRcdFx0XHRwYXlsb2FkOiB7IGFjdGlvbjogXCJwb25nXCIgfVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhLnBvcnRJZCA9IGRhdGEucG9ydElkID8/IHRoaXMuX3BvcnRJZDtcblx0XHRcdFx0Zm9yIChjb25zdCBzIG9mIHRoaXMuX3N1YnMpIHRyeSB7XG5cdFx0XHRcdFx0cy5uZXh0Py4oZGF0YSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRzLmVycm9yPy4oZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBlcnJIYW5kbGVyID0gKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5uZXh0KFwiZXJyb3JcIik7XG5cdFx0XHRcdGNvbnN0IGVyciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJQb3J0IGVycm9yXCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3Vicykgcy5lcnJvcj8uKGVycik7XG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5fcG9ydC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBtc2dIYW5kbGVyKTtcblx0XHRcdHRoaXMuX3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCBlcnJIYW5kbGVyKTtcblx0XHRcdHRoaXMuX2NsZWFudXAgPSAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX3BvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgbXNnSGFuZGxlcik7XG5cdFx0XHRcdHRoaXMuX3BvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCBlcnJIYW5kbGVyKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHN0YXJ0KCkge1xuXHRcdFx0aWYgKHRoaXMuX2xpc3RlbmluZykgcmV0dXJuO1xuXHRcdFx0dGhpcy5fcG9ydC5zdGFydCgpO1xuXHRcdFx0dGhpcy5fbGlzdGVuaW5nID0gdHJ1ZTtcblx0XHRcdHRoaXMuX3N0YXRlLm5leHQoXCJyZWFkeVwiKTtcblx0XHRcdGlmICh0aGlzLl9jb25maWcua2VlcEFsaXZlKSB0aGlzLl9zdGFydEtlZXBBbGl2ZSgpO1xuXHRcdH1cblx0XHRzZW5kKG1zZywgdHJhbnNmZXIpIHtcblx0XHRcdGNvbnN0IHsgdHJhbnNmZXJhYmxlLCAuLi5kYXRhIH0gPSBtc2c7XG5cdFx0XHR0aGlzLl9wb3J0LnBvc3RNZXNzYWdlKHtcblx0XHRcdFx0Li4uZGF0YSxcblx0XHRcdFx0cG9ydElkOiB0aGlzLl9wb3J0SWRcblx0XHRcdH0sIHRyYW5zZmVyID8/IFtdKTtcblx0XHR9XG5cdFx0cmVxdWVzdChtc2cpIHtcblx0XHRcdGNvbnN0IHJlcUlkID0gbXNnLnJlcUlkID8/IFVVSUR2NCgpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3BlbmRpbmcuZGVsZXRlKHJlcUlkKTtcblx0XHRcdFx0XHRyZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZW91dFwiKSk7XG5cdFx0XHRcdH0sIHRoaXMuX2NvbmZpZy50aW1lb3V0ID8/IDNlNCk7XG5cdFx0XHRcdHRoaXMuX3BlbmRpbmcuc2V0KHJlcUlkLCB7XG5cdFx0XHRcdFx0cmVzb2x2ZTogKHYpID0+IHtcblx0XHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUodik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZWplY3Q6IChlKSA9PiB7XG5cdFx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMuc2VuZCh7XG5cdFx0XHRcdFx0Li4ubXNnLFxuXHRcdFx0XHRcdHJlcUlkLFxuXHRcdFx0XHRcdHR5cGU6IFwicmVxdWVzdFwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHN1YnNjcmliZShvYnNlcnZlcikge1xuXHRcdFx0Y29uc3Qgb2JzID0gdHlwZW9mIG9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIgPyB7IG5leHQ6IG9ic2VydmVyIH0gOiBvYnNlcnZlcjtcblx0XHRcdHRoaXMuX3N1YnMuYWRkKG9icyk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjbG9zZWQ6IGZhbHNlLFxuXHRcdFx0XHR1bnN1YnNjcmliZTogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3N1YnMuZGVsZXRlKG9icyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdF9zdGFydEtlZXBBbGl2ZSgpIHtcblx0XHRcdHRoaXMuX2tlZXBBbGl2ZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnNlbmQoe1xuXHRcdFx0XHRcdGlkOiBVVUlEdjQoKSxcblx0XHRcdFx0XHRjaGFubmVsOiB0aGlzLl9jaGFubmVsTmFtZSxcblx0XHRcdFx0XHRzZW5kZXI6IHRoaXMuX3BvcnRJZCxcblx0XHRcdFx0XHR0eXBlOiBcInNpZ25hbFwiLFxuXHRcdFx0XHRcdHBheWxvYWQ6IHsgYWN0aW9uOiBcInBpbmdcIiB9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSwgdGhpcy5fY29uZmlnLmtlZXBBbGl2ZUludGVydmFsID8/IDNlNCk7XG5cdFx0fVxuXHRcdGNsb3NlKCkge1xuXHRcdFx0aWYgKHRoaXMuX2tlZXBBbGl2ZVRpbWVyKSB7XG5cdFx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy5fa2VlcEFsaXZlVGltZXIpO1xuXHRcdFx0XHR0aGlzLl9rZWVwQWxpdmVUaW1lciA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9jbGVhbnVwPy4oKTtcblx0XHRcdHRoaXMuX3N1YnMuZm9yRWFjaCgocykgPT4gcy5jb21wbGV0ZT8uKCkpO1xuXHRcdFx0dGhpcy5fc3Vicy5jbGVhcigpO1xuXHRcdFx0dGhpcy5fcG9ydC5jbG9zZSgpO1xuXHRcdFx0dGhpcy5fc3RhdGUubmV4dChcImNsb3NlZFwiKTtcblx0XHR9XG5cdFx0Z2V0IHBvcnQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcG9ydDtcblx0XHR9XG5cdFx0Z2V0IHBvcnRJZCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9wb3J0SWQ7XG5cdFx0fVxuXHRcdGdldCBpc0xpc3RlbmluZygpIHtcblx0XHRcdHJldHVybiB0aGlzLl9saXN0ZW5pbmc7XG5cdFx0fVxuXHRcdGdldCBzdGF0ZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9zdGF0ZTtcblx0XHR9XG5cdFx0Z2V0IGNoYW5uZWxOYW1lKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxOYW1lO1xuXHRcdH1cblx0fTtcblx0LyoqXG5cdCogQ3JlYXRlIGEgTWVzc2FnZUNoYW5uZWwgcGFpciB3aXRoIGNvbmZpZ3VyZWQgbG9jYWwgdHJhbnNwb3J0XG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWxQYWlyKGNoYW5uZWxOYW1lLCBjb25maWcpIHtcblx0XHRjb25zdCBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGxvY2FsOiBuZXcgUG9ydFRyYW5zcG9ydChjaGFubmVsLnBvcnQxLCBjaGFubmVsTmFtZSwgY29uZmlnKSxcblx0XHRcdHJlbW90ZTogY2hhbm5lbC5wb3J0Mixcblx0XHRcdHRyYW5zZmVyOiAoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjaGFubmVsLnBvcnQyO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0dmFyIFBvcnRQb29sID0gY2xhc3Mge1xuXHRcdF9kZWZhdWx0Q29uZmlnO1xuXHRcdF9jaGFubmVscyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0X21haW5Qb3J0ID0gbnVsbDtcblx0XHRfc3VicyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0Y29uc3RydWN0b3IoX2RlZmF1bHRDb25maWcgPSB7fSkge1xuXHRcdFx0dGhpcy5fZGVmYXVsdENvbmZpZyA9IF9kZWZhdWx0Q29uZmlnO1xuXHRcdH1cblx0XHQvKipcblx0XHQqIENyZWF0ZSBuZXcgY2hhbm5lbCBpbiBwb29sXG5cdFx0Ki9cblx0XHRjcmVhdGUoY2hhbm5lbE5hbWUsIGNvbmZpZykge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gY3JlYXRlQ2hhbm5lbFBhaXIoY2hhbm5lbE5hbWUsIHtcblx0XHRcdFx0Li4udGhpcy5fZGVmYXVsdENvbmZpZyxcblx0XHRcdFx0Li4uY29uZmlnXG5cdFx0XHR9KTtcblx0XHRcdHJlc3VsdC5sb2NhbC5zdWJzY3JpYmUoeyBuZXh0OiAobXNnKSA9PiB7XG5cdFx0XHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zdWJzKSB0cnkge1xuXHRcdFx0XHRcdHMubmV4dD8uKG1zZyk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRzLmVycm9yPy4oZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gfSk7XG5cdFx0XHR0aGlzLl9jaGFubmVscy5zZXQoY2hhbm5lbE5hbWUsIHJlc3VsdC5sb2NhbCk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIEFkZCBleGlzdGluZyBwb3J0IHRvIHBvb2xcblx0XHQqL1xuXHRcdGFkZChjaGFubmVsTmFtZSwgcG9ydCwgY29uZmlnKSB7XG5cdFx0XHRjb25zdCB0cmFuc3BvcnQgPSBuZXcgUG9ydFRyYW5zcG9ydChwb3J0LCBjaGFubmVsTmFtZSwge1xuXHRcdFx0XHQuLi50aGlzLl9kZWZhdWx0Q29uZmlnLFxuXHRcdFx0XHQuLi5jb25maWdcblx0XHRcdH0pO1xuXHRcdFx0dHJhbnNwb3J0LnN1YnNjcmliZSh7IG5leHQ6IChtc2cpID0+IHtcblx0XHRcdFx0Zm9yIChjb25zdCBzIG9mIHRoaXMuX3N1YnMpIHRyeSB7XG5cdFx0XHRcdFx0cy5uZXh0Py4obXNnKTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdHMuZXJyb3I/LihlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSB9KTtcblx0XHRcdHRoaXMuX2NoYW5uZWxzLnNldChjaGFubmVsTmFtZSwgdHJhbnNwb3J0KTtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogR2V0IGNoYW5uZWwgYnkgbmFtZVxuXHRcdCovXG5cdFx0Z2V0KGNoYW5uZWxOYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hhbm5lbHMuZ2V0KGNoYW5uZWxOYW1lKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTZW5kIHRvIHNwZWNpZmljIGNoYW5uZWxcblx0XHQqL1xuXHRcdHNlbmQoY2hhbm5lbE5hbWUsIG1zZywgdHJhbnNmZXIpIHtcblx0XHRcdHRoaXMuX2NoYW5uZWxzLmdldChjaGFubmVsTmFtZSk/LnNlbmQobXNnLCB0cmFuc2Zlcik7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogQnJvYWRjYXN0IHRvIGFsbCBjaGFubmVsc1xuXHRcdCovXG5cdFx0YnJvYWRjYXN0KG1zZywgdHJhbnNmZXIpIHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRoaXMuX2NoYW5uZWxzLnZhbHVlcygpKSB0cmFuc3BvcnQuc2VuZChtc2csIHRyYW5zZmVyKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBSZXF1ZXN0IG9uIHNwZWNpZmljIGNoYW5uZWxcblx0XHQqL1xuXHRcdHJlcXVlc3QoY2hhbm5lbE5hbWUsIG1zZykge1xuXHRcdFx0Y29uc3QgY2hhbm5lbCA9IHRoaXMuX2NoYW5uZWxzLmdldChjaGFubmVsTmFtZSk7XG5cdFx0XHRpZiAoIWNoYW5uZWwpIHJldHVybiBQcm9taXNlLnJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKGBDaGFubmVsICR7Y2hhbm5lbE5hbWV9IG5vdCBmb3VuZGApKTtcblx0XHRcdHJldHVybiBjaGFubmVsLnJlcXVlc3QobXNnKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0KiBTdWJzY3JpYmUgdG8gYWxsIGNoYW5uZWxzXG5cdFx0Ki9cblx0XHRzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcblx0XHRcdGNvbnN0IG9icyA9IHR5cGVvZiBvYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBvYnNlcnZlciB9IDogb2JzZXJ2ZXI7XG5cdFx0XHR0aGlzLl9zdWJzLmFkZChvYnMpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y2xvc2VkOiBmYWxzZSxcblx0XHRcdFx0dW5zdWJzY3JpYmU6ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9zdWJzLmRlbGV0ZShvYnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHQvKipcblx0XHQqIFJlbW92ZSBjaGFubmVsXG5cdFx0Ki9cblx0XHRyZW1vdmUoY2hhbm5lbE5hbWUpIHtcblx0XHRcdGNvbnN0IGNoYW5uZWwgPSB0aGlzLl9jaGFubmVscy5nZXQoY2hhbm5lbE5hbWUpO1xuXHRcdFx0aWYgKGNoYW5uZWwpIHtcblx0XHRcdFx0Y2hhbm5lbC5jbG9zZSgpO1xuXHRcdFx0XHR0aGlzLl9jaGFubmVscy5kZWxldGUoY2hhbm5lbE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQqIENsb3NlIGFsbCBjaGFubmVsc1xuXHRcdCovXG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9zdWJzLmZvckVhY2goKHMpID0+IHMuY29tcGxldGU/LigpKTtcblx0XHRcdHRoaXMuX3N1YnMuY2xlYXIoKTtcblx0XHRcdGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLl9jaGFubmVscy52YWx1ZXMoKSkgY2hhbm5lbC5jbG9zZSgpO1xuXHRcdFx0dGhpcy5fY2hhbm5lbHMuY2xlYXIoKTtcblx0XHR9XG5cdFx0Z2V0IGNoYW5uZWxOYW1lcygpIHtcblx0XHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2NoYW5uZWxzLmtleXMoKSk7XG5cdFx0fVxuXHRcdGdldCBzaXplKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxzLnNpemU7XG5cdFx0fVxuXHR9O1xuXHQvKipcblx0KiBDb25uZWN0IHRvIHdpbmRvdy9pZnJhbWUgdmlhIE1lc3NhZ2VDaGFubmVsXG5cdCovXG5cdHZhciBXaW5kb3dQb3J0Q29ubmVjdG9yID0gY2xhc3Mge1xuXHRcdF90YXJnZXQ7XG5cdFx0X2NoYW5uZWxOYW1lO1xuXHRcdF9jb25maWc7XG5cdFx0X3RyYW5zcG9ydCA9IG51bGw7XG5cdFx0X3N0YXRlID0gbmV3IENoYW5uZWxTdWJqZWN0KCk7XG5cdFx0X2hhbmRzaGFrZUNvbXBsZXRlID0gZmFsc2U7XG5cdFx0Y29uc3RydWN0b3IoX3RhcmdldCwgX2NoYW5uZWxOYW1lLCBfY29uZmlnID0ge30pIHtcblx0XHRcdHRoaXMuX3RhcmdldCA9IF90YXJnZXQ7XG5cdFx0XHR0aGlzLl9jaGFubmVsTmFtZSA9IF9jaGFubmVsTmFtZTtcblx0XHRcdHRoaXMuX2NvbmZpZyA9IF9jb25maWc7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogSW5pdGlhdGUgY29ubmVjdGlvbiB0byB0YXJnZXQgd2luZG93XG5cdFx0Ki9cblx0XHRhc3luYyBjb25uZWN0KCkge1xuXHRcdFx0aWYgKHRoaXMuX3RyYW5zcG9ydCAmJiB0aGlzLl9oYW5kc2hha2VDb21wbGV0ZSkgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydDtcblx0XHRcdHRoaXMuX3N0YXRlLm5leHQoXCJjb25uZWN0aW5nXCIpO1xuXHRcdFx0Y29uc3QgeyBsb2NhbCwgcmVtb3RlIH0gPSBjcmVhdGVDaGFubmVsUGFpcih0aGlzLl9jaGFubmVsTmFtZSwgdGhpcy5fY29uZmlnKTtcblx0XHRcdHRoaXMuX3RhcmdldC5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwicG9ydC1jb25uZWN0XCIsXG5cdFx0XHRcdGNoYW5uZWxOYW1lOiB0aGlzLl9jaGFubmVsTmFtZSxcblx0XHRcdFx0cG9ydElkOiBsb2NhbC5wb3J0SWRcblx0XHRcdH0sIHRoaXMuX2NvbmZpZy50YXJnZXRPcmlnaW4gPz8gXCIqXCIsIFtyZW1vdGVdKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRyZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkhhbmRzaGFrZSB0aW1lb3V0XCIpKTtcblx0XHRcdFx0XHR0aGlzLl9zdGF0ZS5uZXh0KFwiZXJyb3JcIik7XG5cdFx0XHRcdH0sIHRoaXMuX2NvbmZpZy5oYW5kc2hha2VUaW1lb3V0ID8/IDFlNCk7XG5cdFx0XHRcdGNvbnN0IHN1YiA9IGxvY2FsLnN1YnNjcmliZSh7IG5leHQ6IChtc2cpID0+IHtcblx0XHRcdFx0XHRpZiAobXNnLnR5cGUgPT09IFwic2lnbmFsXCIgJiYgbXNnLnBheWxvYWQ/LmFjdGlvbiA9PT0gXCJoYW5kc2hha2UtYWNrXCIpIHtcblx0XHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRcdFx0XHRcdHRoaXMuX2hhbmRzaGFrZUNvbXBsZXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuX3RyYW5zcG9ydCA9IGxvY2FsO1xuXHRcdFx0XHRcdFx0dGhpcy5fc3RhdGUubmV4dChcImNvbm5lY3RlZFwiKTtcblx0XHRcdFx0XHRcdHN1Yi51bnN1YnNjcmliZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShsb2NhbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCogTGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyAodGFyZ2V0IHNpZGUpXG5cdFx0Ki9cblx0XHRzdGF0aWMgbGlzdGVuKGNoYW5uZWxOYW1lLCBoYW5kbGVyLCBjb25maWcpIHtcblx0XHRcdGNvbnN0IG1zZ0hhbmRsZXIgPSAoZSkgPT4ge1xuXHRcdFx0XHRpZiAoZS5kYXRhPy50eXBlICE9PSBcInBvcnQtY29ubmVjdFwiIHx8IGUuZGF0YT8uY2hhbm5lbE5hbWUgIT09IGNoYW5uZWxOYW1lKSByZXR1cm47XG5cdFx0XHRcdGlmICghZS5wb3J0c1swXSkgcmV0dXJuO1xuXHRcdFx0XHRjb25zdCB0cmFuc3BvcnQgPSBuZXcgUG9ydFRyYW5zcG9ydChlLnBvcnRzWzBdLCBjaGFubmVsTmFtZSwgY29uZmlnKTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoe1xuXHRcdFx0XHRcdGlkOiBVVUlEdjQoKSxcblx0XHRcdFx0XHRjaGFubmVsOiBjaGFubmVsTmFtZSxcblx0XHRcdFx0XHRzZW5kZXI6IHRyYW5zcG9ydC5wb3J0SWQsXG5cdFx0XHRcdFx0dHlwZTogXCJzaWduYWxcIixcblx0XHRcdFx0XHRwYXlsb2FkOiB7IGFjdGlvbjogXCJoYW5kc2hha2UtYWNrXCIgfVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aGFuZGxlcih0cmFuc3BvcnQpO1xuXHRcdFx0fTtcblx0XHRcdGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgbXNnSGFuZGxlcik7XG5cdFx0XHRyZXR1cm4gKCkgPT4gZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBtc2dIYW5kbGVyKTtcblx0XHR9XG5cdFx0ZGlzY29ubmVjdCgpIHtcblx0XHRcdHRoaXMuX3RyYW5zcG9ydD8uY2xvc2UoKTtcblx0XHRcdHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG5cdFx0XHR0aGlzLl9oYW5kc2hha2VDb21wbGV0ZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fc3RhdGUubmV4dChcImRpc2Nvbm5lY3RlZFwiKTtcblx0XHR9XG5cdFx0Z2V0IGlzQ29ubmVjdGVkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRzaGFrZUNvbXBsZXRlO1xuXHRcdH1cblx0XHRnZXQgc3RhdGUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fc3RhdGU7XG5cdFx0fVxuXHRcdGdldCB0cmFuc3BvcnQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdHJhbnNwb3J0O1xuXHRcdH1cblx0fTtcblx0LyoqXG5cdCogQ3JlYXRlIHByb3h5IGZvciByZW1vdGUgb2JqZWN0IG92ZXIgUG9ydFRyYW5zcG9ydFxuXHQqXG5cdCogVXNlcyB1bmlmaWVkIFByb3h5IG1vZHVsZSBmb3IgY29uc2lzdGVudCBiZWhhdmlvci5cblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlUG9ydFByb3h5KHRyYW5zcG9ydCwgdGFyZ2V0UGF0aCA9IFtdKSB7XG5cdFx0cmV0dXJuIGNyZWF0ZVNlbmRlclByb3h5KHtcblx0XHRcdHJlcXVlc3Q6IChtc2cpID0+IHRyYW5zcG9ydC5yZXF1ZXN0KG1zZyksXG5cdFx0XHRjaGFubmVsTmFtZTogdHJhbnNwb3J0LmNoYW5uZWxOYW1lLFxuXHRcdFx0c2VuZGVySWQ6IHRyYW5zcG9ydC5wb3J0SWRcblx0XHR9LCB0YXJnZXRQYXRoKTtcblx0fVxuXHQvKipcblx0KiBFeHBvc2Ugb2JqZWN0IG1ldGhvZHMgb3ZlciBQb3J0VHJhbnNwb3J0XG5cdCpcblx0KiBVc2VzIHVuaWZpZWQgUHJveHkgbW9kdWxlJ3MgZXhwb3NlIGhhbmRsZXIuXG5cdCovXG5cdGZ1bmN0aW9uIGV4cG9zZU92ZXJQb3J0KHRyYW5zcG9ydCwgdGFyZ2V0KSB7XG5cdFx0Y29uc3QgaGFuZGxlciA9IGNyZWF0ZUV4cG9zZUhhbmRsZXIodGFyZ2V0KTtcblx0XHRyZXR1cm4gdHJhbnNwb3J0LnN1YnNjcmliZSh7IG5leHQ6IGFzeW5jIChtc2cpID0+IHtcblx0XHRcdGlmIChtc2cudHlwZSAhPT0gXCJyZXF1ZXN0XCIgfHwgIW1zZy5wYXlsb2FkPy5wYXRoKSByZXR1cm47XG5cdFx0XHRjb25zdCB7IGFjdGlvbiwgcGF0aCwgYXJncyB9ID0gbXNnLnBheWxvYWQ7XG5cdFx0XHRsZXQgcmVzdWx0O1xuXHRcdFx0bGV0IGVycm9yO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgaGFuZGxlcihhY3Rpb24sIHBhdGgsIGFyZ3MgPz8gW10pO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRlcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcblx0XHRcdH1cblx0XHRcdHRyYW5zcG9ydC5zZW5kKHtcblx0XHRcdFx0aWQ6IFVVSUR2NCgpLFxuXHRcdFx0XHRjaGFubmVsOiBtc2cuc2VuZGVyLFxuXHRcdFx0XHRzZW5kZXI6IHRyYW5zcG9ydC5wb3J0SWQsXG5cdFx0XHRcdHR5cGU6IFwicmVzcG9uc2VcIixcblx0XHRcdFx0cmVxSWQ6IG1zZy5yZXFJZCxcblx0XHRcdFx0cGF5bG9hZDogZXJyb3IgPyB7IGVycm9yIH0gOiB7IHJlc3VsdCB9XG5cdFx0XHR9KTtcblx0XHR9IH0pO1xuXHR9XG5cdGNvbnN0IFBvcnRUcmFuc3BvcnRGYWN0b3J5ID0ge1xuXHRcdGNyZWF0ZTogKHBvcnQsIG5hbWUsIGNvbmZpZykgPT4gbmV3IFBvcnRUcmFuc3BvcnQocG9ydCwgbmFtZSwgY29uZmlnKSxcblx0XHRjcmVhdGVQYWlyOiAobmFtZSwgY29uZmlnKSA9PiBjcmVhdGVDaGFubmVsUGFpcihuYW1lLCBjb25maWcpLFxuXHRcdGNyZWF0ZVBvb2w6IChjb25maWcpID0+IG5ldyBQb3J0UG9vbChjb25maWcpLFxuXHRcdGNyZWF0ZVdpbmRvd0Nvbm5lY3RvcjogKHRhcmdldCwgbmFtZSwgY29uZmlnKSA9PiBuZXcgV2luZG93UG9ydENvbm5lY3Rvcih0YXJnZXQsIG5hbWUsIGNvbmZpZyksXG5cdFx0bGlzdGVuOiBXaW5kb3dQb3J0Q29ubmVjdG9yLmxpc3Rlbixcblx0XHRjcmVhdGVQcm94eTogY3JlYXRlUG9ydFByb3h5LFxuXHRcdGV4cG9zZTogZXhwb3NlT3ZlclBvcnRcblx0fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vdW5pZm9ybS50cy9zcmMvbmV3ZXIvbmV4dC9zdG9yYWdlL1F1ZXVlZC50c1xuLyoqXG5cdCogU2ltcGxpZmllZCB3b3JrZXIgcmVnaXN0cmF0aW9uIGZvciBjb21tb24gcGF0dGVybnNcblx0Ki9cblx0Y29uc3QgcmVnaXN0ZXJXb3JrZXJBUEkgPSAoYXBpLCBjaGFubmVsTmFtZSA9IFwid29ya2VyXCIpID0+IHtcblx0XHRjb25zdCBjaGFubmVsSGFuZGxlciA9IGluaXRDaGFubmVsSGFuZGxlcihjaGFubmVsTmFtZSA/PyBcIndvcmtlclwiKTtcblx0XHRPYmplY3Qua2V5cyhhcGkpLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgYXBpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHt9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNoYW5uZWxIYW5kbGVyO1xuXHR9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvdXRpbHMvb3Bmcy9PUEZTLndvcmtlci50c1xuXHR2YXIgT1BGU193b3JrZXJfZXhwb3J0cyA9IC8qIEBfX1BVUkVfXyAqLyBfX2V4cG9ydEFsbCh7XG5cdFx0Z2V0RGlySGFuZGxlOiAoKSA9PiBnZXREaXJIYW5kbGUsXG5cdFx0Z2V0RmlsZVN5c3RlbVJvb3Q6ICgpID0+IGdldEZpbGVTeXN0ZW1Sb290LFxuXHRcdGhhbmRsZXJzOiAoKSA9PiBoYW5kbGVycyxcblx0XHRub3JtYWxpemVQYXRoOiAoKSA9PiBub3JtYWxpemVQYXRoLFxuXHRcdHJlc29sdmVGaWxlU3lzdGVtSGFuZGxlOiAoKSA9PiByZXNvbHZlRmlsZVN5c3RlbUhhbmRsZVxuXHR9KTtcblx0dmFyIG1hcHBlZFJvb3RzLCBhY3RpdmVPYnNlcnZlcnMsIGdldEZpbGVTeXN0ZW1Sb290LCBub3JtYWxpemVQYXRoLCByZXNvbHZlRmlsZVN5c3RlbUhhbmRsZSwgZ2V0RGlySGFuZGxlLCBoYW5kbGVycywgU1dfQlJJREdFX0NIQU5ORUxfTkFNRSwgc3dCcmlkZ2VDaGFubmVsO1xuXHR2YXIgaW5pdF9PUEZTX3dvcmtlciA9IF9fZXNtTWluKCgoKSA9PiB7XG5cdFx0bWFwcGVkUm9vdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdGFjdGl2ZU9ic2VydmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0Z2V0RmlsZVN5c3RlbVJvb3QgPSBhc3luYyAoaWQgPSBcIlwiKSA9PiB7XG5cdFx0XHRpZiAoaWQgJiYgbWFwcGVkUm9vdHMuaGFzKGlkKSkgcmV0dXJuIG1hcHBlZFJvb3RzLmdldChpZCk7XG5cdFx0XHRyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLnN0b3JhZ2UuZ2V0RGlyZWN0b3J5KCk7XG5cdFx0fTtcblx0XHRub3JtYWxpemVQYXRoID0gKHBhdGgpID0+IHtcblx0XHRcdHJldHVybiBwYXRoPy50cmltPy4oKT8ucmVwbGFjZSgvXFwvKy9nLCBcIi9cIikgfHwgXCIvXCI7XG5cdFx0fTtcblx0XHRyZXNvbHZlRmlsZVN5c3RlbUhhbmRsZSA9IGFzeW5jIChyb290LCBwYXRoLCBjcmVhdGUgPSBmYWxzZSkgPT4ge1xuXHRcdFx0Y29uc3QgcGFydHMgPSBub3JtYWxpemVQYXRoKHBhdGgpLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHApID0+IHAgJiYgcCAhPT0gXCIuXCIpO1xuXHRcdFx0bGV0IGN1cnJlbnQgPSByb290O1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBwYXJ0ID0gcGFydHNbaV07XG5cdFx0XHRcdGlmIChpID09PSBwYXJ0cy5sZW5ndGggLSAxKSB0cnkge1xuXHRcdFx0XHRcdHJldHVybiBhd2FpdCBjdXJyZW50LmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZSB9KTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHJldHVybiBhd2FpdCBjdXJyZW50LmdldEZpbGVIYW5kbGUocGFydCwgeyBjcmVhdGUgfSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0aWYgKGNyZWF0ZSkgdGhyb3cgZTtcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGN1cnJlbnQgPSBhd2FpdCBjdXJyZW50LmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZSB9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50O1xuXHRcdH07XG5cdFx0Z2V0RGlySGFuZGxlID0gYXN5bmMgKHJvb3QsIHBhdGgsIGNyZWF0ZSkgPT4ge1xuXHRcdFx0Y29uc3QgcGFydHMgPSBub3JtYWxpemVQYXRoKHBhdGgpLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHApID0+IHApO1xuXHRcdFx0bGV0IGN1cnJlbnQgPSByb290O1xuXHRcdFx0Zm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSBjdXJyZW50ID0gYXdhaXQgY3VycmVudC5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGUgfSk7XG5cdFx0XHRyZXR1cm4gY3VycmVudDtcblx0XHR9O1xuXHRcdGhhbmRsZXJzID0ge1xuXHRcdFx0bW91bnQ6IGFzeW5jICh7IGlkLCBoYW5kbGUgfSkgPT4ge1xuXHRcdFx0XHRtYXBwZWRSb290cy5zZXQoaWQsIGhhbmRsZSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHRcdHVubW91bnQ6IGFzeW5jICh7IGlkIH0pID0+IHtcblx0XHRcdFx0bWFwcGVkUm9vdHMuZGVsZXRlKGlkKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXHRcdFx0cmVhZERpcmVjdG9yeTogYXN5bmMgKHsgcm9vdElkLCBwYXRoLCBjcmVhdGUgfSkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHJvb3QgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUm9vdChyb290SWQpO1xuXHRcdFx0XHRcdGNvbnN0IGhhbmRsZSA9IGF3YWl0IGdldERpckhhbmRsZShyb290LCBwYXRoLCBjcmVhdGUpO1xuXHRcdFx0XHRcdGNvbnN0IGVudHJpZXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaGFuZGxlLmVudHJpZXMoKSkgZW50cmllcy5wdXNoKFtuYW1lLCBlbnRyeV0pO1xuXHRcdFx0XHRcdHJldHVybiBlbnRyaWVzO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKFwiV29ya2VyIHJlYWREaXJlY3RvcnkgZXJyb3I6XCIsIGUpO1xuXHRcdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHJlYWRGaWxlOiBhc3luYyAoeyByb290SWQsIHBhdGgsIHR5cGUgfSkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHJvb3QgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUm9vdChyb290SWQpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcnRzID0gbm9ybWFsaXplUGF0aChwYXRoKS5zcGxpdChcIi9cIikuZmlsdGVyKChwKSA9PiBwKTtcblx0XHRcdFx0XHRjb25zdCBmaWxlbmFtZSA9IHBhcnRzLnBvcCgpO1xuXHRcdFx0XHRcdGNvbnN0IGRpclBhdGggPSBwYXJ0cy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgKGF3YWl0IChhd2FpdCBnZXREaXJIYW5kbGUocm9vdCwgZGlyUGF0aCwgZmFsc2UpKS5nZXRGaWxlSGFuZGxlKGZpbGVuYW1lLCB7IGNyZWF0ZTogZmFsc2UgfSkpLmdldEZpbGUoKTtcblx0XHRcdFx0XHRpZiAodHlwZSA9PT0gXCJ0ZXh0XCIpIHJldHVybiBhd2FpdCBmaWxlLnRleHQoKTtcblx0XHRcdFx0XHRpZiAodHlwZSA9PT0gXCJhcnJheUJ1ZmZlclwiKSByZXR1cm4gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuXHRcdFx0XHRcdGlmICh0eXBlID09PSBcImJsb2JcIikgcmV0dXJuIGZpbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGZpbGU7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oXCJXb3JrZXIgcmVhZEZpbGUgZXJyb3I6XCIsIGUpO1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0d3JpdGVGaWxlOiBhc3luYyAoeyByb290SWQsIHBhdGgsIGRhdGEgfSkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHJvb3QgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUm9vdChyb290SWQpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcnRzID0gbm9ybWFsaXplUGF0aChwYXRoKS5zcGxpdChcIi9cIikuZmlsdGVyKChwKSA9PiBwKTtcblx0XHRcdFx0XHRjb25zdCBmaWxlbmFtZSA9IHBhcnRzLnBvcCgpO1xuXHRcdFx0XHRcdGNvbnN0IGRpclBhdGggPSBwYXJ0cy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCB3cml0YWJsZSA9IGF3YWl0IChhd2FpdCAoYXdhaXQgZ2V0RGlySGFuZGxlKHJvb3QsIGRpclBhdGgsIHRydWUpKS5nZXRGaWxlSGFuZGxlKGZpbGVuYW1lLCB7IGNyZWF0ZTogdHJ1ZSB9KSkuY3JlYXRlV3JpdGFibGUoKTtcblx0XHRcdFx0XHRhd2FpdCB3cml0YWJsZS53cml0ZShkYXRhKTtcblx0XHRcdFx0XHRhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKFwiV29ya2VyIHdyaXRlRmlsZSBlcnJvcjpcIiwgZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cmVtb3ZlOiBhc3luYyAoeyByb290SWQsIHBhdGgsIHJlY3Vyc2l2ZSB9KSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9vdCA9IGF3YWl0IGdldEZpbGVTeXN0ZW1Sb290KHJvb3RJZCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFydHMgPSBub3JtYWxpemVQYXRoKHBhdGgpLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHApID0+IHApO1xuXHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBwYXJ0cy5wb3AoKTtcblx0XHRcdFx0XHRjb25zdCBkaXJQYXRoID0gcGFydHMuam9pbihcIi9cIik7XG5cdFx0XHRcdFx0YXdhaXQgKGF3YWl0IGdldERpckhhbmRsZShyb290LCBkaXJQYXRoLCBmYWxzZSkpLnJlbW92ZUVudHJ5KG5hbWUsIHsgcmVjdXJzaXZlIH0pO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0b2JzZXJ2ZTogYXN5bmMgKHsgcm9vdElkLCBwYXRoLCBpZCB9KSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aWYgKGFjdGl2ZU9ic2VydmVycy5oYXMoaWQpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRjb25zdCByb290ID0gYXdhaXQgZ2V0RmlsZVN5c3RlbVJvb3Qocm9vdElkKTtcblx0XHRcdFx0XHRjb25zdCBoYW5kbGUgPSBhd2FpdCBnZXREaXJIYW5kbGUocm9vdCwgcGF0aCwgZmFsc2UpO1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgRmlsZVN5c3RlbU9ic2VydmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBGaWxlU3lzdGVtT2JzZXJ2ZXIoKHJlY29yZHMpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhbmdlcyA9IHJlY29yZHMubWFwKChyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmFtZSA9IHIuY2hhbmdlZEhhbmRsZT8ubmFtZSB8fCByLnJlbGF0aXZlUGF0aENvbXBvbmVudHM/LmF0KC0xKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogci50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdGtpbmQ6IHIuY2hhbmdlZEhhbmRsZT8ua2luZCB8fCAobmFtZT8uaW5jbHVkZXMoXCIuXCIpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdGhhbmRsZTogci5jaGFuZ2VkSGFuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0aDogci5yZWxhdGl2ZVBhdGhDb21wb25lbnRzLmpvaW4oXCIvXCIpXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHNlbGYucG9zdE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwib2JzZXJ2YXRpb25cIixcblx0XHRcdFx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvYnNlcnZlci5vYnNlcnZlKGhhbmRsZSk7XG5cdFx0XHRcdFx0XHRhY3RpdmVPYnNlcnZlcnMuc2V0KGlkLCBvYnNlcnZlcik7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0dW5vYnNlcnZlOiBhc3luYyAoeyBpZCB9KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9ic2VydmVyID0gYWN0aXZlT2JzZXJ2ZXJzLmdldChpZCk7XG5cdFx0XHRcdGlmIChvYnNlcnZlcikge1xuXHRcdFx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0XHRhY3RpdmVPYnNlcnZlcnMuZGVsZXRlKGlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cdFx0XHRjb3B5OiBhc3luYyAoeyBmcm9tLCB0byB9KSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgY29weVJlY3Vyc2l2ZSA9IGFzeW5jIChzb3VyY2UsIGRlc3QpID0+IHtcblx0XHRcdFx0XHRcdGlmIChzb3VyY2Uua2luZCA9PT0gXCJkaXJlY3RvcnlcIikgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgZW50cnldIG9mIHNvdXJjZS5lbnRyaWVzKCkpIGlmIChlbnRyeS5raW5kID09PSBcImRpcmVjdG9yeVwiKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0Rlc3QgPSBhd2FpdCBkZXN0LmdldERpcmVjdG9yeUhhbmRsZShuYW1lLCB7IGNyZWF0ZTogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgY29weVJlY3Vyc2l2ZShlbnRyeSwgbmV3RGVzdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgZW50cnkuZ2V0RmlsZSgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB3cml0YWJsZSA9IGF3YWl0IChhd2FpdCBkZXN0LmdldEZpbGVIYW5kbGUobmFtZSwgeyBjcmVhdGU6IHRydWUgfSkpLmNyZWF0ZVdyaXRhYmxlKCk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHdyaXRhYmxlLndyaXRlKGZpbGUpO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZpbGUgPSBhd2FpdCBzb3VyY2UuZ2V0RmlsZSgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB3cml0YWJsZSA9IGF3YWl0IGRlc3QuY3JlYXRlV3JpdGFibGUoKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgd3JpdGFibGUud3JpdGUoZmlsZSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhd2FpdCBjb3B5UmVjdXJzaXZlKGZyb20sIHRvKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGNvbnNvbGUud2FybihcIldvcmtlciBjb3B5IGVycm9yOlwiLCBlKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdFNXX0JSSURHRV9DSEFOTkVMX05BTUUgPSBcIm9wZnMtc3ctYnJpZGdlLXYxXCI7XG5cdFx0c3dCcmlkZ2VDaGFubmVsID0gbnVsbDtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHR5cGVvZiBCcm9hZGNhc3RDaGFubmVsICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdHN3QnJpZGdlQ2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKFNXX0JSSURHRV9DSEFOTkVMX05BTUUpO1xuXHRcdFx0XHRzd0JyaWRnZUNoYW5uZWwub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IGV2ZW50Py5kYXRhIHx8IHt9O1xuXHRcdFx0XHRcdGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuXHRcdFx0XHRcdGlmIChkYXRhPy50eXBlICE9PSBcIm9wZnMtc3ctcmVxdWVzdFwiKSByZXR1cm47XG5cdFx0XHRcdFx0Y29uc3QgcmVxdWVzdElkID0gU3RyaW5nKGRhdGE/LnJlcXVlc3RJZCB8fCBcIlwiKTtcblx0XHRcdFx0XHRjb25zdCBhY3Rpb24gPSBTdHJpbmcoZGF0YT8uYWN0aW9uIHx8IFwiXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHBheWxvYWQgPSBkYXRhPy5wYXlsb2FkO1xuXHRcdFx0XHRcdGlmICghcmVxdWVzdElkIHx8ICFhY3Rpb24pIHJldHVybjtcblx0XHRcdFx0XHRjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbYWN0aW9uXTtcblx0XHRcdFx0XHRpZiAoIWhhbmRsZXIpIHtcblx0XHRcdFx0XHRcdHN3QnJpZGdlQ2hhbm5lbD8ucG9zdE1lc3NhZ2U/Lih7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwib3Bmcy1zdy1yZXNwb25zZVwiLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SWQsXG5cdFx0XHRcdFx0XHRcdG9rOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0ZXJyb3I6IGBVbmtub3duIG9wZXJhdGlvbiB0eXBlOiAke2FjdGlvbn1gXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocGF5bG9hZCk7XG5cdFx0XHRcdFx0XHRzd0JyaWRnZUNoYW5uZWw/LnBvc3RNZXNzYWdlPy4oe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIm9wZnMtc3ctcmVzcG9uc2VcIixcblx0XHRcdFx0XHRcdFx0cmVxdWVzdElkLFxuXHRcdFx0XHRcdFx0XHRvazogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0cmVzdWx0XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0c3dCcmlkZ2VDaGFubmVsPy5wb3N0TWVzc2FnZT8uKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJvcGZzLXN3LXJlc3BvbnNlXCIsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RJZCxcblx0XHRcdFx0XHRcdFx0b2s6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0c3dCcmlkZ2VDaGFubmVsID0gbnVsbDtcblx0XHR9XG5cdFx0c2VsZi5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBhc3luYyAoZSkgPT4ge1xuXHRcdFx0aWYgKCFlLmRhdGEgfHwgdHlwZW9mIGUuZGF0YSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuXHRcdFx0Y29uc3QgeyBpZCwgdHlwZSwgcGF5bG9hZCB9ID0gZS5kYXRhO1xuXHRcdFx0aWYgKGhhbmRsZXJzW3R5cGVdKSB0cnkge1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyc1t0eXBlXShwYXlsb2FkKTtcblx0XHRcdFx0c2VsZi5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdFx0aWQsXG5cdFx0XHRcdFx0cmVzdWx0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0c2VsZi5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdFx0aWQsXG5cdFx0XHRcdFx0ZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcilcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChpZCkgc2VsZi5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdGlkLFxuXHRcdFx0XHRlcnJvcjogYFVua25vd24gb3BlcmF0aW9uIHR5cGU6ICR7dHlwZX1gXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSkpO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvdXRpbHMvb3Bmcy9PUEZTLnVuaWZvcm0ud29ya2VyLnRzXG5cdGluaXRfT1BGU193b3JrZXIoKTtcblx0aWYgKGhhbmRsZXJzKSByZWdpc3RlcldvcmtlckFQSShoYW5kbGVycyk7XG5cdGNvbnN0IHByb2Nlc3NNZXNzYWdlID0gYXN5bmMgKGVudmVsb3BlKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChlbnZlbG9wZS50eXBlID09PSBcImJhdGNoXCIpIHtcblx0XHRcdFx0Y29uc3QgcmVzdWx0cyA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IG1zZyBvZiBlbnZlbG9wZS5wYXlsb2FkKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc1NpbmdsZU1lc3NhZ2UobXNnKTtcblx0XHRcdFx0XHRyZXN1bHRzLnB1c2gocmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdH0gZWxzZSByZXR1cm4gYXdhaXQgcHJvY2Vzc1NpbmdsZU1lc3NhZ2UoZW52ZWxvcGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiW09QRlMgV29ya2VyXSBNZXNzYWdlIHByb2Nlc3NpbmcgZXJyb3I6XCIsIGVycm9yKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcHJvY2Vzc1NpbmdsZU1lc3NhZ2UgPSBhc3luYyAoZW52ZWxvcGUpID0+IHtcblx0XHRjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbZW52ZWxvcGUudHlwZV07XG5cdFx0aWYgKCFoYW5kbGVyKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWVzc2FnZSB0eXBlOiAke2VudmVsb3BlLnR5cGV9YCk7XG5cdFx0cmV0dXJuIGF3YWl0IGhhbmRsZXIoZW52ZWxvcGUucGF5bG9hZCk7XG5cdH07XG5cdGdsb2JhbFRoaXMucHJvY2Vzc01lc3NhZ2UgPSBwcm9jZXNzTWVzc2FnZTtcblx0Y29uc3QgaW5pdFdvcmtlciA9IGFzeW5jICgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgaGFuZGxlcnMgPSAoYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9PUEZTX3dvcmtlcigpLCBPUEZTX3dvcmtlcl9leHBvcnRzKSkpLmhhbmRsZXJzO1xuXHRcdFx0aWYgKGhhbmRsZXJzKSByZWdpc3RlcldvcmtlckFQSShoYW5kbGVycyk7XG5cdFx0XHRjb25zb2xlLmxvZyhcIltPUEZTIFdvcmtlcl0gSW5pdGlhbGl6ZWQgd2l0aCBoYW5kbGVyczpcIiwgT2JqZWN0LmtleXMoaGFuZGxlcnMgfHwge30pKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIltPUEZTIFdvcmtlcl0gRmFpbGVkIHRvIGluaXRpYWxpemU6XCIsIGVycm9yKTtcblx0XHR9XG5cdH07XG5cdGluaXRXb3JrZXIoKTtcblxuLy8jZW5kcmVnaW9uXG59KSgpOyJdLAogICJtYXBwaW5ncyI6ICJjQUFDLFVBQVcsQ0FHWCxJQUFJQSxHQUFZLE9BQU8sZUFDbkJDLEdBQVcsQ0FBQ0MsRUFBSUMsRUFBS0MsSUFBUSxJQUFNLENBQ3RDLEdBQUlBLEVBQUssTUFBTUEsRUFBSSxDQUFDLEVBQ3BCLEdBQUksQ0FDSCxPQUFPRixJQUFPQyxFQUFNRCxFQUFHQSxFQUFLLENBQUMsR0FBSUMsQ0FDbEMsT0FBU0UsRUFBRyxDQUNYLE1BQU1ELEVBQU0sQ0FBQ0MsQ0FBQyxFQUFHQSxDQUNsQixDQUNELEVBQ0lDLEdBQWMsQ0FBQ0MsRUFBS0MsSUFBZSxDQUN0QyxJQUFJQyxFQUFTLENBQUMsRUFDZCxRQUFTQyxLQUFRSCxFQUNoQlAsR0FBVVMsRUFBUUMsRUFBTSxDQUN2QixJQUFLSCxFQUFJRyxDQUFJLEVBQ2IsV0FBWSxFQUNiLENBQUMsRUFFRixPQUFLRixHQUNKUixHQUFVUyxFQUFRLE9BQU8sWUFBYSxDQUFFLE1BQU8sUUFBUyxDQUFDLEVBRW5EQSxDQUNSLEVBSUEsSUFBSUUsR0FBaUMsU0FBU0EsRUFBZ0IsQ0FDN0QsT0FBQUEsRUFBZSxJQUFTLE1BQ3hCQSxFQUFlLElBQVMsTUFDeEJBLEVBQWUsS0FBVSxPQUN6QkEsRUFBZSxNQUFXLFFBQzFCQSxFQUFlLFVBQWUs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QSxFQUFTLE9BQVMsUUFBUyxDQUM5QixNQUFNOUgsRUFBVSxDQUFDLEVBQ2pCLFVBQVd6RyxLQUFPdU8sRUFBUyxRQUFTLENBQ25DLE1BQU1oVSxFQUFTLE1BQU1pVSxHQUFxQnhPLENBQUcsRUFDN0N5RyxFQUFRLEtBQUtsTSxDQUFNLENBQ3BCLENBQ0EsT0FBT2tNLENBQ1IsS0FBTyxRQUFPLE1BQU0rSCxHQUFxQkQsQ0FBUSxDQUNsRCxPQUFTckMsRUFBTyxDQUNmLGNBQVEsTUFBTSwwQ0FBMkNBLENBQUssRUFDeERBLENBQ1AsQ0FDRCxFQUNNc0MsR0FBdUIsTUFBT0QsR0FBYSxDQUNoRCxNQUFNN1EsRUFBVWlQLEVBQVM0QixFQUFTLElBQUksRUFDdEMsR0FBSSxDQUFDN1EsRUFBUyxNQUFNLElBQUksTUFBTSx5QkFBeUI2USxFQUFTLElBQUksRUFBRSxFQUN0RSxPQUFPLE1BQU03USxFQUFRNlEsRUFBUyxPQUFPLENBQ3RDLEVBQ0EsV0FBVyxlQUFpQkQsSUFDVCxTQUFZLENBQzlCLEdBQUksQ0FDSCxNQUFNM0IsR0FBWSxNQUFNLFFBQVEsUUFBUSxFQUFFLEtBQUssS0FBT08sR0FBaUIsRUFBR1YsR0FBb0IsR0FBRyxTQUM3RkcsR0FBVVAsR0FBa0JPLENBQVEsRUFDeEMsUUFBUSxJQUFJLDJDQUE0QyxPQUFPLEtBQUtBLEdBQVksQ0FBQyxDQUFDLENBQUMsQ0FDcEYsT0FBU1QsRUFBTyxDQUNmLFFBQVEsTUFBTSxzQ0FBdUNBLENBQUssQ0FDM0QsQ0FDRCxHQUNXLENBR1osR0FBRyIsCiAgIm5hbWVzIjogWyJfX2RlZlByb3AiLCAiX19lc21NaW4iLCAiZm4iLCAicmVzIiwgImVyciIsICJlIiwgIl9fZXhwb3J0QWxsIiwgImFsbCIsICJub19zeW1ib2xzIiwgInRhcmdldCIsICJuYW1lIiwgIldSZWZsZWN0QWN0aW9uIiwgIlRSQU5TUE9SVF9UWVBFX0FMSUFTRVMiLCAibm9ybWFsaXplVHJhbnNwb3J0VHlwZUFsaWFzIiwgInRyYW5zcG9ydCIsICJyYXciLCAiZGV0ZWN0VHJhbnNwb3J0VHlwZSQxIiwgIiRmeHkiLCAiaXNQcmltaXRpdmUiLCAib2JqIiwgInRyeVBhcnNlQnlIaW50IiwgInZhbHVlIiwgImhpbnQiLCAidW53cmFwIiwgImZhbGxiYWNrIiwgImZpeEZ4IiwgImZ4IiwgImdldFJhbmRvbVZhbHVlcyIsICJhcnJheSIsICJ2YWx1ZXMiLCAiaSIsICJVVUlEdjQiLCAiYyIsICJ1bndyYXBBcnJheSIsICJhcnIiLCAiZWwiLCAiaXNOb3RDb21wbGV4QXJyYXkiLCAiaXNDYW5KdXN0UmV0dXJuIiwgImlzVHlwZWRBcnJheSIsICJpc0NhblRyYW5zZmVyIiwgIiRwcm9taXNlIiwgIlNLSVBfS0VZUyIsICJpc1RoZW5hYmxlJDEiLCAic2V0dGxlT25lIiwgInYiLCAicmVhc29uIiwgIm93bkVudW1lcmFibGVLZXlzIiwgImtleSIsICJkZXNjIiwgImhhc1BlbmRpbmdQcm9taXNlcyIsICJzZWVuIiwgInNlZW5TZXQiLCAiaXRlbSIsICJyZXNvbHZlZERlZXAiLCAibW9kZSIsICJzbG90IiwgIml0ZW1zIiwgInJlY29yZCIsICJyZXNvbHZlZCIsICJjYWxsYmFja09yVmFsdWUiLCAiYXJncyIsICJib3VuZEN0eFN5bWJvbCIsICJib3VuZEN0eCIsICJkZWVwT3BlcmF0ZUFuZENsb25lIiwgIm9wZXJhdGlvbiIsICIkcHJldiIsICJpbmRleCIsICJlbnRyaWVzIiwgInJlc29sdmVkU3ltYm9sIiwgImhhbmRsZWRTeW1ib2wiLCAicmVzb2x2ZWRNYXAiLCAiaGFuZGxlZE1hcCIsICIkZXh0cmFjdEtleSQiLCAiaXNUaGVuYWJsZSIsICJhY3RXaXRoIiwgInByb21pc2VPclBsYWluIiwgImNiIiwgIlByb21pc2VIYW5kbGVyIiwgIiNyZXNvbHZlIiwgIiNyZWplY3QiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAicHJvcCIsICJkZXNjcmlwdG9yIiwgInByb3RvIiwgInV3cCIsICJuZXdUYXJnZXQiLCAiY3QiLCAicmVjZWl2ZXIiLCAicmVzdWx0IiwgIiR0bXAiLCAiUHJvbWlzZWQiLCAidGhpc0FyZyIsICJwcm9taXNlIiwgInByb21pc2VzIiwgIkJhc2VTdWJzY3JpcHRpb24iLCAiX3Vuc3Vic2NyaWJlIiwgIk9ic2VydmFibGUiLCAiX3Byb2R1Y2VyIiwgIm9ic2VydmVyT3JOZXh0IiwgIm9wdHMiLCAib2JzZXJ2ZXIiLCAiY3RybCIsICJhY3RpdmUiLCAiY2xlYW51cCIsICJkb0NsZWFudXAiLCAic3Vic2NyaWJlciIsICJvcHMiLCAicyIsICJvcCIsICJDaGFubmVsU3ViamVjdCIsICJvcHRpb25zIiwgIm9icyIsICJmaWx0ZXIiLCAicHJlZCIsICJzcmMiLCAic3ViIiwgImRldGVjdENvbnRleHRUeXBlIiwgInNlcnZpY2VXb3JrZXJTY29wZSIsICJzaGFyZWRXb3JrZXJTY29wZSIsICJkZWRpY2F0ZWRXb3JrZXJTY29wZSIsICJkZXRlY3RUcmFuc3BvcnRUeXBlIiwgInNvdXJjZSIsICJkZXRlY3RlZCIsICJkZXRlY3RJbmNvbWluZ0NvbnRleHRUeXBlIiwgImRhdGEiLCAic2VuZGVyIiwgIkRlZmF1bHRSZWZsZWN0IiwgIlBST1hZX01BUktFUiIsICJQUk9YWV9JTlRFUk5BTFMiLCAiUmVtb3RlUHJveHlIYW5kbGVyIiwgIl9pbnZva2VyIiwgImNvbmZpZyIsICJwcm9wU3RyIiwgIiRyZXF1ZXN0SGFuZGxlciIsICIkZGVzY3JpcHRvciIsICJjaGlsZFBhdGgiLCAiY2hpbGRQcm94eSIsICJjcmVhdGVSZW1vdGVQcm94eSIsICJpbnZva2VyIiwgImhhbmRsZXIiLCAid3JhcERlc2NyaXB0b3IiLCAidGFyZ2V0Q2hhbm5lbCIsICJjYWNoZWQiLCAiZGVzY01hcCIsICJwcm94eSIsICJ3cmFwTWFwIiwgImNyZWF0ZUV4cG9zZUhhbmRsZXIiLCAicmVmbGVjdCIsICJjcmVhdGVPYmplY3RIYW5kbGVyIiwgImNyZWF0ZVNlbmRlclByb3h5IiwgImJhc2VQYXRoIiwgImFjdGlvbiIsICJwYXRoIiwgIm1ha2VSZXF1ZXN0UHJveHkiLCAiY3JlYXRlQ29ubmVjdGlvbktleSIsICJwYXJhbXMiLCAicXVlcnlDb25uZWN0aW9ucyIsICJjb25uZWN0aW9ucyIsICJxdWVyeSIsICJpbmNsdWRlQ2xvc2VkIiwgImRlc2lyZWRTdGF0dXMiLCAiY29ubmVjdGlvbiIsICJhIiwgImIiLCAiQ29ubmVjdGlvblJlZ2lzdHJ5IiwgIl9jcmVhdGVJZCIsICJfZW1pdEV2ZW50IiwgIm5vdyIsICJleGlzdGluZyIsICJwYXlsb2FkIiwgImNoYW5uZWwiLCAiVW5pZmllZENoYW5uZWwiLCAiZXZlbnQiLCAiY2ZnIiwgInRyYW5zcG9ydFR5cGUiLCAiYmluZGluZyIsICJzb3VyY2VDaGFubmVsIiwgIm1zZyIsICJzZW5kUmVzcG9uc2UiLCAid3JpdGVCeVBhdGgiLCAidXJsIiwgImlkIiwgInJlc29sdmVycyIsICJ0aW1lb3V0IiwgIm1lc3NhZ2UiLCAibW9kdWxlTmFtZSIsICJldmVudFR5cGUiLCAidHlwZSIsICJzZW50IiwgInRhcmdldHMiLCAicmVxSWQiLCAidG9UcmFuc2ZlciIsICJuZXdQYXRoIiwgImV4ZWN1dGVBY3Rpb24iLCAicmF3UmVzdWx0IiwgImNvcmVSZXNwb25zZSIsICJ0cmFuc2ZlciIsICJidWlsZFJlc3BvbnNlIiwgInJlc3BvbnNlIiwgInJlbW90ZUNoYW5uZWwiLCAic2lnbmFsVHlwZSIsICJ0YWJJZCIsICJsaXN0ZW5lciIsICJzZW5kZXJNZXRhIiwgInBvcnROYW1lIiwgInBvcnQiLCAiY3JlYXRlVW5pZmllZENoYW5uZWwiLCAiV09SS0VSX0NIQU5ORUwiLCAiZ2V0V29ya2VyQ2hhbm5lbCIsICJjb250ZXh0VHlwZSIsICJUUyIsICJUcmFuc2ZlcmFibGUiLCAiRSIsICJnZXRXb3JrZXJSZXNvbHZlQmFzZVVybCIsICJocmVmIiwgInJlc29sdmVXb3JrZXJTcGVjaWZpZXJIcmVmIiwgInNwZWMiLCAiYmFzZSIsICJub3JtYWxpemVkIiwgIlNFTEZfQ0hBTk5FTCIsICJDSEFOTkVMX01BUCIsICJpc1JlZmxlY3RBY3Rpb24kMSIsICJSZW1vdGVDaGFubmVsSGVscGVyJDEiLCAiY2hhbm5lbE5hbWUiLCAiQ2hhbm5lbEhhbmRsZXIkMSIsICJicm9hZGNhc3QiLCAidG9DaGFubmVsIiwgInJlcXVlc3QiLCAicmVzcG9uc2VGbiIsICJoYW5kbGVSZXF1ZXN0IiwgImluaXRDaGFubmVsSGFuZGxlciIsICIkY2hhbm5lbCIsICJoYW5kTWFwIiwgIm9iamVjdFRvUmVmIiwgInJlZ2lzdGVyZWRJblBhdGgiLCAibm9ybWFsaXplUmVmIiwgInN0b3JlZERhdGEiLCAidHJhdmVyc2VCeVBhdGgiLCAiJGRlc2MiLCAicmVhZEJ5UGF0aCIsICJyb290IiwgInJlbW92ZUJ5UGF0aCIsICJyZW1vdmVCeURhdGEiLCAiaGFzTm9QYXRoIiwgImlzT2JqZWN0IiwgImRlZmF1bHRSZWZsZWN0IiwgInQiLCAicCIsICJjdHgiLCAiZ290IiwgIm5vcm1hbGl6ZWRWYWx1ZSIsICJub3JtYWxpemVkQXJncyIsICJjYW5CZVJldHVybiIsICJmaW5hbFBhdGgiLCAiY3R4S2V5IiwgInBhcmVudCIsICJjdXJyZW50IiwgImNhbGxBcmdzIiwgImN0b3JBcmdzIiwgIkNoYW5uZWxDb25uZWN0aW9uIiwgIl9uYW1lIiwgIl90cmFuc3BvcnRUeXBlIiwgImZyb21DaGFubmVsIiwgIm0iLCAib3JpZ2luYWwiLCAiciIsICJzdGF0ZSIsICJDb25uZWN0aW9uUG9vbCIsICJnZXRDb25uZWN0aW9uUG9vbCIsICJnZXRDb25uZWN0aW9uIiwgIkRCX05BTUUiLCAiREJfVkVSU0lPTiIsICJTVE9SRVMiLCAiQ2hhbm5lbFN0b3JhZ2UiLCAiZGIiLCAibWVzc2FnZXNTdG9yZSIsICJtYWlsYm94U3RvcmUiLCAicGVuZGluZ1N0b3JlIiwgImV4Y2hhbmdlU3RvcmUiLCAic3RvcmVkTWVzc2FnZSIsICJ0eCIsICJzdG9yZSIsICJyZXN1bHRzIiwgImN1cnNvciIsICJtZXNzYWdlSWQiLCAic3RhdHVzIiwgIm1lc3NhZ2VzIiwgInN0YXRzIiwgImRlbGV0ZWRDb3VudCIsICJwZW5kaW5nIiwgIm9wZXJhdGlvbklkIiwgInBvbGxJbnRlcnZhbCIsICJzdGFydFRpbWUiLCAiZ2V0UmVxdWVzdCIsICJDaGFubmVsVHJhbnNhY3Rpb24iLCAib3BlcmF0aW9ucyIsICJzdG9yZU5hbWVzIiwgImdldFJlcSIsICJtc2dSZXF1ZXN0IiwgIm1haWxSZXF1ZXN0IiwgIl9zdG9yYWdlIiwgInVwZGF0ZXMiLCAiX3N0b3JhZ2VJbnN0YW5jZXMiLCAiZ2V0Q2hhbm5lbFN0b3JhZ2UiLCAid29ya2VyQmFzZSIsICJ3b3JrZXJDb2RlIiwgIlJlbW90ZUNoYW5uZWxIZWxwZXIiLCAiX2NoYW5uZWwiLCAiX2NvbnRleHQiLCAiX29wdGlvbnMiLCAibm9ybWFsaXplZFBhdGgiLCAibm9ybWFsaXplZEFjdGlvbiIsICJpc1JlZmxlY3RBY3Rpb24iLCAiQ2hhbm5lbEhhbmRsZXIiLCAibm9ybWFsaXplVHJhbnNwb3J0QmluZGluZyIsICJnZXREeW5hbWljVHJhbnNwb3J0VHlwZSIsICJDaGFubmVsQ29udGV4dCIsICJob3N0TmFtZSIsICJlbmRwb2ludCIsICJjb25uZWN0ZWRUYXJnZXRzIiwgIm5hbWVzIiwgImluaXRGbiIsICJ3b3JrZXIiLCAid29ya2VySW5zdGFuY2UiLCAibG9hZFdvcmtlciIsICJyZWFkeSIsICJicm9hZGNhc3ROYW1lIiwgImJjIiwgInNlbGZUYXJnZXQiLCAiYmNOYW1lIiwgIm5hbWUxIiwgIm5hbWUyIiwgIm1jIiwgImhhbmRsZXIxIiwgImhhbmRsZXIyIiwgInJlYWR5MSIsICJyZWFkeTIiLCAiY2hhbm5lbDEiLCAiY2hhbm5lbDIiLCAibXNnQ2hhbm5lbCIsICJpbmZvIiwgImRpcmVjdGlvbiIsICJtYXBwZWRUcmFuc3BvcnRUeXBlIiwgInVuaWZpZWQiLCAic3Vic2NyaXB0aW9uIiwgImlzVHJhbnNwb3J0QmluZGluZyIsICJuYXRpdmVUYXJnZXQiLCAiZWZmZWN0aXZlVGFyZ2V0IiwgIldYIiwgIkNPTlRFWFRfUkVHSVNUUlkiLCAiY3JlYXRlQ2hhbm5lbENvbnRleHQiLCAiV29ya2VyQ29udGV4dCIsICJjbG9zZWQiLCAiV09SS0VSX0NPTlRFWFQiLCAiZ2V0V29ya2VyQ29udGV4dCIsICJQb3J0VHJhbnNwb3J0IiwgIl9jaGFubmVsTmFtZSIsICJfY29uZmlnIiwgIm1zZ0hhbmRsZXIiLCAiZXJySGFuZGxlciIsICJ0cmFuc2ZlcmFibGUiLCAiY3JlYXRlQ2hhbm5lbFBhaXIiLCAiUG9ydFBvb2wiLCAiX2RlZmF1bHRDb25maWciLCAiV2luZG93UG9ydENvbm5lY3RvciIsICJfdGFyZ2V0IiwgImxvY2FsIiwgInJlbW90ZSIsICJjcmVhdGVQb3J0UHJveHkiLCAidGFyZ2V0UGF0aCIsICJleHBvc2VPdmVyUG9ydCIsICJlcnJvciIsICJQb3J0VHJhbnNwb3J0RmFjdG9yeSIsICJyZWdpc3RlcldvcmtlckFQSSIsICJhcGkiLCAiY2hhbm5lbEhhbmRsZXIiLCAibWV0aG9kTmFtZSIsICJPUEZTX3dvcmtlcl9leHBvcnRzIiwgImdldERpckhhbmRsZSIsICJnZXRGaWxlU3lzdGVtUm9vdCIsICJoYW5kbGVycyIsICJub3JtYWxpemVQYXRoIiwgInJlc29sdmVGaWxlU3lzdGVtSGFuZGxlIiwgIm1hcHBlZFJvb3RzIiwgImFjdGl2ZU9ic2VydmVycyIsICJTV19CUklER0VfQ0hBTk5FTF9OQU1FIiwgInN3QnJpZGdlQ2hhbm5lbCIsICJpbml0X09QRlNfd29ya2VyIiwgImNyZWF0ZSIsICJwYXJ0cyIsICJwYXJ0IiwgImhhbmRsZSIsICJyb290SWQiLCAiZW50cnkiLCAiZmlsZW5hbWUiLCAiZGlyUGF0aCIsICJmaWxlIiwgIndyaXRhYmxlIiwgInJlY3Vyc2l2ZSIsICJyZWNvcmRzIiwgImNoYW5nZXMiLCAiZnJvbSIsICJ0byIsICJjb3B5UmVjdXJzaXZlIiwgImRlc3QiLCAibmV3RGVzdCIsICJyZXF1ZXN0SWQiLCAicHJvY2Vzc01lc3NhZ2UiLCAiZW52ZWxvcGUiLCAicHJvY2Vzc1NpbmdsZU1lc3NhZ2UiXQp9Cg==