milkio 1.2.0 → 1.3.0

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.
Files changed (2) hide show
  1. package/index.js +63 -64
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -66,49 +66,60 @@ function mergeDeep(target, source) {
66
66
 
67
67
  // packages/milkio/utils/revive-json-parse.ts
68
68
  var isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
69
+ function tryParseDate(str) {
70
+ const len = str.length;
71
+ if (len >= 20 && len <= 32 && str.charCodeAt(0) >= 48 && str.charCodeAt(0) <= 57 && str.indexOf("T") !== -1) {
72
+ const match = isoDatePattern.exec(str);
73
+ if (match !== null) {
74
+ if (match[2]) {
75
+ const colonPos = match[2].charCodeAt(3) === 58 ? match[1].length + 3 : -1;
76
+ if (colonPos >= 0) {
77
+ return new Date(str.substring(0, colonPos) + str.substring(colonPos + 1));
78
+ }
79
+ return new Date(str);
80
+ }
81
+ return new Date(match[1] + "Z");
82
+ }
83
+ }
84
+ return null;
85
+ }
69
86
  function reviveJSONParse(json) {
70
87
  if (json === null || json === undefined)
71
88
  return json;
72
- const type = typeof json;
73
- if (type === "object") {
89
+ if (typeof json === "object") {
74
90
  if (json instanceof Date)
75
91
  return json;
76
92
  if (Array.isArray(json)) {
77
93
  const len = json.length;
78
94
  for (let i = 0;i < len; i++) {
79
- const result = reviveJSONParse(json[i]);
80
- if (result !== json[i])
81
- json[i] = result;
95
+ const v = json[i];
96
+ if (typeof v === "string") {
97
+ const d = tryParseDate(v);
98
+ if (d !== null)
99
+ json[i] = d;
100
+ } else if (typeof v === "object" && v !== null) {
101
+ reviveJSONParse(v);
102
+ }
82
103
  }
83
104
  return json;
84
105
  }
85
- const keys = Object.keys(json);
86
106
  const obj = json;
87
- for (let i = 0;i < keys.length; i++) {
88
- const key = keys[i];
89
- const value = obj[key];
90
- const result = reviveJSONParse(value);
91
- if (result !== value)
92
- obj[key] = result;
107
+ for (const key in obj) {
108
+ const v = obj[key];
109
+ if (typeof v === "string") {
110
+ const d = tryParseDate(v);
111
+ if (d !== null)
112
+ obj[key] = d;
113
+ } else if (typeof v === "object" && v !== null) {
114
+ reviveJSONParse(v);
115
+ }
93
116
  }
94
117
  return json;
95
118
  }
96
- if (type === "string") {
97
- const str = json;
98
- const len = str.length;
99
- if (len >= 20 && len <= 32 && str.charCodeAt(0) >= 48 && str.charCodeAt(0) <= 57 && str.indexOf("T") !== -1) {
100
- const match = str.match(isoDatePattern);
101
- if (match !== null) {
102
- if (match[2]) {
103
- const colonPos = match[2].charCodeAt(3) === 58 ? match[1].length + 3 : -1;
104
- if (colonPos >= 0) {
105
- return new Date(str.substring(0, colonPos) + str.substring(colonPos + 1));
106
- }
107
- return new Date(str);
108
- }
109
- return new Date(match[1] + "Z");
110
- }
111
- }
119
+ if (typeof json === "string") {
120
+ const d = tryParseDate(json);
121
+ if (d !== null)
122
+ return d;
112
123
  }
113
124
  return json;
114
125
  }
@@ -230,8 +241,8 @@ function __initExecuter(generated, runtime) {
230
241
  return { executeId, headers, params, results, context: options.context, meta, type, emptyResult, resultsTypeSafety, finales };
231
242
  };
232
243
  const __call = async (context, module, params) => {
233
- const moduleAwaited = await module;
234
- return await moduleAwaited.handler(context, params);
244
+ const { handler } = await module;
245
+ return handler(context, params);
235
246
  };
236
247
  return {
237
248
  __call,
@@ -239,6 +250,7 @@ function __initExecuter(generated, runtime) {
239
250
  };
240
251
  }
241
252
  // packages/milkio/event/index.ts
253
+ var RESOLVED_PROMISE = Promise.resolve();
242
254
  function __initEventManager() {
243
255
  const handlers = new Map;
244
256
  const indexed = new Map;
@@ -295,7 +307,7 @@ function __initEventManager() {
295
307
  const h = indexed.get(key);
296
308
  const wildcardHandlers = indexed.get("*");
297
309
  if (!wildcardHandlers && !h)
298
- return Promise.resolve();
310
+ return RESOLVED_PROMISE;
299
311
  if (wildcardHandlers && h) {
300
312
  return (async () => {
301
313
  for (const handler of wildcardHandlers) {
@@ -436,33 +448,17 @@ function __createId() {
436
448
  crypto.getRandomValues(__fastIdPool);
437
449
  __fastIdPoolIndex = 0;
438
450
  }
439
- const id = Array.from({ length: 24 });
440
- const ts = __bigIntToString(BigInt(Date.now())).padStart(8, "0");
441
- for (let i = 0;i < 8; i++) {
442
- id[i] = ts[i];
443
- }
444
- for (let i = 8;i < 14; i++) {
445
- id[i] = ENCODING[__fastIdPool[__fastIdPoolIndex++] % ENCODING_LEN];
451
+ const ts = Date.now().toString(36).padStart(8, "0");
452
+ let id = ts;
453
+ for (let i = 0;i < 6; i++) {
454
+ id += ENCODING[__fastIdPool[__fastIdPoolIndex++] % ENCODING_LEN];
446
455
  }
447
456
  const counter = __fastIdCounter++;
448
- for (let i = 14;i < 24; i++) {
457
+ for (let i = 0;i < 10; i++) {
449
458
  const mix = counter + __fastIdPool[__fastIdPoolIndex++ % 256] & 65535;
450
- id[i] = ENCODING[mix % ENCODING_LEN];
459
+ id += ENCODING[mix % ENCODING_LEN];
451
460
  }
452
- return id.join("");
453
- }
454
- function __bigIntToString(value) {
455
- const base = BigInt(ENCODING_LEN);
456
- let result = "";
457
- let current = value;
458
- if (current === 0n)
459
- return ENCODING[0];
460
- while (current > 0n) {
461
- const remainder = current % base;
462
- result = ENCODING[Number(remainder)] + result;
463
- current = current / base;
464
- }
465
- return result;
461
+ return id;
466
462
  }
467
463
 
468
464
  // packages/milkio/execute/execute-id-generator.ts
@@ -849,6 +845,9 @@ function __initListener(generated, runtime, executer) {
849
845
  const executeId2 = __createId();
850
846
  const corsHeaders2 = getCorsHeaders(origin);
851
847
  const jsonHeaders = { ...corsHeaders2, "Content-Type": "application/json", "Cache-Control": "no-store" };
848
+ if (eventData && typeof eventData === "object" && !Array.isArray(eventData) && !("context" in eventData)) {
849
+ eventData.context = { reject, develop: runtime.develop, executeId: executeId2, path: pathString, emit: runtime.emit, emitAnyApproved: runtime.emitAnyApproved, emitAllApproved: runtime.emitAllApproved, _: runtime };
850
+ }
852
851
  try {
853
852
  await runtime.emit(eventName, eventData);
854
853
  } catch (emitError) {
@@ -858,7 +857,7 @@ function __initListener(generated, runtime, executer) {
858
857
  return { __rawResponse: true, body: errBody, status: 200, headers: jsonHeaders };
859
858
  return new Response(errBody, { status: 200, headers: jsonHeaders });
860
859
  }
861
- const body = `{"data":${JSON.stringify(eventData ?? {})},"executeId":"${executeId2}","success":true}`;
860
+ const body = `{"data":${JSON.stringify(eventData ?? {}, (key, value) => key === "context" ? undefined : value)},"executeId":"${executeId2}","success":true}`;
862
861
  if (options.rawResponse)
863
862
  return { __rawResponse: true, body, status: 200, headers: jsonHeaders };
864
863
  return new Response(body, { status: 200, headers: jsonHeaders });
@@ -1349,16 +1348,16 @@ var reject = function reject2(codeOrObj, data) {
1349
1348
  rejectData = codeOrObj[code];
1350
1349
  }
1351
1350
  const error = { $milkioReject: true, code, data: rejectData };
1352
- Error.captureStackTrace(error);
1351
+ if (typeof Error.captureStackTrace === "function")
1352
+ Error.captureStackTrace(error);
1353
1353
  return error;
1354
1354
  };
1355
1355
  function exceptionHandler(executeId, logger, error) {
1356
- try {
1357
- if ("viteServer" in globalThis)
1358
- globalThis.viteServer?.ssrFixStacktrace(error);
1359
- } catch (error2) {}
1360
- if (error instanceof Error && "viteServer" in globalThis)
1361
- globalThis.viteServer.ssrFixStacktrace(error);
1356
+ if (error instanceof Error && "viteServer" in globalThis) {
1357
+ try {
1358
+ globalThis.viteServer.ssrFixStacktrace(error);
1359
+ } catch {}
1360
+ }
1362
1361
  const name = error?.code ?? error?.name ?? error?.constructor?.name ?? "Unnamed Exception";
1363
1362
  if (error?.$milkioReject === true && error?.code === "NOT_FOUND") {
1364
1363
  logger.info(name, error?.data?.path ?? "Unknown path");
@@ -1404,5 +1403,5 @@ export {
1404
1403
  __initEventManager
1405
1404
  };
1406
1405
 
1407
- //# debugId=F010EF8D444BFAB664756E2164756E21
1408
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbHMvcGFydC50cyIsICIuLi90eXBlLXNhZmV0eS9pbmRleC50cyIsICIuLi9jb25maWcvaW5kZXgudHMiLCAiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzIiwgIi4uL3V0aWxzL21lcmdlLWRlZXAudHMiLCAiLi4vdXRpbHMvcmV2aXZlLWpzb24tcGFyc2UudHMiLCAiLi4vZXhlY3V0ZS9pbmRleC50cyIsICIuLi9ldmVudC9pbmRleC50cyIsICIuLi9mbG93L2luZGV4LnRzIiwgIi4uL3V0aWxzL2NyZWF0ZS1pZC50cyIsICIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzIiwgIi4uL3dvcmxkL2luZGV4LnRzIiwgIi4uL3R5cGlhL2luZGV4LnRzIiwgIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHMiLCAiLi4vbG9nZ2VyL2luZGV4LnRzIiwgIi4uL3N0ZXAvaW5kZXgudHMiLCAiLi4vdXRpbHMvdHJpZS50cyIsICIuLi91dGlscy9idWlsZC1jb3JzLWhlYWRlcnMudHMiLCAiLi4vbGlzdGVuZXIvaW5kZXgudHMiLCAiLi4vZXhjZXB0aW9uL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCBmdW5jdGlvbiBwYXJ0PFQgZXh0ZW5kcyAoKSA9PiB1bmtub3duPihoYW5kbGVyOiBUKTogUmV0dXJuVHlwZTxUPiB7XG4gIHJldHVybiBoYW5kbGVyKCkgYXMgdW5rbm93biBhcyBSZXR1cm5UeXBlPFQ+O1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBUeXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSAodmFsdWU6IFZhbHVlKSA9PiBUeXBlU2FmZXR5VmFsdWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVZhbHVlIHtcbiAgdHlwZTogPFR5cGUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PigpID0+IFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVR5cGU8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcbiAgJG1pbGtpb1R5cGU6IFwidHlwZS1zYWZldHlcIjtcbiAgdmFsdWU6IFR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4odmFsdWU6IFZhbHVlKTogVHlwZVNhZmV0eVZhbHVlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAoKSA9PiAoeyAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiLCB2YWx1ZSB9KSxcbiAgfSBhcyBhbnk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb25maWc8Q29uZmlnVCBleHRlbmRzIENvbmZpZz4oY29uZmlnOiBDb25maWdUKTogQ29uZmlnVCB7XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IChtb2RlOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRW52aXJvbm1lbnRzPFQgZXh0ZW5kcyBDb25maWc+IHtcbiAgW2tleTogc3RyaW5nXTogKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gUGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiB8IFByb21pc2U8UGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvQm9vbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4pIHtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9KU09OKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3QganNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xuICAgIGpzb25ba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuIiwKICAgICJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IFQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCB9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleSBhcyBrZXlvZiBUXTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh0YXJnZXRWYWx1ZSkgJiYgaXNQbGFpbk9iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgbWVyZ2VkW2tleSBhcyBrZXlvZiBUICYga2V5b2YgVV0gPSBtZXJnZURlZXAodGFyZ2V0VmFsdWUsIHNvdXJjZVZhbHVlKSBhcyBhbnk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIChtZXJnZWQgYXMgYW55KVtrZXldID0gc291cmNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZCBhcyBUICYgVTtcbn1cbiIsCiAgICAiY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4ganNvbjtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGpzb247XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBqc29uLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXZpdmVKU09OUGFyc2UoanNvbltpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0ganNvbltpXSkganNvbltpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uIGFzIG9iamVjdCk7XG4gICAgICAgIGNvbnN0IG9iaiA9IGpzb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdmFsdWUpIG9ialtrZXldID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RyID0ganNvbiBhcyB1bmtub3duIGFzIHN0cmluZztcbiAgICAgICAgLy8gUXVpY2sgcmVqZWN0OiBJU08gZGF0ZSBzdHJpbmdzIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0IGFuZCBjb250YWluICdUJ1xuICAgICAgICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID49IDIwICYmIGxlbiA8PSAzMiAmJiBzdHIuY2hhckNvZGVBdCgwKSA+PSAweDMwICYmIHN0ci5jaGFyQ29kZUF0KDApIDw9IDB4MzkgJiYgc3RyLmluZGV4T2YoJ1QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3RyLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvblBvcyA9IG1hdGNoWzJdLmNoYXJDb2RlQXQoMykgPT09IDU4ID8gbWF0Y2hbMV0ubGVuZ3RoICsgMyA6IC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb25Qb3MgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0ci5zdWJzdHJpbmcoMCwgY29sb25Qb3MpICsgc3RyLnN1YnN0cmluZyhjb2xvblBvcyArIDEpKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0cikgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbMV0gKyAnWicpIGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgSVZhbGlkYXRpb24gfSBmcm9tIFwidHlwaWFcIjtcbmltcG9ydCB7IHJlamVjdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgJG1ldGEsIExvZ2dlciwgUmVzdWx0cywgR2VuZXJhdGVkSW5pdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgaGVhZGVyc1RvSlNPTiB9IGZyb20gXCIuLi91dGlscy9oZWFkZXJzLXRvLWpzb24udHNcIjtcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gXCIuLi91dGlscy9tZXJnZS1kZWVwLnRzXCI7XG5pbXBvcnQgeyByZXZpdmVKU09OUGFyc2UgfSBmcm9tIFwiLi4vdXRpbHMvcmV2aXZlLWpzb24tcGFyc2UudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV4ZWN1dGVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55KSB7XG4gICAgY29uc3QgX19leGVjdXRlID0gYXN5bmMgKFxuICAgICAgICByb3V0ZVNjaGVtYTogYW55LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBMb2dnZXI7XG4gICAgICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgICAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgSGVhZGVycztcbiAgICAgICAgICAgIGNvbnRleHQ6IGFueSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHBhcmFtc0NvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgICAgICB9ICYgKFxuICAgICAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwicmF3XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICk6IFByb21pc2U8eyBleGVjdXRlSWQ6IHN0cmluZzsgaGVhZGVyczogSGVhZGVyczsgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjsgcmVzdWx0czogUmVzdWx0czxhbnk+OyBjb250ZXh0OiAkY29udGV4dDsgbWV0YTogUmVhZG9ubHk8JG1ldGE+OyB0eXBlOiBcImFjdGlvblwiIHwgXCJzdHJlYW1cIjsgZW1wdHlSZXN1bHQ6IGJvb2xlYW47IHJlc3VsdHNUeXBlU2FmZXR5OiBib29sZWFuOyBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gfT4gPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gb3B0aW9ucy5wYXRoLmVuZHNXaXRoKFwiflwiKSA/IFwic3RyZWFtXCIgOiBcImFjdGlvblwiO1xuICAgICAgICBjb25zdCBleGVjdXRlSWQ6IHN0cmluZyA9IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZDtcbiAgICAgICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XG4gICAgICAgIGlmICghKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGxpZ2h0d2VpZ2h0IGhlYWRlcnMgcHJveHkgd2l0aCBnZXQoKSBtZXRob2RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKG9wdGlvbnMuaGVhZGVycyBhcyBhbnkpPy5nZXQgPT09IFwiZnVuY3Rpb25cIiAmJiAhKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyBhcyB1bmtub3duIGFzIEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0b0pTT04gZm9yIGxpZ2h0d2VpZ2h0IHByb3h5IC0gbm90IG5lZWRlZCBpbiBIVFRQIHJlcXVlc3QgcGF0aFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghKFwidG9KU09OXCIgaW4gaGVhZGVycykpIChoZWFkZXJzIGFzIGFueSkudG9KU09OID0gKCkgPT4gaGVhZGVyc1RvSlNPTihoZWFkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbGVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgICAgIGNvbnN0IG9uRmluYWxseSA9IChoYW5kbGVyOiBhbnkpID0+IGZpbmFsZXMudW5zaGlmdChoYW5kbGVyKTtcblxuICAgICAgICBsZXQgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjtcbiAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1zVHlwZSA9PT0gXCJyYXdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyYW1zIHx8IG9wdGlvbnMucGFyYW1zID09PSBcIlwiIHx8IG9wdGlvbnMucGFyYW1zID09PSBcInt9XCIpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJhbXNDb250ZW50VHlwZSA9PT0gXCJqc29uXCIgfHwgaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LnN0YXJ0c1dpdGgoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2Uob3B0aW9ucy5wYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpPy5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHBhcmFtc1trZXldID0gdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJmb3JtLXVybGVuY29kZWRcIiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXJhbXMpKSB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiIH0pO1xuICAgICAgICBpZiAoXCIkbWlsa2lvR2VuZXJhdGVQYXJhbXNcIiBpbiBwYXJhbXMgJiYgcGFyYW1zLiRtaWxraW9HZW5lcmF0ZVBhcmFtcyA9PT0gXCJlbmFibGVcIikge1xuICAgICAgICAgICAgaWYgKCFydW50aW1lLmRldmVsb3ApIHRocm93IHJlamVjdChcIk5PVF9ERVZFTE9QX01PREVcIiwgXCJUaGlzIGZlYXR1cmUgbXVzdCBiZSBpbiBjb29rYm9vayB0byB1c2UuXCIpO1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXM7XG4gICAgICAgICAgICBsZXQgcGFyYW1zUmFuZCA9IHJvdXRlU2NoZW1hLnJhbmRvbVBhcmFtcygpO1xuICAgICAgICAgICAgaWYgKHBhcmFtc1JhbmQgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXNSYW5kID09PSBudWxsKSBwYXJhbXNSYW5kID0ge307XG4gICAgICAgICAgICBwYXJhbXMgPSBtZXJnZURlZXAocGFyYW1zLCBwYXJhbXNSYW5kKTtcbiAgICAgICAgICAgIG9wdGlvbnMuY3JlYXRlZExvZ2dlci5kZWJ1ZyhcIuKcqCB0aGUgZ2VuZXJhdGVkIHBhcmFtczpcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbnRleHQ/Lmh0dHA/Lm5vdEZvdW5kICYmIG9wdGlvbnMuY29udGV4dD8uaHR0cD8ucGFyYW1zPy5zdHJpbmcpIG9wdGlvbnMuY29udGV4dC5odHRwLnBhcmFtcy5wYXJzZWQgPSBwYXJhbXM7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbnRleHQpIG9wdGlvbnMuY29udGV4dCA9IHt9O1xuICAgICAgICBjb25zdCBjdHggPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGN0eC5kZXZlbG9wID0gcnVudGltZS5kZXZlbG9wO1xuICAgICAgICBjdHgucGF0aCA9IG9wdGlvbnMucGF0aDtcbiAgICAgICAgY3R4LmxvZ2dlciA9IG9wdGlvbnMuY3JlYXRlZExvZ2dlcjtcbiAgICAgICAgY3R4LmVtaXQgPSBydW50aW1lLmVtaXQ7XG4gICAgICAgIGN0eC5lbWl0QW55QXBwcm92ZWQgPSBydW50aW1lLmVtaXRBbnlBcHByb3ZlZDtcbiAgICAgICAgY3R4LmVtaXRBbGxBcHByb3ZlZCA9IHJ1bnRpbWUuZW1pdEFsbEFwcHJvdmVkO1xuICAgICAgICBjdHguZXhlY3V0ZUlkID0gb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkO1xuICAgICAgICBjdHguY29uZmlnID0gcnVudGltZS5ydW50aW1lLmNvbmZpZztcbiAgICAgICAgY3R4LnR5cGlhID0gZ2VuZXJhdGVkLnR5cGlhU2NoZW1hO1xuICAgICAgICBjdHguY2FsbCA9IChtb2R1bGU6IGFueSwgcGFyYW1zOiBhbnkpID0+IF9fY2FsbChjdHgsIG1vZHVsZSwgcGFyYW1zKTtcbiAgICAgICAgY3R4Lm9uRmluYWxseSA9IG9uRmluYWxseTtcbiAgICAgICAgY3R4Ll8gPSBydW50aW1lO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8YW55PiA9IHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgY29uc3QgbWV0YSA9IChtb2R1bGU/Lm1ldGEgPyBtb2R1bGU/Lm1ldGEgOiB7fSkgYXMgdW5rbm93biBhcyBSZWFkb25seTwkbWV0YT47XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGV4dC5odHRwPy5yZXF1ZXN0Py5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dNZXRob2RzID0gbWV0YT8ubWV0aG9kcyA/PyBbXCJQT1NUXCJdO1xuICAgICAgICAgICAgaWYgKCFhbGxvd01ldGhvZHMuaW5jbHVkZXMob3B0aW9ucy5jb250ZXh0Lmh0dHAucmVxdWVzdC5tZXRob2QpKSB0aHJvdyByZWplY3QoXCJNRVRIT0RfTk9UX0FMTE9XRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRhPy50eXBlU2FmZXR5ID09PSB1bmRlZmluZWQgfHwgbWV0YS50eXBlU2FmZXR5ID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KG1ldGEudHlwZVNhZmV0eSkgJiYgbWV0YS50eXBlU2FmZXR5LmluY2x1ZGVzKFwicGFyYW1zXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zKHBhcmFtcykgYXMgSVZhbGlkYXRpb248YW55PjtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi4odmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5wYXRofScgaXMgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCByZWplY3QgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRzLnZhbHVlID0gYXdhaXQgbW9kdWxlLmhhbmRsZXIob3B0aW9ucy5jb250ZXh0LCBwYXJhbXMpO1xuXG4gICAgICAgIGxldCBlbXB0eVJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAocmVzdWx0cy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdHMudmFsdWUgPT09IG51bGwgfHwgcmVzdWx0cy52YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgZW1wdHlSZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgcmVzdWx0cy52YWx1ZSA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0cy52YWx1ZSkgfHwgdHlwZW9mIHJlc3VsdHMudmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IHJlamVjdChcIlJFUVVFU1RfRkFJTFwiLCBcIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlIGFuICdvYmplY3QnLCB3aGljaCBpcyBjdXJyZW50bHkgYW4gJyR7dHlwZW9mIHR5cGVvZiByZXN1bHRzLnZhbHVlfScuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdHNUeXBlU2FmZXR5ID0gZmFsc2U7XG4gICAgICAgIGlmICghZW1wdHlSZXN1bHQgJiYgdHlwZSA9PT0gXCJhY3Rpb25cIiAmJiAoXG4gICAgICAgICAgICAvLyBUZW1wb3Jhcnk6IHR5cGUtc2FmZSBkZWZhdWx0IGlzIGZhbHNlIGFuZCB0aGlzIHNldHRpbmcgc2hvdWxkIG5vdCBiZSBleHBvc2VkIHRvIHVzZXJzXG4gICAgICAgICAgICAvLyBEdWUgdG8gY3VycmVudCBpc3N1ZXMgd2l0aCB0eXBpYSwgdHlwZSBzYWZldHkgY2Fubm90IGJlIGFjaGlldmVkIGF0IHRoZSBtb21lbnRcbiAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgdGhlIG5leHQgbGluZSBvZiBjb2RlIGlzIGN1cnJlbnRseSBjb21tZW50ZWQgb3V0XG4gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIE1pbGtpbyBpcyB1c2luZyB0cmFkaXRpb25hbCBKU09OLnN0cmluZ2lmeSBmb3IgcmVzdWx0IHNlcmlhbGl6YXRpb25cbiAgICAgICAgICAgIC8vIG1ldGE/LnR5cGVTYWZldHkgPT09IHVuZGVmaW5lZCB8fCBcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1ldGEudHlwZVNhZmV0eSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShtZXRhLnR5cGVTYWZldHkpICYmIG1ldGEudHlwZVNhZmV0eS5pbmNsdWRlcyhcInJlc3VsdHNcIikpKSkge1xuICAgICAgICAgICAgcmVzdWx0c1R5cGVTYWZldHkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUmVzdWx0cyhyZXN1bHRzLnZhbHVlKSBhcyBJVmFsaWRhdGlvbjxhbnk+O1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHRocm93IHJlamVjdChcIlJFU1VMVFNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi4odmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5wYXRofScgaXMgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiKSA/PyB0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUFmdGVyXCIsIHsgZXhlY3V0ZUlkOiBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQsIGxvZ2dlcjogb3B0aW9ucy5jcmVhdGVkTG9nZ2VyLCBwYXRoOiBvcHRpb25zLnBhdGgsIG1ldGEsIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCwgcmVzdWx0cywgcmVqZWN0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZXhlY3V0ZUlkLCBoZWFkZXJzLCBwYXJhbXMsIHJlc3VsdHMsIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCwgbWV0YSwgdHlwZSwgZW1wdHlSZXN1bHQsIHJlc3VsdHNUeXBlU2FmZXR5LCBmaW5hbGVzIH07XG4gICAgfTtcblxuICAgIGNvbnN0IF9fY2FsbCA9IGFzeW5jIChjb250ZXh0OiAkY29udGV4dCwgbW9kdWxlOiB7IG1ldGE6IGFueSwgaGFuZGxlcjogYW55IH0sIHBhcmFtcz86IGFueSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIGNvbnN0IG1vZHVsZUF3YWl0ZWQgPSBhd2FpdCBtb2R1bGU7XG4gICAgICAgIHJldHVybiBhd2FpdCBtb2R1bGVBd2FpdGVkLmhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgX19jYWxsLFxuICAgICAgICBfX2V4ZWN1dGUsXG4gICAgfTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgJGNvbnRleHQsIENvbnRleHRIdHRwLCBSZXN1bHRzLCBMb2dnZXIsICRtZXRhIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJGV2ZW50cyB7XG4gICAgXCIqXCI6IHsga2V5OiBrZXlvZiAkZXZlbnRzLCB2YWx1ZTogYW55IH07XG4gICAgXCJtaWxraW86aHR0cFJlcXVlc3RcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj4gfTtcbiAgICBcIm1pbGtpbzpodHRwUmVzcG9uc2VcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj47IGNvbnRleHQ6ICRjb250ZXh0OyBzdWNjZXNzOiBib29sZWFuIH07XG4gICAgXCJtaWxraW86aHR0cE5vdEZvdW5kXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IGh0dHA6IENvbnRleHRIdHRwPFJlY29yZDxzdHJpbmcsIGFueT4+IH07XG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQgfTtcbiAgICBcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0OyByZXN1bHRzOiBSZXN1bHRzPGFueT4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV2ZW50TWFuYWdlcigpIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXA8KGV2ZW50OiBhbnkpID0+IHZvaWQsIHN0cmluZz4oKTtcbiAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4gfCB2b2lkIHwgYm9vbGVhbj4+KCk7XG4gICAgbGV0IF92ZXJzaW9uID0gMDtcblxuICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IHtcbiAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiAkZXZlbnRzW0tleV0pID0+IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHwgdm9pZCB8IGJvb2xlYW4+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBfdmVyc2lvbisrO1xuICAgICAgICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKCcqJykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZWQuc2V0KCcqJywgbmV3IFNldCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRTZXQgPSBpbmRleGVkLmdldCgnKicpITtcbiAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5hZGQoaGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleGVkLmhhcyhrZXkgYXMgc3RyaW5nKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5zZXQoa2V5IGFzIHN0cmluZywgbmV3IFNldCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZykhO1xuICAgICAgICAgICAgICAgIHNldC5hZGQoaGFuZGxlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWxkY2FyZFNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmRTZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiAkZXZlbnRzW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBfdmVyc2lvbisrO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRTZXQgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgICAgIGlmICghd2lsZGNhcmRTZXQpIHJldHVybjtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgd2lsZGNhcmRTZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbWl0OiA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgaWYgKCF3aWxkY2FyZEhhbmRsZXJzICYmICFoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzICYmIGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHdpbGRjYXJkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoeyBrZXksIHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoISkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9LFxuICAgICAgICBfaGFzRW1pdEhhbmRsZXJzOiAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleGVkLmhhcyhrZXkpIHx8IGluZGV4ZWQuaGFzKCcqJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBfdmVyc2lvbigpIHsgcmV0dXJuIF92ZXJzaW9uOyB9LFxuICAgICAgICBlbWl0QW55QXBwcm92ZWQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICBsZXQgYWNjZXB0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHdpbGRjYXJkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IGhhbmRsZXIodmFsdWUpKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY2VwdGVkO1xuICAgICAgICB9LFxuICAgICAgICBlbWl0QWxsQXBwcm92ZWQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICBsZXQgYXBwcm92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHdpbGRjYXJkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygd2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IGhhbmRsZXIoeyBrZXksIHZhbHVlIH0pKSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IGhhbmRsZXIodmFsdWUpKSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcHByb3ZlZDtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvRmxvdzxULCBUUmV0dXJuID0gYW55LCBUTmV4dCA9IGFueT4gPSB7XG4gIGVtaXQ6IChmbG93OiBUKSA9PiB2b2lkO1xuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBNaWxraW9GbG93PFQ+O1xuICBuZXh0KC4uLlt2YWx1ZV06IFtdIHwgW1ROZXh0XSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xuICByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XG4gIHRocm93KGVycm9yOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG93PFQ+KCk6IE1pbGtpb0Zsb3c8VD4ge1xuICBsZXQgc3RhdHVzOiBcInBlbmRpbmdcIiB8IFwicmVzb2x2ZWRcIiB8IFwicmVqZWN0ZWRcIiA9IFwicGVuZGluZ1wiO1xuICBjb25zdCBmbG93czogQXJyYXk8e1xuICAgIGJsYW5rOiBib29sZWFuO1xuICAgIHByb21pc2U6IFByb21pc2U8VD47XG4gICAgcmVzb2x2ZTogKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAgIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgfT4gPSBbXTtcblxuICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICBlbWl0OiAoZmxvdzogVCkgPT4ge1xuICAgICAgaWYgKGZsb3dzLmF0KC0xKT8uYmxhbmsgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGZsb3dzLmF0KC0xKSE7XG4gICAgICAgIGl0ZW0uYmxhbmsgPSBmYWxzZTtcbiAgICAgICAgaXRlbS5yZXNvbHZlKGZsb3cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZmxvdyk7XG4gICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAuLi4oe1xuICAgICAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgIGlmIChzdGF0dXMgIT09IFwicGVuZGluZ1wiKSByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XG4gICAgICAgICAgZmxvd3MucHVzaCh7IC4uLnJlc29sdmVycywgYmxhbms6IHRydWUgfSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsb3cgPSBmbG93cy5hdCgwKSE7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZsb3cucHJvbWlzZTtcbiAgICAgICAgZmxvd3Muc2hpZnQoKTtcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogc3RhdHVzICE9PSBcInBlbmRpbmdcIiwgdmFsdWU6IHJlc3VsdCB9O1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgIHN0YXR1cyA9IFwicmVzb2x2ZWRcIjtcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xuICAgICAgICAgIGZsb3cucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgIHN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICBmbG93LmJsYW5rID0gZmFsc2U7XG4gICAgICAgICAgZmxvdy5yZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgfSxcbiAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gaXRlcmF0b3IgYXMgTWlsa2lvRmxvdzxUPjtcbn1cbiIsCiAgICAiY29uc3QgRU5DT0RJTkcgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG5jb25zdCBFTkNPRElOR19MRU4gPSBFTkNPRElORy5sZW5ndGg7XG5cbmxldCBfX2Zhc3RJZFBvb2wgPSBuZXcgVWludDhBcnJheSgyNTYpO1xubGV0IF9fZmFzdElkUG9vbEluZGV4ID0gMjU2O1xubGV0IF9fZmFzdElkQ291bnRlciA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NyZWF0ZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKF9fZmFzdElkUG9vbEluZGV4ICsgMTYgPiAyNTYpIHtcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhfX2Zhc3RJZFBvb2wpO1xuICAgICAgICBfX2Zhc3RJZFBvb2xJbmRleCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gQXJyYXkuZnJvbTxzdHJpbmc+KHsgbGVuZ3RoOiAyNCB9KTtcbiAgICAvLyDliY0gOCDlrZfnrKY6IOaXtumXtOaIsyBiYXNlNjLvvIjlkIzkuIDmr6vnp5LlhoXnm7jlkIzvvIznlLHlkI7nu60gY291bnRlciDljLrliIbvvIlcbiAgICBjb25zdCB0cyA9IF9fYmlnSW50VG9TdHJpbmcoQmlnSW50KERhdGUubm93KCkpKS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgaWRbaV0gPSB0c1tpXTtcbiAgICB9XG4gICAgLy8g5Lit6Ze0IDYg5a2X56ymOiDnuq/pmo/mnLpcbiAgICBmb3IgKGxldCBpID0gODsgaSA8IDE0OyBpKyspIHtcbiAgICAgICAgaWRbaV0gPSBFTkNPRElOR1tfX2Zhc3RJZFBvb2xbX19mYXN0SWRQb29sSW5kZXgrK10gJSBFTkNPRElOR19MRU5dO1xuICAgIH1cbiAgICAvLyDlkI4gMTAg5a2X56ymOiDorqHmlbDlmaggKyDpmo/mnLrmt7flkIhcbiAgICBjb25zdCBjb3VudGVyID0gX19mYXN0SWRDb3VudGVyKys7XG4gICAgZm9yIChsZXQgaSA9IDE0OyBpIDwgMjQ7IGkrKykge1xuICAgICAgICBjb25zdCBtaXggPSAoY291bnRlciArIF9fZmFzdElkUG9vbFtfX2Zhc3RJZFBvb2xJbmRleCsrICUgMjU2XSkgJiAweEZGRkY7XG4gICAgICAgIGlkW2ldID0gRU5DT0RJTkdbbWl4ICUgRU5DT0RJTkdfTEVOXTtcbiAgICB9XG4gICAgcmV0dXJuIGlkLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIF9fYmlnSW50VG9TdHJpbmcodmFsdWU6IGJpZ2ludCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElOR19MRU4pO1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGxldCBjdXJyZW50ID0gdmFsdWU7XG5cbiAgICBpZiAoY3VycmVudCA9PT0gMG4pIHJldHVybiBFTkNPRElOR1swXTtcblxuICAgIHdoaWxlIChjdXJyZW50ID4gMG4pIHtcbiAgICAgICAgY29uc3QgcmVtYWluZGVyID0gY3VycmVudCAlIGJhc2U7XG4gICAgICAgIHJlc3VsdCA9IEVOQ09ESU5HW051bWJlcihyZW1haW5kZXIpXSArIHJlc3VsdDtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgLyBiYXNlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICJpbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuXG5leHBvcnQgdHlwZSBFeGVjdXRlSWRHZW5lcmF0b3IgPSAoaGVhZGVycz86IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IoKSB7XG4gIHJldHVybiBfX2NyZWF0ZUlkO1xufVxuIiwKICAgICJpbXBvcnQgeyB0eXBlICR0eXBlcywgX19pbml0TGlzdGVuZXIsIF9faW5pdEV4ZWN1dGVyLCBfX2luaXRFdmVudE1hbmFnZXIsIHR5cGUgRXhlY3V0ZUlkLCB0eXBlIExvZ2dlciwgdHlwZSBNaXhpbiwgdHlwZSBHZW5lcmF0ZWRJbml0LCB0eXBlIFBpbmcsIHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIsIHR5cGUgTG9nZ2VySW5zZXJ0aW5nSGFuZGxlciwgdHlwZSBDb3JzQ29uZmlnIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGUvZXhlY3V0ZS1pZC1nZW5lcmF0b3IudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Jbml0IHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgZGV2ZWxvcDogYm9vbGVhbjtcbiAgICBmZXRjaEVudj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGFjY2Vzc0tleT86IHN0cmluZztcbiAgICBodHRwPzoge1xuICAgICAgICBjb3JzPzogQ29yc0NvbmZpZztcbiAgICB9O1xuICAgIGlnbm9yZVBhdGhMZXZlbD86IG51bWJlcjtcbiAgICByZWFsSXA/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nO1xuICAgIGV4ZWN1dGVJZD86IChoZWFkZXJzOiBIZWFkZXJzKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gICAgb25Mb2dnZXJTdWJtaXR0aW5nPzogTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXI7XG4gICAgb25Mb2dnZXJJbnNlcnRpbmc/OiBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyO1xuICAgIGJvb3RzdHJhcHM/OiBBcnJheTwod29ybGQ6IGFueSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBNaWxraW9SdW50aW1lSW5pdDxUIGV4dGVuZHMgTWlsa2lvSW5pdD4gPSBNaXhpbjxcbiAgICBULFxuICAgIHtcbiAgICAgICAgZXhlY3V0ZUlkOiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgICBydW50aW1lOiB7XG4gICAgICAgICAgICByZXF1ZXN0OiBNYXA8RXhlY3V0ZUlkLCB7IGxvZ2dlcjogTG9nZ2VyIH0+O1xuICAgICAgICAgICAgY29uZmlnOiBBd2FpdGVkPFJldHVyblR5cGU8JHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wiY29uZmlnU2NoZW1hXCJdPj47XG4gICAgICAgICAgICBhcHA6IGFueTtcbiAgICAgICAgfTtcbiAgICAgICAgb246IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvblwiXTtcbiAgICAgICAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xuICAgICAgICBlbWl0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdFwiXTtcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdEFueUFwcHJvdmVkXCJdO1xuICAgICAgICBlbWl0QWxsQXBwcm92ZWQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0QWxsQXBwcm92ZWRcIl07XG4gICAgICAgIF9oYXNFbWl0SGFuZGxlcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJfaGFzRW1pdEhhbmRsZXJzXCJdO1xuICAgICAgICBfZW1pdEhhbmRsZXJzVmVyc2lvbjogbnVtYmVyO1xuICAgIH1cbj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVXb3JsZDxNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdD4oZ2VuZXJhdGVkOiBHZW5lcmF0ZWRJbml0LCBjb25maWdTY2hlbWE6IHsgZ2V0OiAoKSA9PiBQcm9taXNlPFJlY29yZDxhbnksIGFueT4+IH0sIG9wdGlvbnM6IE1pbGtpb09wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBleGVjdXRlSWQgPSBvcHRpb25zLmV4ZWN1dGVJZCA/PyBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCk7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnU2NoZW1hLmdldCgpO1xuXG4gICAgY29uc3QgcnVudGltZSA9IHtcbiAgICAgICAgcmVxdWVzdDogbmV3IE1hcCgpLFxuICAgICAgICBjb25maWcsXG4gICAgfSBhcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPltcInJ1bnRpbWVcIl07XG5cbiAgICBjb25zdCBldmVudE1hbmFnZXIgPSBfX2luaXRFdmVudE1hbmFnZXIoKTtcblxuICAgIGlmIChvcHRpb25zLmFjY2Vzc0tleSkgb3B0aW9ucy5pZ25vcmVQYXRoTGV2ZWwgPSBvcHRpb25zLmlnbm9yZVBhdGhMZXZlbCA/IG9wdGlvbnMuaWdub3JlUGF0aExldmVsICsgMSA6IDE7XG5cbiAgICBjb25zdCBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZXhlY3V0ZUlkLFxuICAgICAgICBydW50aW1lLFxuICAgICAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxuICAgICAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgICAgIGVtaXQ6IGV2ZW50TWFuYWdlci5lbWl0LFxuICAgICAgICBlbWl0QW55QXBwcm92ZWQ6IGV2ZW50TWFuYWdlci5lbWl0QW55QXBwcm92ZWQsXG4gICAgICAgIGVtaXRBbGxBcHByb3ZlZDogZXZlbnRNYW5hZ2VyLmVtaXRBbGxBcHByb3ZlZCxcbiAgICAgICAgX2hhc0VtaXRIYW5kbGVyczogZXZlbnRNYW5hZ2VyLl9oYXNFbWl0SGFuZGxlcnMsXG4gICAgICAgIF9lbWl0SGFuZGxlcnNWZXJzaW9uOiBldmVudE1hbmFnZXIuX3ZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVyID0gX19pbml0RXhlY3V0ZXIoZ2VuZXJhdGVkLCBfKTtcbiAgICBjb25zdCBsaXN0ZW5lciA9IF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZCwgXywgZXhlY3V0ZXIpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXBwXG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICAgIF8sXG4gICAgICAgIC8vIGV2ZW50IG1hbmFnZXJcbiAgICAgICAgb246IGV2ZW50TWFuYWdlci5vbixcbiAgICAgICAgb2ZmOiBldmVudE1hbmFnZXIub2ZmLFxuICAgICAgICBlbWl0OiBldmVudE1hbmFnZXIuZW1pdCxcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBldmVudE1hbmFnZXIuZW1pdEFueUFwcHJvdmVkLFxuICAgICAgICBlbWl0QWxsQXBwcm92ZWQ6IGV2ZW50TWFuYWdlci5lbWl0QWxsQXBwcm92ZWQsXG4gICAgICAgIC8vIGxpc3RlbmVyXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAvLyBmdW5jdGlvblxuICAgICAgICBjb25maWcsXG4gICAgfTtcblxuICAgIHJ1bnRpbWUuYXBwID0gd29ybGQ7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmJvb3RzdHJhcHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgYm9vdHN0cmFwIG9mIG9wdGlvbnMuYm9vdHN0cmFwcykge1xuICAgICAgICAgICAgYXdhaXQgYm9vdHN0cmFwKHdvcmxkIGFzIE1pbGtpb1dvcmxkPEdlbmVyYXRlZEluaXQsIE1pbGtpb09wdGlvbnM+KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGdlbmVyYXRlZC5oYW5kbGVyU2NoZW1hLmxvYWRIYW5kbGVycyh3b3JsZCkpO1xuXG4gICAgY29uc3Qgcm91dGVLZXlzID0gT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnJvdXRlU2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAgIGNvbnNvbGUubG9nKGBcXG7ilrMgUm91dGVzOlxcbiAgICAke3JvdXRlS2V5cy5qb2luKFwiXFxuICAgIFwiKX1cXG4gIEEgdG90YWwgb2YgJHtyb3V0ZUtleXMubGVuZ3RofSByb3V0ZXMuYCk7XG4gICAgY29uc29sZS5sb2coYFxcbuKWsyBTZXJ2ZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCk7XG5cbiAgICByZXR1cm4gd29ybGQgYXMgdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Xb3JsZDxHZW5lcmF0ZWQgZXh0ZW5kcyBHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdCA9IE1pbGtpb0luaXQ+IHtcbiAgICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcbiAgICAvLyBldmVudCBtYW5hZ2VyXG4gICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6IEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4gKCgpID0+IHZvaWQpO1xuICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgSGFuZGxlciBleHRlbmRzIChldmVudDogR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB2b2lkO1xuICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIFZhbHVlIGV4dGVuZHMgR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpID0+IFByb21pc2U8dm9pZD47XG4gICAgZW1pdEFueUFwcHJvdmVkOiA8S2V5IGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wiZXZlbnRzXCJdLCBWYWx1ZSBleHRlbmRzIEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGVtaXRBbGxBcHByb3ZlZDogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBwaW5nOiAob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KSA9PiBQcm9taXNlPFBpbmc+O1xuICAgIC8vIGxpc3RlbmVyXG4gICAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcbiAgICBjb25maWc6IFJlYWRvbmx5PEF3YWl0ZWQ8UmV0dXJuVHlwZTwkdHlwZXNbXCJjb25maWdTY2hlbWFcIl1bXCJnZXRcIl0+Pj47XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiB0eXBpYTxUeXBpYUluaXRUIGV4dGVuZHMgVHlwaWFJbml0Pihpbml0OiBUeXBpYUluaXRUKTogVHlwaWE8VHlwaWFJbml0VD4ge1xuICByZXR1cm4gaW5pdCBhcyB1bmtub3duIGFzIFR5cGlhPFR5cGlhSW5pdFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUeXBpYUluaXQgPSAoKSA9PiBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IHwgUHJvbWlzZTxSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+PjtcblxuZXhwb3J0IHR5cGUgVHlwaWE8VHlwaWFJbml0VCBleHRlbmRzIFR5cGlhSW5pdD4gPSBUeXBpYUluaXRUO1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuaW50ZXJmYWNlIENvb2tib29rRXZlbnQge1xuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcbiAgbG9nOiBMb2c7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0PiwgZXZlbnQ6IENvb2tib29rRXZlbnQpIHtcbiAgLy8gdHJ5IHtcbiAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XG4gIC8vICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAvLyAgICAgaGVhZGVyczoge1xuICAvLyAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgLy8gICAgIH0sXG4gIC8vICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudCksXG4gIC8vICAgfSk7XG4gIC8vICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAvLyAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gIC8vICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICAvLyAgIH1cbiAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xuICAvLyAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBcIklzIENvb2tib29rIGNsb3NlZD8gVGhlcmUgaXMgYW4gYWJub3JtYWxpdHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCBDb29rYm9vay5cIik7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IHNlbmRDb29rYm9va0V2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHNcIjtcblxuZXhwb3J0IHR5cGUgTG9nID0gW1wiKGRlYnVnKVwiIHwgXCIoaW5mbylcIiB8IFwiKHdhcm4pXCIgfCBcIihlcnJvcilcIiB8IFwiKHJlcXVlc3QpXCIgfCBcIihyZXNwb25zZSlcIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgXzoge1xuICAgICAgICBsb2dzOiBBcnJheTxMb2c+O1xuICAgICAgICB0YWdzOiBNYXA8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIH07XG4gICAgc2V0VGFnOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xuICAgIGRlYnVnOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIGluZm86IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gICAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICBlcnJvcjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICByZXF1ZXN0OiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciA9IChjb250ZXh0OiAkY29udGV4dCwgbG9nczogQXJyYXk8TG9nPiwgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5mdW5jdGlvbiBmYXN0VGltZXN0YW1wKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGAoJHtkLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0tJHtTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtTdHJpbmcoZC5nZXRIb3VycygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCBcIjBcIil9KWA7XG59XG5cbi8vIFByZS1jcmVhdGVkIGRlZmF1bHQgaW5zZXJ0aW5nIGhhbmRsZXIgLSBzaGFyZWQgYWNyb3NzIGFsbCBsb2dnZXJzXG5jb25zdCBkZWZhdWx0SW5zZXJ0aW5nID0gKGxvZzogTG9nKTogYm9vbGVhbiA9PiB7XG4gICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xuICAgIGNvbnNvbGUubG9nKC4uLmxvZyk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyPE1pbGtpb1J1bnRpbWUgZXh0ZW5kcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4gPSBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4ocnVudGltZTogTWlsa2lvUnVudGltZSwgcGF0aDogc3RyaW5nLCBleGVjdXRlSWQ6IHN0cmluZyk6IExvZ2dlciB7XG4gICAgY29uc3QgbG9nZ2VyID0ge30gYXMgTG9nZ2VyO1xuXG4gICAgY29uc3QgbG9nczogQXJyYXk8TG9nPiA9IFtdO1xuICAgIGNvbnN0IHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZyB8fCBkZWZhdWx0SW5zZXJ0aW5nO1xuICAgIGNvbnN0IGhhc1N1Ym1pdHRpbmcgPSAhIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nO1xuICAgIGNvbnN0IGlzRGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcblxuICAgIGxvZ2dlci5fID0ge1xuICAgICAgICBsb2dzLFxuICAgICAgICB0YWdzLFxuICAgICAgICBzdWJtaXQ6IChjb250ZXh0OiAkY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZykgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nKGNvbnRleHQsIGxvZ3MsIHRhZ3MpO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBfX3RhZ1B1c2ggPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAgIHRhZ3Muc2V0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgY29uc3QgX19sb2dQdXNoID0gKGxvZzogTG9nKTogTG9nID0+IHtcbiAgICAgICAgaWYgKCFpbnNlcnRpbmcobG9nKSkgcmV0dXJuIGxvZztcbiAgICAgICAgaWYgKGhhc1N1Ym1pdHRpbmcpIGxvZ3MucHVzaChbLi4ubG9nXSk7XG4gICAgICAgIGlmIChpc0RldmVsb3ApIHZvaWQgc2VuZENvb2tib29rRXZlbnQocnVudGltZSwgeyB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIiwgbG9nIH0pO1xuICAgICAgICByZXR1cm4gbG9nO1xuICAgIH07XG5cbiAgICBsb2dnZXIuc2V0VGFnID0gX190YWdQdXNoO1xuICAgIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xuXG4gICAgY29uc3QgZ2V0Tm93ID0gZmFzdFRpbWVzdGFtcDtcblxuICAgIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGRlYnVnKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgICBsb2dnZXIuaW5mbyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGluZm8pXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci53YXJuID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIod2FybilcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoZXJyb3IpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci5yZXF1ZXN0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVxdWVzdClcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLnJlc3BvbnNlID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVzcG9uc2UpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuXG4gICAgcmV0dXJuIGxvZ2dlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XG4gIHN0ZXA6IFN0ZXBGdW5jdGlvbjxTdGFnZVQ+O1xuICBydW46ICgpID0+IFByb21pc2U8UmVtb3ZlXzxTdGFnZVQ+Pjtcbn1cblxudHlwZSBSZW1vdmVfPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xufTtcblxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+ID0gPEhhbmRsZXJUIGV4dGVuZHMgKHN0YWdlOiBSZWFkb25seTxTdGFnZVQ+KSA9PiBSZWNvcmQ8YW55LCBhbnk+IHwgUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+Pj4oaGFuZGxlcjogSGFuZGxlclQpID0+IFN0ZXBzPEF3YWl0ZWQ8U3RhZ2VUPiAmIFRvRW1wdHlPYmplY3Q8QXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXJUPj4+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoKTogU3RlcHM8e30+IHtcbiAgY29uc3Qgc3RlcENvbnRyb2xsZXIgPSB7XG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxuICAgIF9zdGVwczogW10gYXMgQXJyYXk8KHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pj4sXG4gICAgc3RlcChoYW5kbGVyOiAoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcbiAgICAgIHJldHVybiBzdGVwQ29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIGxldCBzdGFnZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBDb250cm9sbGVyLl9zdGVwcykge1xuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoc3RhZ2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX1wiKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN0ZXBDb250cm9sbGVyIGFzIGFueSBhcyBTdGVwczx7fT47XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcbiAgICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xuICAgIHByaXZhdGUgY2FjaGU6IE1hcDxzdHJpbmcsIFQgfCBudWxsPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBuZXcgVHJpZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBhZGQocGF0aDogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnROb2RlLnZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEJ5UGFydHMocGFydHM6IHN0cmluZ1tdKTogVCB8IG51bGwge1xuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS5jaGlsZHJlbi5oYXMocGFydCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBoYXMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChwYXRoKSAhPT0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIFRyaWVOb2RlPFQ+IHtcbiAgICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xuICAgIHZhbHVlOiBUIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29yc0NvbmZpZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb3JzSGVhZGVycyhjb3JzOiBDb3JzQ29uZmlnIHwgdW5kZWZpbmVkLCBvcmlnaW4/OiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd01ldGhvZHMpIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIl0gPSBjb3JzLmNvcnNBbGxvd01ldGhvZHMuam9pbihcIiwgXCIpO1xuICAgIGlmIChjb3JzPy5jb3JzQWxsb3dIZWFkZXJzKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCJdID0gY29ycy5jb3JzQWxsb3dIZWFkZXJzLmpvaW4oXCIsIFwiKTtcbiAgICBpZiAoY29ycz8uY29yc01heEFnZSAhPT0gdW5kZWZpbmVkKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlXCJdID0gU3RyaW5nKGNvcnMuY29yc01heEFnZSk7XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd09yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGlzV2lsZGNhcmQgPSBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhcIipcIik7XG4gICAgICAgIGlmIChjb3JzLmNvcnNBbGxvd0NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNyZWRlbnRpYWxzOiB0cnVlLCB0aGUgc3BlYyBmb3JiaWRzIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKi5cbiAgICAgICAgICAgIC8vIEVjaG8gdGhlIHJlcXVlc3Qgb3JpZ2luIGluc3RlYWQgKHdpbGRjYXJkIG1lYW5zIFwiYWxsb3cgYW55IG9yaWdpblwiKS5cbiAgICAgICAgICAgIGlmIChvcmlnaW4gJiYgKGlzV2lsZGNhcmQgfHwgY29ycy5jb3JzQWxsb3dPcmlnaW4uaW5jbHVkZXMob3JpZ2luKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIl0gPSBvcmlnaW47XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiVmFyeVwiXSA9IFwiT3JpZ2luXCI7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIl0gPSBcInRydWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1dpbGRjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gXCIqXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhvcmlnaW4pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gb3JpZ2luO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtcIlZhcnlcIl0gPSBcIk9yaWdpblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb3JzPy5jb3JzRXhwb3NlSGVhZGVycyAmJiBjb3JzLmNvcnNFeHBvc2VIZWFkZXJzLmxlbmd0aCA+IDApIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzXCJdID0gY29ycy5jb3JzRXhwb3NlSGVhZGVycy5qb2luKFwiLCBcIik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0iLAogICAgImltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXhjZXB0aW9uSGFuZGxlciwgcmVqZWN0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1peGluLCBHZW5lcmF0ZWRJbml0LCAkdHlwZXMsIENvbnRleHRIdHRwLCBNaWxraW9SZXNwb25zZVJlamVjdCwgUmVzdWx0cywgTWlsa2lvUmVzcG9uc2VTdWNjZXNzLCBDb3JzQ29uZmlnLCBMb2dnZXIsIExvZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyBfX2luaXRFeGVjdXRlciB9IGZyb20gXCIuLi9leGVjdXRlL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuaW1wb3J0IHsgVHJpZSB9IGZyb20gXCIuLi91dGlscy90cmllLnRzXCI7XG5pbXBvcnQgeyBidWlsZENvcnNIZWFkZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2J1aWxkLWNvcnMtaGVhZGVycy50c1wiO1xuaW1wb3J0IHsgcmV2aXZlSlNPTlBhcnNlIH0gZnJvbSBcIi4uL3V0aWxzL3Jldml2ZS1qc29uLXBhcnNlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb0h0dHBSZXF1ZXN0ID0gUmVxdWVzdDtcblxuZXhwb3J0IHR5cGUgTWlsa2lvSHR0cFJlc3BvbnNlID0gTWl4aW48XG4gICAgUmVzcG9uc2VJbml0LFxuICAgIHtcbiAgICAgICAgYm9keTogc3RyaW5nIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBCbG9iIHwgbnVsbDtcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgfVxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55LCBleGVjdXRlcjogUmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXhlY3V0ZXI+KSB7XG4gICAgY29uc3QgcG9ydCA9IHJ1bnRpbWUucG9ydDtcbiAgICBjb25zdCB0cmllID0gbmV3IFRyaWU8YW55PigpO1xuICAgIC8vIFByZS1jb21wdXRlIGRlZmF1bHQgQ09SUyBjb25maWcgYW5kIGNhY2hlIGhlYWRlcnMgcGVyIG9yaWdpblxuICAgIGNvbnN0IGNvcnM6IENvcnNDb25maWcgPSB7IGNvcnNBbGxvd01ldGhvZHM6IFtcIlBPU1RcIiwgXCJPUFRJT05TXCJdLCBjb3JzQWxsb3dIZWFkZXJzOiBbXCJDb250ZW50LVR5cGVcIiwgXCJBdXRob3JpemF0aW9uXCJdLCBjb3JzTWF4QWdlOiAwLCAuLi5ydW50aW1lLmh0dHA/LmNvcnMgfTtcbiAgICBjb25zdCBjb3JzSGVhZGVyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgY29uc3QgZ2V0Q29yc0hlYWRlcnMgPSAob3JpZ2luOiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IG9yaWdpbiA/PyBcIlwiO1xuICAgICAgICBsZXQgY2FjaGVkID0gY29yc0hlYWRlcnNDYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICBjYWNoZWQgPSBidWlsZENvcnNIZWFkZXJzKGNvcnMsIG9yaWdpbik7XG4gICAgICAgIGNvcnNIZWFkZXJzQ2FjaGUuc2V0KGtleSwgY2FjaGVkKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9O1xuICAgIC8vIFByZS1jb21wdXRlIGRlZmF1bHQgcmVzcG9uc2UgaGVhZGVycyAod2l0aG91dCBvcmlnaW4tc3BlY2lmaWMgQ09SUylcbiAgICBjb25zdCBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1zdG9yZVwiLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICB9O1xuICAgIC8vIFByZS1jb21wdXRlIG1lcmdlZCBoZWFkZXJzIGZvciBudWxsIG9yaWdpbiAobW9zdCBjb21tb24gY2FzZSlcbiAgICBjb25zdCBkZWZhdWx0TWVyZ2VkSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgLi4uZ2V0Q29yc0hlYWRlcnMobnVsbCksIC4uLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMgfTtcblxuICAgIC8vIFByZS1hbGxvY2F0ZSByZXNwb25zZSB0ZW1wbGF0ZSBwYXJ0cyBmb3IgRmFzdCBQYXRoXG4gICAgY29uc3QgZW1wdHlSZXN1bHRQcmVmaXggPSAne1wiZGF0YVwiOnt9LFwiZXhlY3V0ZUlkXCI6XCInO1xuICAgIGNvbnN0IHJlc3VsdFByZWZpeCA9ICd7XCJkYXRhXCI6JztcbiAgICBjb25zdCBpZFN1ZmZpeCA9ICdcIixcInN1Y2Nlc3NcIjp0cnVlfSc7XG4gICAgLy8gU2hhcmVkIHJlc3BvbnNlIG9iamVjdCBmb3IgRmFzdCBQYXRoIChoYW5kbGVyIHJldHVybnMgcmVzdWx0IGRpcmVjdGx5LCBuZXZlciBtb2RpZmllcyByZXNwb25zZSlcbiAgICBjb25zdCBmYXN0UGF0aFJlc3BvbnNlID0geyBib2R5OiBcIlwiLCBzdGF0dXM6IDIwMCwgaGVhZGVyczogZGVmYXVsdE1lcmdlZEhlYWRlcnMgfTtcblxuICAgIC8vIER5bmFtaWMgY2hlY2sgZm9yIGV2ZW50IGhhbmRsZXJzIHdpdGggdmVyc2lvbi1iYXNlZCBjYWNoaW5nXG4gICAgbGV0IGNhY2hlZE5vRW1pdEhhbmRsZXJzID0gdHJ1ZTtcbiAgICBsZXQgbGFzdEVtaXRIYW5kbGVyc1ZlcnNpb24gPSAtMTtcbiAgICBjb25zdCBjaGVja05vRW1pdEhhbmRsZXJzID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCB2ID0gcnVudGltZS5fZW1pdEhhbmRsZXJzVmVyc2lvbjtcbiAgICAgICAgaWYgKHYgIT09IGxhc3RFbWl0SGFuZGxlcnNWZXJzaW9uKSB7XG4gICAgICAgICAgICBsYXN0RW1pdEhhbmRsZXJzVmVyc2lvbiA9IHY7XG4gICAgICAgICAgICBjYWNoZWROb0VtaXRIYW5kbGVycyA9XG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIikgJiZcbiAgICAgICAgICAgICAgICAhcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86ZXhlY3V0ZUFmdGVyXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXF1ZXN0XCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXNwb25zZVwiKSAmJlxuICAgICAgICAgICAgICAgICFydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwTm90Rm91bmRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZE5vRW1pdEhhbmRsZXJzO1xuICAgIH07XG4gICAgY29uc3QgaGFzT25Mb2dnZXJTdWJtaXR0aW5nID0gISFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZztcblxuICAgIC8vIFNoYXJlZCBuby1vcCBsb2dnZXIgZm9yIGZhc3QgcGF0aCAodXNlZCB3aGVuIG5vIGV2ZW50IGhhbmRsZXJzKVxuICAgIGNvbnN0IG5vb3BMb2dnZXI6IExvZ2dlciA9IHtcbiAgICAgICAgXzogeyBsb2dzOiBbXSBhcyBhbnksIHRhZ3M6IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpLCBzdWJtaXQ6ICgpID0+IHsgfSB9LFxuICAgICAgICBzZXRUYWc6ICgpID0+IHsgfSxcbiAgICAgICAgc2V0TG9nOiAoLi4uX2xvZzogTG9nKSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgZGVidWc6IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICBpbmZvOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgd2FybjogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIGVycm9yOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgcmVxdWVzdDogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIHJlc3BvbnNlOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICB9O1xuXG4gICAgLy8gUHJlLWNyZWF0ZSBiYXNlIGNvbnRleHQgcHJvdG90eXBlIGZvciBGYXN0IFBhdGggKHNoYXJlZCBpbW11dGFibGUgcHJvcGVydGllcylcbiAgICAvLyBgY2FsbGAgaXMgZGVmaW5lZCBvbiBwcm90b3R5cGUgdG8gYXZvaWQgY3JlYXRpbmcgYSBjbG9zdXJlIHBlciByZXF1ZXN0XG4gICAgY29uc3QgYmFzZUNvbnRleHRQcm90bzogYW55ID0ge1xuICAgICAgICByZWplY3QsXG4gICAgICAgIGRldmVsb3A6IHJ1bnRpbWUuZGV2ZWxvcCxcbiAgICAgICAgbG9nZ2VyOiBub29wTG9nZ2VyLFxuICAgICAgICBlbWl0OiBydW50aW1lLmVtaXQsXG4gICAgICAgIGVtaXRBbnlBcHByb3ZlZDogcnVudGltZS5lbWl0QW55QXBwcm92ZWQsXG4gICAgICAgIGVtaXRBbGxBcHByb3ZlZDogcnVudGltZS5lbWl0QWxsQXBwcm92ZWQsXG4gICAgICAgIGNvbmZpZzogcnVudGltZS5ydW50aW1lLmNvbmZpZyxcbiAgICAgICAgdHlwaWE6IGdlbmVyYXRlZC50eXBpYVNjaGVtYSxcbiAgICAgICAgb25GaW5hbGx5OiAoKSA9PiB7IH0sXG4gICAgICAgIF86IHJ1bnRpbWUsXG4gICAgICAgIGNhbGwobW9kdWxlOiBhbnksIHA6IGFueSkgeyByZXR1cm4gZXhlY3V0ZXIuX19jYWxsKHRoaXMsIG1vZHVsZSwgcCk7IH0sXG4gICAgfTtcblxuICAgIC8vIEhvdCBwYXRoIGNhY2hlOiBwcmUtcmVzb2x2ZSB0aGUgbW9zdCBjb21tb24gcm91dGVcbiAgICBsZXQgY2FjaGVkUm91dGVTY2hlbWE6IGFueSA9IG51bGw7XG4gICAgbGV0IGNhY2hlZFBhdGhTdHJpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIHZhbGlkYXRlUGFyYW1zIGFuZCBoYW5kbGVyIHJlZmVyZW5jZXMgdG8gYXZvaWQgcHJvcGVydHkgbG9va3Vwc1xuICAgIGxldCBjYWNoZWRWYWxpZGF0ZVBhcmFtczogYW55ID0gbnVsbDtcbiAgICBsZXQgY2FjaGVkSGFuZGxlcjogYW55ID0gbnVsbDtcbiAgICBsZXQgY2FjaGVkU2tpcFZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0IGZldGNoID0gYXN5bmMgKG9wdGlvbnM6IHtcbiAgICAgICAgcmVxdWVzdDogTWlsa2lvSHR0cFJlcXVlc3Q7XG4gICAgICAgIGVudk1vZGU/OiBzdHJpbmc7XG4gICAgICAgIGVudj86IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgIHJvdXRlU2NoZW1hPzogYW55O1xuICAgICAgICByYXdSZXNwb25zZT86IGJvb2xlYW47XG4gICAgfSk6IFByb21pc2U8UmVzcG9uc2U+ID0+IHtcbiAgICAgICAgLy8gVXNlIHByZS1wYXNzZWQgb3JpZ2luIGZyb20gYWRhcHRlciB0byBhdm9pZCBoZWFkZXJzLmdldCgpIGNhbGxcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gKG9wdGlvbnMucmVxdWVzdCBhcyBhbnkpLl9fb3JpZ2luID8/IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmdldChcIk9yaWdpblwiKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0Lm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogZ2V0Q29yc0hlYWRlcnMob3JpZ2luKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHByZS1wYXJzZWQgcGF0aG5hbWUgYW5kIHBhdGhBcnJheSBpZiBhdmFpbGFibGUgKGZyb20gYWRhcHRlciksIG90aGVyd2lzZSBwYXJzZVxuICAgICAgICBjb25zdCBwYXRobmFtZSA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX3BhdGhuYW1lID8/IG5ldyBVUkwob3B0aW9ucy5yZXF1ZXN0LnVybCkucGF0aG5hbWU7XG4gICAgICAgIGlmIChwYXRobmFtZS5lbmRzV2l0aChcIi9nZW5lcmF0ZV8yMDRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICAgICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgU2VydmVyOiBcIm1pbGtpb1wiLFxuICAgICAgICAgICAgICAgICAgICAuLi5jb3JzSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogYHRleHQvcGxhaW47IHRpbWU9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlUGF0aEFycmF5ID0gKG9wdGlvbnMucmVxdWVzdCBhcyBhbnkpLl9fcGF0aEFycmF5O1xuICAgICAgICBsZXQgcGF0aFN0cmluZzogc3RyaW5nO1xuICAgICAgICBsZXQgcGF0aEFycmF5OiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKCFydW50aW1lLmFjY2Vzc0tleSAmJiAoIXJ1bnRpbWUuaWdub3JlUGF0aExldmVsIHx8IHJ1bnRpbWUuaWdub3JlUGF0aExldmVsID09PSAwKSkge1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHBhdGhuYW1lO1xuICAgICAgICAgICAgcGF0aEFycmF5ID0gcHJlUGF0aEFycmF5ID8/IHBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoQXJyYXkgPSBwcmVQYXRoQXJyYXkgPz8gcGF0aG5hbWUuc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChydW50aW1lLmFjY2Vzc0tleSAmJiBwYXRoQXJyYXkuYXQoMCkgIT09IHJ1bnRpbWUuYWNjZXNzS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5OiBcIlwiLCBzdGF0dXM6IDQwMywgaGVhZGVyczogY29yc0hlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiA0MDMsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGNvcnNIZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bnRpbWUuaWdub3JlUGF0aExldmVsICE9PSB1bmRlZmluZWQgJiYgcnVudGltZS5pZ25vcmVQYXRoTGV2ZWwgIT09IDApIHBhdGhBcnJheSA9IHBhdGhBcnJheS5zbGljZShydW50aW1lLmlnbm9yZVBhdGhMZXZlbCk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gYC8ke3BhdGhBcnJheS5qb2luKFwiL1wiKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJlLXJlYWQgYm9keSB0ZXh0IGlmIGF2YWlsYWJsZSAoZnJvbSBhZGFwdGVyKSwgb3RoZXJ3aXNlIHVzZSBhc3luYyByZXF1ZXN0LnRleHQoKVxuICAgICAgICBjb25zdCBib2R5VGV4dCA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX2JvZHlUZXh0O1xuICAgICAgICBjb25zdCBpcCA9IHJ1bnRpbWUucmVhbElwID8gcnVudGltZS5yZWFsSXAob3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMpIDogXCI6OjFcIjtcblxuICAgICAgICAvLyDmtYvor5Xnjq/looPkuIvnmoQgJGV2ZW50IOerr+eCue+8mumAmui/hyBiYXNlNjQg57yW56CB55qE5LqL5Lu25ZCN6Kem5Y+R5LqL5Lu2XG4gICAgICAgIGlmIChvcHRpb25zLmVudk1vZGUgPT09IFwidGVzdFwiICYmIHBhdGhTdHJpbmcuc3RhcnRzV2l0aChcIi8kZXZlbnQvXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlNjROYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhTdHJpbmcuc2xpY2UoOCkpO1xuICAgICAgICAgICAgbGV0IGV2ZW50TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyDlhbzlrrnkuI3lkIzov5DooYzml7bvvJrkvJjlhYjkvb/nlKggYXRvYu+8jOWbnumAgOWIsCBCdWZmZXJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGF0b2IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gYXRvYihiYXNlNjROYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gQnVmZmVyLmZyb20oYmFzZTY0TmFtZSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBiYXNlNjQgZGVjb2RlciBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgcmVqZWN0OiB7IGV4cGVjdGVkOiBcInZhbGlkIGJhc2U2NCBldmVudCBuYW1lXCIgfSB9KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IHsgLi4uY29yc0hlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7IHN0YXR1czogMjAwLCBoZWFkZXJzOiB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByYXdCb2R5ID0gYm9keVRleHQgIT09IHVuZGVmaW5lZCA/IGJvZHlUZXh0IDogYXdhaXQgb3B0aW9ucy5yZXF1ZXN0LnRleHQoKTtcbiAgICAgICAgICAgIGlmIChyYXdCb2R5ICYmIHJhd0JvZHkgIT09IFwiXCIgJiYgcmF3Qm9keSAhPT0gXCJ7fVwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmF3Qm9keSkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgcmVqZWN0OiB7IGV4cGVjdGVkOiBcImpzb25cIiB9IH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IHsgLi4uY29yc0hlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczogeyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IF9fY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25IZWFkZXJzID0geyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIgfTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoZXZlbnROYW1lLCBldmVudERhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZW1pdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyUmVzdWx0ID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIG5vb3BMb2dnZXIsIGVtaXRFcnJvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyQm9keSA9IEpTT04uc3RyaW5naWZ5KGVyclJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IGVyckJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGVyckJvZHksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gYHtcImRhdGFcIjoke0pTT04uc3RyaW5naWZ5KGV2ZW50RGF0YSA/PyB7fSl9LFwiZXhlY3V0ZUlkXCI6XCIke2V4ZWN1dGVJZH1cIixcInN1Y2Nlc3NcIjp0cnVlfWA7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7IHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09IEZBU1QgUEFUSCBmb3IgY29tbW9uIGFjdGlvbiByZXF1ZXN0cyA9PT09PVxuICAgICAgICAvLyBTa2lwIGxvZ2dlciwgcmVxdWVzdCBtYXAsIGFuZCBtb3N0IG9iamVjdCBjcmVhdGlvbiB3aGVuOlxuICAgICAgICAvLyAtIHJhd1Jlc3BvbnNlIG1vZGUgKGFkYXB0ZXIpXG4gICAgICAgIC8vIC0gTm8gb3JpZ2luIGhlYWRlciAobm8gQ09SUyBuZWVkZWQpXG4gICAgICAgIC8vIC0gTm8gZXZlbnQgaGFuZGxlcnMgcmVnaXN0ZXJlZCAoZHluYW1pYyBjaGVjaylcbiAgICAgICAgLy8gLSBOb3QgYSBzdHJlYW0gcmVxdWVzdFxuICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSAmJiAhb3JpZ2luICYmIGNoZWNrTm9FbWl0SGFuZGxlcnMoKSkge1xuICAgICAgICAgICAgY29uc3QgX19pc0FjdGlvbiA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX2lzQWN0aW9uO1xuICAgICAgICAgICAgaWYgKF9faXNBY3Rpb24gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSByb3V0ZSBzY2hlbWEgd2l0aCBob3QgY2FjaGVcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVTY2hlbWEgPSBvcHRpb25zLnJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgIGlmICghcm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhTdHJpbmcgPT09IGNhY2hlZFBhdGhTdHJpbmcgJiYgY2FjaGVkUm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gY2FjaGVkUm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUm91dGVTY2hlbWEgPSByb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRQYXRoU3RyaW5nID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltwYXRoU3RyaW5nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0MDQgLSBmYWxsIHRocm91Z2ggdG8gc2xvdyBwYXRoIGZvciBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuYWRkKHBhdGhTdHJpbmcsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUm91dGVTY2hlbWEgPSByb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUGF0aFN0cmluZyA9IHBhdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hICYmIHJvdXRlU2NoZW1hLnR5cGUgPT09IFwiYWN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGNhY2hlZCBmdW5jdGlvbiByZWZlcmVuY2VzIHdoZW4gaGl0dGluZyB0aGUgc2FtZSByb3V0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsaWRhdGVQYXJhbXMgPSBjYWNoZWRWYWxpZGF0ZVBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSBjYWNoZWRIYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpcFZhbGlkYXRpb24gPSBjYWNoZWRTa2lwVmFsaWRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hICE9PSBjYWNoZWRSb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQYXJhbXMgPSByb3V0ZVNjaGVtYS52YWxpZGF0ZVBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSByb3V0ZVNjaGVtYS5tb2R1bGUuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSByb3V0ZVNjaGVtYS5tb2R1bGU/Lm1ldGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwVmFsaWRhdGlvbiA9IG1ldGE/LnR5cGVTYWZldHkgPT09IGZhbHNlIHx8IChBcnJheS5pc0FycmF5KG1ldGE/LnR5cGVTYWZldHkpICYmICFtZXRhLnR5cGVTYWZldHkuaW5jbHVkZXMoXCJwYXJhbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkVmFsaWRhdGVQYXJhbXMgPSB2YWxpZGF0ZVBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkU2tpcFZhbGlkYXRpb24gPSBza2lwVmFsaWRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IF9fY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGJvZHlUZXh0ICE9PSB1bmRlZmluZWQgPyBib2R5VGV4dCA6IGF3YWl0IG9wdGlvbnMucmVxdWVzdC50ZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXM6IGFueTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtc09rID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFib2R5IHx8IGJvZHkgPT09IFwiXCIgfHwgYm9keSA9PT0gXCJ7fVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInVuZGVmaW5lZFwiKSBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc09rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zT2sgJiYgcGFyYW1zICE9PSBudWxsICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCAkbWlsa2lvR2VuZXJhdGVQYXJhbXMgaW4gdGVzdCBtb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbnZNb2RlID09PSBcInRlc3RcIiB8fCAhKFwiJG1pbGtpb0dlbmVyYXRlUGFyYW1zXCIgaW4gcGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtcyB3aGVuIHR5cGVTYWZldHkgaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCAtIGZhbGwgdGhyb3VnaCB0byBzbG93IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc09rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zT2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgbWluaW1hbCBjb250ZXh0IHVzaW5nIHByb3RvdHlwZSBmb3Igc2hhcmVkIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0gT2JqZWN0LmNyZWF0ZShiYXNlQ29udGV4dFByb3RvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wYXRoID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5leGVjdXRlSWQgPSBleGVjdXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcGF0aG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHsgc3RyaW5nOiBwYXRoU3RyaW5nLCBhcnJheTogcGF0aEFycmF5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgc3RyaW5nOiBib2R5LCBwYXJzZWQ6IHBhcmFtcyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGZhc3RQYXRoUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBvcHRpb25zLnJlcXVlc3QuaGVhZGVycztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihjb250ZXh0LCBwYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IGVtcHR5UmVzdWx0UHJlZml4ICsgZXhlY3V0ZUlkICsgaWRTdWZmaXgsIHN0YXR1czogMjAwLCBoZWFkZXJzOiBkZWZhdWx0TWVyZ2VkSGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogcmVzdWx0UHJlZml4ICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSArICcsXCJleGVjdXRlSWRcIjpcIicgKyBleGVjdXRlSWQgKyBpZFN1ZmZpeCwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGRlZmF1bHRNZXJnZWRIZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZXN1bHQgdHlwZSAtIGZhbGwgdGhyb3VnaCB0byBzbG93IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGVyIHRocmV3IC0gZmFsbCB0aHJvdWdoIHRvIHNsb3cgcGF0aCBmb3IgcHJvcGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PSBTTE9XIFBBVEggPT09PT1cbiAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBydW50aW1lPy5leGVjdXRlSWQgPyBhd2FpdCBydW50aW1lLmV4ZWN1dGVJZChvcHRpb25zLnJlcXVlc3QuaGVhZGVycykgOiBfX2NyZWF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGFueUVtaXRIYW5kbGVycyA9ICFjaGVja05vRW1pdEhhbmRsZXJzKCk7XG5cbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIHBhdGhTdHJpbmcsIGV4ZWN1dGVJZCk7XG4gICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LnNldChleGVjdXRlSWQsIHsgbG9nZ2VyIH0pO1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSBiYXNlIGhlYWRlcnMgZm9yIHRoaXMgcmVxdWVzdCAoQ09SUyArIGRlZmF1bHRzKVxuICAgICAgICBjb25zdCBiYXNlSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG9yaWdpbiA/IHsgLi4uY29yc0hlYWRlcnMsIC4uLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMgfSA6IGRlZmF1bHRNZXJnZWRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgICAgICBjb25zdCByZXNwb25zZTogTWlsa2lvSHR0cFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgYm9keTogXCJcIixcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgaGVhZGVyczogeyAuLi5iYXNlSGVhZGVycyB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGh0dHA6IENvbnRleHRIdHRwID0ge1xuICAgICAgICAgICAgdXJsOiBwYXRobmFtZSBhcyBhbnksXG4gICAgICAgICAgICBpcCxcbiAgICAgICAgICAgIHBhdGg6IHsgc3RyaW5nOiBwYXRoU3RyaW5nIGFzIGtleW9mICR0eXBlc1tcImdlbmVyYXRlZFwiXVtcInJvdXRlU2NoZW1hXCJdLCBhcnJheTogcGF0aEFycmF5IH0sXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBzdHJpbmc6IGJvZHlUZXh0ICE9PSB1bmRlZmluZWQgPyBib2R5VGV4dCA6IGF3YWl0IG9wdGlvbnMucmVxdWVzdC50ZXh0KCksXG4gICAgICAgICAgICAgICAgcGFyc2VkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICBjb3JzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IGFueSA9IHsgcmVqZWN0IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBlbWl0IGhhcyBoYW5kbGVycyBiZWZvcmUgYXdhaXRpbmdcbiAgICAgICAgICAgIGNvbnN0IGhhc0h0dHBSZXF1ZXN0SGFuZGxlcnMgPSBydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVxdWVzdFwiKSA/PyB0cnVlO1xuICAgICAgICAgICAgaWYgKGhhc0h0dHBSZXF1ZXN0SGFuZGxlcnMpIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVxdWVzdFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0IH0pO1xuXG4gICAgICAgICAgICAvLyDpnZ4gdGVzdCDnjq/looPkuIvmi6bmiKogJGV4cG9ydHMg5YaF6YOo6Lev5b6EXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnZNb2RlICE9PSBcInRlc3RcIiAmJiAoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpLmluY2x1ZGVzKFwiJFwiKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJBY2NlcHRcIik/LnN0YXJ0c1dpdGgoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGFjdGlvblxuICAgICAgICAgICAgICAgIGxldCByb3V0ZVNjaGVtYSA9IG9wdGlvbnMucm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIb3QgcGF0aDogY2hlY2sgc2luZ2xlLWVudHJ5IGNhY2hlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoU3RyaW5nID09PSBjYWNoZWRQYXRoU3RyaW5nICYmIGNhY2hlZFJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGNhY2hlZFJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuaW5jbHVkZXMoXCIkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gZ2VuZXJhdGVkLnJvdXRlU2NoZW1hPy5baHR0cC5wYXRoLnN0cmluZ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGhvdCBwYXRoIGNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRSb3V0ZVNjaGVtYSA9IHJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUGF0aFN0cmluZyA9IHBhdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSAhPT0gXCJhY3Rpb25cIikgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwic3RyZWFtXCIsIG1lc3NhZ2U6IGBOb3QgYWNjZXB0YWJsZSwgdGhlIEFjY2VwdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgc2hvdWxkIGJlIFwidGV4dC9ldmVudC1zdHJlYW1cIi4gSWYgeW91IGFyZSB1c2luZyB0aGUgXCJAbWlsa2lvL3N0YXJnYXRlXCIgcGFja2FnZSwgcGxlYXNlIGFkZCBcXGB0eXBlOiBcInN0cmVhbVwiXFxgIHRvIHRoZSBleGVjdXRlIG9wdGlvbnMuYCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb250ZXh0Lmh0dHAgPSBodHRwO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IGh0dHAucmVxdWVzdC5oZWFkZXJzO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLnJlcXVlc3QuaGVhZGVycyBhcyBIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zQ29udGVudFR5cGU6IFwianNvblwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkgPT09IFwiXCIgJiYgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZC5lbXB0eVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6e30sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleGVjdXRlZC5yZXN1bHRzVHlwZVNhZmV0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtyb3V0ZVNjaGVtYS5yZXN1bHRzVG9KU09OKGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtKU09OLnN0cmluZ2lmeShleGVjdXRlZC5yZXN1bHRzLnZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0h0dHBSZXNwb25zZUhhbmRsZXJzID0gcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cFJlc3BvbnNlXCIpID8/IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0h0dHBSZXNwb25zZUhhbmRsZXJzKSBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCwgc3VjY2VzczogdHJ1ZSwgcmVqZWN0IH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoYXNPbkxvZ2dlclN1Ym1pdHRpbmcpIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgaWYgKGFueUVtaXRIYW5kbGVycykgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogcmVzcG9uc2UuYm9keSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSBhcyBCb2R5SW5pdCB8IG51bGwsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIiRcIikgfHwgIShodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuZW5kc1dpdGgoXCJ+XCIpIHx8IHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSAhPT0gXCJzdHJlYW1cIikgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwic3RyZWFtXCIsIG1lc3NhZ2U6IGBOb3QgYWNjZXB0YWJsZSwgdGhlIEFjY2VwdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgc2hvdWxkIGJlIFwiYXBwbGljYXRpb24vanNvblwiLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBcIkBtaWxraW8vc3RhcmdhdGVcIiBwYWNrYWdlLCBwbGVhc2UgcmVtb3ZlIFxcYHR5cGU6IFwic3RyZWFtXCJcXGAgdG8gdGhlIGV4ZWN1dGUgb3B0aW9ucy5gIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT25Mb2dnZXJTdWJtaXR0aW5nKSBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYW55RW1pdEhhbmRsZXJzKSBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29udGV4dC5odHRwID0gaHR0cDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgZXhlY3V0ZXIuX19leGVjdXRlKHJvdXRlU2NoZW1hLCB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBodHRwLnBhcmFtcy5zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG4gICAgICAgICAgICAgICAgLy8gU3RyZWFtIHBhdGg6IGNyZWF0ZSBuZXcgaGVhZGVycyBvYmplY3QgdG8gYXZvaWQgcG9sbHV0aW5nIHNoYXJlZCBkZWZhdWx0TWVyZ2VkSGVhZGVyc1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7IC4uLnJlc3BvbnNlLmhlYWRlcnMsIC4uLmJ1aWxkQ29yc0hlYWRlcnMoaHR0cC5jb3JzLCBvcmlnaW4pIH07XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbTogUmVhZGFibGVTdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2w6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlciB8IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGlyZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcjogUmVhZGFibGVTdHJlYW1EaXJlY3RDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YTpAJHtKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH0gc2F0aXNmaWVzIE1pbGtpb1Jlc3BvbnNlU3VjY2Vzczxhbnk+KX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoW251bGwsIHZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZS5yZXR1cm4odW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtKU09OLnN0cmluZ2lmeShbcmVzdWx0LCBudWxsXSl9XFxuXFxuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZS5qcyBvciBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YTpAJHtKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH0gc2F0aXNmaWVzIE1pbGtpb1Jlc3BvbnNlU3VjY2Vzczxhbnk+KX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVxdWVzdC5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFtudWxsLCB2YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZS5yZXR1cm4odW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke0pTT04uc3RyaW5naWZ5KFtyZXN1bHQsIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gc3RyZWFtO1xuICAgICAgICAgICAgICAgIC8vIFN0cmVhbSBwYXRoOiBjcmVhdGUgbmV3IGhlYWRlcnMgdG8gYXZvaWQgcG9sbHV0aW5nIHNoYXJlZCBvYmplY3RcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0geyAuLi5yZXNwb25zZS5oZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvZXZlbnQtc3RyZWFtXCIsIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLWNhY2hlXCIgfTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0OiBleGVjdXRlZC5jb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8TWlsa2lvUmVzcG9uc2VSZWplY3Q+ID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2UuYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdHMudmFsdWUpO1xuICAgICAgICAgICAgLy8gRXJyb3IgcGF0aDogY3JlYXRlIG5ldyBoZWFkZXJzIHRvIGF2b2lkIHBvbGx1dGluZyBzaGFyZWQgb2JqZWN0XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0geyAuLi5yZXNwb25zZS5oZWFkZXJzLCAuLi5jb3JzSGVhZGVycyB9O1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQsIHN1Y2Nlc3M6IGZhbHNlLCByZWplY3QgfSk7XG4gICAgICAgICAgICBpZiAoaGFzT25Mb2dnZXJTdWJtaXR0aW5nKSBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGFueUVtaXRIYW5kbGVycykgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IHJlc3BvbnNlLmJvZHksIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5IGFzIEJvZHlJbml0IHwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHN0cmVhbUNsb3NlcnM6IE1hcDxzdHJpbmcsIHsgZ2VuZXJhdG9yOiBBc3luY0dlbmVyYXRvcjsgaGFuZGxlQ2xvc2U6IGFueSB9PiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBoYW5kbGVNZXNzYWdlID0gYXN5bmMgKFxuICAgICAgICBwb3J0OiB7IHBvc3RNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQgfSxcbiAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgICAgICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgICAgICAgICAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IFwiUElOR1wiKSB7XG4gICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShcIlBPTkdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGFydHNXaXRoKFwiQ0xPU0VfU1RSRUFNOlwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IG9wdGlvbnMuc3BsaXQoXCJDTE9TRV9TVFJFQU06XCIpWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbUNsb3NlciA9IHN0cmVhbUNsb3NlcnMuZ2V0KGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNsb3Nlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1DbG9zZXIuZ2VuZXJhdG9yLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1DbG9zZXIuaGFuZGxlQ2xvc2UoXCJzdHJlYW1cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KG9wdGlvbnMucGF0aCk7XG4gICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltvcHRpb25zLnBhdGhdO1xuICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBvcHRpb25zLnBhdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgICAgICAgdHJpZS5hZGQob3B0aW9ucy5wYXRoLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMgPz8ge307XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcihydW50aW1lLCBvcHRpb25zLnBhdGgsIG9wdGlvbnMuZXhlY3V0ZUlkKTtcbiAgICAgICAgbGV0IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGh0dHAgPSBuZXcgUHJveHkoXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICh0YXJnZXQsIHByb3BlcnR5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJub3RGb3VuZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJjb250ZXh0Lmh0dHBcIiwgbWVzc2FnZTogXCJUaGlzIHJlcXVlc3Qgd2FzIGludm9rZWQgdGhyb3VnaCB0aGUgZXhlY3V0ZSBtZXRob2QuIFNpbmNlIG5vIGFjdHVhbCByZXF1ZXN0IHdhcyBnZW5lcmF0ZWQsIHRoZSBIVFRQIG1ldGhvZHMgdW5kZXIgdGhlIGNvbnRleHQgY2Fubm90IGJlIGFjY2Vzc2VkLlwiIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKHR5cGU6IFwiYWN0aW9uXCIgfCBcInN0cmVhbVwiKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJzdHJlYW1cIikgc3RyZWFtQ2xvc2Vycy5kZWxldGUob3B0aW9ucy5leGVjdXRlSWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUob3B0aW9ucy5leGVjdXRlSWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7IGh0dHA6IGh0dHAsIGhlYWRlcnMsIHJlamVjdCB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJhY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgZXhlY3V0ZXIuX19leGVjdXRlKHJvdXRlU2NoZW1hLCB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoXCJhY3Rpb25cIik7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZWQuZW1wdHlSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwicmF3XCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2Vycy5zZXQob3B0aW9ucy5leGVjdXRlSWQsIHsgZ2VuZXJhdG9yOiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLCBoYW5kbGVDbG9zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbbnVsbCwgdmFsdWVdLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIob3B0aW9ucy5leGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtyZXN1bHQsIG51bGxdLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZShcInN0cmVhbVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4Y2VwdGlvbkhhbmRsZXIob3B0aW9ucy5leGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgYXdhaXQgbG9nZ2VyLl8uc3VibWl0KGNvbnRleHQgYXMgYW55KTtcbiAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiBmYWxzZSwgZGF0YTogdW5kZWZpbmVkLCBlcnJvcjogcmVzdWx0LCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGZldGNoLFxuICAgICAgICBoYW5kbGVNZXNzYWdlLFxuICAgIH07XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTWlsa2lvUmVzcG9uc2VSZWplY3QsIExvZ2dlciB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlICRyZWplY3RDb2RlIHtcbiAgICBSRVFVRVNUX0ZBSUw6IGFueTtcbiAgICBOT1RfREVWRUxPUF9NT0RFOiBzdHJpbmc7XG4gICAgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQ6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH07XG4gICAgTk9UX0ZPVU5EOiB7IHBhdGg6IHN0cmluZyB9O1xuICAgIFBBUkFNU19UWVBFX0lOQ09SUkVDVDogeyBwYXRoOiBzdHJpbmc7IGV4cGVjdGVkOiBzdHJpbmc7IHZhbHVlOiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9IHwgbnVsbDtcbiAgICBSRVNVTFRTX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xuICAgIFVOQUNDRVBUQUJMRTogeyBleHBlY3RlZDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTtcbiAgICBQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEOiB7IGV4cGVjdGVkOiBzdHJpbmcgfTtcbiAgICBSRVNVTFRTX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XG4gICAgSU5URVJOQUxfU0VSVkVSX0VSUk9SOiB1bmRlZmluZWQ7XG4gICAgTUVUSE9EX05PVF9BTExPV0VEOiB1bmRlZmluZWQ7XG4gICAgTkVUV09SS19FUlJPUjogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBSZWplY3QgPSB7XG4gICAgPENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZT4oY29kZTogQ29kZSwgLi4uZGF0YTogJHJlamVjdENvZGVbQ29kZV0gZXh0ZW5kcyB1bmRlZmluZWQgPyBbXSB8IFt1bmRlZmluZWRdIDogWyRyZWplY3RDb2RlW0NvZGVdXSk6IE1pbGtpb1JlamVjdEVycm9yPENvZGUsICRyZWplY3RDb2RlW0NvZGVdPjtcbiAgICA8VD4ob2JqOiBUKTogTWlsa2lvUmVqZWN0RXJyb3I8RXh0cmFjdDxrZXlvZiBULCBrZXlvZiAkcmVqZWN0Q29kZT4sIGFueT47XG59O1xuXG5leHBvcnQgY29uc3QgcmVqZWN0ID0gZnVuY3Rpb24gcmVqZWN0KGNvZGVPck9iajogYW55LCBkYXRhPzogYW55KTogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHtcbiAgICBsZXQgY29kZTogYW55O1xuICAgIGxldCByZWplY3REYXRhOiBhbnk7XG4gICAgaWYgKHR5cGVvZiBjb2RlT3JPYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29kZSA9IGNvZGVPck9iajtcbiAgICAgICAgcmVqZWN0RGF0YSA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvZGVPck9iaik7XG4gICAgICAgIGNvZGUgPSBrZXlzWzBdO1xuICAgICAgICByZWplY3REYXRhID0gY29kZU9yT2JqW2NvZGVdO1xuICAgIH1cbiAgICBjb25zdCBlcnJvciA9IHsgJG1pbGtpb1JlamVjdDogdHJ1ZSwgY29kZSwgZGF0YTogcmVqZWN0RGF0YSB9IGFzIE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PjtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvcik7XG4gICAgcmV0dXJuIGVycm9yO1xufSBhcyBSZWplY3Q7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb1JlamVjdEVycm9yPENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZSA9IGtleW9mICRyZWplY3RDb2RlLCBSZWplY3REYXRhIGV4dGVuZHMgJHJlamVjdENvZGVbQ29kZV0gPSAkcmVqZWN0Q29kZVtDb2RlXT4gPSB7IGNvZGU6IENvZGU7IGRhdGE6IFJlamVjdERhdGE7IHN0YWNrOiBzdHJpbmc7ICRtaWxraW9SZWplY3Q6IHRydWUgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyLCBlcnJvcjogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHwgYW55KTogTWlsa2lvUmVzcG9uc2VSZWplY3Qge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChcInZpdGVTZXJ2ZXJcIiBpbiBnbG9iYWxUaGlzKSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnZpdGVTZXJ2ZXI/LnNzckZpeFN0YWNrdHJhY2UoZXJyb3IpOyAvLyBmaXggdml0ZSBzc3Igc3RhY2t0cmFjZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcInZpdGVTZXJ2ZXJcIiBpbiBnbG9iYWxUaGlzKSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlcnJvcik7XG4gICAgY29uc3QgbmFtZSA9IGVycm9yPy5jb2RlID8/IGVycm9yPy5uYW1lID8/IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVubmFtZWQgRXhjZXB0aW9uXCI7XG5cbiAgICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUgJiYgZXJyb3I/LmNvZGUgPT09IFwiTk9UX0ZPVU5EXCIpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8obmFtZSwgZXJyb3I/LmRhdGE/LnBhdGggPz8gXCJVbmtub3duIHBhdGhcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gZXJyb3I/LiRtaWxraW9SZWplY3QgPyAoZXJyb3I/LnN0YWNrID8/IFwiXCIpLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDIpLmpvaW4oXCJcXG5cIikgOiAoZXJyb3I/LnN0YWNrID8/IFwiXCIpO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG5hbWUsIGBcXG4ke0pTT04uc3RyaW5naWZ5KGVycm9yPy5kYXRhKX1gLCBgXFxuJHtzdGFja31cXG5gKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG5hbWUsIGBcXG4ke2Vycm9yPy50b1N0cmluZygpfWAsIGBcXG4ke2Vycm9yPy5zdGFja31cXG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IE1pbGtpb1Jlc3BvbnNlUmVqZWN0O1xuXG4gICAgaWYgKGVycm9yPy4kbWlsa2lvUmVqZWN0ID09PSB0cnVlKSByZXN1bHQgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBlcnJvci5jb2RlLCByZWplY3Q6IGVycm9yLmRhdGEsIGV4ZWN1dGVJZCB9O1xuICAgIGVsc2UgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgcmVqZWN0OiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFBTyxTQUFTLElBQTZCLENBQUMsU0FBMkI7QUFBQSxFQUN2RSxPQUFPLFFBQVE7QUFBQTs7QUNVVixTQUFTLFVBQTBDLENBQUMsT0FBK0I7QUFBQSxFQUN4RixPQUFPO0FBQUEsSUFDTCxNQUFNLE9BQU8sRUFBRSxhQUFhLGVBQWUsTUFBTTtBQUFBLEVBQ25EO0FBQUE7O0FDZEssU0FBUyxNQUE4QixDQUFDLFNBQTBCO0FBQUEsRUFDdkUsT0FBTztBQUFBO0FBU0YsU0FBUyxXQUFXLENBQUMsT0FBb0MsY0FBc0I7QUFBQSxFQUNwRixJQUFJLFVBQVU7QUFBQSxJQUFXLE9BQU87QUFBQSxFQUVoQyxPQUFPLEdBQUc7QUFBQTtBQUdMLFNBQVMsV0FBVyxDQUFDLE9BQTJCLGNBQXNCO0FBQUEsRUFDM0UsSUFBSSxVQUFVO0FBQUEsSUFBVyxPQUFPO0FBQUEsRUFFaEMsT0FBTyxPQUFPLFNBQVMsT0FBTyxFQUFFO0FBQUE7QUFHM0IsU0FBUyxZQUFZLENBQUMsT0FBb0MsY0FBdUI7QUFBQSxFQUN0RixJQUFJLFVBQVU7QUFBQSxJQUFRLE9BQU87QUFBQSxFQUU3QixJQUFJLFVBQVU7QUFBQSxJQUFTLE9BQU87QUFBQSxFQUU5QixJQUFJLFVBQVU7QUFBQSxJQUFJLE9BQU87QUFBQSxFQUV6QixJQUFrQixVQUFkO0FBQUEsSUFBcUIsT0FBTztBQUFBLEVBRWhDLE9BQU8sUUFBUSxLQUFLO0FBQUE7O0FDL0JmLFNBQVMsYUFBYSxDQUFDLFNBQWtCO0FBQUEsRUFDOUMsTUFBTSxPQUErQixDQUFDO0FBQUEsRUFDdEMsWUFBWSxLQUFLLFVBQVcsUUFBZ0IsUUFBUSxHQUFHO0FBQUEsSUFDckQsS0FBSyxPQUFPO0FBQUEsRUFDZDtBQUFBLEVBQ0EsT0FBTztBQUFBOzs7QUNMVCxTQUFTLGFBQWEsQ0FBQyxPQUEwQztBQUFBLEVBQy9ELE9BQU8sT0FBTyxVQUFVLFlBQVksVUFBVSxRQUFRLENBQUMsTUFBTSxRQUFRLEtBQUs7QUFBQTtBQUdyRSxTQUFTLFNBQXVFLENBQUMsUUFBVyxRQUFjO0FBQUEsRUFDL0csTUFBTSxTQUFTLEtBQUssT0FBTztBQUFBLEVBRTNCLFdBQVcsT0FBTyxRQUFRO0FBQUEsSUFDeEIsSUFBSSxDQUFDLE9BQU8sVUFBVSxlQUFlLEtBQUssUUFBUSxHQUFHO0FBQUEsTUFBRztBQUFBLElBRXhELE1BQU0sY0FBYyxPQUFPO0FBQUEsSUFDM0IsTUFBTSxjQUFjLE9BQU87QUFBQSxJQUUzQixJQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssUUFBUSxHQUFHLEdBQUc7QUFBQSxNQUNyRCxJQUFJLGNBQWMsV0FBVyxLQUFLLGNBQWMsV0FBVyxHQUFHO0FBQUEsUUFDNUQsT0FBTyxPQUE0QixVQUFVLGFBQWEsV0FBVztBQUFBLE1BQ3ZFO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFDSixPQUFlLE9BQU87QUFBQTtBQUFBLEVBRTNCO0FBQUEsRUFFQSxPQUFPO0FBQUE7OztBQ3RCVCxJQUFNLGlCQUFpQjtBQUVoQixTQUFTLGVBQWtCLENBQUMsTUFBWTtBQUFBLEVBQzNDLElBQUksU0FBUyxRQUFRLFNBQVM7QUFBQSxJQUFXLE9BQU87QUFBQSxFQUNoRCxNQUFNLE9BQU8sT0FBTztBQUFBLEVBQ3BCLElBQUksU0FBUyxVQUFVO0FBQUEsSUFDbkIsSUFBSSxnQkFBZ0I7QUFBQSxNQUFNLE9BQU87QUFBQSxJQUNqQyxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFBQSxNQUNyQixNQUFNLE1BQU0sS0FBSztBQUFBLE1BQ2pCLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxLQUFLO0FBQUEsUUFDMUIsTUFBTSxTQUFTLGdCQUFnQixLQUFLLEVBQUU7QUFBQSxRQUN0QyxJQUFJLFdBQVcsS0FBSztBQUFBLFVBQUksS0FBSyxLQUFLO0FBQUEsTUFDdEM7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxNQUFNLE9BQU8sT0FBTyxLQUFLLElBQWM7QUFBQSxJQUN2QyxNQUFNLE1BQU07QUFBQSxJQUNaLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUNsQyxNQUFNLE1BQU0sS0FBSztBQUFBLE1BQ2pCLE1BQU0sUUFBUSxJQUFJO0FBQUEsTUFDbEIsTUFBTSxTQUFTLGdCQUFnQixLQUFLO0FBQUEsTUFDcEMsSUFBSSxXQUFXO0FBQUEsUUFBTyxJQUFJLE9BQU87QUFBQSxJQUNyQztBQUFBLElBQ0EsT0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLElBQUksU0FBUyxVQUFVO0FBQUEsSUFDbkIsTUFBTSxNQUFNO0FBQUEsSUFFWixNQUFNLE1BQU0sSUFBSTtBQUFBLElBQ2hCLElBQUksT0FBTyxNQUFNLE9BQU8sTUFBTSxJQUFJLFdBQVcsQ0FBQyxLQUFLLE1BQVEsSUFBSSxXQUFXLENBQUMsS0FBSyxNQUFRLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBSTtBQUFBLE1BQzdHLE1BQU0sUUFBUSxJQUFJLE1BQU0sY0FBYztBQUFBLE1BQ3RDLElBQUksVUFBVSxNQUFNO0FBQUEsUUFDaEIsSUFBSSxNQUFNLElBQUk7QUFBQSxVQUNWLE1BQU0sV0FBVyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sS0FBSyxNQUFNLEdBQUcsU0FBUyxJQUFJO0FBQUEsVUFDdkUsSUFBSSxZQUFZLEdBQUc7QUFBQSxZQUNmLE9BQU8sSUFBSSxLQUFLLElBQUksVUFBVSxHQUFHLFFBQVEsSUFBSSxJQUFJLFVBQVUsV0FBVyxDQUFDLENBQUM7QUFBQSxVQUM1RTtBQUFBLFVBQ0EsT0FBTyxJQUFJLEtBQUssR0FBRztBQUFBLFFBQ3ZCO0FBQUEsUUFDQSxPQUFPLElBQUksS0FBSyxNQUFNLEtBQUssR0FBRztBQUFBLE1BQ2xDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUNBLE9BQU87QUFBQTs7O0FDcENKLFNBQVMsY0FBYyxDQUFDLFdBQTBCLFNBQWM7QUFBQSxFQUNuRSxNQUFNLFlBQVksT0FDZCxhQUNBLFlBaUIyUTtBQUFBLElBQzNRLE1BQU0sT0FBTyxRQUFRLEtBQUssU0FBUyxHQUFHLElBQUksV0FBVztBQUFBLElBQ3JELE1BQU0sWUFBb0IsUUFBUTtBQUFBLElBQ2xDLElBQUk7QUFBQSxJQUNKLElBQUksRUFBRSxRQUFRLG1CQUFtQixVQUFVO0FBQUEsTUFFdkMsSUFBSSxPQUFRLFFBQVEsU0FBaUIsUUFBUSxjQUFjLEVBQUUsUUFBUSxtQkFBbUIsVUFBVTtBQUFBLFFBQzlGLFVBQVUsUUFBUTtBQUFBLE1BRXRCLEVBQU87QUFBQSxRQUVILFVBQVUsSUFBSSxRQUFRO0FBQUEsYUFDZixRQUFRO0FBQUEsUUFDZixDQUFDO0FBQUEsUUFDRCxJQUFJLEVBQUUsWUFBWTtBQUFBLFVBQVcsUUFBZ0IsU0FBUyxNQUFNLGNBQWMsT0FBTztBQUFBO0FBQUEsSUFFekYsRUFBTztBQUFBLE1BQ0gsVUFBVSxRQUFRO0FBQUEsTUFDbEIsSUFBSSxFQUFFLFlBQVk7QUFBQSxRQUFXLFFBQWdCLFNBQVMsTUFBTSxjQUFjLE9BQU87QUFBQTtBQUFBLElBR3JGLE1BQU0sVUFBc0IsQ0FBQztBQUFBLElBQzdCLE1BQU0sWUFBWSxDQUFDLFlBQWlCLFFBQVEsUUFBUSxPQUFPO0FBQUEsSUFFM0QsSUFBSTtBQUFBLElBQ0osSUFBSSxRQUFRLGVBQWUsT0FBTztBQUFBLE1BQzlCLFNBQVMsUUFBUTtBQUFBLE1BQ2pCLElBQUksT0FBTyxXQUFXO0FBQUEsUUFBYSxTQUFTLENBQUM7QUFBQSxJQUNqRCxFQUFPO0FBQUEsTUFDSCxJQUFJLENBQUMsUUFBUSxVQUFVLFFBQVEsV0FBVyxNQUFNLFFBQVEsV0FBVyxNQUFNO0FBQUEsUUFDckUsU0FBUyxDQUFDO0FBQUEsTUFDZCxFQUFPLFNBQUksUUFBUSxzQkFBc0IsVUFBVSxRQUFRLElBQUksY0FBYyxHQUFHLFdBQVcsa0JBQWtCLEdBQUc7QUFBQSxRQUM1RyxJQUFJO0FBQUEsVUFDQSxTQUFTLGdCQUFnQixLQUFLLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFBQSxVQUNyRCxPQUFPLE9BQU87QUFBQSxVQUNaLE1BQU0sT0FBTyw2QkFBNkIsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBO0FBQUEsUUFFbEUsSUFBSSxPQUFPLFdBQVc7QUFBQSxVQUFhLFNBQVMsQ0FBQztBQUFBLE1BQ2pELEVBQU8sU0FBSSxRQUFRLElBQUksY0FBYyxHQUFHLFdBQVcsbUNBQW1DLEdBQUc7QUFBQSxRQUNyRixJQUFJO0FBQUEsVUFDQSxNQUFNLFdBQVcsSUFBSSxnQkFBZ0IsUUFBUSxNQUFNO0FBQUEsVUFDbkQsU0FBUyxDQUFDO0FBQUEsVUFDVixTQUFTLFFBQVEsQ0FBQyxPQUFPLFFBQVEsT0FBTyxPQUFPLEtBQUs7QUFBQSxVQUN0RCxPQUFPLE9BQU87QUFBQSxVQUNaLE1BQU0sT0FBTyw2QkFBNkIsRUFBRSxVQUFVLGtCQUFrQixDQUFDO0FBQUE7QUFBQSxNQUVqRixFQUFPO0FBQUEsUUFDSCxNQUFNLE9BQU8sNkJBQTZCLEVBQUUsVUFBVSxPQUFPLENBQUM7QUFBQTtBQUFBO0FBQUEsSUFHdEUsSUFBSSxPQUFPLFdBQVcsWUFBWSxNQUFNLFFBQVEsTUFBTTtBQUFBLE1BQUcsTUFBTSxPQUFPLDZCQUE2QixFQUFFLFVBQVUsT0FBTyxDQUFDO0FBQUEsSUFDdkgsSUFBSSwyQkFBMkIsVUFBVSxPQUFPLDBCQUEwQixVQUFVO0FBQUEsTUFDaEYsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUFTLE1BQU0sT0FBTyxvQkFBb0IsMENBQTBDO0FBQUEsTUFDakcsT0FBTyxPQUFPO0FBQUEsTUFDZCxJQUFJLGFBQWEsWUFBWSxhQUFhO0FBQUEsTUFDMUMsSUFBSSxlQUFlLGFBQWEsZUFBZTtBQUFBLFFBQU0sYUFBYSxDQUFDO0FBQUEsTUFDbkUsU0FBUyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3JDLFFBQVEsY0FBYyxNQUFNLDJCQUEwQixLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQUEsSUFDaEY7QUFBQSxJQUNBLElBQUksQ0FBQyxRQUFRLFNBQVMsTUFBTSxZQUFZLFFBQVEsU0FBUyxNQUFNLFFBQVE7QUFBQSxNQUFRLFFBQVEsUUFBUSxLQUFLLE9BQU8sU0FBUztBQUFBLElBRXBILElBQUksQ0FBQyxRQUFRO0FBQUEsTUFBUyxRQUFRLFVBQVUsQ0FBQztBQUFBLElBQ3pDLE1BQU0sTUFBTSxRQUFRO0FBQUEsSUFDcEIsSUFBSSxVQUFVLFFBQVE7QUFBQSxJQUN0QixJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ25CLElBQUksU0FBUyxRQUFRO0FBQUEsSUFDckIsSUFBSSxPQUFPLFFBQVE7QUFBQSxJQUNuQixJQUFJLGtCQUFrQixRQUFRO0FBQUEsSUFDOUIsSUFBSSxrQkFBa0IsUUFBUTtBQUFBLElBQzlCLElBQUksWUFBWSxRQUFRO0FBQUEsSUFDeEIsSUFBSSxTQUFTLFFBQVEsUUFBUTtBQUFBLElBQzdCLElBQUksUUFBUSxVQUFVO0FBQUEsSUFDdEIsSUFBSSxPQUFPLENBQUMsU0FBYSxZQUFnQixPQUFPLEtBQUssU0FBUSxPQUFNO0FBQUEsSUFDbkUsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxJQUFJO0FBQUEsSUFFUixNQUFNLFVBQXdCLEVBQUUsT0FBTyxVQUFVO0FBQUEsSUFFakQsTUFBTSxTQUFTLFlBQVk7QUFBQSxJQUMzQixNQUFNLE9BQVEsUUFBUSxPQUFPLFFBQVEsT0FBTyxDQUFDO0FBQUEsSUFFN0MsSUFBSSxRQUFRLFFBQVEsTUFBTSxTQUFTLFdBQVcsV0FBVztBQUFBLE1BQ3JELE1BQU0sZUFBZSxNQUFNLFdBQVcsQ0FBQyxNQUFNO0FBQUEsTUFDN0MsSUFBSSxDQUFDLGFBQWEsU0FBUyxRQUFRLFFBQVEsS0FBSyxRQUFRLE1BQU07QUFBQSxRQUFHLE1BQU0sT0FBTyxzQkFBc0IsU0FBUztBQUFBLElBQ2pIO0FBQUEsSUFFQSxJQUFJLE1BQU0sZUFBZSxhQUFhLEtBQUssZUFBZSxRQUFTLE1BQU0sUUFBUSxLQUFLLFVBQVUsS0FBSyxLQUFLLFdBQVcsU0FBUyxRQUFRLEdBQUk7QUFBQSxNQUN0SSxNQUFNLGFBQWEsWUFBWSxlQUFlLE1BQU07QUFBQSxNQUNwRCxJQUFJLENBQUMsV0FBVztBQUFBLFFBQVMsTUFBTSxPQUFPLHlCQUF5QixLQUFNLFdBQW1CLE9BQU8sSUFBSSxTQUFTLGNBQWUsV0FBbUIsT0FBTyxHQUFHLGFBQWMsV0FBbUIsT0FBTyxHQUFHLGdDQUFpQyxXQUFtQixPQUFPLEdBQUcsMEJBQTBCLENBQUM7QUFBQSxJQUNoUztBQUFBLElBRUEsSUFBSSxRQUFRLG1CQUFtQixzQkFBc0IsS0FBSyxNQUFNO0FBQUEsTUFDNUQsTUFBTSxRQUFRLEtBQUssd0JBQXdCLEVBQUUsV0FBVyxRQUFRLGtCQUFrQixRQUFRLFFBQVEsZUFBZSxNQUFNLFFBQVEsTUFBTSxNQUFNLFNBQVMsUUFBUSxTQUFTLE9BQU8sQ0FBQztBQUFBLElBQ2pMO0FBQUEsSUFFQSxRQUFRLFFBQVEsTUFBTSxPQUFPLFFBQVEsUUFBUSxTQUFTLE1BQU07QUFBQSxJQUU1RCxJQUFJLGNBQWM7QUFBQSxJQUNsQixJQUFJLFFBQVEsVUFBVSxhQUFhLFFBQVEsVUFBVSxRQUFRLFFBQVEsVUFBVSxJQUFJO0FBQUEsTUFDL0UsY0FBYztBQUFBLE1BQ2QsUUFBUSxRQUFRLENBQUM7QUFBQSxJQUNyQixFQUFPLFNBQUksTUFBTSxRQUFRLFFBQVEsS0FBSyxLQUFLLE9BQU8sUUFBUSxVQUFVLFVBQVU7QUFBQSxNQUMxRSxNQUFNLE9BQU8sZ0JBQWdCLDZHQUE2RztBQUFBLElBQzlJO0FBQUEsSUFFQSxJQUFJLG9CQUFvQjtBQUFBLElBQ3hCLElBQUksQ0FBQyxlQUFlLFNBQVMsYUFPekIsS0FBSyxlQUFlLFFBQVMsTUFBTSxRQUFRLEtBQUssVUFBVSxLQUFLLEtBQUssV0FBVyxTQUFTLFNBQVMsSUFBSztBQUFBLE1BQ3RHLG9CQUFvQjtBQUFBLE1BQ3BCLE1BQU0sYUFBYSxZQUFZLGdCQUFnQixRQUFRLEtBQUs7QUFBQSxNQUM1RCxJQUFJLENBQUMsV0FBVztBQUFBLFFBQVMsTUFBTSxPQUFPLDBCQUEwQixLQUFNLFdBQW1CLE9BQU8sSUFBSSxTQUFTLGNBQWUsV0FBbUIsT0FBTyxHQUFHLGFBQWMsV0FBbUIsT0FBTyxHQUFHLGdDQUFpQyxXQUFtQixPQUFPLEdBQUcsMEJBQTBCLENBQUM7QUFBQSxJQUNqUztBQUFBLElBRUEsSUFBSSxRQUFRLG1CQUFtQixxQkFBcUIsS0FBSyxNQUFNO0FBQUEsTUFDM0QsTUFBTSxRQUFRLEtBQUssdUJBQXVCLEVBQUUsV0FBVyxRQUFRLGtCQUFrQixRQUFRLFFBQVEsZUFBZSxNQUFNLFFBQVEsTUFBTSxNQUFNLFNBQVMsUUFBUSxTQUFTLFNBQVMsT0FBTyxDQUFDO0FBQUEsSUFDekw7QUFBQSxJQUVBLE9BQU8sRUFBRSxXQUFXLFNBQVMsUUFBUSxTQUFTLFNBQVMsUUFBUSxTQUFTLE1BQU0sTUFBTSxhQUFhLG1CQUFtQixRQUFRO0FBQUE7QUFBQSxFQUdoSSxNQUFNLFNBQVMsT0FBTyxTQUFtQixRQUFxQyxXQUErQjtBQUFBLElBQ3pHLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxJQUM1QixPQUFPLE1BQU0sY0FBYyxRQUFRLFNBQVMsTUFBTTtBQUFBO0FBQUEsRUFHdEQsT0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBOztBQ3RKRyxTQUFTLGtCQUFrQixHQUFHO0FBQUEsRUFDakMsTUFBTSxXQUFXLElBQUk7QUFBQSxFQUNyQixNQUFNLFVBQVUsSUFBSTtBQUFBLEVBQ3BCLElBQUksV0FBVztBQUFBLEVBRWYsTUFBTSxlQUFlO0FBQUEsSUFDakIsSUFBSSxDQUErRyxLQUFVLFlBQXFCO0FBQUEsTUFDOUk7QUFBQSxNQUNBLFNBQVMsSUFBSSxTQUFTLEdBQWE7QUFBQSxNQUNuQyxJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ2IsSUFBSSxRQUFRLElBQUksR0FBRyxNQUFNLE9BQU87QUFBQSxVQUM1QixRQUFRLElBQUksS0FBSyxJQUFJLEdBQUs7QUFBQSxRQUM5QjtBQUFBLFFBQ0EsTUFBTSxjQUFjLFFBQVEsSUFBSSxHQUFHO0FBQUEsUUFDbkMsWUFBWSxJQUFJLE9BQU87QUFBQSxNQUMzQixFQUFPO0FBQUEsUUFDSCxJQUFJLFFBQVEsSUFBSSxHQUFhLE1BQU0sT0FBTztBQUFBLFVBQ3RDLFFBQVEsSUFBSSxLQUFlLElBQUksR0FBSztBQUFBLFFBQ3hDO0FBQUEsUUFDQSxNQUFNLE1BQU0sUUFBUSxJQUFJLEdBQWE7QUFBQSxRQUNyQyxJQUFJLElBQUksT0FBTztBQUFBO0FBQUEsTUFHbkIsT0FBTyxNQUFNO0FBQUEsUUFDVCxTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ3ZCLElBQUksUUFBUSxLQUFLO0FBQUEsVUFDYixNQUFNLGNBQWMsUUFBUSxJQUFJLEdBQUc7QUFBQSxVQUNuQyxJQUFJLGFBQWE7QUFBQSxZQUNiLFlBQVksT0FBTyxPQUFPO0FBQUEsVUFDOUI7QUFBQSxRQUNKLEVBQU87QUFBQSxVQUNILE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFVBQ3JDLElBQUksS0FBSztBQUFBLFlBQ0wsSUFBSSxPQUFPLE9BQU87QUFBQSxVQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVosS0FBSyxDQUEyRSxLQUFVLFlBQXFCO0FBQUEsTUFDM0c7QUFBQSxNQUNBLElBQUksUUFBUSxLQUFLO0FBQUEsUUFDYixNQUFNLGNBQWMsUUFBUSxJQUFJLEdBQUc7QUFBQSxRQUNuQyxJQUFJLENBQUM7QUFBQSxVQUFhO0FBQUEsUUFDbEIsU0FBUyxPQUFPLE9BQU87QUFBQSxRQUN2QixZQUFZLE9BQU8sT0FBTztBQUFBLE1BQzlCLEVBQU87QUFBQSxRQUNILE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ3JDLElBQUksQ0FBQztBQUFBLFVBQUs7QUFBQSxRQUNWLFNBQVMsT0FBTyxPQUFPO0FBQUEsUUFDdkIsSUFBSSxPQUFPLE9BQU87QUFBQTtBQUFBO0FBQUEsSUFHMUIsTUFBTSxDQUF3RCxLQUFVLFVBQWdDO0FBQUEsTUFDcEcsTUFBTSxJQUFJLFFBQVEsSUFBSSxHQUFhO0FBQUEsTUFDbkMsTUFBTSxtQkFBbUIsUUFBUSxJQUFJLEdBQUc7QUFBQSxNQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUM7QUFBQSxRQUFHLE9BQU8sUUFBUSxRQUFRO0FBQUEsTUFFcEQsSUFBSSxvQkFBb0IsR0FBRztBQUFBLFFBQ3ZCLFFBQVEsWUFBWTtBQUFBLFVBQ2hCLFdBQVcsV0FBVyxrQkFBa0I7QUFBQSxZQUNwQyxNQUFNLFFBQVEsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUFBLFVBQ2hDO0FBQUEsVUFDQSxXQUFXLFdBQVcsR0FBRztBQUFBLFlBQ3JCLE1BQU0sUUFBUSxLQUFLO0FBQUEsVUFDdkI7QUFBQSxXQUNEO0FBQUEsTUFDUDtBQUFBLE1BRUEsSUFBSSxrQkFBa0I7QUFBQSxRQUNsQixRQUFRLFlBQVk7QUFBQSxVQUNoQixXQUFXLFdBQVcsa0JBQWtCO0FBQUEsWUFDcEMsTUFBTSxRQUFRLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFBQSxVQUNoQztBQUFBLFdBQ0Q7QUFBQSxNQUNQO0FBQUEsTUFFQSxRQUFRLFlBQVk7QUFBQSxRQUNoQixXQUFXLFdBQVcsR0FBSTtBQUFBLFVBQ3RCLE1BQU0sUUFBUSxLQUFLO0FBQUEsUUFDdkI7QUFBQSxTQUNEO0FBQUE7QUFBQSxJQUVQLGtCQUFrQixDQUFDLFFBQXlCO0FBQUEsTUFDeEMsT0FBTyxRQUFRLElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHO0FBQUE7QUFBQSxRQUUxQyxRQUFRLEdBQUc7QUFBQSxNQUFFLE9BQU87QUFBQTtBQUFBLElBQ3hCLGlCQUFpQixPQUE4RCxLQUFVLFVBQW1DO0FBQUEsTUFDeEgsTUFBTSxtQkFBbUIsUUFBUSxJQUFJLEdBQUc7QUFBQSxNQUN4QyxJQUFJLFdBQVc7QUFBQSxNQUNmLElBQUksa0JBQWtCO0FBQUEsUUFDbEIsV0FBVyxXQUFXLGtCQUFrQjtBQUFBLFVBQ3BDLElBQUssTUFBTSxRQUFRLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTyxNQUFNO0FBQUEsWUFDMUMsV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLE1BRUEsTUFBTSxJQUFJLFFBQVEsSUFBSSxHQUFhO0FBQUEsTUFDbkMsSUFBSSxHQUFHO0FBQUEsUUFDSCxXQUFXLFdBQVcsR0FBRztBQUFBLFVBQ3JCLElBQUssTUFBTSxRQUFRLEtBQUssTUFBTyxNQUFNO0FBQUEsWUFDakMsV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFFWCxpQkFBaUIsT0FBOEQsS0FBVSxVQUFtQztBQUFBLE1BQ3hILE1BQU0sbUJBQW1CLFFBQVEsSUFBSSxHQUFHO0FBQUEsTUFDeEMsSUFBSSxXQUFXO0FBQUEsTUFDZixJQUFJLGtCQUFrQjtBQUFBLFFBQ2xCLFdBQVcsV0FBVyxrQkFBa0I7QUFBQSxVQUNwQyxJQUFLLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU8sTUFBTTtBQUFBLFlBQzFDLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxNQUVBLE1BQU0sSUFBSSxRQUFRLElBQUksR0FBYTtBQUFBLE1BQ25DLElBQUksR0FBRztBQUFBLFFBQ0gsV0FBVyxXQUFXLEdBQUc7QUFBQSxVQUNyQixJQUFLLE1BQU0sUUFBUSxLQUFLLE1BQU8sTUFBTTtBQUFBLFlBQ2pDLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRWY7QUFBQSxFQUVBLE9BQU87QUFBQTs7QUNySUosU0FBUyxVQUFhLEdBQWtCO0FBQUEsRUFDN0MsSUFBSSxTQUE4QztBQUFBLEVBQ2xELE1BQU0sUUFLRCxDQUFDO0FBQUEsRUFFTixNQUFNLFdBQVc7QUFBQSxJQUNmLE1BQU0sQ0FBQyxTQUFZO0FBQUEsTUFDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLFVBQVUsTUFBTTtBQUFBLFFBQ2hDLE1BQU0sT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUFBLFFBQ3hCLEtBQUssUUFBUTtBQUFBLFFBQ2IsS0FBSyxRQUFRLElBQUk7QUFBQSxRQUNqQjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsTUFBTSxZQUFZLFFBQVEsY0FBaUI7QUFBQSxRQUMzQyxVQUFVLFFBQVEsSUFBSTtBQUFBLFFBQ3RCLE1BQU0sS0FBSyxLQUFLLFdBQVcsT0FBTyxNQUFNLENBQVE7QUFBQTtBQUFBO0FBQUEsT0FHaEQ7QUFBQSxXQUNJLEtBQUksR0FBK0I7QUFBQSxRQUN2QyxJQUFJLFdBQVc7QUFBQSxVQUFXLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUEsUUFDM0QsSUFBSSxNQUFNLFdBQVcsR0FBRztBQUFBLFVBQ3RCLE1BQU0sWUFBWSxRQUFRLGNBQWlCO0FBQUEsVUFDM0MsTUFBTSxLQUFLLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBUTtBQUFBLFFBQ2pEO0FBQUEsUUFDQSxNQUFNLE9BQU8sTUFBTSxHQUFHLENBQUM7QUFBQSxRQUN2QixNQUFNLFNBQVMsTUFBTSxLQUFLO0FBQUEsUUFDMUIsTUFBTSxNQUFNO0FBQUEsUUFDWixPQUFPLEVBQUUsTUFBTSxXQUFXLFdBQVcsT0FBTyxPQUFPO0FBQUE7QUFBQSxXQUUvQyxPQUFNLEdBQWtDO0FBQUEsUUFDNUMsU0FBUztBQUFBLFFBQ1QsV0FBVyxRQUFRLE9BQU87QUFBQSxVQUN4QixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssUUFBUSxTQUFTO0FBQUEsUUFDeEI7QUFBQSxRQUNBLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUE7QUFBQSxXQUU3QixNQUFLLENBQUMsS0FBeUM7QUFBQSxRQUNuRCxTQUFTO0FBQUEsUUFDVCxJQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUEsVUFDdEIsTUFBTSxZQUFZLFFBQVEsY0FBaUI7QUFBQSxVQUMzQyxNQUFNLEtBQUssS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFRO0FBQUEsUUFDakQ7QUFBQSxRQUNBLFdBQVcsUUFBUSxPQUFPO0FBQUEsVUFDeEIsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLE9BQU8sR0FBRztBQUFBLFFBQ2pCO0FBQUEsUUFDQSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFFckM7QUFBQSxLQUNDLE9BQU8sY0FBYyxHQUFHO0FBQUEsTUFDdkIsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTztBQUFBOztBQ3BFVCxJQUFNLFdBQVc7QUFDakIsSUFBTSxlQUFlLFNBQVM7QUFFOUIsSUFBSSxlQUFlLElBQUksV0FBVyxHQUFHO0FBQ3JDLElBQUksb0JBQW9CO0FBQ3hCLElBQUksa0JBQWtCO0FBRWYsU0FBUyxVQUFVLEdBQVc7QUFBQSxFQUNqQyxJQUFJLG9CQUFvQixLQUFLLEtBQUs7QUFBQSxJQUM5QixPQUFPLGdCQUFnQixZQUFZO0FBQUEsSUFDbkMsb0JBQW9CO0FBQUEsRUFDeEI7QUFBQSxFQUNBLE1BQU0sS0FBSyxNQUFNLEtBQWEsRUFBRSxRQUFRLEdBQUcsQ0FBQztBQUFBLEVBRTVDLE1BQU0sS0FBSyxpQkFBaUIsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFBQSxFQUMvRCxTQUFTLElBQUksRUFBRyxJQUFJLEdBQUcsS0FBSztBQUFBLElBQ3hCLEdBQUcsS0FBSyxHQUFHO0FBQUEsRUFDZjtBQUFBLEVBRUEsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUN6QixHQUFHLEtBQUssU0FBUyxhQUFhLHVCQUF1QjtBQUFBLEVBQ3pEO0FBQUEsRUFFQSxNQUFNLFVBQVU7QUFBQSxFQUNoQixTQUFTLElBQUksR0FBSSxJQUFJLElBQUksS0FBSztBQUFBLElBQzFCLE1BQU0sTUFBTyxVQUFVLGFBQWEsc0JBQXNCLE9BQVE7QUFBQSxJQUNsRSxHQUFHLEtBQUssU0FBUyxNQUFNO0FBQUEsRUFDM0I7QUFBQSxFQUNBLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQTtBQUdyQixTQUFTLGdCQUFnQixDQUFDLE9BQXVCO0FBQUEsRUFDN0MsTUFBTSxPQUFPLE9BQU8sWUFBWTtBQUFBLEVBQ2hDLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxVQUFVO0FBQUEsRUFFZCxJQUFJLFlBQVk7QUFBQSxJQUFJLE9BQU8sU0FBUztBQUFBLEVBRXBDLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDakIsTUFBTSxZQUFZLFVBQVU7QUFBQSxJQUM1QixTQUFTLFNBQVMsT0FBTyxTQUFTLEtBQUs7QUFBQSxJQUN2QyxVQUFVLFVBQVU7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsT0FBTztBQUFBOzs7QUN2Q0osU0FBUywrQkFBK0IsR0FBRztBQUFBLEVBQ2hELE9BQU87QUFBQTs7O0FDaUNULGVBQXNCLFdBQTZDLENBQUMsV0FBMEIsY0FBd0QsU0FBMEM7QUFBQSxFQUM1TCxNQUFNLFlBQVksUUFBUSxhQUFhLGdDQUFnQztBQUFBLEVBQ3ZFLE1BQU0sVUFBUyxNQUFNLGFBQWEsSUFBSTtBQUFBLEVBRXRDLE1BQU0sVUFBVTtBQUFBLElBQ1osU0FBUyxJQUFJO0FBQUEsSUFDYjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQU0sZUFBZSxtQkFBbUI7QUFBQSxFQUV4QyxJQUFJLFFBQVE7QUFBQSxJQUFXLFFBQVEsa0JBQWtCLFFBQVEsa0JBQWtCLFFBQVEsa0JBQWtCLElBQUk7QUFBQSxFQUV6RyxNQUFNLElBQXNDO0FBQUEsT0FDckM7QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLElBQ0EsSUFBSSxhQUFhO0FBQUEsSUFDakIsS0FBSyxhQUFhO0FBQUEsSUFDbEIsTUFBTSxhQUFhO0FBQUEsSUFDbkIsaUJBQWlCLGFBQWE7QUFBQSxJQUM5QixpQkFBaUIsYUFBYTtBQUFBLElBQzlCLGtCQUFrQixhQUFhO0FBQUEsSUFDL0Isc0JBQXNCLGFBQWE7QUFBQSxFQUN2QztBQUFBLEVBRUEsTUFBTSxXQUFXLGVBQWUsV0FBVyxDQUFDO0FBQUEsRUFDNUMsTUFBTSxXQUFXLGVBQWUsV0FBVyxHQUFHLFFBQVE7QUFBQSxFQUd0RCxNQUFNLFFBQVE7QUFBQSxJQUNWO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxJQUNqQixLQUFLLGFBQWE7QUFBQSxJQUNsQixNQUFNLGFBQWE7QUFBQSxJQUNuQixpQkFBaUIsYUFBYTtBQUFBLElBQzlCLGlCQUFpQixhQUFhO0FBQUEsSUFFOUI7QUFBQSxJQUVBO0FBQUEsRUFDSjtBQUFBLEVBRUEsUUFBUSxNQUFNO0FBQUEsRUFFZCxJQUFJLE1BQU0sUUFBUSxRQUFRLFVBQVUsR0FBRztBQUFBLElBQ25DLFdBQVcsYUFBYSxRQUFRLFlBQVk7QUFBQSxNQUN4QyxNQUFNLFVBQVUsS0FBa0Q7QUFBQSxJQUN0RTtBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQU0sUUFBUSxJQUFJLFVBQVUsY0FBYyxhQUFhLEtBQUssQ0FBQztBQUFBLEVBRTdELE1BQU0sWUFBWSxPQUFPLEtBQUssVUFBVSxXQUFrQztBQUFBLEVBQzFFLFFBQVEsSUFBSTtBQUFBO0FBQUEsTUFBbUIsVUFBVSxLQUFLO0FBQUEsS0FBUTtBQUFBLGVBQW1CLFVBQVUsZ0JBQWdCO0FBQUEsRUFDbkcsUUFBUSxJQUFJO0FBQUEsNkJBQStCLFFBQVEsTUFBTTtBQUFBLEVBRXpELE9BQU87QUFBQTs7QUNoR0osU0FBUyxLQUFtQyxDQUFDLE1BQXFDO0FBQUEsRUFDdkYsT0FBTztBQUFBOztBQ01ULGVBQXNCLGlCQUFpQixDQUFDLFNBQXdDLE9BQXNCOzs7QUNrQnRHLFNBQVMsYUFBYSxHQUFXO0FBQUEsRUFDN0IsTUFBTSxJQUFJLElBQUk7QUFBQSxFQUNkLE9BQU8sSUFBSSxFQUFFLFlBQVksS0FBSyxPQUFPLEVBQUUsU0FBUyxJQUFJLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRyxLQUFLLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRyxLQUFLLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRyxLQUFLLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRyxLQUFLLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUFBO0FBSWpQLElBQU0sbUJBQW1CLENBQUMsUUFBc0I7QUFBQSxFQUM1QyxJQUFJLEtBQUs7QUFBQSxFQUFLLElBQUk7QUFBQSxFQUNsQixRQUFRLElBQUksR0FBRyxHQUFHO0FBQUEsRUFDbEIsT0FBTztBQUFBO0FBR0osU0FBUyxZQUFvSCxDQUFDLFNBQXdCLE1BQWMsV0FBMkI7QUFBQSxFQUNsTSxNQUFNLFNBQVMsQ0FBQztBQUFBLEVBRWhCLE1BQU0sT0FBbUIsQ0FBQztBQUFBLEVBQzFCLE1BQU0sT0FBNkIsSUFBSTtBQUFBLEVBRXZDLE1BQU0sWUFBWSxRQUFRLHFCQUFxQjtBQUFBLEVBQy9DLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQyxRQUFRO0FBQUEsRUFDaEMsTUFBTSxZQUFZLFFBQVE7QUFBQSxFQUUxQixPQUFPLElBQUk7QUFBQSxJQUNQO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUSxDQUFDLFlBQXNCO0FBQUEsTUFDM0IsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUFvQjtBQUFBLE1BQ2pDLE9BQU8sUUFBUSxtQkFBbUIsU0FBUyxNQUFNLElBQUk7QUFBQTtBQUFBLEVBRTdEO0FBQUEsRUFFQSxNQUFNLFlBQVksQ0FBQyxLQUFhLFVBQXlCO0FBQUEsSUFDckQsS0FBSyxJQUFJLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFdkIsTUFBTSxZQUFZLENBQUMsUUFBa0I7QUFBQSxJQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHO0FBQUEsTUFBRyxPQUFPO0FBQUEsSUFDNUIsSUFBSTtBQUFBLE1BQWUsS0FBSyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7QUFBQSxJQUNyQyxJQUFJO0FBQUEsTUFBZ0Isa0JBQWtCLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixJQUFJLENBQUM7QUFBQSxJQUM3RSxPQUFPO0FBQUE7QUFBQSxFQUdYLE9BQU8sU0FBUztBQUFBLEVBQ2hCLE9BQU8sU0FBUyxJQUFJLFFBQWEsVUFBVSxHQUFHO0FBQUEsRUFFOUMsTUFBTSxTQUFTO0FBQUEsRUFFZixPQUFPLFFBQVEsQ0FBQyxnQkFBd0IsV0FBMkIsVUFBVSxDQUFDLFdBQVcsTUFBTSxXQUFXLE9BQU8sR0FBRztBQUFBLEVBQUssZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ2xKLE9BQU8sT0FBTyxDQUFDLGdCQUF3QixXQUEyQixVQUFVLENBQUMsVUFBVSxNQUFNLFdBQVcsT0FBTyxHQUFHO0FBQUEsRUFBSyxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDaEosT0FBTyxPQUFPLENBQUMsZ0JBQXdCLFdBQTJCLFVBQVUsQ0FBQyxVQUFVLE1BQU0sV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUFLLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUNoSixPQUFPLFFBQVEsQ0FBQyxnQkFBd0IsV0FBMkIsVUFBVSxDQUFDLFdBQVcsTUFBTSxXQUFXLE9BQU8sR0FBRztBQUFBLEVBQUssZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ2xKLE9BQU8sVUFBVSxDQUFDLGdCQUF3QixXQUEyQixVQUFVLENBQUMsYUFBYSxNQUFNLFdBQVcsT0FBTyxHQUFHO0FBQUEsRUFBSyxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDdEosT0FBTyxXQUFXLENBQUMsZ0JBQXdCLFdBQTJCLFVBQVUsQ0FBQyxjQUFjLE1BQU0sV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUFLLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUV4SixPQUFPO0FBQUE7O0FDakVKLFNBQVMsVUFBVSxHQUFjO0FBQUEsRUFDdEMsTUFBTSxpQkFBaUI7QUFBQSxJQUNyQixhQUFhO0FBQUEsSUFDYixRQUFRLENBQUM7QUFBQSxJQUNULElBQUksQ0FBQyxTQUF1QztBQUFBLE1BQzFDLGVBQWUsT0FBTyxLQUFLLE9BQU87QUFBQSxNQUNsQyxPQUFPO0FBQUE7QUFBQSxTQUVILElBQUcsR0FBRztBQUFBLE1BQ1YsSUFBSSxRQUFRLENBQUM7QUFBQSxNQUNiLFdBQVcsUUFBUSxlQUFlLFFBQVE7QUFBQSxRQUN4QyxRQUFRLEtBQUssVUFBVyxNQUFNLEtBQUssS0FBSyxFQUFHO0FBQUEsTUFDN0M7QUFBQSxNQUNBLE1BQU0sU0FBMkIsQ0FBQztBQUFBLE1BQ2xDLFdBQVcsT0FBTyxPQUFPO0FBQUEsUUFDdkIsTUFBTSxRQUFTLE1BQWM7QUFBQSxRQUM3QixJQUFJLENBQUMsSUFBSSxXQUFXLEdBQUc7QUFBQSxVQUFHLE9BQU8sT0FBTztBQUFBLE1BQzFDO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxFQUVYO0FBQUEsRUFDQSxPQUFPO0FBQUE7O0FDbENGLE1BQU0sS0FBUTtBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsRUFFUixXQUFXLEdBQUc7QUFBQSxJQUNWLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDaEIsS0FBSyxRQUFRLElBQUk7QUFBQTtBQUFBLEVBR3JCLEdBQUcsQ0FBQyxNQUFjLE9BQWdCO0FBQUEsSUFDOUIsTUFBTSxRQUFRLEtBQ1QsUUFBUSxjQUFjLEVBQUUsRUFDeEIsTUFBTSxHQUFHLEVBQ1QsT0FBTyxDQUFDLE1BQU0sTUFBTSxFQUFFO0FBQUEsSUFDM0IsSUFBSSxjQUFjLEtBQUs7QUFBQSxJQUN2QixJQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUEsTUFDcEIsWUFBWSxRQUFRO0FBQUEsTUFDcEIsS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDMUI7QUFBQSxJQUNKO0FBQUEsSUFDQSxXQUFXLFNBQVEsT0FBTztBQUFBLE1BQ3RCLElBQUksQ0FBQyxZQUFZLFNBQVMsSUFBSSxLQUFJLEdBQUc7QUFBQSxRQUNqQyxZQUFZLFNBQVMsSUFBSSxPQUFNLElBQUksUUFBVTtBQUFBLE1BQ2pEO0FBQUEsTUFDQSxjQUFjLFlBQVksU0FBUyxJQUFJLEtBQUk7QUFBQSxJQUMvQztBQUFBLElBQ0EsWUFBWSxRQUFRO0FBQUEsSUFDcEIsS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUc5QixHQUFHLENBQUMsTUFBd0I7QUFBQSxJQUN4QixNQUFNLFNBQVMsS0FBSyxNQUFNLElBQUksSUFBSTtBQUFBLElBQ2xDLElBQUksV0FBVztBQUFBLE1BQVcsT0FBTztBQUFBLElBRWpDLE1BQU0sUUFBUSxLQUNULFFBQVEsY0FBYyxFQUFFLEVBQ3hCLE1BQU0sR0FBRyxFQUNULE9BQU8sQ0FBQyxNQUFNLE1BQU0sRUFBRTtBQUFBLElBQzNCLElBQUksY0FBYyxLQUFLO0FBQUEsSUFDdkIsV0FBVyxTQUFRLE9BQU87QUFBQSxNQUN0QixJQUFJLENBQUMsWUFBWSxTQUFTLElBQUksS0FBSSxHQUFHO0FBQUEsUUFDakMsS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJO0FBQUEsUUFDekIsT0FBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLGNBQWMsWUFBWSxTQUFTLElBQUksS0FBSTtBQUFBLElBQy9DO0FBQUEsSUFDQSxNQUFNLFNBQVMsWUFBWTtBQUFBLElBQzNCLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTTtBQUFBLElBQzNCLE9BQU87QUFBQTtBQUFBLEVBR1gsVUFBVSxDQUFDLE9BQTJCO0FBQUEsSUFDbEMsSUFBSSxjQUFjLEtBQUs7QUFBQSxJQUN2QixXQUFXLFNBQVEsT0FBTztBQUFBLE1BQ3RCLElBQUksQ0FBQyxZQUFZLFNBQVMsSUFBSSxLQUFJO0FBQUEsUUFBRyxPQUFPO0FBQUEsTUFDNUMsY0FBYyxZQUFZLFNBQVMsSUFBSSxLQUFJO0FBQUEsSUFDL0M7QUFBQSxJQUNBLE9BQU8sWUFBWTtBQUFBO0FBQUEsRUFHdkIsR0FBRyxDQUFDLE1BQXVCO0FBQUEsSUFDdkIsT0FBTyxLQUFLLElBQUksSUFBSSxNQUFNO0FBQUE7QUFFbEM7QUFBQTtBQUVBLE1BQU0sU0FBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsRUFFQSxXQUFXLEdBQUc7QUFBQSxJQUNWLEtBQUssV0FBVyxJQUFJO0FBQUEsSUFDcEIsS0FBSyxRQUFRO0FBQUE7QUFFckI7OztBQ3ZFTyxTQUFTLGdCQUFnQixDQUFDLE1BQThCLFFBQWdEO0FBQUEsRUFDM0csTUFBTSxTQUFpQyxDQUFDO0FBQUEsRUFDeEMsSUFBSSxNQUFNO0FBQUEsSUFBa0IsT0FBTyxrQ0FBa0MsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsRUFDcEcsSUFBSSxNQUFNO0FBQUEsSUFBa0IsT0FBTyxrQ0FBa0MsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsRUFDcEcsSUFBSSxNQUFNLGVBQWU7QUFBQSxJQUFXLE9BQU8sNEJBQTRCLE9BQU8sS0FBSyxVQUFVO0FBQUEsRUFDN0YsSUFBSSxNQUFNLG1CQUFtQixLQUFLLGdCQUFnQixTQUFTLEdBQUc7QUFBQSxJQUMxRCxNQUFNLGFBQWEsS0FBSyxnQkFBZ0IsU0FBUyxHQUFHO0FBQUEsSUFDcEQsSUFBSSxLQUFLLHNCQUFzQjtBQUFBLE1BRzNCLElBQUksV0FBVyxjQUFjLEtBQUssZ0JBQWdCLFNBQVMsTUFBTSxJQUFJO0FBQUEsUUFDakUsT0FBTyxpQ0FBaUM7QUFBQSxRQUN4QyxPQUFPLFVBQVU7QUFBQSxRQUNqQixPQUFPLHNDQUFzQztBQUFBLE1BQ2pEO0FBQUEsSUFDSixFQUFPO0FBQUEsTUFDSCxJQUFJLFlBQVk7QUFBQSxRQUNaLE9BQU8saUNBQWlDO0FBQUEsTUFDNUMsRUFBTyxTQUFJLFVBQVUsS0FBSyxnQkFBZ0IsU0FBUyxNQUFNLEdBQUc7QUFBQSxRQUN4RCxPQUFPLGlDQUFpQztBQUFBLFFBQ3hDLE9BQU8sVUFBVTtBQUFBLE1BQ3JCO0FBQUE7QUFBQSxFQUVSO0FBQUEsRUFDQSxJQUFJLE1BQU0scUJBQXFCLEtBQUssa0JBQWtCLFNBQVM7QUFBQSxJQUFHLE9BQU8sbUNBQW1DLEtBQUssa0JBQWtCLEtBQUssSUFBSTtBQUFBLEVBQzVJLE9BQU87QUFBQTs7O0FDUkosU0FBUyxjQUFjLENBQUMsV0FBMEIsU0FBYyxVQUE2QztBQUFBLEVBQ2hILE1BQU0sT0FBTyxRQUFRO0FBQUEsRUFDckIsTUFBTSxPQUFPLElBQUk7QUFBQSxFQUVqQixNQUFNLE9BQW1CLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLGVBQWUsR0FBRyxZQUFZLE1BQU0sUUFBUSxNQUFNLEtBQUs7QUFBQSxFQUM1SixNQUFNLG1CQUFtQixJQUFJO0FBQUEsRUFDN0IsTUFBTSxpQkFBaUIsQ0FBQyxXQUFrRDtBQUFBLElBQ3RFLE1BQU0sTUFBTSxVQUFVO0FBQUEsSUFDdEIsSUFBSSxTQUFTLGlCQUFpQixJQUFJLEdBQUc7QUFBQSxJQUNyQyxJQUFJLFdBQVc7QUFBQSxNQUFXLE9BQU87QUFBQSxJQUNqQyxTQUFTLGlCQUFpQixNQUFNLE1BQU07QUFBQSxJQUN0QyxpQkFBaUIsSUFBSSxLQUFLLE1BQU07QUFBQSxJQUNoQyxPQUFPO0FBQUE7QUFBQSxFQUdYLE1BQU0seUJBQWlEO0FBQUEsSUFDbkQsaUJBQWlCO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsRUFDcEI7QUFBQSxFQUVBLE1BQU0sdUJBQStDLEtBQUssZUFBZSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsRUFHMUcsTUFBTSxvQkFBb0I7QUFBQSxFQUMxQixNQUFNLGVBQWU7QUFBQSxFQUNyQixNQUFNLFdBQVc7QUFBQSxFQUVqQixNQUFNLG1CQUFtQixFQUFFLE1BQU0sSUFBSSxRQUFRLEtBQUssU0FBUyxxQkFBcUI7QUFBQSxFQUdoRixJQUFJLHVCQUF1QjtBQUFBLEVBQzNCLElBQUksMEJBQTBCO0FBQUEsRUFDOUIsTUFBTSxzQkFBc0IsTUFBZTtBQUFBLElBQ3ZDLE1BQU0sSUFBSSxRQUFRO0FBQUEsSUFDbEIsSUFBSSxNQUFNLHlCQUF5QjtBQUFBLE1BQy9CLDBCQUEwQjtBQUFBLE1BQzFCLHVCQUNJLENBQUMsUUFBUSxtQkFBbUIsc0JBQXNCLEtBQ2xELENBQUMsUUFBUSxtQkFBbUIscUJBQXFCLEtBQ2pELENBQUMsUUFBUSxtQkFBbUIsb0JBQW9CLEtBQ2hELENBQUMsUUFBUSxtQkFBbUIscUJBQXFCLEtBQ2pELENBQUMsUUFBUSxtQkFBbUIscUJBQXFCO0FBQUEsSUFDekQ7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBRVgsTUFBTSx3QkFBd0IsQ0FBQyxDQUFDLFFBQVE7QUFBQSxFQUd4QyxNQUFNLGFBQXFCO0FBQUEsSUFDdkIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFVLE1BQU0sSUFBSSxLQUF3QixRQUFRLE1BQU0sR0FBSTtBQUFBLElBQzFFLFFBQVEsTUFBTTtBQUFBLElBQ2QsUUFBUSxJQUFJLFVBQWUsQ0FBQztBQUFBLElBQzVCLE9BQU8sQ0FBQyxpQkFBeUIsYUFBNkIsQ0FBQztBQUFBLElBQy9ELE1BQU0sQ0FBQyxpQkFBeUIsYUFBNkIsQ0FBQztBQUFBLElBQzlELE1BQU0sQ0FBQyxpQkFBeUIsYUFBNkIsQ0FBQztBQUFBLElBQzlELE9BQU8sQ0FBQyxpQkFBeUIsYUFBNkIsQ0FBQztBQUFBLElBQy9ELFNBQVMsQ0FBQyxpQkFBeUIsYUFBNkIsQ0FBQztBQUFBLElBQ2pFLFVBQVUsQ0FBQyxpQkFBeUIsYUFBNkIsQ0FBQztBQUFBLEVBQ3RFO0FBQUEsRUFJQSxNQUFNLG1CQUF3QjtBQUFBLElBQzFCO0FBQUEsSUFDQSxTQUFTLFFBQVE7QUFBQSxJQUNqQixRQUFRO0FBQUEsSUFDUixNQUFNLFFBQVE7QUFBQSxJQUNkLGlCQUFpQixRQUFRO0FBQUEsSUFDekIsaUJBQWlCLFFBQVE7QUFBQSxJQUN6QixRQUFRLFFBQVEsUUFBUTtBQUFBLElBQ3hCLE9BQU8sVUFBVTtBQUFBLElBQ2pCLFdBQVcsTUFBTTtBQUFBLElBQ2pCLEdBQUc7QUFBQSxJQUNILElBQUksQ0FBQyxRQUFhLEdBQVE7QUFBQSxNQUFFLE9BQU8sU0FBUyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQUE7QUFBQSxFQUN0RTtBQUFBLEVBR0EsSUFBSSxvQkFBeUI7QUFBQSxFQUM3QixJQUFJLG1CQUFrQztBQUFBLEVBRXRDLElBQUksdUJBQTRCO0FBQUEsRUFDaEMsSUFBSSxnQkFBcUI7QUFBQSxFQUN6QixJQUFJLHVCQUFnQztBQUFBLEVBRXBDLE1BQU0sUUFBUSxPQUFPLFlBTUk7QUFBQSxJQUVyQixNQUFNLFNBQVUsUUFBUSxRQUFnQixZQUFZLFFBQVEsUUFBUSxRQUFRLElBQUksUUFBUTtBQUFBLElBRXhGLElBQUksUUFBUSxRQUFRLFdBQVcsV0FBVztBQUFBLE1BQ3RDLE9BQU8sSUFBSSxTQUFTLFdBQVc7QUFBQSxRQUMzQixTQUFTLGVBQWUsTUFBTTtBQUFBLE1BQ2xDLENBQUM7QUFBQSxJQUNMO0FBQUEsSUFHQSxNQUFNLFdBQVksUUFBUSxRQUFnQixjQUFjLElBQUksSUFBSSxRQUFRLFFBQVEsR0FBRyxFQUFFO0FBQUEsSUFDckYsSUFBSSxTQUFTLFNBQVMsZUFBZSxHQUFHO0FBQUEsTUFDcEMsTUFBTSxlQUFjLGVBQWUsTUFBTTtBQUFBLE1BQ3pDLE9BQU8sSUFBSSxTQUFTLE1BQU07QUFBQSxRQUN0QixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUEsVUFDTCxRQUFRO0FBQUEsYUFDTDtBQUFBLFVBQ0gsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCLG9CQUFvQixLQUFLLElBQUk7QUFBQSxRQUNqRDtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUVBLE1BQU0sZUFBZ0IsUUFBUSxRQUFnQjtBQUFBLElBQzlDLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLElBQUksQ0FBQyxRQUFRLGNBQWMsQ0FBQyxRQUFRLG1CQUFtQixRQUFRLG9CQUFvQixJQUFJO0FBQUEsTUFDbkYsYUFBYTtBQUFBLE1BQ2IsWUFBWSxnQkFBZ0IsU0FBUyxVQUFVLENBQUMsRUFBRSxNQUFNLEdBQUc7QUFBQSxJQUMvRCxFQUFPO0FBQUEsTUFDSCxZQUFZLGdCQUFnQixTQUFTLFVBQVUsQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUFBLE1BQzNELElBQUksUUFBUSxhQUFhLFVBQVUsR0FBRyxDQUFDLE1BQU0sUUFBUSxXQUFXO0FBQUEsUUFDNUQsTUFBTSxlQUFjLGVBQWUsTUFBTTtBQUFBLFFBQ3pDLElBQUksUUFBUTtBQUFBLFVBQWEsT0FBTyxFQUFFLGVBQWUsTUFBTSxNQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsYUFBWTtBQUFBLFFBQ25HLE9BQU8sSUFBSSxTQUFTLFdBQVc7QUFBQSxVQUMzQixRQUFRO0FBQUEsVUFDUixTQUFTO0FBQUEsUUFDYixDQUFDO0FBQUEsTUFDTDtBQUFBLE1BQ0EsSUFBSSxRQUFRLG9CQUFvQixhQUFhLFFBQVEsb0JBQW9CO0FBQUEsUUFBRyxZQUFZLFVBQVUsTUFBTSxRQUFRLGVBQWU7QUFBQSxNQUMvSCxhQUFhLElBQUksVUFBVSxLQUFLLEdBQUc7QUFBQTtBQUFBLElBSXZDLE1BQU0sV0FBWSxRQUFRLFFBQWdCO0FBQUEsSUFDMUMsTUFBTSxLQUFLLFFBQVEsU0FBUyxRQUFRLE9BQU8sUUFBUSxRQUFRLE9BQU8sSUFBSTtBQUFBLElBR3RFLElBQUksUUFBUSxZQUFZLFVBQVUsV0FBVyxXQUFXLFVBQVUsR0FBRztBQUFBLE1BQ2pFLE1BQU0sYUFBYSxtQkFBbUIsV0FBVyxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQ3pELElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxRQUVBLElBQUksT0FBTyxTQUFTLGFBQWE7QUFBQSxVQUM3QixZQUFZLEtBQUssVUFBVTtBQUFBLFFBQy9CLEVBQU8sU0FBSSxPQUFPLFdBQVcsYUFBYTtBQUFBLFVBQ3RDLFlBQVksT0FBTyxLQUFLLFlBQVksUUFBUSxFQUFFLFNBQVM7QUFBQSxRQUMzRCxFQUFPO0FBQUEsVUFDSCxNQUFNLElBQUksTUFBTSw2QkFBNkI7QUFBQTtBQUFBLFFBRW5ELE1BQU07QUFBQSxRQUNKLE1BQU0sZUFBYyxlQUFlLE1BQU07QUFBQSxRQUN6QyxNQUFNLFFBQU8sS0FBSyxVQUFVLEVBQUUsU0FBUyxPQUFPLE1BQU0sNkJBQTZCLFFBQVEsRUFBRSxVQUFVLDBCQUEwQixFQUFFLENBQUM7QUFBQSxRQUNsSSxJQUFJLFFBQVE7QUFBQSxVQUFhLE9BQU8sRUFBRSxlQUFlLE1BQU0sYUFBTSxRQUFRLEtBQUssU0FBUyxLQUFLLGNBQWEsZ0JBQWdCLG1CQUFtQixFQUFFO0FBQUEsUUFDMUksT0FBTyxJQUFJLFNBQVMsT0FBTSxFQUFFLFFBQVEsS0FBSyxTQUFTLEtBQUssY0FBYSxnQkFBZ0IsbUJBQW1CLEVBQUUsQ0FBQztBQUFBO0FBQUEsTUFHOUcsSUFBSSxZQUFpQjtBQUFBLE1BQ3JCLE1BQU0sVUFBVSxhQUFhLFlBQVksV0FBVyxNQUFNLFFBQVEsUUFBUSxLQUFLO0FBQUEsTUFDL0UsSUFBSSxXQUFXLFlBQVksTUFBTSxZQUFZLE1BQU07QUFBQSxRQUMvQyxJQUFJO0FBQUEsVUFDQSxZQUFZLGdCQUFnQixLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsVUFDakQsTUFBTTtBQUFBLFVBQ0osTUFBTSxlQUFjLGVBQWUsTUFBTTtBQUFBLFVBQ3pDLE1BQU0sUUFBTyxLQUFLLFVBQVUsRUFBRSxTQUFTLE9BQU8sTUFBTSw2QkFBNkIsUUFBUSxFQUFFLFVBQVUsT0FBTyxFQUFFLENBQUM7QUFBQSxVQUMvRyxJQUFJLFFBQVE7QUFBQSxZQUFhLE9BQU8sRUFBRSxlQUFlLE1BQU0sYUFBTSxRQUFRLEtBQUssU0FBUyxLQUFLLGNBQWEsZ0JBQWdCLG1CQUFtQixFQUFFO0FBQUEsVUFDMUksT0FBTyxJQUFJLFNBQVMsT0FBTSxFQUFFLFFBQVEsS0FBSyxTQUFTLEtBQUssY0FBYSxnQkFBZ0IsbUJBQW1CLEVBQUUsQ0FBQztBQUFBO0FBQUEsTUFFbEg7QUFBQSxNQUVBLE1BQU0sYUFBWSxXQUFXO0FBQUEsTUFDN0IsTUFBTSxlQUFjLGVBQWUsTUFBTTtBQUFBLE1BQ3pDLE1BQU0sY0FBYyxLQUFLLGNBQWEsZ0JBQWdCLG9CQUFvQixpQkFBaUIsV0FBVztBQUFBLE1BRXRHLElBQUk7QUFBQSxRQUNBLE1BQU0sUUFBUSxLQUFLLFdBQVcsU0FBUztBQUFBLFFBQ3pDLE9BQU8sV0FBVztBQUFBLFFBQ2hCLE1BQU0sWUFBWSxpQkFBaUIsWUFBVyxZQUFZLFNBQVM7QUFBQSxRQUNuRSxNQUFNLFVBQVUsS0FBSyxVQUFVLFNBQVM7QUFBQSxRQUN4QyxJQUFJLFFBQVE7QUFBQSxVQUFhLE9BQU8sRUFBRSxlQUFlLE1BQU0sTUFBTSxTQUFTLFFBQVEsS0FBSyxTQUFTLFlBQVk7QUFBQSxRQUN4RyxPQUFPLElBQUksU0FBUyxTQUFTLEVBQUUsUUFBUSxLQUFLLFNBQVMsWUFBWSxDQUFDO0FBQUE7QUFBQSxNQUd0RSxNQUFNLE9BQU8sV0FBVyxLQUFLLFVBQVUsYUFBYSxDQUFDLENBQUMsa0JBQWtCO0FBQUEsTUFDeEUsSUFBSSxRQUFRO0FBQUEsUUFBYSxPQUFPLEVBQUUsZUFBZSxNQUFNLE1BQU0sUUFBUSxLQUFLLFNBQVMsWUFBWTtBQUFBLE1BQy9GLE9BQU8sSUFBSSxTQUFTLE1BQU0sRUFBRSxRQUFRLEtBQUssU0FBUyxZQUFZLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBUUEsSUFBSSxRQUFRLGVBQWUsQ0FBQyxVQUFVLG9CQUFvQixHQUFHO0FBQUEsTUFDekQsTUFBTSxhQUFjLFFBQVEsUUFBZ0I7QUFBQSxNQUM1QyxJQUFJLGVBQWUsT0FBTztBQUFBLFFBRXRCLElBQUksY0FBYyxRQUFRO0FBQUEsUUFDMUIsSUFBSSxDQUFDLGFBQWE7QUFBQSxVQUNkLElBQUksZUFBZSxvQkFBb0IsbUJBQW1CO0FBQUEsWUFDdEQsY0FBYztBQUFBLFVBQ2xCLEVBQU87QUFBQSxZQUNILGNBQWMsS0FBSyxJQUFJLFVBQVU7QUFBQSxZQUNqQyxJQUFJLGdCQUFnQixNQUFNO0FBQUEsY0FDdEIsb0JBQW9CO0FBQUEsY0FDcEIsbUJBQW1CO0FBQUEsWUFDdkIsRUFBTztBQUFBLGNBQ0gsY0FBYyxVQUFVLGNBQWM7QUFBQSxjQUN0QyxJQUFJLGdCQUFnQixXQUFXLENBRS9CLEVBQU87QUFBQSxnQkFDSCxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsa0JBQVksWUFBWSxTQUFTLE1BQU0sWUFBWTtBQUFBLGdCQUNoRjtBQUFBLDhCQUFZLFNBQVMsTUFBTSxZQUFZLE9BQU87QUFBQSxnQkFDbkQsS0FBSyxJQUFJLFlBQVksV0FBVztBQUFBLGdCQUNoQyxvQkFBb0I7QUFBQSxnQkFDcEIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFJbkM7QUFBQSxRQUVBLElBQUksZUFBZSxZQUFZLFNBQVMsVUFBVTtBQUFBLFVBRTlDLElBQUksaUJBQWlCO0FBQUEsVUFDckIsSUFBSSxVQUFVO0FBQUEsVUFDZCxJQUFJLGlCQUFpQjtBQUFBLFVBQ3JCLElBQUksZ0JBQWdCLG1CQUFtQjtBQUFBLFlBQ25DLGlCQUFpQixZQUFZO0FBQUEsWUFDN0IsVUFBVSxZQUFZLE9BQU87QUFBQSxZQUM3QixNQUFNLE9BQU8sWUFBWSxRQUFRO0FBQUEsWUFDakMsaUJBQWlCLE1BQU0sZUFBZSxTQUFVLE1BQU0sUUFBUSxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQUssV0FBVyxTQUFTLFFBQVE7QUFBQSxZQUNySCx1QkFBdUI7QUFBQSxZQUN2QixnQkFBZ0I7QUFBQSxZQUNoQix1QkFBdUI7QUFBQSxVQUMzQjtBQUFBLFVBRUEsTUFBTSxhQUFZLFdBQVc7QUFBQSxVQUM3QixNQUFNLE9BQU8sYUFBYSxZQUFZLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSztBQUFBLFVBRzVFLElBQUk7QUFBQSxVQUNKLElBQUksV0FBVztBQUFBLFVBQ2YsSUFBSSxDQUFDLFFBQVEsU0FBUyxNQUFNLFNBQVMsTUFBTTtBQUFBLFlBQ3ZDLFNBQVMsQ0FBQztBQUFBLFVBQ2QsRUFBTztBQUFBLFlBQ0gsSUFBSTtBQUFBLGNBQ0EsU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLGNBQ3pDLElBQUksT0FBTyxXQUFXO0FBQUEsZ0JBQWEsU0FBUyxDQUFDO0FBQUEsY0FDL0MsTUFBTTtBQUFBLGNBQ0osV0FBVztBQUFBO0FBQUE7QUFBQSxVQUluQixJQUFJLFlBQVksV0FBVyxRQUFRLE9BQU8sV0FBVyxZQUFZLENBQUMsTUFBTSxRQUFRLE1BQU0sR0FBRztBQUFBLFlBRXJGLElBQUksUUFBUSxZQUFZLFVBQVUsRUFBRSwyQkFBMkIsU0FBUztBQUFBLGNBRXBFLElBQUksQ0FBQyxnQkFBZ0I7QUFBQSxnQkFDakIsTUFBTSxhQUFhLGVBQWUsTUFBTTtBQUFBLGdCQUN4QyxJQUFJLENBQUMsV0FBVyxTQUFTO0FBQUEsa0JBRXJCLFdBQVc7QUFBQSxnQkFDZjtBQUFBLGNBQ0o7QUFBQSxjQUVBLElBQUksVUFBVTtBQUFBLGdCQUVWLE1BQU0sV0FBZSxPQUFPLE9BQU8sZ0JBQWdCO0FBQUEsZ0JBQ25ELFNBQVEsT0FBTztBQUFBLGdCQUNmLFNBQVEsWUFBWTtBQUFBLGdCQUNwQixTQUFRLE9BQU87QUFBQSxrQkFDWCxLQUFLO0FBQUEsa0JBQ0w7QUFBQSxrQkFDQSxNQUFNLEVBQUUsUUFBUSxZQUFZLE9BQU8sVUFBVTtBQUFBLGtCQUM3QyxRQUFRLEVBQUUsUUFBUSxNQUFNLFFBQVEsT0FBTztBQUFBLGtCQUN2QyxTQUFTLFFBQVE7QUFBQSxrQkFDakIsVUFBVTtBQUFBLGtCQUNWO0FBQUEsZ0JBQ0o7QUFBQSxnQkFDQSxTQUFRLFVBQVUsUUFBUSxRQUFRO0FBQUEsZ0JBRWxDLElBQUk7QUFBQSxrQkFDQSxNQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVMsTUFBTTtBQUFBLGtCQUU1QyxJQUFJLFdBQVcsYUFBYSxXQUFXLFFBQVEsV0FBVyxJQUFJO0FBQUEsb0JBQzFELE9BQU8sRUFBRSxlQUFlLE1BQU0sTUFBTSxvQkFBb0IsYUFBWSxVQUFVLFFBQVEsS0FBSyxTQUFTLHFCQUFxQjtBQUFBLGtCQUM3SCxFQUFPLFNBQUksQ0FBQyxNQUFNLFFBQVEsTUFBTSxLQUFLLE9BQU8sV0FBVyxVQUFVO0FBQUEsb0JBQzdELE9BQU8sRUFBRSxlQUFlLE1BQU0sTUFBTSxlQUFlLEtBQUssVUFBVSxNQUFNLElBQUksbUJBQW1CLGFBQVksVUFBVSxRQUFRLEtBQUssU0FBUyxxQkFBcUI7QUFBQSxrQkFDcEs7QUFBQSxrQkFFRixNQUFNO0FBQUEsY0FHWjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsSUFHQSxNQUFNLGNBQWMsZUFBZSxNQUFNO0FBQUEsSUFDekMsTUFBTSxZQUFZLFNBQVMsWUFBWSxNQUFNLFFBQVEsVUFBVSxRQUFRLFFBQVEsT0FBTyxJQUFJLFdBQVc7QUFBQSxJQUNyRyxNQUFNLGtCQUFrQixDQUFDLG9CQUFvQjtBQUFBLElBRTdDLE1BQU0sU0FBUyxhQUFhLFNBQVMsWUFBWSxTQUFTO0FBQUEsSUFDMUQsSUFBSTtBQUFBLE1BQWlCLFFBQVEsUUFBUSxRQUFRLElBQUksV0FBVyxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRXRFLE1BQU0sY0FBc0MsU0FBUyxLQUFLLGdCQUFnQix1QkFBdUIsSUFBSTtBQUFBLElBRXJHLElBQUksVUFBNkMsQ0FBQztBQUFBLElBRWxELE1BQU0sV0FBK0I7QUFBQSxNQUNqQyxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixTQUFTLEtBQUssWUFBWTtBQUFBLElBQzlCO0FBQUEsSUFFQSxNQUFNLE9BQW9CO0FBQUEsTUFDdEIsS0FBSztBQUFBLE1BQ0w7QUFBQSxNQUNBLE1BQU0sRUFBRSxRQUFRLFlBQXdELE9BQU8sVUFBVTtBQUFBLE1BQ3pGLFFBQVE7QUFBQSxRQUNKLFFBQVEsYUFBYSxZQUFZLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSztBQUFBLFFBQ3ZFLFFBQVE7QUFBQSxNQUNaO0FBQUEsTUFDQSxTQUFTLFFBQVE7QUFBQSxNQUNqQjtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQUEsSUFFQSxNQUFNLFVBQWUsRUFBRSxPQUFPO0FBQUEsSUFDOUIsSUFBSTtBQUFBLE1BRUEsTUFBTSx5QkFBeUIsUUFBUSxtQkFBbUIsb0JBQW9CLEtBQUs7QUFBQSxNQUNuRixJQUFJO0FBQUEsUUFBd0IsTUFBTSxRQUFRLEtBQUssc0JBQXNCLEVBQUUsV0FBVyxRQUFRLE1BQU0sS0FBSyxLQUFLLFFBQWtCLE1BQU0sT0FBTyxDQUFDO0FBQUEsTUFHMUksSUFBSSxRQUFRLFlBQVksVUFBVyxLQUFLLEtBQUssT0FBa0IsU0FBUyxHQUFHLEdBQUc7QUFBQSxRQUMxRSxNQUFNLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxPQUFPLENBQUM7QUFBQSxRQUMvRyxNQUFNLE9BQU8sYUFBYSxFQUFFLE1BQU0sS0FBSyxLQUFLLE9BQWlCLENBQUM7QUFBQSxNQUNsRTtBQUFBLE1BRUEsSUFBSSxDQUFDLFFBQVEsUUFBUSxRQUFRLElBQUksUUFBUSxHQUFHLFdBQVcsbUJBQW1CLEdBQUc7QUFBQSxRQUV6RSxJQUFJLGNBQWMsUUFBUTtBQUFBLFFBQzFCLElBQUksQ0FBQyxhQUFhO0FBQUEsVUFFZCxJQUFJLGVBQWUsb0JBQW9CLG1CQUFtQjtBQUFBLFlBQ3RELGNBQWM7QUFBQSxVQUNsQixFQUFPLFNBQUssS0FBSyxLQUFLLE9BQWtCLFNBQVMsR0FBRyxHQUFHO0FBQUEsWUFDbkQsY0FBYyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQWdCO0FBQUEsWUFDakQsSUFBSSxnQkFBZ0IsTUFBTTtBQUFBLGNBQ3RCLGNBQWMsVUFBVSxjQUFjLEtBQUssS0FBSztBQUFBLGNBQ2hELElBQUksZ0JBQWdCLFdBQVc7QUFBQSxnQkFDM0IsTUFBTSxRQUFRLEtBQUssdUJBQXVCLEVBQUUsV0FBVyxRQUFRLE1BQU0sS0FBSyxLQUFLLFFBQWtCLE1BQU0sT0FBTyxDQUFDO0FBQUEsZ0JBQy9HLE1BQU0sT0FBTyxhQUFhLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBaUIsQ0FBQztBQUFBLGNBQ2xFO0FBQUEsY0FDQSxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsZ0JBQVksWUFBWSxTQUFTLE1BQU0sWUFBWTtBQUFBLGNBQ2hGO0FBQUEsNEJBQVksU0FBUyxNQUFNLFlBQVksT0FBTztBQUFBLGNBQ25ELEtBQUssSUFBSSxLQUFLLEtBQUssUUFBa0IsV0FBVztBQUFBLFlBQ3BEO0FBQUEsVUFDSixFQUFPO0FBQUEsWUFDSCxjQUFjLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBZ0I7QUFBQSxZQUNqRCxJQUFJLGdCQUFnQixNQUFNO0FBQUEsY0FDdEIsY0FBYyxVQUFVLGNBQWMsS0FBSyxLQUFLO0FBQUEsY0FDaEQsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLGdCQUMzQixNQUFNLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxPQUFPLENBQUM7QUFBQSxnQkFDL0csTUFBTSxPQUFPLGFBQWEsRUFBRSxNQUFNLEtBQUssS0FBSyxPQUFpQixDQUFDO0FBQUEsY0FDbEU7QUFBQSxjQUNBLElBQUksT0FBTyxZQUFZLFdBQVc7QUFBQSxnQkFBWSxZQUFZLFNBQVMsTUFBTSxZQUFZO0FBQUEsY0FDaEY7QUFBQSw0QkFBWSxTQUFTLE1BQU0sWUFBWSxPQUFPO0FBQUEsY0FDbkQsS0FBSyxJQUFJLEtBQUssS0FBSyxRQUFrQixXQUFXO0FBQUEsWUFDcEQ7QUFBQSxZQUVBLG9CQUFvQjtBQUFBLFlBQ3BCLG1CQUFtQjtBQUFBO0FBQUEsVUFHdkIsSUFBSSxZQUFZLFNBQVM7QUFBQSxZQUFVLE1BQU0sT0FBTyxnQkFBZ0IsRUFBRSxVQUFVLFVBQVUsU0FBUyx5TEFBeUwsQ0FBQztBQUFBLFFBQzdSO0FBQUEsUUFFQSxRQUFRLE9BQU87QUFBQSxRQUNmLFFBQVEsVUFBVSxLQUFLLFFBQVE7QUFBQSxRQUUvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDaEIsU0FBUyxRQUFRLFFBQVE7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsUUFBUSxLQUFLLE9BQU87QUFBQSxVQUNwQixZQUFZO0FBQUEsVUFDWixtQkFBbUI7QUFBQSxRQUN2QixDQUFDO0FBQUEsUUFDRCxVQUFVLFNBQVM7QUFBQSxRQUVuQixJQUFJLFNBQVMsU0FBUyxNQUFNLFNBQVMsUUFBUSxVQUFVLFdBQVc7QUFBQSxVQUM5RCxJQUFJLFNBQVMsYUFBYTtBQUFBLFlBQ3RCLFNBQVMsT0FBTywyQkFBMkI7QUFBQSxVQUMvQyxFQUFPLFNBQUksU0FBUyxtQkFBbUI7QUFBQSxZQUNuQyxTQUFTLE9BQU8sV0FBVyxZQUFZLGNBQWMsU0FBUyxRQUFRLEtBQUssa0JBQWtCO0FBQUEsVUFDakcsRUFBTztBQUFBLFlBQ0gsU0FBUyxPQUFPLFdBQVcsS0FBSyxVQUFVLFNBQVMsUUFBUSxLQUFLLGtCQUFrQjtBQUFBO0FBQUEsUUFFMUY7QUFBQSxRQUVBLE1BQU0sMEJBQTBCLFFBQVEsbUJBQW1CLHFCQUFxQixLQUFLO0FBQUEsUUFDckYsSUFBSTtBQUFBLFVBQXlCLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxNQUFNLEtBQUssS0FBSyxRQUFrQixNQUFNLFNBQVMsS0FBSyxRQUFRLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxNQUFNLE9BQU8sQ0FBQztBQUFBLFFBRXJOLElBQUksUUFBUSxTQUFTLEdBQUc7QUFBQSxVQUNwQixXQUFXLFdBQVcsU0FBUztBQUFBLFlBQzNCLElBQUk7QUFBQSxjQUNBLE1BQU0sUUFBUTtBQUFBLGNBQ2hCLE9BQU8sT0FBTztBQUFBLGNBQ1osT0FBTyxNQUFNLHVDQUF1QyxLQUFLO0FBQUE7QUFBQSxVQUVqRTtBQUFBLFFBQ0o7QUFBQSxRQUVBLElBQUk7QUFBQSxVQUF1QixNQUFNLE9BQU8sRUFBRSxPQUFPLE9BQWM7QUFBQSxRQUMvRCxJQUFJO0FBQUEsVUFBaUIsUUFBUSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQUEsUUFDN0QsSUFBSSxRQUFRLGFBQWE7QUFBQSxVQUNyQixPQUFPLEVBQUUsZUFBZSxNQUFNLE1BQU0sU0FBUyxNQUFNLFFBQVEsU0FBUyxRQUFRLFNBQVMsU0FBUyxRQUFRO0FBQUEsUUFDMUc7QUFBQSxRQUNBLE9BQU8sSUFBSSxTQUFTLFNBQVMsTUFBeUIsUUFBUTtBQUFBLE1BQ2xFLEVBQU87QUFBQSxRQUVILElBQUksY0FBYyxRQUFRO0FBQUEsUUFDMUIsSUFBSSxDQUFDLGFBQWE7QUFBQSxVQUNkLGNBQWMsS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFnQjtBQUFBLFVBQ2pELElBQUssS0FBSyxLQUFLLE9BQWtCLFNBQVMsR0FBRyxLQUFLLENBQUUsS0FBSyxLQUFLLE9BQWtCLFNBQVMsR0FBRyxLQUFLLGdCQUFnQixNQUFNO0FBQUEsWUFDbkgsY0FBYyxVQUFVLGNBQWMsS0FBSyxLQUFLO0FBQUEsWUFDaEQsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLGNBQzNCLE1BQU0sUUFBUSxLQUFLLHVCQUF1QixFQUFFLFdBQVcsUUFBUSxNQUFNLEtBQUssS0FBSyxRQUFrQixNQUFNLE9BQU8sQ0FBQztBQUFBLGNBQy9HLE1BQU0sT0FBTyxhQUFhLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBaUIsQ0FBQztBQUFBLFlBQ2xFO0FBQUEsWUFDQSxJQUFJLE9BQU8sWUFBWSxXQUFXO0FBQUEsY0FBWSxZQUFZLFNBQVMsTUFBTSxZQUFZO0FBQUEsWUFDaEY7QUFBQSwwQkFBWSxTQUFTLE1BQU0sWUFBWSxPQUFPO0FBQUEsWUFDbkQsS0FBSyxJQUFJLEtBQUssS0FBSyxRQUFrQixXQUFXO0FBQUEsVUFDcEQ7QUFBQSxVQUNBLElBQUksWUFBWSxTQUFTO0FBQUEsWUFBVSxNQUFNLE9BQU8sZ0JBQWdCLEVBQUUsVUFBVSxVQUFVLFNBQVMsMkxBQTJMLENBQUM7QUFBQSxRQUMvUjtBQUFBLFFBRUEsTUFBTSxjQUFjLFlBQVk7QUFBQSxVQUM1QixXQUFXLFdBQVcsU0FBUztBQUFBLFlBQzNCLElBQUk7QUFBQSxjQUNBLE1BQU0sUUFBUTtBQUFBLGNBQ2hCLE9BQU8sT0FBTztBQUFBLGNBQ1osT0FBTyxNQUFNLHVDQUF1QyxLQUFLO0FBQUE7QUFBQSxVQUVqRTtBQUFBLFVBQ0EsSUFBSTtBQUFBLFlBQXVCLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBYztBQUFBLFVBQy9ELElBQUk7QUFBQSxZQUFpQixRQUFRLFFBQVEsUUFBUSxPQUFPLFNBQVM7QUFBQTtBQUFBLFFBR2pFLFFBQVEsT0FBTztBQUFBLFFBQ2YsUUFBUSxVQUFVLEtBQUssUUFBUTtBQUFBLFFBRS9CLE1BQU0sV0FBVyxNQUFNLFNBQVMsVUFBVSxhQUFhO0FBQUEsVUFDbkQsa0JBQWtCO0FBQUEsVUFDbEIsZUFBZTtBQUFBLFVBQ2YsTUFBTSxLQUFLLEtBQUs7QUFBQSxVQUNoQixTQUFTLFFBQVEsUUFBUTtBQUFBLFVBQ3pCO0FBQUEsVUFDQSxRQUFRLEtBQUssT0FBTztBQUFBLFVBQ3BCLFlBQVk7QUFBQSxRQUNoQixDQUFDO0FBQUEsUUFDRCxVQUFVLFNBQVM7QUFBQSxRQUVuQixTQUFTLFVBQVUsS0FBSyxTQUFTLFlBQVksaUJBQWlCLEtBQUssTUFBTSxNQUFNLEVBQUU7QUFBQSxRQUVqRixJQUFJO0FBQUEsUUFFSixJQUFJO0FBQUEsUUFHSixJQUFJLE9BQU8sUUFBUSxhQUFhO0FBQUEsVUFFNUIsU0FBUyxJQUFJLGVBQWU7QUFBQSxZQUN4QixNQUFNO0FBQUEsaUJBRUEsS0FBSSxDQUFDLFlBQTRDO0FBQUEsY0FDbkQsVUFBVTtBQUFBLGNBQ1YsSUFBSTtBQUFBLGdCQUNBLFdBQVcsTUFBTSxTQUFTLEtBQUssVUFBVSxFQUFFLFNBQVMsTUFBTSxNQUFNLFdBQVcsVUFBVSxDQUFzQztBQUFBO0FBQUEsQ0FBTztBQUFBLGdCQUNsSSxpQkFBaUIsU0FBUyxTQUFTLFFBQVEsT0FBTztBQUFBLGtCQUM5QyxJQUFJLENBQUMsUUFBUSxRQUFRLE9BQU8sU0FBUztBQUFBLG9CQUNqQyxNQUFNLFNBQWlCLEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQUEsb0JBQ25ELFdBQVcsTUFBTSxRQUFRO0FBQUE7QUFBQSxDQUFZO0FBQUEsa0JBQ3pDLEVBQU87QUFBQSxvQkFDSCxTQUFTLFFBQVEsTUFBTSxPQUFPLFNBQVM7QUFBQSxvQkFDdkMsTUFBTSxZQUFZO0FBQUEsb0JBQ2xCLFdBQVcsTUFBTTtBQUFBO0FBQUEsZ0JBRXpCO0FBQUEsZ0JBQ0YsT0FBTyxPQUFPO0FBQUEsZ0JBQ1osTUFBTSxZQUFZLGlCQUFpQixXQUFXLFFBQVEsS0FBSztBQUFBLGdCQUMzRCxNQUFNLFNBQWMsQ0FBQztBQUFBLGdCQUNyQixPQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsZ0JBQ25DLFdBQVcsTUFBTSxRQUFRLEtBQUssVUFBVSxDQUFDLFFBQVEsSUFBSSxDQUFDO0FBQUE7QUFBQSxDQUFPO0FBQUE7QUFBQSxjQUVqRSxNQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLENBQUMsQ0FBQztBQUFBLGNBQ3JELE1BQU0sWUFBWTtBQUFBLGNBQ2xCLFdBQVcsTUFBTTtBQUFBO0FBQUEsaUJBRWYsT0FBTSxHQUFHO0FBQUEsY0FDWCxNQUFNLFlBQVk7QUFBQSxjQUNsQixRQUFRLE1BQU07QUFBQTtBQUFBLFVBRXRCLENBQVE7QUFBQSxRQUNaLEVBQU87QUFBQSxVQUdILFNBQVMsSUFBSSxlQUFlO0FBQUEsaUJBRWxCLEtBQUksQ0FBQyxZQUFZO0FBQUEsY0FDbkIsVUFBVTtBQUFBLGNBQ1YsSUFBSTtBQUFBLGdCQUNBLFdBQVcsUUFBUSxTQUFTLEtBQUssVUFBVSxFQUFFLFNBQVMsTUFBTSxNQUFNLFdBQVcsVUFBVSxDQUFzQztBQUFBO0FBQUEsQ0FBTztBQUFBLGdCQUNwSSxpQkFBaUIsU0FBUyxTQUFTLFFBQVEsT0FBTztBQUFBLGtCQUM5QyxJQUFJLENBQUMsUUFBUSxRQUFRLFFBQVEsU0FBUztBQUFBLG9CQUNsQyxNQUFNLFNBQWlCLEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQUEsb0JBQ25ELFdBQVcsUUFBUSxRQUFRO0FBQUE7QUFBQSxDQUFZO0FBQUEsa0JBQzNDLEVBQU87QUFBQSxvQkFDSCxTQUFTLFFBQVEsTUFBTSxPQUFPLFNBQVM7QUFBQSxvQkFDdkMsTUFBTSxZQUFZO0FBQUEsb0JBQ2xCLFdBQVcsTUFBTTtBQUFBO0FBQUEsZ0JBRXpCO0FBQUEsZ0JBQ0YsT0FBTyxPQUFPO0FBQUEsZ0JBQ1osTUFBTSxZQUFZLGlCQUFpQixXQUFXLFFBQVEsS0FBSztBQUFBLGdCQUMzRCxNQUFNLFNBQWMsQ0FBQztBQUFBLGdCQUNyQixPQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsZ0JBQ25DLFdBQVcsUUFBUSxRQUFRLEtBQUssVUFBVSxDQUFDLFFBQVEsSUFBSSxDQUFDO0FBQUE7QUFBQSxDQUFPO0FBQUE7QUFBQSxjQUVuRSxNQUFNLFlBQVk7QUFBQSxjQUNsQixNQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLENBQUMsQ0FBQztBQUFBLGNBQ3JELFdBQVcsTUFBTTtBQUFBO0FBQUEsaUJBRWYsT0FBTSxHQUFHO0FBQUEsY0FDWCxNQUFNLFlBQVk7QUFBQSxjQUNsQixRQUFRLE1BQU07QUFBQTtBQUFBLFVBRXRCLENBQVE7QUFBQTtBQUFBLFFBR1osU0FBUyxPQUFPO0FBQUEsUUFFaEIsU0FBUyxVQUFVLEtBQUssU0FBUyxTQUFTLGdCQUFnQixxQkFBcUIsaUJBQWlCLFdBQVc7QUFBQSxRQUUzRyxNQUFNLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxTQUFTLEtBQUssUUFBUSxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsTUFBTSxPQUFPLENBQUM7QUFBQSxRQUV4TCxPQUFPLElBQUksU0FBUyxTQUFTLE1BQU0sUUFBUTtBQUFBO0FBQUEsTUFFakQsT0FBTyxPQUFPO0FBQUEsTUFDWixNQUFNLFVBQXlDO0FBQUEsUUFDM0MsT0FBTyxpQkFBaUIsV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUNwRDtBQUFBLE1BQ0EsSUFBSSxRQUFRLFVBQVU7QUFBQSxRQUFXLFNBQVMsT0FBTyxLQUFLLFVBQVUsUUFBUSxLQUFLO0FBQUEsTUFFN0UsU0FBUyxVQUFVLEtBQUssU0FBUyxZQUFZLFlBQVk7QUFBQSxNQUN6RCxNQUFNLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLFFBQVEsTUFBTSxLQUFLLEtBQUssUUFBa0IsTUFBTSxTQUFTLEtBQUssUUFBUSxTQUFTLFNBQVMsU0FBUyxPQUFPLE9BQU8sQ0FBQztBQUFBLE1BQ3ZLLElBQUk7QUFBQSxRQUF1QixNQUFNLE9BQU8sRUFBRSxPQUFPLE9BQWM7QUFBQSxNQUMvRCxJQUFJO0FBQUEsUUFBaUIsUUFBUSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQUEsTUFDN0QsSUFBSSxRQUFRLGFBQWE7QUFBQSxRQUNyQixPQUFPLEVBQUUsZUFBZSxNQUFNLE1BQU0sU0FBUyxNQUFNLFFBQVEsU0FBUyxRQUFRLFNBQVMsU0FBUyxRQUFRO0FBQUEsTUFDMUc7QUFBQSxNQUNBLE9BQU8sSUFBSSxTQUFTLFNBQVMsTUFBeUIsUUFBUTtBQUFBO0FBQUE7QUFBQSxFQUl0RSxNQUFNLGdCQUE4RSxJQUFJO0FBQUEsRUFDeEYsTUFBTSxnQkFBZ0IsT0FDbEIsT0FDQSxZQVFDO0FBQUEsSUFDRCxJQUFJLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDN0IsSUFBSSxZQUFZLFFBQVE7QUFBQSxRQUNwQixNQUFLLFlBQVksTUFBTTtBQUFBLE1BQzNCO0FBQUEsTUFDQSxJQUFJLFFBQVEsV0FBVyxlQUFlLEdBQUc7QUFBQSxRQUNyQyxNQUFNLFlBQVksUUFBUSxNQUFNLGVBQWUsRUFBRTtBQUFBLFFBQ2pELE1BQU0sZUFBZSxjQUFjLElBQUksU0FBUztBQUFBLFFBQ2hELElBQUksY0FBYztBQUFBLFVBQ2QsYUFBYSxVQUFVLE9BQU8sU0FBUztBQUFBLFVBQ3ZDLGFBQWEsWUFBWSxRQUFRO0FBQUEsUUFDckM7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxJQUNBLElBQUksY0FBYyxLQUFLLElBQUksUUFBUSxJQUFJO0FBQUEsSUFDdkMsSUFBSSxnQkFBZ0IsTUFBTTtBQUFBLE1BQ3RCLGNBQWMsVUFBVSxjQUFjLFFBQVE7QUFBQSxNQUM5QyxJQUFJLGdCQUFnQixXQUFXO0FBQUEsUUFDM0IsTUFBTSxPQUFPLGFBQWEsRUFBRSxNQUFNLFFBQVEsS0FBSyxDQUFDO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLElBQUksT0FBTyxZQUFZLFdBQVc7QUFBQSxRQUFZLFlBQVksU0FBUyxNQUFNLFlBQVk7QUFBQSxNQUNoRjtBQUFBLG9CQUFZLFNBQVMsTUFBTSxZQUFZLE9BQU87QUFBQSxNQUNuRCxLQUFLLElBQUksUUFBUSxNQUFNLFdBQVc7QUFBQSxJQUN0QztBQUFBLElBRUEsTUFBTSxVQUFVLElBQUksUUFBUSxRQUFRLE9BQU87QUFBQSxJQUMzQyxNQUFNLFNBQVMsUUFBUSxVQUFVLENBQUM7QUFBQSxJQUNsQyxNQUFNLFNBQVMsYUFBYSxTQUFTLFFBQVEsTUFBTSxRQUFRLFNBQVM7QUFBQSxJQUNwRSxJQUFJLFVBQTZDLENBQUM7QUFBQSxJQUVsRCxNQUFNLE9BQU8sSUFBSSxNQUNiLENBQUMsR0FDRDtBQUFBLE1BQ0ksS0FBSyxDQUFDLFFBQVEsYUFBYTtBQUFBLFFBQ3ZCLElBQUksYUFBYTtBQUFBLFVBQVksT0FBTztBQUFBLFFBQ3BDO0FBQUE7QUFBQSxNQUVKLEtBQUssTUFBTTtBQUFBLFFBQ1AsTUFBTSxPQUFPLGdCQUFnQixFQUFFLFVBQVUsZ0JBQWdCLFNBQVMscUpBQXFKLENBQUM7QUFBQTtBQUFBLElBRWhPLENBQ0o7QUFBQSxJQUVBLE1BQU0sY0FBYyxPQUFPLFNBQThCO0FBQUEsTUFDckQsSUFBSSxTQUFTO0FBQUEsUUFBVSxjQUFjLE9BQU8sUUFBUSxTQUFTO0FBQUEsTUFDN0QsV0FBVyxXQUFXLFNBQVM7QUFBQSxRQUMzQixJQUFJO0FBQUEsVUFDQSxNQUFNLFFBQVE7QUFBQSxVQUNoQixPQUFPLE9BQU87QUFBQSxVQUNaLE9BQU8sTUFBTSx1Q0FBdUMsS0FBSztBQUFBO0FBQUEsTUFFakU7QUFBQSxNQUNBLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBYztBQUFBLE1BQ3BDLFFBQVEsUUFBUSxRQUFRLE9BQU8sUUFBUSxTQUFTO0FBQUE7QUFBQSxJQUdwRCxNQUFNLFVBQVUsRUFBRSxNQUFZLFNBQVMsT0FBTztBQUFBLElBRTlDLElBQUk7QUFBQSxNQUNBLElBQUksWUFBWSxTQUFTLFVBQVU7QUFBQSxRQUMvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQixRQUFRO0FBQUEsVUFDMUIsZUFBZTtBQUFBLFVBQ2YsTUFBTSxRQUFRO0FBQUEsVUFDZDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxZQUFZO0FBQUEsUUFDaEIsQ0FBQztBQUFBLFFBQ0QsVUFBVSxTQUFTO0FBQUEsUUFFbkIsTUFBTSxZQUFZLFFBQVE7QUFBQSxRQUUxQixJQUFJLFNBQVMsYUFBYTtBQUFBLFVBQ3RCLE1BQUssWUFBWTtBQUFBLFlBQ2IsV0FBVyxRQUFRO0FBQUEsWUFDbkIsU0FBUztBQUFBLFlBQ1QsTUFBTTtBQUFBLFVBQ1YsQ0FBQztBQUFBLFFBQ0wsRUFBTztBQUFBLFVBQ0gsTUFBSyxZQUFZO0FBQUEsWUFDYixXQUFXLFFBQVE7QUFBQSxZQUNuQixTQUFTO0FBQUEsWUFDVCxNQUFNLFNBQVMsUUFBUTtBQUFBLFVBQzNCLENBQUM7QUFBQTtBQUFBLE1BRVQ7QUFBQSxNQUNBLElBQUksWUFBWSxTQUFTLFVBQVU7QUFBQSxRQUMvQixNQUFNLFdBQVcsTUFBTSxTQUFTLFVBQVUsYUFBYTtBQUFBLFVBQ25ELGtCQUFrQixRQUFRO0FBQUEsVUFDMUIsZUFBZTtBQUFBLFVBQ2YsTUFBTSxRQUFRO0FBQUEsVUFDZDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxZQUFZO0FBQUEsUUFDaEIsQ0FBQztBQUFBLFFBQ0QsVUFBVSxTQUFTO0FBQUEsUUFFbkIsSUFBSTtBQUFBLFVBQ0EsTUFBSyxZQUFZLEVBQUUsU0FBUyxNQUFNLE1BQU0sV0FBVyxXQUFXLFFBQVEsV0FBVyxNQUFNLE1BQU0sQ0FBQztBQUFBLFVBQzlGLGNBQWMsSUFBSSxRQUFRLFdBQVcsRUFBRSxXQUFXLFNBQVMsUUFBUSxPQUFPLFlBQVksQ0FBQztBQUFBLFVBQ3ZGLGlCQUFpQixTQUFTLFNBQVMsUUFBUSxPQUFPO0FBQUEsWUFDOUMsTUFBTSxPQUFPLEVBQUUsU0FBUyxNQUFNLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxXQUFXLFFBQVEsV0FBVyxNQUFNLE1BQU07QUFBQSxZQUM3RixNQUFLLFlBQVksSUFBSTtBQUFBLFVBQ3pCO0FBQUEsVUFDQSxNQUFLLFlBQVksRUFBRSxTQUFTLE1BQU0sTUFBTSxXQUFXLFdBQVcsUUFBUSxXQUFXLE1BQU0sS0FBSyxDQUFDO0FBQUEsVUFDL0YsT0FBTyxPQUFPO0FBQUEsVUFDWixNQUFNLFlBQVksaUJBQWlCLFFBQVEsV0FBVyxRQUFRLEtBQUs7QUFBQSxVQUNuRSxNQUFNLFNBQWMsQ0FBQztBQUFBLFVBQ3JCLE9BQU8sVUFBVSxRQUFRLFVBQVU7QUFBQSxVQUNuQyxNQUFLLFlBQVksRUFBRSxTQUFTLE1BQU0sTUFBTSxDQUFDLFFBQVEsSUFBSSxHQUFHLFdBQVcsUUFBUSxXQUFXLE1BQU0sS0FBSyxDQUFDO0FBQUE7QUFBQSxRQUV0RyxNQUFNLFlBQVksUUFBUTtBQUFBLE1BQzlCO0FBQUEsTUFDRixPQUFPLE9BQU87QUFBQSxNQUNaLE1BQU0sU0FBUyxpQkFBaUIsUUFBUSxXQUFXLFFBQVEsS0FBSztBQUFBLE1BQ2hFLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBYztBQUFBLE1BQ3BDLE1BQUssWUFBWSxFQUFFLFNBQVMsT0FBTyxNQUFNLFdBQVcsT0FBTyxRQUFRLFdBQVcsUUFBUSxXQUFXLE1BQU0sS0FBSyxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBSXJILE9BQU87QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQUE7O0FDdHNCRyxJQUFNLFNBQVMsU0FBUyxPQUFNLENBQUMsV0FBZ0IsTUFBeUM7QUFBQSxFQUMzRixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJLE9BQU8sY0FBYyxVQUFVO0FBQUEsSUFDL0IsT0FBTztBQUFBLElBQ1AsYUFBYTtBQUFBLEVBQ2pCLEVBQU87QUFBQSxJQUNILE1BQU0sT0FBTyxPQUFPLEtBQUssU0FBUztBQUFBLElBQ2xDLE9BQU8sS0FBSztBQUFBLElBQ1osYUFBYSxVQUFVO0FBQUE7QUFBQSxFQUUzQixNQUFNLFFBQVEsRUFBRSxlQUFlLE1BQU0sTUFBTSxNQUFNLFdBQVc7QUFBQSxFQUM1RCxNQUFNLGtCQUFrQixLQUFLO0FBQUEsRUFDN0IsT0FBTztBQUFBO0FBS0osU0FBUyxnQkFBZ0IsQ0FBQyxXQUFtQixRQUFnQixPQUFnRTtBQUFBLEVBQ2hJLElBQUk7QUFBQSxJQUNBLElBQUksZ0JBQWdCO0FBQUEsTUFBYSxXQUFtQixZQUFZLGlCQUFpQixLQUFLO0FBQUEsSUFDeEYsT0FBTyxRQUFPO0FBQUEsRUFDaEIsSUFBSSxpQkFBaUIsU0FBUyxnQkFBZ0I7QUFBQSxJQUFhLFdBQW1CLFdBQVcsaUJBQWlCLEtBQUs7QUFBQSxFQUMvRyxNQUFNLE9BQU8sT0FBTyxRQUFRLE9BQU8sUUFBUSxPQUFPLGFBQWEsUUFBUTtBQUFBLEVBRXZFLElBQUksT0FBTyxrQkFBa0IsUUFBUSxPQUFPLFNBQVMsYUFBYTtBQUFBLElBQzlELE9BQU8sS0FBSyxNQUFNLE9BQU8sTUFBTSxRQUFRLGNBQWM7QUFBQSxFQUN6RCxFQUFPO0FBQUEsSUFDSCxJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsT0FBTyxpQkFBaUIsT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLENBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLO0FBQUEsQ0FBSSxJQUFLLE9BQU8sU0FBUztBQUFBLE1BQzdHLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBSyxLQUFLLFVBQVUsT0FBTyxJQUFJLEtBQUs7QUFBQSxFQUFLO0FBQUEsQ0FBUztBQUFBLE1BQ3ZFLE9BQU8sR0FBRztBQUFBLE1BQ1IsT0FBTyxNQUFNLE1BQU07QUFBQSxFQUFLLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFBSyxPQUFPO0FBQUEsQ0FBUztBQUFBO0FBQUE7QUFBQSxFQUkxRSxJQUFJO0FBQUEsRUFFSixJQUFJLE9BQU8sa0JBQWtCO0FBQUEsSUFBTSxTQUFTLEVBQUUsU0FBUyxPQUFPLE1BQU0sTUFBTSxNQUFNLFFBQVEsTUFBTSxNQUFNLFVBQVU7QUFBQSxFQUN6RztBQUFBLGFBQVMsRUFBRSxTQUFTLE9BQU8sTUFBTSx5QkFBeUIsUUFBUSxXQUFXLFVBQVU7QUFBQSxFQUU1RixPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICJGMDEwRUY4RDQ0NEJGQUI2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
1406
+ //# debugId=42BA86E5D6C6A43164756E2164756E21
1407
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbHMvcGFydC50cyIsICIuLi90eXBlLXNhZmV0eS9pbmRleC50cyIsICIuLi9jb25maWcvaW5kZXgudHMiLCAiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzIiwgIi4uL3V0aWxzL21lcmdlLWRlZXAudHMiLCAiLi4vdXRpbHMvcmV2aXZlLWpzb24tcGFyc2UudHMiLCAiLi4vZXhlY3V0ZS9pbmRleC50cyIsICIuLi9ldmVudC9pbmRleC50cyIsICIuLi9mbG93L2luZGV4LnRzIiwgIi4uL3V0aWxzL2NyZWF0ZS1pZC50cyIsICIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzIiwgIi4uL3dvcmxkL2luZGV4LnRzIiwgIi4uL3R5cGlhL2luZGV4LnRzIiwgIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHMiLCAiLi4vbG9nZ2VyL2luZGV4LnRzIiwgIi4uL3N0ZXAvaW5kZXgudHMiLCAiLi4vdXRpbHMvdHJpZS50cyIsICIuLi91dGlscy9idWlsZC1jb3JzLWhlYWRlcnMudHMiLCAiLi4vbGlzdGVuZXIvaW5kZXgudHMiLCAiLi4vZXhjZXB0aW9uL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCBmdW5jdGlvbiBwYXJ0PFQgZXh0ZW5kcyAoKSA9PiB1bmtub3duPihoYW5kbGVyOiBUKTogUmV0dXJuVHlwZTxUPiB7XG4gIHJldHVybiBoYW5kbGVyKCkgYXMgdW5rbm93biBhcyBSZXR1cm5UeXBlPFQ+O1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBUeXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSAodmFsdWU6IFZhbHVlKSA9PiBUeXBlU2FmZXR5VmFsdWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVZhbHVlIHtcbiAgdHlwZTogPFR5cGUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PigpID0+IFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVR5cGU8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcbiAgJG1pbGtpb1R5cGU6IFwidHlwZS1zYWZldHlcIjtcbiAgdmFsdWU6IFR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4odmFsdWU6IFZhbHVlKTogVHlwZVNhZmV0eVZhbHVlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAoKSA9PiAoeyAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiLCB2YWx1ZSB9KSxcbiAgfSBhcyBhbnk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb25maWc8Q29uZmlnVCBleHRlbmRzIENvbmZpZz4oY29uZmlnOiBDb25maWdUKTogQ29uZmlnVCB7XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IChtb2RlOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRW52aXJvbm1lbnRzPFQgZXh0ZW5kcyBDb25maWc+IHtcbiAgW2tleTogc3RyaW5nXTogKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gUGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiB8IFByb21pc2U8UGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvQm9vbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4pIHtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9KU09OKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3QganNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xuICAgIGpzb25ba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuIiwKICAgICJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IFQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCB9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleSBhcyBrZXlvZiBUXTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh0YXJnZXRWYWx1ZSkgJiYgaXNQbGFpbk9iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgbWVyZ2VkW2tleSBhcyBrZXlvZiBUICYga2V5b2YgVV0gPSBtZXJnZURlZXAodGFyZ2V0VmFsdWUsIHNvdXJjZVZhbHVlKSBhcyBhbnk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIChtZXJnZWQgYXMgYW55KVtrZXldID0gc291cmNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZCBhcyBUICYgVTtcbn1cbiIsCiAgICAiY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZnVuY3Rpb24gdHJ5UGFyc2VEYXRlKHN0cjogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgaWYgKGxlbiA+PSAyMCAmJiBsZW4gPD0gMzIgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPj0gMHgzMCAmJiBzdHIuY2hhckNvZGVBdCgwKSA8PSAweDM5ICYmIHN0ci5pbmRleE9mKCdUJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gaXNvRGF0ZVBhdHRlcm4uZXhlYyhzdHIpO1xuICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uUG9zID0gbWF0Y2hbMl0uY2hhckNvZGVBdCgzKSA9PT0gNTggPyBtYXRjaFsxXS5sZW5ndGggKyAzIDogLTE7XG4gICAgICAgICAgICAgICAgaWYgKGNvbG9uUG9zID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0ci5zdWJzdHJpbmcoMCwgY29sb25Qb3MpICsgc3RyLnN1YnN0cmluZyhjb2xvblBvcyArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbMV0gKyAnWicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcbiAgICBpZiAoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSB1bmRlZmluZWQpIHJldHVybiBqc29uO1xuICAgIGlmICh0eXBlb2YganNvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGpzb24ubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBqc29uW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IHRyeVBhcnNlRGF0ZSh2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQgIT09IG51bGwpIGpzb25baV0gPSBkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV2aXZlSlNPTlBhcnNlKHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9iaiA9IGpzb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgY29uc3QgdiA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0cnlQYXJzZURhdGUodik7XG4gICAgICAgICAgICAgICAgaWYgKGQgIT09IG51bGwpIG9ialtrZXldID0gZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXZpdmVKU09OUGFyc2Uodik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZCA9IHRyeVBhcnNlRGF0ZShqc29uKTtcbiAgICAgICAgaWYgKGQgIT09IG51bGwpIHJldHVybiBkIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG59IiwKICAgICJpbXBvcnQgdHlwZSB7IElWYWxpZGF0aW9uIH0gZnJvbSBcInR5cGlhXCI7XG5pbXBvcnQgeyByZWplY3QgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgJGNvbnRleHQsICRtZXRhLCBMb2dnZXIsIFJlc3VsdHMsIEdlbmVyYXRlZEluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IGhlYWRlcnNUb0pTT04gfSBmcm9tIFwiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzXCI7XG5pbXBvcnQgeyBtZXJnZURlZXAgfSBmcm9tIFwiLi4vdXRpbHMvbWVyZ2UtZGVlcC50c1wiO1xuaW1wb3J0IHsgcmV2aXZlSlNPTlBhcnNlIH0gZnJvbSBcIi4uL3V0aWxzL3Jldml2ZS1qc29uLXBhcnNlLnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSkge1xuICAgIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jIChcbiAgICAgICAgcm91dGVTY2hlbWE6IGFueSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xuICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEhlYWRlcnM7XG4gICAgICAgICAgICBjb250ZXh0OiBhbnkgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBwYXJhbXNDb250ZW50VHlwZT86IHN0cmluZztcbiAgICAgICAgfSAmIChcbiAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcbiAgICApOiBQcm9taXNlPHsgZXhlY3V0ZUlkOiBzdHJpbmc7IGhlYWRlcnM6IEhlYWRlcnM7IHBhcmFtczogUmVjb3JkPGFueSwgdW5rbm93bj47IHJlc3VsdHM6IFJlc3VsdHM8YW55PjsgY29udGV4dDogJGNvbnRleHQ7IG1ldGE6IFJlYWRvbmx5PCRtZXRhPjsgdHlwZTogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCI7IGVtcHR5UmVzdWx0OiBib29sZWFuOyByZXN1bHRzVHlwZVNhZmV0eTogYm9vbGVhbjsgZmluYWxlczogQXJyYXk8KCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4+IH0+ID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IG9wdGlvbnMucGF0aC5lbmRzV2l0aChcIn5cIikgPyBcInN0cmVhbVwiIDogXCJhY3Rpb25cIjtcbiAgICAgICAgY29uc3QgZXhlY3V0ZUlkOiBzdHJpbmcgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XG4gICAgICAgIGxldCBoZWFkZXJzOiBIZWFkZXJzO1xuICAgICAgICBpZiAoIShvcHRpb25zLmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSkge1xuICAgICAgICAgICAgLy8gU3VwcG9ydCBsaWdodHdlaWdodCBoZWFkZXJzIHByb3h5IHdpdGggZ2V0KCkgbWV0aG9kXG4gICAgICAgICAgICBpZiAodHlwZW9mIChvcHRpb25zLmhlYWRlcnMgYXMgYW55KT8uZ2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgIShvcHRpb25zLmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgYXMgdW5rbm93biBhcyBIZWFkZXJzO1xuICAgICAgICAgICAgICAgIC8vIFNraXAgdG9KU09OIGZvciBsaWdodHdlaWdodCBwcm94eSAtIG5vdCBuZWVkZWQgaW4gSFRUUCByZXF1ZXN0IHBhdGhcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgICAgICAgICAgaWYgKCEoXCJ0b0pTT05cIiBpbiBoZWFkZXJzKSkgKGhlYWRlcnMgYXMgYW55KS50b0pTT04gPSAoKSA9PiBoZWFkZXJzVG9KU09OKGhlYWRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmluYWxlczogQXJyYXk8YW55PiA9IFtdO1xuICAgICAgICBjb25zdCBvbkZpbmFsbHkgPSAoaGFuZGxlcjogYW55KSA9PiBmaW5hbGVzLnVuc2hpZnQoaGFuZGxlcik7XG5cbiAgICAgICAgbGV0IHBhcmFtczogUmVjb3JkPGFueSwgdW5rbm93bj47XG4gICAgICAgIGlmIChvcHRpb25zLnBhcmFtc1R5cGUgPT09IFwicmF3XCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcmFtcyB8fCBvcHRpb25zLnBhcmFtcyA9PT0gXCJcIiB8fCBvcHRpb25zLnBhcmFtcyA9PT0gXCJ7fVwiKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMucGFyYW1zQ29udGVudFR5cGUgPT09IFwianNvblwiIHx8IGhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpPy5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKG9wdGlvbnMucGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKT8uc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiBwYXJhbXNba2V5XSA9IHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwiZm9ybS11cmxlbmNvZGVkXCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcbiAgICAgICAgaWYgKFwiJG1pbGtpb0dlbmVyYXRlUGFyYW1zXCIgaW4gcGFyYW1zICYmIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXMgPT09IFwiZW5hYmxlXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVudGltZS5kZXZlbG9wKSB0aHJvdyByZWplY3QoXCJOT1RfREVWRUxPUF9NT0RFXCIsIFwiVGhpcyBmZWF0dXJlIG11c3QgYmUgaW4gY29va2Jvb2sgdG8gdXNlLlwiKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMuJG1pbGtpb0dlbmVyYXRlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHBhcmFtc1JhbmQgPSByb3V0ZVNjaGVtYS5yYW5kb21QYXJhbXMoKTtcbiAgICAgICAgICAgIGlmIChwYXJhbXNSYW5kID09PSB1bmRlZmluZWQgfHwgcGFyYW1zUmFuZCA9PT0gbnVsbCkgcGFyYW1zUmFuZCA9IHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gbWVyZ2VEZWVwKHBhcmFtcywgcGFyYW1zUmFuZCk7XG4gICAgICAgICAgICBvcHRpb25zLmNyZWF0ZWRMb2dnZXIuZGVidWcoXCLinKggdGhlIGdlbmVyYXRlZCBwYXJhbXM6XCIsIEpTT04uc3RyaW5naWZ5KHBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLmNvbnRleHQ/Lmh0dHA/LnBhcmFtcz8uc3RyaW5nKSBvcHRpb25zLmNvbnRleHQuaHR0cC5wYXJhbXMucGFyc2VkID0gcGFyYW1zO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0KSBvcHRpb25zLmNvbnRleHQgPSB7fTtcbiAgICAgICAgY29uc3QgY3R4ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBjdHguZGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcbiAgICAgICAgY3R4LnBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgIGN0eC5sb2dnZXIgPSBvcHRpb25zLmNyZWF0ZWRMb2dnZXI7XG4gICAgICAgIGN0eC5lbWl0ID0gcnVudGltZS5lbWl0O1xuICAgICAgICBjdHguZW1pdEFueUFwcHJvdmVkID0gcnVudGltZS5lbWl0QW55QXBwcm92ZWQ7XG4gICAgICAgIGN0eC5lbWl0QWxsQXBwcm92ZWQgPSBydW50aW1lLmVtaXRBbGxBcHByb3ZlZDtcbiAgICAgICAgY3R4LmV4ZWN1dGVJZCA9IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZDtcbiAgICAgICAgY3R4LmNvbmZpZyA9IHJ1bnRpbWUucnVudGltZS5jb25maWc7XG4gICAgICAgIGN0eC50eXBpYSA9IGdlbmVyYXRlZC50eXBpYVNjaGVtYTtcbiAgICAgICAgY3R4LmNhbGwgPSAobW9kdWxlOiBhbnksIHBhcmFtczogYW55KSA9PiBfX2NhbGwoY3R4LCBtb2R1bGUsIHBhcmFtcyk7XG4gICAgICAgIGN0eC5vbkZpbmFsbHkgPSBvbkZpbmFsbHk7XG4gICAgICAgIGN0eC5fID0gcnVudGltZTtcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSZXN1bHRzPGFueT4gPSB7IHZhbHVlOiB1bmRlZmluZWQgfTtcblxuICAgICAgICBjb25zdCBtb2R1bGUgPSByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgIGNvbnN0IG1ldGEgPSAobW9kdWxlPy5tZXRhID8gbW9kdWxlPy5tZXRhIDoge30pIGFzIHVua25vd24gYXMgUmVhZG9ubHk8JG1ldGE+O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmNvbnRleHQuaHR0cD8ucmVxdWVzdD8ubWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93TWV0aG9kcyA9IG1ldGE/Lm1ldGhvZHMgPz8gW1wiUE9TVFwiXTtcbiAgICAgICAgICAgIGlmICghYWxsb3dNZXRob2RzLmluY2x1ZGVzKG9wdGlvbnMuY29udGV4dC5odHRwLnJlcXVlc3QubWV0aG9kKSkgdGhyb3cgcmVqZWN0KFwiTUVUSE9EX05PVF9BTExPV0VEXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0YT8udHlwZVNhZmV0eSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEudHlwZVNhZmV0eSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShtZXRhLnR5cGVTYWZldHkpICYmIG1ldGEudHlwZVNhZmV0eS5pbmNsdWRlcyhcInBhcmFtc1wiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSByb3V0ZVNjaGVtYS52YWxpZGF0ZVBhcmFtcyhwYXJhbXMpIGFzIElWYWxpZGF0aW9uPGFueT47XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRpb24uc3VjY2VzcykgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfSU5DT1JSRUNUXCIsIHsgLi4uKHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0sIG1lc3NhZ2U6IGBUaGUgdmFsdWUgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0ucGF0aH0nIGlzICckeyh2YWxpZGF0aW9uIGFzIGFueSkuZXJyb3JzWzBdLnZhbHVlfScsIHdoaWNoIGRvZXMgbm90IG1lZXQgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0uZXhwZWN0ZWR9JyByZXF1aXJlbWVudHMuYCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIpID8/IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIsIHsgZXhlY3V0ZUlkOiBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQsIGxvZ2dlcjogb3B0aW9ucy5jcmVhdGVkTG9nZ2VyLCBwYXRoOiBvcHRpb25zLnBhdGgsIG1ldGEsIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCwgcmVqZWN0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5oYW5kbGVyKG9wdGlvbnMuY29udGV4dCwgcGFyYW1zKTtcblxuICAgICAgICBsZXQgZW1wdHlSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGVtcHR5UmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3VsdHMudmFsdWUgPSB7fTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMudmFsdWUpIHx8IHR5cGVvZiByZXN1bHRzLnZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aHJvdyByZWplY3QoXCJSRVFVRVNUX0ZBSUxcIiwgXCJUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiAnb2JqZWN0Jywgd2hpY2ggaXMgY3VycmVudGx5IGFuICcke3R5cGVvZiB0eXBlb2YgcmVzdWx0cy52YWx1ZX0nLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzVHlwZVNhZmV0eSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVtcHR5UmVzdWx0ICYmIHR5cGUgPT09IFwiYWN0aW9uXCIgJiYgKFxuICAgICAgICAgICAgLy8gVGVtcG9yYXJ5OiB0eXBlLXNhZmUgZGVmYXVsdCBpcyBmYWxzZSBhbmQgdGhpcyBzZXR0aW5nIHNob3VsZCBub3QgYmUgZXhwb3NlZCB0byB1c2Vyc1xuICAgICAgICAgICAgLy8gRHVlIHRvIGN1cnJlbnQgaXNzdWVzIHdpdGggdHlwaWEsIHR5cGUgc2FmZXR5IGNhbm5vdCBiZSBhY2hpZXZlZCBhdCB0aGUgbW9tZW50XG4gICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHRoZSBuZXh0IGxpbmUgb2YgY29kZSBpcyBjdXJyZW50bHkgY29tbWVudGVkIG91dFxuICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBNaWxraW8gaXMgdXNpbmcgdHJhZGl0aW9uYWwgSlNPTi5zdHJpbmdpZnkgZm9yIHJlc3VsdCBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAvLyBtZXRhPy50eXBlU2FmZXR5ID09PSB1bmRlZmluZWQgfHwgXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXRhLnR5cGVTYWZldHkgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkobWV0YS50eXBlU2FmZXR5KSAmJiBtZXRhLnR5cGVTYWZldHkuaW5jbHVkZXMoXCJyZXN1bHRzXCIpKSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHNUeXBlU2FmZXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSByb3V0ZVNjaGVtYS52YWxpZGF0ZVJlc3VsdHMocmVzdWx0cy52YWx1ZSkgYXMgSVZhbGlkYXRpb248YW55PjtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJSRVNVTFRTX1RZUEVfSU5DT1JSRUNUXCIsIHsgLi4uKHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0sIG1lc3NhZ2U6IGBUaGUgdmFsdWUgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0ucGF0aH0nIGlzICckeyh2YWxpZGF0aW9uIGFzIGFueSkuZXJyb3JzWzBdLnZhbHVlfScsIHdoaWNoIGRvZXMgbm90IG1lZXQgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0uZXhwZWN0ZWR9JyByZXF1aXJlbWVudHMuYCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIHJlc3VsdHMsIHJlamVjdCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGV4ZWN1dGVJZCwgaGVhZGVycywgcGFyYW1zLCByZXN1bHRzLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIG1ldGEsIHR5cGUsIGVtcHR5UmVzdWx0LCByZXN1bHRzVHlwZVNhZmV0eSwgZmluYWxlcyB9O1xuICAgIH07XG5cbiAgICBjb25zdCBfX2NhbGwgPSBhc3luYyAoY29udGV4dDogJGNvbnRleHQsIG1vZHVsZTogeyBtZXRhOiBhbnksIGhhbmRsZXI6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICBjb25zdCB7IGhhbmRsZXIgfSA9IGF3YWl0IG1vZHVsZTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgX19jYWxsLFxuICAgICAgICBfX2V4ZWN1dGUsXG4gICAgfTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgJGNvbnRleHQsIENvbnRleHRIdHRwLCBSZXN1bHRzLCBMb2dnZXIsICRtZXRhIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJGV2ZW50cyB7XG4gICAgXCIqXCI6IHsga2V5OiBrZXlvZiAkZXZlbnRzLCB2YWx1ZTogYW55IH07XG4gICAgXCJtaWxraW86aHR0cFJlcXVlc3RcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj4gfTtcbiAgICBcIm1pbGtpbzpodHRwUmVzcG9uc2VcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj47IGNvbnRleHQ6ICRjb250ZXh0OyBzdWNjZXNzOiBib29sZWFuIH07XG4gICAgXCJtaWxraW86aHR0cE5vdEZvdW5kXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IGh0dHA6IENvbnRleHRIdHRwPFJlY29yZDxzdHJpbmcsIGFueT4+IH07XG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQgfTtcbiAgICBcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0OyByZXN1bHRzOiBSZXN1bHRzPGFueT4gfTtcbn1cblxuY29uc3QgUkVTT0xWRURfUFJPTUlTRSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXZlbnRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB8IHZvaWQgfCBib29sZWFuPj4oKTtcbiAgICBsZXQgX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICBvbjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4gfCB2b2lkIHwgYm9vbGVhbj4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIF92ZXJzaW9uKys7XG4gICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhlZC5oYXMoJyonKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5zZXQoJyonLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJykhO1xuICAgICAgICAgICAgICAgIHdpbGRjYXJkU2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkU2V0ID0gaW5kZXhlZC5nZXQoJyonKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIF92ZXJzaW9uKys7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWxkY2FyZFNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICBpZiAoIXdpbGRjYXJkSGFuZGxlcnMgJiYgIWgpIHJldHVybiBSRVNPTFZFRF9QUk9NSVNFO1xuXG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycyAmJiBoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygd2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih7IGtleSwgdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgX2hhc0VtaXRIYW5kbGVyczogKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlZC5oYXMoa2V5KSB8fCBpbmRleGVkLmhhcygnKicpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgX3ZlcnNpb24oKSB7IHJldHVybiBfdmVyc2lvbjsgfSxcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgaGFuZGxlcih7IGtleSwgdmFsdWUgfSkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHZhbHVlKSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgbGV0IGFwcHJvdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHdpbGRjYXJkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHZhbHVlKSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXBwcm92ZWQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBldmVudE1hbmFnZXI7XG59XG4iLAogICAgImV4cG9ydCB0eXBlIE1pbGtpb0Zsb3c8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSBhbnk+ID0ge1xuICBlbWl0OiAoZmxvdzogVCkgPT4gdm9pZDtcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gTWlsa2lvRmxvdzxUPjtcbiAgbmV4dCguLi5bdmFsdWVdOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcbiAgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xuICB0aHJvdyhlcnJvcjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvdzxUPigpOiBNaWxraW9GbG93PFQ+IHtcbiAgbGV0IHN0YXR1czogXCJwZW5kaW5nXCIgfCBcInJlc29sdmVkXCIgfCBcInJlamVjdGVkXCIgPSBcInBlbmRpbmdcIjtcbiAgY29uc3QgZmxvd3M6IEFycmF5PHtcbiAgICBibGFuazogYm9vbGVhbjtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIH0+ID0gW107XG5cbiAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgZW1pdDogKGZsb3c6IFQpID0+IHtcbiAgICAgIGlmIChmbG93cy5hdCgtMSk/LmJsYW5rID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBmbG93cy5hdCgtMSkhO1xuICAgICAgICBpdGVtLmJsYW5rID0gZmFsc2U7XG4gICAgICAgIGl0ZW0ucmVzb2x2ZShmbG93KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGZsb3cpO1xuICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogZmFsc2UgfSBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLi4uKHtcbiAgICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICBpZiAoc3RhdHVzICE9PSBcInBlbmRpbmdcIikgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbG93ID0gZmxvd3MuYXQoMCkhO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbG93LnByb21pc2U7XG4gICAgICAgIGZsb3dzLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICBzdGF0dXMgPSBcInJlc29sdmVkXCI7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcbiAgICAgICAgICBmbG93LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICBzdGF0dXMgPSBcInJlamVjdGVkXCI7XG4gICAgICAgIGlmIChmbG93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xuICAgICAgICAgIGZsb3cucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGl0ZXJhdG9yIGFzIE1pbGtpb0Zsb3c8VD47XG59XG4iLAogICAgImNvbnN0IEVOQ09ESU5HID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuY29uc3QgRU5DT0RJTkdfTEVOID0gRU5DT0RJTkcubGVuZ3RoO1xuXG5sZXQgX19mYXN0SWRQb29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmxldCBfX2Zhc3RJZFBvb2xJbmRleCA9IDI1NjtcbmxldCBfX2Zhc3RJZENvdW50ZXIgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVJZCgpOiBzdHJpbmcge1xuICAgIGlmIChfX2Zhc3RJZFBvb2xJbmRleCArIDE2ID4gMjU2KSB7XG4gICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoX19mYXN0SWRQb29sKTtcbiAgICAgICAgX19mYXN0SWRQb29sSW5kZXggPSAwO1xuICAgIH1cbiAgICAvLyDliY0gOCDlrZfnrKY6IOaXtumXtOaIsyBiYXNlMzbvvIhEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSDmm7/ku6MgQmlnSW5077yMfjEwMHgg5pu05b+r77yJXG4gICAgY29uc3QgdHMgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgLy8g5a2X56ym5Liy5ou85o6l5pu/5LujIEFycmF5LmZyb20gKyBqb2lu77yM6YG/5YWN5pWw57uE5YiG6YWNXG4gICAgbGV0IGlkID0gdHM7XG4gICAgLy8g5Lit6Ze0IDYg5a2X56ymOiDnuq/pmo/mnLpcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICBpZCArPSBFTkNPRElOR1tfX2Zhc3RJZFBvb2xbX19mYXN0SWRQb29sSW5kZXgrK10gJSBFTkNPRElOR19MRU5dO1xuICAgIH1cbiAgICAvLyDlkI4gMTAg5a2X56ymOiDorqHmlbDlmaggKyDpmo/mnLrmt7flkIhcbiAgICBjb25zdCBjb3VudGVyID0gX19mYXN0SWRDb3VudGVyKys7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG1peCA9IChjb3VudGVyICsgX19mYXN0SWRQb29sW19fZmFzdElkUG9vbEluZGV4KysgJSAyNTZdKSAmIDB4RkZGRjtcbiAgICAgICAgaWQgKz0gRU5DT0RJTkdbbWl4ICUgRU5DT0RJTkdfTEVOXTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xufVxuIiwKICAgICJpbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuXG5leHBvcnQgdHlwZSBFeGVjdXRlSWRHZW5lcmF0b3IgPSAoaGVhZGVycz86IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IoKSB7XG4gIHJldHVybiBfX2NyZWF0ZUlkO1xufVxuIiwKICAgICJpbXBvcnQgeyB0eXBlICR0eXBlcywgX19pbml0TGlzdGVuZXIsIF9faW5pdEV4ZWN1dGVyLCBfX2luaXRFdmVudE1hbmFnZXIsIHR5cGUgRXhlY3V0ZUlkLCB0eXBlIExvZ2dlciwgdHlwZSBNaXhpbiwgdHlwZSBHZW5lcmF0ZWRJbml0LCB0eXBlIFBpbmcsIHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIsIHR5cGUgTG9nZ2VySW5zZXJ0aW5nSGFuZGxlciwgdHlwZSBDb3JzQ29uZmlnIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGUvZXhlY3V0ZS1pZC1nZW5lcmF0b3IudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Jbml0IHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgZGV2ZWxvcDogYm9vbGVhbjtcbiAgICBmZXRjaEVudj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGFjY2Vzc0tleT86IHN0cmluZztcbiAgICBodHRwPzoge1xuICAgICAgICBjb3JzPzogQ29yc0NvbmZpZztcbiAgICB9O1xuICAgIGlnbm9yZVBhdGhMZXZlbD86IG51bWJlcjtcbiAgICByZWFsSXA/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nO1xuICAgIGV4ZWN1dGVJZD86IChoZWFkZXJzOiBIZWFkZXJzKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gICAgb25Mb2dnZXJTdWJtaXR0aW5nPzogTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXI7XG4gICAgb25Mb2dnZXJJbnNlcnRpbmc/OiBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyO1xuICAgIGJvb3RzdHJhcHM/OiBBcnJheTwod29ybGQ6IGFueSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBNaWxraW9SdW50aW1lSW5pdDxUIGV4dGVuZHMgTWlsa2lvSW5pdD4gPSBNaXhpbjxcbiAgICBULFxuICAgIHtcbiAgICAgICAgZXhlY3V0ZUlkOiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgICBydW50aW1lOiB7XG4gICAgICAgICAgICByZXF1ZXN0OiBNYXA8RXhlY3V0ZUlkLCB7IGxvZ2dlcjogTG9nZ2VyIH0+O1xuICAgICAgICAgICAgY29uZmlnOiBBd2FpdGVkPFJldHVyblR5cGU8JHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wiY29uZmlnU2NoZW1hXCJdPj47XG4gICAgICAgICAgICBhcHA6IGFueTtcbiAgICAgICAgfTtcbiAgICAgICAgb246IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvblwiXTtcbiAgICAgICAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xuICAgICAgICBlbWl0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdFwiXTtcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdEFueUFwcHJvdmVkXCJdO1xuICAgICAgICBlbWl0QWxsQXBwcm92ZWQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0QWxsQXBwcm92ZWRcIl07XG4gICAgICAgIF9oYXNFbWl0SGFuZGxlcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJfaGFzRW1pdEhhbmRsZXJzXCJdO1xuICAgICAgICBfZW1pdEhhbmRsZXJzVmVyc2lvbjogbnVtYmVyO1xuICAgIH1cbj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVXb3JsZDxNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdD4oZ2VuZXJhdGVkOiBHZW5lcmF0ZWRJbml0LCBjb25maWdTY2hlbWE6IHsgZ2V0OiAoKSA9PiBQcm9taXNlPFJlY29yZDxhbnksIGFueT4+IH0sIG9wdGlvbnM6IE1pbGtpb09wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBleGVjdXRlSWQgPSBvcHRpb25zLmV4ZWN1dGVJZCA/PyBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCk7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnU2NoZW1hLmdldCgpO1xuXG4gICAgY29uc3QgcnVudGltZSA9IHtcbiAgICAgICAgcmVxdWVzdDogbmV3IE1hcCgpLFxuICAgICAgICBjb25maWcsXG4gICAgfSBhcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPltcInJ1bnRpbWVcIl07XG5cbiAgICBjb25zdCBldmVudE1hbmFnZXIgPSBfX2luaXRFdmVudE1hbmFnZXIoKTtcblxuICAgIGlmIChvcHRpb25zLmFjY2Vzc0tleSkgb3B0aW9ucy5pZ25vcmVQYXRoTGV2ZWwgPSBvcHRpb25zLmlnbm9yZVBhdGhMZXZlbCA/IG9wdGlvbnMuaWdub3JlUGF0aExldmVsICsgMSA6IDE7XG5cbiAgICBjb25zdCBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZXhlY3V0ZUlkLFxuICAgICAgICBydW50aW1lLFxuICAgICAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxuICAgICAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgICAgIGVtaXQ6IGV2ZW50TWFuYWdlci5lbWl0LFxuICAgICAgICBlbWl0QW55QXBwcm92ZWQ6IGV2ZW50TWFuYWdlci5lbWl0QW55QXBwcm92ZWQsXG4gICAgICAgIGVtaXRBbGxBcHByb3ZlZDogZXZlbnRNYW5hZ2VyLmVtaXRBbGxBcHByb3ZlZCxcbiAgICAgICAgX2hhc0VtaXRIYW5kbGVyczogZXZlbnRNYW5hZ2VyLl9oYXNFbWl0SGFuZGxlcnMsXG4gICAgICAgIF9lbWl0SGFuZGxlcnNWZXJzaW9uOiBldmVudE1hbmFnZXIuX3ZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVyID0gX19pbml0RXhlY3V0ZXIoZ2VuZXJhdGVkLCBfKTtcbiAgICBjb25zdCBsaXN0ZW5lciA9IF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZCwgXywgZXhlY3V0ZXIpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXBwXG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICAgIF8sXG4gICAgICAgIC8vIGV2ZW50IG1hbmFnZXJcbiAgICAgICAgb246IGV2ZW50TWFuYWdlci5vbixcbiAgICAgICAgb2ZmOiBldmVudE1hbmFnZXIub2ZmLFxuICAgICAgICBlbWl0OiBldmVudE1hbmFnZXIuZW1pdCxcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBldmVudE1hbmFnZXIuZW1pdEFueUFwcHJvdmVkLFxuICAgICAgICBlbWl0QWxsQXBwcm92ZWQ6IGV2ZW50TWFuYWdlci5lbWl0QWxsQXBwcm92ZWQsXG4gICAgICAgIC8vIGxpc3RlbmVyXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAvLyBmdW5jdGlvblxuICAgICAgICBjb25maWcsXG4gICAgfTtcblxuICAgIHJ1bnRpbWUuYXBwID0gd29ybGQ7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmJvb3RzdHJhcHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgYm9vdHN0cmFwIG9mIG9wdGlvbnMuYm9vdHN0cmFwcykge1xuICAgICAgICAgICAgYXdhaXQgYm9vdHN0cmFwKHdvcmxkIGFzIE1pbGtpb1dvcmxkPEdlbmVyYXRlZEluaXQsIE1pbGtpb09wdGlvbnM+KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGdlbmVyYXRlZC5oYW5kbGVyU2NoZW1hLmxvYWRIYW5kbGVycyh3b3JsZCkpO1xuXG4gICAgY29uc3Qgcm91dGVLZXlzID0gT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnJvdXRlU2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAgIGNvbnNvbGUubG9nKGBcXG7ilrMgUm91dGVzOlxcbiAgICAke3JvdXRlS2V5cy5qb2luKFwiXFxuICAgIFwiKX1cXG4gIEEgdG90YWwgb2YgJHtyb3V0ZUtleXMubGVuZ3RofSByb3V0ZXMuYCk7XG4gICAgY29uc29sZS5sb2coYFxcbuKWsyBTZXJ2ZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCk7XG5cbiAgICByZXR1cm4gd29ybGQgYXMgdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Xb3JsZDxHZW5lcmF0ZWQgZXh0ZW5kcyBHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdCA9IE1pbGtpb0luaXQ+IHtcbiAgICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcbiAgICAvLyBldmVudCBtYW5hZ2VyXG4gICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6IEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4gKCgpID0+IHZvaWQpO1xuICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgSGFuZGxlciBleHRlbmRzIChldmVudDogR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB2b2lkO1xuICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIFZhbHVlIGV4dGVuZHMgR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpID0+IFByb21pc2U8dm9pZD47XG4gICAgZW1pdEFueUFwcHJvdmVkOiA8S2V5IGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wiZXZlbnRzXCJdLCBWYWx1ZSBleHRlbmRzIEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGVtaXRBbGxBcHByb3ZlZDogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBwaW5nOiAob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KSA9PiBQcm9taXNlPFBpbmc+O1xuICAgIC8vIGxpc3RlbmVyXG4gICAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcbiAgICBjb25maWc6IFJlYWRvbmx5PEF3YWl0ZWQ8UmV0dXJuVHlwZTwkdHlwZXNbXCJjb25maWdTY2hlbWFcIl1bXCJnZXRcIl0+Pj47XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiB0eXBpYTxUeXBpYUluaXRUIGV4dGVuZHMgVHlwaWFJbml0Pihpbml0OiBUeXBpYUluaXRUKTogVHlwaWE8VHlwaWFJbml0VD4ge1xuICByZXR1cm4gaW5pdCBhcyB1bmtub3duIGFzIFR5cGlhPFR5cGlhSW5pdFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUeXBpYUluaXQgPSAoKSA9PiBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IHwgUHJvbWlzZTxSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+PjtcblxuZXhwb3J0IHR5cGUgVHlwaWE8VHlwaWFJbml0VCBleHRlbmRzIFR5cGlhSW5pdD4gPSBUeXBpYUluaXRUO1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuaW50ZXJmYWNlIENvb2tib29rRXZlbnQge1xuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcbiAgbG9nOiBMb2c7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0PiwgZXZlbnQ6IENvb2tib29rRXZlbnQpIHtcbiAgLy8gdHJ5IHtcbiAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XG4gIC8vICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAvLyAgICAgaGVhZGVyczoge1xuICAvLyAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgLy8gICAgIH0sXG4gIC8vICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudCksXG4gIC8vICAgfSk7XG4gIC8vICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAvLyAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gIC8vICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICAvLyAgIH1cbiAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xuICAvLyAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBcIklzIENvb2tib29rIGNsb3NlZD8gVGhlcmUgaXMgYW4gYWJub3JtYWxpdHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCBDb29rYm9vay5cIik7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IHNlbmRDb29rYm9va0V2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHNcIjtcblxuZXhwb3J0IHR5cGUgTG9nID0gW1wiKGRlYnVnKVwiIHwgXCIoaW5mbylcIiB8IFwiKHdhcm4pXCIgfCBcIihlcnJvcilcIiB8IFwiKHJlcXVlc3QpXCIgfCBcIihyZXNwb25zZSlcIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgXzoge1xuICAgICAgICBsb2dzOiBBcnJheTxMb2c+O1xuICAgICAgICB0YWdzOiBNYXA8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIH07XG4gICAgc2V0VGFnOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xuICAgIGRlYnVnOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIGluZm86IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gICAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICBlcnJvcjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICByZXF1ZXN0OiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciA9IChjb250ZXh0OiAkY29udGV4dCwgbG9nczogQXJyYXk8TG9nPiwgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5mdW5jdGlvbiBmYXN0VGltZXN0YW1wKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGAoJHtkLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0tJHtTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtTdHJpbmcoZC5nZXRIb3VycygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCBcIjBcIil9KWA7XG59XG5cbi8vIFByZS1jcmVhdGVkIGRlZmF1bHQgaW5zZXJ0aW5nIGhhbmRsZXIgLSBzaGFyZWQgYWNyb3NzIGFsbCBsb2dnZXJzXG5jb25zdCBkZWZhdWx0SW5zZXJ0aW5nID0gKGxvZzogTG9nKTogYm9vbGVhbiA9PiB7XG4gICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xuICAgIGNvbnNvbGUubG9nKC4uLmxvZyk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyPE1pbGtpb1J1bnRpbWUgZXh0ZW5kcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4gPSBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4ocnVudGltZTogTWlsa2lvUnVudGltZSwgcGF0aDogc3RyaW5nLCBleGVjdXRlSWQ6IHN0cmluZyk6IExvZ2dlciB7XG4gICAgY29uc3QgbG9nZ2VyID0ge30gYXMgTG9nZ2VyO1xuXG4gICAgY29uc3QgbG9nczogQXJyYXk8TG9nPiA9IFtdO1xuICAgIGNvbnN0IHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZyB8fCBkZWZhdWx0SW5zZXJ0aW5nO1xuICAgIGNvbnN0IGhhc1N1Ym1pdHRpbmcgPSAhIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nO1xuICAgIGNvbnN0IGlzRGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcblxuICAgIGxvZ2dlci5fID0ge1xuICAgICAgICBsb2dzLFxuICAgICAgICB0YWdzLFxuICAgICAgICBzdWJtaXQ6IChjb250ZXh0OiAkY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZykgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nKGNvbnRleHQsIGxvZ3MsIHRhZ3MpO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBfX3RhZ1B1c2ggPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAgIHRhZ3Muc2V0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgY29uc3QgX19sb2dQdXNoID0gKGxvZzogTG9nKTogTG9nID0+IHtcbiAgICAgICAgaWYgKCFpbnNlcnRpbmcobG9nKSkgcmV0dXJuIGxvZztcbiAgICAgICAgaWYgKGhhc1N1Ym1pdHRpbmcpIGxvZ3MucHVzaChbLi4ubG9nXSk7XG4gICAgICAgIGlmIChpc0RldmVsb3ApIHZvaWQgc2VuZENvb2tib29rRXZlbnQocnVudGltZSwgeyB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIiwgbG9nIH0pO1xuICAgICAgICByZXR1cm4gbG9nO1xuICAgIH07XG5cbiAgICBsb2dnZXIuc2V0VGFnID0gX190YWdQdXNoO1xuICAgIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xuXG4gICAgY29uc3QgZ2V0Tm93ID0gZmFzdFRpbWVzdGFtcDtcblxuICAgIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGRlYnVnKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgICBsb2dnZXIuaW5mbyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGluZm8pXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci53YXJuID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIod2FybilcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoZXJyb3IpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci5yZXF1ZXN0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVxdWVzdClcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLnJlc3BvbnNlID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVzcG9uc2UpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuXG4gICAgcmV0dXJuIGxvZ2dlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XG4gIHN0ZXA6IFN0ZXBGdW5jdGlvbjxTdGFnZVQ+O1xuICBydW46ICgpID0+IFByb21pc2U8UmVtb3ZlXzxTdGFnZVQ+Pjtcbn1cblxudHlwZSBSZW1vdmVfPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xufTtcblxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+ID0gPEhhbmRsZXJUIGV4dGVuZHMgKHN0YWdlOiBSZWFkb25seTxTdGFnZVQ+KSA9PiBSZWNvcmQ8YW55LCBhbnk+IHwgUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+Pj4oaGFuZGxlcjogSGFuZGxlclQpID0+IFN0ZXBzPEF3YWl0ZWQ8U3RhZ2VUPiAmIFRvRW1wdHlPYmplY3Q8QXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXJUPj4+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoKTogU3RlcHM8e30+IHtcbiAgY29uc3Qgc3RlcENvbnRyb2xsZXIgPSB7XG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxuICAgIF9zdGVwczogW10gYXMgQXJyYXk8KHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pj4sXG4gICAgc3RlcChoYW5kbGVyOiAoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcbiAgICAgIHJldHVybiBzdGVwQ29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIGxldCBzdGFnZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBDb250cm9sbGVyLl9zdGVwcykge1xuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoc3RhZ2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX1wiKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN0ZXBDb250cm9sbGVyIGFzIGFueSBhcyBTdGVwczx7fT47XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcbiAgICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xuICAgIHByaXZhdGUgY2FjaGU6IE1hcDxzdHJpbmcsIFQgfCBudWxsPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBuZXcgVHJpZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBhZGQocGF0aDogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnROb2RlLnZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEJ5UGFydHMocGFydHM6IHN0cmluZ1tdKTogVCB8IG51bGwge1xuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS5jaGlsZHJlbi5oYXMocGFydCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBoYXMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChwYXRoKSAhPT0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIFRyaWVOb2RlPFQ+IHtcbiAgICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xuICAgIHZhbHVlOiBUIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29yc0NvbmZpZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb3JzSGVhZGVycyhjb3JzOiBDb3JzQ29uZmlnIHwgdW5kZWZpbmVkLCBvcmlnaW4/OiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd01ldGhvZHMpIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIl0gPSBjb3JzLmNvcnNBbGxvd01ldGhvZHMuam9pbihcIiwgXCIpO1xuICAgIGlmIChjb3JzPy5jb3JzQWxsb3dIZWFkZXJzKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCJdID0gY29ycy5jb3JzQWxsb3dIZWFkZXJzLmpvaW4oXCIsIFwiKTtcbiAgICBpZiAoY29ycz8uY29yc01heEFnZSAhPT0gdW5kZWZpbmVkKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlXCJdID0gU3RyaW5nKGNvcnMuY29yc01heEFnZSk7XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd09yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGlzV2lsZGNhcmQgPSBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhcIipcIik7XG4gICAgICAgIGlmIChjb3JzLmNvcnNBbGxvd0NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNyZWRlbnRpYWxzOiB0cnVlLCB0aGUgc3BlYyBmb3JiaWRzIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKi5cbiAgICAgICAgICAgIC8vIEVjaG8gdGhlIHJlcXVlc3Qgb3JpZ2luIGluc3RlYWQgKHdpbGRjYXJkIG1lYW5zIFwiYWxsb3cgYW55IG9yaWdpblwiKS5cbiAgICAgICAgICAgIGlmIChvcmlnaW4gJiYgKGlzV2lsZGNhcmQgfHwgY29ycy5jb3JzQWxsb3dPcmlnaW4uaW5jbHVkZXMob3JpZ2luKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIl0gPSBvcmlnaW47XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiVmFyeVwiXSA9IFwiT3JpZ2luXCI7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIl0gPSBcInRydWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1dpbGRjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gXCIqXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhvcmlnaW4pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gb3JpZ2luO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtcIlZhcnlcIl0gPSBcIk9yaWdpblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb3JzPy5jb3JzRXhwb3NlSGVhZGVycyAmJiBjb3JzLmNvcnNFeHBvc2VIZWFkZXJzLmxlbmd0aCA+IDApIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzXCJdID0gY29ycy5jb3JzRXhwb3NlSGVhZGVycy5qb2luKFwiLCBcIik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0iLAogICAgImltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXhjZXB0aW9uSGFuZGxlciwgcmVqZWN0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1peGluLCBHZW5lcmF0ZWRJbml0LCAkdHlwZXMsIENvbnRleHRIdHRwLCBNaWxraW9SZXNwb25zZVJlamVjdCwgUmVzdWx0cywgTWlsa2lvUmVzcG9uc2VTdWNjZXNzLCBDb3JzQ29uZmlnLCBMb2dnZXIsIExvZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyBfX2luaXRFeGVjdXRlciB9IGZyb20gXCIuLi9leGVjdXRlL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuaW1wb3J0IHsgVHJpZSB9IGZyb20gXCIuLi91dGlscy90cmllLnRzXCI7XG5pbXBvcnQgeyBidWlsZENvcnNIZWFkZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2J1aWxkLWNvcnMtaGVhZGVycy50c1wiO1xuaW1wb3J0IHsgcmV2aXZlSlNPTlBhcnNlIH0gZnJvbSBcIi4uL3V0aWxzL3Jldml2ZS1qc29uLXBhcnNlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb0h0dHBSZXF1ZXN0ID0gUmVxdWVzdDtcblxuZXhwb3J0IHR5cGUgTWlsa2lvSHR0cFJlc3BvbnNlID0gTWl4aW48XG4gICAgUmVzcG9uc2VJbml0LFxuICAgIHtcbiAgICAgICAgYm9keTogc3RyaW5nIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBCbG9iIHwgbnVsbDtcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgfVxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55LCBleGVjdXRlcjogUmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXhlY3V0ZXI+KSB7XG4gICAgY29uc3QgcG9ydCA9IHJ1bnRpbWUucG9ydDtcbiAgICBjb25zdCB0cmllID0gbmV3IFRyaWU8YW55PigpO1xuICAgIC8vIFByZS1jb21wdXRlIGRlZmF1bHQgQ09SUyBjb25maWcgYW5kIGNhY2hlIGhlYWRlcnMgcGVyIG9yaWdpblxuICAgIGNvbnN0IGNvcnM6IENvcnNDb25maWcgPSB7IGNvcnNBbGxvd01ldGhvZHM6IFtcIlBPU1RcIiwgXCJPUFRJT05TXCJdLCBjb3JzQWxsb3dIZWFkZXJzOiBbXCJDb250ZW50LVR5cGVcIiwgXCJBdXRob3JpemF0aW9uXCJdLCBjb3JzTWF4QWdlOiAwLCAuLi5ydW50aW1lLmh0dHA/LmNvcnMgfTtcbiAgICBjb25zdCBjb3JzSGVhZGVyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgY29uc3QgZ2V0Q29yc0hlYWRlcnMgPSAob3JpZ2luOiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IG9yaWdpbiA/PyBcIlwiO1xuICAgICAgICBsZXQgY2FjaGVkID0gY29yc0hlYWRlcnNDYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICBjYWNoZWQgPSBidWlsZENvcnNIZWFkZXJzKGNvcnMsIG9yaWdpbik7XG4gICAgICAgIGNvcnNIZWFkZXJzQ2FjaGUuc2V0KGtleSwgY2FjaGVkKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9O1xuICAgIC8vIFByZS1jb21wdXRlIGRlZmF1bHQgcmVzcG9uc2UgaGVhZGVycyAod2l0aG91dCBvcmlnaW4tc3BlY2lmaWMgQ09SUylcbiAgICBjb25zdCBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1zdG9yZVwiLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICB9O1xuICAgIC8vIFByZS1jb21wdXRlIG1lcmdlZCBoZWFkZXJzIGZvciBudWxsIG9yaWdpbiAobW9zdCBjb21tb24gY2FzZSlcbiAgICBjb25zdCBkZWZhdWx0TWVyZ2VkSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgLi4uZ2V0Q29yc0hlYWRlcnMobnVsbCksIC4uLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMgfTtcblxuICAgIC8vIFByZS1hbGxvY2F0ZSByZXNwb25zZSB0ZW1wbGF0ZSBwYXJ0cyBmb3IgRmFzdCBQYXRoXG4gICAgY29uc3QgZW1wdHlSZXN1bHRQcmVmaXggPSAne1wiZGF0YVwiOnt9LFwiZXhlY3V0ZUlkXCI6XCInO1xuICAgIGNvbnN0IHJlc3VsdFByZWZpeCA9ICd7XCJkYXRhXCI6JztcbiAgICBjb25zdCBpZFN1ZmZpeCA9ICdcIixcInN1Y2Nlc3NcIjp0cnVlfSc7XG4gICAgLy8gU2hhcmVkIHJlc3BvbnNlIG9iamVjdCBmb3IgRmFzdCBQYXRoIChoYW5kbGVyIHJldHVybnMgcmVzdWx0IGRpcmVjdGx5LCBuZXZlciBtb2RpZmllcyByZXNwb25zZSlcbiAgICBjb25zdCBmYXN0UGF0aFJlc3BvbnNlID0geyBib2R5OiBcIlwiLCBzdGF0dXM6IDIwMCwgaGVhZGVyczogZGVmYXVsdE1lcmdlZEhlYWRlcnMgfTtcblxuICAgIC8vIER5bmFtaWMgY2hlY2sgZm9yIGV2ZW50IGhhbmRsZXJzIHdpdGggdmVyc2lvbi1iYXNlZCBjYWNoaW5nXG4gICAgbGV0IGNhY2hlZE5vRW1pdEhhbmRsZXJzID0gdHJ1ZTtcbiAgICBsZXQgbGFzdEVtaXRIYW5kbGVyc1ZlcnNpb24gPSAtMTtcbiAgICBjb25zdCBjaGVja05vRW1pdEhhbmRsZXJzID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCB2ID0gcnVudGltZS5fZW1pdEhhbmRsZXJzVmVyc2lvbjtcbiAgICAgICAgaWYgKHYgIT09IGxhc3RFbWl0SGFuZGxlcnNWZXJzaW9uKSB7XG4gICAgICAgICAgICBsYXN0RW1pdEhhbmRsZXJzVmVyc2lvbiA9IHY7XG4gICAgICAgICAgICBjYWNoZWROb0VtaXRIYW5kbGVycyA9XG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIikgJiZcbiAgICAgICAgICAgICAgICAhcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86ZXhlY3V0ZUFmdGVyXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXF1ZXN0XCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXNwb25zZVwiKSAmJlxuICAgICAgICAgICAgICAgICFydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwTm90Rm91bmRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZE5vRW1pdEhhbmRsZXJzO1xuICAgIH07XG4gICAgY29uc3QgaGFzT25Mb2dnZXJTdWJtaXR0aW5nID0gISFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZztcblxuICAgIC8vIFNoYXJlZCBuby1vcCBsb2dnZXIgZm9yIGZhc3QgcGF0aCAodXNlZCB3aGVuIG5vIGV2ZW50IGhhbmRsZXJzKVxuICAgIGNvbnN0IG5vb3BMb2dnZXI6IExvZ2dlciA9IHtcbiAgICAgICAgXzogeyBsb2dzOiBbXSBhcyBhbnksIHRhZ3M6IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpLCBzdWJtaXQ6ICgpID0+IHsgfSB9LFxuICAgICAgICBzZXRUYWc6ICgpID0+IHsgfSxcbiAgICAgICAgc2V0TG9nOiAoLi4uX2xvZzogTG9nKSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgZGVidWc6IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICBpbmZvOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgd2FybjogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIGVycm9yOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgcmVxdWVzdDogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIHJlc3BvbnNlOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICB9O1xuXG4gICAgLy8gUHJlLWNyZWF0ZSBiYXNlIGNvbnRleHQgcHJvdG90eXBlIGZvciBGYXN0IFBhdGggKHNoYXJlZCBpbW11dGFibGUgcHJvcGVydGllcylcbiAgICAvLyBgY2FsbGAgaXMgZGVmaW5lZCBvbiBwcm90b3R5cGUgdG8gYXZvaWQgY3JlYXRpbmcgYSBjbG9zdXJlIHBlciByZXF1ZXN0XG4gICAgY29uc3QgYmFzZUNvbnRleHRQcm90bzogYW55ID0ge1xuICAgICAgICByZWplY3QsXG4gICAgICAgIGRldmVsb3A6IHJ1bnRpbWUuZGV2ZWxvcCxcbiAgICAgICAgbG9nZ2VyOiBub29wTG9nZ2VyLFxuICAgICAgICBlbWl0OiBydW50aW1lLmVtaXQsXG4gICAgICAgIGVtaXRBbnlBcHByb3ZlZDogcnVudGltZS5lbWl0QW55QXBwcm92ZWQsXG4gICAgICAgIGVtaXRBbGxBcHByb3ZlZDogcnVudGltZS5lbWl0QWxsQXBwcm92ZWQsXG4gICAgICAgIGNvbmZpZzogcnVudGltZS5ydW50aW1lLmNvbmZpZyxcbiAgICAgICAgdHlwaWE6IGdlbmVyYXRlZC50eXBpYVNjaGVtYSxcbiAgICAgICAgb25GaW5hbGx5OiAoKSA9PiB7IH0sXG4gICAgICAgIF86IHJ1bnRpbWUsXG4gICAgICAgIGNhbGwobW9kdWxlOiBhbnksIHA6IGFueSkgeyByZXR1cm4gZXhlY3V0ZXIuX19jYWxsKHRoaXMsIG1vZHVsZSwgcCk7IH0sXG4gICAgfTtcblxuICAgIC8vIEhvdCBwYXRoIGNhY2hlOiBwcmUtcmVzb2x2ZSB0aGUgbW9zdCBjb21tb24gcm91dGVcbiAgICBsZXQgY2FjaGVkUm91dGVTY2hlbWE6IGFueSA9IG51bGw7XG4gICAgbGV0IGNhY2hlZFBhdGhTdHJpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIHZhbGlkYXRlUGFyYW1zIGFuZCBoYW5kbGVyIHJlZmVyZW5jZXMgdG8gYXZvaWQgcHJvcGVydHkgbG9va3Vwc1xuICAgIGxldCBjYWNoZWRWYWxpZGF0ZVBhcmFtczogYW55ID0gbnVsbDtcbiAgICBsZXQgY2FjaGVkSGFuZGxlcjogYW55ID0gbnVsbDtcbiAgICBsZXQgY2FjaGVkU2tpcFZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0IGZldGNoID0gYXN5bmMgKG9wdGlvbnM6IHtcbiAgICAgICAgcmVxdWVzdDogTWlsa2lvSHR0cFJlcXVlc3Q7XG4gICAgICAgIGVudk1vZGU/OiBzdHJpbmc7XG4gICAgICAgIGVudj86IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgIHJvdXRlU2NoZW1hPzogYW55O1xuICAgICAgICByYXdSZXNwb25zZT86IGJvb2xlYW47XG4gICAgfSk6IFByb21pc2U8UmVzcG9uc2U+ID0+IHtcbiAgICAgICAgLy8gVXNlIHByZS1wYXNzZWQgb3JpZ2luIGZyb20gYWRhcHRlciB0byBhdm9pZCBoZWFkZXJzLmdldCgpIGNhbGxcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gKG9wdGlvbnMucmVxdWVzdCBhcyBhbnkpLl9fb3JpZ2luID8/IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmdldChcIk9yaWdpblwiKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0Lm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogZ2V0Q29yc0hlYWRlcnMob3JpZ2luKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHByZS1wYXJzZWQgcGF0aG5hbWUgYW5kIHBhdGhBcnJheSBpZiBhdmFpbGFibGUgKGZyb20gYWRhcHRlciksIG90aGVyd2lzZSBwYXJzZVxuICAgICAgICBjb25zdCBwYXRobmFtZSA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX3BhdGhuYW1lID8/IG5ldyBVUkwob3B0aW9ucy5yZXF1ZXN0LnVybCkucGF0aG5hbWU7XG4gICAgICAgIGlmIChwYXRobmFtZS5lbmRzV2l0aChcIi9nZW5lcmF0ZV8yMDRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICAgICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgU2VydmVyOiBcIm1pbGtpb1wiLFxuICAgICAgICAgICAgICAgICAgICAuLi5jb3JzSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogYHRleHQvcGxhaW47IHRpbWU9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlUGF0aEFycmF5ID0gKG9wdGlvbnMucmVxdWVzdCBhcyBhbnkpLl9fcGF0aEFycmF5O1xuICAgICAgICBsZXQgcGF0aFN0cmluZzogc3RyaW5nO1xuICAgICAgICBsZXQgcGF0aEFycmF5OiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKCFydW50aW1lLmFjY2Vzc0tleSAmJiAoIXJ1bnRpbWUuaWdub3JlUGF0aExldmVsIHx8IHJ1bnRpbWUuaWdub3JlUGF0aExldmVsID09PSAwKSkge1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHBhdGhuYW1lO1xuICAgICAgICAgICAgcGF0aEFycmF5ID0gcHJlUGF0aEFycmF5ID8/IHBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoQXJyYXkgPSBwcmVQYXRoQXJyYXkgPz8gcGF0aG5hbWUuc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChydW50aW1lLmFjY2Vzc0tleSAmJiBwYXRoQXJyYXkuYXQoMCkgIT09IHJ1bnRpbWUuYWNjZXNzS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5OiBcIlwiLCBzdGF0dXM6IDQwMywgaGVhZGVyczogY29yc0hlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiA0MDMsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGNvcnNIZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bnRpbWUuaWdub3JlUGF0aExldmVsICE9PSB1bmRlZmluZWQgJiYgcnVudGltZS5pZ25vcmVQYXRoTGV2ZWwgIT09IDApIHBhdGhBcnJheSA9IHBhdGhBcnJheS5zbGljZShydW50aW1lLmlnbm9yZVBhdGhMZXZlbCk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gYC8ke3BhdGhBcnJheS5qb2luKFwiL1wiKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJlLXJlYWQgYm9keSB0ZXh0IGlmIGF2YWlsYWJsZSAoZnJvbSBhZGFwdGVyKSwgb3RoZXJ3aXNlIHVzZSBhc3luYyByZXF1ZXN0LnRleHQoKVxuICAgICAgICBjb25zdCBib2R5VGV4dCA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX2JvZHlUZXh0O1xuICAgICAgICBjb25zdCBpcCA9IHJ1bnRpbWUucmVhbElwID8gcnVudGltZS5yZWFsSXAob3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMpIDogXCI6OjFcIjtcblxuICAgICAgICAvLyDmtYvor5Xnjq/looPkuIvnmoQgJGV2ZW50IOerr+eCue+8mumAmui/hyBiYXNlNjQg57yW56CB55qE5LqL5Lu25ZCN6Kem5Y+R5LqL5Lu2XG4gICAgICAgIGlmIChvcHRpb25zLmVudk1vZGUgPT09IFwidGVzdFwiICYmIHBhdGhTdHJpbmcuc3RhcnRzV2l0aChcIi8kZXZlbnQvXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlNjROYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhTdHJpbmcuc2xpY2UoOCkpO1xuICAgICAgICAgICAgbGV0IGV2ZW50TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyDlhbzlrrnkuI3lkIzov5DooYzml7bvvJrkvJjlhYjkvb/nlKggYXRvYu+8jOWbnumAgOWIsCBCdWZmZXJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGF0b2IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gYXRvYihiYXNlNjROYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gQnVmZmVyLmZyb20oYmFzZTY0TmFtZSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBiYXNlNjQgZGVjb2RlciBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgcmVqZWN0OiB7IGV4cGVjdGVkOiBcInZhbGlkIGJhc2U2NCBldmVudCBuYW1lXCIgfSB9KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IHsgLi4uY29yc0hlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7IHN0YXR1czogMjAwLCBoZWFkZXJzOiB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByYXdCb2R5ID0gYm9keVRleHQgIT09IHVuZGVmaW5lZCA/IGJvZHlUZXh0IDogYXdhaXQgb3B0aW9ucy5yZXF1ZXN0LnRleHQoKTtcbiAgICAgICAgICAgIGlmIChyYXdCb2R5ICYmIHJhd0JvZHkgIT09IFwiXCIgJiYgcmF3Qm9keSAhPT0gXCJ7fVwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmF3Qm9keSkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgcmVqZWN0OiB7IGV4cGVjdGVkOiBcImpzb25cIiB9IH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IHsgLi4uY29yc0hlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczogeyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IF9fY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25IZWFkZXJzID0geyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIgfTtcblxuICAgICAgICAgICAgLy8g6Ieq5Yqo5rOo5YWlIGNvbnRleHQg4oCUIGV2ZW50IOaVsOaNruS4ree6puWumuS/l+aIkOeahCBjb250ZXh0IOWPguaVsOaXoOazleeUseWklumDqOS8oOWPgu+8jOeUseacjeWKoeerr+ihpeWFqFxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiB0eXBlb2YgZXZlbnREYXRhID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGV2ZW50RGF0YSkgJiYgIShcImNvbnRleHRcIiBpbiBldmVudERhdGEpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnREYXRhLmNvbnRleHQgPSB7IHJlamVjdCwgZGV2ZWxvcDogcnVudGltZS5kZXZlbG9wLCBleGVjdXRlSWQsIHBhdGg6IHBhdGhTdHJpbmcsIGVtaXQ6IHJ1bnRpbWUuZW1pdCwgZW1pdEFueUFwcHJvdmVkOiBydW50aW1lLmVtaXRBbnlBcHByb3ZlZCwgZW1pdEFsbEFwcHJvdmVkOiBydW50aW1lLmVtaXRBbGxBcHByb3ZlZCwgXzogcnVudGltZSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChldmVudE5hbWUsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlbWl0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJSZXN1bHQgPSBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbm9vcExvZ2dlciwgZW1pdEVycm9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZXJyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogZXJyQm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoZXJyQm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczoganNvbkhlYWRlcnMgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBge1wiZGF0YVwiOiR7SlNPTi5zdHJpbmdpZnkoZXZlbnREYXRhID8/IHt9LCAoa2V5LCB2YWx1ZSkgPT4ga2V5ID09PSBcImNvbnRleHRcIiA/IHVuZGVmaW5lZCA6IHZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5LCBzdGF0dXM6IDIwMCwgaGVhZGVyczoganNvbkhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT0gRkFTVCBQQVRIIGZvciBjb21tb24gYWN0aW9uIHJlcXVlc3RzID09PT09XG4gICAgICAgIC8vIFNraXAgbG9nZ2VyLCByZXF1ZXN0IG1hcCwgYW5kIG1vc3Qgb2JqZWN0IGNyZWF0aW9uIHdoZW46XG4gICAgICAgIC8vIC0gcmF3UmVzcG9uc2UgbW9kZSAoYWRhcHRlcilcbiAgICAgICAgLy8gLSBObyBvcmlnaW4gaGVhZGVyIChubyBDT1JTIG5lZWRlZClcbiAgICAgICAgLy8gLSBObyBldmVudCBoYW5kbGVycyByZWdpc3RlcmVkIChkeW5hbWljIGNoZWNrKVxuICAgICAgICAvLyAtIE5vdCBhIHN0cmVhbSByZXF1ZXN0XG4gICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlICYmICFvcmlnaW4gJiYgY2hlY2tOb0VtaXRIYW5kbGVycygpKSB7XG4gICAgICAgICAgICBjb25zdCBfX2lzQWN0aW9uID0gKG9wdGlvbnMucmVxdWVzdCBhcyBhbnkpLl9faXNBY3Rpb247XG4gICAgICAgICAgICBpZiAoX19pc0FjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHJvdXRlIHNjaGVtYSB3aXRoIGhvdCBjYWNoZVxuICAgICAgICAgICAgICAgIGxldCByb3V0ZVNjaGVtYSA9IG9wdGlvbnMucm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFN0cmluZyA9PT0gY2FjaGVkUGF0aFN0cmluZyAmJiBjYWNoZWRSb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBjYWNoZWRSb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQocGF0aFN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRSb3V0ZVNjaGVtYSA9IHJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW3BhdGhTdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQwNCAtIGZhbGwgdGhyb3VnaCB0byBzbG93IHBhdGggZm9yIHByb3BlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQocGF0aFN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRSb3V0ZVNjaGVtYSA9IHJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRQYXRoU3RyaW5nID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgJiYgcm91dGVTY2hlbWEudHlwZSA9PT0gXCJhY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY2FjaGVkIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2hlbiBoaXR0aW5nIHRoZSBzYW1lIHJvdXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0ZVBhcmFtcyA9IGNhY2hlZFZhbGlkYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFuZGxlciA9IGNhY2hlZEhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBza2lwVmFsaWRhdGlvbiA9IGNhY2hlZFNraXBWYWxpZGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgIT09IGNhY2hlZFJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhcmFtcyA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHJvdXRlU2NoZW1hLm1vZHVsZS5oYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IHJvdXRlU2NoZW1hLm1vZHVsZT8ubWV0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gbWV0YT8udHlwZVNhZmV0eSA9PT0gZmFsc2UgfHwgKEFycmF5LmlzQXJyYXkobWV0YT8udHlwZVNhZmV0eSkgJiYgIW1ldGEudHlwZVNhZmV0eS5pbmNsdWRlcyhcInBhcmFtc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWxpZGF0ZVBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRTa2lwVmFsaWRhdGlvbiA9IHNraXBWYWxpZGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gX19jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYm9keVRleHQgIT09IHVuZGVmaW5lZCA/IGJvZHlUZXh0IDogYXdhaXQgb3B0aW9ucy5yZXF1ZXN0LnRleHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtczogYW55O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zT2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJvZHkgfHwgYm9keSA9PT0gXCJcIiB8fCBib2R5ID09PSBcInt9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShib2R5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zT2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNPayAmJiBwYXJhbXMgIT09IG51bGwgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwICRtaWxraW9HZW5lcmF0ZVBhcmFtcyBpbiB0ZXN0IG1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVudk1vZGUgPT09IFwidGVzdFwiIHx8ICEoXCIkbWlsa2lvR2VuZXJhdGVQYXJhbXNcIiBpbiBwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgcGFyYW1zIHdoZW4gdHlwZVNhZmV0eSBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkIC0gZmFsbCB0aHJvdWdoIHRvIHNsb3cgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zT2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNPaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBtaW5pbWFsIGNvbnRleHQgdXNpbmcgcHJvdG90eXBlIGZvciBzaGFyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0OiBhbnkgPSBPYmplY3QuY3JlYXRlKGJhc2VDb250ZXh0UHJvdG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnBhdGggPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmV4ZWN1dGVJZCA9IGV4ZWN1dGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5odHRwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBwYXRobmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcsIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBzdHJpbmc6IGJvZHksIHBhcnNlZDogcGFyYW1zIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogZmFzdFBhdGhSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGNvbnRleHQsIHBhcmFtcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogZW1wdHlSZXN1bHRQcmVmaXggKyBleGVjdXRlSWQgKyBpZFN1ZmZpeCwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGRlZmF1bHRNZXJnZWRIZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5OiByZXN1bHRQcmVmaXggKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpICsgJyxcImV4ZWN1dGVJZFwiOlwiJyArIGV4ZWN1dGVJZCArIGlkU3VmZml4LCBzdGF0dXM6IDIwMCwgaGVhZGVyczogZGVmYXVsdE1lcmdlZEhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIHJlc3VsdCB0eXBlIC0gZmFsbCB0aHJvdWdoIHRvIHNsb3cgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZXIgdGhyZXcgLSBmYWxsIHRocm91Z2ggdG8gc2xvdyBwYXRoIGZvciBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09IFNMT1cgUEFUSCA9PT09PVxuICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IHJ1bnRpbWU/LmV4ZWN1dGVJZCA/IGF3YWl0IHJ1bnRpbWUuZXhlY3V0ZUlkKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IF9fY3JlYXRlSWQoKTtcbiAgICAgICAgY29uc3QgYW55RW1pdEhhbmRsZXJzID0gIWNoZWNrTm9FbWl0SGFuZGxlcnMoKTtcblxuICAgICAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIocnVudGltZSwgcGF0aFN0cmluZywgZXhlY3V0ZUlkKTtcbiAgICAgICAgaWYgKGFueUVtaXRIYW5kbGVycykgcnVudGltZS5ydW50aW1lLnJlcXVlc3Quc2V0KGV4ZWN1dGVJZCwgeyBsb2dnZXIgfSk7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIGJhc2UgaGVhZGVycyBmb3IgdGhpcyByZXF1ZXN0IChDT1JTICsgZGVmYXVsdHMpXG4gICAgICAgIGNvbnN0IGJhc2VIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gb3JpZ2luID8geyAuLi5jb3JzSGVhZGVycywgLi4uZGVmYXVsdFJlc3BvbnNlSGVhZGVycyB9IDogZGVmYXVsdE1lcmdlZEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBNaWxraW9IdHRwUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBib2R5OiBcIlwiLFxuICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICBoZWFkZXJzOiB7IC4uLmJhc2VIZWFkZXJzIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaHR0cDogQ29udGV4dEh0dHAgPSB7XG4gICAgICAgICAgICB1cmw6IHBhdGhuYW1lIGFzIGFueSxcbiAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHN0cmluZzogYm9keVRleHQgIT09IHVuZGVmaW5lZCA/IGJvZHlUZXh0IDogYXdhaXQgb3B0aW9ucy5yZXF1ZXN0LnRleHQoKSxcbiAgICAgICAgICAgICAgICBwYXJzZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QsXG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIGNvcnMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0geyByZWplY3QgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGVtaXQgaGFzIGhhbmRsZXJzIGJlZm9yZSBhd2FpdGluZ1xuICAgICAgICAgICAgY29uc3QgaGFzSHR0cFJlcXVlc3RIYW5kbGVycyA9IHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXF1ZXN0XCIpID8/IHRydWU7XG4gICAgICAgICAgICBpZiAoaGFzSHR0cFJlcXVlc3RIYW5kbGVycykgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXF1ZXN0XCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QgfSk7XG5cbiAgICAgICAgICAgIC8vIOmdniB0ZXN0IOeOr+Wig+S4i+aLpuaIqiAkZXhwb3J0cyDlhoXpg6jot6/lvoRcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudk1vZGUgIT09IFwidGVzdFwiICYmIChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuaW5jbHVkZXMoXCIkXCIpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0IH0pO1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmdldChcIkFjY2VwdFwiKT8uc3RhcnRzV2l0aChcInRleHQvZXZlbnQtc3RyZWFtXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gYWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhvdCBwYXRoOiBjaGVjayBzaW5nbGUtZW50cnkgY2FjaGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhTdHJpbmcgPT09IGNhY2hlZFBhdGhTdHJpbmcgJiYgY2FjaGVkUm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gY2FjaGVkUm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIiRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSB0cmllLmdldChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaG90IHBhdGggY2FjaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFJvdXRlU2NoZW1hID0gcm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRQYXRoU3RyaW5nID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcImFjdGlvblwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBcIkBtaWxraW8vc3RhcmdhdGVcIiBwYWNrYWdlLCBwbGVhc2UgYWRkIFxcYHR5cGU6IFwic3RyZWFtXCJcXGAgdG8gdGhlIGV4ZWN1dGUgb3B0aW9ucy5gIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IGh0dHA7XG4gICAgICAgICAgICAgICAgY29udGV4dC5oZWFkZXJzID0gaHR0cC5yZXF1ZXN0LmhlYWRlcnM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBleGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzIGFzIEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNDb250ZW50VHlwZTogXCJqc29uXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keSA9PT0gXCJcIiAmJiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGVkLmVtcHR5UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4ZWN1dGVkLnJlc3VsdHNUeXBlU2FmZXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjoke3JvdXRlU2NoZW1hLnJlc3VsdHNUb0pTT04oZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSl9LFwiZXhlY3V0ZUlkXCI6XCIke2V4ZWN1dGVJZH1cIixcInN1Y2Nlc3NcIjp0cnVlfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjoke0pTT04uc3RyaW5naWZ5KGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzSHR0cFJlc3BvbnNlSGFuZGxlcnMgPSBydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVzcG9uc2VcIikgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzSHR0cFJlc3BvbnNlSGFuZGxlcnMpIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0OiBleGVjdXRlZC5jb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmluYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhhc09uTG9nZ2VyU3VibWl0dGluZykgYXdhaXQgbG9nZ2VyLl8uc3VibWl0KGNvbnRleHQgYXMgYW55KTtcbiAgICAgICAgICAgICAgICBpZiAoYW55RW1pdEhhbmRsZXJzKSBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5OiByZXNwb25zZS5ib2R5LCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5IGFzIEJvZHlJbml0IHwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBsZXQgcm91dGVTY2hlbWEgPSBvcHRpb25zLnJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgIGlmICghcm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSB0cmllLmdldChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpLmluY2x1ZGVzKFwiJFwiKSB8fCAhKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKS5lbmRzV2l0aChcIn5cIikgfHwgcm91dGVTY2hlbWEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gZ2VuZXJhdGVkLnJvdXRlU2NoZW1hPy5baHR0cC5wYXRoLnN0cmluZ107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcInN0cmVhbVwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJhcHBsaWNhdGlvbi9qc29uXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSByZW1vdmUgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlQ2xvc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPbkxvZ2dlclN1Ym1pdHRpbmcpIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb250ZXh0Lmh0dHAgPSBodHRwO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IGh0dHAucmVxdWVzdC5oZWFkZXJzO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLnJlcXVlc3QuaGVhZGVycyBhcyBIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcbiAgICAgICAgICAgICAgICAvLyBTdHJlYW0gcGF0aDogY3JlYXRlIG5ldyBoZWFkZXJzIG9iamVjdCB0byBhdm9pZCBwb2xsdXRpbmcgc2hhcmVkIGRlZmF1bHRNZXJnZWRIZWFkZXJzXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHsgLi4ucmVzcG9uc2UuaGVhZGVycywgLi4uYnVpbGRDb3JzSGVhZGVycyhodHRwLmNvcnMsIG9yaWdpbikgfTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbDogUmVhZGFibGVTdHJlYW1EaXJlY3RDb250cm9sbGVyIHwgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQnVuICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkaXJlY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyOiBSZWFkYWJsZVN0cmVhbURpcmVjdENvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgdmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOiR7cmVzdWx0fVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YToke0pTT04uc3RyaW5naWZ5KFtyZXN1bHQsIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBub2RlLmpzIG9yIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoW251bGwsIHZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7cmVzdWx0fVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW3Jlc3VsdCwgbnVsbF0pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBzdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gU3RyZWFtIHBhdGg6IGNyZWF0ZSBuZXcgaGVhZGVycyB0byBhdm9pZCBwb2xsdXRpbmcgc2hhcmVkIG9iamVjdFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7IC4uLnJlc3BvbnNlLmhlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9ldmVudC1zdHJlYW1cIiwgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tY2FjaGVcIiB9O1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQ6IGV4ZWN1dGVkLmNvbnRleHQsIHN1Y2Nlc3M6IHRydWUsIHJlamVjdCB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxNaWxraW9SZXNwb25zZVJlamVjdD4gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVzdWx0cy52YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXNwb25zZS5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0cy52YWx1ZSk7XG4gICAgICAgICAgICAvLyBFcnJvciBwYXRoOiBjcmVhdGUgbmV3IGhlYWRlcnMgdG8gYXZvaWQgcG9sbHV0aW5nIHNoYXJlZCBvYmplY3RcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7IC4uLnJlc3BvbnNlLmhlYWRlcnMsIC4uLmNvcnNIZWFkZXJzIH07XG4gICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dCwgc3VjY2VzczogZmFsc2UsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIGlmIChoYXNPbkxvZ2dlclN1Ym1pdHRpbmcpIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoYW55RW1pdEhhbmRsZXJzKSBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogcmVzcG9uc2UuYm9keSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkgYXMgQm9keUluaXQgfCBudWxsLCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc3RyZWFtQ2xvc2VyczogTWFwPHN0cmluZywgeyBnZW5lcmF0b3I6IEFzeW5jR2VuZXJhdG9yOyBoYW5kbGVDbG9zZTogYW55IH0+ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSBhc3luYyAoXG4gICAgICAgIHBvcnQ6IHsgcG9zdE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB9LFxuICAgICAgICBvcHRpb25zOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gXCJQSU5HXCIpIHtcbiAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKFwiUE9OR1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXJ0c1dpdGgoXCJDTE9TRV9TVFJFQU06XCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gb3B0aW9ucy5zcGxpdChcIkNMT1NFX1NUUkVBTTpcIilbMV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtQ2xvc2VyID0gc3RyZWFtQ2xvc2Vycy5nZXQoZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtQ2xvc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3Nlci5nZW5lcmF0b3IucmV0dXJuKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3Nlci5oYW5kbGVDbG9zZShcInN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gdHJpZS5nZXQob3B0aW9ucy5wYXRoKTtcbiAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW29wdGlvbnMucGF0aF07XG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IG9wdGlvbnMucGF0aCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICB0cmllLmFkZChvcHRpb25zLnBhdGgsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcyA/PyB7fTtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIG9wdGlvbnMucGF0aCwgb3B0aW9ucy5leGVjdXRlSWQpO1xuICAgICAgICBsZXQgZmluYWxlczogQXJyYXk8KCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4+ID0gW107XG5cbiAgICAgICAgY29uc3QgaHR0cCA9IG5ldyBQcm94eShcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdldDogKHRhcmdldCwgcHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcIm5vdEZvdW5kXCIpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcImNvbnRleHQuaHR0cFwiLCBtZXNzYWdlOiBcIlRoaXMgcmVxdWVzdCB3YXMgaW52b2tlZCB0aHJvdWdoIHRoZSBleGVjdXRlIG1ldGhvZC4gU2luY2Ugbm8gYWN0dWFsIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCwgdGhlIEhUVFAgbWV0aG9kcyB1bmRlciB0aGUgY29udGV4dCBjYW5ub3QgYmUgYWNjZXNzZWQuXCIgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlQ2xvc2UgPSBhc3luYyAodHlwZTogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCIpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN0cmVhbVwiKSBzdHJlYW1DbG9zZXJzLmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgbG9nZ2VyLl8uc3VibWl0KGNvbnRleHQgYXMgYW55KTtcbiAgICAgICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHsgaHR0cDogaHR0cCwgaGVhZGVycywgcmVqZWN0IH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlID09PSBcImFjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwicmF3XCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZShcImFjdGlvblwiKTtcblxuICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZC5lbXB0eVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB1bmRlZmluZWQsIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1DbG9zZXJzLnNldChvcHRpb25zLmV4ZWN1dGVJZCwgeyBnZW5lcmF0b3I6IGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUsIGhhbmRsZUNsb3NlIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtudWxsLCB2YWx1ZV0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB1bmRlZmluZWQsIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogW3Jlc3VsdCwgbnVsbF0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XG4gICAgICAgICAgICBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IGZhbHNlLCBkYXRhOiB1bmRlZmluZWQsIGVycm9yOiByZXN1bHQsIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgZmV0Y2gsXG4gICAgICAgIGhhbmRsZU1lc3NhZ2UsXG4gICAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBNaWxraW9SZXNwb25zZVJlamVjdCwgTG9nZ2VyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJHJlamVjdENvZGUge1xuICAgIFJFUVVFU1RfRkFJTDogYW55O1xuICAgIE5PVF9ERVZFTE9QX01PREU6IHN0cmluZztcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dDogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfTtcbiAgICBOT1RfRk9VTkQ6IHsgcGF0aDogc3RyaW5nIH07XG4gICAgUEFSQU1TX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xuICAgIFJFU1VMVFNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgVU5BQ0NFUFRBQkxFOiB7IGV4cGVjdGVkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xuICAgIFBBUkFNU19UWVBFX05PVF9TVVBQT1JURUQ6IHsgZXhwZWN0ZWQ6IHN0cmluZyB9O1xuICAgIFJFU1VMVFNfVFlQRV9OT1RfU1VQUE9SVEVEOiB7IGV4cGVjdGVkOiBzdHJpbmcgfTtcbiAgICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6IHVuZGVmaW5lZDtcbiAgICBNRVRIT0RfTk9UX0FMTE9XRUQ6IHVuZGVmaW5lZDtcbiAgICBORVRXT1JLX0VSUk9SOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFJlamVjdCA9IHtcbiAgICA8Q29kZSBleHRlbmRzIGtleW9mICRyZWplY3RDb2RlPihjb2RlOiBDb2RlLCAuLi5kYXRhOiAkcmVqZWN0Q29kZVtDb2RlXSBleHRlbmRzIHVuZGVmaW5lZCA/IFtdIHwgW3VuZGVmaW5lZF0gOiBbJHJlamVjdENvZGVbQ29kZV1dKTogTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSwgJHJlamVjdENvZGVbQ29kZV0+O1xuICAgIDxUPihvYmo6IFQpOiBNaWxraW9SZWplY3RFcnJvcjxFeHRyYWN0PGtleW9mIFQsIGtleW9mICRyZWplY3RDb2RlPiwgYW55Pjtcbn07XG5cbmV4cG9ydCBjb25zdCByZWplY3QgPSBmdW5jdGlvbiByZWplY3QoY29kZU9yT2JqOiBhbnksIGRhdGE/OiBhbnkpOiBNaWxraW9SZWplY3RFcnJvcjxhbnksIGFueT4ge1xuICAgIGxldCBjb2RlOiBhbnk7XG4gICAgbGV0IHJlamVjdERhdGE6IGFueTtcbiAgICBpZiAodHlwZW9mIGNvZGVPck9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb2RlID0gY29kZU9yT2JqO1xuICAgICAgICByZWplY3REYXRhID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY29kZU9yT2JqKTtcbiAgICAgICAgY29kZSA9IGtleXNbMF07XG4gICAgICAgIHJlamVjdERhdGEgPSBjb2RlT3JPYmpbY29kZV07XG4gICAgfVxuICAgIGNvbnN0IGVycm9yID0geyAkbWlsa2lvUmVqZWN0OiB0cnVlLCBjb2RlLCBkYXRhOiByZWplY3REYXRhIH0gYXMgTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+O1xuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09IFwiZnVuY3Rpb25cIikgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IpO1xuICAgIHJldHVybiBlcnJvcjtcbn0gYXMgUmVqZWN0O1xuXG5leHBvcnQgdHlwZSBNaWxraW9SZWplY3RFcnJvcjxDb2RlIGV4dGVuZHMga2V5b2YgJHJlamVjdENvZGUgPSBrZXlvZiAkcmVqZWN0Q29kZSwgUmVqZWN0RGF0YSBleHRlbmRzICRyZWplY3RDb2RlW0NvZGVdID0gJHJlamVjdENvZGVbQ29kZV0+ID0geyBjb2RlOiBDb2RlOyBkYXRhOiBSZWplY3REYXRhOyBzdGFjazogc3RyaW5nOyAkbWlsa2lvUmVqZWN0OiB0cnVlIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlciwgZXJyb3I6IE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PiB8IGFueSk6IE1pbGtpb1Jlc3BvbnNlUmVqZWN0IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcInZpdGVTZXJ2ZXJcIiBpbiBnbG9iYWxUaGlzKSB7XG4gICAgICAgIHRyeSB7IChnbG9iYWxUaGlzIGFzIGFueSkudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGVycm9yKTsgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZXJyb3I/LmNvZGUgPz8gZXJyb3I/Lm5hbWUgPz8gZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5uYW1lZCBFeGNlcHRpb25cIjtcblxuICAgIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSAmJiBlcnJvcj8uY29kZSA9PT0gXCJOT1RfRk9VTkRcIikge1xuICAgICAgICBsb2dnZXIuaW5mbyhuYW1lLCBlcnJvcj8uZGF0YT8ucGF0aCA/PyBcIlVua25vd24gcGF0aFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBlcnJvcj8uJG1pbGtpb1JlamVjdCA/IChlcnJvcj8uc3RhY2sgPz8gXCJcIikuc3BsaXQoXCJcXG5cIikuc2xpY2UoMikuam9pbihcIlxcblwiKSA6IChlcnJvcj8uc3RhY2sgPz8gXCJcIik7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IobmFtZSwgYFxcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3I/LmRhdGEpfWAsIGBcXG4ke3N0YWNrfVxcbmApO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IobmFtZSwgYFxcbiR7ZXJyb3I/LnRvU3RyaW5nKCl9YCwgYFxcbiR7ZXJyb3I/LnN0YWNrfVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogTWlsa2lvUmVzcG9uc2VSZWplY3Q7XG5cbiAgICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUpIHJlc3VsdCA9IHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IGVycm9yLmNvZGUsIHJlamVjdDogZXJyb3IuZGF0YSwgZXhlY3V0ZUlkIH07XG4gICAgZWxzZSByZXN1bHQgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiLCByZWplY3Q6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFPLFNBQVMsSUFBNkIsQ0FBQyxTQUEyQjtBQUFBLEVBQ3ZFLE9BQU8sUUFBUTtBQUFBOztBQ1VWLFNBQVMsVUFBMEMsQ0FBQyxPQUErQjtBQUFBLEVBQ3hGLE9BQU87QUFBQSxJQUNMLE1BQU0sT0FBTyxFQUFFLGFBQWEsZUFBZSxNQUFNO0FBQUEsRUFDbkQ7QUFBQTs7QUNkSyxTQUFTLE1BQThCLENBQUMsU0FBMEI7QUFBQSxFQUN2RSxPQUFPO0FBQUE7QUFTRixTQUFTLFdBQVcsQ0FBQyxPQUFvQyxjQUFzQjtBQUFBLEVBQ3BGLElBQUksVUFBVTtBQUFBLElBQVcsT0FBTztBQUFBLEVBRWhDLE9BQU8sR0FBRztBQUFBO0FBR0wsU0FBUyxXQUFXLENBQUMsT0FBMkIsY0FBc0I7QUFBQSxFQUMzRSxJQUFJLFVBQVU7QUFBQSxJQUFXLE9BQU87QUFBQSxFQUVoQyxPQUFPLE9BQU8sU0FBUyxPQUFPLEVBQUU7QUFBQTtBQUczQixTQUFTLFlBQVksQ0FBQyxPQUFvQyxjQUF1QjtBQUFBLEVBQ3RGLElBQUksVUFBVTtBQUFBLElBQVEsT0FBTztBQUFBLEVBRTdCLElBQUksVUFBVTtBQUFBLElBQVMsT0FBTztBQUFBLEVBRTlCLElBQUksVUFBVTtBQUFBLElBQUksT0FBTztBQUFBLEVBRXpCLElBQWtCLFVBQWQ7QUFBQSxJQUFxQixPQUFPO0FBQUEsRUFFaEMsT0FBTyxRQUFRLEtBQUs7QUFBQTs7QUMvQmYsU0FBUyxhQUFhLENBQUMsU0FBa0I7QUFBQSxFQUM5QyxNQUFNLE9BQStCLENBQUM7QUFBQSxFQUN0QyxZQUFZLEtBQUssVUFB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QVEsT0FBTyxhQUFhLFFBQVE7QUFBQSxFQUV2RSxJQUFJLE9BQU8sa0JBQWtCLFFBQVEsT0FBTyxTQUFTLGFBQWE7QUFBQSxJQUM5RCxPQUFPLEtBQUssTUFBTSxPQUFPLE1BQU0sUUFBUSxjQUFjO0FBQUEsRUFDekQsRUFBTztBQUFBLElBQ0gsSUFBSTtBQUFBLE1BQ0EsTUFBTSxRQUFRLE9BQU8saUJBQWlCLE9BQU8sU0FBUyxJQUFJLE1BQU07QUFBQSxDQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSztBQUFBLENBQUksSUFBSyxPQUFPLFNBQVM7QUFBQSxNQUM3RyxPQUFPLE1BQU0sTUFBTTtBQUFBLEVBQUssS0FBSyxVQUFVLE9BQU8sSUFBSSxLQUFLO0FBQUEsRUFBSztBQUFBLENBQVM7QUFBQSxNQUN2RSxPQUFPLEdBQUc7QUFBQSxNQUNSLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBSyxPQUFPLFNBQVMsS0FBSztBQUFBLEVBQUssT0FBTztBQUFBLENBQVM7QUFBQTtBQUFBO0FBQUEsRUFJMUUsSUFBSTtBQUFBLEVBRUosSUFBSSxPQUFPLGtCQUFrQjtBQUFBLElBQU0sU0FBUyxFQUFFLFNBQVMsT0FBTyxNQUFNLE1BQU0sTUFBTSxRQUFRLE1BQU0sTUFBTSxVQUFVO0FBQUEsRUFDekc7QUFBQSxhQUFTLEVBQUUsU0FBUyxPQUFPLE1BQU0seUJBQXlCLFFBQVEsV0FBVyxVQUFVO0FBQUEsRUFFNUYsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiNDJCQTg2RTVENkM2QTQzMTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "milkio",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "exports": "./index.js",
6
6
  "types": "./index.d.ts",