@milkio/stargate 1.0.0-beta.2 → 1.0.0-beta.202

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 (3) hide show
  1. package/index.d.ts +9 -7
  2. package/index.js +38 -126
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -9,7 +9,6 @@ export type ExecuteOptions = {
9
9
  params?: Record<any, any>;
10
10
  headers?: Record<string, string>;
11
11
  timeout?: number;
12
- type?: "action" | "stream";
13
12
  baseUrl?: string | (() => string) | (() => Promise<string>);
14
13
  };
15
14
  export type ExecuteResultsOption = {
@@ -34,21 +33,24 @@ export declare function createStargate<Generated extends {
34
33
  routeSchema: any;
35
34
  rejectCode: any;
36
35
  }>(stargateOptions: MilkioStargateOptions): Promise<{
37
- $types: {
38
- generated: Generated;
39
- };
40
36
  options: MilkioStargateOptions;
41
- execute<Path extends keyof Generated["routeSchema"]>(path: Path, options?: Mixin<ExecuteOptions, {
37
+ execute<Path extends keyof Generated["routeSchema"]>(path: Path, options: Mixin<ExecuteOptions, {
42
38
  params?: Generated["routeSchema"][Path]["types"]["params"];
43
- }>): Promise<Generated["routeSchema"][Path]["types"]["\uD83D\uDC23"] extends boolean ? // action
39
+ }>): Promise<Generated["routeSchema"][Path]["types"]["\uD83E\uDD5B"] extends boolean ? // action
44
40
  [Partial<Generated["rejectCode"]>, null, ExecuteResultsOption] | [null, Generated["routeSchema"][Path]["types"]["result"], ExecuteResultsOption] : // stream
45
- [Partial<Generated["rejectCode"]>, null, ExecuteResultsOption] | [null, AsyncGenerator<[Partial<Generated["rejectCode"]>, null] | [null, GeneratorGeneric<Generated["routeSchema"][Path]["types"]["result"]>], ExecuteResultsOption>]>;
41
+ [Partial<Generated["rejectCode"]>, null, ExecuteResultsOption] | [null, AsyncGenerator<[Partial<Generated["rejectCode"]>, null] | [null, GeneratorGeneric<Generated["routeSchema"][Path]["types"]["result"]>], undefined>, ExecuteResultsOption]>;
46
42
  __cookbook: {
47
43
  subscribe: (baseUrl: string) => Promise<any>;
48
44
  };
49
45
  ping(options?: {
50
46
  timeout?: number;
51
47
  }): Promise<Ping>;
48
+ $types: {
49
+ generated: Generated;
50
+ error: Generated["rejectCode"];
51
+ params: { [Path in keyof Generated["routeSchema"]]: Generated["routeSchema"][Path]["types"]["params"]; };
52
+ results: { [Path in keyof Generated["routeSchema"]]: Generated["routeSchema"][Path]["types"]["\uD83E\uDD5B"] extends boolean ? Generated["routeSchema"][Path]["types"]["result"] : AsyncGenerator<[Partial<Generated["rejectCode"]>, null] | [null, GeneratorGeneric<Generated["routeSchema"][Path]["types"]["result"]>], undefined>; };
53
+ };
52
54
  on: <Key extends keyof {
53
55
  "milkio:executeBefore": {
54
56
  path: string;
package/index.js CHANGED
@@ -1,109 +1,3 @@
1
- // node_modules/@southern-aurora/tson/dist/tson.js
2
- var c = {
3
- rules: {
4
- stringify: [
5
- {
6
- match: (t) => typeof t == "bigint",
7
- handler: (t) => `t!bigint:${t.toString()}`
8
- },
9
- {
10
- match: (t) => t instanceof Date,
11
- handler: (t) => `t!Date:${t.toISOString()}`
12
- },
13
- {
14
- match: (t) => t instanceof URL,
15
- handler: (t) => `t!URL:${t.toString()}`
16
- },
17
- {
18
- match: (t) => t instanceof RegExp,
19
- handler: (t) => `t!RegExp:${t.toString()}`
20
- },
21
- {
22
- match: (t) => t instanceof Uint8Array,
23
- handler: (t) => `t!Uint8Array:${new TextDecoder().decode(t)}`
24
- },
25
- {
26
- match: (t) => t instanceof ArrayBuffer,
27
- handler: (t) => `t!ArrayBuffer:${new TextDecoder().decode(t)}`
28
- }
29
- ],
30
- parse: [
31
- {
32
- match: (t) => t.startsWith("t!bigint:"),
33
- handler: (t) => BigInt(t.slice(9))
34
- },
35
- {
36
- match: (t) => t.startsWith("t!Date:"),
37
- handler: (t) => new Date(t.slice(7))
38
- },
39
- {
40
- match: (t) => t.startsWith("t!URL:"),
41
- handler: (t) => new URL(t.slice(6))
42
- },
43
- {
44
- match: (t) => t.startsWith("t!RegExp:"),
45
- handler: (t) => new RegExp(t.slice(9))
46
- },
47
- {
48
- match: (t) => t.startsWith("t!Uint8Array:"),
49
- handler: (t) => new TextEncoder().encode(t.slice(13))
50
- },
51
- {
52
- match: (t) => t.startsWith("t!ArrayBuffer:"),
53
- handler: (t) => new TextEncoder().encode(t.slice(14)).buffer
54
- }
55
- ]
56
- },
57
- stringify(t) {
58
- return JSON.stringify(c.encode(t));
59
- },
60
- parse(t) {
61
- return c.decode(JSON.parse(t));
62
- },
63
- encode(t) {
64
- function n(e) {
65
- if (!e || typeof e != "object" && typeof e != "bigint")
66
- return e;
67
- if (e) {
68
- if (Array.isArray(e)) {
69
- const s = [];
70
- for (let i = 0;i < e.length; i++)
71
- s[i] = n(e[i]);
72
- return s;
73
- }
74
- } else
75
- return e;
76
- for (const s of c.rules.stringify)
77
- if (s.match(e))
78
- return s.handler(e);
79
- const r = {};
80
- for (var a in e)
81
- r[a] = n(e[a]);
82
- return r;
83
- }
84
- return n(t);
85
- },
86
- decode(t) {
87
- function n(e) {
88
- if (Array.isArray(e))
89
- return e.map(n);
90
- if (typeof e == "object" && e !== null) {
91
- const r = {};
92
- for (const a in e)
93
- e.hasOwnProperty(a) && (r[a] = n(e[a]));
94
- return r;
95
- } else if (typeof e == "string") {
96
- for (const r of c.rules.parse)
97
- if (r.match(e) === true)
98
- return r.handler(e);
99
- return e;
100
- }
101
- return e;
102
- }
103
- return n(t);
104
- }
105
- };
106
-
107
1
  // packages/milkio-stargate/index.ts
108
2
  async function createStargate(stargateOptions) {
109
3
  const $fetch = stargateOptions.fetch ?? fetch;
@@ -162,13 +56,8 @@ async function createStargate(stargateOptions) {
162
56
  const baseUrl = bootstrap();
163
57
  const stargate = {
164
58
  ...eventManager,
165
- $types: {
166
- generated: undefined
167
- },
168
59
  options: stargateOptions,
169
60
  async execute(path, options) {
170
- if (!options)
171
- options = {};
172
61
  if (options.headers === undefined)
173
62
  options.headers = {};
174
63
  let url;
@@ -182,7 +71,7 @@ async function createStargate(stargateOptions) {
182
71
  } else {
183
72
  url = await baseUrl + path;
184
73
  }
185
- if (options.type !== "stream") {
74
+ if (!path.endsWith("~")) {
186
75
  if (options.headers.Accept === undefined)
187
76
  options.headers.Accept = "application/json";
188
77
  if (options.headers["Content-Type"] === undefined)
@@ -190,7 +79,7 @@ async function createStargate(stargateOptions) {
190
79
  let result;
191
80
  try {
192
81
  await eventManager.emit("milkio:executeBefore", { path, options });
193
- const body = c.stringify(options.params) ?? "";
82
+ const body = JSON.stringify(options.params) ?? "";
194
83
  await eventManager.emit("milkio:fetchBefore", { path, options, body });
195
84
  const response = await new Promise(async (resolve, reject) => {
196
85
  const timeout = options?.timeout ?? options?.timeout ?? 6000;
@@ -205,7 +94,7 @@ async function createStargate(stargateOptions) {
205
94
  reject(error);
206
95
  }
207
96
  });
208
- result = { value: c.parse(response) };
97
+ result = { value: reviveJSONParse(JSON.parse(response)) };
209
98
  } catch (error) {
210
99
  if (error?.[0]?.REQUEST_TIMEOUT) {
211
100
  await eventManager.emit("milkio:executeError", { handleError, path, options, error });
@@ -219,7 +108,7 @@ async function createStargate(stargateOptions) {
219
108
  const error = {};
220
109
  error[result.value.code] = result.value.reject ?? null;
221
110
  await eventManager.emit("milkio:executeError", { handleError, path, options, error });
222
- return [error, null, { executeId: "unknown" }];
111
+ return [error, null, { executeId: result.value.executeId }];
223
112
  }
224
113
  return [null, result.value.data, { executeId: result.value.executeId }];
225
114
  } else {
@@ -239,7 +128,7 @@ async function createStargate(stargateOptions) {
239
128
  const onmessage = (event) => {
240
129
  if (event.data.startsWith("@")) {
241
130
  try {
242
- streamResult = c.parse(event.data.slice(1));
131
+ streamResult = reviveJSONParse(JSON.parse(event.data.slice(1)));
243
132
  streamResultFetched.resolve(undefined);
244
133
  clearTimeout(timer);
245
134
  } catch (error) {
@@ -251,10 +140,10 @@ async function createStargate(stargateOptions) {
251
140
  if (stacks.has(index)) {
252
141
  const stack = stacks.get(index);
253
142
  stack.done = true;
254
- stack.resolve({ done: false, value: c.parse(event.data) });
143
+ stack.resolve({ done: false, value: reviveJSONParse(JSON.parse(event.data)) });
255
144
  } else {
256
145
  const stack = withResolvers();
257
- stack.resolve({ done: false, value: c.parse(event.data) });
146
+ stack.resolve({ done: false, value: reviveJSONParse(JSON.parse(event.data)) });
258
147
  stacks.set(index, { ...stack, done: false });
259
148
  }
260
149
  }
@@ -267,7 +156,7 @@ async function createStargate(stargateOptions) {
267
156
  });
268
157
  try {
269
158
  await eventManager.emit("milkio:executeBefore", { path, options });
270
- const body = c.stringify(options.params) ?? "";
159
+ const body = JSON.stringify(options.params) ?? "";
271
160
  await eventManager.emit("milkio:fetchBefore", { path, options, body });
272
161
  const response = await $fetch(url, {
273
162
  method: "POST",
@@ -359,7 +248,7 @@ async function createStargate(stargateOptions) {
359
248
  Accept: "text/event-stream"
360
249
  };
361
250
  const params = {};
362
- const body = c.stringify(params) ?? "";
251
+ const body = JSON.stringify(params) ?? "";
363
252
  const stacks = new Map;
364
253
  let stacksIndex = 0;
365
254
  let iteratorIndex = 0;
@@ -367,10 +256,10 @@ async function createStargate(stargateOptions) {
367
256
  const index = ++stacksIndex;
368
257
  if (stacks.has(index)) {
369
258
  const stack = stacks.get(index);
370
- stack.resolve({ done: false, value: c.parse(event.data) });
259
+ stack.resolve({ done: false, value: reviveJSONParse(JSON.parse(event.data)) });
371
260
  } else {
372
261
  const stack = withResolvers();
373
- stack.resolve({ done: false, value: c.parse(event.data) });
262
+ stack.resolve({ done: false, value: reviveJSONParse(JSON.parse(event.data)) });
374
263
  stacks.set(index, { ...stack, done: false });
375
264
  }
376
265
  };
@@ -454,7 +343,7 @@ async function createStargate(stargateOptions) {
454
343
  resolve([{ connect: false, delay: endsTime - startsTime, error: { REQUEST_TIMEOUT: { timeout, message: `Execute timeout after ${timeout}ms.` } } }, null]);
455
344
  }, timeout);
456
345
  try {
457
- const response = await await $fetch(url, { method: "HEAD" });
346
+ const response = await $fetch(url, { method: "HEAD" });
458
347
  const endsTime = Date.now();
459
348
  clearTimeout(timer);
460
349
  if (response.status !== 204) {
@@ -466,10 +355,33 @@ async function createStargate(stargateOptions) {
466
355
  return [{ connect: false, delay: endsTime - startsTime, error }, null];
467
356
  }
468
357
  });
469
- }
358
+ },
359
+ $types: undefined
470
360
  };
471
361
  return stargate;
472
362
  }
363
+ function reviveJSONParse(json) {
364
+ const isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
365
+ if (json instanceof Date)
366
+ return json;
367
+ if (Array.isArray(json)) {
368
+ return json.map((item) => reviveJSONParse(item));
369
+ }
370
+ if (typeof json === "object" && json !== null) {
371
+ return Object.entries(json).reduce((acc, [key, value]) => {
372
+ acc[key] = reviveJSONParse(value);
373
+ return acc;
374
+ }, {});
375
+ }
376
+ if (typeof json === "string") {
377
+ const match = json.match(isoDatePattern);
378
+ if (match) {
379
+ const normalizedDateString = match[2] ? `${match[1]}${match[2].replace(":", "")}` : `${match[1]}Z`;
380
+ return new Date(normalizedDateString);
381
+ }
382
+ }
383
+ return json;
384
+ }
473
385
  async function getBytes(stream, onChunk) {
474
386
  const reader = stream.getReader();
475
387
  let result;
@@ -577,5 +489,5 @@ export {
577
489
  createStargate
578
490
  };
579
491
 
580
- //# debugId=6C1CC37C8EC31A7364756E2164756E21
581
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAc291dGhlcm4tYXVyb3JhXFx0c29uXFxkaXN0XFx0c29uLmpzIiwgIi4uXFxpbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJjb25zdCBjID0ge1xuICBydWxlczoge1xuICAgIHN0cmluZ2lmeTogW1xuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHR5cGVvZiB0ID09IFwiYmlnaW50XCIsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFiaWdpbnQ6JHt0LnRvU3RyaW5nKCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgRGF0ZSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IURhdGU6JHt0LnRvSVNPU3RyaW5nKCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgVVJMLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhVVJMOiR7dC50b1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIFJlZ0V4cCxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVJlZ0V4cDoke3QudG9TdHJpbmcoKX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhVWludDhBcnJheToke25ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcixcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IUFycmF5QnVmZmVyOiR7bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHQpfWBcbiAgICAgIH1cbiAgICBdLFxuICAgIHBhcnNlOiBbXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFiaWdpbnQ6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gQmlnSW50KHQuc2xpY2UoOSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhRGF0ZTpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgRGF0ZSh0LnNsaWNlKDcpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IVVSTDpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgVVJMKHQuc2xpY2UoNikpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhUmVnRXhwOlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IG5ldyBSZWdFeHAodC5zbGljZSg5KSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFVaW50OEFycmF5OlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0LnNsaWNlKDEzKSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFBcnJheUJ1ZmZlcjpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodC5zbGljZSgxNCkpLmJ1ZmZlclxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgc3RyaW5naWZ5KHQpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYy5lbmNvZGUodCkpO1xuICB9LFxuICBwYXJzZSh0KSB7XG4gICAgcmV0dXJuIGMuZGVjb2RlKEpTT04ucGFyc2UodCkpO1xuICB9LFxuICBlbmNvZGUodCkge1xuICAgIGZ1bmN0aW9uIG4oZSkge1xuICAgICAgaWYgKCFlIHx8IHR5cGVvZiBlICE9IFwib2JqZWN0XCIgJiYgdHlwZW9mIGUgIT0gXCJiaWdpbnRcIilcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgICAgIGNvbnN0IHMgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzW2ldID0gbihlW2ldKTtcbiAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgZm9yIChjb25zdCBzIG9mIGMucnVsZXMuc3RyaW5naWZ5KVxuICAgICAgICBpZiAocy5tYXRjaChlKSlcbiAgICAgICAgICByZXR1cm4gcy5oYW5kbGVyKGUpO1xuICAgICAgY29uc3QgciA9IHt9O1xuICAgICAgZm9yICh2YXIgYSBpbiBlKVxuICAgICAgICByW2FdID0gbihlW2FdKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICByZXR1cm4gbih0KTtcbiAgfSxcbiAgZGVjb2RlKHQpIHtcbiAgICBmdW5jdGlvbiBuKGUpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKVxuICAgICAgICByZXR1cm4gZS5tYXAobik7XG4gICAgICBpZiAodHlwZW9mIGUgPT0gXCJvYmplY3RcIiAmJiBlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHIgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBhIGluIGUpXG4gICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eShhKSAmJiAoclthXSA9IG4oZVthXSkpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBmb3IgKGNvbnN0IHIgb2YgYy5ydWxlcy5wYXJzZSlcbiAgICAgICAgICBpZiAoci5tYXRjaChlKSA9PT0gITApXG4gICAgICAgICAgICByZXR1cm4gci5oYW5kbGVyKGUpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICByZXR1cm4gbih0KTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIGMgYXMgVFNPTlxufTtcbiIsCiAgICAiaW1wb3J0IHsgVFNPTiB9IGZyb20gXCJAc291dGhlcm4tYXVyb3JhL3Rzb25cIjtcblxuZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICBiYXNlVXJsOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgYWJvcnQ/OiB0eXBlb2YgQWJvcnRDb250cm9sbGVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWl4aW48VCwgVT4gPSBVICYgT21pdDxULCBrZXlvZiBVPjtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZU9wdGlvbnMgPSB7XG4gIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICB0eXBlPzogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCI7XG4gIGJhc2VVcmw/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pO1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICB8IFtcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdDogZmFsc2U7XG4gICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgIGVycm9yOiBhbnk7XG4gICAgICB9LFxuICAgICAgbnVsbCxcbiAgICBdXG4gIHwgW1xuICAgICAgbnVsbCxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgZGVsYXk6IG51bWJlcjtcbiAgICAgICAgc2VydmVyVGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9LFxuICAgIF07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3RhcmdhdGU8R2VuZXJhdGVkIGV4dGVuZHMgeyByb3V0ZVNjaGVtYTogYW55OyByZWplY3RDb2RlOiBhbnkgfT4oc3RhcmdhdGVPcHRpb25zOiBNaWxraW9TdGFyZ2F0ZU9wdGlvbnMpIHtcbiAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xuICBjb25zdCAkYWJvcnQgPSBzdGFyZ2F0ZU9wdGlvbnMuYWJvcnQgPz8gQWJvcnRDb250cm9sbGVyO1xuXG4gIHR5cGUgU3RhcmdhdGVFdmVudHMgPSB7XG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnMsIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+IH07XG4gICAgXCJtaWxraW86ZmV0Y2hCZWZvcmVcIjogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zLCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PjsgYm9keTogc3RyaW5nIH07XG4gICAgXCJtaWxraW86ZXhlY3V0ZUVycm9yXCI6IHtcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zLCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PjtcbiAgICAgIGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl0+O1xuICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPj4oZXJyb3I6IGFueSwga2V5OiBLLCBoYW5kbGVyOiAoZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXVtLXT4pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRXJyb3I6IGFueSA9IGFzeW5jIChlcnJvcjogYW55LCBrZXk6IHN0cmluZywgaGFuZGxlcjogKGVycm9yOiBhbnkpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSA9PiB7XG4gICAgaWYgKGtleSBpbiBlcnJvcikge1xuICAgICAgY29uc3QgaGFuZGxlZCA9IGF3YWl0IGhhbmRsZXIoZXJyb3Jba2V5XSk7XG4gICAgICBpZiAoaGFuZGxlZCkgZGVsZXRlIGVycm9yW2tleV07XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IF9faW5pdEV2ZW50TWFuYWdlciA9ICgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXA8KGV2ZW50OiBhbnkpID0+IHZvaWQsIHN0cmluZz4oKTtcbiAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XG5cbiAgICBjb25zdCBldmVudE1hbmFnZXIgPSB7XG4gICAgICBvbjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgIGlmIChpbmRleGVkLmhhcyhrZXkgYXMgc3RyaW5nKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpITtcbiAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgb2ZmOiA8S2V5IGV4dGVuZHMga2V5b2YgU3RhcmdhdGVFdmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6IFN0YXJnYXRlRXZlbnRzW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgZW1pdDogYXN5bmMgPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBWYWx1ZSBleHRlbmRzIFN0YXJnYXRlRXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoaCkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBldmVudE1hbmFnZXI7XG4gIH07XG5cbiAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgY29uc3QgYm9vdHN0cmFwID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XG4gICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSBcImZ1bmN0aW9uXCIpIGJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsKCk7XG4gICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoXCIvXCIpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG5cbiAgICByZXR1cm4gYmFzZVVybDtcbiAgfTtcblxuICBjb25zdCBiYXNlVXJsOiBQcm9taXNlPHN0cmluZz4gPSBib290c3RyYXAoKTtcblxuICBjb25zdCBzdGFyZ2F0ZSA9IHtcbiAgICAuLi5ldmVudE1hbmFnZXIsXG4gICAgJHR5cGVzOiB7XG4gICAgICBnZW5lcmF0ZWQ6IHZvaWQgMCBhcyB1bmtub3duIGFzIEdlbmVyYXRlZCxcbiAgICB9LFxuICAgIG9wdGlvbnM6IHN0YXJnYXRlT3B0aW9ucyxcbiAgICBhc3luYyBleGVjdXRlPFBhdGggZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXT4oXG4gICAgICBwYXRoOiBQYXRoLFxuICAgICAgb3B0aW9ucz86IE1peGluPFxuICAgICAgICBFeGVjdXRlT3B0aW9ucyxcbiAgICAgICAge1xuICAgICAgICAgIHBhcmFtcz86IEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJwYXJhbXNcIl07XG4gICAgICAgIH1cbiAgICAgID4sXG4gICAgKTogUHJvbWlzZTxcbiAgICAgIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCLwn5CjXCJdIGV4dGVuZHMgYm9vbGVhblxuICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgIFtQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl0+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInJlc3VsdFwiXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdPl0sIEV4ZWN1dGVSZXN1bHRzT3B0aW9uPl1cbiAgICA+IHtcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vUGFyYW1ldGVyQXNzaWduOiA8ZXhwbGFuYXRpb24+XG4gICAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzID0ge307XG5cbiAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgIGlmIChvcHRpb25zLmJhc2VVcmwpIHtcbiAgICAgICAgbGV0IGJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gXCJmdW5jdGlvblwiKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aChcIi9cIikpIGJhc2VVcmwgPSBiYXNlVXJsLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgdXJsID0gYmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwgPSAoYXdhaXQgYmFzZVVybCkgKyAocGF0aCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50eXBlICE9PSBcInN0cmVhbVwiKSB7XG4gICAgICAgIC8vIGFjdGlvblxuICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGxldCByZXN1bHQ6IHsgdmFsdWU6IFJlY29yZDxhbnksIGFueT4gfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIiwgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gVFNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpID8/IFwiXCI7XG4gICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZmV0Y2hCZWZvcmVcIiwgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXN5bmNQcm9taXNlRXhlY3V0b3I6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KFt7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSwgbnVsbF0pO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgKGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiBcIlBPU1RcIiwgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pKS50ZXh0KCk7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXN1bHQgPSB7IHZhbHVlOiBUU09OLnBhcnNlKHJlc3BvbnNlKSB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUVycm9yXCIsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpleGVjdXRlRXJyb3JcIiwgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyb3JQaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiBcInVua25vd25cIiB9XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnZhbHVlLnN1Y2Nlc3MgIT09IHRydWUpIHtcbiAgICAgICAgICBjb25zdCBlcnJvcjogYW55ID0ge307XG4gICAgICAgICAgZXJyb3JbcmVzdWx0LnZhbHVlLmNvZGVdID0gcmVzdWx0LnZhbHVlLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmV4ZWN1dGVFcnJvclwiLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgIHJldHVybiBbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiBcInVua25vd25cIiB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0LnZhbHVlLmRhdGEsIHsgZXhlY3V0ZUlkOiByZXN1bHQudmFsdWUuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN0cmVhbVxuICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID0gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiO1xuICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuICAgICAgICBsZXQgc3RyZWFtUmVzdWx0OiBhbnk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcblxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0sIG51bGwsIHsgZXhlY3V0ZUlkOiBcInVua25vd25cIiB9XSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IFRTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSk7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9GQUlMOiBlcnJvciB9LCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgc3RhY2shLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogVFNPTi5wYXJzZShldmVudC5kYXRhKSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBUU09OLnBhcnNlKGV2ZW50LmRhdGEpIH0pO1xuICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIiwgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBUU09OLnN0cmluZ2lmeShvcHRpb25zIS5wYXJhbXMpID8/IFwiXCI7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpmZXRjaEJlZm9yZVwiLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMhLmhlYWRlcnMsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb250ZW50LXR5cGUgdG8gYmUgJHtcInRleHQvZXZlbnQtc3RyZWFtXCJ9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0geyBSRVFVRVNUX0ZBSUw6IGVyciB9O1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUVycm9yXCIsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZvaWQgY3JlYXRlKCk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgLi4uKHtcbiAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXggLSAyKSkgc3RhY2tzLmRlbGV0ZShpbmRleCAtIDIpO1xuICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogc3RyZWFtUmVzdWx0Py5leGVjdXRlSWQgPz8gXCJcIixcbiAgICAgICAgICAgICAgICBmYWlsOiB7XG4gICAgICAgICAgICAgICAgICBjb2RlOiBcIk5FVFdPUktfRVJST1JcIixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiTmV0d29yayBFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgZnJvbUNsaWVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGVycixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfaW5kZXgsIHN0YWNrXSBvZiBzdGFja3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhY2suZG9uZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgc3RhY2suZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzdHJlYW1SZXN1bHRGZXRjaGVkLnByb21pc2U7XG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBpdGVyYXRvciwgeyBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdC5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIF9fY29va2Jvb2s6IHtcbiAgICAgIHN1YnNjcmliZTogYXN5bmMgKGJhc2VVcmw6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIEFjY2VwdDogXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgICAgICBjb25zdCBib2R5ID0gVFNPTi5zdHJpbmdpZnkocGFyYW1zKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcbiAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICB9XG4gICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcblxuICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogVFNPTi5wYXJzZShldmVudC5kYXRhKSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBUU09OLnBhcnNlKGV2ZW50LmRhdGEpIH0pO1xuICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaChgJHtiYXNlVXJsfS8kc3Vic2NyaWJlYCwge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aChcInRleHQvZXZlbnQtc3RyZWFtXCIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7XCJ0ZXh0L2V2ZW50LXN0cmVhbVwifSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xuXG4gICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZvaWQgY3JlYXRlKCk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgLi4uKHtcbiAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXggLSAyKSkgc3RhY2tzLmRlbGV0ZShpbmRleCAtIDIpO1xuICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yIGFzIGFueTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIGFzeW5jIHBpbmcob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KTogUHJvbWlzZTxQaW5nPiB7XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXN5bmNQcm9taXNlRXhlY3V0b3I6IDxleHBsYW5hdGlvbj5cbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxQaW5nPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHthd2FpdCBiYXNlVXJsfS9nZW5lcmF0ZV8yMDRgO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgY29uc3Qgc3RhcnRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSB9LCBudWxsXSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhd2FpdCAkZmV0Y2godXJsLCB7IG1ldGhvZDogXCJIRUFEXCIgfSk7XG4gICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX0ZBSUw6IHsgcmVzcG9uc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBtZXNzYWdlOiBcIlN0YXR1cyBjb2RlIG5vdCAyMDRcIiB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoW251bGwsIHsgY29ubmVjdDogdHJ1ZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgc2VydmVyVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikhLnN1YnN0cmluZygxNykpIH1dKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICByZXR1cm4gW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yIH0sIG51bGxdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBzdGFyZ2F0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlU3RyZWFtT3B0aW9ucyB7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNjaGVtYUV4dGVuZCB7XG4gIGFwaVZhbGlkYXRvcjoge1xuICAgIGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gICAgdmFsaWRhdGU6IFJlY29yZDxhbnksIGFueT47XG4gIH07XG4gIGFwaU1ldGhvZHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gIGFwaU1ldGhvZHNUeXBlU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xuICBhcGlUZXN0c1NjaGVtYTogUmVjb3JkPGFueSwgYW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgRmFpbENvZGVFeHRlbmQgPSBSZWNvcmQ8YW55LCAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55PjtcblxuZXhwb3J0IHR5cGUgQm9vdHN0cmFwTWlkZGxld2FyZSA9IChkYXRhOiB7IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcGFyYW1zOiBhbnk7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyByZXN1bHQ6IHsgdmFsdWU6IGFueSB9OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmVPcHRpb25zIHtcbiAgYm9vdHN0cmFwPzogQm9vdHN0cmFwTWlkZGxld2FyZTtcbiAgYmVmb3JlRXhlY3V0ZT86IEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlO1xuICBhZnRlckV4ZWN1dGU/OiBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFN0b3JhZ2Uge1xuICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVSZXN1bHRTdWNjZXNzPFJlc3VsdD4ge1xuICBleGVjdXRlSWQ6IHN0cmluZztcbiAgc3VjY2VzczogdHJ1ZTtcbiAgZGF0YTogUmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JHZW5lcmljPFQ+ID0gVCBleHRlbmRzIEFzeW5jR2VuZXJhdG9yPGluZmVyIEk+ID8gSSA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuS2V5czxULCBQcmVmaXggZXh0ZW5kcyBzdHJpbmcgPSBcIlwiPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFJlYWRhYmxlU3RyZWFtIGludG8gYSBjYWxsYmFjayBwYXR0ZXJuLlxuICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgUmVhZGFibGVTdHJlYW0uXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICghKHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCkpLmRvbmUpIHtcbiAgICBvbkNodW5rKHJlc3VsdC52YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgYXJiaXRhcnkgYnl0ZSBjaHVua3MgaW50byBFdmVudFNvdXJjZSBsaW5lIGJ1ZmZlcnMuXG4gKiBFYWNoIGxpbmUgc2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgXCJmaWVsZDogdmFsdWVcIiBhbmQgZW5kcyB3aXRoIFxcciwgXFxuLCBvciBcXHJcXG4uXG4gKiBAcGFyYW0gb25MaW5lIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBFdmVudFNvdXJjZSBsaW5lLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVzKG9uTGluZTogKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgbGV0IGJ1ZmZlcjogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgbGV0IHBvc2l0aW9uOiBudW1iZXI7IC8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvblxuICBsZXQgZmllbGRMZW5ndGg6IG51bWJlcjsgLy8gbGVuZ3RoIG9mIHRoZSBgZmllbGRgIHBvcnRpb24gb2YgdGhlIGxpbmVcbiAgbGV0IGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuazpcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uQ2h1bmsoYXJyOiBVaW50OEFycmF5KSB7XG4gICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBidWZmZXIgPSBhcnI7XG4gICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICBmaWVsZExlbmd0aCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3ZSdyZSBzdGlsbCBwYXJzaW5nIHRoZSBvbGQgbGluZS4gQXBwZW5kIHRoZSBuZXcgYnl0ZXMgaW50byBidWZmZXI6XG4gICAgICBidWZmZXIgPSBjb25jYXQoYnVmZmVyLCBhcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1Zkxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgbGV0IGxpbmVTdGFydCA9IDA7IC8vIGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGxpbmUgc3RhcnRzXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVmTGVuZ3RoKSB7XG4gICAgICBpZiAoZGlzY2FyZFRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgICBpZiAoYnVmZmVyW3Bvc2l0aW9uXSA9PT0gMTApIHtcbiAgICAgICAgICBsaW5lU3RhcnQgPSArK3Bvc2l0aW9uOyAvLyBza2lwIHRvIG5leHQgY2hhclxuICAgICAgICB9XG5cbiAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGFydCBsb29raW5nIGZvcndhcmQgdGlsbCB0aGUgZW5kIG9mIGxpbmU6XG4gICAgICBsZXQgbGluZUVuZCA9IC0xOyAvLyBpbmRleCBvZiB0aGUgXFxyIG9yIFxcbiBjaGFyXG4gICAgICBmb3IgKDsgcG9zaXRpb24gPCBidWZMZW5ndGggJiYgbGluZUVuZCA9PT0gLTE7ICsrcG9zaXRpb24pIHtcbiAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zaXRpb25dKSB7XG4gICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgIGlmIChmaWVsZExlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgLy8gZmlyc3QgY29sb24gaW4gbGluZVxuICAgICAgICAgICAgICBmaWVsZExlbmd0aCA9IHBvc2l0aW9uIC0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGluZUVuZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYnV0IHRoZSBsaW5lIGhhc24ndCBlbmRlZC5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgYXJyIGFuZCB0aGVuIGNvbnRpbnVlIHBhcnNpbmc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSd2ZSByZWFjaGVkIHRoZSBsaW5lIGVuZCwgc2VuZCBpdCBvdXQ6XG4gICAgICBvbkxpbmUoYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCwgbGluZUVuZCksIGZpZWxkTGVuZ3RoKTtcbiAgICAgIGxpbmVTdGFydCA9IHBvc2l0aW9uOyAvLyB3ZSdyZSBub3cgb24gdGhlIG5leHQgbGluZVxuICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAobGluZVN0YXJ0ID09PSBidWZMZW5ndGgpIHtcbiAgICAgIGJ1ZmZlciA9IHVuZGVmaW5lZDsgLy8gd2UndmUgZmluaXNoZWQgcmVhZGluZyBpdFxuICAgIH0gZWxzZSBpZiAobGluZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgdmlldyBpbnRvIGJ1ZmZlciBiZWdpbm5pbmcgYXQgbGluZVN0YXJ0IHNvIHdlIGRvbid0XG4gICAgICAvLyBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgcHJldmlvdXMgbGluZXMgd2hlbiB3ZSBnZXQgdGhlIG5ldyBhcnI6XG4gICAgICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0KTtcbiAgICAgIHBvc2l0aW9uIC09IGxpbmVTdGFydDtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIGxpbmUgYnVmZmVycyBpbnRvIEV2ZW50U291cmNlTWVzc2FnZXMuXG4gKiBAcGFyYW0gb25JZCBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgaWRgIGZpZWxkLlxuICogQHBhcmFtIG9uUmV0cnkgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYHJldHJ5YCBmaWVsZC5cbiAqIEBwYXJhbSBvbk1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbWVzc2FnZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZXMob25NZXNzYWdlPzogKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB2b2lkKSB7XG4gIGxldCBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyOlxuICByZXR1cm4gZnVuY3Rpb24gb25MaW5lKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpIHtcbiAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGVtcHR5IGxpbmUgZGVub3RlcyBlbmQgb2YgbWVzc2FnZS4gVHJpZ2dlciB0aGUgY2FsbGJhY2sgYW5kIHN0YXJ0IGEgbmV3IG1lc3NhZ2U6XG4gICAgICBvbk1lc3NhZ2U/LihtZXNzYWdlKTtcbiAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgfSBlbHNlIGlmIChmaWVsZExlbmd0aCA+IDApIHtcbiAgICAgIC8vIGV4Y2x1ZGUgY29tbWVudHMgYW5kIGxpbmVzIHdpdGggbm8gdmFsdWVzXG4gICAgICAvLyBsaW5lIGlzIG9mIGZvcm1hdCBcIjxmaWVsZD46PHZhbHVlPlwiIG9yIFwiPGZpZWxkPjogPHZhbHVlPlwiXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNldmVudC1zdHJlYW0taW50ZXJwcmV0YXRpb25cbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSgwLCBmaWVsZExlbmd0aCkpO1xuICAgICAgY29uc3QgdmFsdWVPZmZzZXQgPSBmaWVsZExlbmd0aCArIChsaW5lW2ZpZWxkTGVuZ3RoICsgMV0gPT09IDMyID8gMiA6IDEpO1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KHZhbHVlT2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgICAgY2FzZSBcImRhdGFcIjpcbiAgICAgICAgICAvLyBpZiB0aGlzIG1lc3NhZ2UgYWxyZWFkeSBoYXMgZGF0YSwgYXBwZW5kIHRoZSBuZXcgdmFsdWUgdG8gdGhlIG9sZC5cbiAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3Qgc2V0IHRvIHRoZSBuZXcgdmFsdWU6XG4gICAgICAgICAgbWVzc2FnZS5kYXRhID0gbWVzc2FnZS5kYXRhID8gYCR7bWVzc2FnZS5kYXRhfVxcbiR7dmFsdWV9YCA6IHZhbHVlOyAvLyBvdGhlcndpc2UsXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb25jYXQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSkge1xuICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCArIGIubGVuZ3RoKTtcbiAgcmVzLnNldChhKTtcbiAgcmVzLnNldChiLCBhLmxlbmd0aCk7XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG5ld01lc3NhZ2UoKTogRXZlbnRTb3VyY2VNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBcIlwiLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUID0gYW55PigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltcInJlc29sdmVcIl07XG4gIGxldCByZWplY3Q6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W1wicmVqZWN0XCJdO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IHJlcztcbiAgICByZWplY3QgPSByZWo7XG4gIH0pO1xuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXNvbHZlISwgcmVqZWN0OiByZWplY3QhIH07XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsSUFBTSxJQUFJO0FBQUEsRUFDUixPQUFPO0FBQUEsSUFDTCxXQUFXO0FBQUEsTUFDVDtBQUFBLFFBQ0UsT0FBTyxDQUFDLE1BQU0sT0FBTyxLQUFLO0FBQUEsUUFD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
492
+ //# debugId=76442499E6C2C08A64756E2164756E21
493
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCB0eXBlIE1pbGtpb1N0YXJnYXRlT3B0aW9ucyA9IHtcclxuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XHJcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xyXG4gICAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XHJcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xyXG5cclxuZXhwb3J0IHR5cGUgRXhlY3V0ZU9wdGlvbnMgPSB7XHJcbiAgICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xyXG4gICAgYmFzZVVybD86IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBFeGVjdXRlUmVzdWx0c09wdGlvbiA9IHsgZXhlY3V0ZUlkOiBzdHJpbmcgfTtcclxuXHJcbmV4cG9ydCB0eXBlIFBpbmcgPVxyXG4gICAgfCBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcclxuICAgICAgICAgICAgZGVsYXk6IG51bWJlcjtcclxuICAgICAgICAgICAgZXJyb3I6IGFueTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG51bGwsXHJcbiAgICBdXHJcbiAgICB8IFtcclxuICAgICAgICBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcclxuICAgICAgICAgICAgZGVsYXk6IG51bWJlcjtcclxuICAgICAgICAgICAgc2VydmVyVGltZXN0YW1wOiBudW1iZXI7XHJcbiAgICAgICAgfSxcclxuICAgIF07XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTdGFyZ2F0ZTxHZW5lcmF0ZWQgZXh0ZW5kcyB7IHJvdXRlU2NoZW1hOiBhbnk7IHJlamVjdENvZGU6IGFueSB9PihzdGFyZ2F0ZU9wdGlvbnM6IE1pbGtpb1N0YXJnYXRlT3B0aW9ucykge1xyXG4gICAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xyXG4gICAgY29uc3QgJGFib3J0ID0gc3RhcmdhdGVPcHRpb25zLmFib3J0ID8/IEFib3J0Q29udHJvbGxlcjtcclxuXHJcbiAgICB0eXBlIFN0YXJnYXRlRXZlbnRzID0ge1xyXG4gICAgICAgIFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIjogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zLCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PiB9O1xyXG4gICAgICAgIFwibWlsa2lvOmZldGNoQmVmb3JlXCI6IHsgcGF0aDogc3RyaW5nOyBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9ucywgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xyXG4gICAgICAgIFwibWlsa2lvOmV4ZWN1dGVFcnJvclwiOiB7XHJcbiAgICAgICAgICAgIHBhdGg6IHN0cmluZztcclxuICAgICAgICAgICAgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnMsIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+O1xyXG4gICAgICAgICAgICBlcnJvcjogUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPjtcclxuICAgICAgICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPj4oZXJyb3I6IGFueSwga2V5OiBLLCBoYW5kbGVyOiAoZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXVtLXT4pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSA9PiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xyXG4gICAgICAgIGlmIChrZXkgaW4gZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGF3YWl0IGhhbmRsZXIoZXJyb3Jba2V5XSk7XHJcbiAgICAgICAgICAgIGlmIChoYW5kbGVkKSBkZWxldGUgZXJyb3Jba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IF9faW5pdEV2ZW50TWFuYWdlciA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXA8KGV2ZW50OiBhbnkpID0+IHZvaWQsIHN0cmluZz4oKTtcclxuICAgICAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IHtcclxuICAgICAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleGVkLmhhcyhrZXkgYXMgc3RyaW5nKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZykhO1xyXG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb2ZmOiA8S2V5IGV4dGVuZHMga2V5b2YgU3RhcmdhdGVFdmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6IFN0YXJnYXRlRXZlbnRzW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbWl0OiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgU3RhcmdhdGVFdmVudHMsIFZhbHVlIGV4dGVuZHMgU3RhcmdhdGVFdmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XHJcblxyXG4gICAgY29uc3QgYm9vdHN0cmFwID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSBcImZ1bmN0aW9uXCIpIGJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsKCk7XHJcbiAgICAgICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoXCIvXCIpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XHJcblxyXG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBiYXNlVXJsOiBQcm9taXNlPHN0cmluZz4gPSBib290c3RyYXAoKTtcclxuXHJcbiAgICBjb25zdCBzdGFyZ2F0ZSA9IHtcclxuICAgICAgICAuLi5ldmVudE1hbmFnZXIsXHJcbiAgICAgICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxyXG4gICAgICAgIGFzeW5jIGV4ZWN1dGU8UGF0aCBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdPihcclxuICAgICAgICAgICAgcGF0aDogUGF0aCxcclxuICAgICAgICAgICAgb3B0aW9uczogTWl4aW48XHJcbiAgICAgICAgICAgICAgICBFeGVjdXRlT3B0aW9ucyxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM/OiBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicGFyYW1zXCJdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA+LFxyXG4gICAgICAgICk6IFByb21pc2U8XHJcbiAgICAgICAgICAgIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCLwn6WbXCJdIGV4dGVuZHMgYm9vbGVhblxyXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxyXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbCwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dIHwgW251bGwsIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJyZXN1bHRcIl0sIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXVxyXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxyXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbCwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dIHwgW251bGwsIEFzeW5jR2VuZXJhdG9yPFtQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl0+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJyZXN1bHRcIl0+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXHJcbiAgICAgICAgPiB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzID0ge307XHJcblxyXG4gICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJhc2VVcmwpIHtcclxuICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSBcImZ1bmN0aW9uXCIpIGJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aChcIi9cIikpIGJhc2VVcmwgPSBiYXNlVXJsLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyAocGF0aCBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdXJsID0gKGF3YWl0IGJhc2VVcmwpICsgKHBhdGggYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKFwiflwiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYWN0aW9uXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogeyB2YWx1ZTogUmVjb3JkPGFueSwgYW55PiB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmZldGNoQmVmb3JlXCIsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChbeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0sIG51bGxdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCAoYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6IFwiUE9TVFwiLCBib2R5LCBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfSkpLnRleHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyZXNwb25zZSkpIH07XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpleGVjdXRlRXJyb3JcIiwgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvclBpbmVkID0geyBSRVFVRVNUX0ZBSUw6IGVycm9yIH07XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUVycm9yXCIsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlLnN1Y2Nlc3MgIT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JbcmVzdWx0LnZhbHVlLmNvZGVdID0gcmVzdWx0LnZhbHVlLnJlamVjdCA/PyBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmV4ZWN1dGVFcnJvclwiLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiByZXN1bHQudmFsdWUuZXhlY3V0ZUlkIH1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0LnZhbHVlLmRhdGEsIHsgZXhlY3V0ZUlkOiByZXN1bHQudmFsdWUuZXhlY3V0ZUlkIH1dIGFzIGFueTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbVxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9IFwidGV4dC9ldmVudC1zdHJlYW1cIjtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIGxldCBzdHJlYW1SZXN1bHQ6IGFueTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xyXG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGFydHNXaXRoKFwiQFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9GQUlMOiBlcnJvciB9LCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLmRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xyXG5cclxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zIS5wYXJhbXMpID8/IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmZldGNoQmVmb3JlXCIsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyEuaGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7XCJ0ZXh0L2V2ZW50LXN0cmVhbVwifSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0geyBSRVFVRVNUX0ZBSUw6IGVyciB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpleGVjdXRlRXJyb3JcIiwgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcIk5FVFdPUktfRVJST1JcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJOZXR3b3JrIEVycm9yXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21DbGllbnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGVycixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW19pbmRleCwgc3RhY2tdIG9mIHN0YWNrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5kb25lKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5kb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcclxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbVJlc3VsdEZldGNoZWQucHJvbWlzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGl0ZXJhdG9yLCB7IGV4ZWN1dGVJZDogc3RyZWFtUmVzdWx0LmV4ZWN1dGVJZCB9XSBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIF9fY29va2Jvb2s6IHtcclxuICAgICAgICAgICAgc3Vic2NyaWJlOiBhc3luYyAoYmFzZVVybDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIEFjY2VwdDogXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpID8/IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBib29sZWFuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgID4gPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2tzSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaChgJHtiYXNlVXJsfS8kc3Vic2NyaWJlYCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aChcInRleHQvZXZlbnQtc3RyZWFtXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAke1widGV4dC9ldmVudC1zdHJlYW1cIn0sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcclxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yIGFzIGFueTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFzeW5jIHBpbmcob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KTogUHJvbWlzZTxQaW5nPiB7XHJcbiAgICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxQaW5nPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7YXdhaXQgYmFzZVVybH0vZ2VuZXJhdGVfMjA0YDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRzVGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0gfSwgbnVsbF0pO1xyXG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiBcIkhFQURcIiB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9GQUlMOiB7IHJlc3BvbnNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogXCJTdGF0dXMgY29kZSBub3QgMjA0XCIgfSB9IH0sIG51bGxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW251bGwsIHsgY29ubmVjdDogdHJ1ZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgc2VydmVyVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikhLnN1YnN0cmluZygxNykpIH1dKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvciB9LCBudWxsXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAkdHlwZXM6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHtcclxuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWQsXHJcbiAgICAgICAgICAgIGVycm9yOiBHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdO1xyXG4gICAgICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdXTogR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInBhcmFtc1wiXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZXN1bHRzOiB7XHJcbiAgICAgICAgICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXV06IEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCLwn6WbXCJdIGV4dGVuZHMgYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgPyAvLyBhY3Rpb25cclxuICAgICAgICAgICAgICAgIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJyZXN1bHRcIl1cclxuICAgICAgICAgICAgICAgIDogLy8gc3RyZWFtXHJcbiAgICAgICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdPl0sIHVuZGVmaW5lZD5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc3RhcmdhdGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XHJcbiAgICBjb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xyXG5cclxuICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xyXG4gICAgICAgIHJldHVybiBqc29uLm1hcCgoaXRlbSkgPT4gcmV2aXZlSlNPTlBhcnNlKGl0ZW0pKSBhcyBhbnk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGpzb24gPT09IFwib2JqZWN0XCIgJiYganNvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc29uKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgICAgICAgIGFjY1trZXkgYXMga2V5b2YgVF0gPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0sIHt9IGFzIFQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBqc29uID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcclxuICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGVTdHJpbmcgPSBtYXRjaFsyXSA/IGAke21hdGNoWzFdfSR7bWF0Y2hbMl0ucmVwbGFjZShcIjpcIiwgXCJcIil9YCA6IGAke21hdGNoWzFdfVpgO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobm9ybWFsaXplZERhdGVTdHJpbmcpIGFzIGFueTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ganNvbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlU3RyZWFtT3B0aW9ucyB7XHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICAgIHRpbWVvdXQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2NoZW1hRXh0ZW5kIHtcclxuICAgIGFwaVZhbGlkYXRvcjoge1xyXG4gICAgICAgIGdlbmVyYXRlZEF0OiBudW1iZXI7XHJcbiAgICAgICAgdmFsaWRhdGU6IFJlY29yZDxhbnksIGFueT47XHJcbiAgICB9O1xyXG4gICAgYXBpTWV0aG9kc1NjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcclxuICAgIGFwaU1ldGhvZHNUeXBlU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xyXG4gICAgYXBpVGVzdHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEZhaWxDb2RlRXh0ZW5kID0gUmVjb3JkPGFueSwgKC4uLmFyZ3M6IEFycmF5PGFueT4pID0+IGFueT47XHJcblxyXG5leHBvcnQgdHlwZSBCb290c3RyYXBNaWRkbGV3YXJlID0gKGRhdGE6IHsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuZXhwb3J0IHR5cGUgQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHBhcmFtczogYW55OyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xyXG5leHBvcnQgdHlwZSBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyByZXN1bHQ6IHsgdmFsdWU6IGFueSB9OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNaWRkbGV3YXJlT3B0aW9ucyB7XHJcbiAgICBib290c3RyYXA/OiBCb290c3RyYXBNaWRkbGV3YXJlO1xyXG4gICAgYmVmb3JlRXhlY3V0ZT86IEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlO1xyXG4gICAgYWZ0ZXJFeGVjdXRlPzogQWZ0ZXJFeGVjdXRlTWlkZGxld2FyZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRTdG9yYWdlIHtcclxuICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcclxuICAgIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVzdWx0U3VjY2VzczxSZXN1bHQ+IHtcclxuICAgIGV4ZWN1dGVJZDogc3RyaW5nO1xyXG4gICAgc3VjY2VzczogdHJ1ZTtcclxuICAgIGRhdGE6IFJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yR2VuZXJpYzxUPiA9IFQgZXh0ZW5kcyBBc3luY0dlbmVyYXRvcjxpbmZlciBJPiA/IEkgOiBuZXZlcjtcclxuXHJcbmV4cG9ydCB0eXBlIEZsYXR0ZW5LZXlzPFQsIFByZWZpeCBleHRlbmRzIHN0cmluZyA9IFwiXCI+ID0ge1xyXG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xyXG59W2tleW9mIFRdO1xyXG5cclxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXHJcbi8vICoqKiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvZmV0Y2gtZXZlbnQtc291cmNlL2Jsb2IvbWFpbi9zcmMvcGFyc2UudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiAvL1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHNlbnQgaW4gYW4gZXZlbnQgc3RyZWFtXHJcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2ZXItc2VudF9ldmVudHMvVXNpbmdfc2VydmVyLXNlbnRfZXZlbnRzI0V2ZW50X3N0cmVhbV9mb3JtYXRcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTb3VyY2VNZXNzYWdlIHtcclxuICAgIGRhdGE6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgUmVhZGFibGVTdHJlYW0gaW50byBhIGNhbGxiYWNrIHBhdHRlcm4uXHJcbiAqIEBwYXJhbSBzdHJlYW0gVGhlIGlucHV0IFJlYWRhYmxlU3RyZWFtLlxyXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBzdHJlYW0gY2xvc2VzLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcclxuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcclxuICAgIGxldCByZXN1bHQ6IFJlYWRhYmxlU3RyZWFtUmVhZFJlc3VsdDxVaW50OEFycmF5PjtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIHdoaWxlICghKHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCkpLmRvbmUpIHtcclxuICAgICAgICBvbkNodW5rKHJlc3VsdC52YWx1ZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYXJiaXRhcnkgYnl0ZSBjaHVua3MgaW50byBFdmVudFNvdXJjZSBsaW5lIGJ1ZmZlcnMuXHJcbiAqIEVhY2ggbGluZSBzaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBcImZpZWxkOiB2YWx1ZVwiIGFuZCBlbmRzIHdpdGggXFxyLCBcXG4sIG9yIFxcclxcbi5cclxuICogQHBhcmFtIG9uTGluZSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgRXZlbnRTb3VyY2UgbGluZS5cclxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuay5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lcyhvbkxpbmU6IChsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSA9PiB2b2lkKSB7XHJcbiAgICBsZXQgYnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xyXG4gICAgbGV0IHBvc2l0aW9uOiBudW1iZXI7IC8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvblxyXG4gICAgbGV0IGZpZWxkTGVuZ3RoOiBudW1iZXI7IC8vIGxlbmd0aCBvZiB0aGUgYGZpZWxkYCBwb3J0aW9uIG9mIHRoZSBsaW5lXHJcbiAgICBsZXQgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rOlxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uQ2h1bmsoYXJyOiBVaW50OEFycmF5KSB7XHJcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGFycjtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xyXG4gICAgICAgICAgICBmaWVsZExlbmd0aCA9IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHdlJ3JlIHN0aWxsIHBhcnNpbmcgdGhlIG9sZCBsaW5lLiBBcHBlbmQgdGhlIG5ldyBieXRlcyBpbnRvIGJ1ZmZlcjpcclxuICAgICAgICAgICAgYnVmZmVyID0gY29uY2F0KGJ1ZmZlciwgYXJyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1Zkxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IDA7IC8vIGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGxpbmUgc3RhcnRzXHJcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVmTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChkaXNjYXJkVHJhaWxpbmdOZXdsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW3Bvc2l0aW9uXSA9PT0gMTApIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnQgPSArK3Bvc2l0aW9uOyAvLyBza2lwIHRvIG5leHQgY2hhclxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc3RhcnQgbG9va2luZyBmb3J3YXJkIHRpbGwgdGhlIGVuZCBvZiBsaW5lOlxyXG4gICAgICAgICAgICBsZXQgbGluZUVuZCA9IC0xOyAvLyBpbmRleCBvZiB0aGUgXFxyIG9yIFxcbiBjaGFyXHJcbiAgICAgICAgICAgIGZvciAoOyBwb3NpdGlvbiA8IGJ1Zkxlbmd0aCAmJiBsaW5lRW5kID09PSAtMTsgKytwb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zaXRpb25dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkTGVuZ3RoID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY29sb24gaW4gbGluZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRMZW5ndGggPSBwb3NpdGlvbiAtIGxpbmVTdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6IDxleHBsYW5hdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobGluZUVuZCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJ1dCB0aGUgbGluZSBoYXNuJ3QgZW5kZWQuXHJcbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgbmV4dCBhcnIgYW5kIHRoZW4gY29udGludWUgcGFyc2luZzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB3ZSd2ZSByZWFjaGVkIHRoZSBsaW5lIGVuZCwgc2VuZCBpdCBvdXQ6XHJcbiAgICAgICAgICAgIG9uTGluZShidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0LCBsaW5lRW5kKSwgZmllbGRMZW5ndGgpO1xyXG4gICAgICAgICAgICBsaW5lU3RhcnQgPSBwb3NpdGlvbjsgLy8gd2UncmUgbm93IG9uIHRoZSBuZXh0IGxpbmVcclxuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsaW5lU3RhcnQgPT09IGJ1Zkxlbmd0aCkge1xyXG4gICAgICAgICAgICBidWZmZXIgPSB1bmRlZmluZWQ7IC8vIHdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgaXRcclxuICAgICAgICB9IGVsc2UgaWYgKGxpbmVTdGFydCAhPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdmlldyBpbnRvIGJ1ZmZlciBiZWdpbm5pbmcgYXQgbGluZVN0YXJ0IHNvIHdlIGRvbid0XHJcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gY29weSBvdmVyIHRoZSBwcmV2aW91cyBsaW5lcyB3aGVuIHdlIGdldCB0aGUgbmV3IGFycjpcclxuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uIC09IGxpbmVTdGFydDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogUGFyc2VzIGxpbmUgYnVmZmVycyBpbnRvIEV2ZW50U291cmNlTWVzc2FnZXMuXHJcbiAqIEBwYXJhbSBvbklkIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGBpZGAgZmllbGQuXHJcbiAqIEBwYXJhbSBvblJldHJ5IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGByZXRyeWAgZmllbGQuXHJcbiAqIEBwYXJhbSBvbk1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbWVzc2FnZS5cclxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgbGluZSBidWZmZXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZXMob25NZXNzYWdlPzogKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB2b2lkKSB7XHJcbiAgICBsZXQgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcclxuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuXHJcbiAgICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgbGluZSBidWZmZXI6XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gb25MaW5lKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgLy8gZW1wdHkgbGluZSBkZW5vdGVzIGVuZCBvZiBtZXNzYWdlLiBUcmlnZ2VyIHRoZSBjYWxsYmFjayBhbmQgc3RhcnQgYSBuZXcgbWVzc2FnZTpcclxuICAgICAgICAgICAgb25NZXNzYWdlPy4obWVzc2FnZSk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gZXhjbHVkZSBjb21tZW50cyBhbmQgbGluZXMgd2l0aCBubyB2YWx1ZXNcclxuICAgICAgICAgICAgLy8gbGluZSBpcyBvZiBmb3JtYXQgXCI8ZmllbGQ+Ojx2YWx1ZT5cIiBvciBcIjxmaWVsZD46IDx2YWx1ZT5cIlxyXG4gICAgICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNldmVudC1zdHJlYW0taW50ZXJwcmV0YXRpb25cclxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KDAsIGZpZWxkTGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gZmllbGRMZW5ndGggKyAobGluZVtmaWVsZExlbmd0aCArIDFdID09PSAzMiA/IDIgOiAxKTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KHZhbHVlT2Zmc2V0KSk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0YVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgbWVzc2FnZSBhbHJlYWR5IGhhcyBkYXRhLCBhcHBlbmQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgb2xkLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwganVzdCBzZXQgdG8gdGhlIG5ldyB2YWx1ZTpcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBtZXNzYWdlLmRhdGEgPyBgJHttZXNzYWdlLmRhdGF9XFxuJHt2YWx1ZX1gIDogdmFsdWU7IC8vIG90aGVyd2lzZSxcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbmNhdChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KSB7XHJcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCArIGIubGVuZ3RoKTtcclxuICAgIHJlcy5zZXQoYSk7XHJcbiAgICByZXMuc2V0KGIsIGEubGVuZ3RoKTtcclxuICAgIHJldHVybiByZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5ld01lc3NhZ2UoKTogRXZlbnRTb3VyY2VNZXNzYWdlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YTogXCJcIixcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVzb2x2ZXJzPFQgPSBhbnk+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcclxuICAgIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltcInJlc29sdmVcIl07XHJcbiAgICBsZXQgcmVqZWN0OiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltcInJlamVjdFwiXTtcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcclxuICAgICAgICByZXNvbHZlID0gcmVzO1xyXG4gICAgICAgIHJlamVjdCA9IHJlajtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZTogcmVzb2x2ZSEsIHJlamVjdDogcmVqZWN0ISB9O1xyXG59XHJcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFtQ0EsZUFBc0IsY0FBdUUsQ0FBQyxpQkFBd0M7QUFBQSxFQUNsSSxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQWF4QyxNQUFNLGNBQW1CLE9BQU8sT0FBWSxLQUFhLFlBQXdEO0FBQUEsSUFDN0csSUFBSSxPQUFPLE9BQU87QUFBQSxNQUNkLE1BQU0sVUFBVSxNQUFNLFFBQVEsTUFBTSxJQUFJO0FBQUEsTUFDeEMsSUFBSTtBQUFBLFFBQVMsT0FBTyxNQUFNO0FBQUEsSUFDOUI7QUFBQTtBQUFBLEVBR0osTUFBTSxxQkFBcUIsTUFBTTtBQUFBLElBQzdCLE1BQU0sV0FBVyxJQUFJO0FBQUEsSUFDckIsTUFBTSxVQUFVLElBQUk7QUFBQSxJQUVwQixNQUFNLGdCQUFlO0FBQUEsTUFDakIsSUFBSSxDQUF5RixLQUFVLFlBQXFCO0FBQUEsUUFDeEgsU0FBUyxJQUFJLFNBQVMsR0FBYTtBQUFBLFFBQ25DLElBQUksUUFBUSxJQUFJLEdBQWEsTUFBTSxPQUFPO0FBQUEsVUFDdEMsUUFBUSxJQUFJLEtBQWUsSUFBSSxHQUFLO0FBQUEsUUFDeEM7QUFBQSxRQUNBLE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ3JDLElBQUksSUFBSSxPQUFPO0FBQUEsUUFDZixTQUFTLElBQUksU0FBUyxHQUFhO0FBQUEsUUFFbkMsT0FBTyxNQUFNO0FBQUEsVUFDVCxTQUFTLE9BQU8sT0FBTztBQUFBLFVBQ3ZCLElBQUksT0FBTyxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BRzFCLEtBQUssQ0FBeUYsS0FBVSxZQUFxQjtBQUFBLFFBQ3pILE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ3JDLElBQUksQ0FBQztBQUFBLFVBQUs7QUFBQSxRQUNWLFNBQVMsT0FBTyxPQUFPO0FBQUEsUUFDdkIsSUFBSSxPQUFPLE9BQU87QUFBQTtBQUFBLE1BRXRCLE1BQU0sT0FBNEUsS0FBVSxVQUFnQztBQUFBLFFBQ3hILE1BQU0sSUFBSSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ25DLElBQUksR0FBRztBQUFBLFVBQ0gsV0FBVyxXQUFXLEdBQUc7QUFBQSxZQUNyQixNQUFNLFFBQVEsS0FBSztBQUFBLFVBQ3ZCO0FBQUEsUUFDSjtBQUFBO0FBQUEsSUFFUjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFHWCxNQUFNLGVBQWUsbUJBQW1CO0FBQUEsRUFFeEMsTUFBTSxZQUFZLFlBQVk7QUFBQSxJQUMxQixJQUFJLFdBQVUsZ0JBQWdCO0FBQUEsSUFDOUIsSUFBSSxPQUFPLGFBQVk7QUFBQSxNQUFZLFdBQVUsTUFBTSxTQUFRO0FBQUEsSUFDM0QsSUFBSSxTQUFRLFNBQVMsR0FBRztBQUFBLE1BQUcsV0FBVSxTQUFRLE1BQU0sR0FBRyxFQUFFO0FBQUEsSUFFeEQsT0FBTztBQUFBO0FBQUEsRUFHWCxNQUFNLFVBQTJCLFVBQVU7QUFBQSxFQUUzQyxNQUFNLFdBQVc7QUFBQSxPQUNWO0FBQUEsSUFDSCxTQUFTO0FBQUEsU0FDSCxRQUFvRCxDQUN0RCxNQUNBLFNBWUY7QUFBQSxNQUNFLElBQUksUUFBUSxZQUFZO0FBQUEsUUFBVyxRQUFRLFVBQVUsQ0FBQztBQUFBLE1BRXRELElBQUk7QUFBQSxNQUNKLElBQUksUUFBUSxTQUFTO0FBQUEsUUFDakIsSUFBSSxXQUFVLFFBQVE7QUFBQSxRQUN0QixJQUFJLE9BQU8sYUFBWTtBQUFBLFVBQVksV0FBVSxNQUFNLFNBQVE7QUFBQSxRQUMzRCxJQUFJLFNBQVEsU0FBUyxHQUFHO0FBQUEsVUFBRyxXQUFVLFNBQVEsTUFBTSxHQUFHLEVBQUU7QUFBQSxRQUN4RCxNQUFNLFdBQVc7QUFBQSxNQUNyQixFQUFPO0FBQUEsUUFDSCxNQUFPLE1BQU0sVUFBWTtBQUFBO0FBQUEsTUFHN0IsSUFBSSxDQUFFLEtBQWdCLFNBQVMsR0FBRyxHQUFHO0FBQUEsUUFFakMsSUFBSSxRQUFRLFFBQVEsV0FBVztBQUFBLFVBQVcsUUFBUSxRQUFRLFNBQVM7QUFBQSxRQUNuRSxJQUFJLFFBQVEsUUFBUSxvQkFBb0I7QUFBQSxVQUFXLFFBQVEsUUFBUSxrQkFBa0I7QUFBQSxRQUNyRixJQUFJO0FBQUEsUUFFSixJQUFJO0FBQUEsVUFDQSxNQUFNLGFBQWEsS0FBSyx3QkFBd0IsRUFBRSxNQUFzQixRQUF3QixDQUFDO0FBQUEsVUFFakcsTUFBTSxPQUFPLEtBQUssVUFBVSxRQUFRLE1BQU0sS0FBSztBQUFBLFVBQy9DLE1BQU0sYUFBYSxLQUFLLHNCQUFzQixFQUFFLE1BQXNCLFNBQXlCLEtBQUssQ0FBQztBQUFBLFVBR3JHLE1BQU0sV0FBVyxNQUFNLElBQUksUUFBZ0IsT0FBTyxTQUFTLFdBQVc7QUFBQSxZQUNsRSxNQUFNLFVBQVUsU0FBUyxXQUFXLFNBQVMsV0FBVztBQUFBLFlBQ3hELE1BQU0sUUFBUSxXQUFXLE1BQU07QUFBQSxjQUMzQixPQUFPLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLFNBQVMseUJBQXlCLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQztBQUFBLGVBQ2hHLE9BQU87QUFBQSxZQUVWLElBQUk7QUFBQSxjQUNBLE1BQU0sUUFBUSxPQUFPLE1BQU0sT0FBTyxLQUFLLEVBQUUsUUFBUSxRQUFRLE1BQU0sU0FBUyxRQUFRLFFBQVEsQ0FBQyxHQUFHLEtBQUs7QUFBQSxjQUNqRyxhQUFhLEtBQUs7QUFBQSxjQUNsQixRQUFRLEtBQUs7QUFBQSxjQUNmLE9BQU8sT0FBTztBQUFBLGNBQ1osT0FBTyxLQUFLO0FBQUE7QUFBQSxXQUVuQjtBQUFBLFVBQ0QsU0FBUyxFQUFFLE9BQU8sZ0JBQWdCLEtBQUssTUFBTSxRQUFRLENBQUMsRUFBRTtBQUFBLFVBQzFELE9BQU8sT0FBWTtBQUFBLFVBQ2pCLElBQUksUUFBUSxJQUFJLGlCQUFpQjtBQUFBLFlBQzdCLE1BQU0sYUFBYSxLQUFLLHVCQUF1QixFQUFFLGFBQWEsTUFBc0IsU0FBeUIsTUFBTSxDQUFDO0FBQUEsWUFDcEgsT0FBTztBQUFBLFVBQ1g7QUFBQSxVQUNBLE1BQU0sYUFBYSxFQUFFLGNBQWMsTUFBTTtBQUFBLFVBQ3pDLE1BQU0sYUFBYSxLQUFLLHVCQUF1QixFQUFFLGFBQWEsTUFBc0IsU0FBeUIsT0FBTyxXQUFXLENBQUM7QUFBQSxVQUNoSSxPQUFPLENBQUMsWUFBWSxNQUFNLEVBQUUsV0FBVyxVQUFVLENBQUM7QUFBQTtBQUFBLFFBRXRELElBQUksT0FBTyxNQUFNLFlBQVksTUFBTTtBQUFBLFVBQy9CLE1BQU0sUUFBYSxDQUFDO0FBQUEsVUFDcEIsTUFBTSxPQUFPLE1BQU0sUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLFVBQ2xELE1BQU0sYUFBYSxLQUFLLHVCQUF1QixFQUFFLGFBQWEsTUFBc0IsU0FBeUIsTUFBTSxDQUFDO0FBQUEsVUFDcEgsT0FBTyxDQUFDLE9BQU8sTUFBTSxFQUFFLFdBQVcsT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUFBLFFBQzlEO0FBQUEsUUFFQSxPQUFPLENBQUMsTUFBTSxPQUFPLE1BQU0sTUFBTSxFQUFFLFdBQVcsT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUFBLE1BQzFFLEVBQU87QUFBQSxRQUVILElBQUksUUFBUSxRQUFRLFdBQVc7QUFBQSxVQUFXLFFBQVEsUUFBUSxTQUFTO0FBQUEsUUFDbkUsSUFBSSxRQUFRLFFBQVEsb0JBQW9CO0FBQUEsVUFBVyxRQUFRLFFBQVEsa0JBQWtCO0FBQUEsUUFFckYsTUFBTSxTQVFGLElBQUk7QUFBQSxRQUNSLElBQUksY0FBYztBQUFBLFFBQ2xCLElBQUksZ0JBQWdCO0FBQUEsUUFDcEIsSUFBSTtBQUFBLFFBQ0osTUFBTSxzQkFBc0IsY0FBeUI7QUFBQSxRQUVyRCxNQUFNLFVBQVUsaUJBQWlCLFdBQVcsU0FBUyxXQUFXO0FBQUEsUUFDaEUsTUFBTSxRQUFRLFdBQVcsTUFBTTtBQUFBLFVBQzNCLG9CQUFvQixPQUFPLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLFNBQVMseUJBQXlCLGFBQWEsRUFBRSxHQUFHLE1BQU0sRUFBRSxXQUFXLFVBQVUsQ0FBQyxDQUFDO0FBQUEsV0FDOUksT0FBTztBQUFBLFFBRVYsTUFBTSxZQUFZLENBQUMsVUFBOEI7QUFBQSxVQUM3QyxJQUFJLE1BQU0sS0FBSyxXQUFXLEdBQUcsR0FBRztBQUFBLFlBQzVCLElBQUk7QUFBQSxjQUNBLGVBQWUsZ0JBQWdCLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztBQUFBLGNBQzlELG9CQUFvQixRQUFRLFNBQVM7QUFBQSxjQUNyQyxhQUFhLEtBQUs7QUFBQSxjQUNwQixPQUFPLE9BQU87QUFBQSxjQUNaLG9CQUFvQixPQUFPLENBQUMsRUFBRSxjQUFjLE1BQU0sR0FBRyxNQUFNLEVBQUUsV0FBVyxVQUFVLENBQUMsQ0FBQztBQUFBLGNBQ3BGLGFBQWEsS0FBSztBQUFBO0FBQUEsVUFFMUIsRUFBTztBQUFBLFlBQ0gsTUFBTSxRQUFRLEVBQUU7QUFBQSxZQUNoQixJQUFJLE9BQU8sSUFBSSxLQUFLLEdBQUc7QUFBQSxjQUNuQixNQUFNLFFBQVEsT0FBTyxJQUFJLEtBQUs7QUFBQSxjQUM5QixNQUFPLE9BQU87QUFBQSxjQUNkLE1BQU8sUUFBUSxFQUFFLE1BQU0sT0FBTyxPQUFPLGdCQUFnQixLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQUEsWUFDbEYsRUFBTztBQUFBLGNBQ0gsTUFBTSxRQUFRLGNBQW1DO0FBQUEsY0FDakQsTUFBTSxRQUFRLEVBQUUsTUFBTSxPQUFPLE9BQU8sZ0JBQWdCLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7QUFBQSxjQUM3RSxPQUFPLElBQUksT0FBTyxLQUFLLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUt2RCxJQUFJO0FBQUEsUUFFSixlQUFlLE1BQU0sR0FBRztBQUFBLFVBQ3BCLHVCQUF1QixJQUFJO0FBQUEsVUFDM0IscUJBQXFCLE9BQU8saUJBQWlCLFNBQVMsTUFBTTtBQUFBLFlBQ3hELFNBQVMsT0FBTztBQUFBLFdBQ25CO0FBQUEsVUFDRCxJQUFJO0FBQUEsWUFDQSxNQUFNLGFBQWEsS0FBSyx3QkFBd0IsRUFBRSxNQUFzQixRQUF3QixDQUFDO0FBQUEsWUFFakcsTUFBTSxPQUFPLEtBQUssVUFBVSxRQUFTLE1BQU0sS0FBSztBQUFBLFlBQ2hELE1BQU0sYUFBYSxLQUFLLHNCQUFzQixFQUFFLE1BQXNCLFNBQXlCLEtBQUssQ0FBQztBQUFBLFlBRXJHLE1BQU0sV0FBVyxNQUFNLE9BQU8sS0FBSztBQUFBLGNBQy9CLFFBQVE7QUFBQSxjQUNSLFNBQVMsUUFBUztBQUFBLGNBQ2xCO0FBQUEsY0FDQSxRQUFRLHFCQUFxQjtBQUFBLFlBQ2pDLENBQUM7QUFBQSxZQUVELE1BQU0sY0FBYyxTQUFTLFFBQVEsSUFBSSxjQUFjO0FBQUEsWUFDdkQsSUFBSSxDQUFDLGFBQWEsV0FBVyxtQkFBbUIsR0FBRztBQUFBLGNBQy9DLE1BQU0sSUFBSSxNQUFNLCtCQUErQixnQ0FBZ0MsYUFBYTtBQUFBLFlBQ2hHO0FBQUEsWUFFQSxNQUFNLFNBQVMsU0FBUyxNQUFPLFNBQVMsWUFBWSxTQUFTLENBQUMsQ0FBQztBQUFBLFlBRS9ELE1BQU0sU0FBUyxPQUFPO0FBQUEsWUFDeEIsT0FBTyxLQUFLO0FBQUEsWUFDVixJQUFJLENBQUMscUJBQXFCLE9BQU87QUFBQSxjQUFTLHFCQUFxQixNQUFNO0FBQUEsWUFDckUsTUFBTSxRQUFRLEVBQUUsY0FBYyxJQUFJO0FBQUEsWUFDbEMsTUFBTSxhQUFhLEtBQUssdUJBQXVCLEVBQUUsYUFBYSxNQUFzQixTQUF5QixNQUFNLENBQUM7QUFBQSxZQUNwSCxNQUFNLFNBQVMsTUFBTSxHQUFHO0FBQUEsWUFDeEIsb0JBQW9CLE9BQU8sQ0FBQyxPQUFPLE1BQU0sRUFBRSxXQUFXLFVBQVUsQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBLFFBSXJFLE9BQU87QUFBQSxRQUVaLE1BQU0sV0FBVztBQUFBLGFBQ1Q7QUFBQSxZQUNBLElBQUksR0FBcUM7QUFBQSxjQUNyQyxNQUFNLFFBQVEsRUFBRTtBQUFBLGNBQ2hCLElBQUksT0FBTyxJQUFJLFFBQVEsQ0FBQztBQUFBLGdCQUFHLE9BQU8sT0FBTyxRQUFRLENBQUM7QUFBQSxjQUNsRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDLHFCQUFxQixPQUFPLFNBQVM7QUFBQSxnQkFDNUQsTUFBTSxRQUFRLGNBQW1DO0FBQUEsZ0JBQ2pELE9BQU8sSUFBSSxPQUFPLEtBQUssT0FBTyxNQUFNLE1BQU0sQ0FBQztBQUFBLGdCQUMzQyxPQUFPLE1BQU07QUFBQSxjQUNqQjtBQUFBLGNBQ0EsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUsscUJBQXFCLE9BQU8sU0FBUztBQUFBLGdCQUMzRCxNQUFNLFFBQVEsY0FBbUM7QUFBQSxnQkFDakQsTUFBTSxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sVUFBVSxDQUFDO0FBQUEsZ0JBQzlDLE9BQU8sTUFBTTtBQUFBLGNBQ2pCO0FBQUEsY0FDQSxPQUFPLE9BQU8sSUFBSSxLQUFLLEVBQUc7QUFBQTtBQUFBLGlCQUV4QixPQUFNLEdBQWtDO0FBQUEsY0FDMUMsSUFBSSxDQUFDLHFCQUFxQixPQUFPO0FBQUEsZ0JBQVMscUJBQXFCLE1BQU07QUFBQSxjQUNyRSxZQUFZLEdBQUcsY0FBYTtBQUFBLGdCQUFRLFVBQVMsUUFBUSxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUFBLGNBQ3JGLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVO0FBQUE7QUFBQSxpQkFFcEMsTUFBSyxDQUFDLEtBQXlDO0FBQUEsY0FDakQsZUFBZTtBQUFBLGdCQUNYLFNBQVM7QUFBQSxnQkFDVCxXQUFXLGNBQWMsYUFBYTtBQUFBLGdCQUN0QyxNQUFNO0FBQUEsa0JBQ0YsTUFBTTtBQUFBLGtCQUNOLFNBQVM7QUFBQSxrQkFDVCxZQUFZO0FBQUEsa0JBQ1osTUFBTTtBQUFBLGdCQUNWO0FBQUEsY0FDSjtBQUFBLGNBQ0EsWUFBWSxRQUFRLFVBQVUsUUFBUTtBQUFBLGdCQUNsQyxJQUFJLE1BQU07QUFBQSxrQkFBTTtBQUFBLGdCQUNoQixNQUFNLE9BQU87QUFBQSxnQkFDYixNQUFNLFFBQVEsRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVLENBQUM7QUFBQSxjQUNsRDtBQUFBLGNBQ0EsSUFBSSxDQUFDLHFCQUFxQixPQUFPO0FBQUEsZ0JBQVMscUJBQXFCLE1BQU07QUFBQSxjQUNyRSxZQUFZLEdBQUcsY0FBYTtBQUFBLGdCQUFRLFVBQVMsUUFBUSxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUFBLGNBQ3JGLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVO0FBQUE7QUFBQSxVQUU5QztBQUFBLFdBQ0MsT0FBTyxjQUFjLEdBQUc7QUFBQSxZQUNyQixPQUFPO0FBQUE7QUFBQSxRQUVmO0FBQUEsUUFFQSxJQUFJO0FBQUEsVUFDQSxNQUFNLG9CQUFvQjtBQUFBLFVBQzFCLE9BQU8sQ0FBQyxNQUFNLFVBQVUsRUFBRSxXQUFXLGFBQWEsVUFBVSxDQUFDO0FBQUEsVUFDL0QsT0FBTyxPQUFPO0FBQUEsVUFDWixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJbkIsWUFBWTtBQUFBLE1BQ1IsV0FBVyxPQUFPLGFBQW9CO0FBQUEsUUFDbEMsTUFBTSxVQUFVO0FBQUEsVUFDWixnQkFBZ0I7QUFBQSxVQUNoQixRQUFRO0FBQUEsUUFDWjtBQUFBLFFBQ0EsTUFBTSxTQUFTLENBQUM7QUFBQSxRQUVoQixNQUFNLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSztBQUFBLFFBQ3ZDLE1BQU0sU0FRRixJQUFJO0FBQUEsUUFDUixJQUFJLGNBQWM7QUFBQSxRQUNsQixJQUFJLGdCQUFnQjtBQUFBLFFBRXBCLE1BQU0sWUFBWSxDQUFDLFVBQThCO0FBQUEsVUFDN0MsTUFBTSxRQUFRLEVBQUU7QUFBQSxVQUNoQixJQUFJLE9BQU8sSUFBSSxLQUFLLEdBQUc7QUFBQSxZQUNuQixNQUFNLFFBQVEsT0FBTyxJQUFJLEtBQUs7QUFBQSxZQUM5QixNQUFPLFFBQVEsRUFBRSxNQUFNLE9BQU8sT0FBTyxnQkFBZ0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUFBLFVBQ2xGLEVBQU87QUFBQSxZQUNILE1BQU0sUUFBUSxjQUFtQztBQUFBLFlBQ2pELE1BQU0sUUFBUSxFQUFFLE1BQU0sT0FBTyxPQUFPLGdCQUFnQixLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQUEsWUFDN0UsT0FBTyxJQUFJLE9BQU8sS0FBSyxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBLFFBSW5ELElBQUk7QUFBQSxRQUVKLGVBQWUsTUFBTSxHQUFHO0FBQUEsVUFDcEIsdUJBQXVCLElBQUk7QUFBQSxVQUMzQixxQkFBcUIsT0FBTyxpQkFBaUIsU0FBUyxNQUFNO0FBQUEsWUFDeEQsU0FBUyxPQUFPO0FBQUEsV0FDbkI7QUFBQSxVQUNELElBQUk7QUFBQSxZQUNBLE1BQU0sV0FBVyxNQUFNLE9BQU8sR0FBRyx1QkFBc0I7QUFBQSxjQUNuRCxRQUFRO0FBQUEsY0FDUjtBQUFBLGNBQ0E7QUFBQSxjQUNBLFFBQVEscUJBQXFCO0FBQUEsWUFDakMsQ0FBQztBQUFBLFlBRUQsTUFBTSxjQUFjLFNBQVMsUUFBUSxJQUFJLGNBQWM7QUFBQSxZQUN2RCxJQUFJLENBQUMsYUFBYSxXQUFXLG1CQUFtQixHQUFHO0FBQUEsY0FDL0MsTUFBTSxJQUFJLE1BQU0sK0JBQStCLGdDQUFnQyxhQUFhO0FBQUEsWUFDaEc7QUFBQSxZQUVBLE1BQU0sU0FBUyxTQUFTLE1BQU8sU0FBUyxZQUFZLFNBQVMsQ0FBQyxDQUFDO0FBQUEsWUFFL0QsTUFBTSxTQUFTLE9BQU87QUFBQSxZQUN4QixPQUFPLEtBQUs7QUFBQSxZQUNWLElBQUksQ0FBQyxxQkFBcUIsT0FBTztBQUFBLGNBQVMscUJBQXFCLE1BQU07QUFBQSxZQUNyRSxNQUFNLFNBQVMsTUFBTSxHQUFHO0FBQUE7QUFBQTtBQUFBLFFBSTNCLE9BQU87QUFBQSxRQUVaLE1BQU0sV0FBVztBQUFBLGFBQ1Q7QUFBQSxZQUNBLElBQUksR0FBcUM7QUFBQSxjQUNyQyxNQUFNLFFBQVEsRUFBRTtBQUFBLGNBQ2hCLElBQUksT0FBTyxJQUFJLFFBQVEsQ0FBQztBQUFBLGdCQUFHLE9BQU8sT0FBTyxRQUFRLENBQUM7QUFBQSxjQUNsRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDLHFCQUFxQixPQUFPLFNBQVM7QUFBQSxnQkFDNUQsTUFBTSxRQUFRLGNBQW1DO0FBQUEsZ0JBQ2pELE9BQU8sSUFBSSxPQUFPLEtBQUssT0FBTyxNQUFNLE1BQU0sQ0FBQztBQUFBLGdCQUMzQyxPQUFPLE1BQU07QUFBQSxjQUNqQjtBQUFBLGNBQ0EsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUsscUJBQXFCLE9BQU8sU0FBUztBQUFBLGdCQUMzRCxNQUFNLFFBQVEsY0FBbUM7QUFBQSxnQkFDakQsTUFBTSxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sVUFBVSxDQUFDO0FBQUEsZ0JBQzlDLE9BQU8sTUFBTTtBQUFBLGNBQ2pCO0FBQUEsY0FDQSxPQUFPLE9BQU8sSUFBSSxLQUFLLEVBQUc7QUFBQTtBQUFBLGlCQUV4QixPQUFNLEdBQWtDO0FBQUEsY0FDMUMsSUFBSSxDQUFDLHFCQUFxQixPQUFPO0FBQUEsZ0JBQVMscUJBQXFCLE1BQU07QUFBQSxjQUNyRSxZQUFZLEdBQUcsY0FBYTtBQUFBLGdCQUFRLFVBQVMsUUFBUSxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUFBLGNBQ3JGLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVO0FBQUE7QUFBQSxpQkFFcEMsTUFBSyxDQUFDLEtBQXlDO0FBQUEsY0FDakQsSUFBSSxDQUFDLHFCQUFxQixPQUFPO0FBQUEsZ0JBQVMscUJBQXFCLE1BQU07QUFBQSxjQUNyRSxZQUFZLEdBQUcsY0FBYTtBQUFBLGdCQUFRLFVBQVMsUUFBUSxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUFBLGNBQ3JGLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVO0FBQUE7QUFBQSxVQUU5QztBQUFBLFdBQ0MsT0FBTyxjQUFjLEdBQUc7QUFBQSxZQUNyQixPQUFPO0FBQUE7QUFBQSxRQUVmO0FBQUEsUUFFQSxJQUFJO0FBQUEsVUFDQSxPQUFPO0FBQUEsVUFDVCxPQUFPLE9BQU87QUFBQSxVQUNaLE9BQU87QUFBQTtBQUFBO0FBQUEsSUFHbkI7QUFBQSxTQUNNLEtBQUksQ0FBQyxTQUErQztBQUFBLE1BRXRELE9BQU8sTUFBTSxJQUFJLFFBQWMsT0FBTyxZQUFZO0FBQUEsUUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTTtBQUFBLFFBQ3JCLE1BQU0sVUFBVSxpQkFBaUIsV0FBVyxTQUFTLFdBQVc7QUFBQSxRQUNoRSxNQUFNLGFBQWEsS0FBSyxJQUFJO0FBQUEsUUFDNUIsTUFBTSxRQUFRLFdBQVcsTUFBTTtBQUFBLFVBQzNCLE1BQU0sV0FBVyxLQUFLLElBQUk7QUFBQSxVQUMxQixRQUFRLENBQUMsRUFBRSxTQUFTLE9BQU8sT0FBTyxXQUFXLFlBQVksT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsU0FBUyx5QkFBeUIsYUFBYSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFBQSxXQUMxSixPQUFPO0FBQUEsUUFFVixJQUFJO0FBQUEsVUFDQSxNQUFNLFdBQVcsTUFBTSxPQUFPLEtBQUssRUFBRSxRQUFRLE9BQU8sQ0FBQztBQUFBLFVBQ3JELE1BQU0sV0FBVyxLQUFLLElBQUk7QUFBQSxVQUMxQixhQUFhLEtBQUs7QUFBQSxVQUNsQixJQUFJLFNBQVMsV0FBVyxLQUFLO0FBQUEsWUFDekIsUUFBUSxDQUFDLEVBQUUsU0FBUyxPQUFPLE9BQU8sV0FBVyxZQUFZLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxRQUFRLFNBQVMsUUFBUSxTQUFTLHNCQUFzQixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFBQSxVQUNwSztBQUFBLFVBRUEsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU0sT0FBTyxXQUFXLFlBQVksaUJBQWlCLE9BQU8sU0FBUyxRQUFRLElBQUksY0FBYyxFQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQUEsVUFDL0ksT0FBTyxPQUFZO0FBQUEsVUFDakIsTUFBTSxXQUFXLEtBQUssSUFBSTtBQUFBLFVBQzFCLE9BQU8sQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLFdBQVcsWUFBWSxNQUFNLEdBQUcsSUFBSTtBQUFBO0FBQUEsT0FFNUU7QUFBQTtBQUFBLElBRUwsUUFBUTtBQUFBLEVBY1o7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdYLFNBQVMsZUFBa0IsQ0FBQyxNQUFZO0FBQUEsRUFDcEMsTUFBTSxpQkFBaUI7QUFBQSxFQUV2QixJQUFJLGdCQUFnQjtBQUFBLElBQU0sT0FBTztBQUFBLEVBQ2pDLElBQUksTUFBTSxRQUFRLElBQUksR0FBRztBQUFBLElBQ3JCLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBLElBQUksT0FBTyxTQUFTLFlBQVksU0FBUyxNQUFNO0FBQUEsSUFDM0MsT0FBTyxPQUFPLFFBQVEsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEtBQUssV0FBVztBQUFBLE1BQ3RELElBQUksT0FBa0IsZ0JBQWdCLEtBQUs7QUFBQSxNQUMzQyxPQUFPO0FBQUEsT0FDUixDQUFDLENBQU07QUFBQSxFQUNkO0FBQUEsRUFDQSxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsSUFDMUIsTUFBTSxRQUFRLEtBQUssTUFBTSxjQUFjO0FBQUEsSUFDdkMsSUFBSSxPQUFPO0FBQUEsTUFDUCxNQUFNLHVCQUF1QixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssTUFBTSxHQUFHLFFBQVEsS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNO0FBQUEsTUFDN0YsT0FBTyxJQUFJLEtBQUssb0JBQW9CO0FBQUEsSUFDeEM7QUFBQSxFQUNKO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFpRVgsZUFBc0IsUUFBUSxDQUFDLFFBQW9DLFNBQW9DO0FBQUEsRUFDbkcsTUFBTSxTQUFTLE9BQU8sVUFBVTtBQUFBLEVBQ2hDLElBQUk7QUFBQSxFQUVKLE9BQU8sRUFBRSxTQUFTLE1BQU0sT0FBTyxLQUFLLEdBQUcsTUFBTTtBQUFBLElBQ3pDLFFBQVEsT0FBTyxLQUFLO0FBQUEsRUFDeEI7QUFBQTtBQVNHLFNBQVMsUUFBUSxDQUFDLFFBQXlEO0FBQUEsRUFDOUUsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSSx5QkFBeUI7QUFBQSxFQUc3QixPQUFPLFNBQVMsT0FBTyxDQUFDLEtBQWlCO0FBQUEsSUFDckMsSUFBSSxXQUFXLFdBQVc7QUFBQSxNQUN0QixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsTUFDWCxjQUFjO0FBQUEsSUFDbEIsRUFBTztBQUFBLE1BRUgsU0FBUyxPQUFPLFFBQVEsR0FBRztBQUFBO0FBQUEsSUFHL0IsTUFBTSxZQUFZLE9BQU87QUFBQSxJQUN6QixJQUFJLFlBQVk7QUFBQSxJQUNoQixPQUFPLFdBQVcsV0FBVztBQUFBLE1BQ3pCLElBQUksd0JBQXdCO0FBQUEsUUFDeEIsSUFBSSxPQUFPLGNBQWMsSUFBSTtBQUFBLFVBQ3pCLFlBQVksRUFBRTtBQUFBLFFBQ2xCO0FBQUEsUUFFQSx5QkFBeUI7QUFBQSxNQUM3QjtBQUFBLE1BR0EsSUFBSSxVQUFVO0FBQUEsTUFDZCxNQUFPLFdBQVcsYUFBYSxZQUFZLElBQUksRUFBRSxVQUFVO0FBQUEsUUFDdkQsUUFBUSxPQUFPO0FBQUEsZUFDTjtBQUFBLFlBQ0QsSUFBSSxnQkFBZ0IsSUFBSTtBQUFBLGNBRXBCLGNBQWMsV0FBVztBQUFBLFlBQzdCO0FBQUEsWUFDQTtBQUFBLGVBRUM7QUFBQSxZQUNELHlCQUF5QjtBQUFBLGVBQ3hCO0FBQUEsWUFDRCxVQUFVO0FBQUEsWUFDVjtBQUFBO0FBQUEsTUFFWjtBQUFBLE1BRUEsSUFBSSxZQUFZLElBQUk7QUFBQSxRQUdoQjtBQUFBLE1BQ0o7QUFBQSxNQUdBLE9BQU8sT0FBTyxTQUFTLFdBQVcsT0FBTyxHQUFHLFdBQVc7QUFBQSxNQUN2RCxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEI7QUFBQSxJQUVBLElBQUksY0FBYyxXQUFXO0FBQUEsTUFDekIsU0FBUztBQUFBLElBQ2IsRUFBTyxTQUFJLGNBQWMsR0FBRztBQUFBLE1BR3hCLFNBQVMsT0FBTyxTQUFTLFNBQVM7QUFBQSxNQUNsQyxZQUFZO0FBQUEsSUFDaEI7QUFBQTtBQUFBO0FBV0QsU0FBUyxXQUFXLENBQUMsV0FBK0M7QUFBQSxFQUN2RSxJQUFJLFVBQVUsV0FBVztBQUFBLEVBQ3pCLE1BQU0sVUFBVSxJQUFJO0FBQUEsRUFHcEIsT0FBTyxTQUFTLE1BQU0sQ0FBQyxNQUFrQixhQUFxQjtBQUFBLElBQzFELElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUVuQixZQUFZLE9BQU87QUFBQSxNQUNuQixVQUFVLFdBQVc7QUFBQSxJQUN6QixFQUFPLFNBQUksY0FBYyxHQUFHO0FBQUEsTUFJeEIsTUFBTSxRQUFRLFFBQVEsT0FBTyxLQUFLLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFBQSxNQUMxRCxNQUFNLGNBQWMsZUFBZSxLQUFLLGNBQWMsT0FBTyxLQUFLLElBQUk7QUFBQSxNQUN0RSxNQUFNLFFBQVEsUUFBUSxPQUFPLEtBQUssU0FBUyxXQUFXLENBQUM7QUFBQSxNQUV2RCxRQUFRO0FBQUEsYUFDQztBQUFBLFVBR0QsUUFBUSxPQUFPLFFBQVEsT0FBTyxHQUFHLFFBQVE7QUFBQSxFQUFTLFVBQVU7QUFBQSxVQUM1RDtBQUFBO0FBQUEsSUFFWjtBQUFBO0FBQUE7QUFJUixTQUFTLE1BQU0sQ0FBQyxHQUFlLEdBQWU7QUFBQSxFQUMxQyxNQUFNLE1BQU0sSUFBSSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU07QUFBQSxFQUM5QyxJQUFJLElBQUksQ0FBQztBQUFBLEVBQ1QsSUFBSSxJQUFJLEdBQUcsRUFBRSxNQUFNO0FBQUEsRUFDbkIsT0FBTztBQUFBO0FBR1gsU0FBUyxVQUFVLEdBQXVCO0FBQUEsRUFDdEMsT0FBTztBQUFBLElBQ0gsTUFBTTtBQUFBLEVBQ1Y7QUFBQTtBQUdHLFNBQVMsYUFBc0IsR0FBNEI7QUFBQSxFQUM5RCxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixNQUFNLFVBQVUsSUFBSSxRQUFXLENBQUMsS0FBSyxRQUFRO0FBQUEsSUFDekMsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLEdBQ1o7QUFBQSxFQUNELE9BQU8sRUFBRSxTQUFTLFNBQW1CLE9BQWdCO0FBQUE7IiwKICAiZGVidWdJZCI6ICI3NjQ0MjQ5OUU2QzJDMDhBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@milkio/stargate","version":"1.0.0-beta.2","type":"module","module":"./index.js","types":"./index.d.ts","dependencies":{}}
1
+ {"name":"@milkio/stargate","version":"1.0.0-beta.202","type":"module","exports":"./index.js","types":"./index.d.ts","dependencies":{}}