sliftutils 1.7.49 → 1.7.50

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.
@@ -13,6 +13,7 @@ const dns_1 = __importDefault(require("dns"));
13
13
  const getSecret_1 = require("../misc/getSecret");
14
14
  const https_1 = require("socket-function/src/https");
15
15
  const IArchives_1 = require("./IArchives");
16
+ const remoteConfig_1 = require("./remoteStorage/remoteConfig");
16
17
  let backblazeCreds = (0, caching_1.lazy)(async () => {
17
18
  let keyId = await (0, getSecret_1.getSecret)("backblaze.json.applicationKeyId");
18
19
  let key = await (0, getSecret_1.getSecret)("backblaze.json.applicationKey");
@@ -21,6 +22,16 @@ let backblazeCreds = (0, caching_1.lazy)(async () => {
21
22
  applicationKey: key,
22
23
  };
23
24
  });
25
+ // A B2 download/HEAD response's headers carry the file's metadata. content-range's total wins over content-length for ranged responses (which only report the slice's length).
26
+ function parseFileMetadataHeaders(response) {
27
+ let size = Number(response.headers["content-length"] || 0);
28
+ let contentRange = response.headers["content-range"];
29
+ let total = contentRange && Number(contentRange.split("/")[1]);
30
+ if (total && Number.isFinite(total)) {
31
+ size = total;
32
+ }
33
+ return { size, uploadTimestamp: Number(response.headers["x-bz-upload-timestamp"] || 0) };
34
+ }
24
35
  const getAPI = (0, caching_1.lazy)(async () => {
25
36
  let creds = await backblazeCreds();
26
37
  // NOTE: On errors, our retry code resets this lazy, so we DO get new authorize when needed.
@@ -81,9 +92,32 @@ const getAPI = (0, caching_1.lazy)(async () => {
81
92
  "Content-Type": "application/json",
82
93
  Range: config.range ? `bytes=${config.range.start}-${config.range.end - 1}` : undefined,
83
94
  }).filter(x => x[1] !== undefined)),
95
+ outResponse: config.outResponse,
84
96
  });
85
97
  return result;
86
98
  }
99
+ /** A file's metadata by name, without the body: HEAD on the download URL, which is a class B (download-priced) transaction - b2_list_file_names is class C at 10x the price, and b2_get_file_info needs a fileId we don't have. Returns undefined for missing (or hidden) files. */
100
+ async function headFileByName(config) {
101
+ var _a;
102
+ let fileName = encodePath(config.fileName);
103
+ let response = { headers: {} };
104
+ try {
105
+ await (0, https_1.httpsRequest)(auth.apiUrl + "/file/" + config.bucketName + "/" + fileName, undefined, "HEAD", undefined, {
106
+ headers: { Authorization: auth.authorizationToken },
107
+ outResponse: response,
108
+ });
109
+ }
110
+ catch (e) {
111
+ if (response.statusCode === 404)
112
+ return undefined;
113
+ // HEAD responses have no body, so the expired_auth_token marker apiRetryLogic matches on never appears - re-add it so an expired token still refreshes and retries
114
+ if (response.statusCode === 401) {
115
+ throw new Error(`"expired_auth_token" HEAD ${config.bucketName}/${config.fileName} got a 401: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
116
+ }
117
+ throw e;
118
+ }
119
+ return parseFileMetadataHeaders(response);
120
+ }
87
121
  // Oh... apparently, we can't reuse these? Huh...
88
122
  const getUploadURL = (async (bucketId) => {
89
123
  // setTimeout(() => getUploadURL.clear(bucketId), timeInHour * 1);
@@ -146,6 +180,7 @@ const getAPI = (0, caching_1.lazy)(async () => {
146
180
  updateBucket,
147
181
  listBuckets,
148
182
  downloadFileByName,
183
+ headFileByName,
149
184
  uploadFile,
150
185
  hideFile,
151
186
  getFileInfo,
@@ -349,6 +384,10 @@ class ArchivesBackblaze {
349
384
  }
350
385
  }
351
386
  async get(fileName, config) {
387
+ let result = await this.get2(fileName, config);
388
+ return result && result.data || undefined;
389
+ }
390
+ async get2(fileName, config) {
352
391
  let downloading = true;
353
392
  try {
354
393
  let time = Date.now();
@@ -362,6 +401,7 @@ class ArchivesBackblaze {
362
401
  let result = await this.apiRetryLogic(`get ${fileName}`, async (api) => {
363
402
  let range = config === null || config === void 0 ? void 0 : config.range;
364
403
  if (range) {
404
+ // The clamp needs the file's size (and gives us its metadata for free)
365
405
  let fileInfo = await this.getInfo(fileName);
366
406
  if (!fileInfo)
367
407
  throw new Error(`File ${fileName} not found`);
@@ -369,25 +409,30 @@ class ArchivesBackblaze {
369
409
  let rangeEnd = Math.min(range.end, fileInfo.size);
370
410
  // NOTE: I think if we request nothing, it confuses Backblaze and ends up giving us the entire file.
371
411
  if (rangeEnd <= rangeStart)
372
- return Buffer.alloc(0);
373
- let result = await api.downloadFileByName({
412
+ return { data: Buffer.alloc(0), writeTime: fileInfo.writeTime, size: fileInfo.size };
413
+ let data = await api.downloadFileByName({
374
414
  bucketName: this.bucketName,
375
415
  fileName,
376
416
  range: { start: rangeStart, end: rangeEnd },
377
417
  });
378
- if (result.length !== rangeEnd - rangeStart) {
379
- console.error(`Backblaze range download returned the wrong number of bytes. Tried to get ${rangeStart}-${rangeEnd}, but received ${rangeStart}-${rangeStart + result.length}. For file: ${fileName}`);
418
+ if (data.length !== rangeEnd - rangeStart) {
419
+ console.error(`Backblaze range download returned the wrong number of bytes. Tried to get ${rangeStart}-${rangeEnd}, but received ${rangeStart}-${rangeStart + data.length}. For file: ${fileName}`);
380
420
  }
381
- return result;
421
+ return { data, writeTime: fileInfo.writeTime, size: fileInfo.size };
382
422
  }
383
- return await api.downloadFileByName({
423
+ // The download's own response headers carry the metadata, so a full read is a single API call
424
+ let response = { headers: {} };
425
+ let data = await api.downloadFileByName({
384
426
  bucketName: this.bucketName,
385
427
  fileName,
428
+ outResponse: response,
386
429
  });
430
+ let meta = parseFileMetadataHeaders(response);
431
+ return { data, writeTime: meta.uploadTimestamp, size: data.length };
387
432
  });
388
433
  let timeStr = (0, format_1.formatTime)(Date.now() - time);
389
- let rateStr = (0, format_1.formatNumber)(result.length / (Date.now() - time) * 1000) + "B/s";
390
- this.log(`backblaze download (${(0, format_1.formatNumber)(result.length)}B${(config === null || config === void 0 ? void 0 : config.range) && `, ${(0, format_1.formatNumber)(config.range.start)} - ${(0, format_1.formatNumber)(config.range.end)}` || ""}) in ${timeStr} (${rateStr}, ${fileName})`);
434
+ let rateStr = (0, format_1.formatNumber)(result.data.length / (Date.now() - time) * 1000) + "B/s";
435
+ this.log(`backblaze download (${(0, format_1.formatNumber)(result.data.length)}B${(config === null || config === void 0 ? void 0 : config.range) && `, ${(0, format_1.formatNumber)(config.range.start)} - ${(0, format_1.formatNumber)(config.range.end)}` || ""}) in ${timeStr} (${rateStr}, ${fileName})`);
391
436
  return result;
392
437
  }
393
438
  catch (e) {
@@ -398,13 +443,6 @@ class ArchivesBackblaze {
398
443
  downloading = false;
399
444
  }
400
445
  }
401
- async get2(fileName, config) {
402
- // B2 downloads don't return the upload time, so this takes a second API call
403
- let [data, info] = await Promise.all([this.get(fileName, config), this.getInfo(fileName)]);
404
- if (!data || !info)
405
- return undefined;
406
- return { data, writeTime: info.writeTime, size: info.size };
407
- }
408
446
  async getConfig() {
409
447
  return {};
410
448
  }
@@ -430,30 +468,34 @@ class ArchivesBackblaze {
430
468
  }
431
469
  if (config === null || config === void 0 ? void 0 : config.lastModified) {
432
470
  (0, IArchives_1.assertValidLastModified)(config.lastModified);
433
- let existing = await this.getInfo(fileName);
434
- // An older write never overwrites a newer one (see IArchives.set). B2 stamps its own upload time, so the exact lastModified is not preserved on the stored file.
435
- if (existing && config.lastModified < existing.writeTime)
436
- return fileName;
437
- // Immutability wins: a synchronization push never overwrites an existing path on an immutable bucket (see SetConfig.forceSetImmutable)
438
- if (existing && config.forceSetImmutable && this.config.immutable)
439
- return fileName;
471
+ if (!config.noChecks) {
472
+ let existing = await this.getInfo(fileName);
473
+ // An older write never overwrites a newer one (see IArchives.set). B2 stamps its own upload time, so the exact lastModified is not preserved on the stored file.
474
+ if (existing && config.lastModified < existing.writeTime)
475
+ return fileName;
476
+ // Immutability wins: a synchronization push never overwrites an existing path on an immutable bucket (see SetConfig.forceSetImmutable)
477
+ if (existing && config.forceSetImmutable && this.config.immutable)
478
+ return fileName;
479
+ }
440
480
  }
441
481
  this.log(`backblaze upload (${(0, format_1.formatNumber)(data.length)}B) ${fileName}`);
442
482
  let f = fileName;
443
483
  await this.apiRetryLogic(`uploadFile ${fileName}`, async (api) => {
444
484
  await api.uploadFile({ bucketId: this.bucketId, fileName, data: data, });
445
485
  });
446
- let existsChecks = 30;
447
- while (existsChecks > 0) {
448
- let exists = await this.getInfo(fileName);
449
- if (exists)
450
- break;
451
- await (0, batching_1.delay)(1000);
452
- existsChecks--;
453
- }
454
- if (existsChecks === 0) {
455
- let exists = await this.getInfo(fileName);
456
- console.warn(`File ${fileName}/${f} was uploaded, but could not be found afterwards. Hopefully it was just deleted, very quickly? If backblaze is taking too long for files to propagate, then we might run into issues with the database atomicity.`);
486
+ if (!(config === null || config === void 0 ? void 0 : config.noChecks)) {
487
+ let existsChecks = 30;
488
+ while (existsChecks > 0) {
489
+ let exists = await this.getInfo(fileName);
490
+ if (exists)
491
+ break;
492
+ await (0, batching_1.delay)(1000);
493
+ existsChecks--;
494
+ }
495
+ if (existsChecks === 0) {
496
+ let exists = await this.getInfo(fileName);
497
+ console.warn(`File ${fileName}/${f} was uploaded, but could not be found afterwards. Hopefully it was just deleted, very quickly? If backblaze is taking too long for files to propagate, then we might run into issues with the database atomicity.`);
498
+ }
457
499
  }
458
500
  return fileName;
459
501
  }
@@ -601,9 +643,7 @@ class ArchivesBackblaze {
601
643
  async getInfo(fileName) {
602
644
  return await this.apiRetryLogic(`getInfo ${fileName}`, async (api) => {
603
645
  try {
604
- // NOTE: Apparently, there's no other way to do this, as the file name does not equal the file ID, and get file info requires the file ID.
605
- let info = await api.listFileNames({ bucketId: this.bucketId, prefix: fileName, maxFileCount: 10 });
606
- let file = info.files.find(x => x.fileName === fileName && x.action === "upload");
646
+ let file = await api.headFileByName({ bucketName: this.bucketName, fileName });
607
647
  if (!file) {
608
648
  this.log(`Backblaze file not exists ${fileName}`);
609
649
  return undefined;
@@ -611,7 +651,7 @@ class ArchivesBackblaze {
611
651
  this.log(`Backblaze file exists ${fileName}`);
612
652
  return {
613
653
  writeTime: file.uploadTimestamp,
614
- size: file.contentLength,
654
+ size: file.size,
615
655
  };
616
656
  }
617
657
  catch (e) {
@@ -628,6 +668,10 @@ class ArchivesBackblaze {
628
668
  let result = await this.findInfo(prefix, config);
629
669
  return result.map(x => x.path);
630
670
  }
671
+ async getChangesAfter2(config) {
672
+ // No native change feed (b2 supports neither time nor route filtering) - a full listing filtered in memory
673
+ return (0, remoteConfig_1.filterChanges)(await this.findInfo(""), config);
674
+ }
631
675
  async findInfo(prefix, config) {
632
676
  return await this.apiRetryLogic(`findInfo ${prefix}`, async (api) => {
633
677
  if (!(config === null || config === void 0 ? void 0 : config.shallow) && (config === null || config === void 0 ? void 0 : config.type) === "folders") {
@@ -773,5 +817,5 @@ exports.getArchivesBackblazePublic = (0, caching_1.cache)((domain) => {
773
817
  allowedOrigins: [`https://${domain}`, `https://127-0-0-1.${domain}:7007`],
774
818
  });
775
819
  });
776
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBeUQ7QUFDekQsMkNBQWtIO0FBT2xILElBQUksY0FBYyxHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBNkIsRUFBRTtJQUMxRCxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksR0FBRyxHQUFHLE1BQU0sSUFBQSxxQkFBUyxFQUFDLCtCQUErQixDQUFDLENBQUM7SUFDM0QsT0FBTztRQUNILGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsY0FBYyxFQUFFLEdBQUc7S0FDdEIsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7SUFDM0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztJQUVuQyw0RkFBNEY7SUFDNUYsb0VBQW9FO0lBQ3BFLElBQUksWUFBWSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLDJEQUEyRCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQzVILE9BQU8sRUFBRTtZQUNMLGFBQWEsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2hIO0tBQ0osQ0FBQyxDQUFDO0lBRUgsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENB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O0lBQ3pELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELENBQUMsQ0FBQyxDQUFDO0FBQ1UsUUFBQSxvQ0FBb0MsR0FBRyxJQUFBLGVBQUssRUFBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ3pFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztRQUN6QixVQUFVLEVBQUUsTUFBTSxHQUFHLG9CQUFvQjtRQUN6QyxTQUFTLEVBQUUsSUFBSTtLQUNsQixDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQztBQUNVLFFBQUEsbUNBQW1DLEdBQUcsSUFBQSxlQUFLLEVBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUN4RSxPQUFPLElBQUksaUJBQWlCLENBQUM7UUFDekIsVUFBVSxFQUFFLE1BQU0sR0FBRyxtQkFBbUI7UUFDeEMsTUFBTSxFQUFFLElBQUk7UUFDWixTQUFTLEVBQUUsSUFBSTtRQUNmLGNBQWMsRUFBRSxDQUFDLFdBQVcsTUFBTSxFQUFFLEVBQUUscUJBQXFCLE1BQU0sT0FBTyxDQUFDO0tBQzVFLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDO0FBRUgsMlFBQTJRO0FBQzlQLFFBQUEsMEJBQTBCLEdBQUcsSUFBQSxlQUFLLEVBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUMvRCxPQUFPLElBQUksaUJBQWlCLENBQUM7UUFDekIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTO1FBQzlCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLG1CQUFZO1FBQ3ZCLGNBQWMsRUFBRSxDQUFDLFdBQVcsTUFBTSxFQUFFLEVBQUUscUJBQXFCLE1BQU0sT0FBTyxDQUFDO0tBQzVFLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBpc05vZGUsIHNvcnQsIHRpbWVJbkhvdXIsIHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCBncmVlbiwgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgZGVidWdicmVhayBmcm9tIFwiZGVidWdicmVha1wiO1xuaW1wb3J0IGRucyBmcm9tIFwiZG5zXCI7XG5pbXBvcnQgeyBnZXRTZWNyZXQgfSBmcm9tIFwiLi4vbWlzYy9nZXRTZWNyZXRcIjtcbmltcG9ydCB7IGh0dHBzUmVxdWVzdCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2h0dHBzXCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEFyY2hpdmVzQ29uZmlnLCBTZXRDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXQgc2VlbXMgdG8gd29yayB0aG91Z2guXG4gICAgICAgIHdoaWxlIChwYXRoLmluY2x1ZGVzKFwiLy9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoXCIvL1wiLCBcIi8lMkZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRGaWxlQnlOYW1lKGNvbmZpZzoge1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfTtcbiAgICB9KSB7XG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICB9KSksIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBSYW5nZTogY29uZmlnLnJhbmdlID8gYGJ5dGVzPSR7Y29uZmlnLnJhbmdlLnN0YXJ0fS0ke2NvbmZpZy5yYW5nZS5lbmQgLSAxfWAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4WzFdICE9PSB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gT2guLi4gYXBwYXJlbnRseSwgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/IEh1aC4uLlxuICAgIGNvbnN0IGdldFVwbG9hZFVSTCA9IChhc3luYyAoYnVja2V0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IGdldFVwbG9hZFVSTC5jbGVhcihidWNrZXRJZCksIHRpbWVJbkhvdXIgKiAxKTtcbiAgICAgICAgbGV0IGdldFVwbG9hZFVybFJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL2IyX2dldF91cGxvYWRfdXJsP2J1Y2tldElkPVwiICsgYnVja2V0SWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFVwbG9hZFVybFJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB9KSB7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmwgPSBhd2FpdCBnZXRVcGxvYWRVUkwoY29uZmlnLmJ1Y2tldElkKTtcblxuICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoZ2V0VXBsb2FkVXJsLnVwbG9hZFVybCwgY29uZmlnLmRhdGEsIFwiUE9TVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBnZXRVcGxvYWRVcmwuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1GaWxlLU5hbWVcIjogZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBcImRvX25vdF92ZXJpZnlcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGVGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfaGlkZV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgZ2V0RmlsZUluZm8gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX2dldF9maWxlX2luZm9cIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBsaXN0RmlsZU5hbWVzID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgICAgICBzdGFydEZpbGVOYW1lPzogc3RyaW5nO1xuICAgICAgICBtYXhGaWxlQ291bnQ/OiBudW1iZXI7XG4gICAgICAgIGRlbGltaXRlcj86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVJbmZvOiB7XG4gICAgICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgICAgICBuZXh0RmlsZU5hbWU6IHN0cmluZztcbiAgICB9PihcImIyX2xpc3RfZmlsZV9uYW1lc1wiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNvcHlGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIHNvdXJjZUZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY29weV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfc3RhcnRfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIC8vIEFwcGFyZW50bHkgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/XG4gICAgY29uc3QgZ2V0VXBsb2FkUGFydFVSTCA9IChhc3luYyAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnRSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3BhcnRfdXJsP2ZpbGVJZD1cIiArIGZpbGVJZCwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHVwbG9hZFBhcnRSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgICAgICB1cGxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFBhcnQoY29uZmlnOiB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICAgICAgc2hhMTogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnROdW1iZXI6IG51bWJlcjtcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnQgPSBhd2FpdCBnZXRVcGxvYWRQYXJ0VVJMKGNvbmZpZy5maWxlSWQpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXBsb2FkUGFydC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogdXBsb2FkUGFydC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgXCJYLUJ6LVBhcnQtTnVtYmVyXCI6IGNvbmZpZy5wYXJ0TnVtYmVyICsgXCJcIixcbiAgICAgICAgICAgICAgICBcIlgtQnotQ29udGVudC1TaGExXCI6IGNvbmZpZy5zaGExLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogY29uZmlnLmRhdGEubGVuZ3RoICsgXCJcIixcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydFNoYTFBcnJheTogc3RyaW5nW107XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IGFueTtcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9maW5pc2hfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNhbmNlbExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7fT4oXCJiMl9jYW5jZWxfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldERvd25sb2FkQXV0aG9yaXphdGlvbiA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PihcImIyX2dldF9kb3dubG9hZF9hdXRob3JpemF0aW9uXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0RG93bmxvYWRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aC5kb3dubG9hZFVybCArIHBhdGg7XG4gICAgfVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGVCdWNrZXQsXG4gICAgICAgIHVwZGF0ZUJ1Y2tldCxcbiAgICAgICAgbGlzdEJ1Y2tldHMsXG4gICAgICAgIGRvd25sb2FkRmlsZUJ5TmFtZSxcbiAgICAgICAgdXBsb2FkRmlsZSxcbiAgICAgICAgaGlkZUZpbGUsXG4gICAgICAgIGdldEZpbGVJbmZvLFxuICAgICAgICBsaXN0RmlsZU5hbWVzLFxuICAgICAgICBjb3B5RmlsZSxcbiAgICAgICAgc3RhcnRMYXJnZUZpbGUsXG4gICAgICAgIHVwbG9hZFBhcnQsXG4gICAgICAgIGZpbmlzaExhcmdlRmlsZSxcbiAgICAgICAgY2FuY2VsTGFyZ2VGaWxlLFxuICAgICAgICBnZXREb3dubG9hZEF1dGhvcml6YXRpb24sXG4gICAgICAgIGdldERvd25sb2FkVVJMLFxuICAgICAgICBhcGlVcmw6IGF1dGguYXBpVXJsLFxuICAgICAgICBhbGxvd2VkOiBhdXRoLmFsbG93ZWQsXG4gICAgfTtcbn0pO1xuXG50eXBlIEIyQXBpID0gKHR5cGVvZiBnZXRBUEkpIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxpbmZlciBUPiA/IFQgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNCYWNrYmxhemUgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzoge1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIHB1YmxpYz86IGJvb2xlYW47XG4gICAgICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG4gICAgICAgIGNhY2hlVGltZT86IG51bWJlcjtcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM/OiBzdHJpbmdbXTtcbiAgICB9KSB7XG4gICAgICAgIC8vIEdldCB0aGUgYXBpLCB0byBzZXR1cCBjb3JzXG4gICAgICAgIHZvaWQgdGhpcy5nZXRCdWNrZXRBUEkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1Y2tldE5hbWUgPSB0aGlzLmNvbmZpZy5idWNrZXROYW1lLnJlcGxhY2VBbGwoL1teXFx3XFxkXS9nLCBcIi1cIik7XG4gICAgcHJpdmF0ZSBidWNrZXRJZCA9IFwiXCI7XG5cbiAgICBwcml2YXRlIGxvZ2dpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZW5hYmxlTG9nZ2luZygpIHtcbiAgICAgICAgdGhpcy5sb2dnaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBsb2codGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2dnaW5nKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBcImJhY2tibGF6ZSBcIiArIHRoaXMuY29uZmlnLmJ1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCdWNrZXRBUEkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGFwaSA9IGF3YWl0IGdldEFQSSgpO1xuXG4gICAgICAgIGxldCBjYWNoZVRpbWUgPSB0aGlzLmNvbmZpZy5jYWNoZVRpbWUgPz8gMDtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmltbXV0YWJsZSkge1xuICAgICAgICAgICAgY2FjaGVUaW1lID0gSU1NVVRBQkxFX0NBQ0hFX1RJTUU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBTFdBWVMgc2V0IGFjY2VzcyBjb250cm9sLCBhcyB3ZSBjYW4gbWFrZSB1cmxzIGZvciBwcml2YXRlIGJ1Y2tldHMgd2l0aCBnZXREb3dubG9hZEF1dGhvcml6YXRpb25cbiAgICAgICAgbGV0IGRlc2lyZWRDb3JzUnVsZXMgPSBbe1xuICAgICAgICAgICAgY29yc1J1bGVOYW1lOiBcImFsbG93QWxsXCIsXG4gICAgICAgICAgICBhbGxvd2VkT3JpZ2luczogdGhpcy5jb25maWcuYWxsb3dlZE9yaWdpbnMgPz8gW1wiaHR0cHNcIl0sXG4gICAgICAgICAgICBhbGxvd2VkT3BlcmF0aW9uczogW1wiYjJfZG93bmxvYWRfZmlsZV9ieV9pZFwiLCBcImIyX2Rvd25sb2FkX2ZpbGVfYnlfbmFtZVwiXSxcbiAgICAgICAgICAgIGFsbG93ZWRIZWFkZXJzOiBbXCJyYW5nZVwiXSxcbiAgICAgICAgICAgIGV4cG9zZUhlYWRlcnM6IFtcIngtYnotY29udGVudC1zaGExXCJdLFxuICAgICAgICAgICAgLy8gNjAgaXMgdGhlIGFic29sdXRlIG1pbmltdW0uIElmIHdlIHRyeSB0byBzZXQgYSB2YWx1ZSBsb3dlciB0aGFuIHRoaXMsIGl0J2xsIGJlIHVwZGF0ZWQgdG8gYmUgNjAuIFxuICAgICAgICAgICAgbWF4QWdlU2Vjb25kczogTWF0aC5tYXgoNjAsIGNhY2hlVGltZSAvIDEwMDApLFxuICAgICAgICB9XTtcbiAgICAgICAgbGV0IGJ1Y2tldEluZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgIGlmIChjYWNoZVRpbWUpIHtcbiAgICAgICAgICAgIGJ1Y2tldEluZm9bXCJjYWNoZS1jb250cm9sXCJdID0gYG1heC1hZ2U9JHtjYWNoZVRpbWUgLyAxMDAwfWA7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBleGlzdHMgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY3JlYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRUeXBlOiB0aGlzLmNvbmZpZy5wdWJsaWMgPyBcImFsbFB1YmxpY1wiIDogXCJhbGxQcml2YXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXlzRnJvbVVwbG9hZGluZ1RvSGlkaW5nXCI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIGZpbGVzIGZvciA3IGRheXMsIHdoaWNoIHNob3VsZCBiZSBlbm91Z2ggdGltZSB0byByZWNvdmVyIGFjY2lkZW50YWwgaGlkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXlzRnJvbUhpZGluZ1RvRGVsZXRpbmdcIjogNyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlsZU5hbWVQcmVmaXhcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICAgICAgY29yc1J1bGVzOiBkZXNpcmVkQ29yc1J1bGVzLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmZvXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuc3RhY2suaW5jbHVkZXMoYFwiZHVwbGljYXRlX2J1Y2tldF9uYW1lXCJgKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSBjcmVhdGUgYnVja2V0IGZhaWxlZCwgcmV0cnlpbmcgaW4gNXM6ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDUwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1Y2tldExpc3QgPSBhd2FpdCBhcGkubGlzdEJ1Y2tldHMoe1xuICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGJ1Y2tldExpc3QuYnVja2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0IG5hbWUgXCIke3RoaXMuYnVja2V0TmFtZX1cIiBpcyBiZWluZyB1c2VkIGJ5IHNvbWVvbmUgZWxzZS4gQnVja2V0IG5hbWVzIGhhdmUgdG8gYmUgZ2xvYmFsbHkgdW5pcXVlLiBUcnkgYSBkaWZmZXJlbnQgbmFtZSB1bnRpbCB5b3UgZmluZCBhIGZyZWUgb25lLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVja2V0SWQgPSBidWNrZXRMaXN0LmJ1Y2tldHNbMF0uYnVja2V0SWQ7XG5cbiAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgbGV0IGJ1Y2tldCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgbGV0IGt2cHMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgICAgICAgICAgICAgIHNvcnQoa3ZwcywgeCA9PiB4WzBdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGt2cHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb3JkZXJJbmRlcGVuZGVudEVxdWFsKGxoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKGxocykpID09PSBKU09OLnN0cmluZ2lmeShub3JtYWxpemUocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWxBcnJheShsaHM6IHVua25vd25bXSwgcmhzOiB1bmtub3duW10pIHtcbiAgICAgICAgICAgICAgICBpZiAobGhzLmxlbmd0aCAhPT0gcmhzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJJbmRlcGVuZGVudEVxdWFsKGxoc1tpXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhb3JkZXJJbmRlcGVuZGVudEVxdWFsQXJyYXkoYnVja2V0LmNvcnNSdWxlcywgZGVzaXJlZENvcnNSdWxlcylcbiAgICAgICAgICAgICAgICB8fCAhb3JkZXJJbmRlcGVuZGVudEVxdWFsKGJ1Y2tldC5idWNrZXRJbmZvLCBidWNrZXRJbmZvKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgVXBkYXRpbmcgQ09SUyBydWxlcyBmb3IgJHt0aGlzLmJ1Y2tldE5hbWV9YCksIGJ1Y2tldC5jb3JzUnVsZXMsIGRlc2lyZWRDb3JzUnVsZXMpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS51cGRhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IGJ1Y2tldC5hY2NvdW50SWQsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiBidWNrZXQuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IGJ1Y2tldC5idWNrZXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogYnVja2V0LmxpZmVjeWNsZVJ1bGVzLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm86IGJ1Y2tldEluZm8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgY3VycmVudFJlc2V0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiB3aGVuIHdlIGxhc3QgcmVzZXQgYmVjYXVzZSBvZiBhIDUwM1xuICAgIHByaXZhdGUgbGFzdDUwM1Jlc2V0ID0gMDtcbiAgICAvLyBJTVBPUlRBTlQhIFdlIG11c3QgYWx3YXlzIENBVENIIEFST1VORCB0aGUgYXBpUmV0cnlMb2dpYywgTkVWRVIgaW5zaWRlIG9mIGZuYy4gT3RoZXJ3aXNlIHdlIHdvbid0IGJlIGFibGUgdG8gcmVjcmVhdGUgdGhlIGF1dGggdG9rZW4uIGBjb250ZXh0YCBpcyBhIHNob3J0IGxhYmVsICh2ZXJiICsgZmlsZSBwYXRoKSBpbmNsdWRlZCBpbiBldmVyeSByZXRyeS9lcnJvciBsb2cgc28gYSBzdHVjayBzaWxlbnQtcmV0cnkgbG9vcCBpcyBpZGVudGlmaWFibGUgZnJvbSB0aGUgbG9ncy5cbiAgICBwcml2YXRlIGFzeW5jIGFwaVJldHJ5TG9naWM8VD4oXG4gICAgICAgIGNvbnRleHQ6IHN0cmluZyxcbiAgICAgICAgZm5jOiAoYXBpOiBCMkFwaSkgPT4gUHJvbWlzZTxUPixcbiAgICAgICAgcmV0cmllcyA9IDNcbiAgICApOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IGFwaTogQjJBcGkgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcGkgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYyhhcGkpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJldHJpZXMgPD0gMCkgdGhyb3cgZXJyO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCdzIGEgNTAzIGFuZCBpdCdzIGJlZW4gYSBtaW51dGUgc2luY2Ugd2UgbGFzdCByZXNldCwgdGhlbiBXYWl0IGFuZCByZXNldC5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcInN0YXR1c1wiOiA1MDNgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwic2VydmljZV91bmF2YWlsYWJsZVwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcImludGVybmFsX2Vycm9yXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgICAgICkgJiYgRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2JsYXplIGlzIHNvIGZsYWt5IHRoYXQgd2UncmUganVzdCBnb2luZyB0byB3YXJuIGhlcmUuXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXNldCA9IHRoaXMuY3VycmVudFJlc2V0IHx8IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNoZWNrIGFnYWluIGluIGNhc2UsIGFuZCBpbiB0aGUgdmVyeSBsaWtlbHkgY2FzZSB0aGF0IHRoaXMgaXMgYmVpbmcgcnVuIGluIHBhcmFsbGVsLCB3ZSBvbmx5IHdhbnQgdG8gcmVzZXQgb25jZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBSZXNldHRpbmcgZ2V0QVBJIGFuZCBnZXRCdWNrZXRBUEk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3Q1MDNSZXNldCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpLmZpbmFsbHkoKCkgPT4gdGhpcy5jdXJyZW50UmVzZXQgPSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFJlc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIHRva2VuIGlzIGludmFsaWQsIHJlc2V0IGdldEJ1Y2tldEFQSSBhbmQgZ2V0QVBJIElmIHRoZSBlcnJvciBpcyB0aGF0IHRoZSBidWNrZXQgaXNuJ3QgZm91bmQsIHJlc2V0IGdldEJ1Y2tldEFQSVxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgXCJleHBpcmVkX2F1dGhfdG9rZW5cImApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBBdXRob3JpemF0aW9uIHRva2VuIGV4cGlyZWRgKTtcbiAgICAgICAgICAgICAgICBnZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEJ1Y2tldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnIuc3RhY2suaW5jbHVkZXMoYG5vIHRvbWVzIGF2YWlsYWJsZWApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFVElNRURPVVRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgc29ja2V0IGhhbmcgdXBgKVxuICAgICAgICAgICAgICAgIC8vIEVoLi4uIHRoaXMgbWlnaHQgYmUgYmFkLCBidXQuLi4gSSB0aGluayB3ZSBqdXN0IGdldCByYW5kb20gNDAwIGVycm9ycy4gSWYgdGhpcyBzcGFtcyBlcnJvcnMsIHdlIGNhbiByZW1vdmUgdGhpcyBsaW5lLlxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgNDAwIEJhZCBSZXF1ZXN0YClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYGdldGFkZHJpbmZvIEVOT1RGT1VORGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFU0VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVDT05OUkVGVVNFRGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFTk9CVUZTYClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7Y29udGV4dH1dIFJldHJ5aW5nIGluIDVzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gJHtlcnIubWVzc2FnZX0gcmV0cnlpbmcgaW4gNXNgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSg1MDAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKSkge1xuICAgICAgICAgICAgICAgIGlmIChhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybE9iaiA9IG5ldyBVUkwoYXBpLmFwaVVybCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBob3N0bmFtZSA9IHVybE9iai5ob3N0bmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvb2t1cEFkZHJlc3NlcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG5zLmxvb2t1cChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzb2x2ZUFkZHJlc3NlcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG5zLnJlc29sdmU0KGhvc3RuYW1lLCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHJlc3Nlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFske2NvbnRleHR9XSBnZXRhZGRyaW5mbyBFTk9URk9VTkQgJHtob3N0bmFtZX1gLCB7IGxvb2t1cEFkZHJlc3NlcywgcmVzb2x2ZUFkZHJlc3NlcywgYXBpVXJsOiBhcGkuYXBpVXJsLCBmdWxsRXJyb3I6IGVyci5zdGFjayB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IH07IHJldHJ5Q291bnQ/OiBudW1iZXIgfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBkb3dubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZFBvbGwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkb3dubG9hZGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZG93bmxvYWQgaW4gcHJvZ3Jlc3MgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGRvd25sb2FkUG9sbCwgNTAwMCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0ICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGNvbmZpZz8ucmFuZ2U7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUluZm8pIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2ZpbGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gTWF0aC5taW4ocmFuZ2UuZW5kLCBmaWxlSW5mby5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogSSB0aGluayBpZiB3ZSByZXF1ZXN0IG5vdGhpbmcsIGl0IGNvbmZ1c2VzIEJhY2tibGF6ZSBhbmQgZW5kcyB1cCBnaXZpbmcgdXMgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VFbmQgPD0gcmFuZ2VTdGFydCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kOiByYW5nZUVuZCB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJhbmdlRW5kIC0gcmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIHJhbmdlIGRvd25sb2FkIHJldHVybmVkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMuIFRyaWVkIHRvIGdldCAke3JhbmdlU3RhcnR9LSR7cmFuZ2VFbmR9LCBidXQgcmVjZWl2ZWQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlU3RhcnQgKyByZXN1bHQubGVuZ3RofS4gRm9yIGZpbGU6ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIocmVzdWx0Lmxlbmd0aCAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRvd25sb2FkICgke2Zvcm1hdE51bWJlcihyZXN1bHQubGVuZ3RoKX1CJHtjb25maWc/LnJhbmdlICYmIGAsICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5zdGFydCl9IC0gJHtmb3JtYXROdW1iZXIoY29uZmlnLnJhbmdlLmVuZCl9YCB8fCBcIlwifSkgaW4gJHt0aW1lU3RyfSAoJHtyYXRlU3RyfSwgJHtmaWxlTmFtZX0pYCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGZpbGUgZG9lcyBub3QgZXhpc3QgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBkb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gQjIgZG93bmxvYWRzIGRvbid0IHJldHVybiB0aGUgdXBsb2FkIHRpbWUsIHNvIHRoaXMgdGFrZXMgYSBzZWNvbmQgQVBJIGNhbGxcbiAgICAgICAgbGV0IFtkYXRhLCBpbmZvXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmdldChmaWxlTmFtZSwgY29uZmlnKSwgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKV0pO1xuICAgICAgICBpZiAoIWRhdGEgfHwgIWluZm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogaW5mby53cml0ZVRpbWUsIHNpemU6IGluZm8uc2l6ZSB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG4gICAgICAgICAgICAvLyBCMiB2MiBkb2N1bWVudHMgYWxsb3dlZCBhcyBhIHNpbmdsZSBvYmplY3Q7IG91ciB0eXBlIHNheXMgYSBsaXN0IC0gaGFuZGxlIGJvdGhcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUmF3ID0gYXBpLmFsbG93ZWQgYXMgdW5rbm93bjtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkTGlzdCA9IChBcnJheS5pc0FycmF5KGFsbG93ZWRSYXcpICYmIGFsbG93ZWRSYXcgfHwgW2FsbG93ZWRSYXddKSBhcyB0eXBlb2YgYXBpLmFsbG93ZWQ7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZExpc3Quc29tZShhbGxvd2VkID0+XG4gICAgICAgICAgICAgICAgYWxsb3dlZC5jYXBhYmlsaXRpZXMuaW5jbHVkZXMoXCJ3cml0ZUZpbGVzXCIpXG4gICAgICAgICAgICAgICAgJiYgKCFhbGxvd2VkLmJ1Y2tldE5hbWUgfHwgYWxsb3dlZC5idWNrZXROYW1lID09PSB0aGlzLmJ1Y2tldE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBObyAvIGludmFsaWQgY3JlZGVudGlhbHNcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgaGFzV3JpdGVBY2Nlc3MgY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSAmJiAhY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtmaWxlTmFtZX0gdG8gJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93biB1cGxvYWQgdGltZSwgc28gdGhlIGV4YWN0IGxhc3RNb2RpZmllZCBpcyBub3QgcHJlc2VydmVkIG9uIHRoZSBzdG9yZWQgZmlsZS5cbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcubGFzdE1vZGlmaWVkIDwgZXhpc3Rpbmcud3JpdGVUaW1lKSByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYSBzeW5jaHJvbml6YXRpb24gcHVzaCBuZXZlciBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIHBhdGggb24gYW4gaW1tdXRhYmxlIGJ1Y2tldCAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUgJiYgdGhpcy5jb25maWcuaW1tdXRhYmxlKSByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSB1cGxvYWQgKCR7Zm9ybWF0TnVtYmVyKGRhdGEubGVuZ3RoKX1CKSAke2ZpbGVOYW1lfWApO1xuICAgICAgICBsZXQgZiA9IGZpbGVOYW1lO1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZEZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZSwgZGF0YTogZGF0YSwgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXhpc3RzQ2hlY2tzID0gMzA7XG4gICAgICAgIHdoaWxlIChleGlzdHNDaGVja3MgPiAwKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICAgICAgICAgIGlmIChleGlzdHMpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgICAgICAgICBleGlzdHNDaGVja3MtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhpc3RzQ2hlY2tzID09PSAwKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmlsZSAke2ZpbGVOYW1lfS8ke2Z9IHdhcyB1cGxvYWRlZCwgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCBhZnRlcndhcmRzLiBIb3BlZnVsbHkgaXQgd2FzIGp1c3QgZGVsZXRlZCwgdmVyeSBxdWlja2x5PyBJZiBiYWNrYmxhemUgaXMgdGFraW5nIHRvbyBsb25nIGZvciBmaWxlcyB0byBwcm9wYWdhdGUsIHRoZW4gd2UgbWlnaHQgcnVuIGludG8gaXNzdWVzIHdpdGggdGhlIGRhdGFiYXNlIGF0b21pY2l0eS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRlbGV0ZSAke2ZpbGVOYW1lfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBoaWRlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuaGlkZUZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWU6IGZpbGVOYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBlcnJvciBpbiBoaWRlLCBwb3NzaWJseSBhbHJlYWR5IGhpZGRlbiAke2ZpbGVOYW1lfVxcbiR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IERlbGV0aW9uIFNFRU1TIHRvIHdvcmsuIFRoaXMgRE9FUyBicmVhayBpZiB3ZSBkZWxldGUgYSBmaWxlIHdoaWNoIGtlZXBzIGJlaW5nIHJlY3JlYXRlZCwgZXgsIHRoZSBoZWFydGJlYXQuIGxldCBleGlzdHNDaGVja3MgPSAxMDsgd2hpbGUgKGV4aXN0c0NoZWNrcyA+IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGlmICghZXhpc3RzKSBicmVhazsgYXdhaXQgZGVsYXkoMTAwMCk7IGV4aXN0c0NoZWNrcy0tOyB9IGlmIChleGlzdHNDaGVja3MgPT09IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGRldkRlYnVnYnJlYWsoKTsgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IHdhcyBkZWxldGVkLCBidXQgd2FzIHN0aWxsIGZvdW5kIGFmdGVyd2FyZHNgKTsgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+OyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICAgICAgbGV0IG9uRXJyb3I6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KVtdID0gW107XG4gICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB7IHBhdGggfSA9IGNvbmZpZztcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSByZXF1aXJlcyA1TUIgY2h1bmtzLiBCdXQsIGxhcmdlciBpcyBtb3JlIGVmZmljaWVudCBmb3IgdXMuXG4gICAgICAgICAgICBjb25zdCBNSU5fQ0hVTktfU0laRSA9IDMyICogMTAyNCAqIDEwMjQ7XG4gICAgICAgICAgICBsZXQgZGF0YVF1ZXVlOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVF1ZXVlLmxlbmd0aCkgcmV0dXJuIGRhdGFRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBidWZmZXJzIHVudGlsIHdlIGdldCA1TUIsIE9SLCBlbmQuIEJhY2tibGF6ZSByZXF1aXJlcyB0aGlzIGZvciBsYXJnZSBmaWxlcy5cbiAgICAgICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXMgPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYnVmZmVycy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IHBhdGg7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQmFja2JsYXplIGRpc2FsbG93cyBvdmVybHkgc21hbGwgZmlsZXNcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3MgbGVzcyB0aGFuIDIgY2h1bmtzXG4gICAgICAgICAgICBsZXQgc2Vjb25kRGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICBpZiAoIXNlY29uZERhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBTFNPLCBpZiB0aGVyZSBhcmUgdHdvIGNodW5rcywgYnV0IG9uZSBpcyB0b28gc21hbGwsIGNvbWJpbmUgaXQuIFRoaXMgaGVscHMgYWxsb3cgdXMgbmV2ZXIgc2VuZCBzbWFsbCBjaHVua3MuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBCdWZmZXIuY29uY2F0KFtkYXRhLCBzZWNvbmREYXRhXSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBVcGxvYWRpbmcgbGFyZ2UgZmlsZSAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQoZGF0YSwgc2Vjb25kRGF0YSk7XG5cblxuICAgICAgICAgICAgbGV0IHVwbG9hZEluZm8gPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHN0YXJ0TGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuc3RhcnRMYXJnZUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJiMi94LWF1dG9cIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZUluZm86IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbkVycm9yLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgY2FuY2VsTGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY2FuY2VsTGFyZ2VGaWxlKHsgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBMT0dfSU5URVJWQUwgPSB0aW1lSW5NaW51dGU7XG4gICAgICAgICAgICBsZXQgbmV4dExvZ1RpbWUgPSBEYXRlLm5vdygpICsgTE9HX0lOVEVSVkFMO1xuXG4gICAgICAgICAgICBsZXQgcGFydE51bWJlciA9IDE7XG4gICAgICAgICAgICBsZXQgcGFydFNoYTFBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBTby4uLiBpZiB0aGUgbmV4dCBjaHVuayBpcyB0aGUgbGFzdCBvbmUsIGNvbWJpbmUgaXQgd2l0aCB0aGUgY3VycmVudCBvbmUuIFRoaXMgcHJldmVudHMgQU5ZIHVwbG9hZHMgZnJvbSBiZWluZyA8IHRoZSB0aHJlc2hvbGQsIGFzIGFwcGFyZW50bHkgdGhlIFwibGFzdCBwYXJ0XCIgY2hlY2sgaW4gYmFja2JsYXplIGZhaWxzIHdoZW4gd2UgaGF2ZSB0byByZXRyeSBhbiB1cGxvYWQgKGR1ZSB0byBcIm5vIHRvbWVzIGF2YWlsYWJsZVwiKS4gV2VsbCBpdCBjYW4ndCBmYWlsIGlmIGV2ZW4gdGhlIGxhc3QgcGFydCBpcyA+IDVNQiwgbm93IGNhbiBpdCEgQlVULCBvbmx5IGlmIHRoaXMgaXNuJ3QgdGhlIGZpcnN0IGNodW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgdHJ5IHRvIHNlbmQgYSBzaW5nbGUgY2h1bmssIHdoaWNoIHdlIGNhbid0IGRvLlxuICAgICAgICAgICAgICAgIGlmIChwYXJ0U2hhMUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heWJlTGFzdERhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlTGFzdERhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIHRoZSBsYXN0IG9uZSwgc28gY29uc3VtZSBpdCBub3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgbWF5YmVMYXN0RGF0YV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIG5vdCB0aGUgbGFzdCBvbmUuIFB1dCBpdCBiYWNrLCBpbiBjYXNlIHRoZSBvbmUgQUZURVIgaXMgdGhlIGxhc3Qgb25lLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gbWVyZ2UgbWF5YmVMYXN0RGF0YSB3aXRoIHRoZSBuZXh0IG5leHQgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUXVldWUudW5zaGlmdChtYXliZUxhc3REYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hhMSA9IHJlcXVpcmUoXCJjcnlwdG9cIikuY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgICAgICAgICAgICAgc2hhMS51cGRhdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHNoYTFIZXggPSBzaGExLmRpZ2VzdChcImhleFwiKTtcbiAgICAgICAgICAgICAgICBwYXJ0U2hhMUFycmF5LnB1c2goc2hhMUhleCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGB1cGxvYWRQYXJ0IyR7cGFydE51bWJlcn0gJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKFwiSW1wb3NzaWJsZSwgZGF0YSBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIodG90YWxCeXRlcyAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBVcGxvYWRpbmcgbGFyZ2UgZmlsZSBwYXJ0ICR7cGFydE51bWJlcn0sIHVwbG9hZGVkICR7Ymx1ZShmb3JtYXROdW1iZXIodG90YWxCeXRlcykgKyBcIkJcIil9IGluICR7Ymx1ZSh0aW1lU3RyKX0gKCR7Ymx1ZShyYXRlU3RyKX0pLiAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGEubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS51cGxvYWRQYXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyOiBwYXJ0TnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYTE6IHNoYTFIZXgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcnROdW1iZXIrKztcblxuICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gbmV4dExvZ1RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dExvZ1RpbWUgPSBEYXRlLm5vdygpICsgTE9HX0lOVEVSVkFMO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0aWxsIHVwbG9hZGluZyBsYXJnZSBmaWxlIGF0ICR7RGF0ZS5ub3coKX0uIFVwbG9hZGVkICR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgaW4gJHt0aW1lU3RyfSAoJHtyYXRlU3RyfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYEZpbmlzaGVkIHVwbG9hZGluZyBsYXJnZSBmaWxlIHVwbG9hZGVkICR7Z3JlZW4oZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpKX1CYCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZmluaXNoTGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5maW5pc2hMYXJnZUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0U2hhMUFycmF5OiBwYXJ0U2hhMUFycmF5LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYygpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZHVyaW5nIGVycm9yIGNsZWFuLiBJZ25vcmluZywgd2Ugd2lsbCByZXRocm93IHRoZSBvcmlnaW5hbCBlcnJvciwgcGF0aCAke2NvbmZpZy5wYXRofWAsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBzZXRMYXJnZUZpbGUgZm9yICR7Y29uZmlnLnBhdGh9OiAke2Uuc3RhY2t9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0SW5mbyAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gTk9URTogQXBwYXJlbnRseSwgdGhlcmUncyBubyBvdGhlciB3YXkgdG8gZG8gdGhpcywgYXMgdGhlIGZpbGUgbmFtZSBkb2VzIG5vdCBlcXVhbCB0aGUgZmlsZSBJRCwgYW5kIGdldCBmaWxlIGluZm8gcmVxdWlyZXMgdGhlIGZpbGUgSUQuXG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBwcmVmaXg6IGZpbGVOYW1lLCBtYXhGaWxlQ291bnQ6IDEwIH0pO1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gaW5mby5maWxlcy5maW5kKHggPT4geC5maWxlTmFtZSA9PT0gZmlsZU5hbWUgJiYgeC5hY3Rpb24gPT09IFwidXBsb2FkXCIpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgbm90IGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5zdGFjay5pbmNsdWRlcyhgZmlsZV9ub3RfZm91bmRgKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgbm90IGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZXhhbXBsZSBmaW5kRmlsZU5hbWVzKFwiaXBzL1wiKVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTx7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH1bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5kSW5mbyAke3ByZWZpeH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uc2hhbGxvdyAmJiBjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZpbGVzID0gYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgpO1xuICAgICAgICAgICAgICAgIGxldCBhbGxGb2xkZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9PigpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHsgcGF0aCwgY3JlYXRlVGltZSwgc2l6ZSB9IG9mIGFsbEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBwYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRm9sZGVycy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZSwgc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYWxsRm9sZGVycy52YWx1ZXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9PigpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0RmlsZU5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXBpLmxpc3RGaWxlTmFtZXMoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1heEZpbGVDb3VudDogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyOiBjb25maWc/LnNoYWxsb3cgPyBcIi9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIHJlc3VsdC5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5hY3Rpb24gPT09IFwidXBsb2FkXCIgJiYgY29uZmlnPy50eXBlICE9PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZpbGUuZmlsZU5hbWUsIHsgcGF0aDogZmlsZS5maWxlTmFtZSwgY3JlYXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGZpbGUuY29udGVudExlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJmb2xkZXJcIiAmJiBjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyID0gZmlsZS5maWxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyID0gZm9sZGVyLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSA9IHJlc3VsdC5uZXh0RmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydEZpbGVOYW1lKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVzLnZhbHVlcygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFzc2VydFBhdGhWYWxpZChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGJ5dGVzID0gQnVmZmVyLmZyb20ocGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gMTAwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRvbyBsb25nOiAke3BhdGgubGVuZ3RofSBjaGFyYWN0ZXJzID4gMTAwMCBjaGFyYWN0ZXJzLiBQYXRoOiAke3BhdGh9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHtcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICB0YXJnZXQ6IElBcmNoaXZlcztcbiAgICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nO1xuICAgICAgICBjb3B5SW5zdGVhZD86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgICBsZXQgeyBwYXRoLCB0YXJnZXQsIHRhcmdldFBhdGggfSA9IGNvbmZpZztcbiAgICAgICAgLy8gQSBzZWxmIG1vdmUgc2hvdWxkIE5PT1AgKGFuZCBkZWZpbml0ZWx5IG5vdCBjb3B5LCBhbmQgdGhlbiBkZWxldGUgaXRzZWxmISlcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcyAmJiBwYXRoID09PSB0YXJnZXRQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIG1vdmUgcGF0aCB0byBpdHNlbGYuIFNraXBwaW5nIG1vdmUsIGFzIHRoZXJlIGlzIG5vIHdvcmsgdG8gZG8uICR7cGF0aH1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXJjaGl2ZXNCYWNrYmxhemUpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXRCdWNrZXRJZCA9IHRhcmdldC5idWNrZXRJZDtcbiAgICAgICAgICAgIGlmICh0YXJnZXRCdWNrZXRJZCA9PT0gdGhpcy5idWNrZXRJZCAmJiBwYXRoID09PSB0YXJnZXRQYXRoKSByZXR1cm47XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYG1vdmUgJHtwYXRofSAtPiAke3RhcmdldFBhdGh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVnaC4uLiBsaXN0aW5nIHRoZSBmaWxlIG5hbWUgc3Vja3MsIGJ1dC4uLiBJIGd1ZXNzIGl0J3Mgc3RpbGwgYmV0dGVyIHRoYW4gZG93bmxvYWRpbmcgYW5kIHJlLXVwbG9hZGluZyB0aGUgZW50aXJlIGZpbGUuXG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBwcmVmaXg6IHBhdGgsIG1heEZpbGVDb3VudDogMTAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBpbmZvLmZpbGVzLmZpbmQoeCA9PiB4LmZpbGVOYW1lID09PSBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGUpIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgdG8gbW92ZTogJHtwYXRofWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jb3B5RmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZDogZmlsZS5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiB0YXJnZXRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiB0YXJnZXRCdWNrZXRJZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldChwYXRoKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICBhd2FpdCB0YXJnZXQuc2V0KHRhcmdldFBhdGgsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWcuY29weUluc3RlYWQpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8odGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZpbGUgbm90IGZvdW5kIGFmdGVyIG1vdmUuIExlYXZpbmcgQk9USCBmaWxlcy4gJHt0YXJnZXRQYXRofSB3YXMgbm90IGZvdW5kLiBCZWluZyBtb3ZlZCBmcm9tICR7cGF0aH1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWwocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29weShjb25maWc6IHtcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICB0YXJnZXQ6IElBcmNoaXZlcztcbiAgICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW92ZSh7IC4uLmNvbmZpZywgY29weUluc3RlYWQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0VVJMICR7cGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5nZXREb3dubG9hZFVSTChcImZpbGUvXCIgKyB0aGlzLmJ1Y2tldE5hbWUgKyBcIi9cIiArIHBhdGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKGNvbmZpZzoge1xuICAgICAgICBmaWxlTmFtZVByZWZpeD86IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gJHtjb25maWcuZmlsZU5hbWVQcmVmaXggPz8gXCJcIn1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkQXV0aG9yaXphdGlvbih7XG4gICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgZmlsZU5hbWVQcmVmaXg6IGNvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwiLFxuICAgICAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qXG5OYW1lcyBzaG91bGQgYmUgYSBVVEYtOCBzdHJpbmcgdXAgdG8gMTAyNCBieXRlcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczpcbiAgICBDaGFyYWN0ZXIgY29kZXMgYmVsb3cgMzIgYXJlIG5vdCBhbGxvd2VkLlxuICAgIERFTCBjaGFyYWN0ZXJzICgxMjcpIGFyZSBub3QgYWxsb3dlZC5cbiAgICBCYWNrc2xhc2hlcyBhcmUgbm90IGFsbG93ZWQuXG4gICAgRmlsZSBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCAvLCBlbmQgd2l0aCAvLCBvciBjb250YWluIC8vLlxuKi9cblxuXG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHsgYnVja2V0TmFtZTogZG9tYWluIH0pO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQcml2YXRlSW1tdXRhYmxlID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXByaXZhdGUtaW1tdXRhYmxlXCIsXG4gICAgICAgIGltbXV0YWJsZTogdHJ1ZVxuICAgIH0pO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQdWJsaWNJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHVibGljLWltbXV0YWJsZVwiLFxuICAgICAgICBwdWJsaWM6IHRydWUsXG4gICAgICAgIGltbXV0YWJsZTogdHJ1ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pO1xuXG4vLyBOT1RFOiBDYWNoZSBieSBhIG1pbnV0ZS4gVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhLCBidXQuLi4gdXN1YWxseSB3aG9sZSByZWFzb24gZm9yIHB1YmxpYyBpcyBmb3IgY2xvdWRmbGFyZSBjYWNoaW5nIChhcyBvdGhlcndpc2Ugd2UgY2FuIGp1c3QgYWNjZXNzIGl0IHRocm91Z2ggYSBzZXJ2ZXIpLCBvciBmb3IgbGFyZ2UgZmlsZXMgKHdoaWNoIHNob3VsZCBiZSBjYWNoZWQgYW55d2F5cywgYW5kIHByb2JhYmx5IGV2ZW4gdXNlIGltbXV0YWJsZSBjYWNoaW5nKS5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpYyA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWNcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBjYWNoZVRpbWU6IHRpbWVJbk1pbnV0ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pOyJdfQ==
777
- /* _JS_SOURCE_HASH = "8138cf944c297a24063c185c77f50e4bd95c885ea6970836eea8bfac8ca9c51e"; */
820
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQXVKO0FBQ3ZKLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILCtLQUErSztBQUMvSyxTQUFTLHdCQUF3QixDQUFDLFFBQTJCO0lBQ3pELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUs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LE1BQU0sR0FBRyxvQkFBb0I7UUFDekMsU0FBUyxFQUFFLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDVSxRQUFBLG1DQUFtQyxHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDeEUsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQ3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsbUJBQW1CO1FBQ3hDLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLElBQUk7UUFDZixjQUFjLEVBQUUsQ0FBQyxXQUFXLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixNQUFNLE9BQU8sQ0FBQztLQUM1RSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQztBQUVILDJRQUEyUTtBQUM5UCxRQUFBLDBCQUEwQixHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDL0QsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQ3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUztRQUM5QixNQUFNLEVBQUUsSUFBSTtRQUNaLFNBQVMsRUFBRSxtQkFBWTtRQUN2QixjQUFjLEVBQUUsQ0FBQyxXQUFXLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixNQUFNLE9BQU8sQ0FBQztLQUM1RSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhY2hlLCBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgaXNOb2RlLCBzb3J0LCB0aW1lSW5Ib3VyLCB0aW1lSW5NaW51dGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgYmx1ZSwgZ3JlZW4sIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCBkbnMgZnJvbSBcImRuc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0IH0gZnJvbSBcIi4uL21pc2MvZ2V0U2VjcmV0XCI7XG5pbXBvcnQgeyBodHRwc1JlcXVlc3QsIEh0dHBzUmVzcG9uc2VJbmZvIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvaHR0cHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZXNDb25maWcsIENoYW5nZXNBZnRlckNvbmZpZywgQXJjaGl2ZUZpbGVJbmZvLCBTZXRDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbnR5cGUgQmFja2JsYXplQ3JlZHMgPSB7XG4gICAgYXBwbGljYXRpb25LZXlJZDogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uS2V5OiBzdHJpbmc7XG59O1xuXG5sZXQgYmFja2JsYXplQ3JlZHMgPSBsYXp5KGFzeW5jICgpOiBQcm9taXNlPEJhY2tibGF6ZUNyZWRzPiA9PiB7XG4gICAgbGV0IGtleUlkID0gYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICBsZXQga2V5ID0gYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXBwbGljYXRpb25LZXlJZDoga2V5SWQsXG4gICAgICAgIGFwcGxpY2F0aW9uS2V5OiBrZXksXG4gICAgfTtcbn0pO1xuLy8gQSBCMiBkb3dubG9hZC9IRUFEIHJlc3BvbnNlJ3MgaGVhZGVycyBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhLiBjb250ZW50LXJhbmdlJ3MgdG90YWwgd2lucyBvdmVyIGNvbnRlbnQtbGVuZ3RoIGZvciByYW5nZWQgcmVzcG9uc2VzICh3aGljaCBvbmx5IHJlcG9ydCB0aGUgc2xpY2UncyBsZW5ndGgpLlxuZnVuY3Rpb24gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyk6IHsgc2l6ZTogbnVtYmVyOyB1cGxvYWRUaW1lc3RhbXA6IG51bWJlciB9IHtcbiAgICBsZXQgc2l6ZSA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gfHwgMCk7XG4gICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgIGxldCB0b3RhbCA9IGNvbnRlbnRSYW5nZSAmJiBOdW1iZXIoY29udGVudFJhbmdlLnNwbGl0KFwiL1wiKVsxXSk7XG4gICAgaWYgKHRvdGFsICYmIE51bWJlci5pc0Zpbml0ZSh0b3RhbCkpIHtcbiAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgIH1cbiAgICByZXR1cm4geyBzaXplLCB1cGxvYWRUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wieC1iei11cGxvYWQtdGltZXN0YW1wXCJdIHx8IDApIH07XG59XG5cbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXQgc2VlbXMgdG8gd29yayB0aG91Z2guXG4gICAgICAgIHdoaWxlIChwYXRoLmluY2x1ZGVzKFwiLy9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoXCIvL1wiLCBcIi8lMkZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRGaWxlQnlOYW1lKGNvbmZpZzoge1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfTtcbiAgICAgICAgLy8gQ2FwdHVyZXMgdGhlIHJlc3BvbnNlIGhlYWRlcnMsIHdoaWNoIGNhcnJ5IHRoZSBmaWxlJ3MgbWV0YWRhdGEgKHgtYnotdXBsb2FkLXRpbWVzdGFtcCwgY29udGVudC1sZW5ndGggLyBjb250ZW50LXJhbmdlKSAtIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGl0IGRvbid0IHBheSBhIHNlY29uZCBBUEkgY2FsbFxuICAgICAgICBvdXRSZXNwb25zZT86IEh0dHBzUmVzcG9uc2VJbmZvO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIH0pKSwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFJhbmdlOiBjb25maWcucmFuZ2UgPyBgYnl0ZXM9JHtjb25maWcucmFuZ2Uuc3RhcnR9LSR7Y29uZmlnLnJhbmdlLmVuZCAtIDF9YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHhbMV0gIT09IHVuZGVmaW5lZCkpLFxuICAgICAgICAgICAgb3V0UmVzcG9uc2U6IGNvbmZpZy5vdXRSZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSdzIG1ldGFkYXRhIGJ5IG5hbWUsIHdpdGhvdXQgdGhlIGJvZHk6IEhFQUQgb24gdGhlIGRvd25sb2FkIFVSTCwgd2hpY2ggaXMgYSBjbGFzcyBCIChkb3dubG9hZC1wcmljZWQpIHRyYW5zYWN0aW9uIC0gYjJfbGlzdF9maWxlX25hbWVzIGlzIGNsYXNzIEMgYXQgMTB4IHRoZSBwcmljZSwgYW5kIGIyX2dldF9maWxlX2luZm8gbmVlZHMgYSBmaWxlSWQgd2UgZG9uJ3QgaGF2ZS4gUmV0dXJucyB1bmRlZmluZWQgZm9yIG1pc3NpbmcgKG9yIGhpZGRlbikgZmlsZXMuICovXG4gICAgYXN5bmMgZnVuY3Rpb24gaGVhZEZpbGVCeU5hbWUoY29uZmlnOiB7IGJ1Y2tldE5hbWU6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTx7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZmlsZU5hbWUgPSBlbmNvZGVQYXRoKGNvbmZpZy5maWxlTmFtZSk7XG4gICAgICAgIGxldCByZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8gPSB7IGhlYWRlcnM6IHt9IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCB1bmRlZmluZWQsIFwiSEVBRFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuIH0sXG4gICAgICAgICAgICAgICAgb3V0UmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBIRUFEIHJlc3BvbnNlcyBoYXZlIG5vIGJvZHksIHNvIHRoZSBleHBpcmVkX2F1dGhfdG9rZW4gbWFya2VyIGFwaVJldHJ5TG9naWMgbWF0Y2hlcyBvbiBuZXZlciBhcHBlYXJzIC0gcmUtYWRkIGl0IHNvIGFuIGV4cGlyZWQgdG9rZW4gc3RpbGwgcmVmcmVzaGVzIGFuZCByZXRyaWVzXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImV4cGlyZWRfYXV0aF90b2tlblwiIEhFQUQgJHtjb25maWcuYnVja2V0TmFtZX0vJHtjb25maWcuZmlsZU5hbWV9IGdvdCBhIDQwMTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gT2guLi4gYXBwYXJlbnRseSwgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/IEh1aC4uLlxuICAgIGNvbnN0IGdldFVwbG9hZFVSTCA9IChhc3luYyAoYnVja2V0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IGdldFVwbG9hZFVSTC5jbGVhcihidWNrZXRJZCksIHRpbWVJbkhvdXIgKiAxKTtcbiAgICAgICAgbGV0IGdldFVwbG9hZFVybFJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL2IyX2dldF91cGxvYWRfdXJsP2J1Y2tldElkPVwiICsgYnVja2V0SWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFVwbG9hZFVybFJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB9KSB7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmwgPSBhd2FpdCBnZXRVcGxvYWRVUkwoY29uZmlnLmJ1Y2tldElkKTtcblxuICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoZ2V0VXBsb2FkVXJsLnVwbG9hZFVybCwgY29uZmlnLmRhdGEsIFwiUE9TVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBnZXRVcGxvYWRVcmwuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1GaWxlLU5hbWVcIjogZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBcImRvX25vdF92ZXJpZnlcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGVGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfaGlkZV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgZ2V0RmlsZUluZm8gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX2dldF9maWxlX2luZm9cIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBsaXN0RmlsZU5hbWVzID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgICAgICBzdGFydEZpbGVOYW1lPzogc3RyaW5nO1xuICAgICAgICBtYXhGaWxlQ291bnQ/OiBudW1iZXI7XG4gICAgICAgIGRlbGltaXRlcj86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVJbmZvOiB7XG4gICAgICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgICAgICBuZXh0RmlsZU5hbWU6IHN0cmluZztcbiAgICB9PihcImIyX2xpc3RfZmlsZV9uYW1lc1wiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNvcHlGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIHNvdXJjZUZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY29weV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfc3RhcnRfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIC8vIEFwcGFyZW50bHkgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/XG4gICAgY29uc3QgZ2V0VXBsb2FkUGFydFVSTCA9IChhc3luYyAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnRSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3BhcnRfdXJsP2ZpbGVJZD1cIiArIGZpbGVJZCwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHVwbG9hZFBhcnRSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgICAgICB1cGxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFBhcnQoY29uZmlnOiB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICAgICAgc2hhMTogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnROdW1iZXI6IG51bWJlcjtcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnQgPSBhd2FpdCBnZXRVcGxvYWRQYXJ0VVJMKGNvbmZpZy5maWxlSWQpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXBsb2FkUGFydC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogdXBsb2FkUGFydC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgXCJYLUJ6LVBhcnQtTnVtYmVyXCI6IGNvbmZpZy5wYXJ0TnVtYmVyICsgXCJcIixcbiAgICAgICAgICAgICAgICBcIlgtQnotQ29udGVudC1TaGExXCI6IGNvbmZpZy5zaGExLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogY29uZmlnLmRhdGEubGVuZ3RoICsgXCJcIixcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydFNoYTFBcnJheTogc3RyaW5nW107XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IGFueTtcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9maW5pc2hfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNhbmNlbExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7fT4oXCJiMl9jYW5jZWxfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldERvd25sb2FkQXV0aG9yaXphdGlvbiA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PihcImIyX2dldF9kb3dubG9hZF9hdXRob3JpemF0aW9uXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0RG93bmxvYWRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aC5kb3dubG9hZFVybCArIHBhdGg7XG4gICAgfVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGVCdWNrZXQsXG4gICAgICAgIHVwZGF0ZUJ1Y2tldCxcbiAgICAgICAgbGlzdEJ1Y2tldHMsXG4gICAgICAgIGRvd25sb2FkRmlsZUJ5TmFtZSxcbiAgICAgICAgaGVhZEZpbGVCeU5hbWUsXG4gICAgICAgIHVwbG9hZEZpbGUsXG4gICAgICAgIGhpZGVGaWxlLFxuICAgICAgICBnZXRGaWxlSW5mbyxcbiAgICAgICAgbGlzdEZpbGVOYW1lcyxcbiAgICAgICAgY29weUZpbGUsXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlLFxuICAgICAgICB1cGxvYWRQYXJ0LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGUsXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZSxcbiAgICAgICAgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uLFxuICAgICAgICBnZXREb3dubG9hZFVSTCxcbiAgICAgICAgYXBpVXJsOiBhdXRoLmFwaVVybCxcbiAgICAgICAgYWxsb3dlZDogYXV0aC5hbGxvd2VkLFxuICAgIH07XG59KTtcblxudHlwZSBCMkFwaSA9ICh0eXBlb2YgZ2V0QVBJKSBleHRlbmRzICgpID0+IFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQmFja2JsYXplIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgICAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgICAgICBjYWNoZVRpbWU/OiBudW1iZXI7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gICAgfSkge1xuICAgICAgICAvLyBHZXQgdGhlIGFwaSwgdG8gc2V0dXAgY29yc1xuICAgICAgICB2b2lkIHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWNrZXROYW1lID0gdGhpcy5jb25maWcuYnVja2V0TmFtZS5yZXBsYWNlQWxsKC9bXlxcd1xcZF0vZywgXCItXCIpO1xuICAgIHByaXZhdGUgYnVja2V0SWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKSB7XG4gICAgICAgIHRoaXMubG9nZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgbG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2luZykgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJiYWNrYmxhemUgXCIgKyB0aGlzLmNvbmZpZy5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnVja2V0QVBJID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhcGkgPSBhd2FpdCBnZXRBUEkoKTtcblxuICAgICAgICBsZXQgY2FjaGVUaW1lID0gdGhpcy5jb25maWcuY2FjaGVUaW1lID8/IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGNhY2hlVGltZSA9IElNTVVUQUJMRV9DQUNIRV9USU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUxXQVlTIHNldCBhY2Nlc3MgY29udHJvbCwgYXMgd2UgY2FuIG1ha2UgdXJscyBmb3IgcHJpdmF0ZSBidWNrZXRzIHdpdGggZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uXG4gICAgICAgIGxldCBkZXNpcmVkQ29yc1J1bGVzID0gW3tcbiAgICAgICAgICAgIGNvcnNSdWxlTmFtZTogXCJhbGxvd0FsbFwiLFxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHRoaXMuY29uZmlnLmFsbG93ZWRPcmlnaW5zID8/IFtcImh0dHBzXCJdLFxuICAgICAgICAgICAgYWxsb3dlZE9wZXJhdGlvbnM6IFtcImIyX2Rvd25sb2FkX2ZpbGVfYnlfaWRcIiwgXCJiMl9kb3dubG9hZF9maWxlX2J5X25hbWVcIl0sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyczogW1wicmFuZ2VcIl0sXG4gICAgICAgICAgICBleHBvc2VIZWFkZXJzOiBbXCJ4LWJ6LWNvbnRlbnQtc2hhMVwiXSxcbiAgICAgICAgICAgIC8vIDYwIGlzIHRoZSBhYnNvbHV0ZSBtaW5pbXVtLiBJZiB3ZSB0cnkgdG8gc2V0IGEgdmFsdWUgbG93ZXIgdGhhbiB0aGlzLCBpdCdsbCBiZSB1cGRhdGVkIHRvIGJlIDYwLiBcbiAgICAgICAgICAgIG1heEFnZVNlY29uZHM6IE1hdGgubWF4KDYwLCBjYWNoZVRpbWUgLyAxMDAwKSxcbiAgICAgICAgfV07XG4gICAgICAgIGxldCBidWNrZXRJbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBpZiAoY2FjaGVUaW1lKSB7XG4gICAgICAgICAgICBidWNrZXRJbmZvW1wiY2FjaGUtY29udHJvbFwiXSA9IGBtYXgtYWdlPSR7Y2FjaGVUaW1lIC8gMTAwMH1gO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgZXhpc3RzID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVzID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNyZWF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogdGhpcy5jb25maWcucHVibGljID8gXCJhbGxQdWJsaWNcIiA6IFwiYWxsUHJpdmF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF5c0Zyb21VcGxvYWRpbmdUb0hpZGluZ1wiOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCBmaWxlcyBmb3IgNyBkYXlzLCB3aGljaCBzaG91bGQgYmUgZW5vdWdoIHRpbWUgdG8gcmVjb3ZlciBhY2NpZGVudGFsIGhpZGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF5c0Zyb21IaWRpbmdUb0RlbGV0aW5nXCI6IDcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpbGVOYW1lUHJlZml4XCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mb1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlLnN0YWNrLmluY2x1ZGVzKGBcImR1cGxpY2F0ZV9idWNrZXRfbmFtZVwiYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPCAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrYmxhemUgY3JlYXRlIGJ1Y2tldCBmYWlsZWQsIHJldHJ5aW5nIGluIDVzOiAke2Uuc3RhY2t9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSg1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidWNrZXRMaXN0ID0gYXdhaXQgYXBpLmxpc3RCdWNrZXRzKHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChidWNrZXRMaXN0LmJ1Y2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCBuYW1lIFwiJHt0aGlzLmJ1Y2tldE5hbWV9XCIgaXMgYmVpbmcgdXNlZCBieSBzb21lb25lIGVsc2UuIEJ1Y2tldCBuYW1lcyBoYXZlIHRvIGJlIGdsb2JhbGx5IHVuaXF1ZS4gVHJ5IGEgZGlmZmVyZW50IG5hbWUgdW50aWwgeW91IGZpbmQgYSBmcmVlIG9uZS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Y2tldElkID0gYnVja2V0TGlzdC5idWNrZXRzWzBdLmJ1Y2tldElkO1xuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgIGxldCBidWNrZXQgPSBidWNrZXRMaXN0LmJ1Y2tldHNbMF07XG4gICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIGxldCBrdnBzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICAgICAgICAgICAgICBzb3J0KGt2cHMsIHggPT4geFswXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhrdnBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbChsaHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShsaHMpKSA9PT0gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKHJocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb3JkZXJJbmRlcGVuZGVudEVxdWFsQXJyYXkobGhzOiB1bmtub3duW10sIHJoczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxocy5sZW5ndGggIT09IHJocy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVySW5kZXBlbmRlbnRFcXVhbChsaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJoc1tpXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIW9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGJ1Y2tldC5jb3JzUnVsZXMsIGRlc2lyZWRDb3JzUnVsZXMpXG4gICAgICAgICAgICAgICAgfHwgIW9yZGVySW5kZXBlbmRlbnRFcXVhbChidWNrZXQuYnVja2V0SW5mbywgYnVja2V0SW5mbylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYFVwZGF0aW5nIENPUlMgcnVsZXMgZm9yICR7dGhpcy5idWNrZXROYW1lfWApLCBidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkudXBkYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiBidWNrZXQuYWNjb3VudElkLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogYnVja2V0LmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRUeXBlOiBidWNrZXQuYnVja2V0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGJ1Y2tldC5saWZlY3ljbGVSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgY29yc1J1bGVzOiBkZXNpcmVkQ29yc1J1bGVzLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmZvOiBidWNrZXRJbmZvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRSZXNldDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hlbiB3ZSBsYXN0IHJlc2V0IGJlY2F1c2Ugb2YgYSA1MDNcbiAgICBwcml2YXRlIGxhc3Q1MDNSZXNldCA9IDA7XG4gICAgLy8gSU1QT1JUQU5UISBXZSBtdXN0IGFsd2F5cyBDQVRDSCBBUk9VTkQgdGhlIGFwaVJldHJ5TG9naWMsIE5FVkVSIGluc2lkZSBvZiBmbmMuIE90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlY3JlYXRlIHRoZSBhdXRoIHRva2VuLiBgY29udGV4dGAgaXMgYSBzaG9ydCBsYWJlbCAodmVyYiArIGZpbGUgcGF0aCkgaW5jbHVkZWQgaW4gZXZlcnkgcmV0cnkvZXJyb3IgbG9nIHNvIGEgc3R1Y2sgc2lsZW50LXJldHJ5IGxvb3AgaXMgaWRlbnRpZmlhYmxlIGZyb20gdGhlIGxvZ3MuXG4gICAgcHJpdmF0ZSBhc3luYyBhcGlSZXRyeUxvZ2ljPFQ+KFxuICAgICAgICBjb250ZXh0OiBzdHJpbmcsXG4gICAgICAgIGZuYzogKGFwaTogQjJBcGkpID0+IFByb21pc2U8VD4sXG4gICAgICAgIHJldHJpZXMgPSAzXG4gICAgKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBhcGk6IEIyQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXBpID0gYXdhaXQgdGhpcy5nZXRCdWNrZXRBUEkoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoYXBpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXRyaWVzIDw9IDApIHRocm93IGVycjtcblxuICAgICAgICAgICAgLy8gSWYgaXQncyBhIDUwMyBhbmQgaXQncyBiZWVuIGEgbWludXRlIHNpbmNlIHdlIGxhc3QgcmVzZXQsIHRoZW4gV2FpdCBhbmQgcmVzZXQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyci5zdGFjay5pbmNsdWRlcyhgXCJzdGF0dXNcIjogNTAzYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcInNlcnZpY2VfdW5hdmFpbGFibGVcImApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgXCJpbnRlcm5hbF9lcnJvclwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFTk9CVUZTYClcbiAgICAgICAgICAgICAgICApICYmIERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBpcyBzbyBmbGFreSB0aGF0IHdlJ3JlIGp1c3QgZ29pbmcgdG8gd2FybiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7Y29udGV4dH1dIEJhY2tibGF6ZSBlcnJvciwgd2FpdGluZyBhbmQgcmVzZXR0aW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVzZXQgPSB0aGlzLmN1cnJlbnRSZXNldCB8fCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBjaGVjayBhZ2FpbiBpbiBjYXNlLCBhbmQgaW4gdGhlIHZlcnkgbGlrZWx5IGNhc2UgdGhhdCB0aGlzIGlzIGJlaW5nIHJ1biBpbiBwYXJhbGxlbCwgd2Ugb25seSB3YW50IHRvIHJlc2V0IG9uY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0NTAzUmVzZXQgPiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gUmVzZXR0aW5nIGdldEFQSSBhbmQgZ2V0QnVja2V0QVBJOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0NTAzUmVzZXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEJ1Y2tldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkoKS5maW5hbGx5KCgpID0+IHRoaXMuY3VycmVudFJlc2V0ID0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRSZXNldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiB0b2tlbiBpcyBpbnZhbGlkLCByZXNldCBnZXRCdWNrZXRBUEkgYW5kIGdldEFQSSBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYnVja2V0IGlzbid0IGZvdW5kLCByZXNldCBnZXRCdWNrZXRBUElcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYFwiZXhwaXJlZF9hdXRoX3Rva2VuXCJgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQXV0aG9yaXphdGlvbiB0b2tlbiBleHBpcmVkYCk7XG4gICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyLnN0YWNrLmluY2x1ZGVzKGBubyB0b21lcyBhdmFpbGFibGVgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRVRJTUVET1VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYHNvY2tldCBoYW5nIHVwYClcbiAgICAgICAgICAgICAgICAvLyBFaC4uLiB0aGlzIG1pZ2h0IGJlIGJhZCwgYnV0Li4uIEkgdGhpbmsgd2UganVzdCBnZXQgcmFuZG9tIDQwMCBlcnJvcnMuIElmIHRoaXMgc3BhbXMgZXJyb3JzLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgbGluZS5cbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYDQwMCBCYWQgUmVxdWVzdGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRVNFVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFRlVTRURgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBSZXRyeWluZyBpbiA1czogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dICR7ZXJyLm1lc3NhZ2V9IHJldHJ5aW5nIGluIDVzYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxPYmogPSBuZXcgVVJMKGFwaS5hcGlVcmwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdG5hbWUgPSB1cmxPYmouaG9zdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29rdXBBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5sb29rdXAoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5yZXNvbHZlNChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbJHtjb250ZXh0fV0gZ2V0YWRkcmluZm8gRU5PVEZPVU5EICR7aG9zdG5hbWV9YCwgeyBsb29rdXBBZGRyZXNzZXMsIHJlc29sdmVBZGRyZXNzZXMsIGFwaVVybDogYXBpLmFwaVVybCwgZnVsbEVycm9yOiBlcnIuc3RhY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9OyByZXRyeUNvdW50PzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRQb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZG93bmxvYWRpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGRvd25sb2FkIGluIHByb2dyZXNzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldCAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0+ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2xhbXAgbmVlZHMgdGhlIGZpbGUncyBzaXplIChhbmQgZ2l2ZXMgdXMgaXRzIG1ldGFkYXRhIGZvciBmcmVlKVxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVJbmZvKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZUVuZCA9IE1hdGgubWluKHJhbmdlLmVuZCwgZmlsZUluZm8uc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEkgdGhpbmsgaWYgd2UgcmVxdWVzdCBub3RoaW5nLCBpdCBjb25mdXNlcyBCYWNrYmxhemUgYW5kIGVuZHMgdXAgZ2l2aW5nIHVzIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlRW5kIDw9IHJhbmdlU3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBmaWxlSW5mby53cml0ZVRpbWUsIHNpemU6IGZpbGVJbmZvLnNpemUgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IHJhbmdlU3RhcnQsIGVuZDogcmFuZ2VFbmQgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gcmFuZ2VFbmQgLSByYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrYmxhemUgcmFuZ2UgZG93bmxvYWQgcmV0dXJuZWQgdGhlIHdyb25nIG51bWJlciBvZiBieXRlcy4gVHJpZWQgdG8gZ2V0ICR7cmFuZ2VTdGFydH0tJHtyYW5nZUVuZH0sIGJ1dCByZWNlaXZlZCAke3JhbmdlU3RhcnR9LSR7cmFuZ2VTdGFydCArIGRhdGEubGVuZ3RofS4gRm9yIGZpbGU6ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBmaWxlSW5mby53cml0ZVRpbWUsIHNpemU6IGZpbGVJbmZvLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRvd25sb2FkJ3Mgb3duIHJlc3BvbnNlIGhlYWRlcnMgY2FycnkgdGhlIG1ldGFkYXRhLCBzbyBhIGZ1bGwgcmVhZCBpcyBhIHNpbmdsZSBBUEkgY2FsbFxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8gPSB7IGhlYWRlcnM6IHt9IH07XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0UmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBtZXRhID0gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IG1ldGEudXBsb2FkVGltZXN0YW1wLCBzaXplOiBkYXRhLmxlbmd0aCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIocmVzdWx0LmRhdGEubGVuZ3RoIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZG93bmxvYWQgKCR7Zm9ybWF0TnVtYmVyKHJlc3VsdC5kYXRhLmxlbmd0aCl9QiR7Y29uZmlnPy5yYW5nZSAmJiBgLCAke2Zvcm1hdE51bWJlcihjb25maWcucmFuZ2Uuc3RhcnQpfSAtICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5lbmQpfWAgfHwgXCJcIn0pIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0sICR7ZmlsZU5hbWV9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBmaWxlIGRvZXMgbm90IGV4aXN0ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG4gICAgICAgICAgICAvLyBCMiB2MiBkb2N1bWVudHMgYWxsb3dlZCBhcyBhIHNpbmdsZSBvYmplY3Q7IG91ciB0eXBlIHNheXMgYSBsaXN0IC0gaGFuZGxlIGJvdGhcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUmF3ID0gYXBpLmFsbG93ZWQgYXMgdW5rbm93bjtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkTGlzdCA9IChBcnJheS5pc0FycmF5KGFsbG93ZWRSYXcpICYmIGFsbG93ZWRSYXcgfHwgW2FsbG93ZWRSYXddKSBhcyB0eXBlb2YgYXBpLmFsbG93ZWQ7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZExpc3Quc29tZShhbGxvd2VkID0+XG4gICAgICAgICAgICAgICAgYWxsb3dlZC5jYXBhYmlsaXRpZXMuaW5jbHVkZXMoXCJ3cml0ZUZpbGVzXCIpXG4gICAgICAgICAgICAgICAgJiYgKCFhbGxvd2VkLmJ1Y2tldE5hbWUgfHwgYWxsb3dlZC5idWNrZXROYW1lID09PSB0aGlzLmJ1Y2tldE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBObyAvIGludmFsaWQgY3JlZGVudGlhbHNcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgaGFzV3JpdGVBY2Nlc3MgY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSAmJiAhY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtmaWxlTmFtZX0gdG8gJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5ub0NoZWNrcykge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93biB1cGxvYWQgdGltZSwgc28gdGhlIGV4YWN0IGxhc3RNb2RpZmllZCBpcyBub3QgcHJlc2VydmVkIG9uIHRoZSBzdG9yZWQgZmlsZS5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLndyaXRlVGltZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhIHN5bmNocm9uaXphdGlvbiBwdXNoIG5ldmVyIG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgcGF0aCBvbiBhbiBpbW11dGFibGUgYnVja2V0IChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUgJiYgdGhpcy5jb25maWcuaW1tdXRhYmxlKSByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSB1cGxvYWQgKCR7Zm9ybWF0TnVtYmVyKGRhdGEubGVuZ3RoKX1CKSAke2ZpbGVOYW1lfWApO1xuICAgICAgICBsZXQgZiA9IGZpbGVOYW1lO1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZEZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZSwgZGF0YTogZGF0YSwgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNvbmZpZz8ubm9DaGVja3MpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHNDaGVja3MgPSAzMDtcbiAgICAgICAgICAgIHdoaWxlIChleGlzdHNDaGVja3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgICAgICAgICAgICAgZXhpc3RzQ2hlY2tzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhpc3RzQ2hlY2tzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9LyR7Zn0gd2FzIHVwbG9hZGVkLCBidXQgY291bGQgbm90IGJlIGZvdW5kIGFmdGVyd2FyZHMuIEhvcGVmdWxseSBpdCB3YXMganVzdCBkZWxldGVkLCB2ZXJ5IHF1aWNrbHk/IElmIGJhY2tibGF6ZSBpcyB0YWtpbmcgdG9vIGxvbmcgZm9yIGZpbGVzIHRvIHByb3BhZ2F0ZSwgdGhlbiB3ZSBtaWdodCBydW4gaW50byBpc3N1ZXMgd2l0aCB0aGUgZGF0YWJhc2UgYXRvbWljaXR5LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZGVsZXRlICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGhpZGVGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5oaWRlRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZTogZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGVycm9yIGluIGhpZGUsIHBvc3NpYmx5IGFscmVhZHkgaGlkZGVuICR7ZmlsZU5hbWV9XFxuJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRGVsZXRpb24gU0VFTVMgdG8gd29yay4gVGhpcyBET0VTIGJyZWFrIGlmIHdlIGRlbGV0ZSBhIGZpbGUgd2hpY2gga2VlcHMgYmVpbmcgcmVjcmVhdGVkLCBleCwgdGhlIGhlYXJ0YmVhdC4gbGV0IGV4aXN0c0NoZWNrcyA9IDEwOyB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgaWYgKCFleGlzdHMpIGJyZWFrOyBhd2FpdCBkZWxheSgxMDAwKTsgZXhpc3RzQ2hlY2tzLS07IH0gaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgZGV2RGVidWdicmVhaygpOyBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0gd2FzIGRlbGV0ZWQsIGJ1dCB3YXMgc3RpbGwgZm91bmQgYWZ0ZXJ3YXJkc2ApOyBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpOyB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD47IH0pOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgICAgICBsZXQgb25FcnJvcjogKCgpID0+IFByb21pc2U8dm9pZD4pW10gPSBbXTtcbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHsgcGF0aCB9ID0gY29uZmlnO1xuICAgICAgICAgICAgLy8gQmFja2JsYXplIHJlcXVpcmVzIDVNQiBjaHVua3MuIEJ1dCwgbGFyZ2VyIGlzIG1vcmUgZWZmaWNpZW50IGZvciB1cy5cbiAgICAgICAgICAgIGNvbnN0IE1JTl9DSFVOS19TSVpFID0gMzIgKiAxMDI0ICogMTAyNDtcbiAgICAgICAgICAgIGxldCBkYXRhUXVldWU6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhUXVldWUubGVuZ3RoKSByZXR1cm4gZGF0YVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGJ1ZmZlcnMgdW50aWwgd2UgZ2V0IDVNQiwgT1IsIGVuZC4gQmFja2JsYXplIHJlcXVpcmVzIHRoaXMgZm9yIGxhcmdlIGZpbGVzLlxuICAgICAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyczogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodG90YWxCeXRlcyA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFidWZmZXJzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gcGF0aDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgIGlmICghZGF0YT8ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIG92ZXJseSBzbWFsbCBmaWxlc1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQmFja2JsYXplIGRpc2FsbG93cyBsZXNzIHRoYW4gMiBjaHVua3NcbiAgICAgICAgICAgIGxldCBzZWNvbmREYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgIGlmICghc2Vjb25kRGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFMU08sIGlmIHRoZXJlIGFyZSB0d28gY2h1bmtzLCBidXQgb25lIGlzIHRvbyBzbWFsbCwgY29tYmluZSBpdC4gVGhpcyBoZWxwcyBhbGxvdyB1cyBuZXZlciBzZW5kIHNtYWxsIGNodW5rcy5cbiAgICAgICAgICAgIGlmIChzZWNvbmREYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIEJ1ZmZlci5jb25jYXQoW2RhdGEsIHNlY29uZERhdGFdKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICBkYXRhUXVldWUudW5zaGlmdChkYXRhLCBzZWNvbmREYXRhKTtcblxuXG4gICAgICAgICAgICBsZXQgdXBsb2FkSW5mbyA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgc3RhcnRMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5zdGFydExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mbzoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uRXJyb3IucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBjYW5jZWxMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jYW5jZWxMYXJnZUZpbGUoeyBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IExPR19JTlRFUlZBTCA9IHRpbWVJbk1pbnV0ZTtcbiAgICAgICAgICAgIGxldCBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG5cbiAgICAgICAgICAgIGxldCBwYXJ0TnVtYmVyID0gMTtcbiAgICAgICAgICAgIGxldCBwYXJ0U2hhMUFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vIFNvLi4uIGlmIHRoZSBuZXh0IGNodW5rIGlzIHRoZSBsYXN0IG9uZSwgY29tYmluZSBpdCB3aXRoIHRoZSBjdXJyZW50IG9uZS4gVGhpcyBwcmV2ZW50cyBBTlkgdXBsb2FkcyBmcm9tIGJlaW5nIDwgdGhlIHRocmVzaG9sZCwgYXMgYXBwYXJlbnRseSB0aGUgXCJsYXN0IHBhcnRcIiBjaGVjayBpbiBiYWNrYmxhemUgZmFpbHMgd2hlbiB3ZSBoYXZlIHRvIHJldHJ5IGFuIHVwbG9hZCAoZHVlIHRvIFwibm8gdG9tZXMgYXZhaWxhYmxlXCIpLiBXZWxsIGl0IGNhbid0IGZhaWwgaWYgZXZlbiB0aGUgbGFzdCBwYXJ0IGlzID4gNU1CLCBub3cgY2FuIGl0ISBCVVQsIG9ubHkgaWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgY2h1bmssIG90aGVyd2lzZSB3ZSBtaWdodCB0cnkgdG8gc2VuZCBhIHNpbmdsZSBjaHVuaywgd2hpY2ggd2UgY2FuJ3QgZG8uXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRTaGExQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF5YmVMYXN0RGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIGxhc3Qgb25lLCBzbyBjb25zdW1lIGl0IG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBtYXliZUxhc3REYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHRoZSBsYXN0IG9uZS4gUHV0IGl0IGJhY2ssIGluIGNhc2UgdGhlIG9uZSBBRlRFUiBpcyB0aGUgbGFzdCBvbmUsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBtZXJnZSBtYXliZUxhc3REYXRhIHdpdGggdGhlIG5leHQgbmV4dCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KG1heWJlTGFzdERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaGExID0gcmVxdWlyZShcImNyeXB0b1wiKS5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICAgICAgICAgICAgICBzaGExLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hhMUhleCA9IHNoYTEuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXkucHVzaChzaGExSGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZFBhcnQjJHtwYXJ0TnVtYmVyfSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlLCBkYXRhIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlIHBhcnQgJHtwYXJ0TnVtYmVyfSwgdXBsb2FkZWQgJHtibHVlKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSArIFwiQlwiKX0gaW4gJHtibHVlKHRpbWVTdHIpfSAoJHtibHVlKHJhdGVTdHIpfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZFBhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhMTogc2hhMUhleCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFydE51bWJlcisrO1xuXG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBuZXh0TG9nVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RpbGwgdXBsb2FkaW5nIGxhcmdlIGZpbGUgYXQgJHtEYXRlLm5vdygpfS4gVXBsb2FkZWQgJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgRmluaXNoZWQgdXBsb2FkaW5nIGxhcmdlIGZpbGUgdXBsb2FkZWQgJHtncmVlbihmb3JtYXROdW1iZXIodG90YWxCeXRlcykpfUJgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5pc2hMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmZpbmlzaExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXk6IHBhcnRTaGExQXJyYXksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIG9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBkdXJpbmcgZXJyb3IgY2xlYW4uIElnbm9yaW5nLCB3ZSB3aWxsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBwYXRoICR7Y29uZmlnLnBhdGh9YCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIHNldExhcmdlRmlsZSBmb3IgJHtjb25maWcucGF0aH06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRJbmZvICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGF3YWl0IGFwaS5oZWFkRmlsZUJ5TmFtZSh7IGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnN0YWNrLmluY2x1ZGVzKGBmaWxlX25vdF9mb3VuZGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZvciBleGFtcGxlIGZpbmRGaWxlTmFtZXMoXCJpcHMvXCIpXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgLy8gTm8gbmF0aXZlIGNoYW5nZSBmZWVkIChiMiBzdXBwb3J0cyBuZWl0aGVyIHRpbWUgbm9yIHJvdXRlIGZpbHRlcmluZykgLSBhIGZ1bGwgbGlzdGluZyBmaWx0ZXJlZCBpbiBtZW1vcnlcbiAgICAgICAgcmV0dXJuIGZpbHRlckNoYW5nZXMoYXdhaXQgdGhpcy5maW5kSW5mbyhcIlwiKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfVtdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmRJbmZvICR7cHJlZml4fWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5zaGFsbG93ICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZvbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeyBwYXRoLCBjcmVhdGVUaW1lLCBzaXplIH0gb2YgYWxsRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IHBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xkZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhbGxGb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lLCBzaXplIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxGb2xkZXJzLnZhbHVlcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH0+KCk7XG4gICAgICAgICAgICBsZXQgc3RhcnRGaWxlTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWF4RmlsZUNvdW50OiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IGNvbmZpZz8uc2hhbGxvdyA/IFwiL1wiIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgcmVzdWx0LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJ1cGxvYWRcIiAmJiBjb25maWc/LnR5cGUgIT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZmlsZS5maWxlTmFtZSwgeyBwYXRoOiBmaWxlLmZpbGVOYW1lLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuYWN0aW9uID09PSBcImZvbGRlclwiICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBmaWxlLmZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIgPSBmb2xkZXIuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lID0gcmVzdWx0Lm5leHRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0RmlsZU5hbWUpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZmlsZXMudmFsdWVzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYXNzZXJ0UGF0aFZhbGlkKHBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgYnl0ZXMgPSBCdWZmZXIuZnJvbShwYXRoLCBcInV0ZjhcIik7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggdG9vIGxvbmc6ICR7cGF0aC5sZW5ndGh9IGNoYXJhY3RlcnMgPiAxMDAwIGNoYXJhY3RlcnMuIFBhdGg6ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgICAgIGNvcHlJbnN0ZWFkPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICAgIGxldCB7IHBhdGgsIHRhcmdldCwgdGFyZ2V0UGF0aCB9ID0gY29uZmlnO1xuICAgICAgICAvLyBBIHNlbGYgbW92ZSBzaG91bGQgTk9PUCAoYW5kIGRlZmluaXRlbHkgbm90IGNvcHksIGFuZCB0aGVuIGRlbGV0ZSBpdHNlbGYhKVxuICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlzICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgbW92ZSBwYXRoIHRvIGl0c2VsZi4gU2tpcHBpbmcgbW92ZSwgYXMgdGhlcmUgaXMgbm8gd29yayB0byBkby4gJHtwYXRofWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkge1xuICAgICAgICAgICAgbGV0IHRhcmdldEJ1Y2tldElkID0gdGFyZ2V0LmJ1Y2tldElkO1xuICAgICAgICAgICAgaWYgKHRhcmdldEJ1Y2tldElkID09PSB0aGlzLmJ1Y2tldElkICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHJldHVybjtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgbW92ZSAke3BhdGh9IC0+ICR7dGFyZ2V0UGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVWdoLi4uIGxpc3RpbmcgdGhlIGZpbGUgbmFtZSBzdWNrcywgYnV0Li4uIEkgZ3Vlc3MgaXQncyBzdGlsbCBiZXR0ZXIgdGhhbiBkb3dubG9hZGluZyBhbmQgcmUtdXBsb2FkaW5nIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIHByZWZpeDogcGF0aCwgbWF4RmlsZUNvdW50OiAxMCB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGluZm8uZmlsZXMuZmluZCh4ID0+IHguZmlsZU5hbWUgPT09IHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNvcHlGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUlkOiBmaWxlLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRhcmdldFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0SWQ6IHRhcmdldEJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRhcmdldC5zZXQodGFyZ2V0UGF0aCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZy5jb3B5SW5zdGVhZCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyh0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmlsZSBub3QgZm91bmQgYWZ0ZXIgbW92ZS4gTGVhdmluZyBCT1RIIGZpbGVzLiAke3RhcmdldFBhdGh9IHdhcyBub3QgZm91bmQuIEJlaW5nIG1vdmVkIGZyb20gJHtwYXRofWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb3B5KGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlKHsgLi4uY29uZmlnLCBjb3B5SW5zdGVhZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRVUkwgJHtwYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkVVJMKFwiZmlsZS9cIiArIHRoaXMuYnVja2V0TmFtZSArIFwiL1wiICsgcGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREb3dubG9hZEF1dGhvcml6YXRpb24oY29uZmlnOiB7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4Pzogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldERvd25sb2FkQXV0aG9yaXphdGlvbiAke2NvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwifWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKHtcbiAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICBmaWxlTmFtZVByZWZpeDogY29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLypcbk5hbWVzIHNob3VsZCBiZSBhIFVURi04IHN0cmluZyB1cCB0byAxMDI0IGJ5dGVzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOlxuICAgIENoYXJhY3RlciBjb2RlcyBiZWxvdyAzMiBhcmUgbm90IGFsbG93ZWQuXG4gICAgREVMIGNoYXJhY3RlcnMgKDEyNykgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEJhY2tzbGFzaGVzIGFyZSBub3QgYWxsb3dlZC5cbiAgICBGaWxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIC8sIGVuZCB3aXRoIC8sIG9yIGNvbnRhaW4gLy8uXG4qL1xuXG5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBkb21haW4gfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVByaXZhdGVJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHJpdmF0ZS1pbW11dGFibGVcIixcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlXG4gICAgfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpY0ltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWMtaW1tdXRhYmxlXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlLFxuICAgICAgICBhbGxvd2VkT3JpZ2luczogW2BodHRwczovLyR7ZG9tYWlufWAsIGBodHRwczovLzEyNy0wLTAtMS4ke2RvbWFpbn06NzAwN2BdLFxuICAgIH0pO1xufSk7XG5cbi8vIE5PVEU6IENhY2hlIGJ5IGEgbWludXRlLiBUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWEsIGJ1dC4uLiB1c3VhbGx5IHdob2xlIHJlYXNvbiBmb3IgcHVibGljIGlzIGZvciBjbG91ZGZsYXJlIGNhY2hpbmcgKGFzIG90aGVyd2lzZSB3ZSBjYW4ganVzdCBhY2Nlc3MgaXQgdGhyb3VnaCBhIHNlcnZlciksIG9yIGZvciBsYXJnZSBmaWxlcyAod2hpY2ggc2hvdWxkIGJlIGNhY2hlZCBhbnl3YXlzLCBhbmQgcHJvYmFibHkgZXZlbiB1c2UgaW1tdXRhYmxlIGNhY2hpbmcpLlxuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHVibGljID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXB1YmxpY1wiLFxuICAgICAgICBwdWJsaWM6IHRydWUsXG4gICAgICAgIGNhY2hlVGltZTogdGltZUluTWludXRlLFxuICAgICAgICBhbGxvd2VkT3JpZ2luczogW2BodHRwczovLyR7ZG9tYWlufWAsIGBodHRwczovLzEyNy0wLTAtMS4ke2RvbWFpbn06NzAwN2BdLFxuICAgIH0pO1xufSk7Il19
821
+ /* _JS_SOURCE_HASH = "9c3ba577ef258c7b776416e8c2f17fabd61a6fd15c59d678cb1c0d1125c60a17"; */