@cartanova/qgrid-cli 2.0.3 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import "../../../_virtual/_rolldown/runtime.js";
2
2
  import { CodexRpcClient } from "./codex-rpc.js";
3
3
  import { getLogger } from "@logtape/logtape";
4
4
  import { spawn } from "node:child_process";
5
- import { mkdirSync, readFileSync, rmSync } from "node:fs";
5
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
6
  //#region src/utils/providers/openai/codex-worker.ts
7
7
  const logger = getLogger(["qgrid", "codex-worker"]);
8
8
  const MAX_RESTART_ATTEMPTS = 3;
@@ -20,6 +20,26 @@ const BASE_INSTRUCTIONS = {
20
20
  text: "You are a helpful assistant. Do not use any tools such as shell, file operations, or web search. Respond with text only.",
21
21
  withSchema: "You are a helpful assistant. Respond using the provided output schema."
22
22
  };
23
+ const CODEX_CONFIG_TOML = `web_search = "disabled"
24
+ include_permissions_instructions = false
25
+ include_apps_instructions = false
26
+ include_environment_context = false
27
+
28
+ [features]
29
+ shell_tool = false
30
+ tool_search = false
31
+ tool_suggest = false
32
+ multi_agent = false
33
+ image_generation = false
34
+ apps = false
35
+ plugins = false
36
+
37
+ [tools]
38
+ view_image = false
39
+
40
+ [skills]
41
+ include_instructions = false
42
+ `;
23
43
  var CodexAppServerWorker = class {
24
44
  proc = null;
25
45
  rpc = null;
@@ -28,8 +48,10 @@ var CodexAppServerWorker = class {
28
48
  ready = false;
29
49
  destroyed = false;
30
50
  busy = false;
51
+ activeTurnAbort;
31
52
  active = true;
32
53
  onReady;
54
+ serverRequestHandler;
33
55
  constructor(config) {
34
56
  this.config = config;
35
57
  const suffix = config.workerIndex !== void 0 ? `-${config.workerIndex}` : "";
@@ -38,6 +60,7 @@ var CodexAppServerWorker = class {
38
60
  async spawnAndInit() {
39
61
  const cwd = `${this.codexHome}/cwd`;
40
62
  mkdirSync(cwd, { recursive: true });
63
+ writeFileSync(`${this.codexHome}/config.toml`, CODEX_CONFIG_TOML);
41
64
  this.proc = spawn("codex", [
42
65
  "app-server",
43
66
  "--listen",
@@ -52,17 +75,20 @@ var CodexAppServerWorker = class {
52
75
  env: {
53
76
  PATH: process.env.PATH,
54
77
  TMPDIR: process.env.TMPDIR,
55
- CODEX_HOME: this.codexHome
78
+ CODEX_HOME: this.codexHome,
79
+ CODEX_EXEC_SERVER_URL: "none"
56
80
  }
57
81
  });
58
82
  this.proc.on("exit", (code) => {
59
83
  logger.info(`worker ${this.config.tokenName} exited (code=${code})`);
84
+ this.failActiveTurn(/* @__PURE__ */ new Error(`codex worker exited while turn was running (code=${code ?? "unknown"})`));
60
85
  this.ready = false;
61
86
  this.rpc = null;
62
87
  this.proc = null;
63
88
  if (!this.destroyed) this.scheduleRestart();
64
89
  });
65
90
  this.rpc = new CodexRpcClient(this.proc);
91
+ this.bindServerRequestHandler();
66
92
  await this.rpc.request("initialize", {
67
93
  clientInfo: {
68
94
  name: "qgrid",
@@ -122,6 +148,7 @@ var CodexAppServerWorker = class {
122
148
  async kill() {
123
149
  this.destroyed = true;
124
150
  this.ready = false;
151
+ this.failActiveTurn(/* @__PURE__ */ new Error("codex worker stopped"));
125
152
  this.rpc?.destroy();
126
153
  if (this.proc) {
127
154
  this.proc.kill("SIGTERM");
@@ -155,11 +182,27 @@ var CodexAppServerWorker = class {
155
182
  get tokenName() {
156
183
  return this.config.tokenName;
157
184
  }
185
+ canReuseForToken(_tokenName, credentials) {
186
+ return this.config.accountId === credentials.accountId && (this.config.planType ?? void 0) === (credentials.planType ?? void 0);
187
+ }
188
+ updateTokenState(tokenName, credentials) {
189
+ this.config.tokenName = tokenName;
190
+ this.config.accessToken = credentials.accessToken;
191
+ this.config.accountId = credentials.accountId;
192
+ if (credentials.planType) this.config.planType = credentials.planType;
193
+ else delete this.config.planType;
194
+ }
158
195
  async getRateLimits() {
159
196
  if (!this.rpc || !this.ready) throw new Error("worker not ready");
160
197
  return this.rpc.request("account/rateLimits/read", {});
161
198
  }
162
199
  setServerRequestHandler(handler) {
200
+ this.serverRequestHandler = handler;
201
+ this.bindServerRequestHandler();
202
+ }
203
+ bindServerRequestHandler() {
204
+ const handler = this.serverRequestHandler;
205
+ if (!handler) return;
163
206
  this.rpc?.onServerRequest("account/chatgptAuthTokens/refresh", (params) => handler("account/chatgptAuthTokens/refresh", params));
164
207
  }
165
208
  tryAcquireTurn() {
@@ -228,11 +271,17 @@ var CodexAppServerWorker = class {
228
271
  });
229
272
  } catch {}
230
273
  }
274
+ failActiveTurn(error) {
275
+ const abort = this.activeTurnAbort;
276
+ this.activeTurnAbort = void 0;
277
+ abort?.(error);
278
+ }
231
279
  consumeTurnNotifications(threadId, model) {
232
280
  return new Promise((resolve, reject) => {
281
+ let settled = false;
282
+ let abort;
233
283
  const timeout = setTimeout(() => {
234
- cleanup();
235
- reject(/* @__PURE__ */ new Error("turn timeout (600s)"));
284
+ finishWithError(/* @__PURE__ */ new Error("turn timeout (600s)"));
236
285
  }, 6e5);
237
286
  let text = "";
238
287
  let usage = {
@@ -245,6 +294,7 @@ var CodexAppServerWorker = class {
245
294
  let durationMs = 0;
246
295
  const cleanup = () => {
247
296
  clearTimeout(timeout);
297
+ if (this.activeTurnAbort === abort) this.activeTurnAbort = void 0;
248
298
  for (const n of [
249
299
  "item/completed",
250
300
  "item/agentMessage/delta",
@@ -253,6 +303,20 @@ var CodexAppServerWorker = class {
253
303
  "error"
254
304
  ]) this.rpc?.onNotification(n, () => {});
255
305
  };
306
+ const finishWithError = (error) => {
307
+ if (settled) return;
308
+ settled = true;
309
+ cleanup();
310
+ reject(error);
311
+ };
312
+ const finishWithResult = (result) => {
313
+ if (settled) return;
314
+ settled = true;
315
+ cleanup();
316
+ resolve(result);
317
+ };
318
+ abort = finishWithError;
319
+ this.activeTurnAbort = abort;
256
320
  this.rpc.onNotification("item/completed", (p) => {
257
321
  if (p.threadId !== threadId) return;
258
322
  if (p.item.type === "agentMessage") text = p.item.text;
@@ -264,30 +328,26 @@ var CodexAppServerWorker = class {
264
328
  this.rpc.onNotification("turn/completed", (p) => {
265
329
  if (p.threadId !== threadId) return;
266
330
  durationMs = p.turn.durationMs ?? 0;
267
- cleanup();
268
- if (p.turn.status === "completed") resolve({
331
+ if (p.turn.status === "completed") finishWithResult({
269
332
  text,
270
333
  usage,
271
334
  durationMs,
272
335
  model
273
336
  });
274
- else reject(/* @__PURE__ */ new Error(`turn failed: ${JSON.stringify(p.turn.error)}`));
337
+ else finishWithError(/* @__PURE__ */ new Error(`turn failed: ${JSON.stringify(p.turn.error)}`));
275
338
  });
276
339
  this.rpc.onNotification("error", (p) => {
277
340
  if (p.threadId !== threadId) return;
278
- if (!p.willRetry) {
279
- cleanup();
280
- reject(/* @__PURE__ */ new Error(`codex error: ${p.error.message}`));
281
- }
341
+ if (!p.willRetry) finishWithError(/* @__PURE__ */ new Error(`codex error: ${p.error.message}`));
282
342
  });
283
343
  });
284
344
  }
285
345
  consumeStreamNotifications(threadId, model, cb) {
286
346
  return new Promise((resolve, reject) => {
347
+ let settled = false;
348
+ let abort;
287
349
  const timeout = setTimeout(() => {
288
- cleanup();
289
- cb.onError(/* @__PURE__ */ new Error("turn timeout (600s)"));
290
- reject(/* @__PURE__ */ new Error("turn timeout (600s)"));
350
+ finishWithError(/* @__PURE__ */ new Error("turn timeout (600s)"));
291
351
  }, 6e5);
292
352
  let text = "";
293
353
  let usage = {
@@ -299,6 +359,7 @@ var CodexAppServerWorker = class {
299
359
  };
300
360
  const cleanup = () => {
301
361
  clearTimeout(timeout);
362
+ if (this.activeTurnAbort === abort) this.activeTurnAbort = void 0;
302
363
  for (const n of [
303
364
  "item/completed",
304
365
  "item/agentMessage/delta",
@@ -307,6 +368,22 @@ var CodexAppServerWorker = class {
307
368
  "error"
308
369
  ]) this.rpc?.onNotification(n, () => {});
309
370
  };
371
+ const finishWithError = (error) => {
372
+ if (settled) return;
373
+ settled = true;
374
+ cleanup();
375
+ cb.onError(error);
376
+ reject(error);
377
+ };
378
+ const finishWithComplete = (result) => {
379
+ if (settled) return;
380
+ settled = true;
381
+ cleanup();
382
+ cb.onComplete(result);
383
+ resolve();
384
+ };
385
+ abort = finishWithError;
386
+ this.activeTurnAbort = abort;
310
387
  this.rpc.onNotification("item/agentMessage/delta", (p) => {
311
388
  if (p.threadId !== threadId) return;
312
389
  text += p.delta;
@@ -322,29 +399,17 @@ var CodexAppServerWorker = class {
322
399
  });
323
400
  this.rpc.onNotification("turn/completed", (p) => {
324
401
  if (p.threadId !== threadId) return;
325
- cleanup();
326
- if (p.turn.status === "completed") {
327
- cb.onComplete({
328
- text,
329
- usage,
330
- durationMs: p.turn.durationMs ?? 0,
331
- model
332
- });
333
- resolve();
334
- } else {
335
- const err = /* @__PURE__ */ new Error(`turn ${p.turn.status}: ${JSON.stringify(p.turn.error)}`);
336
- cb.onError(err);
337
- reject(err);
338
- }
402
+ if (p.turn.status === "completed") finishWithComplete({
403
+ text,
404
+ usage,
405
+ durationMs: p.turn.durationMs ?? 0,
406
+ model
407
+ });
408
+ else finishWithError(/* @__PURE__ */ new Error(`turn ${p.turn.status}: ${JSON.stringify(p.turn.error)}`));
339
409
  });
340
410
  this.rpc.onNotification("error", (p) => {
341
411
  if (p.threadId !== threadId) return;
342
- if (!p.willRetry) {
343
- cleanup();
344
- const err = /* @__PURE__ */ new Error(`codex error: ${p.error.message}`);
345
- cb.onError(err);
346
- reject(err);
347
- }
412
+ if (!p.willRetry) finishWithError(/* @__PURE__ */ new Error(`codex error: ${p.error.message}`));
348
413
  });
349
414
  });
350
415
  }
@@ -368,4 +433,4 @@ var CodexAppServerWorker = class {
368
433
  //#endregion
369
434
  export { CodexAppServerWorker };
370
435
 
371
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgdHlwZSBUaHJlYWRJbmplY3RJdGVtc1BhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRJbmplY3RJdGVtc1BhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IENvZGV4UnBjQ2xpZW50IH0gZnJvbSBcIi4vY29kZXgtcnBjXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcImNvZGV4LXdvcmtlclwiXSk7XG5cbmNvbnN0IE1BWF9SRVNUQVJUX0FUVEVNUFRTID0gMztcbmNvbnN0IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TID0gMV8wMDA7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJDb25maWcge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIHRva2VuTmFtZTogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgcGxhblR5cGU/OiBzdHJpbmc7XG4gIHdvcmtlckluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXF1ZXN0IHtcbiAgaW5wdXQ6IFR1cm5TdGFydFBhcmFtc1tcImlucHV0XCJdO1xuICBvdXRwdXRTY2hlbWE/OiBUdXJuU3RhcnRQYXJhbXNbXCJvdXRwdXRTY2hlbWFcIl07XG4gIGVmZm9ydD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIGRldmVsb3Blckluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaGlzdG9yeT86IFRocmVhZEluamVjdEl0ZW1zUGFyYW1zW1wiaXRlbXNcIl07XG4gIHZlcmJvc2l0eT86IHN0cmluZztcbiAgcmVhc29uaW5nU3VtbWFyeT86IHN0cmluZztcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlc3VsdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgbW9kZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1DYWxsYmFja3Mge1xuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbkNvbXBsZXRlOiAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB2b2lkO1xuICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBvblRocmVhZElkPzogKHRocmVhZElkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uVHVybklkPzogKHR1cm5JZDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vLyB0aHJlYWQvc3RhcnQg6rO17Ya1IOyYteyFmFxuY29uc3QgVEhSRUFEX0RFRkFVTFRTID0ge1xuICBzYW5kYm94OiBcInJlYWQtb25seVwiLFxuICBhcHByb3ZhbFBvbGljeTogXCJuZXZlclwiLFxuICBjb25maWc6IHtcbiAgICBhcHBzOiB7IF9kZWZhdWx0OiB7IGVuYWJsZWQ6IGZhbHNlLCBkZXN0cnVjdGl2ZV9lbmFibGVkOiBmYWxzZSwgb3Blbl93b3JsZF9lbmFibGVkOiBmYWxzZSB9IH0sXG4gIH0sXG59IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPjtcblxuY29uc3QgQkFTRV9JTlNUUlVDVElPTlMgPSB7XG4gIHRleHQ6IFwiWW91IGFyZSBhIGhlbHBmdWwgYXNzaXN0YW50LiBEbyBub3QgdXNlIGFueSB0b29scyBzdWNoIGFzIHNoZWxsLCBmaWxlIG9wZXJhdGlvbnMsIG9yIHdlYiBzZWFyY2guIFJlc3BvbmQgd2l0aCB0ZXh0IG9ubHkuXCIsXG4gIHdpdGhTY2hlbWE6IFwiWW91IGFyZSBhIGhlbHBmdWwgYXNzaXN0YW50LiBSZXNwb25kIHVzaW5nIHRoZSBwcm92aWRlZCBvdXRwdXQgc2NoZW1hLlwiLFxufSBhcyBjb25zdDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgYWN0aXZlID0gdHJ1ZTtcbiAgb25SZWFkeT86ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IFdvcmtlckNvbmZpZykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGNvbmZpZy53b3JrZXJJbmRleCAhPT0gdW5kZWZpbmVkID8gYC0ke2NvbmZpZy53b3JrZXJJbmRleH1gIDogXCJcIjtcbiAgICB0aGlzLmNvZGV4SG9tZSA9IGAvdG1wL3FncmlkLWNvZGV4LyR7Y29uZmlnLnRva2VuSWR9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7IFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLCBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnJwYyA9IG51bGw7XG4gICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucnBjID0gbmV3IENvZGV4UnBjQ2xpZW50KHRoaXMucHJvYyk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gcmVhZHlgKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5zcGF3bkFuZEluaXQoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYyEucmVxdWVzdDx7IGF1dGhVcmw6IHN0cmluZyB9PihcImFjY291bnQvbG9naW4vc3RhcnRcIiwge1xuICAgICAgdHlwZTogXCJjaGF0Z3B0XCIsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gYnJvd3NlciBsb2dpbiBzdGFydGVkYCk7XG4gICAgcmV0dXJuIHJlc3VsdC5hdXRoVXJsO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvckJyb3dzZXJMb2dpbkNvbXBsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckxvZ2luQ29tcGxldGVkKCk7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPSAwO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gY29tcGxldGVkYCk7XG4gIH1cblxuICBhc3luYyByZWFkTWFuYWdlZENyZWRlbnRpYWxzKCk6IFByb21pc2U8e1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgaWRUb2tlbj86IHN0cmluZztcbiAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgfSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoYCR7dGhpcy5jb2RleEhvbWV9L2F1dGguanNvbmAsIFwidXRmLThcIikpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHJhdy50b2tlbnM/LmFjY2Vzc190b2tlbiA/PyBcIlwiLFxuICAgICAgICByZWZyZXNoVG9rZW46IHJhdy50b2tlbnM/LnJlZnJlc2hfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgaWRUb2tlbjogcmF3LnRva2Vucz8uaWRfdG9rZW4sXG4gICAgICAgIGFjY291bnRJZDogcmF3LnRva2Vucz8uYWNjb3VudF9pZCA/PyBcIlwiLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLnJwYz8uZGVzdHJveSgpO1xuXG4gICAgaWYgKHRoaXMucHJvYykge1xuICAgICAgdGhpcy5wcm9jLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2M/LmtpbGwoXCJTSUdLSUxMXCIpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgM18wMDApO1xuICAgICAgICB0aGlzLnByb2MhLm9uKFwiZXhpdFwiLCAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJtU3luYyh0aGlzLmNvZGV4SG9tZSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIGdldCBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWR5ICYmICF0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveWVkO1xuICB9XG4gIGdldCB0b2tlbklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRva2VuSWQ7XG4gIH1cbiAgZ2V0IHRva2VuTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbk5hbWU7XG4gIH1cblxuICAvLyDilIDilIAgUmF0ZSBsaW1pdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0cygpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHJldHVybiB0aGlzLnJwYy5yZXF1ZXN0KFwiYWNjb3VudC9yYXRlTGltaXRzL3JlYWRcIiwge30pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNlcnZlci1yZXF1ZXN0IGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgc2V0U2VydmVyUmVxdWVzdEhhbmRsZXIoaGFuZGxlcjogKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICBhc3luYyBzdGFydFRocmVhZChcbiAgICByZXE6IFR1cm5SZXF1ZXN0LFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZzsgdHVybklkOiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfT4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG5cbiAgICBjb25zdCB0aHJlYWRDb25maWc6IFRocmVhZFN0YXJ0UGFyYW1zW1wiY29uZmlnXCJdID0ge1xuICAgICAgLi4uVEhSRUFEX0RFRkFVTFRTLmNvbmZpZyxcbiAgICAgIC4uLihyZXEudmVyYm9zaXR5ID8geyBtb2RlbF92ZXJib3NpdHk6IHJlcS52ZXJib3NpdHkgfSA6IHt9KSxcbiAgICB9O1xuICAgIGNvbnN0IHsgdGhyZWFkLCBtb2RlbDogdGhyZWFkTW9kZWwgfSA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8VGhyZWFkU3RhcnRSZXNwb25zZT4oXG4gICAgICBcInRocmVhZC9zdGFydFwiLFxuICAgICAge1xuICAgICAgICBlcGhlbWVyYWw6IHRydWUsXG4gICAgICAgIGN3ZDogYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGAsXG4gICAgICAgIGJhc2VJbnN0cnVjdGlvbnM6IHJlcS5vdXRwdXRTY2hlbWEgPyBCQVNFX0lOU1RSVUNUSU9OUy53aXRoU2NoZW1hIDogQkFTRV9JTlNUUlVDVElPTlMudGV4dCxcbiAgICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zID8/IFwiXCIsXG4gICAgICAgIHNhbmRib3g6IFRIUkVBRF9ERUZBVUxUUy5zYW5kYm94LFxuICAgICAgICBhcHByb3ZhbFBvbGljeTogVEhSRUFEX0RFRkFVTFRTLmFwcHJvdmFsUG9saWN5LFxuICAgICAgICBjb25maWc6IHRocmVhZENvbmZpZyxcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+LFxuICAgICk7XG5cbiAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZC5pZDtcbiAgICBjb25zdCBtb2RlbCA9IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbDtcbiAgICBpZiAocmVxLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInRocmVhZC9pbmplY3RfaXRlbXNcIiwge1xuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgaXRlbXM6IHJlcS5oaXN0b3J5LFxuICAgICAgfSBzYXRpc2ZpZXMgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdHVybiB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUdXJuU3RhcnRSZXNwb25zZT4oXCJ0dXJuL3N0YXJ0XCIsIHtcbiAgICAgIHRocmVhZElkLFxuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICAgIC4uLihyZXEub3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHJlcS5vdXRwdXRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEuZWZmb3J0ID8geyBlZmZvcnQ6IHJlcS5lZmZvcnQgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEubW9kZWwgPyB7IG1vZGVsOiByZXEubW9kZWwgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEucmVhc29uaW5nU3VtbWFyeSA/IHsgc3VtbWFyeTogcmVxLnJlYXNvbmluZ1N1bW1hcnkgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEuc2VydmljZVRpZXIgPyB7IHNlcnZpY2VUaWVyOiByZXEuc2VydmljZVRpZXIgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHRocmVhZElkLCB0dXJuSWQ6IHR1cm4uaWQsIG1vZGVsIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihyZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTxUdXJuUmVzdWx0PiB7XG4gICAgY29uc3QgeyB0aHJlYWRJZCwgbW9kZWwgfSA9IGF3YWl0IHRoaXMuc3RhcnRUaHJlYWQocmVxKTtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lVHVybk5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKHJlcTogVHVyblJlcXVlc3QsIGNiOiBTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRocmVhZElkLCB0dXJuSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VGhyZWFkKHJlcSk7XG4gICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICBjYi5vblR1cm5JZD8uKHR1cm5JZCk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYik7XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwidHVybi9pbnRlcnJ1cHRcIiwgeyB0aHJlYWRJZCwgdHVybklkIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVR1cm5Ob3RpZmljYXRpb25zKHRocmVhZElkOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBQcm9taXNlPFR1cm5SZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHVyblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS50b3RhbDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgZHVyYXRpb25NcyA9IHAudHVybi5kdXJhdGlvbk1zID8/IDA7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHJlc29sdmUoeyB0ZXh0LCB1c2FnZSwgZHVyYXRpb25NcywgbW9kZWwgfSk7XG4gICAgICAgIGVsc2UgcmVqZWN0KG5ldyBFcnJvcihgdHVybiBmYWlsZWQ6ICR7SlNPTi5zdHJpbmdpZnkocC50dXJuLmVycm9yKX1gKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGNiLm9uRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIHVzYWdlID0gcC50b2tlblVzYWdlLnRvdGFsO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGlmIChwLnR1cm4uc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgY2Iub25Db21wbGV0ZSh7IHRleHQsIHVzYWdlLCBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLCBtb2RlbCB9KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGB0dXJuICR7cC50dXJuLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocC50dXJuLmVycm9yKX1gKTtcbiAgICAgICAgICBjYi5vbkVycm9yKGVycik7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJlcnJvclwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFwLndpbGxSZXRyeSkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYGNvZGV4IGVycm9yOiAke3AuZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICBjYi5vbkVycm9yKGVycik7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlc3RhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8IHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICBpZiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gbWF4IHJlc3RhcnQgYXR0ZW1wdHMgcmVhY2hlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzKys7XG4gICAgY29uc3QgYmFzZURlbGF5ID0gUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgKiAyICoqICh0aGlzLnJlc3RhcnRBdHRlbXB0cyAtIDEpO1xuICAgIGNvbnN0IHN0YWdnZXIgPSAodGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMCkgKiAyXzAwMDtcbiAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheSArIHN0YWdnZXI7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfVske3RoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDB9XSByZXN0YXJ0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLnJlc3RhcnRBdHRlbXB0c30pYCxcbiAgICApO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMub25SZWFkeT8uKCkpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IHJlc3RhcnQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZXN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFhQSxNQUFNLFNBQVMsVUFBVSxDQUFD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
436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgdHlwZSBUaHJlYWRJbmplY3RJdGVtc1BhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRJbmplY3RJdGVtc1BhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IENvZGV4UnBjQ2xpZW50IH0gZnJvbSBcIi4vY29kZXgtcnBjXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcImNvZGV4LXdvcmtlclwiXSk7XG5cbmNvbnN0IE1BWF9SRVNUQVJUX0FUVEVNUFRTID0gMztcbmNvbnN0IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TID0gMV8wMDA7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJDb25maWcge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIHRva2VuTmFtZTogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgcGxhblR5cGU/OiBzdHJpbmc7XG4gIHdvcmtlckluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXF1ZXN0IHtcbiAgaW5wdXQ6IFR1cm5TdGFydFBhcmFtc1tcImlucHV0XCJdO1xuICBvdXRwdXRTY2hlbWE/OiBUdXJuU3RhcnRQYXJhbXNbXCJvdXRwdXRTY2hlbWFcIl07XG4gIGVmZm9ydD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIGRldmVsb3Blckluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaGlzdG9yeT86IFRocmVhZEluamVjdEl0ZW1zUGFyYW1zW1wiaXRlbXNcIl07XG4gIHZlcmJvc2l0eT86IHN0cmluZztcbiAgcmVhc29uaW5nU3VtbWFyeT86IHN0cmluZztcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlc3VsdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgbW9kZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1DYWxsYmFja3Mge1xuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbkNvbXBsZXRlOiAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB2b2lkO1xuICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBvblRocmVhZElkPzogKHRocmVhZElkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uVHVybklkPzogKHR1cm5JZDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG50eXBlIFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMgPSBQaWNrPFdvcmtlckNvbmZpZywgXCJhY2Nlc3NUb2tlblwiIHwgXCJhY2NvdW50SWRcIiB8IFwicGxhblR5cGVcIj47XG50eXBlIEFjdGl2ZVR1cm5BYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5cbi8vIHRocmVhZC9zdGFydCDqs7XthrUg7Ji17IWYXG5jb25zdCBUSFJFQURfREVGQVVMVFMgPSB7XG4gIHNhbmRib3g6IFwicmVhZC1vbmx5XCIsXG4gIGFwcHJvdmFsUG9saWN5OiBcIm5ldmVyXCIsXG4gIGNvbmZpZzoge1xuICAgIGFwcHM6IHsgX2RlZmF1bHQ6IHsgZW5hYmxlZDogZmFsc2UsIGRlc3RydWN0aXZlX2VuYWJsZWQ6IGZhbHNlLCBvcGVuX3dvcmxkX2VuYWJsZWQ6IGZhbHNlIH0gfSxcbiAgfSxcbn0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+O1xuXG5jb25zdCBCQVNFX0lOU1RSVUNUSU9OUyA9IHtcbiAgdGV4dDogXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIERvIG5vdCB1c2UgYW55IHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC4gUmVzcG9uZCB3aXRoIHRleHQgb25seS5cIixcbiAgd2l0aFNjaGVtYTogXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIFJlc3BvbmQgdXNpbmcgdGhlIHByb3ZpZGVkIG91dHB1dCBzY2hlbWEuXCIsXG59IGFzIGNvbnN0O1xuXG4vLyBjb2RleOqwgCDrp6Qg7JqU7LKt7JeQIOyekOuPmSDso7zsnoXtlZjripQg64K07J6lIHRvb2woc2hlbGwvd2ViX3NlYXJjaC9zcGF3bl9hZ2VudCDrk7EgMTTqsJwp6rO8XG4vLyBpbnN0cnVjdGlvbiDruJTroZ0ocGVybWlzc2lvbnMvZW52aXJvbm1lbnRfY29udGV4dC9za2lsbHMsIH4xMEtCKeydhCDruYTtmZzshLHtmZRcbi8vICRDT0RFWF9IT01FL2NvbmZpZy50b21sIOuhnCDsjajrhKPsnLzrqbQgY29kZXgg67aA7YyFIOyLnCBzY2FuXG4vLyDthrXsoJzrtojqsIA6IHVwZGF0ZV9wbGFuL3JlcXVlc3RfdXNlcl9pbnB1dFxuY29uc3QgQ09ERVhfQ09ORklHX1RPTUwgPSBgd2ViX3NlYXJjaCA9IFwiZGlzYWJsZWRcIlxuaW5jbHVkZV9wZXJtaXNzaW9uc19pbnN0cnVjdGlvbnMgPSBmYWxzZVxuaW5jbHVkZV9hcHBzX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2Vudmlyb25tZW50X2NvbnRleHQgPSBmYWxzZVxuXG5bZmVhdHVyZXNdXG5zaGVsbF90b29sID0gZmFsc2VcbnRvb2xfc2VhcmNoID0gZmFsc2VcbnRvb2xfc3VnZ2VzdCA9IGZhbHNlXG5tdWx0aV9hZ2VudCA9IGZhbHNlXG5pbWFnZV9nZW5lcmF0aW9uID0gZmFsc2VcbmFwcHMgPSBmYWxzZVxucGx1Z2lucyA9IGZhbHNlXG5cblt0b29sc11cbnZpZXdfaW1hZ2UgPSBmYWxzZVxuXG5bc2tpbGxzXVxuaW5jbHVkZV9pbnN0cnVjdGlvbnMgPSBmYWxzZVxuYDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVUdXJuQWJvcnQ/OiBBY3RpdmVUdXJuQWJvcnQ7XG4gIGFjdGl2ZSA9IHRydWU7XG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkO1xuICAvLyByZXN0YXJ0IOyLnCBycGMg6rCd7LK06rCAIOyDiOuhnCDsg53shLHrkJjrr4DroZwsIO2VuOuTpOufrOulvCDrs7TqtIDtlojri6TqsIAg66ekIHNwYXdu66eI64ukIOyerOuwlOyduOuUqe2VnOuLpC5cbiAgc2VydmVyUmVxdWVzdEhhbmRsZXI/OiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gY29uZmlnLndvcmtlckluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7Y29uZmlnLndvcmtlckluZGV4fWAgOiBcIlwiO1xuICAgIHRoaXMuY29kZXhIb21lID0gYC90bXAvcWdyaWQtY29kZXgvJHtjb25maWcudG9rZW5JZH0ke3N1ZmZpeH1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGFzeW5jIHNwYXduQW5kSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjd2QgPSBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYDtcbiAgICBta2RpclN5bmMoY3dkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBjb2RleCDrgrTsnqUgdG9vbC93ZWJfc2VhcmNoL2luc3RydWN0aW9uIOu4lOuhnSDruYTtmZzshLHtmZRcbiAgICB3cml0ZUZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9jb25maWcudG9tbGAsIENPREVYX0NPTkZJR19UT01MKTtcblxuICAgIHRoaXMucHJvYyA9IHNwYXduKFwiY29kZXhcIiwgW1wiYXBwLXNlcnZlclwiLCBcIi0tbGlzdGVuXCIsIFwic3RkaW86Ly9cIl0sIHtcbiAgICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICBjd2QsXG4gICAgICBlbnY6IHtcbiAgICAgICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICAgICAgVE1QRElSOiBwcm9jZXNzLmVudi5UTVBESVIsXG4gICAgICAgIENPREVYX0hPTUU6IHRoaXMuY29kZXhIb21lLFxuICAgICAgICAvLyBlbnZpcm9ubWVudCDruYTtmZzshLHtmZQg4oaSIGhhc19lbnZpcm9ubWVudD1mYWxzZSDihpIgc2hlbGwvYXBwbHlfcGF0Y2gvdmlld19pbWFnZSDsoJzqsbBcbiAgICAgICAgQ09ERVhfRVhFQ19TRVJWRVJfVVJMOiBcIm5vbmVcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBleGl0ZWQgKGNvZGU9JHtjb2RlfSlgKTtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oXG4gICAgICAgIG5ldyBFcnJvcihgY29kZXggd29ya2VyIGV4aXRlZCB3aGlsZSB0dXJuIHdhcyBydW5uaW5nIChjb2RlPSR7Y29kZSA/PyBcInVua25vd25cIn0pYCksXG4gICAgICApO1xuICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgdGhpcy5ycGMgPSBudWxsO1xuICAgICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHRoaXMuc2NoZWR1bGVSZXN0YXJ0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJwYyA9IG5ldyBDb2RleFJwY0NsaWVudCh0aGlzLnByb2MpO1xuICAgIC8vIHJlc3RhcnQg7ZuE7JeQ64+EIHJlZnJlc2ggc2VydmVyLXJlcXVlc3Qg7ZW465Ok65+s66W8IOycoOyngCAo7JeG7Jy866m0IGNvZGV4IO2GoO2BsCDtmozsoIQg7Iuk7YyoIOKGkiBzZXNzaW9uIGV4cGlyZWQpXG4gICAgdGhpcy5iaW5kU2VydmVyUmVxdWVzdEhhbmRsZXIoKTtcblxuICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJpbml0aWFsaXplXCIsIHtcbiAgICAgIGNsaWVudEluZm86IHsgbmFtZTogXCJxZ3JpZFwiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSxcbiAgICAgIGNhcGFiaWxpdGllczogeyBleHBlcmltZW50YWxBcGk6IHRydWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FpdEZvckxvZ2luQ29tcGxldGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKFwibG9naW4gdGltZW91dFwiKSksIDEyMF8wMDApO1xuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiYWNjb3VudC9sb2dpbi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAocC5zdWNjZXNzKSByZXNvbHZlKCk7XG4gICAgICAgIGVsc2UgcmVqZWN0KG5ldyBFcnJvcihgbG9naW4gZmFpbGVkOiAke3AuZXJyb3IgPz8gXCJ1bmtub3duXCJ9YCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYyEucmVxdWVzdChcImFjY291bnQvbG9naW4vc3RhcnRcIiwge1xuICAgICAgdHlwZTogXCJjaGF0Z3B0QXV0aFRva2Vuc1wiLFxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuLFxuICAgICAgY2hhdGdwdEFjY291bnRJZDogdGhpcy5jb25maWcuYWNjb3VudElkLFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnBsYW5UeXBlID8geyBjaGF0Z3B0UGxhblR5cGU6IHRoaXMuY29uZmlnLnBsYW5UeXBlIH0gOiB7fSksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZWFkeWApO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRCcm93c2VyTG9naW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0PHsgYXV0aFVybDogc3RyaW5nIH0+KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRcIixcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIHN0YXJ0ZWRgKTtcbiAgICByZXR1cm4gcmVzdWx0LmF1dGhVcmw7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gYnJvd3NlciBsb2dpbiBjb21wbGV0ZWRgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vYXV0aC5qc29uYCwgXCJ1dGYtOFwiKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmF3LnRva2Vucz8uYWNjZXNzX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmF3LnRva2Vucz8ucmVmcmVzaF90b2tlbiA/PyBcIlwiLFxuICAgICAgICBpZFRva2VuOiByYXcudG9rZW5zPy5pZF90b2tlbixcbiAgICAgICAgYWNjb3VudElkOiByYXcudG9rZW5zPy5hY2NvdW50X2lkID8/IFwiXCIsXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4obmV3IEVycm9yKFwiY29kZXggd29ya2VyIHN0b3BwZWRcIikpO1xuICAgIHRoaXMucnBjPy5kZXN0cm95KCk7XG5cbiAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICB0aGlzLnByb2Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvYz8ua2lsbChcIlNJR0tJTExcIik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzXzAwMCk7XG4gICAgICAgIHRoaXMucHJvYyEub24oXCJleGl0XCIsICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkgJiYgIXRoaXMuZGVzdHJveWVkO1xuICB9XG4gIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IHRva2VuSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5JZDtcbiAgfVxuICBnZXQgdG9rZW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRva2VuTmFtZTtcbiAgfVxuXG4gIGNhblJldXNlRm9yVG9rZW4oX3Rva2VuTmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPT09IGNyZWRlbnRpYWxzLmFjY291bnRJZCAmJlxuICAgICAgKHRoaXMuY29uZmlnLnBsYW5UeXBlID8/IHVuZGVmaW5lZCkgPT09IChjcmVkZW50aWFscy5wbGFuVHlwZSA/PyB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVRva2VuU3RhdGUodG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudG9rZW5OYW1lID0gdG9rZW5OYW1lO1xuICAgIHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuID0gY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5jb25maWcuYWNjb3VudElkID0gY3JlZGVudGlhbHMuYWNjb3VudElkO1xuICAgIGlmIChjcmVkZW50aWFscy5wbGFuVHlwZSkge1xuICAgICAgdGhpcy5jb25maWcucGxhblR5cGUgPSBjcmVkZW50aWFscy5wbGFuVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLnBsYW5UeXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZXRSYXRlTGltaXRzKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgcmV0dXJuIHRoaXMucnBjLnJlcXVlc3QoXCJhY2NvdW50L3JhdGVMaW1pdHMvcmVhZFwiLCB7fSk7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICBhc3luYyBzdGFydFRocmVhZChcbiAgICByZXE6IFR1cm5SZXF1ZXN0LFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZzsgdHVybklkOiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfT4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG5cbiAgICBjb25zdCB0aHJlYWRDb25maWc6IFRocmVhZFN0YXJ0UGFyYW1zW1wiY29uZmlnXCJdID0ge1xuICAgICAgLi4uVEhSRUFEX0RFRkFVTFRTLmNvbmZpZyxcbiAgICAgIC4uLihyZXEudmVyYm9zaXR5ID8geyBtb2RlbF92ZXJib3NpdHk6IHJlcS52ZXJib3NpdHkgfSA6IHt9KSxcbiAgICB9O1xuICAgIGNvbnN0IHsgdGhyZWFkLCBtb2RlbDogdGhyZWFkTW9kZWwgfSA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8VGhyZWFkU3RhcnRSZXNwb25zZT4oXG4gICAgICBcInRocmVhZC9zdGFydFwiLFxuICAgICAge1xuICAgICAgICBlcGhlbWVyYWw6IHRydWUsXG4gICAgICAgIGN3ZDogYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGAsXG4gICAgICAgIGJhc2VJbnN0cnVjdGlvbnM6IHJlcS5vdXRwdXRTY2hlbWEgPyBCQVNFX0lOU1RSVUNUSU9OUy53aXRoU2NoZW1hIDogQkFTRV9JTlNUUlVDVElPTlMudGV4dCxcbiAgICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zID8/IFwiXCIsXG4gICAgICAgIHNhbmRib3g6IFRIUkVBRF9ERUZBVUxUUy5zYW5kYm94LFxuICAgICAgICBhcHByb3ZhbFBvbGljeTogVEhSRUFEX0RFRkFVTFRTLmFwcHJvdmFsUG9saWN5LFxuICAgICAgICBjb25maWc6IHRocmVhZENvbmZpZyxcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+LFxuICAgICk7XG5cbiAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZC5pZDtcbiAgICBjb25zdCBtb2RlbCA9IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbDtcbiAgICBpZiAocmVxLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInRocmVhZC9pbmplY3RfaXRlbXNcIiwge1xuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgaXRlbXM6IHJlcS5oaXN0b3J5LFxuICAgICAgfSBzYXRpc2ZpZXMgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdHVybiB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUdXJuU3RhcnRSZXNwb25zZT4oXCJ0dXJuL3N0YXJ0XCIsIHtcbiAgICAgIHRocmVhZElkLFxuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICAgIC4uLihyZXEub3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHJlcS5vdXRwdXRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEuZWZmb3J0ID8geyBlZmZvcnQ6IHJlcS5lZmZvcnQgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEubW9kZWwgPyB7IG1vZGVsOiByZXEubW9kZWwgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEucmVhc29uaW5nU3VtbWFyeSA/IHsgc3VtbWFyeTogcmVxLnJlYXNvbmluZ1N1bW1hcnkgfSA6IHt9KSxcbiAgICAgIC4uLihyZXEuc2VydmljZVRpZXIgPyB7IHNlcnZpY2VUaWVyOiByZXEuc2VydmljZVRpZXIgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHRocmVhZElkLCB0dXJuSWQ6IHR1cm4uaWQsIG1vZGVsIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihyZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTxUdXJuUmVzdWx0PiB7XG4gICAgY29uc3QgeyB0aHJlYWRJZCwgbW9kZWwgfSA9IGF3YWl0IHRoaXMuc3RhcnRUaHJlYWQocmVxKTtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lVHVybk5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKHJlcTogVHVyblJlcXVlc3QsIGNiOiBTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRocmVhZElkLCB0dXJuSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VGhyZWFkKHJlcSk7XG4gICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICBjYi5vblR1cm5JZD8uKHR1cm5JZCk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYik7XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwidHVybi9pbnRlcnJ1cHRcIiwgeyB0aHJlYWRJZCwgdHVybklkIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgZmFpbEFjdGl2ZVR1cm4oZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnQgPSB0aGlzLmFjdGl2ZVR1cm5BYm9ydDtcbiAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICBhYm9ydD8uKGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVR1cm5Ob3RpZmljYXRpb25zKHRocmVhZElkOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBQcm9taXNlPFR1cm5SZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHVyblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBsZXQgZHVyYXRpb25NcyA9IDA7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aFJlc3VsdCA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB0ZXh0ID0gcC5pdGVtLnRleHQ7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UudG90YWw7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidHVybi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGR1cmF0aW9uTXMgPSBwLnR1cm4uZHVyYXRpb25NcyA/PyAwO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikgZmluaXNoV2l0aFJlc3VsdCh7IHRleHQsIHVzYWdlLCBkdXJhdGlvbk1zLCBtb2RlbCB9KTtcbiAgICAgICAgZWxzZSBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuIGZhaWxlZDogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJlcnJvclwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFwLndpbGxSZXRyeSkge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYGNvZGV4IGVycm9yOiAke3AuZXJyb3IubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lU3RyZWFtTm90aWZpY2F0aW9ucyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgYWJvcnQ6IEFjdGl2ZVR1cm5BYm9ydDtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihcInR1cm4gdGltZW91dCAoNjAwcylcIikpO1xuICAgICAgfSwgNjAwXzAwMCk7XG5cbiAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgIGxldCB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93biA9IHtcbiAgICAgICAgdG90YWxUb2tlbnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLFxuICAgICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9PT0gYWJvcnQpIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgY2Iub25FcnJvcihlcnJvcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoQ29tcGxldGUgPSAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdGV4dCArPSBwLmRlbHRhO1xuICAgICAgICBjYi5vbkRlbHRhKHAuZGVsdGEpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS50b3RhbDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoQ29tcGxldGUoeyB0ZXh0LCB1c2FnZSwgZHVyYXRpb25NczogcC50dXJuLmR1cmF0aW9uTXMgPz8gMCwgbW9kZWwgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgdHVybiAke3AudHVybi5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXN0YXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZXN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCB0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgaWYgKHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IG1heCByZXN0YXJ0IGF0dGVtcHRzIHJlYWNoZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cysrO1xuICAgIGNvbnN0IGJhc2VEZWxheSA9IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TICogMiAqKiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgLSAxKTtcbiAgICBjb25zdCBzdGFnZ2VyID0gKHRoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDApICogMl8wMDA7XG4gICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKyBzdGFnZ2VyO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX1bJHt0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwfV0gcmVzdGFydGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5yZXN0YXJ0QXR0ZW1wdHN9KWAsXG4gICAgKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRpYWxpemUoKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm9uUmVhZHk/LigpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZXN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBYUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGVBQWUsQ0FBQztBQUVuRCxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLDBCQUEwQjtBQTRDaEMsTUFBTSxrQkFBa0I7Q0FDdEIsU0FBUztDQUNULGdCQUFnQjtDQUNoQixRQUFRLEVBQ04sTUFBTSxFQUFFLFVBQVU7RUFBRSxTQUFTO0VBQU8scUJBQXFCO0VBQU8sb0JBQW9CO0VBQU8sRUFBRSxFQUM5RjtDQUNGO0FBRUQsTUFBTSxvQkFBb0I7Q0FDeEIsTUFBTTtDQUNOLFlBQVk7Q0FDYjtBQU1ELE1BQU0sb0JBQW9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCMUIsSUFBYSx1QkFBYixNQUFrQztDQUNoQyxPQUFvQztDQUNwQyxNQUFxQztDQUNyQztDQUNBLGtCQUEwQjtDQUMxQixRQUFnQjtDQUNoQixZQUFvQjtDQUNwQixPQUFlO0NBQ2Y7Q0FDQSxTQUFTO0NBQ1Q7Q0FFQTtDQUVBLFlBQVksUUFBOEI7QUFBdEIsT0FBQSxTQUFBO0VBQ2xCLE1BQU0sU0FBUyxPQUFPLGdCQUFnQixTQUFZLElBQUksT0FBTyxnQkFBZ0I7QUFDN0UsT0FBSyxZQUFZLG9CQUFvQixPQUFPLFVBQVU7O0NBS3hELE1BQWMsZUFBOEI7RUFDMUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxVQUFVO0FBQzlCLFlBQVUsS0FBSyxFQUFFLFdBQVcsTUFBTSxDQUFDO0FBRW5DLGdCQUFjLEdBQUcsS0FBSyxVQUFVLGVBQWUsa0JBQWtCO0FBRWpFLE9BQUssT0FBTyxNQUFNLFNBQVM7R0FBQztHQUFjO0dBQVk7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
@@ -53,6 +53,16 @@ var OpenAIDispatcher = class OpenAIDispatcher {
53
53
  }
54
54
  async onTokenUpdated(id, name, credentials) {
55
55
  const existing = this.workerPool.get(id) ?? [];
56
+ if (existing.length === 0) {
57
+ await this.spawnWorkers(id, name, credentials);
58
+ return;
59
+ }
60
+ if (existing.every((w) => w.canReuseForToken(name, credentials))) {
61
+ existing.forEach((w) => w.updateTokenState(name, credentials));
62
+ logger.info(`workers updated in-place for token ${id} (${name})`);
63
+ this.drainQueue();
64
+ return;
65
+ }
56
66
  this.workerPool.delete(id);
57
67
  await Promise.allSettled(existing.map((w) => w.kill()));
58
68
  await this.spawnWorkers(id, name, credentials);
@@ -322,4 +332,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
322
332
  //#endregion
323
333
  export { OpenAIDispatcher };
324
334
 
325
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG4gIHR5cGUgVHVyblJlcXVlc3QsXG4gIHR5cGUgVHVyblJlc3VsdCxcbn0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktZGlzcGF0Y2hlclwiXSk7XG5cbmNvbnN0IERFRkFVTFRfRUZGT1JUID0gXCJsb3dcIjtcbmNvbnN0IE1BWF9XT1JLRVJTX1BFUl9UT0tFTiA9IDU7XG5jb25zdCBXT1JLRVJTX1BFUl9UT0tFTiA9IE1hdGgubWluKFxuICBOdW1iZXIocHJvY2Vzcy5lbnYuUUdSSURfV09SS0VSU19QRVJfVE9LRU4gPz8gMyksXG4gIE1BWF9XT1JLRVJTX1BFUl9UT0tFTixcbik7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG50eXBlIFF1ZXVlSXRlbSA9IHtcbiAgcmVzb2x2ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IHZvaWQ7XG4gIHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBhYm9ydENsZWFudXA/OiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHJyQ3Vyc29yID0gMDtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBvcGVuYWlUb2tlbnMgPSByb3dzLmZpbHRlcigodCkgPT4gdC5wcm92aWRlciA9PT0gXCJvcGVuYWlcIik7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgc3RhcnRpbmcgJHtvcGVuYWlUb2tlbnMubGVuZ3RofSBvcGVuYWkgdG9rZW5zICgke1dPUktFUlNfUEVSX1RPS0VOfSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2Vycyh0LmlkLCB0Lm5hbWUsIHQuY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMpO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIHRoaXMud29ya2VyUG9vbC5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscyk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQgZm9yIHRva2VuICR7aWR9OiAke3dvcmtlcnMubGVuZ3RofWApO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblVwZGF0ZWQoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChleGlzdGluZy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIG9uVG9rZW5EZWFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgKHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdKS5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgZGVhY3RpdmF0ZWQ6IHRva2VuICR7aWR9YCk7XG4gIH1cblxuICBvblRva2VuQWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAodGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW10pLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmRyYWluUXVldWUoKTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6IHRva2VuICR7aWR9YCk7XG4gIH1cblxuICAvLyDilIDilIAgR2VuZXJhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZ2VuZXJhdGUocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5hY3F1aXJlSWRsZVdvcmtlcigpO1xuICAgIGlmICh3b3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3b3JrZXIudG9rZW5OYW1lfVske3dvcmtlci50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCh3KSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dy50b2tlbk5hbWV9WyR7dy50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIHF1ZXVlZClgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IFN0cmVhbUNhbGxiYWNrcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoKTtcbiAgICBpZiAod29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7d29ya2VyLnRva2VuTmFtZX1bJHt3b3JrZXIudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCh3KSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dy50b2tlbk5hbWV9WyR7dy50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIFtzdHJlYW1dLCBxdWV1ZWQpYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlU3RyZWFtVHVybih3LCByZXEsIGNiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQ6IHN0cmluZywgdHVybklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxXb3JrZXJzID0gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLmZpbHRlcigodykgPT4gdy5pc1JlYWR5KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYWxsV29ya2Vycy5tYXAoKHcpID0+IHcuaW50ZXJydXB0VHVybih0aHJlYWRJZCwgdHVybklkKSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdvcmtlciBzZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vICDquLDrs7ggcm91bmQtcm9iaW5cbiAgLy8gVE9ETzog7LaU7ZuEIOuLpOuluCDslYzqs6DrpqzsppjsnLzroZwg67OA6rK9IOqwgOuKpe2VmOqyjCDsp4Dsm5BcbiAgYWNxdWlyZUlkbGVXb3JrZXIoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsIHtcbiAgICBjb25zdCBhbGxXb3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBpZiAoYWxsV29ya2Vycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsV29ya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdyA9IGFsbFdvcmtlcnNbKHRoaXMucnJDdXJzb3IgKyBpKSAlIGFsbFdvcmtlcnMubGVuZ3RoXSE7XG4gICAgICBpZiAody50cnlBY3F1aXJlVHVybigpKSB7XG4gICAgICAgIHRoaXMucnJDdXJzb3IgPSAodGhpcy5yckN1cnNvciArIGkgKyAxKSAlIGFsbFdvcmtlcnMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSAmJiB3LmFjdGl2ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUXVldWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZW5xdWV1ZTxUPihleGVjdXRlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5PX09QRU5BSV9XT1JLRVJTXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID49IE1BWF9RVUVVRV9TSVpFKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVGcm9tUXVldWUoaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICBjb25zdCBpZHggPSB0aGlzLnF1ZXVlLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGlkeCAhPT0gLTEpIHRoaXMucXVldWUuc3BsaWNlKGlkeCwgMSk7XG4gIH1cblxuICByZWplY3RBbGxRdWV1ZWQocmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocmVhc29uKTtcbiAgICB0aGlzLnF1ZXVlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgIGl0ZW0ucmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICB9XG5cbiAgZHJhaW5RdWV1ZShyZWxlYXNlZFdvcmtlcj86IENvZGV4QXBwU2VydmVyV29ya2VyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgcmVsZWFzZWRXb3JrZXIgJiZcbiAgICAgIHRoaXMucXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIuaXNSZWFkeSAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIuYWN0aXZlICYmXG4gICAgICByZWxlYXNlZFdvcmtlci50cnlBY3F1aXJlVHVybigpXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZS5zaGlmdCgpITtcbiAgICAgIG5leHQucmVzb2x2ZShyZWxlYXNlZFdvcmtlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy5hY3F1aXJlSWRsZVdvcmtlcigpO1xuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWUuc2hpZnQoKSE7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMuZHJhaW5RdWV1ZSh3b3JrZXIpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIGNvbnN0IHR1cm5SZXE6IFR1cm5SZXF1ZXN0ID0ge1xuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICBoaXN0b3J5OiByZXEuaGlzdG9yeSxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdDogVHVyblJlc3VsdCA9IGF3YWl0IHdvcmtlci5leGVjdXRlVHVybih0dXJuUmVxKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICB1c2FnZTogcmVzdWx0LnVzYWdlLFxuICAgICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBTdHJlYW1DYWxsYmFja3MsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHR1cm5SZXE6IFR1cm5SZXF1ZXN0ID0ge1xuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICBoaXN0b3J5OiByZXEuaGlzdG9yeSxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICB9O1xuICAgIGNvbnN0IHdyYXBwZWRDYjogU3RyZWFtQ2FsbGJhY2tzID0ge1xuICAgICAgLi4uY2IsXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoeyAuLi5yZXN1bHQsIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSB9IGFzIFR1cm5SZXN1bHQgJiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXT1JLRVJTX1BFUl9UT0tFTjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgICAgIGxvZ2dlci5pbmZvKGAke3dvcmtlcnMubGVuZ3RofS8ke1dPUktFUlNfUEVSX1RPS0VOfSB3b3JrZXJzIHNwYXduZWQgZm9yICR7dG9rZW5OYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMuZHJhaW5RdWV1ZSgpO1xuXG4gICAgd29ya2VyLnNldFNlcnZlclJlcXVlc3RIYW5kbGVyKGFzeW5jIChtZXRob2QpID0+IHtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHNlcnZlci1yZXF1ZXN0OiAke21ldGhvZH1gKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JrZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dIChpZD0ke3Rva2VuSWQgKyAxfSlgKTtcbiAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciBzcGF3biBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBkYXRhOiB1bmtub3duOyBjYWNoZWRBdDogbnVtYmVyIH0+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0cyh0b2tlbk5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IHRva2VuTmFtZSA/PyBcIl9kZWZhdWx0XCI7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTCkge1xuICAgICAgcmV0dXJuIGNhY2hlZC5kYXRhO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGNvbnN0IHdvcmtlciA9IHRva2VuTmFtZSA/IGFsbFdvcmtlcnMuZmluZCgodykgPT4gdy50b2tlbk5hbWUgPT09IHRva2VuTmFtZSkgOiBhbGxXb3JrZXJzWzBdO1xuICAgIGlmICghd29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFkeSBvcGVuYWkgd29ya2Vyc1wiKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgd29ya2VyLmdldFJhdGVMaW1pdHMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5zZXQoY2FjaGVLZXksIHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCkgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsb0JBQW9CLENBQUM7QUFFeEQsTUFBTSxpQkFBaUI7QUFFdkIsTUFBTSxvQkFBb0IsS0FBSyxJQUM3QixPQUFPLFFBQVEsSUFBSSwyQkFBMkIsRUFBRSxFQUZwQixFQUk3QjtBQUNELE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CO0FBRTFCLFNBQVMsTUFBTSxJQUEyQjtBQUN4QyxRQUFPLElBQUksU0FBUyxZQUFZLFdBQVcsU0FBUyxHQUFHLENBQUM7O0FBVTFELElBQWEsbUJBQWIsTUFBYSxpQkFBK0M7Q0FDMUQsNkJBQWEsSUFBSSxLQUFxQztDQUN0RCxXQUFXO0NBQ1gsUUFBcUIsRUFB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
335
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG4gIHR5cGUgVHVyblJlcXVlc3QsXG4gIHR5cGUgVHVyblJlc3VsdCxcbn0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktZGlzcGF0Y2hlclwiXSk7XG5cbmNvbnN0IERFRkFVTFRfRUZGT1JUID0gXCJsb3dcIjtcbmNvbnN0IE1BWF9XT1JLRVJTX1BFUl9UT0tFTiA9IDU7XG5jb25zdCBXT1JLRVJTX1BFUl9UT0tFTiA9IE1hdGgubWluKFxuICBOdW1iZXIocHJvY2Vzcy5lbnYuUUdSSURfV09SS0VSU19QRVJfVE9LRU4gPz8gMyksXG4gIE1BWF9XT1JLRVJTX1BFUl9UT0tFTixcbik7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG50eXBlIFF1ZXVlSXRlbSA9IHtcbiAgcmVzb2x2ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IHZvaWQ7XG4gIHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBhYm9ydENsZWFudXA/OiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHJyQ3Vyc29yID0gMDtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBvcGVuYWlUb2tlbnMgPSByb3dzLmZpbHRlcigodCkgPT4gdC5wcm92aWRlciA9PT0gXCJvcGVuYWlcIik7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgc3RhcnRpbmcgJHtvcGVuYWlUb2tlbnMubGVuZ3RofSBvcGVuYWkgdG9rZW5zICgke1dPUktFUlNfUEVSX1RPS0VOfSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2Vycyh0LmlkLCB0Lm5hbWUsIHQuY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMpO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIHRoaXMud29ya2VyUG9vbC5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscyk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQgZm9yIHRva2VuICR7aWR9OiAke3dvcmtlcnMubGVuZ3RofWApO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblVwZGF0ZWQoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlIGZvciB0b2tlbiAke2lkfSAoJHtuYW1lfSlgKTtcbiAgICAgIHRoaXMuZHJhaW5RdWV1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMud29ya2VyUG9vbC5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChleGlzdGluZy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIG9uVG9rZW5EZWFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgKHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdKS5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgZGVhY3RpdmF0ZWQ6IHRva2VuICR7aWR9YCk7XG4gIH1cblxuICBvblRva2VuQWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAodGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW10pLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmRyYWluUXVldWUoKTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6IHRva2VuICR7aWR9YCk7XG4gIH1cblxuICAvLyDilIDilIAgR2VuZXJhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZ2VuZXJhdGUocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5hY3F1aXJlSWRsZVdvcmtlcigpO1xuICAgIGlmICh3b3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3b3JrZXIudG9rZW5OYW1lfVske3dvcmtlci50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCh3KSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dy50b2tlbk5hbWV9WyR7dy50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIHF1ZXVlZClgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IFN0cmVhbUNhbGxiYWNrcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoKTtcbiAgICBpZiAod29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7d29ya2VyLnRva2VuTmFtZX1bJHt3b3JrZXIudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCh3KSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dy50b2tlbk5hbWV9WyR7dy50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIFtzdHJlYW1dLCBxdWV1ZWQpYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlU3RyZWFtVHVybih3LCByZXEsIGNiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQ6IHN0cmluZywgdHVybklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxXb3JrZXJzID0gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLmZpbHRlcigodykgPT4gdy5pc1JlYWR5KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYWxsV29ya2Vycy5tYXAoKHcpID0+IHcuaW50ZXJydXB0VHVybih0aHJlYWRJZCwgdHVybklkKSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdvcmtlciBzZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vICDquLDrs7ggcm91bmQtcm9iaW5cbiAgLy8gVE9ETzog7LaU7ZuEIOuLpOuluCDslYzqs6DrpqzsppjsnLzroZwg67OA6rK9IOqwgOuKpe2VmOqyjCDsp4Dsm5BcbiAgYWNxdWlyZUlkbGVXb3JrZXIoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsIHtcbiAgICBjb25zdCBhbGxXb3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBpZiAoYWxsV29ya2Vycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsV29ya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdyA9IGFsbFdvcmtlcnNbKHRoaXMucnJDdXJzb3IgKyBpKSAlIGFsbFdvcmtlcnMubGVuZ3RoXSE7XG4gICAgICBpZiAody50cnlBY3F1aXJlVHVybigpKSB7XG4gICAgICAgIHRoaXMucnJDdXJzb3IgPSAodGhpcy5yckN1cnNvciArIGkgKyAxKSAlIGFsbFdvcmtlcnMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSAmJiB3LmFjdGl2ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUXVldWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZW5xdWV1ZTxUPihleGVjdXRlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5PX09QRU5BSV9XT1JLRVJTXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID49IE1BWF9RVUVVRV9TSVpFKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVGcm9tUXVldWUoaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICBjb25zdCBpZHggPSB0aGlzLnF1ZXVlLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGlkeCAhPT0gLTEpIHRoaXMucXVldWUuc3BsaWNlKGlkeCwgMSk7XG4gIH1cblxuICByZWplY3RBbGxRdWV1ZWQocmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocmVhc29uKTtcbiAgICB0aGlzLnF1ZXVlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgIGl0ZW0ucmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICB9XG5cbiAgZHJhaW5RdWV1ZShyZWxlYXNlZFdvcmtlcj86IENvZGV4QXBwU2VydmVyV29ya2VyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgcmVsZWFzZWRXb3JrZXIgJiZcbiAgICAgIHRoaXMucXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIuaXNSZWFkeSAmJlxuICAgICAgcmVsZWFzZWRXb3JrZXIuYWN0aXZlICYmXG4gICAgICByZWxlYXNlZFdvcmtlci50cnlBY3F1aXJlVHVybigpXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZS5zaGlmdCgpITtcbiAgICAgIG5leHQucmVzb2x2ZShyZWxlYXNlZFdvcmtlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy5hY3F1aXJlSWRsZVdvcmtlcigpO1xuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWUuc2hpZnQoKSE7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMuZHJhaW5RdWV1ZSh3b3JrZXIpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIGNvbnN0IHR1cm5SZXE6IFR1cm5SZXF1ZXN0ID0ge1xuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICBoaXN0b3J5OiByZXEuaGlzdG9yeSxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdDogVHVyblJlc3VsdCA9IGF3YWl0IHdvcmtlci5leGVjdXRlVHVybih0dXJuUmVxKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICB1c2FnZTogcmVzdWx0LnVzYWdlLFxuICAgICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBTdHJlYW1DYWxsYmFja3MsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHR1cm5SZXE6IFR1cm5SZXF1ZXN0ID0ge1xuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICBoaXN0b3J5OiByZXEuaGlzdG9yeSxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICB9O1xuICAgIGNvbnN0IHdyYXBwZWRDYjogU3RyZWFtQ2FsbGJhY2tzID0ge1xuICAgICAgLi4uY2IsXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoeyAuLi5yZXN1bHQsIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSB9IGFzIFR1cm5SZXN1bHQgJiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXT1JLRVJTX1BFUl9UT0tFTjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgICAgIGxvZ2dlci5pbmZvKGAke3dvcmtlcnMubGVuZ3RofS8ke1dPUktFUlNfUEVSX1RPS0VOfSB3b3JrZXJzIHNwYXduZWQgZm9yICR7dG9rZW5OYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMuZHJhaW5RdWV1ZSgpO1xuXG4gICAgd29ya2VyLnNldFNlcnZlclJlcXVlc3RIYW5kbGVyKGFzeW5jIChtZXRob2QpID0+IHtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHNlcnZlci1yZXF1ZXN0OiAke21ldGhvZH1gKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JrZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dIChpZD0ke3Rva2VuSWQgKyAxfSlgKTtcbiAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciBzcGF3biBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBkYXRhOiB1bmtub3duOyBjYWNoZWRBdDogbnVtYmVyIH0+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0cyh0b2tlbk5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IHRva2VuTmFtZSA/PyBcIl9kZWZhdWx0XCI7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTCkge1xuICAgICAgcmV0dXJuIGNhY2hlZC5kYXRhO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGNvbnN0IHdvcmtlciA9IHRva2VuTmFtZSA/IGFsbFdvcmtlcnMuZmluZCgodykgPT4gdy50b2tlbk5hbWUgPT09IHRva2VuTmFtZSkgOiBhbGxXb3JrZXJzWzBdO1xuICAgIGlmICghd29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFkeSBvcGVuYWkgd29ya2Vyc1wiKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgd29ya2VyLmdldFJhdGVMaW1pdHMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5zZXQoY2FjaGVLZXksIHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCkgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsb0JBQW9CLENBQUM7QUFFeEQsTUFBTSxpQkFBaUI7QUFFdkIsTUFBTSxvQkFBb0IsS0FBSyxJQUM3QixPQUFPLFFBQVEsSUFBSSwyQkFBMkIsRUFBRSxFQUZwQixFQUk3QjtBQUNELE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CO0FBRTFCLFNBQVMsTUFBTSxJQUEyQjtBQUN4QyxRQUFPLElBQUksU0FBUyxZQUFZLFdBQVcsU0FBUyxHQUFHLENBQUM7O0FBVTFELElBQWEsbUJBQWIsTUFBYSxpQkFBK0M7Q0FDMUQsNkJBQWEsSUFBSSxLQUFxQztDQUN0RCxXQUFXO0NBQ1gsUUFBcUIsRUFBRTtDQUV2QixNQUFNLFFBQXVCO0VBQzNCLE1BQU0sRUFBRSxTQUFTLE1BQU0sV0FBVyxTQUFTLElBQUk7RUFDL0MsTUFBTSxlQUFlLEtBQUssUUFBUSxNQUFNLEVBQUUsYUFBYSxTQUFTO0FBQ2hFLFNBQU8sS0FDTCxZQUFZLGFBQWEsT0FBTyxrQkFBa0Isa0JBQWtCLGdCQUNyRTtBQUVELFFBQU0sUUFBUSxXQUNaLGFBQWEsSUFBSSxPQUFPLE1BQU07QUFDNUIsU0FBTSxLQUFLLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQWlDO0FBQ3pFLE9BQUksQ0FBQyxFQUFFLE9BQVEsTUFBSyxtQkFBbUIsRUFBRSxHQUFHO0lBQzVDLENBQ0g7O0NBR0gsTUFBTSxPQUFzQjtBQUMxQixPQUFLLGdCQUFnQixzQkFBc0I7RUFDM0MsTUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUN2RSxRQUFNLFFBQVEsV0FBVyxNQUFNO0FBQy9CLE9BQUssV0FBVyxPQUFPOztDQUt6QixNQUFNLGFBQWEsSUFBWSxNQUFjLGFBQStDO0FBQzFGLE1BQUksS0FBSyxXQUFXLElBQUksR0FBRyxDQUFFO0FBQzdCLFFBQU0sS0FBSyxhQUFhLElBQUksTUFBTSxZQUFZOztDQUdoRCxNQUFNLGVBQWUsSUFBMkI7RUFDOUMsTUFBTSxVQUFVLEtBQUssV0FBVyxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQzdDLE9BQUssV0FBVyxPQUFPLEdBQUc7QUFDMUIsUUFBTSxRQUFRLFdBQVcsUUFBUSxLQUFLLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RCxNQUFJLEtBQUssMEJBQTBCLENBQUMsV0FBVyxFQUM3QyxNQUFLLGdCQUFnQixvQkFBb0I7QUFFM0MsTUFBSSxRQUFRLFNBQVMsRUFBRyxRQUFPLEtBQUssNkJBQTZCLEdBQUcsSUFBSSxRQUFRLFNBQVM7O0NBRzNGLE1BQU0sZUFBZSxJQUFZLE1BQWMsYUFBK0M7RUFDNUYsTUFBTSxXQUFXLEtBQUssV0FBVyxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQzlDLE1BQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsU0FBTSxLQUFLLGFBQWEsSUFBSSxNQUFNLFlBQVk7QUFDOUM7O0FBR0YsTUFBSSxTQUFTLE9BQU8sTUFBTSxFQUFFLGlCQUFpQixNQUFNLFlBQVksQ0FBQyxFQUFFO0FBQ2hFLFlBQVMsU0FBUyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sWUFBWSxDQUFDO0FBQzlELFVBQU8sS0FBSyxzQ0FBc0MsR0FBRyxJQUFJLEtBQUssR0FBRztBQUNqRSxRQUFLLFlBQVk7QUFDakI7O0FBR0YsT0FBSyxXQUFXLE9BQU8sR0FBRztBQUMxQixRQUFNLFFBQVEsV0FBVyxTQUFTLEtBQUssTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELFFBQU0sS0FBSyxhQUFhLElBQUksTUFBTSxZQUFZOztDQUdoRCxtQkFBbUIsSUFBa0I7QUFDbkMsR0FBQyxLQUFLLFdBQVcsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLFNBQVMsTUFBTTtBQUM3QyxLQUFFLFNBQVM7SUFDWDtBQUNGLE1BQUksS0FBSywwQkFBMEIsQ0FBQyxXQUFXLEVBQzdDLE1BQUssZ0JBQWdCLG9CQUFvQjtBQUUzQyxTQUFPLEtBQUssOEJBQThCLEtBQUs7O0NBR2pELGlCQUFpQixJQUFrQjtBQUNqQyxHQUFDLEtBQUssV0FBVyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsU0FBUyxNQUFNO0FBQzdDLEtBQUUsU0FBUztJQUNYO0FBQ0YsT0FBSyxZQUFZO0FBQ2pCLFNBQU8sS0FBSyw0QkFBNEIsS0FBSzs7Q0FLL0MsTUFBTSxTQUFTLEtBQStDO0VBQzVELE1BQU0sU0FBUyxLQUFLLG1CQUFtQjtBQUN2QyxNQUFJLFFBQVE7QUFDVixVQUFPLEtBQUssS0FBSyxPQUFPLFVBQVUsR0FBRyxPQUFPLFFBQVEsWUFBWSxJQUFJLE1BQU0sR0FBRztBQUM3RSxVQUFPLEtBQUssa0JBQWtCLFNBQVMsTUFBTSxLQUFLLFlBQVksR0FBRyxJQUFJLENBQUM7O0FBRXhFLFNBQU8sS0FBSyxTQUFTLE1BQU07QUFDekIsVUFBTyxLQUFLLEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRSxRQUFRLFlBQVksSUFBSSxNQUFNLFdBQVc7QUFDM0UsVUFBTyxLQUFLLFlBQVksR0FBRyxJQUFJO0lBQy9COztDQUdKLE1BQU0sZUFBZSxLQUFzQixJQUFvQztFQUM3RSxNQUFNLFNBQVMsS0FBSyxtQkFBbUI7QUFDdkMsTUFBSSxRQUFRO0FBQ1YsVUFBTyxLQUFLLEtBQUssT0FBTyxVQUFVLEdBQUcsT0FBTyxRQUFRLFlBQVksSUFBSSxNQUFNLGFBQWE7QUFDdkYsVUFBTyxLQUFLLGtCQUFrQixTQUFTLE1BQU0sS0FBSyxrQkFBa0IsR0FBRyxLQUFLLEdBQUcsQ0FBQzs7QUFFbEYsU0FBTyxLQUFLLFNBQVMsTUFBTTtBQUN6QixVQUFPLEtBQUssS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFLFFBQVEsWUFBWSxJQUFJLE1BQU0scUJBQXFCO0FBQ3JGLFVBQU8sS0FBSyxrQkFBa0IsR0FBRyxLQUFLLEdBQUc7SUFDekM7O0NBR0osTUFBTSxvQkFBb0IsVUFBa0IsUUFBK0I7RUFDekUsTUFBTSxhQUFhLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsTUFBTSxFQUFFLFFBQVE7QUFDaEYsUUFBTSxRQUFRLFdBQVcsV0FBVyxLQUFLLE1BQU0sRUFBRSxjQUFjLFVBQVUsT0FBTyxDQUFDLENBQUM7O0NBTXBGLG9CQUFpRDtFQUMvQyxNQUFNLGFBQWEsS0FBSywwQkFBMEI7QUFDbEQsTUFBSSxXQUFXLFdBQVcsRUFBRyxRQUFPO0FBQ3BDLE9BQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxXQUFXLFFBQVEsS0FBSztHQUMxQyxNQUFNLElBQUksWUFBWSxLQUFLLFdBQVcsS0FBSyxXQUFXO0FBQ3RELE9BQUksRUFBRSxnQkFBZ0IsRUFBRTtBQUN0QixTQUFLLFlBQVksS0FBSyxXQUFXLElBQUksS0FBSyxXQUFXO0FBQ3JELFdBQU87OztBQUdYLFNBQU87O0NBR1QsMkJBQW1EO0FBQ2pELFNBQU8sQ0FBQyxHQUFHLEtBQUssV0FBVyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU87O0NBS2xGLFFBQVcsU0FBbUU7QUFDNUUsTUFBSSxLQUFLLDBCQUEwQixDQUFDLFdBQVcsRUFDN0MsUUFBTyxRQUFRLHVCQUFPLElBQUksTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxNQUFJLEtBQUssTUFBTSxVQUFVLGVBQ3ZCLFFBQU8sUUFBUSx1QkFBTyxJQUFJLE1BQU0sY0FBYyxDQUFDO0FBR2pELFNBQU8sSUFBSSxTQUFZLFNBQVMsV0FBVztHQUN6QyxNQUFNLE9BQWtCO0lBQ3RCLFVBQVUsV0FBVztBQUNuQixrQkFBYSxLQUFLLE1BQU07QUFDeEIsVUFBSyxnQkFBZ0I7QUFDckIsYUFBUSxTQUFTLENBQ2QsV0FBVyxLQUFLLGtCQUFrQixRQUFRLFFBQVEsQ0FBQyxDQUNuRCxLQUFLLFNBQVMsT0FBTzs7SUFFMUIsU0FBUyxRQUFRO0FBQ2Ysa0JBQWEsS0FBSyxNQUFNO0FBQ3hCLFVBQUssZ0JBQWdCO0FBQ3JCLFlBQU8sSUFBSTs7SUFFYixPQUFPLGlCQUFpQjtBQUN0QixVQUFLLGdCQUFnQixLQUFLO0FBQzFCLDRCQUFPLElBQUksTUFBTSxjQUFjLENBQUM7T0FDL0IsaUJBQWlCO0lBQ3JCO0FBRUQsUUFBSyxNQUFNLEtBQUssS0FBSztJQUNyQjs7Q0FHSixnQkFBZ0IsTUFBdUI7QUFDckMsZUFBYSxLQUFLLE1BQU07QUFDeEIsT0FBSyxnQkFBZ0I7RUFDckIsTUFBTSxNQUFNLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFDcEMsTUFBSSxRQUFRLEdBQUksTUFBSyxNQUFNLE9BQU8sS0FBSyxFQUFFOztDQUczQyxnQkFBZ0IsUUFBc0I7RUFDcEMsTUFBTSxNQUFNLElBQUksTUFBTSxPQUFPO0FBQzdCLE9BQUssTUFBTSxTQUFTLFNBQVM7QUFDM0IsZ0JBQWEsS0FBSyxNQUFNO0FBQ3hCLFFBQUssZ0JBQWdCO0FBQ3JCLFFBQUssT0FBTyxJQUFJO0lBQ2hCO0FBQ0YsT0FBSyxRQUFRLEVBQUU7O0NBR2pCLFdBQVcsZ0JBQTZDO0FBQ3RELE1BQ0Usa0JBQ0EsS0FBSyxNQUFNLFNBQVMsS0FDcEIsZUFBZSxXQUNmLGVBQWUsVUFDZixlQUFlLGdCQUFnQixFQUMvQjtBQUVBLEdBRGEsS0FBSyxNQUFNLE9BQU8sQ0FDMUIsUUFBUSxlQUFlO0FBQzVCOztBQUdGLFNBQU8sS0FBSyxNQUFNLFNBQVMsR0FBRztHQUM1QixNQUFNLFNBQVMsS0FBSyxtQkFBbUI7QUFDdkMsT0FBSSxDQUFDLE9BQVE7QUFFYixHQURhLEtBQUssTUFBTSxPQUFPLENBQzFCLFFBQVEsT0FBTzs7O0NBTXhCLE1BQU0sa0JBQ0osUUFDQSxTQUNZO0FBQ1osTUFBSTtBQUNGLFVBQU8sTUFBTSxRQUFRLE9BQU87WUFDcEI7QUFDUixVQUFPLGFBQWE7QUFDcEIsUUFBSyxXQUFXLE9BQU87OztDQUkzQixNQUFNLFlBQVksUUFBOEIsS0FBK0M7RUFDN0YsTUFBTSxVQUF1QjtHQUMzQixPQUFPLElBQUk7R0FDWCx1QkFBdUIsSUFBSTtHQUMzQixjQUFjLElBQUk7R0FDbEIsUUFBUSxJQUFJLFVBQVU7R0FDdEIsT0FBTyxJQUFJO0dBQ1gsU0FBUyxJQUFJO0dBQ2IsV0FBVyxJQUFJO0dBQ2Ysa0JBQWtCLElBQUk7R0FDdEIsYUFBYSxJQUFJO0dBQ2xCO0VBQ0QsTUFBTSxTQUFxQixNQUFNLE9BQU8sWUFBWSxRQUFRO0FBQzVELFNBQU87R0FDTCxNQUFNLE9BQU87R0FDYixXQUFXLE9BQU87R0FDbEIsT0FBTyxPQUFPO0dBQ2QsWUFBWSxPQUFPO0dBQ25CLE9BQU8sT0FBTztHQUNmOztDQUdILE1BQU0sa0JBQ0osUUFDQSxLQUNBLElBQ2U7RUFDZixNQUFNLFVBQXVCO0dBQzNCLE9BQU8sSUFBSTtHQUNYLHVCQUF1QixJQUFJO0dBQzNCLGNBQWMsSUFBSTtHQUNsQixRQUFRLElBQUksVUFBVTtHQUN0QixPQUFPLElBQUk7R0FDWCxTQUFTLElBQUk7R0FDYixXQUFXLElBQUk7R0FDZixrQkFBa0IsSUFBSTtHQUN0QixhQUFhLElBQUk7R0FDbEI7RUFDRCxNQUFNLFlBQTZCO0dBQ2pDLEdBQUc7R0FDSCxhQUFhLFdBQVc7QUFDdEIsT0FBRyxXQUFXO0tBQUUsR0FBRztLQUFRLFdBQVcsT0FBTztLQUFXLENBRXREOztHQUVMO0FBQ0QsUUFBTSxPQUFPLGtCQUFrQixTQUFTLFVBQVU7O0NBS3BELE1BQU0sYUFDSixTQUNBLFdBQ0EsYUFDZTtFQUNmLE1BQU0sVUFBa0MsRUFBRTtBQUMxQyxPQUFLLElBQUksSUFBSSxHQUFHLElBQUksbUJBQW1CLEtBQUs7QUFDMUMsT0FBSSxJQUFJLEVBQUcsT0FBTSxNQUFNLGtCQUFrQjtHQUN6QyxNQUFNLFNBQVMsTUFBTSxLQUFLLGtCQUFrQixTQUFTLFdBQVcsYUFBYSxFQUFFO0FBQy9FLE9BQUksT0FBUSxTQUFRLEtBQUssT0FBTzs7QUFFbEMsTUFBSSxRQUFRLFNBQVMsR0FBRztBQUN0QixRQUFLLFdBQVcsSUFBSSxTQUFTLFFBQVE7QUFDckMsVUFBTyxLQUFLLEdBQUcsUUFBUSxPQUFPLEdBQUcsa0JBQWtCLHVCQUF1QixZQUFZOzs7Q0FJMUYsTUFBTSxrQkFDSixTQUNBLFdBQ0EsYUFDQSxhQUNzQztFQUN0QyxNQUFNLFNBQVMsSUFBSSxxQkFBcUI7R0FDdEM7R0FDQTtHQUNBLGFBQWEsWUFBWTtHQUN6QixXQUFXLFlBQVk7R0FDdkIsVUFBVSxZQUFZO0dBQ3RCO0dBQ0QsQ0FBQztBQUVGLFNBQU8sZ0JBQWdCLEtBQUssWUFBWTtBQUV4QyxTQUFPLHdCQUF3QixPQUFPLFdBQVc7QUFDL0MsT0FBSSxXQUFXLG9DQUNiLFFBQU8sK0JBQStCLFFBQVE7QUFFaEQsU0FBTSxJQUFJLE1BQU0sNkJBQTZCLFNBQVM7SUFDdEQ7QUFFRixNQUFJO0FBQ0YsU0FBTSxPQUFPLFlBQVk7QUFDekIsVUFBTyxLQUFLLG1CQUFtQixVQUFVLEdBQUcsWUFBWSxRQUFRLFVBQVUsRUFBRSxHQUFHO0FBQy9FLFVBQU87V0FDQSxHQUFHO0FBQ1YsVUFBTyxLQUFLLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxLQUFNLEVBQVksVUFBVTtBQUN6RixTQUFNLE9BQU8sTUFBTSxDQUFDLFlBQVksR0FBRztBQUNuQyxVQUFPOzs7Q0FNWCxrQ0FBa0IsSUFBSSxLQUFrRDtDQUN4RSxPQUFnQix3QkFBd0I7Q0FFeEMsTUFBTSxjQUFjLFdBQXNDO0VBQ3hELE1BQU0sV0FBVyxhQUFhO0VBQzlCLE1BQU0sU0FBUyxLQUFLLGdCQUFnQixJQUFJLFNBQVM7QUFDakQsTUFBSSxVQUFVLEtBQUssS0FBSyxHQUFHLE9BQU8sV0FBVyxpQkFBaUIsc0JBQzVELFFBQU8sT0FBTztFQUdoQixNQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxNQUFNLEVBQUUsUUFBUTtFQUNoRixNQUFNLFNBQVMsWUFBWSxXQUFXLE1BQU0sTUFBTSxFQUFFLGNBQWMsVUFBVSxHQUFHLFdBQVc7QUFDMUYsTUFBSSxDQUFDLE9BQVEsT0FBTSxJQUFJLE1BQU0sMEJBQTBCO0VBQ3ZELE1BQU0sT0FBTyxNQUFNLE9BQU8sZUFBZTtBQUN6QyxPQUFLLGdCQUFnQixJQUFJLFVBQVU7R0FBRTtHQUFNLFVBQVUsS0FBSyxLQUFLO0dBQUUsQ0FBQztBQUNsRSxTQUFPOztDQUtULGVBSVc7Q0FFWCxNQUFNLGtCQUFrQixNQUE0QztBQUNsRSxNQUFJLEtBQUssY0FBYztBQUNyQixRQUFLLGFBQWEsT0FBTyxNQUFNLENBQUMsWUFBWSxHQUFHO0FBQy9DLGdCQUFhLEtBQUssYUFBYSxNQUFNO0FBQ3JDLFFBQUssZUFBZTs7RUFJdEIsTUFBTSxTQUFTLElBQUkscUJBQXFCO0dBQ3RDLFNBRmEsS0FBSyxLQUFLO0dBR3ZCLFdBQVc7R0FDWCxhQUFhO0dBQ2IsV0FBVztHQUNaLENBQUM7RUFFRixNQUFNLFVBQVUsTUFBTSxPQUFPLG1CQUFtQjtBQVVoRCxPQUFLLGVBQWU7R0FBRTtHQUFRO0dBQU0sT0FSdEIsaUJBQWlCO0FBQzdCLFFBQUksS0FBSyxjQUFjLFdBQVcsUUFBUTtBQUN4QyxZQUFPLEtBQUssNkJBQTZCLEtBQUssa0JBQWtCO0FBQ2hFLFlBQU8sTUFBTSxDQUFDLFlBQVksR0FBRztBQUM3QixVQUFLLGVBQWU7O01BRXJCLElBQVE7R0FFZ0M7QUFDM0MsU0FBTyxFQUFFLFNBQVM7O0NBR3BCLElBQUksbUJBQWtDO0FBQ3BDLFNBQU8sS0FBSyxjQUFjLFFBQVE7O0NBR3BDLE1BQU0sdUJBS0g7QUFDRCxNQUFJLENBQUMsS0FBSyxhQUFjLE9BQU0sSUFBSSxNQUFNLG1CQUFtQjtFQUMzRCxNQUFNLEVBQUUsUUFBUSxVQUFVLEtBQUs7QUFFL0IsTUFBSTtBQUNGLFNBQU0sT0FBTyw2QkFBNkI7R0FDMUMsTUFBTSxRQUFRLE1BQU0sT0FBTyx3QkFBd0I7QUFDbkQsT0FBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0seUNBQXlDO0FBQ3JFLFVBQU87WUFDQztBQUNSLGdCQUFhLE1BQU07QUFDbkIsUUFBSyxlQUFlO0FBQ3BCLFNBQU0sT0FBTyxNQUFNLENBQUMsWUFBWSxHQUFHOzs7Q0FNdkMsSUFBSSxjQUFzQjtBQUN4QixTQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDOztDQUc5QyxJQUFJLG1CQUEyQjtBQUM3QixTQUFPLENBQUMsR0FBRyxLQUFLLFdBQVcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsTUFBTSxFQUFFLFFBQVEsQ0FBQzs7Q0FHdkUsSUFBSSxjQUFzQjtBQUN4QixTQUFPLEtBQUssTUFBTSJ9