gitlab-ci-local 4.26.2 → 4.27.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.
package/src/job.js CHANGED
@@ -32,6 +32,8 @@ const camelcase_1 = __importDefault(require("camelcase"));
32
32
  const exit_error_1 = require("./types/exit-error");
33
33
  const utils_1 = require("./utils");
34
34
  const asserts_1 = require("./asserts");
35
+ const cache_entry_1 = require("./cache-entry");
36
+ const mutex_1 = require("./mutex");
35
37
  class Job {
36
38
  constructor(opt) {
37
39
  this._prescriptsExitCode = null;
@@ -39,17 +41,17 @@ class Job {
39
41
  this._coveragePercent = null;
40
42
  this._running = false;
41
43
  this._containerId = null;
42
- this._serviceIds = [];
43
44
  this._serviceNetworkId = null;
44
- this._artifactsContainerId = null;
45
45
  this._containerVolumeNames = [];
46
46
  this._longRunningSilentTimeout = -1;
47
47
  this._producers = null;
48
+ this._containersToClean = [];
48
49
  const jobData = opt.data;
49
50
  const gitData = opt.gitData;
50
51
  const globals = opt.globals;
51
- const homeVariables = opt.homeVariables;
52
- const projectVariables = opt.projectVariables;
52
+ const variablesFromFiles = opt.variablesFromFiles;
53
+ const cliVariables = opt.cliVariables;
54
+ this.mountCache = opt.mountCache;
53
55
  this.extraHosts = opt.extraHosts;
54
56
  this.volumes = opt.volumes;
55
57
  this.writeStreams = opt.writeStreams;
@@ -63,11 +65,9 @@ class Job {
63
65
  this.shellIsolation = opt.shellIsolation;
64
66
  this.when = jobData.when || "on_success";
65
67
  this.allowFailure = jobData.allow_failure ?? false;
66
- this._needs = jobData.needs || null;
67
68
  this.dependencies = jobData.dependencies || null;
68
69
  this.rules = jobData.rules || null;
69
70
  this.environment = typeof jobData.environment === "string" ? { name: jobData.environment } : jobData.environment;
70
- this.cache = jobData.cache || [];
71
71
  let CI_PROJECT_DIR = `${this.cwd}`;
72
72
  if (this.imageName) {
73
73
  CI_PROJECT_DIR = `/builds/${this.safeJobName}`;
@@ -101,12 +101,14 @@ class Job {
101
101
  CI_JOB_ID: `${this.jobId}`,
102
102
  CI_PIPELINE_ID: `${this.pipelineIid + 1000}`,
103
103
  CI_PIPELINE_IID: `${this.pipelineIid}`,
104
- CI_SERVER_HOST: `${gitData.remote.domain}`,
105
- CI_SERVER_URL: `https://${gitData.remote.domain}:443`,
106
- CI_API_V4_URL: `https://${gitData.remote.domain}/api/v4`,
107
- CI_PROJECT_URL: `https://${gitData.remote.domain}/${gitData.remote.group}/${gitData.remote.project}`,
108
- CI_JOB_URL: `https://${gitData.remote.domain}/${gitData.remote.group}/${gitData.remote.project}/-/jobs/${this.jobId}`,
109
- CI_PIPELINE_URL: `https://${gitData.remote.domain}/${gitData.remote.group}/${gitData.remote.project}/pipelines/${this.pipelineIid}`,
104
+ CI_SERVER_HOST: `${gitData.remote.host}`,
105
+ CI_SERVER_PORT: `${gitData.remote.port}`,
106
+ CI_SERVER_URL: `https://${gitData.remote.host}:443`,
107
+ CI_SERVER_PROTOCOL: "https",
108
+ CI_API_V4_URL: `https://${gitData.remote.host}/api/v4`,
109
+ CI_PROJECT_URL: `https://${gitData.remote.host}/${gitData.remote.group}/${gitData.remote.project}`,
110
+ CI_JOB_URL: `https://${gitData.remote.host}/${gitData.remote.group}/${gitData.remote.project}/-/jobs/${this.jobId}`,
111
+ CI_PIPELINE_URL: `https://${gitData.remote.host}/${gitData.remote.group}/${gitData.remote.project}/pipelines/${this.pipelineIid}`,
110
112
  CI_JOB_NAME: `${this.name}`,
111
113
  CI_JOB_STAGE: `${this.stage}`,
112
114
  CI_REGISTRY: gitData.CI_REGISTRY,
@@ -114,10 +116,10 @@ class Job {
114
116
  GITLAB_CI: "false",
115
117
  };
116
118
  // Create expanded variables
117
- const envs = { ...predefinedVariables, ...globals.variables || {}, ...jobData.variables || {}, ...homeVariables, ...projectVariables };
119
+ const envs = { ...predefinedVariables, ...globals.variables || {}, ...jobData.variables || {}, ...variablesFromFiles, ...cliVariables };
118
120
  const expandedGlobalVariables = utils_1.Utils.expandVariables(globals.variables || {}, envs);
119
121
  const expandedJobVariables = utils_1.Utils.expandVariables(jobData.variables || {}, envs);
120
- this.expandedVariables = { ...predefinedVariables, ...expandedGlobalVariables, ...expandedJobVariables, ...homeVariables, ...projectVariables };
122
+ this.expandedVariables = { ...predefinedVariables, ...expandedGlobalVariables, ...expandedJobVariables, ...variablesFromFiles, ...cliVariables };
121
123
  // Set {when, allowFailure} based on rules result
122
124
  if (this.rules) {
123
125
  const ruleResult = utils_1.Utils.getRulesResult(this.rules, this.expandedVariables);
@@ -130,14 +132,16 @@ class Job {
130
132
  if (this.injectSSHAgent && this.imageName === null) {
131
133
  throw new exit_error_1.ExitError(`${this.chalkJobName} @InjectSSHAgent can only be used with image:`);
132
134
  }
133
- }
134
- static async getUniqueCacheName(cwd, cacheEntry, expandedVariables) {
135
- if (typeof cacheEntry.key === "string") {
136
- return utils_1.Utils.expandText(cacheEntry.key);
135
+ if (this.imageName && this.mountCache) {
136
+ for (const c of this.cache) {
137
+ c.paths.forEach((p) => {
138
+ const path = utils_1.Utils.expandText(p, this.expandedVariables);
139
+ if (path.includes("*")) {
140
+ throw new exit_error_1.ExitError(`${this.name} cannot have * in cache paths, when --mount-cache is enabled`);
141
+ }
142
+ });
143
+ }
137
144
  }
138
- return "md-" + await utils_1.Utils.checksumFiles(cacheEntry.key.files.map(f => {
139
- return `${cwd}/${utils_1.Utils.expandText(f, expandedVariables)}`;
140
- }));
141
145
  }
142
146
  get artifactsToSource() {
143
147
  return this.jobData["artifactsToSource"] == null ? true : this.jobData["artifactsToSource"];
@@ -149,10 +153,11 @@ class Job {
149
153
  return utils_1.Utils.getSafeJobName(this.name);
150
154
  }
151
155
  get needs() {
152
- if (!this._needs)
156
+ const needs = this.jobData["needs"];
157
+ if (!needs)
153
158
  return null;
154
159
  const list = [];
155
- this._needs?.forEach((need) => {
160
+ needs.forEach((need) => {
156
161
  list.push({
157
162
  job: typeof need === "string" ? need : need.job,
158
163
  artifacts: typeof need === "string" ? true : need.artifacts,
@@ -160,6 +165,29 @@ class Job {
160
165
  });
161
166
  return list;
162
167
  }
168
+ get cache() {
169
+ let cacheData = this.jobData["cache"];
170
+ const cacheList = [];
171
+ if (!cacheData)
172
+ return [];
173
+ cacheData = Array.isArray(cacheData) ? cacheData : [cacheData];
174
+ cacheData.forEach((c) => {
175
+ const key = c["key"];
176
+ const policy = c["policy"] ?? "pull-push";
177
+ if (!["pull", "push", "pull-push"].includes(policy)) {
178
+ throw new exit_error_1.ExitError("cache policy is not 'pull', 'push' or 'pull-push'");
179
+ }
180
+ const paths = c["paths"] ?? [];
181
+ cacheList.push(new cache_entry_1.CacheEntry(key, paths, policy));
182
+ });
183
+ return cacheList;
184
+ }
185
+ get buildVolumeName() {
186
+ return `gcl-${this.safeJobName}-${this.jobId}-build`;
187
+ }
188
+ get tmpVolumeName() {
189
+ return `gcl-${this.safeJobName}-${this.jobId}-tmp`;
190
+ }
163
191
  get imageName() {
164
192
  const image = this.jobData["image"];
165
193
  if (!image) {
@@ -276,20 +304,9 @@ class Job {
276
304
  async cleanupResources() {
277
305
  const writeStreams = this.writeStreams;
278
306
  clearTimeout(this._longRunningSilentTimeout);
279
- if (this._containerId) {
307
+ for (const id of this._containersToClean) {
280
308
  try {
281
- await utils_1.Utils.spawn(`docker rm -f ${this._containerId}`);
282
- }
283
- catch (e) {
284
- (0, asserts_1.assert)(e instanceof Error, "e is not instanceof Error");
285
- writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}`);
286
- }
287
- }
288
- if (this._serviceIds) {
289
- try {
290
- for (const serviceId of this._serviceIds) {
291
- await utils_1.Utils.spawn(`docker rm -f ${serviceId}`);
292
- }
309
+ await utils_1.Utils.spawn(`docker rm -f ${id}`);
293
310
  }
294
311
  catch (e) {
295
312
  (0, asserts_1.assert)(e instanceof Error, "e is not instanceof Error");
@@ -305,15 +322,6 @@ class Job {
305
322
  writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}`);
306
323
  }
307
324
  }
308
- if (this._artifactsContainerId) {
309
- try {
310
- await utils_1.Utils.spawn(`docker rm -f ${this._artifactsContainerId}`);
311
- }
312
- catch (e) {
313
- (0, asserts_1.assert)(e instanceof Error, "e is not instanceof Error");
314
- writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}`);
315
- }
316
- }
317
325
  if (this._containerVolumeNames.length > 0) {
318
326
  try {
319
327
  for (const containerVolume of this._containerVolumeNames) {
@@ -348,11 +356,26 @@ class Job {
348
356
  });
349
357
  return cmd;
350
358
  }
359
+ async mountCacheCmd(safeJobName, writeStreams) {
360
+ if (this.imageName && !this.mountCache)
361
+ return "";
362
+ let cmd = "";
363
+ for (const c of this.cache) {
364
+ const uniqueCacheName = await c.getUniqueCacheName(this.cwd, this.expandedVariables);
365
+ c.paths.forEach((p) => {
366
+ const path = utils_1.Utils.expandText(p, this.expandedVariables);
367
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright mounting cache} for path ${path}\n`);
368
+ const cacheMount = `gcl-${this.expandedVariables.CI_PROJECT_PATH_SLUG}-${uniqueCacheName}`;
369
+ cmd += `-v ${cacheMount}:/builds/${safeJobName}/${path} `;
370
+ });
371
+ }
372
+ return cmd;
373
+ }
351
374
  async execScripts(scripts, privileged) {
352
375
  const safeJobName = this.safeJobName;
353
376
  const outputFilesPath = `${this.cwd}/.gitlab-ci-local/output/${safeJobName}.log`;
354
- const buildVolumeName = `gcl-${this.safeJobName}-${this.jobId}-build`;
355
- const tmpVolumeName = `gcl-${this.safeJobName}-${this.jobId}-tmp`;
377
+ const buildVolumeName = this.buildVolumeName;
378
+ const tmpVolumeName = this.tmpVolumeName;
356
379
  const writeStreams = this.writeStreams;
357
380
  const reportsDotenvVariables = await this.initProducerReportsDotenvVariables(writeStreams);
358
381
  let time;
@@ -393,6 +416,7 @@ class Job {
393
416
  for (const service of this.services) {
394
417
  await this.pullImage(writeStreams, service.getName(this.expandedVariables));
395
418
  await this.startService(writeStreams, service, privileged);
419
+ await this.serviceHealthCheck(writeStreams, service);
396
420
  }
397
421
  }
398
422
  const volumePromises = [];
@@ -421,7 +445,7 @@ class Job {
421
445
  for (const [key, value] of Object.entries(reportsDotenvVariables)) {
422
446
  dockerCmd += `-e ${key}='${String(value).trim()}' `;
423
447
  }
424
- dockerCmd += await this.createCacheDockerVolumeMounts(safeJobName, writeStreams);
448
+ dockerCmd += await this.mountCacheCmd(safeJobName, writeStreams);
425
449
  dockerCmd += `${this.imageName} sh -c "\n`;
426
450
  dockerCmd += "if [ -x /usr/local/bin/bash ]; then\n";
427
451
  dockerCmd += "\texec /usr/local/bin/bash \n";
@@ -443,6 +467,7 @@ class Job {
443
467
  dockerCmd += "fi\n\"";
444
468
  const { stdout: containerId } = await utils_1.Utils.spawn(dockerCmd, this.cwd);
445
469
  this._containerId = containerId.replace(/\r?\n/g, "");
470
+ this._containersToClean.push(this._containerId);
446
471
  time = process.hrtime();
447
472
  // Copy source files into container.
448
473
  await utils_1.Utils.spawn(`docker cp .gitlab-ci-local/builds/.docker/. ${this._containerId}:/builds/${safeJobName}`, this.cwd);
@@ -456,10 +481,11 @@ class Job {
456
481
  endTime = process.hrtime(time);
457
482
  writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright copied to container} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
458
483
  }
484
+ await this.copyCacheIn(writeStreams);
459
485
  await this.copyArtifactsIn(writeStreams);
460
486
  if (this.imageName) {
461
- // Make sure tracked files and artifacts are root owned in docker-executor jobs.
462
- await utils_1.Utils.spawn(`docker run --rm -w /app/ -v ${buildVolumeName}:/app/ firecow/gitlab-ci-local-util bash -c "chown 0:0 -R . && chmod a+rw -R ."`);
487
+ // Files in docker-executor build folder must be root owned.
488
+ await utils_1.Utils.spawn(`docker run --rm -v ${tmpVolumeName}:/tmp/ -v ${buildVolumeName}:/app/ firecow/gitlab-ci-local-util bash -c "chown 0:0 -R /app/ && chmod a+rw -R /app/ && chmod a+rw -R /tmp/"`);
463
489
  }
464
490
  let cmd = "set -eo pipefail\n";
465
491
  cmd += "exec 0< /dev/null\n";
@@ -505,7 +531,10 @@ class Job {
505
531
  cp.stdin.end(`./.gitlab-ci-local/scripts/${safeJobName}`);
506
532
  }
507
533
  });
508
- await this.copyArtifactsOut(writeStreams, buildVolumeName);
534
+ if (exitCode == 0) {
535
+ await this.copyCacheOut(writeStreams);
536
+ await this.copyArtifactsOut(writeStreams);
537
+ }
509
538
  return exitCode;
510
539
  }
511
540
  async pullImage(writeStreams, imageToPull) {
@@ -545,78 +574,112 @@ class Job {
545
574
  }
546
575
  return producerReportsEnvs;
547
576
  }
548
- async copyArtifactsIn(writeStreams) {
549
- if (!this.imageName && !this.shellIsolation) {
577
+ async copyCacheIn(writeStreams) {
578
+ if (this.mountCache && this.imageName)
550
579
  return;
551
- }
552
- if (!this.producers || this.producers.length === 0) {
580
+ if ((!this.imageName && !this.shellIsolation) || this.cache.length === 0)
553
581
  return;
554
- }
555
- const safeJobName = this.safeJobName;
556
- const cpFunc = async (folder) => {
557
- if (!this.imageName && this.shellIsolation) {
558
- return utils_1.Utils.spawn(`rsync -a ${folder}/. ${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
582
+ for (const c of this.cache) {
583
+ if (!["pull", "pull-push"].includes(c.policy))
584
+ return;
585
+ const time = process.hrtime();
586
+ const cacheName = await c.getUniqueCacheName(this.cwd, this.expandedVariables);
587
+ const cacheFolder = `${this.cwd}/.gitlab-ci-local/cache/${cacheName}`;
588
+ if (!await fs.pathExists(cacheFolder)) {
589
+ continue;
559
590
  }
560
- return utils_1.Utils.spawn(`docker cp ${folder}/. ${this._containerId}:/builds/${safeJobName}`);
561
- };
591
+ await mutex_1.Mutex.exclusive(cacheName, async () => {
592
+ await this.copyIn(cacheFolder);
593
+ });
594
+ const endTime = process.hrtime(time);
595
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright imported cache '${cacheName}'} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
596
+ }
597
+ }
598
+ async copyArtifactsIn(writeStreams) {
599
+ if ((!this.imageName && !this.shellIsolation) || (this.producers ?? []).length === 0)
600
+ return;
562
601
  const time = process.hrtime();
563
602
  const promises = [];
564
- for (const producer of this.producers) {
603
+ for (const producer of this.producers ?? []) {
565
604
  const producerSafeName = utils_1.Utils.getSafeJobName(producer.name);
566
605
  const artifactFolder = `${this.cwd}/.gitlab-ci-local/artifacts/${producerSafeName}`;
567
606
  if (!await fs.pathExists(artifactFolder)) {
568
607
  throw new exit_error_1.ExitError(`${artifactFolder} doesn't exist, did you forget --needs`);
569
608
  }
570
- promises.push(cpFunc(artifactFolder));
609
+ promises.push(this.copyIn(artifactFolder));
571
610
  }
572
611
  await Promise.all(promises);
573
612
  const endTime = process.hrtime(time);
574
- const targetText = this.imageName ? "container" : "isolated shell";
575
- writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright copied artifacts to ${targetText}} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
613
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright imported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
576
614
  }
577
- async copyArtifactsOut(writeStreams, buildVolumeName) {
615
+ copyIn(source) {
578
616
  const safeJobName = this.safeJobName;
579
- if (!this.shellIsolation && !this.imageName || !this.artifacts) {
617
+ if (!this.imageName && this.shellIsolation) {
618
+ return utils_1.Utils.spawn(`rsync -a ${source}/. ${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
619
+ }
620
+ return utils_1.Utils.spawn(`docker cp ${source}/. ${this._containerId}:/builds/${safeJobName}`);
621
+ }
622
+ async copyCacheOut(writeStreams) {
623
+ if (this.mountCache && this.imageName)
624
+ return;
625
+ if ((!this.imageName && !this.shellIsolation) || this.cache.length === 0)
580
626
  return;
627
+ let time, endTime;
628
+ for (const c of this.cache) {
629
+ if (!["push", "pull-push"].includes(c.policy))
630
+ return;
631
+ const cacheName = await c.getUniqueCacheName(this.cwd, this.expandedVariables);
632
+ for (const path of c.paths) {
633
+ time = process.hrtime();
634
+ const expandedPath = utils_1.Utils.expandText(path, this.expandedVariables);
635
+ let cmd = "shopt -s globstar nullglob dotglob\n";
636
+ cmd += `mkdir -p ../../cache/${cacheName}\n`;
637
+ cmd += `rsync -Ra ${expandedPath} ../../cache/${cacheName}/. || true\n`;
638
+ await mutex_1.Mutex.exclusive(cacheName, async () => {
639
+ await this.copyOut(cmd, "cache", []);
640
+ });
641
+ endTime = process.hrtime(time);
642
+ const readdir = await fs.readdir(`${this.cwd}/.gitlab-ci-local/cache/${cacheName}`);
643
+ if (readdir.length === 0) {
644
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {yellow !! no cache was copied for ${path} !!}\n`);
645
+ }
646
+ else {
647
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright exported cache ${expandedPath} '${cacheName}'} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
648
+ }
649
+ }
581
650
  }
651
+ }
652
+ async copyArtifactsOut(writeStreams) {
653
+ const safeJobName = this.safeJobName;
654
+ if (!this.shellIsolation && !this.imageName || !this.artifacts)
655
+ return;
582
656
  let time, endTime;
583
657
  let cpCmd = "shopt -s globstar nullglob dotglob\n";
584
658
  cpCmd += `mkdir -p ../../artifacts/${safeJobName}\n`;
585
659
  for (const artifactPath of this.artifacts?.paths ?? []) {
586
660
  const expandedPath = utils_1.Utils.expandText(artifactPath, this.expandedVariables);
587
- cpCmd += `echo Started copying ${expandedPath} to ../../artifacts/${safeJobName}\n`;
588
- cpCmd += `rsync -Ra ${expandedPath} ../../artifacts/${safeJobName}/.\n`;
589
- cpCmd += `echo Done copying ${expandedPath} to ../../artifacts/${safeJobName}\n`;
661
+ cpCmd += `rsync -Ra ${expandedPath} ../../artifacts/${safeJobName}/. || true\n`;
590
662
  }
591
663
  for (const artifactExcludePath of this.artifacts?.exclude ?? []) {
592
664
  const expandedPath = utils_1.Utils.expandText(artifactExcludePath, this.expandedVariables);
593
- cpCmd += `echo Started removing exclude '${expandedPath}' from ../../artifacts/${safeJobName}\n`;
594
665
  cpCmd += `ls -1d '../../artifacts/${safeJobName}/${expandedPath}' | xargs -n1 rm -rf || true\n`;
595
- cpCmd += `echo Done removing exclude '${expandedPath}' from ../../artifacts/${safeJobName}\n`;
596
666
  }
597
667
  const reportDotenv = this.artifacts.reports?.dotenv ?? null;
598
668
  if (reportDotenv != null) {
599
669
  cpCmd += `mkdir -p ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv\n`;
600
- cpCmd += `echo Started copying ${reportDotenv} to ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv\n`;
601
670
  cpCmd += `rsync -Ra ${reportDotenv} ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv/.\n`;
602
- cpCmd += `echo Done copying ${reportDotenv} to ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv\n`;
603
671
  }
604
672
  time = process.hrtime();
605
- if (this.imageName) {
606
- const cacheMountStr = await this.createCacheDockerVolumeMounts(safeJobName, writeStreams);
607
- const dockerCreateCmd = `docker create -i ${cacheMountStr} -v ${buildVolumeName}:/builds/${safeJobName}/ -w /builds/${safeJobName}/ firecow/gitlab-ci-local-util bash -c "${cpCmd}"`;
608
- const { stdout: artifactsContainerId } = await utils_1.Utils.spawn(dockerCreateCmd, this.cwd);
609
- this._artifactsContainerId = artifactsContainerId.replace(/\r?\n/g, "");
610
- await fs.mkdirp(`${this.cwd}/.gitlab-ci-local/artifacts/${safeJobName}`);
611
- await utils_1.Utils.spawn(`docker start ${this._artifactsContainerId} --attach`);
612
- await utils_1.Utils.spawn(`docker cp ${this._artifactsContainerId}:/artifacts/. .gitlab-ci-local/artifacts/.`, this.cwd);
673
+ const dockerCmdExtras = this.mountCache ? [await this.mountCacheCmd(this.safeJobName, writeStreams)] : [];
674
+ await this.copyOut(cpCmd, "artifacts", dockerCmdExtras);
675
+ endTime = process.hrtime(time);
676
+ const readdir = await fs.readdir(`${this.cwd}/.gitlab-ci-local/artifacts/${safeJobName}`);
677
+ if (readdir.length === 0) {
678
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {yellow !! no artifacts was copied !!}\n`);
613
679
  }
614
- else if (this.shellIsolation) {
615
- await utils_1.Utils.spawn(`mkdir -p ../../artifacts/${safeJobName}`, `${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
616
- await utils_1.Utils.spawn(`bash -e -c "${cpCmd}"`, `${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
680
+ else {
681
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright exported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
617
682
  }
618
- endTime = process.hrtime(time);
619
- writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright saved artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
620
683
  if (this.artifactsToSource) {
621
684
  time = process.hrtime();
622
685
  await utils_1.Utils.spawn(`rsync --exclude=/.gitlab-ci-reports/ -a ${this.cwd}/.gitlab-ci-local/artifacts/${safeJobName}/. ${this.cwd}`);
@@ -627,6 +690,21 @@ class Job {
627
690
  writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright copied artifacts to cwd} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
628
691
  }
629
692
  }
693
+ async copyOut(cmd, type, dockerCmdExtras) {
694
+ const safeJobName = this.safeJobName;
695
+ const buildVolumeName = this.buildVolumeName;
696
+ await fs.mkdirp(`${this.cwd}/.gitlab-ci-local/${type}`);
697
+ if (this.imageName) {
698
+ const { stdout: cid } = await utils_1.Utils.spawn(`docker create -i ${dockerCmdExtras.join(" ")} -v ${buildVolumeName}:/builds/${safeJobName}/ -w /builds/${safeJobName}/ firecow/gitlab-ci-local-util bash -c "${cmd}"`, this.cwd);
699
+ const containerId = cid.replace(/\r?\n/g, "");
700
+ this._containersToClean.push(containerId);
701
+ await utils_1.Utils.spawn(`docker start ${containerId} --attach`);
702
+ await utils_1.Utils.spawn(`docker cp ${containerId}:/${type}/. .gitlab-ci-local/${type}/.`, this.cwd);
703
+ }
704
+ else if (this.shellIsolation) {
705
+ await utils_1.Utils.spawn(`bash -eo pipefail -c "${cmd}"`, `${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
706
+ }
707
+ }
630
708
  refreshLongRunningSilentTimeout(writeStreams) {
631
709
  clearTimeout(this._longRunningSilentTimeout);
632
710
  this._longRunningSilentTimeout = setTimeout(() => {
@@ -650,20 +728,6 @@ class Job {
650
728
  const { stdout: networkId } = await utils_1.Utils.spawn(`docker network create ${networkName}`);
651
729
  this._serviceNetworkId = networkId.replace(/\r?\n/g, "");
652
730
  }
653
- async createCacheDockerVolumeMounts(safeJobName, writeStreams) {
654
- let cmd = "";
655
- for (const entry of this.cache) {
656
- const uniqueCacheName = await Job.getUniqueCacheName(this.cwd, entry, this.expandedVariables);
657
- entry.paths.forEach((p) => {
658
- const path = utils_1.Utils.expandText(p, this.expandedVariables);
659
- writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright mounting cache} for path ${path}\n`);
660
- const cachedir = `/tmp/gitlab-ci-local/cache/${uniqueCacheName}/${path}`;
661
- fs.ensureDirSync(cachedir);
662
- cmd += `-v ${cachedir}:/builds/${safeJobName}/${path} `;
663
- });
664
- }
665
- return cmd;
666
- }
667
731
  async startService(writeStreams, service, privileged) {
668
732
  let dockerCmd = `docker run -d --network gitlab-ci-local-${this.jobId} `;
669
733
  if (privileged) {
@@ -692,11 +756,42 @@ class Job {
692
756
  }
693
757
  const time = process.hrtime();
694
758
  const { stdout: containerId } = await utils_1.Utils.spawn(dockerCmd, this.cwd);
695
- this._serviceIds.push(containerId.replace(/\r?\n/g, ""));
759
+ this._containersToClean.push(containerId.replace(/\r?\n/g, ""));
696
760
  this.refreshLongRunningSilentTimeout(writeStreams);
697
761
  const endTime = process.hrtime(time);
698
762
  writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright started service image: ${serviceName} with aliases: ${aliases.join(", ")}} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
699
763
  }
764
+ async serviceHealthCheck(writeStreams, service) {
765
+ const dockerInspectCmd = `docker inspect ${service.getName(this.expandedVariables)}`;
766
+ const { stdout: imageDetails } = await utils_1.Utils.spawn(dockerInspectCmd, this.cwd);
767
+ const imageDetailObj = JSON.parse(imageDetails);
768
+ // Copied from the startService block. Important thing is that the aliases match
769
+ const serviceAlias = service.getAlias(this.expandedVariables);
770
+ const serviceName = service.getName(this.expandedVariables);
771
+ const serviceNameWithoutVersion = serviceName.replace(/(.*)(:.*)/, "$1");
772
+ const aliases = [serviceNameWithoutVersion.replace("/", "-"), serviceNameWithoutVersion.replace("/", "__")];
773
+ if (serviceAlias) {
774
+ aliases.push(serviceAlias);
775
+ }
776
+ // Iterate over each port defined in the image, and try to connect to the alias
777
+ for (const port of Object.keys(imageDetailObj[0].ContainerConfig.ExposedPorts)) {
778
+ if (port.endsWith("/tcp")) {
779
+ const portNum = parseInt(port.replace("/tcp", ""));
780
+ let dockerCmd = `docker run -d --network gitlab-ci-local-${this.jobId} `;
781
+ dockerCmd += ` willwill/wait-for-it "${aliases[0]}:${portNum}" -t 30`;
782
+ const time = process.hrtime();
783
+ const { status: result, stdout } = await utils_1.Utils.spawn(dockerCmd, this.cwd);
784
+ this._containersToClean.push(stdout.replace(/\r?\n/g, ""));
785
+ const endTime = process.hrtime(time);
786
+ if (result == 0) {
787
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {greenBright service image: ${serviceName} healthcheck passed: ${aliases[0]}:${portNum}} in {green ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
788
+ }
789
+ else {
790
+ writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {redBright service image: ${serviceName} healthcheck failed: ${aliases[0]}:${portNum}} in {red ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
791
+ }
792
+ }
793
+ }
794
+ }
700
795
  }
701
796
  exports.Job = Job;
702
797
  Job.illegalJobNames = [
@@ -704,4 +799,4 @@ Job.illegalJobNames = [
704
799
  "stages", "pages", "types", "before_script", "default",
705
800
  "after_script", "variables", "cache", "workflow",
706
801
  ];
707
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQWlDO0FBQ2pDLDREQUE4QztBQUM5Qyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLDBEQUFrQztBQUNsQyxtREFBNkM7QUFDN0MsbUNBQThCO0FBSzlCLHVDQUFpQztBQUVqQyxNQUFhLEdBQUc7SUF5Q1osWUFBWSxHQUFlO1FBbEJuQix3QkFBbUIsR0FBa0IsSUFBSSxDQUFDO1FBQzFDLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFDeEMsMEJBQXFCLEdBQWtCLElBQUksQ0FBQztRQUM1QywwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFDckMsOEJBQXlCLEdBQW1CLENBQUMsQ0FBUSxDQUFDO1FBQ3RELGVBQVUsR0FBcUQsSUFBSSxDQUFDO1FBU3hFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzVCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7UUFFOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxH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WSxFQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2TCxDQUFDOztBQWh5Qkwsa0JBaXlCQztBQS94Qm1CLG1CQUFlLEdBQUc7SUFDOUIsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxVQUFVO0lBQ3JELFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTO0lBQ3RELGNBQWMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVU7Q0FDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCAqIGFzIGRvdGVudiBmcm9tIFwiZG90ZW52XCI7XG5pbXBvcnQgKiBhcyBjaGlsZFByb2Nlc3MgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHByZXR0eUhydGltZSBmcm9tIFwicHJldHR5LWhydGltZVwiO1xuaW1wb3J0IGNhbWVsQ2FzZSBmcm9tIFwiY2FtZWxjYXNlXCI7XG5pbXBvcnQge0V4aXRFcnJvcn0gZnJvbSBcIi4vdHlwZXMvZXhpdC1lcnJvclwiO1xuaW1wb3J0IHtVdGlsc30gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7Sm9iT3B0aW9uc30gZnJvbSBcIi4vdHlwZXMvam9iLW9wdGlvbnNcIjtcbmltcG9ydCB7V3JpdGVTdHJlYW1zfSBmcm9tIFwiLi90eXBlcy93cml0ZS1zdHJlYW1zXCI7XG5pbXBvcnQge1NlcnZpY2V9IGZyb20gXCIuL3NlcnZpY2VcIjtcbmltcG9ydCB7R2l0RGF0YX0gZnJvbSBcIi4vZ2l0LWRhdGFcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9hc3NlcnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBKb2Ige1xuXG4gICAgc3RhdGljIHJlYWRvbmx5IGlsbGVnYWxKb2JOYW1lcyA9IFtcbiAgICAgICAgXCJpbmNsdWRlXCIsIFwibG9jYWxfY29uZmlndXJhdGlvblwiLCBcImltYWdlXCIsIFwic2VydmljZXNcIixcbiAgICAgICAgXCJzdGFnZXNcIiwgXCJwYWdlc1wiLCBcInR5cGVzXCIsIFwiYmVmb3JlX3NjcmlwdFwiLCBcImRlZmF1bHRcIixcbiAgICAgICAgXCJhZnRlcl9zY3JpcHRcIiwgXCJ2YXJpYWJsZXNcIiwgXCJjYWNoZVwiLCBcIndvcmtmbG93XCIsXG4gICAgXTtcblxuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBqb2JOYW1lUGFkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSB8IG51bGw7XG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IG5hbWU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfCBudWxsIH07XG4gICAgcmVhZG9ubHkgam9iSWQ6IG51bWJlcjtcbiAgICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgICByZWFkb25seSBydWxlcz86IHsgaWY6IHN0cmluZzsgd2hlbjogc3RyaW5nOyBhbGxvd19mYWlsdXJlOiBib29sZWFuIH1bXTtcbiAgICByZWFkb25seSBleHBhbmRlZFZhcmlhYmxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICByZWFkb25seSBhbGxvd0ZhaWx1cmU6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgd2hlbjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBpcGVsaW5lSWlkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgY2FjaGU6IHsga2V5OiBzdHJpbmcgfCB7IGZpbGVzOiBzdHJpbmdbXSB9OyBwYXRoczogc3RyaW5nW10gfVtdO1xuICAgIHJlYWRvbmx5IGdpdERhdGE6IEdpdERhdGE7XG4gICAgcmVhZG9ubHkgc2hlbGxJc29sYXRpb246IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIF9wcmVzY3JpcHRzRXhpdENvZGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FmdGVyU2NyaXB0c0V4aXRDb2RlID0gMDtcbiAgICBwcml2YXRlIF9jb3ZlcmFnZVBlcmNlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3J1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb250YWluZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc2VydmljZUlkczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9zZXJ2aWNlTmV0d29ya0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9hcnRpZmFjdHNDb250YWluZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVm9sdW1lTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0OiBOb2RlSlMuVGltZW91dCA9IC0xIGFzIGFueTtcbiAgICBwcml2YXRlIF9wcm9kdWNlcnM6IHsgbmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGwgfVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9uZWVkczogeyBqb2I6IHN0cmluZzsgYXJ0aWZhY3RzOiB0cnVlIH1bXSB8IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYkRhdGE6IGFueTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFIb3N0czogc3RyaW5nW107XG4gICAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVzOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdDogSm9iT3B0aW9ucykge1xuICAgICAgICBjb25zdCBqb2JEYXRhID0gb3B0LmRhdGE7XG4gICAgICAgIGNvbnN0IGdpdERhdGEgPSBvcHQuZ2l0RGF0YTtcbiAgICAgICAgY29uc3QgZ2xvYmFscyA9IG9wdC5nbG9iYWxzO1xuICAgICAgICBjb25zdCBob21lVmFyaWFibGVzID0gb3B0LmhvbWVWYXJpYWJsZXM7XG4gICAgICAgIGNvbnN0IHByb2plY3RWYXJpYWJsZXMgPSBvcHQucHJvamVjdFZhcmlhYmxlcztcblxuICAgICAgICB0aGlzLmV4dHJhSG9zdHMgPSBvcHQuZXh0cmFIb3N0cztcbiAgICAgICAgdGhpcy52b2x1bWVzID0gb3B0LnZvbHVtZXM7XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zID0gb3B0LndyaXRlU3RyZWFtcztcbiAgICAgICAgdGhpcy5qb2JOYW1lUGFkID0gb3B0Lm5hbWVQYWQ7XG4gICAgICAgIHRoaXMuZ2l0RGF0YSA9IG9wdC5naXREYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHQubmFtZTtcbiAgICAgICAgdGhpcy5jd2QgPSBvcHQuY3dkO1xuICAgICAgICB0aGlzLmpvYklkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XG4gICAgICAgIHRoaXMuam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICB0aGlzLnBpcGVsaW5lSWlkID0gb3B0LnBpcGVsaW5lSWlkO1xuICAgICAgICB0aGlzLnNoZWxsSXNvbGF0aW9uID0gb3B0LnNoZWxsSXNvbGF0aW9uO1xuXG4gICAgICAgIHRoaXMud2hlbiA9IGpvYkRhdGEud2hlbiB8fCBcIm9uX3N1Y2Nlc3NcIjtcbiAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBqb2JEYXRhLmFsbG93X2ZhaWx1cmUgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuX25lZWRzID0gam9iRGF0YS5uZWVkcyB8fCBudWxsO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGpvYkRhdGEuZGVwZW5kZW5jaWVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMucnVsZXMgPSBqb2JEYXRhLnJ1bGVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0eXBlb2Ygam9iRGF0YS5lbnZpcm9ubWVudCA9PT0gXCJzdHJpbmdcIiA/IHtuYW1lOiBqb2JEYXRhLmVudmlyb25tZW50fSA6IGpvYkRhdGEuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBqb2JEYXRhLmNhY2hlIHx8IFtdO1xuXG4gICAgICAgIGxldCBDSV9QUk9KRUNUX0RJUiA9IGAke3RoaXMuY3dkfWA7XG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgQ0lfUFJPSkVDVF9ESVIgPSBgL2J1aWxkcy8ke3RoaXMuc2FmZUpvYk5hbWV9YDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBDSV9QUk9KRUNUX0RJUiA9IGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8ke3RoaXMuc2FmZUpvYk5hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZWRlZmluZWRWYXJpYWJsZXMgPSB7XG4gICAgICAgICAgICBHSVRMQUJfVVNFUl9MT0dJTjogZ2l0RGF0YS51c2VyW1wiR0lUTEFCX1VTRVJfTE9HSU5cIl0sXG4gICAgICAgICAgICBHSVRMQUJfVVNFUl9FTUFJTDogZ2l0RGF0YS51c2VyW1wiR0lUTEFCX1VTRVJfRU1BSUxcIl0sXG4gICAgICAgICAgICBHSVRMQUJfVVNFUl9OQU1FOiBnaXREYXRhLnVzZXJbXCJHSVRMQUJfVVNFUl9OQU1FXCJdLFxuICAgICAgICAgICAgR0lUTEFCX1VTRVJfSUQ6IGdpdERhdGEudXNlcltcIkdJVExBQl9VU0VSX0lEXCJdLFxuICAgICAgICAgICAgQ0lfQ09NTUlUX1NIT1JUX1NIQTogZ2l0RGF0YS5jb21taXQuU0hPUlRfU0hBLCAvLyBDaGFuZ2VzXG4gICAgICAgICAgICBDSV9DT01NSVRfU0hBOiBnaXREYXRhLmNvbW1pdC5TSEEsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX0RJUixcbiAgICAgICAgICAgIENJX1BST0pFQ1RfTkFNRTogZ2l0RGF0YS5yZW1vdGUucHJvamVjdCxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfVElUTEU6IGAke2NhbWVsQ2FzZShnaXREYXRhLnJlbW90ZS5wcm9qZWN0KX1gLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9QQVRIOiBnaXREYXRhLkNJX1BST0pFQ1RfUEFUSCxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfUEFUSF9TTFVHOiBnaXREYXRhLkNJX1BST0pFQ1RfUEFUSF9TTFVHLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9OQU1FU1BBQ0U6IGAke2dpdERhdGEucmVtb3RlLmdyb3VwfWAsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX1ZJU0lCSUxJVFk6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgIENJX1BST0pFQ1RfSUQ6IFwiMTIxN1wiLFxuICAgICAgICAgICAgQ0lfQ09NTUlUX1JFRl9QUk9URUNURUQ6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIENJX0NPTU1JVF9CUkFOQ0g6IGdpdERhdGEuY29tbWl0LlJFRl9OQU1FLCAvLyBOb3QgYXZhaWxhYmxlIGluIG1lcmdlIHJlcXVlc3Qgb3IgdGFnIHBpcGVsaW5lc1xuICAgICAgICAgICAgQ0lfQ09NTUlUX1JFRl9OQU1FOiBnaXREYXRhLmNvbW1pdC5SRUZfTkFNRSwgLy8gVGFnIG9yIGJyYW5jaCBuYW1lXG4gICAgICAgICAgICBDSV9DT01NSVRfUkVGX1NMVUc6IGdpdERhdGEuY29tbWl0LlJFRl9OQU1FLnJlcGxhY2UoL1teYS16MC05XSsvaWcsIFwiLVwiKS5yZXBsYWNlKC9eLS8sIFwiXCIpLnJlcGxhY2UoLy0kLywgXCJcIikuc2xpY2UoMCwgNjMpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBDSV9DT01NSVRfVElUTEU6IFwiQ29tbWl0IFRpdGxlXCIsIC8vIEZpcnN0IGxpbmUgb2YgY29tbWl0IG1lc3NhZ2UuXG4gICAgICAgICAgICBDSV9DT01NSVRfTUVTU0FHRTogXCJDb21taXQgVGl0bGVcXG5Nb3JlIGNvbW1pdCB0ZXh0XCIsIC8vIEZ1bGwgY29tbWl0IG1lc3NhZ2VcbiAgICAgICAgICAgIENJX0NPTU1JVF9ERVNDUklQVElPTjogXCJNb3JlIGNvbW1pdCB0ZXh0XCIsXG4gICAgICAgICAgICBDSV9QSVBFTElORV9TT1VSQ0U6IFwicHVzaFwiLFxuICAgICAgICAgICAgQ0lfSk9CX0lEOiBgJHt0aGlzLmpvYklkfWAsXG4gICAgICAgICAgICBDSV9QSVBFTElORV9JRDogYCR7dGhpcy5waXBlbGluZUlpZCArIDEwMDB9YCxcbiAgICAgICAgICAgIENJX1BJUEVMSU5FX0lJRDogYCR7dGhpcy5waXBlbGluZUlpZH1gLFxuICAgICAgICAgICAgQ0lfU0VSVkVSX0hPU1Q6IGAke2dpdERhdGEucmVtb3RlLmRvbWFpbn1gLFxuICAgICAgICAgICAgQ0lfU0VSVkVSX1VSTDogYGh0dHBzOi8vJHtnaXREYXRhLnJlbW90ZS5kb21haW59OjQ0M2AsXG4gICAgICAgICAgICBDSV9BUElfVjRfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmRvbWFpbn0vYXBpL3Y0YCxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmRvbWFpbn0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fWAsXG4gICAgICAgICAgICBDSV9KT0JfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmRvbWFpbn0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fS8tL2pvYnMvJHt0aGlzLmpvYklkfWAsIC8vIENoYW5nZXMgb24gcmVydW4uXG4gICAgICAgICAgICBDSV9QSVBFTElORV9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuZG9tYWlufS8ke2dpdERhdGEucmVtb3RlLmdyb3VwfS8ke2dpdERhdGEucmVtb3RlLnByb2plY3R9L3BpcGVsaW5lcy8ke3RoaXMucGlwZWxpbmVJaWR9YCxcbiAgICAgICAgICAgIENJX0pPQl9OQU1FOiBgJHt0aGlzLm5hbWV9YCxcbiAgICAgICAgICAgIENJX0pPQl9TVEFHRTogYCR7dGhpcy5zdGFnZX1gLFxuICAgICAgICAgICAgQ0lfUkVHSVNUUlk6IGdpdERhdGEuQ0lfUkVHSVNUUlksXG4gICAgICAgICAgICBDSV9SRUdJU1RSWV9JTUFHRTogZ2l0RGF0YS5DSV9SRUdJU1RSWV9JTUFHRSxcbiAgICAgICAgICAgIEdJVExBQl9DSTogXCJmYWxzZVwiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBleHBhbmRlZCB2YXJpYWJsZXNcbiAgICAgICAgY29uc3QgZW52cyA9IHsuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5nbG9iYWxzLnZhcmlhYmxlcyB8fCB7fSwgLi4uam9iRGF0YS52YXJpYWJsZXMgfHwge30sIC4uLmhvbWVWYXJpYWJsZXMsIC4uLnByb2plY3RWYXJpYWJsZXN9O1xuICAgICAgICBjb25zdCBleHBhbmRlZEdsb2JhbFZhcmlhYmxlcyA9IFV0aWxzLmV4cGFuZFZhcmlhYmxlcyhnbG9iYWxzLnZhcmlhYmxlcyB8fCB7fSwgZW52cyk7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkSm9iVmFyaWFibGVzID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKGpvYkRhdGEudmFyaWFibGVzIHx8IHt9LCBlbnZzKTtcbiAgICAgICAgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyA9IHsuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5leHBhbmRlZEdsb2JhbFZhcmlhYmxlcywgLi4uZXhwYW5kZWRKb2JWYXJpYWJsZXMsIC4uLmhvbWVWYXJpYWJsZXMsIC4uLnByb2plY3RWYXJpYWJsZXN9O1xuXG4gICAgICAgIC8vIFNldCB7d2hlbiwgYWxsb3dGYWlsdXJlfSBiYXNlZCBvbiBydWxlcyByZXN1bHRcbiAgICAgICAgaWYgKHRoaXMucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZXN1bHQgPSBVdGlscy5nZXRSdWxlc1Jlc3VsdCh0aGlzLnJ1bGVzLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMud2hlbiA9IHJ1bGVSZXN1bHQud2hlbjtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dGYWlsdXJlID0gcnVsZVJlc3VsdC5hbGxvd0ZhaWx1cmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSAmJiAodGhpcy53aGVuICE9PSBcIm1hbnVhbFwiIHx8IHRoaXMuaW1hZ2VOYW1lICE9PSBudWxsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihgJHt0aGlzLmNoYWxrSm9iTmFtZX0gQEludGVyYWN0aXZlIGRlY29yYXRvciBjYW5ub3QgaGF2ZSBpbWFnZTogYW5kIG11c3QgYmUgd2hlbjptYW51YWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluamVjdFNTSEFnZW50ICYmIHRoaXMuaW1hZ2VOYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpdEVycm9yKGAke3RoaXMuY2hhbGtKb2JOYW1lfSBASW5qZWN0U1NIQWdlbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGltYWdlOmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGdldFVuaXF1ZUNhY2hlTmFtZShjd2Q6IHN0cmluZywgY2FjaGVFbnRyeTogeyBrZXk6IHN0cmluZyB8IHsgZmlsZXM6IHN0cmluZ1tdIH07IHBhdGhzOiBzdHJpbmdbXSB9LCBleHBhbmRlZFZhcmlhYmxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGNhY2hlRW50cnkua2V5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuZXhwYW5kVGV4dChjYWNoZUVudHJ5LmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwibWQtXCIgKyBhd2FpdCBVdGlscy5jaGVja3N1bUZpbGVzKGNhY2hlRW50cnkua2V5LmZpbGVzLm1hcChmID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHtjd2R9LyR7VXRpbHMuZXhwYW5kVGV4dChmLCBleHBhbmRlZFZhcmlhYmxlcyl9YDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGdldCBhcnRpZmFjdHNUb1NvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1RvU291cmNlXCJdID09IG51bGwgPyB0cnVlIDogdGhpcy5qb2JEYXRhW1wiYXJ0aWZhY3RzVG9Tb3VyY2VcIl07XG4gICAgfVxuXG4gICAgZ2V0IGNoYWxrSm9iTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGNoYWxrYHtibHVlQnJpZ2h0ICR7dGhpcy5uYW1lLnBhZEVuZCh0aGlzLmpvYk5hbWVQYWQpfX1gO1xuICAgIH1cblxuICAgIGdldCBzYWZlSm9iTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmdldFNhZmVKb2JOYW1lKHRoaXMubmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0IG5lZWRzKCk6IHtqb2I6IHN0cmluZzsgYXJ0aWZhY3RzOiBib29sZWFufVtdIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5fbmVlZHMpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBsaXN0OiB7am9iOiBzdHJpbmc7IGFydGlmYWN0czogYm9vbGVhbn1bXSA9IFtdO1xuICAgICAgICB0aGlzLl9uZWVkcz8uZm9yRWFjaCgobmVlZCkgPT4ge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBqb2I6IHR5cGVvZiBuZWVkID09PSBcInN0cmluZ1wiID8gbmVlZCA6IG5lZWQuam9iLFxuICAgICAgICAgICAgICAgIGFydGlmYWN0czogdHlwZW9mIG5lZWQgPT09IFwic3RyaW5nXCIgPyB0cnVlIDogbmVlZC5hcnRpZmFjdHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuXG4gICAgZ2V0IGltYWdlTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcbiAgICAgICAgaWYgKCFpbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KGltYWdlLm5hbWUsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICByZXR1cm4gaW1hZ2VOYW1lLmluY2x1ZGVzKFwiOlwiKSA/IGltYWdlTmFtZSA6IGAke2ltYWdlTmFtZX06bGF0ZXN0YDtcbiAgICB9XG5cbiAgICBnZXQgaW1hZ2VFbnRyeXBvaW50KCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5qb2JEYXRhW1wiaW1hZ2VcIl07XG5cbiAgICAgICAgaWYgKCFpbWFnZSB8fCAhaW1hZ2UuZW50cnlwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZS5lbnRyeXBvaW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpdEVycm9yKFwiaW1hZ2U6ZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZS5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIGdldCBzZXJ2aWNlcygpOiBTZXJ2aWNlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wic2VydmljZXNcIl07XG4gICAgfVxuXG4gICAgZ2V0IHByb2R1Y2VycygpOiB7IG5hbWU6IHN0cmluZzsgZG90ZW52OiBzdHJpbmcgfCBudWxsIH1bXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIHNldCBwcm9kdWNlcnMocHJvZHVjZXJzOiB7IG5hbWU6IHN0cmluZzsgZG90ZW52OiBzdHJpbmcgfCBudWxsIH1bXSB8IG51bGwpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX3Byb2R1Y2VycyA9PSBudWxsLCBcInRoaXMuX3Byb2R1Y2VycyBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgdGhpcy5fcHJvZHVjZXJzID0gcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wic3RhZ2VcIl0gfHwgXCJ0ZXN0XCI7XG4gICAgfVxuXG4gICAgZ2V0IGludGVyYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiaW50ZXJhY3RpdmVcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGluamVjdFNTSEFnZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiaW5qZWN0U1NIQWdlbnRcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJkZXNjcmlwdGlvblwiXSA/PyBcIlwiO1xuICAgIH1cblxuICAgIGdldCBhcnRpZmFjdHMoKTogeyBwYXRocz86IHN0cmluZ1tdOyBleGNsdWRlPzogc3RyaW5nW107IHJlcG9ydHM/OiB7IGRvdGVudj86IHN0cmluZyB9IH18bnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNcIl07XG4gICAgfVxuXG4gICAgZ2V0IGJlZm9yZVNjcmlwdHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiYmVmb3JlX3NjcmlwdFwiXSB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJTY3JpcHRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFmdGVyX3NjcmlwdFwiXSB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXQgc2NyaXB0cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJzY3JpcHRcIl07XG4gICAgfVxuXG4gICAgZ2V0IHByZVNjcmlwdHNFeGl0Q29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJTY3JpcHRzRXhpdENvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgcnVubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bm5pbmc7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXJ0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5uaW5nIHx8IHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fcnVubmluZyAmJiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGNvdmVyYWdlUGVyY2VudCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdmVyYWdlUGVyY2VudDtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydChwcml2aWxlZ2VkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCBzYWZlSm9ibmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG5cbiAgICAgICAgdGhpcy5fcnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgZnMuZW5zdXJlRmlsZShgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9vdXRwdXQvJHtzYWZlSm9ibmFtZX0ubG9nYCk7XG4gICAgICAgIGF3YWl0IGZzLnRydW5jYXRlKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL291dHB1dC8ke3NhZmVKb2JuYW1lfS5sb2dgKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRpbmd9ICR7dGhpcy5pbWFnZU5hbWUgPz8gXCJzaGVsbFwifSAoe3llbGxvdyAke3RoaXMuc3RhZ2V9fSlcXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNjcmlwdHMgPSB0aGlzLmJlZm9yZVNjcmlwdHMuY29uY2F0KHRoaXMuc2NyaXB0cyk7XG4gICAgICAgIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9IGF3YWl0IHRoaXMuZXhlY1NjcmlwdHMocHJlc2NyaXB0cywgcHJpdmlsZWdlZCk7XG4gICAgICAgIGlmICh0aGlzLmFmdGVyU2NyaXB0cy5sZW5ndGggPT09IDAgJiYgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCAmJiAhdGhpcy5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIGZhbHNlKX1cXG5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJTY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPiAwICYmIHRoaXMuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCB0cnVlKX1cXG5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDAgJiYgdGhpcy5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIHRydWUpfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDAgJiYgIXRoaXMuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCBmYWxzZSl9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hZnRlclNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPSBhd2FpdCB0aGlzLmV4ZWNTY3JpcHRzKHRoaXMuYWZ0ZXJTY3JpcHRzLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSA+IDApIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSwgdHJ1ZSwgXCIgYWZ0ZXJfc2NyaXB0XCIpfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHt0aGlzLmdldEZpbmlzaGVkU3RyaW5nKHN0YXJ0VGltZSl9XFxuYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YS5jb3ZlcmFnZSkge1xuICAgICAgICAgICAgdGhpcy5fY292ZXJhZ2VQZXJjZW50ID0gYXdhaXQgVXRpbHMuZ2V0Q292ZXJhZ2VQZXJjZW50KHRoaXMuY3dkLCB0aGlzLmpvYkRhdGEuY292ZXJhZ2UsIHNhZmVKb2JuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYW51cFJlc291cmNlcygpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW1zID0gdGhpcy53cml0ZVN0cmVhbXM7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXJJZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIHJtIC1mICR7dGhpcy5fY29udGFpbmVySWR9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc2VydmljZUlkcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2VJZCBvZiB0aGlzLl9zZXJ2aWNlSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgcm0gLWYgJHtzZXJ2aWNlSWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgJHtlLm1lc3NhZ2V9fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBuZXR3b3JrIHJtICR7dGhpcy5fc2VydmljZU5ldHdvcmtJZH1gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9hcnRpZmFjdHNDb250YWluZXJJZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIHJtIC1mICR7dGhpcy5fYXJ0aWZhY3RzQ29udGFpbmVySWR9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lclZvbHVtZSBvZiB0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIHZvbHVtZSBybSAke2NvbnRhaW5lclZvbHVtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5qZWN0U1NIQWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiIHx8IChwcm9jZXNzLmVudi5PU1RZUEU/Lm1hdGNoKC9eZGFyd2luLykgPz8gbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi0tZW52IFNTSF9BVVRIX1NPQ0s9L3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2sgLXYgL3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2s6L3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYC0tZW52IFNTSF9BVVRIX1NPQ0s9JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfSAtdiAke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9OiR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS31gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzOiBzdHJpbmdbXSkge1xuICAgICAgICBsZXQgY21kID0gXCJcIjtcbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAgICAgICAgIC8vIFByaW50IGNvbW1hbmQgZWNobydlZCBpbiBjb2xvclxuICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSBzY3JpcHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpbGluZVRleHQgPSBzcGxpdC5sZW5ndGggPiAxID8gXCIgIyBjb2xsYXBzZWQgbXVsdGktbGluZSBjb21tYW5kXCIgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNwbGl0WzBdPy5yZXBsYWNlKC9bXFxcXF0vZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9bXCJdL2csIFwiXFxcXFxcXCJcIikucmVwbGFjZSgvWyRdL2csIFwiXFxcXCRcIik7XG4gICAgICAgICAgICBjbWQgKz0gY2hhbGtgZWNobyBcIntncmVlbiAkICR7dGV4dH0ke211bHRpbGluZVRleHR9fVwiXFxuYDtcblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhY3R1YWwgc2NyaXB0XG4gICAgICAgICAgICBjbWQgKz0gYCR7c2NyaXB0fVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZXhlY1NjcmlwdHMoc2NyaXB0czogc3RyaW5nW10sIHByaXZpbGVnZWQ6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG4gICAgICAgIGNvbnN0IG91dHB1dEZpbGVzUGF0aCA9IGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL291dHB1dC8ke3NhZmVKb2JOYW1lfS5sb2dgO1xuICAgICAgICBjb25zdCBidWlsZFZvbHVtZU5hbWUgPSBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS1idWlsZGA7XG4gICAgICAgIGNvbnN0IHRtcFZvbHVtZU5hbWUgPSBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS10bXBgO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgY29uc3QgcmVwb3J0c0RvdGVudlZhcmlhYmxlcyA9IGF3YWl0IHRoaXMuaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyh3cml0ZVN0cmVhbXMpO1xuICAgICAgICBsZXQgdGltZTtcbiAgICAgICAgbGV0IGVuZFRpbWU7XG5cbiAgICAgICAgaWYgKHNjcmlwdHMubGVuZ3RoID09PSAwIHx8IHNjcmlwdHNbMF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IGdpdCB0cmFja2VkIGZpbGVzIHRvIGJ1aWxkIGZvbGRlciBpZiBzaGVsbCBpc29sYXRpb24gZW5hYmxlZC5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlTmFtZSAmJiB0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5yc3luY1RyYWNrZWRGaWxlcyh0aGlzLmN3ZCwgYCR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgY29uc3QgaUNtZCA9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGludGVyYWN0aXZlQ3AgPSBjaGlsZFByb2Nlc3Muc3Bhd24oaUNtZCwge1xuICAgICAgICAgICAgICAgIHNoZWxsOiBcImJhc2hcIixcbiAgICAgICAgICAgICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuICAgICAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgICAgICAgZW52OiB7Li4udGhpcy5leHBhbmRlZFZhcmlhYmxlcywgLi4ucHJvY2Vzcy5lbnZ9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVDcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVDcC5vbihcImVycm9yXCIsIChlcnIpID0+IHJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGxJbWFnZSh3cml0ZVN0cmVhbXMsIHRoaXMuaW1hZ2VOYW1lKTtcblxuICAgICAgICAgICAgbGV0IGRvY2tlckNtZCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgZG9ja2VyIGNyZWF0ZSAtLXByaXZpbGVnZWQgLXUgMDowIC1pICR7dGhpcy5nZW5lcmF0ZUluamVjdFNTSEFnZW50T3B0aW9ucygpfSBgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYGRvY2tlciBjcmVhdGUgLXUgMDowIC1pICR7dGhpcy5nZW5lcmF0ZUluamVjdFNTSEFnZW50T3B0aW9ucygpfSBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VydmljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRG9ja2VyTmV0d29yayhgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH1gKTtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yayBnaXRsYWItY2ktbG9jYWwtJHt0aGlzLmpvYklkfSBgO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgc2VydmljZS5nZXROYW1lKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFNlcnZpY2Uod3JpdGVTdHJlYW1zLCBzZXJ2aWNlLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZvbHVtZVByb21pc2VzID0gW107XG4gICAgICAgICAgICB2b2x1bWVQcm9taXNlcy5wdXNoKFV0aWxzLnNwYXduKGBkb2NrZXIgdm9sdW1lIGNyZWF0ZSAke2J1aWxkVm9sdW1lTmFtZX1gLCB0aGlzLmN3ZCkpO1xuICAgICAgICAgICAgdm9sdW1lUHJvbWlzZXMucHVzaChVdGlscy5zcGF3bihgZG9ja2VyIHZvbHVtZSBjcmVhdGUgJHt0bXBWb2x1bWVOYW1lfWAsIHRoaXMuY3dkKSk7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7YnVpbGRWb2x1bWVOYW1lfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9IGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dG1wVm9sdW1lTmFtZX06L3RtcC8gYDtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzLnB1c2goYnVpbGRWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzLnB1c2godG1wVm9sdW1lTmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh2b2x1bWVQcm9taXNlcyk7XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS13b3JrZGlyIC9idWlsZHMvJHtzYWZlSm9iTmFtZX0gYDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2b2x1bWUgb2YgdGhpcy52b2x1bWVzKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke3ZvbHVtZX0gYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBleHRyYUhvc3Qgb2YgdGhpcy5leHRyYUhvc3RzKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWFkZC1ob3N0PSR7ZXh0cmFIb3N0fSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5cG9pbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlRW50cnlwb2ludC5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1lbnRyeXBvaW50IFwiJHtlfVwiIGA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtZSAke2tleX09JyR7U3RyaW5nKHZhbHVlKS50cmltKCl9JyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVwb3J0c0RvdGVudlZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC1lICR7a2V5fT0nJHtTdHJpbmcodmFsdWUpLnRyaW0oKX0nIGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBhd2FpdCB0aGlzLmNyZWF0ZUNhY2hlRG9ja2VyVm9sdW1lTW91bnRzKHNhZmVKb2JOYW1lLCB3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCR7dGhpcy5pbWFnZU5hbWV9IHNoIC1jIFwiXFxuYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImlmIFsgLXggL3Vzci9sb2NhbC9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvbG9jYWwvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvbG9jYWwvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9sb2NhbC9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYnVzeWJveC9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9idXN5Ym94L3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxzZVxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZWNobyBzaGVsbCBub3QgZm91bmRcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4aXQgMVxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZmlcXG5cXFwiXCI7XG5cbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLnNwYXduKGRvY2tlckNtZCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVySWQgPSBjb250YWluZXJJZC5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIpO1xuXG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIC8vIENvcHkgc291cmNlIGZpbGVzIGludG8gY29udGFpbmVyLlxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAuZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8uZG9ja2VyLy4gJHt0aGlzLl9jb250YWluZXJJZH06L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWAsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgICAgICAvLyBDb3B5IGZpbGUgdmFyaWFibGVzIGludG8gY29udGFpbmVyLlxuICAgICAgICAgICAgY29uc3QgZmlsZVZhcmlhYmxlc0ZvbGRlciA9IGAvdG1wL2dpdGxhYi1jaS1sb2NhbC1maWxlLXZhcmlhYmxlcy0ke3RoaXMuZ2l0RGF0YS5DSV9QUk9KRUNUX1BBVEhfU0xVR30vYDtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGZpbGVWYXJpYWJsZXNGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAke2ZpbGVWYXJpYWJsZXNGb2xkZXJ9ICR7dGhpcy5fY29udGFpbmVySWR9OiR7ZmlsZVZhcmlhYmxlc0ZvbGRlcn0vYCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCB0byBjb250YWluZXJ9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUFydGlmYWN0c0luKHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdHJhY2tlZCBmaWxlcyBhbmQgYXJ0aWZhY3RzIGFyZSByb290IG93bmVkIGluIGRvY2tlci1leGVjdXRvciBqb2JzLlxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBydW4gLS1ybSAtdyAvYXBwLyAtdiAke2J1aWxkVm9sdW1lTmFtZX06L2FwcC8gZmlyZWNvdy9naXRsYWItY2ktbG9jYWwtdXRpbCBiYXNoIC1jIFwiY2hvd24gMDowIC1SIC4gJiYgY2htb2QgYStydyAtUiAuXCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbWQgPSBcInNldCAtZW8gcGlwZWZhaWxcXG5cIjtcbiAgICAgICAgY21kICs9IFwiZXhlYyAwPCAvZGV2L251bGxcXG5cIjtcblxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGNtZCArPSBgY2QgLmdpdGxhYi1jaS1sb2NhbC9idWlsZHMvJHtzYWZlSm9iTmFtZX0vXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjbWQgKz0gdGhpcy5nZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHMpO1xuXG4gICAgICAgIGNtZCArPSBcImV4aXQgMFxcblwiO1xuXG4gICAgICAgIGF3YWl0IGZzLm91dHB1dEZpbGUoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWAsIGNtZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgYXdhaXQgZnMuY2htb2QoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWAsIFwiMDc1NVwiKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgLmdpdGxhYi1jaS1sb2NhbC9zY3JpcHRzLy4gJHt0aGlzLl9jb250YWluZXJJZH06L2djbC1zY3JpcHRzL2AsIHRoaXMuY3dkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNwID0gY2hpbGRQcm9jZXNzLnNwYXduKHRoaXMuX2NvbnRhaW5lcklkID8gYGRvY2tlciBzdGFydCAtLWF0dGFjaCAtaSAke3RoaXMuX2NvbnRhaW5lcklkfWAgOiBcImJhc2hcIiwge1xuICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgICBlbnY6IHRoaXMuaW1hZ2VOYW1lID8gey4uLnByb2Nlc3MuZW52fSA6IHsuLi50aGlzLmV4cGFuZGVkVmFyaWFibGVzLCAuLi5yZXBvcnRzRG90ZW52VmFyaWFibGVzLCAuLi5wcm9jZXNzLmVudn0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG91dEZ1bmMgPSAoZTogYW55LCBzdHJlYW06ICh0eHQ6IHN0cmluZykgPT4gdm9pZCwgY29sb3JpemU6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBgJHtlfWAuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHJlYW0oYCR7dGhpcy5jaGFsa0pvYk5hbWV9IGApO1xuICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKFwiXFx1MDAxYlszMm0kXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbShgJHtjb2xvcml6ZShcIj5cIil9IGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJlYW0oYCR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgICAgICBmcy5hcHBlbmRGaWxlU3luYyhvdXRwdXRGaWxlc1BhdGgsIGAke2xpbmV9XFxuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNwLnN0ZG91dC5vbihcImRhdGFcIiwgKGUpID0+IG91dEZ1bmMoZSwgd3JpdGVTdHJlYW1zLnN0ZG91dC5iaW5kKHdyaXRlU3RyZWFtcyksIChzKSA9PiBjaGFsa2B7Z3JlZW5CcmlnaHQgJHtzfX1gKSk7XG4gICAgICAgICAgICBjcC5zdGRlcnIub24oXCJkYXRhXCIsIChlKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRlcnIuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge3JlZEJyaWdodCAke3N9fWApKTtcblxuICAgICAgICAgICAgY3Aub24oXCJleGl0XCIsIChjb2RlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoY29kZSA/PyAwKSwgMTApKTtcbiAgICAgICAgICAgIGNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gc2V0VGltZW91dCgoKSA9PiByZWplY3QoZXJyKSwgMTApKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKGAvZ2NsLXNjcmlwdHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKGAuLy5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdHNPdXQod3JpdGVTdHJlYW1zLCBidWlsZFZvbHVtZU5hbWUpO1xuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHB1bGxJbWFnZSh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgaW1hZ2VUb1B1bGw6IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgbGV0IHB1bGxDbWQgPSBcIlwiO1xuICAgICAgICBwdWxsQ21kICs9IGBkb2NrZXIgaW1hZ2UgbHMgLS1mb3JtYXQgJ3t7LlJlcG9zaXRvcnl9fTp7ey5UYWd9fScgfCBncmVwIC1FICdeJHtpbWFnZVRvUHVsbH0kJ1xcbmA7XG4gICAgICAgIHB1bGxDbWQgKz0gXCJpZiBbIFxcXCIkP1xcXCIgLW5lIDAgXTsgdGhlblxcblwiO1xuICAgICAgICBwdWxsQ21kICs9IGBcXHRlY2hvIFwiUHVsbGluZyAke2ltYWdlVG9QdWxsfVwiXFxuYDtcbiAgICAgICAgcHVsbENtZCArPSBgXFx0ZG9ja2VyIHB1bGwgJHtpbWFnZVRvUHVsbH1cXG5gO1xuICAgICAgICBwdWxsQ21kICs9IFwiZmlcXG5cIjtcbiAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24ocHVsbENtZCwgdGhpcy5jd2QpO1xuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHB1bGxlZH0gJHtpbWFnZVRvUHVsbH0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBwcm9kdWNlcnMgPSB0aGlzLnByb2R1Y2VycztcbiAgICAgICAgbGV0IHByb2R1Y2VyUmVwb3J0c0VudnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWNlciBvZiBwcm9kdWNlcnMgPz8gW10pIHtcbiAgICAgICAgICAgIGlmIChwcm9kdWNlci5kb3RlbnYgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzYWZlUHJvZHVjZXJOYW1lID0gVXRpbHMuZ2V0U2FmZUpvYk5hbWUocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBsZXQgZG90ZW52RmlsZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaGVsbElzb2xhdGlvbiAmJiAhdGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBkb3RlbnZGaWxlID0gYCR7dGhpcy5jd2R9LyR7cHJvZHVjZXIuZG90ZW52fWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvdGVudkZpbGUgPSBgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtzYWZlUHJvZHVjZXJOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52LyR7cHJvZHVjZXIuZG90ZW52fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhkb3RlbnZGaWxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyUmVwb3J0RW52ID0gZG90ZW52LnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGRvdGVudkZpbGUpKTtcbiAgICAgICAgICAgICAgICBwcm9kdWNlclJlcG9ydHNFbnZzID0gey4uLnByb2R1Y2VyUmVwb3J0c0VudnMsIC4uLnByb2R1Y2VyUmVwb3J0RW52fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7eWVsbG93ICcke3Byb2R1Y2VyLmRvdGVudn0nIHByb2R1Y2VkIGJ5ICcke3Byb2R1Y2VyLm5hbWV9JyBjb3VsZCBub3QgYmUgZm91bmR9XFxuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvZHVjZXJSZXBvcnRzRW52cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdHNJbih3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmICF0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucHJvZHVjZXJzIHx8IHRoaXMucHJvZHVjZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuXG4gICAgICAgIGNvbnN0IGNwRnVuYyA9IGFzeW5jIChmb2xkZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmltYWdlTmFtZSAmJiB0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKGByc3luYyAtYSAke2ZvbGRlcn0vLiAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgJHtmb2xkZXJ9Ly4gJHt0aGlzLl9jb250YWluZXJJZH06L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y2VyIG9mIHRoaXMucHJvZHVjZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9kdWNlclNhZmVOYW1lID0gVXRpbHMuZ2V0U2FmZUpvYk5hbWUocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBhcnRpZmFjdEZvbGRlciA9IGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3Byb2R1Y2VyU2FmZU5hbWV9YDtcbiAgICAgICAgICAgIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhhcnRpZmFjdEZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhpdEVycm9yKGAke2FydGlmYWN0Rm9sZGVyfSBkb2Vzbid0IGV4aXN0LCBkaWQgeW91IGZvcmdldCAtLW5lZWRzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNwRnVuYyhhcnRpZmFjdEZvbGRlcikpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0ID0gdGhpcy5pbWFnZU5hbWUgPyBcImNvbnRhaW5lclwiIDogXCJpc29sYXRlZCBzaGVsbFwiO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCBhcnRpZmFjdHMgdG8gJHt0YXJnZXRUZXh0fX0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0c091dCh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgYnVpbGRWb2x1bWVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuXG4gICAgICAgIGlmICghdGhpcy5zaGVsbElzb2xhdGlvbiAmJiAhdGhpcy5pbWFnZU5hbWUgfHwgIXRoaXMuYXJ0aWZhY3RzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgbGV0IGNwQ21kID0gXCJzaG9wdCAtcyBnbG9ic3RhciBudWxsZ2xvYiBkb3RnbG9iXFxuXCI7XG4gICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX1cXG5gO1xuICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0UGF0aCBvZiB0aGlzLmFydGlmYWN0cz8ucGF0aHMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IFV0aWxzLmV4cGFuZFRleHQoYXJ0aWZhY3RQYXRoLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNwQ21kICs9IGBlY2hvIFN0YXJ0ZWQgY29weWluZyAke2V4cGFuZGVkUGF0aH0gdG8gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9XFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGByc3luYyAtUmEgJHtleHBhbmRlZFBhdGh9IC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uXFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGBlY2hvIERvbmUgY29weWluZyAke2V4cGFuZGVkUGF0aH0gdG8gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9XFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYXJ0aWZhY3RFeGNsdWRlUGF0aCBvZiB0aGlzLmFydGlmYWN0cz8uZXhjbHVkZSA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChhcnRpZmFjdEV4Y2x1ZGVQYXRoLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNwQ21kICs9IGBlY2hvIFN0YXJ0ZWQgcmVtb3ZpbmcgZXhjbHVkZSAnJHtleHBhbmRlZFBhdGh9JyBmcm9tIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfVxcbmA7XG4gICAgICAgICAgICBjcENtZCArPSBgbHMgLTFkICcuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vJHtleHBhbmRlZFBhdGh9JyB8IHhhcmdzIC1uMSBybSAtcmYgfHwgdHJ1ZVxcbmA7XG4gICAgICAgICAgICBjcENtZCArPSBgZWNobyBEb25lIHJlbW92aW5nIGV4Y2x1ZGUgJyR7ZXhwYW5kZWRQYXRofScgZnJvbSAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX1cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVwb3J0RG90ZW52ID0gdGhpcy5hcnRpZmFjdHMucmVwb3J0cz8uZG90ZW52ID8/IG51bGw7XG4gICAgICAgIGlmIChyZXBvcnREb3RlbnYgIT0gbnVsbCkge1xuICAgICAgICAgICAgY3BDbWQgKz0gYG1rZGlyIC1wIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52XFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGBlY2hvIFN0YXJ0ZWQgY29weWluZyAke3JlcG9ydERvdGVudn0gdG8gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnZcXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gYHJzeW5jIC1SYSAke3JlcG9ydERvdGVudn0gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvLlxcbmA7XG4gICAgICAgICAgICBjcENtZCArPSBgZWNobyBEb25lIGNvcHlpbmcgJHtyZXBvcnREb3RlbnZ9IHRvIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52XFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlTW91bnRTdHIgPSBhd2FpdCB0aGlzLmNyZWF0ZUNhY2hlRG9ja2VyVm9sdW1lTW91bnRzKHNhZmVKb2JOYW1lLCB3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgY29uc3QgZG9ja2VyQ3JlYXRlQ21kID0gYGRvY2tlciBjcmVhdGUgLWkgJHtjYWNoZU1vdW50U3RyfSAtdiAke2J1aWxkVm9sdW1lTmFtZX06L2J1aWxkcy8ke3NhZmVKb2JOYW1lfS8gLXcgL2J1aWxkcy8ke3NhZmVKb2JOYW1lfS8gZmlyZWNvdy9naXRsYWItY2ktbG9jYWwtdXRpbCBiYXNoIC1jIFwiJHtjcENtZH1cImA7XG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBhcnRpZmFjdHNDb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJDcmVhdGVDbWQsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgIHRoaXMuX2FydGlmYWN0c0NvbnRhaW5lcklkID0gYXJ0aWZhY3RzQ29udGFpbmVySWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLm1rZGlycChgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgc3RhcnQgJHt0aGlzLl9hcnRpZmFjdHNDb250YWluZXJJZH0gLS1hdHRhY2hgKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgJHt0aGlzLl9hcnRpZmFjdHNDb250YWluZXJJZH06L2FydGlmYWN0cy8uIC5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLy5gLCB0aGlzLmN3ZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYG1rZGlyIC1wIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfWAsIGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGJhc2ggLWUgLWMgXCIke2NwQ21kfVwiYCwgYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHNhdmVkIGFydGlmYWN0c30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuXG4gICAgICAgIGlmICh0aGlzLmFydGlmYWN0c1RvU291cmNlKSB7XG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGByc3luYyAtLWV4Y2x1ZGU9Ly5naXRsYWItY2ktcmVwb3J0cy8gLWEgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLiAke3RoaXMuY3dkfWApO1xuICAgICAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYHJzeW5jIC1hICR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvLiAke3RoaXMuY3dkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgYXJ0aWZhY3RzIHRvIGN3ZH0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge2dyZXkgPiBzdGlsbCBydW5uaW5nLi4ufVxcbmApO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIH0sIDEwMDAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4aXRlZFN0cmluZyhzdGFydFRpbWU6IFtudW1iZXIsIG51bWJlcl0sIGNvZGU6IG51bWJlciwgd2FybmluZyA9IGZhbHNlLCBwcmVwZW5kU3RyaW5nID0gXCJcIikge1xuICAgICAgICBjb25zdCBmaW5pc2hlZFN0ciA9IHRoaXMuZ2V0RmluaXNoZWRTdHJpbmcoc3RhcnRUaW1lKTtcbiAgICAgICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gJHtjb2RlLnRvU3RyaW5nKCl9IH0ke3ByZXBlbmRTdHJpbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdSZWQgIEZBSUwgJHtjb2RlLnRvU3RyaW5nKCl9IH0gJHtwcmVwZW5kU3RyaW5nfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaW5pc2hlZFN0cmluZyhzdGFydFRpbWU6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHN0YXJ0VGltZSk7XG4gICAgICAgIGNvbnN0IHRpbWVTdHIgPSBwcmV0dHlIcnRpbWUoZW5kVGltZSk7XG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBmaW5pc2hlZH0gaW4ge21hZ2VudGEgJHt0aW1lU3RyfX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRG9ja2VyTmV0d29yayhuZXR3b3JrTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IG5ldHdvcmtJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIG5ldHdvcmsgY3JlYXRlICR7bmV0d29ya05hbWV9YCk7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQgPSBuZXR3b3JrSWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNhY2hlRG9ja2VyVm9sdW1lTW91bnRzKHNhZmVKb2JOYW1lOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGxldCBjbWQgPSBcIlwiO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNhY2hlTmFtZSA9IGF3YWl0IEpvYi5nZXRVbmlxdWVDYWNoZU5hbWUodGhpcy5jd2QsIGVudHJ5LCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGVudHJ5LnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IG1vdW50aW5nIGNhY2hlfSBmb3IgcGF0aCAke3BhdGh9XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkaXIgPSBgL3RtcC9naXRsYWItY2ktbG9jYWwvY2FjaGUvJHt1bmlxdWVDYWNoZU5hbWV9LyR7cGF0aH1gO1xuICAgICAgICAgICAgICAgIGZzLmVuc3VyZURpclN5bmMoY2FjaGVkaXIpO1xuICAgICAgICAgICAgICAgIGNtZCArPSBgLXYgJHtjYWNoZWRpcn06L2J1aWxkcy8ke3NhZmVKb2JOYW1lfS8ke3BhdGh9IGA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRTZXJ2aWNlKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBzZXJ2aWNlOiBTZXJ2aWNlLCBwcml2aWxlZ2VkOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBkb2NrZXJDbWQgPSBgZG9ja2VyIHJ1biAtZCAtLW5ldHdvcmsgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH0gYDtcblxuICAgICAgICBpZiAocHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1wcml2aWxlZ2VkIFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgKHNlcnZpY2UuZ2V0RW50cnlwb2ludCgpID8/IFtdKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tZW50cnlwb2ludCBcIiR7ZX1cIiBgO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5nZXRBbGlhcyh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLmdldE5hbWUodGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24gPSBzZXJ2aWNlTmFtZS5yZXBsYWNlKC8oLiopKDouKikvLCBcIiQxXCIpO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gW3NlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZShcIi9cIiwgXCItXCIpLCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2UoXCIvXCIsIFwiX19cIildO1xuICAgICAgICBpZiAoc2VydmljZUFsaWFzKSB7XG4gICAgICAgICAgICBhbGlhc2VzLnB1c2goc2VydmljZUFsaWFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yay1hbGlhcz0ke2FsaWFzfSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5leHBhbmRlZFZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLWUgJHtrZXl9PVwiJHtTdHJpbmcodmFsdWUpLnRyaW0oKX1cIiBgO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9ja2VyQ21kICs9IGAke3NlcnZpY2VOYW1lfWA7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBzZXJ2aWNlLmdldENvbW1hbmQodGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCAke2NvbW1hbmR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJDbWQsIHRoaXMuY3dkKTtcbiAgICAgICAgdGhpcy5fc2VydmljZUlkcy5wdXNoKGNvbnRhaW5lcklkLnJlcGxhY2UoL1xccj9cXG4vZywgXCJcIikpO1xuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHN0YXJ0ZWQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gd2l0aCBhbGlhc2VzOiAke2FsaWFzZXMuam9pbihcIiwgXCIpfX0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cbn1cbiJdfQ==
802
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQWlDO0FBQ2pDLDREQUE4QztBQUM5Qyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLDBEQUFrQztBQUNsQyxtREFBNkM7QUFDN0MsbUNBQThCO0FBSzlCLHVDQUFpQztBQUNqQywrQ0FBeUM7QUFDekMsbUNBQThCO0FBRTlCLE1BQWEsR0FBRztJQXdDWixZQUFZLEdBQWU7UUFqQm5CLHdCQUFtQixHQUFrQixJQUFJLENBQUM7UUFDMUMsMEJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDdkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN4QywwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFDckMsOEJBQXlCLEdBQW1CLENBQUMsQ0FBUSxDQUFDO1FBQ3RELGVBQVUsR0FBcUQsSUFBSSxDQUFDO1FBRXBFLHVCQUFrQixHQUFhLEVBQUUsQ0FBQztRQVF0QyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM1QixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUNsRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBRXRDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FB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QU8sYUFBYSxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMvSzthQUNKO1NBQ0o7SUFDTCxDQUFDOztBQW40Qkwsa0JBbzRCQztBQWw0Qm1CLG1CQUFlLEdBQUc7SUFDOUIsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxVQUFVO0lBQ3JELFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTO0lBQ3RELGNBQWMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVU7Q0FDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCAqIGFzIGRvdGVudiBmcm9tIFwiZG90ZW52XCI7XG5pbXBvcnQgKiBhcyBjaGlsZFByb2Nlc3MgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHByZXR0eUhydGltZSBmcm9tIFwicHJldHR5LWhydGltZVwiO1xuaW1wb3J0IGNhbWVsQ2FzZSBmcm9tIFwiY2FtZWxjYXNlXCI7XG5pbXBvcnQge0V4aXRFcnJvcn0gZnJvbSBcIi4vdHlwZXMvZXhpdC1lcnJvclwiO1xuaW1wb3J0IHtVdGlsc30gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7Sm9iT3B0aW9uc30gZnJvbSBcIi4vdHlwZXMvam9iLW9wdGlvbnNcIjtcbmltcG9ydCB7V3JpdGVTdHJlYW1zfSBmcm9tIFwiLi90eXBlcy93cml0ZS1zdHJlYW1zXCI7XG5pbXBvcnQge1NlcnZpY2V9IGZyb20gXCIuL3NlcnZpY2VcIjtcbmltcG9ydCB7R2l0RGF0YX0gZnJvbSBcIi4vZ2l0LWRhdGFcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9hc3NlcnRzXCI7XG5pbXBvcnQge0NhY2hlRW50cnl9IGZyb20gXCIuL2NhY2hlLWVudHJ5XCI7XG5pbXBvcnQge011dGV4fSBmcm9tIFwiLi9tdXRleFwiO1xuXG5leHBvcnQgY2xhc3MgSm9iIHtcblxuICAgIHN0YXRpYyByZWFkb25seSBpbGxlZ2FsSm9iTmFtZXMgPSBbXG4gICAgICAgIFwiaW5jbHVkZVwiLCBcImxvY2FsX2NvbmZpZ3VyYXRpb25cIiwgXCJpbWFnZVwiLCBcInNlcnZpY2VzXCIsXG4gICAgICAgIFwic3RhZ2VzXCIsIFwicGFnZXNcIiwgXCJ0eXBlc1wiLCBcImJlZm9yZV9zY3JpcHRcIiwgXCJkZWZhdWx0XCIsXG4gICAgICAgIFwiYWZ0ZXJfc2NyaXB0XCIsIFwidmFyaWFibGVzXCIsIFwiY2FjaGVcIiwgXCJ3b3JrZmxvd1wiLFxuICAgIF07XG5cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgam9iTmFtZVBhZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGRlcGVuZGVuY2llczogc3RyaW5nW10gfCBudWxsO1xuICAgIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBuYW1lOiBzdHJpbmc7IHVybDogc3RyaW5nIHwgbnVsbCB9O1xuICAgIHJlYWRvbmx5IGpvYklkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcnVsZXM/OiB7IGlmOiBzdHJpbmc7IHdoZW46IHN0cmluZzsgYWxsb3dfZmFpbHVyZTogYm9vbGVhbiB9W107XG4gICAgcmVhZG9ubHkgZXhwYW5kZWRWYXJpYWJsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgcmVhZG9ubHkgYWxsb3dGYWlsdXJlOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHdoZW46IHN0cmluZztcbiAgICByZWFkb25seSBwaXBlbGluZUlpZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGdpdERhdGE6IEdpdERhdGE7XG4gICAgcmVhZG9ubHkgc2hlbGxJc29sYXRpb246IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgbW91bnRDYWNoZTogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgX3ByZXNjcmlwdHNFeGl0Q29kZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPSAwO1xuICAgIHByaXZhdGUgX2NvdmVyYWdlUGVyY2VudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfcnVubmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9zZXJ2aWNlTmV0d29ya0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9jb250YWluZXJWb2x1bWVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0ID0gLTEgYXMgYW55O1xuICAgIHByaXZhdGUgX3Byb2R1Y2VyczogeyBuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbCB9W10gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2NvbnRhaW5lcnNUb0NsZWFuOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBqb2JEYXRhOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV4dHJhSG9zdHM6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdm9sdW1lczogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihvcHQ6IEpvYk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICBjb25zdCBnaXREYXRhID0gb3B0LmdpdERhdGE7XG4gICAgICAgIGNvbnN0IGdsb2JhbHMgPSBvcHQuZ2xvYmFscztcbiAgICAgICAgY29uc3QgdmFyaWFibGVzRnJvbUZpbGVzID0gb3B0LnZhcmlhYmxlc0Zyb21GaWxlcztcbiAgICAgICAgY29uc3QgY2xpVmFyaWFibGVzID0gb3B0LmNsaVZhcmlhYmxlcztcblxuICAgICAgICB0aGlzLm1vdW50Q2FjaGUgPSBvcHQubW91bnRDYWNoZTtcbiAgICAgICAgdGhpcy5leHRyYUhvc3RzID0gb3B0LmV4dHJhSG9zdHM7XG4gICAgICAgIHRoaXMudm9sdW1lcyA9IG9wdC52b2x1bWVzO1xuICAgICAgICB0aGlzLndyaXRlU3RyZWFtcyA9IG9wdC53cml0ZVN0cmVhbXM7XG4gICAgICAgIHRoaXMuam9iTmFtZVBhZCA9IG9wdC5uYW1lUGFkO1xuICAgICAgICB0aGlzLmdpdERhdGEgPSBvcHQuZ2l0RGF0YTtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0Lm5hbWU7XG4gICAgICAgIHRoaXMuY3dkID0gb3B0LmN3ZDtcbiAgICAgICAgdGhpcy5qb2JJZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApO1xuICAgICAgICB0aGlzLmpvYkRhdGEgPSBvcHQuZGF0YTtcbiAgICAgICAgdGhpcy5waXBlbGluZUlpZCA9IG9wdC5waXBlbGluZUlpZDtcbiAgICAgICAgdGhpcy5zaGVsbElzb2xhdGlvbiA9IG9wdC5zaGVsbElzb2xhdGlvbjtcblxuICAgICAgICB0aGlzLndoZW4gPSBqb2JEYXRhLndoZW4gfHwgXCJvbl9zdWNjZXNzXCI7XG4gICAgICAgIHRoaXMuYWxsb3dGYWlsdXJlID0gam9iRGF0YS5hbGxvd19mYWlsdXJlID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGpvYkRhdGEuZGVwZW5kZW5jaWVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMucnVsZXMgPSBqb2JEYXRhLnJ1bGVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0eXBlb2Ygam9iRGF0YS5lbnZpcm9ubWVudCA9PT0gXCJzdHJpbmdcIiA/IHtuYW1lOiBqb2JEYXRhLmVudmlyb25tZW50fSA6IGpvYkRhdGEuZW52aXJvbm1lbnQ7XG5cbiAgICAgICAgbGV0IENJX1BST0pFQ1RfRElSID0gYCR7dGhpcy5jd2R9YDtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBDSV9QUk9KRUNUX0RJUiA9IGAvYnVpbGRzLyR7dGhpcy5zYWZlSm9iTmFtZX1gO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIENJX1BST0pFQ1RfRElSID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7dGhpcy5zYWZlSm9iTmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZGVmaW5lZFZhcmlhYmxlcyA9IHtcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX0xPR0lOOiBnaXREYXRhLnVzZXJbXCJHSVRMQUJfVVNFUl9MT0dJTlwiXSxcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX0VNQUlMOiBnaXREYXRhLnVzZXJbXCJHSVRMQUJfVVNFUl9FTUFJTFwiXSxcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX05BTUU6IGdpdERhdGEudXNlcltcIkdJVExBQl9VU0VSX05BTUVcIl0sXG4gICAgICAgICAgICBHSVRMQUJfVVNFUl9JRDogZ2l0RGF0YS51c2VyW1wiR0lUTEFCX1VTRVJfSURcIl0sXG4gICAgICAgICAgICBDSV9DT01NSVRfU0hPUlRfU0hBOiBnaXREYXRhLmNvbW1pdC5TSE9SVF9TSEEsIC8vIENoYW5nZXNcbiAgICAgICAgICAgIENJX0NPTU1JVF9TSEE6IGdpdERhdGEuY29tbWl0LlNIQSxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfRElSLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9OQU1FOiBnaXREYXRhLnJlbW90ZS5wcm9qZWN0LFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9USVRMRTogYCR7Y2FtZWxDYXNlKGdpdERhdGEucmVtb3RlLnByb2plY3QpfWAsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX1BBVEg6IGdpdERhdGEuQ0lfUFJPSkVDVF9QQVRILFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9QQVRIX1NMVUc6IGdpdERhdGEuQ0lfUFJPSkVDVF9QQVRIX1NMVUcsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX05BTUVTUEFDRTogYCR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9YCxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfVklTSUJJTElUWTogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9JRDogXCIxMjE3XCIsXG4gICAgICAgICAgICBDSV9DT01NSVRfUkVGX1BST1RFQ1RFRDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgQ0lfQ09NTUlUX0JSQU5DSDogZ2l0RGF0YS5jb21taXQuUkVGX05BTUUsIC8vIE5vdCBhdmFpbGFibGUgaW4gbWVyZ2UgcmVxdWVzdCBvciB0YWcgcGlwZWxpbmVzXG4gICAgICAgICAgICBDSV9DT01NSVRfUkVGX05BTUU6IGdpdERhdGEuY29tbWl0LlJFRl9OQU1FLCAvLyBUYWcgb3IgYnJhbmNoIG5hbWVcbiAgICAgICAgICAgIENJX0NPTU1JVF9SRUZfU0xVRzogZ2l0RGF0YS5jb21taXQuUkVGX05BTUUucmVwbGFjZSgvW15hLXowLTldKy9pZywgXCItXCIpLnJlcGxhY2UoL14tLywgXCJcIikucmVwbGFjZSgvLSQvLCBcIlwiKS5zbGljZSgwLCA2MykudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIENJX0NPTU1JVF9USVRMRTogXCJDb21taXQgVGl0bGVcIiwgLy8gRmlyc3QgbGluZSBvZiBjb21taXQgbWVzc2FnZS5cbiAgICAgICAgICAgIENJX0NPTU1JVF9NRVNTQUdFOiBcIkNvbW1pdCBUaXRsZVxcbk1vcmUgY29tbWl0IHRleHRcIiwgLy8gRnVsbCBjb21taXQgbWVzc2FnZVxuICAgICAgICAgICAgQ0lfQ09NTUlUX0RFU0NSSVBUSU9OOiBcIk1vcmUgY29tbWl0IHRleHRcIixcbiAgICAgICAgICAgIENJX1BJUEVMSU5FX1NPVVJDRTogXCJwdXNoXCIsXG4gICAgICAgICAgICBDSV9KT0JfSUQ6IGAke3RoaXMuam9iSWR9YCxcbiAgICAgICAgICAgIENJX1BJUEVMSU5FX0lEOiBgJHt0aGlzLnBpcGVsaW5lSWlkICsgMTAwMH1gLFxuICAgICAgICAgICAgQ0lfUElQRUxJTkVfSUlEOiBgJHt0aGlzLnBpcGVsaW5lSWlkfWAsXG4gICAgICAgICAgICBDSV9TRVJWRVJfSE9TVDogYCR7Z2l0RGF0YS5yZW1vdGUuaG9zdH1gLFxuICAgICAgICAgICAgQ0lfU0VSVkVSX1BPUlQ6IGAke2dpdERhdGEucmVtb3RlLnBvcnR9YCxcbiAgICAgICAgICAgIENJX1NFUlZFUl9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH06NDQzYCxcbiAgICAgICAgICAgIENJX1NFUlZFUl9QUk9UT0NPTDogXCJodHRwc1wiLFxuICAgICAgICAgICAgQ0lfQVBJX1Y0X1VSTDogYGh0dHBzOi8vJHtnaXREYXRhLnJlbW90ZS5ob3N0fS9hcGkvdjRgLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fWAsXG4gICAgICAgICAgICBDSV9KT0JfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vLS9qb2JzLyR7dGhpcy5qb2JJZH1gLCAvLyBDaGFuZ2VzIG9uIHJlcnVuLlxuICAgICAgICAgICAgQ0lfUElQRUxJTkVfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vcGlwZWxpbmVzLyR7dGhpcy5waXBlbGluZUlpZH1gLFxuICAgICAgICAgICAgQ0lfSk9CX05BTUU6IGAke3RoaXMubmFtZX1gLFxuICAgICAgICAgICAgQ0lfSk9CX1NUQUdFOiBgJHt0aGlzLnN0YWdlfWAsXG4gICAgICAgICAgICBDSV9SRUdJU1RSWTogZ2l0RGF0YS5DSV9SRUdJU1RSWSxcbiAgICAgICAgICAgIENJX1JFR0lTVFJZX0lNQUdFOiBnaXREYXRhLkNJX1JFR0lTVFJZX0lNQUdFLFxuICAgICAgICAgICAgR0lUTEFCX0NJOiBcImZhbHNlXCIsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIGV4cGFuZGVkIHZhcmlhYmxlc1xuICAgICAgICBjb25zdCBlbnZzID0gey4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmdsb2JhbHMudmFyaWFibGVzIHx8IHt9LCAuLi5qb2JEYXRhLnZhcmlhYmxlcyB8fCB7fSwgLi4udmFyaWFibGVzRnJvbUZpbGVzLCAuLi5jbGlWYXJpYWJsZXN9O1xuICAgICAgICBjb25zdCBleHBhbmRlZEdsb2JhbFZhcmlhYmxlcyA9IFV0aWxzLmV4cGFuZFZhcmlhYmxlcyhnbG9iYWxzLnZhcmlhYmxlcyB8fCB7fSwgZW52cyk7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkSm9iVmFyaWFibGVzID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKGpvYkRhdGEudmFyaWFibGVzIHx8IHt9LCBlbnZzKTtcbiAgICAgICAgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyA9IHsuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5leHBhbmRlZEdsb2JhbFZhcmlhYmxlcywgLi4uZXhwYW5kZWRKb2JWYXJpYWJsZXMsIC4uLnZhcmlhYmxlc0Zyb21GaWxlcywgLi4uY2xpVmFyaWFibGVzfTtcblxuICAgICAgICAvLyBTZXQge3doZW4sIGFsbG93RmFpbHVyZX0gYmFzZWQgb24gcnVsZXMgcmVzdWx0XG4gICAgICAgIGlmICh0aGlzLnJ1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlUmVzdWx0ID0gVXRpbHMuZ2V0UnVsZXNSZXN1bHQodGhpcy5ydWxlcywgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICB0aGlzLndoZW4gPSBydWxlUmVzdWx0LndoZW47XG4gICAgICAgICAgICB0aGlzLmFsbG93RmFpbHVyZSA9IHJ1bGVSZXN1bHQuYWxsb3dGYWlsdXJlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUgJiYgKHRoaXMud2hlbiAhPT0gXCJtYW51YWxcIiB8fCB0aGlzLmltYWdlTmFtZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoYCR7dGhpcy5jaGFsa0pvYk5hbWV9IEBJbnRlcmFjdGl2ZSBkZWNvcmF0b3IgY2Fubm90IGhhdmUgaW1hZ2U6IGFuZCBtdXN0IGJlIHdoZW46bWFudWFsYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmplY3RTU0hBZ2VudCAmJiB0aGlzLmltYWdlTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihgJHt0aGlzLmNoYWxrSm9iTmFtZX0gQEluamVjdFNTSEFnZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBpbWFnZTpgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSAmJiB0aGlzLm1vdW50Q2FjaGUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICAgICAgYy5wYXRocy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIipcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoYCR7dGhpcy5uYW1lfSBjYW5ub3QgaGF2ZSAqIGluIGNhY2hlIHBhdGhzLCB3aGVuIC0tbW91bnQtY2FjaGUgaXMgZW5hYmxlZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYXJ0aWZhY3RzVG9Tb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNUb1NvdXJjZVwiXSA9PSBudWxsID8gdHJ1ZSA6IHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1RvU291cmNlXCJdO1xuICAgIH1cblxuICAgIGdldCBjaGFsa0pvYk5hbWUoKSB7XG4gICAgICAgIHJldHVybiBjaGFsa2B7Ymx1ZUJyaWdodCAke3RoaXMubmFtZS5wYWRFbmQodGhpcy5qb2JOYW1lUGFkKX19YDtcbiAgICB9XG5cbiAgICBnZXQgc2FmZUpvYk5hbWUoKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5nZXRTYWZlSm9iTmFtZSh0aGlzLm5hbWUpO1xuICAgIH1cblxuICAgIGdldCBuZWVkcygpOiB7am9iOiBzdHJpbmc7IGFydGlmYWN0czogYm9vbGVhbn1bXSB8IG51bGwge1xuICAgICAgICBjb25zdCBuZWVkcyA9IHRoaXMuam9iRGF0YVtcIm5lZWRzXCJdO1xuICAgICAgICBpZiAoIW5lZWRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgbGlzdDoge2pvYjogc3RyaW5nOyBhcnRpZmFjdHM6IGJvb2xlYW59W10gPSBbXTtcbiAgICAgICAgbmVlZHMuZm9yRWFjaCgobmVlZDogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgIGpvYjogdHlwZW9mIG5lZWQgPT09IFwic3RyaW5nXCIgPyBuZWVkIDogbmVlZC5qb2IsXG4gICAgICAgICAgICAgICAgYXJ0aWZhY3RzOiB0eXBlb2YgbmVlZCA9PT0gXCJzdHJpbmdcIiA/IHRydWUgOiBuZWVkLmFydGlmYWN0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgZ2V0IGNhY2hlKCk6IENhY2hlRW50cnlbXSB7XG4gICAgICAgIGxldCBjYWNoZURhdGEgPSB0aGlzLmpvYkRhdGFbXCJjYWNoZVwiXTtcbiAgICAgICAgY29uc3QgY2FjaGVMaXN0OiBDYWNoZUVudHJ5W10gPSBbXTtcbiAgICAgICAgaWYgKCFjYWNoZURhdGEpIHJldHVybiBbXTtcblxuICAgICAgICBjYWNoZURhdGEgPSBBcnJheS5pc0FycmF5KGNhY2hlRGF0YSkgPyBjYWNoZURhdGEgOiBbY2FjaGVEYXRhXTtcbiAgICAgICAgY2FjaGVEYXRhLmZvckVhY2goKGM6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gY1tcImtleVwiXTtcbiAgICAgICAgICAgIGNvbnN0IHBvbGljeSA9IGNbXCJwb2xpY3lcIl0gPz8gXCJwdWxsLXB1c2hcIjtcbiAgICAgICAgICAgIGlmICghW1wicHVsbFwiLCBcInB1c2hcIiwgXCJwdWxsLXB1c2hcIl0uaW5jbHVkZXMocG9saWN5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoXCJjYWNoZSBwb2xpY3kgaXMgbm90ICdwdWxsJywgJ3B1c2gnIG9yICdwdWxsLXB1c2gnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBjW1wicGF0aHNcIl0gPz8gW107XG4gICAgICAgICAgICBjYWNoZUxpc3QucHVzaChuZXcgQ2FjaGVFbnRyeShrZXksIHBhdGhzLCBwb2xpY3kpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYWNoZUxpc3Q7XG4gICAgfVxuXG4gICAgZ2V0IGJ1aWxkVm9sdW1lTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYGdjbC0ke3RoaXMuc2FmZUpvYk5hbWV9LSR7dGhpcy5qb2JJZH0tYnVpbGRgO1xuICAgIH1cblxuICAgIGdldCB0bXBWb2x1bWVOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS10bXBgO1xuICAgIH1cblxuICAgIGdldCBpbWFnZU5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5qb2JEYXRhW1wiaW1hZ2VcIl07XG4gICAgICAgIGlmICghaW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gVXRpbHMuZXhwYW5kVGV4dChpbWFnZS5uYW1lLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgcmV0dXJuIGltYWdlTmFtZS5pbmNsdWRlcyhcIjpcIikgPyBpbWFnZU5hbWUgOiBgJHtpbWFnZU5hbWV9OmxhdGVzdGA7XG4gICAgfVxuXG4gICAgZ2V0IGltYWdlRW50cnlwb2ludCgpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuam9iRGF0YVtcImltYWdlXCJdO1xuXG4gICAgICAgIGlmICghaW1hZ2UgfHwgIWltYWdlLmVudHJ5cG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2UuZW50cnlwb2ludCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihcImltYWdlOmVudHJ5cG9pbnQgbXVzdCBiZSBhbiBhcnJheVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1hZ2UuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICBnZXQgc2VydmljZXMoKTogU2VydmljZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInNlcnZpY2VzXCJdO1xuICAgIH1cblxuICAgIGdldCBwcm9kdWNlcnMoKTogeyBuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbCB9W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2R1Y2VycztcbiAgICB9XG5cbiAgICBzZXQgcHJvZHVjZXJzKHByb2R1Y2VyczogeyBuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbCB9W10gfCBudWxsKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLl9wcm9kdWNlcnMgPT0gbnVsbCwgXCJ0aGlzLl9wcm9kdWNlcnMgY2FuIG9ubHkgYmUgc2V0IG9uY2VcIik7XG4gICAgICAgIHRoaXMuX3Byb2R1Y2VycyA9IHByb2R1Y2VycztcbiAgICB9XG5cbiAgICBnZXQgc3RhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInN0YWdlXCJdIHx8IFwidGVzdFwiO1xuICAgIH1cblxuICAgIGdldCBpbnRlcmFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImludGVyYWN0aXZlXCJdIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBpbmplY3RTU0hBZ2VudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImluamVjdFNTSEFnZW50XCJdIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiZGVzY3JpcHRpb25cIl0gPz8gXCJcIjtcbiAgICB9XG5cbiAgICBnZXQgYXJ0aWZhY3RzKCk6IHsgcGF0aHM/OiBzdHJpbmdbXTsgZXhjbHVkZT86IHN0cmluZ1tdOyByZXBvcnRzPzogeyBkb3RlbnY/OiBzdHJpbmcgfSB9fG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiYXJ0aWZhY3RzXCJdO1xuICAgIH1cblxuICAgIGdldCBiZWZvcmVTY3JpcHRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImJlZm9yZV9zY3JpcHRcIl0gfHwgW107XG4gICAgfVxuXG4gICAgZ2V0IGFmdGVyU2NyaXB0cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhZnRlcl9zY3JpcHRcIl0gfHwgW107XG4gICAgfVxuXG4gICAgZ2V0IHNjcmlwdHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wic2NyaXB0XCJdO1xuICAgIH1cblxuICAgIGdldCBwcmVTY3JpcHRzRXhpdENvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGU7XG4gICAgfVxuXG4gICAgZ2V0IGFmdGVyU2NyaXB0c0V4aXRDb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGU7XG4gICAgfVxuXG4gICAgZ2V0IHJ1bm5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5uaW5nO1xuICAgIH1cblxuICAgIGdldCBzdGFydGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVubmluZyB8fCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGZpbmlzaGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3J1bm5pbmcgJiYgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlICE9PSBudWxsO1xuICAgIH1cblxuICAgIGdldCBjb3ZlcmFnZVBlcmNlbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhcnQocHJpdmlsZWdlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgY29uc3Qgc2FmZUpvYm5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuXG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IGZzLmVuc3VyZUZpbGUoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvb3V0cHV0LyR7c2FmZUpvYm5hbWV9LmxvZ2ApO1xuICAgICAgICBhd2FpdCBmcy50cnVuY2F0ZShgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9vdXRwdXQvJHtzYWZlSm9ibmFtZX0ubG9nYCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHN0YXJ0aW5nfSAke3RoaXMuaW1hZ2VOYW1lID8/IFwic2hlbGxcIn0gKHt5ZWxsb3cgJHt0aGlzLnN0YWdlfX0pXFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVzY3JpcHRzID0gdGhpcy5iZWZvcmVTY3JpcHRzLmNvbmNhdCh0aGlzLnNjcmlwdHMpO1xuICAgICAgICB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPSBhd2FpdCB0aGlzLmV4ZWNTY3JpcHRzKHByZXNjcmlwdHMsIHByaXZpbGVnZWQpO1xuICAgICAgICBpZiAodGhpcy5hZnRlclNjcmlwdHMubGVuZ3RoID09PSAwICYmIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDAgJiYgIXRoaXMuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCBmYWxzZSl9XFxuYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFmdGVyU2NyaXB0cy5sZW5ndGggPT09IDAgJiYgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCAmJiB0aGlzLmFsbG93RmFpbHVyZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyhzdGFydFRpbWUsIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSwgdHJ1ZSl9XFxuYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPiAwICYmIHRoaXMuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCB0cnVlKX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPiAwICYmICF0aGlzLmFsbG93RmFpbHVyZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyhzdGFydFRpbWUsIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSwgZmFsc2UpfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJTY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlID0gYXdhaXQgdGhpcy5leGVjU2NyaXB0cyh0aGlzLmFmdGVyU2NyaXB0cywgcHJpdmlsZWdlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPiAwKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUsIHRydWUsIFwiIGFmdGVyX3NjcmlwdFwiKX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoYCR7dGhpcy5nZXRGaW5pc2hlZFN0cmluZyhzdGFydFRpbWUpfVxcbmApO1xuXG4gICAgICAgIGlmICh0aGlzLmpvYkRhdGEuY292ZXJhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvdmVyYWdlUGVyY2VudCA9IGF3YWl0IFV0aWxzLmdldENvdmVyYWdlUGVyY2VudCh0aGlzLmN3ZCwgdGhpcy5qb2JEYXRhLmNvdmVyYWdlLCBzYWZlSm9ibmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBSZXNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGNsZWFudXBSZXNvdXJjZXMoKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgcm0gLWYgJHtpZH1gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zZXJ2aWNlTmV0d29ya0lkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgbmV0d29yayBybSAke3RoaXMuX3NlcnZpY2VOZXR3b3JrSWR9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lclZvbHVtZSBvZiB0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIHZvbHVtZSBybSAke2NvbnRhaW5lclZvbHVtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5qZWN0U1NIQWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiIHx8IChwcm9jZXNzLmVudi5PU1RZUEU/Lm1hdGNoKC9eZGFyd2luLykgPz8gbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi0tZW52IFNTSF9BVVRIX1NPQ0s9L3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2sgLXYgL3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2s6L3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYC0tZW52IFNTSF9BVVRIX1NPQ0s9JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfSAtdiAke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9OiR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS31gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzOiBzdHJpbmdbXSkge1xuICAgICAgICBsZXQgY21kID0gXCJcIjtcbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAgICAgICAgIC8vIFByaW50IGNvbW1hbmQgZWNobydlZCBpbiBjb2xvclxuICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSBzY3JpcHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpbGluZVRleHQgPSBzcGxpdC5sZW5ndGggPiAxID8gXCIgIyBjb2xsYXBzZWQgbXVsdGktbGluZSBjb21tYW5kXCIgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNwbGl0WzBdPy5yZXBsYWNlKC9bXFxcXF0vZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9bXCJdL2csIFwiXFxcXFxcXCJcIikucmVwbGFjZSgvWyRdL2csIFwiXFxcXCRcIik7XG4gICAgICAgICAgICBjbWQgKz0gY2hhbGtgZWNobyBcIntncmVlbiAkICR7dGV4dH0ke211bHRpbGluZVRleHR9fVwiXFxuYDtcblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhY3R1YWwgc2NyaXB0XG4gICAgICAgICAgICBjbWQgKz0gYCR7c2NyaXB0fVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW91bnRDYWNoZUNtZChzYWZlSm9iTmFtZTogc3RyaW5nLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUgJiYgIXRoaXMubW91bnRDYWNoZSkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgbGV0IGNtZCA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVDYWNoZU5hbWUgPSBhd2FpdCBjLmdldFVuaXF1ZUNhY2hlTmFtZSh0aGlzLmN3ZCwgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICBjLnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IG1vdW50aW5nIGNhY2hlfSBmb3IgcGF0aCAke3BhdGh9XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVNb3VudCA9IGBnY2wtJHt0aGlzLmV4cGFuZGVkVmFyaWFibGVzLkNJX1BST0pFQ1RfUEFUSF9TTFVHfS0ke3VuaXF1ZUNhY2hlTmFtZX1gO1xuICAgICAgICAgICAgICAgIGNtZCArPSBgLXYgJHtjYWNoZU1vdW50fTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9LyR7cGF0aH0gYDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjU2NyaXB0cyhzY3JpcHRzOiBzdHJpbmdbXSwgcHJpdmlsZWdlZDogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3Qgb3V0cHV0RmlsZXNQYXRoID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvb3V0cHV0LyR7c2FmZUpvYk5hbWV9LmxvZ2A7XG4gICAgICAgIGNvbnN0IGJ1aWxkVm9sdW1lTmFtZSA9IHRoaXMuYnVpbGRWb2x1bWVOYW1lO1xuICAgICAgICBjb25zdCB0bXBWb2x1bWVOYW1lID0gdGhpcy50bXBWb2x1bWVOYW1lO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgY29uc3QgcmVwb3J0c0RvdGVudlZhcmlhYmxlcyA9IGF3YWl0IHRoaXMuaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyh3cml0ZVN0cmVhbXMpO1xuICAgICAgICBsZXQgdGltZTtcbiAgICAgICAgbGV0IGVuZFRpbWU7XG5cbiAgICAgICAgaWYgKHNjcmlwdHMubGVuZ3RoID09PSAwIHx8IHNjcmlwdHNbMF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IGdpdCB0cmFja2VkIGZpbGVzIHRvIGJ1aWxkIGZvbGRlciBpZiBzaGVsbCBpc29sYXRpb24gZW5hYmxlZC5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlTmFtZSAmJiB0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5yc3luY1RyYWNrZWRGaWxlcyh0aGlzLmN3ZCwgYCR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgY29uc3QgaUNtZCA9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGludGVyYWN0aXZlQ3AgPSBjaGlsZFByb2Nlc3Muc3Bhd24oaUNtZCwge1xuICAgICAgICAgICAgICAgIHNoZWxsOiBcImJhc2hcIixcbiAgICAgICAgICAgICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuICAgICAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgICAgICAgZW52OiB7Li4udGhpcy5leHBhbmRlZFZhcmlhYmxlcywgLi4ucHJvY2Vzcy5lbnZ9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVDcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVDcC5vbihcImVycm9yXCIsIChlcnIpID0+IHJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGxJbWFnZSh3cml0ZVN0cmVhbXMsIHRoaXMuaW1hZ2VOYW1lKTtcblxuICAgICAgICAgICAgbGV0IGRvY2tlckNtZCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgZG9ja2VyIGNyZWF0ZSAtLXByaXZpbGVnZWQgLXUgMDowIC1pICR7dGhpcy5nZW5lcmF0ZUluamVjdFNTSEFnZW50T3B0aW9ucygpfSBgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYGRvY2tlciBjcmVhdGUgLXUgMDowIC1pICR7dGhpcy5nZW5lcmF0ZUluamVjdFNTSEFnZW50T3B0aW9ucygpfSBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VydmljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRG9ja2VyTmV0d29yayhgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH1gKTtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yayBnaXRsYWItY2ktbG9jYWwtJHt0aGlzLmpvYklkfSBgO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgc2VydmljZS5nZXROYW1lKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFNlcnZpY2Uod3JpdGVTdHJlYW1zLCBzZXJ2aWNlLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlSGVhbHRoQ2hlY2sod3JpdGVTdHJlYW1zLCBzZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZvbHVtZVByb21pc2VzID0gW107XG4gICAgICAgICAgICB2b2x1bWVQcm9taXNlcy5wdXNoKFV0aWxzLnNwYXduKGBkb2NrZXIgdm9sdW1lIGNyZWF0ZSAke2J1aWxkVm9sdW1lTmFtZX1gLCB0aGlzLmN3ZCkpO1xuICAgICAgICAgICAgdm9sdW1lUHJvbWlzZXMucHVzaChVdGlscy5zcGF3bihgZG9ja2VyIHZvbHVtZSBjcmVhdGUgJHt0bXBWb2x1bWVOYW1lfWAsIHRoaXMuY3dkKSk7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7YnVpbGRWb2x1bWVOYW1lfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9IGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dG1wVm9sdW1lTmFtZX06L3RtcC8gYDtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzLnB1c2goYnVpbGRWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzLnB1c2godG1wVm9sdW1lTmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh2b2x1bWVQcm9taXNlcyk7XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS13b3JrZGlyIC9idWlsZHMvJHtzYWZlSm9iTmFtZX0gYDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2b2x1bWUgb2YgdGhpcy52b2x1bWVzKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke3ZvbHVtZX0gYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBleHRyYUhvc3Qgb2YgdGhpcy5leHRyYUhvc3RzKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWFkZC1ob3N0PSR7ZXh0cmFIb3N0fSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5cG9pbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlRW50cnlwb2ludC5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1lbnRyeXBvaW50IFwiJHtlfVwiIGA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtZSAke2tleX09JyR7U3RyaW5nKHZhbHVlKS50cmltKCl9JyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVwb3J0c0RvdGVudlZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC1lICR7a2V5fT0nJHtTdHJpbmcodmFsdWUpLnRyaW0oKX0nIGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBhd2FpdCB0aGlzLm1vdW50Q2FjaGVDbWQoc2FmZUpvYk5hbWUsIHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgJHt0aGlzLmltYWdlTmFtZX0gc2ggLWMgXCJcXG5gO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiaWYgWyAteCAvdXNyL2xvY2FsL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9sb2NhbC9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9sb2NhbC9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2xvY2FsL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9idXN5Ym94L3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2J1c3lib3gvc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbHNlXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRlY2hvIHNoZWxsIG5vdCBmb3VuZFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhpdCAxXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJmaVxcblxcXCJcIjtcblxuICAgICAgICAgICAgY29uc3Qge3N0ZG91dDogY29udGFpbmVySWR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oZG9ja2VyQ21kLCB0aGlzLmN3ZCk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJJZCA9IGNvbnRhaW5lcklkLnJlcGxhY2UoL1xccj9cXG4vZywgXCJcIik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJzVG9DbGVhbi5wdXNoKHRoaXMuX2NvbnRhaW5lcklkKTtcblxuICAgICAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICAvLyBDb3B5IHNvdXJjZSBmaWxlcyBpbnRvIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgLmdpdGxhYi1jaS1sb2NhbC9idWlsZHMvLmRvY2tlci8uICR7dGhpcy5fY29udGFpbmVySWR9Oi9idWlsZHMvJHtzYWZlSm9iTmFtZX1gLCB0aGlzLmN3ZCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICAgICAgLy8gQ29weSBmaWxlIHZhcmlhYmxlcyBpbnRvIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVWYXJpYWJsZXNGb2xkZXIgPSBgL3RtcC9naXRsYWItY2ktbG9jYWwtZmlsZS12YXJpYWJsZXMtJHt0aGlzLmdpdERhdGEuQ0lfUFJPSkVDVF9QQVRIX1NMVUd9L2A7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhmaWxlVmFyaWFibGVzRm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgJHtmaWxlVmFyaWFibGVzRm9sZGVyfSAke3RoaXMuX2NvbnRhaW5lcklkfToke2ZpbGVWYXJpYWJsZXNGb2xkZXJ9L2AsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgdG8gY29udGFpbmVyfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlDYWNoZUluKHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUFydGlmYWN0c0luKHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAvLyBGaWxlcyBpbiBkb2NrZXItZXhlY3V0b3IgYnVpbGQgZm9sZGVyIG11c3QgYmUgcm9vdCBvd25lZC5cbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgcnVuIC0tcm0gLXYgJHt0bXBWb2x1bWVOYW1lfTovdG1wLyAtdiAke2J1aWxkVm9sdW1lTmFtZX06L2FwcC8gZmlyZWNvdy9naXRsYWItY2ktbG9jYWwtdXRpbCBiYXNoIC1jIFwiY2hvd24gMDowIC1SIC9hcHAvICYmIGNobW9kIGErcncgLVIgL2FwcC8gJiYgY2htb2QgYStydyAtUiAvdG1wL1wiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY21kID0gXCJzZXQgLWVvIHBpcGVmYWlsXFxuXCI7XG4gICAgICAgIGNtZCArPSBcImV4ZWMgMDwgL2Rldi9udWxsXFxuXCI7XG5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlTmFtZSAmJiB0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBjbWQgKz0gYGNkIC5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7c2FmZUpvYk5hbWV9L1xcbmA7XG4gICAgICAgIH1cbiAgICAgICAgY21kICs9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcblxuICAgICAgICBjbWQgKz0gXCJleGl0IDBcXG5cIjtcblxuICAgICAgICBhd2FpdCBmcy5vdXRwdXRGaWxlKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1gLCBjbWQsIFwidXRmLThcIik7XG4gICAgICAgIGF3YWl0IGZzLmNobW9kKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1gLCBcIjA3NTVcIik7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIGNwIC5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8uICR7dGhpcy5fY29udGFpbmVySWR9Oi9nY2wtc2NyaXB0cy9gLCB0aGlzLmN3ZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcCA9IGNoaWxkUHJvY2Vzcy5zcGF3bih0aGlzLl9jb250YWluZXJJZCA/IGBkb2NrZXIgc3RhcnQgLS1hdHRhY2ggLWkgJHt0aGlzLl9jb250YWluZXJJZH1gIDogXCJiYXNoXCIsIHtcbiAgICAgICAgICAgIHNoZWxsOiBcImJhc2hcIixcbiAgICAgICAgICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgZW52OiB0aGlzLmltYWdlTmFtZSA/IHsuLi5wcm9jZXNzLmVudn0gOiB7Li4udGhpcy5leHBhbmRlZFZhcmlhYmxlcywgLi4ucmVwb3J0c0RvdGVudlZhcmlhYmxlcywgLi4ucHJvY2Vzcy5lbnZ9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvdXRGdW5jID0gKGU6IGFueSwgc3RyZWFtOiAodHh0OiBzdHJpbmcpID0+IHZvaWQsIGNvbG9yaXplOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYCR7ZX1gLnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3RyZWFtKGAke3RoaXMuY2hhbGtKb2JOYW1lfSBgKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcIlxcdTAwMWJbMzJtJFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0oYCR7Y29sb3JpemUoXCI+XCIpfSBgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyZWFtKGAke2xpbmV9XFxuYCk7XG4gICAgICAgICAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmMob3V0cHV0RmlsZXNQYXRoLCBgJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjcC5zdGRvdXQub24oXCJkYXRhXCIsIChlKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRvdXQuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge2dyZWVuQnJpZ2h0ICR7c319YCkpO1xuICAgICAgICAgICAgY3Auc3RkZXJyLm9uKFwiZGF0YVwiLCAoZSkgPT4gb3V0RnVuYyhlLCB3cml0ZVN0cmVhbXMuc3RkZXJyLmJpbmQod3JpdGVTdHJlYW1zKSwgKHMpID0+IGNoYWxrYHtyZWRCcmlnaHQgJHtzfX1gKSk7XG5cbiAgICAgICAgICAgIGNwLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKGNvZGUgPz8gMCksIDEwKSk7XG4gICAgICAgICAgICBjcC5vbihcImVycm9yXCIsIChlcnIpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KGVyciksIDEwKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNwLnN0ZGluLmVuZChgL2djbC1zY3JpcHRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNwLnN0ZGluLmVuZChgLi8uZ2l0bGFiLWNpLWxvY2FsL3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGV4aXRDb2RlID09IDApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUNhY2hlT3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdHNPdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHB1bGxJbWFnZSh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgaW1hZ2VUb1B1bGw6IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgbGV0IHB1bGxDbWQgPSBcIlwiO1xuICAgICAgICBwdWxsQ21kICs9IGBkb2NrZXIgaW1hZ2UgbHMgLS1mb3JtYXQgJ3t7LlJlcG9zaXRvcnl9fTp7ey5UYWd9fScgfCBncmVwIC1FICdeJHtpbWFnZVRvUHVsbH0kJ1xcbmA7XG4gICAgICAgIHB1bGxDbWQgKz0gXCJpZiBbIFxcXCIkP1xcXCIgLW5lIDAgXTsgdGhlblxcblwiO1xuICAgICAgICBwdWxsQ21kICs9IGBcXHRlY2hvIFwiUHVsbGluZyAke2ltYWdlVG9QdWxsfVwiXFxuYDtcbiAgICAgICAgcHVsbENtZCArPSBgXFx0ZG9ja2VyIHB1bGwgJHtpbWFnZVRvUHVsbH1cXG5gO1xuICAgICAgICBwdWxsQ21kICs9IFwiZmlcXG5cIjtcbiAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24ocHVsbENtZCwgdGhpcy5jd2QpO1xuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHB1bGxlZH0gJHtpbWFnZVRvUHVsbH0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBwcm9kdWNlcnMgPSB0aGlzLnByb2R1Y2VycztcbiAgICAgICAgbGV0IHByb2R1Y2VyUmVwb3J0c0VudnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWNlciBvZiBwcm9kdWNlcnMgPz8gW10pIHtcbiAgICAgICAgICAgIGlmIChwcm9kdWNlci5kb3RlbnYgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzYWZlUHJvZHVjZXJOYW1lID0gVXRpbHMuZ2V0U2FmZUpvYk5hbWUocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBsZXQgZG90ZW52RmlsZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaGVsbElzb2xhdGlvbiAmJiAhdGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBkb3RlbnZGaWxlID0gYCR7dGhpcy5jd2R9LyR7cHJvZHVjZXIuZG90ZW52fWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvdGVudkZpbGUgPSBgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtzYWZlUHJvZHVjZXJOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52LyR7cHJvZHVjZXIuZG90ZW52fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhkb3RlbnZGaWxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyUmVwb3J0RW52ID0gZG90ZW52LnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGRvdGVudkZpbGUpKTtcbiAgICAgICAgICAgICAgICBwcm9kdWNlclJlcG9ydHNFbnZzID0gey4uLnByb2R1Y2VyUmVwb3J0c0VudnMsIC4uLnByb2R1Y2VyUmVwb3J0RW52fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7eWVsbG93ICcke3Byb2R1Y2VyLmRvdGVudn0nIHByb2R1Y2VkIGJ5ICcke3Byb2R1Y2VyLm5hbWV9JyBjb3VsZCBub3QgYmUgZm91bmR9XFxuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvZHVjZXJSZXBvcnRzRW52cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlDYWNoZUluKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdW50Q2FjaGUgJiYgdGhpcy5pbWFnZU5hbWUpIHJldHVybjtcbiAgICAgICAgaWYgKCghdGhpcy5pbWFnZU5hbWUgJiYgIXRoaXMuc2hlbGxJc29sYXRpb24pIHx8IHRoaXMuY2FjaGUubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmICghW1wicHVsbFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZU5hbWUgPSBhd2FpdCBjLmdldFVuaXF1ZUNhY2hlTmFtZSh0aGlzLmN3ZCwgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUZvbGRlciA9IGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2NhY2hlLyR7Y2FjaGVOYW1lfWA7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoY2FjaGVGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IE11dGV4LmV4Y2x1c2l2ZShjYWNoZU5hbWUsIGFzeW5jKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUluKGNhY2hlRm9sZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBpbXBvcnRlZCBjYWNoZSAnJHtjYWNoZU5hbWV9J30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5QXJ0aWZhY3RzSW4od3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgaWYgKCghdGhpcy5pbWFnZU5hbWUgJiYgIXRoaXMuc2hlbGxJc29sYXRpb24pIHx8ICh0aGlzLnByb2R1Y2VycyA/PyBbXSkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjZXIgb2YgdGhpcy5wcm9kdWNlcnMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyU2FmZU5hbWUgPSBVdGlscy5nZXRTYWZlSm9iTmFtZShwcm9kdWNlci5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGFydGlmYWN0Rm9sZGVyID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLyR7cHJvZHVjZXJTYWZlTmFtZX1gO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGFydGlmYWN0Rm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoYCR7YXJ0aWZhY3RGb2xkZXJ9IGRvZXNuJ3QgZXhpc3QsIGRpZCB5b3UgZm9yZ2V0IC0tbmVlZHNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5jb3B5SW4oYXJ0aWZhY3RGb2xkZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBpbXBvcnRlZCBhcnRpZmFjdHN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICB9XG5cbiAgICBjb3B5SW4oc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5zcGF3bihgcnN5bmMgLWEgJHtzb3VyY2V9Ly4gJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9idWlsZHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAke3NvdXJjZX0vLiAke3RoaXMuX2NvbnRhaW5lcklkfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q2FjaGVPdXQod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgaWYgKHRoaXMubW91bnRDYWNoZSAmJiB0aGlzLmltYWdlTmFtZSkgcmV0dXJuO1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZSAmJiAhdGhpcy5zaGVsbElzb2xhdGlvbikgfHwgdGhpcy5jYWNoZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmICghW1wicHVzaFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlTmFtZSA9IGF3YWl0IGMuZ2V0VW5pcXVlQ2FjaGVOYW1lKHRoaXMuY3dkLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBjLnBhdGhzKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwYXRoLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgY21kID0gXCJzaG9wdCAtcyBnbG9ic3RhciBudWxsZ2xvYiBkb3RnbG9iXFxuXCI7XG4gICAgICAgICAgICAgICAgY21kICs9IGBta2RpciAtcCAuLi8uLi9jYWNoZS8ke2NhY2hlTmFtZX1cXG5gO1xuICAgICAgICAgICAgICAgIGNtZCArPSBgcnN5bmMgLVJhICR7ZXhwYW5kZWRQYXRofSAuLi8uLi9jYWNoZS8ke2NhY2hlTmFtZX0vLiB8fCB0cnVlXFxuYDtcblxuICAgICAgICAgICAgICAgIGF3YWl0IE11dGV4LmV4Y2x1c2l2ZShjYWNoZU5hbWUsIGFzeW5jKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlPdXQoY21kLCBcImNhY2hlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZGlyID0gYXdhaXQgZnMucmVhZGRpcihgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9jYWNoZS8ke2NhY2hlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZGRpci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7eWVsbG93ICEhIG5vIGNhY2hlIHdhcyBjb3BpZWQgZm9yICR7cGF0aH0gISF9XFxuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBleHBvcnRlZCBjYWNoZSAke2V4cGFuZGVkUGF0aH0gJyR7Y2FjaGVOYW1lfSd9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdHNPdXQod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuXG4gICAgICAgIGlmICghdGhpcy5zaGVsbElzb2xhdGlvbiAmJiAhdGhpcy5pbWFnZU5hbWUgfHwgIXRoaXMuYXJ0aWZhY3RzKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHRpbWUsIGVuZFRpbWU7XG4gICAgICAgIGxldCBjcENtZCA9IFwic2hvcHQgLXMgZ2xvYnN0YXIgbnVsbGdsb2IgZG90Z2xvYlxcblwiO1xuICAgICAgICBjcENtZCArPSBgbWtkaXIgLXAgLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9XFxuYDtcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdFBhdGggb2YgdGhpcy5hcnRpZmFjdHM/LnBhdGhzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0UGF0aCwgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICBjcENtZCArPSBgcnN5bmMgLVJhICR7ZXhwYW5kZWRQYXRofSAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLiB8fCB0cnVlXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYXJ0aWZhY3RFeGNsdWRlUGF0aCBvZiB0aGlzLmFydGlmYWN0cz8uZXhjbHVkZSA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChhcnRpZmFjdEV4Y2x1ZGVQYXRoLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNwQ21kICs9IGBscyAtMWQgJy4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8ke2V4cGFuZGVkUGF0aH0nIHwgeGFyZ3MgLW4xIHJtIC1yZiB8fCB0cnVlXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcG9ydERvdGVudiA9IHRoaXMuYXJ0aWZhY3RzLnJlcG9ydHM/LmRvdGVudiA/PyBudWxsO1xuICAgICAgICBpZiAocmVwb3J0RG90ZW52ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudlxcbmA7XG4gICAgICAgICAgICBjcENtZCArPSBgcnN5bmMgLVJhICR7cmVwb3J0RG90ZW52fSAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8uXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCBkb2NrZXJDbWRFeHRyYXMgPSB0aGlzLm1vdW50Q2FjaGUgPyBbYXdhaXQgdGhpcy5tb3VudENhY2hlQ21kKHRoaXMuc2FmZUpvYk5hbWUsIHdyaXRlU3RyZWFtcyldIDogW107XG4gICAgICAgIGF3YWl0IHRoaXMuY29weU91dChjcENtZCwgXCJhcnRpZmFjdHNcIiwgZG9ja2VyQ21kRXh0cmFzKTtcbiAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuXG4gICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICBpZiAocmVhZGRpci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge3llbGxvdyAhISBubyBhcnRpZmFjdHMgd2FzIGNvcGllZCAhIX1cXG5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgZXhwb3J0ZWQgYXJ0aWZhY3RzfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcnRpZmFjdHNUb1NvdXJjZSkge1xuICAgICAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgcnN5bmMgLS1leGNsdWRlPS8uZ2l0bGFiLWNpLXJlcG9ydHMvIC1hICR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly4gJHt0aGlzLmN3ZH1gKTtcbiAgICAgICAgICAgIGlmIChyZXBvcnREb3RlbnYgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGByc3luYyAtYSAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52Ly4gJHt0aGlzLmN3ZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgY29waWVkIGFydGlmYWN0cyB0byBjd2R9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weU91dChjbWQ6IHN0cmluZywgdHlwZTogXCJhcnRpZmFjdHNcIiB8IFwiY2FjaGVcIiwgZG9ja2VyQ21kRXh0cmFzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG4gICAgICAgIGNvbnN0IGJ1aWxkVm9sdW1lTmFtZSA9IHRoaXMuYnVpbGRWb2x1bWVOYW1lO1xuXG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC8ke3R5cGV9YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjaWR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcmVhdGUgLWkgJHtkb2NrZXJDbWRFeHRyYXMuam9pbihcIiBcIil9IC12ICR7YnVpbGRWb2x1bWVOYW1lfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9LyAtdyAvYnVpbGRzLyR7c2FmZUpvYk5hbWV9LyBmaXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsIGJhc2ggLWMgXCIke2NtZH1cImAsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY2lkLnJlcGxhY2UoL1xccj9cXG4vZywgXCJcIik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJzVG9DbGVhbi5wdXNoKGNvbnRhaW5lcklkKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgc3RhcnQgJHtjb250YWluZXJJZH0gLS1hdHRhY2hgKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgJHtjb250YWluZXJJZH06LyR7dHlwZX0vLiAuZ2l0bGFiLWNpLWxvY2FsLyR7dHlwZX0vLmAsIHRoaXMuY3dkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgYmFzaCAtZW8gcGlwZWZhaWwgLWMgXCIke2NtZH1cImAsIGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge2dyZXkgPiBzdGlsbCBydW5uaW5nLi4ufVxcbmApO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIH0sIDEwMDAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4aXRlZFN0cmluZyhzdGFydFRpbWU6IFtudW1iZXIsIG51bWJlcl0sIGNvZGU6IG51bWJlciwgd2FybmluZyA9IGZhbHNlLCBwcmVwZW5kU3RyaW5nID0gXCJcIikge1xuICAgICAgICBjb25zdCBmaW5pc2hlZFN0ciA9IHRoaXMuZ2V0RmluaXNoZWRTdHJpbmcoc3RhcnRUaW1lKTtcbiAgICAgICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gJHtjb2RlLnRvU3RyaW5nKCl9IH0ke3ByZXBlbmRTdHJpbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdSZWQgIEZBSUwgJHtjb2RlLnRvU3RyaW5nKCl9IH0gJHtwcmVwZW5kU3RyaW5nfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaW5pc2hlZFN0cmluZyhzdGFydFRpbWU6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHN0YXJ0VGltZSk7XG4gICAgICAgIGNvbnN0IHRpbWVTdHIgPSBwcmV0dHlIcnRpbWUoZW5kVGltZSk7XG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBmaW5pc2hlZH0gaW4ge21hZ2VudGEgJHt0aW1lU3RyfX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRG9ja2VyTmV0d29yayhuZXR3b3JrTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IG5ldHdvcmtJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIG5ldHdvcmsgY3JlYXRlICR7bmV0d29ya05hbWV9YCk7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQgPSBuZXR3b3JrSWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0U2VydmljZSh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgc2VydmljZTogU2VydmljZSwgcHJpdmlsZWdlZDogYm9vbGVhbikge1xuICAgICAgICBsZXQgZG9ja2VyQ21kID0gYGRvY2tlciBydW4gLWQgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG5cbiAgICAgICAgaWYgKHByaXZpbGVnZWQpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIChzZXJ2aWNlLmdldEVudHJ5cG9pbnQoKSA/PyBbXSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWVudHJ5cG9pbnQgXCIke2V9XCIgYDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VBbGlhcyA9IHNlcnZpY2UuZ2V0QWxpYXModGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uID0gc2VydmljZU5hbWUucmVwbGFjZSgvKC4qKSg6LiopLywgXCIkMVwiKTtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IFtzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2UoXCIvXCIsIFwiLVwiKSwgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlKFwiL1wiLCBcIl9fXCIpXTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5wdXNoKHNlcnZpY2VBbGlhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoY29uc3QgYWxpYXMgb2YgYWxpYXNlcykge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmstYWxpYXM9JHthbGlhc30gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC1lICR7a2V5fT1cIiR7U3RyaW5nKHZhbHVlKS50cmltKCl9XCIgYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY2tlckNtZCArPSBgJHtzZXJ2aWNlTmFtZX1gO1xuICAgICAgICBjb25zdCBjb21tYW5kID0gc2VydmljZS5nZXRDb21tYW5kKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICBpZiAoY29tbWFuZCkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAgJHtjb21tYW5kfWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3Qge3N0ZG91dDogY29udGFpbmVySWR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oZG9ja2VyQ21kLCB0aGlzLmN3ZCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2goY29udGFpbmVySWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKSk7XG4gICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRlZCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSB3aXRoIGFsaWFzZXM6ICR7YWxpYXNlcy5qb2luKFwiLCBcIil9fSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXJ2aWNlSGVhbHRoQ2hlY2sod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIHNlcnZpY2U6IFNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgZG9ja2VySW5zcGVjdENtZCA9IGBkb2NrZXIgaW5zcGVjdCAke3NlcnZpY2UuZ2V0TmFtZSh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKX1gO1xuICAgICAgICBjb25zdCB7c3Rkb3V0OiBpbWFnZURldGFpbHN9ID0gYXdhaXQgVXRpbHMuc3Bhd24oZG9ja2VySW5zcGVjdENtZCwgdGhpcy5jd2QpO1xuICAgICAgICBjb25zdCBpbWFnZURldGFpbE9iaiA9IEpTT04ucGFyc2UoaW1hZ2VEZXRhaWxzKTtcblxuICAgICAgICAvLyBDb3BpZWQgZnJvbSB0aGUgc3RhcnRTZXJ2aWNlIGJsb2NrLiBJbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgYWxpYXNlcyBtYXRjaFxuICAgICAgICBjb25zdCBzZXJ2aWNlQWxpYXMgPSBzZXJ2aWNlLmdldEFsaWFzKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0TmFtZSh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbiA9IHNlcnZpY2VOYW1lLnJlcGxhY2UoLyguKikoOi4qKS8sIFwiJDFcIik7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBbc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlKFwiL1wiLCBcIi1cIiksIHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZShcIi9cIiwgXCJfX1wiKV07XG4gICAgICAgIGlmIChzZXJ2aWNlQWxpYXMpIHtcbiAgICAgICAgICAgIGFsaWFzZXMucHVzaChzZXJ2aWNlQWxpYXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggcG9ydCBkZWZpbmVkIGluIHRoZSBpbWFnZSwgYW5kIHRyeSB0byBjb25uZWN0IHRvIHRoZSBhbGlhc1xuICAgICAgICBmb3IoY29uc3QgcG9ydCBvZiBPYmplY3Qua2V5cyhpbWFnZURldGFpbE9ialswXS5Db250YWluZXJDb25maWcuRXhwb3NlZFBvcnRzKSkge1xuICAgICAgICAgICAgaWYocG9ydC5lbmRzV2l0aChcIi90Y3BcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydC5yZXBsYWNlKFwiL3RjcFwiLCBcIlwiKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZG9ja2VyQ21kID0gYGRvY2tlciBydW4gLWQgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG5cbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCB3aWxsd2lsbC93YWl0LWZvci1pdCBcIiR7YWxpYXNlc1swXX06JHtwb3J0TnVtfVwiIC10IDMwYDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7c3RhdHVzOiByZXN1bHQsIHN0ZG91dH0gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJDbWQsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXJzVG9DbGVhbi5wdXNoKHN0ZG91dC5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICAgICAgaWYocmVzdWx0ID09IDApe1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHtncmVlbkJyaWdodCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSBoZWFsdGhjaGVjayBwYXNzZWQ6ICR7YWxpYXNlc1swXX06JHtwb3J0TnVtfX0gaW4ge2dyZWVuICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7cmVkQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIGZhaWxlZDogJHthbGlhc2VzWzBdfToke3BvcnROdW19fSBpbiB7cmVkICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=